Euphora
LiveEuphora is a speech and voice practice app built around one refusal: it will not score your fluency with AI.
- 5
- lanes
- 6
- courses
- 42
- lessons
- 0
- fluency scores
The problem
People who stutter, and people doing gender-affirming voice work, are underserved twice: first by clinical access, then by the current generation of AI speech coaches. Every consumer AI speech coach scores something, filler rate, pace, fluency, and not one publishes independent validation for what that score actually measures. For someone who stutters, a fluency score is actively counterproductive: it reinforces exactly the "sound fluent no matter what" goal that evidence-based stuttering therapy tries to move people away from. The detection does not hold up either: speech recognition normalizes disfluencies out before you can measure them, and a silent block, the moment that matters most, produces no audio at all. I built Euphora on the premise that the honest thing to do in this category is refuse to build that feature.
Approach
Tiered feedback
Euphora tiers its feedback by whether the underlying measurement is actually valid, not by what would demo well. Pitch is a real, measurable acoustic property, so on-device pitch and resonance tracking is the one automated feedback surface, built for the voice masculinization and feminization lanes, with a formant and spectrogram view added because a pitch-only tracker is a known failure mode in gender-affirming voice apps. Rate and variability metrics are switched off entirely for the stuttering lane, because rate pressure worsens blocks. Every technique carries an evidence tier, A through D, and no coached technique is rated A. The one finding that clears that bar, testosterone's effect on pitch, is a biological fact, not something a person practices. That honesty is the product.
Staying, without scoring you
The same discipline extends to how the app keeps people coming back. A weekly review has you predict how a recording will sound before you listen to it, then reflect, never scored, always skippable. A lapse-return flow welcomes you back after a gap without ever surfacing how long you were away. Both are grounded in published research on habit formation, cited on a public /research page sharing the same evidence-tier legend as the in-app badges, so the two cannot drift apart.
Nothing leaves the device
Recordings live in IndexedDB in the browser, or the device's own filesystem via Capacitor on iOS and Android. There is no backend, no account, no analytics SDK, and the capture files carry header comments stating there is no network code in them "and there must never be." Live transcription via the Web Speech API was evaluated and ruled out permanently because it would send audio to third parties. The only things that ever leave are user-initiated exports through the OS share sheet: a backup, or a clinician-handoff file, since the app supplements therapy rather than replacing it, and every relevant screen points to real clinicians, ASHA, the National Stuttering Association, WPATH. Of the three apps I have shipped, this is the strictest privacy posture, and the simplest: no server to trust, because there is no server.

Pitch and resonance tracking active, the one automated feedback surface in the app. Testosterone's effect on pitch is the only technique rated evidence-tier A: a biological fact, not something practiced.
Pitch and resonance tracking active, the same surface as masculinization. Every technique still carries an evidence tier, A through D, and coached pitch work tops out below A.
Rate and variability feedback switched off entirely. Rate pressure worsens blocks, so this lane gets none of the automated tracking the other two do.
The deliberate choice
The refusal to score fluency is not a policy page, it is enforced in the codebase. When I say the ethics are architectural, I mean the CI fails if they regress.
- The self-rating rubric has a unit test that fails if its anchor text ever mentions stuttering, blocks, or disfluency
- The session metrics model carries fields for pitch and rate with a comment that fluency never appears there, and a repo-wide search confirms nothing populates one
- Each technique is a target in the data model, tiered safe, caution, or gated; gated targets route through an explanatory click-through before they can be activated, and the lane rules that keep voice masculinization and feminization mutually exclusive are tested functions, not spec prose
- The test rig synthesizes its own microphone: a vowel synthesizer generates ground-truth signals from published formant targets, and seven headless smoke scripts drive the real app through fake audio
Why I built it
I built Euphora because I needed it. I stutter, and I learned to use my voice the slow way: years of canvassing meant thousands of conversations with strangers where you cannot avoid the hard words and you cannot wait until you feel ready. That built the willingness to keep talking through the fear, but willingness only goes so far without structure. So I started practicing the way a speech therapist would actually structure it, and eventually built the practice into an app. I still stutter. That is the point. What changed was the fear around it, and Euphora is built for that change, not for a fluency number.
Stack
- TypeScript, React, React Router, Vite (client-side SPA), installable PWA
- Capacitor wrapping the same build for iOS and Android
- On-device DSP: pitchy (McLeod Pitch Method) for pitch, custom FFT and LPC for formants and resonance, no cloud speech API, no ML scoring of user speech
- Dexie/IndexedDB on web, Capacitor Filesystem on native, one storage adapter interface
- Cloudflare Workers serving the static build
- No backend, no accounts, no analytics
Status & links
Live at euphora.app with the full MVP: five lanes, six courses and 42 lessons, eleven guided exercises, a guided-practice engine, on-device pitch and resonance tracking, weekly review, and the public /research page. Native iOS and Android builds are packaged but not yet store-submitted, and monetization is built and switched off.