jsonl lens
JetBrains Marketplaceplugin 33397free viewer, Pro subscription
JSONL Lens opens a .jsonl file in place, in IntelliJ IDEA and the other JetBrains IDEs. The records are indexed in the background by byte offset and read as you page, so the first screen is up before the index has finished, whatever the size of the file. Find looks for a word or a regular expression anywhere in a record, over every record in the file. The grid shows the records as rows with the nested fields flattened into columns of their own, and the schema tab sums up a sample. With Pro, a filter on named fields keeps only the records whose values satisfy it, scanned across the whole file, and the page or the matches go out as JSONL, CSV or Parquet. We benchmark the index on a file of more than 1 GB that the test suite writes for itself.
- opens
- .jsonl and .ndjson files, and their .jsonl.gz and .ndjson.gz forms; never plain .json, and the text editor stays the tab that opens first
- runs on
- IntelliJ IDEA, PyCharm and every JetBrains IDE from 2024.2 on, with no upper build
- store
- JetBrains Marketplace, plugin 33397
- newest version
- 1.7.0, published 2026-09-09
- pro
- a subscription with its own 30-day trial; the price is quoted below as the store shows it

free
- Any size: a streaming line index with progress; browse records while it runs, and page to the last line with no record cap
- Find in file: full-text search across every record, or a regular expression, with a case toggle, next and previous hit, highlighted hits and a matches-only mode that pages through the hits alone
- Record browser: a paged table with raw and pretty-printed views and a jump to any record number
- Grid view: records as rows and fields as columns, a nested object flattened into dot-path columns, a nested value shown as one-line JSON in its cell
- Schema stats: field names, types, null and missing rates, min, max and average for numbers, distinct counts, computed on a labeled sample of the first 1000 and 1000 random records
- Compressed files: a .jsonl.gz written in blocks is read in place with no temp copy; any other .jsonl.gz is decompressed to a temporary file, with the temp space it needs named first
- Encodings: EUC-KR, Shift_JIS and the Polish code pages detected on open, with an Encoding menu to switch by hand
- Malformed input: bad lines, blank lines, CRLF endings and oversized records are reported, and the file still opens
- Themes: twelve looks for the record table; trying one is free for the open window
pro
- Filter queries: keep only the records where fields match, for example
lang == "en" && score >= 0.5, scanned across the whole file, then browse just the matches - Export: write the current page, the search matches or the filter matches to a new .jsonl, CSV or Parquet file; in Parquet a nested value lands as a JSON text column
- Full-file stats: exact schema stats over every record, not a sample
- Kept themes: a chosen look stays set from file to file
price, as the store shows it
Pro is $1.50 a month or $15 a year for individual use, $3 or $30 for organizations. Each Lens plugin comes with its own free 30-day Pro trial. A year of continuous subscription earns JetBrains' perpetual fallback license: the version available when that year started stays yours for good, including its fixes.
where it stops
- No editing: the file is never modified; a Pro export writes a new file and leaves the original alone
- Not a formatter or linter: malformed lines are reported and shown as they are, not rewritten
- Filter queries are field predicates, not SQL: no joins, no aggregations

what's new
- 1.7.0published 2026-09-09
Export to Parquet, a Pro action. Pick a .parquet name in the Export Records dialog, where the filter now lists Parquet beside JSONL and CSV, and the current page or the matches of a search or a filter are written as one Parquet file. The columns are the dot paths a sample of the file shows, in the order the grid uses, up to 256 of them. Each column takes its type from the values the exported records hold: whole numbers become int64, any other number double, strings text, true and false a boolean column. A nested object or array is written as the JSON text of itself in a JSON column. Where the records disagree on the kind the column is text, and a field a record does not have is null. Records the reader cut short and records that do not parse are left out and counted on the status line, the same rule the CSV export follows. The open file is refused as a destination, as it is for CSV and JSONL. A cancelled export leaves no file behind, not even the scratch file the writer keeps beside the destination while it works. When the export finishes, the balloon offers Open exported file, and the file lands in Parquet Lens when that is installed; when nothing installed opens Parquet files, the click says so instead and offers the Parquet Lens page. The plugin download is larger than before, because the Parquet writer now ships inside it. The Theme picker ends with two locked entries now: lamplighter, whose line in the open list reads "unlocks when you share Lens with a colleague", and catacombs, whose line reads "unlocks the first time Pro runs for you". Pick a locked one and the plugin opens the way to earn it. For lamplighter that is the share card, also under Help as Share JSONL Lens: plain text for a colleague with the marketplace page, the family page beside it and a referral code of this install's own, under the line "enter it under Theme in any Lens plugin". Copy share card earns the theme here, and a colleague who picks lamplighter in their own Theme picker, types that code into the share card and presses Unlock with code earns it there. Catacombs opens the first time Pro runs for you, and a trial counts. An earned theme stays whatever the license says. Four night themes join the picker, Duskhollow, Abyss, Obsidian and Moonlit Garden; trying one is free for the open window and keeping it is Pro, like the eight.
- 1.6.0published 2026-09-09
The encoding sniffer now recognizes Polish files written in Windows-1250, ISO-8859-2 or CP852, and the Encoding menu lists all three so a file can be switched by hand. A blocked gzip file, the kind bgzip writes, opens in place: the reader seeks into the file's blocks and inflates them where they lie, so such a .jsonl.gz opens with no temp copy, and the status line says so ("Read in place" with the block count, then "no temp copy"). An ordinary .jsonl.gz still decompresses to a temporary file the way it did, pre-flight refusal included. Reload walks a blocked file again before it re-indexes, so blocks appended since the tab opened come into view, and a file rewritten in the meantime as ordinary gzip is refused by name ("is no longer blocked gzip, so it cannot be read in place. Close the tab and open it again.") rather than read through a map that no longer describes it. The decompression note states a floor only when the file on disk does not already beat it, and an empty .jsonl.gz is refused as "Not a gzip file: the file ends before a gzip header" instead of "Not a gzip file: null".
- 1.5.1published 2026-09-07
A Pro trial started from your JetBrains account no longer stays unlocked after its 30 days. The plugin used to check only the key's signature, which stays valid, so a lapsed trial kept Pro open and was even taken for a purchase: the trial-ended notice never showed, and the thank-you could go to someone who had not bought. The trial's end date is now read from the key itself. Paid keys and perpetual fallback licenses work exactly as before. A .jsonl.gz is now asked how big it will get before it is decompressed. A file that cannot fit in temp space is refused up front, with both numbers named, instead of failing after minutes of work, and the note under the file says the size while it runs. A bgzip file gives an exact size; for any other gzip file the number is a floor and the note says so. The schema stats table and the record pane say why they are empty instead of showing a blank grid or a blank pane.
more
Pricing, invoices and licensing questions go to [email protected]; anything else about the product to [email protected].