Back to the galaxy

01 Flagship project Under active development

RIDDLE CHAT

Private by architecture, not by promise. An end-to-end encrypted messenger I’m building from the ground up — one Flutter codebase for Android, iOS, Windows and Linux, a NestJS backend, and a server that only ever stores ciphertext.

ENCRYPTION LAB try it — runs in your browser
You
chain step —message key —
What the server stores
RCDR1:… press Send
Your friend’s device
—

    Every send advances a symmetric ratchet, so every message gets a fresh key — watch it change. The demo uses WebCrypto (ECDH P-256 + HMAC chain + AES-GCM); Riddle Chat itself uses X25519 + ChaCha20-Poly1305.

    01

    1:1 Double-Ratchet-style

    Messages carry the RCDR1 protocol: an initial X25519 ratchet step, then per-message keys from symmetric chains. Old keys can’t decrypt new traffic.

    02

    Encrypted groups

    Per-sender chains (GSS1) from a shared group key, wrapped per member. Adding, removing or leaving rotates the key for everyone.

    03

    Files up to 500 MB

    Encrypted on the device with a per-file key, uploaded via presigned URLs to MinIO / S3. The key only travels inside the encrypted message.

    04

    Anonymous accounts

    Username and password — no email, no phone number. Argon2id on the server, password-derived keys on the client. No recovery, by design.

    05

    Realtime

    Socket.IO for messages, delivery and read receipts; short-lived JWT access tokens with refresh rotation.

    ARCHITECTUREtrust boundary: the server never holds keys
    YOUR DEVICE · holds keys SERVER SIDE · ciphertext only Flutter clientAndroid · iOS · Windows · Linuxratchet · secure storageencrypt / decrypt here CaddyTLS · rate limit NestJS API Socket.IO PostgreSQL · Prismaciphertext + public keys MinIO / S3encrypted file blobs HTTPS·WSS
    Flutter / DartNestJSPrismaPostgreSQLSocket.IOMinIO · S3 · R2libsodiumArgon2idDockerCaddyGitHub Actions CI

    Build status

    core shipped · hardening in progress
    1. M1Anonymous accounts, Argon2id, JWT + refresh tokens
    2. M2Friends by 6-character ID, E2EE direct chat, realtime receipts
    3. M3Encrypted attachments, Save As for decrypted files
    4. M4Groups: envelopes, add / remove / leave, ownership transfer, key rotation
    5. CRCDR1 ratchet for 1:1 + GSS1 sender chains, written threat model
    6. D1Resumable multipart uploads for large files
    7. EProduction hardening: shared rate-limit store, logging, monitoring, security review

    Straight answer: it’s not Signal-class crypto yet. The threat model documents exactly what is shipped and what isn’t — that’s the list above.

    06 Contact Open to full-stack roles · Dresden / remote

    Let’s build something
    people don’t log off from.

    Daanriddle@gmail.com