SageOx · CLI catalog

ox 0.8.1

Theme

ox ships one palette in two variants. Every command — boxes, timelines, spinners, the doctor wordmark — uses the same semantic tokens; lipgloss picks the right hex at runtime based on your terminal's background.

How detection works

  1. OSC 11 query. At first render, lipgloss queries the terminal for its actual background color (escape sequence \x1b]11;?\x07). Modern terminals (iTerm2, Alacritty, Kitty, Wezterm, Windows Terminal, recent VS Code) answer back; lipgloss computes luminance and picks dark or light.
  2. COLORFGBG fallback. Some emulators (rxvt-derived) export this env var instead. lipgloss reads it.
  3. Default dark. If nothing answers (CI, piped output, exotic terminal), ox assumes a dark background — the most common case among coworkers.
  4. NO_COLOR=1 short-circuits everything: no ANSI emitted, terminal default colors only.

Mechanism: compat.AdaptiveColor{Light, Dark} in internal/theme/generated.go (npm-synced from sageox-design/tokens/colors.yaml). The pair below shows both variants; the one outlined is what your current Mode toggle would render.

brand

Primarylight#4F6A48dark#7A8F78App name, headers, spinners — the calm sage anchor
Secondarylight#B87D3Adark#E0A56ACommands, interactive elements — copper highlight
Accentlight#3D5437dark#8FA888File paths, callouts, "look here"

semantic

Successlight#4F6A48dark#7A8F78Passed checks, confirmations
Warninglight#B87D3Adark#E0A56ACautions, dirty builds, soft warnings
Errorlight#A03030dark#E07070Failures, blocked items, hard stops
Infolight#5580A0dark#7FA7C8Flags, links, informational notes
Dimlight#6B7580dark#8F99A3Descriptions, secondary text

visibility

Publiclight#0f766edark#2dd4bfVisible-to-team — teal
Privatelight#b45309dark#fbbf24Personal / not shared — amber

wordmark

WordmarkSagelight#7a8f78dark#c4d1c0"Sage" half of the ASCII wordmark
WordmarkOxlight#546a54dark#7a8f78"Ox" half of the ASCII wordmark

log-formatter

data-display
────────────────────────────────────────────────────────────log-formatter [data-display] internal/cli use: Rendering structured slog output for humans without giving up grep. use: Levels get colored, timestamps compacted, key=value pairs preserved. use: Pipe daemon logs through it.────────────────────────────────────────────────────────────14:32:01.000 INFO daemon started addr=127.0.0.1:5471 version=0.9.014:32:02.000 DEBUG loaded config path=~/.sageox/config endpoint=api.sageox.ai14:32:03.000 WARN ledger stale repo=ox age=2h32m14:32:04.000 ERROR sync failed repo=ox err="LFS pointer missing"
────────────────────────────────────────────────────────────log-formatter [data-display] internal/cli use: Rendering structured slog output for humans without giving up grep. use: Levels get colored, timestamps compacted, key=value pairs preserved. use: Pipe daemon logs through it.────────────────────────────────────────────────────────────14:32:01.000 INFO daemon started addr=127.0.0.1:5471 version=0.9.014:32:02.000 DEBUG loaded config path=~/.sageox/config endpoint=api.sageox.ai14:32:03.000 WARN ledger stale repo=ox age=2h32m14:32:04.000 ERROR sync failed repo=ox err="LFS pointer missing"
Package
internal/cli
Exports
FormatSlogLine · StreamFormattedLogs · ParseSlogLine
Since
0.6.0
Use when
Rendering structured slog output for humans without giving up grep. Levels get colored, timestamps compacted, key=value pairs preserved. Pipe daemon logs through it.
Avoid when
JSON-mode output (`--json`) or anything that downstream tooling parses. Pretty-printing breaks aggregators.

markdown

data-display
────────────────────────────────────────────────────────────markdown [data-display] internal/ui use: Long-form content with structure — release notes, agent responses, use: knowledge bubble snippets. Glamour-backed with a SageOx-tuned theme so use: output matches brand.────────────────────────────────────────────────────────────# Release notes ox 0.9.0 ships the component catalog. • Hidden ox dev catalog command • Theme tokens documented in docs/design/ • Published at sageox-design.netlify.app https://sageox-design.netlify.app/ │ │ Calm, precise output for humans and AI coworkers.
────────────────────────────────────────────────────────────markdown [data-display] internal/ui use: Long-form content with structure — release notes, agent responses, use: knowledge bubble snippets. Glamour-backed with a SageOx-tuned theme so use: output matches brand.────────────────────────────────────────────────────────────# Release notes ox 0.9.0 ships the component catalog. • Hidden ox dev catalog command • Theme tokens documented in docs/design/ • Published at sageox-design.netlify.app https://sageox-design.netlify.app/ │ │ Calm, precise output for humans and AI coworkers.
Package
internal/ui
Exports
RenderMarkdown
Since
0.5.0
Use when
Long-form content with structure — release notes, agent responses, knowledge bubble snippets. Glamour-backed with a SageOx-tuned theme so output matches brand.
Avoid when
Short status output (markdown headers are overkill) or any performance-sensitive hot path — glamour parsing has measurable cost.

