# Waggle OS — UX Design v1 **Date:** 2026-05-23 **Status:** Brainstorm output. Vision spec. Pick what to ship, defer the rest. **Anchor metaphor:** Refined Desktop OS (A) with Honeycomb grafts (B) where signal-flow / cells / hive-amber tell the story better than a list or grid. **Inputs:** existing UI surface (24 apps + 15 overlays in `apps/web/src/components/os/`), Hive DS tokens (`honey #e5a000` / `hive-950 #08090c` / `accent #a78bfa`), 8-cluster brainstorm + metaphor confirmation 2026-05-23. > Effort tiers used below: **S** = ≤3 days, **M** = ≤2 weeks, **L** = multi-week. Tiers are best-guess and assume one focused engineer + Marko driving design review. --- ## 0. The anchor metaphor (and what it isn't) Waggle stays a **desktop OS** in chrome: top status bar, bottom dock, free-floating `AppWindow` instances, overlays as modals/sheets. The familiar mental model is preserved (no learning curve) and the existing six months of `Desktop.tsx` / `Dock.tsx` / `AppWindow.tsx` investment is preserved. The **honeycomb** is grafted in eight specific places — where the visual metaphor tells the story better than its alternative: | # | Graft | Where it lives | Why hex beats the alternative | |---|---|---|---| | 1 | Dock items as hex tiles | `Dock.tsx` | A live "bee tile that glows when an agent is dancing" is the Waggle brand. Drop-in skin. | | 2 | Status-bar crew presence | `StatusBar.tsx` | Tiny hex avatars showing who's working RIGHT NOW. Click → jump-to-window. | | 3 | WaggleDance as literal honeycomb | `WaggleDanceApp.tsx` | Signal flow ON THE EDGES is the original honeybee dance — what was the metaphor *for* in the first place. | | 4 | Mission Control hex grid | `MissionControlApp.tsx` | Agents-as-cells, glow=working, hover=status. Beats a list of "agent #3 / agent #7". | | 5 | Spawn-agent persona tiles | `SpawnAgentDialog.tsx` / `PersonaSwitcher.tsx` | Persona = a "role-cell." Tile feel works. | | 6 | MCP catalog as hex grid | `MarketplaceApp.tsx` / `connectors/BrandTile.tsx` | Connectors are nodes in a graph the user is building. Hex grid > rectangular tile grid. | | 7 | Memory peripheral inspector | New right-rail in `ChatApp.tsx` | Hex mini-graph of what was recalled for this turn. "Why did I get this answer?" answerable at a glance. | | 8 | Honey-amber "active" accent across the OS | `waggle-theme.css` | Universal: `honey` = live/working, `violet` = memory-touched, neutral = idle. Color semantics unified. | **Stays as plain Desktop:** free-floating windows (parallelism preserved), `AppWindow` chrome, dialogs as dialogs, settings as a form. The OS does not force-cell everything — it cells the things **about agents and signal**, which is where the metaphor earns rent. --- ## 1. Spatial chrome & window choreography **Today (in `components/os/`):** `Desktop.tsx` (551 LOC), `Dock.tsx` (170 LOC), `DockTray.tsx`, `AppWindow.tsx`, `BootScreen.tsx`, `StatusBar.tsx`, `WorkspaceBriefing.tsx`, `ContextMenu.tsx`. Free-floating windows with z-order management. Bottom dock with app icons. Top status bar. **What's missing for "OS-feel":** - No **snap zones / window tiling** — a real OS lets you halve, quadrant, full-screen via drag or keyboard. - No **multi-monitor** support (Tauri supports it; the web shell doesn't address it). - No **focus modes** — "agents working, leave me alone" / "I'm in a presentation" / "deep work" presets that dim/hide ambient surfaces. - No **virtual desktops** that aren't workspaces — sometimes you want two views of the same workspace (chat + WaggleDance vs Files + Wiki) without swapping context. - No **ambient "agent is running" peripheral indicator** — the dock bee icon doesn't pulse, the window edge doesn't honey-glow. - No **OS-level transitions** between scenes (snap, slide, zoom-into-app). **Recommended adds:** 1. **Hex dock skin** + active-cell honey glow + agent-progress ring around the active tile **[S]**. (Visible foundation for grafts 1+8 above.) 2. **Snap zones** (drag window to screen edge → halve/quadrant) using existing `AppWindow` resize handles **[S]**. 3. **Focus modes** — three presets in `StatusBar` ("Working / Focus / Presenting") that toggle right-rail visibility, dock animation, notification stream **[M]**. 4. **Pulse + glow when an agent in this window is doing work** — animated honey-amber border on `AppWindow`, decay-out when idle **[S]**. 5. **Virtual sub-views per workspace** (later, after cluster 5 — workspaces-as-scenes — lands) **[M]**. 6. **Multi-monitor support** via Tauri window-detach (open a window in a separate Tauri WebView on a second display) **[L]**. --- ## 2. The command surface — the omnibar **Today:** `GlobalSearch.tsx` overlay + `LauncherApp.tsx`. Search is search-only. Launcher is a tool-launching surface. Neither is a true command palette. **What's missing:** Marko's OS has 24+ apps, hundreds of memory frames, multiple agents, dozens of skills, and a marketplace. There is no single keystroke that gets you to anything. The most-used surface in any modern OS-of-AI (Raycast, Spotlight, Linear ⌘K) is the **fuzzy-routed omnibar**. **Recommended:** ship **⌘K Omnibar** as the universal entry point: | Verb prefix | What it does | |---|---| | (no prefix) | Fuzzy search across apps, recent windows, files, memory frames, skills | | `>` | Run a command (open app, switch workspace, spawn agent, toggle focus mode) | | `@` | Ask an agent — picks the right persona or routes to the active window's chat | | `?` | Search memory ("what do I know about X") + inline answer card | | `#` | Jump to skill / connector | | `/` | Insert a slash-command into the active chat window | Implementation moves: 1. **Build the omnibar shell** in `components/os/overlays/Omnibar.tsx`, hotkey `Ctrl/Cmd+K` (free up `GlobalSearch.tsx` for retirement or convert to the `?` namespace inside it) **[S]**. 2. **Wire the verb routers** — start with no-prefix + `>` + `?` (highest leverage), defer `@` / `#` / `/` to Phase 2 **[S]**. 3. **Persistent omnibar pill** in the status bar — always-visible `⌘K · ask anything` — beats a hidden shortcut for discoverability **[S]**. 4. **Fuzzy index** of (apps, workspaces, recent files, top-N memory frames, skills) refreshed on workspace-switch — sub-100ms response **[S/M]**. --- ## 3. Agent visibility & multi-agent choreography **Today:** `AgentsApp.tsx`, `MissionControlApp.tsx`, `WaggleDanceApp.tsx`, `SpawnAgentDialog.tsx`. You can spawn, see, and run agents. You can observe WaggleDance signals. **What's missing — the live picture:** - **No status-bar presence layer.** When 3 agents are working you don't see it from the chrome. - **No "is my agent stuck?" glance state.** You have to open MissionControl to know. - **WaggleDance is a list, not a dance.** The literal honeycomb-with-signal-edges is the missing payoff. - **No interrupt / hand-off / "stop and ask me" model** — agents either run autonomously or you cancel. - **No agent-to-agent comm visualization.** When the orchestrator delegates to a sub-agent, you have to read logs. **Recommended adds:** 1. **Status-bar crew presence row** — tiny hex avatars per running agent, honey-glow = working, violet-pulse = waiting on memory, red = stuck/errored. Click → jump-to-window. **[S]** 2. **Convert `MissionControlApp` to hex-grid view** — every running agent is a hex cell; cell color = state; hover = current tool; click = drill in. List view stays as a sub-tab. **[M]** 3. **Make `WaggleDanceApp` an actual honeycomb canvas** with signal-flow on edges (animated path when one agent broadcasts to another). This is where graft #3 finally pays. **[M]** 4. **Interrupt control on every running-agent window** — `Pause / Resume / Ask me / Cancel`. The "Ask me" puts the agent into the Approvals app and shows a notification. **[S]** (already partially wired via Approvals; surface the controls.) 5. **Hand-off UI in chat** — when persona A is wrong for a question, an inline card "Pass to persona B?" with a one-click migrate. **[M]** 6. **Agent-to-agent comm trace** — when a parent spawns a child, draw the edge in WaggleDance and link the windows; child window has a back-arrow to parent. **[S]** --- ## 4. Memory as first-class fabric **Today:** `MemoryApp.tsx` with five tabs (Wiki / KnowledgeGraph / Harvest / Weaver / Evolution). Memory is **a destination** — you go to the Memory app to look at it. **What's missing — memory as fabric:** - **No peripheral memory inspector in chat.** Every chat turn fetches memory; the user can't see what was retrieved. - **No "what does Waggle know about X" inspector** at the OS level — pin a noun, see the graph. - **No provenance overlay** — when an agent answers, you can't see which frames backed each claim. - **No time-travel** — "what did my memory look like last week?" is not a thing. - **Memory isn't a verb** in the omnibar (cluster 2 fixes this). **Recommended adds (this is your moat — bias toward shipping):** 1. **Right-rail memory peripheral inspector in `ChatApp`** — hex mini-graph showing which frames were recalled for the current turn, with hover-to-preview. Default-collapsed so it doesn't intrude. **[M]** 2. **Provenance citations in agent answers** — small `[1]` markers in the response, hover = the actual frame. Wire to the existing `KnowledgeGraphViewer`. **[M]** 3. **Memory inspector overlay** — pin a noun anywhere (selection menu → "What does Waggle know about this?") → mini-overlay with related frames + entity + concept. **[M]** 4. **Time-travel slider in MemoryApp** — a horizontal scrubber across the top: "show memory as of 2026-04-15". Backed by `bitemporal validity` already in `knowledge.ts`. **[M]** 5. **"Memory health" tile in Dashboard** — frames added today, stale clusters, dedup opportunities. Already partially in HarvestTab; promote to surface-level. **[S]** --- ## 5. Workspaces as scenes (not folders) **Today:** `WorkspaceSwitcher.tsx` overlay + `WorkspaceRail.tsx` in `FilesApp`. Workspaces hold files and memory frames. They're filing cabinets. **What's missing — workspaces as desktops:** - **No persisted window layout per workspace** — switching workspaces resets the spatial arrangement. - **No pinned dock per workspace** — same dock everywhere; you can't say "my Research workspace pins Wiki + Memory + Chat, my Founder workspace pins Cockpit + Compliance + Approvals." - **No assigned crew per workspace** — same personas everywhere; no "this workspace's agents are X, Y, Z." - **No memory scope per workspace** — you have to manually filter. - **No autonomy tier per workspace** — Normal/Trusted/YOLO is global, but a "throwaway research" workspace wants YOLO while "production deploy" wants Trusted. **Recommended adds (this is where workspaces become *scenes*):** 1. **Persist window-arrangement on workspace-switch** — when you leave a workspace, snapshot which apps were open + their positions; restore on return. **[S]** 2. **Per-workspace dock pinning** — workspace config stores `pinnedApps: string[]`; the dock renders the workspace's set first, then the global apps. **[S]** 3. **Workspace crew** — when you spawn an agent in a workspace, it sticks; the workspace stores `crew: AgentDef[]` and surfaces them in MissionControl + the status-bar presence row. **[M]** 4. **Per-workspace memory scope** as the default for in-workspace search (existing search likely supports it; promote to the UX). **[S]** 5. **Per-workspace autonomy tier** — `WorkspaceConfig.autonomy: Normal | Trusted | YOLO`; status-bar shows the active tier with a visible badge. **[S]** 6. **Workspace gallery overview** — when no workspace is active, show a hex grid of workspaces with thumbnails. New users see this; advanced users skip via `Cmd+1..9`. **[M]** --- ## 6. Input modalities & ambient capture **Today:** `ChatApp` (text) + `VoiceApp` (voice). Both are destinations you go to. **What's missing — ambient input:** - **No always-listening hotkey** — hold `Cmd+Space` and talk, release to send. Doesn't require switching to VoiceApp. - **No drag-anywhere file-routing** — drag a PDF onto the desktop; the OS asks "send to Files / ask agent about it / harvest into memory?" - **No screenshot-to-agent** — `Cmd+Shift+4`, drag a region, the screenshot lands in the active chat or routes to an agent. - **No QR pull-in from mobile** — Waggle doesn't have a real mobile companion, but a QR-scan-to-open-on-Waggle-OS pattern is achievable. - **No "share my screen with my agent"** — for agents that benefit from visual context (UI debugging, design feedback). **Recommended adds:** 1. **Push-to-talk hotkey** with floating overlay + waveform during capture + auto-route to active window's input or active chat. **[M]** 2. **Drag-to-desktop drop-target** with route picker (Files / Chat / Harvest / Skill). **[M]** 3. **Screenshot-to-agent** via Tauri global shortcut → image lands in active chat as attachment. **[M]** 4. **Mobile QR-handoff** — QR shown in StatusBar, mobile scans, message sent shows up in your active chat (no native app needed; web page + WebSocket). **[L]** 5. **Screen-share to agent** — Tauri can grab a screen region; pipe to a vision-capable model in the active window. Tier-gated (Pro+). **[L]** --- ## 7. Trust, autonomy & approval choreography **Today:** `ApprovalsApp.tsx`, `VaultApp.tsx`, `CapabilitiesApp.tsx`, three-tier autonomy (`Normal / Trusted / YOLO`). Approvals open as modals. Audit trail is a list. **What's missing — approvals as peripheral, not modal:** - **Approvals interrupt your work** — modal blocks the active task instead of queueing peripherally. - **No autonomy dial visible per agent** — the tier is global; the user can't see "this agent runs Trusted, this one Normal." - **No "why is this agent doing this?" surface** — when an action surprises the user, there's no one-click "show me the chain of reasoning." - **Audit trail is a flat log** — should be a scrubable replay (timeline of tool calls + memory hits + outputs). **Recommended adds:** 1. **Approval inbox in the status bar** — pending approvals = a small honey-amber pip with a count; click expands a popover instead of a modal. Block-mode is opt-in per autonomy tier (YOLO never blocks, Normal blocks on critical only). **[S]** 2. **Autonomy dial visible per agent** in MissionControl + agent window header. Click to change scope (this run / this session / this workspace / global). **[S]** 3. **"Why?" button on every agent action** — opens a side-panel showing the prompt, the tool call, the memory frames retrieved, the reasoning trace. Wire to existing `ExecutionTraces`. **[M]** 4. **Audit replay** in `TimelineApp` — a video-scrubber-style timeline of agent actions; play/pause/seek. Pulls from existing trace store. **[M]** 5. **"This action is the kind of thing this agent does at Trusted tier" hint** — when an action triggers approval, show the autonomy threshold and a one-click "raise this agent to Trusted." **[S]** --- ## 8. Discoverability — the OS teaches you **Today:** `OnboardingWizard.tsx` (one-shot, 8 steps) + `OnboardingTooltips.tsx` (post-onboarding hints). Both are first-run; they go silent after. **What's missing — an OS keeps teaching:** - **No tip-of-the-day surface** — users plateau at the 10 features they discovered week 1. - **No "did you know your agent can…" prompts** — based on what the user just did. - **No watching TUTOR persona** — surfaces a capability the user almost discovered but didn't. - **No skill / connector recommendations** based on usage patterns. - **No "you haven't tried X in 30 days, here's what's new" reactivation.** **Recommended adds:** 1. **Tip-of-the-day in the status bar** — small honey-amber pip, click expands. One tip per day, dismissible permanently. Indexed by user action (don't show "spawn an agent" to a user who spawned one 5 minutes ago). **[S]** 2. **Capability recommender after every long-running task** — "this agent ran 12 tools — want me to distil it into a skill?" Already partially exists via D1 distillation; surface the prompt to the user. **[S]** 3. **TUTOR persona** as a 17th persona — read-only, watches recent user actions + memory + workspace state, periodically surfaces "I noticed you searched for X three times — here's a saved search." Off by default; opt-in. **[L]** 4. **Connector / skill recommender in the MarketplaceApp** — based on workspace topic + recent harvest, suggest 3 connectors. **[M]** 5. **Reactivation banner** for stale workspaces ("It's been 30 days since you opened 'Q1 Research' — here's what's changed: 12 new memory frames, 2 closed agents."). **[M]** --- ## 9. Cross-cutting design principles These tie the 8 clusters together. They are the design language; everything new should obey them. | Principle | Concrete rule | |---|---| | **Color semantics** | `honey #e5a000` = live/working/active; `accent #a78bfa` = memory-touched/recalled; neutral = idle. NO arbitrary color use. | | **Peripheral-first** | Information about *agents working* / *memory in play* / *signals firing* lives in the right rail or status bar, not in modal interruptions. | | **Motion = signal** | Animation is reserved for actual signal (agent active, memory hit, hand-off). Static UI = idle UI. No decorative motion. | | **One omnibar, one entry** | `Cmd+K` is the universal entry point. Every app should be reachable through it. | | **Hex where it's a signal-node, rectangle where it's content** | Cells of the OS (agents, dock items, personas, connectors) = hex. Content (text, files, dialogs) = rectangle. Never both for the same concept. | | **Approvals are peripheral by default** | The OS interrupts only at YOLO-violations or user-explicit "approve me when..." rules. | | **Memory is a verb everywhere** | `?` prefix in omnibar; `What do I know about X` from any selection; provenance on every agent answer. | | **Workspaces are scenes, not folders** | Every workspace has its own dock, crew, autonomy tier, layout. | --- ## 10. Phased rollout suggestion The 8 clusters compound. The right order is **the OS-feel pass first** (visible coherence + new omnibar + honeycomb grafts), **agent visibility + memory fabric second** (the differentiation moat), **scenes + ambient + tutor third** (the deepening). ### Phase 1 — The OS-feel pass (2–3 weeks) Everything **S** that establishes the visual + interaction language: - Hex dock skin + honey-active accent ⟶ §1.1 - Window snap zones ⟶ §1.2 - Agent-window honey-pulse on active work ⟶ §1.4 - ⌘K Omnibar with no-prefix + `>` + `?` verbs ⟶ §2.1–2.3 - Status-bar crew presence row ⟶ §3.1 - Memory health tile in Dashboard ⟶ §4.5 - Per-workspace dock pinning + autonomy tier ⟶ §5.2 + 5.5 - Tip-of-the-day in status bar ⟶ §8.1 - Approval inbox in status bar ⟶ §7.1 - Autonomy dial per agent ⟶ §7.2 **Outcome:** the OS *feels* like an OS. Differentiation is visible. No new agents, no new pipelines. ### Phase 2 — The differentiation moat (4–6 weeks) The **M** items that lean into Waggle's unique surface (memory + multi-agent): - WaggleDance as literal honeycomb canvas ⟶ §3.3 - Mission Control hex-grid view ⟶ §3.2 - Memory peripheral inspector in ChatApp ⟶ §4.1 - Provenance citations in agent answers ⟶ §4.2 - Memory inspector overlay (pin-a-noun) ⟶ §4.3 - Time-travel slider in MemoryApp ⟶ §4.4 - "Why?" button + audit replay ⟶ §7.3 + 7.4 - Hand-off UI in chat ⟶ §3.5 - Workspace crew + memory scope + scene restoration ⟶ §5.1, 5.3, 5.4 - Focus modes ⟶ §1.3 **Outcome:** the OS-of-AI moat is visible — memory as fabric, agents as a coordinated swarm, workspaces as scenes. ### Phase 3 — The deepening (multi-week, prioritize when Phase 2 is in users' hands) The **L** items: - Multi-monitor support ⟶ §1.6 - Push-to-talk + drag-to-desktop + screenshot-to-agent ⟶ §6.1–6.3 - Mobile QR-handoff ⟶ §6.4 - Screen-share to agent ⟶ §6.5 - TUTOR persona ⟶ §8.3 - Reactivation banners ⟶ §8.5 --- ## 11. Open questions / decisions Marko owns These are real decisions that affect the build; none have been settled in this brainstorm. 1. **TUTOR persona placement** — is it a 17th persona in `persona-data.ts`, a system service that any persona can speak through, or an explicit `tutor: true` flag on existing personas (so Research Researcher can have a tutor mode)? 2. **Always-listening privacy posture** — push-to-talk only (safe default), or always-listening behind a per-workspace opt-in? Audit/UI implications. 3. **Scene workspaces migration** — do existing workspaces become scenes automatically (lift their last window arrangement) or do users opt-in workspace-by-workspace? 4. **Approval inbox vs modal threshold** — what's the default for Normal tier? Currently inferred: modal on credential-touching + writes-outside-workspace, peripheral on everything else. 5. **Honey-amber agent-active glow intensity** — light pulse OK, but an agent that's been running for 30 minutes shouldn't strobe forever. Decay rule? (Suggestion: glow for first 30s, then steady-amber dot in the window header.) 6. **Free-floating windows vs forced tiling** — Phase 1 ships snap zones; does Phase 2 add a tile-everything mode for users who want it, or stay free-floating? 7. **Right-rail visibility default** — peripheral memory inspector default open or default closed? Opens-on-first-recall might be the right answer. 8. **Mobile companion form-factor** — is it a separate Tauri mobile build, a PWA, or just a web page with WebSocket? (Affects §6.4 effort.) --- ## 12. Implementation notes (deferred — for writing-plans) Cross-references for the implementation plan author: - **Dock skin** — `apps/web/src/components/os/Dock.tsx`, `apps/web/src/lib/persona-tier.ts` for tier styling already exists. - **Omnibar** — net-new file `apps/web/src/components/os/overlays/Omnibar.tsx`; retire or namespace `GlobalSearch.tsx`. - **Status-bar crew presence** — extend `StatusBar.tsx`; data source = WaggleDance signal bus + running-agent registry. - **WaggleDance honeycomb** — `apps/web/src/components/os/apps/WaggleDanceApp.tsx`; signal-flow data already streams from the v2 bus (`packages/server/src/local/routes/waggle-dance.ts`). - **Memory peripheral inspector** — `apps/web/src/components/os/apps/ChatApp.tsx` + memory recall events from `packages/agent/src/orchestrator.ts` `recallMemory()`. - **Workspace scenes** — `packages/core/src/workspace-config.ts` extends with `pinnedApps`, `crew`, `autonomy`, `lastLayout`. - **Time-travel slider** — `packages/core/src/mind/knowledge.ts` already has bitemporal validity (`valid_from` / `valid_to`); UI is the missing piece. Each implementation plan will need its own tsconfig project verification (`packages/agent/tsconfig.json`, `apps/web/tsconfig.json`) and a Vitest pass. --- ## 13. What this design doesn't try to do - It does not propose a redesign of the **landing page** (`apps/www/`) — explicitly out of scope per the brainstorm. - It does not change **billing/tiers** — Stripe wiring is settled. - It does not change **the agent loop** — that's the engine; this is the UI. - It does not propose **a new design system** — Hive DS stays; honey/violet/hive-950 stay; we just *use them more consistently*. - It does not propose **mobile-native ports** — §6.4 is a companion, not a port. - It does not address **the KVARK on-prem enterprise surface** — that's a separate workstream. --- *End of design doc. Awaiting review.*