diff --git a/services/frontend/src/components/shell/ambient-app.tsx b/services/frontend/src/components/shell/ambient-app.tsx
deleted file mode 100644
index 0704e1ef..00000000
--- a/services/frontend/src/components/shell/ambient-app.tsx
+++ /dev/null
@@ -1,30 +0,0 @@
-import { MiniPlayer } from "@/components/media/mini-player";
-import { MobileNav } from "./mobile-nav";
-import { NavRail } from "./nav-rail";
-import { TopBar } from "./topbar";
-
-/**
- * App chrome: slim nav rail + sticky top bar + scrollable content region.
- * Sits above the fixed AmbientCanvas. Providers (Ambient + WS) are mounted in
- * the route layout so every page shares one live link and signal context.
- *
- * < md the side rail collapses (hidden) and a bottom tab bar (MobileNav)
- * takes over navigation; the content region gains bottom padding so the last
- * panel never hides behind the dock. A persistent MiniPlayer floats at the
- * bottom-right whenever a media track is loaded outside /media.
- */
-export function AppFrame({ children }: { children: React.ReactNode }) {
- return (
-
-
-
-
-
- {children}
-
-
-
-
-
- );
-}
diff --git a/services/frontend/src/components/shell/constellation-frame.tsx b/services/frontend/src/components/shell/constellation-frame.tsx
index 767d934b..bc5f4205 100644
--- a/services/frontend/src/components/shell/constellation-frame.tsx
+++ b/services/frontend/src/components/shell/constellation-frame.tsx
@@ -4,10 +4,11 @@
* ConstellationFrame — replaces the classic AppFrame chrome.
* The stage canvas sits fixed behind everything; page content is an
* overlay layer (absolute, no top bar / nav rail / scroll shell).
- * MiniPlayer + Chatbot + CommandPalette keep mounting at the layout level.
+ * Chatbot + CommandPalette keep mounting at the layout level.
*/
import { usePathname } from "next/navigation";
import { type ReactNode, useMemo } from "react";
+import { MiniPlayer } from "@/components/media/mini-player";
import { ConstellationStage } from "@/components/shell/constellation-stage";
import { FloatingChrome } from "@/components/shell/floating-chrome";
import { resolveScene, type SceneSeed } from "@/components/shell/route-scenes";
@@ -38,6 +39,7 @@ export function ConstellationFrame({
}}
/>
+
{/* Overlay content region — scenes place floating panels inside. */}
{children}
diff --git a/services/frontend/src/components/shell/index.ts b/services/frontend/src/components/shell/index.ts
index e10b06b4..727ed4b9 100644
--- a/services/frontend/src/components/shell/index.ts
+++ b/services/frontend/src/components/shell/index.ts
@@ -1,3 +1,2 @@
-export { AppFrame } from "./ambient-app";
export { ConstellationFrame } from "./constellation-frame";
export { ConnectionStatus } from "./status-dot";
diff --git a/services/frontend/src/components/shell/mobile-nav.tsx b/services/frontend/src/components/shell/mobile-nav.tsx
deleted file mode 100644
index 04ba5b4e..00000000
--- a/services/frontend/src/components/shell/mobile-nav.tsx
+++ /dev/null
@@ -1,43 +0,0 @@
-"use client";
-
-import Link from "next/link";
-import { usePathname } from "next/navigation";
-import { isActivePath, mobileNavItems } from "@/lib/navigation";
-import { cn } from "@/lib/utils";
-
-/**
- * Mobile bottom tab bar. Shown only < md (the side NavRail is hidden there).
- * Mirrors the desktop nav items but as a thumb-friendly dock with labels and a
- * top active indicator. Safe-area aware for notched devices.
- */
-export function MobileNav() {
- const path = usePathname() ?? "/";
-
- return (
-
- );
-}
diff --git a/services/frontend/src/components/shell/nav-rail.tsx b/services/frontend/src/components/shell/nav-rail.tsx
deleted file mode 100644
index 59cf9bc8..00000000
--- a/services/frontend/src/components/shell/nav-rail.tsx
+++ /dev/null
@@ -1,61 +0,0 @@
-"use client";
-
-import { usePathname } from "next/navigation";
-import { isActivePath, navItems } from "@/lib/navigation";
-import { cn } from "@/lib/utils";
-
-function NavItem({
- href,
- label,
- active,
- Icon,
-}: {
- href: string;
- label: string;
- active: boolean;
- Icon: React.ComponentType>;
-}) {
- return (
-
- {active && (
-
- )}
-
- {/* hover tooltip — labels are hidden in the rail, so surface on hover */}
-
- {label}
-
-
- );
-}
-
-export function NavRail() {
- const pathname = usePathname();
- const path = pathname ?? "/";
-
- return (
-
- );
-}
diff --git a/services/frontend/src/components/shell/topbar.tsx b/services/frontend/src/components/shell/topbar.tsx
deleted file mode 100644
index f2688cc5..00000000
--- a/services/frontend/src/components/shell/topbar.tsx
+++ /dev/null
@@ -1,76 +0,0 @@
-"use client";
-
-import { Moon, Sun } from "lucide-react";
-import { usePathname } from "next/navigation";
-import { useTheme } from "next-themes";
-import { useEffect, useState } from "react";
-import { useAmbient } from "@/components/ambient/ambient-context";
-import { navItems } from "@/lib/navigation";
-import { cn } from "@/lib/utils";
-import { ConnectionStatus } from "./status-dot";
-
-function useActiveLabel() {
- const pathname = usePathname();
- const item = [...navItems]
- .sort((a, b) => b.matchPrefix.length - a.matchPrefix.length)
- .find((i) => pathname.startsWith(i.matchPrefix));
- return item?.label ?? "Console";
-}
-
-export function TopBar() {
- const label = useActiveLabel();
- const { state } = useAmbient();
- const { theme, setTheme } = useTheme();
- const [mounted, setMounted] = useState(false);
- useEffect(() => setMounted(true), []);
-
- const signalTone =
- state.tone === "vermilion"
- ? "text-vermilion"
- : state.tone === "amber"
- ? "text-amber"
- : "text-signal";
-
- return (
-
-