Desktop explorer · CLI · cgo-free Go

See the shape of any data file.

Drag in JSON, NDJSON, CSV, TSV, Parquet or SQLite and work with the real rows - filter, sort, reshape, edit and export by clicking. shape writes the matching jq and SQL for everything you build, so you leave knowing how.

Free for noncommercial use · Windows · macOS · Linux · no jq or SQL required

Illustrative mock-up - a stylized rendering of the interface, not a screen capture. Sample data is fictional.

Bigger than RAM
Streams, never loads
A multi-gigabyte file opens in one pass with bounded memory - nothing is slurped into RAM.
Honest numbers
Counts are exact - or say ~
Match counts are computed exactly. When a number is an estimate, it wears a leading tilde. No quiet guessing.
One engine
Same rows, every source
In-memory, streaming, SQLite and Parquet all run one filter model - byte-identical results whatever the file.
Everything, by clicking

Poke at a data file the way you always wanted to.

Most tools assume you already know jq or SQL. shape is for everyone who bounces off them - the whole workflow is visual, and the query is generated for you.

Explore the real rows

A virtualized table over the actual data - millions of rows scroll smoothly - beside a structure map of every field with its type, presence and distinct count.

Filter & search

Build type-aware AND/OR conditions by clicking, and search any value across every field. Applied live, with a cancellable exact match count.

Sort at any size

Click a header to sort - exact over the whole result on every tier, even a multi-gigabyte streaming file. Row numbers stay the true source ordinals.

Column statistics

Expand a field for its full profile in place: a distribution histogram, top values, quantiles and health flags - from the single open-time pass, no rescan.

Edit & save a copy

Double-click a scalar cell to change it; number literals stay exact, so a 19-digit id never loses a digit. Save back to a new file - the original is never touched.

Saved views

Name a filter + search + sort + reshape and reapply it anytime - across restarts. Plus export the full result to JSON, NDJSON, CSV, TSV or Parquet.

Take the query with you

Learn jq and SQL by watching them get written.

jqcopy
.[]
  | select(.amount > 0)
  | {id, user, event, amount, props}
SQLcopy
select id, user, event, amount, props
from data
where amount > 0
order by amount desc
  • Everything you build has both. The filter, search, sort and reshape you assembled by clicking appear as an exact jq expression and SQL query, ready to copy.
  • Differences are called out, not glossed. Where the three engines genuinely disagree, shape says so instead of pretending they match.
  • On SQLite, it actually runs. A filter it can translate is pushed into the database - measured ~12× faster on a 200k-row count - and anything it can't vouch for falls back to the same Go predicate, so the answer never changes.
Same core, on the command line

A streaming profiler for your terminal and CI.

The cgo-free engine also ships as a CLI: profile a file in one pass, infer a JSON Schema, and fail a pull request on breaking data-shape changes.

bash
$ shape profile events.ndjson
field type null distinct range
id number 0% 200,000 4821 … 61240
user string 0% 48,210 "aaronson" … "zuse"
event string 0% 6 purchase · signup · …
amount number 41% 312 -9.99 … 149.00
props object 0% - { plan, ref }
 
$ shape diff baseline.ndjson events.ndjson --fail-on breaking
amount: nullability widened (added null) - non-breaking
country: new field (string) - non-breaking
✓ no breaking changes - exit 0

Gate a PR with the hoijunkim/shape@v1 GitHub Action, or install with go install github.com/hoijunkim/shape@latest.

Open a file. See its shape.

Stop guessing at your data. Start reading it.

# desktop app - grab a build for your platform
 github.com/hoijunkim/shape/releases

# or the CLI, anywhere Go runs
$ go install github.com/hoijunkim/shape@latest