Exaflair design context Living prototype — voice coach
exploration
Idle 0/8 · 74 bpm Session
Proposal 09.2026Voice-first AI fitness coachUpwork lead

The proposal is the product.

You asked for a designer who thinks voice-first. Rather than describe it, we built the session. Start a workout on the device, talk back with the quick replies, and read the plan while the coach keeps counting.

Read the proposal
01Problem

Hands full. Ears free. Screen irrelevant.

Your app already works: a Flutter codebase, a Figma library, a logo, real users. What it does not yet have is a voice-first structure. Today voice is a microphone icon inside a screen-first product. The three places people actually use it make that arrangement fail in three different ways.

A coach in the ear changes what the screen is for. It stops being the primary surface and becomes the record: the place you glance at to confirm what was heard, and the fallback when speaking is impossible. That inversion touches every deliverable in your posting: flows, hi-fi screens, the design system, prototypes and the store listing. It is the reason to bring in a designer now, before more screens accumulate around the old assumption.

Our stance, stated up front: voice is the entry point, not a feature. Every spoken path gets an equal tap path. Nothing auto-logs without an undo. We say this here so you can disagree early.

Kitchen

Hands wet, phone on the counter

Logging a meal means talking across the room. The screen must read at arm's length and confirm what was heard without a tap.

fails: small text, modal confirmations
Gym

Loud, sweaty, mid-set

Recognition drops, headphones are in, and the phone is face-down. Cues must be short and the rep count must survive a misheard word.

fails: long sentences, taps between reps
Train

Quiet, public, no talking

People will not speak to a phone in a carriage. Voice-first here means the same flow, driven entirely by taps, with captions doing the coach's job.

fails: voice-only paths, autoplay audio
02Voice-first principles

Five rules the whole product obeys

These are not a style guide. Each one is a decision we will defend in review, and each one is visible in the demo on the right as the warm-up runs. device: warm-up

01

Voice is the entry. Tap is the equal.

Every intent the coach understands is also a visible quick reply. The gym is loud, the train is silent; the same session has to work in both. Tradeoff: quick replies cost screen space, so we cap them at five and let context choose which five.

02

Say less than a human coach would.

One clause per cue, numbers first, no encouragement filler while someone is under load. Longer lines are for rest periods only.

You've got four more repetitions to go in this set, keep it up!Four to go.
03

Confirm implicitly. Repair per item.

The coach acts on what it heard and shows the heard text in the transcript. It only asks "did you mean…" below a confidence threshold, and it never blocks the count while it waits. Tradeoff: occasional wrong actions, always undoable, instead of constant confirmations.

04

Captions are the log.

Every spoken line is mirrored as text with a timestamp. That transcript is also the workout record, so nothing the coach said is lost when the earbuds die.

05

Design to the latency budget.

Text appears before audio. The orb shows "thinking" within 100 ms. If the model has not answered by 900 ms, a local rules engine speaks the safe line first. Chapter 05 shows where those numbers come from.

03The session

Run it. Interrupt it. Break it.

The device is a working state machine, not a picture of one. Start a workout, then use the quick replies while the coach counts. The states below light up as the session moves; you can also jump straight to one. device: set in progress

Quick replyWhat the coach doesWhy it is designed that way
SlowerSwitches to a three-count tempo and cues it aloud. Persists for the rest of the set.Tempo is the single most common mid-set request; one word must be enough.
SkipIn a set: logs the reps done and moves to rest. In rest: starts the next set now.Skipping is never a failure state. The log stays honest ("7 of 8").
Reps left?Answers with the number first, then the context ("Three. Then two sets.").Numbers first survive noisy earbuds; context can be missed.
Pause / ResumeFreezes the count and the clock; the coach stops talking mid-line if needed.Pause must be instant. We stop speech synthesis, not just the timer.
RepeatReplays the last coach line exactly, with no new latency shown.Repeat is served from cache; it should never round-trip to a model.

Timings are compressed so a whole session fits in about a minute: the six-second warm-up stands for two minutes, and rests are six seconds rather than sixty. Heart-rate values are generated, marked illustrative, and never presented as measured.

04Conversation design

Three ways it goes wrong, and what happens next

Happy paths are cheap to draw. The product lives or dies on recovery. Each branch below is a real script the device can run; the first one plays automatically as you arrive here. device: misheard branch

Branch A · low confidence

"Slower" heard as "solar"

Confidence 0.41 falls under our 0.55 threshold, so the coach asks once, offers two tap answers, and keeps counting. If nobody answers in eight seconds it keeps the current pace and says so. Silence is an answer.

User
Slower (heard: "solar" · 0.41)
Coach
Did you mean slower?
Screen
quick replies → [ Yes, slower ] [ No, keep going ] · count continues
Timeout
Keeping the pace. Say it again if you want slower.
Branch B · barge-in

User interrupts a long line

The coach starts a rest-period line, the user says "skip" mid-sentence. Speech stops within 200 ms, the transcript shows the line as cut, and the intent is honoured. Tradeoff: barge-in requires echo cancellation so the coach does not interrupt itself; we specify it as a requirement, not a nice-to-have.

