hey.food

Speak first. Review before submit.

Voice is another way to fill the input box. You see the transcript and can edit, retry, type instead, or cancel before anything is submitted.

heyfood log --voice

Not in the current Rust release

The Python v0.3 client included --voice for onboarding, questions, and meal logging. The Rust rewrite removed it while the audio code is rebuilt. In heyfood v0.9.0, the Rust voice crate defines supported platforms and permissions but does not record audio or enable --voice. The backend transcription endpoint and audio:transcribe permission still exist, but deployments keep them disabled unless voice is explicitly enabled.

How one voice request works

  1. 01

    Check permission before recording

    Confirm the user is signed in and has granted audio:transcribe before opening the microphone. If the permission is missing, ask for it before recording anything.

  2. 02

    Keep the recording in memory

    Record a short WAV without writing temporary audio or transcripts to disk. Cancelling closes the microphone immediately.

  3. 03

    Send it over HTTPS

    Upload the recording once. The service checks the request and audio file separately, enforces rate limits, and keeps the audio in memory while it is processed.

  4. 04

    Review the transcript

    Accept, edit, record again, type instead, or cancel. An incomplete recording cannot be accepted unchanged for a saved profile or meal log.

  5. 05

    Submit reviewed text

    Only reviewed text reaches onboarding, meal logging, or the hosted agent. Voice and typed input use the same safety checks and confirmation steps from this point on.

Know who processes the audio

InputWho processes it
Native microphoneAudio is sent to hello.food's authenticated transcription endpoint and its configured transcription subprocessor.
Browser speech recognitionThe browser vendor processes audio. heyfood asks before switching to it and never switches by default.
Typed inputNo microphone or speech processor. Always remains available as the final fallback.

Native mode never silently opens a browser. If a microphone is unavailable in SSH, a headless session, or after permission is denied, heyfood explains the problem and leaves typed input available.

What the transcription endpoint accepts

POST /v1/audio/transcriptions
scope    audio:transcribe
purpose  onboarding | ask | log
input    mono 16-bit PCM WAV · 8–48 kHz · max 120s
output   transcript · duration · language? · model version identifier
  • Audio bytes are never written to disk, logged, or saved by the endpoint.
  • Logs contain operational metadata, never audio or transcript content.
  • The service validates request and audio-size ceilings separately.
  • Provider errors shown to the client do not expose provider internals.
  • A recording is not automatically uploaded again after an unclear network result.

Planned TUI controls

Ctrl+Space   start or stop capture
F8           fallback voice binding
/voice       start, stop, or explain unavailable support
Esc          cancel and close the microphone

Recording
Transcribing
Review
Submit

The transcript appears in the composer for review. Accepted text then follows the same request and streaming response as typed input. Spoken replies from the agent are a separate feature and are not part of this work.