Skip to content
Updates & support on Telegram

Zero-knowledge storage

Your chat is encrypted in your browser.

We designed the web chat so that we cannot read your conversations even if we wanted to. The encryption key is derived on your device from a passphrase you choose, and neither ever leaves it.

A passphrase only you know

You choose a chat passphrase the first time you open chat. It is run through PBKDF2 (600,000 iterations, SHA-256) inside your browser to produce an AES-256-GCM key. The passphrase is never sent to the server and never stored.

The key never leaves your device

The derived key is stored in your browser's IndexedDB as a non-extractable CryptoKey. Its raw bytes cannot be read back — not by page scripts, not by us. It is never transmitted.

Every message is encrypted before it is sent

Each message and conversation title is encrypted with a fresh random 96-bit IV in your browser. Only the ciphertext and IV are sent to the server.

We store ciphertext, not text

The database holds base64 ciphertext and IVs. There is no plaintext column, and the operator console cannot read your chats.

Plaintext exists only to call the model

To generate a reply, the message is decrypted in your browser and sent over TLS to the gateway, which forwards it to the model provider. Nothing is written to disk in plaintext, and web-chat requests are excluded from the server archive.

You can verify it

Open your browser's DevTools → Application → IndexedDB → ua_chat and inspect the stored key object: it is a CryptoKey, not a readable string. Every network request to /api/chat carries only base64 ciphertext.

A passphrase only you know

key   = PBKDF2-SHA256(chatPassphrase, salt = "uncensoredai-chat-v2:" + accountId, 600000)
body  = AES-256-GCM(key, iv = random(96 bits), plaintext)
store = { ciphertext: base64(body), iv: base64(iv) }   // all the server ever sees

v2 · Back

Chat Encryption — How Your Messages Stay Private · UncensoredAI