diff --git a/packages/client/src/init.ts b/packages/client/src/init.ts
index f9e08d79b1c6fbd5b6c306e5639a0e226ca443be..f7a043bcf4c2f5afa3617d3864b66ea23b2b03cb 100644
--- a/packages/client/src/init.ts
+++ b/packages/client/src/init.ts
@@ -38,6 +38,7 @@ import { reloadChannel } from '@/scripts/unison-reload';
 import { reactionPicker } from '@/scripts/reaction-picker';
 import { getUrlWithoutLoginId } from '@/scripts/login-id';
 import { getAccountFromId } from '@/scripts/get-account-from-id';
+import rootComponent from '@/root.vue';
 
 (async () => {
 	console.info(`Misskey v${version}`);
@@ -158,13 +159,7 @@ import { getAccountFromId } from '@/scripts/get-account-from-id';
 		initializeSw();
 	});
 
-	const app = createApp(
-		window.location.search === '?zen' ? defineAsyncComponent(() => import('@/ui/zen.vue')) :
-		!$i ? defineAsyncComponent(() => import('@/ui/visitor.vue')) :
-		ui === 'deck' ? defineAsyncComponent(() => import('@/ui/deck.vue')) :
-		ui === 'classic' ? defineAsyncComponent(() => import('@/ui/classic.vue')) :
-		defineAsyncComponent(() => import('@/ui/universal.vue')),
-	);
+	const app = createApp(rootComponent);
 
 	if (_DEV_) {
 		app.config.performance = true;
diff --git a/packages/client/src/root.vue b/packages/client/src/root.vue
new file mode 100644
index 0000000000000000000000000000000000000000..d0bc5ffe9004806459029f141f06033c7af53213
--- /dev/null
+++ b/packages/client/src/root.vue
@@ -0,0 +1,19 @@
+<template>
+<ZenUi v-if="searchString === '?zen'" />
+<VisitorUi v-else-if="!$i" />
+<DeckUi v-else-if="ui === 'deck'" />
+<ClassicUi v-else-if="ui === 'classic'" />
+<UniversalUi v-else />
+</template>
+
+<script lang="ts" setup>
+import ZenUi from '@/ui/zen.vue';
+import VisitorUi from '@/ui/visitor.vue';
+import DeckUi from '@/ui/deck.vue';
+import ClassicUi from '@/ui/classic.vue';
+import UniversalUi from '@/ui/universal.vue';
+import { $i } from '@/account';
+import { ui } from '@/config';
+
+const searchString = window.location.search;
+</script>