Skip to content

Studio Overview

The Studio is fcheap's terminal user interface (TUI) for browsing and managing stashes interactively.

Launching

bash
fcheap studio

The Studio requires an interactive terminal. It checks term.IsTerminal() on both stdin and stdout before launching. If run in a non-interactive context (piped input/output), it exits with an error message suggesting CLI commands instead.

Views

List

The default view: a themed table of stashes (ID, tool, file count, size, relative age) with colored chips — zst/gz for compressed stashes and a ⚠ secrets chip when a stash contains likely credentials. Newest first. j/k to move, Enter to open detail.

Detail

A grouped, color-coded provenance pane with IDENTITY (id, name), PROVENANCE (source, tool, created with relative + absolute time, bundle), CONTENT (files, size, hash, tags, secrets warning), and STORAGE (compression with the space-saved ratio, and indexed status). A scrollable file tree sits beside a live preview of the selected file's content (Tab cycles focus). Compressed stashes show a "restore to view" placeholder.

Press / to focus a working query input, type, and Enter to run a per-file search across all indexed stashes. Results show stash › file with a relevance-colored score (green → cyan → dim), and the preview pane shows the hit. Tab cycles query ↔ results ↔ preview. Press m (from the results/preview pane) to cycle the search modeautokeywordsemantichybrid — and re-run; the query panel shows the requested mode and the results panel shows the mode actually used (semantic/hybrid require a configured embedder).

Timeline (vidtrace bundles)

Press t on a vidtrace bundle to see its evidence timeline — each entry's timestamp, frame, OCR text, and transcript — in a scrollable, colored panel.

Diff

Press x to diff a stash against a directory. The prompt is pre-filled with the stash's source path (just press Enter), or type any path. Results are colored: green + (only in stash), red - (only in target), yellow ~ (changed), plus an unchanged count — comparison is by content hash.

Status & Help

s shows index health at a glance: stash directory, count, total size, how many stashes are indexed/compressed, whether the SQLite metadata index and veclite search index exist, and vecgrep availability. ? shows the keybinding reference.

Keybindings

KeyAction
j / k (/)Move cursor / scroll
Enter / lOpen detail
Esc / hBack
TabCycle pane focus
/Search
rRestore to a temp dir (with hash verification)
cCompress (zstd)
aAnalyze / index for search
xDiff against a directory
tvidtrace timeline (bundles only)
dDrop (with y/n confirm) — from the list or the files pane
fFilter the list live by name / tool / tag (enter keeps it, esc clears)
o / OCycle the list sort (age / name / tool / files / size) / reverse direction (list view)
sStatus
gRefresh list (list view)
?Help
qQuit · Ctrl+C force quit

Enter/l (open) and g (refresh) apply in the list view. In a focused preview pane, j/k scroll a line, and d/u, PgDn/PgUp, and Ctrl+D/Ctrl+U half-page — there, d pages down rather than dropping (drop a stash from the list or the files pane).

Async operations (loading, search, restore, drop, compress) show an animated spinner while in flight. Indexing (a) streams per-file progress into an animated progress bar (indexing 42/805). Destructive d requires a y/n confirm in the footer.

Tech Stack

  • Bubbletea v2 -- TUI framework (charm.land/bubbletea/v2)
  • Lipgloss v2 -- styling (charm.land/lipgloss/v2)
  • Bubbles v2 -- textinput, viewport, spinner, progress (charm.land/bubbles/v2)

Layout is responsive: side-by-side panels at ≥96 columns, stacked below. Panels expand to fill the full terminal height, with the footer pinned to the bottom.

Released under the MIT License.