Plates and sealing
A plate is one file and its type. It is encrypted in the browser before it leaves your phone or computer, and only the enclave can open it.
Plate types
| Type | What it holds | Limit |
|---|---|---|
| Voice note | audio, transcribed inside the enclave | up to 2 minutes |
| Dashcam ride | track, frames | GPS track and one frame a second, 20 MB |
| Typing rhythm | key intervals | captured on the typing test |
| Dream journal | entries | text |
| Receipt | image, text | a photo, read inside the enclave |
| Screen time | apps, minutes | the CSV or screenshot a phone gives |
The encryption
Each plate is sealed with HPKE (RFC 9180) in base mode: DHKEM over X25519 with HKDF-SHA256, then AES-128-GCM. The browser makes a fresh ephemeral key for every plate, so two plates never share a key. The plate type and the enclave id are bound in as associated data: a ciphertext moved to another type or another enclave fails to open.
The code is the same in the app, the SDK and the enclave, and it is tested against an independent HPKE implementation. You can run it now in the app's Seal tab with a local test key.
The onchain record
The Plates contract stores the SHA-256 of the ciphertext, the type, the size in bytes, the enclave id and the owner. Only an active enclave signer can register a plate, and only with the owner's EIP-712 signature over exactly those fields. Contents never touch the chain.
Deleting a plate
The owner calls remove(id), or signs a Remove message that the relayer submits. The plate leaves the next epoch's set and the next Armour training, and the enclave drops its ciphertext.