Adopt the format — [email protected] · MIT · 27 vectors in CI
Make your app speak .curt.
The format is free — the move is yours. One afternoon of work buys your users a conversation file that never loses anything and never goes stale.
Why implement it
- Full fidelity — base64 images and tool calls ride in content, verbatim. No flattening, no “best effort”.
- Unknown fields survive a re-save. Your app's extras aren't a liability.
- One diffable UTF-8 file per conversation. Archives, version control, and grep all just work.
- MIT across the board — spec, reference code, schema, fixtures. (Curtis applications themselves are BUSL; the format never is.)
The path
Four steps. Conformance is testable at every one.
- Install.
npm i curt-format—serializeCurt,parseCurt,curtFilename. - Round-trip. Serialize a conversation, parse it back, confirm unknown fields survive. That's the L1 bar.
- Prove it. Run the conformance vectors — L1 CORE, L2 NAMED, L3 BULK, L4 per-extension. 27 vectors, plain fixtures, CI-runnable.
- Get listed. PR against
capabilities.json+CAPABILITIES.md: who you are, what you read/write, which extensions, conformance level. Public and checkable.
Registry status
Consumers, from capabilities.json (lastAudited 2026-10-17):
| id | role | read | write | conformance |
|---|---|---|---|---|
| curtis | Obsidian plugin — import, export, full-backup zip | yes | yes | none |
| curtis-ai-chat-porter | Converter (CLI + Obsidian plugin + web) | yes | yes | none |
| curtis-web | Chat app — export single .curt + bulk zip | no | yes | none |
| curtis-cloud | Shared library — import/export serialization | yes | yes | none |
| curtis-ai-tech | Docs/marketing + Porter web app with inline preview | yes | yes | none |
| tractum | Python SDK + MCP server — signed consensus decisions | yes | yes | none |
Six entries, one author. That's the honest score — the launch post doesn't pretend otherwise. First outside consumer sets the tone.
Extensions:
| extension | status | what it carries |
|---|---|---|
| images-inline | stable | base64 images in content, verbatim |
| usage-metadata | stable | tokens / usage per message |
| tool-linkage | draft | tool calls linked to their results |
| agent-context | draft | agent/system context alongside the thread |
| consensus-receipt | draft | signed consensus decisions (tractum, sole impl) |
Draft → stable requires two independent implementations. consensus-receipt needs one more.
Questions, answered
- Will the spec change under me? No. Core is frozen at v1. Evolution is registry-only.
- Who decides? One maintainer, BDFL. Deliberately — a format with six committees has no direction.
- What does draft mean for me? Emit it if you want; readers must reject unknown extensions cleanly, so nothing breaks.
- License? MIT — spec, implementation, schema, fixtures. Build a business on it if you like.