Obsidian ← Home

Threat model

What Obsidian protects, who from, and — just as important — what it does not protect. This is written to be read by a skeptical security person, not to reassure a marketer. If a claim here is ever untrue of the code, that is a bug; report it.

Status: pre-alpha. Not independently audited. Self-hosting is not yet available — during the alpha the relay is run by the project operator for a closed group of testers. This document describes the target architecture of the metadata-minimizing relay; where the code has not yet caught up, it is marked (in progress).

What Obsidian is

A private, end-to-end-encrypted messenger. Your messages and media are encrypted on your device and decrypted only on your friend's device. The cloud relay is a dumb, ephemeral mail-slot: it holds opaque encrypted blobs for at most 24 hours, then wipes them. Your permanent copy lives only on your own device, encrypted at rest. There is no cross-device sync — that is the design, not a limitation.

The relay's job is to deliver a blob to whoever is meant to receive it. To do that it needs some delivery information. The whole point of this document is to be exact about how little that is, and what leaks anyway.

What we protect — and how

AssetProtectionWho is shut out
Message & media contentAES-256-GCM; the per-message key is wrapped to the recipient's RSA public key. The relay only ever holds ciphertext.The relay operator, with full root + database access, cannot read content.
Who sent a message ("sealed sender")The sender's identity travels inside the encrypted envelope. The relay stores no sender field. The recipient learns and cryptographically verifies the sender only after decrypting.The relay operator cannot see who sent any message.
Who received a messageThe relay routes by an opaque, rotating mailbox token, not by a user ID. Tokens are exchanged friend-to-friend, encrypted; they are never published on your profile. The token → user mapping exists only on devices.The relay operator sees an opaque token, not an identity.
Your private keysGenerated on-device, stored in the OS secure enclave. Never transmitted.Everyone but you.
Your message historyStored only on your device, in a SQLCipher database encrypted with a key held in the secure enclave.Everyone but you (and anyone who unlocks your device).
Your friends listFriendships live locally on each device. There is no server-side friends graph at rest.The relay holds no standing list of who your friends are.

The combination of sealed sender + opaque mailbox tokens means that an operator who dumps the entire relay database sees rows of: an opaque token, an opaque ciphertext blob, and a timestamp. No names, no user IDs, no "who talks to whom" graph. That is the core claim, and it is the thing to test first (see How to attack this).

What we explicitly do NOT protect

This is the honest part. Do not use Obsidian believing it does any of the following — it does not, and saying so plainly is the point.

Security assumptions

How to attack this (start here)

The fastest way to check the core claim is to be the malicious operator:

  1. Send real messages between two accounts.
  2. Open the relay's database directly.
  3. Inspect the message table. You should find only mailbox_token (opaque), envelope (opaque ciphertext), and created. No sender, no recipient, no user ID, no token → user mapping anywhere in the schema.

If you can reconstruct "who talked to whom" from the database alone, that is a finding — that is the claim broken. The known, documented leaks are the ones in What we explicitly do NOT protect above (timing, IP, volume, the transient friend-request edge); anything beyond those is a bug. Here is how to report it.

Roadmap (honest about what isn't built yet)