From d6e23b803b10a471bb5b1054b357c70a16e8f6da Mon Sep 17 00:00:00 2001
From: syuilo <Syuilotan@yahoo.co.jp>
Date: Tue, 23 Mar 2021 17:30:14 +0900
Subject: [PATCH] refactor: Tweak path alias of client

---
 src/client/account.ts                         |  6 +-
 src/client/components/abuse-report-window.vue |  8 +--
 src/client/components/analog-clock.vue        |  2 +-
 src/client/components/autocomplete.vue        |  8 +--
 src/client/components/avatars.vue             |  2 +-
 .../components/channel-follow-button.vue      |  2 +-
 src/client/components/dialog.vue              |  8 +--
 .../components/drive-file-thumbnail.vue       |  2 +-
 src/client/components/drive-select-dialog.vue |  4 +-
 src/client/components/drive-window.vue        |  2 +-
 src/client/components/drive.file.vue          |  6 +-
 src/client/components/drive.folder.vue        |  2 +-
 src/client/components/drive.nav-folder.vue    |  2 +-
 src/client/components/drive.vue               |  2 +-
 src/client/components/emoji-picker-dialog.vue |  4 +-
 src/client/components/emoji-picker-window.vue |  4 +-
 .../components/emoji-picker.section.vue       |  2 +-
 src/client/components/emoji-picker.vue        | 12 ++--
 src/client/components/featured-photos.vue     |  2 +-
 src/client/components/file-type-icon.vue      |  2 +-
 src/client/components/follow-button.vue       |  2 +-
 src/client/components/form-dialog.vue         |  2 +-
 src/client/components/form/pagination.vue     |  2 +-
 src/client/components/form/radios.vue         |  2 +-
 src/client/components/formula-core.vue        |  2 +-
 src/client/components/formula.vue             |  2 +-
 src/client/components/global/a.vue            | 12 ++--
 src/client/components/global/acct.vue         |  2 +-
 src/client/components/global/avatar.vue       |  6 +-
 src/client/components/global/emoji.vue        |  4 +-
 src/client/components/global/error.vue        |  2 +-
 src/client/components/global/loading.vue      |  2 +-
 .../global/misskey-flavored-markdown.vue      |  2 +-
 src/client/components/global/url.vue          |  8 +--
 src/client/components/google.vue              |  2 +-
 src/client/components/image-viewer.vue        |  6 +-
 src/client/components/instance-stats.vue      |  4 +-
 src/client/components/instance-ticker.vue     |  2 +-
 src/client/components/launch-pad.vue          |  6 +-
 src/client/components/link.vue                |  8 +--
 src/client/components/media-banner.vue        |  4 +-
 src/client/components/media-image.vue         |  6 +-
 src/client/components/media-list.vue          |  2 +-
 src/client/components/media-video.vue         |  2 +-
 src/client/components/mention.vue             |  4 +-
 src/client/components/mfm.ts                  | 24 ++++----
 src/client/components/mini-chart.vue          |  2 +-
 src/client/components/note-detailed.vue       | 24 ++++----
 src/client/components/note-header.vue         |  2 +-
 src/client/components/note-preview.vue        |  2 +-
 src/client/components/note.sub.vue            |  2 +-
 src/client/components/note.vue                | 24 ++++----
 src/client/components/notes.vue               |  4 +-
 .../notification-setting-window.vue           |  2 +-
 src/client/components/notification.vue        |  4 +-
 src/client/components/notifications.vue       |  4 +-
 src/client/components/page-preview.vue        |  2 +-
 src/client/components/page-window.vue         | 12 ++--
 src/client/components/page/page.block.vue     |  4 +-
 src/client/components/page/page.button.vue    |  6 +-
 src/client/components/page/page.canvas.vue    |  6 +-
 src/client/components/page/page.counter.vue   |  6 +-
 src/client/components/page/page.if.vue        |  4 +-
 src/client/components/page/page.image.vue     |  6 +-
 src/client/components/page/page.note.vue      |  8 +--
 .../components/page/page.number-input.vue     |  6 +-
 src/client/components/page/page.post.vue      |  8 +--
 .../components/page/page.radio-button.vue     |  6 +-
 src/client/components/page/page.section.vue   |  6 +-
 src/client/components/page/page.switch.vue    |  6 +-
 .../components/page/page.text-input.vue       |  6 +-
 src/client/components/page/page.text.vue      |  6 +-
 .../components/page/page.textarea-input.vue   |  8 +--
 src/client/components/page/page.textarea.vue  |  4 +-
 src/client/components/page/page.vue           |  8 +--
 src/client/components/poll.vue                |  2 +-
 src/client/components/post-form-attaches.vue  |  2 +-
 src/client/components/post-form-dialog.vue    |  4 +-
 src/client/components/post-form.vue           | 12 ++--
 .../components/reactions-viewer.reaction.vue  |  6 +-
 src/client/components/remote-caution.vue      |  2 +-
 src/client/components/sample.vue              | 14 ++---
 src/client/components/sidebar.vue             | 10 ++--
 src/client/components/signin-dialog.vue       |  2 +-
 src/client/components/signin.vue              |  8 +--
 src/client/components/signup-dialog.vue       |  2 +-
 src/client/components/signup.vue              |  6 +-
 src/client/components/sub-note-content.vue    |  2 +-
 .../components/taskmanager.api-window.vue     |  4 +-
 src/client/components/taskmanager.vue         | 10 ++--
 src/client/components/timeline.vue            |  4 +-
 .../components/token-generate-window.vue      |  2 +-
 src/client/components/ui/context-menu.vue     |  2 +-
 src/client/components/ui/hr.vue               |  2 +-
 src/client/components/ui/info.vue             |  2 +-
 src/client/components/ui/input.vue            |  2 +-
 src/client/components/ui/menu.vue             |  4 +-
 src/client/components/ui/pagination.vue       |  2 +-
 src/client/components/ui/radios.vue           |  2 +-
 src/client/components/ui/window.vue           |  4 +-
 src/client/components/url-preview-popup.vue   |  2 +-
 src/client/components/url-preview.vue         |  4 +-
 src/client/components/user-list.vue           |  2 +-
 src/client/components/user-preview.vue        |  2 +-
 src/client/components/user-select-dialog.vue  |  4 +-
 src/client/components/users-dialog.vue        |  2 +-
 src/client/components/visibility-picker.vue   |  2 +-
 src/client/components/waiting-dialog.vue      |  2 +-
 src/client/components/widgets.vue             |  6 +-
 src/client/directives/follow-append.ts        |  2 +-
 src/client/directives/particle.ts             |  4 +-
 src/client/directives/tooltip.ts              |  6 +-
 src/client/directives/user-preview.ts         |  4 +-
 src/client/filters/user.ts                    |  2 +-
 src/client/i18n.ts                            |  2 +-
 src/client/init.ts                            | 56 +++++++++----------
 src/client/os.ts                              | 38 ++++++-------
 src/client/pages/_error_.vue                  |  2 +-
 src/client/pages/_loading_.vue                |  2 +-
 src/client/pages/about-misskey.vue            | 16 +++---
 src/client/pages/about.vue                    | 14 ++---
 src/client/pages/advanced-theme-editor.vue    | 24 ++++----
 src/client/pages/announcements.vue            |  6 +-
 src/client/pages/api-console.vue              | 10 ++--
 src/client/pages/auth.form.vue                |  4 +-
 src/client/pages/auth.vue                     |  6 +-
 src/client/pages/channel-editor.vue           | 10 ++--
 src/client/pages/channel.vue                  | 10 ++--
 src/client/pages/channels.vue                 |  8 +--
 src/client/pages/clip.vue                     |  8 +--
 src/client/pages/doc.vue                      |  4 +-
 src/client/pages/docs.vue                     |  2 +-
 src/client/pages/drive.vue                    |  4 +-
 src/client/pages/explore.vue                  | 10 ++--
 src/client/pages/favorites.vue                |  6 +-
 src/client/pages/featured.vue                 |  4 +-
 src/client/pages/follow-requests.vue          |  4 +-
 src/client/pages/follow.vue                   |  2 +-
 src/client/pages/instance/abuses.vue          | 10 ++--
 src/client/pages/instance/announcements.vue   |  8 +--
 .../pages/instance/emoji-edit-dialog.vue      |  8 +--
 src/client/pages/instance/emojis.vue          | 12 ++--
 src/client/pages/instance/federation.vue      | 10 ++--
 src/client/pages/instance/file-dialog.vue     | 14 ++---
 src/client/pages/instance/files.vue           | 14 ++---
 src/client/pages/instance/index.metrics.vue   | 14 ++---
 src/client/pages/instance/index.vue           | 16 +++---
 src/client/pages/instance/instance.vue        | 14 ++---
 src/client/pages/instance/logs.vue            | 10 ++--
 src/client/pages/instance/queue.chart.vue     |  2 +-
 src/client/pages/instance/queue.vue           |  4 +-
 src/client/pages/instance/relays.vue          |  6 +-
 src/client/pages/instance/settings.vue        | 18 +++---
 src/client/pages/instance/user-dialog.vue     | 10 ++--
 src/client/pages/instance/users.vue           | 10 ++--
 src/client/pages/mentions.vue                 |  4 +-
 src/client/pages/messages.vue                 |  4 +-
 src/client/pages/messaging/index.vue          |  4 +-
 .../pages/messaging/messaging-room.form.vue   |  6 +-
 .../messaging/messaging-room.message.vue      |  4 +-
 src/client/pages/messaging/messaging-room.vue | 10 ++--
 src/client/pages/mfm-cheat-sheet.vue          |  2 +-
 src/client/pages/miauth.vue                   |  8 +--
 .../pages/my-antennas/index.antenna.vue       | 12 ++--
 src/client/pages/my-antennas/index.vue        |  4 +-
 src/client/pages/my-clips/index.vue           |  6 +-
 src/client/pages/my-groups/group.vue          |  6 +-
 src/client/pages/my-groups/index.vue          | 12 ++--
 src/client/pages/my-lists/index.vue           |  6 +-
 src/client/pages/my-lists/list.vue            |  6 +-
 src/client/pages/not-found.vue                |  2 +-
 src/client/pages/note.vue                     | 12 ++--
 src/client/pages/notifications.vue            |  6 +-
 .../page-editor/els/page-editor.el.button.vue |  8 +--
 .../page-editor/els/page-editor.el.canvas.vue |  4 +-
 .../els/page-editor.el.counter.vue            |  4 +-
 .../page-editor/els/page-editor.el.if.vue     |  4 +-
 .../page-editor/els/page-editor.el.image.vue  |  4 +-
 .../page-editor/els/page-editor.el.note.vue   | 10 ++--
 .../els/page-editor.el.number-input.vue       |  4 +-
 .../page-editor/els/page-editor.el.post.vue   |  8 +--
 .../els/page-editor.el.radio-button.vue       |  6 +-
 .../els/page-editor.el.section.vue            |  2 +-
 .../page-editor/els/page-editor.el.switch.vue |  6 +-
 .../els/page-editor.el.text-input.vue         |  4 +-
 .../page-editor/els/page-editor.el.text.vue   |  2 +-
 .../els/page-editor.el.textarea-input.vue     |  6 +-
 .../els/page-editor.el.textarea.vue           |  2 +-
 .../pages/page-editor/page-editor.blocks.vue  |  2 +-
 .../page-editor/page-editor.script-block.vue  | 10 ++--
 src/client/pages/page-editor/page-editor.vue  | 24 ++++----
 src/client/pages/page.vue                     |  4 +-
 src/client/pages/pages.vue                    |  8 +--
 src/client/pages/preview.vue                  |  2 +-
 src/client/pages/reversi/game.board.vue       | 10 ++--
 src/client/pages/reversi/game.setting.vue     |  6 +-
 src/client/pages/reversi/game.vue             |  2 +-
 src/client/pages/reversi/index.vue            |  6 +-
 src/client/pages/room/preview.vue             |  2 +-
 src/client/pages/room/room.vue                | 14 ++---
 src/client/pages/scratchpad.vue               |  8 +--
 src/client/pages/search.vue                   |  4 +-
 src/client/pages/settings/2fa.vue             | 20 +++----
 src/client/pages/settings/account-info.vue    | 20 +++----
 src/client/pages/settings/api.vue             | 16 +++---
 src/client/pages/settings/apps.vue            | 14 ++---
 src/client/pages/settings/deck.vue            | 18 +++---
 src/client/pages/settings/drive.vue           | 12 ++--
 src/client/pages/settings/email-address.vue   | 10 ++--
 .../pages/settings/email-notification.vue     | 10 ++--
 src/client/pages/settings/email.vue           | 12 ++--
 .../pages/settings/experimental-features.vue  | 16 +++---
 src/client/pages/settings/general.vue         | 26 ++++-----
 src/client/pages/settings/import-export.vue   | 12 ++--
 src/client/pages/settings/index.vue           | 16 +++---
 src/client/pages/settings/integration.vue     |  8 +--
 src/client/pages/settings/mute-block.vue      | 16 +++---
 src/client/pages/settings/notifications.vue   | 12 ++--
 src/client/pages/settings/other.vue           | 24 ++++----
 src/client/pages/settings/plugin.install.vue  | 24 ++++----
 src/client/pages/settings/plugin.manage.vue   | 18 +++---
 src/client/pages/settings/plugin.vue          | 10 ++--
 src/client/pages/settings/privacy.vue         | 12 ++--
 src/client/pages/settings/profile.vue         | 20 +++----
 src/client/pages/settings/reaction.vue        | 14 ++---
 src/client/pages/settings/registry.keys.vue   | 18 +++---
 src/client/pages/settings/registry.value.vue  | 18 +++---
 src/client/pages/settings/registry.vue        | 18 +++---
 src/client/pages/settings/security.vue        | 12 ++--
 src/client/pages/settings/sidebar.vue         | 18 +++---
 src/client/pages/settings/sounds.vue          | 16 +++---
 src/client/pages/settings/theme.install.vue   | 22 ++++----
 src/client/pages/settings/theme.manage.vue    | 24 ++++----
 src/client/pages/settings/theme.vue           | 26 ++++-----
 src/client/pages/settings/update.vue          | 20 +++----
 src/client/pages/settings/word-mute.vue       | 16 +++---
 src/client/pages/share.vue                    |  6 +-
 src/client/pages/tag.vue                      |  4 +-
 src/client/pages/test.vue                     | 12 ++--
 src/client/pages/theme-editor.vue             | 18 +++---
 src/client/pages/timeline.tutorial.vue        |  2 +-
 src/client/pages/timeline.vue                 | 10 ++--
 src/client/pages/user/clips.vue               |  2 +-
 src/client/pages/user/follow-list.vue         |  4 +-
 src/client/pages/user/index.activity.vue      |  4 +-
 src/client/pages/user/index.photos.vue        |  6 +-
 src/client/pages/user/index.timeline.vue      |  6 +-
 src/client/pages/user/index.vue               | 20 +++----
 src/client/pages/user/pages.vue               |  4 +-
 src/client/pages/v.vue                        |  2 +-
 src/client/pages/welcome.entrance.a.vue       | 16 +++---
 src/client/pages/welcome.entrance.b.vue       | 16 +++---
 src/client/pages/welcome.entrance.c.vue       | 16 +++---
 src/client/pages/welcome.setup.vue            | 10 ++--
 src/client/pages/welcome.timeline.vue         |  4 +-
 src/client/pages/welcome.vue                  |  4 +-
 src/client/plugin.ts                          |  6 +-
 src/client/router.ts                          |  6 +-
 src/client/scripts/aiscript/api.ts            |  4 +-
 src/client/scripts/autocomplete.ts            |  4 +-
 src/client/scripts/gen-search-query.ts        |  2 +-
 src/client/scripts/get-static-image-url.ts    |  2 +-
 src/client/scripts/get-user-menu.ts           | 16 +++---
 src/client/scripts/hpml/evaluator.ts          |  4 +-
 src/client/scripts/initialize-sw.ts           |  8 +--
 src/client/scripts/paging.ts                  |  2 +-
 src/client/scripts/please-login.ts            |  6 +-
 src/client/scripts/popout.ts                  |  2 +-
 src/client/scripts/reaction-picker.ts         |  4 +-
 src/client/scripts/search.ts                  |  6 +-
 src/client/scripts/select-file.ts             |  4 +-
 src/client/scripts/sound.ts                   |  2 +-
 src/client/scripts/stream.ts                  |  2 +-
 src/client/sidebar.ts                         |  8 +--
 src/client/sw/sw.ts                           |  2 +-
 src/client/theme-store.ts                     |  4 +-
 src/client/tsconfig.json                      |  3 +-
 src/client/ui/_common_/common.vue             |  8 +--
 src/client/ui/_common_/stream-indicator.vue   |  2 +-
 src/client/ui/_common_/upload.vue             |  2 +-
 src/client/ui/chat/header-clock.vue           |  2 +-
 src/client/ui/chat/index.vue                  | 14 ++---
 src/client/ui/chat/note-header.vue            |  6 +-
 src/client/ui/chat/note-preview.vue           |  4 +-
 src/client/ui/chat/note.sub.vue               |  4 +-
 src/client/ui/chat/note.vue                   | 32 +++++------
 src/client/ui/chat/notes.vue                  |  4 +-
 src/client/ui/chat/post-form.vue              | 18 +++---
 src/client/ui/chat/side.vue                   |  8 +--
 src/client/ui/chat/sub-note-content.vue       |  6 +-
 src/client/ui/chat/timeline.vue               | 10 ++--
 src/client/ui/chat/widgets.vue                |  2 +-
 src/client/ui/deck.vue                        | 12 ++--
 src/client/ui/deck/antenna-column.vue         |  4 +-
 src/client/ui/deck/column.vue                 |  2 +-
 src/client/ui/deck/deck-store.ts              |  4 +-
 src/client/ui/deck/direct-column.vue          |  6 +-
 src/client/ui/deck/list-column.vue            |  4 +-
 src/client/ui/deck/main-column.vue            |  8 +--
 src/client/ui/deck/mentions-column.vue        |  6 +-
 src/client/ui/deck/notifications-column.vue   |  6 +-
 src/client/ui/deck/tl-column.vue              |  4 +-
 src/client/ui/deck/widgets-column.vue         |  2 +-
 src/client/ui/default.side.vue                |  8 +--
 src/client/ui/default.vue                     | 10 ++--
 src/client/ui/default.widgets.vue             |  4 +-
 src/client/ui/desktop.vue                     | 12 ++--
 src/client/ui/visitor/a.vue                   | 12 ++--
 src/client/ui/visitor/b.vue                   | 16 +++---
 src/client/ui/visitor/header.vue              |  8 +--
 src/client/ui/visitor/kanban.vue              | 12 ++--
 src/client/ui/zen.vue                         |  2 +-
 src/client/widgets/activity.calendar.vue      |  2 +-
 src/client/widgets/activity.chart.vue         |  2 +-
 src/client/widgets/activity.vue               |  4 +-
 src/client/widgets/aiscript.vue               |  6 +-
 src/client/widgets/button.vue                 |  6 +-
 src/client/widgets/calendar.vue               |  2 +-
 src/client/widgets/clock.vue                  |  6 +-
 src/client/widgets/define.ts                  |  4 +-
 src/client/widgets/digital-clock.vue          |  2 +-
 src/client/widgets/federation.vue             |  6 +-
 src/client/widgets/job-queue.vue              |  4 +-
 src/client/widgets/memo.vue                   |  4 +-
 src/client/widgets/notifications.vue          |  8 +--
 src/client/widgets/online-users.vue           |  2 +-
 src/client/widgets/photos.vue                 |  6 +-
 src/client/widgets/post-form.vue              |  2 +-
 src/client/widgets/rss.vue                    |  4 +-
 src/client/widgets/server-metric/disk.vue     |  2 +-
 src/client/widgets/server-metric/index.vue    |  4 +-
 src/client/widgets/server-metric/mem.vue      |  2 +-
 src/client/widgets/server-metric/net.vue      |  2 +-
 src/client/widgets/slideshow.vue              |  2 +-
 src/client/widgets/timeline.vue               |  6 +-
 src/client/widgets/trends.vue                 |  6 +-
 src/tsconfig.json                             |  3 +
 webpack.config.ts                             |  3 +-
 338 files changed, 1234 insertions(+), 1229 deletions(-)

