Identity: passkeys only
There are no primary passwords anywhere in the suite — no password hashing, no breach list, no password policy.
People
- Sign-in with a WebAuthn passkey; registration, login and step-up all require user verification.
- A user record holds only public keys. Someone who compromises the object store and the master key still gets nothing they can use to sign in as a user.
- The one optional second factor is TOTP: never required, and only ever a step-up — never a sign-in factor.
Clients and guests
- Protocol clients never hold passkeys. They get named, scoped, individually revocable app passwords and access tokens, minted only behind a fresh passkey assertion.
- Sensitive actions — adding or removing a passkey, minting or revoking credentials, naming recovery peers, approving a signup or recovery, every administrative mutation — take a fresh passkey assertion.
- A guest — a principal identified by an external ATProto identity — owns nothing here and may be granted a strictly limited ceiling of rights.
Encryption at rest
Everything durable is encrypted on the node before it leaves, against an object-store provider assumed curious and possibly tampering.
What is encrypted
- Blob contents, record contents, and record and blob names.
- The object store sees ciphertext, opaque names, sizes, and the timing and shape of access — nothing readable.
- Rollback protection defends against replay, substitution and un-deletion.
The keys
- Derived from a per-install master key — 32 random bytes, shown once as a 24-word phrase — held on the node and never in the object store.
- Blobs use an AES-256-GCM envelope with a fresh random content key per write, wrapped with AES-256-KW.
- Records bind the record key and revision into the envelope, so a provider cannot swap one record for another.
- Keys rotate without re-encrypting content; the wrapping and naming halves rotate independently.
Anti-abuse, built in and run on the install
Protection against spam, viruses and impersonation is opinionated about where it comes from, and about what it will not do.
Built in, not a subscription
SPF, DKIM, DMARC, ARC, virus scanning, spam scoring, brand-impersonation scoring and lookalike-link warnings are implemented in-house and run on the install.
Fails closed
A scanner error refuses the message rather than accepting an unscanned one. An unscanned inbox is not an option.
No scan-time call-home
The suite never telephones a remote feed to score a message; phishing-URL feeds that would call out at scan time are rejected. Phishing links are matched against a self-hosted snapshot instead.
A shared, not personal, spam model
Personal per-user models are rejected in favour of a shared model that admits only tokens several principals observed independently — pooling works without leaking content between data controllers.
No auto-ban, no lockouts
GeoIP scoring, DNSBL packs and auto-ban are deliberately not in the core — the false-positive lockout risk on shared IPs is documented as a reason, not an oversight.
No metrics vendor
There is no metrics or tracing vendor built in. Observability runs on the install's own private network, through its own status endpoint and doctor tooling.
Where the posture stops
An honest posture names its limits. The design is explicit about what it does not defend, and this page will not inflate them.
docs/public/vulnerability-disclosure.md at
tangled.org/@pipobscure.com/ordner.Posture read. Now the practice.
What the suite does, and how to use it.