8eb53c6b on main, September 14, 2026.
GAIA should feel like the same assistant in the terminal, browser, and desktop app.
The flagship TUI defines agent behavior; the website, WebUI/Electron, and TUI
share a terminal-inspired design language. The Codex Mac app informs restraint,
spacing, and graphical polish. Open GAIA, describe the work, follow its progress,
answer when needed, and use the result. GAIA is a general-purpose assistant for documents, research,
planning, data, and everyday work. Choosing an agent disappears from that flow.
Usability and readability outrank styling. Keep comfortable text sizes and line
lengths, obvious actions, strong contrast, predictable keyboard behavior, and clear
progress/recovery. No terminal convention should make a first-time user learn commands.
Product boundary
For the agent clients, “mirror” means the same flagship, tools, context semantics, provider choices, questions, approval rules, cancellation, and outcomes. Layout and input mechanics adapt to each surface. It does not mean embedding a terminal in the web app. This first release aligns behavior. Live handoff of a conversation between TUI and web, synchronized history, and simultaneous control of the same run are separate work: the current persistent TUI child and web session store have different lifetimes. Do not advertise cross-app continuation until there is a shared session contract.One design language across all three surfaces
Website and TUI updates are explicitly in scope alongside WebUI/Electron. Shared identity means the same color roles, readable hierarchy, prompt vocabulary, quiet status language, restrained accent, and focus/selection cues. Share design decisions, not a new cross-framework component platform. Usability takes priority over exact pixel matching or forcing terminal limitations onto the web.
Start from existing website tokens (
website/src/design/tokens.css), WebUI CSS
variables, and TUI theme (tui/internal/ui/theme/theme.go). Pin one small semantic
palette and typography/spacing guide, with explicit CSS and terminal mappings.
Website prose can use readable proportional type; terminal type follows the user’s
terminal font. Do not force terminal font size, truecolor, or background settings.
Keep light-theme legibility, limited-color contrast, narrow-terminal support, and
plain text status labels. No custom token compiler is needed for this scope.
Remove distracting effects such as starfield/glow treatments where they compete
with the shared quiet design. Website demonstrations must be labeled examples,
not pretend live input. Preserve working installation paths during the redesign;
never replace a published download with a link to an unbuilt installer.
Original palette: graphite, ivory, copper
No green motif. Use a warm mineral palette as the prototype direction, giving GAIA a distinct identity rather than reproducing Codex or a conventional hacker terminal. Most of the screen stays neutral; color marks the prompt, selection, focus, and the single primary action. Keep ordinary answers uncolored and comfortable to read.
Validate these prototype values in real layouts. The character comes from their
restrained use, a recognizable
>
prompt, precise monospace details, and generous readable space. Avoid neon, glow,
blinking decoration, gradient-filled panels, and a wall of colored badges.
Use text and icons for success/warning/error, with dedicated semantic colors only
where needed; success need not be green. Colored buttons need independently checked
foreground contrast. Terminal mappings must remain legible with user themes and
limited palettes, even when exact copper cannot be reproduced. Before approval,
compare website, graphical app, and TUI renders together in dark and light settings.
What the current code establishes
Paths beginning with
components/ above are relative to src/gaia/apps/webui/src/;
gaia_agent/ is under hub/agents/gaia/python/.
Older Agent UI v2 and email-TUI plans describe broader or historical work; they are
context, not evidence that a capability ships. Recheck live code before implementation.
Design reference and the smallest useful UI
The supplied Codex Mac screenshot is an interaction reference. Borrow its quiet sidebar, dark neutral canvas, readable conversation column, subtle rounded surfaces, muted activity summaries, and anchored composer. Keep GAIA’s identity and general-purpose language. Do not import the screenshot’s pull requests, project hierarchy, developer panels, or access-mode controls. The official desktop reference also describes keeping conversations in view and working with files. It supports those interaction principles; GAIA owns its visual identity. The screenshot is not included in this public plan. An elegant graphical terminal is the design direction. The terminal shapes the interaction: prompt-driven input, a continuous transcript, concise output, compact monospace input/labels/activity, a subtle> prompt marker, and quiet status lines.
Use dark-first charcoal surfaces and readable typography for long-form results.
Web affordances add selection, clickable citations/files, rich inline results,
attachment chips, and accessible inline choices. Codex contributes spacing and
restraint. Its developer workflows and bubble-heavy chat conventions are not the
product model. This scope does not introduce a terminal emulator or shell console.
Keep, remove, and reveal only when needed
Other-agent creation/management stays under Settings → Advanced for compatibility;
there is no new catalog experience in this scope. Removing entry points does not
uninstall agents or delete data. Preserve legacy session URLs, messages, attachments,
and agent types. New chat always selects the flagship, including after viewing a
legacy chat; never silently rewrite or reroute an existing conversation.
Interaction rules
- Start: open straight into the conversation shell. A new chat has an immediately usable composer once ready. Show setup guidance only for an actual blocker; do not animate a welcome sequence before accepting input.
- Ask: multiline composer, Enter to send, Shift+Enter for newline, attachment chips with progress/removal, and a Send/Stop button reflecting real run state. Starter prompts fill the composer and wait for submission. Preserve draft text.
- Follow: answers stay on the open canvas. One expandable activity summary shows what GAIA is doing. Keep scrolling under the reader’s control when they look back.
- Respond: questions and approvals appear inline at the moment needed. Show the question or exact action clearly and only choices the agent actually supports. A reply resumes that run; it does not create another conversation.
- Use the result: show readable answers, citations, and existing result cards inline. Open/download an attachment when selected. No new preview workspace, split panes, terminal panel, or review surface in v1.
- Recover: say what failed and what to do next. Retain the conversation and draft. Unknown/malformed results display an explicit diagnostic. Never automatically retry an action that may already have completed.
Visual constraints
- Dark-first charcoal surfaces, subtle borders, one restrained accent, consistent Lucide icons. Use the mascot sparingly; remove glow, hacker typing, and decorative status badges.
- Prototype a 240–260px collapsible sidebar and roughly 760px readable content width. Use 15–16px readable body text, a system monospace for composer input, prompt, labels and activity, generous spacing, and restrained rounding. Avoid heavy bubble chrome. These are starting points for visual review, not measurements of the screenshot. No simulated typing, ASCII dashboard, decorative blinking cursor, or dense command log.
- Evolve existing CSS variables and component CSS. No new design framework. Support light/dark/system appearance, reduced motion, visible keyboard focus, and accessible text contrast. Status must not depend on color alone.
- Keep the existing mobile spec’s 768px boundary and drawer navigation. At narrow widths or 200% zoom, the conversation/composer remain usable without horizontal page scrolling. Use 44px touch targets.
- Preserve existing voice access where supported; no new voice engine. Keep keyboard access to new chat, search, composer, and dismiss, with platform-specific shortcuts verified against browser conflicts. Stop remains an explicit action.
Parity contract and drift prevention
The flagship owns tools, policies, model behavior, and command semantics. Clients own presentation. Every shared user-visible change must update this parity matrix and its fixtures in the same PR, or identify a visible, explicitly unsupported state. Both clients must land support before that capability is called mirrored.
Parity means equivalent decisions and state, not byte-identical model answers.
Use deterministic canonical event recordings and assertions for automated checks;
reserve live model runs for the shared golden journeys. Terminal-only selection,
mouse capture, and key bindings remain surface-specific. Existing voice and rich card rendering
may be graphical enhancements, clearly separate from the shared baseline.
Transport and session scope
Pin transport in milestone 0, before implementation. Both browser and Electron must use backend-owned execution, with explicit session ownership and the existing local/tunnel access protections. Never spawn agents from the renderer or add a second Electron-only reasoning path. Compare two bounded options against the parity tests:- Adapt the persistent flagship stdio/control transport in the web backend. It already supports approvals and live model commands, but needs correlated question responses added to both the agent control protocol and TUI subprocess client.
- Reuse the HTTP sidecar and its retained session registry. Persistence and input responses already exist; resumable approval and TUI-equivalent model switching need to be verified and completed before claiming parity.
- Session identity → owned agent process, working context, actual provider/model, loaded state, lifecycle, and the explicit limits of restart recovery.
- Run identity → canonical events, exactly one terminal outcome, bounded event retention, reader attachment, and cancel acknowledgement.
- Control request → session/run/request correlation, permitted choices, expiry, single-use reply handling, and rejection of stale/cross-session requests.
- Capability report → available commands, render types, supported input methods, provider readiness, and whether a pending gate can actually be answered.
Delivery sequence
Milestones are proposed implementation PR boundaries, not concurrent assignments.
Steps touching the same frontend tree remain serial. Re-estimate after milestone 0
resolves transport and lifecycle questions; an honest calendar estimate depends on
those decisions. This PR contains only the plan and documentation navigation.
Test and review bar
- Extend existing Vitest/Testing Library suites for default routing, legacy task retention, run-state transitions, keyboard access, cards, drafts, and scrolling.
- Add integration coverage for any backend adapter/control endpoints, including stale approvals, cross-session replies, process failure, and duplicate submissions.
- Replay a shared JSON fixture corpus in Go and TypeScript, plus adapter tests in Python. Schema/behavior changes require both clients’ expectations to be reviewed.
- Run browser and Electron golden journeys: start → attach document → ask → answer question → review/approve action → inspect output → follow up → stop → reopen. Also cover offline startup and remote-provider state. Use isolated test data.
- Test the website’s navigation, keyboard access, responsive layout, and current download selection; run its existing Vitest suite and Astro check/build. Test TUI wrapping, input, questions, approvals, status, and theme contrast at 80×24 and larger sizes, including limited-color terminals. Run affected Go tests.
- Before the implementation PR is ready for review, inspect actual local renders, review the diff, and exercise functionality. Open the website and agent WebUI in browser tabs, launch Electron, and open the TUI in a terminal for a side-by-side showcase. Record startup instructions and leave the review instances running. Capture design evidence with test data; expose any unavailable platform checks. Gather user feedback and iterate before presenting the redesign as finished.
- Human usability target: at least 4 of 5 representative users can start a task, attach context, answer a decision, and find a previous task without coaching. Measure UI readiness separately from model startup; decorative animation must never delay input. Profile long transcripts with at least 1,000 activity events.
- Require code review, architecture review for transport/lifecycle changes, the repository’s automated reviewer, and human UX approval before implementation merges. Check stop-the-line paths again before each PR; consumer-critical issues need implementation-ready specs before work is assigned.