docs/10-tui.md

10 — TUI

The terminal user interface: picasso with no command (or picasso tui) opens it. This page is the functional reference for what ships on main: how the screen is laid out, how you talk to a running turn, every key, every slash command, themes, motion and accessibility. The visual spec lives in design/ (design/INTEGRATION.md, design/Picasso TUI.html, design/styles.css); the internals are in tui-architecture.md.

Most TUI features also exist as a shell command (picasso <command>, most with a --json option; see apps/cli/README.md), and Picasso for Mac shares the same settings, themes, start page layout, project tiles and slash registry.

Tech stack

Launching

Flag or variableEffect
picasso / picasso tuiOpen the TUI on the start page.
-c, --continue / --resume <session-id>Reopen the most recent or a named session with its full history.
--project <id>Open a registered project (or active).
`--worktree new\current\<path>`Where a new thread runs: a fresh git worktree (the default, from the worktreeDefault setting), this checkout, or an existing worktree.
--provider <provider>, --model <model>Provider and model for this session.
--permission-mode <mode>safe, auto, yolo or paranoid.
--theme <theme>dark, colorblind or high-contrast for this launch (the saved colour theme is picked with /theme).
--no-animation / PICASSO_REDUCED_MOTION=1Static spinners, no animation.
--accessible / PICASSO_A11Y=1No animation or box art; a linear transcript.
--cold-bootPlay the startup intro before the TUI.
--route <route>Open one screen directly for visual checks: first-light, canvas, plan, goal, subagents, ship, memory, projects, studio, palette, help, replay, approval.

The first launch offers the tour (/tour): a short paged walk through asking, steering, reading and approving.

Layout

┌─────────────────────────────────────────────────────────────────────┐
│ picasso / auth-refactor                       GLM 5.2 @high   ● auto │  header
├─────────────────────────────────────────────────────────────────────┤
│  › tell me what changed in the auth module since main               │
│                                                                     │
│  I'll scan the auth module and compare against main.                │
│  ✓ Ran · Search for "auth"                     23 matches · 8 files │
│  ✓ Ran · Diff src/auth against main                  +47 / −12      │
│                                                                     │
│  Three meaningful changes since main: …                             │
├─────────────────────────────────────────────────────────────────────┤
│ ›  Ask anything. @ files, $ skills, / commands                      │  composer
│    New worktree · ⎇ auth-refactor · auto                            │  quiet line
├─────────────────────────────────────────────────────────────────────┤
│ ◇ SPONSORED   Linear — Built for software teams.  linear.app/picasso│  sponsor
│ tools 3   ctx 12.4K / 200K   cache 3.2K · 41%   ● auto     ● ready  │  status line
└─────────────────────────────────────────────────────────────────────┘

Top to bottom: header (project / thread breadcrumb, model and effort, mode badge) → transcript → composer with its quiet line (checkout, branch, permission) → sponsor line → status line. ctrl+b opens the sidebar and ctrl+d the details pane; /studio pins the sidebar open.

Start page

A new session opens on the start page, laid out like Picasso for Mac's Studio:

Every project wears the same generic initials tile as on the Mac (AuraOne → AO, picasso → P, my-web-app → MW) in one of ten distinct palette colours; Picasso never reads images out of your project folders.

Talking to a running turn

Rows in the transcript

Background processes

/tasks lists the session's background processes with a human title (the agent's description, or a summary of the command), a status ("Running · 2m", "Completed · 3s", "Failed · exit 1 · 8s", "Stopped") and the folder; they group Running → Failed → Completed, and Completed folds past five. /tasks kill <jobId> stops one. Picasso for Mac shows the same list in the inspector.

Resume picker

/sessions (and /continue with no id) groups threads like the Mac sidebar: Needs you (approvals and questions), Working, Recent, Settled. In the picker e archives a thread and u undoes the archive; f forks, p pins, d shows the diff, r resumes.

Keyboard

The full list is in ? (help) and comes from packages/commands/command-manifest.json.

