JSONL FastViewer
A high-performance, local-first VS Code custom editor engineered for massive JSONL and NDJSON files.
Progressive byte-range indexing • Adaptive sparse memory layouts • Virtualized 60 FPS UI • Crash-safe streaming save
English • 简体中文
Highlights •
Performance •
Visual Tour •
Architecture •
Usage •
Configuration •
Installation
Highlights
⚡ Engineered for Massive Datasets
Files are never loaded whole into memory. Powered by a custom zero-copy ByteLineScanner, files up to 5 GB (43+ million rows) open within seconds via lazy byte-range reads while VS Code remains smooth and responsive.
🪶 Adaptive Indexing with 814× Memory Reduction
Uses exact Float64 line indexing (~13 B/line) for instant access on small-to-medium files, and automatically transitions to a sparse checkpoint index (~0.0156 B/line) above the 256 MiB soft watermark. On a 5 GB dataset, resident index memory drops from 534 MB to just 0.69 MB while keeping 100-row window reads under 0.84 ms.
🎯 Three Synchronized Coordinated Views
Seamlessly switch between a Virtualized Table (multi-column sorting, resizable columns, pinned row numbers), Raw JSONL (high-performance virtualized text view), and a JSON Tree Inspector (deep hierarchical object navigation). Selections, active cursors, and uncommitted edits stay synchronized across all views.
🔍 Interactive, Non-Blocking Streaming Queries
Run instant field filters, comparisons, and text searches (e.g. score > 90, status:active, name contains "Alice"). Scanning operates at > 1,000,000 rows/second, returns first matches in ~3.5 ms, responds to cancellation in < 1 ms, and enforces strict event-loop yield budgets to eliminate UI freezing.
✏️ Type-Aware In-Place Cell & Record Editing
Inline cell editing (F2), full-record JSON modification, row insertions, and row deletions with an undo/redo journal (Cmd/Ctrl+Z). Modified and inserted records display real-time status badges with immediate dirty-state tracking.
🛡️ Crash-Safe Streaming Save Architecture
Zero risk of data corruption. Edits stream into a sibling temporary file using aggregated 1 MiB write buffers, undergo byte-for-byte verification and source file identity re-validation, emit exactly 1 fsync, and commit atomically via platform-verified rename. Cancelled or interrupted saves leave the original file byte-for-byte untouched.
🔒 100% Local-First & Private
All parsing, scanning, indexing, querying, and saving execute entirely on your machine. Zero network requests, zero telemetry, zero background uploads.
Visual Tour
| Virtualized Data Grid |
Type-Aware Inline Editing |
 |
 |
