dataeng.tools

JSONL viewer — open & query JSONL / NDJSON files in your browser

JSONL (also called NDJSON) is one JSON object per line — no enclosing array, no commas between records. It's the native shape of application logs, event streams, LLM and ML datasets, and database exports, because a process can append one line at a time. That's exactly why a plain JSON viewer chokes on it: the file isn't a single JSON value, so the parser fails on the second line. This page reads a .jsonl or .ndjson file the way the format actually works — line by line — using DuckDB's read_json_auto, turning each line into a table row and inferring the column types from a sample of the data.

Once it's a table you can do more than scroll. Nested objects become STRUCT columns and arrays become LIST columns, so structure survives instead of collapsing to text — reach into them with dot notation (payload.user_id) and index notation (tags[1]) right in the query editor. You get real SQL against the file: SELECT, WHERE, GROUP BY, aggregates, the lot, running over the whole file rather than the first N pretty-printed lines. When you've isolated the slice you want, export the query result to CSV or Parquet. It all runs on DuckDB-WASM in your browser, single-threaded here, so a big file just takes longer rather than failing.

Two honest caveats come from the format itself. Lines don't have to share a schema — different keys per row are legal in JSONL — and DuckDB unions every key it sees into one wide column set, filling absent keys with NULL. And type inference is sampled: a field that's an integer on most lines but a string on a few gets widened to a common type (usually VARCHAR), so eyeball the inferred schema before you trust a numeric aggregate. A malformed line surfaces as an error rather than being silently dropped. Everything happens locally — the file is never uploaded, which you can confirm in devtools: zero network calls carry your data.

Drop a file or click to browse

Drop a JSONL / NDJSON file — read locally in your browser, never uploaded

Frequently asked questions

Is my JSONL file uploaded to a server?
No. The file is read entirely in your browser by DuckDB-WASM — it never leaves your machine. There's no account and no backend that sees your data. Open devtools and watch the Network tab while you load a file: you'll see zero requests carrying its contents.
How large a JSONL / NDJSON file can I open?
There's no fixed row or size cap — the ceiling is your browser's memory, since the data is loaded locally. DuckDB runs single-threaded here (no SharedArrayBuffer), so a multi-GB file parses and queries more slowly rather than failing outright. Multi-hundred-MB logs are routine; very large exports are where you'll feel the wait.
Can I run SQL on it, and what happens with inconsistent lines?
Yes — every file opens as a real table you can query with SELECT / WHERE / GROUP BY, reaching into nested objects and arrays via dot notation (data.user.id) and index notation (items[1]). JSONL lines needn't share a schema: DuckDB unions all keys into one column set and fills missing ones with NULL, and it widens fields with mixed types (say int and string) to a common type, usually VARCHAR. Check the inferred schema before trusting an aggregate.

Related tools