.ch
Governed by Swiss law · Zürich
Downstream face of the Contra dam
Engine

One write. One transaction. Five layers.

Seal → index → audit → commit, together or not at all. Here is what one record looks like at rest, and how the seal is bound to the row it lives in.

Contra Dam · downstream face
Drawing 1 · the sealed record

Every record is sealed to its place in the file.

A payload is compressed, sealed with AES-256-GCM under a per-record key, and written as an immutable row whose plaintext columns are exactly the associated data of the seal. A keyed checksum covers both. Move the ciphertext anywhere else and it will not open. Click a layer.

content key 32 B random AES-KW-wrapped shred = destroy it entry_id ver type parent status created_at blob → chksum seq entries · immutable revisions row checksum · HMAC-SHA256(checksum_key, aad ‖ ciphertext) · 32 B checksum a1f30c9e77b2d04e5c18e6a9 ‖ 9c1e0b7a2f5d4c31e08a3d5f6b2c9d417ab30cf5… nonce 12 B ‖ AES-256-GCM ciphertext ‖ tag 16 B aad = entry_id | version | type | parent_id | status | created_at seal zstd · level 3 compression { "title": "Acme Inc", "username": "svc-billing", "urls": ["https://acme.example"], "fields": [ { "label": "api key", "value": "…", "level": 2 } ] } payload audit row seq · prev_hash · row_hash same transaction as the row aad binds seal ↔ row one atomic transactionseal → index → audit → commit
payload

Opaque JSON. Read only where you said to.

The engine reads exactly the top-level fields your schema declares for indexing — nothing else. Undeclared fields, nested structure, and values you encrypted yourself are stored byte-exact.

  1. payload
  2. compression
  3. seal
  4. checksum
  5. row
  6. content key
  7. audit row
click a layer or a name
Drawing 2 · seal one yourself

Type anything. Seal it. Then try to move it.

Real AES-256-GCM in your browser, with the same associated-data binding the engine uses. Seal a payload, change one AAD field — the version, the status, the parent — and try to open it again.

seal / open · WebCrypto AES-256-GCM · random key per page loadnot sealed
aad =
nonce ‖ ciphertext ‖ tag
— seal a payload to see its bytes —
checksum = HMAC-SHA256(checksum_key, aad ‖ ciphertext)
Nothing opened yet.

The engine also compresses before sealing and stores the content key wrapped with AES-KW; both are omitted here. The AAD binding is exactly what you see.

Keys

One secret. Everything derived.

You supply key material; the engine derives its working set with HKDF-SHA256 — an index key, a checksum key, a wrap key, per-event audit keys, a key-check value — and mints one random master secret per store, wrapped with AES-KW. Every record gets its own random content key, wrapped under the wrap key. Rotating your key re-wraps one thing and re-encrypts nothing.

FIPS 140-3 at rest: the default build takes every primitive from aws-lc-rs pinned to the CMVP-validated AWS-LC-FIPS 2.0 module (#4816 static, #4759 dynamic), compiled and linked on Linux x86_64 and aarch64. Nothing hand-rolled, no second provider. Working keys are zeroized on drop; the one sanctioned panic in the engine is a failing random generator — predictable key material is worse than crashing. A host without the AWS-LC toolchain can pass --no-default-features for local work; that build is not a FIPS build.

Sealed objects

Binary attachments, sealed under the record that owns them.

Files, imaging slices, exports — stored as objects on a record: sealed with that record's content key, bound by their own associated data (object id, owner, name, created), checksummed, audited, access-checked through the owner. Immutable: replacing one is a new object and a new revision. Shred the owner and every object dies with the shared key. The name is plaintext shape metadata, like a type — validated, and never a place for secrets.

One file

The whole store is one file — and the file is always a complete backup.

Single writer, rollback-journal mode: between transactions the file on disk is the entire, consistent store — schema, index parameters, audit chain and all. Copy it, ship it, verify it anywhere. The storage layer is SQLite; you never see it, and stock tooling cannot read a single payload.

Replication is a per-table cursor over gapless sequence numbers. Reads are audited too: every export of record or object data seals an audit event before it is returned — fail-closed on a writable store.