Security Whitepaper

Zero knowledge.
By design.

Axoltl never reads, stores, or processes your conversations. The relay is cryptographically blind. The encryption is end-to-end. Here is exactly how.

What we defend against.
And how.

Relay compromise

If the relay server is fully compromised, the attacker receives only opaque AES-256-GCM ciphertext. No keys are stored server-side. The relay has zero ability to decrypt payloads — mathematically, not just by policy.

Network interception (MITM)

Noise Protocol XX provides mutual authentication. Both devices verify Ed25519 identities before any data is exchanged. Key agreement uses X25519 ephemeral keys — unique per session, non-replayable.

Replay attacks

Each session payload includes a cryptographic nonce. The relay enforces a 5-minute TTL and deletes on first retrieval. Replaying a delivered payload returns 404 — the ciphertext no longer exists.

Fake BLE beacons

Every BLE ANNOUNCE beacon is signed with Ed25519. The receiver validates the signature before initiating any connection. An unsigned or malformed beacon is silently rejected — no connection is made.

Four layers.
Each one independent.

L4

Application Layer — Context Serialization

Conversation history, system prompts, and provider metadata serialized as compact JSON. TF-IDF 3-pass extraction compresses to under 3,000 tokens. LZ4 compression applied before encryption. No raw message content traverses the relay — only the compressed, encrypted bundle.

L3

Encryption Layer — AES-256-GCM

AES-256-GCM with a 96-bit nonce derived from the Noise session. Authenticated encryption — any tampering invalidates the entire payload before decryption is attempted. Session key is ephemeral: derived fresh from X25519 ECDH, never stored.

L2

Handshake Layer — Noise Protocol XX

Noise_XX_25519_ChaChaPoly_SHA256 — the same construction used by WireGuard. Mutual authentication: both parties prove Ed25519 identity before data flows. Ephemeral X25519 keys provide perfect forward secrecy. Every session is cryptographically independent.

L1

Transport Layer — HTTPS or BLE GATT

HTTPS/TLS 1.3 to the Cloudflare Worker relay for cross-device transfers. BLE GATT with 500-byte fragmentation for offline phone-to-phone transfers. Both transports carry pre-encrypted Noise payloads — transport-layer encryption is a redundant second wrapper.

Trust requires proof.

Every component is open source. Read the code, run the audit, deploy your own relay. Transparency is the architecture, not an afterthought.

Read the Source

Full source code is split across the mobile app and extension repos. All MIT licensed. No obfuscation, no minification of logic, no hidden layers.

Audit the Crypto

No custom cryptographic primitives. Standard Noise Protocol libraries, audited X25519 and AES-256-GCM implementations. Inspect the dependency tree — every transitive dependency is listed.

Deploy Your Own Relay

Fork the worker, set your own Cloudflare KV binding, deploy in under five minutes. The relay is 80 lines of JavaScript. Free tier handles 100,000 requests per day. Full sovereignty over your infrastructure.