KeysAction
enterSend (idle); queue (running)
shift+enterNew line (run /setup-terminal once if your terminal needs it)
ctrl+enter, alt+enterSteer the running turn
ctrl+qInterrupt: stop the step, send now
esc escStop the turn
ctrl+cCancel
↑ (running)Select the queue
shift+tabCycle permission mode
/ · @ · !Slash commands · files · shell mode
ctrl+gOpen $EDITOR on the draft
ctrl+rSearch prompt history
ctrl+sStash the draft
ctrl+oView pasted text
ctrl+vAttach a clipboard image
ctrl+tShow thinking
ctrl+x ctrl+kKill all subagents
tab, ctrl+nFocus composer / queue / transcript
shift+↑/↓, pageup/pagedown, ctrl+u/ctrl+dScroll, page, half page
[ ], alt+↑/↓Previous / next turn
{ }Previous / next prompt (transcript focused)
ctrl+pGo to turn
ctrl+f, then n / NFind in transcript
j k, g GScroll, top / bottom (transcript or list focused)
ctrl+lClear the conversation pane
ctrl+b · ctrl+dSidebar · details
a s d tApproval: allow, allow for session, deny, diff view
a e rPlan review: approve and start, edit, reject
?Help

Composer editing follows readline: ctrl+a/ctrl+e line start/end, alt+←/→ by word, ctrl+k/ctrl+u delete to end/start, ctrl+w delete word, ctrl+y paste deleted text, ctrl+z/ctrl+shift+z undo/redo. /vim turns on modal editing.

Slash commands

All 83 commands in packages/commands/command-manifest.json, grouped. Type / for the palette (fuzzy search) or /help for the same list in the terminal. Aliases are in brackets.

Conversation and runs

CommandUsageWhat it does
/run/run <prompt>Run a one-shot prompt in the current conversation.
/plan`/plan [objective\off\status\show <id>\events <id>\cancel <id>]`Enter or leave plan mode; the session stays read-only until you run /plan off.
/goal`/goal <objective> \/goal [pause\resume\edit <objective>\continue [n]\rounds <n>\complete\clear\monitor]`Open or control autonomous goal runtime state.
/loop/loop <objective>Work an objective in self-paced rounds until it is met.
/queue`/queue [list\<prompt>]`Queue a prompt as the next turn, or list what is already queued.
/btw/btw <question>Ask a side question; the answer never enters the conversation.
/advisor/advisor <question>Ask the advisor model a side question; the answer stays out of the transcript.
/recap/recap [focus]Summarize this conversation so far from a throwaway fork; the transcript does not grow.
/suggest/suggest [focus]Suggest the most useful next step from this session's state.
/translate/translate <request>Turn a plain-English request into a shell command to review.
/review`/review [base-ref] \--fresh <path> [--drift] \--drift <path>`Review workspace changes, or a document with fresh reviewers that see only it and the files it references.
/review-branch/review-branch [base]Diff and review current branch changes against main or a base ref.
/compact/compact [focus]Summarize and trim the conversation context.
/feedback/feedback <text>Record feedback about this session in its session log.
/x`/x <url> \/x search <query> [feed] \/x @handle [followers\following\history] \/x circle @handle`Read public X through x.md: a post or thread, a search, a profile, followers/following, history, or an interaction circle, attached to the thread as a source.

Sessions, history and files

CommandUsageWhat it does
/new/newStart a new session in this workspace.
/clear/clearClear the conversation canvas and start a fresh session.
/sessions (/session)/sessionsPick a saved session to resume or fork.
/continue (/resume)/continueResume the most recent session.
/search/search <query>Search past session transcripts for a phrase.
/replay`/replay [session-id\latest]`Open a previous session replay.
/share`/share [public\private\revoke] [session-id]`Create or revoke a local redacted replay share.
/export/export [session-id] [path]Write this session's transcript to a markdown file on disk.
/fork/fork [turn]Branch the conversation into a new session.
/undo/undoRestore files and conversation to before the last change.
/rewind`/rewind [files\chat\both] [turn]`Restore files and conversation to before a turn.
/attach/attach <session-id>Join a running session — remote turns keep streaming.
/detach/detachLeave the session running and exit; reattach later.
/import`/import [sessions\skills\<path-to-skill-directory>]`Bring in past Claude Code, Codex or OpenCode sessions, or import a skill directory (SKILL.md).
/work`/work [--project <folder>\here] [--type <type>] [--page <n>] \open <n> \copy <n> \similar <n> [prompt]`List the files your sessions made, open or copy one, or make a similar one.
/librarian`/librarian [pause \resume \look-all \budget <tokens>]`Open the librarian: threads started without a project, filed after their first turns.

Code and git

