A WhatsApp-inspired, browser-based video calling app designed exclusively for two people. Built with WebRTC for peer-to-peer video/audio and Socket.IO for signaling and chat.
- Pair with a shared number: both users enter the same 4–10 digit number and press Connect
- HD peer-to-peer video & audio (WebRTC, Google STUN)
- Camera / microphone toggles, camera switch (front/back), mirror preview, fullscreen
- Desktop screen share
- Built-in chat: live messages, emoji picker, typing indicator, read receipts / seen status, timestamps, image sharing, copy & delete own messages
- Desktop: right slide-in chat panel · Mobile: bottom-sheet chat with swipe-down close
- Settings: dark/light theme, camera/mic/speaker selection, resolution, ping / bitrate / network quality
- Sounds (WebAudio) + mobile vibration, call timer, auto-reconnect with ICE restart
- Secret entrance:
/startopens the app;/alone redirects to YouTube
- Client: React · TypeScript · Vite · TailwindCSS · Framer Motion · Lucide React · Zustand
- Server: Node.js · Express · Socket.IO
npm install
npm run dev- Client runs on http://localhost:5173
- Server runs on http://localhost:3001 (Socket.IO signaling +
/api/health)
Open http://localhost:5173/start in two browsers/devices, enter the same number on both, and press Connect.
| Command | Description |
|---|---|
npm run dev |
Run server + client concurrently |
npm run build |
Type-check & build both packages |
npm run typecheck |
Strict TS type-check on both |
- Single service: server serves the built client (see
Dockerfile,render.yaml) - Server runs Express + Socket.IO; set
CLIENT_ORIGINfor CORS
connect-request { code }→connection-status(waiting|paired { peerId }|busy|invalid-code)- First connecter waits; a second connecter with the same number gets paired with them
- Signaling:
offer,answer,ice-candidaterelayed between the two peers - Chat:
send-message,typing,stop-typing,read-receipt,delete-messagerelayed - Track state:
track-state(camera/mic on/off badges for the peer) leave-connection/ disconnect →user-left