Product stance
Smithers TUI complements the CLI. Every meaningful UI action maps to a Smithers API or CLI operation, preserving the same durable, scriptable mental model. The TUI is not a full replacement for Claude Code, Codex CLI, Gemini CLI, or Amp. It is not a direct-edit harness by default. It is the orchestration layer above harnesses and API providers.Shell layout
The shell has four regions: workspace rail, activity feed, inspector, and composer.Adaptive layouts
| Width | Behavior |
|---|---|
| >= 140 cols | Full three-column layout. Left rail 24 cols, right inspector 36—42 cols. |
| 100—139 cols | Inspector narrows to 28—32 cols. Less metadata in workspace rows. |
| 80—99 cols | Inspector becomes a toggleable overlay. Feed is the dominant pane. |
| < 80 cols | Single-pane mode. Workspace switcher and inspector are modal overlays. |
Workspaces
A workspace is the top-level unit of activity. It contains a title, repo/cwd, current provider profile, mode, feed history, queued messages, linked runs, pinned context, and approval state. The left rail shows all open workspaces. Each row displays:- State marker (
|active,!attention,.running) - Title
- Provider tag (
[CC],[SM],[AI],[GM],[CX]) — progressively disclosed (hidden until hover/focus in standard layouts) - Compound Status badge (combines unread/approval into clear priority icons)
Activity feed
The center pane is a unified activity feed that mixes all orchestration activity:| Item type | Display |
|---|---|
| User | Compact text with optional attachment pills |
| Assistant | Markdown with code blocks, collapsible long sections |
| Tool | Collapsed by default, one-line summary with name/target/status/duration |
| Run | Compact badge with workflow name, run ID, step, elapsed, progress |
| Approval | Detaches from feed into an Action Bar above the composer to prevent scrolling off-screen |
| Artifact | File name, type, source workflow/run, open/diff/copy affordances |
| Diff | Structured diff card |
| Error | Red label, compact summary first, stack collapsed underneath |
| Summary | Assistant-generated summaries for long activity blocks |
LIVE / PAUSED indicator appears in the feed header. To prevent scroll-blindness, active long-running workflows pin a sticky status header tracking progress, and related tool events are grouped with vertical ASCII spines.
Empty states
New workspaces avoid the “blank terminal” syndrome by rendering a non-persistent Welcome Bento Board in the feed area. It displays current repo git status and proposes 3 suggested actions based on the repository heuristcs (e.g. noticing apackage.json and suggesting a test workflow). This board naturally scrolls away once feed items occur.
Inspector
The right rail shows details for the currently selected feed item. The inspector is a dynamic, context-sensitive precision surface. Instead of showing persistent empty tabs, the pane’s title and contents morph based entirely on the selection. A breadcrumb (e.g.,Inspector • Run a93f or Inspector • src/auth.ts) grounds the user.
Depending on the selection, the inspector can render:
- Run — run graph, status, steps, cost
- Context — pinned context items, token budget
- Workflow — schema, last runs, provider hints
- Diff — file diffs
- Logs — timestamped lifecycle events
- Details — raw output, structured output, scorer results
Composer
The composer is a small command desk at the bottom of the shell.- Multiline input (auto-grows up to 6 rows, then scrolls)
@unified mentions for attaching files, directories, images, workspaces, sessions, and runs#invokes workflows (opens a fuzzy workflow picker)- Slash commands (
/run,/workflows,/approvals, etc.) - Queued follow-up messages with
Alt+Enter - Large paste guard — detects large paste and offers attach-as-file, inline, summarize, or cancel
- Draft preserved while switching workspaces
Keyboard model
Global
| Key | Action |
|---|---|
Ctrl+O | Open global command palette |
Tab / Shift+Tab | Cycle focus: workspace rail, feed, inspector, composer |
Esc | Dismiss overlay, abort transient action, return focus toward composer |
? | Show shortcuts/help for current context |
. | Open contextual action menu for selected item |
/ | Search current pane (when composer is not focused) |
Ctrl+L | Provider / model / profile picker |
Ctrl+R | Prompt history search |
Ctrl+G | Open composer in external editor |
Composer
| Key | Action |
|---|---|
Enter | Send |
Alt+Enter | Queue follow-up |
Shift+Enter / Ctrl+J | Newline |
@ | Unified context attach (file/image/directory/run/session) |
# | Invoke workflow |
Ctrl+A / Ctrl+E | Start / end of line |
Alt+B / Alt+F | Word backward / forward |
Ctrl+W / Ctrl+U / Ctrl+K | Kill word / line before / line after |
Feed and lists
| Key | Action |
|---|---|
Up / Down or j / k | Move selection |
g / G | Jump to top / bottom |
PageUp / PageDown | Page |
Space | Expand / collapse selected item |
Enter | Default action (open detail view) |
v | Toggle verbose view |
o | Open artifact/diff/log in pager or external viewer |
/ | Filter/search within the current pane |
Destructive actions
No global single-key kill/approve while unfocused. Approval actions only appear inside the approval context. Confirmation dialogs always show the exact target. A per-workspace “always allow” path exists for repetitive safe actions.Modes
The TUI supports three operating modes, switchable via/mode or Ctrl+L:
Operator (default)
The assistant prefers creating, modifying, and reusing Smithers workflows over direct file edits:- Inspect existing
.smithers/workflows/first - Reuse or refactor shared Smithers components
- Scaffold or edit workflows/scripts in
.smithers/ - Launch durable runs for non-trivial work
- Monitor and report results
- Use cheaper API providers for broad analysis
- Escalate to harness-backed workers only when needed
- Ask before direct edits outside
.smithers/
Plan
Read-only. No file writes, no destructive shell, no workflow execution without confirmation.Direct
Direct repo edits allowed. Still encourages Smithers scripts where useful but does not block one-off edits.Provider routing
A provider profile routes work by task class. Example:- Repo scan -> AI SDK / cheap model
- Workflow generation -> API strong model
- Repo implementation -> Claude Code or Codex harness
- Final summary -> cheap model
/provider and /profiles.
Workflow catalog
Type# in the composer to open the workflow picker:
.smithers/workflows/. Features:
- Favorites and recents
- Fuzzy search by ID, tags, description, provider hints
- Input schema summary
- Last-run status, duration, success rate
- Launch form generated from schema when possible
Run monitoring
Run cards in the feed show:- Workflow name, run ID, provider
- Elapsed time, step count, progress bar
- Latest node, approval state
- Retries, failures, token/cost summary
- Overview and DAG/step graph
- Node attempts
- Logs and chat transcript
- Artifacts and scorer results
- Raw/structured output
- Retry, resume, and cancel actions
Notifications
Events that trigger notifications:- Approval needed
- Run failed or completed
- Provider disconnected
- Queued message delivered
Slash commands
Core
| Command | Purpose |
|---|---|
/help | Help |
/new | New workspace |
/resume | Resume workspace |
/tree | Session tree |
/compact | Compact feed |
/clear | Clear feed |
/export | Export feed to markdown/JSON |
/theme | Switch theme |
/settings | Settings |
Smithers
| Command | Purpose |
|---|---|
/workflows | Open workflow catalog |
/run | Launch a workflow |
/runs | Show live runs |
/approvals | Show pending approvals |
/inbox | Unified attention queue (alerts + approvals + human requests) |
/telemetry | Telemetry board |
/triggers | Trigger manager |
/datagrid | SQL query browser |
/docs | Search Smithers docs |
/attach-run | Attach to a run |
/resume-run | Resume a run |
/cancel-run | Cancel a run |
Provider
| Command | Purpose |
|---|---|
/provider | Switch provider profile |
/mode | Switch mode (operator/plan/direct) |
/budget | Token budget |
/profiles | Manage provider profiles |
Context
| Command | Purpose |
|---|---|
/attach | Attach file/context |
/detach | Remove context |
/history | Prompt history |
/editor | Open external editor |
Command palette
PressCtrl+O to open the global command palette. All slash commands and contextual actions are searchable here. Natural language also works — type what you want and the assistant interprets it.
Persistence and recovery
The TUI survives:- Accidental exits (workspace restore on relaunch)
- TTY resize
- Provider disconnects (reconnect automatically)
- Broker crashes (workflow runs continue independently)
- Large paste mistakes (paste guard dialog)
Monitoring with Claude Code
Smithers persists all state to SQLite and exposes it through the CLI, so Claude Code can query status and report progress without interrupting execution. Set up a recurring health check with/cron:
--hot, Smithers watches for file changes and hot-reloads the workflow definition. Claude Code can edit prompts, swap agents, or restructure the JSX tree mid-run. In-flight tasks keep their original code; new tasks use the updated definition.
Other patterns:
- Ad hoc inspection — Read the Smithers database and explain a failed run
- Approval handling — Run
smithers approveorsmithers denybased on criteria - Live tuning — With
--hot, tweak prompts or switch models mid-run - Post-run analysis — Summarize outputs and suggest next steps
Beyond the terminal
Burns
Burns is a workspace-first local control plane for Smithers. React web app, ElectroBun desktop shell, and headless CLI for authoring, running, and supervising workflows. See Ecosystem.JJHub Cloud
jjhub.tech will have first-class Smithers support for hosted workflows with scheduling, observability, and team collaboration.Next steps
- CLI Reference — All CLI commands including
smithers tui. - Monitoring & Logs — Observability with Grafana and Prometheus.
- Debugging — Diagnosing workflow issues.