Privacy & local-first architecture
The short version: your JSON never leaves your browser. Below is exactly how, and exactly what the handful of analytics events do and don't record — not an aspirational claim, the real list.
Where your document goes
Parsing, formatting, diffing, repairing, converting, validating against a schema, decoding a JWT — every one of these runs inside a Web Worker in your browser tab. Notice there's no arrow pointing to a server in that diagram — none of these tools have a backend to send your document to. The parsed document itself is never sent as a network request, not even to this site's own servers.
What's stored on your device (and how to clear it)
A few conveniences — reopening a recent file, keeping a saved schema — need somewhere to live. Everything below stays on your device, in this browser, and syncs nowhere:
- Recent files (full document text, for one-click reopen)IndexedDB, this browser only
- Saved JSON SchemaslocalStorage, this browser only
- JSONPath query historylocalStorage, this browser only
- Pinned tool shortcuts, theme, editor/format preferenceslocalStorage, this browser only
Every one of these has its own one-click clear (recent files, saved schemas, query history — each list has a Clear action), or wipe all of it at once from Settings → Privacy → Clear local data.
What analytics does and doesn't record
This site uses Google Analytics (GA4) for basic usage counts — which features get used, how often people hit a parse error. Every event below is metadata aboutyour document (a byte count, a line number, an enum label) — never its keys, values, paths, or content. This is the complete, current list; it's generated by hand from the same source file the app itself imports events from.
| Event | What it records |
|---|---|
| json_loaded | how the document arrived (paste/drop/recent/share/edit), its byte size, row count |
| json_parse_failed | how it arrived, its byte size, the line number the parse error occurred on |
| document_edited | byte size after the edit |
| feature_used | which feature (e.g. "minify", "repair", "convert") — an enum label, not its input/output |
| share_link_created | byte size of the document, length of the generated URL fragment |
| share_link_opened | length of the incoming URL fragment |
| compare_started | nothing beyond the event firing |
| compare_completed | count of changed rows in the diff |
| schema_validated | which JSON Schema draft, whether it passed, count of errors |
| jwt_decoded | whether the token decoded successfully — never the token itself |
| api_response_parsed | detected body kind (json/html/xml/text), the HTTP status code |
| jsonl_processed | total record count, valid record count |
| jsonpath_query_run | count of matches, whether it errored — never the expression or results |
| converted | which conversion target (e.g. "TypeScript"), its category (code/data) |
Source
This isn't a policy document written separately from the code — it describes lib/analytics.ts and workers/json.worker.ts as they actually are. The project is open source: read the code yourself. Built by devure.in.