A web-based DAW for recording group sessions: phones act as microphones, a laptop acts as the mixing desk, a server provides transport reliability and archival. See docs/ARCHITECTURE.md.
packages/ Rust crates (Cargo workspace) + shared TS packages
core/ antiphon-core: chunk protocol, frames, reconciliation, ring buffer
codec/ antiphon-codec: FLAC via flacenc (pure Rust)
dsp/ antiphon-dsp: correlation (realfft), drift (rubato)
wasm/ antiphon-wasm: thin wasm-bindgen facade over core/codec/dsp
protocol/ Zod schemas for all signaling messages (web + server)
core-wasm/ npm wrapper around the built wasm — the ONLY way TS consumes Rust
apps/
web/ Vite + React 19 — desk (/session/:uuid) and phone (/join/:uuid)
server/ Hono + node-datachannel on Node 24 — signaling, ingest, archive, db
e2e/ Playwright
docs/ architecture doc + protocol RFC + design references
- Node 24 LTS, pnpm 11 (
corepack enable) — nvm users:nvm use(reads.nvmrc); Node < 24 fails fast (the server runs TS via built-in type stripping, so v20 dies withERR_UNKNOWN_FILE_EXTENSIONotherwise) - Rust (pinned by
rust-toolchain.toml, includeswasm32-unknown-unknown) - wasm-pack
- Docker (Postgres for the server:
docker compose up -d postgres)
pnpm install
pnpm build # turbo: wasm → packages, apps
pnpm dev # turbo: web + server dev servers
pnpm lint # biome (lint + format)
pnpm typecheck
pnpm test # vitest (TS)
pnpm test:rust # cargo test --workspace
pnpm test:e2e # playwright
pnpm check # all of the aboveReal-iPhone testing needs HTTPS: cloudflared tunnel --url http://localhost:5173.
Blobs default to the filesystem (BLOB_DRIVER=fs). To exercise the prod S3
driver locally (Cloudflare R2 in prod), run MinIO and point the server at it:
docker compose up -d minio # S3 API on :9100, console on :9101Then in apps/server/.env:
BLOB_DRIVER=s3
S3_ENDPOINT=http://localhost:9100
S3_BUCKET=antiphon-dev
S3_ACCESS_KEY_ID=antiphon
S3_SECRET_ACCESS_KEY=antiphon-secret
S3_FORCE_PATH_STYLE=1
S3_REGION=us-east-1
The server creates the bucket at boot (ensureBucket) — no mc side-car
needed. With MinIO up, pnpm --filter @antiphon/server test also runs the
S3 driver integration suite (it skips itself when :9100 is unreachable).
- docs/rfcs/0001-protocol.md — the wire format (normative)
- docs/rfcs/0001-amendments-proposed.md — implementation-driven amendments
- docs/demo-m1.md — the Milestone 1 demo (automated + two-iPhone runbook)
- docs/ios-capture-runbook.md — real-device capture verification
- docs/design-system.md — UI tokens, kit, and binding references