ββββββββββββ βββ ββββββββββββββ βββ ββββββββββ ββββββββββββββββββββββββ
βββββββββββββ βββββββββββββββββββββββ βββββββββββββββββββββββββββββββββββββ
ββββββ ββββββ ββββββ ββββββββ βββββββ ββββββββ βββ ββββββ βββ βββ
ββββββ βββββββββββββ ββββββββ βββββ βββββββ βββ ββββββ βββ βββ
βββββββββββ βββββββββββββββββ βββ βββ βββ βββ ββββββββββββββββ
βββββββββββ βββββ ββββββββββ βββ βββ βββ βββ βββββββββββββββDemo & Preview
docker compose up -d β https://localhostRegister Β· Login Β· New Conversation Β· Empty Conversation Β· First Message Β· Encrypted Messaging Β· Mobile View
Passwordless account creation with WebAuthn passkey enrollment β username and display name are the only fields, no password is ever entered or stored
Passkey authentication with optional username field β leave blank to use a discoverable credential resolved by the authenticator
Username search resolves the recipient's identity key from the directory before any message is composed
Fresh thread with E2EE badge and presence indicator β no plaintext history is ever stored on the server, so a new conversation truly starts empty
Outbound message encrypted client-side with the recipient's public key and pushed over WebSocket β the server only ever sees ciphertext
Live two-way conversation with delivery timestamps and the lock indicator on every bubble confirming end-to-end encryption per message
Responsive single-pane layout with collapsible sidebar β passkey auth and E2EE work identically on mobile via the platform authenticator






