jsonl lens for vs code
Open VSXVisual Studio Marketplacefree viewer, Pro by subscription
Install from Open VSXInstall from the Visual Studio Marketplacefree to read; the Pro trial runs 30 days on each machine
Take the headlamp into VS Code: a gigabyte-scale JSONL file lights up while its index is still being built, and the index of offsets is the only thing kept in memory.
JSONL Lens for VS Code opens a .jsonl or .ndjson file in the editor. Records are indexed by byte offset in one pass and read on demand, so the 1.02 GB file of 5,000,000 records in the screenshot below is on screen while its index builds (3.7 s for that file), and what the extension keeps in memory is the list of offsets rather than the file. The viewer is free: the grid, find with regular expressions, the schema tab and the record detail. Pro, a subscription shared with Parquet Lens and Log Lens for VS Code, adds whole-file filter queries, export to JSONL or CSV, exact stats and grid themes, and it is on from the first open, since each machine gets a 30-day trial with no key to enter.
- opens
- .jsonl, .ndjson, .ldjson and .jsonlines files, gzipped or not; never plain .json
- runs on
- VS Code 1.90 and every later release, with no upper bound; the Open VSX build serves VSCodium and the other editors that use that gallery
- stores
- Open VSX and the Visual Studio Marketplace
- newest version
- 0.6.0, published 2026-10-27 on both stores
- pro
- one subscription from Polar, one key for the three extensions; a 30-day trial on each machine first

free
- Any size: a line index built in one pass with live progress; browse records while indexing runs
- Find in file: full-text search across every record, or a regular expression tested against each record on its own; a case toggle, next and previous, and matches only to page through the hits alone
- Go to row: type a record number, Enter, and the grid is there (Ctrl+G for the box)
- Grid view: records as rows, fields as columns, the column set from a sample of the file, nested fields as dot paths such as
user.plan - Schema tab: every field path seen in a sample, with present, missing and null counts, types, min, max, average, distinct strings and example values
- Record detail: the selected record pretty-printed with key order and int64 precision preserved, copied in one click
- Robust: malformed lines, blank lines, CRLF endings and oversized records are reported, never fatal
- Reads in place: the file is never copied or converted; the index is thrown away when the tab closes
- Private by construction: no account, no telemetry; the free viewer makes no network calls
pro
- Whole-file filter queries:
level == "error" && status >= 500, tested against every record in the file; the grid becomes the matching set - Export: all records, the filter matches or the search matches, to JSONL or CSV, with a cancellable progress bar, never over the source file
- Exact stats: the schema tab's full scan reads every record instead of a sample
- Themes: twelve looks for the grid, each tuned for light and dark editors; trying one is free for the window, keeping it is Pro
price, as the store shows it
$4.90 a month or $49 a year personal, $9.90 a month or $99 a year business: one key for all three extensions, and Pro stays on in every build while the subscription runs. a personal key activates on up to 3 machines, a business key on 10, all three extensions on each (each extension on each machine is one activation: 9 on the personal key, 30 on the business key); release a machine from the Polar customer portal. when the subscription ends, Polar revokes the key and Pro turns off at the extension's next check, about once a week; the free viewer stays.
one Lens Pro key covers JSONL Lens, Parquet Lens and Log Lens for VS Code, but the three do not pass the key between them. paste it into each one you use, each paste being one activation call of its own, and Remove license key in that extension can release it again.
The keys are sold through Polar: a personal key or a business key. A key makes one activation call to Polar when you paste it, a license check about once a week after that, and one release call when you choose Release and remove. While Polar cannot be reached, the check is tried again at every start and once a day. The trial makes no call, and the Get Pro and review buttons hand a store page to your browser rather than fetching anything themselves.

what's new
- 0.6.0published 2026-10-27
records can now be edited in the viewer. double-click a record, or any cell of it, and it opens in the pane beside the grid as its JSON text; change it and press Stage, or Ctrl+Enter. the row then shows a colored edge, and a bar above the status line counts what is not saved yet ("Not saved yet: 2 records changed, 1 added") with Undo, Discard and Save. Add record opens an empty record that goes after the last one. Save in the bar, or the editor's own Save (Ctrl+S), writes the changes into the file in place: only the text of the records you changed is written again, and every other line, the line endings, the blank lines and a byte order mark stay as they were. until then the tab shows the unsaved mark, and Undo or Ctrl+Z takes the last change back. staging and the bar are free; the save is a Lens Pro feature, which the trial includes, and without it the prompt reads "Saving an edit is a Lens Pro feature. Opening a record, staging it, Undo and the bar that counts the unsaved records stay free." and your changes stay staged. a text that is not one JSON value is not staged, and the pane says where reading it stopped; a text with a line break is not staged either, since a record is one line. nothing is written when the file changed on disk after you opened it: the save is refused with "This file changed since you opened it; revert and edit again." a gzipped file, or one over 512 MB, still opens for reading only.
- 0.5.20published 2026-10-17
export (Pro) now refuses a hard link of the open file as a destination, with the sentence "Export destination is the source file under another name (a hard link, or the same path in another case)". the file's own path and a symbolic link to it were refused before; a hard link was not, and a write through one empties the file being read. in the CSV shape, a cell that opens with an equals sign, a plus, a minus or an at sign and is not a plain number goes out behind an apostrophe, so =HYPERLINK(...) in a record opens as the text it is, while -1 and +1 234 keep their sign; the quoting of commas, quotes and line breaks has not changed.
- 0.5.19published 2026-10-17
a double-clicked .jsonl, .ndjson, .ldjson or .jsonlines file opens as text, and from this version one over 5 MB, or gzipped (the text editor shows a gzipped file as binary), is offered to the viewer: one message asks "Open events.jsonl in JSONL Lens?" with the buttons "Open", "Always for .jsonl" and "Not now". "Open" shows it in the viewer and closes the text tab, "Always" also makes JSONL Lens the editor for that ending in your user settings, and the question comes once per ending on this machine, never for an ending you already gave an editor. a Parquet, Avro or Arrow file, a SQLite database, a ZIP archive (an Excel .xlsx workbook is one) or a gzipped file without a .gz name, opened in JSONL Lens, is now refused in one line, Not a JSON Lines file: "sales.parquet" is a Parquet file., where the grid showed its bytes as rows of unparseable records. a read that trips on bytes it cannot place now says "part of it is damaged, or laid out in a way this viewer cannot follow", with the reader's own message in the tooltip.
more
Pricing, invoices and licensing questions go to sales@twilightventures.dev; anything else about the product to support@twilightventures.dev.