# Nexus Layout & Information Architecture Overhaul **Status:** Approved 2026-04-11 — ready for implementation planning **Branch:** `nexus/design-system-migration` **Companion docs:** `DESIGN.md` (visual language), `MIGRATION-PLAN.md` (visual migration phases 1–7 — this spec defines phases 8–16) --- ## 1. Thesis **Nexus is not a SaaS dashboard with a chat panel bolted on. Nexus is a chat with a workshop attached.** The current frame inverts this: a Paperclip-derived corporate dashboard occupies the center, and chat is a 380px slide-in panel on the right that competes with a `PropertiesPanel` for shared real estate. This is exactly backwards for a single-user, self-hosted personal AI tool whose tagline is "Your personal AI. That also builds things." In the new frame, **the Assistant is the canvas.** Everything else — Studio, Projects, Settings — is a destination you visit and return *from*, not a peer that competes with chat for screen real estate. The Project Builder backend (issues, agents, gates, costs, activity, org) is **demoted from global navigation to per-project tabs.** You only see it when you've drilled into a specific project. There is no global "Issues" route, no global "Agents" route, no global "Costs" route — those concepts only exist scoped to a project. --- ## 2. Information architecture ### Primary destinations (in the global icon rail, always visible) | Slot | Destination | Route | Mental model | |---|---|---|---| | 1 | **Assistant** | `/assistant` | The home screen. Voice in, voice out. The chat IS the app. | | 2 | **Studio** | `/studio` | Workshop selector for content generation (8 workshops). | | 3 | **Projects** | `/projects` | List of all projects with health stats. | | 4 | **Settings** | `/settings` | Workspace, Local AI, Cloud, Voice, Skills, Routines, Telegram, About. | Four destinations. Period. No "Dashboard", no "Inbox", no "Recipes" slot, no "add company" button. ### Secondary destinations (only inside Project Detail) When you drill into `/projects/:id`, you enter **Builder mode** and a project tab strip appears under the header: `OVERVIEW · ISSUES · AGENTS · GATES · COSTS · ACTIVITY · ORG` These are scoped to one project. They are not addressable globally. Routes: `/projects/:id/overview`, `/projects/:id/issues`, etc. ### Tertiary surfaces (live inside Settings) - **Skills** — Skill Aggregator browse/install/assign UI - **Routines** — workspace-level cron jobs (currently a top-level route, demoted) - **Telegram bridge** — config, not nav - **Cloud providers / API keys** — config - **Voice** — STT/TTS config ### Killed (removed from the app entirely) | What | Why | |---|---| | Company switcher / "add company" / "manage companies" / multi-tenant UI | Nexus is single-workspace by design | | Global Dashboard route as landing page | Assistant is the landing page; the dashboard concept becomes the Assistant's conversational greeting | | Global Issues / Agents / Approvals / Costs / Activity / Inbox / Org / Goals routes | Demoted to per-project tabs (or fold into Overview) | | Global Routines route | Moved to Settings (cron jobs are workspace config, not a workflow) | | `ChatPanel.tsx` as a slide-in right rail | Killed entirely; chat becomes the Assistant route | | `PropertiesPanel` as a standing right-rail fixture | Pages that need it render it inline themselves | | 280px left sidebar with company switcher / sidebar projects / sidebar agents | Replaced by 56px icon rail | | `MobileBottomNav` (company-aware) | Replaced by 4-icon bottom bar matching the desktop rail | | Theme cycle button (Catppuccin/Tokyo/etc.) | Binary light/dark only, configured in Settings, no toggle in chrome | | `ConvertPage` as a top-level route | Folds into Studio as the 8th workshop | | `InboxRootRedirect`, `LegacySettingsRedirect`, `OnboardingRoutePage` URL machinery | Simpler routing | | `PluginPage` as a top-level route slot | Plugin pages render inside Settings or inside a project | | Any UI string containing "company", "companies", "tenant", "workspace member" | Vocabulary cleanup; replace with "workspace" or remove | --- ## 3. Visual language (DESIGN.md inheritance) The overhaul does **not** introduce a new visual language. It uses DESIGN.md verbatim. Recap of the binding rules for this spec: - **Canvas:** pure black `#000000`. No surface differentiation between rail/header/canvas — they all bleed into the same black. - **Sole chromatic accent:** Neon Volt `#faff69`. Used for active states, borders on selected items, hover targets, hero performance numbers, link hover. Never as a fill background outside CTA buttons. - **Secondary CTA:** Forest Green `#166534` for "Create project", "New", "Run" buttons. - **Pressed/active text:** Pale Yellow `#f4f692`. - **Workhorse border:** Charcoal `rgba(65,65,65,0.8)`. The single border color for cards, dividers, inputs. - **Typography:** Inter (variable, weight 400–900). Inconsolata for code/numbers. **Inter Black 900** for hero performance numbers (project %, milestone count). Uppercase + 1.4px tracking for section labels and breadcrumbs. - **Radius scale:** 4px (sharp), 8px (comfortable), 9999px (pill). Nothing else. - **Depth:** border-based, not shadow-based. Inset shadow Level 4 for "pressed into the surface" active states. Volt border highlight (Level 5) for featured/selected. - **Mode:** dark default. Light mode is an accessibility alternative per MIGRATION-PLAN.md §5; this spec assumes dark mode for all wireframes. Anything in this spec that conflicts with DESIGN.md, **DESIGN.md wins.** Update this spec, not DESIGN.md. --- ## 4. Global frame Constant chrome that appears on every page. Two pieces: left icon rail and top strip. ### 4.1 Left icon rail ``` ┌──┐ │ │ ← 8px top padding │ ⬢│ ← Nexus mark (volt), 24×24, click → Assistant │ │ │ ◆│ ← MessageCircle (Lucide) — Assistant │ │ │ ▲│ ← Sparkles (Lucide) — Studio │ │ │ ◇│ ← FolderKanban (Lucide) — Projects │ │ │ │ ← (gap, flex-1) │ │ │ ⚙│ ← Settings (Lucide) — Settings │ │ ← 8px bottom padding └──┘ 56px wide, 100vh tall, pure black background, no border ``` **Specs:** - **Width:** 56px, locked. No collapse, no expand, no hover-grow. - **Background:** `#000000`, no border, no shadow. - **Position:** `position: fixed; left: 0; top: 0; bottom: 0;` — independent of page scroll. - **Icons:** Lucide icons at 20×20. Default state: silver `#a0a0a0`, stroke 1.5. Hover: volt `#faff69`. Active (current route): volt + 2px volt vertical bar on the right edge of the rail aligned with the icon. **Never a fill background behind the icon** — DESIGN.md forbids volt as background. - **Tooltips:** on hover, render a tooltip 12px to the right of the rail with the destination name in uppercase, 11px Inter 600, 1.4px tracking, silver text on near-black `#141414` with a 1px charcoal border. Sharp 4px radius. Delay 300ms. - **Click:** navigates immediately. No transitions on the rail itself; the canvas content fades. - **Nexus mark at top:** small geometric logo in volt. Click → `/assistant`. This is the only volt-filled element in the rail. - **Settings pinned at bottom:** flex layout (`flex-direction: column`, `Settings` slot has `margin-top: auto`). **Accessibility:** - `