diff --git a/web/src/App.tsx b/web/src/App.tsx
index 3966bd8..7ef6f90 100644
--- a/web/src/App.tsx
+++ b/web/src/App.tsx
@@ -1,26 +1,27 @@
-import { useEffect } from 'react';
+import { lazy, Suspense, useEffect } from 'react';
import { navigate, useHashRoute } from './useHashRoute';
import { SectionLabel } from './ui';
-import { ControlView } from './views/ControlView';
-import { TriageView } from './views/TriageView';
-import { DetailView } from './views/DetailView';
-import { ReportsView } from './views/ReportsView';
-import { MarketsView } from './views/MarketsView';
-import { QueueView } from './views/QueueView';
-import { PastebinView } from './views/PastebinView';
-import { CampaignsView } from './views/CampaignsView';
-import { IntroThreadView } from './views/IntroThreadView';
-import { HostsView } from './views/HostsView';
-import { SettingsView } from './views/SettingsView';
-import { CalendarView } from './views/CalendarView';
-import { ProspectsView } from './views/ProspectsView';
-import { StreamView } from './views/StreamView';
-import { DashboardView } from './views/DashboardView';
-import { BackfillView } from './views/BackfillView';
-import { VoiceView } from './views/VoiceView';
-import { AutopilotView } from './views/AutopilotView';
-import { ModelView } from './views/ModelView';
+
+const ControlView = lazy(() => import('./views/ControlView').then((m) => ({ default: m.ControlView })));
+const TriageView = lazy(() => import('./views/TriageView').then((m) => ({ default: m.TriageView })));
+const DetailView = lazy(() => import('./views/DetailView').then((m) => ({ default: m.DetailView })));
+const ReportsView = lazy(() => import('./views/ReportsView').then((m) => ({ default: m.ReportsView })));
+const MarketsView = lazy(() => import('./views/MarketsView').then((m) => ({ default: m.MarketsView })));
+const QueueView = lazy(() => import('./views/QueueView').then((m) => ({ default: m.QueueView })));
+const PastebinView = lazy(() => import('./views/PastebinView').then((m) => ({ default: m.PastebinView })));
+const CampaignsView = lazy(() => import('./views/CampaignsView').then((m) => ({ default: m.CampaignsView })));
+const IntroThreadView = lazy(() => import('./views/IntroThreadView').then((m) => ({ default: m.IntroThreadView })));
+const HostsView = lazy(() => import('./views/HostsView').then((m) => ({ default: m.HostsView })));
+const SettingsView = lazy(() => import('./views/SettingsView').then((m) => ({ default: m.SettingsView })));
+const CalendarView = lazy(() => import('./views/CalendarView').then((m) => ({ default: m.CalendarView })));
+const ProspectsView = lazy(() => import('./views/ProspectsView').then((m) => ({ default: m.ProspectsView })));
+const StreamView = lazy(() => import('./views/StreamView').then((m) => ({ default: m.StreamView })));
+const DashboardView = lazy(() => import('./views/DashboardView').then((m) => ({ default: m.DashboardView })));
+const BackfillView = lazy(() => import('./views/BackfillView').then((m) => ({ default: m.BackfillView })));
+const VoiceView = lazy(() => import('./views/VoiceView').then((m) => ({ default: m.VoiceView })));
+const AutopilotView = lazy(() => import('./views/AutopilotView').then((m) => ({ default: m.AutopilotView })));
+const ModelView = lazy(() => import('./views/ModelView').then((m) => ({ default: m.ModelView })));
interface NavItem {
readonly view: string;
@@ -151,49 +152,55 @@ export function App(): JSX.Element {
}
function ViewRouter({ view, param }: { view: string; param: string | null }): JSX.Element {
- switch (view) {
- // ── built ──
- case 'triage':
- return