say hello

Murmur

Private voice product · Jun 2026 · Public repo

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

  1. 01

    Built the narrow private voice loop instead of a broad public audio feed.

  2. 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

Best evaluated as a private voice product where room membership, media access, saved-note retention, notifications, and deploy/security posture are backend contracts.

VerifyRepository, checks, stack, status
  1. 01

    Open the GitHub repo and start with the README plus VERIFY.md.

  2. 02

    Walk the core loop: sign in, create a room, invite someone, record, upload, play back, react, save, and nudge.

  3. 03

    Inspect membership checks around rooms, murmurs, and media access, plus server-side media duration validation.

  4. 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