diff --git a/src/client/account.ts b/src/client/account.ts
index e5b451cf14..6f06ee0f32 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 98578ee44f..7dbb9657bd 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 04d98508bb..8aa51898bc 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 ae742610f7..2014c710a5 100644
--- a/src/client/components/autocomplete.vue
+++ b/src/client/components/autocomplete.vue
@@ -30,11 +30,11 @@
 <script lang="ts">
 import { defineComponent, markRaw } from 'vue';
 import { emojilist } from '../../misc/emojilist';
-import contains from '@/scripts/contains';
+import contains from '@client/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 { 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 8bf64d79b5..cac95e6d40 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 17770a6f36..dc0c0faa1f 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 a34f7f7947..ef30715343 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 e669da6a90..91f57d1f49 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 f9a4025452..ce6e2fa789 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 43f07ebe76..30b04091be 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 5075b574c4..03f2da008d 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 745b6018da..2822c85680 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 881330529c..89a267b19f 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 b9d93ee4cc..150d0d8774 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 4b165d9f91..5bdbc330ad 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 fb6a5a9072..5504eaecd6 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 a12493ce0d..944c507bdc 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 99d6c8a330..4e4468912f 100644
--- a/src/client/components/emoji-picker.vue
+++ b/src/client/components/emoji-picker.vue
@@ -75,14 +75,14 @@
 <script lang="ts">
 import { defineComponent, markRaw } from 'vue';
 import { emojilist } from '../../misc/emojilist';
