Technical overview
CTP is the Capsule Transport Protocol — a communication system in which a message is not data to be decrypted but a small executable machine that carries its own decryption logic, opens only for the session it was sealed to, renders its content once, erases itself, and leaves nothing behind to store, subpoena, or decrypt later.
Every secure communication system in use today shares one structural property: at some point, on some machine, the data must be decrypted. TLS encrypts data in transit and decrypts it at both ends. End-to-end messengers encrypt the message and then hold the plaintext in application memory, in caches, in notification payloads and in backups. Hardware enclaves confine execution but require specific hardware. None of these eliminate the moment of opening — they shorten it.
They also leave something behind. Ciphertext is durable. It sits in transit logs, on relay disks and in the capture files of anyone who was listening, available for offline analysis indefinitely — which is what makes harvest now, decrypt later a coherent strategy rather than a slogan.
CTP takes a different position: the window should not be minimised, it should be structurally unavailable — and there should be nothing left to work on afterwards. A CTP message is an executable binary. It arrives as noise, runs inside a sandbox that has no access to the host, renders its content once, overwrites its own memory and ceases to exist. The receiver holds no decryptor for your message; the message carries its own.
Two properties are load-bearing, and both are measurable rather than aspirational. Non-algorithmic output: the capsule body carries no version byte, no type field and no identity — nothing an observer can key on, and nothing to identify as ciphertext in the first place. The frame that routes it carries a token that means nothing outside the session it belongs to. Temporal finitude: every capsule carries its own expiry and every buffer is overwritten within the same execution tick, so the ciphertext an adversary would need does not survive long enough to be attacked.
This document is in two parts. Part one describes the system in operational terms — what it does and what changes once it is in place. Part two documents the internal mechanisms across seven reference figures: the capsule assembly, the encryption stack, the execution lifecycle, the capsule chain, blind routing, hybrid post-quantum key establishment, and zero-knowledge validation of the wire itself.
In operational terms, for readers concerned with what the system changes rather than how it is built.
Conventional encryption produces ciphertext: structured, algorithmic data that persists. It has a header. It has a length that correlates with what it carries. It sits on a relay, in a backup, or in an intercept archive, and it waits — because the one resource an attacker reliably has is time, and the one thing the maths cannot take away is the copy they already hold.
The second failure is quieter. Even when the content holds, the pattern leaks: who spoke to whom, at what time, how often, and how much. For a large class of adversaries that metadata is the intelligence product, and no amount of payload encryption touches it.
CTP replaces the unit of transmission. Instead of sending information that must be protected, it sends a small self-contained machine that carries the information inside it, opens for exactly one session, and then destroys itself.
A capsule is not a file and cannot be saved as one. It is a compiled program that contains four things: the payload, the logic to unlock it, a tag proving nothing in it was altered in transit, and a rule about when it must die. It executes, calls back once with the rendered content, and wipes every buffer it touched. What the user sees is an ordinary message thread. What exists afterwards is nothing.
Everything larger than a few kilobytes — a voice note, a video clip, a long message — is not one large capsule but a chain of small ones. Each link is sealed, authenticated and executable on its own, and the fact that the links belong together is itself encrypted — so a captured chunk announces neither what it is part of nor how much else there is.
No message store, no local database, no history to export. Content exists in memory for the duration of one render and is overwritten immediately afterwards. A device seized a day later yields nothing, because there is nothing on it to yield.
The relay sees an opaque blob and a routing token derived per session. It never sees a public key, a name, a message type, or whether two blobs belong to the same conversation. Because the salt that produces those tokens is fresh per session, a relay that logged everything could not join this conversation to the last one.
Every key descends from a single established root under its own label — capsule, authentication, envelope, media. No password is chosen by a person and no key serves two purposes, so what a compromise would cost is a bounded and stated quantity rather than an open question.
Recording the wire gives an adversary bytes that are statistically indistinguishable from noise and a plaintext that no longer exists anywhere. Key establishment is additionally hybridised with a post-quantum primitive, so the recording does not become valuable when the hardware improves.
It is a transport protocol with an unusually strict definition of delivery: the content is rendered exactly once, on exactly one device, and then it is gone.
Seven figures documenting the mechanisms, with commentary on the property each is designed to hold — and, where it matters, on the property it is not designed to hold.
A stack diagram that draws five identical boxes invites a reader to count five independent barriers. That would misdescribe this design, so the sheet distinguishes them by line weight instead.
The chain is not a performance optimisation. It exists so that the shape of a transmission carries no information about its content.
Recording encrypted traffic today in order to decrypt it later is not a hypothetical; it is a strategy with a name and a budget. A key exchange that rests on the discrete logarithm alone is scheduled to fall, and the recording is what makes that schedule matter.
CTP exists as two implementations of one protocol. They are not interchangeable, and a claim true of one is not automatically true of the other.
Capsule One is the native client: a Rust workspace of nine crates plus a tenth artefact that is never linked into the application and only ever transmitted inside its messages. It is the implementation the figures describe. The web client is the original reference implementation and the origin of the capsule format, which the two share byte for byte; it runs on fixed demonstration keys and should be read as a demonstration of the format, not as a deployment.
| Mechanism | Capsule One — native | Web reference client |
|---|---|---|
| Capsule binary format | Shipped | Shipped — byte-identical, and normative for the format |
| Carried runtime, executed | Shipped — 162,162 bytes, no host imports, run under Wasmtime | Carried and hash-checked; execution runs the JavaScript reference path |
| Envelope and capsule authentication | Shipped | Shipped |
| Multi-pass memory zeroing | Shipped — four writes, volatile | Shipped in the host; single pass in the carried runtime |
| Hybrid X25519 + ML-KEM-768 | Shipped and cross-verified against the TypeScript implementation | Implemented in the core library; not yet wired into the client |
| Blind routing | Shipped — v2 tokens, random per-launch salt, no identity on disk | Fixed demonstration salt — tokens do not vary, by design of the demo |
| Capsule chain, 4 KB units | Defined; the native client sends fixed-length frames instead | In use for text, audio and video |
| Rekey ratchet every 100 capsules | Specified, counted, not yet driven | Not present |
| Inspectrum grading | Shipped as instrumentation, both directions | Shipped as instrumentation, both directions |
| Audio and video | Shipped — one authenticated-encryption layer from the root, a deliberate trade for real-time budgets | Shipped through the full DX/C path |
| Distribution | Signed with a Developer ID and hardened; packaging and notarisation outstanding | Development server only |
Verification is by test and by cross-implementation agreement rather than by external audit: over 350 tests run by default in the native workspace, twelve fuzz targets, and a set of vectors on which the Rust and TypeScript implementations must produce byte-identical encapsulation keys, ciphertexts, shared secrets, transcript hashes and roots. No part of this has been through third-party cryptographic review, and the fractal transform in particular has never been published for it.
| Ref. | Component | Sheet |
|---|---|---|
| 10 | Message, written by a person | A |
| 20 | Capsule — executable binary | A |
| 30 | Wire format — unstructured body | A |
| 40 | Relay — blind token routing | A |
| 50 | Sandboxed execution | A |
| 60 | Single render window | A |
| 70 | Multi-pass memory wipe | A |
| 80 | Terminal state — no residue | A |
| 100 | Envelope IV, 12 B | 1 |
| 102 | Envelope ciphertext — the entire capsule | 1 |
| 104 | Polymorphic nonce, 32 B | 1 |
| 106 | Runtime hash, SHA-256 | 1 |
| 108 | Carried WASM capsule runtime | 1, 3 |
| 110 | Capsule data — instruction data for the runtime | 1 |
| 112 | Capsule header, 26 B | 1 |
| 114 | DX/C encrypted payload | 1, 2 |
| 116 | HMAC-SHA-256, 32 B | 1, 2 |
| 118 | DX/C field layout — salt, IV, ephemeral keys | 1 |
| 120 | Stream header, 25 B | 1, 4 |
| 122 | Chunk data, ≤ 4071 B | 1, 4 |
| 200 | Plaintext | 2 |
| 202 | Layer 1 — fractal diffusion (keyless) | 2 |
| 204 | Layer 2 — AES-256-GCM (key barrier) | 2 |
| 206 | Layer 3 — ECC packing (structural) | 2 |
| 208 | Layer 4 — HMAC-SHA-256 (integrity) | 2 |
| 210 | Layer 5 — envelope AES-256-GCM (key barrier) | 2 |
| 300 | Envelope decryption stage | 3 |
| 302 | Unpack and runtime-hash validation | 3 |
| 304 | Authentication and TTL enforcement | 3 |
| 306 | Sandboxed execution boundary | 3 |
| 308 | Render callback — the single window | 3 |
| 310 | Zeroing pass | 3 |
| 312 | Interface copy, purged on TTL | 3 |
| 400 | Transmission payload | 4 |
| 402 | Chunk boundary | 4 |
| 404 | Per-chunk capsule | 4 |
| 406 | Independent key material per capsule | 4 |
| 408 | Stream header, carried inside the encryption | 4 |
| 410 | Reassembly buffer, sandbox memory only | 4 |
| 412 | Stream expiry | 4 |
| 500 | Identity hash — X25519 key with static ML-KEM key | 5 |
| 502 | Per-session salt and HKDF derivation | 5 |
| 504 | Routing token — the only address on the wire | 5 |
| 506 | Relay — token-to-socket map | 5 |
| 508 | Transport frame | 5 |
| 510 | Properties a compromised relay cannot obtain | 5 |
| 512 | Properties it retains | 5 |
| 600 | HELLO — X25519 key with ML-KEM encapsulation key | 6 |
| 602 | RESPONSE — X25519 key with ML-KEM ciphertext | 6 |
| 604 | Dual-PRF HKDF combiner | 6 |
| 606 | Transcript hash, bound in as KDF salt | 6 |
| 608 | Either-primitive-suffices property | 6 |
| 610 | Downgrade resistance | 6 |
| 612 | Rekey ratchet | 6 |
| 614 | Key schedule from the root | 6 |
| 616 | Elligator2 bootstrap encoding | 6 |
| 700 | Shannon entropy measurement | 7 |
| 702 | Chi-squared uniformity measurement | 7 |
| 704 | Run and period detection | 7 |
| 706 | Reported grade | 7 |
| 708 | Entropy scale | 7 |
| 710 | Zero-knowledge property | 7 |
| 712 | Instrumentation, not an admission gate | 7 |