A voice message arrives. You tap play, and the text is already underneath the
waveform. It feels like the app read your mind. Under the hood it is a small
queue with a few strict rules: transcribe what is new, never backfill history,
do one thing at a time, and fail without making noise.
That last rule is the one users notice most. Automatic transcription is a
background convenience, not a modal task. If the remote service is down, the
voice note simply stays untranscribed; the user can still swipe to try again.
No snackbar storm, no red banners, no “something went wrong” every few seconds.
This post walks through the design of the automatic queue in Folcadi, a
language-exchange messenger built with Flutter: why it only handles live
messages, how the fallback chain works, why the “transcribe my own voice
messages too” switch is separate, and how the on-device model downloads survive
navigation.
Automatic should mean “from now on”, not “all history”
The first product decision is the scope.…