| Smooth 60 FPS scrolling across millions of rows with auto-detected schemas and multi-column sorting. |
Press F2 to edit inline with automatic type parsing, validation, and real-time dirty status badges. |
All figures below are measured on Apple M4 (macOS arm64, Node v22.21.1, 16 GB unified RAM, seed 42) using the automated benchmark harness under benchmark/. Fixtures, synthetic generators, and gate runners are checked into the repository for deterministic reproduction.
1. Scaling & Pipeline Throughput (100 MB → 5 GB)
| Metric |
100 MB |
500 MB |
1 GB |
5 GB (43.1M Rows) |
| Physical Rows |
883,214 |
4,313,655 |
8,801,722 |
43,088,447 |
| Index Build Wall Time |
91 ms |
450 ms |
1.03 s |
4.60 s |
| Index Framing Throughput |
9.7M rows/s |
9.6M rows/s |
8.5M rows/s |
9.4M rows/s |
| 100-Row Window Read Latency |
0.033 ms |
0.033 ms |
0.067 ms |
0.071 ms |
| Document Shell Open RSS |
0.02 MB |
1.0 MB |
4.5 MB |
2.4 MB |
| Unedited Streaming Save |
404 ms (246 MB/s) |
2.02 s (261 MB/s) |
4.09 s (264 MB/s) |
Streaming |
| Save I/O Blocks & fsync |
102 calls / 1 fsync |
501 calls / 1 fsync |
1,025 calls / 1 fsync |
1 fsync / 1 MiB block |
[!TIP]
Extreme Line Density: On ultra-short line fixtures (e.g. 100 MB with millions of tiny lines), the byte scanner peaks at 16.9 Million rows/second framing speed (449 ms total build time), requiring zero string allocations and zero GC pauses.
When indexing exceeds the configurable 256 MiB soft watermark, JSONL FastViewer seamlessly adopts a sparse checkpoint index on the fly without restarting or copying pages:
| Dimension |
Exact Index (Forced) |
Adaptive Sparse Index (Auto) |
Efficiency Gain |
| Resident Index Memory |
534.2 MiB (560.2 MB) |
0.69 MiB (688 KB) |
814× reduction (-99.87%) |
| Memory Cost per Row |
13.0 bytes / row |
0.0156 bytes / row |
814× more compact |
| 100-Row Window Read Latency |
0.39 ms |
0.84 ms |
Sub-millisecond interactive |
| Process Peak RSS Delta |
568.6 MB |
7.4 MB |
77× lower system impact |
| GC Pause Time |
16.0 ms |
1.7 ms |
9.4× fewer GC cycles |
3. Real-World Edit Densities & Save Pipeline (500 MB, 4.31M Rows)
JSONL FastViewer utilizes a dedicated 1 MiB aggregated buffer writer (PhysicalLinePump + BufferedTemporaryFileWriter). Unmodified rows stream directly from raw source bytes without JSON parsing or string serialization overhead:
| Edit Scenario |
Rows Affected |
Save Time |
Effective Speed |
Write Calls / GB |
fsync Count |
Progress Latency |
| Unedited Clean Save |
0 rows (100% passthrough) |
2.02 s |
261.4 MB/s |
1,025 |
1 |
6 ms |
| Sparse Edits |
~43,100 rows (~1% replaced) |
2.12 s |
247.8 MB/s |
1,025 |
1 |
7 ms |
| Dense Edits |
~2,156,000 rows (~50% replaced) |
2.89 s |
135.5 MB/s |
1,026 |
1 |
10 ms |
| Mixed Workload |
~1.3M rows (10% edit + 10% del + 10% ins) |
3.69 s |
126.2 MB/s |
1,026 |
1 |
11 ms |
- Zero Write Call Thrashing: Constant ~1 MiB write blocks (
avgWriteBlockBytes = 1,048,576 B) regardless of whether you edit 1 line or 1,000,000 lines.
- Atomic Single fsync: Commits with a single atomic
fsync call, guaranteeing that interrupted saves never leave broken or truncated files.
4. Query, Filter & Schema Responsiveness
| Benchmark Scenario |
Dataset Size |
Wall Time |
Scan Throughput |
Latency to First Match |
Cancellation Response |
| Full Query Scan |
100 MB (883K rows) |
832 ms |
1,058,838 rows/s |
3.46 ms |
0.05 ms |
| Full Query Scan |
500 MB (4.31M rows) |
4.04 s |
1,067,014 rows/s |
3.54 ms |
0.82 ms |
| Schema Fast Sample |
100 MB (100 rows) |
1.29 ms |
Instant preview |
1.29 ms |
- |
| Schema Deep Sample |
100 MB (1,000 rows) |
3.11 ms |
High confidence |
3.11 ms |
- |
| Schema Full Scan |
100 MB (883K rows) |
1.03 s |
856,000 rows/s |
Complete coverage |
0.25 ms |
| Wide Schema Scan |
100 MB (100+ columns) |
1.61 s |
Complex nested keys |
Max gap: 25.2 ms |
0.41 ms |
- Zero Cache Pollution: Batch query and schema scans run in non-caching mode, preventing LRU cache thrashing and maintaining hot cache lines for active UI views.
- Strict UI Responsiveness Budget: Event loop latency during massive 500 MB scans stays capped under 16 ms (P99: 11.7 ms), guaranteeing stutter-free typing and scrolling while scans execute in the background.
5. UI & Virtualized DOM Benchmarks (Headless Chromium DOM Gates)
| Stress Scenario |
Scale / Workload |
Active DOM Nodes |
Rendered Rows |
Vertical Scroll P95 |
UI Heap Footprint |
| Million-Row Filter Hits |
1,000,000 hits × 8 columns |
< 500 |
47 rows |
< 16 ms (60 FPS) |
24.4 MB |
| Wide Column View |
20,000 hits × 100 columns |
< 1,200 |
47 rows |
< 16 ms (60 FPS) |
16.9 MB |
| Badges & Overlays |
1,000,000 rows with 250 dirty badges |
< 600 |
47 rows |
< 16 ms (60 FPS) |
9.1 MB |
| Rapid Keyboard Edit Loop |
50 continuous F2 → Edit → Enter/Esc |
Clean recycle |
47 rows |
< 5 ms latency |
0 MB leak |
Architecture
JSONL FastViewer follows a clean, decoupled architecture where performance-critical operations run with strict resource bounds and fail-safe transactional guarantees:
flowchart TB
subgraph Presentation ["Webview Layer (Sandboxed Browser)"]
VGrid["Virtualized Data Grid\n(Fixed ~47 DOM rows • 60 FPS)"]
RawView["Virtualized Raw View\n(Line-level virtual text)"]
Inspector["Hierarchical Inspector\n(Tree-structured JSON explorer)"]
DOMState["Bounded View Store\n(Zero fs access • Strict budgets)"]
end
subgraph Protocol ["Typed Protocol Boundary"]
IPC["JSON-RPC Typed Messages\n(Versioned • Validated DTOs • Bounded windows)"]
end
subgraph Host ["Extension Host (Orchestration & File I/O)"]
Session["Session & Version Coordinator\n(Session ID + File Version Leases)"]
Scanner["ByteLineScanner\n(Zero-string UTF-8 framing)"]
Indexer["Adaptive LineIndex\n(Exact 13B/row ⇄ Sparse 0.015B/row)"]
QueryEngine["Streaming Query Engine\n(Regex-free • Cancellable • Yield budgets)"]
SaveCoordinator["Streaming Save Transaction\n(1 MiB aggregated buffer • fsync=1 • Atomic rename)"]
end
subgraph Storage ["Local Storage"]
SourceFile[("Original .jsonl / .ndjson")]
SiblingTemp[("Sibling .tmp.<nonce>")]
end
VGrid <--> IPC
RawView <--> IPC
Inspector <--> IPC
IPC <--> Session
Session --> Scanner
Scanner --> Indexer
Session --> QueryEngine
Session --> SaveCoordinator
SourceFile -. Byte-range reads .-> Scanner
SaveCoordinator -. Aggregated streaming write .-> SiblingTemp
SiblingTemp == Atomic commit on SHA validation ==> SourceFile
Core Architectural Invariants
- Zero Full-File Buffering: The extension host never reads an entire file into memory as a string or parsed record array. All reads occur via bounded byte-range chunks.
- Untrusted Webview Principle: The webview operates in an isolated environment with zero file system access. Messages are strictly validated against runtime DTO schemas.
- Session & Version Cancellation: Every operation is tagged with
sessionId + fileVersion. When a file is modified externally or reloaded, in-flight work and outdated caches are cleanly cancelled and evicted.
- Crash-Safe Out-of-Place Writes: Edits are never applied in-place. If a crash, disk exhaustion, or power cut occurs during save, the original source file remains byte-for-byte intact.
Usage & Shortcuts
Opening Files
- Default Editor: Double-click any
.jsonl or .ndjson file in the VS Code Explorer.
- Context Menu: Right-click a file and select JSONL: Open Viewer.
- Command Palette: Run
JSONL: Open Viewer (Ctrl+Shift+P / Cmd+Shift+P).
Keyboard Shortcuts
| Keybinding |
Action |
Context |
F2 |
Enter inline cell editing |
Table View |
Enter |
Commit cell edit / Submit query |
Table Cell Editor / Query Bar |
Escape |
Cancel editing / Dismiss dialogs |
Table Cell Editor / Dialogs |
Cmd+Z / Ctrl+Z |
Undo last edit |
Global View |
Cmd+Shift+Z / Ctrl+Y |
Redo edit |
Global View |
Arrow Keys / Tab |
Navigate cells and rows |
Table View |
Cmd+F / Ctrl+F |
Focus query and filter input |
Global View |
Query Syntax Examples
- Field Equality:
status:active or city:"San Francisco"
- Numeric Comparisons:
score >= 90, age < 30, latency != 0
- Substring Matching:
name contains "Alice", path contains "/api/v1"
- Compound Filters: Space-delimited clauses evaluate with implicit
AND logic.
Configuration
Custom settings can be configured via VS Code Settings (Cmd+, or Ctrl+,):
| Setting |
Type |
Default |
Description |
jsonlFastViewer.editing.enabled |
boolean |
true |
Enable or disable in-place cell/record editing and saving. |
jsonlFastViewer.performance.indexStrategy |
enum |
"auto" |
Indexing strategy: "auto", "exact", or "sparse". "auto" selects exact indexing and switches to sparse past watermark. |
jsonlFastViewer.performance.indexBudgetBytes |
number |
268435456 |
Soft index budget watermark in bytes (16 MiB to 1 GiB, default 256 MiB). |
jsonlFastViewer.performance.maxQueryResults |
number |
400000 |
Maximum retained query result rows (1,000 to 1,000,000). |
jsonlFastViewer.benchmark.chunkSizeBytes |
number |
4194304 |
I/O read chunk buffer size in bytes (default 4 MiB). |
jsonlFastViewer.logging.enabled |
boolean |
false |
Enable diagnostic logging on the Extension Host output channel. |
Installation
You can install JSONL FastViewer from a locally built VSIX package:
# 1. Clone the repository
git clone https://github.com/bigwhites/JSONL-FastViewer.git
cd JSONL-FastViewer
# 2. Install dependencies & compile
npm install
npm run package
# 3. Install the generated VSIX into VS Code
code --install-extension jsonl-fastviewer-1.0.0.vsix
Try in Extension Development Host
To run and experiment without packaging:
npm run build
code --new-window \
--user-data-dir /tmp/jfv-profile \
--extensions-dir /tmp/jfv-extensions \
--extensionDevelopmentPath="$PWD"
Development & Verification
# Strict TypeScript checks
npm run check
# ESLint & layer boundary validation
npm run lint
# Code formatting checks
npm run format:check
# Run full test suite (934 unit & integration tests)
npm test
# Build production bundles
npm run build
# Integration tests in VS Code Extension Host
npm run test:integration
Benchmark Suite
# Fast feedback benchmark (10 MB)
npm run benchmark:stage6:quick
# Full multi-shape benchmark suite (100 MB / 500 MB / wide / long / bad rows)
npm run benchmark:stage6
# Scale smoke benchmarks
npm run benchmark:stage6:smoke:1gb
npm run benchmark:stage6:smoke:5gb
# Save transaction safety & failpoint gate (79 failpoints)
npm run gate:stage5-save
# Virtualized DOM & frame latency gate (Headless Chromium)
npm run gate:stage5-dom
License
Released under the MIT License.
| |