BetweenUs
BetweenUs is a Discord-like communication platform with secure remote desktop access. A single account gets chat, voice/video calls, screen sharing, and permissioned remote control of another machine — across a desktop client today, with web and Android planned in the same backend.

:::tip Download BetweenUs Production binaries for Windows (Electron NSIS installer), Linux (AppImage) and Android (Native APK) are published on GitHub Releases:
- 🚀 Download Latest Release (Windows, Linux & Android)
- 🐧 Linux, in one line:
curl -fsSL https://raw.githubusercontent.com/aiyu-ayaan/BetweenUs/master/scripts/install-linux.sh | sh:::
What's in these docs
- Architecture — the microservices, the peer-to-peer media design, why there is no media server, and the Android client.
- Multi-Theme System — 16 curated themes, custom accent tints, dynamic OS synchronization, and dedicated appearance settings across desktop, web, and Android.
- Listen Together — synchronized YouTube playback inside calls with zero uplink, in-app YouTube browsing, and automatic speech ducking.
- Play Together — six board games inside a
call, refereed by
call-service, where a move is a number rather than a shared screen — and carrom, where a move is a shot and the physics runs on both ends. - System Design — auth, RBAC, events, ingress through Cloudflare Tunnel.
- Database — the Prisma schema, model by model, with an ERD.
- Services — one page per microservice: what it owns, its REST/WebSocket surface, what it never does.
- Deployment — Docker Compose, the release pipeline, CI/CD.
- Security and E2EE — trust boundaries, encryption design, and the gaps that are open on purpose.
- Running Locally — clone to running chat in a few commands.
Core capabilities
- Authentication & Accounts: JWT + refresh-token rotation with reuse detection, Google & GitHub OAuth sign-in.
- Multi-Theme Engine: 16 handcrafted dark, light, developer, and vibrant themes with 8 customizable accent tints, OS auto-sync, and dedicated settings pages on all platforms.
- Servers & Channels: Public and private channels, custom roles with colors, per-member overrides, invite links with limits.
- End-to-End Encrypted Chat: Messages, edits, reactions, replies, pins, rich markdown parsing (bulleted/numbered lists, inline marks, code blocks), and encrypted attachments up to 100 MB.
- Voice, Video & Screen Share: Peer-to-peer WebRTC mesh, camera, screen sharing with interactive remote control handover and multi-cursor overlays.
- Listen Together: Synchronized YouTube audio in voice calls, browse youtube.com in-app, click-to-play with zero uplink, and automatic speech ducking.
- Play Together: Tic-tac-toe, Connect Four, Reversi, Dots and Boxes, Ludo and Carrom - the last a real physics simulation both ends replay - inside a voice call — one board everybody sees, two chairs anybody can take, refereed by the gateway so nothing is played on trust.
- Remote Desktop: Screen viewing, remote control, clipboard sync, multi-monitor selection, granular permission grants with expiry, and audit trail.
- Presence & Notifications: Status selection, typing indicators, desktop tray, quiet hours, push suppression across devices, and FCM push notifications.
Technology at a glance
| Layer | Technology |
|---|---|
| Desktop client | Electron, React, TypeScript, Tailwind CSS, Zustand |
| Web client | Same React UI, served by Vite, mounted at the gateway root |
| Android client | Kotlin, Jetpack Compose |
| Backend | Node.js, TypeScript, NestJS microservices |
| Realtime media | WebRTC, peer-to-peer, no SFU |
| Signalling | WebSocket, relayed by NestJS gateways |
| Database | PostgreSQL via Prisma |
| Realtime/cache state | Redis (presence, pub/sub, rate limiting) |
| Object storage | S3-compatible (or local disk in dev) |
| Ingress | Cloudflare Tunnel → Nginx → services |
| Containers | Docker Compose (dev + prod), one Dockerfile with multiple targets |
Everything here is generated and maintained against the actual source in github.com/aiyu-ayaan/BetweenUs — where a page and the code disagree, the code is right and this page is stale; open an issue.