A private audio-messaging PWA for two people. See PRODUCT_BRIEF.md for the vision, PROGRESS.md for the full current feature list + how to deploy, SETUP.md for backend setup, and SETUP-EXTRAS.md for push notifications + synced transcripts.
Far past the MVP now: record → Supabase sync → playback with waveform scrubber, skip-silence, autoplay, bookmarks, lock-screen controls; search / filters / day-timeline / stars / settings; a soundboard + voice effects + music-bed remix studio; and on-device (private) transcription with read-mode, tap-to-jump, and editing. Push notifications + synced transcripts are coded and need a one-time backend step (SETUP-EXTRAS.md).
- 🎙️ Record with built-in noise suppression + auto-gain (voice-grade, ~32 kbps → tiny files), live waveform, pause/resume, timer
- 🔍 Review before saving — preview, discard, or save
- 📚 Library of memos, newest first, with unlistened dots
▶️ Playback QoL: 0.5×–3× speed with pitch preserved (no chipmunk), −15s / +30s skip, draggable scrubber, resume where you left off, auto-mark-listened- 📴 Installable + offline: add to home screen; the app shell is cached by a service worker
- 💾 Everything stored locally in IndexedDB (audio Blobs + metadata)
Auth, storage, realtime delivery, and an offline outbox are coded. To turn it on, follow
SETUP.md (create a free Supabase project, paste 2 keys into config.js). Until then
the app stays in local-only mode. Schema lives in supabase/schema.sql.
- 🔔 Push when the app is closed (Phase 2 — VAPID + Supabase Edge Function; scaffolded in
sw.js) - 📝 Transcription, search, auto-threading, timeline
- ✨ "Enhance" (ML noise removal), skip-silence, soundboard & music beds
The app needs to be served over http://localhost (mic access requires a secure context, and ES
modules / service workers don't run from file://). Any static server works:
cd voice-app
python3 -m http.server 4321
# then open http://localhost:4321To try it on your phone (real mic), host the folder anywhere with HTTPS — e.g. drag it onto
Netlify Drop or npx vercel, then "Add to Home Screen" in Safari.
| File | Purpose |
|---|---|
index.html |
App shell + overlay markup |
styles.css |
Dark, mobile-first, big-touch-target UI |
app.js |
UI, library render, record flow, player wiring |
recorder.js |
Mic capture, cleanup constraints, level metering |
player.js |
Pitch-preserved speed, seek, resume |
db.js |
IndexedDB wrapper (memos store) |
sw.js |
Service worker (offline app shell) |
manifest.webmanifest, icon.svg |
PWA install metadata |
{ id, createdAt, durationMs, blob, mimeType, sender, title, listened, positionMs, transcript }