A terminal pager for parquet and JSONL. Think less, but it understands nested schemas.
dsless data.parquet── Row 0 ──
│ id: "abc-123"
│ source:
│ │ title: ["My Page Title"]
│ │ keywords: []
│ │ rank: 4
│ axes: (3 items)
│ │ axis │ keywords
│ │ ───────────┼─────────────────
│ │ "price" │ ["cheap", "sale"]
│ │ "brand" │ ["acme"]
│ │ "category" │ ["tools", "diy"]
Nested structs render as indented trees. Arrays of structs become tables. Long strings and deep nesting stay readable.
curl -fsSL https://raw.githubusercontent.com/eiennohito/dsless/main/install.sh | shmacOS (universal), Linux x86_64, Linux aarch64. Installs to ~/.local/bin.
Or from source (Rust 1.85+): cargo install --path .
dsless file.parquet # TUI mode
dsless parquet-dir/ # reads all files in directory
dsless file.jsonl # JSONL/NDJSON
dsless file.parquet | head # pipe mode — plain text, no TUI
dsless -n 50 file.parquet # limit rows (pipe default: 1000)Format is detected from file content, not extension.
Vim-style. j/k (or arrows) move the cursor, J/K page, h/l (or arrows) select columns, g/G jump between records, q quits.
Scrolling: Ctrl-j/Ctrl-k scroll the viewport without moving the cursor. Ctrl-d/Ctrl-u for half-page.
Search: / to search, n/N for next/prev match. Searches across parquet columns directly, then highlights matching lines.
Preview: v shows an overlay of truncated fields — type the label to expand. V repeats last preview on a new record. Space previews the field under the cursor. j/k scroll inside a preview, v/Space/Esc dismiss.
Copy: Y copies to clipboard via OSC 52 — the current record (re-rendered at 100 columns), the selected cell's full value, or the preview content, depending on context. Requires a terminal that supports OSC 52 (most modern terminals; tmux needs set -g set-clipboard on).
? for the full keymap inside the TUI.
Most code is AI-generated. If that bothers you, now you know.