Murmur
A private short-voice app with magic-link sign-in, invite-only rooms, media upload and playback, heard receipts, reactions, saved notes, nudges, notifications, and metrics.
What it is
Murmur is intentionally small: it is for private voice moments between close people, not podcasts, public feeds, or long recordings.
That clarity shapes the product decisions. Rooms are invite-only, the latest murmur matters, saved murmurs can outlive normal expiry for the saver, and the experience optimizes for a quick private ritual rather than endless chat.
The loop it has to make believable
- 01
Built the narrow private voice loop instead of a broad public audio feed.
- 02
Made the Go API authoritative for sessions, room membership, invite acceptance, murmur creation, playback, and reactions.
How it’s built
The Go API owns auth, access control, media ingestion, room state, events, notifications, and metrics. The Next app is the UI shell and public origin.
The repo includes local file-backed media for development and a production media path using private object storage plus presigned URLs. PWA wiring covers installability and push handling, not full offline-first behavior.
Architecture
- Product loop
- Magic-link sign-in, private room, invite, record, upload, play, heard state, react, save, nudge
- Backend contracts
- Server-owned sessions, room membership, media ingestion, events, notifications, and metrics
- Privacy
- Room membership gates room, murmur, and media endpoints; saved murmurs remain visible to the saver after normal expiry
- Deployment
- Next.js on Vercel, Go API on Render, managed Postgres, Resend, private S3/R2 media
What has to hold up
- Verified media duration server-side so clients cannot bypass the length cap by lying about metadata.
- Added saved murmurs, account export/delete, Web Push settings, nudge policy plumbing, PWA installability, loop-health metrics, and Prometheus-style operational metrics.
How I would present it
I would demo the two-person flow, then discuss the backend decisions: magic-link sessions, membership checks, invite tokens, duration validation, media serving, saved murmur retention, PWA wiring, and deployment constraints.
The strongest signal is that the hard parts of a private media product are already treated as backend contracts.
Proof
VerifyRepository, checks, stack, status
- 01
Open the GitHub repo and start with the README plus VERIFY.md.
- 02
Walk the core loop: sign in, create a room, invite someone, record, upload, play back, react, save, and nudge.
- 03
Inspect membership checks around rooms, murmurs, and media access, plus server-side media duration validation.
- 04
Run the documented service tests and review the deployment/security notes before treating it as more than the current production-capable scaffold.
- Role
- Auth, access control, media flow, room state, product UI, production hardening
- Scope
- Private room-based voice MVP
- Proof
- README, VERIFY.md, service tests, deployment docs
- Stack
- Go, Next.js, React, TypeScript, PostgreSQL, pgx, S3/R2
- Voice cap
- 90 seconds
- Auth
- Magic link
- Access
- Invite-only rooms
- Retention
- Saved murmurs