Files
waggle-os/docs/superpowers/specs/2026-05-23-waggle-os-ux-design.md
Oleg Maslov 0c3e2ead3b
Some checks failed
Installer Smoke / installer-smoke (push) Has been cancelled
moving
2026-09-02 10:10:29 +02:00

23 KiB
Raw Blame History

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 windowPause / 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 tierWorkspaceConfig.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-agentCmd+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 (23 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.12.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 (46 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.16.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 skinapps/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 honeycombapps/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 inspectorapps/web/src/components/os/apps/ChatApp.tsx + memory recall events from packages/agent/src/orchestrator.ts recallMemory().
  • Workspace scenespackages/core/src/workspace-config.ts extends with pinnedApps, crew, autonomy, lastLayout.
  • Time-travel sliderpackages/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.