.curt is an open, single-file format for AI chat conversations: one file,
one conversation, full fidelity (images and tool calls ride verbatim). Born in
Curtis AI Chat, specified
here so any app can read and write it.
Spec site → — served by Cloudflare Pages
(dotcurt-site project). Pushes deploy via
.github/workflows/deploy-site.yml:
main → production, other branches → previews; or run
wrangler pages deploy site --project-name=dotcurt-site by hand.
- SPEC.md — the normative spec
- src/index.ts — reference implementation (TypeScript, zero dependencies, MIT)
- schema/curt-v1.schema.json — non-normative JSON Schema for tooling
- tests/fixtures/ — round-trip test vectors
npm install curt-formatimport { serializeCurt, parseCurt } from 'curt-format';
const body = serializeCurt(conversation, 'my-app@1.0.0');
const back = parseCurt(body); // CurtConversation | null — null means invalidBeyond the parse/serialize pair: isCurtMessage and isCurtConversation are
the spec's validation predicates as type guards, curtFilename(conversation)
builds the recommended "<date> <slug> <suffix>.curt" name from the
immutable fields, and CURT_MAGIC/CURT_VERSION expose the envelope
constants. Parsing tolerates a single leading UTF-8 BOM and preserves unknown
fields verbatim.
For non-TypeScript validators, the JSON Schema ships with the package:
curt-format/schema/curt-v1.schema.json
- Curtis AI Chat — origin, read + write
See CAPABILITIES.md for the full ecosystem tracker — who
reads and writes .curt, which spec revision each implementation carries,
and where conformance has drifted. Audited 2026-10-14.
PRs welcome for bindings in other languages; keep src/index.ts and SPEC.md
in lockstep.
Implementations are graded against executable vectors in conformance/ — L1 CORE (must), L2 NAMED, L3 BULK, L4 per-extension. The registry of optional capabilities is EXTENSIONS.md. Ecosystem status: capabilities.json.
MIT — see LICENSE. The spec, reference implementation, schema, and fixtures are free to use, fork, and build on. The Curtis applications (plugin, Porter, web, cloud) are separate works under BUSL-1.1; this standard is not.