diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml
index b388a3c6c8..cb5e5d7572 100644
--- a/locales/ja-JP.yml
+++ b/locales/ja-JP.yml
@@ -351,6 +351,7 @@ posted: "投稿しました"
 autoReloadWhenDisconnected: "サーバー切断時に自動リロード"
 autoNoteWatch: "ノートの自動ウォッチ"
 reduceUiAnimation: "UIのアニメーションを減らす"
+share: "共有"
 
 _2fa:
   registerDevice: "デバイスを登録"
diff --git a/src/client/pages/share.vue b/src/client/pages/share.vue
new file mode 100644
index 0000000000..07bb70737f
--- /dev/null
+++ b/src/client/pages/share.vue
@@ -0,0 +1,76 @@
+<template>
+<div class="">
+	<portal to="icon"><fa :icon="faShareAlt"/></portal>
+	<portal to="title">{{ $t('share') }}</portal>
+
+	<section class="_card">
+		<div class="_title" v-if="title">{{ title }}</div>
+		<div class="_content">
+			<div>{{ text }}</div>
+			<mk-button @click="post()">{{ $t('post') }}</mk-button>
+		</div>
+		<div class="_footer" v-if="url">{{ url }}</div>
+	</section>
+</div>
+</template>
+
+<script lang="ts">
+import Vue from 'vue';
+import { faShareAlt } from '@fortawesome/free-solid-svg-icons';
+import i18n from '../i18n';
+import PostFormDialog from '../components/post-form-dialog.vue';
+import MkButton from '../components/ui/button.vue';
+
+export default Vue.extend({
+	i18n,
+
+	metaInfo() {
+		return {
+			title: this.$t('share') as string
+		};
+	},
+
+	components: {
+		MkButton
+	},
+
+	data() {
+		return {
+			title: null,
+			text: null,
+			url: null,
+			faShareAlt
+		}
+	},
+
+	created() {
+		const urlParams = new URLSearchParams(window.location.search);
+		this.title = urlParams.get('title');
+		this.text = urlParams.get('text');
+		this.url = urlParams.get('url');
+	},
+
+	mounted() {
+		this.post();
+	},
+
+	methods: {
+		post() {
+			let text = '';
+			if (this.title) text += `【${this.title}】\n`;
+			if (this.text) text += `${this.text}\n`;
+			if (this.url) text += `${this.url}`;
+			this.$root.new(PostFormDialog, {
+				instant: true,
+				initialText: text.trim()
+			}).$once('posted', () => {
+				alert('a');
+				window.close();
+			});
+		}
+	}
+});
+</script>
+
+<style lang="scss" scoped>
+</style>
diff --git a/src/client/router.ts b/src/client/router.ts
index 16ab96dea4..70bc48c49e 100644
--- a/src/client/router.ts
+++ b/src/client/router.ts
@@ -52,6 +52,7 @@ export const router = new VueRouter({
 		{ path: '/tags/:tag', component: page('tag') },
 		{ path: '/auth/:token', component: page('auth') },
 		{ path: '/authorize-follow', component: page('follow') },
+		{ path: '/share', component: page('share') },
 		/*{ path: '*', component: MkNotFound }*/
 	],
 	// なんかHacky