The format
Origami is an open format.
An Origami Fold is one self-contained .origami.html file — a document that carries its own renderer and plays in any browser, forever, with no app and no network. The file format is open and free for anyone to implement; the Origami software is proprietary. So your documents outlive any one tool — including ours.
One file
A document that is also its own app.
A browser plays a Fold on double-click — it carries its renderer inline, so recipients install nothing. It is inert by default: no network, no storage, no eval. The whole document is plain, inspectable HTML.
Anatomy
Four parts, in one file.
Manifest — a JSON block: id, title, fold order, per-fold metadata (kind, label, hidden, group), declared capabilities, theme, and the optional foldType and header. The single source of truth.
Folds — the content, as inert <template> elements (one per chunk). A template never executes until the renderer mounts it. A fold's id and kind are immutable.
Assets — an inline table of data-URIs: images and subsetted fonts, so the file carries everything it needs and never phones a CDN.
Engine — the base CSS, kind CSS, and the renderer (a small IIFE), healed to the current version on every save. Write your own renderer and you never need ours.
Shapes & blocks
A fold type, and a vocabulary of kinds.
A fold type sets the reading experience: deck (a card stage, one fold at a time, presentable — the default), scroll (a continuous A4 document), or ledger (data & calc). It's absent unless used, so a plain deck stays byte-identical.
Every fold has a kind whose schema is the markup contract for it. Data-driven kinds carry their data in one inert JSON block and are drawn by the renderer:
The unit of editing
Read → edit → write, one chunk at a time.
- List the chunksA table of contents: id, kind, label, hidden — in order. A chunk is one fold.
- Read a chunkA self-contained payload: the deck context, the kind's markup schema, and the fold's
<template>. - Edit the template innerThe fold's id and kind are immutable; a reply that targets a different id or kind is rejected as drift, never silently repaired.
- Write & saveApplied in memory, then written atomically. A save refuses to write a Fold that fails validation, and refuses to clobber a file that changed under you.
The most important rule
Inert by default — active behind a padlock.
No <template> inside fold content; <script> tags must balance. These would break the single-file structure, so they never apply.
A real script, style, iframe, form, inline on* handler, javascript: or remote URL still saves — but the Fold is marked active, and a recipient opens it behind a padlock until they trust it.
The one inert exception — and how data-driven blocks ship — is a JSON data block, a byte-exact opener the renderer reads but the document never executes:
<script type="application/json" data-odata="KIND">…JSON…</script>
Built for agents
An AI can author a Fold having never seen one.
Because the format is open and self-describing, an AI edits the file directly — no export step, no running app to reach into. One origami_guide() call over the model-context protocol returns the entire contract — every kind's schema, the inert/active rules, the read-edit-write loop — assembled from the live format constants, so it can never drift from the spec. Point an MCP client at a folder and the agent authors Folds in it.
And because edits are staged and reviewable, a human approves a per-chunk diff before anything lands — the AI proposes, you accept.
The openness pledge
Open format. Proprietary software. Your files are yours.
You may freely read, write, parse, and build software that creates or opens .origami.html files — for any purpose, commercial or not, with no licence fee, royalty, or permission required. This specification is published under CC BY 4.0. Build your own renderer or tooling against it — that's the point.
The Origami apps — the Studio, desktop app, browser extension, and the bundled runtime — are proprietary, all rights reserved. The open format means you're never locked into them; it doesn't make their source free to copy.
And whatever you make is yours. Your .origami.html files are your content — yours to keep, share, sell, and open in any conforming tool, ours or anyone's. That's the promise an open format makes that a proprietary blob can't.
Download a Fold to inspectRead the full spec on GitHubHow it works
Versioning
A generation, not semver.
FORMAT_VERSION is an integer generation. The same generation reads and writes; a newer one opens read-only; an older one migrates forward. It bumps only on a breaking change — new optional constructs are absent when unused, so a Fold that doesn't use them stays byte-identical. Additive changes don't bump the version.