Open-source WebRTC voice chat. Ephemeral rooms. No auth. Pure P2P.
- π Zero Persistence β No data stored, no accounts
- π Pure P2P β Audio never touches the server (WebRTC mesh)
- β‘ Instant β One-click room creation
- π Encrypted β DTLS-SRTP for all audio
- π Optional Passwords β Protect rooms with alphanumeric passwords
- π± Responsive β Works on desktop and mobile
| Package | Description |
|---|---|
| @treyorr/voca-client | Core TypeScript SDK |
| @treyorr/voca-react | React hooks |
| @treyorr/voca-svelte | Svelte 5 runes wrapper |
bun install @treyorr/voca-client
# or for frameworks:
bun install @treyorr/voca-react # React
bun install @treyorr/voca-svelte # Svelte 5import { useVocaRoom } from '@treyorr/voca-react';
function VoiceRoom({ roomId }) {
const { status, peers, toggleMute, isMuted } = useVocaRoom(roomId, {
password: 'secret123' // Optional: protect room with password
});
return (
<button onClick={toggleMute}>{isMuted ? 'Unmute' : 'Mute'}</button>
);
}Voca is designed for easy self-hosting with Docker. No database or external dependencies required.
mise run dev# Terminal 1: Signaling server
cd services/signaling && RUST_LOG=info cargo run
# Terminal 2: Web frontend
cd apps/web && bun install && bun run dev| Endpoint | Auth | Description |
|---|---|---|
POST /api/room?password=<pwd> |
- | Create room (optional password) β {"room": "abc123", "password": "pwd"} |
GET /api/room/{id} |
- | Check if room exists β {"exists": true, "password_required": false} |
GET /ws/{id}?password=<pwd> |
- | WebSocket signaling (password required if room protected) |
GET /api/admin/rooms |
Bearer | List all rooms |
GET /api/admin/metrics |
Bearer | Usage metrics |
- Fork the repo
- Create a branch:
git checkout -b my-feature - Make your changes and run
mise run lint - Submit a PR
Please read our Code of Conduct first.
- voca.vc/docs β Full SDK and Self-Hosting documentation