timeline

data-display
────────────────────────────────────────────────────────────timeline [data-display] internal/ui use: Multi-step output where order matters — doctor results, sync stages, use: post-install steps. Each node anchors a phase, items inside report use: findings.──────────────────────────────────────────────────────────── Auth — 2 passed API token loaded from ~/.sageox/config Endpoint reachable api.sageox.ai Workspace — 1 warning Git repo detected Ledger out of date [--fix] run `ox sync` to refresh Done
────────────────────────────────────────────────────────────timeline [data-display] internal/ui use: Multi-step output where order matters — doctor results, sync stages, use: post-install steps. Each node anchors a phase, items inside report use: findings.──────────────────────────────────────────────────────────── Auth — 2 passed API token loaded from ~/.sageox/config Endpoint reachable api.sageox.ai Workspace — 1 warning Git repo detected Ledger out of date [--fix] run `ox sync` to refresh Done
Package
internal/ui
Exports
RenderTimeline · TimelineNode · TimelineItem
Since
0.5.0
Use when
Multi-step output where order matters — doctor results, sync stages, post-install steps. Each node anchors a phase, items inside report findings.
Avoid when
Single-line status (use `StyleSuccess` directly) or tabular history (use Columns). Timelines are vertical; horizontal scans want tables.

spinner

feedback
────────────────────────────────────────────────────────────spinner [feedback] internal/cli use: Wrap any operation expected to take > 300ms (network, git clone, daemon use: RPC). Auto-hides if the work completes faster, so fast paths don't use: flicker.──────────────────────────────────────────────────────────── Syncing ledger... Synced 12 sessions in 1.8s
────────────────────────────────────────────────────────────spinner [feedback] internal/cli use: Wrap any operation expected to take > 300ms (network, git clone, daemon use: RPC). Auto-hides if the work completes faster, so fast paths don't use: flicker.──────────────────────────────────────────────────────────── Syncing ledger... Synced 12 sessions in 1.8s
Package
internal/cli
Exports
WithSpinner · WithSpinnerNoResult
Since
0.3.0
Use when
Wrap any operation expected to take > 300ms (network, git clone, daemon RPC). Auto-hides if the work completes faster, so fast paths don't flicker.
Avoid when
Operations < 100ms — the spinner appears, blinks, vanishes, and adds noise without value. Also: anything in a non-TTY (the spinner falls back silently, which is correct).

status-bar

feedback
────────────────────────────────────────────────────────────status-bar [feedback] internal/dashboard/panes/statusbar use: Bottom row of full-screen TUIs. Left side carries persistent state use: (daemon health, open issues); right side carries the active hint ("? for use: help", "esc to cancel"). Transient toasts ("copied!") replace the right use: side for ~2s.──────────────────────────────────────────────────────────── daemon · 2 stale · ox 0.9.0 Tab pane · ? help · q quit
────────────────────────────────────────────────────────────status-bar [feedback] internal/dashboard/panes/statusbar use: Bottom row of full-screen TUIs. Left side carries persistent state use: (daemon health, open issues); right side carries the active hint ("? for use: help", "esc to cancel"). Transient toasts ("copied!") replace the right use: side for ~2s.──────────────────────────────────────────────────────────── daemon · 2 stale · ox 0.9.0 Tab pane · ? help · q quit
Package
internal/dashboard/panes/statusbar
Exports
Pane · View
Since
0.7.0
Use when
Bottom row of full-screen TUIs. Left side carries persistent state (daemon health, open issues); right side carries the active hint ("? for help", "esc to cancel"). Transient toasts ("copied!") replace the right side for ~2s.
Avoid when
Inline commands — the bar wants a fixed-position last row, which only full-screen bubbletea programs offer. Don't fake it.

confirm

input
────────────────────────────────────────────────────────────confirm [input] internal/cli use: Yes/no gates with a clear default. For destructive operations use use: ConfirmDangerousOperation — it requires typing the exact target name, use: not just pressing y.────────────────────────────────────────────────────────────? Continue with sync? [Y]/n
────────────────────────────────────────────────────────────confirm [input] internal/cli use: Yes/no gates with a clear default. For destructive operations use use: ConfirmDangerousOperation — it requires typing the exact target name, use: not just pressing y.────────────────────────────────────────────────────────────? Continue with sync? [Y]/n
Package
internal/cli
Exports
ConfirmYesNo · ConfirmDangerousOperation · ConfirmUninstall
Since
0.4.0
Use when
Yes/no gates with a clear default. For destructive operations use ConfirmDangerousOperation — it requires typing the exact target name, not just pressing y.
Avoid when
Selecting between equal options (use Select) or any flow where users will reflexively press enter — defaulting to dangerous is a footgun.

filter-tabs

