Skip to content

nickslevine/rollo

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

62 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

rollo

rollo is a Rust TUI for exploring large JSONL/JSON-array datasets, optimized for reading LLM rollouts.

Installation

git clone https://github.com/nickslevine/rollo.git
cd rollo
cargo install --path .

Usage

rollo --help
rollo ./data.jsonl
rollo ./data.json
rollo -
rollo --tail ./data.jsonl

Supported 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.

Table view

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.

Detail view

Keybindings

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 content
  • Esc or ?: close help modal

Table view:

  • Up/Down, j/k, Ctrl-n/Ctrl-p: move selected row
  • Ctrl-f/Ctrl-b: page down/up by one screen of visible rows
  • Left/Right, h/l: move selected column (wraparound)
  • Enter: open detail view for selected row
  • g: open go-to-row modal
  • r: jump to a random visible row
  • /: open filter modal for selected column
  • Esc (in filter modal): close filter modal
  • x: 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/Down cycles between contains/gt/lt
    • Left/Right moves 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; Enter applies current state
    • filter mode is mutually exclusive per column: either contains OR (gt/lt)
    • while contains has text, gt/lt inputs are locked until contains is cleared
    • contains supports parenthesized boolean queries with nested AND/OR, case-insensitive operators, and optional quoted terms (example: ((how) AND (do) OR (\"america first\")))
    • AND/OR tokens in contains input are highlighted in orange for readability
    • malformed contains or invalid numeric apply attempts show inline errors and block filtering for that selected column until corrected
    • gt/lt accept 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 filter label 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 view
  • f: open field manager modal
  • g: open go-to-row modal
  • r: jump to a random visible row
  • Left/Right, h/l: select across panes and headers (headers are to the left of pane 0)
  • Up/Down, j/k: previous/next row
  • Shift-Up/Shift-Down, Shift-j/Shift-k: scroll active pane
  • Shift-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 pane
  • x: 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 field
  • p: 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; Esc closes the modal

Go-to-row modal:

  • Digits only input (0-9).
  • Input is zero-indexed (0 is 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.

About

rollo is a TUI for exploring JSONL files optimized for LLM rollouts

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors