Local-first. No upload. No tracking.
Birdor JSON Lens
Local-first JSON reader
Chrome extension / local JSON reader

Open JSON without leaving the tab.

Render page responses after a click, paste broken payloads into Scratchpad, copy exact paths, and compare two bodies locally.

  • Explicit tab access
  • Local scratchpad
  • No request capture
api.localhost.dev/orders/472?format=json
Current page response
Local JSON tree
tree
01{
02"source": "current_page"
02"upload": false
02"view": "tree"
02"items": 47
02"paths": ['$.data[0].id']
01}

JSON Lens is shaped around API responses, copied payloads, manifests, config files, and structured logs.

Source surfaces

Four entry points, all started by the user.

The extension does not watch the network. It starts from concrete actions: a popup click, a paste, a selection, or a local file.

01

Current page JSON

Click Render in the popup when a tab already contains a JSON response. The renderer is injected into that active tab for that action.

activeTab
02

Pasted snippets

Paste a copied response body into Scratchpad to validate, format, inspect escaped strings, or compare it against another body.

Scratchpad
03

Selected text

Highlight text on a page, then send it to the local reader through the context menu. The selection is not kept as browsing history.

contextMenus
04

Local .json files

Open a local `.json` file in the same tree, path-copy, search, and large-document safety workflow.

file input
Shared product engine

The landing page now runs the same JSON analysis core.

This sample is parsed during static rendering with the extracted JSON Lens core package: API errors, trace signals, paths, and smart values come from the same web-safe code the extension uses.

Sample API response

JSON
{
  "ok": false,
  "status": 429,
  "trace_id": "trace_01JY_RATE_LIMIT",
  "retry_after": "2026-05-27T12:30:00Z",
  "docs": "https://api.example.com/docs/errors#rate-limit",
  "error": {
    "code": "RATE_LIMIT",
    "message": "Too many requests for this workspace",
    "details": [
      {
        "field": "workspace.id",
        "message": "Burst limit exceeded"
      }
    ]
  }
}

Error lens

429

Finding path

$

API signals

  • Trace ID: trace_01JY_RATE_LIMIT
  • Retry after: 2026-05-27T12:30:00Z
  • Error code: RATE_LIMIT

Smart values

  • retry_after: iso-date
  • docs: url
Workflow proof

Screenshots from actual reader states.

The store sequence shows the shipped surfaces: document-aware tree view, path copy menus, parse diagnostics, large payload safety, and local compare.

Document-aware JSON tree view

Recognize OpenAPI- or schema-shaped JSON locally, then navigate it in the same searchable tree viewer.

JSON Lens screenshot showing a document-aware tree view for an OpenAPI-style JSON file.

Real store screenshot. Use it as product proof, not decoration.

Core workflows

Small tools for the annoying parts of JSON work.

JSON Lens is not an API client and not a cloud workspace. It handles the moments when a response, config file, or copied payload needs to become readable before you continue debugging.

Tree

Find the field without opening every branch

Search keys, values, and paths in the tree so a nested response can be inspected like a document, not unfolded one triangle at a time.

Path

Copy the path format your next step expects

Grab dot path, JSONPath, jq, lodash path, key, value, or subtree directly from the selected node.

03

Explain broken input at the scratchpad

Parse

Invalid JSON reports stay close to the pasted text, with escaped JSON strings opened as readable nested structure.

04

Compare two payloads before filing a bug

Diff

Paste the before and after bodies, then review changed paths locally without adding a remote diff service.

05

Keep large arrays from freezing the reader

Large

Safe mode and progressive reveal make oversized payloads navigable when a naive tree view would stall.

06

Recognize values developers actually inspect

Hints

Timestamps, URLs, JWTs, UUIDs, colors, and document-shaped payloads get small hints where they appear.

Trust layer

Permission clarity is a first-class part of the app contract.

The extension only asks for permissions that support explicit local JSON workflows, and the non-requested sensitive permissions matter just as much as the requested ones.

Requested

storage

Used only for user preferences such as theme, density, and large-JSON settings. JSON content itself is never stored in Chrome storage.

contextMenus

Adds explicit right-click actions for selected text. The selected content is held in service-worker memory only long enough to pass it into the local Scratchpad.

activeTab

Used only after the user clicks Render current page. Access is temporary and tied to that explicit action.

scripting

Injects the packaged local renderer into the active tab. Non-JSON pages are left unchanged and there is no request monitoring.

Not requested

webRequest

No network interception, no response history capture, and no request inspection layer.

cookies

The extension does not read or store cookies.

history

Browsing history is not captured or stored.

tabs

No broad tab inventory or persistent cross-tab monitoring is requested.

<all_urls>

There are no persistent host permissions. Current-page rendering uses temporary access after an explicit click only.

JSON processed locallyNo analyticsNo account requiredNo request bodies captured

JSON Lens does not upload JSON content, does not read cookies, does not capture request headers or bodies, and does not include analytics or tracking scripts. The dedicated permissions page expands the same boundaries in longer form.

FAQ

Trust checks before a browser extension touches JSON.

Short answers for the risks that matter: uploads, permissions, page injection, and large payload behavior.

Does JSON Lens upload page JSON or pasted content?

No. Current-page JSON, pasted snippets, selected text, and local files are processed in the browser. The extension does not include analytics scripts or a remote JSON processing service.

Does it inject itself into every page automatically?

No. Current-page rendering happens after the popup action. Context-menu flows also start from an explicit selection action.

Can JSON Lens handle large payloads?

Yes. Large JSON safe mode and progressive rendering are designed for documents that would overwhelm a simple fully-expanded tree.

Why does the extension need activeTab and scripting?

Those permissions work together only after Render current page is clicked. Chrome grants temporary access to the active tab, then the packaged local renderer is injected into that tab.

Is JSON Lens trying to replace API clients or DevTools?

No. It is a reader for JSON you already have in front of you: responses, copied bodies, selected text, local files, and compare scratchpads.

Install the reader for the JSON already on your screen.

Use it for current responses, copied payloads, selected text, local files, path copying, diagnostics, and local compare work.

The docs and permissions pages describe the same extension contract shown here: explicit actions, local processing, no request interception.