CommandUsageWhat it does
/diff`/diff [turn <N>\base-ref]`Open the per-turn diff pane for this session's workspace changes.
/commit`/commit [confirm \edit <message> \cancel \-m <message>]`Stage all changes and draft a commit message to confirm.
/pr`/pr [confirm \title <title> \body <text> \cancel \status \watch <n> \unwatch <n>]`Draft a pull request for this branch, then push and open it on confirm; watched PRs report checks, reviews and conflicts.
/worktree`/worktree [list\create <name>\apply <name>\remove <name>\clean]`Create or open a git worktree for this session.
/init/initWrite PICASSO.md describing this workspace.
/project (/projects)`/project [list\open\create\clone\select\pin\unpin\inspect\remove]`Open, select, and inspect local projects.
/clone/clone [--branch <name>] [--depth <count>] <repo-url> [path]Clone a Git repository and open it as the active project.
/portals/portalsOpen the portals pane: dev servers this session started, ports and reachability.

Models, providers and context

CommandUsageWhat it does
/model/model <name>[@effort]Switch the active model for this session.
/provider`/provider [list\select <route>\set <route> <key>\unset <route>\check <route>\add <route>\remove <route>]`Bring-your-own-key provider management.
/auth/authOpen local auth context.
/context/contextShow context-window usage and compaction options.
/usage/usageShow tokens and cache for this session and today.
/memory`/memory [open\add\remember\inspect\pin\unpin\delete\init\sync] [note-or-id]`Inspect, initialize, sync, add, update, delete, pin, or unpin shared runtime memory entries.
/desktop`/desktop providers\budget\sponsors [select\validate]`Inspect admin-projected provider, budget, and sponsor policy.

Permissions and safety

CommandUsageWhat it does
/mode`/mode [--session] <safe\auto\accept-edits\yolo\dont-ask\paranoid>\cycle\read-only`Change how much Picasso asks before acting, saved or session-only.
/approval (/approvals)`/approval [allow\allow-session\deny [approval-id]]`Open the approval queue for write, read-only, command, plan, and editor-save gates.
/permissions/permissionsShow the effective permission policy and the saved allow rules behind it.
/rules`/rules [add <rule>\remove <id>\tool]`List the durable permission rules saved for this project.
/sandbox`/sandbox network [status\allow <domain>... [--ports 443,8443] [--soft]\off]`Per-domain egress allowlists for sandboxed commands (fail-closed).

Agents, extensions and background work

CommandUsageWhat it does
/subagent (/subagents, /fleet)`/subagent [role] [task] \status [id] \cancel <id>`Open the subagent fleet or run a bounded local subagent task.
/agents`/agents list\validate [id]`List the built-in subagent roles.
/skills`/skills list\add\enable\disable\validate [id]`List, add, enable, disable, or validate Picasso-curated skills.
/hooks`/hooks list\add\enable\disable\remove\test\validate [id]`Manage executable shell hooks that fire on run lifecycle events.
/mcp`/mcp list\add\remove\install\enable\disable\validate [id]`Connect an app, or list, install, enable, disable, validate or remove MCP servers.
/extensions`/extensions list\install\enable\disable\validate [id]`List, install, enable, disable, or validate Picasso-curated extensions.
/catalog (/components, /plugins)/catalogOpen Picasso skills, agents, MCP profiles, hooks, and workflows catalog.
/tasks (/jobs)/tasks [kill <jobId>]List or kill the background jobs the runtime reported for this session.
/team-tasks`/team-tasks [list [name] \create <list> <subject> \claim <list> <task> [owner] \done <list> <task> \delete <list> <task>]`Shared named task lists durable in the session log — agents and humans coordinate.
/workflow/workflowShow the tool-workflow runs recorded for this session.
/monitor/monitorOpen the session monitor: jobs, memory, workflows, teams and allow rules.
/schedules (/schedule)`/schedules [list\new\edit\pause\resume\delete\history\missed\queue-due\review\runs]`Schedules that message a thread or start a new one, once or repeating, with missed runs.

Start page, look and terminal

