rollo is a Rust TUI for exploring large JSONL/JSON-array datasets, optimized for reading LLM rollouts.
git clone https://github.com/nickslevine/rollo.git
cd rollo
cargo install --path .rollo --help
rollo ./data.jsonl
rollo ./data.json
rollo -
rollo --tail ./data.jsonlSupported inputs:
- Local JSONL files (one JSON object per non-empty line)
- Local JSON array files (top-level array of objects)
- Compressed inputs:
.gz,.zst -for stdin
rollo has two views: a table view for browsing a file at a high level, and a detail view for inspecting individual rows.
In the table view, rollo supports filtering columns by string matches or numeric comparisons.
In the detail view, you can customize what fields are visible as panes, and which as headers. This makes it useful for paging through LLM rollouts while keeping fields visible above model outputs.
Global:
q: quit?: toggle help hotkey overlay modal
Help modal:
- Content is organized into sections:
GLOBAL,TABLE VIEW,DETAIL VIEW,MODAL SURFACES. j/k,Up/Down: scroll help contentEscor?: close help modal
Table view:
Up/Down,j/k,Ctrl-n/Ctrl-p: move selected rowCtrl-f/Ctrl-b: page down/up by one screen of visible rowsLeft/Right,h/l: move selected column (wraparound)Enter: open detail view for selected rowg: open go-to-row modalr: jump to a random visible row/: open filter modal for selected columnEsc(in filter modal): close filter modalx: clear all active filters across all columns- Selected column headers are marked with a leading
›. - Multiple column filters can be active at once; matching is AND across all active filter clauses.
- Filter modal has three editable rows per selected column:
contains(text)gt(numeric)lt(numeric)
- In filter modal:
Up/Downcycles betweencontains/gt/ltLeft/Rightmoves the input cursor within the selected row, and typed characters insert at the cursor- selected input rows render a visible
|cursor marker - input text persists in each row;
Enterapplies current state - filter mode is mutually exclusive per column: either
containsOR (gt/lt) - while
containshas text,gt/ltinputs are locked untilcontainsis cleared containssupports parenthesized boolean queries with nestedAND/OR, case-insensitive operators, and optional quoted terms (example:((how) AND (do) OR (\"america first\")))AND/ORtokens incontainsinput are highlighted in orange for readability- malformed
containsor invalid numeric apply attempts show inline errors and block filtering for that selected column until corrected gt/ltaccept only digits plus-and.- bottom-of-modal help shows per-field examples and reminds that text terms must be wrapped in parentheses
- After filter changes, selection jumps to the first visible filtered row if current selection is hidden.
- If filters produce no visible rows, table view has no selected row until rows become visible again.
- Status bar shows filtered visibility as
shown:<visible>/<total>whenever one or more filters are active. - When any column filter is active, a sticky filter-summary row appears below headers with a yellow
filterlabel at left and active filter values under their columns. - Visible columns stay in place while moving selection; the viewport shifts only when selection moves off-screen.
- Vertical table windowing keeps the selected row near the middle of the visible rows during scrolling, then clamps naturally near file start/end.
- Row numbers are displayed zero-indexed.
Detail view:
Esc: return to table viewf: open field manager modalg: open go-to-row modalr: jump to a random visible rowLeft/Right,h/l: select across panes and headers (headers are to the left of pane 0)Up/Down,j/k: previous/next rowShift-Up/Shift-Down,Shift-j/Shift-k: scroll active paneShift-Left/Shift-Right,Shift-h/Shift-l: reorder selected pane or selected header within its own list (with wraparound)m: toggle active pane render mode (rich/raw)c: copy visible row fields to clipboard as JSON (headers + panes only)u: convert selected pane to header, or selected header to panex: close selected header or pane- When one or more table column filters are active, detail headers/panes for those filtered fields highlight matching text in orange + bold.
- Pane scrolling is clamped to visible wrapped content length so non-empty fields never render as empty panes due to overscroll (including narrow-terminal soft-wrap cases).
Field manager modal (f):
- Compact centered overlay with discovered fields and role badges (
HEADER,PANE,HIDDEN) Up/Down,j/k: move highlighted fieldp: set highlighted field to pane (append to right end)h: set highlighted field to header (append to end)x: hide highlighted field- Changes apply immediately;
Esccloses the modal
Go-to-row modal:
- Digits only input (
0-9). - Input is zero-indexed (
0is the first row). Enter: jump to requested row in current view context:- table view stays in table and jumps selected table row
- detail view stays in detail and jumps selected detail row
Esc: close modal- Out-of-range rows stay in modal and show an inline error.

