jsonloupe
jsonloupe MIT · no account

A loupe for large JSON.

too precise for your viewer: a float parser reads that id back as 9007199254740992 — jsonloupe never rounds.

Five-million-element arrays open instantly. Diff, query, and turn the nesting into linked spreadsheet tables — all inside your browser tab.

Paste a Zstd, Base64 or PostgreSQL bytea blob and it opens as JSON with a transformation trace. Compress JSON the other way from the same app — no upload or separate converter.

0 bytes uploaded · no backend · no telemetry · no account · MIT

Paste JSON paste and it opens · document values stay in this tab

paste JSON — or a zstd / base64 / bytea blob, it decodes automatically

⌃↵ to open

Built for the payloads that break other tools

lossless numbers

Int64 and exact decimals

IDs beyond 2^53 survive paste → view → edit → copy → download with every digit intact. Nothing is coerced to a float, ever.

92233720368547758079223372036854775808

scale

Five million elements, instantly

Virtualized tree with chunked expansion — [0 … 9999] range rows — and parsing, diffing, search and compression all off the UI thread.

payloads

Decode and encode transport payloads

Raw .zst, Base64-Zstd, or PostgreSQL \x… bytea opens with a transformation trace. Compress JSON the other way, choose its payload format, and inspect exact UTF-8, Zstd, Base64, and envelope sizes against editable budgets.

json to excel

Nested JSON becomes linked tables

Every list gets a sheet of its own, joined back to its parent by id — never items/0/sku columns. Preview real rows, customize columns and missing values, then export Excel or CSV. Save the mapping to replay it on the next file or hand it to an agent.

diff

Semantic side-by-side compare

Arrays align by identity, so reordering does not drown you in false changes. Ignore noisy fields by key or path prefix.

navigation

Paths, lenses, and “same value”

Copy any node as JSONPath, JSON Pointer, or JS accessor. Epoch → local date, lat/lng, uuid flags, and byte weight on collapsed nodes.

Query locally — or translate English

Filter, pluck, group and count in the worker; direct queries never leave your browser. Any array opens as a sortable table, and a table or result downloads as exact-digit CSV. Optional English → query sends your question and only the document shape — field names, types, and array lengths — to your chosen model, then shows the generated query for review before it runs locally. Save a useful query or turn it into a reusable pass/fail check.

$.tasks[?(@.status == 'FAILED')]
  | group(@.failureReason)

Functions and checks you can keep

Name sandboxed JavaScript for questions a query language should not answer, batch-run functions, and keep important queries as checks. Export both as a playbook file for tomorrow's document or a teammate; unsafe numeric literals can arrive as exact digit strings.

named functions pass / fail checks portable playbook

Your AI agent can use it too

The same engine runs as an 11-tool MCP server. An agent loads a file or compressed blob once, then inspects its shape, profiles fields, queries and samples bounded slices, compares documents, exports exact results, or drafts a spreadsheet mapping while the document stays in the server process.

claude mcp add jsonloupe -- npx -y -p jsonloupe jsonloupe-mcp

And in a browser that speaks WebMCP — ChatGPT's in-app browser, or Chrome 149+ — this very page registers those verbs on the open document, plus three no server can offer: an agent can load a document into your viewer, scroll your tree to a row and flash it, or filter your view to its evidence through the same toolbar button you would press yourself. You both look at one document; what it returns is always data, never instructions.

11 toolsload · inspect · spec · convert · schema · query · profile · sample · diff · csv · result
webmcp, on this pagequery · schema · profile · sample · load · reveal · highlight · clear
document in model contextnever
network callsnone

Your documents never leave your machine

Parsing, diffing and querying run in a web worker; documents are stored in IndexedDB on your own disk. There is no server to send them to. English query translation stays off until you connect OpenRouter or add your own API key, and even then it sends your question plus document shape — field names, types, and array lengths — never values. After you press Translate, “sent to model” records the exact request.

fetch calls in app4 · all opt-in connection / translation
telemetrynone
licenseMIT
typescriptstrict

Connect a model

Authorize separately from your document. Nothing is sent until you translate.

Authorize on OpenRouter. No API key to paste.

OpenRouter model
Document values
never sent
Question + shape
sent when you translate
Credential
this tab only
Use API key instead

English → query sends your question and document shape (field names, types and array lengths — never values) to OpenRouter or Anthropic. Direct $.queries stay local.

Keys stay in this tab unless you choose Remember on this device.

Choose comparison baseline

The open document stays current. The selected document appears on the left.

Keyboard shortcuts

What the workbench answers to. Escape closes.

tree — document or result
or j kmove selection
expand · collapse
Entertoggle a container
ycopy path
ccopy value — digits exact
double-click a valueedit in place
document
/search keys and values
⌘Z or Ctrl Zundo — shift redoes
functions
⌘↵ or Ctrl ↵run the script
paste view
⌃↵open the pasted text

Payload size report

Compare exact JSON, compressed, Base64, and envelope sizes. Recompression runs locally.

Delivery budgets Edit each limit and choose which stage it measures.
service limit · KiB measured at
Updates automatically. Thresholds are local presets, not universal platform limits.