Skip to content

VisiData

VisiData (“a terminal interface for exploring and arranging tabular data”) is the maximalist member of this cluster: where csvlens views one CSV and sc-im edits one sheet, VisiData treats every tabular thing — a CSV, a directory, a SQLite database, the list of open sheets itself — as a Sheet, and lets you drill, transform, pivot, and aggregate across a stack of sheets. It’s mature (v3.x, ~9k stars, years of development) and its design vocabulary — typed columns, the sheet stack, metasheets, a command palette — is the richest in the cluster. It’s Python/curses, so not portable, but as an idea inventory for tabular interaction it’s the deepest well here.

  • Typed columns with single-character type indicators. Every VisiData column carries a type, shown by a one-character marker, and set by a one-key command: # int (Shift+I), % float (Shift+Z / %), $ currency ($), @ date (@), ~ string (~/Shift+~), plus length/derived types. The marker sits in the column header so the type is visible at a glance without reading values. This is a strong, monochrome-friendly idea for KN-86: a roster/stat table can flag each column’s kind with a single glyph in the header row — no color, no legend, just a character. Pairs with the big-glyph-identity-object pattern from Batch 1 (golazo).
  • The sheet-stack navigation model. Sheets push and pop like a call stack: open a new view (drill into a cell, build a frequency table, open the columns metasheet) and it pushes onto the stack; q pops back. Shift+S shows the sheets stack itself as a sheet you can navigate. This drill-down-and-return idiom is exactly KN-86’s drill-into / BACK model (the drill-into FFI primitive + the BACK key on the Ferris Sweep left half per CLAUDE.md). VisiData is the most rigorous reference for nav-stack semantics in the whole inspiration set — every drill is a push, every BACK is a pop, and the stack is itself inspectable. Validates the emulator’s test_nav_stack design.
  • Metasheets — the app’s own state as navigable tables. VisiData renders its columns, its open sheets, its command history as ordinary sheets you can sort/filter/edit. “The system’s own state is just another table” is a deep, very-Lisp idea (homoiconicity for UIs). For KN-86: the deck’s own state (cartridge history bitfield, mission board, reputation ledger per Universal Deck State) could be browsable with the same table cart that browses cart data — one viewer, pointed at deck internals.
  • The command palette (Space → longname). Beyond keybindings, VisiData exposes every command by a searchable long name, reachable via Space then typing — a discoverability layer over a huge command surface. KN-86’s key budget is tiny (34 keys), so a searchable command surface invoked from TERM/REPL is the right way to expose more verbs than there are keys. Maps onto the REPL + token-prediction (ADR-0009) plan.
  • The transformation pipeline. Frequency tables (Shift+F), aggregations, melting/pivoting, derived columns — each transformation produces a new sheet on the stack, so a chain of transforms is a chain of stacked sheets you can step back through. The “every transform is an undoable, inspectable step” model is the right mental model for any KN-86 cart that processes data in stages (a mission generator’s seed→template→instance chain, for example).

VisiData does use color (type-tinting, selected rows, error cells), but almost none of its load-relevant structure depends on it — its information architecture is carried by character and position, which is why it adapts cleanly:

  • Type indicators are already single characters (# $ % @ ~), not colors. This is the standout monochrome win: VisiData independently arrived at “encode column type as a glyph in the header,” which is exactly the KN-86 move. Lift directly into the KN-86 Code Page.
  • Selected rows → inversion. VisiData’s selection (color-highlighted by default) becomes inverted amber-on-black. The selection count shows as a text token in the status line (12 selected), not a colored badge.
  • The sheet stack → a breadcrumb / depth indicator. VisiData’s stack is conceptual; on KN-86 render the current depth as a Row-0 breadcrumb (deck ▸ roster ▸ filter) or a depth counter — position and text, no color.
  • Status line → Row 0 / Row 24 split. VisiData’s left status (sheet name, cursor) and right status (row counts, progress) map onto KN-86’s Row 0 (status) and Row 24 (action) — already monochrome by design.
  • What genuinely relies on color: error-cell tinting and the default selected-row hue. Both reframe to inversion or a marker glyph ( for an error cell, for a selected row) with no loss of meaning.

The deepest single-color lesson from VisiData: a tabular tool this rich can carry its entire information model on glyph + position + inversion — color is decoration, not structure. That’s the proof case for monochrome KN-86 data carts.

VisiData is built on the homoiconic idea KN-86’s Lisp paradigm wants: the system’s own state (columns, sheets, history) is data of the same kind the user manipulates, browsable with the same tools. On KN-86’s Fe VM this is natural — deck state is Lisp data, a table cart over it is a Lisp program, and “browse the deck’s mission board with the same cart that browses cart data” falls out for free. VisiData also exposes Python expressions for derived columns (= to add a column computed by an expression); the KN-86 analog is a derived column defined by a Lisp lambda over the row — the same idea as csvlens’s example-cell filters and sc-im’s @lua cells, generalized to “any column can be a Lisp expression over its siblings.” VisiData is the reference for how far that goes: an entire data-exploration workflow built out of small expressions over tables.

  • Batch 8. The cluster’s idea-inventory maximalist — read for the typed-column-indicator vocabulary and the sheet-stack rigor, not for portable code (it’s Python/curses).
  • Type-indicator glyphs (# $ % @ ~) and the sheet-stack-as-push/pop are the two most-borrowable ideas, and both are monochrome-native.
  • Cross-link csvlens.md — the minimal viewer at the opposite end of the same lineage; VisiData is csvlens + a transformation pipeline + a sheet stack.
  • Cross-link sc-im.md — the editing-focused sibling; VisiData is exploration-focused.
  • Cross-link the nav-stack model — VisiData’s drill-into→push / q→pop is the conceptual reference behind the emulator’s test_nav_stack and the BACK-key semantics.
  • Cross-link logradar.md — VisiData’s frequency tables are the tabular cousin of logradar’s pattern-clustering + sparklines; both turn a stream into a digestible summary.