LiveTranscriber uses ActivityKit to show recording status on the Lock Screen and in Dynamic Island.
TranscriptionLiveActivityCoordinator owns ActivityKit requests and updates. LiveTranscriptionManager calls it when recording state or final transcript content changes.
ContentView handles the Live Activity deep link:
livetranscriber://stop-recording
The URL stops the current recording, saves the returned RecordingDraft, reloads the store, and plays the same haptic path as the in-app stop/save flow.
The widget must not rely on a static elapsed-time string while recording. The content state carries timerReferenceDate, and the widget renders:
Text(state.timerReferenceDate, style: .timer)
This lets the system update elapsed time without app-driven per-second Activity updates.
When recording is paused or stopped, the widget shows fixed elapsedText.
Live Activity transcript text is updated only when a transcript segment becomes final.
Policy:
LiveActivitySnapshot.This avoids excessive ActivityKit updates while still keeping the newest stable text visible.
The manager sends the suffix of the latest transcript lines, capped at 700 characters. The widget then trims again for each presentation:
The Lock Screen view uses compact metric blocks:
The Lock Screen content uses compact padding, secondary-system background tint, Reddit Sans, monospaced timer digits, and a red stop action while recording.
Expanded Dynamic Island:
Compact and minimal presentations use a small status glyph and compact elapsed time. The status dot ring is disabled in compact/minimal modes to avoid clipping.
Compact trailing is width-constrained for elapsed time. Expanded regions use leading/trailing horizontal padding from LiveActivityLayout.