Keyboard-first terminal UI for exploring Parquet, CSV, JSON, JSONL, and NDJSON files with DuckDB-backed preview and profiling.
parqview is for fast inspection of parquet, csv, json, jsonl, and ndjson files.
Key features:
- select a set of columns and toggle visibility
- copy the selected columns as Python list literal
- copy the active cell value from the data pane
- search column names
- summaries of column data
- fast vim-inspired keyboard navigation and scrolling
- predicate filtering
- visual indication of missing data in rows and columns, jump to next missing value
- missing definition can toggle between NULL+NaN, NULL, NaN
- adaptive column width controls with an expanded reader for long text columns
- resize panels with the mouse
- fast mouse scrolling
Use it to quickly catch:
- unexpected feature values
- unexpected NULLs or NaNs
- join failures (duplicate columns, mismatched keys, broken join coverage),
The aim is to provide smooth, low-friction, interactive data browsing with familiar and intuitive keyboard navigation.
brew install robince/tap/parqviewDownload the archive for your platform from
https://github.com/robince/parqview/releases.
macOS arm64 example:
VERSION="1.3.0"
curl -fL -o parqview.tar.gz "https://github.com/robince/parqview/releases/download/v${VERSION}/parqview_${VERSION}_darwin_arm64.tar.gz"
tar -xzf parqview.tar.gz
./parqview --versionLinux amd64 example:
VERSION="1.3.0"
curl -fL -o parqview.tar.gz "https://github.com/robince/parqview/releases/download/v${VERSION}/parqview_${VERSION}_linux_amd64.tar.gz"
tar -xzf parqview.tar.gz
./parqview --versionNote for direct macOS downloads: if Gatekeeper blocks first run, remove quarantine:
xattr -dr com.apple.quarantine ./parqviewOpen a file directly:
./parqview <file.parquet|file.csv|file.json|file.jsonl|file.ndjson>Start with a specific row displayed:
./parqview +250 <file.parquet|file.csv|file.json|file.jsonl|file.ndjson>Or run from source:
go run ./cmd/parqview <file.parquet|file.csv|file.json|file.jsonl|file.ndjson>The +row argument can appear before or after the file path. Row numbers are 1-based and refer to the file's displayed row numbers, even when filters are active.
If the app starts without a file, press Ctrl+O to open the file picker.
JSON support uses DuckDB's default auto-detection readers:
.jsonusesread_json_auto.jsonland.ndjsonuseread_ndjson_auto- nested
LISTandSTRUCTvalues are preserved as DuckDB returns them
Shortcuts below describe app-specific behavior. When a search input is focused, normal text editing keys are handled by the Charmbracelet Bubbles textinput component.
These keys are global commands that work whichever pane has focus.
| Key | Action |
|---|---|
Tab |
Switch focus between table and columns panes |
Ctrl+O |
Open/close file picker (.parquet/.csv/.json/.jsonl/.ndjson) |
q, Ctrl+C |
Quit |
Ctrl+L |
Redraw screen |
? |
Open/close help overlay |
m |
Cycle missing mode (NULL+NaN → NULL only → NaN only) |
s, S |
Toggle selected-columns view in data table |
v, V |
Toggle selected-columns view in columns pane (columns focus) |
Enter |
Open detail panel for active column |
Space |
Page down in focused pane |
Use this pane to search, triage, and build a selection set of columns.
| Key | Action |
|---|---|
/ |
Focus column search input |
Up, k |
Move cursor up 1 row |
Down, j |
Move cursor down 1 row |
Space, Ctrl+F |
Page down |
Ctrl+B |
Page up |
Ctrl+D |
Half-page down |
Ctrl+U |
Half-page up |
g, Home |
Jump to top of full list |
G, End |
Jump to bottom of full list |
H |
Jump to top of current visible list window |
M |
Jump to middle of current visible list window |
L |
Jump to bottom of current visible list window |
x |
Toggle selection on active (crosshair) column |
a |
Add all filtered columns to selection |
d |
Remove all filtered columns from selection |
A |
Select all columns |
X |
Clear all selected columns |
y |
Copy selected columns as a Python list, or active column name if none selected |
Enter |
Open detail panel for active column |
Use this pane to inspect row values, navigate missingness, and filter the current result set.
| Key | Action |
|---|---|
Up, k |
Move row cursor up |
Down, j |
Move row cursor down |
Left, h |
Move selected column left |
Right, l |
Move selected column right |
0 |
Jump to first visible table column |
$ |
Jump to last visible table column |
[ |
Page table columns left |
] |
Page table columns right |
w |
Toggle fit-width for ordinary values, or open the expanded reader when the visible column sample is too wide/multiline |
Ctrl+W |
Toggle global wide-columns mode |
gg |
Jump to top row |
G |
Jump to bottom row |
[count]gg, [count]G |
Jump to row number count |
Space, Ctrl+F |
Page down |
Ctrl+B |
Page up |
Ctrl+D |
Half-page down |
Ctrl+U |
Half-page up |
y |
Copy active cell value |
= |
Open predicate prompt for selected column |
p |
Pin current cell value as an exact-match predicate |
- |
Clear predicate for selected column |
U |
Clear all predicates |
r |
Jump to next missing value in current row |
R |
Jump to previous missing value in current row |
c |
Jump to next row with missing value in selected column |
C |
Jump to previous row with missing value in selected column |
f |
Toggle missing-row filter |
Enter |
Open detail panel for selected column |
Predicate prompt examples:
- string columns:
abc123,!= abc123 - numeric columns:
42,!= 42,> 10,>= 10,< 10,<= 10,10..20
Predicate notes:
=opens the prompt prefilled with the current predicate for that column, or the active cell value when no predicate exists yet.papplies an exact-match predicate from the active cell without opening the prompt.- Comparisons (
>,>=,<,<=,a..b) require a numeric column. - Multiple column predicates combine with
AND. - Reapplying a predicate on a column replaces the previous predicate for that column.
- Row jumps still use overall displayed row numbers; if that exact row is filtered out, parqview jumps to the next visible row and tells you which row it landed on.
| Key | Action |
|---|---|
Esc |
Clear query and exit search |
Enter |
Commit query and exit search |
Ctrl+U |
Clear search query |
| Text editing keys | Edit search query |
| Key | Action |
|---|---|
t |
Cycle tabs (Top Values, Stats, Histogram) |
n |
Jump to first missing value for detail column |
Esc, q |
Close detail panel |
Use this overlay for long text cells, JSON payloads, and other values that do not fit comfortably in the table.
| Key | Action |
|---|---|
Up, k |
Scroll up |
Down, j |
Scroll down |
Left, h |
Pan left when wrap is off |
Right, l |
Pan right when wrap is off |
n, p |
Move to next/previous row in the same column |
W |
Toggle wrap |
Space, Ctrl+F |
Page down |
Ctrl+B |
Page up |
Ctrl+D |
Half-page down |
Ctrl+U |
Half-page up |
g |
Jump to top of current cell |
G |
Jump to bottom of current cell |
Esc, q, w |
Close expanded reader |
| Key | Action |
|---|---|
Enter |
Open selected file/folder |
Backspace |
Go to parent folder (when query is empty) |
Ctrl+U |
Clear picker query |
Esc |
Close file picker |
| Key | Action |
|---|---|
Enter |
Apply predicate |
Ctrl+U |
Clear prompt input |
Esc |
Cancel |
| Key | Action |
|---|---|
Esc, ?, q |
Close help |
| Action | Behavior |
|---|---|
| Mouse wheel | Scroll cursor in focused pane |
| Left-drag divider | Resize table/columns split |
parqview has a runtime missing-value mode, toggled with m, with three states:
NULL+NaN(default),NULL only,NaN only.
The active mode is shown in the top-right status badge and affects:
- missing indicators and missing cell styling,
- missing-row filter (
f), - missing navigation (
n,r/R,c/C), - missing counts in profiling and footers.
For categorical profiling, the active missing mode determines which values are excluded.
For numeric stats and histograms, parqview always profiles only finite numeric values. That means:
NULLis excluded from numeric stats/histograms even inNaN only,NaNis excluded from numeric stats/histograms even inNULL only.
