A world-class, privacy-first video calling app built to rival Zoom and Google Meet. Features ultra-low latency WebRTC calls, AI-powered transcription and translation, end-to-end encryption, and a beautiful modern UI.
- HD Video & Audio — WebRTC-powered via LiveKit SFU for low-latency group calls
- Screen Sharing — Share your screen with one click
- Gallery & Speaker Views — Adaptive grid layout that switches between gallery and active-speaker modes
- In-Call Chat — Real-time text messaging via LiveKit data channels
- Pre-Join Lobby — Camera/mic preview with device selection before joining
- Live Captions — Real-time speech-to-text transcription displayed as live captions
- Meeting Summaries — Post-call AI-generated summaries with action items (via Claude API)
- Live Translation — Real-time subtitle translation powered by LibreTranslate (self-hosted)
- Noise Cancellation — Client-side noise suppression using Web Audio API processors
- End-to-End Encryption — LiveKit E2EE with Insertable Streams API; the SFU never sees plaintext media
- Virtual Backgrounds — Background blur and color gradient replacement via canvas processing
- Spatial Audio — Positional audio using Web Audio API for immersive large calls
- Interactive Whiteboard — Collaborative drawing canvas with pen, shapes, text, and colors
- Breakout Rooms — Split participants into timed sub-rooms with automatic recall
- Recording — Server-side room recording via LiveKit Egress API
- Emoji Reactions — Floating emoji reactions visible to all participants
- Dark / Light / System Theme — Toggle between themes with automatic system preference detection
- Smooth Animations — Framer Motion transitions for pages, chat, captions, and popups
- Keyboard Shortcuts —
Mmute,Vcamera,Sshare,Cchat,Tcaptions,Ereact,Lleave
| Layer | Technology |
|---|---|
| Frontend | Vite + React 18 + TypeScript |
| UI | Tailwind CSS + Radix UI |
| State | Zustand (with persist middleware) |
| Backend | Node.js + Fastify |
| Media Server | LiveKit (self-hosted SFU) |
| Database | PostgreSQL + Drizzle ORM |
| Cache | Redis |
| Auth | JWT + bcrypt |
| AI Transcription | Web Speech API / Whisper |
| AI Summaries | Claude API |
| Translation | LibreTranslate (self-hosted) |
| Monorepo | pnpm workspaces + Turborepo |
| Containerization | Docker Compose |
scream/
├── apps/
│ ├── web/ # React frontend (Vite)
│ │ ├── src/
│ │ │ ├── components/ # UI components (call, chat, lobby, whiteboard, breakout, ui)
│ │ │ ├── hooks/ # Custom hooks (media, transcription, translation, E2EE, etc.)
│ │ │ ├── stores/ # Zustand stores (auth, call, chat, theme, whiteboard, breakout)
│ │ │ ├── pages/ # Route pages (Home, Auth, Room, Summary)
│ │ │ ├── services/ # API client
│ │ │ └── styles/ # Global CSS
│ │ └── package.json
│ └── server/ # Fastify backend
│ ├── src/
│ │ ├── routes/ # API routes (auth, rooms, recording, translation, breakout, AI)
│ │ ├── services/ # LiveKit, recording, translation services
│ │ ├── db/ # Drizzle schema & migrations
│ │ ├── middleware/ # JWT auth, rate limiting
│ │ └── ws/ # WebSocket handlers
│ └── package.json
├── packages/
│ └── shared/ # Shared types, constants, utils
├── infra/
│ └── livekit/ # LiveKit server config
├── docker-compose.yml # Postgres, Redis, LiveKit, LibreTranslate
├── turbo.json
└── pnpm-workspace.yaml
- Node.js >= 18
- pnpm >= 9
- Docker & Docker Compose
# 1. Clone and install dependencies
git clone <repo-url>
cd scream
pnpm install
# 2. Copy environment variables
cp .env.example .env
# Edit .env with your values (defaults work for local dev)
# 3. Start infrastructure (Postgres, Redis, LiveKit, LibreTranslate)
docker-compose up -d
# 4. Run database migrations
source .env && pnpm --filter server db:generate
source .env && pnpm --filter server db:migrate
# 5. Start the backend
source .env && pnpm --filter server dev
# 6. Start the frontend (in another terminal)
pnpm --filter web dev| Service | URL |
|---|---|
| Frontend | http://localhost:5173 |
| Backend API | http://localhost:3001 |
| LiveKit | ws://localhost:7880 |
| LibreTranslate | http://localhost:5000 |
| Variable | Description | Default |
|---|---|---|
DATABASE_URL |
PostgreSQL connection string | postgresql://scream:scream@localhost:5434/scream |
REDIS_URL |
Redis connection string | redis://localhost:6380 |
LIVEKIT_URL |
LiveKit server WebSocket URL | ws://localhost:7880 |
LIVEKIT_API_KEY |
LiveKit API key | devkey |
LIVEKIT_API_SECRET |
LiveKit API secret | devsecret |
JWT_SECRET |
Secret for JWT token signing | (required) |
SERVER_PORT |
Backend server port | 3001 |
ANTHROPIC_API_KEY |
Claude API key for meeting summaries | (optional) |
LIBRETRANSLATE_URL |
LibreTranslate server URL | http://localhost:5000 |
VITE_API_URL |
Frontend API base URL | http://localhost:3001 |
VITE_LIVEKIT_URL |
Frontend LiveKit URL | ws://localhost:7880 |
| Key | Action |
|---|---|
M |
Toggle microphone |
V |
Toggle camera |
S |
Toggle screen share |
C |
Toggle chat panel |
T |
Toggle captions |
E |
Open emoji reactions |
L |
Leave call |
MIT