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
- Ink (React for terminals) on Node.js for layout, components and lifecycle.
- chalk + supports-color for colour, with a degraded ANSI fallback for restricted terminals.
- cli-truncate and string-width for wide-character-correct measurement.
- The slash registry and key bindings come from one manifest,
packages/commands/command-manifest.json, which the TUI, the CLI help and the Mac command surface all read.
Launching
| Flag or variable | Effect | ||
|---|---|---|---|
picasso / picasso tui | Open 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=1 | Static spinners, no animation. | ||
--accessible / PICASSO_A11Y=1 | No animation or box art; a linear transcript. | ||
--cold-boot | Play 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:
- A greeting and date ("Good evening · Sunday, November 8 at 10:40 PM") and the headline "What should we build in ‹project›?";
/new --no-projectstarts without a project. - Activity: a labelled heatmap of your threads (months, Mon/Wed/Fri, a Less/More legend, "N threads in 2026").
/activity [year]pages through years. - GitHub activity: your GitHub or GitLab contributions from the connected repo host, cached for an hour and hidden when no host is connected (
/activity github [year]; connect one with/project connect). - Recent threads, ending with one "This month" line (threads, change against last month, files changed).
/customizeshows, hides and reorders these sections and places the sponsor line above or below them; the layout is stored in the sharedsettings.startPage, so the Mac Studio follows it.
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
- Enter sends when idle. While a turn runs, Enter queues your message by default; the "While a turn is running, Enter…" setting (
enterWhileRunning:queueorsteer, alsopicasso settings set enterWhileRunning steer) flips it. - Steer (
ctrl+enter,alt+enter) sends the message into the running turn now. Steered messages show in the transcript as your own message, prefixed "› steered". - Enter in an empty composer sends a queued message now: it steers the selected queued message (or the oldest) into the running turn. Queued rows read "queued · Enter sends now".
- Interrupt (
ctrl+q) stops the current step and sends your draft at once. Stop isesc esc;ctrl+ccancels. - The queue is editable and reorderable:
↑selects it,eedits,ssteers,xremoves,shift+↑/↓reorders. A paused queue offers Send next. - Long pastes fold into a "pasted N lines" chip;
ctrl+oopens the pasted text in a pager.ctrl+vattaches a clipboard image;@attaches files;$picks a skill. - Links in the transcript are clickable in terminals that support OSC 8.
Rows in the transcript
- Live step rows read as what they do: "Running · <title>" while in flight, "Ran · <title>" when done. A shell command that exits non-zero shows ✕, not ✓. Tool results read as text, never raw JSON.
- Decisions: when one turn asks two or more things, they show as one numbered block ("Needs you · N decisions · answer each with its number; …"). Approvals take
1/2/3(Allow, Allow for this thread, Deny;a/s/dstill work). - Options: when the agent calls
present_options, the TUI shows a numbered list of two to four options (←/→orn/pmove,oopens one, a number picks it). ask_user_questionand plan review reach you as questions; answer inline.- Goal rounds show as "Goal round N of M" cards, live and after
/resume. - Progress reports arrive about every 10 minutes on long tasks (setting
progressReports). - Failed turns read "503 · <message>"; engine exit reasons are shown with secrets redacted.
/fork,/undoand/rewindsay where you are: "You're now in the fork; the original is unchanged. Back to the original: /continue <id8>".
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.
| Keys | Action |
|---|---|
enter | Send (idle); queue (running) |
shift+enter | New line (run /setup-terminal once if your terminal needs it) |
ctrl+enter, alt+enter | Steer the running turn |
ctrl+q | Interrupt: stop the step, send now |
esc esc | Stop the turn |
ctrl+c | Cancel |
↑ (running) | Select the queue |
shift+tab | Cycle permission mode |
/ · @ · ! | Slash commands · files · shell mode |
ctrl+g | Open $EDITOR on the draft |
ctrl+r | Search prompt history |
ctrl+s | Stash the draft |
ctrl+o | View pasted text |
ctrl+v | Attach a clipboard image |
ctrl+t | Show thinking |
ctrl+x ctrl+k | Kill all subagents |
tab, ctrl+n | Focus composer / queue / transcript |
shift+↑/↓, pageup/pagedown, ctrl+u/ctrl+d | Scroll, page, half page |
[ ], alt+↑/↓ | Previous / next turn |
{ } | Previous / next prompt (transcript focused) |
ctrl+p | Go to turn |
ctrl+f, then n / N | Find in transcript |
j k, g G | Scroll, top / bottom (transcript or list focused) |
ctrl+l | Clear the conversation pane |
ctrl+b · ctrl+d | Sidebar · details |
a s d t | Approval: allow, allow for session, deny, diff view |
a e r | Plan 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
| Command | Usage | What 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
| Command | Usage | What it does | ||||
|---|---|---|---|---|---|---|
/new | /new | Start a new session in this workspace. | ||||
/clear | /clear | Clear the conversation canvas and start a fresh session. | ||||
/sessions (/session) | /sessions | Pick a saved session to resume or fork. | ||||
/continue (/resume) | /continue | Resume 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 | /undo | Restore 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 | /detach | Leave 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
| Command | Usage | What 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 | /init | Write 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 | /portals | Open the portals pane: dev servers this session started, ports and reachability. |
Models, providers and context
| Command | Usage | What 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 | /auth | Open local auth context. | ||||||||
/context | /context | Show context-window usage and compaction options. | ||||||||
/usage | /usage | Show 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
| Command | Usage | What 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 | /permissions | Show 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
| Command | Usage | What 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) | /catalog | Open 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 | /workflow | Show the tool-workflow runs recorded for this session. | ||||||||||
/monitor | /monitor | Open 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
| Command | Usage | What 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 | /dark | Switch to the dark theme. | ||||
/colorblind (/colourblind) | /colorblind | Switch to the blue/orange diff palette. | ||||
/vim | /vim | Toggle modal vim editing in the composer (Esc for NORMAL, i to insert). | ||||
/studio | /studio | Open the canvas with the sidebar pinned open; the layout otherwise matches the default view. | ||||
/palette | /palette | Open command search. | ||||
/settings | `/settings [show\ | set <field> <value>\ | reset]` | Show or update local desktop settings. | ||
/setup-terminal | /setup-terminal | Configure shift+enter newline for this terminal. |
Help and upkeep
| Command | Usage | What it does | |||
|---|---|---|---|---|---|
/help (/h, /commands, /?) | /help | Show help. | |||
/guide (/setup, /onboarding) | /guide | Open local setup checks and production prerequisites. | |||
/tour | /tour | Take a short paged tour of the main keys: asking, steering, reading, approving. | |||
/about (/footprint) | /about | Show what Picasso puts on this computer, or a prompt that asks your agent to check a release first. | |||
/doctor | /doctor | Check terminal, auth, runtime version, MCP and LSP health. | |||
/update | /update [runtime] | Compare the installed runtime with the pinned and latest versions. | |||
/updates | /updates | Open 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 | /quit | Exit 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.
- `tools`: tool calls this turn.
- `ctx`: current tokens / context window, e.g.
12.4K / 200K. - `cache`: cached input tokens and hit share, e.g.
3.2K · 41%. Dollar costs are never rendered (ad-supported product); budget state shows as a share of the cap. - `mode`: the permission mode badge (
safe,auto,yolo,paranoid,plan,goal). - `branch`: the current git branch (
⎇). - `mi`: on wide terminals, a compact managed-inference summary; hidden on narrow ones so the core segments never wrap.
- `state`:
ready,busy(with a pulse),pausedorerror.
/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.
Sponsor line
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
- Animation is limited to the caret, the braille spinner on running rows and a pulse on live goal rounds and the sponsor's first appearance.
- Reduced motion:
--no-animation,PICASSO_REDUCED_MOTION=1, or Settings › Appearance › motion (full / reduced) in/settings, remembered across launches. Spinners become static marks and the pulse a static dot. - Accessible mode:
--accessibleorPICASSO_A11Y=1: no motion, no box art, plain links, a linear transcript a screen reader can follow. - Every action is reachable by keyboard; the mouse is an enhancement only.
Terminals and fallbacks
First-class: iTerm2, WezTerm, Kitty, Ghostty, Alacritty, Windows Terminal (24-bit colour, Unicode box drawing, braille spinners).
| Capability | Fallback | |
|---|---|---|
| 24-bit colour | 256-colour palette mapped from the theme | |
| Unicode box drawing | ASCII (-, `\ | , +, >`) |
| Braille spinner | ASCII spinner | |
| Mouse | Keyboard 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
- One accent colour per theme; semantic accents (memory, goal, plan, sponsor) are the only other saturated colours.
- The sponsor is one line, above the status line, always labelled.
- Tool rows collapse to one line after completion; they are not log dumps.
- The status line is real: real token counts, real cache and budget share, never a dollar cost.
- Reduced motion disables all animation.
- No emoji in product copy. Glyphs are
◆ ◇ ▾ ● ○ › ✓ ✕. - Errors say what to do, e.g. "Run
picasso auth loginto refresh."
Dependencies
packages/tui: Ink components mirroringdesign/tui-primitives.jsx.packages/commands: the slash registry and key bindings.packages/core: the engine session and event stream.packages/shared-home: themes and settings shared with the Mac.packages/ads-sdk: sponsor content.design/styles.css: the token source.