input
────────────────────────────────────────────────────────────filter-tabs [input] internal/dashboard/panes/timeline use: A narrow numbered tab row at the top of a content pane — quick use: single-key switching between views of the same data (timeline filters, use: section selectors, log-level filters). Number keys 1–9 jump tabs; `/` use: opens an inline search line below.────────────────────────────────────────────────────────────[1]All [2]WIP [3]Blocked [4]Decisions [5]Reviews/ sync█
────────────────────────────────────────────────────────────filter-tabs [input] internal/dashboard/panes/timeline use: A narrow numbered tab row at the top of a content pane — quick use: single-key switching between views of the same data (timeline filters, use: section selectors, log-level filters). Number keys 1–9 jump tabs; `/` use: opens an inline search line below.────────────────────────────────────────────────────────────[1]All [2]WIP [3]Blocked [4]Decisions [5]Reviews/ sync█
Package
internal/dashboard/panes/timeline
Exports
renderFilterBar (private)
Since
0.7.0
Use when
A narrow numbered tab row at the top of a content pane — quick single-key switching between views of the same data (timeline filters, section selectors, log-level filters). Number keys 1–9 jump tabs; `/` opens an inline search line below.
Avoid when
More than ~6 tabs (the number-key shortcut breaks down). Selecting between entire screens — use the dashboard's section tabs instead.

multi-select

input
────────────────────────────────────────────────────────────multi-select [input] internal/cli use: Pick zero-or-more from a known set — `ox init` agent-hook installation, use: multi-team enablement, feature opt-ins. Renders as a checkbox group; use: space toggles, enter confirms.────────────────────────────────────────────────────────────Pick agent hooks to install[x] Claude Code session recording + prime hooks [x] Codex CLI session recording [ ] Gemini CLI session recording [x] Cursor rules + session import [ ] Aider session import ↑/↓ navigate · space toggle · enter confirm · esc cancel
────────────────────────────────────────────────────────────multi-select [input] internal/cli use: Pick zero-or-more from a known set — `ox init` agent-hook installation, use: multi-team enablement, feature opt-ins. Renders as a checkbox group; use: space toggles, enter confirms.────────────────────────────────────────────────────────────Pick agent hooks to install[x] Claude Code session recording + prime hooks [x] Codex CLI session recording [ ] Gemini CLI session recording [x] Cursor rules + session import [ ] Aider session import ↑/↓ navigate · space toggle · enter confirm · esc cancel
Package
internal/cli
Exports
SelectMany · MultiSelectOption
Since
0.4.0
Use when
Pick zero-or-more from a known set — `ox init` agent-hook installation, multi-team enablement, feature opt-ins. Renders as a checkbox group; space toggles, enter confirms.
Avoid when
Exactly-one selection (use Select for radio-style). Free text (use Prompt). Sets larger than ~15 items — paginate or filter.

prompt

input
────────────────────────────────────────────────────────────prompt [input] internal/cli use: Free-form text input with a default suggestion. Reads from stdin in use: non-TTY mode without changing the contract — so prompts compose with use: `echo X | ox foo` cleanly.────────────────────────────────────────────────────────────? Workspace name (my-project):
────────────────────────────────────────────────────────────prompt [input] internal/cli use: Free-form text input with a default suggestion. Reads from stdin in use: non-TTY mode without changing the contract — so prompts compose with use: `echo X | ox foo` cleanly.────────────────────────────────────────────────────────────? Workspace name (my-project):
Package
internal/cli
Exports
SelectOne
Since
0.3.0
Use when
Free-form text input with a default suggestion. Reads from stdin in non-TTY mode without changing the contract — so prompts compose with `echo X | ox foo` cleanly.
Avoid when
Sensitive input (no echo masking yet — file an issue) or structured data better served by flags.

select

input
────────────────────────────────────────────────────────────select [input] internal/cli use: Radio-button single-pick from a known set of options — `ox init` use: endpoint picker, team chooser, IDE selector. Arrow-key navigation in use: TTY; numbered-prompt fallback in pipes and CI. Generic SelectOneValue use: avoids index-juggling.────────────────────────────────────────────────────────────Pick a teamsageox-core primary team sageox-design UI + brand ox-test-harness CI fixtures ↑/↓ navigate · enter select · esc cancel
────────────────────────────────────────────────────────────select [input] internal/cli use: Radio-button single-pick from a known set of options — `ox init` use: endpoint picker, team chooser, IDE selector. Arrow-key navigation in use: TTY; numbered-prompt fallback in pipes and CI. Generic SelectOneValue use: avoids index-juggling.────────────────────────────────────────────────────────────Pick a teamsageox-core primary team sageox-design UI + brand ox-test-harness CI fixtures ↑/↓ navigate · enter select · esc cancel
Package
internal/cli
Exports
SelectOne · SelectOneValue · SelectMany
Since
0.4.0
Use when
Radio-button single-pick from a known set of options — `ox init` endpoint picker, team chooser, IDE selector. Arrow-key navigation in TTY; numbered-prompt fallback in pipes and CI. Generic SelectOneValue avoids index-juggling.
Avoid when
Multi-select (use multi-select / SelectMany — the checkbox cousin). Free-form text (use Prompt) or yes/no (use Confirm). Lists longer than ~20 items — paginate or filter at the caller level first.

