Status: Last Call · Date: 2026-07-17 · Editors: Untilum project — hello@untilum.com
Part of the TSP RFC series; see the series index for the Last Call window and how to comment. The key words MUST, MUST NOT, SHOULD, SHOULD NOT, and MAY in this document are to be interpreted as described in BCP 14 [RFC 2119] [RFC 8174] when, and only when, they appear in all capitals.
This document requires every capsule-creating application to deliver one and the same file format — the UDDP container — and to form it byte-identically across implementations. It specifies the pinned opener-template mechanism that makes cross-implementation identity achievable despite compiled-bundle irreproducibility, and the conformance rules F1–F5 that keep the guarantee testable in CI.
Every application that creates capsules — the web app, the desktop application, the
CLIs, the SDKs, third-party tools — MUST hand the user one and the same file
format: the UDDP container (normative wire format:
uddp-v1.md). A capsule is a 50–100 year promise; the file the
user archives must not depend on which of our applications produced it, because by
opening day none of them may exist. One format means one set of recovery
instructions, one opener, one thing for archives and heirs to recognize.
A bare capsule.json remains the normative protocol artifact (RFC-0009;
uddp-v1.md §1.2) and implementations MAY additionally expose it for
interoperability and debugging — but the default deliverable to an end user is the
container: capsule + embedded opener + instructions + specifications, in one file.
It is not enough that every application emits a UDDP file; they MUST emit the
same UDDP file. For one capsule document (identical capsule.json bytes), one
embedded beacon, and one opener-template version, every conforming generator —
TypeScript, Rust, or independent — MUST produce a byte-identical container.
Why this is a protocol requirement and not a nicety:
uddp-v1.md §8.2 real across the ecosystem: anyone can regenerate a
suspect container with any conforming implementation and diff it.SHA-256(container_A) == SHA-256(container_B)), which keeps the
guarantee from silently rotting.The only part of a container an implementation cannot independently reproduce is
OPEN-ME.html: it embeds a compiled JavaScript bundle, and byte-identical bundles
cannot be rebuilt from source across toolchains. Therefore:
OPEN-ME.html with defined placeholders (title, unlock
date, round, the capsule block, the runtime config) instead of capsule data.OPEN-ME.html rule of
uddp-v1.md §4 (self-containment, pinned-key verification, KAT self-test,
emergency appendix). A new template version is a normal artifact release:
reviewed, hashed, changelogged.capsule.json bytes at all (uddp-v1.md §1.2).manifest.json already hashes OPEN-ME.html, which pins it implicitly).uddp-v1.md (normative).capsule-v1.md /
tsp-v1.md; this RFC adds no capsule fields.Byte-identical formation (F2) is a tamper-evidence mechanism: any conforming implementation can regenerate a suspect container and diff it, so a modified container cannot hide among legitimate variation — there is none. The pinned opener template is the counterpart supply-chain control (RFC-0002 §T8): implementations substitute placeholders and never rebuild the template, so a single reviewed, hashed artifact — carrying its own KAT self-test — is what every user receives, and F3’s no-modification rule keeps generators from becoming silent template editors.
../spec/uddp-v1.md.../spec/capsule-v1.md.../spec/tsp-v1.md.Untilum project — Editors of the TSP RFC series Email: hello@untilum.com · Issues: https://github.com/untilum/protocol/issues
| Date | Status | Change |
|---|---|---|
| 2026-07-14 | Draft | Initial version. |
| 2026-07-17 | Last Call | Publication pass: BCP 14 boilerplate, Abstract, Security Considerations, References, Revision History added; no normative changes. Entered Last Call per RFC-0008 §4. |