Your data and encryption
Every upload is one file and its type. It is encrypted in your browser before it leaves your phone or computer, and only the TEE server can open it.
Data types
| Type | What it holds | Limit |
|---|---|---|
| Voice note | audio, transcribed inside the TEE server | 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 TEE server |
| Screen time | apps, minutes | the CSV or screenshot a phone gives |
The encryption
Each upload is encrypted 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 upload, so two uploads never share a key. The data type and the server id are bound in as associated data: an encrypted file moved to another type or another server fails to open.
The code is the same in the app, the SDK and the TEE server, and it is tested against an independent HPKE implementation. You can run it now in the app's Encrypt 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 server id and the owner. Only an active server signer can register an upload, and only with the owner's EIP-712 signature over exactly those fields. Contents never touch the chain.
Deleting an upload
The owner calls remove(id), or signs a Remove message that the relayer submits. The upload leaves the next day's payouts and the next model training, and the server drops its encrypted file.