box

layout
────────────────────────────────────────────────────────────box [layout] internal/ui use: Group a small payload (a tip, a callout, a summary) that benefits from a use: visible boundary. Variants color the border by intent use: (info/warn/error/success).────────────────────────────────────────────────────────────╭──────────────────────────────────────────────────────────────────╮ Heads up This is an Info box — used for callouts that aren't a problem, just worth a beat of attention. ╰──────────────────────────────────────────────────────────────────╯╭────────────────────────╮ Health check passed. ╰────────────────────────╯╭───────────────────────────────────────────────╮ 7 passed 1 warning - 2 skipped Run `ox doctor --fix` to clear the warning. ╰───────────────────────────────────────────────╯
────────────────────────────────────────────────────────────box [layout] internal/ui use: Group a small payload (a tip, a callout, a summary) that benefits from a use: visible boundary. Variants color the border by intent use: (info/warn/error/success).────────────────────────────────────────────────────────────╭──────────────────────────────────────────────────────────────────╮ Heads up This is an Info box — used for callouts that aren't a problem, just worth a beat of attention. ╰──────────────────────────────────────────────────────────────────╯╭────────────────────────╮ Health check passed. ╰────────────────────────╯╭───────────────────────────────────────────────╮ 7 passed 1 warning - 2 skipped Run `ox doctor --fix` to clear the warning. ╰───────────────────────────────────────────────╯
Package
internal/ui
Exports
RenderBox · RenderSummaryBox · BoxVariant
Since
0.4.0
Use when
Group a small payload (a tip, a callout, a summary) that benefits from a visible boundary. Variants color the border by intent (info/warn/error/success).
Avoid when
Wrapping long-form output — boxes around paragraphs add cost without information. For multi-step results use a Timeline instead.

columns

layout
────────────────────────────────────────────────────────────columns [layout] internal/cli use: Aligned tabular output where columns share semantic meaning across rows use: (session lists, team rosters, sync state). Widths auto-compute from use: content with min/max clamps.────────────────────────────────────────────────────────────REPO TEAM LEDGER AGE ox sageox-core synced 2m sageox-design sageox-design synced 5m ox-test-harness sageox-core stale 2h
────────────────────────────────────────────────────────────columns [layout] internal/cli use: Aligned tabular output where columns share semantic meaning across rows use: (session lists, team rosters, sync state). Widths auto-compute from use: content with min/max clamps.────────────────────────────────────────────────────────────REPO TEAM LEDGER AGE ox sageox-core synced 2m sageox-design sageox-design synced 5m ox-test-harness sageox-core stale 2h
Package
internal/cli
Exports
ColumnWidths · FormatRow
Since
0.4.0
Use when
Aligned tabular output where columns share semantic meaning across rows (session lists, team rosters, sync state). Widths auto-compute from content with min/max clamps.
Avoid when
Single-row key=value displays (use log-formatter) or content that can't survive truncation on narrow terminals — design column widths around 80 columns.

modal

layout
────────────────────────────────────────────────────────────modal [layout] internal/dashboard/overlays use: Floating dialogs inside a full-screen TUI: help (?), command palette use: (Ctrl+K), confirmation gates. Consumes all keys until dismissed. use: Backdrop dims the underlying surface so focus is obvious.────────────────────────────────────────────────────────────╭───────────────────────────────────────────────╮ ⌘ Command palette ───────────────────────────────────── > sync Sync ledger ox sync Sync all repos ox sync --all Open sync logs ox logs sync Pause auto-sync ox sync --pause ↑/↓ navigate · enter execute · esc close ╰───────────────────────────────────────────────╯
────────────────────────────────────────────────────────────modal [layout] internal/dashboard/overlays use: Floating dialogs inside a full-screen TUI: help (?), command palette use: (Ctrl+K), confirmation gates. Consumes all keys until dismissed. use: Backdrop dims the underlying surface so focus is obvious.────────────────────────────────────────────────────────────╭───────────────────────────────────────────────╮ ⌘ Command palette ───────────────────────────────────── > sync Sync ledger ox sync Sync all repos ox sync --all Open sync logs ox logs sync Pause auto-sync ox sync --pause ↑/↓ navigate · enter execute · esc close ╰───────────────────────────────────────────────╯
Package
internal/dashboard/overlays
Exports
Overlay · OverlayConfirm
Since
0.7.0
Use when
Floating dialogs inside a full-screen TUI: help (?), command palette (Ctrl+K), confirmation gates. Consumes all keys until dismissed. Backdrop dims the underlying surface so focus is obvious.
Avoid when
One-shot commands — no underlying TUI to overlay. Use a Box or ConfirmDangerousOperation prompt instead.

nav-tree

