In My Head — Activity Feedback UX
Purpose
This document records the agreed visual feedback for the concurrent background stages: Recording, Transcribing, and Model polish. It is a UI decision record; it does not change the processing model or imply finer-grained model progress than the app can observe.
Recording and transcription may continue while Model polish is running. This concurrency is intentional and must remain visible without showing the same stage twice on a screen.
Shared visual language
| Stage | Shared mark | Copy and progress |
|---|---|---|
Recording |
A red, morphing circular capture control. It changes from the idle microphone to a stop-square while recording. The red surface, not the stop icon, wobbles: asymmetric corner radii and a modest scale pulse create the blob motion. |
A live |
Transcribing |
Horizontal split bars, one per real Whisper chunk. Completed bars are stable; only the current uncompleted bar animates. A rotating refresh icon is used in the compact Recent recordings row. |
Use only real chunk count and completed-chunk data. Do not invent a percentage or token-level progress. Processing treatment is blue. |
Model polish |
One sparkle/star treatment that breathes by scaling and fading. Its container varies by screen, but its motion does not. |
The user-facing name is Model polish. It represents observed polish phases, not a streaming generation claim. Processing treatment is blue. |
Stage placement
The floating activity dock shows a stage only when the current screen has no in-screen representation of that same stage. Every other concurrent stage remains available in the dock.
| Screen | In-screen feedback | Floating activity dock |
|---|---|---|
Home |
Recording occupies the capture control. A transcribing recent-recording row shows its rotating icon, label, and chunk bars. A polishing row uses the same sparkle animation as every other Model polish host. |
Model polish only. Recording and Transcribing are already represented on the screen. |
Transcript (recording or session) |
Model polish animates in the existing content action bar. This is not the top app bar. |
Recording (name, timer, wobbling control) and Transcribing (chunk bars). Exclude Model polish because the content action bar already represents it. |
Version history / comparison |
No dedicated toolbar host for Model polish. |
Recording, Transcribing, and Model polish. Model polish uses the same sparkle animation as the transcript content action. |
Floating surfaces
The activity dock is a floating, raised surface. When playback controls are also present, playback and active-stage rows share one dock rather than forming two adjacent bottom bars. The transcript’s Run Model polish control follows the same raised-surface visual language.
Implementation boundaries
-
The shared Compose marks and dock live in
ui/components/AppActivityBar.kt. -
Navigation selects the screen surface and filters duplicate stage hosts.
-
Capture and transcription expose real recording time and Whisper chunk completion. Model polish exposes phase-level state only.
-
During chunk-by-chunk capture, live progress for a recording takes precedence over its Recording/Queued presentation status. Stop may queue its remaining audio while the existing worker is still running. Home rows, the Recordings list, transcript status, and activity dock must all show that live work as
Transcribing, with the existing rotating mark and chunk bars. The numerical completed/total count stays in the notification; the app uses bar colours and animation, without a numeric count or a percentage. Actual Recording state still governs microphone controls, playback availability, and Stop actions. -
A different recording’s progress never replaces a queued label. Ready, Failed, and Model polish ignore stale transcription progress. Without an observed chunk count, show Transcribing without inventing a
0/1count. -
Whisper integration changes that would add new progress data, and model runtime integration changes, are deliberately outside this UX work.
Concurrent capture and transcription: proposal for review
One recording can now be recording and transcribing at the same time. A single replacement status hides that concurrency. Proposed treatment, not yet implemented:
-
While the microphone is active, keep Recording as the primary state with its existing red treatment and elapsed time. Show a separate secondary Transcribing indicator with the existing blue chunk bars and animation when work is running.
-
After Stop, remove the Recording indicator and retain Transcribing until the remaining audio finishes. Then use the existing Model polish/Ready states.
-
When transcription catches up during capture, the completed bars can remain steady. Recording stays visibly active; do not mark the whole recording Ready or animate a nonexistent next chunk while waiting for more audio.
-
Group both indicators with the same recording title so users can distinguish transcription of this recording from background work on an older recording.
The current correction removes numeric counts while retaining the live-state fix and existing animation. The concurrent-state layout remains a review item.
Verification
Compile and automated tests validate the stage-routing rules. Physical-device review is required for the blob motion, compact chunk animation, dock elevation, and the interaction of the shared dock with playback controls.
The 2026-11-04 live-progress follow-up passed all 42 JVM tests, including four stage/count regressions, and Debug app/test builds plus lint (zero errors). Installed Debug in place on the Motorola Edge 50 Fusion and verified the installed APK hash. The complete before/after backup archives of database, audio and preferences were byte-identical. Startup passed; the user can repeat the running recording/Stop case to review the existing animation with the corrected live stage. The subsequent clarification removes numerical app counts while retaining bars and colours. The notification keeps its existing count. The separate concurrent Recording/Transcribing presentation above remains a proposal for review.