Coach
Good depth on that one. Keep the heels planted and drive up through the —
User
Skip
Coach
Skipping. Rest starts now.
Branch C · offline

Signal drops mid-set

Basement gyms lose signal. The on-device rules engine takes over: counting continues, cues get shorter and pre-recorded, an "offline" badge appears, and the log is written locally. When the connection returns, nothing is re-asked.

Screen
badge: Offline · on-device · latency HUD shows "local"
Coach
Signal's gone, so cues get simpler. I'm still counting.
Screen
reconnect → "Back online. Nothing lost." · log synced
05System architecture

The latency budget the design has to respect

We are proposing design, not a rebuild of your backend. But a voice UI drawn without its timing budget is fiction. This is the pipeline we design against, and the numbers that decide when the orb changes state. device: latency HUD on

120
210
320
180
70 slack
120 msend-of-speech detect
210 msSTT final transcript
320 mspolicy first token
180 msTTS first audio

Targets at p50, illustrative until measured on your stack. Below 900 ms the orb goes straight from listening to speaking. Between 900 ms and 1.5 s it shows thinking. Past 1.5 s the local rules engine says the safe line ("Counting.") and the model's answer, if it arrives, is dropped rather than spoken late.

DecisionOption we did not pickWhat we recommend and why
Speech recognitionFully on-device STT. Private and fast, but accuracy in a loud gym drops noticeably and vocabulary is fixed.pick
Streaming cloud STT with on-device VAD. Partials drive the UI early; the final transcript drives the intent.
Coach voiceOne neural voice for everything. Simplest, but every cue pays the full TTS latency.pick
Pre-rendered clips for the twenty most frequent cues; streaming TTS for everything else.
Wake word"Hey Tempo" always listening. Marketable, but battery cost and false triggers in a shared gym.pick
Session-scoped listening: the mic is open during a workout and closed otherwise, with the state always visible.
Rep countingVoice-counted ("one, two…"). Charming and useless under load.pick
IMU and optional camera on device; rep events skip STT entirely and reach the policy in under 50 ms.
06Delivery plan

Eight weeks, something shippable every Friday

The plan maps one to one onto your posting: flows and wireframes, hi-fi iOS and Android screens, a Figma design system with variables, developer-ready prototypes with Flutter handoff, and store screenshots. Week eight is buffer on purpose. device: rest

W1–W2

Audit, flows and wireframes

We read your Figma library and current build, map every roadmap feature to a flow, and wireframe the voice-first restructure. Friday W2: flows signed off, or a written list of what we disagree on.

W2–W3

Voice interaction spec

Dialogue trees for logging, workouts and insights, with the recovery branches from chapter 04, the latency rules from chapter 05, and the copy for every coach line. This is the document your engineers will actually read.

W3–W5

Design system in Figma

Components with variants, variables for colour, type, spacing and motion, and a mapping table to Flutter: each variable names its ThemeExtension field. Friday W4: system v1 in your file, not ours.

W3–W6

Hi-fi screens, iOS and Android

Voice mode, unified logging (voice, photo, text writing the same entry), live workout, weekly insights, onboarding and paywall. Platform differences are documented, not improvised.

W5–W7

Prototypes and handoff

Interactive Figma prototypes for the five core flows plus one coded state-machine prototype like the device on this page, so the Flutter team can see timing, not guess it.

W7–W8

Store screenshots and buffer

App Store and Google Play sets in en-GB, built from the real screens. Week eight absorbs review rounds. If it is not needed, the engagement ends a week early and you are not billed for it.

07Investment

Fixed scope, fixed price, two optional modules

Figures are in pounds and illustrative until we have seen your Figma file and roadmap; the shape of the offer is not. Toggle the optional modules to see the total. device: cool-down

Total, fixed price £14,200ex VAT · illustrative

Payment

40% on kick-off, 30% at the W4 milestone, 30% on handoff. Fixed price means we absorb overruns; scope changes are quoted before work starts.

Not included

Flutter implementation, backend or model work, user research recruitment fees, and copywriting outside the coach's lines. We will name a partner for any of these if you want one.

Ownership

You own every file, token and line of copy on final payment. We keep the right to show anonymised, non-confidential process work.

Data

Health data is UK GDPR special category. We design with synthetic data only and never ask for production exports.

08Team & next step

Three people, one Slack channel, no account managers

You talk to the people doing the work. Weekly 30-minute review, asynchronous Loom walkthroughs for everything else, and a shared channel where questions get answered the same day. device: summary

Product design lead

Owns flows, hi-fi screens and the review cadence. Has shipped consumer health apps on both platforms and has opinions about paywalls.

Voice interaction designer

Owns the dialogue trees, coach copy and recovery branches. Writes for the ear first and the screen second.

Design engineer, Flutter-aware

Owns the design system variables, the Flutter mapping and the coded prototype. Speaks widget tree with your engineers.

  1. A 30-minute call this week

    You show us the current app and Figma file. We show you which parts of this proposal change as a result; some will.

  2. Read-only Figma access

    Within five working days we return an annotated audit: what to keep, what to restructure, and a revised fixed price if scope moved.

  3. Kick-off on a Monday

    Week one starts the following Monday. First Friday, you have the flows in your file.

Back to the session