diff --git a/.mocharc.json b/.mocharc.json
index 867402688c107da2f0339b18815152659e53b82a..fc7fee2154aa98283686e04ce25f90840483c3b7 100644
--- a/.mocharc.json
+++ b/.mocharc.json
@@ -1,6 +1,6 @@
 {
 	"extension": ["ts","js","cjs","mjs"],
-	"require": "ts-node/register",
+	"require": ["ts-node/register", "tsconfig-paths/register"],
 	"slow": 1000,
 	"timeout": 30000,
 	"exit": true
diff --git a/gulpfile.ts b/gulpfile.ts
index 771a5c0e322d98da6554e2c15033ff0eb411aadd..bcd50890e28d3c01cf548a78b513adfac2fe2ee4 100644
--- a/gulpfile.ts
+++ b/gulpfile.ts
@@ -4,7 +4,6 @@
 
 import * as fs from 'fs';
 import * as gulp from 'gulp';
-import * as ts from 'gulp-typescript';
 import * as rimraf from 'rimraf';
 import * as replace from 'gulp-replace';
 const terser = require('gulp-terser');
@@ -13,16 +12,6 @@ const cssnano = require('gulp-cssnano');
 const locales: { [x: string]: any } = require('./locales');
 const meta = require('./package.json');
 
-gulp.task('build:ts', () => {
-	const tsProject = ts.createProject('./src/tsconfig.json');
-
-	return tsProject
-		.src()
-		.pipe(tsProject())
-		.on('error', () => {})
-		.pipe(gulp.dest('./built/'));
-});
-
 gulp.task('build:copy:views', () =>
 	gulp.src('./src/server/web/views/**/*').pipe(gulp.dest('./built/server/web/views'))
 );
@@ -78,7 +67,6 @@ gulp.task('cleanall', gulp.parallel('clean', cb =>
 ));
 
 gulp.task('build', gulp.parallel(
-	'build:ts',
 	'build:copy',
 ));
 
diff --git a/package.json b/package.json
index 0f40837a6fd6fcea61a2ae5f624d43dc940d8b3b..ba41f0ddf5b74d5c483c1bb7baffb91d4c31c60f 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
 {
 	"name": "misskey",
 	"author": "syuilo <syuilotan@yahoo.co.jp>",
-	"version": "12.75.0",
+	"version": "12.75.1",
 	"codename": "indigo",
 	"repository": {
 		"type": "git",
@@ -15,11 +15,13 @@
 		"ormconfig": "node ./built/ormconfig.js",
 		"migrate": "ts-node ./node_modules/typeorm/cli.js migration:run",
 		"migrateandstart": "npm run migrate && npm run start",
-		"build": "npm run build-webpack && npm run build-gulp",
+		"build": "npm run build-webpack && npm run build-ts && npm run build-gulp",
 		"build-webpack": "webpack",
+		"build-ts": "tsc -p src/tsconfig.json || echo done. && tsc-alias -p src/tsconfig.json",
 		"build-gulp": "gulp build",
 		"watch": "concurrently \"npm:watch-*\"",
 		"watch-webpack": "webpack --watch",
+		"watch-ts": "tsc -w -p src/tsconfig.json && tsc-alias -w -p src/tsconfig.json",
 		"watch-gulp": "gulp watch",
 		"clean": "gulp clean",
 		"cleanall": "gulp cleanall",
@@ -148,7 +150,6 @@
 		"gulp-replace": "1.0.0",
 		"gulp-terser": "2.0.1",
 		"gulp-tslint": "8.1.4",
-		"gulp-typescript": "6.0.0-alpha.1",
 		"hard-source-webpack-plugin": "0.13.1",
 		"html-minifier": "4.0.0",
 		"http-proxy-agent": "4.0.1",
@@ -234,12 +235,13 @@
 		"tmp": "0.2.1",
 		"ts-loader": "8.0.18",
 		"ts-node": "9.1.1",
+		"tsc-alias": "1.2.8",
+		"tsconfig-paths": "3.9.0",
 		"tslint": "6.1.3",
 		"tslint-sonarts": "1.9.0",
 		"typeorm": "0.2.31",
 		"typescript": "4.2.3",
 		"ulid": "2.3.0",
-		"url-loader": "4.1.1",
 		"uuid": "8.3.2",
 		"v-debounce": "0.1.2",
 		"vanilla-tilt": "1.7.0",
@@ -252,7 +254,7 @@
 		"vue-style-loader": "4.1.3",
 		"vuedraggable": "4.0.1",
 		"web-push": "3.4.4",
-		"webpack": "5.26.3",
+		"webpack": "5.27.2",
 		"webpack-cli": "4.5.0",
 		"websocket": "1.0.33",
 		"ws": "7.4.4",
diff --git a/src/@types/meta.json.d.ts b/src/@types/meta.json.d.ts
deleted file mode 100644
index ab812682b6baa448db25206ea4a8dfbd772c6171..0000000000000000000000000000000000000000
--- a/src/@types/meta.json.d.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-declare module '*/meta.json' {
-	const version: string;
-}
diff --git a/src/argv.ts b/src/argv.ts
index a92338f867a6e81f73e82da79b5302e8616dc85f..9c69a450db13166b131c9a5fa7d5e23f8fea1bf7 100644
--- a/src/argv.ts
+++ b/src/argv.ts
@@ -1,5 +1,5 @@
 import * as program from 'commander';
-import config from './config';
+import config from '@/config';
 
 program
 	.version(config.version)
diff --git a/src/boot/master.ts b/src/boot/master.ts
index aded1029123aac8483c2b936e9b7e7283c2944b5..ef8692b308e1c8c79b004f400593ceade2f04123 100644
--- a/src/boot/master.ts
+++ b/src/boot/master.ts
@@ -6,13 +6,13 @@ import * as isRoot from 'is-root';
 import { getConnection } from 'typeorm';
 
 import Logger from '../services/logger';
-import loadConfig from '../config/load';
-import { Config } from '../config/types';
+import loadConfig from '@/config/load';
+import { Config } from '@/config/types';
 import { lessThan } from '../prelude/array';
 import { program } from '../argv';
-import { showMachineInfo } from '../misc/show-machine-info';
+import { showMachineInfo } from '@/misc/show-machine-info';
 import { initDb } from '../db/postgre';
-import * as meta from '../meta.json';
+const meta = require('../meta.json');
 
 const logger = new Logger('core', 'cyan');
 const bootLogger = logger.createSubLogger('boot', 'magenta', false);
diff --git a/src/client/account.ts b/src/client/account.ts
index e5b451cf14316aa8e9efef62b153de88b7eee3ae..6f06ee0f32004280329954225c4a7b344dcbf125 100644
--- a/src/client/account.ts
+++ b/src/client/account.ts
@@ -1,7 +1,7 @@
 import { reactive } from 'vue';
-import { apiUrl } from '@/config';
-import { waiting } from '@/os';
-import { unisonReload } from '@/scripts/unison-reload';
+import { apiUrl } from '@client/config';
+import { waiting } from '@client/os';
+import { unisonReload } from '@client/scripts/unison-reload';
 
 // TODO: 他のタブと永続化されたstateを同期
 
diff --git a/src/client/components/abuse-report-window.vue b/src/client/components/abuse-report-window.vue
index 98578ee44fbe27400274ae71539172010e396f32..7dbb9657bdcb42d31582862fc80ca1fbfaf3c9ee 100644
--- a/src/client/components/abuse-report-window.vue
+++ b/src/client/components/abuse-report-window.vue
@@ -29,10 +29,10 @@
 <script lang="ts">
 import { defineComponent, markRaw } from 'vue';
 import { faExclamationCircle } from '@fortawesome/free-solid-svg-icons';
-import XWindow from '@/components/ui/window.vue';
-import MkTextarea from '@/components/ui/textarea.vue';
-import MkButton from '@/components/ui/button.vue';
-import * as os from '@/os';
+import XWindow from '@client/components/ui/window.vue';
+import MkTextarea from '@client/components/ui/textarea.vue';
+import MkButton from '@client/components/ui/button.vue';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/components/analog-clock.vue b/src/client/components/analog-clock.vue
index 04d98508bb7eba127da022425a3b5910707b49b2..8aa51898bc093574b648af68ae3e51c03ec4825a 100644
--- a/src/client/components/analog-clock.vue
+++ b/src/client/components/analog-clock.vue
@@ -36,7 +36,7 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import * as tinycolor from 'tinycolor2';
-import * as os from '@/os';
+import * as os from '@client/os';
 
 export default defineComponent({
 	data() {
diff --git a/src/client/components/autocomplete.vue b/src/client/components/autocomplete.vue
index ae742610f7f004c914ef6e63087ded241a955d7b..35cfb7730118bfd0697f3bb76af5eef8fbdf61b9 100644
--- a/src/client/components/autocomplete.vue
+++ b/src/client/components/autocomplete.vue
@@ -29,12 +29,12 @@
 
 <script lang="ts">
 import { defineComponent, markRaw } from 'vue';
-import { emojilist } from '../../misc/emojilist';
-import contains from '@/scripts/contains';
-import { twemojiSvgBase } from '../../misc/twemoji-base';
-import { getStaticImageUrl } from '@/scripts/get-static-image-url';
-import { acct } from '@/filters/user';
-import * as os from '@/os';
+import { emojilist } from '@/misc/emojilist';
+import contains from '@client/scripts/contains';
+import { twemojiSvgBase } from '@/misc/twemoji-base';
+import { getStaticImageUrl } from '@client/scripts/get-static-image-url';
+import { acct } from '@client/filters/user';
+import * as os from '@client/os';
 
 type EmojiDef = {
 	emoji: string;
diff --git a/src/client/components/avatars.vue b/src/client/components/avatars.vue
index 8bf64d79b5d61cb8a87ed9390b8000cd738dbe5e..cac95e6d40557ba2c239b4d8ee630b66a2906531 100644
--- a/src/client/components/avatars.vue
+++ b/src/client/components/avatars.vue
@@ -8,7 +8,7 @@
 
 <script lang="ts">
 import { defineComponent } from 'vue';
-import * as os from '@/os';
+import * as os from '@client/os';
 
 export default defineComponent({
 	props: {
diff --git a/src/client/components/channel-follow-button.vue b/src/client/components/channel-follow-button.vue
index 17770a6f36845dc73b312a28cbfe9c1dc89466be..dc0c0faa1f9b4ba7e0641f4304d9de7fdf71091a 100644
--- a/src/client/components/channel-follow-button.vue
+++ b/src/client/components/channel-follow-button.vue
@@ -21,7 +21,7 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import { faSpinner, faPlus, faMinus, } from '@fortawesome/free-solid-svg-icons';
-import * as os from '@/os';
+import * as os from '@client/os';
 
 export default defineComponent({
 	props: {
diff --git a/src/client/components/dialog.vue b/src/client/components/dialog.vue
index a34f7f7947b17efed153ff48f4c06d59919e5202..ef30715343d86bb0dc9503dac78378a611cf123b 100644
--- a/src/client/components/dialog.vue
+++ b/src/client/components/dialog.vue
@@ -40,10 +40,10 @@
 import { defineComponent } from 'vue';
 import { faSpinner, faInfoCircle, faExclamationTriangle, faCheck } from '@fortawesome/free-solid-svg-icons';
 import { faTimesCircle, faQuestionCircle } from '@fortawesome/free-regular-svg-icons';
-import MkModal from '@/components/ui/modal.vue';
-import MkButton from '@/components/ui/button.vue';
-import MkInput from '@/components/ui/input.vue';
-import MkSelect from '@/components/ui/select.vue';
+import MkModal from '@client/components/ui/modal.vue';
+import MkButton from '@client/components/ui/button.vue';
+import MkInput from '@client/components/ui/input.vue';
+import MkSelect from '@client/components/ui/select.vue';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/components/drive-file-thumbnail.vue b/src/client/components/drive-file-thumbnail.vue
index e669da6a90535f485285cd2b07a7e7bb8a39cb14..91f57d1f49bff900679de1a96bc24fbd5cc4ae26 100644
--- a/src/client/components/drive-file-thumbnail.vue
+++ b/src/client/components/drive-file-thumbnail.vue
@@ -27,7 +27,7 @@ import {
 	faFilm
 	} from '@fortawesome/free-solid-svg-icons';
 import ImgWithBlurhash from './img-with-blurhash.vue';
-import { ColdDeviceStorage } from '@/store';
+import { ColdDeviceStorage } from '@client/store';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/components/drive-select-dialog.vue b/src/client/components/drive-select-dialog.vue
index f9a40254524c7b7d2b9d18f8e5cdb27f5e813e0b..ce6e2fa789e6ae0cdc77d51d5d9a5c4fdf9345e0 100644
--- a/src/client/components/drive-select-dialog.vue
+++ b/src/client/components/drive-select-dialog.vue
@@ -20,8 +20,8 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import XDrive from './drive.vue';
-import XModalWindow from '@/components/ui/modal-window.vue';
-import number from '@/filters/number';
+import XModalWindow from '@client/components/ui/modal-window.vue';
+import number from '@client/filters/number';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/components/drive-window.vue b/src/client/components/drive-window.vue
index 43f07ebe76b1551a9fb76e47c654f9f9a7d65d27..30b04091bee17e25ca76924f7a8ee751ce2864a0 100644
--- a/src/client/components/drive-window.vue
+++ b/src/client/components/drive-window.vue
@@ -15,7 +15,7 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import XDrive from './drive.vue';
-import XWindow from '@/components/ui/window.vue';
+import XWindow from '@client/components/ui/window.vue';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/components/drive.file.vue b/src/client/components/drive.file.vue
index 5075b574c448fe177cf0a3851b2c319a5034c248..03f2da008d0bef71338a10df417776d2cc366ba9 100644
--- a/src/client/components/drive.file.vue
+++ b/src/client/components/drive.file.vue
@@ -34,10 +34,10 @@
 import { defineComponent } from 'vue';
 import { faEye, faEyeSlash } from '@fortawesome/free-regular-svg-icons';
 import { faDownload, faLink, faICursor, faTrashAlt } from '@fortawesome/free-solid-svg-icons';
-import copyToClipboard from '@/scripts/copy-to-clipboard';
+import copyToClipboard from '@client/scripts/copy-to-clipboard';
 import MkDriveFileThumbnail from './drive-file-thumbnail.vue';
-import bytes from '@/filters/bytes';
-import * as os from '@/os';
+import bytes from '@client/filters/bytes';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/components/drive.folder.vue b/src/client/components/drive.folder.vue
index 745b6018daaaba3e2fe1133112063594e598fbd0..2822c85680a192e562ee2ca558319e91674e0b7e 100644
--- a/src/client/components/drive.folder.vue
+++ b/src/client/components/drive.folder.vue
@@ -29,7 +29,7 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import { faFolder, faFolderOpen, faTrashAlt, faWindowRestore } from '@fortawesome/free-regular-svg-icons';
-import * as os from '@/os';
+import * as os from '@client/os';
 import { faICursor } from '@fortawesome/free-solid-svg-icons';
 
 export default defineComponent({
diff --git a/src/client/components/drive.nav-folder.vue b/src/client/components/drive.nav-folder.vue
index 881330529c278acbf0541fc5867ba65937f159de..89a267b19f1b6bc390de3979c68547b80ba0adc0 100644
--- a/src/client/components/drive.nav-folder.vue
+++ b/src/client/components/drive.nav-folder.vue
@@ -15,7 +15,7 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import { faCloud } from '@fortawesome/free-solid-svg-icons';
-import * as os from '@/os';
+import * as os from '@client/os';
 
 export default defineComponent({
 	props: {
diff --git a/src/client/components/drive.vue b/src/client/components/drive.vue
index b9d93ee4ccfe0088c80af92a169b434b27c03cd9..150d0d877424a86a1fde3829eaa075f3fb86b438 100644
--- a/src/client/components/drive.vue
+++ b/src/client/components/drive.vue
@@ -52,7 +52,7 @@ import XNavFolder from './drive.nav-folder.vue';
 import XFolder from './drive.folder.vue';
 import XFile from './drive.file.vue';
 import MkButton from './ui/button.vue';
-import * as os from '@/os';
+import * as os from '@client/os';
 import { faTrashAlt } from '@fortawesome/free-regular-svg-icons';
 
 export default defineComponent({
diff --git a/src/client/components/emoji-picker-dialog.vue b/src/client/components/emoji-picker-dialog.vue
index 4b165d9f91bde7ccc181a4fb184cb2800fb7009d..5bdbc330adf195a12b166e2df5dcca30a4854109 100644
--- a/src/client/components/emoji-picker-dialog.vue
+++ b/src/client/components/emoji-picker-dialog.vue
@@ -6,8 +6,8 @@
 
 <script lang="ts">
 import { defineComponent, markRaw } from 'vue';
-import MkModal from '@/components/ui/modal.vue';
-import MkEmojiPicker from '@/components/emoji-picker.vue';
+import MkModal from '@client/components/ui/modal.vue';
+import MkEmojiPicker from '@client/components/emoji-picker.vue';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/components/emoji-picker-window.vue b/src/client/components/emoji-picker-window.vue
index fb6a5a9072ef05e4e37422780a4bd11612c4f144..5504eaecd6999d946a001f41dfcb3f51ef74f672 100644
--- a/src/client/components/emoji-picker-window.vue
+++ b/src/client/components/emoji-picker-window.vue
@@ -13,8 +13,8 @@
 
 <script lang="ts">
 import { defineComponent, markRaw } from 'vue';
-import MkWindow from '@/components/ui/window.vue';
-import MkEmojiPicker from '@/components/emoji-picker.vue';
+import MkWindow from '@client/components/ui/window.vue';
+import MkEmojiPicker from '@client/components/emoji-picker.vue';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/components/emoji-picker.section.vue b/src/client/components/emoji-picker.section.vue
index a12493ce0d754d5379f02741f65ec85da9361484..944c507bdcfe03b0e1db8487fdea0bed1f11bace 100644
--- a/src/client/components/emoji-picker.section.vue
+++ b/src/client/components/emoji-picker.section.vue
@@ -18,7 +18,7 @@
 <script lang="ts">
 import { defineComponent, markRaw } from 'vue';
 import { faChevronUp, faChevronDown } from '@fortawesome/free-solid-svg-icons';
-import { getStaticImageUrl } from '@/scripts/get-static-image-url';
+import { getStaticImageUrl } from '@client/scripts/get-static-image-url';
 
 export default defineComponent({
 	props: {
diff --git a/src/client/components/emoji-picker.vue b/src/client/components/emoji-picker.vue
index 99d6c8a330db7021ad54d0a58038a88bb93baa8f..573833b9d375bb6f43dbf042369a07b2c4d35320 100644
--- a/src/client/components/emoji-picker.vue
+++ b/src/client/components/emoji-picker.vue
@@ -74,15 +74,15 @@
 
 <script lang="ts">
 import { defineComponent, markRaw } from 'vue';
-import { emojilist } from '../../misc/emojilist';
-import { getStaticImageUrl } from '@/scripts/get-static-image-url';
+import { emojilist } from '@/misc/emojilist';
+import { getStaticImageUrl } from '@client/scripts/get-static-image-url';
 import { faAsterisk, faLeaf, faUtensils, faFutbol, faCity, faDice, faGlobe, faClock, faUser, faChevronDown, faShapes, faBicycle, faHashtag } from '@fortawesome/free-solid-svg-icons';
 import { faHeart, faFlag, faLaugh } from '@fortawesome/free-regular-svg-icons';
-import Particle from '@/components/particle.vue';
-import * as os from '@/os';
-import { isDeviceTouch } from '@/scripts/is-device-touch';
-import { isMobile } from '@/scripts/is-mobile';
-import { emojiCategories } from '@/instance';
+import Particle from '@client/components/particle.vue';
+import * as os from '@client/os';
+import { isDeviceTouch } from '@client/scripts/is-device-touch';
+import { isMobile } from '@client/scripts/is-mobile';
+import { emojiCategories } from '@client/instance';
 import XSection from './emoji-picker.section.vue';
 
 export default defineComponent({
diff --git a/src/client/components/featured-photos.vue b/src/client/components/featured-photos.vue
index d0eb775cd0490458687d748edc84853b1ebebf4e..daa2190feb56661f9c3b2cb80cf57cbc6b33d473 100644
--- a/src/client/components/featured-photos.vue
+++ b/src/client/components/featured-photos.vue
@@ -6,7 +6,7 @@
 
 <script lang="ts">
 import { defineComponent } from 'vue';
-import * as os from '@/os';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/components/file-type-icon.vue b/src/client/components/file-type-icon.vue
index ec29d5c8824db8f8fc100589c502998e05fe5c6d..2da9ba0cbda55bf52d9e8fe85bab7f9729e8f870 100644
--- a/src/client/components/file-type-icon.vue
+++ b/src/client/components/file-type-icon.vue
@@ -7,7 +7,7 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import { faFileImage } from '@fortawesome/free-solid-svg-icons';
-import * as os from '@/os';
+import * as os from '@client/os';
 
 export default defineComponent({
 	props: {
diff --git a/src/client/components/follow-button.vue b/src/client/components/follow-button.vue
index 1234649e5ac0d3eeba6d208feefaac820c97d269..d2dc9223bdf6314a34ff0a6a329c733374341c00 100644
--- a/src/client/components/follow-button.vue
+++ b/src/client/components/follow-button.vue
@@ -30,7 +30,7 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import { faSpinner, faPlus, faMinus, faHourglassHalf } from '@fortawesome/free-solid-svg-icons';
-import * as os from '@/os';
+import * as os from '@client/os';
 
 export default defineComponent({
 	props: {
diff --git a/src/client/components/form-dialog.vue b/src/client/components/form-dialog.vue
index 7620abcd766fe6d6c1e7d81a7ccd66b98c741b4c..d6a7e39d45ef1328dd273f588679ccdffc861f13 100644
--- a/src/client/components/form-dialog.vue
+++ b/src/client/components/form-dialog.vue
@@ -48,7 +48,7 @@
 
 <script lang="ts">
 import { defineComponent } from 'vue';
-import XModalWindow from '@/components/ui/modal-window.vue';
+import XModalWindow from '@client/components/ui/modal-window.vue';
 import FormBase from './form/base.vue';
 import FormInput from './form/input.vue';
 import FormTextarea from './form/textarea.vue';
diff --git a/src/client/components/form/pagination.vue b/src/client/components/form/pagination.vue
index df65d9684dcdb7983211382b1e918e50f04b80d1..0a2f1ff0e13c141ce1e64a6ff1247308144bcf3d 100644
--- a/src/client/components/form/pagination.vue
+++ b/src/client/components/form/pagination.vue
@@ -16,7 +16,7 @@
 import { defineComponent } from 'vue';
 import FormButton from './button.vue';
 import FormGroup from './group.vue';
-import paging from '@/scripts/paging';
+import paging from '@client/scripts/paging';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/components/form/radios.vue b/src/client/components/form/radios.vue
index 4c7f405cacedc83e3a0dcfb892e02ec6bdf34f78..4561df32e18bf4ec43a376de0dfce85e05db2f3c 100644
--- a/src/client/components/form/radios.vue
+++ b/src/client/components/form/radios.vue
@@ -1,6 +1,6 @@
 <script lang="ts">
 import { defineComponent, h } from 'vue';
-import MkRadio from '@/components/ui/radio.vue';
+import MkRadio from '@client/components/ui/radio.vue';
 import './form.scss';
 
 export default defineComponent({
diff --git a/src/client/components/formula-core.vue b/src/client/components/formula-core.vue
index 29c049297efa9f80940ce55cd104f3a40a607178..6e35295ff5bb04564ba4cdbf76ac442ace1fc31b 100644
--- a/src/client/components/formula-core.vue
+++ b/src/client/components/formula-core.vue
@@ -6,7 +6,7 @@
 
 <script lang="ts">
 import { defineComponent } from 'vue';
-import * as katex from 'katex';import * as os from '@/os';
+import * as katex from 'katex';import * as os from '@client/os';
 
 export default defineComponent({
 	props: {
diff --git a/src/client/components/formula.vue b/src/client/components/formula.vue
index fbb40bace76a66adc90afa3e843b42d956567861..6722ce38a153be81b14c2d1809c773e931a2b434 100644
--- a/src/client/components/formula.vue
+++ b/src/client/components/formula.vue
@@ -3,7 +3,7 @@
 </template>
 
 <script lang="ts">
-import { defineComponent, defineAsyncComponent } from 'vue';import * as os from '@/os';
+import { defineComponent, defineAsyncComponent } from 'vue';import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/components/global/a.vue b/src/client/components/global/a.vue
index d293cb571f8706b3e53dd41205a889626d57230d..a8a597b2bbfff8856ee3dab693f4da40884ba8cb 100644
--- a/src/client/components/global/a.vue
+++ b/src/client/components/global/a.vue
@@ -7,12 +7,12 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import { faExpandAlt, faColumns, faExternalLinkAlt, faLink, faWindowMaximize } from '@fortawesome/free-solid-svg-icons';
-import * as os from '@/os';
-import copyToClipboard from '@/scripts/copy-to-clipboard';
-import { router } from '@/router';
-import { url } from '@/config';
-import { popout } from '@/scripts/popout';
-import { ColdDeviceStorage } from '@/store';
+import * as os from '@client/os';
+import copyToClipboard from '@client/scripts/copy-to-clipboard';
+import { router } from '@client/router';
+import { url } from '@client/config';
+import { popout } from '@client/scripts/popout';
+import { ColdDeviceStorage } from '@client/store';
 
 export default defineComponent({
 	inject: {
diff --git a/src/client/components/global/acct.vue b/src/client/components/global/acct.vue
index cad906524e34329a4b30671dbec8c33e800d8715..a969636a7edd86633781e62f4e676dcaf1fd2596 100644
--- a/src/client/components/global/acct.vue
+++ b/src/client/components/global/acct.vue
@@ -8,7 +8,7 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import { toUnicode } from 'punycode';
-import { host } from '@/config';
+import { host } from '@client/config';
 
 export default defineComponent({
 	props: ['user', 'detail'],
diff --git a/src/client/components/global/avatar.vue b/src/client/components/global/avatar.vue
index d2f25fa41e64b2f2cac870e2cee3e5fa9c19b3ac..83675a155c9e7f2f561e933b6ef95a0822b24947 100644
--- a/src/client/components/global/avatar.vue
+++ b/src/client/components/global/avatar.vue
@@ -9,9 +9,9 @@
 
 <script lang="ts">
 import { defineComponent } from 'vue';
-import { getStaticImageUrl } from '@/scripts/get-static-image-url';
-import { extractAvgColorFromBlurhash } from '@/scripts/extract-avg-color-from-blurhash';
-import { acct, userPage } from '@/filters/user';
+import { getStaticImageUrl } from '@client/scripts/get-static-image-url';
+import { extractAvgColorFromBlurhash } from '@client/scripts/extract-avg-color-from-blurhash';
+import { acct, userPage } from '@client/filters/user';
 
 export default defineComponent({
 	props: {
diff --git a/src/client/components/global/emoji.vue b/src/client/components/global/emoji.vue
index c072b8431bb4ed21438ff1e61f64d7f1b2e356b8..f4ebd5f3b38a7e0cf42f72458636062acca0f8ea 100644
--- a/src/client/components/global/emoji.vue
+++ b/src/client/components/global/emoji.vue
@@ -7,8 +7,8 @@
 
 <script lang="ts">
 import { defineComponent } from 'vue';
-import { getStaticImageUrl } from '@/scripts/get-static-image-url';
-import { twemojiSvgBase } from '@/../misc/twemoji-base';
+import { getStaticImageUrl } from '@client/scripts/get-static-image-url';
+import { twemojiSvgBase } from '@client/../misc/twemoji-base';
 
 export default defineComponent({
 	props: {
diff --git a/src/client/components/global/error.vue b/src/client/components/global/error.vue
index b78973ff82d58bb69703912eb4fee57e82b7f9a5..af989b1c57419d288e333167f166badff7e650c8 100644
--- a/src/client/components/global/error.vue
+++ b/src/client/components/global/error.vue
@@ -11,7 +11,7 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import { faExclamationTriangle } from '@fortawesome/free-solid-svg-icons';
-import MkButton from '@/components/ui/button.vue';
+import MkButton from '@client/components/ui/button.vue';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/components/global/loading.vue b/src/client/components/global/loading.vue
index b4693258b9af3eacad5206d4baf0062d040f2e19..5d0c10c08665209016564ec5f36af880f2a89c21 100644
--- a/src/client/components/global/loading.vue
+++ b/src/client/components/global/loading.vue
@@ -6,7 +6,7 @@
 
 <script lang="ts">
 import { defineComponent } from 'vue';
-import * as os from '@/os';
+import * as os from '@client/os';
 
 export default defineComponent({
 	props: {
diff --git a/src/client/components/global/misskey-flavored-markdown.vue b/src/client/components/global/misskey-flavored-markdown.vue
index a3f443d5d865c9d6ddaf76ed5596b0449b29ecfc..988cf9cf47b4a157238ae539be39883f27dfd8ef 100644
--- a/src/client/components/global/misskey-flavored-markdown.vue
+++ b/src/client/components/global/misskey-flavored-markdown.vue
@@ -4,7 +4,7 @@
 
 <script lang="ts">
 import { defineComponent } from 'vue';
-import MfmCore from '@/components/mfm';
+import MfmCore from '@client/components/mfm';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/components/global/url.vue b/src/client/components/global/url.vue
index 2650cd33fde14e3358fe05b17e586d1695fbbf07..c89536ebdb87d0844826ec25eec08f6ce75a3b94 100644
--- a/src/client/components/global/url.vue
+++ b/src/client/components/global/url.vue
@@ -23,9 +23,9 @@
 import { defineComponent } from 'vue';
 import { faExternalLinkSquareAlt } from '@fortawesome/free-solid-svg-icons';
 import { toUnicode as decodePunycode } from 'punycode';
-import { url as local } from '@/config';
-import { isDeviceTouch } from '@/scripts/is-device-touch';
-import * as os from '@/os';
+import { url as local } from '@client/config';
+import { isDeviceTouch } from '@client/scripts/is-device-touch';
+import * as os from '@client/os';
 
 export default defineComponent({
 	props: {
@@ -72,7 +72,7 @@ export default defineComponent({
 			if (!document.body.contains(this.$el)) return;
 			if (this.close) return;
 
-			const { dispose } = await os.popup(import('@/components/url-preview-popup.vue'), {
+			const { dispose } = await os.popup(import('@client/components/url-preview-popup.vue'), {
 				url: this.url,
 				source: this.$el
 			});
diff --git a/src/client/components/google.vue b/src/client/components/google.vue
index fe692a9255c632ebeff85a3b3708e4b5dafeb0d3..20dc1f825a72cff999abbcdc926d5b2b39784466 100644
--- a/src/client/components/google.vue
+++ b/src/client/components/google.vue
@@ -8,7 +8,7 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import { faSearch } from '@fortawesome/free-solid-svg-icons';
-import * as os from '@/os';
+import * as os from '@client/os';
 
 export default defineComponent({
 	props: ['q'],
diff --git a/src/client/components/image-viewer.vue b/src/client/components/image-viewer.vue
index 320df30506f79c89ae203541bd4b14880d8d6e56..ec22bd98ecd8dffd447d65de6b4697f73f7d9b81 100644
--- a/src/client/components/image-viewer.vue
+++ b/src/client/components/image-viewer.vue
@@ -14,9 +14,9 @@
 
 <script lang="ts">
 import { defineComponent } from 'vue';
-import bytes from '@/filters/bytes';
-import number from '@/filters/number';
-import MkModal from '@/components/ui/modal.vue';
+import bytes from '@client/filters/bytes';
+import number from '@client/filters/number';
+import MkModal from '@client/components/ui/modal.vue';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/components/instance-stats.vue b/src/client/components/instance-stats.vue
index e9b496180a89def187010a981e2adf49be6bf1a4..75abefc2fe69168cfbe7b37c82013f048e006363 100644
--- a/src/client/components/instance-stats.vue
+++ b/src/client/components/instance-stats.vue
@@ -126,7 +126,7 @@ import { defineComponent, markRaw } from 'vue';
 import { faChartBar, faUser, faPencilAlt, faSync } from '@fortawesome/free-solid-svg-icons';
 import Chart from 'chart.js';
 import MkSelect from './ui/select.vue';
-import number from '@/filters/number';
+import number from '@client/filters/number';
 
 const sum = (...arr) => arr.reduce((r, a) => r.map((b, i) => a[i] + b));
 const negate = arr => arr.map(x => -x);
@@ -137,7 +137,7 @@ const alpha = (hex, a) => {
 	const b = parseInt(result[3], 16);
 	return `rgba(${r}, ${g}, ${b}, ${a})`;
 };
-import * as os from '@/os';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/components/instance-ticker.vue b/src/client/components/instance-ticker.vue
index 1ce5a1c2c19e2e650c58572223d08739c44c4d06..5674174558fe52bb92dccaf77806462bd1fb684f 100644
--- a/src/client/components/instance-ticker.vue
+++ b/src/client/components/instance-ticker.vue
@@ -7,7 +7,7 @@
 
 <script lang="ts">
 import { defineComponent } from 'vue';
-import { instanceName } from '@/config';
+import { instanceName } from '@client/config';
 
 export default defineComponent({
 	props: {
diff --git a/src/client/components/launch-pad.vue b/src/client/components/launch-pad.vue
index 4d2a3b2c7737fdb2fc3fb72db42bac7bb0702b3d..a81320954c0c4daf35ceeae933a3395561dcb981 100644
--- a/src/client/components/launch-pad.vue
+++ b/src/client/components/launch-pad.vue
@@ -36,9 +36,9 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import { faQuestionCircle, faInfoCircle, faCircle } from '@fortawesome/free-solid-svg-icons';
-import MkModal from '@/components/ui/modal.vue';
-import { sidebarDef } from '@/sidebar';
-import { instanceName } from '@/config';
+import MkModal from '@client/components/ui/modal.vue';
+import { sidebarDef } from '@client/sidebar';
+import { instanceName } from '@client/config';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/components/link.vue b/src/client/components/link.vue
index f51773dc4b134faf6e8d4ff37aae7e6dcb96d576..cc7db8c2f57e9824cf95243c17bba0ac04f451d7 100644
--- a/src/client/components/link.vue
+++ b/src/client/components/link.vue
@@ -12,9 +12,9 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import { faExternalLinkSquareAlt } from '@fortawesome/free-solid-svg-icons';
-import { url as local } from '@/config';
-import { isDeviceTouch } from '@/scripts/is-device-touch';
-import * as os from '@/os';
+import { url as local } from '@client/config';
+import { isDeviceTouch } from '@client/scripts/is-device-touch';
+import * as os from '@client/os';
 
 export default defineComponent({
 	props: {
@@ -46,7 +46,7 @@ export default defineComponent({
 			if (!document.body.contains(this.$el)) return;
 			if (this.close) return;
 
-			const { dispose } = await os.popup(import('@/components/url-preview-popup.vue'), {
+			const { dispose } = await os.popup(import('@client/components/url-preview-popup.vue'), {
 				url: this.url,
 				source: this.$el
 			});
diff --git a/src/client/components/media-banner.vue b/src/client/components/media-banner.vue
index a2e1776d09815ea089ae8188db72476ea5fca5bb..29d7c727f600dcde52c3a7803dd8417ee0961c54 100644
--- a/src/client/components/media-banner.vue
+++ b/src/client/components/media-banner.vue
@@ -28,8 +28,8 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import { faExclamationTriangle } from '@fortawesome/free-solid-svg-icons';
-import * as os from '@/os';
-import { ColdDeviceStorage } from '@/store';
+import * as os from '@client/os';
+import { ColdDeviceStorage } from '@client/store';
 
 export default defineComponent({
 	props: {
diff --git a/src/client/components/media-image.vue b/src/client/components/media-image.vue
index 9f3898ec56815e3cd088bef6c7da4d7ae4c08f57..41760d98d7bef6ff72339942febc584b6bfd1f8d 100644
--- a/src/client/components/media-image.vue
+++ b/src/client/components/media-image.vue
@@ -24,11 +24,11 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import { faExclamationTriangle, faEyeSlash } from '@fortawesome/free-solid-svg-icons';
-import { getStaticImageUrl } from '@/scripts/get-static-image-url';
-import { extractAvgColorFromBlurhash } from '@/scripts/extract-avg-color-from-blurhash';
+import { getStaticImageUrl } from '@client/scripts/get-static-image-url';
+import { extractAvgColorFromBlurhash } from '@client/scripts/extract-avg-color-from-blurhash';
 import ImageViewer from './image-viewer.vue';
 import ImgWithBlurhash from './img-with-blurhash.vue';
-import * as os from '@/os';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/components/media-list.vue b/src/client/components/media-list.vue
index 36fbb4bd06078b1c3cdb8119f537a95ad3464776..71767a0f9f31a7ee348855f85374e61c33857b1e 100644
--- a/src/client/components/media-list.vue
+++ b/src/client/components/media-list.vue
@@ -17,7 +17,7 @@ import { defineComponent } from 'vue';
 import XBanner from './media-banner.vue';
 import XImage from './media-image.vue';
 import XVideo from './media-video.vue';
-import * as os from '@/os';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/components/media-video.vue b/src/client/components/media-video.vue
index bdd3983e1e8fe737e246e1c504d852b59b0c7adf..b6f63cb65d1f8fa8c87d5c22a203bbaad8e01315 100644
--- a/src/client/components/media-video.vue
+++ b/src/client/components/media-video.vue
@@ -25,7 +25,7 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import { faExclamationTriangle, faEyeSlash } from '@fortawesome/free-solid-svg-icons';
-import * as os from '@/os';
+import * as os from '@client/os';
 
 export default defineComponent({
 	props: {
diff --git a/src/client/components/mention.vue b/src/client/components/mention.vue
index 12a620af9d03b0c7360f8e925bb55a8c3370289e..322e56d957d9a4a1d9a2b1de20eca5af6d951fc6 100644
--- a/src/client/components/mention.vue
+++ b/src/client/components/mention.vue
@@ -17,9 +17,9 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import { toUnicode } from 'punycode';
-import { host as localHost } from '@/config';
+import { host as localHost } from '@client/config';
 import { wellKnownServices } from '../../well-known-services';
-import * as os from '@/os';
+import * as os from '@client/os';
 
 export default defineComponent({
 	props: {
diff --git a/src/client/components/mfm.ts b/src/client/components/mfm.ts
index bca469a1594a65c73cfc636ad46f5517c860caf7..28ac9b8942653d10c4ce87b0b877cb54d7f19344 100644
--- a/src/client/components/mfm.ts
+++ b/src/client/components/mfm.ts
@@ -1,16 +1,16 @@
 import { VNode, defineComponent, h } from 'vue';
-import { MfmForest } from '@/../mfm/prelude';
-import { parse, parsePlain } from '@/../mfm/parse';
-import MkUrl from '@/components/global/url.vue';
-import MkLink from '@/components/link.vue';
-import MkMention from '@/components/mention.vue';
-import MkEmoji from '@/components/global/emoji.vue';
-import { concat } from '@/../prelude/array';
-import MkFormula from '@/components/formula.vue';
-import MkCode from '@/components/code.vue';
-import MkGoogle from '@/components/google.vue';
-import MkA from '@/components/global/a.vue';
-import { host } from '@/config';
+import { MfmForest } from '@client/../mfm/prelude';
+import { parse, parsePlain } from '@client/../mfm/parse';
+import MkUrl from '@client/components/global/url.vue';
+import MkLink from '@client/components/link.vue';
+import MkMention from '@client/components/mention.vue';
+import MkEmoji from '@client/components/global/emoji.vue';
+import { concat } from '@client/../prelude/array';
+import MkFormula from '@client/components/formula.vue';
+import MkCode from '@client/components/code.vue';
+import MkGoogle from '@client/components/google.vue';
+import MkA from '@client/components/global/a.vue';
+import { host } from '@client/config';
 
 export default defineComponent({
 	props: {
diff --git a/src/client/components/mini-chart.vue b/src/client/components/mini-chart.vue
index 2eb9ae8cbeba6b36005ba3772ad5b3b8f10ba702..0d01e4e4b59a6a0c8e6dd74d6b325630c177bba5 100644
--- a/src/client/components/mini-chart.vue
+++ b/src/client/components/mini-chart.vue
@@ -32,7 +32,7 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import { v4 as uuid } from 'uuid';
-import * as os from '@/os';
+import * as os from '@client/os';
 
 export default defineComponent({
 	props: {
diff --git a/src/client/components/note-detailed.vue b/src/client/components/note-detailed.vue
index ea26d31100e6cec8fbd288c4ccd2ba47f571fb6c..fb4f9502b35f61a698fdd225923fca8af67cccf2 100644
--- a/src/client/components/note-detailed.vue
+++ b/src/client/components/note-detailed.vue
@@ -132,15 +132,15 @@ import XReactionsViewer from './reactions-viewer.vue';
 import XMediaList from './media-list.vue';
 import XCwButton from './cw-button.vue';
 import XPoll from './poll.vue';
-import { pleaseLogin } from '@/scripts/please-login';
-import { focusPrev, focusNext } from '@/scripts/focus';
-import { url } from '@/config';
-import copyToClipboard from '@/scripts/copy-to-clipboard';
-import { checkWordMute } from '@/scripts/check-word-mute';
-import { userPage } from '@/filters/user';
-import * as os from '@/os';
-import { noteActions, noteViewInterruptors } from '@/store';
-import { reactionPicker } from '@/scripts/reaction-picker';
+import { pleaseLogin } from '@client/scripts/please-login';
+import { focusPrev, focusNext } from '@client/scripts/focus';
+import { url } from '@client/config';
+import copyToClipboard from '@client/scripts/copy-to-clipboard';
+import { checkWordMute } from '@client/scripts/check-word-mute';
+import { userPage } from '@client/filters/user';
+import * as os from '@client/os';
+import { noteActions, noteViewInterruptors } from '@client/store';
+import { reactionPicker } from '@client/scripts/reaction-picker';
 
 function markRawAll(...xs) {
 	for (const x of xs) {
@@ -160,8 +160,8 @@ export default defineComponent({
 		XMediaList,
 		XCwButton,
 		XPoll,
-		MkUrlPreview: defineAsyncComponent(() => import('@/components/url-preview.vue')),
-		MkInstanceTicker: defineAsyncComponent(() => import('@/components/instance-ticker.vue')),
+		MkUrlPreview: defineAsyncComponent(() => import('@client/components/url-preview.vue')),
+		MkInstanceTicker: defineAsyncComponent(() => import('@client/components/instance-ticker.vue')),
 	},
 
 	inject: {
@@ -687,7 +687,7 @@ export default defineComponent({
 						text: this.$ts.reportAbuse,
 						action: () => {
 							const u = `${url}/notes/${this.appearNote.id}`;
-							os.popup(import('@/components/abuse-report-window.vue'), {
+							os.popup(import('@client/components/abuse-report-window.vue'), {
 								user: this.appearNote.user,
 								initialComment: `Note: ${u}\n-----\n`
 							}, {}, 'closed');
diff --git a/src/client/components/note-header.vue b/src/client/components/note-header.vue
index 1f7a07bac3bc78b94c1cebeba674e8e8ba86fec2..a6e9b6fe568c6e2018319e3ef761a31eb8b40e3a 100644
--- a/src/client/components/note-header.vue
+++ b/src/client/components/note-header.vue
@@ -28,7 +28,7 @@ import { faHome, faUnlock, faEnvelope, faMobileAlt, faBookmark, faBiohazard } fr
 import { faBookmark as farBookmark } from '@fortawesome/free-regular-svg-icons';
 import notePage from '../filters/note';
 import { userPage } from '../filters/user';
-import * as os from '@/os';
+import * as os from '@client/os';
 
 export default defineComponent({
 	props: {
diff --git a/src/client/components/note-preview.vue b/src/client/components/note-preview.vue
index 4ea97d17ee05e59573b22d4ab3437697893d7609..fcae4c4368645302c76cc5a5dcae5b1191d62f4b 100644
--- a/src/client/components/note-preview.vue
+++ b/src/client/components/note-preview.vue
@@ -21,7 +21,7 @@ import { defineComponent } from 'vue';
 import XNoteHeader from './note-header.vue';
 import XSubNoteContent from './sub-note-content.vue';
 import XCwButton from './cw-button.vue';
-import * as os from '@/os';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/components/note.sub.vue b/src/client/components/note.sub.vue
index 28553ea4a7e9787cd09798f551d31a48087bbdfe..853d481406845fdc4fecb680551ce684b234f489 100644
--- a/src/client/components/note.sub.vue
+++ b/src/client/components/note.sub.vue
@@ -24,7 +24,7 @@ import { defineComponent } from 'vue';
 import XNoteHeader from './note-header.vue';
 import XSubNoteContent from './sub-note-content.vue';
 import XCwButton from './cw-button.vue';
-import * as os from '@/os';
+import * as os from '@client/os';
 
 export default defineComponent({
 	name: 'XSub',
diff --git a/src/client/components/note.vue b/src/client/components/note.vue
index 70f49fef7e4a310b29ffdbdb4c6aab6406f54099..b54cadfc8052cb5e4fc5f2ab7ea146c4a95afba8 100644
--- a/src/client/components/note.vue
+++ b/src/client/components/note.vue
@@ -114,15 +114,15 @@ import XReactionsViewer from './reactions-viewer.vue';
 import XMediaList from './media-list.vue';
 import XCwButton from './cw-button.vue';
 import XPoll from './poll.vue';
-import { pleaseLogin } from '@/scripts/please-login';
-import { focusPrev, focusNext } from '@/scripts/focus';
-import { url } from '@/config';
-import copyToClipboard from '@/scripts/copy-to-clipboard';
-import { checkWordMute } from '@/scripts/check-word-mute';
-import { userPage } from '@/filters/user';
-import * as os from '@/os';
-import { noteActions, noteViewInterruptors } from '@/store';
-import { reactionPicker } from '@/scripts/reaction-picker';
+import { pleaseLogin } from '@client/scripts/please-login';
+import { focusPrev, focusNext } from '@client/scripts/focus';
+import { url } from '@client/config';
+import copyToClipboard from '@client/scripts/copy-to-clipboard';
+import { checkWordMute } from '@client/scripts/check-word-mute';
+import { userPage } from '@client/filters/user';
+import * as os from '@client/os';
+import { noteActions, noteViewInterruptors } from '@client/store';
+import { reactionPicker } from '@client/scripts/reaction-picker';
 
 function markRawAll(...xs) {
 	for (const x of xs) {
@@ -141,8 +141,8 @@ export default defineComponent({
 		XMediaList,
 		XCwButton,
 		XPoll,
-		MkUrlPreview: defineAsyncComponent(() => import('@/components/url-preview.vue')),
-		MkInstanceTicker: defineAsyncComponent(() => import('@/components/instance-ticker.vue')),
+		MkUrlPreview: defineAsyncComponent(() => import('@client/components/url-preview.vue')),
+		MkInstanceTicker: defineAsyncComponent(() => import('@client/components/instance-ticker.vue')),
 	},
 
 	inject: {
@@ -662,7 +662,7 @@ export default defineComponent({
 						text: this.$ts.reportAbuse,
 						action: () => {
 							const u = `${url}/notes/${this.appearNote.id}`;
-							os.popup(import('@/components/abuse-report-window.vue'), {
+							os.popup(import('@client/components/abuse-report-window.vue'), {
 								user: this.appearNote.user,
 								initialComment: `Note: ${u}\n-----\n`
 							}, {}, 'closed');
diff --git a/src/client/components/notes.vue b/src/client/components/notes.vue
index 332f00e5db6872bd656d625f66e81d5271c21110..80a9502d5f6160265933be3d71e9b89c7f6c3d6e 100644
--- a/src/client/components/notes.vue
+++ b/src/client/components/notes.vue
@@ -29,10 +29,10 @@
 
 <script lang="ts">
 import { defineComponent } from 'vue';
-import paging from '@/scripts/paging';
+import paging from '@client/scripts/paging';
 import XNote from './note.vue';
 import XList from './date-separated-list.vue';
-import MkButton from '@/components/ui/button.vue';
+import MkButton from '@client/components/ui/button.vue';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/components/notification-setting-window.vue b/src/client/components/notification-setting-window.vue
index 1c19de9ff9b2debdd0e35f9e4bbaa2eb3d060c69..a3e221f7b273281f8e527f9f2e31a757b6f3df2e 100644
--- a/src/client/components/notification-setting-window.vue
+++ b/src/client/components/notification-setting-window.vue
@@ -26,7 +26,7 @@
 
 <script lang="ts">
 import { defineComponent, PropType } from 'vue';
-import XModalWindow from '@/components/ui/modal-window.vue';
+import XModalWindow from '@client/components/ui/modal-window.vue';
 import MkSwitch from './ui/switch.vue';
 import MkInfo from './ui/info.vue';
 import MkButton from './ui/button.vue';
diff --git a/src/client/components/notification.vue b/src/client/components/notification.vue
index 2fe85008914ffb95f601705b078af903bf59f12f..2b8b440ced0b09942a9cbfa2013a333a3e8a8883 100644
--- a/src/client/components/notification.vue
+++ b/src/client/components/notification.vue
@@ -61,13 +61,13 @@
 import { defineComponent } from 'vue';
 import { faIdCardAlt, faPlus, faQuoteLeft, faQuoteRight, faRetweet, faReply, faAt, faCheck, faPollH } from '@fortawesome/free-solid-svg-icons';
 import { faClock } from '@fortawesome/free-regular-svg-icons';
-import { getNoteSummary } from '../../misc/get-note-summary';
+import { getNoteSummary } from '@/misc/get-note-summary';
 import XReactionIcon from './reaction-icon.vue';
 import MkFollowButton from './follow-button.vue';
 import notePage from '../filters/note';
 import { userPage } from '../filters/user';
-import { i18n } from '@/i18n';
-import * as os from '@/os';
+import { i18n } from '@client/i18n';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/components/notifications.vue b/src/client/components/notifications.vue
index 56dbfd5bdfea82d4c049ba14d7ef67a59f84e830..01b3ae43964b43e42b79a86428c0f3d9855aaca8 100644
--- a/src/client/components/notifications.vue
+++ b/src/client/components/notifications.vue
@@ -18,12 +18,12 @@
 
 <script lang="ts">
 import { defineComponent, PropType } from 'vue';
-import paging from '@/scripts/paging';
+import paging from '@client/scripts/paging';
 import XNotification from './notification.vue';
 import XList from './date-separated-list.vue';
 import XNote from './note.vue';
 import { notificationTypes } from '../../types';
-import * as os from '@/os';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/components/page-preview.vue b/src/client/components/page-preview.vue
index d59813e00de1ffc28531d04177afd9bb2f133c62..2125ddc534823bb2e0eb93cc446604d9cab5b363 100644
--- a/src/client/components/page-preview.vue
+++ b/src/client/components/page-preview.vue
@@ -17,7 +17,7 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import { userName } from '../filters/user';
-import * as os from '@/os';
+import * as os from '@client/os';
 
 export default defineComponent({
 	props: {
diff --git a/src/client/components/page-window.vue b/src/client/components/page-window.vue
index 37342c403bc8211c40b7f553d0c74b6278ce77b7..ca6f4dd73e054924e91052ba2221a0184593ece3 100644
--- a/src/client/components/page-window.vue
+++ b/src/client/components/page-window.vue
@@ -23,12 +23,12 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import { faExternalLinkAlt, faExpandAlt, faLink, faChevronLeft, faColumns } from '@fortawesome/free-solid-svg-icons';
-import XWindow from '@/components/ui/window.vue';
-import XHeader from '@/ui/_common_/header.vue';
-import { popout } from '@/scripts/popout';
-import copyToClipboard from '@/scripts/copy-to-clipboard';
-import { resolve } from '@/router';
-import { url } from '@/config';
+import XWindow from '@client/components/ui/window.vue';
+import XHeader from '@client/ui/_common_/header.vue';
+import { popout } from '@client/scripts/popout';
+import copyToClipboard from '@client/scripts/copy-to-clipboard';
+import { resolve } from '@client/router';
+import { url } from '@client/config';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/components/page/page.block.vue b/src/client/components/page/page.block.vue
index 54b8b30276a5f38d599dcc2a4c6d99e6e1f919a0..ffd9ce89f9fa7173031492a7bfd49f9511ea268c 100644
--- a/src/client/components/page/page.block.vue
+++ b/src/client/components/page/page.block.vue
@@ -19,8 +19,8 @@ import XCounter from './page.counter.vue';
 import XRadioButton from './page.radio-button.vue';
 import XCanvas from './page.canvas.vue';
 import XNote from './page.note.vue';
-import { Hpml } from '@/scripts/hpml/evaluator';
-import { Block } from '@/scripts/hpml/block';
+import { Hpml } from '@client/scripts/hpml/evaluator';
+import { Block } from '@client/scripts/hpml/block';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/components/page/page.button.vue b/src/client/components/page/page.button.vue
index 51da84bd490741912bef341dbbf36377a0b37086..c6ae67521232b21eb95c939bacf475d78011d6d1 100644
--- a/src/client/components/page/page.button.vue
+++ b/src/client/components/page/page.button.vue
@@ -7,9 +7,9 @@
 <script lang="ts">
 import { defineComponent, PropType, unref } from 'vue';
 import MkButton from '../ui/button.vue';
-import * as os from '@/os';
-import { ButtonBlock } from '@/scripts/hpml/block';
-import { Hpml } from '@/scripts/hpml/evaluator';
+import * as os from '@client/os';
+import { ButtonBlock } from '@client/scripts/hpml/block';
+import { Hpml } from '@client/scripts/hpml/evaluator';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/components/page/page.canvas.vue b/src/client/components/page/page.canvas.vue
index 8f49b88e5e216574a33f4e088b13267d13975040..e26db597f26be7c8664fd52fe91a250be1f38888 100644
--- a/src/client/components/page/page.canvas.vue
+++ b/src/client/components/page/page.canvas.vue
@@ -6,9 +6,9 @@
 
 <script lang="ts">
 import { defineComponent, onMounted, PropType, Ref, ref } from 'vue';
-import * as os from '@/os';
-import { CanvasBlock } from '@/scripts/hpml/block';
-import { Hpml } from '@/scripts/hpml/evaluator';
+import * as os from '@client/os';
+import { CanvasBlock } from '@client/scripts/hpml/block';
+import { Hpml } from '@client/scripts/hpml/evaluator';
 
 export default defineComponent({
 	props: {
diff --git a/src/client/components/page/page.counter.vue b/src/client/components/page/page.counter.vue
index b1af8954b011bf5779daacf01d223d591cae3df6..dad7ac3da00e75174541857c03c8e8ab5753556f 100644
--- a/src/client/components/page/page.counter.vue
+++ b/src/client/components/page/page.counter.vue
@@ -7,9 +7,9 @@
 <script lang="ts">
 import { computed, defineComponent, PropType } from 'vue';
 import MkButton from '../ui/button.vue';
-import * as os from '@/os';
-import { CounterVarBlock } from '@/scripts/hpml/block';
-import { Hpml } from '@/scripts/hpml/evaluator';
+import * as os from '@client/os';
+import { CounterVarBlock } from '@client/scripts/hpml/block';
+import { Hpml } from '@client/scripts/hpml/evaluator';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/components/page/page.if.vue b/src/client/components/page/page.if.vue
index ec25332db0a890605f005e589bffaf802065bb08..a70525e07c7d67fdaf73b085164a56ab89067135 100644
--- a/src/client/components/page/page.if.vue
+++ b/src/client/components/page/page.if.vue
@@ -5,8 +5,8 @@
 </template>
 
 <script lang="ts">
-import { IfBlock } from '@/scripts/hpml/block';
-import { Hpml } from '@/scripts/hpml/evaluator';
+import { IfBlock } from '@client/scripts/hpml/block';
+import { Hpml } from '@client/scripts/hpml/evaluator';
 import { defineComponent, defineAsyncComponent, PropType } from 'vue';
 
 export default defineComponent({
diff --git a/src/client/components/page/page.image.vue b/src/client/components/page/page.image.vue
index 04ce74bd7cb8425caa58363b0a4e78b5bcd21897..14dedc98a04ec89eadf72484154fd9944cb493fd 100644
--- a/src/client/components/page/page.image.vue
+++ b/src/client/components/page/page.image.vue
@@ -6,9 +6,9 @@
 
 <script lang="ts">
 import { defineComponent, PropType } from 'vue';
-import * as os from '@/os';
-import { ImageBlock } from '@/scripts/hpml/block';
-import { Hpml } from '@/scripts/hpml/evaluator';
+import * as os from '@client/os';
+import { ImageBlock } from '@client/scripts/hpml/block';
+import { Hpml } from '@client/scripts/hpml/evaluator';
 
 export default defineComponent({
 	props: {
diff --git a/src/client/components/page/page.note.vue b/src/client/components/page/page.note.vue
index 925844c1bd6b12da336042a4196595293c427649..7a3f88bb1f3cc3f53589cb90f68b56f9696e65fa 100644
--- a/src/client/components/page/page.note.vue
+++ b/src/client/components/page/page.note.vue
@@ -7,10 +7,10 @@
 
 <script lang="ts">
 import { defineComponent, onMounted, PropType, Ref, ref } from 'vue';
-import XNote from '@/components/note.vue';
-import XNoteDetailed from '@/components/note-detailed.vue';
-import * as os from '@/os';
-import { NoteBlock } from '@/scripts/hpml/block';
+import XNote from '@client/components/note.vue';
+import XNoteDetailed from '@client/components/note-detailed.vue';
+import * as os from '@client/os';
+import { NoteBlock } from '@client/scripts/hpml/block';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/components/page/page.number-input.vue b/src/client/components/page/page.number-input.vue
index 7b7d79933020529fce0bb3ae320b3c1fb8facdb1..1970ee62a9ef28368e7996f0a09416e27f9d9423 100644
--- a/src/client/components/page/page.number-input.vue
+++ b/src/client/components/page/page.number-input.vue
@@ -7,9 +7,9 @@
 <script lang="ts">
 import { computed, defineComponent, PropType } from 'vue';
 import MkInput from '../ui/input.vue';
-import * as os from '@/os';
-import { Hpml } from '@/scripts/hpml/evaluator';
-import { NumberInputVarBlock } from '@/scripts/hpml/block';
+import * as os from '@client/os';
+import { Hpml } from '@client/scripts/hpml/evaluator';
+import { NumberInputVarBlock } from '@client/scripts/hpml/block';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/components/page/page.post.vue b/src/client/components/page/page.post.vue
index 33c6e6b14c5c60af96866a97a6f1702e0c4aab37..926d06ae808d473a919b331d841c55b2098a7f13 100644
--- a/src/client/components/page/page.post.vue
+++ b/src/client/components/page/page.post.vue
@@ -10,10 +10,10 @@ import { defineComponent, PropType } from 'vue';
 import { faCheck, faPaperPlane } from '@fortawesome/free-solid-svg-icons';
 import MkTextarea from '../ui/textarea.vue';
 import MkButton from '../ui/button.vue';
-import { apiUrl } from '@/config';
-import * as os from '@/os';
-import { PostBlock } from '@/scripts/hpml/block';
-import { Hpml } from '@/scripts/hpml/evaluator';
+import { apiUrl } from '@client/config';
+import * as os from '@client/os';
+import { PostBlock } from '@client/scripts/hpml/block';
+import { Hpml } from '@client/scripts/hpml/evaluator';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/components/page/page.radio-button.vue b/src/client/components/page/page.radio-button.vue
index def6ee8885b8c6f14f2ef28ca1476f7c075d0a2b..f6f146b52f25717f76f548605d64341e746ed4d5 100644
--- a/src/client/components/page/page.radio-button.vue
+++ b/src/client/components/page/page.radio-button.vue
@@ -8,9 +8,9 @@
 <script lang="ts">
 import { computed, defineComponent, PropType } from 'vue';
 import MkRadio from '../ui/radio.vue';
-import * as os from '@/os';
-import { Hpml } from '@/scripts/hpml/evaluator';
-import { RadioButtonVarBlock } from '@/scripts/hpml/block';
+import * as os from '@client/os';
+import { Hpml } from '@client/scripts/hpml/evaluator';
+import { RadioButtonVarBlock } from '@client/scripts/hpml/block';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/components/page/page.section.vue b/src/client/components/page/page.section.vue
index d32f5dc7327e87cef30dc57e3542a12a696a42db..81cab125013a5fc25e51433dc8a79307b2823993 100644
--- a/src/client/components/page/page.section.vue
+++ b/src/client/components/page/page.section.vue
@@ -10,9 +10,9 @@
 
 <script lang="ts">
 import { defineComponent, defineAsyncComponent, PropType } from 'vue';
-import * as os from '@/os';
-import { SectionBlock } from '@/scripts/hpml/block';
-import { Hpml } from '@/scripts/hpml/evaluator';
+import * as os from '@client/os';
+import { SectionBlock } from '@client/scripts/hpml/block';
+import { Hpml } from '@client/scripts/hpml/evaluator';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/components/page/page.switch.vue b/src/client/components/page/page.switch.vue
index 9c3fb5feaad653992d7d4d9e3d96716c61e4ecfc..a928c22bee788555e0ffe3f7347f215f4a51a020 100644
--- a/src/client/components/page/page.switch.vue
+++ b/src/client/components/page/page.switch.vue
@@ -7,9 +7,9 @@
 <script lang="ts">
 import { computed, defineComponent, PropType } from 'vue';
 import MkSwitch from '../ui/switch.vue';
-import * as os from '@/os';
-import { Hpml } from '@/scripts/hpml/evaluator';
-import { SwitchVarBlock } from '@/scripts/hpml/block';
+import * as os from '@client/os';
+import { Hpml } from '@client/scripts/hpml/evaluator';
+import { SwitchVarBlock } from '@client/scripts/hpml/block';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/components/page/page.text-input.vue b/src/client/components/page/page.text-input.vue
index e67814af16e4b6ebcfa0bc9556defeef693b79fd..8bf3e1c88e12de78e81e685106928a53294c20ad 100644
--- a/src/client/components/page/page.text-input.vue
+++ b/src/client/components/page/page.text-input.vue
@@ -7,9 +7,9 @@
 <script lang="ts">
 import { computed, defineComponent, PropType } from 'vue';
 import MkInput from '../ui/input.vue';
-import * as os from '@/os';
-import { Hpml } from '@/scripts/hpml/evaluator';
-import { TextInputVarBlock } from '@/scripts/hpml/block';
+import * as os from '@client/os';
+import { Hpml } from '@client/scripts/hpml/evaluator';
+import { TextInputVarBlock } from '@client/scripts/hpml/block';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/components/page/page.text.vue b/src/client/components/page/page.text.vue
index 1896d00f423f789c088741a5f21d5dd8667b7da2..491c62be26514d529a362224fa942646a601175e 100644
--- a/src/client/components/page/page.text.vue
+++ b/src/client/components/page/page.text.vue
@@ -6,15 +6,15 @@
 </template>
 
 <script lang="ts">
-import { TextBlock } from '@/scripts/hpml/block';
-import { Hpml } from '@/scripts/hpml/evaluator';
+import { TextBlock } from '@client/scripts/hpml/block';
+import { Hpml } from '@client/scripts/hpml/evaluator';
 import { defineAsyncComponent, defineComponent, PropType } from 'vue';
 import { parse } from '../../../mfm/parse';
 import { unique } from '../../../prelude/array';
 
 export default defineComponent({
 	components: {
-		MkUrlPreview: defineAsyncComponent(() => import('@/components/url-preview.vue')),
+		MkUrlPreview: defineAsyncComponent(() => import('@client/components/url-preview.vue')),
 	},
 	props: {
 		block: {
diff --git a/src/client/components/page/page.textarea-input.vue b/src/client/components/page/page.textarea-input.vue
index 085c2ba57942ab50ba6ea9bb3a6a1598a6628ce3..9951cef2de6737478e2d5c92ea27fc0d2b285a1d 100644
--- a/src/client/components/page/page.textarea-input.vue
+++ b/src/client/components/page/page.textarea-input.vue
@@ -7,10 +7,10 @@
 <script lang="ts">
 import { computed, defineComponent, PropType } from 'vue';
 import MkTextarea from '../ui/textarea.vue';
-import * as os from '@/os';
-import { Hpml } from '@/scripts/hpml/evaluator';
-import { HpmlTextInput } from '@/scripts/hpml';
-import { TextInputVarBlock } from '@/scripts/hpml/block';
+import * as os from '@client/os';
+import { Hpml } from '@client/scripts/hpml/evaluator';
+import { HpmlTextInput } from '@client/scripts/hpml';
+import { TextInputVarBlock } from '@client/scripts/hpml/block';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/components/page/page.textarea.vue b/src/client/components/page/page.textarea.vue
index 97d688368afdd4ad3ed1a8255ee1287685f16de8..612bbe41b9c99a3d4ef338b27c894484c036bd50 100644
--- a/src/client/components/page/page.textarea.vue
+++ b/src/client/components/page/page.textarea.vue
@@ -3,8 +3,8 @@
 </template>
 
 <script lang="ts">
-import { TextBlock } from '@/scripts/hpml/block';
-import { Hpml } from '@/scripts/hpml/evaluator';
+import { TextBlock } from '@client/scripts/hpml/block';
+import { Hpml } from '@client/scripts/hpml/evaluator';
 import { defineComponent, PropType } from 'vue';
 import MkTextarea from '../ui/textarea.vue';
 
diff --git a/src/client/components/page/page.vue b/src/client/components/page/page.vue
index 6d1c419a402c0cbc3efb2bc99d1e914aafb44b1d..f125365c3d91dc2655ea07d08213ada6efe9d6dc 100644
--- a/src/client/components/page/page.vue
+++ b/src/client/components/page/page.vue
@@ -8,10 +8,10 @@
 import { defineComponent, onMounted, nextTick, onUnmounted, PropType } from 'vue';
 import { parse } from '@syuilo/aiscript';
 import XBlock from './page.block.vue';
-import { Hpml } from '@/scripts/hpml/evaluator';
-import { url } from '@/config';
-import { $i } from '@/account';
-import { defaultStore } from '@/store';
+import { Hpml } from '@client/scripts/hpml/evaluator';
+import { url } from '@client/config';
+import { $i } from '@client/account';
+import { defaultStore } from '@client/store';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/components/poll-editor.vue b/src/client/components/poll-editor.vue
index 49454f23c39f4cf510bad9bc6c4d7a715587c7c8..3503d3df7165edd0a7caf86acdadca016ef70eb3 100644
--- a/src/client/components/poll-editor.vue
+++ b/src/client/components/poll-editor.vue
@@ -52,7 +52,7 @@
 import { defineComponent } from 'vue';
 import { faExclamationTriangle, faTimes } from '@fortawesome/free-solid-svg-icons';
 import { addTime } from '../../prelude/time';
-import { formatDateTimeString } from '../../misc/format-time-string';
+import { formatDateTimeString } from '@/misc/format-time-string';
 import MkInput from './ui/input.vue';
 import MkSelect from './ui/select.vue';
 import MkSwitch from './ui/switch.vue';
diff --git a/src/client/components/poll.vue b/src/client/components/poll.vue
index 7f13e135aa758816433577710168a4cc6e7186db..af3b3804abcc458b61a9d80c6e37c9b8bc9ddb74 100644
--- a/src/client/components/poll.vue
+++ b/src/client/components/poll.vue
@@ -25,7 +25,7 @@
 import { defineComponent } from 'vue';
 import { faCheck } from '@fortawesome/free-solid-svg-icons';
 import { sum } from '../../prelude/array';
-import * as os from '@/os';
+import * as os from '@client/os';
 
 export default defineComponent({
 	props: {
diff --git a/src/client/components/post-form-attaches.vue b/src/client/components/post-form-attaches.vue
index 230c944de1699c31cd4bd4ce387784215ee47583..f2eed304419527d0bfc86855ca726247752e9c17 100644
--- a/src/client/components/post-form-attaches.vue
+++ b/src/client/components/post-form-attaches.vue
@@ -19,7 +19,7 @@ import { defineComponent, defineAsyncComponent } from 'vue';
 import { faTimesCircle, faEye, faEyeSlash } from '@fortawesome/free-regular-svg-icons';
 import { faExclamationTriangle, faICursor } from '@fortawesome/free-solid-svg-icons';
 import MkDriveFileThumbnail from './drive-file-thumbnail.vue'
-import * as os from '@/os';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/components/post-form-dialog.vue b/src/client/components/post-form-dialog.vue
index ae1cd7f01ee0885b054d441f9d275f85eb25678e..aa23e3891ec5fcc07d40ac871320786d52c5a656 100644
--- a/src/client/components/post-form-dialog.vue
+++ b/src/client/components/post-form-dialog.vue
@@ -6,8 +6,8 @@
 
 <script lang="ts">
 import { defineComponent } from 'vue';
-import MkModal from '@/components/ui/modal.vue';
-import MkPostForm from '@/components/post-form.vue';
+import MkModal from '@client/components/ui/modal.vue';
+import MkPostForm from '@client/components/post-form.vue';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/components/post-form.vue b/src/client/components/post-form.vue
index 9b5adf9cc16d30784a7bc91c93e61fa8b5b8c5c7..7d2355c190de6517659cdd2ade5c385f594d30da 100644
--- a/src/client/components/post-form.vue
+++ b/src/client/components/post-form.vue
@@ -59,17 +59,17 @@ import { length } from 'stringz';
 import { toASCII } from 'punycode';
 import XNotePreview from './note-preview.vue';
 import { parse } from '../../mfm/parse';
-import { host, url } from '@/config';
+import { host, url } from '@client/config';
 import { erase, unique } from '../../prelude/array';
-import extractMentions from '../../misc/extract-mentions';
-import getAcct from '../../misc/acct/render';
-import { formatTimeString } from '../../misc/format-time-string';
-import { Autocomplete } from '@/scripts/autocomplete';
+import extractMentions from '@/misc/extract-mentions';
+import getAcct from '@/misc/acct/render';
+import { formatTimeString } from '@/misc/format-time-string';
+import { Autocomplete } from '@client/scripts/autocomplete';
 import { noteVisibilities } from '../../types';
-import * as os from '@/os';
-import { selectFile } from '@/scripts/select-file';
-import { notePostInterruptors, postFormActions } from '@/store';
-import { isMobile } from '@/scripts/is-mobile';
+import * as os from '@client/os';
+import { selectFile } from '@client/scripts/select-file';
+import { notePostInterruptors, postFormActions } from '@client/store';
+import { isMobile } from '@client/scripts/is-mobile';
 import { throttle } from 'throttle-debounce';
 
 export default defineComponent({
diff --git a/src/client/components/reactions-viewer.reaction.vue b/src/client/components/reactions-viewer.reaction.vue
index a67b24601b50d09ee305f9bd09dc24d611d39857..99b4d50c52e8cd7bbd48980e3adbb7726ab84950 100644
--- a/src/client/components/reactions-viewer.reaction.vue
+++ b/src/client/components/reactions-viewer.reaction.vue
@@ -18,9 +18,9 @@
 
 <script lang="ts">
 import { defineComponent, ref } from 'vue';
-import XDetails from '@/components/reactions-viewer.details.vue';
-import XReactionIcon from '@/components/reaction-icon.vue';
-import * as os from '@/os';
+import XDetails from '@client/components/reactions-viewer.details.vue';
+import XReactionIcon from '@client/components/reaction-icon.vue';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/components/remote-caution.vue b/src/client/components/remote-caution.vue
index 3af601f627163898a68c81058daab914c348c80f..98c7aaaa6ed116045f1673b9b830e5337baf383f 100644
--- a/src/client/components/remote-caution.vue
+++ b/src/client/components/remote-caution.vue
@@ -5,7 +5,7 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import { faExclamationTriangle } from '@fortawesome/free-solid-svg-icons';
-import * as os from '@/os';
+import * as os from '@client/os';
 
 export default defineComponent({
 	props: {
diff --git a/src/client/components/sample.vue b/src/client/components/sample.vue
index 0f29fc69bb7e8cf836f418f653a3bd6d0d0a6890..70949ea3570992e852b94b900719200b6776a582 100644
--- a/src/client/components/sample.vue
+++ b/src/client/components/sample.vue
@@ -29,13 +29,13 @@
 
 <script lang="ts">
 import { defineComponent } from 'vue';
-import MkButton from '@/components/ui/button.vue';
-import MkInput from '@/components/ui/input.vue';
-import MkSwitch from '@/components/ui/switch.vue';
-import MkTextarea from '@/components/ui/textarea.vue';
-import MkRadio from '@/components/ui/radio.vue';
-import * as os from '@/os';
-import * as config from '@/config';
+import MkButton from '@client/components/ui/button.vue';
+import MkInput from '@client/components/ui/input.vue';
+import MkSwitch from '@client/components/ui/switch.vue';
+import MkTextarea from '@client/components/ui/textarea.vue';
+import MkRadio from '@client/components/ui/radio.vue';
+import * as os from '@client/os';
+import * as config from '@client/config';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/components/sidebar.vue b/src/client/components/sidebar.vue
index f7c50a2ba57e434a7aa0f819b6786b4afbd36a65..61439781b4c2600b21d2a3066fe4e1dbca1f4560 100644
--- a/src/client/components/sidebar.vue
+++ b/src/client/components/sidebar.vue
@@ -48,11 +48,11 @@
 import { defineComponent } from 'vue';
 import { faGripVertical, faChevronLeft, faHashtag, faBroadcastTower, faFireAlt, faEllipsisH, faPencilAlt, faBars, faTimes, faSearch, faUserCog, faCog, faUser, faHome, faStar, faCircle, faAt, faListUl, faPlus, faUserClock, faUsers, faTachometerAlt, faExchangeAlt, faGlobe, faChartBar, faCloud, faServer, faInfoCircle, faQuestionCircle, faProjectDiagram, faStream, faExclamationCircle } from '@fortawesome/free-solid-svg-icons';
 import { faBell, faEnvelope, faLaugh, faComments } from '@fortawesome/free-regular-svg-icons';
-import { host } from '@/config';
-import { search } from '@/scripts/search';
-import * as os from '@/os';
-import { sidebarDef } from '@/sidebar';
-import { getAccounts, addAccount, login } from '@/account';
+import { host } from '@client/config';
+import { search } from '@client/scripts/search';
+import * as os from '@client/os';
+import { sidebarDef } from '@client/sidebar';
+import { getAccounts, addAccount, login } from '@client/account';
 
 export default defineComponent({
 	props: {
diff --git a/src/client/components/signin-dialog.vue b/src/client/components/signin-dialog.vue
index 2edd10f539dfc45a4fca3cf24b5fcb5d3f8b7ca4..6c38c07d78f61912a22de60e67ece5227f16c6ae 100644
--- a/src/client/components/signin-dialog.vue
+++ b/src/client/components/signin-dialog.vue
@@ -13,7 +13,7 @@
 
 <script lang="ts">
 import { defineComponent } from 'vue';
-import XModalWindow from '@/components/ui/modal-window.vue';
+import XModalWindow from '@client/components/ui/modal-window.vue';
 import MkSignin from './signin.vue';
 
 export default defineComponent({
diff --git a/src/client/components/signin.vue b/src/client/components/signin.vue
index 3384fff96d190d06cafefcaac784b03ef442d188..120da63f30f03d5790214ba447308c53d1ce2b9f 100755
--- a/src/client/components/signin.vue
+++ b/src/client/components/signin.vue
@@ -53,10 +53,10 @@ import { faLock, faGavel } from '@fortawesome/free-solid-svg-icons';
 import { faTwitter, faDiscord, faGithub } from '@fortawesome/free-brands-svg-icons';
 import MkButton from './ui/button.vue';
 import MkInput from './ui/input.vue';
-import { apiUrl, host } from '@/config';
-import { byteify, hexify } from '@/scripts/2fa';
-import * as os from '@/os';
-import { login } from '@/account';
+import { apiUrl, host } from '@client/config';
+import { byteify, hexify } from '@client/scripts/2fa';
+import * as os from '@client/os';
+import { login } from '@client/account';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/components/signup-dialog.vue b/src/client/components/signup-dialog.vue
index 74566fbce3ade5207722bd902ff08ed74117cd47..072a5ac19f55f7876b4f1b961855010f83b016b4 100644
--- a/src/client/components/signup-dialog.vue
+++ b/src/client/components/signup-dialog.vue
@@ -15,7 +15,7 @@
 
 <script lang="ts">
 import { defineComponent } from 'vue';
-import XModalWindow from '@/components/ui/modal-window.vue';
+import XModalWindow from '@client/components/ui/modal-window.vue';
 import XSignup from './signup.vue';
 
 export default defineComponent({
diff --git a/src/client/components/signup.vue b/src/client/components/signup.vue
index 91d0f2c96fabc21d19a6b09348670b7c1dc74ce7..1ce9fc27890189386297a92e5cb9e833291a3949 100644
--- a/src/client/components/signup.vue
+++ b/src/client/components/signup.vue
@@ -56,12 +56,12 @@ import { defineComponent, defineAsyncComponent } from 'vue';
 import { faLock, faExclamationTriangle, faSpinner, faCheck, faKey } from '@fortawesome/free-solid-svg-icons';
 const getPasswordStrength = require('syuilo-password-strength');
 import { toUnicode } from 'punycode';
-import { host, url } from '@/config';
+import { host, url } from '@client/config';
 import MkButton from './ui/button.vue';
 import MkInput from './ui/input.vue';
 import MkSwitch from './ui/switch.vue';
-import * as os from '@/os';
-import { login } from '@/account';
+import * as os from '@client/os';
+import { login } from '@client/account';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/components/sub-note-content.vue b/src/client/components/sub-note-content.vue
index ceb25e0967f4aa2e8cfaf847dec49402d0c689cf..384bcb4563c0f53c1017c3d80e7f018216898ae7 100644
--- a/src/client/components/sub-note-content.vue
+++ b/src/client/components/sub-note-content.vue
@@ -23,7 +23,7 @@ import { defineComponent } from 'vue';
 import { faReply } from '@fortawesome/free-solid-svg-icons';
 import XPoll from './poll.vue';
 import XMediaList from './media-list.vue';
-import * as os from '@/os';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/components/taskmanager.api-window.vue b/src/client/components/taskmanager.api-window.vue
index ec685462c9ed61df6df13e9f157a8cbf7bf3601f..9b6c3f16d09f291badf0a43ccecab1dd0de53ad7 100644
--- a/src/client/components/taskmanager.api-window.vue
+++ b/src/client/components/taskmanager.api-window.vue
@@ -23,8 +23,8 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import * as JSON5 from 'json5';
-import XWindow from '@/components/ui/window.vue';
-import MkTab from '@/components/tab.vue';
+import XWindow from '@client/components/ui/window.vue';
+import MkTab from '@client/components/tab.vue';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/components/taskmanager.vue b/src/client/components/taskmanager.vue
index 1ed8c8bd5e6bf07dfbc69db9c20f2114bb526be0..af9033178ec11bf1a1a2c95d441496c071850b85 100644
--- a/src/client/components/taskmanager.vue
+++ b/src/client/components/taskmanager.vue
@@ -79,11 +79,11 @@
 <script lang="ts">
 import { defineComponent, markRaw, onBeforeUnmount, ref, shallowRef } from 'vue';
 import { faTerminal } from '@fortawesome/free-solid-svg-icons';
-import XWindow from '@/components/ui/window.vue';
-import MkTab from '@/components/tab.vue';
-import MkButton from '@/components/ui/button.vue';
-import follow from '@/directives/follow-append';
-import * as os from '@/os';
+import XWindow from '@client/components/ui/window.vue';
+import MkTab from '@client/components/tab.vue';
+import MkButton from '@client/components/ui/button.vue';
+import follow from '@client/directives/follow-append';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/components/timeline.vue b/src/client/components/timeline.vue
index 9a3d3232cf0df03904d5e1686a22b284b77eb812..c2ab0b005dd378b385e899310877a3cea89d04c3 100644
--- a/src/client/components/timeline.vue
+++ b/src/client/components/timeline.vue
@@ -5,8 +5,8 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import XNotes from './notes.vue';
-import * as os from '@/os';
-import * as sound from '@/scripts/sound';
+import * as os from '@client/os';
+import * as sound from '@client/scripts/sound';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/components/token-generate-window.vue b/src/client/components/token-generate-window.vue
index 844c20eb089139aed5f06e1b252d30b4c7c82576..87a76931e45cc532c69cd3553c27f41e9dd12cac 100644
--- a/src/client/components/token-generate-window.vue
+++ b/src/client/components/token-generate-window.vue
@@ -27,8 +27,8 @@
 
 <script lang="ts">
 import { defineComponent } from 'vue';
-import { kinds } from '../../misc/api-permissions';
-import XModalWindow from '@/components/ui/modal-window.vue';
+import { kinds } from '@/misc/api-permissions';
+import XModalWindow from '@client/components/ui/modal-window.vue';
 import MkInput from './ui/input.vue';
 import MkTextarea from './ui/textarea.vue';
 import MkSwitch from './ui/switch.vue';
diff --git a/src/client/components/ui/context-menu.vue b/src/client/components/ui/context-menu.vue
index 561099cbe0bf10c3f537479db197b1ac331eb7aa..61f5d3bf08e0dbfcf14dff9a4e4b95830fcb1145 100644
--- a/src/client/components/ui/context-menu.vue
+++ b/src/client/components/ui/context-menu.vue
@@ -8,7 +8,7 @@
 
 <script lang="ts">
 import { defineComponent } from 'vue';
-import contains from '@/scripts/contains';
+import contains from '@client/scripts/contains';
 import MkMenu from './menu.vue';
 
 export default defineComponent({
diff --git a/src/client/components/ui/hr.vue b/src/client/components/ui/hr.vue
index 6b075cb440f82f5a72ed25fe01ae9dcc59a5785d..fb12b4985f3999fa386c68c7b52c119ea30c8aee 100644
--- a/src/client/components/ui/hr.vue
+++ b/src/client/components/ui/hr.vue
@@ -3,7 +3,7 @@
 </template>
 
 <script lang="ts">
-import { defineComponent } from 'vue';import * as os from '@/os';
+import { defineComponent } from 'vue';import * as os from '@client/os';
 
 export default defineComponent({});
 </script>
diff --git a/src/client/components/ui/info.vue b/src/client/components/ui/info.vue
index 5c71b14a0a7bb8ac7e35cff1869c1041e3febcbf..12b3dbcfd1e4d08f79614ac84dca1593390555aa 100644
--- a/src/client/components/ui/info.vue
+++ b/src/client/components/ui/info.vue
@@ -9,7 +9,7 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import { faInfoCircle, faExclamationTriangle } from '@fortawesome/free-solid-svg-icons';
-import * as os from '@/os';
+import * as os from '@client/os';
 
 export default defineComponent({
 	props: {
diff --git a/src/client/components/ui/input.vue b/src/client/components/ui/input.vue
index 1c5222f8f2aba3c925bfc038e655d61539cb4a20..302d96d026899beaac99f70e4b50950f08d2ac65 100644
--- a/src/client/components/ui/input.vue
+++ b/src/client/components/ui/input.vue
@@ -57,7 +57,7 @@
 import { defineComponent, onMounted, onUnmounted, nextTick, ref, watch, computed, toRefs } from 'vue';
 import debounce from 'v-debounce';
 import { faExclamationCircle } from '@fortawesome/free-solid-svg-icons';
-import * as os from '@/os';
+import * as os from '@client/os';
 
 export default defineComponent({
 	directives: {
diff --git a/src/client/components/ui/menu.vue b/src/client/components/ui/menu.vue
index c2033402e396be0f81f69c7b4e21894ae3148e32..1550fe40c7361b0dc8cc7be5ee2b41826baabaac 100644
--- a/src/client/components/ui/menu.vue
+++ b/src/client/components/ui/menu.vue
@@ -43,8 +43,8 @@
 <script lang="ts">
 import { defineComponent, ref } from 'vue';
 import { faCircle } from '@fortawesome/free-solid-svg-icons';
-import { focusPrev, focusNext } from '@/scripts/focus';
-import contains from '@/scripts/contains';
+import { focusPrev, focusNext } from '@client/scripts/focus';
+import contains from '@client/scripts/contains';
 
 export default defineComponent({
 	props: {
diff --git a/src/client/components/ui/pagination.vue b/src/client/components/ui/pagination.vue
index d9588a03731d184d03302f7bcc9929226f01eb48..13181d39e23ec96ab15dff81cabab15922de73fe 100644
--- a/src/client/components/ui/pagination.vue
+++ b/src/client/components/ui/pagination.vue
@@ -16,7 +16,7 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import MkButton from './button.vue';
-import paging from '@/scripts/paging';
+import paging from '@client/scripts/paging';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/components/ui/radios.vue b/src/client/components/ui/radios.vue
index ea40ba47b45928d5f82c1e196ecbd5e9f7c0417d..547e616ea52d65b2088ffd70b7e5ed51ae6ed0aa 100644
--- a/src/client/components/ui/radios.vue
+++ b/src/client/components/ui/radios.vue
@@ -1,6 +1,6 @@
 <script lang="ts">
 import { defineComponent, h } from 'vue';
-import MkRadio from '@/components/ui/radio.vue';
+import MkRadio from '@client/components/ui/radio.vue';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/components/ui/window.vue b/src/client/components/ui/window.vue
index 501a3bf8ee22edef22f3095b505027088ebfceca..1613644c87e16370db0c01d9f5fede164ec102d6 100644
--- a/src/client/components/ui/window.vue
+++ b/src/client/components/ui/window.vue
@@ -39,8 +39,8 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import { faTimes, faCheck } from '@fortawesome/free-solid-svg-icons';
-import contains from '@/scripts/contains';
-import * as os from '@/os';
+import contains from '@client/scripts/contains';
+import * as os from '@client/os';
 
 const minHeight = 50;
 const minWidth = 250;
diff --git a/src/client/components/url-preview-popup.vue b/src/client/components/url-preview-popup.vue
index 0a402f793f45580fe80dc102dd1abff22be79892..b5e0fce20724f2d3f4d3b0a7cd2a2fa57033212a 100644
--- a/src/client/components/url-preview-popup.vue
+++ b/src/client/components/url-preview-popup.vue
@@ -9,7 +9,7 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import MkUrlPreview from './url-preview.vue';
-import * as os from '@/os';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/components/url-preview.vue b/src/client/components/url-preview.vue
index 7a590687107d66ab67fa37a2e7ec5952461035f1..7495da6f24745a6e74e76c9adee7b0d6249c879d 100644
--- a/src/client/components/url-preview.vue
+++ b/src/client/components/url-preview.vue
@@ -36,8 +36,8 @@
 import { defineComponent } from 'vue';
 import { faPlayCircle } from '@fortawesome/free-regular-svg-icons';
 import { faTwitter } from '@fortawesome/free-brands-svg-icons'; 
-import { url as local, lang } from '@/config';
-import * as os from '@/os';
+import { url as local, lang } from '@client/config';
+import * as os from '@client/os';
 
 export default defineComponent({
 	props: {
diff --git a/src/client/components/user-info.vue b/src/client/components/user-info.vue
index 711e36741138a08784fccb60e8568014c639182c..34ea38c3b4f656a8d8c200d10c236332bcf72389 100644
--- a/src/client/components/user-info.vue
+++ b/src/client/components/user-info.vue
@@ -29,7 +29,7 @@
 
 <script lang="ts">
 import { defineComponent } from 'vue';
-import parseAcct from '../../misc/acct/parse';
+import parseAcct from '@/misc/acct/parse';
 import MkFollowButton from './follow-button.vue';
 import { userPage } from '../filters/user';
 
diff --git a/src/client/components/user-list.vue b/src/client/components/user-list.vue
index 7a57ff7168633809112cd503f0b69217d1230b11..418c4127d90f7317435ffea1c8d4dff5528aa894 100644
--- a/src/client/components/user-list.vue
+++ b/src/client/components/user-list.vue
@@ -16,7 +16,7 @@
 
 <script lang="ts">
 import { defineComponent } from 'vue';
-import paging from '@/scripts/paging';
+import paging from '@client/scripts/paging';
 import MkUserInfo from './user-info.vue';
 import { userPage } from '../filters/user';
 
diff --git a/src/client/components/user-preview.vue b/src/client/components/user-preview.vue
index c4588e478a7019116da6ad3ffd168b4e35e7584c..b2b335837491eec38adcf3bc3194b12e553f071f 100644
--- a/src/client/components/user-preview.vue
+++ b/src/client/components/user-preview.vue
@@ -33,10 +33,10 @@
 
 <script lang="ts">
 import { defineComponent } from 'vue';
-import parseAcct from '../../misc/acct/parse';
+import parseAcct from '@/misc/acct/parse';
 import MkFollowButton from './follow-button.vue';
 import { userPage } from '../filters/user';
-import * as os from '@/os';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/components/user-select-dialog.vue b/src/client/components/user-select-dialog.vue
index c67c985fdc29c0555138d3b39a51a50cecd6942b..e21deea1780e4e024f7df1bf730534e03140cdd4 100644
--- a/src/client/components/user-select-dialog.vue
+++ b/src/client/components/user-select-dialog.vue
@@ -46,8 +46,8 @@
 import { defineComponent } from 'vue';
 import { faTimes, faCheck } from '@fortawesome/free-solid-svg-icons';
 import MkInput from './ui/input.vue';
-import XModalWindow from '@/components/ui/modal-window.vue';
-import * as os from '@/os';
+import XModalWindow from '@client/components/ui/modal-window.vue';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/components/users-dialog.vue b/src/client/components/users-dialog.vue
index 014748adc6d8fce22affc2bf530c60b8e47789f7..381aa609115cfc482070bea43a6c7cb313ad6f8f 100644
--- a/src/client/components/users-dialog.vue
+++ b/src/client/components/users-dialog.vue
@@ -28,7 +28,7 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import { faTimes } from '@fortawesome/free-solid-svg-icons';
-import paging from '@/scripts/paging';
+import paging from '@client/scripts/paging';
 import { userPage } from '../filters/user';
 
 export default defineComponent({
diff --git a/src/client/components/visibility-picker.vue b/src/client/components/visibility-picker.vue
index e518f48d0d9153b9b63a36a2d31f11c9aed2e242..0b98d30b9d4650b54b28764b883a475678d0678a 100644
--- a/src/client/components/visibility-picker.vue
+++ b/src/client/components/visibility-picker.vue
@@ -46,7 +46,7 @@
 import { defineComponent } from 'vue';
 import { faGlobe, faUnlock, faHome, faBiohazard, faToggleOn, faToggleOff } from '@fortawesome/free-solid-svg-icons';
 import { faEnvelope } from '@fortawesome/free-regular-svg-icons';
-import MkModal from '@/components/ui/modal.vue';
+import MkModal from '@client/components/ui/modal.vue';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/components/waiting-dialog.vue b/src/client/components/waiting-dialog.vue
index 7e8ebeaec0013b57225b116adabd1e68b5267728..c3a265af9cf3e9aebe9fa03b6e0bad4c270b3e09 100644
--- a/src/client/components/waiting-dialog.vue
+++ b/src/client/components/waiting-dialog.vue
@@ -11,7 +11,7 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import { faCheck, faSpinner } from '@fortawesome/free-solid-svg-icons';
-import MkModal from '@/components/ui/modal.vue';
+import MkModal from '@client/components/ui/modal.vue';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/components/widgets.vue b/src/client/components/widgets.vue
index 23fce7d71499edcac644e2966938307a0796ba9b..993b843cb1a4c317def1f65bdfa96677b41a6ede 100644
--- a/src/client/components/widgets.vue
+++ b/src/client/components/widgets.vue
@@ -31,9 +31,9 @@
 import { defineComponent, defineAsyncComponent } from 'vue';
 import { v4 as uuid } from 'uuid';
 import { faTimes, faCog, faPlus } from '@fortawesome/free-solid-svg-icons';
-import MkSelect from '@/components/ui/select.vue';
-import MkButton from '@/components/ui/button.vue';
-import { widgets as widgetDefs } from '@/widgets';
+import MkSelect from '@client/components/ui/select.vue';
+import MkButton from '@client/components/ui/button.vue';
+import { widgets as widgetDefs } from '@client/widgets';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/directives/follow-append.ts b/src/client/directives/follow-append.ts
index b0e99628b0be39559f81a2dff8785691fd02ef16..ef3f9af43f9c259b36caf7cda9b4a7c5439b92c7 100644
--- a/src/client/directives/follow-append.ts
+++ b/src/client/directives/follow-append.ts
@@ -1,5 +1,5 @@
 import { Directive } from 'vue';
-import { getScrollContainer, getScrollPosition } from '@/scripts/scroll';
+import { getScrollContainer, getScrollPosition } from '@client/scripts/scroll';
 
 export default {
 	mounted(src, binding, vn) {
diff --git a/src/client/directives/particle.ts b/src/client/directives/particle.ts
index c90df89a5ed6e4376906df1b33b72d04b3743077..1676e1182e01c2d04ae6bd634927b4069bae5f80 100644
--- a/src/client/directives/particle.ts
+++ b/src/client/directives/particle.ts
@@ -1,5 +1,5 @@
-import Particle from '@/components/particle.vue';
-import { popup } from '@/os';
+import Particle from '@client/components/particle.vue';
+import { popup } from '@client/os';
 
 export default {
 	mounted(el, binding, vn) {
diff --git a/src/client/directives/tooltip.ts b/src/client/directives/tooltip.ts
index 2a0a13663ccaa5cef59538b4b87d665ef5259aab..90247eacb2b44ffa4db04b0f367d61ad28e21a72 100644
--- a/src/client/directives/tooltip.ts
+++ b/src/client/directives/tooltip.ts
@@ -1,6 +1,6 @@
 import { Directive, ref } from 'vue';
-import { isDeviceTouch } from '@/scripts/is-device-touch';
-import { popup } from '@/os';
+import { isDeviceTouch } from '@client/scripts/is-device-touch';
+import { popup } from '@client/os';
 
 const start = isDeviceTouch ? 'touchstart' : 'mouseover';
 const end = isDeviceTouch ? 'touchend' : 'mouseleave';
@@ -30,7 +30,7 @@ export default {
 			if (self.text == null) return;
 
 			const showing = ref(true);
-			popup(import('@/components/ui/tooltip.vue'), {
+			popup(import('@client/components/ui/tooltip.vue'), {
 				showing,
 				text: self.text,
 				source: el
diff --git a/src/client/directives/user-preview.ts b/src/client/directives/user-preview.ts
index 68d9e2816cad717910b0a49cfee39477befcd147..26d6c5efb3d595054f8cae67f070cf1a5437ac33 100644
--- a/src/client/directives/user-preview.ts
+++ b/src/client/directives/user-preview.ts
@@ -1,6 +1,6 @@
 import { Directive, ref } from 'vue';
 import autobind from 'autobind-decorator';
-import { popup } from '@/os';
+import { popup } from '@client/os';
 
 export class UserPreview {
 	private el;
@@ -24,7 +24,7 @@ export class UserPreview {
 
 		const showing = ref(true);
 
-		popup(import('@/components/user-preview.vue'), {
+		popup(import('@client/components/user-preview.vue'), {
 			showing,
 			q: this.user,
 			source: this.el
diff --git a/src/client/filters/user.ts b/src/client/filters/user.ts
index 34ea488d98edd2eb3e1b0bee5e13219b36d58d93..ad4663cb92c59e5e669d2a45e5977fd681381ec4 100644
--- a/src/client/filters/user.ts
+++ b/src/client/filters/user.ts
@@ -1,6 +1,6 @@
-import getAcct from '../../misc/acct/render';
-import getUserName from '../../misc/get-user-name';
-import { url } from '@/config';
+import getAcct from '@/misc/acct/render';
+import getUserName from '@/misc/get-user-name';
+import { url } from '@client/config';
 
 export const acct = user => {
 	return getAcct(user);
diff --git a/src/client/i18n.ts b/src/client/i18n.ts
index 6c29ef153ffc469570fd7107dcfc27d82f3579a9..dc2367647412723d4c4b69d3ac5f70ca817023ff 100644
--- a/src/client/i18n.ts
+++ b/src/client/i18n.ts
@@ -1,6 +1,6 @@
 import { markRaw } from 'vue';
-import { locale } from '@/config';
-import { I18n } from '../misc/i18n';
+import { locale } from '@client/config';
+import { I18n } from '@/misc/i18n';
 
 export const i18n = markRaw(new I18n(locale));
 
diff --git a/src/client/init.ts b/src/client/init.ts
index 2a2b6a2f862ba96eee3703ea336e9b47479ae9a0..bacc839c29faec0615cf4b43dcb0db780dbf9c01 100644
--- a/src/client/init.ts
+++ b/src/client/init.ts
@@ -2,33 +2,33 @@
  * Client entry point
  */
 
-import '@/style.scss';
+import '@client/style.scss';
 
 import * as Sentry from '@sentry/browser';
 import { Integrations } from '@sentry/tracing';
 import { createApp, watch } from 'vue';
 import { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';
 
-import widgets from '@/widgets';
-import directives from '@/directives';
-import components from '@/components';
-import { version, ui, lang, host } from '@/config';
-import { router } from '@/router';
-import { applyTheme } from '@/scripts/theme';
-import { isDeviceDarkmode } from '@/scripts/is-device-darkmode';
-import { i18n } from '@/i18n';
-import { stream, dialog, post } from '@/os';
-import * as sound from '@/scripts/sound';
-import { $i, refreshAccount, login, updateAccount, signout } from '@/account';
-import { defaultStore, ColdDeviceStorage } from '@/store';
-import { fetchInstance, instance } from '@/instance';
-import { makeHotkey } from '@/scripts/hotkey';
-import { search } from '@/scripts/search';
-import { isMobile } from '@/scripts/is-mobile';
-import { getThemes } from '@/theme-store';
-import { initializeSw } from '@/scripts/initialize-sw';
-import { reloadChannel } from '@/scripts/unison-reload';
-import { reactionPicker } from '@/scripts/reaction-picker';
+import widgets from '@client/widgets';
+import directives from '@client/directives';
+import components from '@client/components';
+import { version, ui, lang, host } from '@client/config';
+import { router } from '@client/router';
+import { applyTheme } from '@client/scripts/theme';
+import { isDeviceDarkmode } from '@client/scripts/is-device-darkmode';
+import { i18n } from '@client/i18n';
+import { stream, dialog, post } from '@client/os';
+import * as sound from '@client/scripts/sound';
+import { $i, refreshAccount, login, updateAccount, signout } from '@client/account';
+import { defaultStore, ColdDeviceStorage } from '@client/store';
+import { fetchInstance, instance } from '@client/instance';
+import { makeHotkey } from '@client/scripts/hotkey';
+import { search } from '@client/scripts/search';
+import { isMobile } from '@client/scripts/is-mobile';
+import { getThemes } from '@client/theme-store';
+import { initializeSw } from '@client/scripts/initialize-sw';
+import { reloadChannel } from '@client/scripts/unison-reload';
+import { reactionPicker } from '@client/scripts/reaction-picker';
 
 console.info(`Misskey v${version}`);
 
@@ -156,12 +156,12 @@ fetchInstance().then(() => {
 stream.init($i);
 
 const app = createApp(await (
-	window.location.search === '?zen' ? import('@/ui/zen.vue') :
-	!$i                               ? import('@/ui/visitor.vue') :
-	ui === 'deck'                     ? import('@/ui/deck.vue') :
-	ui === 'desktop'                  ? import('@/ui/desktop.vue') :
-	ui === 'chat'                     ? import('@/ui/chat/index.vue') :
-	import('@/ui/default.vue')
+	window.location.search === '?zen' ? import('@client/ui/zen.vue') :
+	!$i                               ? import('@client/ui/visitor.vue') :
+	ui === 'deck'                     ? import('@client/ui/deck.vue') :
+	ui === 'desktop'                  ? import('@client/ui/desktop.vue') :
+	ui === 'chat'                     ? import('@client/ui/chat/index.vue') :
+	import('@client/ui/default.vue')
 ).then(x => x.default));
 
 if (_DEV_) {
@@ -204,7 +204,7 @@ if (splash) {
 }
 
 watch(defaultStore.reactiveState.darkMode, (darkMode) => {
-	import('@/scripts/theme').then(({ builtinThemes }) => {
+	import('@client/scripts/theme').then(({ builtinThemes }) => {
 		const themes = builtinThemes.concat(getThemes());
 		applyTheme(themes.find(x => x.id === (darkMode ? ColdDeviceStorage.get('darkTheme') : ColdDeviceStorage.get('lightTheme'))));
 	});
diff --git a/src/client/os.ts b/src/client/os.ts
index 9be45e6c6d40b3af92f7cd9935a0f333bbaf20af..e1707531deeece2e0049d99ecc1f51e98748619c 100644
--- a/src/client/os.ts
+++ b/src/client/os.ts
@@ -4,13 +4,13 @@ import { Component, defineAsyncComponent, markRaw, reactive, Ref, ref } from 'vu
 import { EventEmitter } from 'eventemitter3';
 import insertTextAtCursor from 'insert-text-at-cursor';
 import * as Sentry from '@sentry/browser';
-import Stream from '@/scripts/stream';
-import { apiUrl, debug } from '@/config';
-import MkPostFormDialog from '@/components/post-form-dialog.vue';
-import MkWaitingDialog from '@/components/waiting-dialog.vue';
-import { resolve } from '@/router';
-import { $i } from '@/account';
-import { defaultStore } from '@/store';
+import Stream from '@client/scripts/stream';
+import { apiUrl, debug } from '@client/config';
+import MkPostFormDialog from '@client/components/post-form-dialog.vue';
+import MkWaitingDialog from '@client/components/waiting-dialog.vue';
+import { resolve } from '@client/router';
+import { $i } from '@client/account';
+import { defaultStore } from '@client/store';
 
 export const stream = markRaw(new Stream());
 
@@ -196,7 +196,7 @@ export async function popup(component: Component | typeof import('*.vue') | Prom
 
 export function pageWindow(path: string) {
 	const { component, props } = resolve(path);
-	popup(import('@/components/page-window.vue'), {
+	popup(import('@client/components/page-window.vue'), {
 		initialPath: path,
 		initialComponent: markRaw(component),
 		initialProps: props,
@@ -205,7 +205,7 @@ export function pageWindow(path: string) {
 
 export function dialog(props: Record<string, any>) {
 	return new Promise((resolve, reject) => {
-		popup(import('@/components/dialog.vue'), props, {
+		popup(import('@client/components/dialog.vue'), props, {
 			done: result => {
 				resolve(result ? result : { canceled: true });
 			},
@@ -219,7 +219,7 @@ export function success() {
 		setTimeout(() => {
 			showing.value = false;
 		}, 1000);
-		popup(import('@/components/waiting-dialog.vue'), {
+		popup(import('@client/components/waiting-dialog.vue'), {
 			success: true,
 			showing: showing
 		}, {
@@ -231,7 +231,7 @@ export function success() {
 export function waiting() {
 	return new Promise((resolve, reject) => {
 		const showing = ref(true);
-		popup(import('@/components/waiting-dialog.vue'), {
+		popup(import('@client/components/waiting-dialog.vue'), {
 			success: false,
 			showing: showing
 		}, {
@@ -242,7 +242,7 @@ export function waiting() {
 
 export function form(title, form) {
 	return new Promise((resolve, reject) => {
-		popup(import('@/components/form-dialog.vue'), { title, form }, {
+		popup(import('@client/components/form-dialog.vue'), { title, form }, {
 			done: result => {
 				resolve(result);
 			},
@@ -252,7 +252,7 @@ export function form(title, form) {
 
 export async function selectUser() {
 	return new Promise((resolve, reject) => {
-		popup(import('@/components/user-select-dialog.vue'), {}, {
+		popup(import('@client/components/user-select-dialog.vue'), {}, {
 			ok: user => {
 				resolve(user);
 			},
@@ -262,7 +262,7 @@ export async function selectUser() {
 
 export async function selectDriveFile(multiple: boolean) {
 	return new Promise((resolve, reject) => {
-		popup(import('@/components/drive-select-dialog.vue'), {
+		popup(import('@client/components/drive-select-dialog.vue'), {
 			type: 'file',
 			multiple
 		}, {
@@ -277,7 +277,7 @@ export async function selectDriveFile(multiple: boolean) {
 
 export async function selectDriveFolder(multiple: boolean) {
 	return new Promise((resolve, reject) => {
-		popup(import('@/components/drive-select-dialog.vue'), {
+		popup(import('@client/components/drive-select-dialog.vue'), {
 			type: 'folder',
 			multiple
 		}, {
@@ -292,7 +292,7 @@ export async function selectDriveFolder(multiple: boolean) {
 
 export async function pickEmoji(src?: HTMLElement, opts) {
 	return new Promise((resolve, reject) => {
-		popup(import('@/components/emoji-picker-dialog.vue'), {
+		popup(import('@client/components/emoji-picker-dialog.vue'), {
 			src,
 			...opts
 		}, {
@@ -342,7 +342,7 @@ export async function openEmojiPicker(src?: HTMLElement, opts, initialTextarea:
 		characterData: false,
 	});
 
-	openingEmojiPicker = await popup(import('@/components/emoji-picker-window.vue'), {
+	openingEmojiPicker = await popup(import('@client/components/emoji-picker-window.vue'), {
 		src,
 		...opts
 	}, {
@@ -360,7 +360,7 @@ export async function openEmojiPicker(src?: HTMLElement, opts, initialTextarea:
 export function modalMenu(items: any[], src?: HTMLElement, options?: { align?: string; viaKeyboard?: boolean }) {
 	return new Promise((resolve, reject) => {
 		let dispose;
-		popup(import('@/components/ui/modal-menu.vue'), {
+		popup(import('@client/components/ui/modal-menu.vue'), {
 			items,
 			src,
 			align: options?.align,
@@ -380,7 +380,7 @@ export function contextMenu(items: any[], ev: MouseEvent) {
 	ev.preventDefault();
 	return new Promise((resolve, reject) => {
 		let dispose;
-		popup(import('@/components/ui/context-menu.vue'), {
+		popup(import('@client/components/ui/context-menu.vue'), {
 			items,
 			ev,
 		}, {
diff --git a/src/client/pages/_error_.vue b/src/client/pages/_error_.vue
index 29a62d72ba76e254a5c32c582f3eff9605700865..b31791558935d7492d3a9fe50e3d6bad888941b4 100644
--- a/src/client/pages/_error_.vue
+++ b/src/client/pages/_error_.vue
@@ -13,7 +13,7 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import { faExclamationTriangle } from '@fortawesome/free-solid-svg-icons';
-import MkButton from '@/components/ui/button.vue';
+import MkButton from '@client/components/ui/button.vue';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/_loading_.vue b/src/client/pages/_loading_.vue
index 05c6af1cd7bf27ba2d6a4ce5fed014d4e7ad31b2..34ecaf9b33fb1cde3980bd142018cca6b629682d 100644
--- a/src/client/pages/_loading_.vue
+++ b/src/client/pages/_loading_.vue
@@ -4,7 +4,7 @@
 
 <script lang="ts">
 import { defineComponent } from 'vue';
-import * as os from '@/os';
+import * as os from '@client/os';
 
 export default defineComponent({});
 </script>
diff --git a/src/client/pages/about-misskey.vue b/src/client/pages/about-misskey.vue
index a52678e3cdcb773e7df956a023976a848200eef9..2d1da88fa141393547a5ea803b63e6629a7aa91d 100644
--- a/src/client/pages/about-misskey.vue
+++ b/src/client/pages/about-misskey.vue
@@ -55,14 +55,14 @@
 import { defineComponent } from 'vue';
 import { faInfoCircle, faCode, faLanguage, faHandHoldingMedical, } from '@fortawesome/free-solid-svg-icons';
 import VanillaTilt from 'vanilla-tilt';
-import { version } from '@/config';
-import FormLink from '@/components/form/link.vue';
-import FormBase from '@/components/form/base.vue';
-import FormGroup from '@/components/form/group.vue';
-import FormKeyValueView from '@/components/form/key-value-view.vue';
-import MkLink from '@/components/link.vue';
-import { physics } from '@/scripts/physics.ts';
-import * as os from '@/os';
+import { version } from '@client/config';
+import FormLink from '@client/components/form/link.vue';
+import FormBase from '@client/components/form/base.vue';
+import FormGroup from '@client/components/form/group.vue';
+import FormKeyValueView from '@client/components/form/key-value-view.vue';
+import MkLink from '@client/components/link.vue';
+import { physics } from '@client/scripts/physics.ts';
+import * as os from '@client/os';
 
 const patrons = [
 	'Satsuki Yanagi',
diff --git a/src/client/pages/about.vue b/src/client/pages/about.vue
index 6ec74bc9623aa826cd26beddcd9e27f319ec8e7e..911fc0bc629d3444cff22972154d58aa7eb278a3 100644
--- a/src/client/pages/about.vue
+++ b/src/client/pages/about.vue
@@ -41,13 +41,13 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import { faInfoCircle } from '@fortawesome/free-solid-svg-icons';
-import { version, instanceName } from '@/config';
-import FormLink from '@/components/form/link.vue';
-import FormBase from '@/components/form/base.vue';
-import FormGroup from '@/components/form/group.vue';
-import FormKeyValueView from '@/components/form/key-value-view.vue';
-import * as os from '@/os';
-import number from '@/filters/number';
+import { version, instanceName } from '@client/config';
+import FormLink from '@client/components/form/link.vue';
+import FormBase from '@client/components/form/base.vue';
+import FormGroup from '@client/components/form/group.vue';
+import FormKeyValueView from '@client/components/form/key-value-view.vue';
+import * as os from '@client/os';
+import number from '@client/filters/number';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/advanced-theme-editor.vue b/src/client/pages/advanced-theme-editor.vue
index 8326c5529c2e18fc1aa8bfba1e9c392b88eed57e..fb00c8c8ac7648d5934e33fe47df52eb6171d933 100644
--- a/src/client/pages/advanced-theme-editor.vue
+++ b/src/client/pages/advanced-theme-editor.vue
@@ -96,19 +96,19 @@ import { faPalette, faChevronDown, faKeyboard } from '@fortawesome/free-solid-sv
 import * as JSON5 from 'json5';
 import { toUnicode } from 'punycode';
 
-import MkRadio from '@/components/ui/radio.vue';
-import MkButton from '@/components/ui/button.vue';
-import MkInput from '@/components/ui/input.vue';
-import MkTextarea from '@/components/ui/textarea.vue';
-import MkSelect from '@/components/ui/select.vue';
-import MkSample from '@/components/sample.vue';
+import MkRadio from '@client/components/ui/radio.vue';
+import MkButton from '@client/components/ui/button.vue';
+import MkInput from '@client/components/ui/input.vue';
+import MkTextarea from '@client/components/ui/textarea.vue';
+import MkSelect from '@client/components/ui/select.vue';
+import MkSample from '@client/components/sample.vue';
 
-import { convertToMisskeyTheme, ThemeValue, convertToViewModel, ThemeViewModel } from '@/scripts/theme-editor';
-import { Theme, applyTheme, lightTheme, darkTheme, themeProps, validateTheme } from '@/scripts/theme';
-import { host } from '@/config';
-import * as os from '@/os';
-import { ColdDeviceStorage } from '@/store';
-import { addTheme } from '@/theme-store';
+import { convertToMisskeyTheme, ThemeValue, convertToViewModel, ThemeViewModel } from '@client/scripts/theme-editor';
+import { Theme, applyTheme, lightTheme, darkTheme, themeProps, validateTheme } from '@client/scripts/theme';
+import { host } from '@client/config';
+import * as os from '@client/os';
+import { ColdDeviceStorage } from '@client/store';
+import { addTheme } from '@client/theme-store';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/announcements.vue b/src/client/pages/announcements.vue
index 4fbb3475637bbaead8decb7764509f947195047a..7c8ab28d8e0141c72fe6c8deff697ee4d2eff65a 100644
--- a/src/client/pages/announcements.vue
+++ b/src/client/pages/announcements.vue
@@ -18,9 +18,9 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import { faCheck, faBroadcastTower } from '@fortawesome/free-solid-svg-icons';
-import MkPagination from '@/components/ui/pagination.vue';
-import MkButton from '@/components/ui/button.vue';
-import * as os from '@/os';
+import MkPagination from '@client/components/ui/pagination.vue';
+import MkButton from '@client/components/ui/button.vue';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/api-console.vue b/src/client/pages/api-console.vue
index dd5cacaeec77652932a17ce23dfd39c710bf336d..f5b4dceb2622d5524be5b071c82e37c85715e8d5 100644
--- a/src/client/pages/api-console.vue
+++ b/src/client/pages/api-console.vue
@@ -27,11 +27,11 @@
 import { defineComponent } from 'vue';
 import { faTerminal, faPaperPlane } from '@fortawesome/free-solid-svg-icons';
 import * as JSON5 from 'json5';
-import MkButton from '@/components/ui/button.vue';
-import MkInput from '@/components/ui/input.vue';
-import MkTextarea from '@/components/ui/textarea.vue';
-import MkSwitch from '@/components/ui/switch.vue';
-import * as os from '@/os';
+import MkButton from '@client/components/ui/button.vue';
+import MkInput from '@client/components/ui/input.vue';
+import MkTextarea from '@client/components/ui/textarea.vue';
+import MkSwitch from '@client/components/ui/switch.vue';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/auth.form.vue b/src/client/pages/auth.form.vue
index 8b2adc3e07b509fabfc9c7f11820d6a2ffa313a4..10c466c73c1dff7e1ddce4e1e93ee62d70c9779d 100644
--- a/src/client/pages/auth.form.vue
+++ b/src/client/pages/auth.form.vue
@@ -21,8 +21,8 @@
 
 <script lang="ts">
 import { defineComponent } from 'vue';
-import MkButton from '@/components/ui/button.vue';
-import * as os from '@/os';
+import MkButton from '@client/components/ui/button.vue';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/auth.vue b/src/client/pages/auth.vue
index 522bd4cdf852e95c1220f0ffefed60c7c516a318..3656d48c424ae65c66ca968a95af1f7135ec8bfd 100755
--- a/src/client/pages/auth.vue
+++ b/src/client/pages/auth.vue
@@ -31,9 +31,9 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import XForm from './auth.form.vue';
-import MkSignin from '@/components/signin.vue';
-import * as os from '@/os';
-import { login } from '@/account';
+import MkSignin from '@client/components/signin.vue';
+import * as os from '@client/os';
+import { login } from '@client/account';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/channel-editor.vue b/src/client/pages/channel-editor.vue
index 983e76d500ef8373028b518b61bb9b342761d01d..f5b8a66a6f87fa8c43293e1903c5da9748b6d107 100644
--- a/src/client/pages/channel-editor.vue
+++ b/src/client/pages/channel-editor.vue
@@ -25,11 +25,11 @@
 import { computed, defineComponent } from 'vue';
 import { faPlus, faSatelliteDish } from '@fortawesome/free-solid-svg-icons';
 import { faSave, faTrashAlt } from '@fortawesome/free-regular-svg-icons';
-import MkTextarea from '@/components/ui/textarea.vue';
-import MkButton from '@/components/ui/button.vue';
-import MkInput from '@/components/ui/input.vue';
-import { selectFile } from '@/scripts/select-file';
-import * as os from '@/os';
+import MkTextarea from '@client/components/ui/textarea.vue';
+import MkButton from '@client/components/ui/button.vue';
+import MkInput from '@client/components/ui/input.vue';
+import { selectFile } from '@client/scripts/select-file';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/channel.vue b/src/client/pages/channel.vue
index 93044f4ab4242e7138672b221ed847822b7ab03c..d2ddebb4a8efe1a2f346fca434411ceb933d8f76 100644
--- a/src/client/pages/channel.vue
+++ b/src/client/pages/channel.vue
@@ -30,11 +30,11 @@
 import { computed, defineComponent } from 'vue';
 import { faSatelliteDish, faUsers, faPencilAlt, faAngleUp, faAngleDown } from '@fortawesome/free-solid-svg-icons';
 import {  } from '@fortawesome/free-regular-svg-icons';
-import MkContainer from '@/components/ui/container.vue';
-import XPostForm from '@/components/post-form.vue';
-import XTimeline from '@/components/timeline.vue';
-import XChannelFollowButton from '@/components/channel-follow-button.vue';
-import * as os from '@/os';
+import MkContainer from '@client/components/ui/container.vue';
+import XPostForm from '@client/components/post-form.vue';
+import XTimeline from '@client/components/timeline.vue';
+import XChannelFollowButton from '@client/components/channel-follow-button.vue';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/channels.vue b/src/client/pages/channels.vue
index fcedc28db12fb02e1a561063abf1ba4bc9ebceb3..d75c4e5ba65c55be1a6d0ee617ac5bb2283e511a 100644
--- a/src/client/pages/channels.vue
+++ b/src/client/pages/channels.vue
@@ -35,10 +35,10 @@
 import { defineComponent } from 'vue';
 import { faSatelliteDish, faPlus, faEdit, faFireAlt } from '@fortawesome/free-solid-svg-icons';
 import { faHeart } from '@fortawesome/free-regular-svg-icons';
-import MkChannelPreview from '@/components/channel-preview.vue';
-import MkPagination from '@/components/ui/pagination.vue';
-import MkButton from '@/components/ui/button.vue';
-import MkTab from '@/components/tab.vue';
+import MkChannelPreview from '@client/components/channel-preview.vue';
+import MkPagination from '@client/components/ui/pagination.vue';
+import MkButton from '@client/components/ui/button.vue';
+import MkTab from '@client/components/tab.vue';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/clip.vue b/src/client/pages/clip.vue
index 2b61813fd84912ec322b272941dd74624487993c..c6e46a98341cb70871f57ecd7d9a087133e6947f 100644
--- a/src/client/pages/clip.vue
+++ b/src/client/pages/clip.vue
@@ -16,10 +16,10 @@
 <script lang="ts">
 import { computed, defineComponent } from 'vue';
 import { faEllipsisH, faPaperclip, faPencilAlt, faTrashAlt } from '@fortawesome/free-solid-svg-icons';
-import MkContainer from '@/components/ui/container.vue';
-import XPostForm from '@/components/post-form.vue';
-import XNotes from '@/components/notes.vue';
-import * as os from '@/os';
+import MkContainer from '@client/components/ui/container.vue';
+import XPostForm from '@client/components/post-form.vue';
+import XNotes from '@client/components/notes.vue';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/doc.vue b/src/client/pages/doc.vue
index ed4eae4d02e3e0ab3f7f38a63faeec6207e95e47..7155cc156375f0d4b63db906787b2ae4df5382c7 100644
--- a/src/client/pages/doc.vue
+++ b/src/client/pages/doc.vue
@@ -13,8 +13,8 @@ import { computed, defineComponent } from 'vue';
 import { faQuestionCircle } from '@fortawesome/free-solid-svg-icons'
 import MarkdownIt from 'markdown-it';
 import MarkdownItAnchor from 'markdown-it-anchor';
-import { url, lang } from '@/config';
-import MkLink from '@/components/link.vue';
+import { url, lang } from '@client/config';
+import MkLink from '@client/components/link.vue';
 
 const markdown = MarkdownIt({
 	html: true
diff --git a/src/client/pages/docs.vue b/src/client/pages/docs.vue
index 59d23efcb7272c4c2eda61a18b4dbaccf5496f6e..f57be3d32329e70533eac70dc67949edb11c308b 100644
--- a/src/client/pages/docs.vue
+++ b/src/client/pages/docs.vue
@@ -15,7 +15,7 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import { faQuestionCircle } from '@fortawesome/free-solid-svg-icons'
-import { url, lang } from '@/config';
+import { url, lang } from '@client/config';
 
 export default defineComponent({
 	data() {
diff --git a/src/client/pages/drive.vue b/src/client/pages/drive.vue
index 63b0e7ba7dd7a46f2150947e26f8d0007f4087b4..754581a8b6ac38d98a9071ddd291e56e98e07f6f 100644
--- a/src/client/pages/drive.vue
+++ b/src/client/pages/drive.vue
@@ -7,8 +7,8 @@
 <script lang="ts">
 import { computed, defineComponent } from 'vue';
 import { faCloud, faEllipsisH } from '@fortawesome/free-solid-svg-icons';
-import XDrive from '@/components/drive.vue';
-import * as os from '@/os';
+import XDrive from '@client/components/drive.vue';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/explore.vue b/src/client/pages/explore.vue
index b78a3707efe6a3aaf8177334711fe2285dc4b4e9..da2eaffb84a54d6208e1884ca8b30c8d39bffbdb 100644
--- a/src/client/pages/explore.vue
+++ b/src/client/pages/explore.vue
@@ -70,11 +70,11 @@
 import { computed, defineComponent } from 'vue';
 import { faChartLine, faPlus, faHashtag, faRocket, faSearch } from '@fortawesome/free-solid-svg-icons';
 import { faBookmark, faCommentAlt } from '@fortawesome/free-regular-svg-icons';
-import XUserList from '@/components/user-list.vue';
-import MkFolder from '@/components/ui/folder.vue';
-import MkInput from '@/components/ui/input.vue';
-import number from '@/filters/number';
-import * as os from '@/os';
+import XUserList from '@client/components/user-list.vue';
+import MkFolder from '@client/components/ui/folder.vue';
+import MkInput from '@client/components/ui/input.vue';
+import number from '@client/filters/number';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/favorites.vue b/src/client/pages/favorites.vue
index 35c5942398580cc9e36fc226c508214eed874b28..c87855484d12696fd14afb68b9838ea4e9626868 100644
--- a/src/client/pages/favorites.vue
+++ b/src/client/pages/favorites.vue
@@ -7,9 +7,9 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import { faStar } from '@fortawesome/free-solid-svg-icons';
-import Progress from '@/scripts/loading';
-import XNotes from '@/components/notes.vue';
-import * as os from '@/os';
+import Progress from '@client/scripts/loading';
+import XNotes from '@client/components/notes.vue';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/featured.vue b/src/client/pages/featured.vue
index c1e612ef8d17360891aa87c231d46f2bf951afeb..3866c4b4890bb1093d0b1d49229fa8a51f4f99bc 100644
--- a/src/client/pages/featured.vue
+++ b/src/client/pages/featured.vue
@@ -7,8 +7,8 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import { faFireAlt } from '@fortawesome/free-solid-svg-icons';
-import Progress from '@/scripts/loading';
-import XNotes from '@/components/notes.vue';
+import Progress from '@client/scripts/loading';
+import XNotes from '@client/components/notes.vue';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/follow-requests.vue b/src/client/pages/follow-requests.vue
index 04d739088f3f853f857597069f7c5f838cb9bf5f..64e6fa03e6a285d310163da9deb579649dd00069 100644
--- a/src/client/pages/follow-requests.vue
+++ b/src/client/pages/follow-requests.vue
@@ -32,9 +32,9 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import { faUserClock, faCheck, faTimes } from '@fortawesome/free-solid-svg-icons';
-import MkPagination from '@/components/ui/pagination.vue';
+import MkPagination from '@client/components/ui/pagination.vue';
 import { userPage, acct } from '../filters/user';
-import * as os from '@/os';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/follow.vue b/src/client/pages/follow.vue
index f999f48c5dad10b25fb225db9f9f51ff5eb4192b..f5afdf0892a6c91a0a2d387535b0e14cbc142d11 100644
--- a/src/client/pages/follow.vue
+++ b/src/client/pages/follow.vue
@@ -5,8 +5,8 @@
 
 <script lang="ts">
 import { defineComponent } from 'vue';
-import * as os from '@/os';
-import parseAcct from '../../misc/acct/parse';
+import * as os from '@client/os';
+import parseAcct from '@/misc/acct/parse';
 
 export default defineComponent({
 	created() {
diff --git a/src/client/pages/instance/abuses.vue b/src/client/pages/instance/abuses.vue
index 030f5ae15772f01ed33d250c2d55c9f7dbe08eeb..d7d7697ebd95bbed0633ff31343bf4ea4dfeaca8 100644
--- a/src/client/pages/instance/abuses.vue
+++ b/src/client/pages/instance/abuses.vue
@@ -65,13 +65,13 @@
 import { defineComponent } from 'vue';
 import { faPlus, faUsers, faSearch, faBookmark, faMicrophoneSlash, faExclamationCircle } from '@fortawesome/free-solid-svg-icons';
 import { faSnowflake, faBookmark as farBookmark } from '@fortawesome/free-regular-svg-icons';
-import parseAcct from '../../../misc/acct/parse';
-import MkButton from '@/components/ui/button.vue';
-import MkInput from '@/components/ui/input.vue';
-import MkSelect from '@/components/ui/select.vue';
-import MkPagination from '@/components/ui/pagination.vue';
+import parseAcct from '@/misc/acct/parse';
+import MkButton from '@client/components/ui/button.vue';
+import MkInput from '@client/components/ui/input.vue';
+import MkSelect from '@client/components/ui/select.vue';
+import MkPagination from '@client/components/ui/pagination.vue';
 import { acct } from '../../filters/user';
-import * as os from '@/os';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/instance/announcements.vue b/src/client/pages/instance/announcements.vue
index b859aae2ec4ff02c80c33c351a9119094956f413..15e5f389bcf76b8eb73d37f81d327d0e87b22307 100644
--- a/src/client/pages/instance/announcements.vue
+++ b/src/client/pages/instance/announcements.vue
@@ -30,10 +30,10 @@
 import { defineComponent } from 'vue';
 import { faBroadcastTower, faPlus } from '@fortawesome/free-solid-svg-icons';
 import { faSave, faTrashAlt } from '@fortawesome/free-regular-svg-icons';
-import MkButton from '@/components/ui/button.vue';
-import MkInput from '@/components/ui/input.vue';
-import MkTextarea from '@/components/ui/textarea.vue';
-import * as os from '@/os';
+import MkButton from '@client/components/ui/button.vue';
+import MkInput from '@client/components/ui/input.vue';
+import MkTextarea from '@client/components/ui/textarea.vue';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/instance/emoji-edit-dialog.vue b/src/client/pages/instance/emoji-edit-dialog.vue
index 179057d51957609feeccc0753e2e110d58ac542f..34eca47b4e18147595510db3d1e23bfe1db38189 100644
--- a/src/client/pages/instance/emoji-edit-dialog.vue
+++ b/src/client/pages/instance/emoji-edit-dialog.vue
@@ -24,10 +24,10 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import { faTrashAlt } from '@fortawesome/free-regular-svg-icons';
-import XModalWindow from '@/components/ui/modal-window.vue';
-import MkButton from '@/components/ui/button.vue';
-import MkInput from '@/components/ui/input.vue';
-import * as os from '@/os';
+import XModalWindow from '@client/components/ui/modal-window.vue';
+import MkButton from '@client/components/ui/button.vue';
+import MkInput from '@client/components/ui/input.vue';
+import * as os from '@client/os';
 import { unique } from '../../../prelude/array';
 
 export default defineComponent({
diff --git a/src/client/pages/instance/emojis.vue b/src/client/pages/instance/emojis.vue
index 6a51813bb268f4e31e6dcaa496a200bb532172dc..01e207f491bbf56a16b284035023fc8b244496c3 100644
--- a/src/client/pages/instance/emojis.vue
+++ b/src/client/pages/instance/emojis.vue
@@ -53,12 +53,12 @@
 import { computed, defineComponent } from 'vue';
 import { faPlus, faSave, faSearch } from '@fortawesome/free-solid-svg-icons';
 import { faTrashAlt, faLaugh } from '@fortawesome/free-regular-svg-icons';
-import MkButton from '@/components/ui/button.vue';
-import MkInput from '@/components/ui/input.vue';
-import MkPagination from '@/components/ui/pagination.vue';
-import MkTab from '@/components/tab.vue';
-import { selectFile } from '@/scripts/select-file';
-import * as os from '@/os';
+import MkButton from '@client/components/ui/button.vue';
+import MkInput from '@client/components/ui/input.vue';
+import MkPagination from '@client/components/ui/pagination.vue';
+import MkTab from '@client/components/tab.vue';
+import { selectFile } from '@client/scripts/select-file';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/instance/federation.vue b/src/client/pages/instance/federation.vue
index fe8ce8c2f4b09be8a957fa3444a94b749e94cfb5..ba452c54581b4717ec212af8b01c63d62346fcc2 100644
--- a/src/client/pages/instance/federation.vue
+++ b/src/client/pages/instance/federation.vue
@@ -61,12 +61,12 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import { faGlobe, faCircle, faExchangeAlt, faCaretDown, faCaretUp, faTrafficLight } from '@fortawesome/free-solid-svg-icons';
-import MkButton from '@/components/ui/button.vue';
-import MkInput from '@/components/ui/input.vue';
-import MkSelect from '@/components/ui/select.vue';
-import MkPagination from '@/components/ui/pagination.vue';
+import MkButton from '@client/components/ui/button.vue';
+import MkInput from '@client/components/ui/input.vue';
+import MkSelect from '@client/components/ui/select.vue';
+import MkPagination from '@client/components/ui/pagination.vue';
 import MkInstanceInfo from './instance.vue';
-import * as os from '@/os';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/instance/file-dialog.vue b/src/client/pages/instance/file-dialog.vue
index 87fcdb59ef1a00b979379c9344b99e605a74c619..85c03e3dcea58f41710f471d7c34939e44ce6790 100644
--- a/src/client/pages/instance/file-dialog.vue
+++ b/src/client/pages/instance/file-dialog.vue
@@ -38,13 +38,13 @@
 import { computed, defineComponent } from 'vue';
 import { faTimes, faBookmark, faKey, faSync, faMicrophoneSlash, faExternalLinkSquareAlt } from '@fortawesome/free-solid-svg-icons';
 import { faSnowflake, faTrashAlt, faBookmark as farBookmark  } from '@fortawesome/free-regular-svg-icons';
-import MkButton from '@/components/ui/button.vue';
-import MkSwitch from '@/components/ui/switch.vue';
-import XModalWindow from '@/components/ui/modal-window.vue';
-import MkDriveFileThumbnail from '@/components/drive-file-thumbnail.vue';
-import Progress from '@/scripts/loading';
-import bytes from '@/filters/bytes';
-import * as os from '@/os';
+import MkButton from '@client/components/ui/button.vue';
+import MkSwitch from '@client/components/ui/switch.vue';
+import XModalWindow from '@client/components/ui/modal-window.vue';
+import MkDriveFileThumbnail from '@client/components/drive-file-thumbnail.vue';
+import Progress from '@client/scripts/loading';
+import bytes from '@client/filters/bytes';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/instance/files.vue b/src/client/pages/instance/files.vue
index f19e3fcd4516935fb9ec9dbd8d7ec45a2ba14671..aa667137899a4c1481a7758b95a55e483a23044d 100644
--- a/src/client/pages/instance/files.vue
+++ b/src/client/pages/instance/files.vue
@@ -64,13 +64,13 @@
 import { defineComponent } from 'vue';
 import { faCloud, faSearch } from '@fortawesome/free-solid-svg-icons';
 import { faTrashAlt } from '@fortawesome/free-regular-svg-icons';
-import MkButton from '@/components/ui/button.vue';
-import MkInput from '@/components/ui/input.vue';
-import MkSelect from '@/components/ui/select.vue';
-import MkPagination from '@/components/ui/pagination.vue';
-import MkDriveFileThumbnail from '@/components/drive-file-thumbnail.vue';
-import bytes from '@/filters/bytes';
-import * as os from '@/os';
+import MkButton from '@client/components/ui/button.vue';
+import MkInput from '@client/components/ui/input.vue';
+import MkSelect from '@client/components/ui/select.vue';
+import MkPagination from '@client/components/ui/pagination.vue';
+import MkDriveFileThumbnail from '@client/components/drive-file-thumbnail.vue';
+import bytes from '@client/filters/bytes';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/instance/index.metrics.vue b/src/client/pages/instance/index.metrics.vue
index 9d990c2244a72ec5144d373b80423d4d95fc5376..b467ce06f570ccfa061f1c5dc399f2e69c118115 100644
--- a/src/client/pages/instance/index.metrics.vue
+++ b/src/client/pages/instance/index.metrics.vue
@@ -103,13 +103,13 @@
 import { defineComponent, markRaw } from 'vue';
 import { faPlay, faPause, faDatabase, faServer, faExchangeAlt, faMicrochip, faHdd, faStream, faTrashAlt, faInfoCircle, faExclamationTriangle, faTachometerAlt, faHeartbeat, faClipboardList } from '@fortawesome/free-solid-svg-icons';
 import Chart from 'chart.js';
-import MkButton from '@/components/ui/button.vue';
-import MkSelect from '@/components/ui/select.vue';
-import MkInput from '@/components/ui/input.vue';
-import MkContainer from '@/components/ui/container.vue';
-import MkFolder from '@/components/ui/folder.vue';
+import MkButton from '@client/components/ui/button.vue';
+import MkSelect from '@client/components/ui/select.vue';
+import MkInput from '@client/components/ui/input.vue';
+import MkContainer from '@client/components/ui/container.vue';
+import MkFolder from '@client/components/ui/folder.vue';
 import MkwFederation from '../../widgets/federation.vue';
-import { version, url } from '@/config';
+import { version, url } from '@client/config';
 import bytes from '../../filters/bytes';
 import number from '../../filters/number';
 import MkInstanceInfo from './instance.vue';
@@ -121,7 +121,7 @@ const alpha = (hex, a) => {
 	const b = parseInt(result[3], 16);
 	return `rgba(${r}, ${g}, ${b}, ${a})`;
 };
-import * as os from '@/os';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/instance/index.vue b/src/client/pages/instance/index.vue
index e519ce743e2f0547d905e139357d78e599880d0a..5a35309ed4d0e329d45d9b11d97b832ea7d235b0 100644
--- a/src/client/pages/instance/index.vue
+++ b/src/client/pages/instance/index.vue
@@ -58,18 +58,18 @@
 import { computed, defineComponent, markRaw } from 'vue';
 import { faPlay, faPause, faDatabase, faServer, faExchangeAlt, faMicrochip, faHdd, faStream, faTrashAlt, faInfoCircle, faExclamationTriangle, faTachometerAlt, faHeartbeat, faClipboardList } from '@fortawesome/free-solid-svg-icons';
 import VueJsonPretty from 'vue-json-pretty';
-import MkInstanceStats from '@/components/instance-stats.vue';
-import MkButton from '@/components/ui/button.vue';
-import MkSelect from '@/components/ui/select.vue';
-import MkInput from '@/components/ui/input.vue';
-import MkContainer from '@/components/ui/container.vue';
-import MkFolder from '@/components/ui/folder.vue';
-import { version, url } from '@/config';
+import MkInstanceStats from '@client/components/instance-stats.vue';
+import MkButton from '@client/components/ui/button.vue';
+import MkSelect from '@client/components/ui/select.vue';
+import MkInput from '@client/components/ui/input.vue';
+import MkContainer from '@client/components/ui/container.vue';
+import MkFolder from '@client/components/ui/folder.vue';
+import { version, url } from '@client/config';
 import bytes from '../../filters/bytes';
 import number from '../../filters/number';
 import MkInstanceInfo from './instance.vue';
 import XMetrics from './index.metrics.vue';
-import * as os from '@/os';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/instance/instance.vue b/src/client/pages/instance/instance.vue
index bcf18cfff0b9ad99ea62ef74634fe43017297637..118e8eae6e0500c60147b1197286fd54e12eecd2 100644
--- a/src/client/pages/instance/instance.vue
+++ b/src/client/pages/instance/instance.vue
@@ -126,15 +126,15 @@
 import { defineComponent } from 'vue';
 import Chart from 'chart.js';
 import { faTimes, faCrosshairs, faCloudDownloadAlt, faCloudUploadAlt, faUsers, faPencilAlt, faFileImage, faDatabase, faTrafficLight, faLongArrowAltUp, faLongArrowAltDown, faMinusCircle, faTrashAlt } from '@fortawesome/free-solid-svg-icons';
-import XModalWindow from '@/components/ui/modal-window.vue';
-import MkUsersDialog from '@/components/users-dialog.vue';
-import MkSelect from '@/components/ui/select.vue';
-import MkButton from '@/components/ui/button.vue';
-import MkSwitch from '@/components/ui/switch.vue';
-import MkInfo from '@/components/ui/info.vue';
+import XModalWindow from '@client/components/ui/modal-window.vue';
+import MkUsersDialog from '@client/components/users-dialog.vue';
+import MkSelect from '@client/components/ui/select.vue';
+import MkButton from '@client/components/ui/button.vue';
+import MkSwitch from '@client/components/ui/switch.vue';
+import MkInfo from '@client/components/ui/info.vue';
 import bytes from '../../filters/bytes';
 import number from '../../filters/number';
-import * as os from '@/os';
+import * as os from '@client/os';
 
 const chartLimit = 90;
 const sum = (...arr) => arr.reduce((r, a) => r.map((b, i) => a[i] + b));
diff --git a/src/client/pages/instance/logs.vue b/src/client/pages/instance/logs.vue
index 73862e9da51fa07ebe47a7393cccd7f71d9759ea..de1e81750f0c4600060c6afe380d9441c4b48b0a 100644
--- a/src/client/pages/instance/logs.vue
+++ b/src/client/pages/instance/logs.vue
@@ -32,11 +32,11 @@
 import { defineComponent } from 'vue';
 import { faStream } from '@fortawesome/free-solid-svg-icons';
 import { faTrashAlt } from '@fortawesome/free-regular-svg-icons';
-import MkButton from '@/components/ui/button.vue';
-import MkInput from '@/components/ui/input.vue';
-import MkSelect from '@/components/ui/select.vue';
-import MkTextarea from '@/components/ui/textarea.vue';
-import * as os from '@/os';
+import MkButton from '@client/components/ui/button.vue';
+import MkInput from '@client/components/ui/input.vue';
+import MkSelect from '@client/components/ui/select.vue';
+import MkTextarea from '@client/components/ui/textarea.vue';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/instance/queue.chart.vue b/src/client/pages/instance/queue.chart.vue
index 2a8259b9df881a21a409bd80e878880177fec63a..0eb70debfba8ce117df9875616f3427375f40e66 100644
--- a/src/client/pages/instance/queue.chart.vue
+++ b/src/client/pages/instance/queue.chart.vue
@@ -36,7 +36,7 @@ const alpha = (hex, a) => {
 	const b = parseInt(result[3], 16);
 	return `rgba(${r}, ${g}, ${b}, ${a})`;
 };
-import * as os from '@/os';
+import * as os from '@client/os';
 
 export default defineComponent({
 	props: {
diff --git a/src/client/pages/instance/queue.vue b/src/client/pages/instance/queue.vue
index b8ad875683d9ca4715ad615c786a8fce74381118..17c8430a019ac171e7b9b015e6765b45a41abe8c 100644
--- a/src/client/pages/instance/queue.vue
+++ b/src/client/pages/instance/queue.vue
@@ -18,9 +18,9 @@
 import { defineComponent } from 'vue';
 import { faExchangeAlt } from '@fortawesome/free-solid-svg-icons';
 import { faTrashAlt } from '@fortawesome/free-regular-svg-icons';
-import MkButton from '@/components/ui/button.vue';
+import MkButton from '@client/components/ui/button.vue';
 import XQueue from './queue.chart.vue';
-import * as os from '@/os';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/instance/relays.vue b/src/client/pages/instance/relays.vue
index f1c98355d304c7b05fccfcc806f4df23e57a2443..ef11366a144bece6e0b4917243952db1308cbfc5 100644
--- a/src/client/pages/instance/relays.vue
+++ b/src/client/pages/instance/relays.vue
@@ -25,9 +25,9 @@
 import { defineComponent } from 'vue';
 import { faPlus, faProjectDiagram } from '@fortawesome/free-solid-svg-icons';
 import { faSave, faTrashAlt } from '@fortawesome/free-regular-svg-icons';
-import MkButton from '@/components/ui/button.vue';
-import MkInput from '@/components/ui/input.vue';
-import * as os from '@/os';
+import MkButton from '@client/components/ui/button.vue';
+import MkInput from '@client/components/ui/input.vue';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/instance/settings.vue b/src/client/pages/instance/settings.vue
index cea621ba2d953a4b0e963e9c37b9112e7a110c4f..891eba3cf04f0b19262ef05f0d5ac63fddd09449 100644
--- a/src/client/pages/instance/settings.vue
+++ b/src/client/pages/instance/settings.vue
@@ -252,15 +252,15 @@ import { defineComponent, defineAsyncComponent } from 'vue';
 import { faPencilAlt, faShareAlt, faGhost, faCog, faPlus, faCloud, faInfoCircle, faBan, faSave, faServer, faLink, faThumbtack, faUser, faShieldAlt, faKey, faBolt, faArchway } from '@fortawesome/free-solid-svg-icons';
 import { faTrashAlt, faEnvelope } from '@fortawesome/free-regular-svg-icons';
 import { faTwitter, faDiscord, faGithub } from '@fortawesome/free-brands-svg-icons';
-import MkButton from '@/components/ui/button.vue';
-import MkInput from '@/components/ui/input.vue';
-import MkTextarea from '@/components/ui/textarea.vue';
-import MkSwitch from '@/components/ui/switch.vue';
-import MkInfo from '@/components/ui/info.vue';
-import { url } from '@/config';
-import getAcct from '../../../misc/acct/render';
-import * as os from '@/os';
-import { fetchInstance } from '@/instance';
+import MkButton from '@client/components/ui/button.vue';
+import MkInput from '@client/components/ui/input.vue';
+import MkTextarea from '@client/components/ui/textarea.vue';
+import MkSwitch from '@client/components/ui/switch.vue';
+import MkInfo from '@client/components/ui/info.vue';
+import { url } from '@client/config';
+import getAcct from '@/misc/acct/render';
+import * as os from '@client/os';
+import { fetchInstance } from '@client/instance';
 
 export default defineComponent({
 	components: {
@@ -269,7 +269,7 @@ export default defineComponent({
 		MkTextarea,
 		MkSwitch,
 		MkInfo,
-		Captcha: defineAsyncComponent(() => import('@/components/captcha.vue')),
+		Captcha: defineAsyncComponent(() => import('@client/components/captcha.vue')),
 	},
 
 	data() {
diff --git a/src/client/pages/instance/user-dialog.vue b/src/client/pages/instance/user-dialog.vue
index b690826d27bc9ca762ad6cc2cc9c8e4ac311d20b..fb0e766c5a8a8b4b9cef567eb742db2f1c88e860 100644
--- a/src/client/pages/instance/user-dialog.vue
+++ b/src/client/pages/instance/user-dialog.vue
@@ -50,12 +50,12 @@
 import { computed, defineComponent } from 'vue';
 import { faTimes, faBookmark, faKey, faSync, faMicrophoneSlash, faExternalLinkSquareAlt } from '@fortawesome/free-solid-svg-icons';
 import { faSnowflake, faTrashAlt, faBookmark as farBookmark  } from '@fortawesome/free-regular-svg-icons';
-import MkButton from '@/components/ui/button.vue';
-import MkSwitch from '@/components/ui/switch.vue';
-import XModalWindow from '@/components/ui/modal-window.vue';
-import Progress from '@/scripts/loading';
+import MkButton from '@client/components/ui/button.vue';
+import MkSwitch from '@client/components/ui/switch.vue';
+import XModalWindow from '@client/components/ui/modal-window.vue';
+import Progress from '@client/scripts/loading';
 import { acct, userPage } from '../../filters/user';
-import * as os from '@/os';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/instance/users.vue b/src/client/pages/instance/users.vue
index b2465991d86c0209979df22f70a6319bff60f5a6..013eed3971d7d887913cc0713fd54e07acc7d9e1 100644
--- a/src/client/pages/instance/users.vue
+++ b/src/client/pages/instance/users.vue
@@ -82,13 +82,13 @@
 import { defineComponent } from 'vue';
 import { faPlus, faUsers, faSearch, faBookmark, faMicrophoneSlash } from '@fortawesome/free-solid-svg-icons';
 import { faSnowflake, faBookmark as farBookmark } from '@fortawesome/free-regular-svg-icons';
-import parseAcct from '../../../misc/acct/parse';
-import MkButton from '@/components/ui/button.vue';
-import MkInput from '@/components/ui/input.vue';
-import MkSelect from '@/components/ui/select.vue';
-import MkPagination from '@/components/ui/pagination.vue';
+import parseAcct from '@/misc/acct/parse';
+import MkButton from '@client/components/ui/button.vue';
+import MkInput from '@client/components/ui/input.vue';
+import MkSelect from '@client/components/ui/select.vue';
+import MkPagination from '@client/components/ui/pagination.vue';
 import { acct } from '../../filters/user';
-import * as os from '@/os';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/mentions.vue b/src/client/pages/mentions.vue
index 943a0e868e25777b1d544708bd968c895afad215..5bd051453a5d3a828b61c7a953bd1a5161787140 100644
--- a/src/client/pages/mentions.vue
+++ b/src/client/pages/mentions.vue
@@ -7,8 +7,8 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import { faAt } from '@fortawesome/free-solid-svg-icons';
-import Progress from '@/scripts/loading';
-import XNotes from '@/components/notes.vue';
+import Progress from '@client/scripts/loading';
+import XNotes from '@client/components/notes.vue';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/messages.vue b/src/client/pages/messages.vue
index 60621fcc1d3073e1352b2b7a8378aceba7f4eb4d..02aa9c6fd3b6d44bc19c3593f7811e8d08e50f93 100644
--- a/src/client/pages/messages.vue
+++ b/src/client/pages/messages.vue
@@ -7,8 +7,8 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import { faEnvelope } from '@fortawesome/free-solid-svg-icons';
-import Progress from '@/scripts/loading';
-import XNotes from '@/components/notes.vue';
+import Progress from '@client/scripts/loading';
+import XNotes from '@client/components/notes.vue';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/messaging/index.vue b/src/client/pages/messaging/index.vue
index afb240c051e9f58e0f8b15a4ba439f7745153b31..c906b968a4bfee45b325ab918ff5d322105b1196 100644
--- a/src/client/pages/messaging/index.vue
+++ b/src/client/pages/messaging/index.vue
@@ -41,10 +41,10 @@
 <script lang="ts">
 import { defineAsyncComponent, defineComponent } from 'vue';
 import { faUser, faUsers, faComments, faPlus } from '@fortawesome/free-solid-svg-icons';
-import getAcct from '../../../misc/acct/render';
-import MkButton from '@/components/ui/button.vue';
+import getAcct from '@/misc/acct/render';
+import MkButton from '@client/components/ui/button.vue';
 import { acct } from '../../filters/user';
-import * as os from '@/os';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/messaging/messaging-room.form.vue b/src/client/pages/messaging/messaging-room.form.vue
index 5e675a3f12aba119da2726c376b1a66a973225f0..5826b8d0d23ea6713fdabe9412b0a6bb3ce10142 100644
--- a/src/client/pages/messaging/messaging-room.form.vue
+++ b/src/client/pages/messaging/messaging-room.form.vue
@@ -26,10 +26,10 @@ import { defineComponent, defineAsyncComponent } from 'vue';
 import { faPaperPlane, faPhotoVideo, faLaughSquint } from '@fortawesome/free-solid-svg-icons';
 import insertTextAtCursor from 'insert-text-at-cursor';
 import * as autosize from 'autosize';
-import { formatTimeString } from '../../../misc/format-time-string';
-import { selectFile } from '@/scripts/select-file';
-import * as os from '@/os';
-import { Autocomplete } from '@/scripts/autocomplete';
+import { formatTimeString } from '@/misc/format-time-string';
+import { selectFile } from '@client/scripts/select-file';
+import * as os from '@client/os';
+import { Autocomplete } from '@client/scripts/autocomplete';
 import { throttle } from 'throttle-debounce';
 
 export default defineComponent({
diff --git a/src/client/pages/messaging/messaging-room.message.vue b/src/client/pages/messaging/messaging-room.message.vue
index 6d4ed96044c25b372fd7a1421b33b5201e417aab..a6d142bd347767d8f3579057bfcb48ff0e45e3fc 100644
--- a/src/client/pages/messaging/messaging-room.message.vue
+++ b/src/client/pages/messaging/messaging-room.message.vue
@@ -39,8 +39,8 @@
 import { defineComponent } from 'vue';
 import { parse } from '../../../mfm/parse';
 import { unique } from '../../../prelude/array';
-import MkUrlPreview from '@/components/url-preview.vue';
-import * as os from '@/os';
+import MkUrlPreview from '@client/components/url-preview.vue';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/messaging/messaging-room.vue b/src/client/pages/messaging/messaging-room.vue
index 3921a081d1220de4e90b212cd38faa8f59f754e3..8473bb36c20d7c36f80a38124c821d8df0576de3 100644
--- a/src/client/pages/messaging/messaging-room.vue
+++ b/src/client/pages/messaging/messaging-room.vue
@@ -39,14 +39,14 @@
 import { computed, defineComponent } from 'vue';
 import { faArrowCircleDown, faFlag, faUsers, faInfoCircle, faEllipsisH, faExternalLinkAlt } from '@fortawesome/free-solid-svg-icons';
 import { faWindowMaximize } from '@fortawesome/free-regular-svg-icons';
-import XList from '@/components/date-separated-list.vue';
+import XList from '@client/components/date-separated-list.vue';
 import XMessage from './messaging-room.message.vue';
 import XForm from './messaging-room.form.vue';
-import parseAcct from '../../../misc/acct/parse';
-import { isBottom, onScrollBottom, scroll } from '@/scripts/scroll';
-import * as os from '@/os';
-import { popout } from '@/scripts/popout';
-import * as sound from '@/scripts/sound';
+import parseAcct from '@/misc/acct/parse';
+import { isBottom, onScrollBottom, scroll } from '@client/scripts/scroll';
+import * as os from '@client/os';
+import { popout } from '@client/scripts/popout';
+import * as sound from '@client/scripts/sound';
 
 const Component = defineComponent({
 	components: {
diff --git a/src/client/pages/mfm-cheat-sheet.vue b/src/client/pages/mfm-cheat-sheet.vue
index 0d599e4583dc4d947053fe25492495d5eef72895..4452604e4ed01a6320919b28c40138a1256e43ba 100644
--- a/src/client/pages/mfm-cheat-sheet.vue
+++ b/src/client/pages/mfm-cheat-sheet.vue
@@ -271,7 +271,7 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import { faQuestionCircle } from '@fortawesome/free-regular-svg-icons';
-import MkTextarea from '@/components/ui/textarea.vue';
+import MkTextarea from '@client/components/ui/textarea.vue';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/miauth.vue b/src/client/pages/miauth.vue
index 6430588c4665ab4aaad7ce1982b83c8fc7263c0a..39cd832838a306896db734366e9d27cf44be0c48 100644
--- a/src/client/pages/miauth.vue
+++ b/src/client/pages/miauth.vue
@@ -38,10 +38,10 @@
 
 <script lang="ts">
 import { defineComponent } from 'vue';
-import MkSignin from '@/components/signin.vue';
-import MkButton from '@/components/ui/button.vue';
-import * as os from '@/os';
-import { login } from '@/account';
+import MkSignin from '@client/components/signin.vue';
+import MkButton from '@client/components/ui/button.vue';
+import * as os from '@client/os';
+import { login } from '@client/account';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/my-antennas/index.antenna.vue b/src/client/pages/my-antennas/index.antenna.vue
index b664af91b5281ba0be493f4486108583c98d4696..d7050d08c46217be5e87180790d9ae304b08021c 100644
--- a/src/client/pages/my-antennas/index.antenna.vue
+++ b/src/client/pages/my-antennas/index.antenna.vue
@@ -48,13 +48,13 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import { faSave, faTrash } from '@fortawesome/free-solid-svg-icons';
-import MkButton from '@/components/ui/button.vue';
-import MkInput from '@/components/ui/input.vue';
-import MkTextarea from '@/components/ui/textarea.vue';
-import MkSelect from '@/components/ui/select.vue';
-import MkSwitch from '@/components/ui/switch.vue';
-import getAcct from '../../../misc/acct/render';
-import * as os from '@/os';
+import MkButton from '@client/components/ui/button.vue';
+import MkInput from '@client/components/ui/input.vue';
+import MkTextarea from '@client/components/ui/textarea.vue';
+import MkSelect from '@client/components/ui/select.vue';
+import MkSwitch from '@client/components/ui/switch.vue';
+import getAcct from '@/misc/acct/render';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/my-antennas/index.vue b/src/client/pages/my-antennas/index.vue
index ebab025b49739281b037d54341a4275274783da6..f4d5f4aad657e7f68074efaaab81d073445c8b2b 100644
--- a/src/client/pages/my-antennas/index.vue
+++ b/src/client/pages/my-antennas/index.vue
@@ -15,8 +15,8 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import { faSatellite, faPlus } from '@fortawesome/free-solid-svg-icons';
-import MkPagination from '@/components/ui/pagination.vue';
-import MkButton from '@/components/ui/button.vue';
+import MkPagination from '@client/components/ui/pagination.vue';
+import MkButton from '@client/components/ui/button.vue';
 import XAntenna from './index.antenna.vue';
 
 export default defineComponent({
diff --git a/src/client/pages/my-clips/index.vue b/src/client/pages/my-clips/index.vue
index b1fdb8e62a8a38a78053f32b4111dcc3a29fcd97..b724dfb6b75749f615946dbf5bc9ab3cb9c857cf 100644
--- a/src/client/pages/my-clips/index.vue
+++ b/src/client/pages/my-clips/index.vue
@@ -16,9 +16,9 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import { faPlus, faPaperclip } from '@fortawesome/free-solid-svg-icons';
-import MkPagination from '@/components/ui/pagination.vue';
-import MkButton from '@/components/ui/button.vue';
-import * as os from '@/os';
+import MkPagination from '@client/components/ui/pagination.vue';
+import MkButton from '@client/components/ui/button.vue';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/my-groups/group.vue b/src/client/pages/my-groups/group.vue
index ab6dc85399e0c54c013276ad36c9372c00348fac..8d0d8716c76ef6e05bb12d599fe8477fc1eed52b 100644
--- a/src/client/pages/my-groups/group.vue
+++ b/src/client/pages/my-groups/group.vue
@@ -36,9 +36,9 @@
 <script lang="ts">
 import { computed, defineComponent } from 'vue';
 import { faTimes, faUsers } from '@fortawesome/free-solid-svg-icons';
-import Progress from '@/scripts/loading';
-import MkButton from '@/components/ui/button.vue';
-import * as os from '@/os';
+import Progress from '@client/scripts/loading';
+import MkButton from '@client/components/ui/button.vue';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/my-groups/index.vue b/src/client/pages/my-groups/index.vue
index 99f7b1e68f00098b3c5ee39b39367974070a5051..2bc0d36b988e5a4e1d457ba75598457292963eb8 100644
--- a/src/client/pages/my-groups/index.vue
+++ b/src/client/pages/my-groups/index.vue
@@ -48,12 +48,12 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import { faUsers, faPlus, faEnvelopeOpenText } from '@fortawesome/free-solid-svg-icons';
-import MkPagination from '@/components/ui/pagination.vue';
-import MkButton from '@/components/ui/button.vue';
-import MkContainer from '@/components/ui/container.vue';
-import MkAvatars from '@/components/avatars.vue';
-import MkTab from '@/components/tab.vue';
-import * as os from '@/os';
+import MkPagination from '@client/components/ui/pagination.vue';
+import MkButton from '@client/components/ui/button.vue';
+import MkContainer from '@client/components/ui/container.vue';
+import MkAvatars from '@client/components/avatars.vue';
+import MkTab from '@client/components/tab.vue';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/my-lists/index.vue b/src/client/pages/my-lists/index.vue
index bb23be664db7e8f0f3010d87484fa44596c4830f..bbb2192aa115e632fe0bc27bd64efc0501f843e9 100644
--- a/src/client/pages/my-lists/index.vue
+++ b/src/client/pages/my-lists/index.vue
@@ -13,9 +13,9 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import { faListUl, faPlus } from '@fortawesome/free-solid-svg-icons';
-import MkPagination from '@/components/ui/pagination.vue';
-import MkButton from '@/components/ui/button.vue';
-import * as os from '@/os';
+import MkPagination from '@client/components/ui/pagination.vue';
+import MkButton from '@client/components/ui/button.vue';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/my-lists/list.vue b/src/client/pages/my-lists/list.vue
index 70c01dced17f243193089ebd9f9a8dbd6cb66475..dcaae222ccb81bc891fc6bf020ff9496914a8556 100644
--- a/src/client/pages/my-lists/list.vue
+++ b/src/client/pages/my-lists/list.vue
@@ -35,9 +35,9 @@
 <script lang="ts">
 import { computed, defineComponent } from 'vue';
 import { faTimes, faListUl } from '@fortawesome/free-solid-svg-icons';
-import Progress from '@/scripts/loading';
-import MkButton from '@/components/ui/button.vue';
-import * as os from '@/os';
+import Progress from '@client/scripts/loading';
+import MkButton from '@client/components/ui/button.vue';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/not-found.vue b/src/client/pages/not-found.vue
index ec707c2beb3737fd5e31777b3996d1d9d8cb0efb..61ca3870c5bca500630d5f6dd210a996f0cc64c1 100644
--- a/src/client/pages/not-found.vue
+++ b/src/client/pages/not-found.vue
@@ -10,7 +10,7 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import { faExclamationTriangle } from '@fortawesome/free-solid-svg-icons';
-import * as os from '@/os';
+import * as os from '@client/os';
 
 export default defineComponent({
 	data() {
diff --git a/src/client/pages/note.vue b/src/client/pages/note.vue
index 8756ba5a080cebcb48f6bf0e35db5c826f02aab8..eb46c49d8b5dcf73ad9a1be89443fd9c8b498411 100644
--- a/src/client/pages/note.vue
+++ b/src/client/pages/note.vue
@@ -38,12 +38,12 @@
 <script lang="ts">
 import { computed, defineComponent } from 'vue';
 import { faChevronUp, faChevronDown } from '@fortawesome/free-solid-svg-icons';
-import XNote from '@/components/note.vue';
-import XNoteDetailed from '@/components/note-detailed.vue';
-import XNotes from '@/components/notes.vue';
-import MkRemoteCaution from '@/components/remote-caution.vue';
-import MkButton from '@/components/ui/button.vue';
-import * as os from '@/os';
+import XNote from '@client/components/note.vue';
+import XNoteDetailed from '@client/components/note-detailed.vue';
+import XNotes from '@client/components/notes.vue';
+import MkRemoteCaution from '@client/components/remote-caution.vue';
+import MkButton from '@client/components/ui/button.vue';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/notifications.vue b/src/client/pages/notifications.vue
index 4b4f22e6424a1851cf89b6451bf6a7ad7c58c8cd..a6d73b4290be8b7feb0ea0ae1c666ce6422e4a3c 100644
--- a/src/client/pages/notifications.vue
+++ b/src/client/pages/notifications.vue
@@ -9,9 +9,9 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import { faBell } from '@fortawesome/free-solid-svg-icons';
-import Progress from '@/scripts/loading';
-import XNotifications from '@/components/notifications.vue';
-import * as os from '@/os';
+import Progress from '@client/scripts/loading';
+import XNotifications from '@client/components/notifications.vue';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/page-editor/els/page-editor.el.button.vue b/src/client/pages/page-editor/els/page-editor.el.button.vue
index 846e3f644d34910cc1c3e05a917d1155073ad85e..1515187676e24da4e50a0ad7cda6a33dc944a616 100644
--- a/src/client/pages/page-editor/els/page-editor.el.button.vue
+++ b/src/client/pages/page-editor/els/page-editor.el.button.vue
@@ -41,10 +41,10 @@
 import { defineComponent } from 'vue';
 import { faBolt } from '@fortawesome/free-solid-svg-icons';
 import XContainer from '../page-editor.container.vue';
-import MkSelect from '@/components/ui/select.vue';
-import MkInput from '@/components/ui/input.vue';
-import MkSwitch from '@/components/ui/switch.vue';
-import * as os from '@/os';
+import MkSelect from '@client/components/ui/select.vue';
+import MkInput from '@client/components/ui/input.vue';
+import MkSwitch from '@client/components/ui/switch.vue';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/page-editor/els/page-editor.el.canvas.vue b/src/client/pages/page-editor/els/page-editor.el.canvas.vue
index 83b7f376dd55f0e164914ede38b793d1ba628056..9d4b4c76d2699b1cc23197c34d4d6a2dd26cba12 100644
--- a/src/client/pages/page-editor/els/page-editor.el.canvas.vue
+++ b/src/client/pages/page-editor/els/page-editor.el.canvas.vue
@@ -14,8 +14,8 @@
 import { defineComponent } from 'vue';
 import { faPaintBrush, faMagic } from '@fortawesome/free-solid-svg-icons';
 import XContainer from '../page-editor.container.vue';
-import MkInput from '@/components/ui/input.vue';
-import * as os from '@/os';
+import MkInput from '@client/components/ui/input.vue';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/page-editor/els/page-editor.el.counter.vue b/src/client/pages/page-editor/els/page-editor.el.counter.vue
index 81f0462343a3dec46608ca94c30d94f83eda6019..e16962aee92845d5d7798a58cae6e64fd27cb912 100644
--- a/src/client/pages/page-editor/els/page-editor.el.counter.vue
+++ b/src/client/pages/page-editor/els/page-editor.el.counter.vue
@@ -14,8 +14,8 @@
 import { defineComponent } from 'vue';
 import { faBolt, faMagic } from '@fortawesome/free-solid-svg-icons';
 import XContainer from '../page-editor.container.vue';
-import MkInput from '@/components/ui/input.vue';
-import * as os from '@/os';
+import MkInput from '@client/components/ui/input.vue';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/page-editor/els/page-editor.el.if.vue b/src/client/pages/page-editor/els/page-editor.el.if.vue
index 8cc2f401cc577e88362d2179875b13fd9dfdb239..0cbfaa7eb859dc30fd3efbaa956a597ecec24873 100644
--- a/src/client/pages/page-editor/els/page-editor.el.if.vue
+++ b/src/client/pages/page-editor/els/page-editor.el.if.vue
@@ -29,8 +29,8 @@ import { defineComponent, defineAsyncComponent } from 'vue';
 import { v4 as uuid } from 'uuid';
 import { faPlus, faQuestion } from '@fortawesome/free-solid-svg-icons';
 import XContainer from '../page-editor.container.vue';
-import MkSelect from '@/components/ui/select.vue';
-import * as os from '@/os';
+import MkSelect from '@client/components/ui/select.vue';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/page-editor/els/page-editor.el.image.vue b/src/client/pages/page-editor/els/page-editor.el.image.vue
index b711d00763ffe378bd6425002e43578d07efe800..1a96e42679e873d1d5e2ecf11c0846618f113abb 100644
--- a/src/client/pages/page-editor/els/page-editor.el.image.vue
+++ b/src/client/pages/page-editor/els/page-editor.el.image.vue
@@ -18,8 +18,8 @@ import { defineComponent } from 'vue';
 import { faPencilAlt } from '@fortawesome/free-solid-svg-icons';
 import { faImage, faFolderOpen } from '@fortawesome/free-regular-svg-icons';
 import XContainer from '../page-editor.container.vue';
-import MkDriveFileThumbnail from '@/components/drive-file-thumbnail.vue';
-import * as os from '@/os';
+import MkDriveFileThumbnail from '@client/components/drive-file-thumbnail.vue';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/page-editor/els/page-editor.el.note.vue b/src/client/pages/page-editor/els/page-editor.el.note.vue
index 4f45f3b5fd4124bdab423b6ff334e48936b617b9..3f7eaf7572984cf48752bf4f688e98e1fbfa76da 100644
--- a/src/client/pages/page-editor/els/page-editor.el.note.vue
+++ b/src/client/pages/page-editor/els/page-editor.el.note.vue
@@ -19,11 +19,11 @@
 import { defineComponent } from 'vue';
 import { faStickyNote } from '@fortawesome/free-solid-svg-icons';
 import XContainer from '../page-editor.container.vue';
-import MkInput from '@/components/ui/input.vue';
-import MkSwitch from '@/components/ui/switch.vue';
-import XNote from '@/components/note.vue';
-import XNoteDetailed from '@/components/note-detailed.vue';
-import * as os from '@/os';
+import MkInput from '@client/components/ui/input.vue';
+import MkSwitch from '@client/components/ui/switch.vue';
+import XNote from '@client/components/note.vue';
+import XNoteDetailed from '@client/components/note-detailed.vue';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/page-editor/els/page-editor.el.number-input.vue b/src/client/pages/page-editor/els/page-editor.el.number-input.vue
index 37a4d6031ca7f169066d3fe519e07f3b8f9cdb06..76c35d4406fb15d4ec2e77ee678d6cc8ae8df228 100644
--- a/src/client/pages/page-editor/els/page-editor.el.number-input.vue
+++ b/src/client/pages/page-editor/els/page-editor.el.number-input.vue
@@ -14,8 +14,8 @@
 import { defineComponent } from 'vue';
 import { faBolt, faMagic } from '@fortawesome/free-solid-svg-icons';
 import XContainer from '../page-editor.container.vue';
-import MkInput from '@/components/ui/input.vue';
-import * as os from '@/os';
+import MkInput from '@client/components/ui/input.vue';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/page-editor/els/page-editor.el.post.vue b/src/client/pages/page-editor/els/page-editor.el.post.vue
index 3866f51c16384a6ce4f91127d1b13a76da8a207e..51c5481d54ac0c854174b5800a2a5ab76ed43d50 100644
--- a/src/client/pages/page-editor/els/page-editor.el.post.vue
+++ b/src/client/pages/page-editor/els/page-editor.el.post.vue
@@ -14,10 +14,10 @@
 import { defineComponent } from 'vue';
 import { faPaperPlane } from '@fortawesome/free-regular-svg-icons';
 import XContainer from '../page-editor.container.vue';
-import MkTextarea from '@/components/ui/textarea.vue';
-import MkInput from '@/components/ui/input.vue';
-import MkSwitch from '@/components/ui/switch.vue';
-import * as os from '@/os';
+import MkTextarea from '@client/components/ui/textarea.vue';
+import MkInput from '@client/components/ui/input.vue';
+import MkSwitch from '@client/components/ui/switch.vue';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/page-editor/els/page-editor.el.radio-button.vue b/src/client/pages/page-editor/els/page-editor.el.radio-button.vue
index d1e8545b2e06ba14695964c5a619912573f3ca0a..82b09a62901be83c52e667e7fab92d000d2ff814 100644
--- a/src/client/pages/page-editor/els/page-editor.el.radio-button.vue
+++ b/src/client/pages/page-editor/els/page-editor.el.radio-button.vue
@@ -15,9 +15,9 @@
 import { defineComponent } from 'vue';
 import { faBolt, faMagic } from '@fortawesome/free-solid-svg-icons';
 import XContainer from '../page-editor.container.vue';
-import MkTextarea from '@/components/ui/textarea.vue';
-import MkInput from '@/components/ui/input.vue';
-import * as os from '@/os';
+import MkTextarea from '@client/components/ui/textarea.vue';
+import MkInput from '@client/components/ui/input.vue';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/page-editor/els/page-editor.el.section.vue b/src/client/pages/page-editor/els/page-editor.el.section.vue
index e08540351c9c5954eec627eb8313f39cd7f9afe6..96f468b13aa8e789cee5b28227c659402fd0502f 100644
--- a/src/client/pages/page-editor/els/page-editor.el.section.vue
+++ b/src/client/pages/page-editor/els/page-editor.el.section.vue
@@ -22,7 +22,7 @@ import { v4 as uuid } from 'uuid';
 import { faPlus, faPencilAlt } from '@fortawesome/free-solid-svg-icons';
 import { faStickyNote } from '@fortawesome/free-regular-svg-icons';
 import XContainer from '../page-editor.container.vue';
-import * as os from '@/os';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/page-editor/els/page-editor.el.switch.vue b/src/client/pages/page-editor/els/page-editor.el.switch.vue
index 26142399324f57b67bab64a21c31805ef0746959..56b9f1561cbed15961e4e12b855808c830874377 100644
--- a/src/client/pages/page-editor/els/page-editor.el.switch.vue
+++ b/src/client/pages/page-editor/els/page-editor.el.switch.vue
@@ -14,9 +14,9 @@
 import { defineComponent } from 'vue';
 import { faBolt, faMagic } from '@fortawesome/free-solid-svg-icons';
 import XContainer from '../page-editor.container.vue';
-import MkSwitch from '@/components/ui/switch.vue';
-import MkInput from '@/components/ui/input.vue';
-import * as os from '@/os';
+import MkSwitch from '@client/components/ui/switch.vue';
+import MkInput from '@client/components/ui/input.vue';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/page-editor/els/page-editor.el.text-input.vue b/src/client/pages/page-editor/els/page-editor.el.text-input.vue
index 335d1ab40871b11cb7088e6c0f3a5117a04aa44f..cb8cb83aa71ac399c044beb1563a9fc5762f113e 100644
--- a/src/client/pages/page-editor/els/page-editor.el.text-input.vue
+++ b/src/client/pages/page-editor/els/page-editor.el.text-input.vue
@@ -14,8 +14,8 @@
 import { defineComponent } from 'vue';
 import { faBolt, faMagic } from '@fortawesome/free-solid-svg-icons';
 import XContainer from '../page-editor.container.vue';
-import MkInput from '@/components/ui/input.vue';
-import * as os from '@/os';
+import MkInput from '@client/components/ui/input.vue';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/page-editor/els/page-editor.el.text.vue b/src/client/pages/page-editor/els/page-editor.el.text.vue
index 452eedba6b77ae9dffdb3ab7a1c26c9f2e2d5522..bd2c9c46dc3ecbb36eb6f052bfbdaf5ed6b542f5 100644
--- a/src/client/pages/page-editor/els/page-editor.el.text.vue
+++ b/src/client/pages/page-editor/els/page-editor.el.text.vue
@@ -12,7 +12,7 @@
 import { defineComponent } from 'vue';
 import { faAlignLeft } from '@fortawesome/free-solid-svg-icons';
 import XContainer from '../page-editor.container.vue';
-import * as os from '@/os';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/page-editor/els/page-editor.el.textarea-input.vue b/src/client/pages/page-editor/els/page-editor.el.textarea-input.vue
index afedbe6f6d0b481ebc8d3c14f7572478a5198471..8c4ff234089ca633862c7e13ee5b6f11d4b11b15 100644
--- a/src/client/pages/page-editor/els/page-editor.el.textarea-input.vue
+++ b/src/client/pages/page-editor/els/page-editor.el.textarea-input.vue
@@ -14,9 +14,9 @@
 import { defineComponent } from 'vue';
 import { faBolt, faMagic } from '@fortawesome/free-solid-svg-icons';
 import XContainer from '../page-editor.container.vue';
-import MkTextarea from '@/components/ui/textarea.vue';
-import MkInput from '@/components/ui/input.vue';
-import * as os from '@/os';
+import MkTextarea from '@client/components/ui/textarea.vue';
+import MkInput from '@client/components/ui/input.vue';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/page-editor/els/page-editor.el.textarea.vue b/src/client/pages/page-editor/els/page-editor.el.textarea.vue
index e5f29b37d287eb69dd07f8b944b1dc496b217176..042b2837315f315c32a0474c5715d049f7755d43 100644
--- a/src/client/pages/page-editor/els/page-editor.el.textarea.vue
+++ b/src/client/pages/page-editor/els/page-editor.el.textarea.vue
@@ -12,7 +12,7 @@
 import { defineComponent } from 'vue';
 import { faAlignLeft } from '@fortawesome/free-solid-svg-icons';
 import XContainer from '../page-editor.container.vue';
-import * as os from '@/os';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/page-editor/page-editor.blocks.vue b/src/client/pages/page-editor/page-editor.blocks.vue
index ccaa715111685ca51929dc02e517a33b0ca2f61a..0065b16c8cc85e558353264168e93da3f44e0452 100644
--- a/src/client/pages/page-editor/page-editor.blocks.vue
+++ b/src/client/pages/page-editor/page-editor.blocks.vue
@@ -23,7 +23,7 @@ import XCounter from './els/page-editor.el.counter.vue';
 import XRadioButton from './els/page-editor.el.radio-button.vue';
 import XCanvas from './els/page-editor.el.canvas.vue';
 import XNote from './els/page-editor.el.note.vue';
-import * as os from '@/os';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/page-editor/page-editor.script-block.vue b/src/client/pages/page-editor/page-editor.script-block.vue
index 68bc1b50c168a8a06304033e36887c2794a870c3..10d5311cde3858a8d3ff9458fd2bffdf90c6677c 100644
--- a/src/client/pages/page-editor/page-editor.script-block.vue
+++ b/src/client/pages/page-editor/page-editor.script-block.vue
@@ -60,11 +60,11 @@ import { defineAsyncComponent, defineComponent } from 'vue';
 import { faPencilAlt, faPlug } from '@fortawesome/free-solid-svg-icons';
 import { v4 as uuid } from 'uuid';
 import XContainer from './page-editor.container.vue';
-import MkTextarea from '@/components/ui/textarea.vue';
-import { blockDefs } from '@/scripts/hpml/index';
-import * as os from '@/os';
-import { isLiteralValue } from '@/scripts/hpml/expr';
-import { funcDefs } from '@/scripts/hpml/lib';
+import MkTextarea from '@client/components/ui/textarea.vue';
+import { blockDefs } from '@client/scripts/hpml/index';
+import * as os from '@client/os';
+import { isLiteralValue } from '@client/scripts/hpml/expr';
+import { funcDefs } from '@client/scripts/hpml/lib';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/page-editor/page-editor.vue b/src/client/pages/page-editor/page-editor.vue
index 08856ebfe47ce3b87cf45e3f62ccdeb1622032ac..762ee774edbc50b09ddd20a222760e07677fa3ce 100644
--- a/src/client/pages/page-editor/page-editor.vue
+++ b/src/client/pages/page-editor/page-editor.vue
@@ -98,18 +98,18 @@ import { faSave, faStickyNote, faTrashAlt } from '@fortawesome/free-regular-svg-
 import { v4 as uuid } from 'uuid';
 import XVariable from './page-editor.script-block.vue';
 import XBlocks from './page-editor.blocks.vue';
-import MkTextarea from '@/components/ui/textarea.vue';
-import MkContainer from '@/components/ui/container.vue';
-import MkButton from '@/components/ui/button.vue';
-import MkSelect from '@/components/ui/select.vue';
-import MkSwitch from '@/components/ui/switch.vue';
-import MkInput from '@/components/ui/input.vue';
-import { blockDefs } from '@/scripts/hpml/index';
-import { HpmlTypeChecker } from '@/scripts/hpml/type-checker';
-import { url } from '@/config';
-import { collectPageVars } from '@/scripts/collect-page-vars';
-import * as os from '@/os';
-import { selectFile } from '@/scripts/select-file';
+import MkTextarea from '@client/components/ui/textarea.vue';
+import MkContainer from '@client/components/ui/container.vue';
+import MkButton from '@client/components/ui/button.vue';
+import MkSelect from '@client/components/ui/select.vue';
+import MkSwitch from '@client/components/ui/switch.vue';
+import MkInput from '@client/components/ui/input.vue';
+import { blockDefs } from '@client/scripts/hpml/index';
+import { HpmlTypeChecker } from '@client/scripts/hpml/type-checker';
+import { url } from '@client/config';
+import { collectPageVars } from '@client/scripts/collect-page-vars';
+import * as os from '@client/os';
+import { selectFile } from '@client/scripts/select-file';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/page.vue b/src/client/pages/page.vue
index 0b0b421ea2accc87613f8943c848a1d7cdfe70c4..121383a7a6eedf3022f68f470bb52556a9e16436 100644
--- a/src/client/pages/page.vue
+++ b/src/client/pages/page.vue
@@ -35,8 +35,8 @@
 import { computed, defineComponent } from 'vue';
 import { faHeart as faHeartS } from '@fortawesome/free-solid-svg-icons';
 import { faHeart as faHeartR } from '@fortawesome/free-regular-svg-icons';
-import XPage from '@/components/page/page.vue';
-import * as os from '@/os';
+import XPage from '@client/components/page/page.vue';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/pages.vue b/src/client/pages/pages.vue
index 29960351d35400fd9270b509fd39ff0a68ce4475..9bedda04ef47988f735e44005281365c5e3d0856 100644
--- a/src/client/pages/pages.vue
+++ b/src/client/pages/pages.vue
@@ -33,10 +33,10 @@
 import { defineComponent } from 'vue';
 import { faPlus, faEdit, faFireAlt } from '@fortawesome/free-solid-svg-icons';
 import { faStickyNote, faHeart } from '@fortawesome/free-regular-svg-icons';
-import MkPagePreview from '@/components/page-preview.vue';
-import MkPagination from '@/components/ui/pagination.vue';
-import MkButton from '@/components/ui/button.vue';
-import MkTab from '@/components/tab.vue';
+import MkPagePreview from '@client/components/page-preview.vue';
+import MkPagination from '@client/components/ui/pagination.vue';
+import MkButton from '@client/components/ui/button.vue';
+import MkTab from '@client/components/tab.vue';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/preview.vue b/src/client/pages/preview.vue
index 912f891d8a473e48cda2fcb80da368c7fb0fa6ec..0b0293f69af9a6a651466cbb12226299036e3277 100644
--- a/src/client/pages/preview.vue
+++ b/src/client/pages/preview.vue
@@ -7,7 +7,7 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import { faEye } from '@fortawesome/free-solid-svg-icons';
-import MkSample from '@/components/sample.vue';
+import MkSample from '@client/components/sample.vue';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/reversi/game.board.vue b/src/client/pages/reversi/game.board.vue
index 8ce232af07f8e68a23ef97be451b04494ddbddc2..a466527c012e6280a930ae16037e4db63f08ee3d 100644
--- a/src/client/pages/reversi/game.board.vue
+++ b/src/client/pages/reversi/game.board.vue
@@ -90,11 +90,11 @@ import { faCircle as fasCircle } from '@fortawesome/free-solid-svg-icons';
 import { faCircle as farCircle } from '@fortawesome/free-regular-svg-icons';
 import * as CRC32 from 'crc-32';
 import Reversi, { Color } from '../../../games/reversi/core';
-import { url } from '@/config';
-import MkButton from '@/components/ui/button.vue';
-import { userPage } from '@/filters/user';
-import * as os from '@/os';
-import * as sound from '@/scripts/sound';
+import { url } from '@client/config';
+import MkButton from '@client/components/ui/button.vue';
+import { userPage } from '@client/filters/user';
+import * as os from '@client/os';
+import * as sound from '@client/scripts/sound';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/reversi/game.setting.vue b/src/client/pages/reversi/game.setting.vue
index 404e560a06cc33ef03809d91a3fd093015e34e70..c7c2937ba838d1beb8621832d94218c96013bf24 100644
--- a/src/client/pages/reversi/game.setting.vue
+++ b/src/client/pages/reversi/game.setting.vue
@@ -128,9 +128,9 @@ import { defineComponent } from 'vue';
 import { faCircle as fasCircle } from '@fortawesome/free-solid-svg-icons';
 import { faCircle as farCircle } from '@fortawesome/free-regular-svg-icons';
 import * as maps from '../../../games/reversi/maps';
-import MkButton from '@/components/ui/button.vue';
-import MkSwitch from '@/components/ui/switch.vue';
-import MkRadio from '@/components/ui/radio.vue';
+import MkButton from '@client/components/ui/button.vue';
+import MkSwitch from '@client/components/ui/switch.vue';
+import MkRadio from '@client/components/ui/radio.vue';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/reversi/game.vue b/src/client/pages/reversi/game.vue
index ba750f43c7a286fb5129775ceb6ae651779cf24e..3a88b02583cd7c2327ee20f984c8a2254249a70b 100644
--- a/src/client/pages/reversi/game.vue
+++ b/src/client/pages/reversi/game.vue
@@ -8,7 +8,7 @@
 import { defineComponent } from 'vue';
 import GameSetting from './game.setting.vue';
 import GameBoard from './game.board.vue';
-import * as os from '@/os';
+import * as os from '@client/os';
 import { faGamepad } from '@fortawesome/free-solid-svg-icons';
 
 export default defineComponent({
diff --git a/src/client/pages/reversi/index.vue b/src/client/pages/reversi/index.vue
index 4b5d783f9ef6cde7259fdea40abb7c029b626e0b..f40990b37c5ee03cc950d10581b000f20c8e4bd3 100644
--- a/src/client/pages/reversi/index.vue
+++ b/src/client/pages/reversi/index.vue
@@ -61,9 +61,9 @@
 
 <script lang="ts">
 import { defineComponent } from 'vue';
-import * as os from '@/os';
-import MkButton from '@/components/ui/button.vue';
-import MkFolder from '@/components/ui/folder.vue';
+import * as os from '@client/os';
+import MkButton from '@client/components/ui/button.vue';
+import MkFolder from '@client/components/ui/folder.vue';
 import { faGamepad } from '@fortawesome/free-solid-svg-icons';
 
 export default defineComponent({
diff --git a/src/client/pages/room/preview.vue b/src/client/pages/room/preview.vue
index b0e600d4fb8543204577d98208505536fdca8852..0cb6bcf04cf5019bd792f342daa9e17f124c388a 100644
--- a/src/client/pages/room/preview.vue
+++ b/src/client/pages/room/preview.vue
@@ -5,7 +5,7 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import * as THREE from 'three';
-import * as os from '@/os';
+import * as os from '@client/os';
 
 export default defineComponent({
 	data() {
diff --git a/src/client/pages/room/room.vue b/src/client/pages/room/room.vue
index 25dfda1d14ad0360de198008ad85f60ca1f4db83..e6e2809725bf153c8b5e6c787bb5d180032a3ba2 100644
--- a/src/client/pages/room/room.vue
+++ b/src/client/pages/room/room.vue
@@ -51,18 +51,18 @@
 
 <script lang="ts">
 import { computed, defineComponent } from 'vue';
-import { Room } from '@/scripts/room/room';
-import parseAcct from '../../../misc/acct/parse';
+import { Room } from '@client/scripts/room/room';
+import parseAcct from '@/misc/acct/parse';
 import XPreview from './preview.vue';
-const storeItems = require('@/scripts/room/furnitures.json5');
+const storeItems = require('@client/scripts/room/furnitures.json5');
 import { faBoxOpen, faUndo, faArrowsAlt, faBan, faBroom } from '@fortawesome/free-solid-svg-icons';
 import { faSave, faTrashAlt } from '@fortawesome/free-regular-svg-icons';
 import { query as urlQuery } from '../../../prelude/url';
-import MkButton from '@/components/ui/button.vue';
-import MkSelect from '@/components/ui/select.vue';
-import { selectFile } from '@/scripts/select-file';
-import * as os from '@/os';
-import { ColdDeviceStorage } from '@/store';
+import MkButton from '@client/components/ui/button.vue';
+import MkSelect from '@client/components/ui/select.vue';
+import { selectFile } from '@client/scripts/select-file';
+import * as os from '@client/os';
+import { ColdDeviceStorage } from '@client/store';
 
 let room: Room;
 
diff --git a/src/client/pages/scratchpad.vue b/src/client/pages/scratchpad.vue
index 6ee7ec02fcf754873754956c11a0e169815a0727..febc9c50161093c16605d21a30fc1021b1558cfa 100644
--- a/src/client/pages/scratchpad.vue
+++ b/src/client/pages/scratchpad.vue
@@ -29,10 +29,10 @@ import 'prismjs/themes/prism-okaidia.css';
 import { PrismEditor } from 'vue-prism-editor';
 import 'vue-prism-editor/dist/prismeditor.min.css';
 import { AiScript, parse, utils, values } from '@syuilo/aiscript';
-import MkContainer from '@/components/ui/container.vue';
-import MkButton from '@/components/ui/button.vue';
-import { createAiScriptEnv } from '@/scripts/aiscript/api';
-import * as os from '@/os';
+import MkContainer from '@client/components/ui/container.vue';
+import MkButton from '@client/components/ui/button.vue';
+import { createAiScriptEnv } from '@client/scripts/aiscript/api';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/search.vue b/src/client/pages/search.vue
index 5e79531b20e3184e92d3b1727b06e5f593a64961..28d2aec9923490a6002fc25f11ca56513205a048 100644
--- a/src/client/pages/search.vue
+++ b/src/client/pages/search.vue
@@ -9,8 +9,8 @@
 <script lang="ts">
 import { computed, defineComponent } from 'vue';
 import { faSearch } from '@fortawesome/free-solid-svg-icons';
-import Progress from '@/scripts/loading';
-import XNotes from '@/components/notes.vue';
+import Progress from '@client/scripts/loading';
+import XNotes from '@client/components/notes.vue';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/settings/2fa.vue b/src/client/pages/settings/2fa.vue
index e7f97725af5379b937a9531413a467aee7a2fd25..48f1bc6e7bb649c1a3350377e364ec7d1ee1695b 100644
--- a/src/client/pages/settings/2fa.vue
+++ b/src/client/pages/settings/2fa.vue
@@ -69,16 +69,16 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import { faLock } from '@fortawesome/free-solid-svg-icons';
-import { hostname } from '@/config';
-import { byteify, hexify, stringify } from '@/scripts/2fa';
-import MkButton from '@/components/ui/button.vue';
-import MkInfo from '@/components/ui/info.vue';
-import MkInput from '@/components/ui/input.vue';
-import MkSwitch from '@/components/ui/switch.vue';
-import FormBase from '@/components/form/base.vue';
-import FormGroup from '@/components/form/group.vue';
-import FormButton from '@/components/form/button.vue';
-import * as os from '@/os';
+import { hostname } from '@client/config';
+import { byteify, hexify, stringify } from '@client/scripts/2fa';
+import MkButton from '@client/components/ui/button.vue';
+import MkInfo from '@client/components/ui/info.vue';
+import MkInput from '@client/components/ui/input.vue';
+import MkSwitch from '@client/components/ui/switch.vue';
+import FormBase from '@client/components/form/base.vue';
+import FormGroup from '@client/components/form/group.vue';
+import FormButton from '@client/components/form/button.vue';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/settings/account-info.vue b/src/client/pages/settings/account-info.vue
index f231bea22e0190f08d99df834830e8ab76936be3..1b8baadf4409fc01d6fb93a39e8271e240893f9a 100644
--- a/src/client/pages/settings/account-info.vue
+++ b/src/client/pages/settings/account-info.vue
@@ -133,16 +133,16 @@
 <script lang="ts">
 import { defineAsyncComponent, defineComponent } from 'vue';
 import { faInfoCircle } from '@fortawesome/free-solid-svg-icons';
-import FormSwitch from '@/components/form/switch.vue';
-import FormSelect from '@/components/form/select.vue';
-import FormLink from '@/components/form/link.vue';
-import FormBase from '@/components/form/base.vue';
-import FormGroup from '@/components/form/group.vue';
-import FormButton from '@/components/form/button.vue';
-import FormKeyValueView from '@/components/form/key-value-view.vue';
-import * as os from '@/os';
-import number from '@/filters/number';
-import bytes from '@/filters/bytes';
+import FormSwitch from '@client/components/form/switch.vue';
+import FormSelect from '@client/components/form/select.vue';
+import FormLink from '@client/components/form/link.vue';
+import FormBase from '@client/components/form/base.vue';
+import FormGroup from '@client/components/form/group.vue';
+import FormButton from '@client/components/form/button.vue';
+import FormKeyValueView from '@client/components/form/key-value-view.vue';
+import * as os from '@client/os';
+import number from '@client/filters/number';
+import bytes from '@client/filters/bytes';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/settings/api.vue b/src/client/pages/settings/api.vue
index b02a33b3f11844568a04f2df86726894f0e76134..da9ed88b55a9e3b6490147547d18c3c53b0cb68b 100644
--- a/src/client/pages/settings/api.vue
+++ b/src/client/pages/settings/api.vue
@@ -9,13 +9,13 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import { faKey } from '@fortawesome/free-solid-svg-icons';
-import FormSwitch from '@/components/form/switch.vue';
-import FormSelect from '@/components/form/select.vue';
-import FormLink from '@/components/form/link.vue';
-import FormBase from '@/components/form/base.vue';
-import FormGroup from '@/components/form/group.vue';
-import FormButton from '@/components/form/button.vue';
-import * as os from '@/os';
+import FormSwitch from '@client/components/form/switch.vue';
+import FormSelect from '@client/components/form/select.vue';
+import FormLink from '@client/components/form/link.vue';
+import FormBase from '@client/components/form/base.vue';
+import FormGroup from '@client/components/form/group.vue';
+import FormButton from '@client/components/form/button.vue';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
@@ -42,7 +42,7 @@ export default defineComponent({
 
 	methods: {
 		generateToken() {
-			os.popup(import('@/components/token-generate-window.vue'), {}, {
+			os.popup(import('@client/components/token-generate-window.vue'), {}, {
 				done: async result => {
 					const { name, permissions } = result;
 					const { token } = await os.api('miauth/gen-token', {
diff --git a/src/client/pages/settings/apps.vue b/src/client/pages/settings/apps.vue
index 3eb31ab5208e65801fe221ae7bb289c40a98ba66..d0fcacfaedd8f2319952fe292044347f04cb694a 100644
--- a/src/client/pages/settings/apps.vue
+++ b/src/client/pages/settings/apps.vue
@@ -40,13 +40,13 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import { faTrashAlt, faPlug } from '@fortawesome/free-solid-svg-icons';
-import FormPagination from '@/components/form/pagination.vue';
-import FormSelect from '@/components/form/select.vue';
-import FormLink from '@/components/form/link.vue';
-import FormBase from '@/components/form/base.vue';
-import FormGroup from '@/components/form/group.vue';
-import FormButton from '@/components/form/button.vue';
-import * as os from '@/os';
+import FormPagination from '@client/components/form/pagination.vue';
+import FormSelect from '@client/components/form/select.vue';
+import FormLink from '@client/components/form/link.vue';
+import FormBase from '@client/components/form/base.vue';
+import FormGroup from '@client/components/form/group.vue';
+import FormButton from '@client/components/form/button.vue';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/settings/deck.vue b/src/client/pages/settings/deck.vue
index cbc5edca940d15f45706855b08717211396f481c..ce4099db2e813f9d5e737e94ac3f4757cdd654fa 100644
--- a/src/client/pages/settings/deck.vue
+++ b/src/client/pages/settings/deck.vue
@@ -32,15 +32,15 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import { faImage, faCog, faColumns } from '@fortawesome/free-solid-svg-icons';
-import FormSwitch from '@/components/form/switch.vue';
-import FormLink from '@/components/form/link.vue';
-import FormRadios from '@/components/form/radios.vue';
-import FormInput from '@/components/form/input.vue';
-import FormBase from '@/components/form/base.vue';
-import FormGroup from '@/components/form/group.vue';
-import { deckStore } from '@/ui/deck/deck-store';
-import * as os from '@/os';
-import { unisonReload } from '@/scripts/unison-reload';
+import FormSwitch from '@client/components/form/switch.vue';
+import FormLink from '@client/components/form/link.vue';
+import FormRadios from '@client/components/form/radios.vue';
+import FormInput from '@client/components/form/input.vue';
+import FormBase from '@client/components/form/base.vue';
+import FormGroup from '@client/components/form/group.vue';
+import { deckStore } from '@client/ui/deck/deck-store';
+import * as os from '@client/os';
+import { unisonReload } from '@client/scripts/unison-reload';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/settings/drive.vue b/src/client/pages/settings/drive.vue
index 8ca8bc9eec96c9da1d56af098fe39a1bd923a3d2..4684d3b5544c9e25e0594e30957954e9c42bf36c 100644
--- a/src/client/pages/settings/drive.vue
+++ b/src/client/pages/settings/drive.vue
@@ -38,12 +38,12 @@ import * as tinycolor from 'tinycolor2';
 import ApexCharts from 'apexcharts';
 import { faCloud, faFolderOpen } from '@fortawesome/free-solid-svg-icons';
 import { faClock, faEyeSlash, faTrashAlt } from '@fortawesome/free-regular-svg-icons';
-import FormButton from '@/components/form/button.vue';
-import FormGroup from '@/components/form/group.vue';
-import FormKeyValueView from '@/components/form/key-value-view.vue';
-import FormBase from '@/components/form/base.vue';
-import * as os from '@/os';
-import bytes from '@/filters/bytes';
+import FormButton from '@client/components/form/button.vue';
+import FormGroup from '@client/components/form/group.vue';
+import FormKeyValueView from '@client/components/form/key-value-view.vue';
+import FormBase from '@client/components/form/base.vue';
+import * as os from '@client/os';
+import bytes from '@client/filters/bytes';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/settings/email-address.vue b/src/client/pages/settings/email-address.vue
index 8ca0f119c5d18fc15b8e213629044c60345bed63..56e9973aeba6bdd7e46b18b476f98e9c5abfe556 100644
--- a/src/client/pages/settings/email-address.vue
+++ b/src/client/pages/settings/email-address.vue
@@ -15,11 +15,11 @@
 import { defineComponent } from 'vue';
 import { faCog } from '@fortawesome/free-solid-svg-icons';
 import { faBell, faEnvelope } from '@fortawesome/free-regular-svg-icons';
-import FormButton from '@/components/form/button.vue';
-import FormInput from '@/components/form/input.vue';
-import FormBase from '@/components/form/base.vue';
-import FormGroup from '@/components/form/group.vue';
-import * as os from '@/os';
+import FormButton from '@client/components/form/button.vue';
+import FormInput from '@client/components/form/input.vue';
+import FormBase from '@client/components/form/base.vue';
+import FormGroup from '@client/components/form/group.vue';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/settings/email-notification.vue b/src/client/pages/settings/email-notification.vue
index de2cfd39129307bd04a569c0bd53c05b6f3551f8..5894b8475c3f20994572233d9df13976f55877ad 100644
--- a/src/client/pages/settings/email-notification.vue
+++ b/src/client/pages/settings/email-notification.vue
@@ -27,11 +27,11 @@
 import { defineComponent } from 'vue';
 import { faCog } from '@fortawesome/free-solid-svg-icons';
 import { faBell, faEnvelope } from '@fortawesome/free-regular-svg-icons';
-import FormButton from '@/components/form/button.vue';
-import FormSwitch from '@/components/form/switch.vue';
-import FormBase from '@/components/form/base.vue';
-import FormGroup from '@/components/form/group.vue';
-import * as os from '@/os';
+import FormButton from '@client/components/form/button.vue';
+import FormSwitch from '@client/components/form/switch.vue';
+import FormBase from '@client/components/form/base.vue';
+import FormGroup from '@client/components/form/group.vue';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/settings/email.vue b/src/client/pages/settings/email.vue
index e334e23cbd7d3fcb7f3b840a168334594ca90c5f..bd2e4634d191fc0520719b07bf75c281855ddb7c 100644
--- a/src/client/pages/settings/email.vue
+++ b/src/client/pages/settings/email.vue
@@ -24,12 +24,12 @@
 import { defineComponent } from 'vue';
 import { faCog, faExclamationTriangle, faCheck } from '@fortawesome/free-solid-svg-icons';
 import { faBell, faEnvelope } from '@fortawesome/free-regular-svg-icons';
-import FormButton from '@/components/form/button.vue';
-import FormLink from '@/components/form/link.vue';
-import FormBase from '@/components/form/base.vue';
-import FormGroup from '@/components/form/group.vue';
-import FormSwitch from '@/components/form/switch.vue';
-import * as os from '@/os';
+import FormButton from '@client/components/form/button.vue';
+import FormLink from '@client/components/form/link.vue';
+import FormBase from '@client/components/form/base.vue';
+import FormGroup from '@client/components/form/group.vue';
+import FormSwitch from '@client/components/form/switch.vue';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/settings/experimental-features.vue b/src/client/pages/settings/experimental-features.vue
index 39f1683af5f941700e9ee02264a63c359445e1a3..1cbda219d7fe3b1b6444332ba1465837cde4cbe0 100644
--- a/src/client/pages/settings/experimental-features.vue
+++ b/src/client/pages/settings/experimental-features.vue
@@ -7,14 +7,14 @@
 <script lang="ts">
 import { defineAsyncComponent, defineComponent } from 'vue';
 import { faFlask } from '@fortawesome/free-solid-svg-icons';
-import FormSwitch from '@/components/form/switch.vue';
-import FormSelect from '@/components/form/select.vue';
-import FormLink from '@/components/form/link.vue';
-import FormBase from '@/components/form/base.vue';
-import FormGroup from '@/components/form/group.vue';
-import FormButton from '@/components/form/button.vue';
-import FormKeyValueView from '@/components/form/key-value-view.vue';
-import * as os from '@/os';
+import FormSwitch from '@client/components/form/switch.vue';
+import FormSelect from '@client/components/form/select.vue';
+import FormLink from '@client/components/form/link.vue';
+import FormBase from '@client/components/form/base.vue';
+import FormGroup from '@client/components/form/group.vue';
+import FormButton from '@client/components/form/button.vue';
+import FormKeyValueView from '@client/components/form/key-value-view.vue';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/settings/general.vue b/src/client/pages/settings/general.vue
index 90ff3e2c2081988098831d9d418e44d03ffa07d7..6612fc0ca21ece8aae565833b7f3fb281187e669 100644
--- a/src/client/pages/settings/general.vue
+++ b/src/client/pages/settings/general.vue
@@ -85,19 +85,19 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import { faImage, faCog, faColumns, faCogs } from '@fortawesome/free-solid-svg-icons';
-import FormSwitch from '@/components/form/switch.vue';
-import FormSelect from '@/components/form/select.vue';
-import FormRadios from '@/components/form/radios.vue';
-import FormBase from '@/components/form/base.vue';
-import FormGroup from '@/components/form/group.vue';
-import FormLink from '@/components/form/link.vue';
-import FormButton from '@/components/form/button.vue';
-import MkLink from '@/components/link.vue';
-import { langs } from '@/config';
-import { defaultStore } from '@/store';
-import { ColdDeviceStorage } from '@/store';
-import * as os from '@/os';
-import { unisonReload } from '@/scripts/unison-reload';
+import FormSwitch from '@client/components/form/switch.vue';
+import FormSelect from '@client/components/form/select.vue';
+import FormRadios from '@client/components/form/radios.vue';
+import FormBase from '@client/components/form/base.vue';
+import FormGroup from '@client/components/form/group.vue';
+import FormLink from '@client/components/form/link.vue';
+import FormButton from '@client/components/form/button.vue';
+import MkLink from '@client/components/link.vue';
+import { langs } from '@client/config';
+import { defaultStore } from '@client/store';
+import { ColdDeviceStorage } from '@client/store';
+import * as os from '@client/os';
+import { unisonReload } from '@client/scripts/unison-reload';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/settings/import-export.vue b/src/client/pages/settings/import-export.vue
index 2e384bb7649e4874dbfbaf98b56e465db1474c23..2f80ef0c6df9bce9d8e8abf0f8347d2d4f732f16 100644
--- a/src/client/pages/settings/import-export.vue
+++ b/src/client/pages/settings/import-export.vue
@@ -28,12 +28,12 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import { faDownload, faUpload, faBoxes } from '@fortawesome/free-solid-svg-icons';
-import FormSelect from '@/components/form/select.vue';
-import FormButton from '@/components/form/button.vue';
-import FormBase from '@/components/form/base.vue';
-import FormGroup from '@/components/form/group.vue';
-import * as os from '@/os';
-import { selectFile } from '@/scripts/select-file';
+import FormSelect from '@client/components/form/select.vue';
+import FormButton from '@client/components/form/button.vue';
+import FormBase from '@client/components/form/base.vue';
+import FormGroup from '@client/components/form/group.vue';
+import * as os from '@client/os';
+import { selectFile } from '@client/scripts/select-file';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/settings/index.vue b/src/client/pages/settings/index.vue
index 1b4aa70eca34cda7be12b4a6acd5039ec892027c..300035671340941a18890f6cea219b7701ca7fb2 100644
--- a/src/client/pages/settings/index.vue
+++ b/src/client/pages/settings/index.vue
@@ -45,14 +45,14 @@
 import { computed, defineAsyncComponent, defineComponent, nextTick, onMounted, reactive, ref, watch } from 'vue';
 import { faCog, faPalette, faPlug, faUser, faListUl, faLock, faCommentSlash, faMusic, faCogs, faEllipsisH, faBan, faShareAlt, faLockOpen, faKey, faBoxes, faCloud } from '@fortawesome/free-solid-svg-icons';
 import { faLaugh, faBell, faEnvelope } from '@fortawesome/free-regular-svg-icons';
-import { i18n } from '@/i18n';
-import FormLink from '@/components/form/link.vue';
-import FormGroup from '@/components/form/group.vue';
-import FormBase from '@/components/form/base.vue';
-import FormButton from '@/components/form/button.vue';
-import { scroll } from '@/scripts/scroll';
-import { signout } from '@/account';
-import { unisonReload } from '@/scripts/unison-reload';
+import { i18n } from '@client/i18n';
+import FormLink from '@client/components/form/link.vue';
+import FormGroup from '@client/components/form/group.vue';
+import FormBase from '@client/components/form/base.vue';
+import FormButton from '@client/components/form/button.vue';
+import { scroll } from '@client/scripts/scroll';
+import { signout } from '@client/account';
+import { unisonReload } from '@client/scripts/unison-reload';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/settings/integration.vue b/src/client/pages/settings/integration.vue
index 2e4d186bc461741150a48250aadc9a262ccb7b1e..e2ab11841eb6f3355e0151e09ce23e99a014d4ac 100644
--- a/src/client/pages/settings/integration.vue
+++ b/src/client/pages/settings/integration.vue
@@ -33,10 +33,10 @@
 import { defineComponent } from 'vue';
 import { faShareAlt } from '@fortawesome/free-solid-svg-icons';
 import { faTwitter, faDiscord, faGithub } from '@fortawesome/free-brands-svg-icons';
-import { apiUrl } from '@/config';
-import FormBase from '@/components/form/base.vue';
-import MkButton from '@/components/ui/button.vue';
-import * as os from '@/os';
+import { apiUrl } from '@client/config';
+import FormBase from '@client/components/form/base.vue';
+import MkButton from '@client/components/ui/button.vue';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/settings/mute-block.vue b/src/client/pages/settings/mute-block.vue
index fc735cae109fe52f5ec26de2cdd1c40da206b277..f7eebbb9cce8ecfa25ba1bce96397e2ff4e1e893 100644
--- a/src/client/pages/settings/mute-block.vue
+++ b/src/client/pages/settings/mute-block.vue
@@ -34,14 +34,14 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import { faBan } from '@fortawesome/free-solid-svg-icons';
-import MkPagination from '@/components/ui/pagination.vue';
-import MkTab from '@/components/tab.vue';
-import MkInfo from '@/components/ui/info.vue';
-import FormLink from '@/components/form/link.vue';
-import FormBase from '@/components/form/base.vue';
-import FormGroup from '@/components/form/group.vue';
-import { userPage } from '@/filters/user';
-import * as os from '@/os';
+import MkPagination from '@client/components/ui/pagination.vue';
+import MkTab from '@client/components/tab.vue';
+import MkInfo from '@client/components/ui/info.vue';
+import FormLink from '@client/components/form/link.vue';
+import FormBase from '@client/components/form/base.vue';
+import FormGroup from '@client/components/form/group.vue';
+import { userPage } from '@client/filters/user';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/settings/notifications.vue b/src/client/pages/settings/notifications.vue
index c3b7ecae11516bb894d86ff6dc3895ed7b232a41..b26c2805aded963089a85efdd983de01e305c92c 100644
--- a/src/client/pages/settings/notifications.vue
+++ b/src/client/pages/settings/notifications.vue
@@ -13,12 +13,12 @@
 import { defineComponent } from 'vue';
 import { faCog } from '@fortawesome/free-solid-svg-icons';
 import { faBell } from '@fortawesome/free-regular-svg-icons';
-import FormButton from '@/components/form/button.vue';
-import FormLink from '@/components/form/link.vue';
-import FormBase from '@/components/form/base.vue';
-import FormGroup from '@/components/form/group.vue';
+import FormButton from '@client/components/form/button.vue';
+import FormLink from '@client/components/form/link.vue';
+import FormBase from '@client/components/form/base.vue';
+import FormGroup from '@client/components/form/group.vue';
 import { notificationTypes } from '../../../types';
-import * as os from '@/os';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
@@ -59,7 +59,7 @@ export default defineComponent({
 
 		configure() {
 			const includingTypes = notificationTypes.filter(x => !this.$i.mutingNotificationTypes.includes(x));
-			os.popup(import('@/components/notification-setting-window.vue'), {
+			os.popup(import('@client/components/notification-setting-window.vue'), {
 				includingTypes,
 				showGlobalToggle: false,
 			}, {
diff --git a/src/client/pages/settings/other.vue b/src/client/pages/settings/other.vue
index a14e101328dbb72ca4a600719b4e52258afc6977..e5cfc5ee1e7948d7bf1bd8509e864cccc64079ee 100644
--- a/src/client/pages/settings/other.vue
+++ b/src/client/pages/settings/other.vue
@@ -33,17 +33,17 @@
 <script lang="ts">
 import { defineAsyncComponent, defineComponent } from 'vue';
 import { faEllipsisH, faCogs, faDoorOpen } from '@fortawesome/free-solid-svg-icons';
-import FormSwitch from '@/components/form/switch.vue';
-import FormSelect from '@/components/form/select.vue';
-import FormLink from '@/components/form/link.vue';
-import FormBase from '@/components/form/base.vue';
-import FormGroup from '@/components/form/group.vue';
-import FormButton from '@/components/form/button.vue';
-import * as os from '@/os';
-import { debug } from '@/config';
-import { defaultStore } from '@/store';
-import { signout } from '@/account';
-import { unisonReload } from '@/scripts/unison-reload';
+import FormSwitch from '@client/components/form/switch.vue';
+import FormSelect from '@client/components/form/select.vue';
+import FormLink from '@client/components/form/link.vue';
+import FormBase from '@client/components/form/base.vue';
+import FormGroup from '@client/components/form/group.vue';
+import FormButton from '@client/components/form/button.vue';
+import * as os from '@client/os';
+import { debug } from '@client/config';
+import { defaultStore } from '@client/store';
+import { signout } from '@client/account';
+import { unisonReload } from '@client/scripts/unison-reload';
 
 export default defineComponent({
 	components: {
@@ -90,7 +90,7 @@ export default defineComponent({
 		},
 
 		taskmanager() {
-			os.popup(import('@/components/taskmanager.vue'), {
+			os.popup(import('@client/components/taskmanager.vue'), {
 			}, {}, 'closed');
 		},
 
diff --git a/src/client/pages/settings/plugin.install.vue b/src/client/pages/settings/plugin.install.vue
index 0f6393f73c24dd4dba449700c484d7d9c66c3764..70c302b36e590eb89ed2afe4d779e908d94b4d82 100644
--- a/src/client/pages/settings/plugin.install.vue
+++ b/src/client/pages/settings/plugin.install.vue
@@ -18,17 +18,17 @@ import { faPalette, faDownload, faFolderOpen, faCheck, faTrashAlt, faEye } from
 import { AiScript, parse } from '@syuilo/aiscript';
 import { serialize } from '@syuilo/aiscript/built/serializer';
 import { v4 as uuid } from 'uuid';
-import FormTextarea from '@/components/form/textarea.vue';
-import FormSelect from '@/components/form/select.vue';
-import FormRadios from '@/components/form/radios.vue';
-import FormBase from '@/components/form/base.vue';
-import FormGroup from '@/components/form/group.vue';
-import FormLink from '@/components/form/link.vue';
-import FormButton from '@/components/form/button.vue';
-import MkInfo from '@/components/ui/info.vue';
-import * as os from '@/os';
-import { ColdDeviceStorage } from '@/store';
-import { unisonReload } from '@/scripts/unison-reload';
+import FormTextarea from '@client/components/form/textarea.vue';
+import FormSelect from '@client/components/form/select.vue';
+import FormRadios from '@client/components/form/radios.vue';
+import FormBase from '@client/components/form/base.vue';
+import FormGroup from '@client/components/form/group.vue';
+import FormLink from '@client/components/form/link.vue';
+import FormButton from '@client/components/form/button.vue';
+import MkInfo from '@client/components/ui/info.vue';
+import * as os from '@client/os';
+import { ColdDeviceStorage } from '@client/store';
+import { unisonReload } from '@client/scripts/unison-reload';
 
 export default defineComponent({
 	components: {
@@ -108,7 +108,7 @@ export default defineComponent({
 			}
 
 			const token = permissions == null || permissions.length === 0 ? null : await new Promise((res, rej) => {
-				os.popup(import('@/components/token-generate-window.vue'), {
+				os.popup(import('@client/components/token-generate-window.vue'), {
 					title: this.$ts.tokenRequested,
 					information: this.$ts.pluginTokenRequestedDescription,
 					initialName: name,
diff --git a/src/client/pages/settings/plugin.manage.vue b/src/client/pages/settings/plugin.manage.vue
index 5fd93d8b72aa3b301c8b030c0bc44570e30c699f..0bc04493a79fd556a45925108d33b7242e78e74c 100644
--- a/src/client/pages/settings/plugin.manage.vue
+++ b/src/client/pages/settings/plugin.manage.vue
@@ -33,15 +33,15 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import { faPlug, faSave, faTrashAlt, faFolderOpen, faDownload, faCog } from '@fortawesome/free-solid-svg-icons';
-import MkButton from '@/components/ui/button.vue';
-import MkTextarea from '@/components/ui/textarea.vue';
-import MkSelect from '@/components/ui/select.vue';
-import MkInfo from '@/components/ui/info.vue';
-import FormSwitch from '@/components/form/switch.vue';
-import FormBase from '@/components/form/base.vue';
-import FormGroup from '@/components/form/group.vue';
-import * as os from '@/os';
-import { ColdDeviceStorage } from '@/store';
+import MkButton from '@client/components/ui/button.vue';
+import MkTextarea from '@client/components/ui/textarea.vue';
+import MkSelect from '@client/components/ui/select.vue';
+import MkInfo from '@client/components/ui/info.vue';
+import FormSwitch from '@client/components/form/switch.vue';
+import FormBase from '@client/components/form/base.vue';
+import FormGroup from '@client/components/form/group.vue';
+import * as os from '@client/os';
+import { ColdDeviceStorage } from '@client/store';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/settings/plugin.vue b/src/client/pages/settings/plugin.vue
index fecb99bfe149dd178f95e332c35ed8e0712828e1..b101420d0dae2179bad6c76550ad79d283831de4 100644
--- a/src/client/pages/settings/plugin.vue
+++ b/src/client/pages/settings/plugin.vue
@@ -8,11 +8,11 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import { faPlug, faSave, faTrashAlt, faFolderOpen, faDownload, faCog } from '@fortawesome/free-solid-svg-icons';
-import FormBase from '@/components/form/base.vue';
-import FormGroup from '@/components/form/group.vue';
-import FormLink from '@/components/form/link.vue';
-import * as os from '@/os';
-import { ColdDeviceStorage } from '@/store';
+import FormBase from '@client/components/form/base.vue';
+import FormGroup from '@client/components/form/group.vue';
+import FormLink from '@client/components/form/link.vue';
+import * as os from '@client/os';
+import { ColdDeviceStorage } from '@client/store';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/settings/privacy.vue b/src/client/pages/settings/privacy.vue
index 9c5fb0850c04180ed312e1d14588f64e631f2b92..f58faab0b582a431823e0872977e3e1acab76c29 100644
--- a/src/client/pages/settings/privacy.vue
+++ b/src/client/pages/settings/privacy.vue
@@ -30,12 +30,12 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import { faLockOpen } from '@fortawesome/free-solid-svg-icons';
-import FormSwitch from '@/components/form/switch.vue';
-import FormSelect from '@/components/form/select.vue';
-import FormBase from '@/components/form/base.vue';
-import FormGroup from '@/components/form/group.vue';
-import * as os from '@/os';
-import { defaultStore } from '@/store';
+import FormSwitch from '@client/components/form/switch.vue';
+import FormSelect from '@client/components/form/select.vue';
+import FormBase from '@client/components/form/base.vue';
+import FormGroup from '@client/components/form/group.vue';
+import * as os from '@client/os';
+import { defaultStore } from '@client/store';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/settings/profile.vue b/src/client/pages/settings/profile.vue
index e9bffc3b0037cbed83b59497bbaf10659069f829..61f0a8e1987831da9dd68fb6c092d10bfae7367e 100644
--- a/src/client/pages/settings/profile.vue
+++ b/src/client/pages/settings/profile.vue
@@ -49,16 +49,16 @@
 import { defineComponent } from 'vue';
 import { faUnlockAlt, faCogs, faUser, faMapMarkerAlt, faBirthdayCake } from '@fortawesome/free-solid-svg-icons';
 import { faSave } from '@fortawesome/free-regular-svg-icons';
-import FormButton from '@/components/form/button.vue';
-import FormInput from '@/components/form/input.vue';
-import FormTextarea from '@/components/form/textarea.vue';
-import FormSwitch from '@/components/form/switch.vue';
-import FormSelect from '@/components/form/select.vue';
-import FormBase from '@/components/form/base.vue';
-import FormGroup from '@/components/form/group.vue';
-import { host, langs } from '@/config';
-import { selectFile } from '@/scripts/select-file';
-import * as os from '@/os';
+import FormButton from '@client/components/form/button.vue';
+import FormInput from '@client/components/form/input.vue';
+import FormTextarea from '@client/components/form/textarea.vue';
+import FormSwitch from '@client/components/form/switch.vue';
+import FormSelect from '@client/components/form/select.vue';
+import FormBase from '@client/components/form/base.vue';
+import FormGroup from '@client/components/form/group.vue';
+import { host, langs } from '@client/config';
+import { selectFile } from '@client/scripts/select-file';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/settings/reaction.vue b/src/client/pages/settings/reaction.vue
index 4488e50051283677ab43d9a5ecb746d6a1dbbe95..170f8c9a0aa8ceedc8ee7a03fdc49ebfd120ff7a 100644
--- a/src/client/pages/settings/reaction.vue
+++ b/src/client/pages/settings/reaction.vue
@@ -39,12 +39,12 @@ import { defineComponent } from 'vue';
 import { faLaugh, faSave, faEye } from '@fortawesome/free-regular-svg-icons';
 import { faUndo, faPlus } from '@fortawesome/free-solid-svg-icons';
 import XDraggable from 'vuedraggable';
-import FormInput from '@/components/form/input.vue';
-import FormRadios from '@/components/form/radios.vue';
-import FormBase from '@/components/form/base.vue';
-import FormButton from '@/components/form/button.vue';
-import * as os from '@/os';
-import { defaultStore } from '@/store';
+import FormInput from '@client/components/form/input.vue';
+import FormRadios from '@client/components/form/radios.vue';
+import FormBase from '@client/components/form/base.vue';
+import FormButton from '@client/components/form/button.vue';
+import * as os from '@client/os';
+import { defaultStore } from '@client/store';
 
 export default defineComponent({
 	components: {
@@ -105,7 +105,7 @@ export default defineComponent({
 		},
 
 		preview(ev) {
-			os.popup(import('@/components/emoji-picker-dialog.vue'), {
+			os.popup(import('@client/components/emoji-picker-dialog.vue'), {
 				asReactionPicker: true,
 				src: ev.currentTarget || ev.target,
 			}, {}, 'closed');
diff --git a/src/client/pages/settings/registry.keys.vue b/src/client/pages/settings/registry.keys.vue
index c7a90fb4618f5920762b746b39b2cade6da0b885..243672000b77b664dc128833a5eac3f9642b5ede 100644
--- a/src/client/pages/settings/registry.keys.vue
+++ b/src/client/pages/settings/registry.keys.vue
@@ -24,15 +24,15 @@
 import { defineAsyncComponent, defineComponent } from 'vue';
 import { faCogs } from '@fortawesome/free-solid-svg-icons';
 import * as JSON5 from 'json5';
-import MkInfo from '@/components/ui/info.vue';
-import FormSwitch from '@/components/form/switch.vue';
-import FormSelect from '@/components/form/select.vue';
-import FormLink from '@/components/form/link.vue';
-import FormBase from '@/components/form/base.vue';
-import FormGroup from '@/components/form/group.vue';
-import FormButton from '@/components/form/button.vue';
-import FormKeyValueView from '@/components/form/key-value-view.vue';
-import * as os from '@/os';
+import MkInfo from '@client/components/ui/info.vue';
+import FormSwitch from '@client/components/form/switch.vue';
+import FormSelect from '@client/components/form/select.vue';
+import FormLink from '@client/components/form/link.vue';
+import FormBase from '@client/components/form/base.vue';
+import FormGroup from '@client/components/form/group.vue';
+import FormButton from '@client/components/form/button.vue';
+import FormKeyValueView from '@client/components/form/key-value-view.vue';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/settings/registry.value.vue b/src/client/pages/settings/registry.value.vue
index 943ededd21b28ae89012a86d20c0743131c81fb0..e760e4b1e50e5f65ca29429f1d063531ec9d325a 100644
--- a/src/client/pages/settings/registry.value.vue
+++ b/src/client/pages/settings/registry.value.vue
@@ -39,15 +39,15 @@
 import { defineAsyncComponent, defineComponent } from 'vue';
 import { faCogs, faSave, faTrash } from '@fortawesome/free-solid-svg-icons';
 import * as JSON5 from 'json5';
-import MkInfo from '@/components/ui/info.vue';
-import FormSwitch from '@/components/form/switch.vue';
-import FormSelect from '@/components/form/select.vue';
-import FormTextarea from '@/components/form/textarea.vue';
-import FormBase from '@/components/form/base.vue';
-import FormGroup from '@/components/form/group.vue';
-import FormButton from '@/components/form/button.vue';
-import FormKeyValueView from '@/components/form/key-value-view.vue';
-import * as os from '@/os';
+import MkInfo from '@client/components/ui/info.vue';
+import FormSwitch from '@client/components/form/switch.vue';
+import FormSelect from '@client/components/form/select.vue';
+import FormTextarea from '@client/components/form/textarea.vue';
+import FormBase from '@client/components/form/base.vue';
+import FormGroup from '@client/components/form/group.vue';
+import FormButton from '@client/components/form/button.vue';
+import FormKeyValueView from '@client/components/form/key-value-view.vue';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/settings/registry.vue b/src/client/pages/settings/registry.vue
index a43c98e730be8cb4b73e3b6175a6bff41b50cbd2..5e061f95f889d427585baa1a7bd0247ef88684b3 100644
--- a/src/client/pages/settings/registry.vue
+++ b/src/client/pages/settings/registry.vue
@@ -12,15 +12,15 @@
 import { defineAsyncComponent, defineComponent } from 'vue';
 import { faCogs } from '@fortawesome/free-solid-svg-icons';
 import * as JSON5 from 'json5';
-import MkInfo from '@/components/ui/info.vue';
-import FormSwitch from '@/components/form/switch.vue';
-import FormSelect from '@/components/form/select.vue';
-import FormLink from '@/components/form/link.vue';
-import FormBase from '@/components/form/base.vue';
-import FormGroup from '@/components/form/group.vue';
-import FormButton from '@/components/form/button.vue';
-import FormKeyValueView from '@/components/form/key-value-view.vue';
-import * as os from '@/os';
+import MkInfo from '@client/components/ui/info.vue';
+import FormSwitch from '@client/components/form/switch.vue';
+import FormSelect from '@client/components/form/select.vue';
+import FormLink from '@client/components/form/link.vue';
+import FormBase from '@client/components/form/base.vue';
+import FormGroup from '@client/components/form/group.vue';
+import FormButton from '@client/components/form/button.vue';
+import FormKeyValueView from '@client/components/form/key-value-view.vue';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/settings/security.vue b/src/client/pages/settings/security.vue
index cdb5705c0b094a904956dc7b4918b3196ccdff7a..7d6aaa652f6aff40485d4609710932675fdf41a7 100644
--- a/src/client/pages/settings/security.vue
+++ b/src/client/pages/settings/security.vue
@@ -26,12 +26,12 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import { faCheck, faTimesCircle, faLock, faSyncAlt, faMobileAlt } from '@fortawesome/free-solid-svg-icons';
-import FormBase from '@/components/form/base.vue';
-import FormLink from '@/components/form/link.vue';
-import FormGroup from '@/components/form/group.vue';
-import FormButton from '@/components/form/button.vue';
-import FormPagination from '@/components/form/pagination.vue';
-import * as os from '@/os';
+import FormBase from '@client/components/form/base.vue';
+import FormLink from '@client/components/form/link.vue';
+import FormGroup from '@client/components/form/group.vue';
+import FormButton from '@client/components/form/button.vue';
+import FormPagination from '@client/components/form/pagination.vue';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/settings/sidebar.vue b/src/client/pages/settings/sidebar.vue
index 51f2ba17e1c9f75f57147b2b49250c6939fb28bc..bbb1b43afbf81b60350adfb487242e6426f2e157 100644
--- a/src/client/pages/settings/sidebar.vue
+++ b/src/client/pages/settings/sidebar.vue
@@ -20,15 +20,15 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import { faListUl, faSave, faRedo } from '@fortawesome/free-solid-svg-icons';
-import FormSwitch from '@/components/form/switch.vue';
-import FormTextarea from '@/components/form/textarea.vue';
-import FormRadios from '@/components/form/radios.vue';
-import FormBase from '@/components/form/base.vue';
-import FormGroup from '@/components/form/group.vue';
-import FormButton from '@/components/form/button.vue';
-import * as os from '@/os';
-import { sidebarDef } from '@/sidebar';
-import { defaultStore } from '@/store';
+import FormSwitch from '@client/components/form/switch.vue';
+import FormTextarea from '@client/components/form/textarea.vue';
+import FormRadios from '@client/components/form/radios.vue';
+import FormBase from '@client/components/form/base.vue';
+import FormGroup from '@client/components/form/group.vue';
+import FormButton from '@client/components/form/button.vue';
+import * as os from '@client/os';
+import { sidebarDef } from '@client/sidebar';
+import { defaultStore } from '@client/store';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/settings/sounds.vue b/src/client/pages/settings/sounds.vue
index c53968da4b6e3f805e57efb209df9f87edbcd981..830574410931081331b21e06208f7d848ad476ed 100644
--- a/src/client/pages/settings/sounds.vue
+++ b/src/client/pages/settings/sounds.vue
@@ -20,14 +20,14 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import { faMusic, faPlay, faVolumeUp, faVolumeMute, faChevronDown, faRedo } from '@fortawesome/free-solid-svg-icons';
-import FormRange from '@/components/form/range.vue';
-import FormSelect from '@/components/form/select.vue';
-import FormBase from '@/components/form/base.vue';
-import FormButton from '@/components/form/button.vue';
-import FormGroup from '@/components/form/group.vue';
-import * as os from '@/os';
-import { ColdDeviceStorage } from '@/store';
-import { playFile } from '@/scripts/sound';
+import FormRange from '@client/components/form/range.vue';
+import FormSelect from '@client/components/form/select.vue';
+import FormBase from '@client/components/form/base.vue';
+import FormButton from '@client/components/form/button.vue';
+import FormGroup from '@client/components/form/group.vue';
+import * as os from '@client/os';
+import { ColdDeviceStorage } from '@client/store';
+import { playFile } from '@client/scripts/sound';
 
 const soundsTypes = [
 	null,
diff --git a/src/client/pages/settings/theme.install.vue b/src/client/pages/settings/theme.install.vue
index 852d39f78b1e78022e284fc27d25c3f2e0c2cf54..61843836576457c7bb00e7994f81e725e1782f91 100644
--- a/src/client/pages/settings/theme.install.vue
+++ b/src/client/pages/settings/theme.install.vue
@@ -15,17 +15,17 @@
 import { defineComponent } from 'vue';
 import { faPalette, faDownload, faFolderOpen, faCheck, faTrashAlt, faEye } from '@fortawesome/free-solid-svg-icons';
 import * as JSON5 from 'json5';
-import FormTextarea from '@/components/form/textarea.vue';
-import FormSelect from '@/components/form/select.vue';
-import FormRadios from '@/components/form/radios.vue';
-import FormBase from '@/components/form/base.vue';
-import FormGroup from '@/components/form/group.vue';
-import FormLink from '@/components/form/link.vue';
-import FormButton from '@/components/form/button.vue';
-import { applyTheme, validateTheme } from '@/scripts/theme';
-import * as os from '@/os';
-import { ColdDeviceStorage } from '@/store';
-import { addTheme, getThemes } from '@/theme-store';
+import FormTextarea from '@client/components/form/textarea.vue';
+import FormSelect from '@client/components/form/select.vue';
+import FormRadios from '@client/components/form/radios.vue';
+import FormBase from '@client/components/form/base.vue';
+import FormGroup from '@client/components/form/group.vue';
+import FormLink from '@client/components/form/link.vue';
+import FormButton from '@client/components/form/button.vue';
+import { applyTheme, validateTheme } from '@client/scripts/theme';
+import * as os from '@client/os';
+import { ColdDeviceStorage } from '@client/store';
+import { addTheme, getThemes } from '@client/theme-store';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/settings/theme.manage.vue b/src/client/pages/settings/theme.manage.vue
index f08c3547189a9046f7420f0e1888a5f979d263a8..da7bb27030cddfc7b7a6e956153575ad87b1c650 100644
--- a/src/client/pages/settings/theme.manage.vue
+++ b/src/client/pages/settings/theme.manage.vue
@@ -26,18 +26,18 @@
 import { defineComponent } from 'vue';
 import { faPalette, faDownload, faFolderOpen, faCheck, faTrashAlt, faEye } from '@fortawesome/free-solid-svg-icons';
 import * as JSON5 from 'json5';
-import FormTextarea from '@/components/form/textarea.vue';
-import FormSelect from '@/components/form/select.vue';
-import FormRadios from '@/components/form/radios.vue';
-import FormBase from '@/components/form/base.vue';
-import FormGroup from '@/components/form/group.vue';
-import FormInput from '@/components/form/input.vue';
-import FormButton from '@/components/form/button.vue';
-import { Theme, builtinThemes } from '@/scripts/theme';
-import copyToClipboard from '@/scripts/copy-to-clipboard';
-import * as os from '@/os';
-import { ColdDeviceStorage } from '@/store';
-import { getThemes, removeTheme } from '@/theme-store';
+import FormTextarea from '@client/components/form/textarea.vue';
+import FormSelect from '@client/components/form/select.vue';
+import FormRadios from '@client/components/form/radios.vue';
+import FormBase from '@client/components/form/base.vue';
+import FormGroup from '@client/components/form/group.vue';
+import FormInput from '@client/components/form/input.vue';
+import FormButton from '@client/components/form/button.vue';
+import { Theme, builtinThemes } from '@client/scripts/theme';
+import copyToClipboard from '@client/scripts/copy-to-clipboard';
+import * as os from '@client/os';
+import { ColdDeviceStorage } from '@client/store';
+import { getThemes, removeTheme } from '@client/theme-store';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/settings/theme.vue b/src/client/pages/settings/theme.vue
index ac57c51df4826a8b78430f38f1b6412b66bfc6fd..14cdb533ac4c164ccfb49f3eb54fc4c5aa04a496 100644
--- a/src/client/pages/settings/theme.vue
+++ b/src/client/pages/settings/theme.vue
@@ -65,19 +65,19 @@
 <script lang="ts">
 import { computed, defineComponent, onMounted, ref, watch } from 'vue';
 import { faPalette, faDownload, faFolderOpen, faCheck, faTrashAlt, faEye, faGlobe, faPaintRoller } from '@fortawesome/free-solid-svg-icons';
-import FormSwitch from '@/components/form/switch.vue';
-import FormSelect from '@/components/form/select.vue';
-import FormBase from '@/components/form/base.vue';
-import FormGroup from '@/components/form/group.vue';
-import FormLink from '@/components/form/link.vue';
-import FormButton from '@/components/form/button.vue';
-import { builtinThemes, applyTheme } from '@/scripts/theme';
-import { selectFile } from '@/scripts/select-file';
-import { isDeviceDarkmode } from '@/scripts/is-device-darkmode';
-import { ColdDeviceStorage } from '@/store';
-import { i18n } from '@/i18n';
-import { defaultStore } from '@/store';
-import { fetchThemes, getThemes } from '@/theme-store';
+import FormSwitch from '@client/components/form/switch.vue';
+import FormSelect from '@client/components/form/select.vue';
+import FormBase from '@client/components/form/base.vue';
+import FormGroup from '@client/components/form/group.vue';
+import FormLink from '@client/components/form/link.vue';
+import FormButton from '@client/components/form/button.vue';
+import { builtinThemes, applyTheme } from '@client/scripts/theme';
+import { selectFile } from '@client/scripts/select-file';
+import { isDeviceDarkmode } from '@client/scripts/is-device-darkmode';
+import { ColdDeviceStorage } from '@client/store';
+import { i18n } from '@client/i18n';
+import { defaultStore } from '@client/store';
+import { fetchThemes, getThemes } from '@client/theme-store';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/settings/update.vue b/src/client/pages/settings/update.vue
index d172ceb10a4261be47431caac43cae01704d3d5a..a8da8bf11c8bf29eba26a1ffe13c934566b7954d 100644
--- a/src/client/pages/settings/update.vue
+++ b/src/client/pages/settings/update.vue
@@ -31,16 +31,16 @@
 <script lang="ts">
 import { defineAsyncComponent, defineComponent } from 'vue';
 import { faInfoCircle, faSyncAlt } from '@fortawesome/free-solid-svg-icons';
-import FormSwitch from '@/components/form/switch.vue';
-import FormSelect from '@/components/form/select.vue';
-import FormLink from '@/components/form/link.vue';
-import FormBase from '@/components/form/base.vue';
-import FormGroup from '@/components/form/group.vue';
-import FormButton from '@/components/form/button.vue';
-import FormKeyValueView from '@/components/form/key-value-view.vue';
-import MkInfo from '@/components/ui/info.vue';
-import * as os from '@/os';
-import { version, instanceName } from '@/config';
+import FormSwitch from '@client/components/form/switch.vue';
+import FormSelect from '@client/components/form/select.vue';
+import FormLink from '@client/components/form/link.vue';
+import FormBase from '@client/components/form/base.vue';
+import FormGroup from '@client/components/form/group.vue';
+import FormButton from '@client/components/form/button.vue';
+import FormKeyValueView from '@client/components/form/key-value-view.vue';
+import MkInfo from '@client/components/ui/info.vue';
+import * as os from '@client/os';
+import { version, instanceName } from '@client/config';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/settings/word-mute.vue b/src/client/pages/settings/word-mute.vue
index 38dbc2c6297a3b60e8170fc025f0ce914f54bdcb..26cc7a3d853a0a2a43be399abb34428b83a1f108 100644
--- a/src/client/pages/settings/word-mute.vue
+++ b/src/client/pages/settings/word-mute.vue
@@ -33,14 +33,14 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import { faCommentSlash, faSave } from '@fortawesome/free-solid-svg-icons';
-import FormTextarea from '@/components/form/textarea.vue';
-import FormBase from '@/components/form/base.vue';
-import FormKeyValueView from '@/components/form/key-value-view.vue';
-import FormButton from '@/components/form/button.vue';
-import MkTab from '@/components/tab.vue';
-import MkInfo from '@/components/ui/info.vue';
-import * as os from '@/os';
-import number from '@/filters/number';
+import FormTextarea from '@client/components/form/textarea.vue';
+import FormBase from '@client/components/form/base.vue';
+import FormKeyValueView from '@client/components/form/key-value-view.vue';
+import FormButton from '@client/components/form/button.vue';
+import MkTab from '@client/components/tab.vue';
+import MkInfo from '@client/components/ui/info.vue';
+import * as os from '@client/os';
+import number from '@client/filters/number';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/share.vue b/src/client/pages/share.vue
index 7912e5421fbb1fb70db1e43491196645db988a76..41ce4d21f7d6c232b58315e7da60db9c8bb6ecef 100644
--- a/src/client/pages/share.vue
+++ b/src/client/pages/share.vue
@@ -14,9 +14,9 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import { faShareAlt } from '@fortawesome/free-solid-svg-icons';
-import MkButton from '@/components/ui/button.vue';
-import XPostForm from '@/components/post-form.vue';
-import * as os from '@/os';
+import MkButton from '@client/components/ui/button.vue';
+import XPostForm from '@client/components/post-form.vue';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/tag.vue b/src/client/pages/tag.vue
index 910e7cd02884fa8222fe7418d1bcda3fa00456c9..7561eba2ed84b0367b563192b18b4e97534de28b 100644
--- a/src/client/pages/tag.vue
+++ b/src/client/pages/tag.vue
@@ -7,8 +7,8 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import { faHashtag } from '@fortawesome/free-solid-svg-icons';
-import Progress from '@/scripts/loading';
-import XNotes from '@/components/notes.vue';
+import Progress from '@client/scripts/loading';
+import XNotes from '@client/components/notes.vue';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/test.vue b/src/client/pages/test.vue
index 2f890e78a68eeb56a9859cc7aa21a057a75dfb61..af8395b2c3761b9e857ac9ea6f5ab56e3fb4483d 100644
--- a/src/client/pages/test.vue
+++ b/src/client/pages/test.vue
@@ -133,12 +133,12 @@
 <script lang="ts">
 import { defineComponent, defineAsyncComponent } from 'vue';
 import { faExclamationTriangle } from '@fortawesome/free-solid-svg-icons';
-import MkButton from '@/components/ui/button.vue';
-import MkInput from '@/components/ui/input.vue';
-import MkSwitch from '@/components/ui/switch.vue';
-import MkTextarea from '@/components/ui/textarea.vue';
-import MkRadio from '@/components/ui/radio.vue';
-import * as os from '@/os';
+import MkButton from '@client/components/ui/button.vue';
+import MkInput from '@client/components/ui/input.vue';
+import MkSwitch from '@client/components/ui/switch.vue';
+import MkTextarea from '@client/components/ui/textarea.vue';
+import MkRadio from '@client/components/ui/radio.vue';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/theme-editor.vue b/src/client/pages/theme-editor.vue
index 2bf0a4383ec21d2e0fa8cff21b16ef60c30c001e..5ee0a704b04bb9ce5f3cffcab3e70ef3159df3eb 100644
--- a/src/client/pages/theme-editor.vue
+++ b/src/client/pages/theme-editor.vue
@@ -57,16 +57,16 @@ import * as tinycolor from 'tinycolor2';
 import { v4 as uuid} from 'uuid';
 import * as JSON5 from 'json5';
 
-import FormBase from '@/components/form/base.vue';
-import FormButton from '@/components/form/button.vue';
-import FormTextarea from '@/components/form/textarea.vue';
-import FormGroup from '@/components/form/group.vue';
+import FormBase from '@client/components/form/base.vue';
+import FormButton from '@client/components/form/button.vue';
+import FormTextarea from '@client/components/form/textarea.vue';
+import FormGroup from '@client/components/form/group.vue';
 
-import { Theme, applyTheme, validateTheme, darkTheme, lightTheme } from '@/scripts/theme';
-import { host } from '@/config';
-import * as os from '@/os';
-import { ColdDeviceStorage } from '@/store';
-import { addTheme } from '@/theme-store';
+import { Theme, applyTheme, validateTheme, darkTheme, lightTheme } from '@client/scripts/theme';
+import { host } from '@client/config';
+import * as os from '@client/os';
+import { ColdDeviceStorage } from '@client/store';
+import { addTheme } from '@client/theme-store';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/timeline.tutorial.vue b/src/client/pages/timeline.tutorial.vue
index 203527ef0a065eb11f76d553d70dd183232cd629..bcbf16acc76b5466c39c1da05bb7f450fdb97e8d 100644
--- a/src/client/pages/timeline.tutorial.vue
+++ b/src/client/pages/timeline.tutorial.vue
@@ -68,7 +68,7 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import { faInfoCircle, faChevronLeft, faChevronRight, faCheck } from '@fortawesome/free-solid-svg-icons'
-import MkButton from '@/components/ui/button.vue';
+import MkButton from '@client/components/ui/button.vue';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/timeline.vue b/src/client/pages/timeline.vue
index cb3ec2a7efad8ec18dd3b983d60e0767e8331254..e0c0b2995a40a6c463dbea0490288d1a99703066 100644
--- a/src/client/pages/timeline.vue
+++ b/src/client/pages/timeline.vue
@@ -41,11 +41,11 @@
 import { defineComponent, defineAsyncComponent, computed } from 'vue';
 import { faAngleDown, faAngleUp, faHome, faShareAlt, faGlobe, faListUl, faSatellite, faSatelliteDish, faCircle, faEllipsisH, faPencilAlt, faAt } from '@fortawesome/free-solid-svg-icons';
 import { faComments, faEnvelope } from '@fortawesome/free-regular-svg-icons';
-import Progress from '@/scripts/loading';
-import XTimeline from '@/components/timeline.vue';
-import XPostForm from '@/components/post-form.vue';
-import { scroll } from '@/scripts/scroll';
-import * as os from '@/os';
+import Progress from '@client/scripts/loading';
+import XTimeline from '@client/components/timeline.vue';
+import XPostForm from '@client/components/post-form.vue';
+import { scroll } from '@client/scripts/scroll';
+import * as os from '@client/os';
 
 export default defineComponent({
 	name: 'timeline',
diff --git a/src/client/pages/user/clips.vue b/src/client/pages/user/clips.vue
index 2a66b6752debdef2b5683ba34d72341d289a8400..cf713d6daa0801d9c163acfdca3edd8bf4128d7e 100644
--- a/src/client/pages/user/clips.vue
+++ b/src/client/pages/user/clips.vue
@@ -11,7 +11,7 @@
 
 <script lang="ts">
 import { defineComponent } from 'vue';
-import MkPagination from '@/components/ui/pagination.vue';
+import MkPagination from '@client/components/ui/pagination.vue';
 import { userPage, acct } from '../../filters/user';
 
 export default defineComponent({
diff --git a/src/client/pages/user/follow-list.vue b/src/client/pages/user/follow-list.vue
index 90a67e9a8e7456c5a6f1c0f22db6e40f411ae469..eef8409a064c0ceb391f3d985b9b878b206ccbdb 100644
--- a/src/client/pages/user/follow-list.vue
+++ b/src/client/pages/user/follow-list.vue
@@ -10,8 +10,8 @@
 
 <script lang="ts">
 import { defineComponent } from 'vue';
-import MkUserInfo from '@/components/user-info.vue';
-import MkPagination from '@/components/ui/pagination.vue';
+import MkUserInfo from '@client/components/user-info.vue';
+import MkPagination from '@client/components/ui/pagination.vue';
 import { userPage, acct } from '../../filters/user';
 
 export default defineComponent({
diff --git a/src/client/pages/user/index.activity.vue b/src/client/pages/user/index.activity.vue
index 838fbc223f589898705bc9cd07534f9986ae5346..3eca1ab210aa767a215f1a1667b505a3d0d78b71 100644
--- a/src/client/pages/user/index.activity.vue
+++ b/src/client/pages/user/index.activity.vue
@@ -12,8 +12,8 @@
 import { defineComponent } from 'vue';
 import ApexCharts from 'apexcharts';
 import { faChartBar } from '@fortawesome/free-solid-svg-icons';
-import * as os from '@/os';
-import MkContainer from '@/components/ui/container.vue';
+import * as os from '@client/os';
+import MkContainer from '@client/components/ui/container.vue';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/user/index.photos.vue b/src/client/pages/user/index.photos.vue
index d0c6f19349f8e985f66c94af4732acecbbc40abc..54796bccbce70300c41c30c77f3f1b35c25f28e5 100644
--- a/src/client/pages/user/index.photos.vue
+++ b/src/client/pages/user/index.photos.vue
@@ -18,10 +18,10 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import { faImage } from '@fortawesome/free-solid-svg-icons';
-import { getStaticImageUrl } from '@/scripts/get-static-image-url';
+import { getStaticImageUrl } from '@client/scripts/get-static-image-url';
 import notePage from '../../filters/note';
-import * as os from '@/os';
-import MkContainer from '@/components/ui/container.vue';
+import * as os from '@client/os';
+import MkContainer from '@client/components/ui/container.vue';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/user/index.timeline.vue b/src/client/pages/user/index.timeline.vue
index f16297e21fbcbe952d49632a4bad3d1c9a9e74f9..8c824a2111b2a50e142b2a40b5b5c914f7520533 100644
--- a/src/client/pages/user/index.timeline.vue
+++ b/src/client/pages/user/index.timeline.vue
@@ -11,9 +11,9 @@
 
 <script lang="ts">
 import { defineComponent } from 'vue';
-import XNotes from '@/components/notes.vue';
-import MkTab from '@/components/tab.vue';
-import * as os from '@/os';
+import XNotes from '@client/components/notes.vue';
+import MkTab from '@client/components/tab.vue';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/user/index.vue b/src/client/pages/user/index.vue
index 5229db9ee3b51d7f7081868a4be4d3de84bd68c9..5ca29a3e4122856c8ed0d1a872e346a70186232f 100644
--- a/src/client/pages/user/index.vue
+++ b/src/client/pages/user/index.vue
@@ -221,19 +221,19 @@ import { faExclamationTriangle, faEllipsisH, faRobot, faLock, faBookmark, faChar
 import { faCalendarAlt, faBookmark as farBookmark, faCommentAlt } from '@fortawesome/free-regular-svg-icons';
 import * as age from 's-age';
 import XUserTimeline from './index.timeline.vue';
-import XNote from '@/components/note.vue';
-import MkFollowButton from '@/components/follow-button.vue';
-import MkContainer from '@/components/ui/container.vue';
-import MkFolder from '@/components/ui/folder.vue';
-import MkRemoteCaution from '@/components/remote-caution.vue';
-import MkTab from '@/components/tab.vue';
-import Progress from '@/scripts/loading';
-import parseAcct from '../../../misc/acct/parse';
-import { getScrollPosition } from '@/scripts/scroll';
-import { getUserMenu } from '@/scripts/get-user-menu';
+import XNote from '@client/components/note.vue';
+import MkFollowButton from '@client/components/follow-button.vue';
+import MkContainer from '@client/components/ui/container.vue';
+import MkFolder from '@client/components/ui/folder.vue';
+import MkRemoteCaution from '@client/components/remote-caution.vue';
+import MkTab from '@client/components/tab.vue';
+import Progress from '@client/scripts/loading';
+import parseAcct from '@/misc/acct/parse';
+import { getScrollPosition } from '@client/scripts/scroll';
+import { getUserMenu } from '@client/scripts/get-user-menu';
 import number from '../../filters/number';
 import { userPage, acct as getAcct } from '../../filters/user';
-import * as os from '@/os';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/user/pages.vue b/src/client/pages/user/pages.vue
index 66658ac57d3766ac2d765195b73afe3914013c2e..1d2e96b351c8d7a0b1a17d8ea32bbbe2d1da7f0b 100644
--- a/src/client/pages/user/pages.vue
+++ b/src/client/pages/user/pages.vue
@@ -8,8 +8,8 @@
 
 <script lang="ts">
 import { defineComponent } from 'vue';
-import MkPagePreview from '@/components/page-preview.vue';
-import MkPagination from '@/components/ui/pagination.vue';
+import MkPagePreview from '@client/components/page-preview.vue';
+import MkPagination from '@client/components/ui/pagination.vue';
 import { userPage, acct } from '../../filters/user';
 
 export default defineComponent({
diff --git a/src/client/pages/v.vue b/src/client/pages/v.vue
index f456a299931210d41c217881d094c3319339d23f..a9deea24b4be69e50e2d4fed791156fa49656780 100644
--- a/src/client/pages/v.vue
+++ b/src/client/pages/v.vue
@@ -13,7 +13,7 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import { faInfoCircle } from '@fortawesome/free-solid-svg-icons';
-import { version } from '@/config';
+import { version } from '@client/config';
 
 export default defineComponent({
 	data() {
diff --git a/src/client/pages/welcome.entrance.a.vue b/src/client/pages/welcome.entrance.a.vue
index fa69c1a124f86eb972ffdd56c3a1e6cfe013242b..9a24f868b6405ee1fa4d5f4f3540d349b6fa6e41 100644
--- a/src/client/pages/welcome.entrance.a.vue
+++ b/src/client/pages/welcome.entrance.a.vue
@@ -54,15 +54,15 @@
 import { defineComponent } from 'vue';
 import { faEllipsisH, faInfoCircle, faQuestionCircle } from '@fortawesome/free-solid-svg-icons';
 import { toUnicode } from 'punycode';
-import XSigninDialog from '@/components/signin-dialog.vue';
-import XSignupDialog from '@/components/signup-dialog.vue';
-import MkButton from '@/components/ui/button.vue';
-import XNote from '@/components/note.vue';
-import MkFeaturedPhotos from '@/components/featured-photos.vue';
+import XSigninDialog from '@client/components/signin-dialog.vue';
+import XSignupDialog from '@client/components/signup-dialog.vue';
+import MkButton from '@client/components/ui/button.vue';
+import XNote from '@client/components/note.vue';
+import MkFeaturedPhotos from '@client/components/featured-photos.vue';
 import XTimeline from './welcome.timeline.vue';
-import { host, instanceName } from '@/config';
-import * as os from '@/os';
-import number from '@/filters/number';
+import { host, instanceName } from '@client/config';
+import * as os from '@client/os';
+import number from '@client/filters/number';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/welcome.entrance.b.vue b/src/client/pages/welcome.entrance.b.vue
index 203618f17e51c11a496d9a327e81d907e0975eba..6e93f1740407c2612276b41264d20cbdbb20ff20 100644
--- a/src/client/pages/welcome.entrance.b.vue
+++ b/src/client/pages/welcome.entrance.b.vue
@@ -38,15 +38,15 @@
 import { defineComponent } from 'vue';
 import { faEllipsisH, faInfoCircle, faQuestionCircle } from '@fortawesome/free-solid-svg-icons';
 import { toUnicode } from 'punycode';
-import XSigninDialog from '@/components/signin-dialog.vue';
-import XSignupDialog from '@/components/signup-dialog.vue';
-import MkButton from '@/components/ui/button.vue';
-import XNote from '@/components/note.vue';
-import MkFeaturedPhotos from '@/components/featured-photos.vue';
+import XSigninDialog from '@client/components/signin-dialog.vue';
+import XSignupDialog from '@client/components/signup-dialog.vue';
+import MkButton from '@client/components/ui/button.vue';
+import XNote from '@client/components/note.vue';
+import MkFeaturedPhotos from '@client/components/featured-photos.vue';
 import XTimeline from './welcome.timeline.vue';
-import { host, instanceName } from '@/config';
-import * as os from '@/os';
-import number from '@/filters/number';
+import { host, instanceName } from '@client/config';
+import * as os from '@client/os';
+import number from '@client/filters/number';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/welcome.entrance.c.vue b/src/client/pages/welcome.entrance.c.vue
index 4c98baf8ea604027f52ab713b9c3fabb11cc6676..cefe239da9442a8be836894674f33ae906890c25 100644
--- a/src/client/pages/welcome.entrance.c.vue
+++ b/src/client/pages/welcome.entrance.c.vue
@@ -58,15 +58,15 @@
 import { defineComponent } from 'vue';
 import { faEllipsisH, faInfoCircle, faQuestionCircle } from '@fortawesome/free-solid-svg-icons';
 import { toUnicode } from 'punycode';
-import XSigninDialog from '@/components/signin-dialog.vue';
-import XSignupDialog from '@/components/signup-dialog.vue';
-import MkButton from '@/components/ui/button.vue';
-import XNote from '@/components/note.vue';
-import MkFeaturedPhotos from '@/components/featured-photos.vue';
+import XSigninDialog from '@client/components/signin-dialog.vue';
+import XSignupDialog from '@client/components/signup-dialog.vue';
+import MkButton from '@client/components/ui/button.vue';
+import XNote from '@client/components/note.vue';
+import MkFeaturedPhotos from '@client/components/featured-photos.vue';
 import XTimeline from './welcome.timeline.vue';
-import { host, instanceName } from '@/config';
-import * as os from '@/os';
-import number from '@/filters/number';
+import { host, instanceName } from '@client/config';
+import * as os from '@client/os';
+import number from '@client/filters/number';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/welcome.setup.vue b/src/client/pages/welcome.setup.vue
index bc994099ac45cd8348f09aa1f600ef5274d9a507..db64f6b1944e14c78fd0e224fbae11f70cfca81e 100644
--- a/src/client/pages/welcome.setup.vue
+++ b/src/client/pages/welcome.setup.vue
@@ -22,11 +22,11 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import { faLock } from '@fortawesome/free-solid-svg-icons';
-import MkButton from '@/components/ui/button.vue';
-import MkInput from '@/components/ui/input.vue';
-import { host } from '@/config';
-import * as os from '@/os';
-import { login } from '@/account';
+import MkButton from '@client/components/ui/button.vue';
+import MkInput from '@client/components/ui/input.vue';
+import { host } from '@client/config';
+import * as os from '@client/os';
+import { login } from '@client/account';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/welcome.timeline.vue b/src/client/pages/welcome.timeline.vue
index a498b578e248c4fbbbe24248c7020204ca98c5c2..12c8a4d4f4ce4a416ffbb57bef7895c9bf1a3d58 100644
--- a/src/client/pages/welcome.timeline.vue
+++ b/src/client/pages/welcome.timeline.vue
@@ -11,8 +11,8 @@
 
 <script lang="ts">
 import { defineComponent } from 'vue';
-import XReactionsViewer from '@/components/reactions-viewer.vue';
-import * as os from '@/os';
+import XReactionsViewer from '@client/components/reactions-viewer.vue';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/pages/welcome.vue b/src/client/pages/welcome.vue
index 99560eea21971577b91c90e561269a18b9f553bc..845a304854a90593e2d49ed69af20d944ab576c0 100644
--- a/src/client/pages/welcome.vue
+++ b/src/client/pages/welcome.vue
@@ -9,8 +9,8 @@
 import { defineComponent } from 'vue';
 import XSetup from './welcome.setup.vue';
 import XEntrance from './welcome.entrance.a.vue';
-import { instanceName } from '@/config';
-import * as os from '@/os';
+import { instanceName } from '@client/config';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/plugin.ts b/src/client/plugin.ts
index c56ee1eb25d26fc1aabeb06c11ca8037916cad89..6bdc4fe4d57189502b4a9dcaebf894bcbe0bbca7 100644
--- a/src/client/plugin.ts
+++ b/src/client/plugin.ts
@@ -1,9 +1,9 @@
 import { AiScript, utils, values } from '@syuilo/aiscript';
 import { deserialize } from '@syuilo/aiscript/built/serializer';
 import { jsToVal } from '@syuilo/aiscript/built/interpreter/util';
-import { createAiScriptEnv } from '@/scripts/aiscript/api';
-import { dialog } from '@/os';
-import { noteActions, notePostInterruptors, noteViewInterruptors, postFormActions, userActions } from '@/store';
+import { createAiScriptEnv } from '@client/scripts/aiscript/api';
+import { dialog } from '@client/os';
+import { noteActions, notePostInterruptors, noteViewInterruptors, postFormActions, userActions } from '@client/store';
 
 const pluginContexts = new Map<string, AiScript>();
 
diff --git a/src/client/router.ts b/src/client/router.ts
index d3cfead2583c2cea193f1bbb96a96a1a4caaa5d8..53516db97b95b07d8f00476b9ab8739d57090521 100644
--- a/src/client/router.ts
+++ b/src/client/router.ts
@@ -1,8 +1,8 @@
 import { defineAsyncComponent, markRaw } from 'vue';
 import { createRouter, createWebHistory } from 'vue-router';
-import MkLoading from '@/pages/_loading_.vue';
-import MkError from '@/pages/_error_.vue';
-import MkTimeline from '@/pages/timeline.vue';
+import MkLoading from '@client/pages/_loading_.vue';
+import MkError from '@client/pages/_error_.vue';
+import MkTimeline from '@client/pages/timeline.vue';
 import { $i } from './account';
 
 const page = (path: string) => defineAsyncComponent({
diff --git a/src/client/scripts/aiscript/api.ts b/src/client/scripts/aiscript/api.ts
index 20c15d809e10757077a08ef70d893759fcdeed01..5dd08f34ac4b807a280ea115840193b630a1992d 100644
--- a/src/client/scripts/aiscript/api.ts
+++ b/src/client/scripts/aiscript/api.ts
@@ -1,6 +1,6 @@
 import { utils, values } from '@syuilo/aiscript';
-import * as os from '@/os';
-import { $i } from '@/account';
+import * as os from '@client/os';
+import { $i } from '@client/account';
 
 export function createAiScriptEnv(opts) {
 	let apiRequests = 0;
diff --git a/src/client/scripts/autocomplete.ts b/src/client/scripts/autocomplete.ts
index 83ceece5df2b09bc1fc51d08cd41ce25ca116c23..eab893a386ff932b3d2c3a78f387f2de516ab4fe 100644
--- a/src/client/scripts/autocomplete.ts
+++ b/src/client/scripts/autocomplete.ts
@@ -1,7 +1,7 @@
 import { Ref, ref } from 'vue';
 import * as getCaretCoordinates from 'textarea-caret';
 import { toASCII } from 'punycode';
-import { popup } from '@/os';
+import { popup } from '@client/os';
 
 export class Autocomplete {
 	private suggestion: {
@@ -150,7 +150,7 @@ export class Autocomplete {
 			const _y = ref(y);
 			const _q = ref(q);
 
-			const { dispose } = await popup(import('@/components/autocomplete.vue'), {
+			const { dispose } = await popup(import('@client/components/autocomplete.vue'), {
 				textarea: this.textarea,
 				close: this.close,
 				type: type,
diff --git a/src/client/scripts/gen-search-query.ts b/src/client/scripts/gen-search-query.ts
index 670d915104bc83d16c80652a83219c23fd0973c9..a1db2671230e20ac54d8f8f1ca348554d7a27ed0 100644
--- a/src/client/scripts/gen-search-query.ts
+++ b/src/client/scripts/gen-search-query.ts
@@ -1,5 +1,5 @@
-import parseAcct from '../../misc/acct/parse';
-import { host as localHost } from '@/config';
+import parseAcct from '@/misc/acct/parse';
+import { host as localHost } from '@client/config';
 
 export async function genSearchQuery(v: any, q: string) {
 	let host: string;
diff --git a/src/client/scripts/get-static-image-url.ts b/src/client/scripts/get-static-image-url.ts
index e932eb6da5fa06385be4a1b423a0f58360e17c64..e2728d73f4fb111bda4540f4ee53e21ac10b63c8 100644
--- a/src/client/scripts/get-static-image-url.ts
+++ b/src/client/scripts/get-static-image-url.ts
@@ -1,4 +1,4 @@
-import { url as instanceUrl } from '@/config';
+import { url as instanceUrl } from '@client/config';
 import * as url from '../../prelude/url';
 
 export function getStaticImageUrl(baseUrl: string): string {
diff --git a/src/client/scripts/get-user-menu.ts b/src/client/scripts/get-user-menu.ts
index 0e4e4af5d36cd9a8c7e651087f6b81ceff957af5..163eff619c66ab112e8c4a7d1f2b17ae2625a5e3 100644
--- a/src/client/scripts/get-user-menu.ts
+++ b/src/client/scripts/get-user-menu.ts
@@ -1,13 +1,13 @@
 import { faAt, faListUl, faEye, faEyeSlash, faBan, faPencilAlt, faComments, faUsers, faMicrophoneSlash, faPlug, faExclamationCircle } from '@fortawesome/free-solid-svg-icons';
 import { faSnowflake, faEnvelope } from '@fortawesome/free-regular-svg-icons';
-import { i18n } from '@/i18n';
-import copyToClipboard from '@/scripts/copy-to-clipboard';
-import { host } from '@/config';
-import getAcct from '../../misc/acct/render';
-import * as os from '@/os';
-import { userActions } from '@/store';
-import { router } from '@/router';
-import { $i } from '@/account';
+import { i18n } from '@client/i18n';
+import copyToClipboard from '@client/scripts/copy-to-clipboard';
+import { host } from '@client/config';
+import getAcct from '@/misc/acct/render';
+import * as os from '@client/os';
+import { userActions } from '@client/store';
+import { router } from '@client/router';
+import { $i } from '@client/account';
 
 export function getUserMenu(user) {
 	const meId = $i ? $i.id : null;
@@ -104,7 +104,7 @@ export function getUserMenu(user) {
 	}
 
 	function reportAbuse() {
-		os.popup(import('@/components/abuse-report-window.vue'), {
+		os.popup(import('@client/components/abuse-report-window.vue'), {
 			user: user,
 		}, {}, 'closed');
 	}
diff --git a/src/client/scripts/hpml/evaluator.ts b/src/client/scripts/hpml/evaluator.ts
index 20261d333d712d330378bb79299bdf71dfa3d398..68d140ff508d57cdb22be13c85291da5fad51ec6 100644
--- a/src/client/scripts/hpml/evaluator.ts
+++ b/src/client/scripts/hpml/evaluator.ts
@@ -1,11 +1,11 @@
 import autobind from 'autobind-decorator';
 import { PageVar, envVarsDef, Fn, HpmlScope, HpmlError } from '.';
-import { version } from '@/config';
+import { version } from '@client/config';
 import { AiScript, utils, values } from '@syuilo/aiscript';
 import { createAiScriptEnv } from '../aiscript/api';
 import { collectPageVars } from '../collect-page-vars';
 import { initHpmlLib, initAiLib } from './lib';
-import * as os from '@/os';
+import * as os from '@client/os';
 import { markRaw, ref, Ref, unref } from 'vue';
 import { Expr, isLiteralValue, Variable } from './expr';
 
diff --git a/src/client/scripts/initialize-sw.ts b/src/client/scripts/initialize-sw.ts
index d6dbd5dbd42e29bfdd0388c5ba1cc4dfa7a0f2ad..6f1874572ade6bc3a18c2d7ea551bd750916b3cf 100644
--- a/src/client/scripts/initialize-sw.ts
+++ b/src/client/scripts/initialize-sw.ts
@@ -1,7 +1,7 @@
-import { instance } from '@/instance';
-import { $i } from '@/account';
-import { api } from '@/os';
-import { lang } from '@/config';
+import { instance } from '@client/instance';
+import { $i } from '@client/account';
+import { api } from '@client/os';
+import { lang } from '@client/config';
 
 export async function initializeSw() {
 	if (instance.swPublickey &&
diff --git a/src/client/scripts/paging.ts b/src/client/scripts/paging.ts
index 6e3da941247ac790303606e35d720a3a06b4d3aa..2e49f1a64cd5c1324c9db91e72af6f38bdd33a68 100644
--- a/src/client/scripts/paging.ts
+++ b/src/client/scripts/paging.ts
@@ -1,5 +1,5 @@
 import { markRaw } from 'vue';
-import * as os from '@/os';
+import * as os from '@client/os';
 import { onScrollTop, isTopVisible, getScrollPosition, getScrollContainer } from './scroll';
 
 const SECOND_FETCH_LIMIT = 30;
diff --git a/src/client/scripts/please-login.ts b/src/client/scripts/please-login.ts
index 928f6ec0f44e3a68731ecac7b214a093718b6dca..a584e9fa9671077e2b1d39c89b757ba3a33203a2 100644
--- a/src/client/scripts/please-login.ts
+++ b/src/client/scripts/please-login.ts
@@ -1,6 +1,6 @@
-import { $i } from '@/account';
-import { i18n } from '@/i18n';
-import { dialog } from '@/os';
+import { $i } from '@client/account';
+import { i18n } from '@client/i18n';
+import { dialog } from '@client/os';
 
 export function pleaseLogin() {
 	if ($i) return;
diff --git a/src/client/scripts/popout.ts b/src/client/scripts/popout.ts
index 51b8d72868deaaf230f767a0f347a40eb5fff407..6d92af4a05c34c424c261ce78ceb26dc5db5bb6c 100644
--- a/src/client/scripts/popout.ts
+++ b/src/client/scripts/popout.ts
@@ -1,4 +1,4 @@
-import * as config from '@/config';
+import * as config from '@client/config';
 
 export function popout(path: string, w?: HTMLElement) {
 	let url = path.startsWith('http://') || path.startsWith('https://') ? path : config.url + path;
diff --git a/src/client/scripts/reaction-picker.ts b/src/client/scripts/reaction-picker.ts
index e923326ece960648de9f2da3e50a1d7cabe0bed5..38699c0979fca94328888928c95bbbea7545d9df 100644
--- a/src/client/scripts/reaction-picker.ts
+++ b/src/client/scripts/reaction-picker.ts
@@ -1,5 +1,5 @@
 import { Ref, ref } from 'vue';
-import { popup } from '@/os';
+import { popup } from '@client/os';
 
 class ReactionPicker {
 	private src: Ref<HTMLElement | null> = ref(null);
@@ -12,7 +12,7 @@ class ReactionPicker {
 	}
 
 	public async init() {
-		await popup(import('@/components/emoji-picker-dialog.vue'), {
+		await popup(import('@client/components/emoji-picker-dialog.vue'), {
 			src: this.src,
 			asReactionPicker: true,
 			manualShowing: this.manualShowing
diff --git a/src/client/scripts/search.ts b/src/client/scripts/search.ts
index 3e442cb94d1458f7cb6bdabaaf5c39f5fc6acb49..829065534c3e3f3e020ca2c0f2f7af7bcc93692e 100644
--- a/src/client/scripts/search.ts
+++ b/src/client/scripts/search.ts
@@ -1,7 +1,7 @@
 import { faHistory } from '@fortawesome/free-solid-svg-icons';
-import * as os from '@/os';
-import { i18n } from '@/i18n';
-import { router } from '@/router';
+import * as os from '@client/os';
+import { i18n } from '@client/i18n';
+import { router } from '@client/router';
 
 export async function search() {
 	const { canceled, result: query } = await os.dialog({
diff --git a/src/client/scripts/select-file.ts b/src/client/scripts/select-file.ts
index c083e1ef88957dba93482d86315b7c23af8dc4da..03ac863aa0c61de7bf4bfce1b32c97ff3a1e2ae9 100644
--- a/src/client/scripts/select-file.ts
+++ b/src/client/scripts/select-file.ts
@@ -1,6 +1,6 @@
 import { faUpload, faCloud, faLink } from '@fortawesome/free-solid-svg-icons';
-import * as os from '@/os';
-import { i18n } from '@/i18n';
+import * as os from '@client/os';
+import { i18n } from '@client/i18n';
 
 export function selectFile(src: any, label: string | null, multiple = false) {
 	return new Promise((res, rej) => {
diff --git a/src/client/scripts/sound.ts b/src/client/scripts/sound.ts
index 9b7061d5fc789bf2a04f160a18e31f7c9b49e26b..d3422bfff291d86662e597ac6df5860cf3c3db82 100644
--- a/src/client/scripts/sound.ts
+++ b/src/client/scripts/sound.ts
@@ -1,4 +1,4 @@
-import { ColdDeviceStorage } from '@/store';
+import { ColdDeviceStorage } from '@client/store';
 
 const cache = new Map<string, HTMLAudioElement>();
 
diff --git a/src/client/scripts/stream.ts b/src/client/scripts/stream.ts
index 7330a2f8bbc6ac36fcb3fa870d9371e69b1b98b7..065059221d44006f9f20ba1267530b2bf5a2bc36 100644
--- a/src/client/scripts/stream.ts
+++ b/src/client/scripts/stream.ts
@@ -2,7 +2,7 @@ import autobind from 'autobind-decorator';
 import { EventEmitter } from 'eventemitter3';
 import ReconnectingWebsocket from 'reconnecting-websocket';
 import { markRaw } from 'vue';
-import { debug, wsUrl } from '@/config';
+import { debug, wsUrl } from '@client/config';
 import { query as urlQuery } from '../../prelude/url';
 
 /**
diff --git a/src/client/sidebar.ts b/src/client/sidebar.ts
index 6bc786fdc0309c7d2a906cba9723416ca481a0c5..97036042cff88c31d9988e958bdd9abc30ef5a33 100644
--- a/src/client/sidebar.ts
+++ b/src/client/sidebar.ts
@@ -1,11 +1,11 @@
 import { faBell, faComments, faEnvelope } from '@fortawesome/free-regular-svg-icons';
 import { faAt, faBroadcastTower, faCloud, faColumns, faDoorClosed, faFileAlt, faFireAlt, faGamepad, faHashtag, faListUl, faPaperclip, faSatellite, faSatelliteDish, faSearch, faStar, faTerminal, faUserClock, faUsers } from '@fortawesome/free-solid-svg-icons';
 import { computed } from 'vue';
-import { search } from '@/scripts/search';
-import * as os from '@/os';
-import { i18n } from '@/i18n';
+import { search } from '@client/scripts/search';
+import * as os from '@client/os';
+import { i18n } from '@client/i18n';
 import { $i } from './account';
-import { unisonReload } from '@/scripts/unison-reload';
+import { unisonReload } from '@client/scripts/unison-reload';
 
 export const sidebarDef = {
 	notifications: {
diff --git a/src/client/sw/compose-notification.ts b/src/client/sw/compose-notification.ts
index e9586dd57425dde3abd7e5f89afcf44018e3b658..7ed0a95359027207637716efcd60a2f561672b46 100644
--- a/src/client/sw/compose-notification.ts
+++ b/src/client/sw/compose-notification.ts
@@ -3,8 +3,8 @@
  */
 declare var self: ServiceWorkerGlobalScope;
 
-import { getNoteSummary } from '../../misc/get-note-summary';
-import getUserName from '../../misc/get-user-name';
+import { getNoteSummary } from '@/misc/get-note-summary';
+import getUserName from '@/misc/get-user-name';
 
 export default async function(type, data, i18n): Promise<[string, NotificationOptions] | null | undefined> {
 	if (!i18n) {
diff --git a/src/client/sw/sw.ts b/src/client/sw/sw.ts
index ec4de17551c216d9e09e8d93a0d0f93bf40d1b9d..5be4eb97708a96a8d128361e1b7a12feb86cccc6 100644
--- a/src/client/sw/sw.ts
+++ b/src/client/sw/sw.ts
@@ -4,8 +4,8 @@
 declare var self: ServiceWorkerGlobalScope;
 
 import { get, set } from 'idb-keyval';
-import composeNotification from '@/sw/compose-notification';
-import { I18n } from '../../misc/i18n';
+import composeNotification from '@client/sw/compose-notification';
+import { I18n } from '@/misc/i18n';
 
 //#region Variables
 const version = _VERSION_;
diff --git a/src/client/theme-store.ts b/src/client/theme-store.ts
index 8e21af70fcdd80680b87992e8582f55f4cdd0df9..3793debb9e46fe880723fd97f9de8698b6fdf556 100644
--- a/src/client/theme-store.ts
+++ b/src/client/theme-store.ts
@@ -1,5 +1,5 @@
-import { api } from '@/os';
-import { $i } from '@/account';
+import { api } from '@client/os';
+import { $i } from '@client/account';
 import { ColdDeviceStorage } from './store';
 import { Theme } from './scripts/theme';
 
diff --git a/src/client/tsconfig.json b/src/client/tsconfig.json
index 01a77cec3ac2ecd1ce786c9e09b4e0265b5c400a..ac7ef7ddfcafd68d1952aedf3377a7a429b7b416 100644
--- a/src/client/tsconfig.json
+++ b/src/client/tsconfig.json
@@ -20,7 +20,8 @@
 		"resolveJsonModule": true,
 		"baseUrl": ".",
 		"paths": {
-			"@/*": ["./*"]
+			"@/*": ["../*"],
+			"@client/*": ["./*"]
 		},
 		"typeRoots": [
 			"node_modules/@types",
diff --git a/src/client/ui/_common_/common.vue b/src/client/ui/_common_/common.vue
index e5cdaca235691871d6e4fa5a0360a760fd87c652..785b1631dbe3b745ae340743fa4ff559587241df 100644
--- a/src/client/ui/_common_/common.vue
+++ b/src/client/ui/_common_/common.vue
@@ -15,9 +15,9 @@
 
 <script lang="ts">
 import { defineAsyncComponent, defineComponent } from 'vue';
-import { stream, popup, popups, uploads, pendingApiRequestsCount } from '@/os';
-import * as sound from '@/scripts/sound';
-import { $i } from '@/account';
+import { stream, popup, popups, uploads, pendingApiRequestsCount } from '@client/os';
+import * as sound from '@client/scripts/sound';
+import { $i } from '@client/account';
 
 export default defineComponent({
 	components: {
@@ -34,7 +34,7 @@ export default defineComponent({
 					id: notification.id
 				});
 
-				popup(import('@/components/toast.vue'), {
+				popup(import('@client/components/toast.vue'), {
 					notification
 				}, {}, 'closed');
 			}
diff --git a/src/client/ui/_common_/stream-indicator.vue b/src/client/ui/_common_/stream-indicator.vue
index 8b1b4b567ce01e37b4a4c20705a0f365b09b997b..23f2357d8566d5a75cdd998767cb79e184c2d8e9 100644
--- a/src/client/ui/_common_/stream-indicator.vue
+++ b/src/client/ui/_common_/stream-indicator.vue
@@ -10,7 +10,7 @@
 
 <script lang="ts">
 import { defineComponent } from 'vue';
-import * as os from '@/os';
+import * as os from '@client/os';
 
 export default defineComponent({
 	data() {
diff --git a/src/client/ui/_common_/upload.vue b/src/client/ui/_common_/upload.vue
index c1986737d744098b3bb6e0e501328f6c73ba40c0..bd3b2cd6848a876397b76b0af5b755e7c46386d3 100644
--- a/src/client/ui/_common_/upload.vue
+++ b/src/client/ui/_common_/upload.vue
@@ -20,7 +20,7 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import { faSpinner } from '@fortawesome/free-solid-svg-icons';
-import * as os from '@/os';
+import * as os from '@client/os';
 
 export default defineComponent({
 	data() {
diff --git a/src/client/ui/chat/header-clock.vue b/src/client/ui/chat/header-clock.vue
index 3488289c2145c67ccb816f4b17dba0d75eda0cdb..69ec3cb64b58e8ac6143c1a5bbe732333918021f 100644
--- a/src/client/ui/chat/header-clock.vue
+++ b/src/client/ui/chat/header-clock.vue
@@ -15,7 +15,7 @@
 
 <script lang="ts">
 import { defineComponent } from 'vue';
-import * as os from '@/os';
+import * as os from '@client/os';
 
 export default defineComponent({
 	data() {
diff --git a/src/client/ui/chat/index.vue b/src/client/ui/chat/index.vue
index 26c81a1aa904842cd938730837b8cfcdd9f1c72a..91d3fb5c9dd3105baaddbc464f78de673f293079 100644
--- a/src/client/ui/chat/index.vue
+++ b/src/client/ui/chat/index.vue
@@ -135,18 +135,18 @@
 import { defineComponent, defineAsyncComponent } from 'vue';
 import { faLayerGroup, faBars, faHome, faCircle, faWindowMaximize, faColumns, faPencilAlt, faShareAlt, faSatelliteDish, faListUl, faSatellite, faCog, faSearch, faPlus, faStar, faAt, faLink, faEllipsisH, faGlobe } from '@fortawesome/free-solid-svg-icons';
 import { faBell, faStar as farStar, faEnvelope, faComments, faCalendarAlt } from '@fortawesome/free-regular-svg-icons';
-import { instanceName, url } from '@/config';
-import XSidebar from '@/components/sidebar.vue';
+import { instanceName, url } from '@client/config';
+import XSidebar from '@client/components/sidebar.vue';
 import XWidgets from './widgets.vue';
 import XCommon from '../_common_/common.vue';
 import XSide from './side.vue';
 import XTimeline from './timeline.vue';
 import XHeaderClock from './header-clock.vue';
-import * as os from '@/os';
-import { router } from '@/router';
-import { sidebarDef } from '@/sidebar';
-import { search } from '@/scripts/search';
-import copyToClipboard from '@/scripts/copy-to-clipboard';
+import * as os from '@client/os';
+import { router } from '@client/router';
+import { sidebarDef } from '@client/sidebar';
+import { search } from '@client/scripts/search';
+import copyToClipboard from '@client/scripts/copy-to-clipboard';
 import { store } from './store';
 
 export default defineComponent({
diff --git a/src/client/ui/chat/note-header.vue b/src/client/ui/chat/note-header.vue
index cda8ae00e2a1126d6bc2f14de3a769e280661073..55228c4c382230b79bb10d30d6ed76cde1b8c551 100644
--- a/src/client/ui/chat/note-header.vue
+++ b/src/client/ui/chat/note-header.vue
@@ -26,9 +26,9 @@
 import { defineComponent } from 'vue';
 import { faHome, faUnlock, faEnvelope, faMobileAlt, faBookmark, faBiohazard } from '@fortawesome/free-solid-svg-icons';
 import { faBookmark as farBookmark } from '@fortawesome/free-regular-svg-icons';
-import notePage from '@/filters/note';
-import { userPage } from '@/filters/user';
-import * as os from '@/os';
+import notePage from '@client/filters/note';
+import { userPage } from '@client/filters/user';
+import * as os from '@client/os';
 
 export default defineComponent({
 	props: {
diff --git a/src/client/ui/chat/note-preview.vue b/src/client/ui/chat/note-preview.vue
index 48614737016c3f55b7459f22977c074ad091a1c3..77949e314ba6dabb01875390cfcfe3418ea4e135 100644
--- a/src/client/ui/chat/note-preview.vue
+++ b/src/client/ui/chat/note-preview.vue
@@ -20,8 +20,8 @@
 import { defineComponent } from 'vue';
 import XNoteHeader from './note-header.vue';
 import XSubNoteContent from './sub-note-content.vue';
-import XCwButton from '@/components/cw-button.vue';
-import * as os from '@/os';
+import XCwButton from '@client/components/cw-button.vue';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/ui/chat/note.sub.vue b/src/client/ui/chat/note.sub.vue
index 6f365c29e9e910f6678420ea2d8d6d242c556f7b..6c778d14687e9f37cc3d86f1a8f84b299e3c06b8 100644
--- a/src/client/ui/chat/note.sub.vue
+++ b/src/client/ui/chat/note.sub.vue
@@ -23,8 +23,8 @@
 import { defineComponent } from 'vue';
 import XNoteHeader from './note-header.vue';
 import XSubNoteContent from './sub-note-content.vue';
-import XCwButton from '@/components/cw-button.vue';
-import * as os from '@/os';
+import XCwButton from '@client/components/cw-button.vue';
+import * as os from '@client/os';
 
 export default defineComponent({
 	name: 'XSub',
diff --git a/src/client/ui/chat/note.vue b/src/client/ui/chat/note.vue
index 97275875ca8ba374f18bd4935e1939db4f696072..4afd7989e11d0675eadce1846427a1e85547bac6 100644
--- a/src/client/ui/chat/note.vue
+++ b/src/client/ui/chat/note.vue
@@ -109,19 +109,19 @@ import { sum, unique } from '../../../prelude/array';
 import XSub from './note.sub.vue';
 import XNoteHeader from './note-header.vue';
 import XNotePreview from './note-preview.vue';
-import XReactionsViewer from '@/components/reactions-viewer.vue';
-import XMediaList from '@/components/media-list.vue';
-import XCwButton from '@/components/cw-button.vue';
-import XPoll from '@/components/poll.vue';
-import { pleaseLogin } from '@/scripts/please-login';
-import { focusPrev, focusNext } from '@/scripts/focus';
-import { url } from '@/config';
-import copyToClipboard from '@/scripts/copy-to-clipboard';
-import { checkWordMute } from '@/scripts/check-word-mute';
-import { userPage } from '@/filters/user';
-import * as os from '@/os';
-import { noteActions, noteViewInterruptors } from '@/store';
-import { reactionPicker } from '@/scripts/reaction-picker';
+import XReactionsViewer from '@client/components/reactions-viewer.vue';
+import XMediaList from '@client/components/media-list.vue';
+import XCwButton from '@client/components/cw-button.vue';
+import XPoll from '@client/components/poll.vue';
+import { pleaseLogin } from '@client/scripts/please-login';
+import { focusPrev, focusNext } from '@client/scripts/focus';
+import { url } from '@client/config';
+import copyToClipboard from '@client/scripts/copy-to-clipboard';
+import { checkWordMute } from '@client/scripts/check-word-mute';
+import { userPage } from '@client/filters/user';
+import * as os from '@client/os';
+import { noteActions, noteViewInterruptors } from '@client/store';
+import { reactionPicker } from '@client/scripts/reaction-picker';
 
 function markRawAll(...xs) {
 	for (const x of xs) {
@@ -140,8 +140,8 @@ export default defineComponent({
 		XMediaList,
 		XCwButton,
 		XPoll,
-		MkUrlPreview: defineAsyncComponent(() => import('@/components/url-preview.vue')),
-		MkInstanceTicker: defineAsyncComponent(() => import('@/components/instance-ticker.vue')),
+		MkUrlPreview: defineAsyncComponent(() => import('@client/components/url-preview.vue')),
+		MkInstanceTicker: defineAsyncComponent(() => import('@client/components/instance-ticker.vue')),
 	},
 
 	inject: {
@@ -669,7 +669,7 @@ export default defineComponent({
 						text: this.$ts.reportAbuse,
 						action: () => {
 							const u = `${url}/notes/${this.appearNote.id}`;
-							os.popup(import('@/components/abuse-report-window.vue'), {
+							os.popup(import('@client/components/abuse-report-window.vue'), {
 								user: this.appearNote.user,
 								initialComment: `Note: ${u}\n-----\n`
 							}, {}, 'closed');
diff --git a/src/client/ui/chat/notes.vue b/src/client/ui/chat/notes.vue
index 3a169cc20ab5a86b76be704895c979e9462bf3d0..45c2bd17a12684445265e6e33e0012b18928634e 100644
--- a/src/client/ui/chat/notes.vue
+++ b/src/client/ui/chat/notes.vue
@@ -29,10 +29,10 @@
 
 <script lang="ts">
 import { defineComponent } from 'vue';
-import paging from '@/scripts/paging';
+import paging from '@client/scripts/paging';
 import XNote from './note.vue';
 import XList from './date-separated-list.vue';
-import MkButton from '@/components/ui/button.vue';
+import MkButton from '@client/components/ui/button.vue';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/ui/chat/post-form.vue b/src/client/ui/chat/post-form.vue
index 9388989d5d38c30bcdcde05963f5c17f7c591376..5bb1a04d580de91828d8c3b5e8e69ed870010103 100644
--- a/src/client/ui/chat/post-form.vue
+++ b/src/client/ui/chat/post-form.vue
@@ -54,23 +54,23 @@ import insertTextAtCursor from 'insert-text-at-cursor';
 import { length } from 'stringz';
 import { toASCII } from 'punycode';
 import { parse } from '../../../mfm/parse';
-import { host, url } from '@/config';
+import { host, url } from '@client/config';
 import { erase, unique } from '../../../prelude/array';
-import extractMentions from '../../../misc/extract-mentions';
-import getAcct from '../../../misc/acct/render';
-import { formatTimeString } from '../../../misc/format-time-string';
-import { Autocomplete } from '@/scripts/autocomplete';
+import extractMentions from '@/misc/extract-mentions';
+import getAcct from '@/misc/acct/render';
+import { formatTimeString } from '@/misc/format-time-string';
+import { Autocomplete } from '@client/scripts/autocomplete';
 import { noteVisibilities } from '../../../types';
-import * as os from '@/os';
-import { selectFile } from '@/scripts/select-file';
-import { notePostInterruptors, postFormActions } from '@/store';
-import { isMobile } from '@/scripts/is-mobile';
+import * as os from '@client/os';
+import { selectFile } from '@client/scripts/select-file';
+import { notePostInterruptors, postFormActions } from '@client/store';
+import { isMobile } from '@client/scripts/is-mobile';
 import { throttle } from 'throttle-debounce';
 
 export default defineComponent({
 	components: {
-		XPostFormAttaches: defineAsyncComponent(() => import('@/components/post-form-attaches.vue')),
-		XPollEditor: defineAsyncComponent(() => import('@/components/poll-editor.vue'))
+		XPostFormAttaches: defineAsyncComponent(() => import('@client/components/post-form-attaches.vue')),
+		XPollEditor: defineAsyncComponent(() => import('@client/components/poll-editor.vue'))
 	},
 
 	props: {
@@ -387,7 +387,7 @@ export default defineComponent({
 				return;
 			}
 
-			os.popup(import('@/components/visibility-picker.vue'), {
+			os.popup(import('@client/components/visibility-picker.vue'), {
 				currentVisibility: this.visibility,
 				currentLocalOnly: this.localOnly,
 				src: this.$refs.visibilityButton
diff --git a/src/client/ui/chat/side.vue b/src/client/ui/chat/side.vue
index 0003158e5381da605603eef2d4b58eeaf8d9d9b3..2645874ce4a79fd5f17e191d71230b632d35efdd 100644
--- a/src/client/ui/chat/side.vue
+++ b/src/client/ui/chat/side.vue
@@ -13,10 +13,10 @@
 import { defineComponent } from 'vue';
 import { faTimes, faChevronLeft, faExpandAlt, faWindowMaximize, faExternalLinkAlt, faLink } from '@fortawesome/free-solid-svg-icons';
 import XHeader from '../_common_/header.vue';
-import * as os from '@/os';
-import copyToClipboard from '@/scripts/copy-to-clipboard';
-import { resolve } from '@/router';
-import { url } from '@/config';
+import * as os from '@client/os';
+import copyToClipboard from '@client/scripts/copy-to-clipboard';
+import { resolve } from '@client/router';
+import { url } from '@client/config';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/ui/chat/sub-note-content.vue b/src/client/ui/chat/sub-note-content.vue
index 7e742b8e54dc48e2255b98cef06304eec92e6289..e530a88172e94f946808e34e435cd2634b598f2c 100644
--- a/src/client/ui/chat/sub-note-content.vue
+++ b/src/client/ui/chat/sub-note-content.vue
@@ -21,9 +21,9 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import { faReply } from '@fortawesome/free-solid-svg-icons';
-import XPoll from '@/components/poll.vue';
-import XMediaList from '@/components/media-list.vue';
-import * as os from '@/os';
+import XPoll from '@client/components/poll.vue';
+import XMediaList from '@client/components/media-list.vue';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/ui/chat/timeline.vue b/src/client/ui/chat/timeline.vue
index 232e749c1cd87c2ee805cd7145115a1a85d3d622..13032cce0975158069fc40c1387f672413d0de3d 100644
--- a/src/client/ui/chat/timeline.vue
+++ b/src/client/ui/chat/timeline.vue
@@ -25,12 +25,12 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import XNotes from './notes.vue';
-import * as os from '@/os';
-import * as sound from '@/scripts/sound';
-import { scrollToBottom, getScrollPosition, getScrollContainer } from '@/scripts/scroll';
-import follow from '@/directives/follow-append';
+import * as os from '@client/os';
+import * as sound from '@client/scripts/sound';
+import { scrollToBottom, getScrollPosition, getScrollContainer } from '@client/scripts/scroll';
+import follow from '@client/directives/follow-append';
 import XPostForm from './post-form.vue';
-import MkInfo from '@/components/ui/info.vue';
+import MkInfo from '@client/components/ui/info.vue';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/ui/chat/widgets.vue b/src/client/ui/chat/widgets.vue
index 6b12f9dac9e63079ec2a928a0e7db5c1d7909f30..4d1865f616d7cec5b5c017384d7bb1e3fa93067b 100644
--- a/src/client/ui/chat/widgets.vue
+++ b/src/client/ui/chat/widgets.vue
@@ -9,7 +9,7 @@
 
 <script lang="ts">
 import { defineComponent, defineAsyncComponent } from 'vue';
-import XWidgets from '@/components/widgets.vue';
+import XWidgets from '@client/components/widgets.vue';
 import { store } from './store';
 
 export default defineComponent({
diff --git a/src/client/ui/deck.vue b/src/client/ui/deck.vue
index a074629ddd51650f769c3ff1f5dfd784e8db119c..a63db17b01adcb24ebce1da410f65688322f1d12 100644
--- a/src/client/ui/deck.vue
+++ b/src/client/ui/deck.vue
@@ -34,12 +34,12 @@ import { defineComponent } from 'vue';
 import { faPlus, faPencilAlt, faChevronLeft, faBars, faCircle } from '@fortawesome/free-solid-svg-icons';
 import {  } from '@fortawesome/free-regular-svg-icons';
 import { v4 as uuid } from 'uuid';
-import { host } from '@/config';
-import DeckColumnCore from '@/ui/deck/column-core.vue';
-import XSidebar from '@/components/sidebar.vue';
-import { getScrollContainer } from '@/scripts/scroll';
-import * as os from '@/os';
-import { sidebarDef } from '@/sidebar';
+import { host } from '@client/config';
+import DeckColumnCore from '@client/ui/deck/column-core.vue';
+import XSidebar from '@client/components/sidebar.vue';
+import { getScrollContainer } from '@client/scripts/scroll';
+import * as os from '@client/os';
+import { sidebarDef } from '@client/sidebar';
 import XCommon from './_common_/common.vue';
 import { deckStore, addColumn, loadDeck } from './deck/deck-store';
 
diff --git a/src/client/ui/deck/antenna-column.vue b/src/client/ui/deck/antenna-column.vue
index c6aa201e40b6977910bf4ef7ee83cf65a347c238..0de870233a4bae79a01d2c4f94349272f67d9428 100644
--- a/src/client/ui/deck/antenna-column.vue
+++ b/src/client/ui/deck/antenna-column.vue
@@ -12,8 +12,8 @@
 import { defineComponent } from 'vue';
 import { faSatellite, faCog } from '@fortawesome/free-solid-svg-icons';
 import XColumn from './column.vue';
-import XTimeline from '@/components/timeline.vue';
-import * as os from '@/os';
+import XTimeline from '@client/components/timeline.vue';
+import * as os from '@client/os';
 import { updateColumn } from './deck-store';
 
 export default defineComponent({
diff --git a/src/client/ui/deck/column.vue b/src/client/ui/deck/column.vue
index d0a39965b1ac5e457d5a7afacfd2e7643ecc51d6..6a242c691acb9d354f2771dfe92e9ed09828d7e9 100644
--- a/src/client/ui/deck/column.vue
+++ b/src/client/ui/deck/column.vue
@@ -34,7 +34,7 @@
 import { defineComponent } from 'vue';
 import { faArrowUp, faArrowDown, faAngleUp, faAngleDown, faCaretDown, faArrowRight, faArrowLeft, faPencilAlt, faCog } from '@fortawesome/free-solid-svg-icons';
 import { faWindowMaximize, faTrashAlt, faWindowRestore } from '@fortawesome/free-regular-svg-icons';
-import * as os from '@/os';
+import * as os from '@client/os';
 import { updateColumn, swapLeftColumn, swapRightColumn, swapUpColumn, swapDownColumn, stackLeftColumn, popRightColumn, removeColumn, swapColumn } from './deck-store';
 import { deckStore } from './deck-store';
 
diff --git a/src/client/ui/deck/deck-store.ts b/src/client/ui/deck/deck-store.ts
index 025d5d70f4b2bc25490f278244918faa1bb896f1..aa389d76104bd6911b722dcbefea185eebcc1f1b 100644
--- a/src/client/ui/deck/deck-store.ts
+++ b/src/client/ui/deck/deck-store.ts
@@ -1,6 +1,6 @@
 import { throttle } from 'throttle-debounce';
-import { i18n } from '@/i18n';
-import { api } from '@/os';
+import { i18n } from '@client/i18n';
+import { api } from '@client/os';
 import { markRaw, watch } from 'vue';
 import { Storage } from '../../pizzax';
 
diff --git a/src/client/ui/deck/direct-column.vue b/src/client/ui/deck/direct-column.vue
index 2ffbed562d71ae47f77ca28c1a0ea62c9a3e32ca..6fceae4ed7ac5815dcd2e49fea0b1398e8ba30b6 100644
--- a/src/client/ui/deck/direct-column.vue
+++ b/src/client/ui/deck/direct-column.vue
@@ -9,10 +9,10 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import { faEnvelope } from '@fortawesome/free-solid-svg-icons';
-import Progress from '@/scripts/loading';
+import Progress from '@client/scripts/loading';
 import XColumn from './column.vue';
-import XNotes from '@/components/notes.vue';
-import * as os from '@/os';
+import XNotes from '@client/components/notes.vue';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/ui/deck/list-column.vue b/src/client/ui/deck/list-column.vue
index 32807aabc912aa6c39043c3c0b171beee28ec36d..c70abc9f6e466ffaaed2978e26cecb3f9e772f58 100644
--- a/src/client/ui/deck/list-column.vue
+++ b/src/client/ui/deck/list-column.vue
@@ -12,8 +12,8 @@
 import { defineComponent } from 'vue';
 import { faListUl, faCog } from '@fortawesome/free-solid-svg-icons';
 import XColumn from './column.vue';
-import XTimeline from '@/components/timeline.vue';
-import * as os from '@/os';
+import XTimeline from '@client/components/timeline.vue';
+import * as os from '@client/os';
 import { updateColumn } from './deck-store';
 
 export default defineComponent({
diff --git a/src/client/ui/deck/main-column.vue b/src/client/ui/deck/main-column.vue
index 6d798c130c1ab7e775a987091fe9b7a37e958fe8..4577b0b533b1e06e80c84ba5957a24a212cf117f 100644
--- a/src/client/ui/deck/main-column.vue
+++ b/src/client/ui/deck/main-column.vue
@@ -18,10 +18,10 @@
 import { defineComponent } from 'vue';
 import { faWindowMaximize } from '@fortawesome/free-solid-svg-icons';
 import XColumn from './column.vue';
-import XNotes from '@/components/notes.vue';
-import XHeader from '@/ui/_common_/header.vue';
-import { deckStore } from '@/ui/deck/deck-store';
-import * as os from '@/os';
+import XNotes from '@client/components/notes.vue';
+import XHeader from '@client/ui/_common_/header.vue';
+import { deckStore } from '@client/ui/deck/deck-store';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/ui/deck/mentions-column.vue b/src/client/ui/deck/mentions-column.vue
index e79a9eb245b0c1664aa679774a5cb2e3b243c289..996123cb1f05815773e9cc3f57235ac8e552855c 100644
--- a/src/client/ui/deck/mentions-column.vue
+++ b/src/client/ui/deck/mentions-column.vue
@@ -9,10 +9,10 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import { faAt } from '@fortawesome/free-solid-svg-icons';
-import Progress from '@/scripts/loading';
+import Progress from '@client/scripts/loading';
 import XColumn from './column.vue';
-import XNotes from '@/components/notes.vue';
-import * as os from '@/os';
+import XNotes from '@client/components/notes.vue';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/ui/deck/notifications-column.vue b/src/client/ui/deck/notifications-column.vue
index 5feab8bab5b16f4df6e3b9d7425c9bc35476f933..1b29a2d54f00230956adb93ab3f543cb53cf3658 100644
--- a/src/client/ui/deck/notifications-column.vue
+++ b/src/client/ui/deck/notifications-column.vue
@@ -11,8 +11,8 @@ import { defineComponent } from 'vue';
 import { faCog } from '@fortawesome/free-solid-svg-icons';
 import { faBell } from '@fortawesome/free-regular-svg-icons';
 import XColumn from './column.vue';
-import XNotifications from '@/components/notifications.vue';
-import * as os from '@/os';
+import XNotifications from '@client/components/notifications.vue';
+import * as os from '@client/os';
 import { updateColumn } from './deck-store';
 
 export default defineComponent({
@@ -40,7 +40,7 @@ export default defineComponent({
 
 	methods: {
 		func() {
-			os.popup(import('@/components/notification-setting-window.vue'), {
+			os.popup(import('@client/components/notification-setting-window.vue'), {
 				includingTypes: this.column.includingTypes,
 			}, {
 				done: async (res) => {
diff --git a/src/client/ui/deck/tl-column.vue b/src/client/ui/deck/tl-column.vue
index 02af6a33110dd9b2710ba71e53590b8e2796cded..d4908d0edfae2bff82604ad6a459284e0b08294c 100644
--- a/src/client/ui/deck/tl-column.vue
+++ b/src/client/ui/deck/tl-column.vue
@@ -23,8 +23,8 @@
 import { defineComponent } from 'vue';
 import { faMinusCircle, faHome, faComments, faShareAlt, faGlobe, faCog } from '@fortawesome/free-solid-svg-icons';
 import XColumn from './column.vue';
-import XTimeline from '@/components/timeline.vue';
-import * as os from '@/os';
+import XTimeline from '@client/components/timeline.vue';
+import * as os from '@client/os';
 import { removeColumn, updateColumn } from './deck-store';
 
 export default defineComponent({
diff --git a/src/client/ui/deck/widgets-column.vue b/src/client/ui/deck/widgets-column.vue
index b7740c270d9d24acb3b85ccb457402561de6529f..992845ff7eacb029d7788789d4c4b8c4cb34af25 100644
--- a/src/client/ui/deck/widgets-column.vue
+++ b/src/client/ui/deck/widgets-column.vue
@@ -11,7 +11,7 @@
 <script lang="ts">
 import { defineComponent, defineAsyncComponent } from 'vue';
 import { faWindowMaximize, faTimes, faCog, faPlus } from '@fortawesome/free-solid-svg-icons';
-import XWidgets from '@/components/widgets.vue';
+import XWidgets from '@client/components/widgets.vue';
 import XColumn from './column.vue';
 import { addColumnWidget, removeColumnWidget, setColumnWidgets, updateColumnWidget } from './deck-store';
 
diff --git a/src/client/ui/default.side.vue b/src/client/ui/default.side.vue
index b58c339f2b933fbca4f150e66527049d4ddb62bd..995f987a6a13ef7e3ca3d74817e03604d51fe5aa 100644
--- a/src/client/ui/default.side.vue
+++ b/src/client/ui/default.side.vue
@@ -16,10 +16,10 @@
 import { defineComponent } from 'vue';
 import { faTimes, faChevronLeft, faExpandAlt, faWindowMaximize, faExternalLinkAlt, faLink } from '@fortawesome/free-solid-svg-icons';
 import XHeader from './_common_/header.vue';
-import * as os from '@/os';
-import copyToClipboard from '@/scripts/copy-to-clipboard';
-import { resolve } from '@/router';
-import { url } from '@/config';
+import * as os from '@client/os';
+import copyToClipboard from '@client/scripts/copy-to-clipboard';
+import { resolve } from '@client/router';
+import { url } from '@client/config';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/ui/default.vue b/src/client/ui/default.vue
index 220dee9d6d7665a1bec45afd1b432221a61a3255..38f98f6365ec92290cf9a9f4aa2692d639b1ee35 100644
--- a/src/client/ui/default.vue
+++ b/src/client/ui/default.vue
@@ -57,14 +57,14 @@
 import { defineComponent, defineAsyncComponent } from 'vue';
 import { faLayerGroup, faBars, faHome, faCircle, faWindowMaximize, faColumns, faPencilAlt } from '@fortawesome/free-solid-svg-icons';
 import { faBell } from '@fortawesome/free-regular-svg-icons';
-import { instanceName } from '@/config';
-import { StickySidebar } from '@/scripts/sticky-sidebar';
-import XSidebar from '@/components/sidebar.vue';
+import { instanceName } from '@client/config';
+import { StickySidebar } from '@client/scripts/sticky-sidebar';
+import XSidebar from '@client/components/sidebar.vue';
 import XCommon from './_common_/common.vue';
 import XHeader from './_common_/header.vue';
 import XSide from './default.side.vue';
-import * as os from '@/os';
-import { sidebarDef } from '@/sidebar';
+import * as os from '@client/os';
+import { sidebarDef } from '@client/sidebar';
 
 const DESKTOP_THRESHOLD = 1100;
 
diff --git a/src/client/ui/default.widgets.vue b/src/client/ui/default.widgets.vue
index ff7cdf11400db578e1370b988e751aa3a50b8582..35d3442bb2f9f9e0be6bdd1676214371cf1ef9df 100644
--- a/src/client/ui/default.widgets.vue
+++ b/src/client/ui/default.widgets.vue
@@ -10,8 +10,8 @@
 <script lang="ts">
 import { defineComponent, defineAsyncComponent } from 'vue';
 import { faPencilAlt, faPlus, faBars, faTimes, faCheck } from '@fortawesome/free-solid-svg-icons';
-import XWidgets from '@/components/widgets.vue';
-import * as os from '@/os';
+import XWidgets from '@client/components/widgets.vue';
+import * as os from '@client/os';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/ui/desktop.vue b/src/client/ui/desktop.vue
index a1f58af5cc8fd313cd70d0ebe3a3431f32713af8..1480fd18401fe6702a9a134876345a69e4b30448 100644
--- a/src/client/ui/desktop.vue
+++ b/src/client/ui/desktop.vue
@@ -8,13 +8,13 @@
 
 <script lang="ts">
 import { defineComponent } from 'vue';
-import { host } from '@/config';
-import { search } from '@/scripts/search';
+import { host } from '@client/config';
+import { search } from '@client/scripts/search';
 import XCommon from './_common_/common.vue';
-import * as os from '@/os';
-import XSidebar from '@/components/sidebar.vue';
-import { sidebarDef } from '@/sidebar';
-import { ColdDeviceStorage } from '@/store';
+import * as os from '@client/os';
+import XSidebar from '@client/components/sidebar.vue';
+import { sidebarDef } from '@client/sidebar';
+import { ColdDeviceStorage } from '@client/store';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/ui/visitor/a.vue b/src/client/ui/visitor/a.vue
index d25b5591ef37393e8319077a2a698794bf716a91..2aed50100cb793d466cc14ae71823f90054f09f5 100644
--- a/src/client/ui/visitor/a.vue
+++ b/src/client/ui/visitor/a.vue
@@ -42,13 +42,13 @@
 <script lang="ts">
 import { defineComponent, defineAsyncComponent } from 'vue';
 import { } from '@fortawesome/free-solid-svg-icons';
-import { host, instanceName } from '@/config';
-import { search } from '@/scripts/search';
-import * as os from '@/os';
-import MkPagination from '@/components/ui/pagination.vue';
-import MkButton from '@/components/ui/button.vue';
+import { host, instanceName } from '@client/config';
+import { search } from '@client/scripts/search';
+import * as os from '@client/os';
+import MkPagination from '@client/components/ui/pagination.vue';
+import MkButton from '@client/components/ui/button.vue';
 import XHeader from './header.vue';
-import { ColdDeviceStorage } from '@/store';
+import { ColdDeviceStorage } from '@client/store';
 
 const DESKTOP_THRESHOLD = 1100;
 
diff --git a/src/client/ui/visitor/b.vue b/src/client/ui/visitor/b.vue
index 1f559c89178978d95ad5a5cb8e153226a2ae8c97..bd00773c5734199dadd57a408bf5208ac35ead42 100644
--- a/src/client/ui/visitor/b.vue
+++ b/src/client/ui/visitor/b.vue
@@ -51,16 +51,16 @@
 <script lang="ts">
 import { defineComponent, defineAsyncComponent } from 'vue';
 import { } from '@fortawesome/free-solid-svg-icons';
-import { host, instanceName } from '@/config';
-import { search } from '@/scripts/search';
-import * as os from '@/os';
-import MkPagination from '@/components/ui/pagination.vue';
-import XSigninDialog from '@/components/signin-dialog.vue';
-import XSignupDialog from '@/components/signup-dialog.vue';
-import MkButton from '@/components/ui/button.vue';
+import { host, instanceName } from '@client/config';
+import { search } from '@client/scripts/search';
+import * as os from '@client/os';
+import MkPagination from '@client/components/ui/pagination.vue';
+import XSigninDialog from '@client/components/signin-dialog.vue';
+import XSignupDialog from '@client/components/signup-dialog.vue';
+import MkButton from '@client/components/ui/button.vue';
 import XHeader from './header.vue';
 import XKanban from './kanban.vue';
-import { ColdDeviceStorage } from '@/store';
+import { ColdDeviceStorage } from '@client/store';
 
 const DESKTOP_THRESHOLD = 1100;
 
diff --git a/src/client/ui/visitor/header.vue b/src/client/ui/visitor/header.vue
index 9a7bf96fc003e31bea4bfce4a40981f1844c3833..a66c4d5fb00867e6eb86158529f73c25d2d44e44 100644
--- a/src/client/ui/visitor/header.vue
+++ b/src/client/ui/visitor/header.vue
@@ -42,10 +42,10 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import { faSearch, faHome, faFireAlt, faHashtag, faSatelliteDish, faBars } from '@fortawesome/free-solid-svg-icons';
-import XSigninDialog from '@/components/signin-dialog.vue';
-import XSignupDialog from '@/components/signup-dialog.vue';
-import * as os from '@/os';
-import { search } from '@/scripts/search';
+import XSigninDialog from '@client/components/signin-dialog.vue';
+import XSignupDialog from '@client/components/signup-dialog.vue';
+import * as os from '@client/os';
+import { search } from '@client/scripts/search';
 
 export default defineComponent({
 	props: {
diff --git a/src/client/ui/visitor/kanban.vue b/src/client/ui/visitor/kanban.vue
index 6a4bcd1adb430993adddb843e67906eed262a91c..8317f24402dc0b3fc81f7b696508c06d0130cb0e 100644
--- a/src/client/ui/visitor/kanban.vue
+++ b/src/client/ui/visitor/kanban.vue
@@ -39,12 +39,12 @@
 <script lang="ts">
 import { defineComponent, defineAsyncComponent } from 'vue';
 import { } from '@fortawesome/free-solid-svg-icons';
-import { host, instanceName } from '@/config';
-import * as os from '@/os';
-import MkPagination from '@/components/ui/pagination.vue';
-import XSigninDialog from '@/components/signin-dialog.vue';
-import XSignupDialog from '@/components/signup-dialog.vue';
-import MkButton from '@/components/ui/button.vue';
+import { host, instanceName } from '@client/config';
+import * as os from '@client/os';
+import MkPagination from '@client/components/ui/pagination.vue';
+import XSigninDialog from '@client/components/signin-dialog.vue';
+import XSignupDialog from '@client/components/signup-dialog.vue';
+import MkButton from '@client/components/ui/button.vue';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/ui/zen.vue b/src/client/ui/zen.vue
index ab9e08e768d6b39493c38e19a3d296ea39644b87..9215a639b0cdb9d4e60442393b56c59c63e91585 100644
--- a/src/client/ui/zen.vue
+++ b/src/client/ui/zen.vue
@@ -25,7 +25,7 @@
 import { defineComponent, defineAsyncComponent } from 'vue';
 import { faLayerGroup, faBars, faHome, faCircle } from '@fortawesome/free-solid-svg-icons';
 import { faBell } from '@fortawesome/free-regular-svg-icons';
-import { host } from '@/config';
+import { host } from '@client/config';
 import XHeader from './_common_/header.vue';
 import XCommon from './_common_/common.vue';
 
diff --git a/src/client/widgets/activity.calendar.vue b/src/client/widgets/activity.calendar.vue
index b833bd65cad17d0ca61cdb549854b180d80fd813..ff767190f61706fadc66aa57a2a9eb9fc709bd40 100644
--- a/src/client/widgets/activity.calendar.vue
+++ b/src/client/widgets/activity.calendar.vue
@@ -25,7 +25,7 @@
 
 <script lang="ts">
 import { defineComponent } from 'vue';
-import * as os from '@/os';
+import * as os from '@client/os';
 
 export default defineComponent({
 	props: ['data'],
diff --git a/src/client/widgets/activity.chart.vue b/src/client/widgets/activity.chart.vue
index 9702d66663d2e41a10a153ab25cf64871b1aef50..ee5bc25113df9d9a1563c497ead180e6ad54aab1 100644
--- a/src/client/widgets/activity.chart.vue
+++ b/src/client/widgets/activity.chart.vue
@@ -26,7 +26,7 @@
 
 <script lang="ts">
 import { defineComponent } from 'vue';
-import * as os from '@/os';
+import * as os from '@client/os';
 
 function dragListen(fn) {
 	window.addEventListener('mousemove',  fn);
diff --git a/src/client/widgets/activity.vue b/src/client/widgets/activity.vue
index a92644e0abde3fc8971ea48bc59276569d596694..9623765e40a9f7f839c310b38adf023f7e0d632d 100644
--- a/src/client/widgets/activity.vue
+++ b/src/client/widgets/activity.vue
@@ -16,11 +16,11 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import { faChartBar, faSort } from '@fortawesome/free-solid-svg-icons';
-import MkContainer from '@/components/ui/container.vue';
+import MkContainer from '@client/components/ui/container.vue';
 import define from './define';
 import XCalendar from './activity.calendar.vue';
 import XChart from './activity.chart.vue';
-import * as os from '@/os';
+import * as os from '@client/os';
 
 const widget = define({
 	name: 'activity',
diff --git a/src/client/widgets/aiscript.vue b/src/client/widgets/aiscript.vue
index f885db886be85e851ae48d488ee406aa60477a99..84390866bd16045ddef142c4225531034699d4ef 100644
--- a/src/client/widgets/aiscript.vue
+++ b/src/client/widgets/aiscript.vue
@@ -15,11 +15,11 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import { faTerminal } from '@fortawesome/free-solid-svg-icons';
-import MkContainer from '@/components/ui/container.vue';
+import MkContainer from '@client/components/ui/container.vue';
 import define from './define';
-import * as os from '@/os';
+import * as os from '@client/os';
 import { AiScript, parse, utils } from '@syuilo/aiscript';
-import { createAiScriptEnv } from '@/scripts/aiscript/api';
+import { createAiScriptEnv } from '@client/scripts/aiscript/api';
 
 const widget = define({
 	name: 'aiscript',
diff --git a/src/client/widgets/button.vue b/src/client/widgets/button.vue
index 3417181d0c245ab02819bf06fd631bb21c5c9be2..af6718c50792dbf627def000bf8b64330430444f 100644
--- a/src/client/widgets/button.vue
+++ b/src/client/widgets/button.vue
@@ -9,10 +9,10 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import define from './define';
-import MkButton from '@/components/ui/button.vue';
-import * as os from '@/os';
+import MkButton from '@client/components/ui/button.vue';
+import * as os from '@client/os';
 import { AiScript, parse, utils } from '@syuilo/aiscript';
-import { createAiScriptEnv } from '@/scripts/aiscript/api';
+import { createAiScriptEnv } from '@client/scripts/aiscript/api';
 
 const widget = define({
 	name: 'button',
diff --git a/src/client/widgets/calendar.vue b/src/client/widgets/calendar.vue
index 545072e87be6d00f1af784ada8cec09dca5f1a1a..fe39145f0d37c7ada41e7ebb2f763caaba080b05 100644
--- a/src/client/widgets/calendar.vue
+++ b/src/client/widgets/calendar.vue
@@ -34,7 +34,7 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import define from './define';
-import * as os from '@/os';
+import * as os from '@client/os';
 
 const widget = define({
 	name: 'calendar',
diff --git a/src/client/widgets/clock.vue b/src/client/widgets/clock.vue
index 2aad24baec6c65828fed6c92cfb8087fe4b0b662..e0689a294f9860bc5aa2d1c4cda1f5219c7c94e1 100644
--- a/src/client/widgets/clock.vue
+++ b/src/client/widgets/clock.vue
@@ -9,9 +9,9 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import define from './define';
-import MkContainer from '@/components/ui/container.vue';
-import MkAnalogClock from '@/components/analog-clock.vue';
-import * as os from '@/os';
+import MkContainer from '@client/components/ui/container.vue';
+import MkAnalogClock from '@client/components/analog-clock.vue';
+import * as os from '@client/os';
 
 const widget = define({
 	name: 'clock',
diff --git a/src/client/widgets/define.ts b/src/client/widgets/define.ts
index 08a346d97c40568f150ae13bd72a2b6fd604a4ec..22b7fb30a1e2befe875e1890e33dcdc15050f5d6 100644
--- a/src/client/widgets/define.ts
+++ b/src/client/widgets/define.ts
@@ -1,7 +1,7 @@
 import { defineComponent } from 'vue';
 import { throttle } from 'throttle-debounce';
-import { Form } from '@/scripts/form';
-import * as os from '@/os';
+import { Form } from '@client/scripts/form';
+import * as os from '@client/os';
 
 export default function <T extends Form>(data: {
 	name: string;
diff --git a/src/client/widgets/digital-clock.vue b/src/client/widgets/digital-clock.vue
index 9d32e8b9fe9a935b441284c9f9e7ffbd9ec1929b..2202c9ed4b3382927298372436aaeff245bb48c0 100644
--- a/src/client/widgets/digital-clock.vue
+++ b/src/client/widgets/digital-clock.vue
@@ -15,7 +15,7 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import define from './define';
-import * as os from '@/os';
+import * as os from '@client/os';
 
 const widget = define({
 	name: 'digitalClock',
diff --git a/src/client/widgets/federation.vue b/src/client/widgets/federation.vue
index 6e76bc40e910f5c0a874b14e845fe3496297fe57..6eb656ce05136d41c9dbc398809e83e0047414d4 100644
--- a/src/client/widgets/federation.vue
+++ b/src/client/widgets/federation.vue
@@ -21,10 +21,10 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import { faGlobe } from '@fortawesome/free-solid-svg-icons';
-import MkContainer from '@/components/ui/container.vue';
+import MkContainer from '@client/components/ui/container.vue';
 import define from './define';
-import MkMiniChart from '@/components/mini-chart.vue';
-import * as os from '@/os';
+import MkMiniChart from '@client/components/mini-chart.vue';
+import * as os from '@client/os';
 
 const widget = define({
 	name: 'federation',
diff --git a/src/client/widgets/job-queue.vue b/src/client/widgets/job-queue.vue
index b7bfb6de27bbca78913de50eaded5f6e148a9134..aaf2b2fc8f49d629d7437ae2c5317c39f6cccb07 100644
--- a/src/client/widgets/job-queue.vue
+++ b/src/client/widgets/job-queue.vue
@@ -49,8 +49,8 @@
 import { defineComponent } from 'vue';
 import { faExclamationTriangle } from '@fortawesome/free-solid-svg-icons';
 import define from './define';
-import * as os from '@/os';
-import number from '@/filters/number';
+import * as os from '@client/os';
+import number from '@client/filters/number';
 
 const widget = define({
 	name: 'jobQueue',
diff --git a/src/client/widgets/memo.vue b/src/client/widgets/memo.vue
index 3512429e0db7c8aab60a0f7d86e5bbfa153272ad..4a7786312adfa145da8bd6f789b1732111fd130a 100644
--- a/src/client/widgets/memo.vue
+++ b/src/client/widgets/memo.vue
@@ -12,9 +12,9 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import { faStickyNote } from '@fortawesome/free-solid-svg-icons';
-import MkContainer from '@/components/ui/container.vue';
+import MkContainer from '@client/components/ui/container.vue';
 import define from './define';
-import * as os from '@/os';
+import * as os from '@client/os';
 
 const widget = define({
 	name: 'memo',
diff --git a/src/client/widgets/notifications.vue b/src/client/widgets/notifications.vue
index c3eb6ee79a119b67ceec2039855b2e0b09b9d6de..b4c2201862723ee2bde68bd4dc52845a32a74425 100644
--- a/src/client/widgets/notifications.vue
+++ b/src/client/widgets/notifications.vue
@@ -12,10 +12,10 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import { faBell, faCog } from '@fortawesome/free-solid-svg-icons';
-import MkContainer from '@/components/ui/container.vue';
-import XNotifications from '@/components/notifications.vue';
+import MkContainer from '@client/components/ui/container.vue';
+import XNotifications from '@client/components/notifications.vue';
 import define from './define';
-import * as os from '@/os';
+import * as os from '@client/os';
 
 const widget = define({
 	name: 'notifications',
@@ -52,7 +52,7 @@ export default defineComponent({
 
 	methods: {
 		configure() {
-			os.popup(import('@/components/notification-setting-window.vue'), {
+			os.popup(import('@client/components/notification-setting-window.vue'), {
 				includingTypes: this.props.includingTypes,
 			}, {
 				done: async (res) => {
diff --git a/src/client/widgets/online-users.vue b/src/client/widgets/online-users.vue
index 5b889f4816b0ff757b34bb46783169332a2c8d4a..37060fca43e7c414d197213a8158b26552ed8302 100644
--- a/src/client/widgets/online-users.vue
+++ b/src/client/widgets/online-users.vue
@@ -9,7 +9,7 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import define from './define';
-import * as os from '@/os';
+import * as os from '@client/os';
 
 const widget = define({
 	name: 'onlineUsers',
diff --git a/src/client/widgets/photos.vue b/src/client/widgets/photos.vue
index ada15486badafb53f327475435641f735379fe17..f1041b4ec258936e974fe9ed46ecaa828ead220f 100644
--- a/src/client/widgets/photos.vue
+++ b/src/client/widgets/photos.vue
@@ -17,10 +17,10 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import { faCamera } from '@fortawesome/free-solid-svg-icons';
-import MkContainer from '@/components/ui/container.vue';
+import MkContainer from '@client/components/ui/container.vue';
 import define from './define';
-import { getStaticImageUrl } from '@/scripts/get-static-image-url';
-import * as os from '@/os';
+import { getStaticImageUrl } from '@client/scripts/get-static-image-url';
+import * as os from '@client/os';
 
 const widget = define({
 	name: 'photos',
diff --git a/src/client/widgets/post-form.vue b/src/client/widgets/post-form.vue
index 5ecaa67b5a4888c38a90673c436d1023507ab482..1f260c20d9ca715d74724a5d4df89ffb41b682a4 100644
--- a/src/client/widgets/post-form.vue
+++ b/src/client/widgets/post-form.vue
@@ -4,7 +4,7 @@
 
 <script lang="ts">
 import { defineComponent } from 'vue';
-import XPostForm from '@/components/post-form.vue';
+import XPostForm from '@client/components/post-form.vue';
 import define from './define';
 
 const widget = define({
diff --git a/src/client/widgets/rss.vue b/src/client/widgets/rss.vue
index 1140a4252f63e18698e5c52b669c1e4c080a07b5..78ad390d275fb2f0b25f654ebbf84209761a1631 100644
--- a/src/client/widgets/rss.vue
+++ b/src/client/widgets/rss.vue
@@ -15,9 +15,9 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import { faRssSquare, faCog } from '@fortawesome/free-solid-svg-icons';
-import MkContainer from '@/components/ui/container.vue';
+import MkContainer from '@client/components/ui/container.vue';
 import define from './define';
-import * as os from '@/os';
+import * as os from '@client/os';
 
 const widget = define({
 	name: 'rss',
diff --git a/src/client/widgets/server-metric/disk.vue b/src/client/widgets/server-metric/disk.vue
index 41f967d29107d373ee9c34df557f1fbcce8285c2..fa5933e7b900e3d2cd1aa91b098b435025239e93 100644
--- a/src/client/widgets/server-metric/disk.vue
+++ b/src/client/widgets/server-metric/disk.vue
@@ -14,7 +14,7 @@
 import { defineComponent } from 'vue';
 import { faHdd } from '@fortawesome/free-solid-svg-icons';
 import XPie from './pie.vue';
-import bytes from '@/filters/bytes';
+import bytes from '@client/filters/bytes';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/widgets/server-metric/index.vue b/src/client/widgets/server-metric/index.vue
index 2ce87ba4168efa036a13ccb2c9c34b6ab8790a20..7f2aea6b49f6ce5dacda0f5d1a8dacab08002f0b 100644
--- a/src/client/widgets/server-metric/index.vue
+++ b/src/client/widgets/server-metric/index.vue
@@ -17,13 +17,13 @@
 import { defineComponent } from 'vue';
 import { faServer, faSort } from '@fortawesome/free-solid-svg-icons';
 import define from '../define';
-import MkContainer from '@/components/ui/container.vue';
+import MkContainer from '@client/components/ui/container.vue';
 import XCpuMemory from './cpu-mem.vue';
 import XNet from './net.vue';
 import XCpu from './cpu.vue';
 import XMemory from './mem.vue';
 import XDisk from './disk.vue';
-import * as os from '@/os';
+import * as os from '@client/os';
 
 const widget = define({
 	name: 'serverMetric',
diff --git a/src/client/widgets/server-metric/mem.vue b/src/client/widgets/server-metric/mem.vue
index 83aa71aa09c064ea1efbabc402ead071ca125b22..89fa8fef43945fdc74c5cb5ee5640bbcf0672e4a 100644
--- a/src/client/widgets/server-metric/mem.vue
+++ b/src/client/widgets/server-metric/mem.vue
@@ -14,7 +14,7 @@
 import { defineComponent } from 'vue';
 import { faMemory } from '@fortawesome/free-solid-svg-icons';
 import XPie from './pie.vue';
-import bytes from '@/filters/bytes';
+import bytes from '@client/filters/bytes';
 
 export default defineComponent({
 	components: {
diff --git a/src/client/widgets/server-metric/net.vue b/src/client/widgets/server-metric/net.vue
index 23c148eeb6ba0677b9ebf0a32f3755c75ad5e757..569c15b58bcd0414daf5cb48a1f44b2216f70dee 100644
--- a/src/client/widgets/server-metric/net.vue
+++ b/src/client/widgets/server-metric/net.vue
@@ -45,7 +45,7 @@
 
 <script lang="ts">
 import { defineComponent } from 'vue';
-import bytes from '@/filters/bytes';
+import bytes from '@client/filters/bytes';
 
 export default defineComponent({
 	props: {
diff --git a/src/client/widgets/slideshow.vue b/src/client/widgets/slideshow.vue
index 5d2e2b1ebd3109bc0c9824457a4bf6bbdf1d70fc..69c5cc01b2c6e6ba4411d8b0c8eb68c3c35d7729 100644
--- a/src/client/widgets/slideshow.vue
+++ b/src/client/widgets/slideshow.vue
@@ -16,7 +16,7 @@
 import { defineComponent } from 'vue';
 import {  } from '@fortawesome/free-solid-svg-icons';
 import define from './define';
-import * as os from '@/os';
+import * as os from '@client/os';
 
 const widget = define({
 	name: 'slideshow',
diff --git a/src/client/widgets/timeline.vue b/src/client/widgets/timeline.vue
index ee60790cb612e9e523236f4034880ec35d79d94a..f1ddc9cb801f6cf69990a9198ac1546c3eda0f86 100644
--- a/src/client/widgets/timeline.vue
+++ b/src/client/widgets/timeline.vue
@@ -23,10 +23,10 @@
 import { defineComponent } from 'vue';
 import { faAngleDown, faAngleUp, faHome, faShareAlt, faGlobe, faListUl, faSatellite } from '@fortawesome/free-solid-svg-icons';
 import { faComments } from '@fortawesome/free-regular-svg-icons';
-import MkContainer from '@/components/ui/container.vue';
-import XTimeline from '@/components/timeline.vue';
+import MkContainer from '@client/components/ui/container.vue';
+import XTimeline from '@client/components/timeline.vue';
 import define from './define';
-import * as os from '@/os';
+import * as os from '@client/os';
 
 const widget = define({
 	name: 'timeline',
diff --git a/src/client/widgets/trends.vue b/src/client/widgets/trends.vue
index 3734573e3cd1c99e038791152f3e5ad16a83d2db..300e3b31de74cbe9e4e7049a9f031d0bddf44449 100644
--- a/src/client/widgets/trends.vue
+++ b/src/client/widgets/trends.vue
@@ -20,10 +20,10 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import { faHashtag } from '@fortawesome/free-solid-svg-icons';
-import MkContainer from '@/components/ui/container.vue';
+import MkContainer from '@client/components/ui/container.vue';
 import define from './define';
-import MkMiniChart from '@/components/mini-chart.vue';
-import * as os from '@/os';
+import MkMiniChart from '@client/components/mini-chart.vue';
+import * as os from '@client/os';
 
 const widget = define({
 	name: 'hashtags',
diff --git a/src/config/load.ts b/src/config/load.ts
index 558bc68e1064d84762775392ff42c9f84a2c8a66..0929e8041455a7200dfaaa1e8ada18fcd6953297 100644
--- a/src/config/load.ts
+++ b/src/config/load.ts
@@ -5,7 +5,7 @@
 import * as fs from 'fs';
 import * as yaml from 'js-yaml';
 import { Source, Mixin } from './types';
-import * as meta from '../meta.json';
+const meta = require('../meta.json');
 
 /**
  * Path of configuration directory
diff --git a/src/db/elasticsearch.ts b/src/db/elasticsearch.ts
index 048e399bdfd57b7dbb2b6dda546e18db4af95cdf..58455b510d835339154715e0550e22f4f52bcaf4 100644
--- a/src/db/elasticsearch.ts
+++ b/src/db/elasticsearch.ts
@@ -1,5 +1,5 @@
 import * as elasticsearch from '@elastic/elasticsearch';
-import config from '../config';
+import config from '@/config';
 
 const index = {
 	settings: {
diff --git a/src/db/postgre.ts b/src/db/postgre.ts
index 831e5e05923d22bacee4e46ff9be7d42ab6f98b7..d53d315f7ba281b1873da206ae5725314d672380 100644
--- a/src/db/postgre.ts
+++ b/src/db/postgre.ts
@@ -3,7 +3,7 @@ const types = require('pg').types;
 types.setTypeParser(20, Number);
 
 import { createConnection, Logger, getConnection } from 'typeorm';
-import config from '../config';
+import config from '@/config';
 import { entities as charts } from '../services/chart/entities';
 import { dbLogger } from './logger';
 import * as highlight from 'cli-highlight';
diff --git a/src/db/redis.ts b/src/db/redis.ts
index 41d030149c3d117441edad1b3feb08701f973322..a10422846ffe6fc2fd1e25ea3896cb7448e51aca 100644
--- a/src/db/redis.ts
+++ b/src/db/redis.ts
@@ -1,12 +1,19 @@
 import * as redis from 'redis';
-import config from '../config';
+import config from '@/config';
 
-export default redis.createClient(
-	config.redis.port,
-	config.redis.host,
-	{
-		password: config.redis.pass,
-		prefix: config.redis.prefix,
-		db: config.redis.db || 0
-	}
-);
+export function createConnection() {
+	return redis.createClient(
+		config.redis.port,
+		config.redis.host,
+		{
+			password: config.redis.pass,
+			prefix: config.redis.prefix,
+			db: config.redis.db || 0
+		}
+	);
+}
+
+export const subsdcriber = createConnection();
+subsdcriber.subscribe(config.host);
+
+export const redisClient = createConnection();
diff --git a/src/mfm/language.ts b/src/mfm/language.ts
index cf00f063249498a9c37243843cc3bee167e3a3e2..bad7b10a0d9c4d764c25b985b71ee3bcf7c5d8f4 100644
--- a/src/mfm/language.ts
+++ b/src/mfm/language.ts
@@ -1,9 +1,9 @@
 import * as P from 'parsimmon';
 import { createLeaf, createTree, urlRegex } from './prelude';
 import { takeWhile, cumulativeSum } from '../prelude/array';
-import parseAcct from '../misc/acct/parse';
+import parseAcct from '@/misc/acct/parse';
 import { toUnicode } from 'punycode';
-import { emojiRegex } from '../misc/emoji-regex';
+import { emojiRegex } from '@/misc/emoji-regex';
 
 export function removeOrphanedBrackets(s: string): string {
 	const openBrackets = ['(', '「', '['];
diff --git a/src/mfm/to-html.ts b/src/mfm/to-html.ts
index c09272caad0d2b88bc9bd516f15a78e93c0686c5..66015d539f825432909e57af69ecc20bbf9929d8 100644
--- a/src/mfm/to-html.ts
+++ b/src/mfm/to-html.ts
@@ -1,5 +1,5 @@
 import { JSDOM } from 'jsdom';
-import config from '../config';
+import config from '@/config';
 import { intersperse } from '../prelude/array';
 import { MfmForest, MfmTree } from './prelude';
 import { IMentionedRemoteUsers } from '../models/entities/note';
diff --git a/src/mfm/to-string.ts b/src/mfm/to-string.ts
index b70b99cbda9c3f47fb9fc59d65a8d1c680faa86e..347c94c247ba270980cdeb5571a36c3a33009939 100644
--- a/src/mfm/to-string.ts
+++ b/src/mfm/to-string.ts
@@ -1,5 +1,5 @@
 import { MfmForest, MfmTree } from './prelude';
-import { nyaize } from '../misc/nyaize';
+import { nyaize } from '@/misc/nyaize';
 
 export type RestoreOptions = {
 	doNyaize?: boolean;
diff --git a/src/misc/antenna-cache.ts b/src/misc/antenna-cache.ts
new file mode 100644
index 0000000000000000000000000000000000000000..6be1c18db555dd66aa8acaf924bbc40e721cd6f3
--- /dev/null
+++ b/src/misc/antenna-cache.ts
@@ -0,0 +1,36 @@
+import { Antennas } from '../models';
+import { Antenna } from '../models/entities/antenna';
+import { subsdcriber } from '../db/redis';
+
+let antennasFetched = false;
+let antennas: Antenna[] = [];
+
+export async function getAntennas() {
+	if (!antennasFetched) {
+		antennas = await Antennas.find();
+		antennasFetched = true;
+	}
+
+	return antennas;
+}
+
+subsdcriber.on('message', async (_, data) => {
+	const obj = JSON.parse(data);
+
+	if (obj.channel === 'internal') {
+		const { type, body } = obj.message;
+		switch (type) {
+			case 'antennaCreated':
+				antennas.push(body);
+				break;
+			case 'antennaUpdated':
+				antennas[antennas.findIndex(a => a.id === body.id)] = body;
+				break;
+			case 'antennaDeleted':
+				antennas = antennas.filter(a => a.id !== body.id);
+				break;
+			default:
+				break;
+		}
+	}
+});
diff --git a/src/misc/app-lock.ts b/src/misc/app-lock.ts
index 847299b46da215bed8f75d4f3d8a6588dba0f6f8..9ae2cba47831cc3247b869b128e23956f54fe9e1 100644
--- a/src/misc/app-lock.ts
+++ b/src/misc/app-lock.ts
@@ -1,4 +1,4 @@
-import redis from '../db/redis';
+import { redisClient } from '../db/redis';
 import { promisify } from 'util';
 
 /**
@@ -7,8 +7,8 @@ import { promisify } from 'util';
 const retryDelay = 100;
 
 const lock: (key: string, timeout?: number) => Promise<() => void>
-	= redis
-	? promisify(require('redis-lock')(redis, retryDelay))
+	= redisClient
+	? promisify(require('redis-lock')(redisClient, retryDelay))
 	: async () => () => { };
 
 /**
diff --git a/src/misc/captcha.ts b/src/misc/captcha.ts
index 87ec143ca89a3494b031b1ad29680ce13bd041db..727c86af0fd951876659696449b3c83cf2a47b14 100644
--- a/src/misc/captcha.ts
+++ b/src/misc/captcha.ts
@@ -1,7 +1,7 @@
 import fetch from 'node-fetch';
 import { URLSearchParams } from 'url';
 import { getAgentByUrl } from './fetch';
-import config from '../config';
+import config from '@/config';
 
 export async function verifyRecaptcha(secret: string, response: string) {
 	const result = await getCaptchaResponse('https://www.recaptcha.net/recaptcha/api/siteverify', secret, response).catch(e => {
diff --git a/src/misc/check-hit-antenna.ts b/src/misc/check-hit-antenna.ts
index 0464f141316be781db526dd7f7eee0f246ce24a2..9897dd414eebc14af5198c5e12327745fbb47e2f 100644
--- a/src/misc/check-hit-antenna.ts
+++ b/src/misc/check-hit-antenna.ts
@@ -4,18 +4,24 @@ import { User } from '../models/entities/user';
 import { UserListJoinings, UserGroupJoinings } from '../models';
 import parseAcct from './acct/parse';
 import { getFullApAccount } from './convert-host';
+import { PackedNote } from '../models/repositories/note';
 
-export async function checkHitAntenna(antenna: Antenna, note: Note, noteUser: User, followers: User['id'][]): Promise<boolean> {
+/**
+ * noteUserFollowers / antennaUserFollowing はどちらか一方が指定されていればよい
+ */
+export async function checkHitAntenna(antenna: Antenna, note: (Note | PackedNote), noteUser: { username: string; host: string | null; }, noteUserFollowers?: User['id'][], antennaUserFollowing?: User['id'][]): Promise<boolean> {
 	if (note.visibility === 'specified') return false;
 
 	if (note.visibility === 'followers') {
-		if (!followers.includes(antenna.userId)) return false;
+		if (noteUserFollowers && !noteUserFollowers.includes(antenna.userId)) return false;
+		if (antennaUserFollowing && !antennaUserFollowing.includes(note.userId)) return false;
 	}
 
 	if (!antenna.withReplies && note.replyId != null) return false;
 
 	if (antenna.src === 'home') {
-		if (!followers.includes(antenna.userId)) return false;
+		if (noteUserFollowers && !noteUserFollowers.includes(antenna.userId)) return false;
+		if (antennaUserFollowing && !antennaUserFollowing.includes(note.userId)) return false;
 	} else if (antenna.src === 'list') {
 		const listUsers = (await UserListJoinings.find({
 			userListId: antenna.userListId!
@@ -75,7 +81,7 @@ export async function checkHitAntenna(antenna: Antenna, note: Note, noteUser: Us
 	}
 
 	if (antenna.withFile) {
-		if (note.fileIds.length === 0) return false;
+		if (note.fileIds && note.fileIds.length === 0) return false;
 	}
 
 	// TODO: eval expression
diff --git a/src/misc/convert-host.ts b/src/misc/convert-host.ts
index ad52e1258839338e13e8911b8741a19a61868a05..f8957a64a8c5ba369152f39a895c8b1f97b0e7e2 100644
--- a/src/misc/convert-host.ts
+++ b/src/misc/convert-host.ts
@@ -1,4 +1,5 @@
-import config from '../config';
+import { URL } from 'url';
+import config from '@/config';
 import { toASCII } from 'punycode';
 
 export function getFullApAccount(username: string, host: string | null) {
diff --git a/src/misc/download-url.ts b/src/misc/download-url.ts
index aaba302a5c187b64672cd2c1f49f6c7b7a4e6dcb..dafeff6fc83e48963c6818c0c90d1f701fbf61ac 100644
--- a/src/misc/download-url.ts
+++ b/src/misc/download-url.ts
@@ -1,10 +1,11 @@
 import * as fs from 'fs';
 import * as stream from 'stream';
 import * as util from 'util';
+import { URL } from 'url';
 import fetch from 'node-fetch';
 import { getAgentByUrl } from './fetch';
 import { AbortController } from 'abort-controller';
-import config from '../config';
+import config from '@/config';
 import * as chalk from 'chalk';
 import Logger from '../services/logger';
 
diff --git a/src/misc/fetch.ts b/src/misc/fetch.ts
index 90d89a4392e836222ea6d05a2de66b1b8018fd99..ee671f59be9826a828c05ad6666d246d5a597ec9 100644
--- a/src/misc/fetch.ts
+++ b/src/misc/fetch.ts
@@ -4,7 +4,7 @@ import * as cache from 'lookup-dns-cache';
 import fetch, { HeadersInit } from 'node-fetch';
 import { HttpProxyAgent } from 'http-proxy-agent';
 import { HttpsProxyAgent } from 'https-proxy-agent';
-import config from '../config';
+import config from '@/config';
 import { URL } from 'url';
 
 export async function getJson(url: string, accept = 'application/json, */*', timeout = 10000, headers?: HeadersInit) {
diff --git a/src/misc/gen-id.ts b/src/misc/gen-id.ts
index 8562767bf84bf582492f5bdce9fce637e8794356..8e7e0b611392b9161ea2e1a92a828267838c5826 100644
--- a/src/misc/gen-id.ts
+++ b/src/misc/gen-id.ts
@@ -3,7 +3,7 @@ import { genAid } from './id/aid';
 import { genMeid } from './id/meid';
 import { genMeidg } from './id/meidg';
 import { genObjectId } from './id/object-id';
-import config from '../config';
+import config from '@/config';
 
 const metohd = config.id.toLowerCase();
 
diff --git a/src/models/repositories/antenna.ts b/src/models/repositories/antenna.ts
index 84e082bd25c623433833eee0310a36dc41a2cf47..787e5c8e2b43a3eb7994b7cf1b348e93681ce15d 100644
--- a/src/models/repositories/antenna.ts
+++ b/src/models/repositories/antenna.ts
@@ -1,6 +1,6 @@
 import { EntityRepository, Repository } from 'typeorm';
 import { Antenna } from '../entities/antenna';
-import { SchemaType } from '../../misc/schema';
+import { SchemaType } from '@/misc/schema';
 import { AntennaNotes, UserGroupJoinings } from '..';
 
 export type PackedAntenna = SchemaType<typeof packedAntennaSchema>;
diff --git a/src/models/repositories/app.ts b/src/models/repositories/app.ts
index 33e0f411566bddeb7608105d65f660d554ebbf0c..c919a9bdb18ff9f2d251d74e7003b35ed23789a9 100644
--- a/src/models/repositories/app.ts
+++ b/src/models/repositories/app.ts
@@ -1,7 +1,7 @@
 import { EntityRepository, Repository } from 'typeorm';
 import { App } from '../entities/app';
 import { AccessTokens } from '..';
-import { SchemaType } from '../../misc/schema';
+import { SchemaType } from '@/misc/schema';
 
 export type PackedApp = SchemaType<typeof packedAppSchema>;
 
@@ -9,7 +9,7 @@ export type PackedApp = SchemaType<typeof packedAppSchema>;
 export class AppRepository extends Repository<App> {
 	public async pack(
 		src: App['id'] | App,
-		me?: any,
+		me?: { id: User['id'] } | null | undefined,
 		options?: {
 			detail?: boolean,
 			includeSecret?: boolean,
diff --git a/src/models/repositories/auth-session.ts b/src/models/repositories/auth-session.ts
index e985d6925fc1a369b47e637dcd4fe3393dc739af..f513357e1b8c9c67e9365cddbcc47d690982d359 100644
--- a/src/models/repositories/auth-session.ts
+++ b/src/models/repositories/auth-session.ts
@@ -2,12 +2,13 @@ import { EntityRepository, Repository } from 'typeorm';
 import { Apps } from '..';
 import { AuthSession } from '../entities/auth-session';
 import { awaitAll } from '../../prelude/await-all';
+import { User } from '../entities/user';
 
 @EntityRepository(AuthSession)
 export class AuthSessionRepository extends Repository<AuthSession> {
 	public async pack(
 		src: AuthSession['id'] | AuthSession,
-		me?: any
+		me?: { id: User['id'] } | null | undefined
 	) {
 		const session = typeof src === 'object' ? src : await this.findOneOrFail(src);
 
diff --git a/src/models/repositories/blocking.ts b/src/models/repositories/blocking.ts
index 314f459e65d261c4adb0aac5188506fa08c032ec..60b43fae3e3937eeb997ebd9675f82b01ff50c33 100644
--- a/src/models/repositories/blocking.ts
+++ b/src/models/repositories/blocking.ts
@@ -2,7 +2,8 @@ import { EntityRepository, Repository } from 'typeorm';
 import { Users } from '..';
 import { Blocking } from '../entities/blocking';
 import { awaitAll } from '../../prelude/await-all';
-import { SchemaType } from '../../misc/schema';
+import { SchemaType } from '@/misc/schema';
+import { User } from '../entities/user';
 
 export type PackedBlocking = SchemaType<typeof packedBlockingSchema>;
 
@@ -10,7 +11,7 @@ export type PackedBlocking = SchemaType<typeof packedBlockingSchema>;
 export class BlockingRepository extends Repository<Blocking> {
 	public async pack(
 		src: Blocking['id'] | Blocking,
-		me?: any
+		me?: { id: User['id'] } | null | undefined
 	): Promise<PackedBlocking> {
 		const blocking = typeof src === 'object' ? src : await this.findOneOrFail(src);
 
@@ -26,7 +27,7 @@ export class BlockingRepository extends Repository<Blocking> {
 
 	public packMany(
 		blockings: any[],
-		me: any
+		me: { id: User['id'] }
 	) {
 		return Promise.all(blockings.map(x => this.pack(x, me)));
 	}
diff --git a/src/models/repositories/channel.ts b/src/models/repositories/channel.ts
index 2654c9d6f34cf56f3cdf70dd94c90cbd4d871af2..a1c85f2bd734bbc1f4145a21bd333bdd4def3f78 100644
--- a/src/models/repositories/channel.ts
+++ b/src/models/repositories/channel.ts
@@ -1,6 +1,6 @@
 import { EntityRepository, Repository } from 'typeorm';
 import { Channel } from '../entities/channel';
-import { SchemaType } from '../../misc/schema';
+import { SchemaType } from '@/misc/schema';
 import { DriveFiles, ChannelFollowings, NoteUnreads } from '..';
 import { User } from '../entities/user';
 
@@ -10,19 +10,19 @@ export type PackedChannel = SchemaType<typeof packedChannelSchema>;
 export class ChannelRepository extends Repository<Channel> {
 	public async pack(
 		src: Channel['id'] | Channel,
-		me?: User['id'] | User | null | undefined,
+		me?: { id: User['id'] } | null | undefined,
 	): Promise<PackedChannel> {
 		const channel = typeof src === 'object' ? src : await this.findOneOrFail(src);
-		const meId = me ? typeof me === 'string' ? me : me.id : null;
+		const meId = me ? me.id : null;
 
 		const banner = channel.bannerId ? await DriveFiles.findOne(channel.bannerId) : null;
 
-		const hasUnreadNote = me ? (await NoteUnreads.findOne({ noteChannelId: channel.id, userId: meId })) != null : undefined;
+		const hasUnreadNote = meId ? (await NoteUnreads.findOne({ noteChannelId: channel.id, userId: meId })) != null : undefined;
 
-		const following = await ChannelFollowings.findOne({
+		const following = meId ? await ChannelFollowings.findOne({
 			followerId: meId,
 			followeeId: channel.id,
-		});
+		}) : null;
 
 		return {
 			id: channel.id,
diff --git a/src/models/repositories/clip.ts b/src/models/repositories/clip.ts
index 84891a4372396e80d213b246cb2f8d4b0bc63930..8d1f63c44b38a9ff378a70571c29a223a749264b 100644
--- a/src/models/repositories/clip.ts
+++ b/src/models/repositories/clip.ts
@@ -1,6 +1,6 @@
 import { EntityRepository, Repository } from 'typeorm';
 import { Clip } from '../entities/clip';
-import { SchemaType } from '../../misc/schema';
+import { SchemaType } from '@/misc/schema';
 import { Users } from '..';
 import { awaitAll } from '../../prelude/await-all';
 
diff --git a/src/models/repositories/drive-file.ts b/src/models/repositories/drive-file.ts
index 61d24bd24ee96470ba075455f171f7a135f205d6..590079fe4a0480abc2a583da4f67fbe36d30ed08 100644
--- a/src/models/repositories/drive-file.ts
+++ b/src/models/repositories/drive-file.ts
@@ -2,13 +2,13 @@ import { EntityRepository, Repository } from 'typeorm';
 import { DriveFile } from '../entities/drive-file';
 import { Users, DriveFolders } from '..';
 import { User } from '../entities/user';
-import { toPuny } from '../../misc/convert-host';
+import { toPuny } from '@/misc/convert-host';
 import { awaitAll } from '../../prelude/await-all';
-import { SchemaType } from '../../misc/schema';
-import config from '../../config';
+import { SchemaType } from '@/misc/schema';
+import config from '@/config';
 import { query, appendQuery } from '../../prelude/url';
 import { Meta } from '../entities/meta';
-import { fetchMeta } from '../../misc/fetch-meta';
+import { fetchMeta } from '@/misc/fetch-meta';
 
 export type PackedDriveFile = SchemaType<typeof packedDriveFileSchema>;
 
@@ -53,7 +53,7 @@ export class DriveFileRepository extends Repository<DriveFile> {
 		return thumbnail ? (file.thumbnailUrl || (isImage ? (file.webpublicUrl || file.url) : null)) : (file.webpublicUrl || file.url);
 	}
 
-	public async calcDriveUsageOf(user: User['id'] | User): Promise<number> {
+	public async calcDriveUsageOf(user: User['id'] | { id: User['id'] }): Promise<number> {
 		const id = typeof user === 'object' ? user.id : user;
 
 		const { sum } = await this
diff --git a/src/models/repositories/drive-folder.ts b/src/models/repositories/drive-folder.ts
index 2a18220384be2565018fca9e25bd761ecdde1d40..cc07c56675b3115ab96e7c5678a654d6444d3a3f 100644
--- a/src/models/repositories/drive-folder.ts
+++ b/src/models/repositories/drive-folder.ts
@@ -2,7 +2,7 @@ import { EntityRepository, Repository } from 'typeorm';
 import { DriveFolders, DriveFiles } from '..';
 import { DriveFolder } from '../entities/drive-folder';
 import { awaitAll } from '../../prelude/await-all';
-import { SchemaType } from '../../misc/schema';
+import { SchemaType } from '@/misc/schema';
 
 export type PackedDriveFolder = SchemaType<typeof packedDriveFolderSchema>;
 
diff --git a/src/models/repositories/federation-instance.ts b/src/models/repositories/federation-instance.ts
index c6b08dc101eaec8f051a2fd9cce6670d2dd0d61d..15e8023ee90c4249b2a08a11082ad5e0495ba29a 100644
--- a/src/models/repositories/federation-instance.ts
+++ b/src/models/repositories/federation-instance.ts
@@ -1,4 +1,4 @@
-import config from '../../config';
+import config from '@/config';
 
 export const packedFederationInstanceSchema = {
 	type: 'object' as const,
diff --git a/src/models/repositories/follow-request.ts b/src/models/repositories/follow-request.ts
index 0d96b8eb53db564acd82f262322feddfcb3ef34f..31e5fb2d90a4c115ed17074920bf50141b6f5c69 100644
--- a/src/models/repositories/follow-request.ts
+++ b/src/models/repositories/follow-request.ts
@@ -1,12 +1,13 @@
 import { EntityRepository, Repository } from 'typeorm';
 import { FollowRequest } from '../entities/follow-request';
 import { Users } from '..';
+import { User } from '../entities/user';
 
 @EntityRepository(FollowRequest)
 export class FollowRequestRepository extends Repository<FollowRequest> {
 	public async pack(
 		src: FollowRequest['id'] | FollowRequest,
-		me?: any
+		me?: { id: User['id'] } | null | undefined
 	) {
 		const request = typeof src === 'object' ? src : await this.findOneOrFail(src);
 
diff --git a/src/models/repositories/following.ts b/src/models/repositories/following.ts
index 986f107e7df928ad3c4925f40dfae9d573d9e5ea..b886432978cfa477c946ff6fb1a025f0852d98cf 100644
--- a/src/models/repositories/following.ts
+++ b/src/models/repositories/following.ts
@@ -2,7 +2,8 @@ import { EntityRepository, Repository } from 'typeorm';
 import { Users } from '..';
 import { Following } from '../entities/following';
 import { awaitAll } from '../../prelude/await-all';
-import { SchemaType } from '../../misc/schema';
+import { SchemaType } from '@/misc/schema';
+import { User } from '../entities/user';
 
 type LocalFollowerFollowing = Following & {
 	followerHost: null;
@@ -50,7 +51,7 @@ export class FollowingRepository extends Repository<Following> {
 
 	public async pack(
 		src: Following['id'] | Following,
-		me?: any,
+		me?: { id: User['id'] } | null | undefined,
 		opts?: {
 			populateFollowee?: boolean;
 			populateFollower?: boolean;
@@ -76,7 +77,7 @@ export class FollowingRepository extends Repository<Following> {
 
 	public packMany(
 		followings: any[],
-		me?: any,
+		me?: { id: User['id'] } | null | undefined,
 		opts?: {
 			populateFollowee?: boolean;
 			populateFollower?: boolean;
diff --git a/src/models/repositories/games/reversi/game.ts b/src/models/repositories/games/reversi/game.ts
index e23247f6649e9a117ecec37fd343025c01ad4899..344cf7b20e0ed4cbb1761b54ec02db423ef5e0c5 100644
--- a/src/models/repositories/games/reversi/game.ts
+++ b/src/models/repositories/games/reversi/game.ts
@@ -1,3 +1,4 @@
+import { User } from '@/models/entities/user';
 import { EntityRepository, Repository } from 'typeorm';
 import { Users } from '../../..';
 import { ReversiGame } from '../../../entities/games/reversi/game';
@@ -6,7 +7,7 @@ import { ReversiGame } from '../../../entities/games/reversi/game';
 export class ReversiGameRepository extends Repository<ReversiGame> {
 	public async pack(
 		src: ReversiGame['id'] | ReversiGame,
-		me?: any,
+		me?: { id: User['id'] } | null | undefined,
 		options?: {
 			detail?: boolean
 		}
@@ -16,7 +17,6 @@ export class ReversiGameRepository extends Repository<ReversiGame> {
 		}, options);
 
 		const game = typeof src === 'object' ? src : await this.findOneOrFail(src);
-		const meId = me ? typeof me === 'string' ? me : me.id : null;
 
 		return {
 			id: game.id,
@@ -30,10 +30,10 @@ export class ReversiGameRepository extends Repository<ReversiGame> {
 			user2Accepted: game.user2Accepted,
 			user1Id: game.user1Id,
 			user2Id: game.user2Id,
-			user1: await Users.pack(game.user1Id, meId),
-			user2: await Users.pack(game.user2Id, meId),
+			user1: await Users.pack(game.user1Id, me),
+			user2: await Users.pack(game.user2Id, me),
 			winnerId: game.winnerId,
-			winner: game.winnerId ? await Users.pack(game.winnerId, meId) : null,
+			winner: game.winnerId ? await Users.pack(game.winnerId, me) : null,
 			surrendered: game.surrendered,
 			black: game.black,
 			bw: game.bw,
diff --git a/src/models/repositories/games/reversi/matching.ts b/src/models/repositories/games/reversi/matching.ts
index 51f17c9a4e2b3493385a7429fdf5dd45d5d74e82..013021eb90539531c20bd5b9856660295fb1374c 100644
--- a/src/models/repositories/games/reversi/matching.ts
+++ b/src/models/repositories/games/reversi/matching.ts
@@ -2,12 +2,13 @@ import { EntityRepository, Repository } from 'typeorm';
 import { ReversiMatching } from '../../../entities/games/reversi/matching';
 import { Users } from '../../..';
 import { awaitAll } from '../../../../prelude/await-all';
+import { User } from '@/models/entities/user';
 
 @EntityRepository(ReversiMatching)
 export class ReversiMatchingRepository extends Repository<ReversiMatching> {
 	public async pack(
 		src: ReversiMatching['id'] | ReversiMatching,
-		me: any
+		me: { id: User['id'] }
 	) {
 		const matching = typeof src === 'object' ? src : await this.findOneOrFail(src);
 
diff --git a/src/models/repositories/hashtag.ts b/src/models/repositories/hashtag.ts
index fb54a12e136867a1b5806baf1fdd3f5f25a7d91d..0089ab50dbf73eaa38ed0b676dea71038fd87d3f 100644
--- a/src/models/repositories/hashtag.ts
+++ b/src/models/repositories/hashtag.ts
@@ -1,6 +1,6 @@
 import { EntityRepository, Repository } from 'typeorm';
 import { Hashtag } from '../entities/hashtag';
-import { SchemaType } from '../../misc/schema';
+import { SchemaType } from '@/misc/schema';
 
 export type PackedHashtag = SchemaType<typeof packedHashtagSchema>;
 
diff --git a/src/models/repositories/messaging-message.ts b/src/models/repositories/messaging-message.ts
index 0e04c258647d067c6ec5656db418b4a1613fd241..8d6d03a23699a77a1e32567e5d321c0521aa0df5 100644
--- a/src/models/repositories/messaging-message.ts
+++ b/src/models/repositories/messaging-message.ts
@@ -1,7 +1,8 @@
 import { EntityRepository, Repository } from 'typeorm';
 import { MessagingMessage } from '../entities/messaging-message';
 import { Users, DriveFiles, UserGroups } from '..';
-import { SchemaType } from '../../misc/schema';
+import { SchemaType } from '@/misc/schema';
+import { User } from '../entities/user';
 
 export type PackedMessagingMessage = SchemaType<typeof packedMessagingMessageSchema>;
 
@@ -13,7 +14,7 @@ export class MessagingMessageRepository extends Repository<MessagingMessage> {
 
 	public async pack(
 		src: MessagingMessage['id'] | MessagingMessage,
-		me?: any,
+		me?: { id: User['id'] } | null | undefined,
 		options?: {
 			populateRecipient?: boolean,
 			populateGroup?: boolean,
diff --git a/src/models/repositories/muting.ts b/src/models/repositories/muting.ts
index 5fd409df787b360d34aeef27f6e0669d50b4ab7c..b5bbe8a0a30178a3881167b81937a3d954069e4a 100644
--- a/src/models/repositories/muting.ts
+++ b/src/models/repositories/muting.ts
@@ -2,7 +2,8 @@ import { EntityRepository, Repository } from 'typeorm';
 import { Users } from '..';
 import { Muting } from '../entities/muting';
 import { awaitAll } from '../../prelude/await-all';
-import { SchemaType } from '../../misc/schema';
+import { SchemaType } from '@/misc/schema';
+import { User } from '../entities/user';
 
 export type PackedMuting = SchemaType<typeof packedMutingSchema>;
 
@@ -10,7 +11,7 @@ export type PackedMuting = SchemaType<typeof packedMutingSchema>;
 export class MutingRepository extends Repository<Muting> {
 	public async pack(
 		src: Muting['id'] | Muting,
-		me?: any
+		me?: { id: User['id'] } | null | undefined
 	): Promise<PackedMuting> {
 		const muting = typeof src === 'object' ? src : await this.findOneOrFail(src);
 
@@ -26,7 +27,7 @@ export class MutingRepository extends Repository<Muting> {
 
 	public packMany(
 		mutings: any[],
-		me: any
+		me: { id: User['id'] }
 	) {
 		return Promise.all(mutings.map(x => this.pack(x, me)));
 	}
diff --git a/src/models/repositories/note-favorite.ts b/src/models/repositories/note-favorite.ts
index eb2ffff4c1f90e928fa1ca34552f96beb2bde253..316ebdff351be19468bfe700e572deb7751719b0 100644
--- a/src/models/repositories/note-favorite.ts
+++ b/src/models/repositories/note-favorite.ts
@@ -1,12 +1,13 @@
 import { EntityRepository, Repository } from 'typeorm';
 import { NoteFavorite } from '../entities/note-favorite';
 import { Notes } from '..';
+import { User } from '../entities/user';
 
 @EntityRepository(NoteFavorite)
 export class NoteFavoriteRepository extends Repository<NoteFavorite> {
 	public async pack(
 		src: NoteFavorite['id'] | NoteFavorite,
-		me?: any
+		me?: { id: User['id'] } | null | undefined
 	) {
 		const favorite = typeof src === 'object' ? src : await this.findOneOrFail(src);
 
@@ -20,7 +21,7 @@ export class NoteFavoriteRepository extends Repository<NoteFavorite> {
 
 	public packMany(
 		favorites: any[],
-		me: any
+		me: { id: User['id'] }
 	) {
 		return Promise.all(favorites.map(x => this.pack(x, me)));
 	}
diff --git a/src/models/repositories/note-reaction.ts b/src/models/repositories/note-reaction.ts
index 785a876bf8a605e338ba3a5e6fe7314c2d58a00c..4c568096030942f4ea3b1f670d99d8aa150d7e63 100644
--- a/src/models/repositories/note-reaction.ts
+++ b/src/models/repositories/note-reaction.ts
@@ -1,8 +1,9 @@
 import { EntityRepository, Repository } from 'typeorm';
 import { NoteReaction } from '../entities/note-reaction';
 import { Users } from '..';
-import { SchemaType } from '../../misc/schema';
-import { convertLegacyReaction } from '../../misc/reaction-lib';
+import { SchemaType } from '@/misc/schema';
+import { convertLegacyReaction } from '@/misc/reaction-lib';
+import { User } from '../entities/user';
 
 export type PackedNoteReaction = SchemaType<typeof packedNoteReactionSchema>;
 
@@ -10,7 +11,7 @@ export type PackedNoteReaction = SchemaType<typeof packedNoteReactionSchema>;
 export class NoteReactionRepository extends Repository<NoteReaction> {
 	public async pack(
 		src: NoteReaction['id'] | NoteReaction,
-		me?: any
+		me?: { id: User['id'] } | null | undefined
 	): Promise<PackedNoteReaction> {
 		const reaction = typeof src === 'object' ? src : await this.findOneOrFail(src);
 
diff --git a/src/models/repositories/note.ts b/src/models/repositories/note.ts
index 73e18f6c5b62089e03004dd39689ffb20f92547e..3642a03c2cbe8d3844cecaf0531a20b89f256647 100644
--- a/src/models/repositories/note.ts
+++ b/src/models/repositories/note.ts
@@ -2,13 +2,13 @@ import { EntityRepository, Repository, In } from 'typeorm';
 import { Note } from '../entities/note';
 import { User } from '../entities/user';
 import { Users, PollVotes, DriveFiles, NoteReactions, Followings, Polls, Channels } from '..';
-import { SchemaType } from '../../misc/schema';
+import { SchemaType } from '@/misc/schema';
 import { awaitAll } from '../../prelude/await-all';
-import { convertLegacyReaction, convertLegacyReactions, decodeReaction } from '../../misc/reaction-lib';
+import { convertLegacyReaction, convertLegacyReactions, decodeReaction } from '@/misc/reaction-lib';
 import { toString } from '../../mfm/to-string';
 import { parse } from '../../mfm/parse';
 import { NoteReaction } from '../entities/note-reaction';
-import { aggregateNoteEmojis, populateEmojis, prefetchEmojis } from '../../misc/populate-emojis';
+import { aggregateNoteEmojis, populateEmojis, prefetchEmojis } from '@/misc/populate-emojis';
 
 export type PackedNote = SchemaType<typeof packedNoteSchema>;
 
@@ -79,7 +79,7 @@ export class NoteRepository extends Repository<Note> {
 
 	public async pack(
 		src: Note['id'] | Note,
-		me?: User['id'] | User | null | undefined,
+		me?: { id: User['id'] } | null | undefined,
 		options?: {
 			detail?: boolean;
 			skipHide?: boolean;
@@ -93,7 +93,7 @@ export class NoteRepository extends Repository<Note> {
 			skipHide: false
 		}, options);
 
-		const meId = me ? typeof me === 'string' ? me : me.id : null;
+		const meId = me ? me.id : null;
 		const note = typeof src === 'object' ? src : await this.findOneOrFail(src);
 		const host = note.userHost;
 
@@ -174,7 +174,7 @@ export class NoteRepository extends Repository<Note> {
 			id: note.id,
 			createdAt: note.createdAt.toISOString(),
 			userId: note.userId,
-			user: Users.pack(note.user || note.userId, meId, {
+			user: Users.pack(note.user || note.userId, me, {
 				detail: false,
 			}),
 			text: text,
@@ -204,12 +204,12 @@ export class NoteRepository extends Repository<Note> {
 			_prId_: (note as any)._prId_ || undefined,
 
 			...(opts.detail ? {
-				reply: note.replyId ? this.pack(note.reply || note.replyId, meId, {
+				reply: note.replyId ? this.pack(note.reply || note.replyId, me, {
 					detail: false,
 					_hint_: options?._hint_
 				}) : undefined,
 
-				renote: note.renoteId ? this.pack(note.renote || note.renoteId, meId, {
+				renote: note.renoteId ? this.pack(note.renote || note.renoteId, me, {
 					detail: true,
 					_hint_: options?._hint_
 				}) : undefined,
@@ -236,7 +236,7 @@ export class NoteRepository extends Repository<Note> {
 
 	public async packMany(
 		notes: Note[],
-		me?: User['id'] | User | null | undefined,
+		me?: { id: User['id'] } | null | undefined,
 		options?: {
 			detail?: boolean;
 			skipHide?: boolean;
@@ -244,7 +244,7 @@ export class NoteRepository extends Repository<Note> {
 	) {
 		if (notes.length === 0) return [];
 
-		const meId = me ? typeof me === 'string' ? me : me.id : null;
+		const meId = me ? me.id : null;
 		const myReactionsMap = new Map<Note['id'], NoteReaction | null>();
 		if (meId) {
 			const renoteIds = notes.filter(n => n.renoteId != null).map(n => n.renoteId!);
diff --git a/src/models/repositories/notification.ts b/src/models/repositories/notification.ts
index 83fe11d5f7da350467b9ef14077064846a6f2ac0..abadea4632940ca26407fe46c25e2a0071996795 100644
--- a/src/models/repositories/notification.ts
+++ b/src/models/repositories/notification.ts
@@ -2,11 +2,11 @@ import { EntityRepository, In, Repository } from 'typeorm';
 import { Users, Notes, UserGroupInvitations, AccessTokens, NoteReactions } from '..';
 import { Notification } from '../entities/notification';
 import { awaitAll } from '../../prelude/await-all';
-import { SchemaType } from '../../misc/schema';
+import { SchemaType } from '@/misc/schema';
 import { Note } from '../entities/note';
 import { NoteReaction } from '../entities/note-reaction';
 import { User } from '../entities/user';
-import { aggregateNoteEmojis, prefetchEmojis } from '../../misc/populate-emojis';
+import { aggregateNoteEmojis, prefetchEmojis } from '@/misc/populate-emojis';
 
 export type PackedNotification = SchemaType<typeof packedNotificationSchema>;
 
@@ -31,38 +31,38 @@ export class NotificationRepository extends Repository<Notification> {
 			userId: notification.notifierId,
 			user: notification.notifierId ? Users.pack(notification.notifier || notification.notifierId) : null,
 			...(notification.type === 'mention' ? {
-				note: Notes.pack(notification.note || notification.noteId!, notification.notifieeId, {
+				note: Notes.pack(notification.note || notification.noteId!, { id: notification.notifieeId }, {
 					detail: true,
 					_hint_: options._hintForEachNotes_
 				}),
 			} : {}),
 			...(notification.type === 'reply' ? {
-				note: Notes.pack(notification.note || notification.noteId!, notification.notifieeId, {
+				note: Notes.pack(notification.note || notification.noteId!, { id: notification.notifieeId }, {
 					detail: true,
 					_hint_: options._hintForEachNotes_
 				}),
 			} : {}),
 			...(notification.type === 'renote' ? {
-				note: Notes.pack(notification.note || notification.noteId!, notification.notifieeId, {
+				note: Notes.pack(notification.note || notification.noteId!, { id: notification.notifieeId }, {
 					detail: true,
 					_hint_: options._hintForEachNotes_
 				}),
 			} : {}),
 			...(notification.type === 'quote' ? {
-				note: Notes.pack(notification.note || notification.noteId!, notification.notifieeId, {
+				note: Notes.pack(notification.note || notification.noteId!, { id: notification.notifieeId }, {
 					detail: true,
 					_hint_: options._hintForEachNotes_
 				}),
 			} : {}),
 			...(notification.type === 'reaction' ? {
-				note: Notes.pack(notification.note || notification.noteId!, notification.notifieeId, {
+				note: Notes.pack(notification.note || notification.noteId!, { id: notification.notifieeId }, {
 					detail: true,
 					_hint_: options._hintForEachNotes_
 				}),
 				reaction: notification.reaction
 			} : {}),
 			...(notification.type === 'pollVote' ? {
-				note: Notes.pack(notification.note || notification.noteId!, notification.notifieeId, {
+				note: Notes.pack(notification.note || notification.noteId!, { id: notification.notifieeId }, {
 					detail: true,
 					_hint_: options._hintForEachNotes_
 				}),
diff --git a/src/models/repositories/page-like.ts b/src/models/repositories/page-like.ts
index 94b1685e5ed8fb09d4002e03fbcfff2abc953926..cfef950f3bfecda57626a25524a1c9ba9f6a7fe7 100644
--- a/src/models/repositories/page-like.ts
+++ b/src/models/repositories/page-like.ts
@@ -1,12 +1,13 @@
 import { EntityRepository, Repository } from 'typeorm';
 import { PageLike } from '../entities/page-like';
 import { Pages } from '..';
+import { User } from '../entities/user';
 
 @EntityRepository(PageLike)
 export class PageLikeRepository extends Repository<PageLike> {
 	public async pack(
 		src: PageLike['id'] | PageLike,
-		me?: any
+		me?: { id: User['id'] } | null | undefined
 	) {
 		const like = typeof src === 'object' ? src : await this.findOneOrFail(src);
 
@@ -18,7 +19,7 @@ export class PageLikeRepository extends Repository<PageLike> {
 
 	public packMany(
 		likes: any[],
-		me: any
+		me: { id: User['id'] }
 	) {
 		return Promise.all(likes.map(x => this.pack(x, me)));
 	}
diff --git a/src/models/repositories/page.ts b/src/models/repositories/page.ts
index 1b30b6645b980f8636a0075b6dbfd3509b50621b..a162a503211ea39a3f16c11d3d1b778d6ec67829 100644
--- a/src/models/repositories/page.ts
+++ b/src/models/repositories/page.ts
@@ -1,6 +1,6 @@
 import { EntityRepository, Repository } from 'typeorm';
 import { Page } from '../entities/page';
-import { SchemaType } from '../../misc/schema';
+import { SchemaType } from '@/misc/schema';
 import { Users, DriveFiles, PageLikes } from '..';
 import { awaitAll } from '../../prelude/await-all';
 import { DriveFile } from '../entities/drive-file';
@@ -12,9 +12,9 @@ export type PackedPage = SchemaType<typeof packedPageSchema>;
 export class PageRepository extends Repository<Page> {
 	public async pack(
 		src: Page['id'] | Page,
-		me?: User['id'] | User | null | undefined,
+		me?: { id: User['id'] } | null | undefined,
 	): Promise<PackedPage> {
-		const meId = me ? typeof me === 'string' ? me : me.id : null;
+		const meId = me ? me.id : null;
 		const page = typeof src === 'object' ? src : await this.findOneOrFail(src);
 
 		const attachedFiles: Promise<DriveFile | undefined>[] = [];
@@ -84,7 +84,7 @@ export class PageRepository extends Repository<Page> {
 
 	public packMany(
 		pages: Page[],
-		me?: User['id'] | User | null | undefined,
+		me?: { id: User['id'] } | null | undefined,
 	) {
 		return Promise.all(pages.map(x => this.pack(x, me)));
 	}
diff --git a/src/models/repositories/user-group.ts b/src/models/repositories/user-group.ts
index a1b226f154e5c015d362148248451665369c070b..9861b23356bc977e705c2eaf8b7073bb302a3d06 100644
--- a/src/models/repositories/user-group.ts
+++ b/src/models/repositories/user-group.ts
@@ -1,7 +1,7 @@
 import { EntityRepository, Repository } from 'typeorm';
 import { UserGroup } from '../entities/user-group';
 import { UserGroupJoinings } from '..';
-import { SchemaType } from '../../misc/schema';
+import { SchemaType } from '@/misc/schema';
 
 export type PackedUserGroup = SchemaType<typeof packedUserGroupSchema>;
 
diff --git a/src/models/repositories/user-list.ts b/src/models/repositories/user-list.ts
index 9421aeb0c7b9c18eb2dd6f8ab1ab8f718113cc78..094abace63d1725eb140bf053df778a9e06152a4 100644
--- a/src/models/repositories/user-list.ts
+++ b/src/models/repositories/user-list.ts
@@ -1,7 +1,7 @@
 import { EntityRepository, Repository } from 'typeorm';
 import { UserList } from '../entities/user-list';
 import { UserListJoinings } from '..';
-import { SchemaType } from '../../misc/schema';
+import { SchemaType } from '@/misc/schema';
 
 export type PackedUserList = SchemaType<typeof packedUserListSchema>;
 
diff --git a/src/models/repositories/user.ts b/src/models/repositories/user.ts
index 53c06f3f165ff652356d116f9f3a168c9a53f340..bb084f024578dae5e59f3b4e9760a63c91abd0fd 100644
--- a/src/models/repositories/user.ts
+++ b/src/models/repositories/user.ts
@@ -2,10 +2,11 @@ import $ from 'cafy';
 import { EntityRepository, Repository, In, Not } from 'typeorm';
 import { User, ILocalUser, IRemoteUser } from '../entities/user';
 import { Notes, NoteUnreads, FollowRequests, Notifications, MessagingMessages, UserNotePinings, Followings, Blockings, Mutings, UserProfiles, UserSecurityKeys, UserGroupJoinings, Pages, Announcements, AnnouncementReads, Antennas, AntennaNotes, ChannelFollowings, Instances } from '..';
-import config from '../../config';
-import { SchemaType } from '../../misc/schema';
+import config from '@/config';
+import { SchemaType } from '@/misc/schema';
 import { awaitAll } from '../../prelude/await-all';
-import { populateEmojis } from '../../misc/populate-emojis';
+import { populateEmojis } from '@/misc/populate-emojis';
+import { getAntennas } from '@/misc/antenna-cache';
 
 export type PackedUser = SchemaType<typeof packedUserSchema>;
 
@@ -97,10 +98,10 @@ export class UserRepository extends Repository<User> {
 	}
 
 	public async getHasUnreadAntenna(userId: User['id']): Promise<boolean> {
-		const antennas = await Antennas.find({ userId });
+		const myAntennas = (await getAntennas()).filter(a => a.userId === userId);
 
-		const unread = antennas.length > 0 ? await AntennaNotes.findOne({
-			antennaId: In(antennas.map(x => x.id)),
+		const unread = myAntennas.length > 0 ? await AntennaNotes.findOne({
+			antennaId: In(myAntennas.map(x => x.id)),
 			read: false
 		}) : null;
 
@@ -146,7 +147,7 @@ export class UserRepository extends Repository<User> {
 
 	public async pack(
 		src: User['id'] | User,
-		me?: User['id'] | User | null | undefined,
+		me?: { id: User['id'] } | null | undefined,
 		options?: {
 			detail?: boolean,
 			includeSecrets?: boolean,
@@ -158,7 +159,7 @@ export class UserRepository extends Repository<User> {
 		}, options);
 
 		const user = typeof src === 'object' ? src : await this.findOneOrFail(src);
-		const meId = me ? typeof me === 'string' ? me : me.id : null;
+		const meId = me ? me.id : null;
 
 		const relation = meId && (meId !== user.id) && opts.detail ? await this.getRelation(meId, user.id) : null;
 		const pins = opts.detail ? await UserNotePinings.createQueryBuilder('pin')
@@ -212,11 +213,11 @@ export class UserRepository extends Repository<User> {
 				followingCount: user.followingCount,
 				notesCount: user.notesCount,
 				pinnedNoteIds: pins.map(pin => pin.noteId),
-				pinnedNotes: Notes.packMany(pins.map(pin => pin.note!), meId, {
+				pinnedNotes: Notes.packMany(pins.map(pin => pin.note!), me, {
 					detail: true
 				}),
 				pinnedPageId: profile!.pinnedPageId,
-				pinnedPage: profile!.pinnedPageId ? Pages.pack(profile!.pinnedPageId, meId) : null,
+				pinnedPage: profile!.pinnedPageId ? Pages.pack(profile!.pinnedPageId, me) : null,
 				twoFactorEnabled: profile!.twoFactorEnabled,
 				usePasswordLessLogin: profile!.usePasswordLessLogin,
 				securityKeys: profile!.twoFactorEnabled
@@ -285,7 +286,7 @@ export class UserRepository extends Repository<User> {
 
 	public packMany(
 		users: (User['id'] | User)[],
-		me?: User['id'] | User | null | undefined,
+		me?: { id: User['id'] } | null | undefined,
 		options?: {
 			detail?: boolean,
 			includeSecrets?: boolean,
@@ -294,11 +295,15 @@ export class UserRepository extends Repository<User> {
 		return Promise.all(users.map(u => this.pack(u, me, options)));
 	}
 
-	public isLocalUser(user: User): user is ILocalUser {
+	public isLocalUser(user: User): user is ILocalUser;
+	public isLocalUser<T extends { host: User['host'] }>(user: T): user is T & { host: null; };
+	public isLocalUser(user: User | { host: User['host'] }): boolean {
 		return user.host == null;
 	}
 
-	public isRemoteUser(user: User): user is IRemoteUser {
+	public isRemoteUser(user: User): user is IRemoteUser;
+	public isRemoteUser<T extends { host: User['host'] }>(user: T): user is T & { host: string; };
+	public isRemoteUser(user: User | { host: User['host'] }): boolean {
 		return !this.isLocalUser(user);
 	}
 
diff --git a/src/queue/index.ts b/src/queue/index.ts
index 9fb4595a350299f1cc47239a83267a5c26f01009..201b663799a1672e8715a94ddd5afac22ef0580b 100644
--- a/src/queue/index.ts
+++ b/src/queue/index.ts
@@ -1,7 +1,7 @@
 import * as httpSignature from 'http-signature';
 
-import config from '../config';
-import { ILocalUser } from '../models/entities/user';
+import config from '@/config';
+import { User } from '../models/entities/user';
 import { program } from '../argv';
 
 import processDeliver from './processors/deliver';
@@ -65,7 +65,7 @@ objectStorageQueue
 	.on('error', (job: any, err: Error) => objectStorageLogger.error(`error ${err}`, { job, e: renderError(err) }))
 	.on('stalled', (job) => objectStorageLogger.warn(`stalled id=${job.id}`));
 
-export function deliver(user: ILocalUser, content: any, to: any) {
+export function deliver(user: { id: User['id']; host: null; }, content: any, to: any) {
 	if (content == null) return null;
 
 	const data = {
@@ -102,7 +102,7 @@ export function inbox(activity: any, signature: httpSignature.IParsedSignature)
 	});
 }
 
-export function createDeleteDriveFilesJob(user: ILocalUser) {
+export function createDeleteDriveFilesJob(user: { id: User['id'] }) {
 	return dbQueue.add('deleteDriveFiles', {
 		user: user
 	}, {
@@ -111,7 +111,7 @@ export function createDeleteDriveFilesJob(user: ILocalUser) {
 	});
 }
 
-export function createExportNotesJob(user: ILocalUser) {
+export function createExportNotesJob(user: { id: User['id'] }) {
 	return dbQueue.add('exportNotes', {
 		user: user
 	}, {
@@ -120,7 +120,7 @@ export function createExportNotesJob(user: ILocalUser) {
 	});
 }
 
-export function createExportFollowingJob(user: ILocalUser) {
+export function createExportFollowingJob(user: { id: User['id'] }) {
 	return dbQueue.add('exportFollowing', {
 		user: user
 	}, {
@@ -129,7 +129,7 @@ export function createExportFollowingJob(user: ILocalUser) {
 	});
 }
 
-export function createExportMuteJob(user: ILocalUser) {
+export function createExportMuteJob(user: { id: User['id'] }) {
 	return dbQueue.add('exportMute', {
 		user: user
 	}, {
@@ -138,7 +138,7 @@ export function createExportMuteJob(user: ILocalUser) {
 	});
 }
 
-export function createExportBlockingJob(user: ILocalUser) {
+export function createExportBlockingJob(user: { id: User['id'] }) {
 	return dbQueue.add('exportBlocking', {
 		user: user
 	}, {
@@ -147,7 +147,7 @@ export function createExportBlockingJob(user: ILocalUser) {
 	});
 }
 
-export function createExportUserListsJob(user: ILocalUser) {
+export function createExportUserListsJob(user: { id: User['id'] }) {
 	return dbQueue.add('exportUserLists', {
 		user: user
 	}, {
@@ -156,7 +156,7 @@ export function createExportUserListsJob(user: ILocalUser) {
 	});
 }
 
-export function createImportFollowingJob(user: ILocalUser, fileId: DriveFile['id']) {
+export function createImportFollowingJob(user: { id: User['id'] }, fileId: DriveFile['id']) {
 	return dbQueue.add('importFollowing', {
 		user: user,
 		fileId: fileId
@@ -166,7 +166,7 @@ export function createImportFollowingJob(user: ILocalUser, fileId: DriveFile['id
 	});
 }
 
-export function createImportUserListsJob(user: ILocalUser, fileId: DriveFile['id']) {
+export function createImportUserListsJob(user: { id: User['id'] }, fileId: DriveFile['id']) {
 	return dbQueue.add('importUserLists', {
 		user: user,
 		fileId: fileId
diff --git a/src/queue/initialize.ts b/src/queue/initialize.ts
index 92579531e434e48ed1fa986a49e4ab1b698704ab..941fe4bc330efe8a6aa36f1efc92912a6efe8bad 100644
--- a/src/queue/initialize.ts
+++ b/src/queue/initialize.ts
@@ -1,5 +1,5 @@
 import * as Queue from 'bull';
-import config from '../config';
+import config from '@/config';
 
 export function initialize(name: string, limitPerSec = -1) {
 	return new Queue(name, {
diff --git a/src/queue/processors/db/export-blocking.ts b/src/queue/processors/db/export-blocking.ts
index 0504ab8c30526d680bedc6dc0e33e22a27b5d780..9bbc9b2f12d95574a75ca62fe3b621f987692cbc 100644
--- a/src/queue/processors/db/export-blocking.ts
+++ b/src/queue/processors/db/export-blocking.ts
@@ -5,7 +5,7 @@ import * as fs from 'fs';
 import { queueLogger } from '../../logger';
 import addFile from '../../../services/drive/add-file';
 import dateFormat = require('dateformat');
-import { getFullApAccount } from '../../../misc/convert-host';
+import { getFullApAccount } from '@/misc/convert-host';
 import { Users, Blockings } from '../../../models';
 import { MoreThan } from 'typeorm';
 
diff --git a/src/queue/processors/db/export-following.ts b/src/queue/processors/db/export-following.ts
index 996ef6310db8ccb0c087d97577c00e441bcccf5e..79df2298d898a845ac57eeb60bc78a226e02c829 100644
--- a/src/queue/processors/db/export-following.ts
+++ b/src/queue/processors/db/export-following.ts
@@ -5,7 +5,7 @@ import * as fs from 'fs';
 import { queueLogger } from '../../logger';
 import addFile from '../../../services/drive/add-file';
 import dateFormat = require('dateformat');
-import { getFullApAccount } from '../../../misc/convert-host';
+import { getFullApAccount } from '@/misc/convert-host';
 import { Users, Followings } from '../../../models';
 import { MoreThan } from 'typeorm';
 
diff --git a/src/queue/processors/db/export-mute.ts b/src/queue/processors/db/export-mute.ts
index 553155322041514c3018d8addaa4f09b855f345c..c10556f88244e1750bf829bc3bf079cd7e8a545e 100644
--- a/src/queue/processors/db/export-mute.ts
+++ b/src/queue/processors/db/export-mute.ts
@@ -5,7 +5,7 @@ import * as fs from 'fs';
 import { queueLogger } from '../../logger';
 import addFile from '../../../services/drive/add-file';
 import dateFormat = require('dateformat');
-import { getFullApAccount } from '../../../misc/convert-host';
+import { getFullApAccount } from '@/misc/convert-host';
 import { Users, Mutings } from '../../../models';
 import { MoreThan } from 'typeorm';
 
diff --git a/src/queue/processors/db/export-user-lists.ts b/src/queue/processors/db/export-user-lists.ts
index 447cdaa17489a6569da75361a6d7a4efc7cf36b9..b6c527fc78e602943ab762f709c7eb3255e805ce 100644
--- a/src/queue/processors/db/export-user-lists.ts
+++ b/src/queue/processors/db/export-user-lists.ts
@@ -5,7 +5,7 @@ import * as fs from 'fs';
 import { queueLogger } from '../../logger';
 import addFile from '../../../services/drive/add-file';
 import dateFormat = require('dateformat');
-import { getFullApAccount } from '../../../misc/convert-host';
+import { getFullApAccount } from '@/misc/convert-host';
 import { Users, UserLists, UserListJoinings } from '../../../models';
 import { In } from 'typeorm';
 
diff --git a/src/queue/processors/db/import-following.ts b/src/queue/processors/db/import-following.ts
index ff4ff6b6ab4d665b76b2e3cf39e08ac5a65b3932..554337849ebc386f5c1406aaa69705424794823b 100644
--- a/src/queue/processors/db/import-following.ts
+++ b/src/queue/processors/db/import-following.ts
@@ -2,10 +2,10 @@ import * as Bull from 'bull';
 
 import { queueLogger } from '../../logger';
 import follow from '../../../services/following/create';
-import parseAcct from '../../../misc/acct/parse';
+import parseAcct from '@/misc/acct/parse';
 import { resolveUser } from '../../../remote/resolve-user';
-import { downloadTextFile } from '../../../misc/download-text-file';
-import { isSelfHost, toPuny } from '../../../misc/convert-host';
+import { downloadTextFile } from '@/misc/download-text-file';
+import { isSelfHost, toPuny } from '@/misc/convert-host';
 import { Users, DriveFiles } from '../../../models';
 
 const logger = queueLogger.createSubLogger('import-following');
diff --git a/src/queue/processors/db/import-user-lists.ts b/src/queue/processors/db/import-user-lists.ts
index 4692d8cf49ec2f994286ac5b8713041d99ebab4b..2fe023da7d4f601d340879a7f6049d7bea52438e 100644
--- a/src/queue/processors/db/import-user-lists.ts
+++ b/src/queue/processors/db/import-user-lists.ts
@@ -1,13 +1,13 @@
 import * as Bull from 'bull';
 
 import { queueLogger } from '../../logger';
-import parseAcct from '../../../misc/acct/parse';
+import parseAcct from '@/misc/acct/parse';
 import { resolveUser } from '../../../remote/resolve-user';
 import { pushUserToUserList } from '../../../services/user-list/push';
-import { downloadTextFile } from '../../../misc/download-text-file';
-import { isSelfHost, toPuny } from '../../../misc/convert-host';
+import { downloadTextFile } from '@/misc/download-text-file';
+import { isSelfHost, toPuny } from '@/misc/convert-host';
 import { DriveFiles, Users, UserLists, UserListJoinings } from '../../../models';
-import { genId } from '../../../misc/gen-id';
+import { genId } from '@/misc/gen-id';
 
 const logger = queueLogger.createSubLogger('import-user-lists');
 
diff --git a/src/queue/processors/deliver.ts b/src/queue/processors/deliver.ts
index a8b4ed4fe3c709714b188c0e2f75429745e2d151..b167154fcdeb09621c3e6dedde6d9de1933d98b0 100644
--- a/src/queue/processors/deliver.ts
+++ b/src/queue/processors/deliver.ts
@@ -1,3 +1,4 @@
+import { URL } from 'url';
 import * as Bull from 'bull';
 import request from '../../remote/activitypub/request';
 import { registerOrFetchInstanceDoc } from '../../services/register-or-fetch-instance-doc';
@@ -5,9 +6,9 @@ import Logger from '../../services/logger';
 import { Instances } from '../../models';
 import { instanceChart } from '../../services/chart';
 import { fetchInstanceMetadata } from '../../services/fetch-instance-metadata';
-import { fetchMeta } from '../../misc/fetch-meta';
-import { toPuny } from '../../misc/convert-host';
-import { Cache } from '../../misc/cache';
+import { fetchMeta } from '@/misc/fetch-meta';
+import { toPuny } from '@/misc/convert-host';
+import { Cache } from '@/misc/cache';
 import { Instance } from '../../models/entities/instance';
 
 const logger = new Logger('deliver');
diff --git a/src/queue/processors/inbox.ts b/src/queue/processors/inbox.ts
index a5822ff25f6ddb7774462be51f0271c9ccff0f8a..7c746eb25d25d446b89e59e734f765e3f796788e 100644
--- a/src/queue/processors/inbox.ts
+++ b/src/queue/processors/inbox.ts
@@ -1,3 +1,4 @@
+import { URL } from 'url';
 import * as Bull from 'bull';
 import * as httpSignature from 'http-signature';
 import perform from '../../remote/activitypub/perform';
@@ -5,8 +6,8 @@ import Logger from '../../services/logger';
 import { registerOrFetchInstanceDoc } from '../../services/register-or-fetch-instance-doc';
 import { Instances } from '../../models';
 import { instanceChart } from '../../services/chart';
-import { fetchMeta } from '../../misc/fetch-meta';
-import { toPuny, extractDbHost } from '../../misc/convert-host';
+import { fetchMeta } from '@/misc/fetch-meta';
+import { toPuny, extractDbHost } from '@/misc/convert-host';
 import { getApId } from '../../remote/activitypub/type';
 import { fetchInstanceMetadata } from '../../services/fetch-instance-metadata';
 import { InboxJobData } from '..';
diff --git a/src/queue/queues.ts b/src/queue/queues.ts
index d589d9f7dac3f509e1239c42bf12135d8e0dbe7c..819bcf31d8ec22728fe663b4e4128e7303600e9f 100644
--- a/src/queue/queues.ts
+++ b/src/queue/queues.ts
@@ -1,4 +1,4 @@
-import config from '../config';
+import config from '@/config';
 import { initialize as initializeQueue } from './initialize';
 
 export const deliverQueue = initializeQueue('deliver', config.deliverJobPerSec || 128);
diff --git a/src/remote/activitypub/db-resolver.ts b/src/remote/activitypub/db-resolver.ts
index 26162b6b23a13a19023ee1bd9a484ef288b3c04f..dba1f0f0b1ede2e06c48cfa74a0db660f2b76f07 100644
--- a/src/remote/activitypub/db-resolver.ts
+++ b/src/remote/activitypub/db-resolver.ts
@@ -1,4 +1,4 @@
-import config from '../../config';
+import config from '@/config';
 import { Note } from '../../models/entities/note';
 import { User, IRemoteUser } from '../../models/entities/user';
 import { UserPublickey } from '../../models/entities/user-publickey';
diff --git a/src/remote/activitypub/deliver-manager.ts b/src/remote/activitypub/deliver-manager.ts
index 92721f552581b5947e79c5e227d317006603356a..f112b02b4f50774880e39cbd2b4c4044685a5c71 100644
--- a/src/remote/activitypub/deliver-manager.ts
+++ b/src/remote/activitypub/deliver-manager.ts
@@ -1,5 +1,5 @@
 import { Users, Followings } from '../../models';
-import { ILocalUser, IRemoteUser } from '../../models/entities/user';
+import { ILocalUser, IRemoteUser, User } from '../../models/entities/user';
 import { deliver } from '../../queue';
 
 //#region types
@@ -24,7 +24,7 @@ const isDirect = (recipe: any): recipe is IDirectRecipe =>
 //#endregion
 
 export default class DeliverManager {
-	private actor: ILocalUser;
+	private actor: { id: User['id']; host: null; };
 	private activity: any;
 	private recipes: IRecipe[] = [];
 
@@ -33,7 +33,7 @@ export default class DeliverManager {
 	 * @param actor Actor
 	 * @param activity Activity to deliver
 	 */
-	constructor(actor: ILocalUser, activity: any) {
+	constructor(actor: { id: User['id']; host: null; }, activity: any) {
 		this.actor = actor;
 		this.activity = activity;
 	}
diff --git a/src/remote/activitypub/kernel/announce/note.ts b/src/remote/activitypub/kernel/announce/note.ts
index 765180742aec691f7ac97cdc640c025c8b8d3e85..d5176897bc058200c8b7f77d841e7f3f9e2b1a3c 100644
--- a/src/remote/activitypub/kernel/announce/note.ts
+++ b/src/remote/activitypub/kernel/announce/note.ts
@@ -4,9 +4,9 @@ import { IRemoteUser } from '../../../../models/entities/user';
 import { IAnnounce, getApId } from '../../type';
 import { fetchNote, resolveNote } from '../../models/note';
 import { apLogger } from '../../logger';
-import { extractDbHost } from '../../../../misc/convert-host';
-import { fetchMeta } from '../../../../misc/fetch-meta';
-import { getApLock } from '../../../../misc/app-lock';
+import { extractDbHost } from '@/misc/convert-host';
+import { fetchMeta } from '@/misc/fetch-meta';
+import { getApLock } from '@/misc/app-lock';
 import { parseAudience } from '../../audience';
 
 const logger = apLogger;
diff --git a/src/remote/activitypub/kernel/create/note.ts b/src/remote/activitypub/kernel/create/note.ts
index f4fb8e5647520840a1e8184ba583624fdf5a4eaa..69499d303e16053132ddc389ad5289bd8d85a246 100644
--- a/src/remote/activitypub/kernel/create/note.ts
+++ b/src/remote/activitypub/kernel/create/note.ts
@@ -2,8 +2,8 @@ import Resolver from '../../resolver';
 import { IRemoteUser } from '../../../../models/entities/user';
 import { createNote, fetchNote } from '../../models/note';
 import { getApId, IObject, ICreate } from '../../type';
-import { getApLock } from '../../../../misc/app-lock';
-import { extractDbHost } from '../../../../misc/convert-host';
+import { getApLock } from '@/misc/app-lock';
+import { extractDbHost } from '@/misc/convert-host';
 
 /**
  * 投稿作成アクティビティを捌きます
diff --git a/src/remote/activitypub/kernel/delete/note.ts b/src/remote/activitypub/kernel/delete/note.ts
index 8fa2285dba87f278361e8bc83f7f1e5d115b1241..1a7844f68b44dd7482815e378de489d62e318870 100644
--- a/src/remote/activitypub/kernel/delete/note.ts
+++ b/src/remote/activitypub/kernel/delete/note.ts
@@ -2,7 +2,7 @@ import { IRemoteUser } from '../../../../models/entities/user';
 import deleteNode from '../../../../services/note/delete';
 import { apLogger } from '../../logger';
 import DbResolver from '../../db-resolver';
-import { getApLock } from '../../../../misc/app-lock';
+import { getApLock } from '@/misc/app-lock';
 import { deleteMessage } from '../../../../services/messages/delete';
 
 const logger = apLogger;
diff --git a/src/remote/activitypub/kernel/flag/index.ts b/src/remote/activitypub/kernel/flag/index.ts
index 46ea789b4b8ec3d29a1c8374a5ff4de192a69af7..5f5357a3ede94604ac31dc869491e807374e944c 100644
--- a/src/remote/activitypub/kernel/flag/index.ts
+++ b/src/remote/activitypub/kernel/flag/index.ts
@@ -1,9 +1,9 @@
 import { IRemoteUser } from '../../../../models/entities/user';
-import config from '../../../../config';
+import config from '@/config';
 import { IFlag, getApIds } from '../../type';
 import { AbuseUserReports, Users } from '../../../../models';
 import { In } from 'typeorm';
-import { genId } from '../../../../misc/gen-id';
+import { genId } from '@/misc/gen-id';
 
 export default async (actor: IRemoteUser, activity: IFlag): Promise<string> => {
 	// objectは `(User|Note) | (User|Note)[]` だけど、全パターンDBスキーマと対応させられないので
diff --git a/src/remote/activitypub/kernel/read.ts b/src/remote/activitypub/kernel/read.ts
index e4049fa7ef53157ef794385a26bb8916c5156c5b..edbc8e68edb441ea61a62b471b109b1db64fd76f 100644
--- a/src/remote/activitypub/kernel/read.ts
+++ b/src/remote/activitypub/kernel/read.ts
@@ -1,6 +1,6 @@
 import { IRemoteUser } from '../../../models/entities/user';
 import { IRead, getApId } from '../type';
-import { isSelfHost, extractDbHost } from '../../../misc/convert-host';
+import { isSelfHost, extractDbHost } from '@/misc/convert-host';
 import { MessagingMessages } from '../../../models';
 import { readUserMessagingMessage } from '../../../server/api/common/read-messaging-message';
 
diff --git a/src/remote/activitypub/misc/ld-signature.ts b/src/remote/activitypub/misc/ld-signature.ts
index 070e39edfbef68722f76e502cd36c920612d7129..dec07ea81b8695bc8f86b90b6e390f7ae29996d5 100644
--- a/src/remote/activitypub/misc/ld-signature.ts
+++ b/src/remote/activitypub/misc/ld-signature.ts
@@ -2,7 +2,7 @@ import * as crypto from 'crypto';
 import * as jsonld from 'jsonld';
 import { CONTEXTS } from './contexts';
 import fetch from 'node-fetch';
-import { httpAgent, httpsAgent } from '../../../misc/fetch';
+import { httpAgent, httpsAgent } from '@/misc/fetch';
 
 // RsaSignature2017 based from https://github.com/transmute-industries/RsaSignature2017
 
diff --git a/src/remote/activitypub/models/image.ts b/src/remote/activitypub/models/image.ts
index dd8086cbeb7e2bce35b25770ff8ad4d9edd22319..79fc2bf4a697572b2f1e1b006a22d08943391a23 100644
--- a/src/remote/activitypub/models/image.ts
+++ b/src/remote/activitypub/models/image.ts
@@ -1,7 +1,7 @@
 import uploadFromUrl from '../../../services/drive/upload-from-url';
 import { IRemoteUser } from '../../../models/entities/user';
 import Resolver from '../resolver';
-import { fetchMeta } from '../../../misc/fetch-meta';
+import { fetchMeta } from '@/misc/fetch-meta';
 import { apLogger } from '../logger';
 import { DriveFile } from '../../../models/entities/drive-file';
 import { DriveFiles } from '../../../models';
diff --git a/src/remote/activitypub/models/note.ts b/src/remote/activitypub/models/note.ts
index e3488800ca397f021e471778c6eecf27757ba005..09e066708f658b02ae9c0077b7500d051ad6328a 100644
--- a/src/remote/activitypub/models/note.ts
+++ b/src/remote/activitypub/models/note.ts
@@ -1,6 +1,6 @@
 import * as promiseLimit from 'promise-limit';
 
-import config from '../../../config';
+import config from '@/config';
 import Resolver from '../resolver';
 import post from '../../../services/note/create';
 import { resolvePerson, updatePerson } from './person';
@@ -14,14 +14,14 @@ import vote from '../../../services/note/polls/vote';
 import { apLogger } from '../logger';
 import { DriveFile } from '../../../models/entities/drive-file';
 import { deliverQuestionUpdate } from '../../../services/note/polls/update';
-import { extractDbHost, toPuny } from '../../../misc/convert-host';
+import { extractDbHost, toPuny } from '@/misc/convert-host';
 import { Emojis, Polls, MessagingMessages } from '../../../models';
 import { Note } from '../../../models/entities/note';
 import { IObject, getOneApId, getApId, getOneApHrefNullable, validPost, IPost, isEmoji } from '../type';
 import { Emoji } from '../../../models/entities/emoji';
-import { genId } from '../../../misc/gen-id';
-import { fetchMeta } from '../../../misc/fetch-meta';
-import { getApLock } from '../../../misc/app-lock';
+import { genId } from '@/misc/gen-id';
+import { fetchMeta } from '@/misc/fetch-meta';
+import { getApLock } from '@/misc/app-lock';
 import { createMessage } from '../../../services/messages/create';
 import { parseAudience } from '../audience';
 import { extractApMentions } from './mention';
diff --git a/src/remote/activitypub/models/person.ts b/src/remote/activitypub/models/person.ts
index 93e95df0a4a96a264ab018a2e44137af1d4b97aa..5b032d9d9c9bc77c57048e5b47e7d93890e560ce 100644
--- a/src/remote/activitypub/models/person.ts
+++ b/src/remote/activitypub/models/person.ts
@@ -1,6 +1,7 @@
+import { URL } from 'url';
 import * as promiseLimit from 'promise-limit';
 
-import config from '../../../config';
+import config from '@/config';
 import Resolver from '../resolver';
 import { resolveImage } from './image';
 import { isCollectionOrOrderedCollection, isCollection, IPerson, getApId, getOneApHrefNullable, IObject, isPropertyValue, IApPropertyValue } from '../type';
@@ -16,17 +17,17 @@ import { Users, Instances, DriveFiles, Followings, UserProfiles, UserPublickeys
 import { User, IRemoteUser } from '../../../models/entities/user';
 import { Emoji } from '../../../models/entities/emoji';
 import { UserNotePining } from '../../../models/entities/user-note-pining';
-import { genId } from '../../../misc/gen-id';
+import { genId } from '@/misc/gen-id';
 import { instanceChart, usersChart } from '../../../services/chart';
 import { UserPublickey } from '../../../models/entities/user-publickey';
-import { isDuplicateKeyValueError } from '../../../misc/is-duplicate-key-value-error';
-import { toPuny } from '../../../misc/convert-host';
+import { isDuplicateKeyValueError } from '@/misc/is-duplicate-key-value-error';
+import { toPuny } from '@/misc/convert-host';
 import { UserProfile } from '../../../models/entities/user-profile';
 import { validActor } from '../../../remote/activitypub/type';
 import { getConnection } from 'typeorm';
 import { toArray } from '../../../prelude/array';
 import { fetchInstanceMetadata } from '../../../services/fetch-instance-metadata';
-import { normalizeForSearch } from '../../../misc/normalize-for-search';
+import { normalizeForSearch } from '@/misc/normalize-for-search';
 
 const logger = apLogger;
 
diff --git a/src/remote/activitypub/models/question.ts b/src/remote/activitypub/models/question.ts
index 6b6749894ab0ceec5e1598c844963a83f0d128f7..966b15af11e2b0dd08a6e33f70e84937748a6405 100644
--- a/src/remote/activitypub/models/question.ts
+++ b/src/remote/activitypub/models/question.ts
@@ -1,4 +1,4 @@
-import config from '../../../config';
+import config from '@/config';
 import Resolver from '../resolver';
 import { IObject, IQuestion, isQuestion,  } from '../type';
 import { apLogger } from '../logger';
diff --git a/src/remote/activitypub/renderer/accept.ts b/src/remote/activitypub/renderer/accept.ts
index 21b462907455a4c4f8d0d78db9240056df192684..8725a30e7cdd17f564b7d8fb478b91a7b42774ee 100644
--- a/src/remote/activitypub/renderer/accept.ts
+++ b/src/remote/activitypub/renderer/accept.ts
@@ -1,7 +1,7 @@
-import config from '../../../config';
-import { ILocalUser } from '../../../models/entities/user';
+import config from '@/config';
+import { User } from '@/models/entities/user';
 
-export default (object: any, user: ILocalUser) => ({
+export default (object: any, user: { id: User['id']; host: null }) => ({
 	type: 'Accept',
 	actor: `${config.url}/users/${user.id}`,
 	object
diff --git a/src/remote/activitypub/renderer/add.ts b/src/remote/activitypub/renderer/add.ts
index 46f937f61dbe6d017c2dc45fb13757bea0b70576..18f9ccacf508199671ee1eca35a4eb3ec40eeecd 100644
--- a/src/remote/activitypub/renderer/add.ts
+++ b/src/remote/activitypub/renderer/add.ts
@@ -1,4 +1,4 @@
-import config from '../../../config';
+import config from '@/config';
 import { ILocalUser } from '../../../models/entities/user';
 
 export default (user: ILocalUser, target: any, object: any) => ({
diff --git a/src/remote/activitypub/renderer/announce.ts b/src/remote/activitypub/renderer/announce.ts
index d82bf6a693462c2300a673c5b13555c57cf380e6..f577dbbc89eee8ce574e725c716552316f230a62 100644
--- a/src/remote/activitypub/renderer/announce.ts
+++ b/src/remote/activitypub/renderer/announce.ts
@@ -1,4 +1,4 @@
-import config from '../../../config';
+import config from '@/config';
 import { Note } from '../../../models/entities/note';
 
 export default (object: any, note: Note) => {
diff --git a/src/remote/activitypub/renderer/block.ts b/src/remote/activitypub/renderer/block.ts
index c29a9aea8211507c196771c7c3a231e694515b63..26b7dd580acd0dba3b1a35979c89c001b7d0eeb9 100644
--- a/src/remote/activitypub/renderer/block.ts
+++ b/src/remote/activitypub/renderer/block.ts
@@ -1,4 +1,4 @@
-import config from '../../../config';
+import config from '@/config';
 import { ILocalUser, IRemoteUser } from '../../../models/entities/user';
 
 export default (blocker: ILocalUser, blockee: IRemoteUser) => ({
diff --git a/src/remote/activitypub/renderer/create.ts b/src/remote/activitypub/renderer/create.ts
index e1fc0515c8e34292f5e8f89617c0935b349a33aa..ff0840b9e6715a32b3d722a3aef651df206b3f1e 100644
--- a/src/remote/activitypub/renderer/create.ts
+++ b/src/remote/activitypub/renderer/create.ts
@@ -1,4 +1,4 @@
-import config from '../../../config';
+import config from '@/config';
 import { Note } from '../../../models/entities/note';
 
 export default (object: any, note: Note) => {
diff --git a/src/remote/activitypub/renderer/delete.ts b/src/remote/activitypub/renderer/delete.ts
index a98c97e6e915cecd41aef734d781a4f2d9ebec96..710f0482a6c6bc831e9bf4f330a5c915c7d494fc 100644
--- a/src/remote/activitypub/renderer/delete.ts
+++ b/src/remote/activitypub/renderer/delete.ts
@@ -1,7 +1,7 @@
-import config from '../../../config';
-import { ILocalUser } from '../../../models/entities/user';
+import config from '@/config';
+import { User } from '../../../models/entities/user';
 
-export default (object: any, user: ILocalUser) => ({
+export default (object: any, user: { id: User['id']; host: null }) => ({
 	type: 'Delete',
 	actor: `${config.url}/users/${user.id}`,
 	object
diff --git a/src/remote/activitypub/renderer/emoji.ts b/src/remote/activitypub/renderer/emoji.ts
index 947a96df37c8333c227fe426e8d2bb05c08e882b..b62259c32e9647f819297ce13dedd2052f110d0e 100644
--- a/src/remote/activitypub/renderer/emoji.ts
+++ b/src/remote/activitypub/renderer/emoji.ts
@@ -1,4 +1,4 @@
-import config from '../../../config';
+import config from '@/config';
 import { Emoji } from '../../../models/entities/emoji';
 
 export default (emoji: Emoji) => ({
diff --git a/src/remote/activitypub/renderer/follow-relay.ts b/src/remote/activitypub/renderer/follow-relay.ts
index 58bc0c90c33f4d36c34f243bf2bad793d270d8a0..d53bd058257184339f075271643f361bc2758a7e 100644
--- a/src/remote/activitypub/renderer/follow-relay.ts
+++ b/src/remote/activitypub/renderer/follow-relay.ts
@@ -1,4 +1,4 @@
-import config from '../../../config';
+import config from '@/config';
 import { Relay } from '../../../models/entities/relay';
 import { ILocalUser } from '../../../models/entities/user';
 
diff --git a/src/remote/activitypub/renderer/follow-user.ts b/src/remote/activitypub/renderer/follow-user.ts
index bfc91bb4cbc769f19c34aaba58b5124645d02e57..744361a24f7babcbbc30a4c2f75de8e1c4adceaf 100644
--- a/src/remote/activitypub/renderer/follow-user.ts
+++ b/src/remote/activitypub/renderer/follow-user.ts
@@ -1,4 +1,4 @@
-import config from '../../../config';
+import config from '@/config';
 import { Users } from '../../../models';
 import { User } from '../../../models/entities/user';
 
diff --git a/src/remote/activitypub/renderer/follow.ts b/src/remote/activitypub/renderer/follow.ts
index 400b15ec7bedba180bbccd5821232ad3c41f62b6..252b0b283887ec9af9b0d30fd77b795e6b9bde6a 100644
--- a/src/remote/activitypub/renderer/follow.ts
+++ b/src/remote/activitypub/renderer/follow.ts
@@ -1,8 +1,8 @@
-import config from '../../../config';
+import config from '@/config';
 import { User } from '../../../models/entities/user';
 import { Users } from '../../../models';
 
-export default (follower: User, followee: User, requestId?: string) => {
+export default (follower: { id: User['id']; host: User['host']; uri: User['host'] }, followee: { id: User['id']; host: User['host']; uri: User['host'] }, requestId?: string) => {
 	const follow = {
 		type: 'Follow',
 		actor: Users.isLocalUser(follower) ? `${config.url}/users/${follower.id}` : follower.uri,
diff --git a/src/remote/activitypub/renderer/hashtag.ts b/src/remote/activitypub/renderer/hashtag.ts
index 36563c2df5c23e2455a92a452b770074639322b1..a739a4b0b620c5b1eac8b3efe9b13e3df0eea139 100644
--- a/src/remote/activitypub/renderer/hashtag.ts
+++ b/src/remote/activitypub/renderer/hashtag.ts
@@ -1,4 +1,4 @@
-import config from '../../../config';
+import config from '@/config';
 
 export default (tag: string) => ({
 	type: 'Hashtag',
diff --git a/src/remote/activitypub/renderer/index.ts b/src/remote/activitypub/renderer/index.ts
index 4c33fdafb1dfa61676b535af2d3fd9c7847fae4a..3283c88bd461e619182b97207b57e690bf8da7d1 100644
--- a/src/remote/activitypub/renderer/index.ts
+++ b/src/remote/activitypub/renderer/index.ts
@@ -1,9 +1,9 @@
-import config from '../../../config';
+import config from '@/config';
 import { v4 as uuid } from 'uuid';
 import { IActivity } from '../type';
 import { LdSignature } from '../misc/ld-signature';
-import { ILocalUser } from '../../../models/entities/user';
-import { getUserKeypair } from '../../../misc/keypair-store';
+import { getUserKeypair } from '@/misc/keypair-store';
+import { User } from '@/models/entities/user';
 
 export const renderActivity = (x: any): IActivity | null => {
 	if (x == null) return null;
@@ -20,7 +20,7 @@ export const renderActivity = (x: any): IActivity | null => {
 	}, x);
 };
 
-export const attachLdSignature = async (activity: any, user: ILocalUser): Promise<IActivity | null> => {
+export const attachLdSignature = async (activity: any, user: { id: User['id']; host: null; }): Promise<IActivity | null> => {
 	if (activity == null) return null;
 
 	const keypair = await getUserKeypair(user.id);
diff --git a/src/remote/activitypub/renderer/key.ts b/src/remote/activitypub/renderer/key.ts
index e792f487fdb11a77008db5e9bbfb2f5fc27ef841..547059dd3c826385e895b4176acbbee45ffcf2da 100644
--- a/src/remote/activitypub/renderer/key.ts
+++ b/src/remote/activitypub/renderer/key.ts
@@ -1,4 +1,4 @@
-import config from '../../../config';
+import config from '@/config';
 import { ILocalUser } from '../../../models/entities/user';
 import { UserKeypair } from '../../../models/entities/user-keypair';
 import { createPublicKey } from 'crypto';
diff --git a/src/remote/activitypub/renderer/like.ts b/src/remote/activitypub/renderer/like.ts
index d4dd3663d477ed3ad3300bcaaae9c9bd937b7546..596783684687d0077daa66298b5869e2f9dfba26 100644
--- a/src/remote/activitypub/renderer/like.ts
+++ b/src/remote/activitypub/renderer/like.ts
@@ -1,4 +1,4 @@
-import config from '../../../config';
+import config from '@/config';
 import { NoteReaction } from '../../../models/entities/note-reaction';
 import { Note } from '../../../models/entities/note';
 import { Emojis } from '../../../models';
diff --git a/src/remote/activitypub/renderer/mention.ts b/src/remote/activitypub/renderer/mention.ts
index 3b5e8f27af13ef2a4491aec4a2be3c0d98b61e9f..14c4c40d47b2f04e0f60850edf16d71b47274377 100644
--- a/src/remote/activitypub/renderer/mention.ts
+++ b/src/remote/activitypub/renderer/mention.ts
@@ -1,4 +1,4 @@
-import config from '../../../config';
+import config from '@/config';
 import { User, ILocalUser } from '../../../models/entities/user';
 import { Users } from '../../../models';
 
diff --git a/src/remote/activitypub/renderer/note.ts b/src/remote/activitypub/renderer/note.ts
index 8e3e0e9ba1edb0019c3c4d7206748217b346d6c7..54dee07892c93db747a3ef310af8fb4a734f11ae 100644
--- a/src/remote/activitypub/renderer/note.ts
+++ b/src/remote/activitypub/renderer/note.ts
@@ -2,7 +2,7 @@ import renderDocument from './document';
 import renderHashtag from './hashtag';
 import renderMention from './mention';
 import renderEmoji from './emoji';
-import config from '../../../config';
+import config from '@/config';
 import toHtml from '../misc/get-note-html';
 import { Note, IMentionedRemoteUsers } from '../../../models/entities/note';
 import { DriveFile } from '../../../models/entities/drive-file';
diff --git a/src/remote/activitypub/renderer/person.ts b/src/remote/activitypub/renderer/person.ts
index 479e6d76bff57ca95310095f91c3678ac48791ab..e4e8f24f106d0c848c3783e9c27899c086e7d6e8 100644
--- a/src/remote/activitypub/renderer/person.ts
+++ b/src/remote/activitypub/renderer/person.ts
@@ -1,6 +1,7 @@
+import { URL } from 'url';
 import renderImage from './image';
 import renderKey from './key';
-import config from '../../../config';
+import config from '@/config';
 import { ILocalUser } from '../../../models/entities/user';
 import { toHtml } from '../../../mfm/to-html';
 import { parse } from '../../../mfm/parse';
@@ -9,7 +10,7 @@ import renderEmoji from './emoji';
 import { IIdentifier } from '../models/identifier';
 import renderHashtag from './hashtag';
 import { DriveFiles, UserProfiles } from '../../../models';
-import { getUserKeypair } from '../../../misc/keypair-store';
+import { getUserKeypair } from '@/misc/keypair-store';
 
 export async function renderPerson(user: ILocalUser) {
 	const id = `${config.url}/users/${user.id}`;
diff --git a/src/remote/activitypub/renderer/question.ts b/src/remote/activitypub/renderer/question.ts
index 6ade10d1bfa48153d40a3d7c954889d6cdc6ca94..99670f80a10013b884efe40c8923526af4bed972 100644
--- a/src/remote/activitypub/renderer/question.ts
+++ b/src/remote/activitypub/renderer/question.ts
@@ -1,9 +1,9 @@
-import config from '../../../config';
-import { ILocalUser } from '../../../models/entities/user';
+import config from '@/config';
+import { User } from '@/models/entities/user';
 import { Note } from '../../../models/entities/note';
 import { Poll } from '../../../models/entities/poll';
 
-export default async function renderQuestion(user: ILocalUser, note: Note, poll: Poll) {
+export default async function renderQuestion(user: { id: User['id'] }, note: Note, poll: Poll) {
 	const question = {
 		type: 'Question',
 		id: `${config.url}/questions/${note.id}`,
diff --git a/src/remote/activitypub/renderer/read.ts b/src/remote/activitypub/renderer/read.ts
index c53b47859f932d0a8b0524cfb2989661e024030e..1287f4ccb0afc16056a22ca1bb03a9bccfa4eea5 100644
--- a/src/remote/activitypub/renderer/read.ts
+++ b/src/remote/activitypub/renderer/read.ts
@@ -1,8 +1,8 @@
-import config from '../../../config';
-import { ILocalUser } from '../../../models/entities/user';
+import config from '@/config';
+import { User } from '@/models/entities/user';
 import { MessagingMessage } from '../../../models/entities/messaging-message';
 
-export const renderReadActivity = (user: ILocalUser, message: MessagingMessage) => ({
+export const renderReadActivity = (user: { id: User['id'] }, message: MessagingMessage) => ({
 	type: 'Read',
 	actor: `${config.url}/users/${user.id}`,
 	object: message.uri
diff --git a/src/remote/activitypub/renderer/reject.ts b/src/remote/activitypub/renderer/reject.ts
index c4e0ba0d0adc6db72c69320de208414c9751dccf..e1eb5b004ee141bfb19ccef50ebc66f7f749df8a 100644
--- a/src/remote/activitypub/renderer/reject.ts
+++ b/src/remote/activitypub/renderer/reject.ts
@@ -1,7 +1,7 @@
-import config from '../../../config';
-import { ILocalUser } from '../../../models/entities/user';
+import config from '@/config';
+import { User } from '@/models/entities/user';
 
-export default (object: any, user: ILocalUser) => ({
+export default (object: any, user: { id: User['id'] }) => ({
 	type: 'Reject',
 	actor: `${config.url}/users/${user.id}`,
 	object
diff --git a/src/remote/activitypub/renderer/remove.ts b/src/remote/activitypub/renderer/remove.ts
index 1b9a6b8c05fda5f1f50ac1d06ba58329551b60c4..ff1fab8e57f39681573d26e75b2baf812ef8a875 100644
--- a/src/remote/activitypub/renderer/remove.ts
+++ b/src/remote/activitypub/renderer/remove.ts
@@ -1,7 +1,7 @@
-import config from '../../../config';
-import { ILocalUser } from '../../../models/entities/user';
+import config from '@/config';
+import { User } from '@/models/entities/user';
 
-export default (user: ILocalUser, target: any, object: any) => ({
+export default (user: { id: User['id'] }, target: any, object: any) => ({
 	type: 'Remove',
 	actor: `${config.url}/users/${user.id}`,
 	target,
diff --git a/src/remote/activitypub/renderer/undo.ts b/src/remote/activitypub/renderer/undo.ts
index 2ff6b61b905c743b08205e0d08be976f4310abe5..6f367415c4438f4e72cb18b3972ba28324a19384 100644
--- a/src/remote/activitypub/renderer/undo.ts
+++ b/src/remote/activitypub/renderer/undo.ts
@@ -1,7 +1,7 @@
-import config from '../../../config';
+import config from '@/config';
 import { ILocalUser, User } from '../../../models/entities/user';
 
-export default (object: any, user: ILocalUser | User) => ({
+export default (object: any, user: { id: User['id'] }) => ({
 	type: 'Undo',
 	actor: `${config.url}/users/${user.id}`,
 	object
diff --git a/src/remote/activitypub/renderer/update.ts b/src/remote/activitypub/renderer/update.ts
index c1d5ba29b243d262aa5fc106ed5fccb65945dd66..4295fc64f3be59122db74c6bf91f83822be674c2 100644
--- a/src/remote/activitypub/renderer/update.ts
+++ b/src/remote/activitypub/renderer/update.ts
@@ -1,7 +1,7 @@
-import config from '../../../config';
-import { ILocalUser } from '../../../models/entities/user';
+import config from '@/config';
+import { User } from '@/models/entities/user';
 
-export default (object: any, user: ILocalUser) => {
+export default (object: any, user: { id: User['id'] }) => {
 	const activity = {
 		id: `${config.url}/users/${user.id}#updates/${new Date().getTime()}`,
 		actor: `${config.url}/users/${user.id}`,
diff --git a/src/remote/activitypub/renderer/vote.ts b/src/remote/activitypub/renderer/vote.ts
index 8929c03460bac78865e088423db6df709ff60616..529fdaafcd13c394159e36a3cfaed5cab845f4b5 100644
--- a/src/remote/activitypub/renderer/vote.ts
+++ b/src/remote/activitypub/renderer/vote.ts
@@ -1,10 +1,10 @@
-import config from '../../../config';
+import config from '@/config';
 import { Note } from '../../../models/entities/note';
-import { IRemoteUser, ILocalUser } from '../../../models/entities/user';
+import { IRemoteUser, User } from '../../../models/entities/user';
 import { PollVote } from '../../../models/entities/poll-vote';
 import { Poll } from '../../../models/entities/poll';
 
-export default async function renderVote(user: ILocalUser, vote: PollVote, note: Note, poll: Poll, pollOwner: IRemoteUser): Promise<any> {
+export default async function renderVote(user: { id: User['id'] }, vote: PollVote, note: Note, poll: Poll, pollOwner: IRemoteUser): Promise<any> {
 	return {
 		id: `${config.url}/users/${user.id}#votes/${vote.id}/activity`,
 		actor: `${config.url}/users/${user.id}`,
diff --git a/src/remote/activitypub/request.ts b/src/remote/activitypub/request.ts
index 5f15d5480cd35b72be2a8a5aabeb73ca82ecfb51..e4dca32329b015506205b348d42af5f2f897d695 100644
--- a/src/remote/activitypub/request.ts
+++ b/src/remote/activitypub/request.ts
@@ -3,15 +3,15 @@ import * as https from 'https';
 import { sign } from 'http-signature';
 import * as crypto from 'crypto';
 
-import config from '../../config';
-import { ILocalUser } from '../../models/entities/user';
-import { getAgentByUrl } from '../../misc/fetch';
+import config from '@/config';
+import { User } from '@/models/entities/user';
+import { getAgentByUrl } from '@/misc/fetch';
 import { URL } from 'url';
 import got from 'got';
 import * as Got from 'got';
-import { getUserKeypair } from '../../misc/keypair-store';
+import { getUserKeypair } from '@/misc/keypair-store';
 
-export default async (user: ILocalUser, url: string, object: any) => {
+export default async (user: { id: User['id'] }, url: string, object: any) => {
 	const timeout = 10 * 1000;
 
 	const { protocol, hostname, port, pathname, search } = new URL(url);
@@ -24,7 +24,7 @@ export default async (user: ILocalUser, url: string, object: any) => {
 
 	const keypair = await getUserKeypair(user.id);
 
-	await new Promise((resolve, reject) => {
+	await new Promise<void>((resolve, reject) => {
 		const req = https.request({
 			agent: getAgentByUrl(new URL(`https://example.net`)),
 			protocol,
@@ -69,7 +69,7 @@ export default async (user: ILocalUser, url: string, object: any) => {
  * @param user http-signature user
  * @param url URL to fetch
  */
-export async function signedGet(url: string, user: ILocalUser) {
+export async function signedGet(url: string, user: { id: User['id'] }) {
 	const timeout = 10 * 1000;
 
 	const keypair = await getUserKeypair(user.id);
diff --git a/src/remote/activitypub/resolver.ts b/src/remote/activitypub/resolver.ts
index 2871c1cb4160ea4c70f4d5b5fb49c4d5245bb1d3..066bde0883e4f08fb6d067722e59a867dfd51e51 100644
--- a/src/remote/activitypub/resolver.ts
+++ b/src/remote/activitypub/resolver.ts
@@ -1,5 +1,5 @@
-import config from '../../config';
-import { getJson } from '../../misc/fetch';
+import config from '@/config';
+import { getJson } from '@/misc/fetch';
 import { ILocalUser } from '../../models/entities/user';
 import { getInstanceActor } from '../../services/instance-actor';
 import { signedGet } from './request';
diff --git a/src/remote/resolve-user.ts b/src/remote/resolve-user.ts
index 8149c184fe79d59a5861e809ae753d6453e54baa..1bcecee3c104af2546bcf3be101568accff43d2d 100644
--- a/src/remote/resolve-user.ts
+++ b/src/remote/resolve-user.ts
@@ -1,11 +1,12 @@
+import { URL } from 'url';
 import webFinger from './webfinger';
-import config from '../config';
+import config from '@/config';
 import { createPerson, updatePerson } from './activitypub/models/person';
 import { remoteLogger } from './logger';
 import * as chalk from 'chalk';
 import { User, IRemoteUser } from '../models/entities/user';
 import { Users } from '../models';
-import { toPuny } from '../misc/convert-host';
+import { toPuny } from '@/misc/convert-host';
 
 const logger = remoteLogger.createSubLogger('resolve-user');
 
diff --git a/src/remote/webfinger.ts b/src/remote/webfinger.ts
index 04f978a35dd520a4b52c3dfcbbc77d0e86ba8c35..744ab3639a84cbfd731979ce752b3582130ab05c 100644
--- a/src/remote/webfinger.ts
+++ b/src/remote/webfinger.ts
@@ -1,4 +1,5 @@
-import { getJson } from '../misc/fetch';
+import { URL } from 'url';
+import { getJson } from '@/misc/fetch';
 import { query as urlQuery } from '../prelude/url';
 
 type ILink = {
diff --git a/src/server/activitypub.ts b/src/server/activitypub.ts
index 694807239b44781062112ec1b23197601c361c66..0ddc4683fefc3ecfc37b6e702c37ffc978bc9993 100644
--- a/src/server/activitypub.ts
+++ b/src/server/activitypub.ts
@@ -12,12 +12,12 @@ import Followers from './activitypub/followers';
 import Following from './activitypub/following';
 import Featured from './activitypub/featured';
 import { inbox as processInbox } from '../queue';
-import { isSelfHost } from '../misc/convert-host';
+import { isSelfHost } from '@/misc/convert-host';
 import { Notes, Users, Emojis, NoteReactions } from '../models';
 import { ILocalUser, User } from '../models/entities/user';
 import { In } from 'typeorm';
 import { renderLike } from '../remote/activitypub/renderer/like';
-import { getUserKeypair } from '../misc/keypair-store';
+import { getUserKeypair } from '@/misc/keypair-store';
 
 // Init router
 const router = new Router();
diff --git a/src/server/activitypub/featured.ts b/src/server/activitypub/featured.ts
index 66ad2aa86e37d7728eecc8d21ce231060751932a..02d4a30a5db77382e93cbcdc2802a31871097d48 100644
--- a/src/server/activitypub/featured.ts
+++ b/src/server/activitypub/featured.ts
@@ -1,5 +1,5 @@
 import * as Router from '@koa/router';
-import config from '../../config';
+import config from '@/config';
 import { renderActivity } from '../../remote/activitypub/renderer';
 import renderOrderedCollection from '../../remote/activitypub/renderer/ordered-collection';
 import { setResponseType } from '../activitypub';
diff --git a/src/server/activitypub/followers.ts b/src/server/activitypub/followers.ts
index d7b5a15b1ed8060feb2d4adab4e2eb38c78d5cbc..a4f2e666d0271912569077b158d06ce9815b7b24 100644
--- a/src/server/activitypub/followers.ts
+++ b/src/server/activitypub/followers.ts
@@ -1,7 +1,7 @@
 import * as Router from '@koa/router';
-import config from '../../config';
+import config from '@/config';
 import $ from 'cafy';
-import { ID } from '../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import * as url from '../../prelude/url';
 import { renderActivity } from '../../remote/activitypub/renderer';
 import renderOrderedCollection from '../../remote/activitypub/renderer/ordered-collection';
diff --git a/src/server/activitypub/following.ts b/src/server/activitypub/following.ts
index d39e680d9e47f625abfd9e1d6689d62360833935..f5e5c62364944cf27fb1c11144979afc6547d126 100644
--- a/src/server/activitypub/following.ts
+++ b/src/server/activitypub/following.ts
@@ -1,7 +1,7 @@
 import * as Router from '@koa/router';
-import config from '../../config';
+import config from '@/config';
 import $ from 'cafy';
-import { ID } from '../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import * as url from '../../prelude/url';
 import { renderActivity } from '../../remote/activitypub/renderer';
 import renderOrderedCollection from '../../remote/activitypub/renderer/ordered-collection';
diff --git a/src/server/activitypub/outbox.ts b/src/server/activitypub/outbox.ts
index 3c1b07a6796803bcccd39a69966640e21a8e2e43..338e177370eb8cd2fa25fd96ed3b5f6ab1961e78 100644
--- a/src/server/activitypub/outbox.ts
+++ b/src/server/activitypub/outbox.ts
@@ -1,7 +1,7 @@
 import * as Router from '@koa/router';
-import config from '../../config';
+import config from '@/config';
 import $ from 'cafy';
-import { ID } from '../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import { renderActivity } from '../../remote/activitypub/renderer';
 import renderOrderedCollection from '../../remote/activitypub/renderer/ordered-collection';
 import renderOrderedCollectionPage from '../../remote/activitypub/renderer/ordered-collection-page';
diff --git a/src/server/api/2fa.ts b/src/server/api/2fa.ts
index 8e6e635bb018b262a5368c09bec8f5199cc24903..77f0f8cd047450c4016e12c66b43240e21863e6a 100644
--- a/src/server/api/2fa.ts
+++ b/src/server/api/2fa.ts
@@ -1,5 +1,5 @@
 import * as crypto from 'crypto';
-import config from '../../config';
+import config from '@/config';
 import * as jsrsasign from 'jsrsasign';
 
 const ECC_PRELUDE = Buffer.from([0x04]);
diff --git a/src/server/api/authenticate.ts b/src/server/api/authenticate.ts
index 9c9ef74352186bb77648e1727ed3a6cf8d81b0a7..6ea5a111bc9fb4705a163bfb21c80c9785ed9e7c 100644
--- a/src/server/api/authenticate.ts
+++ b/src/server/api/authenticate.ts
@@ -2,7 +2,7 @@ import isNativeToken from './common/is-native-token';
 import { User } from '../../models/entities/user';
 import { Users, AccessTokens, Apps } from '../../models';
 import { AccessToken } from '../../models/entities/access-token';
-import { Cache } from '../../misc/cache';
+import { Cache } from '@/misc/cache';
 
 // TODO: TypeORMのカスタムキャッシュプロバイダを使っても良いかも
 // ref. https://github.com/typeorm/typeorm/blob/master/docs/caching.md
diff --git a/src/server/api/common/generate-block-query.ts b/src/server/api/common/generate-block-query.ts
index 3636410485f8877b7e01ff2459cb7eea34f22ed3..fa2179ae64e41cccaa86d3435dd76129639dd61a 100644
--- a/src/server/api/common/generate-block-query.ts
+++ b/src/server/api/common/generate-block-query.ts
@@ -2,7 +2,7 @@ import { User } from '../../../models/entities/user';
 import { Blockings } from '../../../models';
 import { SelectQueryBuilder } from 'typeorm';
 
-export function generateBlockQueryForUsers(q: SelectQueryBuilder<any>, me: User) {
+export function generateBlockQueryForUsers(q: SelectQueryBuilder<any>, me: { id: User['id'] }) {
 	const blockingQuery = Blockings.createQueryBuilder('blocking')
 		.select('blocking.blockeeId')
 		.where('blocking.blockerId = :blockerId', { blockerId: me.id });
diff --git a/src/server/api/common/generate-channel-query.ts b/src/server/api/common/generate-channel-query.ts
index c0337b2c6bad56c82986ac7ed85c0f1173b94959..74a6d68c40ef0d87a22bc9dde1353d2062125938 100644
--- a/src/server/api/common/generate-channel-query.ts
+++ b/src/server/api/common/generate-channel-query.ts
@@ -2,7 +2,7 @@ import { User } from '../../../models/entities/user';
 import { ChannelFollowings } from '../../../models';
 import { Brackets, SelectQueryBuilder } from 'typeorm';
 
-export function generateChannelQuery(q: SelectQueryBuilder<any>, me?: User | null) {
+export function generateChannelQuery(q: SelectQueryBuilder<any>, me?: { id: User['id'] } | null) {
 	if (me == null) {
 		q.andWhere('note.channelId IS NULL');
 	} else {
diff --git a/src/server/api/common/generate-muted-note-query.ts b/src/server/api/common/generate-muted-note-query.ts
index 498930476ceba6e458ce0b59f18ba33e7080d0dd..c7f9f7c5a31073c263462bba4690c8efd3f9fa52 100644
--- a/src/server/api/common/generate-muted-note-query.ts
+++ b/src/server/api/common/generate-muted-note-query.ts
@@ -2,7 +2,7 @@ import { User } from '../../../models/entities/user';
 import { MutedNotes } from '../../../models';
 import { SelectQueryBuilder } from 'typeorm';
 
-export function generateMutedNoteQuery(q: SelectQueryBuilder<any>, me: User) {
+export function generateMutedNoteQuery(q: SelectQueryBuilder<any>, me: { id: User['id'] }) {
 	const mutedQuery = MutedNotes.createQueryBuilder('muted')
 		.select('muted.noteId')
 		.where('muted.userId = :userId', { userId: me.id });
diff --git a/src/server/api/common/generate-muted-user-query.ts b/src/server/api/common/generate-muted-user-query.ts
index b346f2f0fb1ea24bca11420e4cd092ea457ab5b7..f5e072ba93b82bdec8da891337a868730d6b9cb6 100644
--- a/src/server/api/common/generate-muted-user-query.ts
+++ b/src/server/api/common/generate-muted-user-query.ts
@@ -2,7 +2,7 @@ import { User } from '../../../models/entities/user';
 import { Mutings } from '../../../models';
 import { SelectQueryBuilder, Brackets } from 'typeorm';
 
-export function generateMutedUserQuery(q: SelectQueryBuilder<any>, me: User, exclude?: User) {
+export function generateMutedUserQuery(q: SelectQueryBuilder<any>, me: { id: User['id'] }, exclude?: User) {
 	const mutingQuery = Mutings.createQueryBuilder('muting')
 		.select('muting.muteeId')
 		.where('muting.muterId = :muterId', { muterId: me.id });
@@ -28,7 +28,7 @@ export function generateMutedUserQuery(q: SelectQueryBuilder<any>, me: User, exc
 	q.setParameters(mutingQuery.getParameters());
 }
 
-export function generateMutedUserQueryForUsers(q: SelectQueryBuilder<any>, me: User) {
+export function generateMutedUserQueryForUsers(q: SelectQueryBuilder<any>, me: { id: User['id'] }) {
 	const mutingQuery = Mutings.createQueryBuilder('muting')
 		.select('muting.muteeId')
 		.where('muting.muterId = :muterId', { muterId: me.id });
diff --git a/src/server/api/common/generate-native-user-token.ts b/src/server/api/common/generate-native-user-token.ts
index cd30ba98f9a0a1ce8b61753e4369a70e0c6e2095..1f791c57ceb3899962066696b5d97c6398710a1b 100644
--- a/src/server/api/common/generate-native-user-token.ts
+++ b/src/server/api/common/generate-native-user-token.ts
@@ -1,3 +1,3 @@
-import { secureRndstr } from '../../../misc/secure-rndstr';
+import { secureRndstr } from '@/misc/secure-rndstr';
 
 export default () => secureRndstr(16, true);
diff --git a/src/server/api/common/generate-replies-query.ts b/src/server/api/common/generate-replies-query.ts
index 8ebe93f20a361f2a78bb38aa8c9d89121ee453c9..29b1e17c2eb5ffd66e4d6a6dfed18f907d1ed149 100644
--- a/src/server/api/common/generate-replies-query.ts
+++ b/src/server/api/common/generate-replies-query.ts
@@ -1,7 +1,7 @@
 import { User } from '../../../models/entities/user';
 import { Brackets, SelectQueryBuilder } from 'typeorm';
 
-export function generateRepliesQuery(q: SelectQueryBuilder<any>, me?: User | null) {
+export function generateRepliesQuery(q: SelectQueryBuilder<any>, me?: { id: User['id'] } | null) {
 	if (me == null) {
 		q.andWhere(new Brackets(qb => { qb
 			.where(`note.replyId IS NULL`) // 返信ではない
diff --git a/src/server/api/common/generate-visibility-query.ts b/src/server/api/common/generate-visibility-query.ts
index d981b4a613bfc8ab221e44cc570649c93dc6261d..72ed1c46eaeacbc99f6c3603bc015f1d24b1eb0e 100644
--- a/src/server/api/common/generate-visibility-query.ts
+++ b/src/server/api/common/generate-visibility-query.ts
@@ -2,7 +2,7 @@ import { User } from '../../../models/entities/user';
 import { Followings } from '../../../models';
 import { Brackets, SelectQueryBuilder } from 'typeorm';
 
-export function generateVisibilityQuery(q: SelectQueryBuilder<any>, me?: User | null) {
+export function generateVisibilityQuery(q: SelectQueryBuilder<any>, me?: { id: User['id'] } | null) {
 	if (me == null) {
 		q.andWhere(new Brackets(qb => { qb
 			.where(`note.visibility = 'public'`)
diff --git a/src/server/api/common/getters.ts b/src/server/api/common/getters.ts
index 04716d19c64e005c9d81f26637dbd852961b52b7..73fbadfee62baa5b93a08b11318d5b024890b1b9 100644
--- a/src/server/api/common/getters.ts
+++ b/src/server/api/common/getters.ts
@@ -1,4 +1,4 @@
-import { IdentifiableError } from '../../../misc/identifiable-error';
+import { IdentifiableError } from '@/misc/identifiable-error';
 import { User } from '../../../models/entities/user';
 import { Note } from '../../../models/entities/note';
 import { Notes, Users } from '../../../models';
diff --git a/src/server/api/common/read-messaging-message.ts b/src/server/api/common/read-messaging-message.ts
index 90510bb393e70c69279e7d2df812a052bcf2d231..6c9fcf973f6d97e884f48b5623569db6fc6239e5 100644
--- a/src/server/api/common/read-messaging-message.ts
+++ b/src/server/api/common/read-messaging-message.ts
@@ -1,11 +1,11 @@
 import { publishMainStream, publishGroupMessagingStream } from '../../../services/stream';
 import { publishMessagingStream } from '../../../services/stream';
 import { publishMessagingIndexStream } from '../../../services/stream';
-import { User, ILocalUser, IRemoteUser } from '../../../models/entities/user';
+import { User, IRemoteUser } from '../../../models/entities/user';
 import { MessagingMessage } from '../../../models/entities/messaging-message';
 import { MessagingMessages, UserGroupJoinings, Users } from '../../../models';
 import { In } from 'typeorm';
-import { IdentifiableError } from '../../../misc/identifiable-error';
+import { IdentifiableError } from '@/misc/identifiable-error';
 import { UserGroup } from '../../../models/entities/user-group';
 import { toArray } from '../../../prelude/array';
 import { renderReadActivity } from '../../../remote/activitypub/renderer/read';
@@ -107,7 +107,7 @@ export async function readGroupMessagingMessage(
 	}
 }
 
-export async function deliverReadActivity(user: ILocalUser, recipient: IRemoteUser, messages: MessagingMessage | MessagingMessage[]) {
+export async function deliverReadActivity(user: { id: User['id']; host: null; }, recipient: IRemoteUser, messages: MessagingMessage | MessagingMessage[]) {
 	messages = toArray(messages).filter(x => x.uri);
 	const contents = messages.map(x => renderReadActivity(user, x));
 
diff --git a/src/server/api/common/signin.ts b/src/server/api/common/signin.ts
index 50f79f1919886b32415c21a157688ad800e51919..af09a70340d2f781bba8ac55e767f1be3cdd6281 100644
--- a/src/server/api/common/signin.ts
+++ b/src/server/api/common/signin.ts
@@ -1,9 +1,9 @@
 import * as Koa from 'koa';
 
-import config from '../../../config';
+import config from '@/config';
 import { ILocalUser } from '../../../models/entities/user';
 import { Signins } from '../../../models';
-import { genId } from '../../../misc/gen-id';
+import { genId } from '@/misc/gen-id';
 import { publishMainStream } from '../../../services/stream';
 
 export default function(ctx: Koa.Context, user: ILocalUser, redirect = false) {
diff --git a/src/server/api/common/signup.ts b/src/server/api/common/signup.ts
index 26a9d03e0f1b03f017d89e53402b835f77b1acf4..b8d197317a560832f2b7e43a84346c84bcb43c8c 100644
--- a/src/server/api/common/signup.ts
+++ b/src/server/api/common/signup.ts
@@ -5,8 +5,8 @@ import { User } from '../../../models/entities/user';
 import { Users, UsedUsernames } from '../../../models';
 import { UserProfile } from '../../../models/entities/user-profile';
 import { getConnection } from 'typeorm';
-import { genId } from '../../../misc/gen-id';
-import { toPunyNullable } from '../../../misc/convert-host';
+import { genId } from '@/misc/gen-id';
+import { toPunyNullable } from '@/misc/convert-host';
 import { UserKeypair } from '../../../models/entities/user-keypair';
 import { usersChart } from '../../../services/chart';
 import { UsedUsername } from '../../../models/entities/used-username';
diff --git a/src/server/api/define.ts b/src/server/api/define.ts
index 4e59357c13e7b6ff8f13c4d153c7f1b11799c403..432d5017e84007a05b277dca82b8ce987cf40b93 100644
--- a/src/server/api/define.ts
+++ b/src/server/api/define.ts
@@ -2,9 +2,21 @@ import * as fs from 'fs';
 import { ILocalUser } from '../../models/entities/user';
 import { IEndpointMeta } from './endpoints';
 import { ApiError } from './error';
-import { SchemaType } from '../../misc/schema';
+import { SchemaType } from '@/misc/schema';
 import { AccessToken } from '../../models/entities/access-token';
 
+type SimpleUserInfo = {
+	id: ILocalUser['id'];
+	host: ILocalUser['host'];
+	username: ILocalUser['username'];
+	uri: ILocalUser['uri'];
+	inbox: ILocalUser['inbox'];
+	sharedInbox: ILocalUser['sharedInbox'];
+	isAdmin: ILocalUser['isAdmin'];
+	isModerator: ILocalUser['isModerator'];
+	isSilenced: ILocalUser['isSilenced'];
+};
+
 // TODO: defaultが設定されている場合はその型も考慮する
 type Params<T extends IEndpointMeta> = {
 	[P in keyof T['params']]: NonNullable<T['params']>[P]['transform'] extends Function
@@ -15,13 +27,12 @@ type Params<T extends IEndpointMeta> = {
 export type Response = Record<string, any> | void;
 
 type executor<T extends IEndpointMeta> =
-	(params: Params<T>, user: T['requireCredential'] extends true ? ILocalUser : ILocalUser | null, token: AccessToken | null, file?: any, cleanup?: Function) =>
+	(params: Params<T>, user: T['requireCredential'] extends true ? SimpleUserInfo : SimpleUserInfo | null, token: AccessToken | null, file?: any, cleanup?: Function) =>
 		Promise<T['res'] extends undefined ? Response : SchemaType<NonNullable<T['res']>>>;
 
-// TODO: API関数に user まるごと渡すのではなくユーザーIDなどの最小限のプロパティだけ渡すようにしたい(キャッシュとか考えないでよくなるため)
 export default function <T extends IEndpointMeta>(meta: T, cb: executor<T>)
-		: (params: any, user: T['requireCredential'] extends true ? ILocalUser : ILocalUser | null, token: AccessToken | null, file?: any) => Promise<any> {
-	return (params: any, user: T['requireCredential'] extends true ? ILocalUser : ILocalUser | null, token: AccessToken | null, file?: any) => {
+		: (params: any, user: T['requireCredential'] extends true ? SimpleUserInfo : SimpleUserInfo | null, token: AccessToken | null, file?: any) => Promise<any> {
+	return (params: any, user: T['requireCredential'] extends true ? SimpleUserInfo : SimpleUserInfo | null, token: AccessToken | null, file?: any) => {
 		function cleanup() {
 			fs.unlink(file.path, () => {});
 		}
diff --git a/src/server/api/endpoints.ts b/src/server/api/endpoints.ts
index 1a8fca6dfae37b5ac7e0a9e4a764595041bf8042..9847cd2bb6c8f47e9de698299feb70d6632cad63 100644
--- a/src/server/api/endpoints.ts
+++ b/src/server/api/endpoints.ts
@@ -1,7 +1,7 @@
 import { Context } from 'cafy';
 import * as path from 'path';
 import * as glob from 'glob';
-import { Schema } from '../../misc/schema';
+import { Schema } from '@/misc/schema';
 
 export type Param = {
 	validator: Context<any>;
diff --git a/src/server/api/endpoints/admin/abuse-user-reports.ts b/src/server/api/endpoints/admin/abuse-user-reports.ts
index d63997d2037e9fdd8f331928cc0d8265f4d47b2a..bbb696394ef929c995ef5a1c3db97ac8155cb9e9 100644
--- a/src/server/api/endpoints/admin/abuse-user-reports.ts
+++ b/src/server/api/endpoints/admin/abuse-user-reports.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../define';
 import { AbuseUserReports } from '../../../../models';
 import { makePaginationQuery } from '../../common/make-pagination-query';
diff --git a/src/server/api/endpoints/admin/accounts/create.ts b/src/server/api/endpoints/admin/accounts/create.ts
index 27ceca158b2fc89a99ab14b00d9485ec156a2c6b..9e3fc46acd5f468b0f59e63ae87c9dae4a9faa82 100644
--- a/src/server/api/endpoints/admin/accounts/create.ts
+++ b/src/server/api/endpoints/admin/accounts/create.ts
@@ -34,7 +34,8 @@ export const meta = {
 	}
 };
 
-export default define(meta, async (ps, me) => {
+export default define(meta, async (ps, _me) => {
+	const me = _me ? await Users.findOneOrFail(_me.id) : null;
 	const noUsers = (await Users.count({
 		host: null,
 	})) === 0;
diff --git a/src/server/api/endpoints/admin/announcements/create.ts b/src/server/api/endpoints/admin/announcements/create.ts
index dc01621c7555363cea16215a518f6db5ed1a37d3..3675e50bac70a7fd025adc66aaa24e26f02a9b72 100644
--- a/src/server/api/endpoints/admin/announcements/create.ts
+++ b/src/server/api/endpoints/admin/announcements/create.ts
@@ -1,7 +1,7 @@
 import $ from 'cafy';
 import define from '../../../define';
 import { Announcements } from '../../../../../models';
-import { genId } from '../../../../../misc/gen-id';
+import { genId } from '@/misc/gen-id';
 
 export const meta = {
 	desc: {
diff --git a/src/server/api/endpoints/admin/announcements/delete.ts b/src/server/api/endpoints/admin/announcements/delete.ts
index 6c9c065757e0dc4657d68246325b32f031d35973..44a46ae435b12f0407b97aeeb6fdab0b7163500a 100644
--- a/src/server/api/endpoints/admin/announcements/delete.ts
+++ b/src/server/api/endpoints/admin/announcements/delete.ts
@@ -1,6 +1,6 @@
 import $ from 'cafy';
 import define from '../../../define';
-import { ID } from '../../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import { Announcements } from '../../../../../models';
 import { ApiError } from '../../../error';
 
diff --git a/src/server/api/endpoints/admin/announcements/list.ts b/src/server/api/endpoints/admin/announcements/list.ts
index 5489b0d2c7d5fb657b76f057ade72bebb5c84ed1..a42f24c45e17dfadbf1b7f0df9131ab6c63c2a97 100644
--- a/src/server/api/endpoints/admin/announcements/list.ts
+++ b/src/server/api/endpoints/admin/announcements/list.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../../define';
 import { Announcements, AnnouncementReads } from '../../../../../models';
 import { makePaginationQuery } from '../../../common/make-pagination-query';
diff --git a/src/server/api/endpoints/admin/announcements/update.ts b/src/server/api/endpoints/admin/announcements/update.ts
index 9c4165eae053912f94fd1b53054df2a675386664..c869e7c9c64ab11bbde4f7f68c87624ed503bc8f 100644
--- a/src/server/api/endpoints/admin/announcements/update.ts
+++ b/src/server/api/endpoints/admin/announcements/update.ts
@@ -1,6 +1,6 @@
 import $ from 'cafy';
 import define from '../../../define';
-import { ID } from '../../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import { Announcements } from '../../../../../models';
 import { ApiError } from '../../../error';
 
diff --git a/src/server/api/endpoints/admin/delete-all-files-of-a-user.ts b/src/server/api/endpoints/admin/delete-all-files-of-a-user.ts
index 9da3b632ac1b8e063e2467a47893f40ab40fd551..8143239b54762e1f6fc31255086128df7be0224c 100644
--- a/src/server/api/endpoints/admin/delete-all-files-of-a-user.ts
+++ b/src/server/api/endpoints/admin/delete-all-files-of-a-user.ts
@@ -2,7 +2,7 @@ import $ from 'cafy';
 import define from '../../define';
 import { deleteFile } from '../../../../services/drive/delete-file';
 import { DriveFiles } from '../../../../models';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 
 export const meta = {
 	desc: {
diff --git a/src/server/api/endpoints/admin/delete-logs.ts b/src/server/api/endpoints/admin/delete-logs.ts
index 3719387312e69ca9c7d5709f6d3b89c5a9963f15..1caea46ea0a6f939a08f9560cf6bd835f3910c83 100644
--- a/src/server/api/endpoints/admin/delete-logs.ts
+++ b/src/server/api/endpoints/admin/delete-logs.ts
@@ -14,5 +14,5 @@ export const meta = {
 };
 
 export default define(meta, async (ps) => {
-	await Logs.delete({});
+	await Logs.clear();	// TRUNCATE
 });
diff --git a/src/server/api/endpoints/admin/drive/files.ts b/src/server/api/endpoints/admin/drive/files.ts
index 496050d2dfb09eb70de833939844073677e4aeff..1a5c940f1ed99b72c4e79eeabb6aae2b162c3d28 100644
--- a/src/server/api/endpoints/admin/drive/files.ts
+++ b/src/server/api/endpoints/admin/drive/files.ts
@@ -2,7 +2,7 @@ import $ from 'cafy';
 import define from '../../../define';
 import { DriveFiles } from '../../../../../models';
 import { makePaginationQuery } from '../../../common/make-pagination-query';
-import { ID } from '../../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 
 export const meta = {
 	desc: {
diff --git a/src/server/api/endpoints/admin/drive/show-file.ts b/src/server/api/endpoints/admin/drive/show-file.ts
index 96478a1c7d588c98a958c928ef904f36d7fe2df7..cfe25306c267a4e0ea93463037e36d181ac5775f 100644
--- a/src/server/api/endpoints/admin/drive/show-file.ts
+++ b/src/server/api/endpoints/admin/drive/show-file.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../../define';
 import { ApiError } from '../../../error';
 import { DriveFiles } from '../../../../../models';
diff --git a/src/server/api/endpoints/admin/emoji/add.ts b/src/server/api/endpoints/admin/emoji/add.ts
index 77e29cfb2ac161cb00a9888e8250c4ead16f37a6..04eac79d6ab75d65a4b913d099c1e6af728fc90f 100644
--- a/src/server/api/endpoints/admin/emoji/add.ts
+++ b/src/server/api/endpoints/admin/emoji/add.ts
@@ -1,11 +1,11 @@
 import $ from 'cafy';
 import define from '../../../define';
 import { Emojis, DriveFiles } from '../../../../../models';
-import { genId } from '../../../../../misc/gen-id';
+import { genId } from '@/misc/gen-id';
 import { getConnection } from 'typeorm';
 import { insertModerationLog } from '../../../../../services/insert-moderation-log';
 import { ApiError } from '../../../error';
-import { ID } from '../../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import rndstr from 'rndstr';
 import { publishBroadcastStream } from '../../../../../services/stream';
 
diff --git a/src/server/api/endpoints/admin/emoji/copy.ts b/src/server/api/endpoints/admin/emoji/copy.ts
index 5c3c4f6fc50eb5e0a80677f87ce08b52aa39ebec..7df7830072c1bbed9c5b394155dfaeef03c23610 100644
--- a/src/server/api/endpoints/admin/emoji/copy.ts
+++ b/src/server/api/endpoints/admin/emoji/copy.ts
@@ -1,11 +1,11 @@
 import $ from 'cafy';
 import define from '../../../define';
 import { Emojis } from '../../../../../models';
-import { genId } from '../../../../../misc/gen-id';
+import { genId } from '@/misc/gen-id';
 import { getConnection } from 'typeorm';
 import { ApiError } from '../../../error';
 import { DriveFile } from '../../../../../models/entities/drive-file';
-import { ID } from '../../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import uploadFromUrl from '../../../../../services/drive/upload-from-url';
 
 export const meta = {
diff --git a/src/server/api/endpoints/admin/emoji/list-remote.ts b/src/server/api/endpoints/admin/emoji/list-remote.ts
index 81029fbbba48c7b829af9dc0568080af51204b3f..6a4e86c342c85158f606e6629730d8788b5f55f0 100644
--- a/src/server/api/endpoints/admin/emoji/list-remote.ts
+++ b/src/server/api/endpoints/admin/emoji/list-remote.ts
@@ -1,9 +1,9 @@
 import $ from 'cafy';
 import define from '../../../define';
 import { Emojis } from '../../../../../models';
-import { toPuny } from '../../../../../misc/convert-host';
+import { toPuny } from '@/misc/convert-host';
 import { makePaginationQuery } from '../../../common/make-pagination-query';
-import { ID } from '../../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 
 export const meta = {
 	desc: {
diff --git a/src/server/api/endpoints/admin/emoji/list.ts b/src/server/api/endpoints/admin/emoji/list.ts
index 6d042b0afd90703152d58127cc32bc80ffc0b7ed..9e50ce61c86969724ac38c6234817e04eb22c577 100644
--- a/src/server/api/endpoints/admin/emoji/list.ts
+++ b/src/server/api/endpoints/admin/emoji/list.ts
@@ -2,7 +2,7 @@ import $ from 'cafy';
 import define from '../../../define';
 import { Emojis } from '../../../../../models';
 import { makePaginationQuery } from '../../../common/make-pagination-query';
-import { ID } from '../../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import { Emoji } from '../../../../../models/entities/emoji';
 
 export const meta = {
@@ -96,9 +96,9 @@ export default define(meta, async (ps) => {
 		emojis = await q.getMany();
 
 		emojis = emojis.filter(emoji =>
-			emoji.name.includes(ps.query) ||
-			emoji.aliases.some(a => a.includes(ps.query)) ||
-			emoji.category?.includes(ps.query));
+			emoji.name.includes(ps.query!) ||
+			emoji.aliases.some(a => a.includes(ps.query!)) ||
+			emoji.category?.includes(ps.query!));
 
 		emojis.splice(ps.limit! + 1);
 	} else {
diff --git a/src/server/api/endpoints/admin/emoji/remove.ts b/src/server/api/endpoints/admin/emoji/remove.ts
index 19ffa1c166637e05e70c54b42ab2e33592f53270..3f87dded3b6a7446b199e6f84366430abc048bcf 100644
--- a/src/server/api/endpoints/admin/emoji/remove.ts
+++ b/src/server/api/endpoints/admin/emoji/remove.ts
@@ -1,6 +1,6 @@
 import $ from 'cafy';
 import define from '../../../define';
-import { ID } from '../../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import { Emojis } from '../../../../../models';
 import { getConnection } from 'typeorm';
 import { insertModerationLog } from '../../../../../services/insert-moderation-log';
diff --git a/src/server/api/endpoints/admin/emoji/update.ts b/src/server/api/endpoints/admin/emoji/update.ts
index 2493b62c2af3bf15c2793042b72f3170fa5a484f..2fa6587e2b8ac3559b1cb8fe10f3fff39d8c4d3c 100644
--- a/src/server/api/endpoints/admin/emoji/update.ts
+++ b/src/server/api/endpoints/admin/emoji/update.ts
@@ -1,6 +1,6 @@
 import $ from 'cafy';
 import define from '../../../define';
-import { ID } from '../../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import { Emojis } from '../../../../../models';
 import { getConnection } from 'typeorm';
 import { ApiError } from '../../../error';
diff --git a/src/server/api/endpoints/admin/federation/refresh-remote-instance-metadata.ts b/src/server/api/endpoints/admin/federation/refresh-remote-instance-metadata.ts
index 923a5f52cbef50f2061ec82b648e2d4c8d456501..65b3b6e26027209b820b438fc6df489051ce72dd 100644
--- a/src/server/api/endpoints/admin/federation/refresh-remote-instance-metadata.ts
+++ b/src/server/api/endpoints/admin/federation/refresh-remote-instance-metadata.ts
@@ -1,7 +1,7 @@
 import $ from 'cafy';
 import define from '../../../define';
 import { Instances } from '../../../../../models';
-import { toPuny } from '../../../../../misc/convert-host';
+import { toPuny } from '@/misc/convert-host';
 import { fetchInstanceMetadata } from '../../../../../services/fetch-instance-metadata';
 
 export const meta = {
diff --git a/src/server/api/endpoints/admin/federation/update-instance.ts b/src/server/api/endpoints/admin/federation/update-instance.ts
index 7206e4fb2ed015605ed151e703827aa50f8ac8ac..3e9d243d74cdf3668af095afa1864e669c765a49 100644
--- a/src/server/api/endpoints/admin/federation/update-instance.ts
+++ b/src/server/api/endpoints/admin/federation/update-instance.ts
@@ -1,7 +1,7 @@
 import $ from 'cafy';
 import define from '../../../define';
 import { Instances } from '../../../../../models';
-import { toPuny } from '../../../../../misc/convert-host';
+import { toPuny } from '@/misc/convert-host';
 
 export const meta = {
 	desc: {
diff --git a/src/server/api/endpoints/admin/invite.ts b/src/server/api/endpoints/admin/invite.ts
index 987105791f5670a0fd45691f9dd4ab77b7c990c4..2a87fae7140410da8b375f9ad1bc887874c9a18d 100644
--- a/src/server/api/endpoints/admin/invite.ts
+++ b/src/server/api/endpoints/admin/invite.ts
@@ -1,7 +1,7 @@
 import rndstr from 'rndstr';
 import define from '../../define';
 import { RegistrationTickets } from '../../../../models';
-import { genId } from '../../../../misc/gen-id';
+import { genId } from '@/misc/gen-id';
 
 export const meta = {
 	desc: {
diff --git a/src/server/api/endpoints/admin/moderators/add.ts b/src/server/api/endpoints/admin/moderators/add.ts
index fd862a9a4fb3584e12b512d3c0c0d32ceb17d00f..a96cf35db18f475154135acd9175f908d85316ac 100644
--- a/src/server/api/endpoints/admin/moderators/add.ts
+++ b/src/server/api/endpoints/admin/moderators/add.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../../define';
 import { Users } from '../../../../../models';
 
diff --git a/src/server/api/endpoints/admin/moderators/remove.ts b/src/server/api/endpoints/admin/moderators/remove.ts
index 1eee750bc4bc47b11e960e82d479e3b15bc62e0d..c9c884092c4e8e1a7c31a0ca58f52e0c057ac4d6 100644
--- a/src/server/api/endpoints/admin/moderators/remove.ts
+++ b/src/server/api/endpoints/admin/moderators/remove.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../../define';
 import { Users } from '../../../../../models';
 
diff --git a/src/server/api/endpoints/admin/promo/create.ts b/src/server/api/endpoints/admin/promo/create.ts
index aa22e68ebdf9cd8203e77aff24b4dd5dcd061998..3ee1616145f1d0b49a2d2ed498120b8151041172 100644
--- a/src/server/api/endpoints/admin/promo/create.ts
+++ b/src/server/api/endpoints/admin/promo/create.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../../define';
 import { ApiError } from '../../../error';
 import { getNote } from '../../../common/getters';
diff --git a/src/server/api/endpoints/admin/queue/deliver-delayed.ts b/src/server/api/endpoints/admin/queue/deliver-delayed.ts
index 221aa35e48135c1718d865272db0a4522fb60448..1de5b060e223e0cbf496660eab61e5c6c31de97b 100644
--- a/src/server/api/endpoints/admin/queue/deliver-delayed.ts
+++ b/src/server/api/endpoints/admin/queue/deliver-delayed.ts
@@ -1,5 +1,6 @@
+import { deliverQueue } from '@/queue/queues';
+import { URL } from 'url';
 import define from '../../../define';
-import { deliverQueue } from '../../../../../queue';
 
 export const meta = {
 	desc: {
diff --git a/src/server/api/endpoints/admin/queue/inbox-delayed.ts b/src/server/api/endpoints/admin/queue/inbox-delayed.ts
index 52f67cb514c164c0ef79cd2a9d09bb0b0a2b4d20..3599c012a5c7a770815af23effae5a4b49a76d46 100644
--- a/src/server/api/endpoints/admin/queue/inbox-delayed.ts
+++ b/src/server/api/endpoints/admin/queue/inbox-delayed.ts
@@ -1,3 +1,4 @@
+import { URL } from 'url';
 import define from '../../../define';
 import { inboxQueue } from '../../../../../queue';
 
diff --git a/src/server/api/endpoints/admin/queue/jobs.ts b/src/server/api/endpoints/admin/queue/jobs.ts
index 5ab78e3c4843dfe8427623d332c2699cb8f7984e..ffae1426be546a8fc89df670583229c6807f2d77 100644
--- a/src/server/api/endpoints/admin/queue/jobs.ts
+++ b/src/server/api/endpoints/admin/queue/jobs.ts
@@ -1,6 +1,6 @@
+import { deliverQueue, inboxQueue, dbQueue, objectStorageQueue } from '@/queue/queues';
 import $ from 'cafy';
 import define from '../../../define';
-import { deliverQueue, inboxQueue, dbQueue, objectStorageQueue } from '../../../../../queue';
 
 export const meta = {
 	desc: {
diff --git a/src/server/api/endpoints/admin/queue/stats.ts b/src/server/api/endpoints/admin/queue/stats.ts
index bd64d2ac068c7dfeca05ace8fbd7989e806ec5d8..cc1cf8a9e076ca3999760f7c5079e29b9c5c07db 100644
--- a/src/server/api/endpoints/admin/queue/stats.ts
+++ b/src/server/api/endpoints/admin/queue/stats.ts
@@ -1,5 +1,5 @@
+import { deliverQueue, inboxQueue, dbQueue, objectStorageQueue } from '@/queue/queues';
 import define from '../../../define';
-import { deliverQueue, inboxQueue, dbQueue, objectStorageQueue } from '../../../../../queue';
 
 export const meta = {
 	desc: {
diff --git a/src/server/api/endpoints/admin/relays/add.ts b/src/server/api/endpoints/admin/relays/add.ts
index 831e05c835a5ba0980dcc07b5a8accfbdec32d31..e10bd92c8d8c0c021af019bb0dc6fcd8a454a520 100644
--- a/src/server/api/endpoints/admin/relays/add.ts
+++ b/src/server/api/endpoints/admin/relays/add.ts
@@ -1,3 +1,4 @@
+import { URL } from 'url';
 import $ from 'cafy';
 import define from '../../../define';
 import { addRelay } from '../../../../../services/relay';
diff --git a/src/server/api/endpoints/admin/reset-password.ts b/src/server/api/endpoints/admin/reset-password.ts
index 2f55cf23a11805a16b96577f40fca6e89ee5a5bc..a316ef9c1d149822c8355247f4564f08b6e20ad8 100644
--- a/src/server/api/endpoints/admin/reset-password.ts
+++ b/src/server/api/endpoints/admin/reset-password.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../define';
 import * as bcrypt from 'bcryptjs';
 import rndstr from 'rndstr';
diff --git a/src/server/api/endpoints/admin/resolve-abuse-user-report.ts b/src/server/api/endpoints/admin/resolve-abuse-user-report.ts
index f8cd8def577c510852e5d4bfd0179c53c69d913e..144695182814ba52a20f596bfb983c8cfb36a063 100644
--- a/src/server/api/endpoints/admin/resolve-abuse-user-report.ts
+++ b/src/server/api/endpoints/admin/resolve-abuse-user-report.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../define';
 import { AbuseUserReports } from '../../../../models';
 
diff --git a/src/server/api/endpoints/admin/server-info.ts b/src/server/api/endpoints/admin/server-info.ts
index 3b48a811e561b0acfaded1a6817df6840ffe9b78..33e6190974696dd3c8b1d5d84cf4e2779f1c6bd7 100644
--- a/src/server/api/endpoints/admin/server-info.ts
+++ b/src/server/api/endpoints/admin/server-info.ts
@@ -2,7 +2,7 @@ import * as os from 'os';
 import * as si from 'systeminformation';
 import { getConnection } from 'typeorm';
 import define from '../../define';
-import redis from '../../../../db/redis';
+import { redisClient } from '../../../../db/redis';
 
 export const meta = {
 	requireCredential: true as const,
@@ -115,7 +115,7 @@ export default define(meta, async () => {
 		os: os.platform(),
 		node: process.version,
 		psql: await getConnection().query('SHOW server_version').then(x => x[0].server_version),
-		redis: redis.server_info.redis_version,
+		redis: redisClient.server_info.redis_version,
 		cpu: {
 			model: os.cpus()[0].model,
 			cores: os.cpus().length
diff --git a/src/server/api/endpoints/admin/show-moderation-logs.ts b/src/server/api/endpoints/admin/show-moderation-logs.ts
index f41d91647ae151a25e7ba85aed700276bc5333cf..59e6f0033dd42940d82138a921d1a422f645fc88 100644
--- a/src/server/api/endpoints/admin/show-moderation-logs.ts
+++ b/src/server/api/endpoints/admin/show-moderation-logs.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../define';
 import { ModerationLogs } from '../../../../models';
 import { makePaginationQuery } from '../../common/make-pagination-query';
diff --git a/src/server/api/endpoints/admin/show-user.ts b/src/server/api/endpoints/admin/show-user.ts
index 63889a9e6b55bb51898e47910f24095ba06bbcc7..52c4458c35a1f6b39ab1f4d309fd57cc51c419cd 100644
--- a/src/server/api/endpoints/admin/show-user.ts
+++ b/src/server/api/endpoints/admin/show-user.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../define';
 import { Users } from '../../../../models';
 
diff --git a/src/server/api/endpoints/admin/silence-user.ts b/src/server/api/endpoints/admin/silence-user.ts
index cd5c339a5b2433f7cbe469b6cd4da00a8bd59669..d057459824acfe2674b2edc52dda26be2ef9805a 100644
--- a/src/server/api/endpoints/admin/silence-user.ts
+++ b/src/server/api/endpoints/admin/silence-user.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../define';
 import { Users } from '../../../../models';
 import { insertModerationLog } from '../../../../services/insert-moderation-log';
diff --git a/src/server/api/endpoints/admin/suspend-user.ts b/src/server/api/endpoints/admin/suspend-user.ts
index 10be88b8f11b08fc85169bef94ffa129983fba69..a4485445c9cb292359868f4e9c3e0ba7643e220b 100644
--- a/src/server/api/endpoints/admin/suspend-user.ts
+++ b/src/server/api/endpoints/admin/suspend-user.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../define';
 import deleteFollowing from '../../../../services/following/delete';
 import { Users, Followings, Notifications } from '../../../../models';
diff --git a/src/server/api/endpoints/admin/unsilence-user.ts b/src/server/api/endpoints/admin/unsilence-user.ts
index 63e4be06f3156005366a07d5f333057c6e001999..c811ae5d1c78072336893b28db3361b2f65ebfd0 100644
--- a/src/server/api/endpoints/admin/unsilence-user.ts
+++ b/src/server/api/endpoints/admin/unsilence-user.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../define';
 import { Users } from '../../../../models';
 import { insertModerationLog } from '../../../../services/insert-moderation-log';
diff --git a/src/server/api/endpoints/admin/unsuspend-user.ts b/src/server/api/endpoints/admin/unsuspend-user.ts
index 9690d6ef0b90ffd5a88cee48eec19ab35ab03a62..7658d37f8b254c8385d1c8f1c781dac415f7dad0 100644
--- a/src/server/api/endpoints/admin/unsuspend-user.ts
+++ b/src/server/api/endpoints/admin/unsuspend-user.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../define';
 import { Users } from '../../../../models';
 import { insertModerationLog } from '../../../../services/insert-moderation-log';
diff --git a/src/server/api/endpoints/admin/update-meta.ts b/src/server/api/endpoints/admin/update-meta.ts
index 163d7a2519b4822245c596d5edfd56c37be5fd5d..d9ce7c061c83e9a94a567cfd1bfd3de4e2a85eea 100644
--- a/src/server/api/endpoints/admin/update-meta.ts
+++ b/src/server/api/endpoints/admin/update-meta.ts
@@ -3,8 +3,8 @@ import define from '../../define';
 import { getConnection } from 'typeorm';
 import { Meta } from '../../../../models/entities/meta';
 import { insertModerationLog } from '../../../../services/insert-moderation-log';
-import { DB_MAX_NOTE_TEXT_LENGTH } from '../../../../misc/hard-limits';
-import { ID } from '../../../../misc/cafy-id';
+import { DB_MAX_NOTE_TEXT_LENGTH } from '@/misc/hard-limits';
+import { ID } from '@/misc/cafy-id';
 
 export const meta = {
 	desc: {
diff --git a/src/server/api/endpoints/admin/update-remote-user.ts b/src/server/api/endpoints/admin/update-remote-user.ts
index a6b5ef1e854139781c3bc35a929a143a697bf18a..9577ac0a55bef69a076e17c01c75f12552bccf6a 100644
--- a/src/server/api/endpoints/admin/update-remote-user.ts
+++ b/src/server/api/endpoints/admin/update-remote-user.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../define';
 import { getRemoteUser } from '../../common/getters';
 import { updatePerson } from '../../../../remote/activitypub/models/person';
diff --git a/src/server/api/endpoints/announcements.ts b/src/server/api/endpoints/announcements.ts
index 5d0fd9bdfadc32bd09db1e1184cb01e344d60d44..a7c477bc7cbdc7f979e50507a59d365ad0487e8d 100644
--- a/src/server/api/endpoints/announcements.ts
+++ b/src/server/api/endpoints/announcements.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../define';
 import { Announcements, AnnouncementReads } from '../../../models';
 import { makePaginationQuery } from '../common/make-pagination-query';
diff --git a/src/server/api/endpoints/antennas/create.ts b/src/server/api/endpoints/antennas/create.ts
index b5f0eead2a12d616308cafccf6ced89f30255803..04ca21bba7f393d106664c3a09f75483e30ca91f 100644
--- a/src/server/api/endpoints/antennas/create.ts
+++ b/src/server/api/endpoints/antennas/create.ts
@@ -1,9 +1,10 @@
 import $ from 'cafy';
 import define from '../../define';
-import { genId } from '../../../../misc/gen-id';
+import { genId } from '@/misc/gen-id';
 import { Antennas, UserLists, UserGroupJoinings } from '../../../../models';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import { ApiError } from '../../error';
+import { publishInternalEvent } from '../../../../services/stream';
 
 export const meta = {
 	desc: {
@@ -88,7 +89,7 @@ export default define(meta, async (ps, user) => {
 	let userList;
 	let userGroupJoining;
 
-	if (ps.src === 'list') {
+	if (ps.src === 'list' && ps.userListId) {
 		userList = await UserLists.findOne({
 			id: ps.userListId,
 			userId: user.id,
@@ -97,7 +98,7 @@ export default define(meta, async (ps, user) => {
 		if (userList == null) {
 			throw new ApiError(meta.errors.noSuchUserList);
 		}
-	} else if (ps.src === 'group') {
+	} else if (ps.src === 'group' && ps.userGroupId) {
 		userGroupJoining = await UserGroupJoinings.findOne({
 			userGroupId: ps.userGroupId,
 			userId: user.id,
@@ -108,7 +109,7 @@ export default define(meta, async (ps, user) => {
 		}
 	}
 
-	const antenna = await Antennas.save({
+	const antenna = await Antennas.insert({
 		id: genId(),
 		createdAt: new Date(),
 		userId: user.id,
@@ -123,7 +124,9 @@ export default define(meta, async (ps, user) => {
 		withReplies: ps.withReplies,
 		withFile: ps.withFile,
 		notify: ps.notify,
-	});
+	}).then(x => Antennas.findOneOrFail(x.identifiers[0]));
+
+	publishInternalEvent('antennaCreated', antenna);
 
 	return await Antennas.pack(antenna);
 });
diff --git a/src/server/api/endpoints/antennas/delete.ts b/src/server/api/endpoints/antennas/delete.ts
index 9008c37c8eb2b8cd6bd0789f73ff285cbc93f850..5d617bb5b5746798a8a6ce3aed8cf3877dc257a9 100644
--- a/src/server/api/endpoints/antennas/delete.ts
+++ b/src/server/api/endpoints/antennas/delete.ts
@@ -1,8 +1,9 @@
 import $ from 'cafy';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../define';
 import { ApiError } from '../../error';
 import { Antennas } from '../../../../models';
+import { publishInternalEvent } from '../../../../services/stream';
 
 export const meta = {
 	desc: {
@@ -42,4 +43,6 @@ export default define(meta, async (ps, user) => {
 	}
 
 	await Antennas.delete(antenna.id);
+
+	publishInternalEvent('antennaDeleted', antenna);
 });
diff --git a/src/server/api/endpoints/antennas/notes.ts b/src/server/api/endpoints/antennas/notes.ts
index 6fd3cf2df5ba512fa1e80f17c1f4076794c814ca..456c1b6e006fc3b366435096a58fd9c95c986c71 100644
--- a/src/server/api/endpoints/antennas/notes.ts
+++ b/src/server/api/endpoints/antennas/notes.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../define';
 import { Antennas, Notes, AntennaNotes } from '../../../../models';
 import { makePaginationQuery } from '../../common/make-pagination-query';
diff --git a/src/server/api/endpoints/antennas/show.ts b/src/server/api/endpoints/antennas/show.ts
index ed400f830c6612c4c08695ab72dc5fba05194a56..af2a28b793c2fb27e61b350e45e091d2985ad631 100644
--- a/src/server/api/endpoints/antennas/show.ts
+++ b/src/server/api/endpoints/antennas/show.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../define';
 import { ApiError } from '../../error';
 import { Antennas } from '../../../../models';
diff --git a/src/server/api/endpoints/antennas/update.ts b/src/server/api/endpoints/antennas/update.ts
index 58f4e68c89f3aa855a10db2c53ce4b6cc4f8c027..17b0f854f3e1d01a0fe6b4aa67b2d58e889ae137 100644
--- a/src/server/api/endpoints/antennas/update.ts
+++ b/src/server/api/endpoints/antennas/update.ts
@@ -1,8 +1,9 @@
 import $ from 'cafy';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../define';
 import { ApiError } from '../../error';
 import { Antennas, UserLists, UserGroupJoinings } from '../../../../models';
+import { publishInternalEvent } from '../../../../services/stream';
 
 export const meta = {
 	desc: {
@@ -107,7 +108,7 @@ export default define(meta, async (ps, user) => {
 	let userList;
 	let userGroupJoining;
 
-	if (ps.src === 'list') {
+	if (ps.src === 'list' && ps.userListId) {
 		userList = await UserLists.findOne({
 			id: ps.userListId,
 			userId: user.id,
@@ -116,7 +117,7 @@ export default define(meta, async (ps, user) => {
 		if (userList == null) {
 			throw new ApiError(meta.errors.noSuchUserList);
 		}
-	} else if (ps.src === 'group') {
+	} else if (ps.src === 'group' && ps.userGroupId) {
 		userGroupJoining = await UserGroupJoinings.findOne({
 			userGroupId: ps.userGroupId,
 			userId: user.id,
@@ -141,5 +142,7 @@ export default define(meta, async (ps, user) => {
 		notify: ps.notify,
 	});
 
+	publishInternalEvent('antennaUpdated', Antennas.findOneOrFail(antenna.id));
+
 	return await Antennas.pack(antenna.id);
 });
diff --git a/src/server/api/endpoints/ap/show.ts b/src/server/api/endpoints/ap/show.ts
index e8297db4727c873b1402ace688cb499e0de76b46..2ce11160e8e136d99a4452677e78f2cf761f4e9b 100644
--- a/src/server/api/endpoints/ap/show.ts
+++ b/src/server/api/endpoints/ap/show.ts
@@ -1,15 +1,15 @@
 import $ from 'cafy';
 import define from '../../define';
-import config from '../../../../config';
+import config from '@/config';
 import { createPerson } from '../../../../remote/activitypub/models/person';
 import { createNote } from '../../../../remote/activitypub/models/note';
 import Resolver from '../../../../remote/activitypub/resolver';
 import { ApiError } from '../../error';
-import { extractDbHost } from '../../../../misc/convert-host';
+import { extractDbHost } from '@/misc/convert-host';
 import { Users, Notes } from '../../../../models';
 import { Note } from '../../../../models/entities/note';
 import { User } from '../../../../models/entities/user';
-import { fetchMeta } from '../../../../misc/fetch-meta';
+import { fetchMeta } from '@/misc/fetch-meta';
 import { validActor, validPost } from '../../../../remote/activitypub/type';
 
 export const meta = {
diff --git a/src/server/api/endpoints/app/create.ts b/src/server/api/endpoints/app/create.ts
index 776865ffb6fc735f34422d025d9dc0202a5d9b71..db72bd1c4233a5872e5533730f36fb6d501149ab 100644
--- a/src/server/api/endpoints/app/create.ts
+++ b/src/server/api/endpoints/app/create.ts
@@ -1,9 +1,9 @@
 import $ from 'cafy';
 import define from '../../define';
 import { Apps } from '../../../../models';
-import { genId } from '../../../../misc/gen-id';
+import { genId } from '@/misc/gen-id';
 import { unique } from '../../../../prelude/array';
-import { secureRndstr } from '../../../../misc/secure-rndstr';
+import { secureRndstr } from '@/misc/secure-rndstr';
 
 export const meta = {
 	tags: ['app'],
diff --git a/src/server/api/endpoints/app/show.ts b/src/server/api/endpoints/app/show.ts
index 254ae30884ebb007fae7a42fadd60aac9e96e721..65f8c77981bbdcf41aec7a3a8c76d9c7b4f3ee55 100644
--- a/src/server/api/endpoints/app/show.ts
+++ b/src/server/api/endpoints/app/show.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../define';
 import { ApiError } from '../../error';
 import { Apps } from '../../../../models';
@@ -46,6 +46,6 @@ export default define(meta, async (ps, user, token) => {
 
 	return await Apps.pack(ap, user, {
 		detail: true,
-		includeSecret: isSecure && (ap.userId === user.id)
+		includeSecret: isSecure && (ap.userId === user!.id)
 	});
 });
diff --git a/src/server/api/endpoints/auth/accept.ts b/src/server/api/endpoints/auth/accept.ts
index 444053a94608296581565e84455788f8a2d79539..ee0d0421c9119468786641295714ef4b10668778 100644
--- a/src/server/api/endpoints/auth/accept.ts
+++ b/src/server/api/endpoints/auth/accept.ts
@@ -3,8 +3,8 @@ import $ from 'cafy';
 import define from '../../define';
 import { ApiError } from '../../error';
 import { AuthSessions, AccessTokens, Apps } from '../../../../models';
-import { genId } from '../../../../misc/gen-id';
-import { secureRndstr } from '../../../../misc/secure-rndstr';
+import { genId } from '@/misc/gen-id';
+import { secureRndstr } from '@/misc/secure-rndstr';
 
 export const meta = {
 	tags: ['auth'],
diff --git a/src/server/api/endpoints/auth/session/generate.ts b/src/server/api/endpoints/auth/session/generate.ts
index 5596e6122be675e3e2a5255f6da7039914d08bea..e0d003c49931a90bf5af2ead0a3d499e1b028f09 100644
--- a/src/server/api/endpoints/auth/session/generate.ts
+++ b/src/server/api/endpoints/auth/session/generate.ts
@@ -1,10 +1,10 @@
 import { v4 as uuid } from 'uuid';
 import $ from 'cafy';
-import config from '../../../../../config';
+import config from '@/config';
 import define from '../../../define';
 import { ApiError } from '../../../error';
 import { Apps, AuthSessions } from '../../../../../models';
-import { genId } from '../../../../../misc/gen-id';
+import { genId } from '@/misc/gen-id';
 
 export const meta = {
 	tags: ['auth'],
diff --git a/src/server/api/endpoints/blocking/create.ts b/src/server/api/endpoints/blocking/create.ts
index dfab338a8b9644767460b4a0125610b74ba6a80f..60fde8ad78d464f99965d54878c498c2de7f94ba 100644
--- a/src/server/api/endpoints/blocking/create.ts
+++ b/src/server/api/endpoints/blocking/create.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import * as ms from 'ms';
 import create from '../../../../services/blocking/create';
 import define from '../../define';
@@ -62,7 +62,7 @@ export const meta = {
 };
 
 export default define(meta, async (ps, user) => {
-	const blocker = user;
+	const blocker = await Users.findOneOrFail(user.id);
 
 	// 自分自身
 	if (user.id === ps.userId) {
@@ -93,7 +93,7 @@ export default define(meta, async (ps, user) => {
 		noteUserId: blockee.id
 	});
 
-	return await Users.pack(blockee.id, user, {
+	return await Users.pack(blockee.id, blocker, {
 		detail: true
 	});
 });
diff --git a/src/server/api/endpoints/blocking/delete.ts b/src/server/api/endpoints/blocking/delete.ts
index 22d2df59701af106feae72195cd1d905d280033b..8caa3efc88b4f76a85ab35750997548a48fd346d 100644
--- a/src/server/api/endpoints/blocking/delete.ts
+++ b/src/server/api/endpoints/blocking/delete.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import * as ms from 'ms';
 import deleteBlocking from '../../../../services/blocking/delete';
 import define from '../../define';
@@ -126,7 +126,7 @@ export const meta = {
 };
 
 export default define(meta, async (ps, user) => {
-	const blocker = user;
+	const blocker = await Users.findOneOrFail(user.id);
 
 	// Check if the blockee is yourself
 	if (user.id === ps.userId) {
@@ -152,7 +152,7 @@ export default define(meta, async (ps, user) => {
 	// Delete blocking
 	await deleteBlocking(blocker, blockee);
 
-	return await Users.pack(blockee.id, user, {
+	return await Users.pack(blockee.id, blocker, {
 		detail: true
 	});
 });
diff --git a/src/server/api/endpoints/blocking/list.ts b/src/server/api/endpoints/blocking/list.ts
index a9bb1c5f96cdd7d53d81a45520413ddc0d986d4e..fe8706b5c27350229b3588640bb4451063c84879 100644
--- a/src/server/api/endpoints/blocking/list.ts
+++ b/src/server/api/endpoints/blocking/list.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../define';
 import { Blockings } from '../../../../models';
 import { makePaginationQuery } from '../../common/make-pagination-query';
diff --git a/src/server/api/endpoints/channels/create.ts b/src/server/api/endpoints/channels/create.ts
index 53436e703db305d210a327cb283792b822072fa2..c6dc68faf826ef2e129d6f325fec5b60a49353b8 100644
--- a/src/server/api/endpoints/channels/create.ts
+++ b/src/server/api/endpoints/channels/create.ts
@@ -3,8 +3,8 @@ import define from '../../define';
 import { ApiError } from '../../error';
 import { Channels, DriveFiles } from '../../../../models';
 import { Channel } from '../../../../models/entities/channel';
-import { genId } from '../../../../misc/gen-id';
-import { ID } from '../../../../misc/cafy-id';
+import { genId } from '@/misc/gen-id';
+import { ID } from '@/misc/cafy-id';
 
 export const meta = {
 	tags: ['channels'],
diff --git a/src/server/api/endpoints/channels/follow.ts b/src/server/api/endpoints/channels/follow.ts
index c5976a8a34860885f6f86c61419161e569b49fb7..b264f7451a6bfb4203ae34884e4899185fd2d3df 100644
--- a/src/server/api/endpoints/channels/follow.ts
+++ b/src/server/api/endpoints/channels/follow.ts
@@ -1,9 +1,9 @@
 import $ from 'cafy';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../define';
 import { ApiError } from '../../error';
 import { Channels, ChannelFollowings } from '../../../../models';
-import { genId } from '../../../../misc/gen-id';
+import { genId } from '@/misc/gen-id';
 import { publishUserEvent } from '../../../../services/stream';
 
 export const meta = {
diff --git a/src/server/api/endpoints/channels/followed.ts b/src/server/api/endpoints/channels/followed.ts
index bd37d420f6d7ced76f5aef89ff2578a44ae62665..7f0cfe4941d046f3fd2ee2c0274431f7bbf54435 100644
--- a/src/server/api/endpoints/channels/followed.ts
+++ b/src/server/api/endpoints/channels/followed.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../define';
 import { Channels, ChannelFollowings } from '../../../../models';
 import { makePaginationQuery } from '../../common/make-pagination-query';
diff --git a/src/server/api/endpoints/channels/owned.ts b/src/server/api/endpoints/channels/owned.ts
index 1a7e04640d0665a9c2a226511a8bff307e819fbb..4f538f651ea9931f56b09298c0039b4f4ce260a6 100644
--- a/src/server/api/endpoints/channels/owned.ts
+++ b/src/server/api/endpoints/channels/owned.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../define';
 import { Channels } from '../../../../models';
 import { makePaginationQuery } from '../../common/make-pagination-query';
diff --git a/src/server/api/endpoints/channels/show.ts b/src/server/api/endpoints/channels/show.ts
index 63057dd57fd8a93398c040adce012cd7978d9389..d5f182da11c00353aa2bdfb9b6666636b8afa88a 100644
--- a/src/server/api/endpoints/channels/show.ts
+++ b/src/server/api/endpoints/channels/show.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../define';
 import { ApiError } from '../../error';
 import { Channels } from '../../../../models';
diff --git a/src/server/api/endpoints/channels/timeline.ts b/src/server/api/endpoints/channels/timeline.ts
index 00a7cd86d597888c56fde8a17111ae273cb9b73b..494221010a017b0a9a89706e6cf835038ed0d36c 100644
--- a/src/server/api/endpoints/channels/timeline.ts
+++ b/src/server/api/endpoints/channels/timeline.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../define';
 import { ApiError } from '../../error';
 import { Notes, Channels } from '../../../../models';
@@ -97,7 +97,7 @@ export default define(meta, async (ps, user) => {
 
 	const timeline = await query.take(ps.limit!).getMany();
 
-	activeUsersChart.update(user);
+	if (user) activeUsersChart.update(user);
 
 	return await Notes.packMany(timeline, user);
 });
diff --git a/src/server/api/endpoints/channels/unfollow.ts b/src/server/api/endpoints/channels/unfollow.ts
index 3eb0f1519bf3e10a8f57e8c83555dbd8469bb5b2..116af5033704708aa50df6cf911ea0d4b2f1e820 100644
--- a/src/server/api/endpoints/channels/unfollow.ts
+++ b/src/server/api/endpoints/channels/unfollow.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../define';
 import { ApiError } from '../../error';
 import { Channels, ChannelFollowings } from '../../../../models';
diff --git a/src/server/api/endpoints/channels/update.ts b/src/server/api/endpoints/channels/update.ts
index ca35fe85cbba7eacac298eefa8a61a1c58616a6b..1495297ee58dd50c8a10e0876e29d2787d609d3f 100644
--- a/src/server/api/endpoints/channels/update.ts
+++ b/src/server/api/endpoints/channels/update.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../define';
 import { ApiError } from '../../error';
 import { Channels, DriveFiles } from '../../../../models';
diff --git a/src/server/api/endpoints/charts/user/drive.ts b/src/server/api/endpoints/charts/user/drive.ts
index 5aae5bd757c5c903df52ebb9b241b2ae7d7c7d0d..7f4218b9246caf411a53cf2616c96ebb6a714523 100644
--- a/src/server/api/endpoints/charts/user/drive.ts
+++ b/src/server/api/endpoints/charts/user/drive.ts
@@ -1,6 +1,6 @@
 import $ from 'cafy';
 import define from '../../../define';
-import { ID } from '../../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import { convertLog } from '../../../../../services/chart/core';
 import { perUserDriveChart } from '../../../../../services/chart';
 
diff --git a/src/server/api/endpoints/charts/user/following.ts b/src/server/api/endpoints/charts/user/following.ts
index 9d772c39c9b9fb68d730faaf0ba9368ce2600c3f..63eb90a49ad8c69b979fc9eef09e4ae5fb079938 100644
--- a/src/server/api/endpoints/charts/user/following.ts
+++ b/src/server/api/endpoints/charts/user/following.ts
@@ -1,6 +1,6 @@
 import $ from 'cafy';
 import define from '../../../define';
-import { ID } from '../../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import { convertLog } from '../../../../../services/chart/core';
 import { perUserFollowingChart } from '../../../../../services/chart';
 
diff --git a/src/server/api/endpoints/charts/user/notes.ts b/src/server/api/endpoints/charts/user/notes.ts
index 8de7c0c3e455c8e77c454cdfd05bd9fdabb8d2a4..87425e3dc8681bd7ea33d6a6e277a434e87e4b36 100644
--- a/src/server/api/endpoints/charts/user/notes.ts
+++ b/src/server/api/endpoints/charts/user/notes.ts
@@ -1,6 +1,6 @@
 import $ from 'cafy';
 import define from '../../../define';
-import { ID } from '../../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import { convertLog } from '../../../../../services/chart/core';
 import { perUserNotesChart } from '../../../../../services/chart';
 
diff --git a/src/server/api/endpoints/charts/user/reactions.ts b/src/server/api/endpoints/charts/user/reactions.ts
index 4c37305fc3b76807f1f53880b067309e9b92d0ac..7ded604ac2e2e9694aa6921bac6a71229ae5b4dd 100644
--- a/src/server/api/endpoints/charts/user/reactions.ts
+++ b/src/server/api/endpoints/charts/user/reactions.ts
@@ -1,6 +1,6 @@
 import $ from 'cafy';
 import define from '../../../define';
-import { ID } from '../../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import { convertLog } from '../../../../../services/chart/core';
 import { perUserReactionsChart } from '../../../../../services/chart';
 
diff --git a/src/server/api/endpoints/clips/add-note.ts b/src/server/api/endpoints/clips/add-note.ts
index ee6a117b2dec5018765d31b9743445e4846768ec..3d72def4f5229280b962006a7ef6431bcd20ca77 100644
--- a/src/server/api/endpoints/clips/add-note.ts
+++ b/src/server/api/endpoints/clips/add-note.ts
@@ -1,9 +1,9 @@
 import $ from 'cafy';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../define';
 import { ClipNotes, Clips } from '../../../../models';
 import { ApiError } from '../../error';
-import { genId } from '../../../../misc/gen-id';
+import { genId } from '@/misc/gen-id';
 import { getNote } from '../../common/getters';
 
 export const meta = {
diff --git a/src/server/api/endpoints/clips/create.ts b/src/server/api/endpoints/clips/create.ts
index b26c42c56ce912068fdc1f475b7aefe49f06c229..fb2a77fe5b540ed8fb220f0c8e3388cf63b9db3a 100644
--- a/src/server/api/endpoints/clips/create.ts
+++ b/src/server/api/endpoints/clips/create.ts
@@ -1,6 +1,6 @@
 import $ from 'cafy';
 import define from '../../define';
-import { genId } from '../../../../misc/gen-id';
+import { genId } from '@/misc/gen-id';
 import { Clips } from '../../../../models';
 
 export const meta = {
@@ -32,14 +32,14 @@ export const meta = {
 };
 
 export default define(meta, async (ps, user) => {
-	const clip = await Clips.save({
+	const clip = await Clips.insert({
 		id: genId(),
 		createdAt: new Date(),
 		userId: user.id,
 		name: ps.name,
 		isPublic: ps.isPublic,
 		description: ps.description,
-	});
+	}).then(x => Clips.findOneOrFail(x.identifiers[0]));
 
 	return await Clips.pack(clip);
 });
diff --git a/src/server/api/endpoints/clips/delete.ts b/src/server/api/endpoints/clips/delete.ts
index 746f93188c35f88ab125c81b40c0cabd74bbc25d..20b2addb76a37d28ad14dad1408f7789eadcea8a 100644
--- a/src/server/api/endpoints/clips/delete.ts
+++ b/src/server/api/endpoints/clips/delete.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../define';
 import { ApiError } from '../../error';
 import { Clips } from '../../../../models';
diff --git a/src/server/api/endpoints/clips/notes.ts b/src/server/api/endpoints/clips/notes.ts
index 676629c328f1773183ba96cf2199068d3208b872..5fd17584d365c369e4992d470bd2cd939943305a 100644
--- a/src/server/api/endpoints/clips/notes.ts
+++ b/src/server/api/endpoints/clips/notes.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../define';
 import { ClipNotes, Clips, Notes } from '../../../../models';
 import { makePaginationQuery } from '../../common/make-pagination-query';
diff --git a/src/server/api/endpoints/clips/show.ts b/src/server/api/endpoints/clips/show.ts
index 8c285d88b5879f5fc785eda1ed19bed7deda744c..43d2719129d2c3f740779866cc4a043c7b5476fa 100644
--- a/src/server/api/endpoints/clips/show.ts
+++ b/src/server/api/endpoints/clips/show.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../define';
 import { ApiError } from '../../error';
 import { Clips } from '../../../../models';
diff --git a/src/server/api/endpoints/clips/update.ts b/src/server/api/endpoints/clips/update.ts
index 041691da2a7b2e07d615b45b47b84d31cb1e957f..a368174e76c3068403e529ed426062af4260c3b7 100644
--- a/src/server/api/endpoints/clips/update.ts
+++ b/src/server/api/endpoints/clips/update.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../define';
 import { ApiError } from '../../error';
 import { Clips } from '../../../../models';
diff --git a/src/server/api/endpoints/drive.ts b/src/server/api/endpoints/drive.ts
index 527b7719a497081d75c05be3a0098445c80c3b80..0100d4da79f432486aff2186a90c94fb30927839 100644
--- a/src/server/api/endpoints/drive.ts
+++ b/src/server/api/endpoints/drive.ts
@@ -1,5 +1,5 @@
 import define from '../define';
-import { fetchMeta } from '../../../misc/fetch-meta';
+import { fetchMeta } from '@/misc/fetch-meta';
 import { DriveFiles } from '../../../models';
 
 export const meta = {
@@ -34,7 +34,7 @@ export default define(meta, async (ps, user) => {
 	const instance = await fetchMeta(true);
 
 	// Calculate drive usage
-	const usage = await DriveFiles.calcDriveUsageOf(user);
+	const usage = await DriveFiles.calcDriveUsageOf(user.id);
 
 	return {
 		capacity: 1024 * 1024 * instance.localDriveCapacityMb,
diff --git a/src/server/api/endpoints/drive/files.ts b/src/server/api/endpoints/drive/files.ts
index 00705fb9b77b0027d40ed66df27011db5b955ebe..85dc07cc160cefd9241dbd097892364c5e067364 100644
--- a/src/server/api/endpoints/drive/files.ts
+++ b/src/server/api/endpoints/drive/files.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../define';
 import { DriveFiles } from '../../../../models';
 import { makePaginationQuery } from '../../common/make-pagination-query';
diff --git a/src/server/api/endpoints/drive/files/attached-notes.ts b/src/server/api/endpoints/drive/files/attached-notes.ts
index e1fc27f599baed2d469f923c1c8448618db55118..ea09581ba9f1e2684971fc93e6954e8c79abb103 100644
--- a/src/server/api/endpoints/drive/files/attached-notes.ts
+++ b/src/server/api/endpoints/drive/files/attached-notes.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../../define';
 import { ApiError } from '../../../error';
 import { DriveFiles, Notes } from '../../../../../models';
diff --git a/src/server/api/endpoints/drive/files/create.ts b/src/server/api/endpoints/drive/files/create.ts
index c0bb6bcc6e7401342f10b7b71c27b5e59509d217..82ff04e092cfe2bf804bec4d17557aed04ef1228 100644
--- a/src/server/api/endpoints/drive/files/create.ts
+++ b/src/server/api/endpoints/drive/files/create.ts
@@ -1,6 +1,6 @@
 import * as ms from 'ms';
 import $ from 'cafy';
-import { ID } from '../../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import create from '../../../../../services/drive/add-file';
 import define from '../../../define';
 import { apiLogger } from '../../../logger';
diff --git a/src/server/api/endpoints/drive/files/delete.ts b/src/server/api/endpoints/drive/files/delete.ts
index 77d112ec94f69441db8391bf1b12bda89a41ee35..211afaaba1c20b14f60c6b7afe3f426215d6cd8a 100644
--- a/src/server/api/endpoints/drive/files/delete.ts
+++ b/src/server/api/endpoints/drive/files/delete.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import { deleteFile } from '../../../../../services/drive/delete-file';
 import { publishDriveStream } from '../../../../../services/stream';
 import define from '../../../define';
diff --git a/src/server/api/endpoints/drive/files/find.ts b/src/server/api/endpoints/drive/files/find.ts
index 5872e2c0c179006a7189290f8c517a9e6c7d27b3..b3613ca01b18e26168f22c297d818f2309211d66 100644
--- a/src/server/api/endpoints/drive/files/find.ts
+++ b/src/server/api/endpoints/drive/files/find.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../../define';
 import { DriveFiles } from '../../../../../models';
 
diff --git a/src/server/api/endpoints/drive/files/show.ts b/src/server/api/endpoints/drive/files/show.ts
index 39f4b7d2f707dafa2c2fc7ba424dc9e90ba7f51d..f4922bff1377e2aa40ec447affa0fad7ef0820f5 100644
--- a/src/server/api/endpoints/drive/files/show.ts
+++ b/src/server/api/endpoints/drive/files/show.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../../define';
 import { ApiError } from '../../../error';
 import { DriveFile } from '../../../../../models/entities/drive-file';
diff --git a/src/server/api/endpoints/drive/files/update.ts b/src/server/api/endpoints/drive/files/update.ts
index 7e43765c060011ac2b5e0cc8477d33133f40ec3b..6eda83967bb2f4ad926ef40b79184eb30176c10e 100644
--- a/src/server/api/endpoints/drive/files/update.ts
+++ b/src/server/api/endpoints/drive/files/update.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import { publishDriveStream } from '../../../../../services/stream';
 import define from '../../../define';
 import { ApiError } from '../../../error';
diff --git a/src/server/api/endpoints/drive/files/upload-from-url.ts b/src/server/api/endpoints/drive/files/upload-from-url.ts
index 296211c091922640c463d0a749c466f24da68007..1b33099aa4c8b4a8df66f7074e818d7deb0764f9 100644
--- a/src/server/api/endpoints/drive/files/upload-from-url.ts
+++ b/src/server/api/endpoints/drive/files/upload-from-url.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import * as ms from 'ms';
 import uploadFromUrl from '../../../../../services/drive/upload-from-url';
 import define from '../../../define';
diff --git a/src/server/api/endpoints/drive/folders.ts b/src/server/api/endpoints/drive/folders.ts
index f662d53ba664c3fb0805cd1465edfad3f14a4218..89453e6e09977ed4a9024d2b19ec02fab04423df 100644
--- a/src/server/api/endpoints/drive/folders.ts
+++ b/src/server/api/endpoints/drive/folders.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../define';
 import { DriveFolders } from '../../../../models';
 import { makePaginationQuery } from '../../common/make-pagination-query';
diff --git a/src/server/api/endpoints/drive/folders/create.ts b/src/server/api/endpoints/drive/folders/create.ts
index edaa74532d382d65d81b360ebaa3dcb95071ece3..d2c5e00a9f4f2d8336d43064111eb929b9a0c1a5 100644
--- a/src/server/api/endpoints/drive/folders/create.ts
+++ b/src/server/api/endpoints/drive/folders/create.ts
@@ -1,10 +1,10 @@
 import $ from 'cafy';
-import { ID } from '../../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import { publishDriveStream } from '../../../../../services/stream';
 import define from '../../../define';
 import { ApiError } from '../../../error';
 import { DriveFolders } from '../../../../../models';
-import { genId } from '../../../../../misc/gen-id';
+import { genId } from '@/misc/gen-id';
 
 export const meta = {
 	desc: {
@@ -68,13 +68,13 @@ export default define(meta, async (ps, user) => {
 	}
 
 	// Create folder
-	const folder = await DriveFolders.save({
+	const folder = await DriveFolders.insert({
 		id: genId(),
 		createdAt: new Date(),
 		name: ps.name,
 		parentId: parent !== null ? parent.id : null,
 		userId: user.id
-	});
+	}).then(x => DriveFolders.findOneOrFail(x.identifiers[0]));
 
 	const folderObj = await DriveFolders.pack(folder);
 
diff --git a/src/server/api/endpoints/drive/folders/delete.ts b/src/server/api/endpoints/drive/folders/delete.ts
index 439ef06a50fa3391825782d5048f7ec962cb445d..2a418069c9e1da296bd67533a13a438186af5a7c 100644
--- a/src/server/api/endpoints/drive/folders/delete.ts
+++ b/src/server/api/endpoints/drive/folders/delete.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../../define';
 import { publishDriveStream } from '../../../../../services/stream';
 import { ApiError } from '../../../error';
diff --git a/src/server/api/endpoints/drive/folders/find.ts b/src/server/api/endpoints/drive/folders/find.ts
index 72ce1d192b8cdc8eff1044b328e0bd60f1372619..e3f6aa4a91201b7522c5d673b50771d359bd09b8 100644
--- a/src/server/api/endpoints/drive/folders/find.ts
+++ b/src/server/api/endpoints/drive/folders/find.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../../define';
 import { DriveFolders } from '../../../../../models';
 
diff --git a/src/server/api/endpoints/drive/folders/show.ts b/src/server/api/endpoints/drive/folders/show.ts
index b600b5e39fff727c2b2e0e4fd6190897427d41a8..ae00b9e36767ded03fcf166eef3979d11cb21a74 100644
--- a/src/server/api/endpoints/drive/folders/show.ts
+++ b/src/server/api/endpoints/drive/folders/show.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../../define';
 import { ApiError } from '../../../error';
 import { DriveFolders } from '../../../../../models';
diff --git a/src/server/api/endpoints/drive/folders/update.ts b/src/server/api/endpoints/drive/folders/update.ts
index c2a272c2474b08b5b39ed9300c644684e617d378..066013287c4ee5a10a5eb58366ebc82878fdd9db 100644
--- a/src/server/api/endpoints/drive/folders/update.ts
+++ b/src/server/api/endpoints/drive/folders/update.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import { publishDriveStream } from '../../../../../services/stream';
 import define from '../../../define';
 import { ApiError } from '../../../error';
diff --git a/src/server/api/endpoints/drive/stream.ts b/src/server/api/endpoints/drive/stream.ts
index 94c2051bbe04748766975503d8db25d9c1258815..ca88acf5fee8ed6a8f850fc0317a47d8fc632bbf 100644
--- a/src/server/api/endpoints/drive/stream.ts
+++ b/src/server/api/endpoints/drive/stream.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../define';
 import { DriveFiles } from '../../../../models';
 import { makePaginationQuery } from '../../common/make-pagination-query';
diff --git a/src/server/api/endpoints/federation/followers.ts b/src/server/api/endpoints/federation/followers.ts
index a5c564b0a8818f57d43b1deb9b5b3dc268b8c0c4..727eada68251b0936d09639731933f93ccc48d8e 100644
--- a/src/server/api/endpoints/federation/followers.ts
+++ b/src/server/api/endpoints/federation/followers.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../define';
 import { Followings } from '../../../../models';
 import { makePaginationQuery } from '../../common/make-pagination-query';
diff --git a/src/server/api/endpoints/federation/following.ts b/src/server/api/endpoints/federation/following.ts
index 80820f5a26c5e6099ddeb750efd17caab99be8a0..c6bc71a9823f30711c01d7dbf3cadbf84f3e5ec2 100644
--- a/src/server/api/endpoints/federation/following.ts
+++ b/src/server/api/endpoints/federation/following.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../define';
 import { Followings } from '../../../../models';
 import { makePaginationQuery } from '../../common/make-pagination-query';
diff --git a/src/server/api/endpoints/federation/instances.ts b/src/server/api/endpoints/federation/instances.ts
index 239756af533ee4d82956e16014de3e44bba5f0c9..29515f0eb4e8d7c38035e0f993487ca682926f6c 100644
--- a/src/server/api/endpoints/federation/instances.ts
+++ b/src/server/api/endpoints/federation/instances.ts
@@ -1,8 +1,8 @@
 import $ from 'cafy';
-import config from '../../../../config';
+import config from '@/config';
 import define from '../../define';
 import { Instances } from '../../../../models';
-import { fetchMeta } from '../../../../misc/fetch-meta';
+import { fetchMeta } from '@/misc/fetch-meta';
 
 export const meta = {
 	tags: ['federation'],
diff --git a/src/server/api/endpoints/federation/show-instance.ts b/src/server/api/endpoints/federation/show-instance.ts
index 1a0bcdb23eb20d4ac5f83987debeb3a042bb0ca6..549d7340fb94c5a5dce2376c2ad0f6af55f32c08 100644
--- a/src/server/api/endpoints/federation/show-instance.ts
+++ b/src/server/api/endpoints/federation/show-instance.ts
@@ -1,8 +1,7 @@
 import $ from 'cafy';
 import define from '../../define';
 import { Instances } from '../../../../models';
-import { toPuny } from '../../../../misc/convert-host';
-import config from '../../../../config';
+import { toPuny } from '@/misc/convert-host';
 
 export const meta = {
 	tags: ['federation'],
diff --git a/src/server/api/endpoints/federation/users.ts b/src/server/api/endpoints/federation/users.ts
index 1bd053ae8524b271bcd7705c5b414cc4ffa38bcd..77d9e2e076e814473aa595bc6363270927c40cf6 100644
--- a/src/server/api/endpoints/federation/users.ts
+++ b/src/server/api/endpoints/federation/users.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../define';
 import { Users } from '../../../../models';
 import { makePaginationQuery } from '../../common/make-pagination-query';
diff --git a/src/server/api/endpoints/following/create.ts b/src/server/api/endpoints/following/create.ts
index ca46d59c7864bdc5f405d05a4e9a8c51f894b25e..6ce71089b5a1082e50ee101a3208c446627560c9 100644
--- a/src/server/api/endpoints/following/create.ts
+++ b/src/server/api/endpoints/following/create.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import * as ms from 'ms';
 import create from '../../../../services/following/create';
 import define from '../../define';
diff --git a/src/server/api/endpoints/following/delete.ts b/src/server/api/endpoints/following/delete.ts
index d3abda92656f286ec38b13e47eaee5be20018f4b..823d85c1707480b98b206a0b850cd1e37c53a474 100644
--- a/src/server/api/endpoints/following/delete.ts
+++ b/src/server/api/endpoints/following/delete.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import * as ms from 'ms';
 import deleteFollowing from '../../../../services/following/delete';
 import define from '../../define';
diff --git a/src/server/api/endpoints/following/requests/accept.ts b/src/server/api/endpoints/following/requests/accept.ts
index 6dd93c0d45ac1402a048499526a3aa4c74bb35c4..4a0fdb0af96935e0463ff9319688ebd7cfded7b9 100644
--- a/src/server/api/endpoints/following/requests/accept.ts
+++ b/src/server/api/endpoints/following/requests/accept.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import acceptFollowRequest from '../../../../../services/following/requests/accept';
 import define from '../../../define';
 import { ApiError } from '../../../error';
diff --git a/src/server/api/endpoints/following/requests/cancel.ts b/src/server/api/endpoints/following/requests/cancel.ts
index ef21ee4f27fa0040a1a93b2b2650c266befbb7d6..8d4538d43e0738180ee956554f93e6ad9563a362 100644
--- a/src/server/api/endpoints/following/requests/cancel.ts
+++ b/src/server/api/endpoints/following/requests/cancel.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import cancelFollowRequest from '../../../../../services/following/requests/cancel';
 import define from '../../../define';
 import { ApiError } from '../../../error';
diff --git a/src/server/api/endpoints/following/requests/reject.ts b/src/server/api/endpoints/following/requests/reject.ts
index d5c9a5b7e4e1950a44f36a280a0b12d02eedf5f8..8ef2c9334161dfff472eec08ec707beb005d57bc 100644
--- a/src/server/api/endpoints/following/requests/reject.ts
+++ b/src/server/api/endpoints/following/requests/reject.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import rejectFollowRequest from '../../../../../services/following/requests/reject';
 import define from '../../../define';
 import { ApiError } from '../../../error';
diff --git a/src/server/api/endpoints/games/reversi/games.ts b/src/server/api/endpoints/games/reversi/games.ts
index fa8bf203534f3325dbbf093c127408c5608376d6..6ac150ef2c1a073964f152a36270c0aa5b3d23f1 100644
--- a/src/server/api/endpoints/games/reversi/games.ts
+++ b/src/server/api/endpoints/games/reversi/games.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../../define';
 import { ReversiGames } from '../../../../../models';
 import { makePaginationQuery } from '../../../common/make-pagination-query';
@@ -140,7 +140,7 @@ export default define(meta, async (ps, user) => {
 	const query = makePaginationQuery(ReversiGames.createQueryBuilder('game'), ps.sinceId, ps.untilId)
 		.andWhere('game.isStarted = TRUE');
 
-	if (ps.my) {
+	if (ps.my && user) {
 		query.andWhere(new Brackets(qb => { qb
 			.where('game.user1Id = :userId', { userId: user.id })
 			.orWhere('game.user2Id = :userId', { userId: user.id });
diff --git a/src/server/api/endpoints/games/reversi/games/show.ts b/src/server/api/endpoints/games/reversi/games/show.ts
index 75599885c9bdad64c6397923635dcf12965499a6..a6fbdbaf6d298ae68f7d56cd03520e60619c7c64 100644
--- a/src/server/api/endpoints/games/reversi/games/show.ts
+++ b/src/server/api/endpoints/games/reversi/games/show.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import Reversi from '../../../../../../games/reversi/core';
 import define from '../../../../define';
 import { ApiError } from '../../../../error';
diff --git a/src/server/api/endpoints/games/reversi/games/surrender.ts b/src/server/api/endpoints/games/reversi/games/surrender.ts
index 9fb436d42711ca1bb067a7616976175f662ed637..346293f11d6e1dd1d40f39d9078d15e2c3e02f2a 100644
--- a/src/server/api/endpoints/games/reversi/games/surrender.ts
+++ b/src/server/api/endpoints/games/reversi/games/surrender.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import { publishReversiGameStream } from '../../../../../../services/stream';
 import define from '../../../../define';
 import { ApiError } from '../../../../error';
diff --git a/src/server/api/endpoints/games/reversi/match.ts b/src/server/api/endpoints/games/reversi/match.ts
index f1eb3aba28d17925e26f207f6bc6a6c1a7d9962c..2c4ec2ebd8a7d951a55865fd4362e9b78a39b2db 100644
--- a/src/server/api/endpoints/games/reversi/match.ts
+++ b/src/server/api/endpoints/games/reversi/match.ts
@@ -1,11 +1,11 @@
 import $ from 'cafy';
-import { ID } from '../../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import { publishMainStream, publishReversiStream } from '../../../../../services/stream';
 import { eighteight } from '../../../../../games/reversi/maps';
 import define from '../../../define';
 import { ApiError } from '../../../error';
 import { getUser } from '../../../common/getters';
-import { genId } from '../../../../../misc/gen-id';
+import { genId } from '@/misc/gen-id';
 import { ReversiMatchings, ReversiGames } from '../../../../../models';
 import { ReversiGame } from '../../../../../models/entities/games/reversi/game';
 import { ReversiMatching } from '../../../../../models/entities/games/reversi/matching';
@@ -72,7 +72,7 @@ export default define(meta, async (ps, user) => {
 			isLlotheo: false
 		} as Partial<ReversiGame>);
 
-		publishReversiStream(exist.parentId, 'matched', await ReversiGames.pack(game, exist.parentId));
+		publishReversiStream(exist.parentId, 'matched', await ReversiGames.pack(game, { id: exist.parentId }));
 
 		const other = await ReversiMatchings.count({
 			childId: user.id
diff --git a/src/server/api/endpoints/get-online-users-count.ts b/src/server/api/endpoints/get-online-users-count.ts
index 75211048860194898b89ddc4e9b47d37c9d78787..150ac9e365c71901cfca339949a6043d50c161c6 100644
--- a/src/server/api/endpoints/get-online-users-count.ts
+++ b/src/server/api/endpoints/get-online-users-count.ts
@@ -1,6 +1,6 @@
 import define from '../define';
-import redis from '../../../db/redis';
-import config from '../../../config';
+import { redisClient } from '../../../db/redis';
+import config from '@/config';
 
 export const meta = {
 	tags: ['meta'],
@@ -13,7 +13,7 @@ export const meta = {
 
 export default define(meta, (ps, user) => {
 	return new Promise((res, rej) => {
-		redis.pubsub('numsub', config.host, (_, x) => {
+		redisClient.pubsub('numsub', config.host, (_, x) => {
 			res({
 				count: x[1]
 			});
diff --git a/src/server/api/endpoints/hashtags/show.ts b/src/server/api/endpoints/hashtags/show.ts
index 49aa36e05acc802c183db27363e665d5d56391dd..f80ef38af09c4b089b6738194640b3d30d388e4d 100644
--- a/src/server/api/endpoints/hashtags/show.ts
+++ b/src/server/api/endpoints/hashtags/show.ts
@@ -2,7 +2,7 @@ import $ from 'cafy';
 import define from '../../define';
 import { ApiError } from '../../error';
 import { Hashtags } from '../../../../models';
-import { normalizeForSearch } from '../../../../misc/normalize-for-search';
+import { normalizeForSearch } from '@/misc/normalize-for-search';
 
 export const meta = {
 	desc: {
diff --git a/src/server/api/endpoints/hashtags/trend.ts b/src/server/api/endpoints/hashtags/trend.ts
index 3b5dd3c0c1c28c58fc6de35447063b06ae1d593f..5341c3e5845c89ddbfc24455c07dc10dc9c49921 100644
--- a/src/server/api/endpoints/hashtags/trend.ts
+++ b/src/server/api/endpoints/hashtags/trend.ts
@@ -1,10 +1,10 @@
 import { Brackets } from 'typeorm';
 import define from '../../define';
-import { fetchMeta } from '../../../../misc/fetch-meta';
+import { fetchMeta } from '@/misc/fetch-meta';
 import { Notes } from '../../../../models';
 import { Note } from '../../../../models/entities/note';
-import { safeForSql } from '../../../../misc/safe-for-sql';
-import { normalizeForSearch } from '../../../../misc/normalize-for-search';
+import { safeForSql } from '@/misc/safe-for-sql';
+import { normalizeForSearch } from '@/misc/normalize-for-search';
 
 /*
 トレンドに載るためには「『直近a分間のユニーク投稿数が今からa分前~今からb分前の間のユニーク投稿数のn倍以上』のハッシュタグの上位5位以内に入る」ことが必要
diff --git a/src/server/api/endpoints/hashtags/users.ts b/src/server/api/endpoints/hashtags/users.ts
index d2f59986814613d37e669bff850916e96fe11ce7..cecbc80cd2ed5a1811c6e386c0462023f5271963 100644
--- a/src/server/api/endpoints/hashtags/users.ts
+++ b/src/server/api/endpoints/hashtags/users.ts
@@ -1,7 +1,7 @@
 import $ from 'cafy';
 import define from '../../define';
 import { Users } from '../../../../models';
-import { normalizeForSearch } from '../../../../misc/normalize-for-search';
+import { normalizeForSearch } from '@/misc/normalize-for-search';
 
 export const meta = {
 	requireCredential: false as const,
diff --git a/src/server/api/endpoints/i/2fa/key-done.ts b/src/server/api/endpoints/i/2fa/key-done.ts
index 4634944ca730995371d76704feb47eccd4c0c71e..923a8b386cdda3adb5df44c7eb15371608448571 100644
--- a/src/server/api/endpoints/i/2fa/key-done.ts
+++ b/src/server/api/endpoints/i/2fa/key-done.ts
@@ -9,7 +9,7 @@ import {
 	AttestationChallenges,
 	Users
 } from '../../../../../models';
-import config from '../../../../../config';
+import config from '@/config';
 import { procedures, hash } from '../../../2fa';
 import { publishMainStream } from '../../../../../services/stream';
 
diff --git a/src/server/api/endpoints/i/2fa/register-key.ts b/src/server/api/endpoints/i/2fa/register-key.ts
index d5cc11c7fbf1e840cb2f5d159f0889c2c95ec805..75f578fc5f662a1da05c2467ac0f670afd904807 100644
--- a/src/server/api/endpoints/i/2fa/register-key.ts
+++ b/src/server/api/endpoints/i/2fa/register-key.ts
@@ -4,7 +4,7 @@ import define from '../../../define';
 import { UserProfiles, AttestationChallenges } from '../../../../../models';
 import { promisify } from 'util';
 import * as crypto from 'crypto';
-import { genId } from '../../../../../misc/gen-id';
+import { genId } from '@/misc/gen-id';
 import { hash } from '../../../2fa';
 
 const randomBytes = promisify(crypto.randomBytes);
diff --git a/src/server/api/endpoints/i/2fa/register.ts b/src/server/api/endpoints/i/2fa/register.ts
index a39b2963e9f7976f36629e56c451a458ee82213f..d40997d6ede75966cb1bc05b20dd763af3279bb8 100644
--- a/src/server/api/endpoints/i/2fa/register.ts
+++ b/src/server/api/endpoints/i/2fa/register.ts
@@ -2,7 +2,7 @@ import $ from 'cafy';
 import * as bcrypt from 'bcryptjs';
 import * as speakeasy from 'speakeasy';
 import * as QRCode from 'qrcode';
-import config from '../../../../../config';
+import config from '@/config';
 import define from '../../../define';
 import { UserProfiles } from '../../../../../models';
 
diff --git a/src/server/api/endpoints/i/favorites.ts b/src/server/api/endpoints/i/favorites.ts
index 3518bd9c4d5e6f21294a9f3fd2b15de8bad02c20..b0d20e9ac9fa6c7ca00fd1880a730b5a615351fd 100644
--- a/src/server/api/endpoints/i/favorites.ts
+++ b/src/server/api/endpoints/i/favorites.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../define';
 import { NoteFavorites } from '../../../../models';
 import { makePaginationQuery } from '../../common/make-pagination-query';
diff --git a/src/server/api/endpoints/i/import-following.ts b/src/server/api/endpoints/i/import-following.ts
index c8a539cda325499a43edb45c0cc0c6fc3fa6ea4d..03495510736b6740200503eb1d70af4b906c9c5b 100644
--- a/src/server/api/endpoints/i/import-following.ts
+++ b/src/server/api/endpoints/i/import-following.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../define';
 import { createImportFollowingJob } from '../../../../queue';
 import ms = require('ms');
diff --git a/src/server/api/endpoints/i/import-user-lists.ts b/src/server/api/endpoints/i/import-user-lists.ts
index e360a5468180f7ad258ba946a3f6b8ed1647833f..f40eb2745dccf761db9234f91e1d101a7cc54d8f 100644
--- a/src/server/api/endpoints/i/import-user-lists.ts
+++ b/src/server/api/endpoints/i/import-user-lists.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../define';
 import { createImportUserListsJob } from '../../../../queue';
 import ms = require('ms');
diff --git a/src/server/api/endpoints/i/notifications.ts b/src/server/api/endpoints/i/notifications.ts
index 812a4bd1dd5a4f3596850df0004a21352b43d1b6..b481fdba8fc447938f8455f2cf5c14a94aadda52 100644
--- a/src/server/api/endpoints/i/notifications.ts
+++ b/src/server/api/endpoints/i/notifications.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import { readNotification } from '../../common/read-notification';
 import define from '../../define';
 import { makePaginationQuery } from '../../common/make-pagination-query';
diff --git a/src/server/api/endpoints/i/page-likes.ts b/src/server/api/endpoints/i/page-likes.ts
index 9a83cc1d4316d6098b00c8102a6ece79a6ff858c..cd5ec3da7066fa849c977f43a51db056aebab024 100644
--- a/src/server/api/endpoints/i/page-likes.ts
+++ b/src/server/api/endpoints/i/page-likes.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../define';
 import { PageLikes } from '../../../../models';
 import { makePaginationQuery } from '../../common/make-pagination-query';
diff --git a/src/server/api/endpoints/i/pages.ts b/src/server/api/endpoints/i/pages.ts
index 3fc00e370ac3b7e46ccd4fcf164020f08ef74c1d..ab42ab6d3f37068631904fcf83cd3714c9ad08f5 100644
--- a/src/server/api/endpoints/i/pages.ts
+++ b/src/server/api/endpoints/i/pages.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../define';
 import { Pages } from '../../../../models';
 import { makePaginationQuery } from '../../common/make-pagination-query';
diff --git a/src/server/api/endpoints/i/pin.ts b/src/server/api/endpoints/i/pin.ts
index e13873f601ba3fed79fa844a5a5296d3336172b0..4bed566935e54ee1ae686771754743469db4a15c 100644
--- a/src/server/api/endpoints/i/pin.ts
+++ b/src/server/api/endpoints/i/pin.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import { addPinned } from '../../../../services/i/pin';
 import define from '../../define';
 import { ApiError } from '../../error';
@@ -61,7 +61,7 @@ export default define(meta, async (ps, user) => {
 		throw e;
 	});
 
-	return await Users.pack(user, user, {
+	return await Users.pack(user.id, user, {
 		detail: true
 	});
 });
diff --git a/src/server/api/endpoints/i/read-announcement.ts b/src/server/api/endpoints/i/read-announcement.ts
index d6acb3d2e6047293e1dcb6ae119f415d1c31f157..a0c59a15d68167d109be0ddf1b8fb7f58a806668 100644
--- a/src/server/api/endpoints/i/read-announcement.ts
+++ b/src/server/api/endpoints/i/read-announcement.ts
@@ -1,8 +1,8 @@
 import $ from 'cafy';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../define';
 import { ApiError } from '../../error';
-import { genId } from '../../../../misc/gen-id';
+import { genId } from '@/misc/gen-id';
 import { AnnouncementReads, Announcements, Users } from '../../../../models';
 import { publishMainStream } from '../../../../services/stream';
 
diff --git a/src/server/api/endpoints/i/registry/scopes.ts b/src/server/api/endpoints/i/registry/scopes.ts
index 8b0e1a7fd8df0898d6215db2474fb6fa24552d54..baf3ebdeca1672317a6e96336cccde16ecd4de11 100644
--- a/src/server/api/endpoints/i/registry/scopes.ts
+++ b/src/server/api/endpoints/i/registry/scopes.ts
@@ -1,4 +1,3 @@
-import $ from 'cafy';
 import define from '../../../define';
 import { RegistryItems } from '../../../../../models';
 
diff --git a/src/server/api/endpoints/i/registry/set.ts b/src/server/api/endpoints/i/registry/set.ts
index c732cfc8f5b7b49ee60016c7842edd24649fc271..40f636801725f182d43c8e95246530f7cb2cab12 100644
--- a/src/server/api/endpoints/i/registry/set.ts
+++ b/src/server/api/endpoints/i/registry/set.ts
@@ -2,7 +2,7 @@ import $ from 'cafy';
 import { publishMainStream } from '../../../../../services/stream';
 import define from '../../../define';
 import { RegistryItems } from '../../../../../models';
-import { genId } from '../../../../../misc/gen-id';
+import { genId } from '@/misc/gen-id';
 
 export const meta = {
 	requireCredential: true as const,
diff --git a/src/server/api/endpoints/i/revoke-token.ts b/src/server/api/endpoints/i/revoke-token.ts
index ce688c5755bdf60063af57824d9925ecee67a124..d71a1bd1350ce7824788af7f8c44812b830cc69f 100644
--- a/src/server/api/endpoints/i/revoke-token.ts
+++ b/src/server/api/endpoints/i/revoke-token.ts
@@ -1,7 +1,7 @@
 import $ from 'cafy';
 import define from '../../define';
 import { AccessTokens } from '../../../../models';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 
 export const meta = {
 	requireCredential: true as const,
diff --git a/src/server/api/endpoints/i/signin-history.ts b/src/server/api/endpoints/i/signin-history.ts
index 4f7da7d343a0dcd626d660077098551f5c5627da..0395206144c8847b1b2e61e55a680b70f1b551d8 100644
--- a/src/server/api/endpoints/i/signin-history.ts
+++ b/src/server/api/endpoints/i/signin-history.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../define';
 import { Signins } from '../../../../models';
 import { makePaginationQuery } from '../../common/make-pagination-query';
diff --git a/src/server/api/endpoints/i/unpin.ts b/src/server/api/endpoints/i/unpin.ts
index 6f06e38598202420bab166e54cf9e564dff4dcd8..bb8b36a166c64a9d18149fc86015e39aa33cbc0e 100644
--- a/src/server/api/endpoints/i/unpin.ts
+++ b/src/server/api/endpoints/i/unpin.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import { removePinned } from '../../../../services/i/pin';
 import define from '../../define';
 import { ApiError } from '../../error';
@@ -47,7 +47,7 @@ export default define(meta, async (ps, user) => {
 		throw e;
 	});
 
-	return await Users.pack(user, user, {
+	return await Users.pack(user.id, user, {
 		detail: true
 	});
 });
diff --git a/src/server/api/endpoints/i/update-email.ts b/src/server/api/endpoints/i/update-email.ts
index 730918aebeb08e437155b3227042f1e64a0444c3..cd0e989e51e20d460eb490285767e93e3cdc3846 100644
--- a/src/server/api/endpoints/i/update-email.ts
+++ b/src/server/api/endpoints/i/update-email.ts
@@ -2,7 +2,7 @@ import $ from 'cafy';
 import { publishMainStream } from '../../../../services/stream';
 import define from '../../define';
 import rndstr from 'rndstr';
-import config from '../../../../config';
+import config from '@/config';
 import * as ms from 'ms';
 import * as bcrypt from 'bcryptjs';
 import { Users, UserProfiles } from '../../../../models';
diff --git a/src/server/api/endpoints/i/update.ts b/src/server/api/endpoints/i/update.ts
index 92be2e9e6d2cbd90f41a5d62ff5ef01466c643f1..0554fe76fb8ccffe99fb1adbf10976f19adbeac4 100644
--- a/src/server/api/endpoints/i/update.ts
+++ b/src/server/api/endpoints/i/update.ts
@@ -1,12 +1,12 @@
 import $ from 'cafy';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import { publishMainStream, publishUserEvent } from '../../../../services/stream';
 import acceptAllFollowRequests from '../../../../services/following/requests/accept-all';
 import { publishToFollowers } from '../../../../services/i/update';
 import define from '../../define';
 import { parse, parsePlain } from '../../../../mfm/parse';
-import extractEmojis from '../../../../misc/extract-emojis';
-import extractHashtags from '../../../../misc/extract-hashtags';
+import extractEmojis from '@/misc/extract-emojis';
+import extractHashtags from '@/misc/extract-hashtags';
 import * as langmap from 'langmap';
 import { updateUsertags } from '../../../../services/update-hashtag';
 import { ApiError } from '../../error';
@@ -14,7 +14,7 @@ import { Users, DriveFiles, UserProfiles, Pages } from '../../../../models';
 import { User } from '../../../../models/entities/user';
 import { UserProfile } from '../../../../models/entities/user-profile';
 import { notificationTypes } from '../../../../types';
-import { normalizeForSearch } from '../../../../misc/normalize-for-search';
+import { normalizeForSearch } from '@/misc/normalize-for-search';
 
 export const meta = {
 	desc: {
@@ -205,7 +205,8 @@ export const meta = {
 	}
 };
 
-export default define(meta, async (ps, user, token) => {
+export default define(meta, async (ps, _user, token) => {
+	const user = await Users.findOneOrFail(_user.id);
 	const isSecure = token == null;
 
 	const updates = {} as Partial<User>;
diff --git a/src/server/api/endpoints/i/user-group-invites.ts b/src/server/api/endpoints/i/user-group-invites.ts
index 4c5105fa7bd63cdc1a6a0537a6d9820518f8c23b..9bfb17ab4e7fa4ccbcded683093e5378f222010b 100644
--- a/src/server/api/endpoints/i/user-group-invites.ts
+++ b/src/server/api/endpoints/i/user-group-invites.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../define';
 import { UserGroupInvitations } from '../../../../models';
 import { makePaginationQuery } from '../../common/make-pagination-query';
diff --git a/src/server/api/endpoints/messaging/messages.ts b/src/server/api/endpoints/messaging/messages.ts
index 479f8da8ad214a334fb7781668c328be60e65cfd..8beb7e87f059bc53eb0120e977a015dab8cf4a45 100644
--- a/src/server/api/endpoints/messaging/messages.ts
+++ b/src/server/api/endpoints/messaging/messages.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../define';
 import { ApiError } from '../../error';
 import { getUser } from '../../common/getters';
diff --git a/src/server/api/endpoints/messaging/messages/create.ts b/src/server/api/endpoints/messaging/messages/create.ts
index 3d7a1f4c4a41c2133efe14127a5343c9dfef0a52..c9abb299fdb7dea1059d965de485e87b71b56a5e 100644
--- a/src/server/api/endpoints/messaging/messages/create.ts
+++ b/src/server/api/endpoints/messaging/messages/create.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../../define';
 import { ApiError } from '../../../error';
 import { getUser } from '../../../common/getters';
diff --git a/src/server/api/endpoints/messaging/messages/delete.ts b/src/server/api/endpoints/messaging/messages/delete.ts
index 2fce93e9b973366922658925efe72f7ce1db1fba..128ef0263ec2da858f5b6485662bff3d6c046b81 100644
--- a/src/server/api/endpoints/messaging/messages/delete.ts
+++ b/src/server/api/endpoints/messaging/messages/delete.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../../define';
 import * as ms from 'ms';
 import { ApiError } from '../../../error';
diff --git a/src/server/api/endpoints/messaging/messages/read.ts b/src/server/api/endpoints/messaging/messages/read.ts
index 3a7aae1bd01eefe940372c9c3caf4ccfdb527827..c591cb28e0159af825b67e10e757ee905ed8e309 100644
--- a/src/server/api/endpoints/messaging/messages/read.ts
+++ b/src/server/api/endpoints/messaging/messages/read.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../../define';
 import { ApiError } from '../../../error';
 import { MessagingMessages } from '../../../../../models';
diff --git a/src/server/api/endpoints/meta.ts b/src/server/api/endpoints/meta.ts
index c2f4190e1cb4bb99e3ba6836b00ed6c651c5ff17..2a94ae35f6c2e86c390ee02988dadbc55d6f91d4 100644
--- a/src/server/api/endpoints/meta.ts
+++ b/src/server/api/endpoints/meta.ts
@@ -1,9 +1,9 @@
 import $ from 'cafy';
-import config from '../../../config';
+import config from '@/config';
 import define from '../define';
-import { fetchMeta } from '../../../misc/fetch-meta';
+import { fetchMeta } from '@/misc/fetch-meta';
 import { Emojis, Users } from '../../../models';
-import { DB_MAX_NOTE_TEXT_LENGTH } from '../../../misc/hard-limits';
+import { DB_MAX_NOTE_TEXT_LENGTH } from '@/misc/hard-limits';
 
 export const meta = {
 	desc: {
diff --git a/src/server/api/endpoints/miauth/gen-token.ts b/src/server/api/endpoints/miauth/gen-token.ts
index 401ed16389eb3b902fcda2ee397f0c299a0c3e24..68ef00eb289786e05dc20a377bc95ca5d235f776 100644
--- a/src/server/api/endpoints/miauth/gen-token.ts
+++ b/src/server/api/endpoints/miauth/gen-token.ts
@@ -1,8 +1,8 @@
 import $ from 'cafy';
 import define from '../../define';
 import { AccessTokens } from '../../../../models';
-import { genId } from '../../../../misc/gen-id';
-import { secureRndstr } from '../../../../misc/secure-rndstr';
+import { genId } from '@/misc/gen-id';
+import { secureRndstr } from '@/misc/secure-rndstr';
 
 export const meta = {
 	tags: ['auth'],
diff --git a/src/server/api/endpoints/mute/create.ts b/src/server/api/endpoints/mute/create.ts
index ebfc6028ed457acaec4f16ace74b5e496506df75..6c1e1e2fdd2616b375eb436cc192379fcc5b47b0 100644
--- a/src/server/api/endpoints/mute/create.ts
+++ b/src/server/api/endpoints/mute/create.ts
@@ -1,9 +1,9 @@
 import $ from 'cafy';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../define';
 import { ApiError } from '../../error';
 import { getUser } from '../../common/getters';
-import { genId } from '../../../../misc/gen-id';
+import { genId } from '@/misc/gen-id';
 import { Mutings, NoteWatchings } from '../../../../models';
 import { Muting } from '../../../../models/entities/muting';
 import { publishUserEvent } from '../../../../services/stream';
diff --git a/src/server/api/endpoints/mute/delete.ts b/src/server/api/endpoints/mute/delete.ts
index 67a59e3ae48ea8911c3517040953fcafd237d994..2a008b64c73876cf95098483f1dbb29f8caf7302 100644
--- a/src/server/api/endpoints/mute/delete.ts
+++ b/src/server/api/endpoints/mute/delete.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../define';
 import { ApiError } from '../../error';
 import { getUser } from '../../common/getters';
diff --git a/src/server/api/endpoints/mute/list.ts b/src/server/api/endpoints/mute/list.ts
index 1a8fc92159547c23b4444c5edf199c23b88eb15b..daa52b9ff5eab838880c82232d12edeb3f72725f 100644
--- a/src/server/api/endpoints/mute/list.ts
+++ b/src/server/api/endpoints/mute/list.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../define';
 import { makePaginationQuery } from '../../common/make-pagination-query';
 import { Mutings } from '../../../../models';
diff --git a/src/server/api/endpoints/notes.ts b/src/server/api/endpoints/notes.ts
index 30e6e92fec07149ea8deca0b54e35f6681b9a778..0e892953510cf815b9c869d680b380df45e67bc7 100644
--- a/src/server/api/endpoints/notes.ts
+++ b/src/server/api/endpoints/notes.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../define';
 import { makePaginationQuery } from '../common/make-pagination-query';
 import { Notes } from '../../../models';
diff --git a/src/server/api/endpoints/notes/children.ts b/src/server/api/endpoints/notes/children.ts
index 072a25e024eae9275a6ba427b146589222b85760..bbfd0632c3d4f51f4bb10b66ea859adc2ad878e4 100644
--- a/src/server/api/endpoints/notes/children.ts
+++ b/src/server/api/endpoints/notes/children.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../define';
 import { makePaginationQuery } from '../../common/make-pagination-query';
 import { generateVisibilityQuery } from '../../common/generate-visibility-query';
diff --git a/src/server/api/endpoints/notes/clips.ts b/src/server/api/endpoints/notes/clips.ts
index 432dd8a46701b2eb9feeccee85980a585adfe783..d116370b46e4e4442893b838589e90cf79cce2e7 100644
--- a/src/server/api/endpoints/notes/clips.ts
+++ b/src/server/api/endpoints/notes/clips.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../define';
 import { ClipNotes, Clips } from '../../../../models';
 import { getNote } from '../../common/getters';
diff --git a/src/server/api/endpoints/notes/conversation.ts b/src/server/api/endpoints/notes/conversation.ts
index 0dea309b880c53a45a5f648f71d6274b4e28d42c..95ab4ec1e0a74f38b5e9b6b6d856415e26017adb 100644
--- a/src/server/api/endpoints/notes/conversation.ts
+++ b/src/server/api/endpoints/notes/conversation.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../define';
 import { ApiError } from '../../error';
 import { getNote } from '../../common/getters';
diff --git a/src/server/api/endpoints/notes/create.ts b/src/server/api/endpoints/notes/create.ts
index 6ca22113c7fdbb3a4778dd840abaaf6c87058d2b..29cc650b8db7ce4fc001888ea3e67a1c0d0a6d62 100644
--- a/src/server/api/endpoints/notes/create.ts
+++ b/src/server/api/endpoints/notes/create.ts
@@ -3,14 +3,14 @@ import * as ms from 'ms';
 import { length } from 'stringz';
 import create from '../../../../services/note/create';
 import define from '../../define';
-import { fetchMeta } from '../../../../misc/fetch-meta';
+import { fetchMeta } from '@/misc/fetch-meta';
 import { ApiError } from '../../error';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import { User } from '../../../../models/entities/user';
 import { Users, DriveFiles, Notes, Channels } from '../../../../models';
 import { DriveFile } from '../../../../models/entities/drive-file';
 import { Note } from '../../../../models/entities/note';
-import { DB_MAX_NOTE_TEXT_LENGTH } from '../../../../misc/hard-limits';
+import { DB_MAX_NOTE_TEXT_LENGTH } from '@/misc/hard-limits';
 import { noteVisibilities } from '../../../../types';
 import { Channel } from '../../../../models/entities/channel';
 
diff --git a/src/server/api/endpoints/notes/delete.ts b/src/server/api/endpoints/notes/delete.ts
index 5afd911ca9020ddf7cffc29da5268376564a8d2f..154cff0741eef1764a0a36749ac131138d825eb6 100644
--- a/src/server/api/endpoints/notes/delete.ts
+++ b/src/server/api/endpoints/notes/delete.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import deleteNote from '../../../../services/note/delete';
 import define from '../../define';
 import * as ms from 'ms';
diff --git a/src/server/api/endpoints/notes/favorites/create.ts b/src/server/api/endpoints/notes/favorites/create.ts
index d66ce37a46d2f5a722e5624a8cfae227e295efa2..846c80a8d65d859c9b325e46ed8c13e8ec6072b3 100644
--- a/src/server/api/endpoints/notes/favorites/create.ts
+++ b/src/server/api/endpoints/notes/favorites/create.ts
@@ -1,10 +1,10 @@
 import $ from 'cafy';
-import { ID } from '../../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../../define';
 import { ApiError } from '../../../error';
 import { getNote } from '../../../common/getters';
 import { NoteFavorites } from '../../../../../models';
-import { genId } from '../../../../../misc/gen-id';
+import { genId } from '@/misc/gen-id';
 
 export const meta = {
 	desc: {
diff --git a/src/server/api/endpoints/notes/favorites/delete.ts b/src/server/api/endpoints/notes/favorites/delete.ts
index 1b36b7d68cbaee894bf3044bc38b4b847675f8af..2be4f6408e284e5060bc009741e6e8a6643bcdad 100644
--- a/src/server/api/endpoints/notes/favorites/delete.ts
+++ b/src/server/api/endpoints/notes/favorites/delete.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../../define';
 import { ApiError } from '../../../error';
 import { getNote } from '../../../common/getters';
diff --git a/src/server/api/endpoints/notes/global-timeline.ts b/src/server/api/endpoints/notes/global-timeline.ts
index 64fc3cbf6cce37abe0f46f4e9c3b18b53b81eb0a..1e1df4040df22b35f9362a48b2c793f3da547d57 100644
--- a/src/server/api/endpoints/notes/global-timeline.ts
+++ b/src/server/api/endpoints/notes/global-timeline.ts
@@ -1,7 +1,7 @@
 import $ from 'cafy';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../define';
-import { fetchMeta } from '../../../../misc/fetch-meta';
+import { fetchMeta } from '@/misc/fetch-meta';
 import { ApiError } from '../../error';
 import { makePaginationQuery } from '../../common/make-pagination-query';
 import { Notes } from '../../../../models';
diff --git a/src/server/api/endpoints/notes/hybrid-timeline.ts b/src/server/api/endpoints/notes/hybrid-timeline.ts
index 19c4593f5be07b512299f7a67e030bd290065b94..ac44e747dc6c451327e015c94b6135d2b6d9d277 100644
--- a/src/server/api/endpoints/notes/hybrid-timeline.ts
+++ b/src/server/api/endpoints/notes/hybrid-timeline.ts
@@ -1,7 +1,7 @@
 import $ from 'cafy';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../define';
-import { fetchMeta } from '../../../../misc/fetch-meta';
+import { fetchMeta } from '@/misc/fetch-meta';
 import { ApiError } from '../../error';
 import { makePaginationQuery } from '../../common/make-pagination-query';
 import { Followings, Notes } from '../../../../models';
diff --git a/src/server/api/endpoints/notes/local-timeline.ts b/src/server/api/endpoints/notes/local-timeline.ts
index 546d3619f7f6a65d1132a61bcdce897649464329..113078a988e0f0d2fb3375ac01ed4b5acff446f4 100644
--- a/src/server/api/endpoints/notes/local-timeline.ts
+++ b/src/server/api/endpoints/notes/local-timeline.ts
@@ -1,7 +1,7 @@
 import $ from 'cafy';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../define';
-import { fetchMeta } from '../../../../misc/fetch-meta';
+import { fetchMeta } from '@/misc/fetch-meta';
 import { ApiError } from '../../error';
 import { Notes } from '../../../../models';
 import { generateMutedUserQuery } from '../../common/generate-muted-user-query';
diff --git a/src/server/api/endpoints/notes/mentions.ts b/src/server/api/endpoints/notes/mentions.ts
index 30368ea578e23f1e5addcc6b5c3caa6ae62bb4a9..34936c9b54ffd9444c4db605cfd5eebf477c7174 100644
--- a/src/server/api/endpoints/notes/mentions.ts
+++ b/src/server/api/endpoints/notes/mentions.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../define';
 import read from '../../../../services/note/read';
 import { Notes, Followings } from '../../../../models';
@@ -83,7 +83,7 @@ export default define(meta, async (ps, user) => {
 
 	const mentions = await query.take(ps.limit!).getMany();
 
-	read(user.id, mentions.map(note => note.id));
+	read(user.id, mentions);
 
 	return await Notes.packMany(mentions, user);
 });
diff --git a/src/server/api/endpoints/notes/polls/vote.ts b/src/server/api/endpoints/notes/polls/vote.ts
index 6113d7ea9acf325ec2dc50d7efd0d3139681da47..51dcec89c789214e509c790dfc6a2cd8dcee85e6 100644
--- a/src/server/api/endpoints/notes/polls/vote.ts
+++ b/src/server/api/endpoints/notes/polls/vote.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import { publishNoteStream } from '../../../../../services/stream';
 import { createNotification } from '../../../../../services/create-notification';
 import define from '../../../define';
@@ -12,7 +12,7 @@ import { deliverQuestionUpdate } from '../../../../../services/note/polls/update
 import { PollVotes, NoteWatchings, Users, Polls } from '../../../../../models';
 import { Not } from 'typeorm';
 import { IRemoteUser } from '../../../../../models/entities/user';
-import { genId } from '../../../../../misc/gen-id';
+import { genId } from '@/misc/gen-id';
 
 export const meta = {
 	desc: {
diff --git a/src/server/api/endpoints/notes/reactions.ts b/src/server/api/endpoints/notes/reactions.ts
index 2621e2a12fa74fc4158ed5ead98ed7a6f9e11aeb..3c60fa2e8e27c347b24f83a22dd0159b92d5e3b4 100644
--- a/src/server/api/endpoints/notes/reactions.ts
+++ b/src/server/api/endpoints/notes/reactions.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../define';
 import { getNote } from '../../common/getters';
 import { ApiError } from '../../error';
diff --git a/src/server/api/endpoints/notes/reactions/create.ts b/src/server/api/endpoints/notes/reactions/create.ts
index 9017d9f36f1ca390f13c741ae8010f1d46190c6b..17a6f391d4967f1e83c7440d8fc5ea18fe99b897 100644
--- a/src/server/api/endpoints/notes/reactions/create.ts
+++ b/src/server/api/endpoints/notes/reactions/create.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import createReaction from '../../../../../services/note/reaction/create';
 import define from '../../../define';
 import { getNote } from '../../../common/getters';
diff --git a/src/server/api/endpoints/notes/reactions/delete.ts b/src/server/api/endpoints/notes/reactions/delete.ts
index 267d8417c2528d6a06437158d4369284493662fa..b95c7f891b35ebe29fbd5f906c65f56a12c3d71a 100644
--- a/src/server/api/endpoints/notes/reactions/delete.ts
+++ b/src/server/api/endpoints/notes/reactions/delete.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../../define';
 import * as ms from 'ms';
 import deleteReaction from '../../../../../services/note/reaction/delete';
diff --git a/src/server/api/endpoints/notes/renotes.ts b/src/server/api/endpoints/notes/renotes.ts
index dcda213918b846ada1178194f0753ef64e78443b..d26192d10a3e0a2c1cc6bcaa16a37b368dca385a 100644
--- a/src/server/api/endpoints/notes/renotes.ts
+++ b/src/server/api/endpoints/notes/renotes.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../define';
 import { getNote } from '../../common/getters';
 import { ApiError } from '../../error';
diff --git a/src/server/api/endpoints/notes/replies.ts b/src/server/api/endpoints/notes/replies.ts
index 6f33e2f23327ede35e05817df05fac11013899fa..e91a1cf0bf62203af473014850e091683aaad10f 100644
--- a/src/server/api/endpoints/notes/replies.ts
+++ b/src/server/api/endpoints/notes/replies.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../define';
 import { Notes } from '../../../../models';
 import { makePaginationQuery } from '../../common/make-pagination-query';
diff --git a/src/server/api/endpoints/notes/search-by-tag.ts b/src/server/api/endpoints/notes/search-by-tag.ts
index 47b41d9294a45ac46f9804ff7098a03e161031fc..61f62dd5a6f1b02a3847331240f40107884d5725 100644
--- a/src/server/api/endpoints/notes/search-by-tag.ts
+++ b/src/server/api/endpoints/notes/search-by-tag.ts
@@ -1,13 +1,13 @@
 import $ from 'cafy';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../define';
 import { makePaginationQuery } from '../../common/make-pagination-query';
 import { Notes } from '../../../../models';
 import { generateMutedUserQuery } from '../../common/generate-muted-user-query';
 import { generateVisibilityQuery } from '../../common/generate-visibility-query';
 import { Brackets } from 'typeorm';
-import { safeForSql } from '../../../../misc/safe-for-sql';
-import { normalizeForSearch } from '../../../../misc/normalize-for-search';
+import { safeForSql } from '@/misc/safe-for-sql';
+import { normalizeForSearch } from '@/misc/normalize-for-search';
 
 export const meta = {
 	desc: {
diff --git a/src/server/api/endpoints/notes/search.ts b/src/server/api/endpoints/notes/search.ts
index 230d2b02945f29714b4afef79a62ebd51f24c4ae..e3454be9d344d25704b5a884e3d456cf69dacc6f 100644
--- a/src/server/api/endpoints/notes/search.ts
+++ b/src/server/api/endpoints/notes/search.ts
@@ -3,8 +3,8 @@ import es from '../../../../db/elasticsearch';
 import define from '../../define';
 import { Notes } from '../../../../models';
 import { In } from 'typeorm';
-import { ID } from '../../../../misc/cafy-id';
-import config from '../../../../config';
+import { ID } from '@/misc/cafy-id';
+import config from '@/config';
 import { makePaginationQuery } from '../../common/make-pagination-query';
 import { generateVisibilityQuery } from '../../common/generate-visibility-query';
 import { generateMutedUserQuery } from '../../common/generate-muted-user-query';
diff --git a/src/server/api/endpoints/notes/show.ts b/src/server/api/endpoints/notes/show.ts
index 984b5c726aee29af175543d6965d019ef44994fc..e592076a2e010461cf90499bf3a2584faa0a3f69 100644
--- a/src/server/api/endpoints/notes/show.ts
+++ b/src/server/api/endpoints/notes/show.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../define';
 import { getNote } from '../../common/getters';
 import { ApiError } from '../../error';
diff --git a/src/server/api/endpoints/notes/state.ts b/src/server/api/endpoints/notes/state.ts
index b8b17820eefb12e5fb0dc6fcc9b830315452b551..60151f7e3226491d2f32c8f7e5fb3bea11d313bd 100644
--- a/src/server/api/endpoints/notes/state.ts
+++ b/src/server/api/endpoints/notes/state.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../define';
 import { NoteFavorites, NoteWatchings } from '../../../../models';
 
diff --git a/src/server/api/endpoints/notes/timeline.ts b/src/server/api/endpoints/notes/timeline.ts
index d025944cc2c1210d1de1f4aaf016b36e72b2e225..0871a9688266c2de978c0fbee984188ae3f59638 100644
--- a/src/server/api/endpoints/notes/timeline.ts
+++ b/src/server/api/endpoints/notes/timeline.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../define';
 import { makePaginationQuery } from '../../common/make-pagination-query';
 import { Notes, Followings } from '../../../../models';
diff --git a/src/server/api/endpoints/notes/unrenote.ts b/src/server/api/endpoints/notes/unrenote.ts
index af558a9897edb96924dcc6b49e5521dad4c1a77c..0233b9db128d34bbd9a5d38c9070b7fe1a7de3a5 100644
--- a/src/server/api/endpoints/notes/unrenote.ts
+++ b/src/server/api/endpoints/notes/unrenote.ts
@@ -1,11 +1,11 @@
 import $ from 'cafy';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import deleteNote from '../../../../services/note/delete';
 import define from '../../define';
 import * as ms from 'ms';
 import { getNote } from '../../common/getters';
 import { ApiError } from '../../error';
-import { Notes } from '../../../../models';
+import { Notes, Users } from '../../../../models';
 
 export const meta = {
 	desc: {
@@ -55,6 +55,6 @@ export default define(meta, async (ps, user) => {
 	});
 
 	for (const note of renotes) {
-		deleteNote(user, note);
+		deleteNote(await Users.findOneOrFail(user.id), note);
 	}
 });
diff --git a/src/server/api/endpoints/notes/user-list-timeline.ts b/src/server/api/endpoints/notes/user-list-timeline.ts
index 9ffb38bddc00e60ba3ae1e735559b316b934fd30..cb3c18505d4e46a03924200ba87f6606695ca387 100644
--- a/src/server/api/endpoints/notes/user-list-timeline.ts
+++ b/src/server/api/endpoints/notes/user-list-timeline.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../define';
 import { ApiError } from '../../error';
 import { UserLists, UserListJoinings, Notes } from '../../../../models';
diff --git a/src/server/api/endpoints/notes/watching/create.ts b/src/server/api/endpoints/notes/watching/create.ts
index b2a758fc74dc47394cc54458dbece8e6da750406..7667ebdedd3e2d17b687ce35eee0d9a2d75a86bc 100644
--- a/src/server/api/endpoints/notes/watching/create.ts
+++ b/src/server/api/endpoints/notes/watching/create.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../../define';
 import watch from '../../../../../services/note/watch';
 import { getNote } from '../../../common/getters';
diff --git a/src/server/api/endpoints/notes/watching/delete.ts b/src/server/api/endpoints/notes/watching/delete.ts
index 75b4f2355fdad7617781258bc6e5a2051210c2f7..77b4ff15c87d94b58510f602e26f506dc01cff4f 100644
--- a/src/server/api/endpoints/notes/watching/delete.ts
+++ b/src/server/api/endpoints/notes/watching/delete.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../../define';
 import unwatch from '../../../../../services/note/unwatch';
 import { getNote } from '../../../common/getters';
diff --git a/src/server/api/endpoints/page-push.ts b/src/server/api/endpoints/page-push.ts
index 3b19e1e192522f82b475c3e3b5962773f0e16e7e..9ec9f9184cf0bd2d96e7589f4e342151e058ad13 100644
--- a/src/server/api/endpoints/page-push.ts
+++ b/src/server/api/endpoints/page-push.ts
@@ -1,6 +1,6 @@
 import $ from 'cafy';
 import define from '../define';
-import { ID } from '../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import { publishMainStream } from '../../../services/stream';
 import { Users, Pages } from '../../../models';
 import { ApiError } from '../error';
@@ -43,7 +43,7 @@ export default define(meta, async (ps, user) => {
 		event: ps.event,
 		var: ps.var,
 		userId: user.id,
-		user: await Users.pack(user, page.userId, {
+		user: await Users.pack(user.id, { id: page.userId }, {
 			detail: true
 		})
 	});
diff --git a/src/server/api/endpoints/pages/create.ts b/src/server/api/endpoints/pages/create.ts
index 6d41a4afeb561b3256e12b1551cc6aea288595a0..413445512337871fc1540689e24aadfe6d1a808a 100644
--- a/src/server/api/endpoints/pages/create.ts
+++ b/src/server/api/endpoints/pages/create.ts
@@ -1,9 +1,9 @@
 import $ from 'cafy';
 import * as ms from 'ms';
 import define from '../../define';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import { Pages, DriveFiles } from '../../../../models';
-import { genId } from '../../../../misc/gen-id';
+import { genId } from '@/misc/gen-id';
 import { Page } from '../../../../models/entities/page';
 import { ApiError } from '../../error';
 
diff --git a/src/server/api/endpoints/pages/delete.ts b/src/server/api/endpoints/pages/delete.ts
index 99849ab5fe34b6c02d941a6d39a4346cae05c9df..51704c866e82176cb242234acd994eb87a77332c 100644
--- a/src/server/api/endpoints/pages/delete.ts
+++ b/src/server/api/endpoints/pages/delete.ts
@@ -2,7 +2,7 @@ import $ from 'cafy';
 import define from '../../define';
 import { ApiError } from '../../error';
 import { Pages } from '../../../../models';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 
 export const meta = {
 	desc: {
diff --git a/src/server/api/endpoints/pages/like.ts b/src/server/api/endpoints/pages/like.ts
index 3fc2b6ca2325699011cf06443ece27d857bb39d1..e6c15164c0f1fb85cae16a03a49caf23ec7be191 100644
--- a/src/server/api/endpoints/pages/like.ts
+++ b/src/server/api/endpoints/pages/like.ts
@@ -1,9 +1,9 @@
 import $ from 'cafy';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../define';
 import { ApiError } from '../../error';
 import { Pages, PageLikes } from '../../../../models';
-import { genId } from '../../../../misc/gen-id';
+import { genId } from '@/misc/gen-id';
 
 export const meta = {
 	desc: {
diff --git a/src/server/api/endpoints/pages/show.ts b/src/server/api/endpoints/pages/show.ts
index c8e5ad1d9bd29e62aa887fa6f729ac18a169eaab..13fa9ba1d0383832c37089b4f0151acedaaebeb6 100644
--- a/src/server/api/endpoints/pages/show.ts
+++ b/src/server/api/endpoints/pages/show.ts
@@ -2,7 +2,7 @@ import $ from 'cafy';
 import define from '../../define';
 import { ApiError } from '../../error';
 import { Pages, Users } from '../../../../models';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import { Page } from '../../../../models/entities/page';
 
 export const meta = {
diff --git a/src/server/api/endpoints/pages/unlike.ts b/src/server/api/endpoints/pages/unlike.ts
index 865df91c3e97e924b832ec4ff24db1f36828e386..2008dd8bef2ae01fcf8f6ae799a7a81093c99098 100644
--- a/src/server/api/endpoints/pages/unlike.ts
+++ b/src/server/api/endpoints/pages/unlike.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../define';
 import { ApiError } from '../../error';
 import { Pages, PageLikes } from '../../../../models';
diff --git a/src/server/api/endpoints/pages/update.ts b/src/server/api/endpoints/pages/update.ts
index 2d93dd4ae4be593fd7c55282bbadc02079eeb5cb..d52d5964cbc696f1b39c951a3f0cc55ed7b35c0e 100644
--- a/src/server/api/endpoints/pages/update.ts
+++ b/src/server/api/endpoints/pages/update.ts
@@ -3,7 +3,7 @@ import * as ms from 'ms';
 import define from '../../define';
 import { ApiError } from '../../error';
 import { Pages, DriveFiles } from '../../../../models';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import { Not } from 'typeorm';
 
 export const meta = {
diff --git a/src/server/api/endpoints/pinned-users.ts b/src/server/api/endpoints/pinned-users.ts
index a129a56d87e27b7172f2b6376f249e53849c0da4..ae165ab46dcbb3cea863249fd6d89f019416ce7a 100644
--- a/src/server/api/endpoints/pinned-users.ts
+++ b/src/server/api/endpoints/pinned-users.ts
@@ -1,7 +1,7 @@
 import define from '../define';
 import { Users } from '../../../models';
-import { fetchMeta } from '../../../misc/fetch-meta';
-import parseAcct from '../../../misc/acct/parse';
+import { fetchMeta } from '@/misc/fetch-meta';
+import parseAcct from '@/misc/acct/parse';
 import { User } from '../../../models/entities/user';
 
 export const meta = {
diff --git a/src/server/api/endpoints/promo/read.ts b/src/server/api/endpoints/promo/read.ts
index 63c90e5d7f7ff4fe88f82d22d07889997c8363e8..325a96e57212e2237d70807638f3e7994a94df27 100644
--- a/src/server/api/endpoints/promo/read.ts
+++ b/src/server/api/endpoints/promo/read.ts
@@ -1,10 +1,10 @@
 import $ from 'cafy';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../define';
 import { ApiError } from '../../error';
 import { getNote } from '../../common/getters';
 import { PromoReads } from '../../../../models';
-import { genId } from '../../../../misc/gen-id';
+import { genId } from '@/misc/gen-id';
 
 export const meta = {
 	desc: {
diff --git a/src/server/api/endpoints/room/show.ts b/src/server/api/endpoints/room/show.ts
index a12d9b8f2670a5439f7dc049a3c7f66d07578362..13f9df19acf0ce84591ca2290322402e1b11b630 100644
--- a/src/server/api/endpoints/room/show.ts
+++ b/src/server/api/endpoints/room/show.ts
@@ -2,8 +2,8 @@ import $ from 'cafy';
 import define from '../../define';
 import { ApiError } from '../../error';
 import { Users, UserProfiles } from '../../../../models';
-import { ID } from '../../../../misc/cafy-id';
-import { toPunyNullable } from '../../../../misc/convert-host';
+import { ID } from '@/misc/cafy-id';
+import { toPunyNullable } from '@/misc/convert-host';
 
 export const meta = {
 	desc: {
diff --git a/src/server/api/endpoints/sw/register.ts b/src/server/api/endpoints/sw/register.ts
index 9fc70b56094625dc0ba172f180dea7790b8e57af..43d4118df67fadb722bf680b8f1c02fdf47976db 100644
--- a/src/server/api/endpoints/sw/register.ts
+++ b/src/server/api/endpoints/sw/register.ts
@@ -1,7 +1,7 @@
 import $ from 'cafy';
 import define from '../../define';
-import { fetchMeta } from '../../../../misc/fetch-meta';
-import { genId } from '../../../../misc/gen-id';
+import { fetchMeta } from '@/misc/fetch-meta';
+import { genId } from '@/misc/gen-id';
 import { SwSubscriptions } from '../../../../models';
 
 export const meta = {
diff --git a/src/server/api/endpoints/users/clips.ts b/src/server/api/endpoints/users/clips.ts
index 72aae7252c364d79fa76e59bf10783f0fc4047a4..12aa964034ef3ea8efa2db2c6b8d3c55c2d63cc1 100644
--- a/src/server/api/endpoints/users/clips.ts
+++ b/src/server/api/endpoints/users/clips.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../define';
 import { Clips } from '../../../../models';
 import { makePaginationQuery } from '../../common/make-pagination-query';
diff --git a/src/server/api/endpoints/users/followers.ts b/src/server/api/endpoints/users/followers.ts
index fb83d7beb88c35ecfd9a36e4d7737013f731bb64..da8a1ea1b255b0c978cee7ab28b9aa233efbbb7f 100644
--- a/src/server/api/endpoints/users/followers.ts
+++ b/src/server/api/endpoints/users/followers.ts
@@ -1,10 +1,10 @@
 import $ from 'cafy';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../define';
 import { ApiError } from '../../error';
 import { Users, Followings } from '../../../../models';
 import { makePaginationQuery } from '../../common/make-pagination-query';
-import { toPunyNullable } from '../../../../misc/convert-host';
+import { toPunyNullable } from '@/misc/convert-host';
 
 export const meta = {
 	desc: {
diff --git a/src/server/api/endpoints/users/following.ts b/src/server/api/endpoints/users/following.ts
index d5e8dc1f920111c3faa58b3ece9e5482deca2060..832a51d29741a9f867d2462a2a63be7b90b9e144 100644
--- a/src/server/api/endpoints/users/following.ts
+++ b/src/server/api/endpoints/users/following.ts
@@ -1,10 +1,10 @@
 import $ from 'cafy';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../define';
 import { ApiError } from '../../error';
 import { Users, Followings } from '../../../../models';
 import { makePaginationQuery } from '../../common/make-pagination-query';
-import { toPunyNullable } from '../../../../misc/convert-host';
+import { toPunyNullable } from '@/misc/convert-host';
 
 export const meta = {
 	desc: {
diff --git a/src/server/api/endpoints/users/get-frequently-replied-users.ts b/src/server/api/endpoints/users/get-frequently-replied-users.ts
index d0650a172deff9483a5a62e24efa37d7e4a5ef5d..98b8a49fda4691b4c86d17aefb21e5c9cdde19ef 100644
--- a/src/server/api/endpoints/users/get-frequently-replied-users.ts
+++ b/src/server/api/endpoints/users/get-frequently-replied-users.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../define';
 import { maximum } from '../../../../prelude/array';
 import { ApiError } from '../../error';
diff --git a/src/server/api/endpoints/users/groups/create.ts b/src/server/api/endpoints/users/groups/create.ts
index 78d27148743775bf3203d2915c2697bff711af3a..0966ef7819a49d2552d467a64a33f13e82b93466 100644
--- a/src/server/api/endpoints/users/groups/create.ts
+++ b/src/server/api/endpoints/users/groups/create.ts
@@ -1,7 +1,7 @@
 import $ from 'cafy';
 import define from '../../../define';
 import { UserGroups, UserGroupJoinings } from '../../../../../models';
-import { genId } from '../../../../../misc/gen-id';
+import { genId } from '@/misc/gen-id';
 import { UserGroup } from '../../../../../models/entities/user-group';
 import { UserGroupJoining } from '../../../../../models/entities/user-group-joining';
 
@@ -31,12 +31,12 @@ export const meta = {
 };
 
 export default define(meta, async (ps, user) => {
-	const userGroup = await UserGroups.save({
+	const userGroup = await UserGroups.insert({
 		id: genId(),
 		createdAt: new Date(),
 		userId: user.id,
 		name: ps.name,
-	} as UserGroup);
+	} as UserGroup).then(x => UserGroups.findOneOrFail(x.identifiers[0]));
 
 	// Push the owner
 	await UserGroupJoinings.insert({
diff --git a/src/server/api/endpoints/users/groups/delete.ts b/src/server/api/endpoints/users/groups/delete.ts
index 71b882516925ffcc1296d8d9f0abeac0330eb1b5..85e2e73325f74deaa0a3b5713cccfd65970693f7 100644
--- a/src/server/api/endpoints/users/groups/delete.ts
+++ b/src/server/api/endpoints/users/groups/delete.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../../define';
 import { ApiError } from '../../../error';
 import { UserGroups } from '../../../../../models';
diff --git a/src/server/api/endpoints/users/groups/invitations/accept.ts b/src/server/api/endpoints/users/groups/invitations/accept.ts
index 2fa22bcf7e3758c232ac69c0aa6e4209d1541c8b..d6d419826eb3592309f3ac7dba7d09331243e400 100644
--- a/src/server/api/endpoints/users/groups/invitations/accept.ts
+++ b/src/server/api/endpoints/users/groups/invitations/accept.ts
@@ -1,9 +1,9 @@
 import $ from 'cafy';
-import { ID } from '../../../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../../../define';
 import { ApiError } from '../../../../error';
 import { UserGroupJoinings, UserGroupInvitations } from '../../../../../../models';
-import { genId } from '../../../../../../misc/gen-id';
+import { genId } from '@/misc/gen-id';
 import { UserGroupJoining } from '../../../../../../models/entities/user-group-joining';
 
 export const meta = {
diff --git a/src/server/api/endpoints/users/groups/invitations/reject.ts b/src/server/api/endpoints/users/groups/invitations/reject.ts
index 42803d37c75816cf33097bec55f699b3a6c503da..98dc7bfbdf497a4b4c3aed6a437acb2b8f487194 100644
--- a/src/server/api/endpoints/users/groups/invitations/reject.ts
+++ b/src/server/api/endpoints/users/groups/invitations/reject.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../../../define';
 import { ApiError } from '../../../../error';
 import { UserGroupInvitations } from '../../../../../../models';
diff --git a/src/server/api/endpoints/users/groups/invite.ts b/src/server/api/endpoints/users/groups/invite.ts
index a0f5091b076f6a13c996b3831c09b37f625f25db..00d4932f550bf5d36882eeb126a4e729e2732ea0 100644
--- a/src/server/api/endpoints/users/groups/invite.ts
+++ b/src/server/api/endpoints/users/groups/invite.ts
@@ -1,10 +1,10 @@
 import $ from 'cafy';
-import { ID } from '../../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../../define';
 import { ApiError } from '../../../error';
 import { getUser } from '../../../common/getters';
 import { UserGroups, UserGroupJoinings, UserGroupInvitations } from '../../../../../models';
-import { genId } from '../../../../../misc/gen-id';
+import { genId } from '@/misc/gen-id';
 import { UserGroupInvitation } from '../../../../../models/entities/user-group-invitation';
 import { createNotification } from '../../../../../services/create-notification';
 
@@ -96,12 +96,12 @@ export default define(meta, async (ps, me) => {
 		throw new ApiError(meta.errors.alreadyInvited);
 	}
 
-	const invitation = await UserGroupInvitations.save({
+	const invitation = await UserGroupInvitations.insert({
 		id: genId(),
 		createdAt: new Date(),
 		userId: user.id,
 		userGroupId: userGroup.id
-	} as UserGroupInvitation);
+	} as UserGroupInvitation).then(x => UserGroupInvitations.findOneOrFail(x.identifiers[0]));
 
 	// 通知を作成
 	createNotification(user.id, 'groupInvited', {
diff --git a/src/server/api/endpoints/users/groups/pull.ts b/src/server/api/endpoints/users/groups/pull.ts
index f4af884dd153c89337c0c4d379d454230fdb011d..82d45e31ad80d29593189df12a7849cd8e24ccbc 100644
--- a/src/server/api/endpoints/users/groups/pull.ts
+++ b/src/server/api/endpoints/users/groups/pull.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../../define';
 import { ApiError } from '../../../error';
 import { getUser } from '../../../common/getters';
diff --git a/src/server/api/endpoints/users/groups/show.ts b/src/server/api/endpoints/users/groups/show.ts
index 13f171f61416919fd192ece37920c1f5c8e6bfa7..c174a7973c923329d1f30c5cf7901db263969d8d 100644
--- a/src/server/api/endpoints/users/groups/show.ts
+++ b/src/server/api/endpoints/users/groups/show.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../../define';
 import { ApiError } from '../../../error';
 import { UserGroups, UserGroupJoinings } from '../../../../../models';
diff --git a/src/server/api/endpoints/users/groups/transfer.ts b/src/server/api/endpoints/users/groups/transfer.ts
index 03f5f39279daa286ef57a168c702b674a2aa1075..08aa1b7357e0af9b96f5d227ade2ce601fdb9c5b 100644
--- a/src/server/api/endpoints/users/groups/transfer.ts
+++ b/src/server/api/endpoints/users/groups/transfer.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../../define';
 import { ApiError } from '../../../error';
 import { getUser } from '../../../common/getters';
diff --git a/src/server/api/endpoints/users/groups/update.ts b/src/server/api/endpoints/users/groups/update.ts
index 805b2de6a8dafb4915ffef5f97ea4944207553b2..8dc5a7f1b97dd370eb9f616399314575cdb71b9f 100644
--- a/src/server/api/endpoints/users/groups/update.ts
+++ b/src/server/api/endpoints/users/groups/update.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../../define';
 import { ApiError } from '../../../error';
 import { UserGroups } from '../../../../../models';
diff --git a/src/server/api/endpoints/users/lists/create.ts b/src/server/api/endpoints/users/lists/create.ts
index d02696aed418e7aad74c884e97a7effac19feef0..9891a6dae0772104386d7012ebac780e89b6b9cb 100644
--- a/src/server/api/endpoints/users/lists/create.ts
+++ b/src/server/api/endpoints/users/lists/create.ts
@@ -1,7 +1,7 @@
 import $ from 'cafy';
 import define from '../../../define';
 import { UserLists } from '../../../../../models';
-import { genId } from '../../../../../misc/gen-id';
+import { genId } from '@/misc/gen-id';
 import { UserList } from '../../../../../models/entities/user-list';
 
 export const meta = {
@@ -30,12 +30,12 @@ export const meta = {
 };
 
 export default define(meta, async (ps, user) => {
-	const userList = await UserLists.save({
+	const userList = await UserLists.insert({
 		id: genId(),
 		createdAt: new Date(),
 		userId: user.id,
 		name: ps.name,
-	} as UserList);
+	} as UserList).then(x => UserLists.findOneOrFail(x.identifiers[0]));
 
 	return await UserLists.pack(userList);
 });
diff --git a/src/server/api/endpoints/users/lists/delete.ts b/src/server/api/endpoints/users/lists/delete.ts
index 930af1827f152398a396d1e5eef76c3f0ffa857d..d3132025c5fe353de1df7a762ce51af96bbb3109 100644
--- a/src/server/api/endpoints/users/lists/delete.ts
+++ b/src/server/api/endpoints/users/lists/delete.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../../define';
 import { ApiError } from '../../../error';
 import { UserLists } from '../../../../../models';
diff --git a/src/server/api/endpoints/users/lists/pull.ts b/src/server/api/endpoints/users/lists/pull.ts
index 1a5be2afc4b5e93c687639c5cfc6f049d113dd57..ddf5864a39846df63a5443851dc3d11266e0f763 100644
--- a/src/server/api/endpoints/users/lists/pull.ts
+++ b/src/server/api/endpoints/users/lists/pull.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import { publishUserListStream } from '../../../../../services/stream';
 import define from '../../../define';
 import { ApiError } from '../../../error';
diff --git a/src/server/api/endpoints/users/lists/push.ts b/src/server/api/endpoints/users/lists/push.ts
index fd76cb8159840c24b70b8ca5f113a648923fdc5f..c94c759d0c3ca9d93c348ecff496a116fcba9c6c 100644
--- a/src/server/api/endpoints/users/lists/push.ts
+++ b/src/server/api/endpoints/users/lists/push.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../../define';
 import { ApiError } from '../../../error';
 import { getUser } from '../../../common/getters';
diff --git a/src/server/api/endpoints/users/lists/show.ts b/src/server/api/endpoints/users/lists/show.ts
index 5d80a8f472163eadeaed706026a4093345ed6bde..aee1c13dee8db846eed12062fc30e4b53bb8c8cf 100644
--- a/src/server/api/endpoints/users/lists/show.ts
+++ b/src/server/api/endpoints/users/lists/show.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../../define';
 import { ApiError } from '../../../error';
 import { UserLists } from '../../../../../models';
diff --git a/src/server/api/endpoints/users/lists/update.ts b/src/server/api/endpoints/users/lists/update.ts
index 3ced871ae83a8be8537da2c1bf12d365f22706ef..342791e5f3bc8eca9f340c4659a28831b6bf935d 100644
--- a/src/server/api/endpoints/users/lists/update.ts
+++ b/src/server/api/endpoints/users/lists/update.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../../define';
 import { ApiError } from '../../../error';
 import { UserLists } from '../../../../../models';
diff --git a/src/server/api/endpoints/users/notes.ts b/src/server/api/endpoints/users/notes.ts
index fc5998c378b3376f92b93dd45690a048b1b357e4..b886756c025b0a254611969ef0be60f7de2c491f 100644
--- a/src/server/api/endpoints/users/notes.ts
+++ b/src/server/api/endpoints/users/notes.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../define';
 import { ApiError } from '../../error';
 import { getUser } from '../../common/getters';
diff --git a/src/server/api/endpoints/users/pages.ts b/src/server/api/endpoints/users/pages.ts
index 706a2e115b0ea5272aa87401273a7f6f1506701a..b9f37f32109645f84ceb92660b9379c4d781bcd0 100644
--- a/src/server/api/endpoints/users/pages.ts
+++ b/src/server/api/endpoints/users/pages.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../define';
 import { Pages } from '../../../../models';
 import { makePaginationQuery } from '../../common/make-pagination-query';
diff --git a/src/server/api/endpoints/users/relation.ts b/src/server/api/endpoints/users/relation.ts
index 1beb925398446b0f87d10c721337db1e204f5709..fc294eb64dc2a4bdf340c74ffa698ac4889afab7 100644
--- a/src/server/api/endpoints/users/relation.ts
+++ b/src/server/api/endpoints/users/relation.ts
@@ -1,6 +1,6 @@
 import $ from 'cafy';
 import define from '../../define';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import { Users } from '../../../../models';
 
 export const meta = {
diff --git a/src/server/api/endpoints/users/report-abuse.ts b/src/server/api/endpoints/users/report-abuse.ts
index eaa4cd62587d90102272ad4e9713c7e9ffe429d4..671eca02986a326967152fe129356f3b8d18b156 100644
--- a/src/server/api/endpoints/users/report-abuse.ts
+++ b/src/server/api/endpoints/users/report-abuse.ts
@@ -1,11 +1,11 @@
 import $ from 'cafy';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import define from '../../define';
 import { publishAdminStream } from '../../../../services/stream';
 import { ApiError } from '../../error';
 import { getUser } from '../../common/getters';
 import { AbuseUserReports, Users } from '../../../../models';
-import { genId } from '../../../../misc/gen-id';
+import { genId } from '@/misc/gen-id';
 
 export const meta = {
 	desc: {
diff --git a/src/server/api/endpoints/users/show.ts b/src/server/api/endpoints/users/show.ts
index 9e0771a55a4a693d64ff4ac303523b9daaa0f394..11d36d2ae98a8801364562308c34474adbac5f07 100644
--- a/src/server/api/endpoints/users/show.ts
+++ b/src/server/api/endpoints/users/show.ts
@@ -3,9 +3,10 @@ import { resolveUser } from '../../../../remote/resolve-user';
 import define from '../../define';
 import { apiLogger } from '../../logger';
 import { ApiError } from '../../error';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import { Users } from '../../../../models';
 import { In } from 'typeorm';
+import { User } from '@/models/entities/user';
 
 export const meta = {
 	desc: {
@@ -81,9 +82,9 @@ export default define(meta, async (ps, me) => {
 		});
 
 		// リクエストされた通りに並べ替え
-		const _users = [];
+		const _users: User[] = [];
 		for (const id of ps.userIds) {
-			_users.push(users.find(x => x.id === id));
+			_users.push(users.find(x => x.id === id)!);
 		}
 
 		return await Promise.all(_users.map(u => Users.pack(u, me, {
diff --git a/src/server/api/endpoints/users/stats.ts b/src/server/api/endpoints/users/stats.ts
index 50730e7cd0ae16735bfd7ad1b078c0be03c55542..6763c1774e0350fc3a84017915274fac107d6026 100644
--- a/src/server/api/endpoints/users/stats.ts
+++ b/src/server/api/endpoints/users/stats.ts
@@ -1,7 +1,7 @@
 import $ from 'cafy';
 import define from '../../define';
 import { ApiError } from '../../error';
-import { ID } from '../../../../misc/cafy-id';
+import { ID } from '@/misc/cafy-id';
 import { DriveFiles, Followings, NoteFavorites, NoteReactions, Notes, PageLikes, PollVotes, ReversiGames, Users } from '../../../../models';
 
 export const meta = {
diff --git a/src/server/api/limiter.ts b/src/server/api/limiter.ts
index 48d12d3cc60397164eaf695487b8974c93e609b7..1e8715a7c45ab9ffce7420409057e28d8e692197 100644
--- a/src/server/api/limiter.ts
+++ b/src/server/api/limiter.ts
@@ -1,13 +1,13 @@
 import * as Limiter from 'ratelimiter';
-import limiterDB from '../../db/redis';
+import { redisClient } from '../../db/redis';
 import { IEndpoint } from './endpoints';
-import getAcct from '../../misc/acct/render';
+import getAcct from '@/misc/acct/render';
 import { User } from '../../models/entities/user';
 import Logger from '../../services/logger';
 
 const logger = new Logger('limiter');
 
-export default (endpoint: IEndpoint, user: User) => new Promise((ok, reject) => {
+export default (endpoint: IEndpoint, user: User) => new Promise<void>((ok, reject) => {
 	const limitation = endpoint.meta.limit!;
 
 	const key = limitation.hasOwnProperty('key')
@@ -35,7 +35,7 @@ export default (endpoint: IEndpoint, user: User) => new Promise((ok, reject) =>
 			id: `${user.id}:${key}:min`,
 			duration: limitation.minInterval,
 			max: 1,
-			db: limiterDB!
+			db: redisClient
 		});
 
 		minIntervalLimiter.get((err, info) => {
@@ -63,7 +63,7 @@ export default (endpoint: IEndpoint, user: User) => new Promise((ok, reject) =>
 			id: `${user.id}:${key}`,
 			duration: limitation.duration,
 			max: limitation.max,
-			db: limiterDB!
+			db: redisClient
 		});
 
 		limiter.get((err, info) => {
diff --git a/src/server/api/openapi/description.ts b/src/server/api/openapi/description.ts
index e0527dd1aead81d2858ec333e522fa7c633c51fa..6306920b7ad5359e44624b9f28f2449e80f28b0f 100644
--- a/src/server/api/openapi/description.ts
+++ b/src/server/api/openapi/description.ts
@@ -1,6 +1,6 @@
 import endpoints from '../endpoints';
 import * as locale from '../../../../locales/';
-import { kinds as kindsList } from '../../../misc/api-permissions';
+import { kinds as kindsList } from '@/misc/api-permissions';
 
 export interface IKindInfo {
 	endpoints: string[];
diff --git a/src/server/api/openapi/gen-spec.ts b/src/server/api/openapi/gen-spec.ts
index 5185696675d293ec2a57b648c5e9f37753c62db4..221e0a32df63c94b5e070b06a8a8afd2707969db 100644
--- a/src/server/api/openapi/gen-spec.ts
+++ b/src/server/api/openapi/gen-spec.ts
@@ -1,6 +1,6 @@
 import endpoints from '../endpoints';
 import { Context } from 'cafy';
-import config from '../../../config';
+import config from '@/config';
 import { errors as basicErrors } from './errors';
 import { schemas, convertSchemaToOpenApiSchema } from './schemas';
 import { getDescription } from './description';
diff --git a/src/server/api/openapi/schemas.ts b/src/server/api/openapi/schemas.ts
index 99107c986e86bf815b6fbd032dc9cbecf1fff9a7..78aae3b99927a14f5a954ab5d477bf0e74af8e80 100644
--- a/src/server/api/openapi/schemas.ts
+++ b/src/server/api/openapi/schemas.ts
@@ -1,5 +1,5 @@
 import { packedUserSchema } from '../../../models/repositories/user';
-import { Schema } from '../../../misc/schema';
+import { Schema } from '@/misc/schema';
 import { packedNoteSchema } from '../../../models/repositories/note';
 import { packedUserListSchema } from '../../../models/repositories/user-list';
 import { packedAppSchema } from '../../../models/repositories/app';
diff --git a/src/server/api/private/signin.ts b/src/server/api/private/signin.ts
index d8f2e6d5168414c0eb367625f5316f8c70591c3e..0a17b0bd02820d92c5ef4286460ac964478799d2 100644
--- a/src/server/api/private/signin.ts
+++ b/src/server/api/private/signin.ts
@@ -2,10 +2,10 @@ import * as Koa from 'koa';
 import * as bcrypt from 'bcryptjs';
 import * as speakeasy from 'speakeasy';
 import signin from '../common/signin';
-import config from '../../../config';
+import config from '@/config';
 import { Users, Signins, UserProfiles, UserSecurityKeys, AttestationChallenges } from '../../../models';
 import { ILocalUser } from '../../../models/entities/user';
-import { genId } from '../../../misc/gen-id';
+import { genId } from '@/misc/gen-id';
 import { verifyLogin, hash } from '../2fa';
 import { randomBytes } from 'crypto';
 
diff --git a/src/server/api/private/signup.ts b/src/server/api/private/signup.ts
index 3d467a0e687504ada3a52c24bcf1092269fb4583..f0cf75797a980d1e5d6bb233cc4025659b973237 100644
--- a/src/server/api/private/signup.ts
+++ b/src/server/api/private/signup.ts
@@ -1,6 +1,6 @@
 import * as Koa from 'koa';
-import { fetchMeta } from '../../../misc/fetch-meta';
-import { verifyHcaptcha, verifyRecaptcha } from '../../../misc/captcha';
+import { fetchMeta } from '@/misc/fetch-meta';
+import { verifyHcaptcha, verifyRecaptcha } from '@/misc/captcha';
 import { Users, RegistrationTickets } from '../../../models';
 import { signup } from '../common/signup';
 
diff --git a/src/server/api/service/discord.ts b/src/server/api/service/discord.ts
index fce840cde5e3e7ac3d694947bd622c59bdce5940..a684e71fc60f77b994446792595e9f68008500cf 100644
--- a/src/server/api/service/discord.ts
+++ b/src/server/api/service/discord.ts
@@ -1,13 +1,13 @@
 import * as Koa from 'koa';
 import * as Router from '@koa/router';
-import { getJson } from '../../../misc/fetch';
+import { getJson } from '@/misc/fetch';
 import { OAuth2 } from 'oauth';
-import config from '../../../config';
+import config from '@/config';
 import { publishMainStream } from '../../../services/stream';
-import redis from '../../../db/redis';
+import { redisClient } from '../../../db/redis';
 import { v4 as uuid } from 'uuid';
 import signin from '../common/signin';
-import { fetchMeta } from '../../../misc/fetch-meta';
+import { fetchMeta } from '@/misc/fetch-meta';
 import { Users, UserProfiles } from '../../../models';
 import { ILocalUser } from '../../../models/entities/user';
 
@@ -96,7 +96,7 @@ router.get('/connect/discord', async ctx => {
 		response_type: 'code'
 	};
 
-	redis.set(userToken, JSON.stringify(params));
+	redisClient.set(userToken, JSON.stringify(params));
 
 	const oauth2 = await getOAuth2();
 	ctx.redirect(oauth2!.getAuthorizeUrl(params));
@@ -118,7 +118,7 @@ router.get('/signin/discord', async ctx => {
 		httpOnly: true
 	});
 
-	redis.set(sessid, JSON.stringify(params));
+	redisClient.set(sessid, JSON.stringify(params));
 
 	const oauth2 = await getOAuth2();
 	ctx.redirect(oauth2!.getAuthorizeUrl(params));
@@ -145,7 +145,7 @@ router.get('/dc/cb', async ctx => {
 		}
 
 		const { redirect_uri, state } = await new Promise<any>((res, rej) => {
-			redis.get(sessid, async (_, state) => {
+			redisClient.get(sessid, async (_, state) => {
 				res(JSON.parse(state));
 			});
 		});
@@ -216,7 +216,7 @@ router.get('/dc/cb', async ctx => {
 		}
 
 		const { redirect_uri, state } = await new Promise<any>((res, rej) => {
-			redis.get(userToken, async (_, state) => {
+			redisClient.get(userToken, async (_, state) => {
 				res(JSON.parse(state));
 			});
 		});
diff --git a/src/server/api/service/github.ts b/src/server/api/service/github.ts
index 2b10fa02a0364abdd1b46eee7f92862098dc34fb..12435b7e81247bb0a4bf2248bb20998325457abd 100644
--- a/src/server/api/service/github.ts
+++ b/src/server/api/service/github.ts
@@ -1,13 +1,13 @@
 import * as Koa from 'koa';
 import * as Router from '@koa/router';
-import { getJson } from '../../../misc/fetch';
+import { getJson } from '@/misc/fetch';
 import { OAuth2 } from 'oauth';
-import config from '../../../config';
+import config from '@/config';
 import { publishMainStream } from '../../../services/stream';
-import redis from '../../../db/redis';
+import { redisClient } from '../../../db/redis';
 import { v4 as uuid } from 'uuid';
 import signin from '../common/signin';
-import { fetchMeta } from '../../../misc/fetch-meta';
+import { fetchMeta } from '@/misc/fetch-meta';
 import { Users, UserProfiles } from '../../../models';
 import { ILocalUser } from '../../../models/entities/user';
 
@@ -95,7 +95,7 @@ router.get('/connect/github', async ctx => {
 		state: uuid()
 	};
 
-	redis.set(userToken, JSON.stringify(params));
+	redisClient.set(userToken, JSON.stringify(params));
 
 	const oauth2 = await getOath2();
 	ctx.redirect(oauth2!.getAuthorizeUrl(params));
@@ -116,7 +116,7 @@ router.get('/signin/github', async ctx => {
 		httpOnly: true
 	});
 
-	redis.set(sessid, JSON.stringify(params));
+	redisClient.set(sessid, JSON.stringify(params));
 
 	const oauth2 = await getOath2();
 	ctx.redirect(oauth2!.getAuthorizeUrl(params));
@@ -143,7 +143,7 @@ router.get('/gh/cb', async ctx => {
 		}
 
 		const { redirect_uri, state } = await new Promise<any>((res, rej) => {
-			redis.get(sessid, async (_, state) => {
+			redisClient.get(sessid, async (_, state) => {
 				res(JSON.parse(state));
 			});
 		});
@@ -194,7 +194,7 @@ router.get('/gh/cb', async ctx => {
 		}
 
 		const { redirect_uri, state } = await new Promise<any>((res, rej) => {
-			redis.get(userToken, async (_, state) => {
+			redisClient.get(userToken, async (_, state) => {
 				res(JSON.parse(state));
 			});
 		});
diff --git a/src/server/api/service/twitter.ts b/src/server/api/service/twitter.ts
index 97e9d3a7fcf19ec4f0b25809384f4cfc14b05701..8520a5656f9fb384451da9704242c4d6e08efdb0 100644
--- a/src/server/api/service/twitter.ts
+++ b/src/server/api/service/twitter.ts
@@ -2,11 +2,11 @@ import * as Koa from 'koa';
 import * as Router from '@koa/router';
 import { v4 as uuid } from 'uuid';
 import autwh from 'autwh';
-import redis from '../../../db/redis';
+import { redisClient } from '../../../db/redis';
 import { publishMainStream } from '../../../services/stream';
-import config from '../../../config';
+import config from '@/config';
 import signin from '../common/signin';
-import { fetchMeta } from '../../../misc/fetch-meta';
+import { fetchMeta } from '@/misc/fetch-meta';
 import { Users, UserProfiles } from '../../../models';
 import { ILocalUser } from '../../../models/entities/user';
 
@@ -89,7 +89,7 @@ router.get('/connect/twitter', async ctx => {
 
 	const twAuth = await getTwAuth();
 	const twCtx = await twAuth!.begin();
-	redis.set(userToken, JSON.stringify(twCtx));
+	redisClient.set(userToken, JSON.stringify(twCtx));
 	ctx.redirect(twCtx.url);
 });
 
@@ -99,7 +99,7 @@ router.get('/signin/twitter', async ctx => {
 
 	const sessid = uuid();
 
-	redis.set(sessid, JSON.stringify(twCtx));
+	redisClient.set(sessid, JSON.stringify(twCtx));
 
 	ctx.cookies.set('signin_with_twitter_sid', sessid, {
 		path: '/',
@@ -124,7 +124,7 @@ router.get('/tw/cb', async ctx => {
 		}
 
 		const get = new Promise<any>((res, rej) => {
-			redis.get(sessid, async (_, twCtx) => {
+			redisClient.get(sessid, async (_, twCtx) => {
 				res(twCtx);
 			});
 		});
@@ -153,7 +153,7 @@ router.get('/tw/cb', async ctx => {
 		}
 
 		const get = new Promise<any>((res, rej) => {
-			redis.get(userToken, async (_, twCtx) => {
+			redisClient.get(userToken, async (_, twCtx) => {
 				res(twCtx);
 			});
 		});
diff --git a/src/server/api/stream/channels/antenna.ts b/src/server/api/stream/channels/antenna.ts
index 36a474f2aca7b438a6fdc2ee701d69d6baf93339..d93143f4d8974b5c53943e6c86295c2273fcc6c1 100644
--- a/src/server/api/stream/channels/antenna.ts
+++ b/src/server/api/stream/channels/antenna.ts
@@ -1,7 +1,7 @@
 import autobind from 'autobind-decorator';
 import Channel from '../channel';
 import { Notes } from '../../../../models';
-import { isMutedUserRelated } from '../../../../misc/is-muted-user-related';
+import { isMutedUserRelated } from '@/misc/is-muted-user-related';
 
 export default class extends Channel {
 	public readonly chName = 'antenna';
diff --git a/src/server/api/stream/channels/channel.ts b/src/server/api/stream/channels/channel.ts
index 47a52465b29f935707e58557fa9976d7d963a70d..6af2d80e0ccde5ebb5260e23c3059d5427f0a50c 100644
--- a/src/server/api/stream/channels/channel.ts
+++ b/src/server/api/stream/channels/channel.ts
@@ -1,7 +1,7 @@
 import autobind from 'autobind-decorator';
 import Channel from '../channel';
 import { Notes, Users } from '../../../../models';
-import { isMutedUserRelated } from '../../../../misc/is-muted-user-related';
+import { isMutedUserRelated } from '@/misc/is-muted-user-related';
 import { PackedNote } from '../../../../models/repositories/note';
 import { User } from '../../../../models/entities/user';
 
diff --git a/src/server/api/stream/channels/games/reversi.ts b/src/server/api/stream/channels/games/reversi.ts
index 3db338386ab06cad35a18235e119f8c4bb1bd32e..e0e41d9acdb4afec074335341cf0e5e738a148ca 100644
--- a/src/server/api/stream/channels/games/reversi.ts
+++ b/src/server/api/stream/channels/games/reversi.ts
@@ -26,7 +26,7 @@ export default class extends Channel {
 					childId: body.id
 				});
 				if (matching == null) return;
-				publishMainStream(matching.childId, 'reversiInvited', await ReversiMatchings.pack(matching, matching.childId));
+				publishMainStream(matching.childId, 'reversiInvited', await ReversiMatchings.pack(matching, { id: matching.childId }));
 				break;
 		}
 	}
diff --git a/src/server/api/stream/channels/global-timeline.ts b/src/server/api/stream/channels/global-timeline.ts
index 8353f45323a7f08f025cd7a53e7ccb9e22540492..c59eb377795b248cb19f6eb9d5e6f9deb72f48ab 100644
--- a/src/server/api/stream/channels/global-timeline.ts
+++ b/src/server/api/stream/channels/global-timeline.ts
@@ -1,10 +1,10 @@
 import autobind from 'autobind-decorator';
-import { isMutedUserRelated } from '../../../../misc/is-muted-user-related';
+import { isMutedUserRelated } from '@/misc/is-muted-user-related';
 import Channel from '../channel';
-import { fetchMeta } from '../../../../misc/fetch-meta';
+import { fetchMeta } from '@/misc/fetch-meta';
 import { Notes } from '../../../../models';
 import { PackedNote } from '../../../../models/repositories/note';
-import { checkWordMute } from '../../../../misc/check-word-mute';
+import { checkWordMute } from '@/misc/check-word-mute';
 
 export default class extends Channel {
 	public readonly chName = 'globalTimeline';
@@ -42,8 +42,9 @@ export default class extends Channel {
 
 		// 関係ない返信は除外
 		if (note.reply) {
+			const reply = note.reply as PackedNote;
 			// 「チャンネル接続主への返信」でもなければ、「チャンネル接続主が行った返信」でもなければ、「投稿者の投稿者自身への返信」でもない場合
-			if (note.reply.userId !== this.user!.id && note.userId !== this.user!.id && note.reply.userId !== note.userId) return;
+			if (reply.userId !== this.user!.id && note.userId !== this.user!.id && reply.userId !== note.userId) return;
 		}
 
 		// 流れてきたNoteがミュートしているユーザーが関わるものだったら無視する
diff --git a/src/server/api/stream/channels/hashtag.ts b/src/server/api/stream/channels/hashtag.ts
index 1b7f8efcc1ca56169277914c922ae2efd67bac41..b662af072316875548722a50b985119513d92c54 100644
--- a/src/server/api/stream/channels/hashtag.ts
+++ b/src/server/api/stream/channels/hashtag.ts
@@ -1,9 +1,9 @@
 import autobind from 'autobind-decorator';
-import { isMutedUserRelated } from '../../../../misc/is-muted-user-related';
+import { isMutedUserRelated } from '@/misc/is-muted-user-related';
 import Channel from '../channel';
 import { Notes } from '../../../../models';
 import { PackedNote } from '../../../../models/repositories/note';
-import { normalizeForSearch } from '../../../../misc/normalize-for-search';
+import { normalizeForSearch } from '@/misc/normalize-for-search';
 
 export default class extends Channel {
 	public readonly chName = 'hashtag';
diff --git a/src/server/api/stream/channels/home-timeline.ts b/src/server/api/stream/channels/home-timeline.ts
index 59ba31c3167651ef08516f4dd726b69ef807d0d1..b1091a46e17c0327f2c46d2d194783883d36a23f 100644
--- a/src/server/api/stream/channels/home-timeline.ts
+++ b/src/server/api/stream/channels/home-timeline.ts
@@ -1,9 +1,9 @@
 import autobind from 'autobind-decorator';
-import { isMutedUserRelated } from '../../../../misc/is-muted-user-related';
+import { isMutedUserRelated } from '@/misc/is-muted-user-related';
 import Channel from '../channel';
 import { Notes } from '../../../../models';
 import { PackedNote } from '../../../../models/repositories/note';
-import { checkWordMute } from '../../../../misc/check-word-mute';
+import { checkWordMute } from '@/misc/check-word-mute';
 
 export default class extends Channel {
 	public readonly chName = 'homeTimeline';
@@ -50,8 +50,9 @@ export default class extends Channel {
 
 		// 関係ない返信は除外
 		if (note.reply) {
+			const reply = note.reply as PackedNote;
 			// 「チャンネル接続主への返信」でもなければ、「チャンネル接続主が行った返信」でもなければ、「投稿者の投稿者自身への返信」でもない場合
-			if (note.reply.userId !== this.user!.id && note.userId !== this.user!.id && note.reply.userId !== note.userId) return;
+			if (reply.userId !== this.user!.id && note.userId !== this.user!.id && reply.userId !== note.userId) return;
 		}
 
 		// 流れてきたNoteがミュートしているユーザーが関わるものだったら無視する
diff --git a/src/server/api/stream/channels/hybrid-timeline.ts b/src/server/api/stream/channels/hybrid-timeline.ts
index 9715e9973f98e8c3773875e6e3ab8669f0a2964f..d769a24373dcba047ad6d75555e84f481745db9a 100644
--- a/src/server/api/stream/channels/hybrid-timeline.ts
+++ b/src/server/api/stream/channels/hybrid-timeline.ts
@@ -1,11 +1,11 @@
 import autobind from 'autobind-decorator';
-import { isMutedUserRelated } from '../../../../misc/is-muted-user-related';
+import { isMutedUserRelated } from '@/misc/is-muted-user-related';
 import Channel from '../channel';
-import { fetchMeta } from '../../../../misc/fetch-meta';
+import { fetchMeta } from '@/misc/fetch-meta';
 import { Notes } from '../../../../models';
 import { PackedNote } from '../../../../models/repositories/note';
 import { PackedUser } from '../../../../models/repositories/user';
-import { checkWordMute } from '../../../../misc/check-word-mute';
+import { checkWordMute } from '@/misc/check-word-mute';
 
 export default class extends Channel {
 	public readonly chName = 'hybridTimeline';
@@ -59,8 +59,9 @@ export default class extends Channel {
 
 		// 関係ない返信は除外
 		if (note.reply) {
+			const reply = note.reply as PackedNote;
 			// 「チャンネル接続主への返信」でもなければ、「チャンネル接続主が行った返信」でもなければ、「投稿者の投稿者自身への返信」でもない場合
-			if (note.reply.userId !== this.user!.id && note.userId !== this.user!.id && note.reply.userId !== note.userId) return;
+			if (reply.userId !== this.user!.id && note.userId !== this.user!.id && reply.userId !== note.userId) return;
 		}
 
 		// 流れてきたNoteがミュートしているユーザーが関わるものだったら無視する
diff --git a/src/server/api/stream/channels/local-timeline.ts b/src/server/api/stream/channels/local-timeline.ts
index e159c72d60aa887c8d89edbd29e2ef5bec42ede3..aa0b6c4026c2272972906d9dc3b1526c43e0aaa5 100644
--- a/src/server/api/stream/channels/local-timeline.ts
+++ b/src/server/api/stream/channels/local-timeline.ts
@@ -1,11 +1,11 @@
 import autobind from 'autobind-decorator';
-import { isMutedUserRelated } from '../../../../misc/is-muted-user-related';
+import { isMutedUserRelated } from '@/misc/is-muted-user-related';
 import Channel from '../channel';
-import { fetchMeta } from '../../../../misc/fetch-meta';
+import { fetchMeta } from '@/misc/fetch-meta';
 import { Notes } from '../../../../models';
 import { PackedNote } from '../../../../models/repositories/note';
 import { PackedUser } from '../../../../models/repositories/user';
-import { checkWordMute } from '../../../../misc/check-word-mute';
+import { checkWordMute } from '@/misc/check-word-mute';
 
 export default class extends Channel {
 	public readonly chName = 'localTimeline';
@@ -44,8 +44,9 @@ export default class extends Channel {
 
 		// 関係ない返信は除外
 		if (note.reply) {
+			const reply = note.reply as PackedNote;
 			// 「チャンネル接続主への返信」でもなければ、「チャンネル接続主が行った返信」でもなければ、「投稿者の投稿者自身への返信」でもない場合
-			if (note.reply.userId !== this.user!.id && note.userId !== this.user!.id && note.reply.userId !== note.userId) return;
+			if (reply.userId !== this.user!.id && note.userId !== this.user!.id && reply.userId !== note.userId) return;
 		}
 
 		// 流れてきたNoteがミュートしているユーザーが関わるものだったら無視する
diff --git a/src/server/api/stream/channels/user-list.ts b/src/server/api/stream/channels/user-list.ts
index 4191a0de54997e92fe6d8c6c89f6323622eb29a4..da227f24ec6a6d09b7ce890dd9006dab2d945019 100644
--- a/src/server/api/stream/channels/user-list.ts
+++ b/src/server/api/stream/channels/user-list.ts
@@ -1,7 +1,7 @@
 import autobind from 'autobind-decorator';
 import Channel from '../channel';
 import { Notes, UserListJoinings, UserLists } from '../../../../models';
-import { isMutedUserRelated } from '../../../../misc/is-muted-user-related';
+import { isMutedUserRelated } from '@/misc/is-muted-user-related';
 import { User } from '../../../../models/entities/user';
 import { PackedNote } from '../../../../models/repositories/note';
 
diff --git a/src/server/api/stream/index.ts b/src/server/api/stream/index.ts
index 99ae558696c78ad67102f39f64d26cae7974fea3..647b890ff87272e16743d3c6f4c9914851ef1773 100644
--- a/src/server/api/stream/index.ts
+++ b/src/server/api/stream/index.ts
@@ -156,8 +156,8 @@ export default class Connection {
 		};
 
 		add(note);
-		if (note.reply) add(note.reply);
-		if (note.renote) add(note.renote);
+		if (note.reply) add(note.reply as PackedNote);
+		if (note.renote) add(note.renote as PackedNote);
 	}
 
 	@autobind
@@ -168,17 +168,10 @@ export default class Connection {
 		if (note == null) return;
 
 		if (this.user && (note.userId !== this.user.id)) {
-			if (note.mentions && note.mentions.includes(this.user.id)) {
-				readNote(this.user.id, [note]);
-			} else if (note.visibleUserIds && note.visibleUserIds.includes(this.user.id)) {
-				readNote(this.user.id, [note]);
-			}
-
-			if (this.followingChannels.has(note.channelId)) {
-				// TODO
-			}
-
-			// TODO: アンテナの既読処理
+			readNote(this.user.id, [note], {
+				following: this.following,
+				followingChannels: this.followingChannels,
+			});
 		}
 	}
 
diff --git a/src/server/api/streaming.ts b/src/server/api/streaming.ts
index 10f2a70bad67d98337f4f830fed51c0175ca17dc..81b83edcf546cd3c204983d1792ed5334a5608a2 100644
--- a/src/server/api/streaming.ts
+++ b/src/server/api/streaming.ts
@@ -1,12 +1,11 @@
 import * as http from 'http';
 import * as websocket from 'websocket';
-import * as redis from 'redis';
 
 import MainStreamConnection from './stream';
 import { ParsedUrlQuery } from 'querystring';
 import authenticate from './authenticate';
 import { EventEmitter } from 'events';
-import config from '../../config';
+import { subsdcriber as redisClient } from '../../db/redis';
 
 module.exports = (server: http.Server) => {
 	// Init websocket server
@@ -24,37 +23,21 @@ module.exports = (server: http.Server) => {
 
 		const connection = request.accept();
 
-		let ev: EventEmitter;
+		const ev = new EventEmitter();
 
-		// Connect to Redis
-		const subscriber = redis.createClient(
-			config.redis.port,
-			config.redis.host,
-			{
-				password: config.redis.pass
-			}
-		);
-
-		subscriber.subscribe(config.host);
-
-		ev = new EventEmitter();
-
-		subscriber.on('message', async (_, data) => {
-			const obj = JSON.parse(data);
+		async function onRedisMessage(_: string, data: string) {
+			const parsed = JSON.parse(data);
+			ev.emit(parsed.channel, parsed.message);
+		}
 
-			ev.emit(obj.channel, obj.message);
-		});
-
-		connection.once('close', () => {
-			subscriber.unsubscribe();
-			subscriber.quit();
-		});
+		redisClient.on('message', onRedisMessage);
 
 		const main = new MainStreamConnection(connection, ev, user, app);
 
 		connection.once('close', () => {
 			ev.removeAllListeners();
 			main.dispose();
+			redisClient.off('message', onRedisMessage);
 		});
 
 		connection.on('message', async (data) => {
diff --git a/src/server/file/send-drive-file.ts b/src/server/file/send-drive-file.ts
index 9dea2df8e774bcab833f739d83e3eb3f7a937fb4..9745b1201dc242863cd5bca911ae469fcb9542b0 100644
--- a/src/server/file/send-drive-file.ts
+++ b/src/server/file/send-drive-file.ts
@@ -4,11 +4,11 @@ import * as rename from 'rename';
 import * as tmp from 'tmp';
 import * as fs from 'fs';
 import { serverLogger } from '..';
-import { contentDisposition } from '../../misc/content-disposition';
+import { contentDisposition } from '@/misc/content-disposition';
 import { DriveFiles } from '../../models';
 import { InternalStorage } from '../../services/drive/internal-storage';
-import { downloadUrl } from '../../misc/download-url';
-import { detectType } from '../../misc/get-file-info';
+import { downloadUrl } from '@/misc/download-url';
+import { detectType } from '@/misc/get-file-info';
 import { convertToJpeg, convertToPngOrJpeg } from '../../services/drive/image-processor';
 import { GenerateVideoThumbnail } from '../../services/drive/generate-video-thumbnail';
 
diff --git a/src/server/index.ts b/src/server/index.ts
index 5a7bb99c63a2220b0445430f8da11d0c6183c3c5..3b43aa7674b58ed808084fe103c0e8ac5fc8b4fb 100644
--- a/src/server/index.ts
+++ b/src/server/index.ts
@@ -16,15 +16,15 @@ import * as slow from 'koa-slow';
 import activityPub from './activitypub';
 import nodeinfo from './nodeinfo';
 import wellKnown from './well-known';
-import config from '../config';
+import config from '@/config';
 import apiServer from './api';
 import { sum } from '../prelude/array';
 import Logger from '../services/logger';
 import { program } from '../argv';
 import { UserProfiles, Users } from '../models';
 import { networkChart } from '../services/chart';
-import { genAvatar } from '../misc/gen-avatar';
-import { createTemp } from '../misc/create-temp';
+import { genAvatar } from '@/misc/gen-avatar';
+import { createTemp } from '@/misc/create-temp';
 import { publishMainStream } from '../services/stream';
 
 export const serverLogger = new Logger('server', 'gray', false);
@@ -89,7 +89,7 @@ router.get('/verify-email/:code', async ctx => {
 			emailVerifyCode: null
 		});
 
-		publishMainStream(profile.userId, 'meUpdated', await Users.pack(profile.userId, profile.userId, {
+		publishMainStream(profile.userId, 'meUpdated', await Users.pack(profile.userId, { id: profile.userId }, {
 			detail: true,
 			includeSecrets: true
 		}));
diff --git a/src/server/nodeinfo.ts b/src/server/nodeinfo.ts
index 5c51137c92bd79e8f1e50c82c39cb5fd34bfd2d3..7a1d5b629267d9b5580dd62c312a0c8aad4daa99 100644
--- a/src/server/nodeinfo.ts
+++ b/src/server/nodeinfo.ts
@@ -1,6 +1,6 @@
 import * as Router from '@koa/router';
-import config from '../config';
-import { fetchMeta } from '../misc/fetch-meta';
+import config from '@/config';
+import { fetchMeta } from '@/misc/fetch-meta';
 import { Users } from '../models';
 // import User from '../models/user';
 // import Note from '../models/note';
diff --git a/src/server/proxy/proxy-media.ts b/src/server/proxy/proxy-media.ts
index 4373cc20f586546801456e9b560216de879625b1..f91df55624d250000bdd1487533bc3f75aa6c3c6 100644
--- a/src/server/proxy/proxy-media.ts
+++ b/src/server/proxy/proxy-media.ts
@@ -2,9 +2,9 @@ import * as fs from 'fs';
 import * as Koa from 'koa';
 import { serverLogger } from '..';
 import { IImage, convertToPng, convertToJpeg } from '../../services/drive/image-processor';
-import { createTemp } from '../../misc/create-temp';
-import { downloadUrl } from '../../misc/download-url';
-import { detectType } from '../../misc/get-file-info';
+import { createTemp } from '@/misc/create-temp';
+import { downloadUrl } from '@/misc/download-url';
+import { detectType } from '@/misc/get-file-info';
 
 export async function proxyMedia(ctx: Koa.Context) {
 	const url = 'url' in ctx.query ? ctx.query.url : 'https://' + ctx.params.url;
diff --git a/src/server/web/feed.ts b/src/server/web/feed.ts
index 6078fbe0f3592369db8fd22e48b062142c191517..d4792c63aa33693e447f5c2543da2c4aa6a62905 100644
--- a/src/server/web/feed.ts
+++ b/src/server/web/feed.ts
@@ -1,5 +1,5 @@
 import { Feed } from 'feed';
-import config from '../../config';
+import config from '@/config';
 import { User } from '../../models/entities/user';
 import { Notes, DriveFiles, UserProfiles } from '../../models';
 import { In } from 'typeorm';
diff --git a/src/server/web/index.ts b/src/server/web/index.ts
index ea356206ffd8f32b94b7f275bece648483ea6d7b..953f2b47f1733bdfcf8b84007fec4e2ababac7ba 100644
--- a/src/server/web/index.ts
+++ b/src/server/web/index.ts
@@ -14,14 +14,14 @@ import * as glob from 'glob';
 import * as MarkdownIt from 'markdown-it';
 
 import packFeed from './feed';
-import { fetchMeta } from '../../misc/fetch-meta';
+import { fetchMeta } from '@/misc/fetch-meta';
 import { genOpenapiSpec } from '../api/openapi/gen-spec';
-import config from '../../config';
+import config from '@/config';
 import { Users, Notes, Emojis, UserProfiles, Pages, Channels, Clips } from '../../models';
-import parseAcct from '../../misc/acct/parse';
-import { getNoteSummary } from '../../misc/get-note-summary';
+import parseAcct from '@/misc/acct/parse';
+import { getNoteSummary } from '@/misc/get-note-summary';
 import { getConnection } from 'typeorm';
-import redis from '../../db/redis';
+import { redisClient } from '../../db/redis';
 import locales = require('../../../locales');
 
 const markdown = MarkdownIt({
@@ -379,7 +379,7 @@ router.get('/info', async ctx => {
 		os: os.platform(),
 		node: process.version,
 		psql: await getConnection().query('SHOW server_version').then(x => x[0].server_version),
-		redis: redis.server_info.redis_version,
+		redis: redisClient.server_info.redis_version,
 		cpu: {
 			model: os.cpus()[0].model,
 			cores: os.cpus().length
diff --git a/assets/client/manifest.json b/src/server/web/manifest.json
similarity index 100%
rename from assets/client/manifest.json
rename to src/server/web/manifest.json
diff --git a/src/server/web/manifest.ts b/src/server/web/manifest.ts
index 2f3eb89030724d38cb095d55c71d9257ccae4a77..918fe27c03bf909c29cb5b1ffb21e2991800a35c 100644
--- a/src/server/web/manifest.ts
+++ b/src/server/web/manifest.ts
@@ -1,6 +1,6 @@
 import * as Koa from 'koa';
-import * as manifest from '../../../assets/client/manifest.json';
-import { fetchMeta } from '../../misc/fetch-meta';
+import * as manifest from './manifest.json';
+import { fetchMeta } from '@/misc/fetch-meta';
 
 module.exports = async (ctx: Koa.Context) => {
 	const json = JSON.parse(JSON.stringify(manifest));
diff --git a/src/server/web/url-preview.ts b/src/server/web/url-preview.ts
index 4dae6baafbe7e893ca133e7a64d05e699c6c519b..1ba8e0034aa9d405920568523e7bfce87b4f3d60 100644
--- a/src/server/web/url-preview.ts
+++ b/src/server/web/url-preview.ts
@@ -1,10 +1,10 @@
 import * as Koa from 'koa';
 import summaly from 'summaly';
-import { fetchMeta } from '../../misc/fetch-meta';
+import { fetchMeta } from '@/misc/fetch-meta';
 import Logger from '../../services/logger';
-import config from '../../config';
+import config from '@/config';
 import { query } from '../../prelude/url';
-import { getJson } from '../../misc/fetch';
+import { getJson } from '@/misc/fetch';
 
 const logger = new Logger('url-preview');
 
diff --git a/src/server/well-known.ts b/src/server/well-known.ts
index ff3c3462556bb8782945f407e9b1bc84e05c5fff..b1b6b2a771abed52ab43b0d0dcabf9ffbbae4bc4 100644
--- a/src/server/well-known.ts
+++ b/src/server/well-known.ts
@@ -1,8 +1,8 @@
 import * as Router from '@koa/router';
 
-import config from '../config';
-import parseAcct from '../misc/acct/parse';
-import Acct from '../misc/acct/type';
+import config from '@/config';
+import parseAcct from '@/misc/acct/parse';
+import Acct from '@/misc/acct/type';
 import { links } from './nodeinfo';
 import { escapeAttribute, escapeValue } from '../prelude/xml';
 import { Users } from '../models';
diff --git a/src/services/add-note-to-antenna.ts b/src/services/add-note-to-antenna.ts
index 3ba3d1eef5e7dd957b4d68377da950efd1093212..56d0149155e3f01d167505c0b482d210c6b33cab 100644
--- a/src/services/add-note-to-antenna.ts
+++ b/src/services/add-note-to-antenna.ts
@@ -1,12 +1,12 @@
 import { Antenna } from '../models/entities/antenna';
 import { Note } from '../models/entities/note';
 import { AntennaNotes, Mutings, Notes } from '../models';
-import { genId } from '../misc/gen-id';
-import { isMutedUserRelated } from '../misc/is-muted-user-related';
+import { genId } from '@/misc/gen-id';
+import { isMutedUserRelated } from '@/misc/is-muted-user-related';
 import { publishAntennaStream, publishMainStream } from './stream';
 import { User } from '../models/entities/user';
 
-export async function addNoteToAntenna(antenna: Antenna, note: Note, noteUser: User) {
+export async function addNoteToAntenna(antenna: Antenna, note: Note, noteUser: { id: User['id']; }) {
 	// 通知しない設定になっているか、自分自身の投稿なら既読にする
 	const read = !antenna.notify || (antenna.userId === noteUser.id);
 
diff --git a/src/services/blocking/create.ts b/src/services/blocking/create.ts
index dec48d26de6611b8086a036b7b720c7397938701..be2a62692b5b539a51177f349bf3248b078fd93c 100644
--- a/src/services/blocking/create.ts
+++ b/src/services/blocking/create.ts
@@ -8,7 +8,7 @@ import renderReject from '../../remote/activitypub/renderer/reject';
 import { User } from '../../models/entities/user';
 import { Blockings, Users, FollowRequests, Followings } from '../../models';
 import { perUserFollowingChart } from '../chart';
-import { genId } from '../../misc/gen-id';
+import { genId } from '@/misc/gen-id';
 
 export default async function(blocker: User, blockee: User) {
 	await Promise.all([
diff --git a/src/services/chart/charts/classes/active-users.ts b/src/services/chart/charts/classes/active-users.ts
index 4820f8281b5c802c42910e83c5a7bbb00c46f5a9..e732b25d24f33673dc5878b8ebbac34e5deb9f55 100644
--- a/src/services/chart/charts/classes/active-users.ts
+++ b/src/services/chart/charts/classes/active-users.ts
@@ -1,7 +1,7 @@
 import autobind from 'autobind-decorator';
 import Chart, { Obj, DeepPartial } from '../../core';
 import { User } from '../../../../models/entities/user';
-import { SchemaType } from '../../../../misc/schema';
+import { SchemaType } from '@/misc/schema';
 import { Users } from '../../../../models';
 import { name, schema } from '../schemas/active-users';
 
@@ -35,7 +35,7 @@ export default class ActiveUsersChart extends Chart<ActiveUsersLog> {
 	}
 
 	@autobind
-	public async update(user: User) {
+	public async update(user: { id: User['id'], host: User['host'] }) {
 		const update: Obj = {
 			users: [user.id]
 		};
diff --git a/src/services/chart/charts/classes/drive.ts b/src/services/chart/charts/classes/drive.ts
index 46399a34d8860cc231430f74e8fb69d4712e9026..18537918f05dd82df6c24123da6905c4e994896d 100644
--- a/src/services/chart/charts/classes/drive.ts
+++ b/src/services/chart/charts/classes/drive.ts
@@ -1,6 +1,6 @@
 import autobind from 'autobind-decorator';
 import Chart, { Obj, DeepPartial } from '../../core';
-import { SchemaType } from '../../../../misc/schema';
+import { SchemaType } from '@/misc/schema';
 import { DriveFiles } from '../../../../models';
 import { Not, IsNull } from 'typeorm';
 import { DriveFile } from '../../../../models/entities/drive-file';
diff --git a/src/services/chart/charts/classes/federation.ts b/src/services/chart/charts/classes/federation.ts
index ab6ec2d4ddd6c5db1215bff259472deb8493136e..e593a53cf17216b52cffc737744a0beac1a0cae2 100644
--- a/src/services/chart/charts/classes/federation.ts
+++ b/src/services/chart/charts/classes/federation.ts
@@ -1,6 +1,6 @@
 import autobind from 'autobind-decorator';
 import Chart, { Obj, DeepPartial } from '../../core';
-import { SchemaType } from '../../../../misc/schema';
+import { SchemaType } from '@/misc/schema';
 import { Instances } from '../../../../models';
 import { name, schema } from '../schemas/federation';
 
diff --git a/src/services/chart/charts/classes/hashtag.ts b/src/services/chart/charts/classes/hashtag.ts
index 43db5b0a8323942144edad5d0ff28b988d7a7d4a..98d5421c9be3b42db479d967c6d502ddfedb8da0 100644
--- a/src/services/chart/charts/classes/hashtag.ts
+++ b/src/services/chart/charts/classes/hashtag.ts
@@ -1,7 +1,7 @@
 import autobind from 'autobind-decorator';
 import Chart, { Obj, DeepPartial } from '../../core';
 import { User } from '../../../../models/entities/user';
-import { SchemaType } from '../../../../misc/schema';
+import { SchemaType } from '@/misc/schema';
 import { Users } from '../../../../models';
 import { name, schema } from '../schemas/hashtag';
 
@@ -35,7 +35,7 @@ export default class HashtagChart extends Chart<HashtagLog> {
 	}
 
 	@autobind
-	public async update(hashtag: string, user: User) {
+	public async update(hashtag: string, user: { id: User['id'], host: User['host'] }) {
 		const update: Obj = {
 			users: [user.id]
 		};
diff --git a/src/services/chart/charts/classes/instance.ts b/src/services/chart/charts/classes/instance.ts
index c32b864d87fe373557d458eaf803f4a511ad54f7..f93da58d6186dbdcc0f4b447b265b69977869bed 100644
--- a/src/services/chart/charts/classes/instance.ts
+++ b/src/services/chart/charts/classes/instance.ts
@@ -1,11 +1,11 @@
 import autobind from 'autobind-decorator';
 import Chart, { Obj, DeepPartial } from '../../core';
-import { SchemaType } from '../../../../misc/schema';
+import { SchemaType } from '@/misc/schema';
 import { DriveFiles, Followings, Users, Notes } from '../../../../models';
 import { DriveFile } from '../../../../models/entities/drive-file';
 import { name, schema } from '../schemas/instance';
 import { Note } from '../../../../models/entities/note';
-import { toPuny } from '../../../../misc/convert-host';
+import { toPuny } from '@/misc/convert-host';
 
 type InstanceLog = SchemaType<typeof schema>;
 
diff --git a/src/services/chart/charts/classes/network.ts b/src/services/chart/charts/classes/network.ts
index 693af48f735993de5c9769b0b8d28c7bae1ae0fe..2ce75e0b344b45ba0b509d39e4d439d59a8eb5ef 100644
--- a/src/services/chart/charts/classes/network.ts
+++ b/src/services/chart/charts/classes/network.ts
@@ -1,6 +1,6 @@
 import autobind from 'autobind-decorator';
 import Chart, { DeepPartial } from '../../core';
-import { SchemaType } from '../../../../misc/schema';
+import { SchemaType } from '@/misc/schema';
 import { name, schema } from '../schemas/network';
 
 type NetworkLog = SchemaType<typeof schema>;
diff --git a/src/services/chart/charts/classes/notes.ts b/src/services/chart/charts/classes/notes.ts
index 965087bc08b752e411ed083a96e226fba3b86daa..a6eb653b70f85a370ee30f37e5f58f91e72382e5 100644
--- a/src/services/chart/charts/classes/notes.ts
+++ b/src/services/chart/charts/classes/notes.ts
@@ -1,6 +1,6 @@
 import autobind from 'autobind-decorator';
 import Chart, { Obj, DeepPartial } from '../../core';
-import { SchemaType } from '../../../../misc/schema';
+import { SchemaType } from '@/misc/schema';
 import { Notes } from '../../../../models';
 import { Not, IsNull } from 'typeorm';
 import { Note } from '../../../../models/entities/note';
diff --git a/src/services/chart/charts/classes/per-user-drive.ts b/src/services/chart/charts/classes/per-user-drive.ts
index e778f7bf6104364124d493d3f91d67a72605714c..182e5927e80b65426fde434accd3960a503fa4ef 100644
--- a/src/services/chart/charts/classes/per-user-drive.ts
+++ b/src/services/chart/charts/classes/per-user-drive.ts
@@ -1,6 +1,6 @@
 import autobind from 'autobind-decorator';
 import Chart, { Obj, DeepPartial } from '../../core';
-import { SchemaType } from '../../../../misc/schema';
+import { SchemaType } from '@/misc/schema';
 import { DriveFiles } from '../../../../models';
 import { DriveFile } from '../../../../models/entities/drive-file';
 import { name, schema } from '../schemas/per-user-drive';
diff --git a/src/services/chart/charts/classes/per-user-following.ts b/src/services/chart/charts/classes/per-user-following.ts
index 8b536009c8b63e5dfd0bf4d64d9e76d10f8c99dd..5972d3759b9b571e788a46e82bc5607e380363de 100644
--- a/src/services/chart/charts/classes/per-user-following.ts
+++ b/src/services/chart/charts/classes/per-user-following.ts
@@ -1,6 +1,6 @@
 import autobind from 'autobind-decorator';
 import Chart, { Obj, DeepPartial } from '../../core';
-import { SchemaType } from '../../../../misc/schema';
+import { SchemaType } from '@/misc/schema';
 import { Followings, Users } from '../../../../models';
 import { Not, IsNull } from 'typeorm';
 import { User } from '../../../../models/entities/user';
@@ -100,7 +100,7 @@ export default class PerUserFollowingChart extends Chart<PerUserFollowingLog> {
 	}
 
 	@autobind
-	public async update(follower: User, followee: User, isFollow: boolean) {
+	public async update(follower: { id: User['id']; host: User['host']; }, followee: { id: User['id']; host: User['host']; }, isFollow: boolean) {
 		const update: Obj = {};
 
 		update.total = isFollow ? 1 : -1;
diff --git a/src/services/chart/charts/classes/per-user-notes.ts b/src/services/chart/charts/classes/per-user-notes.ts
index 8d1fb8d2b085a813e00c844c21cb2c75486fb0a7..7f93965adbc16fe1473d2a91937995679dd48a3d 100644
--- a/src/services/chart/charts/classes/per-user-notes.ts
+++ b/src/services/chart/charts/classes/per-user-notes.ts
@@ -1,7 +1,7 @@
 import autobind from 'autobind-decorator';
 import Chart, { Obj, DeepPartial } from '../../core';
 import { User } from '../../../../models/entities/user';
-import { SchemaType } from '../../../../misc/schema';
+import { SchemaType } from '@/misc/schema';
 import { Notes } from '../../../../models';
 import { Note } from '../../../../models/entities/note';
 import { name, schema } from '../schemas/per-user-notes';
@@ -46,7 +46,7 @@ export default class PerUserNotesChart extends Chart<PerUserNotesLog> {
 	}
 
 	@autobind
-	public async update(user: User, note: Note, isAdditional: boolean) {
+	public async update(user: { id: User['id'] }, note: Note, isAdditional: boolean) {
 		const update: Obj = {
 			diffs: {}
 		};
diff --git a/src/services/chart/charts/classes/per-user-reactions.ts b/src/services/chart/charts/classes/per-user-reactions.ts
index b4cdced40cb0462753c0bd0edeef2ef1300d06d7..69ed81cd440f51d601fd9a5b349a8bc42d99a961 100644
--- a/src/services/chart/charts/classes/per-user-reactions.ts
+++ b/src/services/chart/charts/classes/per-user-reactions.ts
@@ -2,7 +2,7 @@ import autobind from 'autobind-decorator';
 import Chart, { DeepPartial } from '../../core';
 import { User } from '../../../../models/entities/user';
 import { Note } from '../../../../models/entities/note';
-import { SchemaType } from '../../../../misc/schema';
+import { SchemaType } from '@/misc/schema';
 import { Users } from '../../../../models';
 import { name, schema } from '../schemas/per-user-reactions';
 
@@ -36,7 +36,7 @@ export default class PerUserReactionsChart extends Chart<PerUserReactionsLog> {
 	}
 
 	@autobind
-	public async update(user: User, note: Note) {
+	public async update(user: { id: User['id'], host: User['host'] }, note: Note) {
 		this.inc({
 			[Users.isLocalUser(user) ? 'local' : 'remote']: { count: 1 }
 		}, note.userId);
diff --git a/src/services/chart/charts/classes/test-grouped.ts b/src/services/chart/charts/classes/test-grouped.ts
index 92c8df636ea79dfd56603911186cd2070f3b61de..84e6d5e33f2c5b86ac96d0aa61f580bb07a5cfcc 100644
--- a/src/services/chart/charts/classes/test-grouped.ts
+++ b/src/services/chart/charts/classes/test-grouped.ts
@@ -1,6 +1,6 @@
 import autobind from 'autobind-decorator';
 import Chart, { Obj, DeepPartial } from '../../core';
-import { SchemaType } from '../../../../misc/schema';
+import { SchemaType } from '@/misc/schema';
 import { name, schema } from '../schemas/test-grouped';
 
 type TestGroupedLog = SchemaType<typeof schema>;
diff --git a/src/services/chart/charts/classes/test-unique.ts b/src/services/chart/charts/classes/test-unique.ts
index 5680d713eccc07193d3d8f136ba8d69cca5c7425..559fda13c9d111940ecc0017f422b492ca8249fb 100644
--- a/src/services/chart/charts/classes/test-unique.ts
+++ b/src/services/chart/charts/classes/test-unique.ts
@@ -1,6 +1,6 @@
 import autobind from 'autobind-decorator';
 import Chart, { DeepPartial } from '../../core';
-import { SchemaType } from '../../../../misc/schema';
+import { SchemaType } from '@/misc/schema';
 import { name, schema } from '../schemas/test-unique';
 
 type TestUniqueLog = SchemaType<typeof schema>;
diff --git a/src/services/chart/charts/classes/test.ts b/src/services/chart/charts/classes/test.ts
index d37d298de743034397dc13f99378a0dde71c616a..a91d5e1895f8e08f735587bd3916a196bf68966e 100644
--- a/src/services/chart/charts/classes/test.ts
+++ b/src/services/chart/charts/classes/test.ts
@@ -1,6 +1,6 @@
 import autobind from 'autobind-decorator';
 import Chart, { Obj, DeepPartial } from '../../core';
-import { SchemaType } from '../../../../misc/schema';
+import { SchemaType } from '@/misc/schema';
 import { name, schema } from '../schemas/test';
 
 type TestLog = SchemaType<typeof schema>;
diff --git a/src/services/chart/charts/classes/users.ts b/src/services/chart/charts/classes/users.ts
index 87b19d88f92cd275bf1a3532c707bf52ad940320..8f208de6d6e712ea09600649e85921ccfec750fe 100644
--- a/src/services/chart/charts/classes/users.ts
+++ b/src/services/chart/charts/classes/users.ts
@@ -1,6 +1,6 @@
 import autobind from 'autobind-decorator';
 import Chart, { Obj, DeepPartial } from '../../core';
-import { SchemaType } from '../../../../misc/schema';
+import { SchemaType } from '@/misc/schema';
 import { Users } from '../../../../models';
 import { Not, IsNull } from 'typeorm';
 import { User } from '../../../../models/entities/user';
@@ -59,7 +59,7 @@ export default class UsersChart extends Chart<UsersLog> {
 	}
 
 	@autobind
-	public async update(user: User, isAdditional: boolean) {
+	public async update(user: { id: User['id'], host: User['host'] }, isAdditional: boolean) {
 		const update: Obj = {};
 
 		update.total = isAdditional ? 1 : -1;
diff --git a/src/services/chart/core.ts b/src/services/chart/core.ts
index 10621be07306f3ac8a74881aa2082192c6860af9..d956d33bd74f8197d5cb75fe9348b9fdc5bef6ca 100644
--- a/src/services/chart/core.ts
+++ b/src/services/chart/core.ts
@@ -7,10 +7,10 @@
 import * as nestedProperty from 'nested-property';
 import autobind from 'autobind-decorator';
 import Logger from '../logger';
-import { Schema } from '../../misc/schema';
+import { Schema } from '@/misc/schema';
 import { EntitySchema, getRepository, Repository, LessThan, Between } from 'typeorm';
 import { dateUTC, isTimeSame, isTimeBefore, subtractTime, addTime } from '../../prelude/time';
-import { getChartInsertLock } from '../../misc/app-lock';
+import { getChartInsertLock } from '@/misc/app-lock';
 
 const logger = new Logger('chart', 'white', process.env.NODE_ENV !== 'test');
 
diff --git a/src/services/chart/index.ts b/src/services/chart/index.ts
index dde02bd64d3ca01dba0698a73ddfb5ce1a5757e6..61eb431ea3d4510ba6b2ae3bdbc8844447cf4a51 100644
--- a/src/services/chart/index.ts
+++ b/src/services/chart/index.ts
@@ -10,7 +10,7 @@ import PerUserReactionsChart from './charts/classes/per-user-reactions';
 import HashtagChart from './charts/classes/hashtag';
 import PerUserFollowingChart from './charts/classes/per-user-following';
 import PerUserDriveChart from './charts/classes/per-user-drive';
-import { beforeShutdown } from '../../misc/before-shutdown';
+import { beforeShutdown } from '@/misc/before-shutdown';
 
 export const federationChart = new FederationChart();
 export const notesChart = new NotesChart();
diff --git a/src/services/create-notification.ts b/src/services/create-notification.ts
index dedb8eac8d005f440ede61b37d7536126149481d..261b36814c7589ee219b1c6a9a273d68a80be9ed 100644
--- a/src/services/create-notification.ts
+++ b/src/services/create-notification.ts
@@ -1,7 +1,7 @@
 import { publishMainStream } from './stream';
 import pushSw from './push-notification';
 import { Notifications, Mutings, UserProfiles } from '../models';
-import { genId } from '../misc/gen-id';
+import { genId } from '@/misc/gen-id';
 import { User } from '../models/entities/user';
 import { Notification } from '../models/entities/notification';
 import { sendEmailNotification } from './send-email-notification';
diff --git a/src/services/create-system-user.ts b/src/services/create-system-user.ts
index 39ddc92abd8c56f7543866ad35d4ff07ace10f58..052ceb6c99ab1b36b3ff359e0165971005d2e714 100644
--- a/src/services/create-system-user.ts
+++ b/src/services/create-system-user.ts
@@ -1,11 +1,11 @@
 import * as bcrypt from 'bcryptjs';
 import { v4 as uuid } from 'uuid';
 import generateNativeUserToken from '../server/api/common/generate-native-user-token';
-import { genRsaKeyPair } from '../misc/gen-key-pair';
+import { genRsaKeyPair } from '@/misc/gen-key-pair';
 import { User } from '../models/entities/user';
 import { UserProfile } from '../models/entities/user-profile';
 import { getConnection } from 'typeorm';
-import { genId } from '../misc/gen-id';
+import { genId } from '@/misc/gen-id';
 import { UserKeypair } from '../models/entities/user-keypair';
 import { UsedUsername } from '../models/entities/used-username';
 
diff --git a/src/services/drive/add-file.ts b/src/services/drive/add-file.ts
index b5085ec8e37debc154881b3f68e0330796f3ef09..ad9f753e7999d592a85514cad32cabe812d0663f 100644
--- a/src/services/drive/add-file.ts
+++ b/src/services/drive/add-file.ts
@@ -4,19 +4,19 @@ import { v4 as uuid } from 'uuid';
 
 import { publishMainStream, publishDriveStream } from '../stream';
 import { deleteFile } from './delete-file';
-import { fetchMeta } from '../../misc/fetch-meta';
+import { fetchMeta } from '@/misc/fetch-meta';
 import { GenerateVideoThumbnail } from './generate-video-thumbnail';
 import { driveLogger } from './logger';
 import { IImage, convertSharpToJpeg, convertSharpToWebp, convertSharpToPng, convertSharpToPngOrJpeg } from './image-processor';
-import { contentDisposition } from '../../misc/content-disposition';
-import { getFileInfo } from '../../misc/get-file-info';
+import { contentDisposition } from '@/misc/content-disposition';
+import { getFileInfo } from '@/misc/get-file-info';
 import { DriveFiles, DriveFolders, Users, Instances, UserProfiles } from '../../models';
 import { InternalStorage } from './internal-storage';
 import { DriveFile } from '../../models/entities/drive-file';
 import { IRemoteUser, User } from '../../models/entities/user';
 import { driveChart, perUserDriveChart, instanceChart } from '../chart';
-import { genId } from '../../misc/gen-id';
-import { isDuplicateKeyValueError } from '../../misc/is-duplicate-key-value-error';
+import { genId } from '@/misc/gen-id';
+import { isDuplicateKeyValueError } from '@/misc/is-duplicate-key-value-error';
 import * as S3 from 'aws-sdk/clients/s3';
 import { getS3 } from './s3';
 import * as sharp from 'sharp';
@@ -302,7 +302,7 @@ async function deleteOldFile(user: IRemoteUser) {
  * @return Created drive file
  */
 export default async function(
-	user: User | null,
+	user: { id: User['id']; host: User['host'] } | null,
 	path: string,
 	name: string | null = null,
 	comment: string | null = null,
@@ -347,7 +347,7 @@ export default async function(
 				throw new Error('no-free-space');
 			} else {
 				// (アバターまたはバナーを含まず)最も古いファイルを削除する
-				deleteOldFile(user as IRemoteUser);
+				deleteOldFile(await Users.findOneOrFail(user.id) as IRemoteUser);
 			}
 		}
 	}
diff --git a/src/services/drive/delete-file.ts b/src/services/drive/delete-file.ts
index f9141ebaac4a4a1c55d19252a46b2a8c728f03c9..bb9c0ae2c340cc9709ba06d8262771e22f38dbeb 100644
--- a/src/services/drive/delete-file.ts
+++ b/src/services/drive/delete-file.ts
@@ -3,14 +3,14 @@ import { InternalStorage } from './internal-storage';
 import { DriveFiles, Instances, Notes, Users } from '../../models';
 import { driveChart, perUserDriveChart, instanceChart } from '../chart';
 import { createDeleteObjectStorageFileJob } from '../../queue';
-import { fetchMeta } from '../../misc/fetch-meta';
+import { fetchMeta } from '@/misc/fetch-meta';
 import { getS3 } from './s3';
 import { v4 as uuid } from 'uuid';
 import { Note } from '../../models/entities/note';
 import { renderActivity } from '../../remote/activitypub/renderer';
 import renderDelete from '../../remote/activitypub/renderer/delete';
 import renderTombstone from '../../remote/activitypub/renderer/tombstone';
-import config from '../../config';
+import config from '@/config';
 import { deliverToFollowers } from '../../remote/activitypub/deliver-manager';
 import { Brackets } from 'typeorm';
 import { deliverToRelays } from '../relay';
diff --git a/src/services/drive/internal-storage.ts b/src/services/drive/internal-storage.ts
index f8d7489a2266e68cce57b3ff2a2aa9e237127a9c..5ec563584f0ef185f741f8afd17563a4923ada9a 100644
--- a/src/services/drive/internal-storage.ts
+++ b/src/services/drive/internal-storage.ts
@@ -1,6 +1,6 @@
 import * as fs from 'fs';
 import * as Path from 'path';
-import config from '../../config';
+import config from '@/config';
 
 export class InternalStorage {
 	private static readonly path = Path.resolve(__dirname, '../../../files');
diff --git a/src/services/drive/s3.ts b/src/services/drive/s3.ts
index f419f09377e006100ea262bd3d21eb95110201a3..e75937861bd9c93f58b8cc3f6019bad6c5b52ec7 100644
--- a/src/services/drive/s3.ts
+++ b/src/services/drive/s3.ts
@@ -1,6 +1,7 @@
+import { URL } from 'url';
 import * as S3 from 'aws-sdk/clients/s3';
 import { Meta } from '../../models/entities/meta';
-import { getAgentByUrl } from '../../misc/fetch';
+import { getAgentByUrl } from '@/misc/fetch';
 
 export function getS3(meta: Meta) {
 	const u = meta.objectStorageEndpoint != null
diff --git a/src/services/drive/upload-from-url.ts b/src/services/drive/upload-from-url.ts
index 96550f712185749f11d76a9a06d0a25341cb38c1..2f4c5aeeaf0c37c2d40f4cffbc9a4e7f53aae74b 100644
--- a/src/services/drive/upload-from-url.ts
+++ b/src/services/drive/upload-from-url.ts
@@ -1,8 +1,9 @@
+import { URL } from 'url';
 import create from './add-file';
 import { User } from '../../models/entities/user';
 import { driveLogger } from './logger';
-import { createTemp } from '../../misc/create-temp';
-import { downloadUrl } from '../../misc/download-url';
+import { createTemp } from '@/misc/create-temp';
+import { downloadUrl } from '@/misc/download-url';
 import { DriveFolder } from '../../models/entities/drive-folder';
 import { DriveFile } from '../../models/entities/drive-file';
 import { DriveFiles } from '../../models';
@@ -11,7 +12,7 @@ const logger = driveLogger.createSubLogger('downloader');
 
 export default async (
 	url: string,
-	user: User | null,
+	user: { id: User['id']; host: User['host'] } | null,
 	folderId: DriveFolder['id'] | null = null,
 	uri: string | null = null,
 	sensitive = false,
diff --git a/src/services/fetch-instance-metadata.ts b/src/services/fetch-instance-metadata.ts
index c1caeef6e38f1ed07e4fe4ffaf9150d0694af903..e016e73a60b0da68433f913d4c189c999e353dba 100644
--- a/src/services/fetch-instance-metadata.ts
+++ b/src/services/fetch-instance-metadata.ts
@@ -1,9 +1,9 @@
 import { DOMWindow, JSDOM } from 'jsdom';
 import fetch from 'node-fetch';
-import { getJson, getHtml, getAgentByUrl } from '../misc/fetch';
+import { getJson, getHtml, getAgentByUrl } from '@/misc/fetch';
 import { Instance } from '../models/entities/instance';
 import { Instances } from '../models';
-import { getFetchInstanceMetadataLock } from '../misc/app-lock';
+import { getFetchInstanceMetadataLock } from '@/misc/app-lock';
 import Logger from './logger';
 import { URL } from 'url';
 
diff --git a/src/services/following/create.ts b/src/services/following/create.ts
index 1ce75caca070edbf236be35f1366977eb012f807..de12285fc749b7e0533f04dc719d1fe39fcde9f9 100644
--- a/src/services/following/create.ts
+++ b/src/services/following/create.ts
@@ -7,17 +7,17 @@ import { deliver } from '../../queue';
 import createFollowRequest from './requests/create';
 import { registerOrFetchInstanceDoc } from '../register-or-fetch-instance-doc';
 import Logger from '../logger';
-import { IdentifiableError } from '../../misc/identifiable-error';
+import { IdentifiableError } from '@/misc/identifiable-error';
 import { User } from '../../models/entities/user';
 import { Followings, Users, FollowRequests, Blockings, Instances, UserProfiles } from '../../models';
 import { instanceChart, perUserFollowingChart } from '../chart';
-import { genId } from '../../misc/gen-id';
+import { genId } from '@/misc/gen-id';
 import { createNotification } from '../create-notification';
-import { isDuplicateKeyValueError } from '../../misc/is-duplicate-key-value-error';
+import { isDuplicateKeyValueError } from '@/misc/is-duplicate-key-value-error';
 
 const logger = new Logger('following/create');
 
-export async function insertFollowingDoc(followee: User, follower: User) {
+export async function insertFollowingDoc(followee: { id: User['id']; host: User['host']; uri: User['host']; inbox: User['inbox']; sharedInbox: User['sharedInbox'] }, follower: { id: User['id']; host: User['host']; uri: User['host']; inbox: User['inbox']; sharedInbox: User['sharedInbox'] }) {
 	if (follower.id === followee.id) return;
 
 	let alreadyFollowed = false;
@@ -86,7 +86,7 @@ export async function insertFollowingDoc(followee: User, follower: User) {
 
 	// Publish follow event
 	if (Users.isLocalUser(follower)) {
-		Users.pack(followee, follower, {
+		Users.pack(followee.id, follower, {
 			detail: true
 		}).then(packed => {
 			publishUserEvent(follower.id, 'follow', packed);
@@ -96,7 +96,7 @@ export async function insertFollowingDoc(followee: User, follower: User) {
 
 	// Publish followed event
 	if (Users.isLocalUser(followee)) {
-		Users.pack(follower, followee).then(packed => publishMainStream(followee.id, 'followed', packed));
+		Users.pack(follower.id, followee).then(packed => publishMainStream(followee.id, 'followed', packed));
 
 		// 通知を作成
 		createNotification(followee.id, 'follow', {
@@ -105,7 +105,12 @@ export async function insertFollowingDoc(followee: User, follower: User) {
 	}
 }
 
-export default async function(follower: User, followee: User, requestId?: string) {
+export default async function(_follower: { id: User['id'] }, _followee: { id: User['id'] }, requestId?: string) {
+	const [follower, followee] = await Promise.all([
+		Users.findOneOrFail(_follower.id),
+		Users.findOneOrFail(_followee.id)
+	]);
+
 	// check blocking
 	const [blocking, blocked] = await Promise.all([
 		Blockings.findOne({
diff --git a/src/services/following/delete.ts b/src/services/following/delete.ts
index 32c47ea7f40ca72a7cc9d95947df53e96971c43f..d0df0de6aec40e9ef0e86eda0c75b4b0cfb76a16 100644
--- a/src/services/following/delete.ts
+++ b/src/services/following/delete.ts
@@ -11,7 +11,7 @@ import { instanceChart, perUserFollowingChart } from '../chart';
 
 const logger = new Logger('following/delete');
 
-export default async function(follower: User, followee: User, silent = false) {
+export default async function(follower: { id: User['id']; host: User['host']; uri: User['host']; inbox: User['inbox']; sharedInbox: User['sharedInbox']; }, followee: { id: User['id']; host: User['host']; uri: User['host']; inbox: User['inbox']; sharedInbox: User['sharedInbox']; }, silent = false) {
 	const following = await Followings.findOne({
 		followerId: follower.id,
 		followeeId: followee.id
@@ -28,7 +28,7 @@ export default async function(follower: User, followee: User, silent = false) {
 
 	// Publish unfollow event
 	if (!silent && Users.isLocalUser(follower)) {
-		Users.pack(followee, follower, {
+		Users.pack(followee.id, follower, {
 			detail: true
 		}).then(packed => {
 			publishUserEvent(follower.id, 'unfollow', packed);
@@ -42,7 +42,7 @@ export default async function(follower: User, followee: User, silent = false) {
 	}
 }
 
-export async function decrementFollowing(follower: User, followee: User) {
+export async function decrementFollowing(follower: { id: User['id']; host: User['host']; }, followee: { id: User['id']; host: User['host']; }) {
 	//#region Decrement following count
 	Users.decrement({ id: follower.id }, 'followingCount', 1);
 	//#endregion
diff --git a/src/services/following/requests/accept-all.ts b/src/services/following/requests/accept-all.ts
index da39965349e1a230e11ac5d6992697b5c226cbf0..5fc70fcf1b481ebf55e79ae91f194f6d6b12ce16 100644
--- a/src/services/following/requests/accept-all.ts
+++ b/src/services/following/requests/accept-all.ts
@@ -6,7 +6,7 @@ import { FollowRequests, Users } from '../../../models';
  * 指定したユーザー宛てのフォローリクエストをすべて承認
  * @param user ユーザー
  */
-export default async function(user: User) {
+export default async function(user: { id: User['id']; host: User['host']; uri: User['host']; inbox: User['inbox']; sharedInbox: User['sharedInbox']; }) {
 	const requests = await FollowRequests.find({
 		followeeId: user.id
 	});
diff --git a/src/services/following/requests/accept.ts b/src/services/following/requests/accept.ts
index 6a072126b52eca83e9f30d13aaf918a3d9bca353..4277a1a1e998b7dca4626dbb2a395fcfb9e12c6b 100644
--- a/src/services/following/requests/accept.ts
+++ b/src/services/following/requests/accept.ts
@@ -6,9 +6,9 @@ import { publishMainStream } from '../../stream';
 import { insertFollowingDoc } from '../create';
 import { User, ILocalUser } from '../../../models/entities/user';
 import { FollowRequests, Users } from '../../../models';
-import { IdentifiableError } from '../../../misc/identifiable-error';
+import { IdentifiableError } from '@/misc/identifiable-error';
 
-export default async function(followee: User, follower: User) {
+export default async function(followee: { id: User['id']; host: User['host']; uri: User['host']; inbox: User['inbox']; sharedInbox: User['sharedInbox']; }, follower: User) {
 	const request = await FollowRequests.findOne({
 		followeeId: followee.id,
 		followerId: follower.id
@@ -20,12 +20,12 @@ export default async function(followee: User, follower: User) {
 
 	await insertFollowingDoc(followee, follower);
 
-	if (Users.isRemoteUser(follower)) {
-		const content = renderActivity(renderAccept(renderFollow(follower, followee, request.requestId!), followee as ILocalUser));
-		deliver(followee as ILocalUser, content, follower.inbox);
+	if (Users.isRemoteUser(follower) && Users.isLocalUser(followee)) {
+		const content = renderActivity(renderAccept(renderFollow(follower, followee, request.requestId!), followee));
+		deliver(followee, content, follower.inbox);
 	}
 
-	Users.pack(followee, followee, {
+	Users.pack(followee.id, followee, {
 		detail: true
 	}).then(packed => publishMainStream(followee.id, 'meUpdated', packed));
 }
diff --git a/src/services/following/requests/cancel.ts b/src/services/following/requests/cancel.ts
index 98fec5d331da2ac551c2a92e79bc1288c4d85164..53c20088ca38c3572332442e43c0320ef747dd7c 100644
--- a/src/services/following/requests/cancel.ts
+++ b/src/services/following/requests/cancel.ts
@@ -3,14 +3,17 @@ import renderFollow from '../../../remote/activitypub/renderer/follow';
 import renderUndo from '../../../remote/activitypub/renderer/undo';
 import { deliver } from '../../../queue';
 import { publishMainStream } from '../../stream';
-import { IdentifiableError } from '../../../misc/identifiable-error';
+import { IdentifiableError } from '@/misc/identifiable-error';
 import { User, ILocalUser } from '../../../models/entities/user';
 import { Users, FollowRequests } from '../../../models';
 
-export default async function(followee: User, follower: User) {
+export default async function(followee: { id: User['id']; host: User['host']; uri: User['host']; inbox: User['inbox'] }, follower: { id: User['id']; host: User['host']; uri: User['host'] }) {
 	if (Users.isRemoteUser(followee)) {
 		const content = renderActivity(renderUndo(renderFollow(follower, followee), follower));
-		deliver(follower as ILocalUser, content, followee.inbox);
+
+		if (Users.isLocalUser(follower)) { // 本来このチェックは不要だけどTSに怒られるので
+			deliver(follower, content, followee.inbox);
+		}
 	}
 
 	const request = await FollowRequests.findOne({
@@ -27,7 +30,7 @@ export default async function(followee: User, follower: User) {
 		followerId: follower.id
 	});
 
-	Users.pack(followee, followee, {
+	Users.pack(followee.id, followee, {
 		detail: true
 	}).then(packed => publishMainStream(followee.id, 'meUpdated', packed));
 }
diff --git a/src/services/following/requests/create.ts b/src/services/following/requests/create.ts
index deaeedb9a8a5eb89a016bd6ff575057d816c110d..584591b00339bb198a70af16b85ba363e0edfdbb 100644
--- a/src/services/following/requests/create.ts
+++ b/src/services/following/requests/create.ts
@@ -4,10 +4,10 @@ import renderFollow from '../../../remote/activitypub/renderer/follow';
 import { deliver } from '../../../queue';
 import { User } from '../../../models/entities/user';
 import { Blockings, FollowRequests, Users } from '../../../models';
-import { genId } from '../../../misc/gen-id';
+import { genId } from '@/misc/gen-id';
 import { createNotification } from '../../create-notification';
 
-export default async function(follower: User, followee: User, requestId?: string) {
+export default async function(follower: { id: User['id']; host: User['host']; uri: User['host']; inbox: User['inbox']; sharedInbox: User['sharedInbox']; }, followee: { id: User['id']; host: User['host']; uri: User['host']; inbox: User['inbox']; sharedInbox: User['sharedInbox']; }, requestId?: string) {
 	if (follower.id === followee.id) return;
 
 	// check blocking
@@ -43,9 +43,9 @@ export default async function(follower: User, followee: User, requestId?: string
 
 	// Publish receiveRequest event
 	if (Users.isLocalUser(followee)) {
-		Users.pack(follower, followee).then(packed => publishMainStream(followee.id, 'receiveFollowRequest', packed));
+		Users.pack(follower.id, followee).then(packed => publishMainStream(followee.id, 'receiveFollowRequest', packed));
 
-		Users.pack(followee, followee, {
+		Users.pack(followee.id, followee, {
 			detail: true
 		}).then(packed => publishMainStream(followee.id, 'meUpdated', packed));
 
diff --git a/src/services/following/requests/reject.ts b/src/services/following/requests/reject.ts
index d8d3788088c1f4005a6725cc4bd35d9f5a0a6805..45effc580220360b56f0d1b6ba390772e3cf3490 100644
--- a/src/services/following/requests/reject.ts
+++ b/src/services/following/requests/reject.ts
@@ -7,15 +7,15 @@ import { User, ILocalUser } from '../../../models/entities/user';
 import { Users, FollowRequests, Followings } from '../../../models';
 import { decrementFollowing } from '../delete';
 
-export default async function(followee: User, follower: User) {
-	if (Users.isRemoteUser(follower)) {
+export default async function(followee: { id: User['id']; host: User['host']; uri: User['host'] }, follower: User) {
+	if (Users.isRemoteUser(follower) && Users.isLocalUser(followee)) {
 		const request = await FollowRequests.findOne({
 			followeeId: followee.id,
 			followerId: follower.id
 		});
 
-		const content = renderActivity(renderReject(renderFollow(follower, followee, request!.requestId!), followee as ILocalUser));
-		deliver(followee as ILocalUser, content, follower.inbox);
+		const content = renderActivity(renderReject(renderFollow(follower, followee, request!.requestId!), followee));
+		deliver(followee, content, follower.inbox);
 	}
 
 	const request = await FollowRequests.findOne({
@@ -37,7 +37,7 @@ export default async function(followee: User, follower: User) {
 		}
 	}
 
-	Users.pack(followee, follower, {
+	Users.pack(followee.id, follower, {
 		detail: true
 	}).then(packed => {
 		publishUserEvent(follower.id, 'unfollow', packed);
diff --git a/src/services/i/pin.ts b/src/services/i/pin.ts
index f727a10fb65605c832b3ddf5366adda3daa2cf38..e3a73b5b98d3398acbe7c6fd3fef801e84ebebcf 100644
--- a/src/services/i/pin.ts
+++ b/src/services/i/pin.ts
@@ -1,13 +1,13 @@
-import config from '../../config';
+import config from '@/config';
 import renderAdd from '../../remote/activitypub/renderer/add';
 import renderRemove from '../../remote/activitypub/renderer/remove';
 import { renderActivity } from '../../remote/activitypub/renderer';
-import { IdentifiableError } from '../../misc/identifiable-error';
+import { IdentifiableError } from '@/misc/identifiable-error';
 import { User } from '../../models/entities/user';
 import { Note } from '../../models/entities/note';
 import { Notes, UserNotePinings, Users } from '../../models';
 import { UserNotePining } from '../../models/entities/user-note-pining';
-import { genId } from '../../misc/gen-id';
+import { genId } from '@/misc/gen-id';
 import { deliverToFollowers } from '../../remote/activitypub/deliver-manager';
 import { deliverToRelays } from '../relay';
 
@@ -16,7 +16,7 @@ import { deliverToRelays } from '../relay';
  * @param user
  * @param noteId
  */
-export async function addPinned(user: User, noteId: Note['id']) {
+export async function addPinned(user: { id: User['id']; host: User['host']; }, noteId: Note['id']) {
 	// Fetch pinee
 	const note = await Notes.findOne({
 		id: noteId,
@@ -55,7 +55,7 @@ export async function addPinned(user: User, noteId: Note['id']) {
  * @param user
  * @param noteId
  */
-export async function removePinned(user: User, noteId: Note['id']) {
+export async function removePinned(user: { id: User['id']; host: User['host']; }, noteId: Note['id']) {
 	// Fetch unpinee
 	const note = await Notes.findOne({
 		id: noteId,
diff --git a/src/services/insert-moderation-log.ts b/src/services/insert-moderation-log.ts
index 87587d3bed6fefea900150df4b00e70b1d260ecf..8ba64fa34b6f1b14a88be489dd10a99e6b3fa3f1 100644
--- a/src/services/insert-moderation-log.ts
+++ b/src/services/insert-moderation-log.ts
@@ -1,8 +1,8 @@
-import { ILocalUser } from '../models/entities/user';
 import { ModerationLogs } from '../models';
-import { genId } from '../misc/gen-id';
+import { genId } from '@/misc/gen-id';
+import { User } from '@/models/entities/user';
 
-export async function insertModerationLog(moderator: ILocalUser, type: string, info?: Record<string, any>) {
+export async function insertModerationLog(moderator: { id: User['id'] }, type: string, info?: Record<string, any>) {
 	await ModerationLogs.insert({
 		id: genId(),
 		createdAt: new Date(),
diff --git a/src/services/instance-actor.ts b/src/services/instance-actor.ts
index 74591846fa007ce37047db6d78c14676bd0f0516..9b9c746061dbdb5bc3e07aa0a0b811607b9a3648 100644
--- a/src/services/instance-actor.ts
+++ b/src/services/instance-actor.ts
@@ -1,17 +1,27 @@
 import { createSystemUser } from './create-system-user';
 import { ILocalUser } from '../models/entities/user';
 import { Users } from '../models';
+import { Cache } from '@/misc/cache';
 
 const ACTOR_USERNAME = 'instance.actor' as const;
 
+const cache = new Cache<ILocalUser>(Infinity);
+
 export async function getInstanceActor(): Promise<ILocalUser> {
+	const cached = cache.get(null);
+	if (cached) return cached;
+
 	const user = await Users.findOne({
 		host: null,
 		username: ACTOR_USERNAME
-	});
-
-	if (user) return user as ILocalUser;
+	}) as ILocalUser | undefined;
 
-	const created = await createSystemUser(ACTOR_USERNAME);
-	return created as ILocalUser;
+	if (user) {
+		cache.set(null, user);
+		return user;
+	} else {
+		const created = await createSystemUser(ACTOR_USERNAME) as ILocalUser;
+		cache.set(null, created);
+		return created;
+	}
 }
diff --git a/src/services/logger.ts b/src/services/logger.ts
index c7483d3faa3ef1bf194bd484e6f5bc3fef51bd39..de62b3aca965057f91ad80e9ed0af2de9b930e56 100644
--- a/src/services/logger.ts
+++ b/src/services/logger.ts
@@ -5,8 +5,8 @@ import * as dateformat from 'dateformat';
 import { program } from '../argv';
 import { getRepository } from 'typeorm';
 import { Log } from '../models/entities/log';
-import { genId } from '../misc/gen-id';
-import config from '../config';
+import { genId } from '@/misc/gen-id';
+import config from '@/config';
 
 const SyslogPro = require('syslog-pro');
 
diff --git a/src/services/messages/create.ts b/src/services/messages/create.ts
index 413266d0290dc75f8484645e28a7bfb42e4e0e44..f84729cdeb7e711bb2b51e25ff731a839e8fccb4 100644
--- a/src/services/messages/create.ts
+++ b/src/services/messages/create.ts
@@ -2,7 +2,7 @@ import { User } from '../../models/entities/user';
 import { UserGroup } from '../../models/entities/user-group';
 import { DriveFile } from '../../models/entities/drive-file';
 import { MessagingMessages, UserGroupJoinings, Mutings, Users } from '../../models';
-import { genId } from '../../misc/gen-id';
+import { genId } from '@/misc/gen-id';
 import { MessagingMessage } from '../../models/entities/messaging-message';
 import { publishMessagingStream, publishMessagingIndexStream, publishMainStream, publishGroupMessagingStream } from '../stream';
 import pushNotification from '../push-notification';
@@ -13,7 +13,7 @@ import renderCreate from '../../remote/activitypub/renderer/create';
 import { renderActivity } from '../../remote/activitypub/renderer';
 import { deliver } from '../../queue';
 
-export async function createMessage(user: User, recipientUser: User | undefined, recipientGroup: UserGroup | undefined, text: string | undefined, file: DriveFile | null, uri?: string) {
+export async function createMessage(user: { id: User['id']; host: User['host']; }, recipientUser: User | undefined, recipientGroup: UserGroup | undefined, text: string | undefined, file: DriveFile | null, uri?: string) {
 	const message = {
 		id: genId(),
 		createdAt: new Date(),
diff --git a/src/services/messages/delete.ts b/src/services/messages/delete.ts
index c94a7b67db8bf6c4c2bb2fd348a6a2be20869ecb..522815e554abeabb70a02837acb2f7d01deae5ee 100644
--- a/src/services/messages/delete.ts
+++ b/src/services/messages/delete.ts
@@ -1,4 +1,4 @@
-import config from '../../config';
+import config from '@/config';
 import { MessagingMessages, Users } from '../../models';
 import { MessagingMessage } from '../../models/entities/messaging-message';
 import { publishGroupMessagingStream, publishMessagingStream } from '../stream';
diff --git a/src/services/note/create.ts b/src/services/note/create.ts
index 4a737e8516421f964afc049042b5f69c9a16417b..64d5513ecc309f2b6c475bd957a020bb8cb299fc 100644
--- a/src/services/note/create.ts
+++ b/src/services/note/create.ts
@@ -7,44 +7,45 @@ import renderAnnounce from '../../remote/activitypub/renderer/announce';
 import { renderActivity } from '../../remote/activitypub/renderer';
 import { parse } from '../../mfm/parse';
 import { resolveUser } from '../../remote/resolve-user';
-import config from '../../config';
+import config from '@/config';
 import { updateHashtags } from '../update-hashtag';
 import { concat } from '../../prelude/array';
 import insertNoteUnread from './unread';
 import { registerOrFetchInstanceDoc } from '../register-or-fetch-instance-doc';
-import extractMentions from '../../misc/extract-mentions';
-import extractEmojis from '../../misc/extract-emojis';
-import extractHashtags from '../../misc/extract-hashtags';
+import extractMentions from '@/misc/extract-mentions';
+import extractEmojis from '@/misc/extract-emojis';
+import extractHashtags from '@/misc/extract-hashtags';
 import { Note, IMentionedRemoteUsers } from '../../models/entities/note';
 import { Mutings, Users, NoteWatchings, Notes, Instances, UserProfiles, Antennas, Followings, MutedNotes, Channels, ChannelFollowings } from '../../models';
 import { DriveFile } from '../../models/entities/drive-file';
 import { App } from '../../models/entities/app';
 import { Not, getConnection, In } from 'typeorm';
 import { User, ILocalUser, IRemoteUser } from '../../models/entities/user';
-import { genId } from '../../misc/gen-id';
+import { genId } from '@/misc/gen-id';
 import { notesChart, perUserNotesChart, activeUsersChart, instanceChart } from '../chart';
 import { Poll, IPoll } from '../../models/entities/poll';
 import { createNotification } from '../create-notification';
-import { isDuplicateKeyValueError } from '../../misc/is-duplicate-key-value-error';
-import { checkHitAntenna } from '../../misc/check-hit-antenna';
-import { checkWordMute } from '../../misc/check-word-mute';
+import { isDuplicateKeyValueError } from '@/misc/is-duplicate-key-value-error';
+import { checkHitAntenna } from '@/misc/check-hit-antenna';
+import { checkWordMute } from '@/misc/check-word-mute';
 import { addNoteToAntenna } from '../add-note-to-antenna';
-import { countSameRenotes } from '../../misc/count-same-renotes';
+import { countSameRenotes } from '@/misc/count-same-renotes';
 import { deliverToRelays } from '../relay';
 import { Channel } from '../../models/entities/channel';
-import { normalizeForSearch } from '../../misc/normalize-for-search';
+import { normalizeForSearch } from '@/misc/normalize-for-search';
+import { getAntennas } from '@/misc/antenna-cache';
 
 type NotificationType = 'reply' | 'renote' | 'quote' | 'mention';
 
 class NotificationManager {
-	private notifier: User;
+	private notifier: { id: User['id']; };
 	private note: Note;
 	private queue: {
 		target: ILocalUser['id'];
 		reason: NotificationType;
 	}[];
 
-	constructor(notifier: User, note: Note) {
+	constructor(notifier: { id: User['id']; }, note: Note) {
 		this.notifier = notifier;
 		this.note = note;
 		this.queue = [];
@@ -111,7 +112,7 @@ type Option = {
 	app?: App | null;
 };
 
-export default async (user: User, data: Option, silent = false) => new Promise<Note>(async (res, rej) => {
+export default async (user: { id: User['id']; username: User['username']; host: User['host']; isSilenced: User['isSilenced']; }, data: Option, silent = false) => new Promise<Note>(async (res, rej) => {
 	// チャンネル外にリプライしたら対象のスコープに合わせる
 	// (クライアントサイドでやっても良い処理だと思うけどとりあえずサーバーサイドで)
 	if (data.reply && data.channel && data.reply.channelId !== data.channel.id) {
@@ -241,6 +242,7 @@ export default async (user: User, data: Option, silent = false) => new Promise<N
 	incNotesCountOfUser(user);
 
 	// Word mute
+	// TODO: cache
 	UserProfiles.find({
 		enableWordMute: true
 	}).then(us => {
@@ -262,17 +264,15 @@ export default async (user: User, data: Option, silent = false) => new Promise<N
 	Followings.createQueryBuilder('following')
 		.andWhere(`following.followeeId = :userId`, { userId: note.userId })
 		.getMany()
-		.then(followings => {
+		.then(async followings => {
 			const followers = followings.map(f => f.followerId);
-			Antennas.find().then(async antennas => {
-				for (const antenna of antennas) {
-					checkHitAntenna(antenna, note, user, followers).then(hit => {
-						if (hit) {
-							addNoteToAntenna(antenna, note, user);
-						}
-					});
-				}
-			});
+			for (const antenna of (await getAntennas())) {
+				checkHitAntenna(antenna, note, user, followers).then(hit => {
+					if (hit) {
+						addNoteToAntenna(antenna, note, user);
+					}
+				});
+			}
 		});
 
 	// Channel
@@ -328,10 +328,6 @@ export default async (user: User, data: Option, silent = false) => new Promise<N
 		// Pack the note
 		const noteObj = await Notes.pack(note);
 
-		if (user.notesCount === 0) {
-			(noteObj as any).isFirstNote = true;
-		}
-
 		publishNotesStream(noteObj);
 
 		const nm = new NotificationManager(user, note);
@@ -424,7 +420,7 @@ export default async (user: User, data: Option, silent = false) => new Promise<N
 			// この処理が行われるのはノート作成後なので、ノートが一つしかなかったら最初の投稿だと判断できる
 			// TODO: とはいえノートを削除して何回も投稿すればその分だけインクリメントされる雑さもあるのでどうにかしたい
 			if (count === 1) {
-				Channels.increment({ id: data.channel.id }, 'usersCount', 1);
+				Channels.increment({ id: data.channel!.id }, 'usersCount', 1);
 			}
 		});
 	}
@@ -453,7 +449,7 @@ function incRenoteCount(renote: Note) {
 		.execute();
 }
 
-async function insertNote(user: User, data: Option, tags: string[], emojis: string[], mentionedUsers: User[]) {
+async function insertNote(user: { id: User['id']; host: User['host']; }, data: Option, tags: string[], emojis: string[], mentionedUsers: User[]) {
 	const insert = new Note({
 		id: genId(data.createdAt!),
 		createdAt: data.createdAt!,
@@ -559,7 +555,7 @@ function index(note: Note) {
 	});
 }
 
-async function notifyToWatchersOfRenotee(renote: Note, user: User, nm: NotificationManager, type: NotificationType) {
+async function notifyToWatchersOfRenotee(renote: Note, user: { id: User['id']; }, nm: NotificationManager, type: NotificationType) {
 	const watchers = await NoteWatchings.find({
 		noteId: renote.id,
 		userId: Not(user.id)
@@ -570,7 +566,7 @@ async function notifyToWatchersOfRenotee(renote: Note, user: User, nm: Notificat
 	}
 }
 
-async function notifyToWatchersOfReplyee(reply: Note, user: User, nm: NotificationManager) {
+async function notifyToWatchersOfReplyee(reply: Note, user: { id: User['id']; }, nm: NotificationManager) {
 	const watchers = await NoteWatchings.find({
 		noteId: reply.id,
 		userId: Not(user.id)
@@ -598,7 +594,7 @@ function saveReply(reply: Note, note: Note) {
 	Notes.increment({ id: reply.id }, 'repliesCount', 1);
 }
 
-function incNotesCountOfUser(user: User) {
+function incNotesCountOfUser(user: { id: User['id']; }) {
 	Users.createQueryBuilder().update()
 		.set({
 			updatedAt: new Date(),
@@ -608,7 +604,7 @@ function incNotesCountOfUser(user: User) {
 		.execute();
 }
 
-async function extractMentionedUsers(user: User, tokens: ReturnType<typeof parse>): Promise<User[]> {
+async function extractMentionedUsers(user: { host: User['host']; }, tokens: ReturnType<typeof parse>): Promise<User[]> {
 	if (tokens == null) return [];
 
 	const mentions = extractMentions(tokens);
diff --git a/src/services/note/delete.ts b/src/services/note/delete.ts
index 55263026028285f79a23551609801ebd9749680d..3f4f8b404cc2d1bc900cf5712fcc2a217c8dedb8 100644
--- a/src/services/note/delete.ts
+++ b/src/services/note/delete.ts
@@ -4,14 +4,14 @@ import renderAnnounce from '../../remote/activitypub/renderer/announce';
 import renderUndo from '../../remote/activitypub/renderer/undo';
 import { renderActivity } from '../../remote/activitypub/renderer';
 import renderTombstone from '../../remote/activitypub/renderer/tombstone';
-import config from '../../config';
+import config from '@/config';
 import { registerOrFetchInstanceDoc } from '../register-or-fetch-instance-doc';
 import { User, ILocalUser, IRemoteUser } from '../../models/entities/user';
 import { Note, IMentionedRemoteUsers } from '../../models/entities/note';
 import { Notes, Users, Instances } from '../../models';
 import { notesChart, perUserNotesChart, instanceChart } from '../chart';
 import { deliverToFollowers, deliverToUser } from '../../remote/activitypub/deliver-manager';
-import { countSameRenotes } from '../../misc/count-same-renotes';
+import { countSameRenotes } from '@/misc/count-same-renotes';
 import { deliverToRelays } from '../relay';
 import { Brackets, In } from 'typeorm';
 
diff --git a/src/services/note/polls/vote.ts b/src/services/note/polls/vote.ts
index b4ce03ab6067a54005894bb1ee90a6610a72a103..aea157e5589218c609a91dc0b2f6490befaa701b 100644
--- a/src/services/note/polls/vote.ts
+++ b/src/services/note/polls/vote.ts
@@ -3,7 +3,7 @@ import { User } from '../../../models/entities/user';
 import { Note } from '../../../models/entities/note';
 import { PollVotes, NoteWatchings, Polls } from '../../../models';
 import { Not } from 'typeorm';
-import { genId } from '../../../misc/gen-id';
+import { genId } from '@/misc/gen-id';
 import { createNotification } from '../../create-notification';
 
 export default async function(user: User, note: Note, choice: number) {
diff --git a/src/services/note/reaction/create.ts b/src/services/note/reaction/create.ts
index 181099cc2dbf7ff2282087cebc77b7d0c0a7ade4..e2e7fc54ef3bed0f968b9504662ad6f26085f3ec 100644
--- a/src/services/note/reaction/create.ts
+++ b/src/services/note/reaction/create.ts
@@ -2,19 +2,19 @@ import { publishNoteStream } from '../../stream';
 import { renderLike } from '../../../remote/activitypub/renderer/like';
 import DeliverManager from '../../../remote/activitypub/deliver-manager';
 import { renderActivity } from '../../../remote/activitypub/renderer';
-import { toDbReaction, decodeReaction } from '../../../misc/reaction-lib';
+import { toDbReaction, decodeReaction } from '@/misc/reaction-lib';
 import { User, IRemoteUser } from '../../../models/entities/user';
 import { Note } from '../../../models/entities/note';
 import { NoteReactions, Users, NoteWatchings, Notes, Emojis } from '../../../models';
 import { Not } from 'typeorm';
 import { perUserReactionsChart } from '../../chart';
-import { genId } from '../../../misc/gen-id';
+import { genId } from '@/misc/gen-id';
 import { createNotification } from '../../create-notification';
 import deleteReaction from './delete';
-import { isDuplicateKeyValueError } from '../../../misc/is-duplicate-key-value-error';
+import { isDuplicateKeyValueError } from '@/misc/is-duplicate-key-value-error';
 import { NoteReaction } from '../../../models/entities/note-reaction';
 
-export default async (user: User, note: Note, reaction?: string) => {
+export default async (user: { id: User['id']; host: User['host']; }, note: Note, reaction?: string) => {
 	// TODO: cache
 	reaction = await toDbReaction(reaction, user.host);
 
diff --git a/src/services/note/reaction/delete.ts b/src/services/note/reaction/delete.ts
index 8d2f0682ca72e182cc3374d77e53b5ba2c00edd3..712031fa88a9f7be14ae2f2bc5af929de63c816a 100644
--- a/src/services/note/reaction/delete.ts
+++ b/src/services/note/reaction/delete.ts
@@ -3,13 +3,13 @@ import { renderLike } from '../../../remote/activitypub/renderer/like';
 import renderUndo from '../../../remote/activitypub/renderer/undo';
 import { renderActivity } from '../../../remote/activitypub/renderer';
 import DeliverManager from '../../../remote/activitypub/deliver-manager';
-import { IdentifiableError } from '../../../misc/identifiable-error';
+import { IdentifiableError } from '@/misc/identifiable-error';
 import { User, IRemoteUser } from '../../../models/entities/user';
 import { Note } from '../../../models/entities/note';
 import { NoteReactions, Users, Notes } from '../../../models';
-import { decodeReaction } from '../../../misc/reaction-lib';
+import { decodeReaction } from '@/misc/reaction-lib';
 
-export default async (user: User, note: Note) => {
+export default async (user: { id: User['id']; host: User['host']; }, note: Note) => {
 	// if already unreacted
 	const exist = await NoteReactions.findOne({
 		noteId: note.id,
diff --git a/src/services/note/read.ts b/src/services/note/read.ts
index 35279db41122e4136ef4d4ad3ab80909738d1157..2bdb85947676ebb9669d1c07a9c99a2543b9f54d 100644
--- a/src/services/note/read.ts
+++ b/src/services/note/read.ts
@@ -1,23 +1,72 @@
 import { publishMainStream } from '../stream';
 import { Note } from '../../models/entities/note';
 import { User } from '../../models/entities/user';
-import { NoteUnreads, Antennas, AntennaNotes, Users } from '../../models';
+import { NoteUnreads, AntennaNotes, Users, Followings, ChannelFollowings } from '../../models';
 import { Not, IsNull, In } from 'typeorm';
+import { Channel } from '../../models/entities/channel';
+import { checkHitAntenna } from '@/misc/check-hit-antenna';
+import { getAntennas } from '@/misc/antenna-cache';
+import { PackedNote } from '../../models/repositories/note';
 
 /**
  * Mark notes as read
  */
 export default async function(
 	userId: User['id'],
-	noteIds: Note['id'][]
+	notes: (Note | PackedNote)[],
+	info?: {
+		following: Set<User['id']>;
+		followingChannels: Set<Channel['id']>;
+	}
 ) {
-	async function careNoteUnreads() {
+	const following = info?.following ? info.following : new Set<string>((await Followings.find({
+		where: {
+			followerId: userId
+		},
+		select: ['followeeId']
+	})).map(x => x.followeeId));
+	const followingChannels = info?.followingChannels ? info.followingChannels : new Set<string>((await ChannelFollowings.find({
+		where: {
+			followerId: userId
+		},
+		select: ['followeeId']
+	})).map(x => x.followeeId));
+
+	const myAntennas = (await getAntennas()).filter(a => a.userId === userId);
+	const readMentions: (Note | PackedNote)[] = [];
+	const readSpecifiedNotes: (Note | PackedNote)[] = [];
+	const readChannelNotes: (Note | PackedNote)[] = [];
+	const readAntennaNotes: (Note | PackedNote)[] = [];
+
+	for (const note of notes) {
+		if (note.mentions && note.mentions.includes(userId)) {
+			readMentions.push(note);
+		} else if (note.visibleUserIds && note.visibleUserIds.includes(userId)) {
+			readSpecifiedNotes.push(note);
+		}
+
+		if (note.channelId && followingChannels.has(note.channelId)) {
+			readChannelNotes.push(note);
+		}
+
+		if (note.user != null) { // たぶんnullになることは無いはずだけど一応
+			for (const antenna of myAntennas) {
+				if (checkHitAntenna(antenna, note, note.user as any, undefined, Array.from(following))) {
+					readAntennaNotes.push(note);
+				}
+			}
+		}
+	}
+
+	if ((readMentions.length > 0) || (readSpecifiedNotes.length > 0) || (readChannelNotes.length > 0)) {
 		// Remove the record
 		await NoteUnreads.delete({
 			userId: userId,
-			noteId: In(noteIds),
+			noteId: In([...readMentions.map(n => n.id), ...readSpecifiedNotes.map(n => n.id), ...readChannelNotes.map(n => n.id)]),
 		});
 
+		// TODO: ↓まとめてクエリしたい
+
 		NoteUnreads.count({
 			userId: userId,
 			isMentioned: true
@@ -49,33 +98,25 @@ export default async function(
 		});
 	}
 
-	async function careAntenna() {
-		const antennas = await Antennas.find({ userId });
-
-		await Promise.all(antennas.map(async antenna => {
-			const countBefore = await AntennaNotes.count({
-				antennaId: antenna.id,
-				read: false
-			});
-
-			if (countBefore === 0) return;
-
-			await AntennaNotes.update({
-				antennaId: antenna.id,
-				noteId: In(noteIds)
-			}, {
-				read: true
-			});
+	if (readAntennaNotes.length > 0) {
+		await AntennaNotes.update({
+			antennaId: In(myAntennas.map(a => a.id)),
+			noteId: In(readAntennaNotes.map(n => n.id))
+		}, {
+			read: true
+		});
 
-			const countAfter = await AntennaNotes.count({
+		// TODO: まとめてクエリしたい
+		for (const antenna of myAntennas) {
+			const count = await AntennaNotes.count({
 				antennaId: antenna.id,
 				read: false
 			});
 
-			if (countAfter === 0) {
+			if (count === 0) {
 				publishMainStream(userId, 'readAntenna', antenna);
 			}
-		}));
+		}
 
 		Users.getHasUnreadAntenna(userId).then(unread => {
 			if (!unread) {
@@ -83,7 +124,4 @@ export default async function(
 			}
 		});
 	}
-
-	careNoteUnreads();
-	careAntenna();
 }
diff --git a/src/services/note/unread.ts b/src/services/note/unread.ts
index 8e6fb4abe8e0c91101f3976b26a059e94a278070..5cfba0f342f19bac69d2b1e0131f9f9291af999b 100644
--- a/src/services/note/unread.ts
+++ b/src/services/note/unread.ts
@@ -2,7 +2,7 @@ import { Note } from '../../models/entities/note';
 import { publishMainStream } from '../stream';
 import { User } from '../../models/entities/user';
 import { Mutings, NoteUnreads } from '../../models';
-import { genId } from '../../misc/gen-id';
+import { genId } from '@/misc/gen-id';
 
 export default async function(userId: User['id'], note: Note, params: {
 	// NOTE: isSpecifiedがtrueならisMentionedは必ずfalse
diff --git a/src/services/note/watch.ts b/src/services/note/watch.ts
index 966b7f0054bbcbc1406d9db73f4311b89ea2c1db..e333f0428655e0d6220ff1919e2de02f51fc6f4c 100644
--- a/src/services/note/watch.ts
+++ b/src/services/note/watch.ts
@@ -1,7 +1,7 @@
 import { User } from '../../models/entities/user';
 import { Note } from '../../models/entities/note';
 import { NoteWatchings } from '../../models';
-import { genId } from '../../misc/gen-id';
+import { genId } from '@/misc/gen-id';
 import { NoteWatching } from '../../models/entities/note-watching';
 
 export default async (me: User['id'], note: Note) => {
diff --git a/src/services/push-notification.ts b/src/services/push-notification.ts
index d0a0c04d62f0eeff73d0577a3ae9e3f74750906c..6c0b77c31fb096025b51cd31de3baa34a6fd538b 100644
--- a/src/services/push-notification.ts
+++ b/src/services/push-notification.ts
@@ -1,7 +1,7 @@
 import * as push from 'web-push';
-import config from '../config';
+import config from '@/config';
 import { SwSubscriptions } from '../models';
-import { fetchMeta } from '../misc/fetch-meta';
+import { fetchMeta } from '@/misc/fetch-meta';
 import { PackedNotification } from '../models/repositories/notification';
 import { PackedMessagingMessage } from '../models/repositories/messaging-message';
 
diff --git a/src/services/register-or-fetch-instance-doc.ts b/src/services/register-or-fetch-instance-doc.ts
index 2c39502288fd6077f0491a7b57d0251e21ff930e..2edf85fd9fbb1b29d601522ecbce5be023e1a66d 100644
--- a/src/services/register-or-fetch-instance-doc.ts
+++ b/src/services/register-or-fetch-instance-doc.ts
@@ -1,9 +1,9 @@
 import { Instance } from '../models/entities/instance';
 import { Instances } from '../models';
 import { federationChart } from './chart';
-import { genId } from '../misc/gen-id';
-import { toPuny } from '../misc/convert-host';
-import { Cache } from '../misc/cache';
+import { genId } from '@/misc/gen-id';
+import { toPuny } from '@/misc/convert-host';
+import { Cache } from '@/misc/cache';
 
 const cache = new Cache<Instance>(1000 * 60 * 60);
 
diff --git a/src/services/relay.ts b/src/services/relay.ts
index 0eb3bb41a1cb471214af128e38e8776406ef0efd..a2cc711bd3702aeba5f5022d6505872bb5c1a1da 100644
--- a/src/services/relay.ts
+++ b/src/services/relay.ts
@@ -3,9 +3,9 @@ import { renderFollowRelay } from '../remote/activitypub/renderer/follow-relay';
 import { renderActivity, attachLdSignature } from '../remote/activitypub/renderer';
 import renderUndo from '../remote/activitypub/renderer/undo';
 import { deliver } from '../queue';
-import { ILocalUser } from '../models/entities/user';
+import { ILocalUser, User } from '../models/entities/user';
 import { Users, Relays } from '../models';
-import { genId } from '../misc/gen-id';
+import { genId } from '@/misc/gen-id';
 
 const ACTOR_USERNAME = 'relay.actor' as const;
 
@@ -75,7 +75,7 @@ export async function relayRejected(id: string) {
 	return JSON.stringify(result);
 }
 
-export async function deliverToRelays(user: ILocalUser, activity: any) {
+export async function deliverToRelays(user: { id: User['id']; host: null; }, activity: any) {
 	if (activity == null) return;
 
 	const relays = await Relays.find({
diff --git a/src/services/send-email-notification.ts b/src/services/send-email-notification.ts
index 7579d5b67493a9c16012a94104cbfebe4657395a..08cd04289bca724da5b63386c03ef9692514ede2 100644
--- a/src/services/send-email-notification.ts
+++ b/src/services/send-email-notification.ts
@@ -2,7 +2,7 @@ import { UserProfiles } from '../models';
 import { User } from '../models/entities/user';
 import { sendEmail } from './send-email';
 import * as locales from '../../locales/';
-import { I18n } from '../misc/i18n';
+import { I18n } from '@/misc/i18n';
 
 // TODO: locale ファイルをクライアント用とサーバー用で分けたい
 
diff --git a/src/services/send-email.ts b/src/services/send-email.ts
index 4814808392b4d410427f7670b13bcec95a781e80..4784ba5510ce008e8aad3f8ad96b6a3bd3a66afd 100644
--- a/src/services/send-email.ts
+++ b/src/services/send-email.ts
@@ -1,7 +1,7 @@
 import * as nodemailer from 'nodemailer';
-import { fetchMeta } from '../misc/fetch-meta';
+import { fetchMeta } from '@/misc/fetch-meta';
 import Logger from './logger';
-import config from '../config';
+import config from '@/config';
 
 export const logger = new Logger('email');
 
diff --git a/src/services/stream.ts b/src/services/stream.ts
index 75385847cea89c60de64682db0142e19049bb613..6258dc5a7da6ad9070dd2526de785725b05b8319 100644
--- a/src/services/stream.ts
+++ b/src/services/stream.ts
@@ -1,10 +1,10 @@
-import redis from '../db/redis';
+import { redisClient } from '../db/redis';
 import { User } from '../models/entities/user';
 import { Note } from '../models/entities/note';
 import { UserList } from '../models/entities/user-list';
 import { ReversiGame } from '../models/entities/games/reversi/game';
 import { UserGroup } from '../models/entities/user-group';
-import config from '../config';
+import config from '@/config';
 import { Antenna } from '../models/entities/antenna';
 import { Channel } from '../models/entities/channel';
 
@@ -14,12 +14,16 @@ class Publisher {
 			{ type: type, body: null } :
 			{ type: type, body: value };
 
-		redis.publish(config.host, JSON.stringify({
+		redisClient.publish(config.host, JSON.stringify({
 			channel: channel,
 			message: message
 		}));
 	}
 
+	public publishInternalEvent = (type: string, value?: any): void => {
+		this.publish('internal', type, typeof value === 'undefined' ? null : value);
+	}
+
 	public publishUserEvent = (userId: User['id'], type: string, value?: any): void => {
 		this.publish(`user:${userId}`, type, typeof value === 'undefined' ? null : value);
 	}
@@ -88,6 +92,7 @@ const publisher = new Publisher();
 
 export default publisher;
 
+export const publishInternalEvent = publisher.publishInternalEvent;
 export const publishUserEvent = publisher.publishUserEvent;
 export const publishBroadcastStream = publisher.publishBroadcastStream;
 export const publishMainStream = publisher.publishMainStream;
diff --git a/src/services/suspend-user.ts b/src/services/suspend-user.ts
index a85188acbecba48c3c5bbcbb2ddf90c843a96b0a..c868c01305bbd72b9d7df257ba2a614d3bdd5e6d 100644
--- a/src/services/suspend-user.ts
+++ b/src/services/suspend-user.ts
@@ -1,12 +1,12 @@
 import renderDelete from '../remote/activitypub/renderer/delete';
 import { renderActivity } from '../remote/activitypub/renderer';
 import { deliver } from '../queue';
-import config from '../config';
+import config from '@/config';
 import { User } from '../models/entities/user';
 import { Users, Followings } from '../models';
 import { Not, IsNull } from 'typeorm';
 
-export async function doPostSuspend(user: User) {
+export async function doPostSuspend(user: { id: User['id']; host: User['host'] }) {
 	if (Users.isLocalUser(user)) {
 		// 知り得る全SharedInboxにDelete配信
 		const content = renderActivity(renderDelete(`${config.url}/users/${user.id}`, user));
@@ -28,7 +28,7 @@ export async function doPostSuspend(user: User) {
 		}
 
 		for (const inbox of queue) {
-			deliver(user as any, content, inbox);
+			deliver(user, content, inbox);
 		}
 	}
 }
diff --git a/src/services/unsuspend-user.ts b/src/services/unsuspend-user.ts
index 6cab375821fa0c8c98bc745f43c09924b48e633e..5bc4bba4230df1bc4e3b9ab8b4ebf5c73a5baba9 100644
--- a/src/services/unsuspend-user.ts
+++ b/src/services/unsuspend-user.ts
@@ -2,7 +2,7 @@ import renderDelete from '../remote/activitypub/renderer/delete';
 import renderUndo from '../remote/activitypub/renderer/undo';
 import { renderActivity } from '../remote/activitypub/renderer';
 import { deliver } from '../queue';
-import config from '../config';
+import config from '@/config';
 import { User } from '../models/entities/user';
 import { Users, Followings } from '../models';
 import { Not, IsNull } from 'typeorm';
diff --git a/src/services/update-hashtag.ts b/src/services/update-hashtag.ts
index 3e228467315d098c9db04210717c920bb1702c8e..6b7208f005ef3da6c40453b812c5fca4b384c2d5 100644
--- a/src/services/update-hashtag.ts
+++ b/src/services/update-hashtag.ts
@@ -1,11 +1,11 @@
 import { User } from '../models/entities/user';
 import { Hashtags, Users } from '../models';
 import { hashtagChart } from './chart';
-import { genId } from '../misc/gen-id';
+import { genId } from '@/misc/gen-id';
 import { Hashtag } from '../models/entities/hashtag';
-import { normalizeForSearch } from '../misc/normalize-for-search';
+import { normalizeForSearch } from '@/misc/normalize-for-search';
 
-export async function updateHashtags(user: User, tags: string[]) {
+export async function updateHashtags(user: { id: User['id']; host: User['host']; }, tags: string[]) {
 	for (const tag of tags) {
 		await updateHashtag(user, tag);
 	}
@@ -21,7 +21,7 @@ export async function updateUsertags(user: User, tags: string[]) {
 	}
 }
 
-export async function updateHashtag(user: User, tag: string, isUserAttached = false, inc = true) {
+export async function updateHashtag(user: { id: User['id']; host: User['host']; }, tag: string, isUserAttached = false, inc = true) {
 	tag = normalizeForSearch(tag);
 
 	const index = await Hashtags.findOne({ name: tag });
diff --git a/src/services/user-list/push.ts b/src/services/user-list/push.ts
index ba54c044752381e10ec7fb6e8b261f07ae1f57fb..3dd9a8576b1b4f521bcdb2c76ea4527e0c18dc28 100644
--- a/src/services/user-list/push.ts
+++ b/src/services/user-list/push.ts
@@ -3,8 +3,8 @@ import { User } from '../../models/entities/user';
 import { UserList } from '../../models/entities/user-list';
 import { UserListJoinings, Users } from '../../models';
 import { UserListJoining } from '../../models/entities/user-list-joining';
-import { genId } from '../../misc/gen-id';
-import { fetchProxyAccount } from '../../misc/fetch-proxy-account';
+import { genId } from '@/misc/gen-id';
+import { fetchProxyAccount } from '@/misc/fetch-proxy-account';
 import createFollowing from '../following/create';
 
 export async function pushUserToUserList(target: User, list: UserList) {
diff --git a/src/tools/accept-migration.ts b/src/tools/accept-migration.ts
index addce86f1f6bdfd4ffd3b759e6320b616c9e3bbf..06228693980ad17fcf04fe1378b7e7390bcda70c 100644
--- a/src/tools/accept-migration.ts
+++ b/src/tools/accept-migration.ts
@@ -1,7 +1,7 @@
 // ex) node built/tools/accept-migration Yo 1000000000001
 
 import { createConnection } from 'typeorm';
-import config from '../config';
+import config from '@/config';
 
 createConnection({
 	type: 'postgres',
diff --git a/src/tools/add-emoji.ts b/src/tools/add-emoji.ts
index 3745b48889a2e33785622f078e0218f3aae8290c..ca25d1348b49e6f86ac2a4843c6a055a1ee2e5dd 100644
--- a/src/tools/add-emoji.ts
+++ b/src/tools/add-emoji.ts
@@ -1,5 +1,5 @@
 import { Emojis } from '../models';
-import { genId } from '../misc/gen-id';
+import { genId } from '@/misc/gen-id';
 
 async function main(name: string, url: string, alias?: string): Promise<any> {
 	const aliases = alias != null ? [ alias ] : [];
diff --git a/src/tools/resync-remote-user.ts b/src/tools/resync-remote-user.ts
index c9d1ed588c5f58a20901566e1c992f41e914139b..9897cba9f8e1badae36e1afc6369761d3f5f1922 100644
--- a/src/tools/resync-remote-user.ts
+++ b/src/tools/resync-remote-user.ts
@@ -1,4 +1,4 @@
-import parseAcct from '../misc/acct/parse';
+import parseAcct from '@/misc/acct/parse';
 import { resolveUser } from '../remote/resolve-user';
 
 async function main(acct: string): Promise<any> {
diff --git a/src/tsconfig.json b/src/tsconfig.json
index 95cb35fc5fbf7c8ed6a77ed17d52d0a71fe9e0e8..9389008eef8fc751143ac3114e736538808671d8 100644
--- a/src/tsconfig.json
+++ b/src/tsconfig.json
@@ -5,7 +5,7 @@
 		"noImplicitAny": true,
 		"noImplicitReturns": true,
 		"noUnusedParameters": false,
-		"noUnusedLocals": true,
+		"noUnusedLocals": false,
 		"noFallthroughCasesInSwitch": true,
 		"declaration": false,
 		"sourceMap": true,
@@ -21,6 +21,12 @@
 		"emitDecoratorMetadata": true,
 		"resolveJsonModule": true,
 		"isolatedModules": true,
+		"rootDir": "./",
+		"baseUrl": "./",
+		"paths": {
+			"@/*": ["./*"]
+		},
+		"outDir": "../built",
 		"typeRoots": [
 			"../node_modules/@types",
 			"./@types"
diff --git a/test/tsconfig.json b/test/tsconfig.json
index 987067ba81919379b5b75d13a2ff2749578ed91c..31a537805abd0350184647ba84b2065ada1324c3 100644
--- a/test/tsconfig.json
+++ b/test/tsconfig.json
@@ -21,6 +21,10 @@
 		"emitDecoratorMetadata": true,
 		"resolveJsonModule": true,
 		"isolatedModules": true,
+		"baseUrl": "./",
+		"paths": {
+			"@/*": ["../src/*"]
+		},
 		"typeRoots": [
 			"../node_modules/@types",
 			"../src/@types"
diff --git a/webpack.config.ts b/webpack.config.ts
index c530cf335c8350146957485acde3c7ba603ebac2..5ead4f3af227d2ddae864e2b6c557f6440ce6e2b 100644
--- a/webpack.config.ts
+++ b/webpack.config.ts
@@ -105,7 +105,7 @@ module.exports = {
 			}, postcss]
 		}, {
 			test: /\.(eot|woff|woff2|svg|ttf)([?]?.*)$/,
-			loader: 'url-loader'
+			type: 'asset/resource'
 		}, {
 			test: /\.json5$/,
 			loader: 'json5-loader',
@@ -157,7 +157,8 @@ module.exports = {
 			'.js', '.ts', '.json'
 		],
 		alias: {
-			'@': __dirname + '/src/client',
+			'@client': __dirname + '/src/client',
+			'@': __dirname + '/src',
 			'const.styl': __dirname + '/src/client/const.styl'
 		}
 	},
diff --git a/yarn.lock b/yarn.lock
index eecd562aac6d1c03e3b671de27f4b43b6ce05aa5..398c51f3c41e0d84d587746336b1f290271c22b6 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -239,6 +239,22 @@
   resolved "https://registry.yarnpkg.com/@fortawesome/vue-fontawesome/-/vue-fontawesome-3.0.0-3.tgz#b658a7c1f35d4eb04ac85749da693be483442b25"
   integrity sha512-fCM7+R9M7Y/ipKC5n9hukGpJHhe53JOENGqtku/KWtpXsnbGik3AS5zfJYEupV2uXOw/5S0RSSfttQ2hNIrmFA==
 
+"@jfonx/console-utils@^1.0.3":
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/@jfonx/console-utils/-/console-utils-1.0.3.tgz#cbb7f911e4191a4a2fe1ba4807d29f100b5d099f"
+  integrity sha512-/XbnqjWc7yNZVLAJJO9rimfIz9DYte+cj3EF9hwhIv7vw6ok2t3cjl0huYsmD89srKH03vWjeqAcIH86CuYj3g==
+  dependencies:
+    colors "^1.3.3"
+
+"@jfonx/file-utils@^3.0.1":
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/@jfonx/file-utils/-/file-utils-3.0.1.tgz#8d3d6e931a283420fe29802ea71c28dd397cd8d3"
+  integrity sha512-qwH0CuzWmghtTHGMyuPHj6SJPQgWeiXFJBfrxCWMbzxVCa3aLZPEfzSdlSnC/UABsk6feRkNdHXw59rVshNPqw==
+  dependencies:
+    "@jfonx/console-utils" "^1.0.3"
+    comment-json "^4.1.0"
+    find-up "^4.1.0"
+
 "@koa/cors@3.1.0":
   version "3.1.0"
   resolved "https://registry.yarnpkg.com/@koa/cors/-/cors-3.1.0.tgz#618bb073438cfdbd3ebd0e648a76e33b84f3a3b2"
@@ -667,6 +683,11 @@
   resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.6.tgz#f4c7ec43e81b319a9815115031709f26987891f0"
   integrity sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==
 
+"@types/json5@^0.0.29":
+  version "0.0.29"
+  resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee"
+  integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4=
+
 "@types/jsonld@1.5.5":
   version "1.5.5"
   resolved "https://registry.yarnpkg.com/@types/jsonld/-/jsonld-1.5.5.tgz#c2238462a83e90f003929cef6a36eded2ceed069"
@@ -1707,6 +1728,11 @@ array-sort@^1.0.0:
     get-value "^2.0.6"
     kind-of "^5.0.2"
 
+array-timsort@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/array-timsort/-/array-timsort-1.0.3.tgz#3c9e4199e54fb2b9c3fe5976396a21614ef0d926"
+  integrity sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==
+
 array-union@^2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d"
@@ -2453,7 +2479,7 @@ cheerio@^0.22.0:
     lodash.reject "^4.4.0"
     lodash.some "^4.4.0"
 
-chokidar@3.5.1, "chokidar@>=2.0.0 <4.0.0", chokidar@^2.0.0, chokidar@^3.3.1:
+chokidar@3.5.1, "chokidar@>=2.0.0 <4.0.0", chokidar@^2.0.0, chokidar@^3.3.1, chokidar@^3.5.0:
   version "3.3.1"
   resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.1.tgz#c84e5b3d18d9a4d77558fef466b1bf16bbeb3450"
   integrity sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg==
@@ -2793,7 +2819,7 @@ commander@^2.12.1, commander@^2.19.0, commander@^2.20.0, commander@~2.20.3:
   resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
   integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
 
-commander@^6.0.0:
+commander@^6.0.0, commander@^6.2.1:
   version "6.2.1"
   resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c"
   integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==
@@ -2803,6 +2829,17 @@ commander@^7.0.0:
   resolved "https://registry.yarnpkg.com/commander/-/commander-7.0.0.tgz#3e2bbfd8bb6724760980988fb5b22b7ee6b71ab2"
   integrity sha512-ovx/7NkTrnPuIV8sqk/GjUIIM1+iUQeqA3ye2VNpq9sVoiZsooObWlQy+OPWGI17GDaEoybuAGJm6U8yC077BA==
 
+comment-json@^4.1.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/comment-json/-/comment-json-4.1.0.tgz#09d08f0fbc4ad5eeccbac20f469adbb967dcbd2c"
+  integrity sha512-WEghmVYaNq9NlWbrkzQTSsya9ycLyxJxpTQfZEan6a5Jomnjw18zS3Podf8q1Zf9BvonvQd/+Z7Z39L7KKzzdQ==
+  dependencies:
+    array-timsort "^1.0.3"
+    core-util-is "^1.0.2"
+    esprima "^4.0.1"
+    has-own-prop "^2.0.0"
+    repeat-string "^1.6.1"
+
 commondir@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
@@ -2946,7 +2983,7 @@ core-js@3.9.1:
   resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.9.1.tgz#cec8de593db8eb2a85ffb0dbdeb312cb6e5460ae"
   integrity sha512-gSjRvzkxQc1zjM/5paAmL4idJBFzuJoo+jDjF1tStYFMV2ERfD02HhahhCGXUyHxQRG4yFKVSdO6g62eoRMcDg==
 
-core-util-is@1.0.2, core-util-is@~1.0.0:
+core-util-is@1.0.2, core-util-is@^1.0.2, core-util-is@~1.0.0:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
   integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
@@ -4259,6 +4296,14 @@ find-cache-dir@^2.0.0:
     make-dir "^2.0.0"
     pkg-dir "^3.0.0"
 
+find-node-modules@^2.1.0:
+  version "2.1.2"
+  resolved "https://registry.yarnpkg.com/find-node-modules/-/find-node-modules-2.1.2.tgz#57565a3455baf671b835bc6b2134a9b938b9c53c"
+  integrity sha512-x+3P4mbtRPlSiVE1Qco0Z4YLU8WFiFcuWTf3m75OV9Uzcfs2Bg+O9N+r/K0AnmINBW06KpfqKwYJbFlFq4qNug==
+  dependencies:
+    findup-sync "^4.0.0"
+    merge "^2.1.0"
+
 find-up@5.0.0:
   version "5.0.0"
   resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc"
@@ -4282,7 +4327,7 @@ find-up@^3.0.0:
   dependencies:
     locate-path "^3.0.0"
 
-find-up@^4.0.0:
+find-up@^4.0.0, find-up@^4.1.0:
   version "4.1.0"
   resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19"
   integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==
@@ -4310,6 +4355,16 @@ findup-sync@^3.0.0:
     micromatch "^3.0.4"
     resolve-dir "^1.0.1"
 
+findup-sync@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-4.0.0.tgz#956c9cdde804052b881b428512905c4a5f2cdef0"
+  integrity sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==
+  dependencies:
+    detect-file "^1.0.0"
+    is-glob "^4.0.0"
+    micromatch "^4.0.2"
+    resolve-dir "^1.0.1"
+
 fined@^1.0.1:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/fined/-/fined-1.2.0.tgz#d00beccf1aa2b475d16d423b0238b713a2c4a37b"
@@ -4652,6 +4707,18 @@ globby@^11.0.1:
     merge2 "^1.3.0"
     slash "^3.0.0"
 
+globby@^11.0.2:
+  version "11.0.3"
+  resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.3.tgz#9b1f0cb523e171dd1ad8c7b2a9fb4b644b9593cb"
+  integrity sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg==
+  dependencies:
+    array-union "^2.1.0"
+    dir-glob "^3.0.1"
+    fast-glob "^3.1.1"
+    ignore "^5.1.4"
+    merge2 "^1.3.0"
+    slash "^3.0.0"
+
 glogg@^1.0.0:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/glogg/-/glogg-1.0.2.tgz#2d7dd702beda22eb3bffadf880696da6d846313f"
@@ -4764,18 +4831,6 @@ gulp-tslint@8.1.4:
     plugin-error "1.0.1"
     through "~2.3.8"
 
-gulp-typescript@6.0.0-alpha.1:
-  version "6.0.0-alpha.1"
-  resolved "https://registry.yarnpkg.com/gulp-typescript/-/gulp-typescript-6.0.0-alpha.1.tgz#fcb0dbbc79c34201f0945c6323c194a8f5455a04"
-  integrity sha512-KoT0TTfjfT7w3JItHkgFH1T/zK4oXWC+a8xxKfniRfVcA0Fa1bKrIhztYelYmb+95RB80OLMBreknYkdwzdi2Q==
-  dependencies:
-    ansi-colors "^4.1.1"
-    plugin-error "^1.0.1"
-    source-map "^0.7.3"
-    through2 "^3.0.1"
-    vinyl "^2.2.0"
-    vinyl-fs "^3.0.3"
-
 gulp@4.0.2:
   version "4.0.2"
   resolved "https://registry.yarnpkg.com/gulp/-/gulp-4.0.2.tgz#543651070fd0f6ab0a0650c6a3e6ff5a7cb09caa"
@@ -4847,6 +4902,11 @@ has-flag@^4.0.0:
   resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
   integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
 
+has-own-prop@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/has-own-prop/-/has-own-prop-2.0.0.tgz#f0f95d58f65804f5d218db32563bb85b8e0417af"
+  integrity sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ==
+
 has-symbols@^1.0.0, has-symbols@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8"
@@ -6533,6 +6593,11 @@ merge2@^1.3.0:
   resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
   integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
 
+merge@^2.1.0:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/merge/-/merge-2.1.1.tgz#59ef4bf7e0b3e879186436e8481c06a6c162ca98"
+  integrity sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w==
+
 methods@^1.1.2:
   version "1.1.2"
   resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
@@ -8689,7 +8754,7 @@ readable-stream@1.1.x:
     isarray "0.0.1"
     string_decoder "~0.10.x"
 
-"readable-stream@2 || 3", readable-stream@3, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0:
+readable-stream@3, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0:
   version "3.6.0"
   resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
   integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
@@ -9503,7 +9568,7 @@ source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1:
   resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
   integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
 
-source-map@^0.7.3, source-map@~0.7.2:
+source-map@~0.7.2:
   version "0.7.3"
   resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383"
   integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==
@@ -9790,6 +9855,11 @@ strip-bom@^2.0.0:
   dependencies:
     is-utf8 "^0.2.0"
 
+strip-bom@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
+  integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=
+
 strip-eof@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
@@ -10168,13 +10238,6 @@ through2@^2.0.0, through2@^2.0.3, through2@~2.0.0:
     readable-stream "~2.3.6"
     xtend "~4.0.1"
 
-through2@^3.0.1:
-  version "3.0.1"
-  resolved "https://registry.yarnpkg.com/through2/-/through2-3.0.1.tgz#39276e713c3302edf9e388dd9c812dd3b825bd5a"
-  integrity sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==
-  dependencies:
-    readable-stream "2 || 3"
-
 through2@^4.0.2:
   version "4.0.2"
   resolved "https://registry.yarnpkg.com/through2/-/through2-4.0.2.tgz#a7ce3ac2a7a8b0b966c80e7c49f0484c3b239764"
@@ -10358,6 +10421,29 @@ ts-node@9.1.1:
     source-map-support "^0.5.17"
     yn "3.1.1"
 
+tsc-alias@1.2.8:
+  version "1.2.8"
+  resolved "https://registry.yarnpkg.com/tsc-alias/-/tsc-alias-1.2.8.tgz#d88bfce778c0b31d095a132209b4eefe7e16cc16"
+  integrity sha512-29WMSalu0cW/VuNeTEs/CPjz5z5Ae2ZBlTV0gjeoQwJNjZ5sDyPmu1C0rDmvOLPEJyo/iwqOMtNAlG17fEqBCw==
+  dependencies:
+    "@jfonx/console-utils" "^1.0.3"
+    "@jfonx/file-utils" "^3.0.1"
+    chokidar "^3.5.0"
+    commander "^6.2.1"
+    find-node-modules "^2.1.0"
+    globby "^11.0.2"
+    normalize-path "^3.0.0"
+
+tsconfig-paths@3.9.0:
+  version "3.9.0"
+  resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz#098547a6c4448807e8fcb8eae081064ee9a3c90b"
+  integrity sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==
+  dependencies:
+    "@types/json5" "^0.0.29"
+    json5 "^1.0.1"
+    minimist "^1.2.0"
+    strip-bom "^3.0.0"
+
 tslib@^1.13.0:
   version "1.13.0"
   resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043"
@@ -10644,15 +10730,6 @@ urix@^0.1.0:
   resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
   integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=
 
-url-loader@4.1.1:
-  version "4.1.1"
-  resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-4.1.1.tgz#28505e905cae158cf07c92ca622d7f237e70a4e2"
-  integrity sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==
-  dependencies:
-    loader-utils "^2.0.0"
-    mime-types "^2.1.27"
-    schema-utils "^3.0.0"
-
 url@0.10.3:
   version "0.10.3"
   resolved "https://registry.yarnpkg.com/url/-/url-0.10.3.tgz#021e4d9c7705f21bbf37d03ceb58767402774c64"
@@ -10772,7 +10849,7 @@ verror@1.10.0:
     core-util-is "1.0.2"
     extsprintf "^1.2.0"
 
-vinyl-fs@^3.0.0, vinyl-fs@^3.0.3:
+vinyl-fs@^3.0.0:
   version "3.0.3"
   resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-3.0.3.tgz#c85849405f67428feabbbd5c5dbdd64f47d31bc7"
   integrity sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==
@@ -10815,7 +10892,7 @@ vinyl-sourcemaps-apply@^0.2.1:
   dependencies:
     source-map "^0.5.1"
 
-vinyl@^2.0.0, vinyl@^2.2.0:
+vinyl@^2.0.0:
   version "2.2.0"
   resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-2.2.0.tgz#d85b07da96e458d25b2ffe19fece9f2caa13ed86"
   integrity sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==
@@ -10990,10 +11067,10 @@ webpack-sources@^2.1.1:
     source-list-map "^2.0.1"
     source-map "^0.6.1"
 
-webpack@5.26.3:
-  version "5.26.3"
-  resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.26.3.tgz#bafd439abac08fbb82657ec855d038743b725ab8"
-  integrity sha512-z/F2lt2N1fZqaud1B4SzjL3OW03eULThbBXQ2OX4LSrZX4N9k1A5d0Rje3zS2g887DTWyAV0KGqEf64ois2dhg==
+webpack@5.27.2:
+  version "5.27.2"
+  resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.27.2.tgz#44442219e1469ebe00292703b848580faae03f07"
+  integrity sha512-brNF3N/EdvMzkaZ/Xzb8sqPn5Si3iw6meqCnmNFtcnkorZsFZCBFMa2ElpIMjx6sKWYsnUpBO2dnX+7xgj+mjg==
   dependencies:
     "@types/eslint-scope" "^3.7.0"
     "@types/estree" "^0.0.46"