A JSON IDE built for files the rest of your tools choke on.
Open multi-gigabyte documents instantly. Navigate as a tree, code, table, or node graph.
Diff, search, filter, generate types, validate against schemas — all locally, nothing leaves your machine.
Website · Installation · Features · Docs · Build · Report issue
Most JSON editors hit a wall around 50–100 MB — the tab freezes, the scrollbar dies, "expand all" never finishes. Pandia's document model lives in Rust with a lazy parser that keeps the UI responsive on multi-gigabyte files. Everything you need to interrogate a JSON document — open, browse, search, diff, validate, transform — lives in one window. No popups. No network round-trips. No telemetry.
- Lazy parsing above 10 MB. Children parsed on demand; a root-array offset index gives O(slice) random access regardless of file size.
- Big-number safe. Snowflake IDs, BigQuery int64s, Stripe IDs, nanosecond timestamps — preserved literally, never coerced through
f64. - Multi-format detect on paste. JSON · JSONL · NDJSON · JSONC · JSON5 · GeoJSON · YAML · XML · CSV · cURL — pick the right one automatically.
- Repair broken JSON. Trailing commas, unquoted keys, single quotes, comments, BOMs, JSONP wrappers, unterminated strings — fixed before the editor gives up on you.
| View | What it's for |
|---|---|
| Tree | Virtualised, click-to-menu editing, indentation guides, path breadcrumb, jump-to-anywhere |
| Code | CodeMirror 6 with syntax highlighting, fold/unfold, inline find / replace |
| Grid | Homogeneous arrays as a spreadsheet — column filters, sort, multi-row select, type-aware cells |
| Graph | Node-link visualisation with click-through to tree; export PNG · JPEG · SVG |
- Split-canvas diff against another open tab or any file on disk.
- Three modes: side-by-side, unified inline, tree-with-highlights.
- Sync scroll, jump-to-next-change, 50-line LCS chunking so even gigabyte-scale diffs stay navigable.
One click, nine targets:
TypeScript · Zod · Go · Rust · Kotlin · Python · PHP · Java · JSON Schema
Inline JSON Schema validation against draft-07 and 2020-12. Debounce is user-tunable: immediate, 250 ms, 500 ms, 1 s, 2 s, or manual.
100% local. No telemetry. No cloud sync. No account. Preferences and per-document state live in plain-store files in your OS app-data directory; nothing leaves the machine.
Download the latest version for your platform from releases:
| Chip | Download |
|---|---|
| Apple Silicon (M1 / M2 / M3 / M4 / M5 and newer) | Pandia_1.0.2_aarch64.dmg |
| Intel | Pandia_1.0.2_x64.dmg |
The macOS bundle is signed and notarised.
| Type | Download |
|---|---|
| Installer | Pandia_1.0.2_x64-setup.exe |
| MSI | Pandia_1.0.2_x64_en-US.msi |
| Format | Download |
|---|---|
| AppImage | Pandia_1.0.2_amd64.AppImage |
| Debian / Ubuntu | Pandia_1.0.2_amd64.deb |
Linux bundles are GPG-signed; the public key is published with each release.
System requirements: macOS 10.15+, Windows 10+ (64-bit), Ubuntu 22.04+ / Fedora 38+ (or any glibc 2.35+ distro with WebKitGTK 4.1).
- Launch Pandia.
- Drag a JSON file onto the canvas — or paste / fetch by URL from the empty state.
- Switch between Tree · Code · Grid · Graph from the top bar (
⌘1…⌘4). - Press
⌘Kfor the command palette. Every action is reachable from there.
⌘K |
Command palette |
⌘O |
Open file |
⌘T / ⌘W |
New tab / Close tab |
⌘⇧] / ⌘⇧[ |
Next / previous tab |
⌘F |
Find |
⌘G / ⌘⇧G |
Find next / previous |
⌘H |
Find and replace |
⌘D |
Compare against tab or file |
⌘B |
Toggle sidebar |
⌘S / ⌘⇧S |
Save / Save As |
⌘E |
Export |
⌘Z / ⌘⇧Z |
Undo / Redo |
⌘1 / ⌘2 / ⌘3 / ⌘4 |
Tree / Code / Grid / Graph |
⌘⇧V |
Validate JSON |
⌘/ |
Keyboard shortcuts |
⌘, |
Settings |
Use Ctrl on Linux / Windows.
The pitch in one paragraph: the document lives in Rust. The UI renders slices of it.
| Rust owns | UI owns |
|---|---|
| Parsed document, one per tab, addressed by handle | Expansion state, selection, scroll position |
| All structural ops (set · insert · delete · sort · move) | Current edit-in-progress buffer until commit |
| Query · diff · repair · validate · typegen · format · export | Active search query, current match index |
| Search indexing and execution | Layout, theme, panel and sidebar visibility |
| Undo / redo (op log, per tab, 500-op cap) | Tab list and active-tab indicator |
| Document version counter | — |
Anything that's where the user is looking stays in Svelte. Anything that's what the document is lives in Rust.
| Size | Behaviour |
|---|---|
| < 10 MB | Eager parse — full feature set |
| 10 MB – 200 MB | Lazy mode — full feature set |
| 200 MB – GB | Lazy mode — browse, search, diff, export; whole-document edit / validate disabled |
| > 2 GB | Refused in v1 — streaming view planned for v1.x |
| Layer | Technology |
|---|---|
| Frontend | Svelte 5 (runes) · SvelteKit · TypeScript |
| Backend | Rust · Tauri 2 |
| JSON parser | sonic-rs (lazy mode) with serde_json fallback |
| Code view | CodeMirror 6 |
| Schema validation | jsonschema |
| Concurrency | parking_lot · dashmap |
| Build | Vite |
| Docs site | Astro |
| Bundle size | < 500 KB gzipped JS |
- Node.js LTS — nodejs.org
- Rust stable —
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh - Tauri 2 system prerequisites — see tauri.app/start/prerequisites
macOS
xcode-select --installWindows
Install Visual Studio Build Tools with the "C++ build tools" workload, plus WebView2 (preinstalled on Windows 11).
Linux (Ubuntu / Debian)
sudo apt update
sudo apt install -y \
libwebkit2gtk-4.1-dev libappindicator3-dev librsvg2-dev patchelf \
build-essential curl wget file libssl-dev libgtk-3-devgit clone https://github.com/hendurhance/pandia
cd pandia
npm ci
npm run tauri dev # development build, hot-reload
npm run tauri build # release build for the current platform# Frontend
npm run check # svelte-check (TypeScript)
npm run lint # eslint
npm run format:check # prettier
npm run test # vitest
# Backend
cd src-tauri
cargo test --lib # rust unit tests
cargo fmt --check # rustfmt
cargo clippy --all-targetsCI runs all of the above on every push to main and every pull request.
pandia/
├── src/ SvelteKit frontend
│ ├── lib/
│ │ ├── docpane/ per-tab editor shell
│ │ ├── views/{tree,code,grid,graph,compare}/ the four lenses + diff
│ │ ├── shell/ app shell, tab store, menu, status bar
│ │ ├── panels/ sidebar tabs (outline, schema, types, history)
│ │ ├── settings/ settings route + per-panel state
│ │ ├── find/ find / replace controller
│ │ ├── palette/ command palette
│ │ ├── ipc/ typed wrappers around Tauri commands
│ │ └── util/ shared utilities
│ └── routes/ SvelteKit routes (single SPA shell)
├── src-tauri/
│ └── src/
│ ├── doc/ document model, ops, lazy parser
│ ├── commands.rs Tauri command surface
│ └── lib.rs Tauri app setup, menus, file associations
└── website/ marketing + docs (separate Astro project)
Want to read the code? Start here:
src-tauri/src/doc/document.rs— the document model and size-tier behaviourssrc-tauri/src/doc/lazy.rs— the lazy parser and slice protocolsrc/lib/docpane/components/DocPane.svelte— the per-tab editorsrc/lib/shell/components/AppShell.svelte— the application shell
- Drag-to-reorder tree nodes
- File watcher for auto-reload on disk change
- Schema-driven autocomplete in tree edits
- Op-log crash recovery (currently snapshot-based)
- Optional JSONPath / jq-style expression bar
- Batch operations mode
- Streaming view for files > 1 GB
Not currently scoped. Open an issue if you have a request.
See open issues for what's being worked on now.
Pull requests and bug reports are welcome. For non-trivial changes, please open an issue first to discuss the approach.
Before opening a PR:
- All Rust code passes
cargo fmt,cargo clippy --all-targets, andcargo test. - All frontend code passes
npm run check,npm run lint,npm run format:check, andnpm run test. - PR titles should read like a release-note line.
See CONTRIBUTING.md for the full guide.
Pandia is licensed under the Apache License 2.0.
Pandia stands on the shoulders of giants. Particular thanks to:
- Tauri — makes this a real desktop app, not an Electron box
- Svelte — runes made the reactive controllers in
src/lib/**/state/*.svelte.tsactually pleasant to write - SvelteKit — the SPA scaffolding
sonic-rs— the lazy parser doing the heavy liftingserde_json— the fallback eager parserjsonschema— JSON Schema validationjaq— jq engine reference for future query support
- CodeMirror 6 — the code view foundation
@lucide/svelte— icon set
- jsoneditoronline.org by Jos de Jong — the reference target for tree-mode interactions
jsonrepairby Jos de Jong — algorithm reference for the Rust port
- IBM Plex Mono, plus bundled Cascadia Code, Fira Code, Geist Mono, JetBrains Mono, DM Mono, Inconsolata, Roboto Mono, Source Code Pro, Space Mono, Ubuntu Mono, Victor Mono — via the
@fontsourcepackages.
Made by hendurhance · pandia.app