layout
────────────────────────────────────────────────────────────nav-tree [layout] internal/dashboard/panes/nav use: Left-rail navigation in full-screen TUIs — workspaces, teams, sessions, use: recent activity. Hierarchical with collapse/expand. Selected row gets a use: bold inverted highlight; section headers in secondary color.────────────────────────────────────────────────────────────WORKSPACES ox sageox-design ← here ox-test-harnessTEAMS sageox-core sageox-designRECENT session 4m ago session 18m ago
────────────────────────────────────────────────────────────nav-tree [layout] internal/dashboard/panes/nav use: Left-rail navigation in full-screen TUIs — workspaces, teams, sessions, use: recent activity. Hierarchical with collapse/expand. Selected row gets a use: bold inverted highlight; section headers in secondary color.────────────────────────────────────────────────────────────WORKSPACES ox sageox-design ← here ox-test-harnessTEAMS sageox-core sageox-designRECENT session 4m ago session 18m ago
Package
internal/dashboard/panes/nav
Exports
Pane · View
Since
0.7.0
Use when
Left-rail navigation in full-screen TUIs — workspaces, teams, sessions, recent activity. Hierarchical with collapse/expand. Selected row gets a bold inverted highlight; section headers in secondary color.
Avoid when
Flat lists fit better in Columns. Trees deeper than 3 levels become a navigation problem of their own — paginate or filter first.

pane

layout
────────────────────────────────────────────────────────────pane [layout] internal/dashboard/theme use: Full-screen TUIs that split work across regions (dashboard, config-tui). use: The focused pane gets a double border in brand primary; unfocused panes use: use a rounded border in dim. Tab swaps focus.────────────────────────────────────────────────────────────╔══════════════════════════╗ focused Nav · Timeline Focus moves on Tab ╚══════════════════════════╝ ╭──────────────────────────╮ unfocused Nav · Timeline Focus moves on Tab ╰──────────────────────────╯
────────────────────────────────────────────────────────────pane [layout] internal/dashboard/theme use: Full-screen TUIs that split work across regions (dashboard, config-tui). use: The focused pane gets a double border in brand primary; unfocused panes use: use a rounded border in dim. Tab swaps focus.────────────────────────────────────────────────────────────╔══════════════════════════╗ focused Nav · Timeline Focus moves on Tab ╚══════════════════════════╝ ╭──────────────────────────╮ unfocused Nav · Timeline Focus moves on Tab ╰──────────────────────────╯
Package
internal/dashboard/theme
Exports
PaneBorderFocused · PaneBorderUnfocused
Since
0.7.0
Use when
Full-screen TUIs that split work across regions (dashboard, config-tui). The focused pane gets a double border in brand primary; unfocused panes use a rounded border in dim. Tab swaps focus.
Avoid when
One-shot command output — a bordered region just steals vertical space. Use Box for static callouts instead.

wordmark

layout
────────────────────────────────────────────────────────────wordmark [layout] internal/ui use: Branded headers for commands that own a moment — `ox doctor`, `ox init` use: success, release-notes banners. Two-tone color (Sage/Ox) keys the use: wordmark to the brand palette.────────────────────────────────────────────────────────────▞▀▖ ▞▀▖ ▚▄ ▝▀▖▞▀▌▞▀▖▌ ▌▚▗▘▖ ▌▞▀▌▚▄▌▛▀ ▌ ▌▗▚ ▝▀ ▝▀▘▗▄▘▝▀▘▝▀ ▘ ▘ox 0.9.0
────────────────────────────────────────────────────────────wordmark [layout] internal/ui use: Branded headers for commands that own a moment — `ox doctor`, `ox init` use: success, release-notes banners. Two-tone color (Sage/Ox) keys the use: wordmark to the brand palette.────────────────────────────────────────────────────────────▞▀▖ ▞▀▖ ▚▄ ▝▀▖▞▀▌▞▀▖▌ ▌▚▗▘▖ ▌▞▀▌▚▄▌▛▀ ▌ ▌▗▚ ▝▀ ▝▀▘▗▄▘▝▀▘▝▀ ▘ ▘ox 0.9.0
Package
internal/ui
Exports
RenderWordmark · WriteWordmark
Since
0.4.0
Use when
Branded headers for commands that own a moment — `ox doctor`, `ox init` success, release-notes banners. Two-tone color (Sage/Ox) keys the wordmark to the brand palette.
Avoid when
Routine command output. The wordmark earns its vertical space only when the command is a destination, not a step in a pipeline.

config-screen

