Skip to content

hendurhance/pandia

Repository files navigation

Pandia

Pandia

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.

Latest release License Downloads

Website · Installation · Features · Docs · Build · Report issue


Why Pandia

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.

Features

Open anything, at any size

  • 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.

Four lenses on the same document

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

Compare and contrast

  • 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.

Generate types

One click, nine targets:

TypeScript · Zod · Go · Rust · Kotlin · Python · PHP · Java · JSON Schema

Validate against schemas

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.

Privacy-first by design

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.

Installation

Download the latest version for your platform from releases:

macOS

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.

Windows

Type Download
Installer Pandia_1.0.2_x64-setup.exe
MSI Pandia_1.0.2_x64_en-US.msi

Linux

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).

Quick start

  1. Launch Pandia.
  2. Drag a JSON file onto the canvas — or paste / fetch by URL from the empty state.
  3. Switch between Tree · Code · Grid · Graph from the top bar (⌘1⌘4).
  4. Press ⌘K for the command palette. Every action is reachable from there.

Keyboard reference

⌘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.

Architecture at a glance

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.

File-size tiers

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

Tech stack

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

Building from source

Prerequisites

macOS
xcode-select --install
Windows

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-dev

Setup

git 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

Useful commands

# 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-targets

CI runs all of the above on every push to main and every pull request.

Project layout

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 behaviours
  • src-tauri/src/doc/lazy.rs — the lazy parser and slice protocol
  • src/lib/docpane/components/DocPane.svelte — the per-tab editor
  • src/lib/shell/components/AppShell.svelte — the application shell

Roadmap

v1.x

  • 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

v2

Not currently scoped. Open an issue if you have a request.

See open issues for what's being worked on now.

Contributing

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, and cargo test.
  • All frontend code passes npm run check, npm run lint, npm run format:check, and npm run test.
  • PR titles should read like a release-note line.

See CONTRIBUTING.md for the full guide.

License

Pandia is licensed under the Apache License 2.0.

Acknowledgments

Pandia stands on the shoulders of giants. Particular thanks to:

Runtime and framework

  • Tauri — makes this a real desktop app, not an Electron box
  • Svelte — runes made the reactive controllers in src/lib/**/state/*.svelte.ts actually pleasant to write
  • SvelteKit — the SPA scaffolding

JSON processing

  • sonic-rs — the lazy parser doing the heavy lifting
  • serde_json — the fallback eager parser
  • jsonschema — JSON Schema validation
  • jaq — jq engine reference for future query support

Editing

Reference and inspiration

  • jsoneditoronline.org by Jos de Jong — the reference target for tree-mode interactions
  • jsonrepair by Jos de Jong — algorithm reference for the Rust port

Typography

  • 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 @fontsource packages.

Made by hendurhance · pandia.app

About

A powerful, open-source JSON visualization and editing tool for developers

Topics

Resources

License

Contributing

Stars

Watchers

Forks

Packages

 
 
 

Contributors