Edit in place
Double-click any paragraph, heading, list item, table cell, image — inline editor opens for that element only. Enter commits. Auto-saves to disk in 150ms.
Beautiful pages. Editable in any text editor. Diffable in git. Generated with one line of code. Searchable with grep. Validatable with a JSON Schema. Embeddable on any web page. Read more in less time: one file, every tool already speaks it.
brew tap uurtech/jdf<jdf src="...">npx @uurtech/jdf-cliLinux, Windows, and Intel Macs: grab a build from the latest release.
It's JSON. Every consequence below falls out of that.
JSON is the language LLMs already speak. No PDF parsing, no broken columns, no lost tables. Hand a .jdf to GPT or Claude and it sees the structure exactly as you wrote it. More →
cat, grep, jq, VS Code, every linter, every diff tool. No plugin, no learning curve.
git diff is realChange one heading, the diff is one line. Documents review the same way as code.
JSON.stringify(doc). No PDF library, no font dictionaries, no encoding rules.
Autocomplete in your editor. CLI validation in CI. Type-safe generation.
grep "TODO" *.jdf works. jq queries pull every table cell on the page.
Opens the same way today and in 20 years. JSON has no proprietary owner.
{
"$jdf": "1.0.0",
"meta": { "title": "Hello", "pageSize": "A4" },
"styles": {
"h1": { "fontSize": 22, "fontWeight": "bold" }
},
"pages": [{
"elements": [
{ "type": "text", "content": "Hello, JDF",
"heading": 1, "style": "h1",
"position": { "x": 0, "y": 5 },
"width": 166 },
{ "type": "list", "listType": "unordered",
"items": [
{ "content": "Just JSON" },
{ "content": "Diffable" },
{ "content": "Editable anywhere" }
],
"position": { "x": 0, "y": 25 }, "width": 166 }
]
}]
}
Double-click any paragraph, heading, list item, table cell, image — inline editor opens for that element only. Enter commits. Auto-saves to disk in 150ms.
Mouse over any element → floating bar appears with ↑ Move up · ↓ Move down · ⧉ Duplicate · × Delete. No right-click, no menu hunting.
Insert bar at the top of every page. Click to add: text, rich text, list, table, shape, image, collapsible section, auto-generated TOC.
Toggle View ↔ JSON. Two-way bound. Edit JSON directly with Cmd+S — visual render follows. Edit visually — JSON updates live.
Drag a PDF on the viewer. Every text run keeps its position, font, weight, color, opacity, link. Embedded images extracted. Vector shapes (rect/line/path) preserved with fills and strokes. Looks identical to the original — and it's editable.
Round-trip back to .pdf. Honors page size, orientation, text colors, real TOC, embedded images. Renders text/list/table/collapsible/shape.
Open .md for a continuous-scroll, GitHub-style render with full GFM. Toggle to paged JDF view. Cmd+F highlights matches inline.
⌘Z · ⌘⇧Z — 100-step history covering every text edit, structural change, and JSON commit. ⌘N for a new window — compare two documents side-by-side.
Draft-07 schema. jdf validate file.jdf reports path-level errors with Ajv. CI on three OSes (macOS, Linux, Windows) on every PR.
git diffJSON.stringify(doc)grep, jq, ripgrepEvery JDF document has these top-level fields:
| Field | Required | What it does |
|---|---|---|
$jdf | yes | Format version (semver) |
meta | yes | title, author, page size, margins, language |
styles | no | Reusable named style definitions |
resources | no | Embedded fonts and base64 images |
header · footer | no | Repeating header/footer with template vars or full element trees |
pages | yes | Array of pages, each with its own elements |
Element types: text (with heading 1-6), richtext, image, table, list, shape, collapsible, toc.
Full schema: spec/jdf-schema.json ·
Working example: hello-world.jdf.
brew tap uurtech/jdf
brew install jdf
Upgrade later with brew upgrade --cask jdf.
Grab a build from the latest release — .deb, .AppImage, .rpm, .msi, .exe all built by GitHub Actions on every tag.
git clone https://github.com/uurtech/jdf.git
cd jdf
pnpm install
pnpm tauri build
Requires Node 20+, pnpm 9+, Rust stable.