screen
────────────────────────────────────────────────────────────config-screen [screen] cmd/ox/config_tui.go use: The full `ox config` TUI surface: a rounded-bordered frame with an use: overlaid title, categorized settings list, cursor-driven selection, use: value column with source-precedence arrows, and a help footer. This is use: the canonical example of an interactive ox screen.────────────────────────────────────────────────────────────╭──────────────────────────────────────────────────────────────────────────╮ ox config scope: local (Tab to switch) ────────────────────────────────────────────────────────────────────── GENERAL default.endpoint api.sageox.ai ← user > auto-sync.interval 5m ← local pager less -R ← default PRIVACY murmur.visibility team ← user redaction.profile aggressive ← user AGENTS claude-code.hooks enabled ← local codex-cli.hooks disabled ← default ────────────────────────────────────────────────────────────────────── auto-sync.interval How often the daemon pulls upstream changes. Scopes: default 1m → local 5m user — global — ↑/↓ navigate · Enter edit · Tab switch scope · s save · esc quit ╰──────────────────────────────────────────────────────────────────────────╯
────────────────────────────────────────────────────────────config-screen [screen] cmd/ox/config_tui.go use: The full `ox config` TUI surface: a rounded-bordered frame with an use: overlaid title, categorized settings list, cursor-driven selection, use: value column with source-precedence arrows, and a help footer. This is use: the canonical example of an interactive ox screen.────────────────────────────────────────────────────────────╭──────────────────────────────────────────────────────────────────────────╮ ox config scope: local (Tab to switch) ────────────────────────────────────────────────────────────────────── GENERAL default.endpoint api.sageox.ai ← user > auto-sync.interval 5m ← local pager less -R ← default PRIVACY murmur.visibility team ← user redaction.profile aggressive ← user AGENTS claude-code.hooks enabled ← local codex-cli.hooks disabled ← default ────────────────────────────────────────────────────────────────────── auto-sync.interval How often the daemon pulls upstream changes. Scopes: default 1m → local 5m user — global — ↑/↓ navigate · Enter edit · Tab switch scope · s save · esc quit ╰──────────────────────────────────────────────────────────────────────────╯
Package
cmd/ox/config_tui.go
Exports
configModel
Since
0.6.0
Use when
The full `ox config` TUI surface: a rounded-bordered frame with an overlaid title, categorized settings list, cursor-driven selection, value column with source-precedence arrows, and a help footer. This is the canonical example of an interactive ox screen.
Avoid when
Inline commands — the frame and per-row source arrows assume a controlled full-screen surface. Don't fake the chrome in scrollable output.

dashboard-screen

