Zero-persistence, end-to-end encrypted chat rooms that vanish when everyone leaves.
- π End-to-end encryption β AES-256-GCM via Web Crypto API. No plaintext ever reaches the server.
- π» Fully ephemeral β No database, no message storage. Everything lives in memory and vanishes on close.
- π Anonymous β No accounts, no login. Random usernames generated per session.
- βοΈ Editable usernames β Click your name to change it on the fly. Presence updates in real time.
- π‘ Realtime β Powered by Supabase Realtime Broadcast & Presence.
- π Presence β See who's online in real time.
- π Encrypted file sharing β Send images and small files (JPG, PNG, GIF, WebP, TXT, DOCX up to 200KB) fully encrypted via Broadcast. No server storage.
- π Light & Dark mode β Toggle between dark cyberpunk and clean light themes. Preference is saved locally.
- π¨ Cyberpunk UI β Dark theme with glow effects and smooth animations.
- π± Mobile optimized β Responsive layout using dynamic viewport height for a native-like feel on phones.
Room Code β PBKDF2 (100k iterations, SHA-256) β AES-256 Key
Message β AES-GCM Encrypt β Base64 β Broadcast Channel β Decrypt β Display
- When a room is created, a random 7-character code is generated.
- The code is used to derive a 256-bit AES key via PBKDF2.
- Every message and file attachment is encrypted client-side before being sent through Supabase Broadcast.
- The key exists only in
sessionStorageβ it disappears when the tab closes. - Supabase never sees plaintext. It only relays encrypted payloads.
Files are shared using the same encryption channel as messages:
- Supported formats: JPG, PNG, GIF, WebP, TXT, DOCX
- Max size: 200KB after compression (Supabase Broadcast payload limit)
- Client-side compression runs before encryption to fit within the limit:
- Images (JPG, PNG, GIF, WebP) β resized via Canvas API (max width 1400px) and re-encoded as WebP (fallback JPEG) at quality 0.75
- TXT / DOCX / others β gzip compression via the native
CompressionStreamAPI - A
Compressing file...indicator is shown during processing - If the result still exceeds 200KB, the upload is rejected with a clear error
- Compressed files are then converted to Base64, encrypted with AES-256-GCM, and broadcast to all participants
- No files are ever stored on any server β they exist only in participants' browser memory
- Tap/click any message to open a quick-reaction picker with 12 curated emojis
- Reactions are broadcast in real time and grouped by emoji
- Like everything else, reactions are ephemeral β they vanish when the session ends
| Layer | Technology |
|---|---|
| Frontend | React 18 + TypeScript |
| Styling | Tailwind CSS + shadcn/ui |
| Build | Vite 5 |
| Realtime | Supabase Broadcast & Presence |
| Encryption | Web Crypto API (AES-256-GCM + PBKDF2) |
VoidChat β Messages that exist only in the moment. π Made with β€οΈ by Aisurf3r