Riverside-style remote podcast recording MVP with local MediaRecorder capture, chunk persistence via IndexedDB, and resumable uploads. Live comms (WebRTC) stay isolated from recording.
frontend/– Next.js 14 (App Router, TS, Tailwind, shadcn-inspired UI), MediaRecorder + IndexedDB + worker upload scaffoldingbackend/– Fastify + TS, JWT auth (host + guest), in-memory session/track store, S3-compatible upload stubsshared/– Types and constants shared across servicesinfra/– Dockerfiles, docker-compose, env examples
pnpm install
pnpm devFrontend: http://localhost:3000
Backend API: http://localhost:4000
Copy infra/env.example to .env files as needed. Key vars:
NEXT_PUBLIC_API_URL– backend URL for the frontendHOST_JWT_SECRET,GUEST_JWT_SECRET– JWT signing secretsSTORAGE_*– S3/R2-compatible settings for signed URLs
- Separation of concerns: WebRTC signaling/client kept in its own module; recording pipeline is local-only.
- Local-first recording: MediaRecorder slices every second, persists to IndexedDB; uploads happen only after stop.
- Resumable uploads: Worker fans out PUTs to signed URLs; chunk metadata stays locally until completion.
- Processing hook: Placeholder FFmpeg service ready to be wired to object-storage events.