CommandUsageWhat it does
/activity/activity [github] [year]Show the threads heatmap, or the connected GitHub or GitLab contributions, for a year.
/customize`/customize [show\hide\up\down <section>] [sponsor above\below] [reset]`Show, hide and reorder the start page sections, shared with Picasso for Mac.
/theme (/themes)`/theme [<id>\list\duplicate <id> [name]]`Pick a colour theme; the choice is shared with Picasso for Mac.
/dark/darkSwitch to the dark theme.
/colorblind (/colourblind)/colorblindSwitch to the blue/orange diff palette.
/vim/vimToggle modal vim editing in the composer (Esc for NORMAL, i to insert).
/studio/studioOpen the canvas with the sidebar pinned open; the layout otherwise matches the default view.
/palette/paletteOpen command search.
/settings`/settings [show\set <field> <value>\reset]`Show or update local desktop settings.
/setup-terminal/setup-terminalConfigure shift+enter newline for this terminal.

Help and upkeep

CommandUsageWhat it does
/help (/h, /commands, /?)/helpShow help.
/guide (/setup, /onboarding)/guideOpen local setup checks and production prerequisites.
/tour/tourTake a short paged tour of the main keys: asking, steering, reading, approving.
/about (/footprint)/aboutShow what Picasso puts on this computer, or a prompt that asks your agent to check a release first.
/doctor/doctorCheck terminal, auth, runtime version, MCP and LSP health.
/update/update [runtime]Compare the installed runtime with the pinned and latest versions.
/updates/updatesOpen background updates: the next check, a version waiting to switch, and recent results.
/ads`/ads [status\why]`Show sponsored terminal ad status. Sponsors are always on — they keep Picasso free.
/ship`/ship [status\next\evidence\plan]`Show Ship Room readiness, launch blockers, next actions, and evidence freshness.
/quit/quitExit Picasso.

/model <id> @<effort> sets the reasoning effort for any built-in model, and /model connections manages the ordered model connections with automatic fallback (see 07-providers.md). /schedule is an alias of /schedules; schedules need a runner and say how to turn one on (picasso service install, or "Keep threads running when Picasso quits" in Picasso for Mac). /settings shows "Keep threads running when Picasso quits: on/off".

Status line

Always visible, always honest. Values come from the latest session events, never from fixtures.

/context shows the context window with recorded cache sections; /context timeline shows what entered the context turn by turn (additions, compaction, cache hit/miss per step, subagent lanes; "No usage reported" or "Size not recorded" when the engine did not report it). /usage shows tokens and cache for the session and today.

One line, above the status line, always labelled ◇ SPONSORED (ASCII fallback <>). One sponsor per session, no mid-session rotation, shown in every permission mode including paranoid, never dismissable, never inside the conversation or model output. The URL is printed and selectable; /ads why explains why you see it. Allow/deny lists are in 13-ads-monetization.md.

Themes

Thirteen colour themes, shared with Picasso for Mac: Picasso (the default), Catppuccin Latte, Catppuccin Mocha, Gruvbox Light, Gruvbox Dark, Nord, Solarized Light, Solarized Dark, Tokyo Night, Rosé Pine, One Dark, GitHub Light and GitHub Dark. /theme opens the picker, /theme <id> sets one, /theme duplicate <id> [name] makes a custom copy in <PICASSO_HOME>/themes/*.json; picasso settings set theme <id> does the same from the shell. Every terminal colour meets WCAG AA contrast.

Two overlays work with any theme: the colour-blind diff palette (/colorblind, --theme colorblind or PICASSO_COLORBLIND=1) swaps add/delete to blue/orange, and --theme high-contrast raises the faint text tones. /dark returns to the dark theme.

Motion and accessibility

Terminals and fallbacks

First-class: iTerm2, WezTerm, Kitty, Ghostty, Alacritty, Windows Terminal (24-bit colour, Unicode box drawing, braille spinners).

CapabilityFallback
24-bit colour256-colour palette mapped from the theme
Unicode box drawingASCII (-, `\, +, >`)
Braille spinnerASCII spinner
MouseKeyboard only; everything stays reachable

Narrow terminals (under 80 columns) collapse to one column with tool summaries only; very narrow ones (under 60) show a one-time note. picasso doctor checks the terminal, and picasso terminal-graphics checks inline image support.

Design rules

  1. One accent colour per theme; semantic accents (memory, goal, plan, sponsor) are the only other saturated colours.
  2. The sponsor is one line, above the status line, always labelled.
  3. Tool rows collapse to one line after completion; they are not log dumps.
  4. The status line is real: real token counts, real cache and budget share, never a dollar cost.
  5. Reduced motion disables all animation.
  6. No emoji in product copy. Glyphs are ◆ ◇ ▾ ● ○ › ✓ ✕.
  7. Errors say what to do, e.g. "Run picasso auth login to refresh."

Dependencies