-import { getStaticImageUrl } from '@/scripts/get-static-image-url';
+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 d0eb775cd0..daa2190feb 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 ec29d5c882..2da9ba0cbd 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 1234649e5a..d2dc9223bd 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 7620abcd76..d6a7e39d45 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 df65d9684d..0a2f1ff0e1 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 4c7f405cac..4561df32e1 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 29c049297e..6e35295ff5 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 fbb40bace7..6722ce38a1 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 d293cb571f..a8a597b2bb 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 cad906524e..a969636a7e 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 d2f25fa41e..83675a155c 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 c072b8431b..f4ebd5f3b3 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 b78973ff82..af989b1c57 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 b4693258b9..5d0c10c086 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 a3f443d5d8..988cf9cf47 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 2650cd33fd..c89536ebdb 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 fe692a9255..20dc1f825a 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 320df30506..ec22bd98ec 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 e9b496180a..75abefc2fe 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 1ce5a1c2c1..5674174558 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 4d2a3b2c77..a81320954c 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 f51773dc4b..cc7db8c2f5 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 a2e1776d09..29d7c727f6 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 9f3898ec56..41760d98d7 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 36fbb4bd06..71767a0f9f 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 bdd3983e1e..b6f63cb65d 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 12a620af9d..322e56d957 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 bca469a159..28ac9b8942 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 2eb9ae8cbe..0d01e4e4b5 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 ea26d31100..fb4f9502b3 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 1f7a07bac3..a6e9b6fe56 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 4ea97d17ee..fcae4c4368 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 28553ea4a7..853d481406 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 70f49fef7e..b54cadfc80 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 332f00e5db..80a9502d5f 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 1c19de9ff9..a3e221f7b2 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 2fe8500891..ac46307352 100644
--- a/src/client/components/notification.vue
+++ b/src/client/components/notification.vue
@@ -66,8 +66,8 @@ 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 56dbfd5bdf..01b3ae4396 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 d59813e00d..2125ddc534 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 37342c403b..ca6f4dd73e 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 54b8b30276..ffd9ce89f9 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 51da84bd49..c6ae675212 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 8f49b88e5e..e26db597f2 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 b1af8954b0..dad7ac3da0 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 ec25332db0..a70525e07c 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 04ce74bd7c..14dedc98a0 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 925844c1bd..7a3f88bb1f 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 7b7d799330..1970ee62a9 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 33c6e6b14c..926d06ae80 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 def6ee8885..f6f146b52f 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 d32f5dc732..81cab12501 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 9c3fb5feaa..a928c22bee 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 e67814af16..8bf3e1c88e 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 1896d00f42..491c62be26 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 085c2ba579..9951cef2de 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 97d688368a..612bbe41b9 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 6d1c419a40..f125365c3d 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.vue b/src/client/components/poll.vue
index 7f13e135aa..af3b3804ab 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 230c944de1..f2eed30441 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 ae1cd7f01e..aa23e3891e 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 9b5adf9cc1..dc24c714b5 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 { 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 a67b24601b..99b4d50c52 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 3af601f627..98c7aaaa6e 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 0f29fc69bb..70949ea357 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 f7c50a2ba5..61439781b4 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 2edd10f539..6c38c07d78 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 3384fff96d..120da63f30 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 74566fbce3..072a5ac19f 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 91d0f2c96f..1ce9fc2789 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 ceb25e0967..384bcb4563 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 ec685462c9..9b6c3f16d0 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 1ed8c8bd5e..af9033178e 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 9a3d3232cf..c2ab0b005d 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 844c20eb08..9d5b16e03f 100644
--- a/src/client/components/token-generate-window.vue
+++ b/src/client/components/token-generate-window.vue
@@ -28,7 +28,7 @@
 <script lang="ts">
 import { defineComponent } from 'vue';
 import { kinds } from '../../misc/api-permissions';
-import XModalWindow from '@/components/ui/modal-window.vue';
+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 561099cbe0..61f5d3bf08 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 6b075cb440..fb12b4985f 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 5c71b14a0a..12b3dbcfd1 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 1c5222f8f2..302d96d026 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 c2033402e3..1550fe40c7 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 d9588a0373..13181d39e2 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 ea40ba47b4..547e616ea5 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 501a3bf8ee..1613644c87 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 0a402f793f..b5e0fce207 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 7a59068710..7495da6f24 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-list.vue b/src/client/components/user-list.vue
index 7a57ff7168..418c4127d9 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 c4588e478a..216141347c 100644
--- a/src/client/components/user-preview.vue
+++ b/src/client/components/user-preview.vue
@@ -36,7 +36,7 @@ import { defineComponent } from 'vue';
 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 c67c985fdc..e21deea178 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 014748adc6..381aa60911 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 e518f48d0d..0b98d30b9d 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 7e8ebeaec0..c3a265af9c 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 23fce7d714..993b843cb1 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 b0e99628b0..ef3f9af43f 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 c90df89a5e..1676e1182e 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 2a0a13663c..90247eacb2 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 68d9e2816c..26d6c5efb3 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 34ea488d98..e3b7e556b0 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 { url } from '@client/config';
 
 export const acct = user => {
 	return getAcct(user);
diff --git a/src/client/i18n.ts b/src/client/i18n.ts
index 6c29ef153f..d0f4c963ce 100644
--- a/src/client/i18n.ts
+++ b/src/client/i18n.ts
@@ -1,5 +1,5 @@
 import { markRaw } from 'vue';
-import { locale } from '@/config';
+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 2a2b6a2f86..bacc839c29 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 9be45e6c6d..e1707531de 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 29a62d72ba..b317915589 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 05c6af1cd7..34ecaf9b33 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 a52678e3cd..2d1da88fa1 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 6ec74bc962..911fc0bc62 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 8326c5529c..fb00c8c8ac 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 4fbb347563..7c8ab28d8e 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 dd5cacaeec..f5b4dceb26 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 8b2adc3e07..10c466c73c 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 522bd4cdf8..3656d48c42 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 983e76d500..f5b8a66a6f 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 93044f4ab4..d2ddebb4a8 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 fcedc28db1..d75c4e5ba6 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 2b61813fd8..c6e46a9834 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 ed4eae4d02..7155cc1563 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 59d23efcb7..f57be3d323 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 63b0e7ba7d..754581a8b6 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 b78a3707ef..da2eaffb84 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 35c5942398..c87855484d 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 c1e612ef8d..3866c4b489 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 04d739088f..64e6fa03e6 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 f999f48c5d..018901abb4 100644
--- a/src/client/pages/follow.vue
+++ b/src/client/pages/follow.vue
@@ -5,7 +5,7 @@
 
 <script lang="ts">
 import { defineComponent } from 'vue';
-import * as os from '@/os';
+import * as os from '@client/os';
 import parseAcct from '../../misc/acct/parse';
 
 export default defineComponent({
diff --git a/src/client/pages/instance/abuses.vue b/src/client/pages/instance/abuses.vue
index 030f5ae157..b78141eb2e 100644
--- a/src/client/pages/instance/abuses.vue
+++ b/src/client/pages/instance/abuses.vue
@@ -66,12 +66,12 @@ 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 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 b859aae2ec..15e5f389bc 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 179057d519..34eca47b4e 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 6a51813bb2..01e207f491 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 fe8ce8c2f4..ba452c5458 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 87fcdb59ef..85c03e3dce 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 f19e3fcd45..aa66713789 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 9d990c2244..b467ce06f5 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 e519ce743e..5a35309ed4 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 bcf18cfff0..118e8eae6e 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 73862e9da5..de1e81750f 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 2a8259b9df..0eb70debfb 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 b8ad875683..17c8430a01 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 f1c98355d3..ef11366a14 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 cea621ba2d..93564d42e9 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 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 '@/os';
-import { fetchInstance } from '@/instance';
+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 b690826d27..fb0e766c5a 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 b2465991d8..c88306b55b 100644
--- a/src/client/pages/instance/users.vue
+++ b/src/client/pages/instance/users.vue
@@ -83,12 +83,12 @@ 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 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 943a0e868e..5bd051453a 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 60621fcc1d..02aa9c6fd3 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 afb240c051..2dfad3e238 100644
--- a/src/client/pages/messaging/index.vue
+++ b/src/client/pages/messaging/index.vue
@@ -42,9 +42,9 @@
 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 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 5e675a3f12..a98448553f 100644
--- a/src/client/pages/messaging/messaging-room.form.vue
+++ b/src/client/pages/messaging/messaging-room.form.vue
@@ -27,9 +27,9 @@ import { faPaperPlane, faPhotoVideo, faLaughSquint } from '@fortawesome/free-sol
 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 { 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 6d4ed96044..a6d142bd34 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 3921a081d1..53da13f5a3 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 { 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 0d599e4583..4452604e4e 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 6430588c46..39cd832838 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 b664af91b5..34452e96ac 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 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 '@/os';
+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 ebab025b49..f4d5f4aad6 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 b1fdb8e62a..b724dfb6b7 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 ab6dc85399..8d0d8716c7 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 99f7b1e68f..2bc0d36b98 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 bb23be664d..bbb2192aa1 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 70c01dced1..dcaae222cc 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 ec707c2beb..61ca3870c5 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 8756ba5a08..eb46c49d8b 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 4b4f22e642..a6d73b4290 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 846e3f644d..1515187676 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 83b7f376dd..9d4b4c76d2 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 81f0462343..e16962aee9 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 8cc2f401cc..0cbfaa7eb8 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 b711d00763..1a96e42679 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 4f45f3b5fd..3f7eaf7572 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 37a4d6031c..76c35d4406 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 3866f51c16..51c5481d54 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 d1e8545b2e..82b09a6290 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 e08540351c..96f468b13a 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 2614239932..56b9f1561c 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 335d1ab408..cb8cb83aa7 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 452eedba6b..bd2c9c46dc 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 afedbe6f6d..8c4ff23408 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 e5f29b37d2..042b283731 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 ccaa715111..0065b16c8c 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 68bc1b50c1..10d5311cde 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 08856ebfe4..762ee774ed 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 0b0b421ea2..121383a7a6 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 29960351d3..9bedda04ef 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 912f891d8a..0b0293f69a 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 8ce232af07..a466527c01 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 404e560a06..c7c2937ba8 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 ba750f43c7..3a88b02583 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 4b5d783f9e..f40990b37c 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 b0e600d4fb..0cb6bcf04c 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 25dfda1d14..ceb2cc7890 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 { 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 6ee7ec02fc..febc9c5016 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 5e79531b20..28d2aec992 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 e7f97725af..48f1bc6e7b 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 f231bea22e..1b8baadf44 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 b02a33b3f1..da9ed88b55 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 3eb31ab520..d0fcacfaed 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 cbc5edca94..ce4099db2e 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 8ca8bc9eec..4684d3b554 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 8ca0f119c5..56e9973aeb 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 de2cfd3912..5894b8475c 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 e334e23cbd..bd2e4634d1 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 39f1683af5..1cbda219d7 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 90ff3e2c20..6612fc0ca2 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 2e384bb764..2f80ef0c6d 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 1b4aa70eca..3000356713 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 2e4d186bc4..e2ab11841e 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 fc735cae10..f7eebbb9cc 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 c3b7ecae11..b26c2805ad 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 a14e101328..e5cfc5ee1e 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 0f6393f73c..70c302b36e 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 5fd93d8b72..0bc04493a7 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 fecb99bfe1..b101420d0d 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 9c5fb0850c..f58faab0b5 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 e9bffc3b00..61f0a8e198 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 4488e50051..170f8c9a0a 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 c7a90fb461..243672000b 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 943ededd21..e760e4b1e5 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 a43c98e730..5e061f95f8 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 cdb5705c0b..7d6aaa652f 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 51f2ba17e1..bbb1b43afb 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 c53968da4b..8305744109 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 852d39f78b..6184383657 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 f08c354718..da7bb27030 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 ac57c51df4..14cdb533ac 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 d172ceb10a..a8da8bf11c 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 38dbc2c629..26cc7a3d85 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 7912e5421f..41ce4d21f7 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 910e7cd028..7561eba2ed 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 2f890e78a6..af8395b2c3 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 2bf0a4383e..5ee0a704b0 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 203527ef0a..bcbf16acc7 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 cb3ec2a7ef..e0c0b2995a 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 2a66b6752d..cf713d6daa 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 90a67e9a8e..eef8409a06 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 838fbc223f..3eca1ab210 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 d0c6f19349..54796bccbc 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 f16297e21f..8c824a2111 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 5229db9ee3..18c66adbeb 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 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 '@/scripts/scroll';
-import { getUserMenu } from '@/scripts/get-user-menu';
+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 66658ac57d..1d2e96b351 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 f456a29993..a9deea24b4 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 fa69c1a124..9a24f868b6 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 203618f17e..6e93f17404 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 4c98baf8ea..cefe239da9 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 bc994099ac..db64f6b194 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 a498b578e2..12c8a4d4f4 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 99560eea21..845a304854 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 c56ee1eb25..6bdc4fe4d5 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 d3cfead258..53516db97b 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 20c15d809e..5dd08f34ac 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 83ceece5df..eab893a386 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 670d915104..998d932141 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 { 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 e932eb6da5..e2728d73f4 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 0e4e4af5d3..87f7bff942 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 { 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 '@/os';
-import { userActions } from '@/store';
-import { router } from '@/router';
-import { $i } from '@/account';
+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 20261d333d..68d140ff50 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 d6dbd5dbd4..6f1874572a 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 6e3da94124..2e49f1a64c 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 928f6ec0f4..a584e9fa96 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 51b8d72868..6d92af4a05 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 e923326ece..38699c0979 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 3e442cb94d..829065534c 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 c083e1ef88..03ac863aa0 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 9b7061d5fc..d3422bfff2 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 7330a2f8bb..065059221d 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 6bc786fdc0..97036042cf 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/sw.ts b/src/client/sw/sw.ts
index ec4de17551..26b4efb053 100644
--- a/src/client/sw/sw.ts
+++ b/src/client/sw/sw.ts
@@ -4,7 +4,7 @@
 declare var self: ServiceWorkerGlobalScope;
 
 import { get, set } from 'idb-keyval';
-import composeNotification from '@/sw/compose-notification';
+import composeNotification from '@client/sw/compose-notification';
 import { I18n } from '../../misc/i18n';
 
 //#region Variables
diff --git a/src/client/theme-store.ts b/src/client/theme-store.ts
index 8e21af70fc..3793debb9e 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 01a77cec3a..ac7ef7ddfc 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 e5cdaca235..785b1631db 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 8b1b4b567c..23f2357d85 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 c1986737d7..bd3b2cd684 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 3488289c21..69ec3cb64b 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 26c81a1aa9..91d3fb5c9d 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 cda8ae00e2..55228c4c38 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 4861473701..77949e314b 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 6f365c29e9..6c778d1468 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 97275875ca..4afd7989e1 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 3a169cc20a..45c2bd17a1 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 9388989d5d..398a5a176b 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 { 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 0003158e53..2645874ce4 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 7e742b8e54..e530a88172 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 232e749c1c..13032cce09 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 6b12f9dac9..4d1865f616 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 a074629ddd..a63db17b01 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 c6aa201e40..0de870233a 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 d0a39965b1..6a242c691a 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 025d5d70f4..aa389d7610 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 2ffbed562d..6fceae4ed7 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 32807aabc9..c70abc9f6e 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 6d798c130c..4577b0b533 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 e79a9eb245..996123cb1f 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 5feab8bab5..1b29a2d54f 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 02af6a3311..d4908d0edf 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 b7740c270d..992845ff7e 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 b58c339f2b..995f987a6a 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 220dee9d6d..38f98f6365 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 ff7cdf1140..35d3442bb2 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 a1f58af5cc..1480fd1840 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 d25b5591ef..2aed50100c 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 1f559c8917..bd00773c57 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 9a7bf96fc0..a66c4d5fb0 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 6a4bcd1adb..8317f24402 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 ab9e08e768..9215a639b0 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 b833bd65ca..ff767190f6 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 9702d66663..ee5bc25113 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 a92644e0ab..9623765e40 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 f885db886b..84390866bd 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 3417181d0c..af6718c507 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 545072e87b..fe39145f0d 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 2aad24baec..e0689a294f 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 08a346d97c..22b7fb30a1 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 9d32e8b9fe..2202c9ed4b 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 6e76bc40e9..6eb656ce05 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 b7bfb6de27..aaf2b2fc8f 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 3512429e0d..4a7786312a 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 c3eb6ee79a..b4c2201862 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 5b889f4816..37060fca43 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 ada15486ba..f1041b4ec2 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 5ecaa67b5a..1f260c20d9 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 1140a4252f..78ad390d27 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 41f967d291..fa5933e7b9 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 2ce87ba416..7f2aea6b49 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 83aa71aa09..89fa8fef43 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 23c148eeb6..569c15b58b 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 5d2e2b1ebd..69c5cc01b2 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 ee60790cb6..f1ddc9cb80 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 3734573e3c..300e3b31de 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/tsconfig.json b/src/tsconfig.json
index 527acb859b..6992d6437c 100644
--- a/src/tsconfig.json
+++ b/src/tsconfig.json
@@ -23,6 +23,9 @@
 		"isolatedModules": true,
 		"rootDir": "./",
 		"baseUrl": "./",
+		"paths": {
+			"@/*": ["./*"]
+		},
 		"outDir": "../built",
 		"typeRoots": [
 			"../node_modules/@types",
diff --git a/webpack.config.ts b/webpack.config.ts
index c530cf335c..850b2bd3fc 100644
--- a/webpack.config.ts
+++ b/webpack.config.ts
@@ -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'
 		}
 	},