Loud Enough is a voice app I built for a specific failure: you know what happened, and you still cannot get a message out of your mouth that you would send.

The line on the site is the product: say it badly, send it clearly. You talk it through out of order, double back, interrupt. What comes back is supposed to use only your words.

I did not want another voice app that cuts you off, or one that turns the conversation into a form. The healthcare visit work had already taught me that the pipeline is the product, not the record button. Loud Enough is that idea on a different job: listen, name the problem, check it, write the message.

What I actually wired

Speech in and speech out run over one WebSocket. The stack on the page is the stack I used: AssemblyAI for speech, turn-taking, and tool calling; Claude for the draft, from verified fields only; Next.js and TypeScript for the app, token minting, and the drafting route; the Web Audio API for capture, resampling, playback, and amplitude.

The permanent API key stays on the server. The browser gets a single-use token for the session. Close the tab and the conversation is gone. Nothing is stored. That is a product choice, not a privacy-policy paragraph I added later.

Four steps, two tools

Listen. Trailing off mid-thought does not end your turn. Talking over a reply stops playback. I wrote that behaviour down separately because it is the difference between a conversation and a recording.

Understand. The agent calls a real tool the moment it can name the problem and what you want. That call is what draws the brief on screen. The structure you see is the tool's arguments, not a second model summarising the first.

Verify. Every field arrives with a verbatim quote. Each quote is checked against the transcript before it is displayed. A miss is flagged and withheld from the draft, and the agent is told so it can correct itself.

Act. A second tool writes the message from verified fields only. Details you never gave become bracketed gaps. The demo on the site is a leak that was reported three times, with mold, asking for a repair and a written reply. The date was never said, so it stays [DATE OF FIRST REPORT].

That last part is the whole point. I already knew what happens when a model is allowed to finish a visit without a transcript. Loud Enough is me refusing to ship that again as a message someone might actually send.

What this is not

It is not a healthcare recorder. It is not Hangar. It is a small web app on Vercel for one job. The notes that matter next are the gaps it will not fill in and the turn-taking.