Skip to content

aisurf3r/VoidChat

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

5 Commits
Β 
Β 

Repository files navigation

πŸ›‘οΈ VoidChat β€” Ephemeral Encrypted Chat 1.0

Zero-persistence, end-to-end encrypted chat rooms that vanish when everyone leaves.

React TypeScript Supabase Vite


{11C044C9-CBF7-45E1-93BC-0D01C6A20E6E} {5C2BFA5D-5E1E-4D6E-A62A-DFFC9C676FC7}

✨ Features

  • πŸ” 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.

πŸ”’ How Encryption Works

Room Code β†’ PBKDF2 (100k iterations, SHA-256) β†’ AES-256 Key
Message β†’ AES-GCM Encrypt β†’ Base64 β†’ Broadcast Channel β†’ Decrypt β†’ Display
  1. When a room is created, a random 7-character code is generated.
  2. The code is used to derive a 256-bit AES key via PBKDF2.
  3. Every message and file attachment is encrypted client-side before being sent through Supabase Broadcast.
  4. The key exists only in sessionStorage β€” it disappears when the tab closes.
  5. Supabase never sees plaintext. It only relays encrypted payloads.

πŸ“Ž File Sharing

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 CompressionStream API
    • 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

πŸ’¬ Message Reactions

  • 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

πŸ—οΈ Tech Stack

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

About

Zero-persistence, end-to-end encrypted chat rooms that vanish when everyone leaves

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors