openquack

SPEC-004 — Recording overlay

Status: ratified — shipped 2026-04-27 (Sources/OpenQuackApp/RecordingOverlay.swift) Owner: apps/OpenQuack/Sources/Overlay/ (when the app target lands) Last updated: 2026-04-26

Goal

Show a small, non-intrusive floating window that surfaces recording state so the user knows when the mic is hot, when the transcription is running, and when the agent is acting. Privacy-critical: the user must always know we’re listening.

Non-goals

States

RECORDING (red dot + timer + level meter)
   │ stop hotkey
   ▼
TRANSCRIBING (orange spinner + model name)
   │ transcript ready
   ▼
DISPATCHING (purple, only if non-passthrough agent + network indicator)
   │ result returned
   ▼
DONE (green check, fade out 1s)

CANCELLED (grey, fade out 0.6s) — from any state
ERROR (red banner, dismiss after 4s) — from any state

Visual

Public surface

public enum OverlayState: Sendable {
    case hidden
    case recording(seconds: Double, level: Float)
    case transcribing(modelLabel: String)
    case dispatching(agentLabel: String, network: Bool)
    case done(message: String)
    case cancelled
    case error(message: String)
}

@MainActor
public final class OverlayController {
    public init()
    public func transition(to state: OverlayState)
}

Behaviour

Open questions

References