BlindChat - End-to-End Encrypted Messenger
Last updated on

BlindChat - End-to-End Encrypted Messenger


📌 Overview

BlindChat is a WhatsApp-style messenger where messages, photos, voice notes and videos are end-to-end encrypted in the browser before they leave the device, and voice/video calls run peer-to-peer over WebRTC. The server stores ciphertext and routes it; it never holds the keys.

It runs as a web app and as a native Android app (Capacitor), currently in alpha testing on Google Play. Development started on 1 Sep 2026 and is ongoing.

👉 Try it live: chat.endra.in

📱 Android (Play Store alpha): play.google.com/store/apps/details?id=in.endra.blindchat


💬 What You Can Do

  • 1:1 and group chats with delivered/read receipts, replies, reactions, edits, pinned and starred messages.
  • Encrypted media — photos (with crop, rotate and drawing tools), GIFs and stickers, voice notes with a live waveform, and video messages up to 60 seconds.
  • Voice and video calls with screen sharing; media flows peer-to-peer and never touches a server.
  • Friends by username or friend code, with block and report.
  • Privacy on the device — biometric app lock, and push notifications that carry only a title, never the message body.

🔒 Encryption Model

  • Each device holds an ECDH key pair; peers derive a shared AES-256-GCM session key with HKDF-SHA256, all through the browser’s Web Crypto API.
  • Photos, voice notes and videos are encrypted with a per-file media key carried inside the encrypted message envelope, so thumbnails and previews are encrypted too.
  • Envelope key pinning — sender and recipient public keys are pinned per message, so sent history survives a peer rotating keys.
  • Messages that can’t be decrypted on a device are hidden rather than shown as placeholders.
  • A unique (senderId, clientMsgId) constraint makes sends idempotent, so retries and timeouts never produce duplicates.

🏗️ Architecture

BlindChat has no backend of its own — it reuses two existing services:

ServiceRole
arcade-serverShared identity, friends, encrypted message storage, call history, and the real-time social WebSocket
BlindParty signalingCall room codes and WebRTC signaling; audio and video stay peer-to-peer
  • The web client is a React 18 + Vite SPA deployed to Cloudflare Workers.
  • The Android app wraps the same frontend with Capacitor, adding push notifications, biometric auth, Google sign-in, and foreground services that keep calls and screen shares alive when the app is minimized.
  • Encrypted attachments are stored with a 30-day retention window.

🛠️ Tech Stack

  • Frontend: React 18, Vite, React Router, Web Crypto API, WebRTC
  • Android: Capacitor (push and local notifications, biometric auth, social login)
  • Backend: arcade-server (Node.js, Prisma, PostgreSQL, WebSocket), BlindParty signaling server
  • Deployment: Cloudflare Workers (web) · Google Play (Android, alpha)