screen
────────────────────────────────────────────────────────────dashboard-screen [screen] internal/dashboard/app use: Reference for any new full-screen bubbletea program in ox. Shows how Nav use: · Timeline · Inspector · StatusBar compose; how focused vs unfocused use: panes signal attention; how a Tab/section navigator anchors orientation.────────────────────────────────────────────────────────────╭──────────────────╮╔════════════════════════════════╗╭──────────────────╮ WORKSPACES [1]WIP [2]Blocked [3]Reviews ✦ Inspector ox ────────────────────────────── ──────────────── sageox-design now ryan: refactoring Murmur · ryan ox-test- uicatalog 4m ago harness docs/design/* registry.go refactoring TEAMS uicatalog sageox-core 5m ryan: started session sageox-design ox dev catalog --json files: docs/design/ RECENT 18m ajit: opened PR #612 registry.go 4m ago security review pipeline 18m ago ╚════════════════════════════════╝╰──────────────────╯╰──────────────────╯ daemon · 2 stale · ox 0.9.0 Tab pane · 1-3 filter · ? help · q quit
────────────────────────────────────────────────────────────dashboard-screen [screen] internal/dashboard/app use: Reference for any new full-screen bubbletea program in ox. Shows how Nav use: · Timeline · Inspector · StatusBar compose; how focused vs unfocused use: panes signal attention; how a Tab/section navigator anchors orientation.────────────────────────────────────────────────────────────╭──────────────────╮╔════════════════════════════════╗╭──────────────────╮ WORKSPACES [1]WIP [2]Blocked [3]Reviews ✦ Inspector ox ────────────────────────────── ──────────────── sageox-design now ryan: refactoring Murmur · ryan ox-test- uicatalog 4m ago harness docs/design/* registry.go refactoring TEAMS uicatalog sageox-core 5m ryan: started session sageox-design ox dev catalog --json files: docs/design/ RECENT 18m ajit: opened PR #612 registry.go 4m ago security review pipeline 18m ago ╚════════════════════════════════╝╰──────────────────╯╰──────────────────╯ daemon · 2 stale · ox 0.9.0 Tab pane · 1-3 filter · ? help · q quit
Package
internal/dashboard/app
Exports
Model
Since
0.7.0
Use when
Reference for any new full-screen bubbletea program in ox. Shows how Nav · Timeline · Inspector · StatusBar compose; how focused vs unfocused panes signal attention; how a Tab/section navigator anchors orientation.
Avoid when
Inline commands. The four-pane layout assumes 80×24 minimum and a controlled alternate screen — don't fake the chrome inline.

doctor-screen

screen
────────────────────────────────────────────────────────────doctor-screen [screen] cmd/ox/doctor.go use: The canonical "destination command" composition: branded wordmark + use: categorized check timeline + closing summary box. Reference this shape use: for any command the user runs to *resolve* something, not just describe use: it.────────────────────────────────────────────────────────────▞▀▖ ▞▀▖ ▚▄ ▝▀▖▞▀▌▞▀▖▌ ▌▚▗▘▖ ▌▞▀▌▚▄▌▛▀ ▌ ▌▗▚ ▝▀ ▝▀▘▗▄▘▝▀▘▝▀ ▘ ▘ox 0.9.0 Auth — 2 passed API token loaded from ~/.sageox/config Endpoint reachable sageox.ai Workspace — 1 warning Git repo detected Ledger stale [--fix] 2h32m since last sync Hooks — 3 passed claude-code SessionStart claude-code Stop claude-code PostCompact Done╭───────────────────────────────────────────────╮ 7 passed 1 warning Run `ox doctor --fix` to clear the warning. ╰───────────────────────────────────────────────╯
────────────────────────────────────────────────────────────doctor-screen [screen] cmd/ox/doctor.go use: The canonical "destination command" composition: branded wordmark + use: categorized check timeline + closing summary box. Reference this shape use: for any command the user runs to *resolve* something, not just describe use: it.────────────────────────────────────────────────────────────▞▀▖ ▞▀▖ ▚▄ ▝▀▖▞▀▌▞▀▖▌ ▌▚▗▘▖ ▌▞▀▌▚▄▌▛▀ ▌ ▌▗▚ ▝▀ ▝▀▘▗▄▘▝▀▘▝▀ ▘ ▘ox 0.9.0 Auth — 2 passed API token loaded from ~/.sageox/config Endpoint reachable sageox.ai Workspace — 1 warning Git repo detected Ledger stale [--fix] 2h32m since last sync Hooks — 3 passed claude-code SessionStart claude-code Stop claude-code PostCompact Done╭───────────────────────────────────────────────╮ 7 passed 1 warning Run `ox doctor --fix` to clear the warning. ╰───────────────────────────────────────────────╯
Package
cmd/ox/doctor.go
Exports
renderDoctorHeader · ui.RenderTimeline · ui.RenderSummaryBox
Since
0.5.0
Use when
The canonical "destination command" composition: branded wordmark + categorized check timeline + closing summary box. Reference this shape for any command the user runs to *resolve* something, not just describe it.
Avoid when
Pipeline commands — the wordmark earns its vertical space only when the command is a destination. Don't print it from automation paths.

login-screen

screen
────────────────────────────────────────────────────────────login-screen [screen] cmd/ox/login.go use: The smallest possible full-screen bubbletea program in ox: one spinner, use: one message line, one Ctrl+C handler. Use this as the reference for any use: "wait for external thing" screen (OAuth callback, daemon handshake).────────────────────────────────────────────────────────────╭─────────────────────────────────────────────────╮ Opening sageox.ai/cli/auth in your browser... Local listener on 127.0.0.1:7392 ╰─────────────────────────────────────────────────╯ Waiting for authorization... press Ctrl+C to cancel─── after browser callback ───╭──────────────────────────────────────────────────╮ Authenticated as ryan+ox@sageox.ai Endpoint: sageox.ai Tip: run `ox init` in a repo to get started. ╰──────────────────────────────────────────────────╯
────────────────────────────────────────────────────────────login-screen [screen] cmd/ox/login.go use: The smallest possible full-screen bubbletea program in ox: one spinner, use: one message line, one Ctrl+C handler. Use this as the reference for any use: "wait for external thing" screen (OAuth callback, daemon handshake).────────────────────────────────────────────────────────────╭─────────────────────────────────────────────────╮ Opening sageox.ai/cli/auth in your browser... Local listener on 127.0.0.1:7392 ╰─────────────────────────────────────────────────╯ Waiting for authorization... press Ctrl+C to cancel─── after browser callback ───╭──────────────────────────────────────────────────╮ Authenticated as ryan+ox@sageox.ai Endpoint: sageox.ai Tip: run `ox init` in a repo to get started. ╰──────────────────────────────────────────────────╯
Package
cmd/ox/login.go
Exports
loginSpinnerModel
Since
0.3.0
Use when
The smallest possible full-screen bubbletea program in ox: one spinner, one message line, one Ctrl+C handler. Use this as the reference for any "wait for external thing" screen (OAuth callback, daemon handshake).
Avoid when
Foreground operations whose duration is bounded and predictable — use the inline Spinner component instead. The full-screen treatment is reserved for genuinely open-ended waits where Ctrl+C is the user's only out.

session-list-screen

screen
────────────────────────────────────────────────────────────session-list-screen [screen] cmd/ox/session_list.go use: List view with session-specific badges — hydration state, duration use: coloring, type indicator. Reference for any per-row list where each row use: has a status that the user might filter or sort by.────────────────────────────────────────────────────────────ox session list --workspace=oxSESSION STARTED DURATION TURNS STATE AGENT──────────────────────────────────────────────────────────────────────────────oxsid_01JE...A7QX 4m ago 0:18 12 ● live claude-codeoxsid_01JE...8MNP 28m ago 1:04 47 ✓ hydrated claude-codeoxsid_01JE...3KZF 2h ago 0:42 23 ⟳ stub codexoxsid_01JE...7VRC yesterday 2:18 93 ✓ hydrated claude-codeoxsid_01JE...2WMD yesterday 4:31 181 ✓ hydrated cursor5 sessions · 1 live · 3 hydrated · 1 stub · run `ox session view <id>`
────────────────────────────────────────────────────────────session-list-screen [screen] cmd/ox/session_list.go use: List view with session-specific badges — hydration state, duration use: coloring, type indicator. Reference for any per-row list where each row use: has a status that the user might filter or sort by.────────────────────────────────────────────────────────────ox session list --workspace=oxSESSION STARTED DURATION TURNS STATE AGENT──────────────────────────────────────────────────────────────────────────────oxsid_01JE...A7QX 4m ago 0:18 12 ● live claude-codeoxsid_01JE...8MNP 28m ago 1:04 47 ✓ hydrated claude-codeoxsid_01JE...3KZF 2h ago 0:42 23 ⟳ stub codexoxsid_01JE...7VRC yesterday 2:18 93 ✓ hydrated claude-codeoxsid_01JE...2WMD yesterday 4:31 181 ✓ hydrated cursor5 sessions · 1 live · 3 hydrated · 1 stub · run `ox session view <id>`
Package
cmd/ox/session_list.go
Exports
runSessionList
Since
0.5.0
Use when
List view with session-specific badges — hydration state, duration coloring, type indicator. Reference for any per-row list where each row has a status that the user might filter or sort by.
Avoid when
Generic tabular data — use Columns. Multi-line per-row content — use Timeline with one Node per row.

status-screen

screen
────────────────────────────────────────────────────────────status-screen [screen] cmd/ox/status.go use: Tufte-minimal section-table pattern used by `ox status`, `ox teams`, `ox use: murmur status`. Bold-secondary section header, dim left-column labels, use: semantic-colored values, no decorative borders. Reach for this shape any use: time you have grouped key/value facts to display.────────────────────────────────────────────────────────────ox status workspace: oxWORKSPACE path ~/Code/sageox/ox endpoint sageox.ai team sageox-coreLEDGER status ✓ synced last sync 2m ago entries 1,284 size 48 MBDAEMON status ● running uptime 3h 21m queue 2 stale reposACTIVITY (last 4h) ▁▆▂▂▂▃▃▅▁▁▅▂|▂▅▅▂▅▃▅▂▅▅▂▁|▁▆▁▁▂▂▁▃▁▂▆▃|▂▅▂▂▂▅▂█▃▂▃▃ 4h ago 2h now
────────────────────────────────────────────────────────────status-screen [screen] cmd/ox/status.go use: Tufte-minimal section-table pattern used by `ox status`, `ox teams`, `ox use: murmur status`. Bold-secondary section header, dim left-column labels, use: semantic-colored values, no decorative borders. Reach for this shape any use: time you have grouped key/value facts to display.────────────────────────────────────────────────────────────ox status workspace: oxWORKSPACE path ~/Code/sageox/ox endpoint sageox.ai team sageox-coreLEDGER status ✓ synced last sync 2m ago entries 1,284 size 48 MBDAEMON status ● running uptime 3h 21m queue 2 stale reposACTIVITY (last 4h) ▁▆▂▂▂▃▃▅▁▁▅▂|▂▅▅▂▅▃▅▂▅▅▂▁|▁▆▁▁▂▂▁▃▁▂▆▃|▂▅▂▂▂▅▂█▃▂▃▃ 4h ago 2h now
Package
cmd/ox/status.go
Exports
renderTable
Since
0.4.0
Use when
Tufte-minimal section-table pattern used by `ox status`, `ox teams`, `ox murmur status`. Bold-secondary section header, dim left-column labels, semantic-colored values, no decorative borders. Reach for this shape any time you have grouped key/value facts to display.
Avoid when
Truly tabular data with > 3 columns — use Columns. Long-form or hierarchical state — use Timeline.

sparkline

viz
────────────────────────────────────────────────────────────sparkline [viz] internal/tui use: Compact activity-over-time visualization in a single line. Default use: window is 4 hours bucketed into 5-minute slots — perfect for use: session-cadence and sync-frequency views.────────────────────────────────────────────────────────────▁▂▁█▁▃▁▅▂▁▆▁|▂▁▂▂▃▁▃▁▂▁▂▂|▅▅▃▁▂▃▁▁▂▁▃▃|▅▃▃▂▂▃▃▁▂▃▂▂4h ago 2h now
────────────────────────────────────────────────────────────sparkline [viz] internal/tui use: Compact activity-over-time visualization in a single line. Default use: window is 4 hours bucketed into 5-minute slots — perfect for use: session-cadence and sync-frequency views.────────────────────────────────────────────────────────────▁▂▁█▁▃▁▅▂▁▆▁|▂▁▂▂▃▁▃▁▂▁▂▂|▅▅▃▁▂▃▁▁▂▁▃▃|▅▃▃▂▂▃▃▁▂▃▂▂4h ago 2h now
Package
internal/tui
Exports
RenderSparkline · RenderSparklineTimeMarkers
Since
0.6.0
Use when
Compact activity-over-time visualization in a single line. Default window is 4 hours bucketed into 5-minute slots — perfect for session-cadence and sync-frequency views.
Avoid when
Precise numerical readouts (use a table) or windows longer than a few hours where 5-minute buckets blur the signal.