jsonl lens
JetBrains Marketplaceplugin 33397free viewer, Pro subscription
Install from the JetBrains Marketplacefree to read; the Pro trial runs 30 days
The lines past the first screen have never been read. Here is a lantern for them, one record at a time: the first page of an export is lit before its last line has been counted.
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, .ndjson, .ldjson and .jsonlines files, and their .gz forms; never plain .json, and a file too large for the text editor opens on the JSONL Lens tab first, the rest beside it
- runs on
- IntelliJ IDEA, PyCharm and every JetBrains IDE from 2024.2 on, with no upper build
- store
- JetBrains Marketplace, plugin 33397
- newest version
- 2.0.0, published 2026-10-27
- 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
- Saving edits: with Edit on, a record is changed in the detail pane and staged; Review lists each staged record beside the line in the file, Save (Pro) rewrites those lines in place and leaves every other byte as it was, with a copy beside the file when you ask for one; Undo last save (Pro) takes a save of changed records back until the file is closed or reloaded
- 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
The viewer is free and stays free. Pro is a subscription for this plugin: USD 1.90 a month or USD 19 a year for individual use. For organizations it is, per user, USD 3.90 a month or USD 39 a year.
where it stops
- Read-only by default: Edit is off on every open and nothing is written until you click Save (Pro); 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
- 2.0.0published 2026-10-27
With 2.0.0, records can be edited in JSONL Lens. Read-only stays the default; "Edit" in the toolbar turns it on, and the file is untouched until you click "Save… (Pro)". While Edit is on, the detail pane takes a record's JSON; "Stage" (or Ctrl+Enter) keeps the change once it reads as one JSON value, and text that does not is left unstaged with the parser's position shown. "Add record" adds an empty record after the last line, to fill in the same pane. "Review" shows each staged record next to the line the file holds now. The save rewrites only those lines, in place, and every other byte stays as it was. The IDE's Local History keeps the version before the save, "Keep a copy of the file before saving" leaves a copy beside the file, and "Undo last save… (Pro)" takes a save of changed records back until the file is closed or reloaded; a save that added records cannot be undone, and the preview says so before Save. A compressed file keeps Edit off. A record past 16 MB, and a file that changed on disk since it was opened, are not written, and the reason is shown. Edit mode, staging and "Review" are free; saving is Pro.
- 1.9.10published 2026-10-22
A file JSONL Lens cannot read now opens to one line that says why, where it ended in an IDE error. A deleted file, or one this user may not read, says so. A Parquet file or a SQLite database under a .jsonl name says what it is instead of opening as lines of noise. A gzip file without its .gz, and UTF-16 text, each name the change that opens them here. One damaged byte near the top of a UTF-8 file used to turn every accented letter in it into Korean; the damaged byte alone shows now. A byte order mark no longer makes the first record "Not valid JSON". A blocked-gzip file with damaged block sizes opens through decompression or names the damage, where records went missing. A file cut short after it was indexed says so on the rows it lost.
- 1.9.9published 2026-10-17
A large file used to open far from page 1: the view moved with the index as it was built and stopped wherever indexing ended. It opens on page 1 now and stays there while indexing runs. The last-page button pressed during indexing follows the end on purpose, and it now stops on the true last page instead of short of it.
more
Pricing, invoices and licensing questions go to sales@twilightventures.dev; anything else about the product to support@twilightventures.dev.