Roadmap

June 10, 2026 Β· View on GitHub

Atomic tasks β€” every item cites a SPEC and maps to a PR. Agent contributors should claim a task by opening a draft PR; see AGENTS.md.

Reconciled against shipped code on 2026-05-29 (current release v2.0.0-alpha.16). Statuses below reflect what is actually on main, not what a spec proposed. The companion spec index tracks the same implementation state per spec.

Status

  • 🟑 in progress β€” draft PR or open issue, or partly implemented
  • πŸ”΅ spec β€” docs/SPECS/<id>.md exists; ready to claim
  • βšͺ idea β€” not specced yet
  • 🟒 done β€” merged to main

Adoption focus (current priority)

The product has a working foundation. The current cycle is about removing first-launch friction, fixing visible quality issues, and improving the surfaces new users land on β€” not building more features. Pick from this band first. Ordered by impact.

TaskSpecNotes
🟑Code signing + notarisation β€” kill the first-launch Gatekeeper "right-click β†’ Open" danceSPEC-025Biggest install-success unlock, still not delivered. Signing capability exists in scripts/wrap_app.sh (Developer-ID branch + hardened runtime + TSA timestamp), but no notarisation is wired (notarytool/stapler absent everywhere) and no shipped DMG is Developer-ID-signed β€” README/INSTALL still tell users to right-clickβ†’Open. Blocked on a paid Apple Developer ID ($99/yr account decision). Once that's cleared: add notarytool submit --wait + stapler staple to make_dmg.sh/release CI, then strip the Gatekeeper caveats.
πŸ”΅README demo gif β€” strong first-impression artifactSPEC-027S; cheap solo win. The landing-page-polish half is already done (og/twitter cards, banner in docs/index.md). The genuinely-missing deliverable is a looping ≀2 MB demo GIF at the top of README + landing page β€” no *.gif/*.mp4 exists in-repo yet.
🟑Mandarin auto-detect fix β€” visible quality bug (#17, open since 2026-05-09)SPEC-021M. No fix on main yet. PR #20 (draft, CI green) banks only the categorical failure-mode metrics baseline + zh corpus β€” the user-facing fix (PR-2, model-layer language handling) is the actual deliverable. Land #20 as the baseline, then ship the fix. Pairs with #62 below.
🟑Sparkle auto-update β€” existing users stay current without reinstallingSPEC-026Far past spec-only: dependency + Updates pane + framework bundling all shipped (#40/#50/#49). But auto-install is a deliberate no-op β€” SUPublicEDKey omitted, appcast.xml ships zero items. To finish: generate EdDSA keys, commit the public key, sign + publish appcast items (PR-C). Gated behind SPEC-025 (notarised signed builds) for a trustworthy update path.
πŸ”΅Voice reply to live sessions β€” modifier-key + notification voice-reply actionSPEC-031aS; spec merged (#54), zero implementation on main. Injection mechanism (--resume -p vs daemon socket) resolved in impl PR.
βšͺRe-transcribe a past dictation from History β€” recovery without re-speakingβ€” (#62)New 2026-05-29 feature request. Re-run stored audio through transcription/polish from the History view, with optional explicit language + model override. Directly mitigates #17's wrong-language case; reuses local history (SPEC-014). Needs a spec; good retention item.
βšͺSubmission tracking for awesome-mac / awesome-llm / awesome-swift listsβ€”quiet but durable inbound
βšͺQuarterly bench refresh β€” durable artifact + monthly relaunch hookβ€”leverages existing 5Γ—2Γ—177 bench

Pending docs PRs (renumber required)

Two spec-doc PRs are clean and CI-green but cite already-assigned SPEC numbers and must be renumbered to the next free monotonic IDs before merge. They cross-reference each other, so renumber as a coordinated pair; do not rename the branches (renaming an open PR head ref can close it).

PRBecomesWhatAction
#41SPEC-033Privacy-respecting Pages visitor analytics (GoatCounter)Renumber 031β†’033; fix body "Adds SPEC-028"β†’033; its SPEC-032 cross-ref β†’ SPEC-034. Then merge.
#42SPEC-034Active-install count via Sparkle appcast hits (Cloudflare Worker)Renumber 032β†’034; fix body "Adds SPEC-029"β†’034; its two SPEC-031 cross-refs β†’ SPEC-033. Then merge. Impl gated on SPEC-026.

Feature backlog (deferred until adoption signal improves)

These have SPECs and are ready to claim, but we're holding new feature scope until install + retention pipelines are strong enough to justify the surface area. Pick from here only when Adoption focus is empty.

TaskSpecNotes
🟑Custom dictionary auto-learn (PR-A as #32; PR-B/C deferred)SPEC-022M. PR #32 (post-paste AXObserver + correction store) is CI-green and merge-clean but on hold β€” it sits in this deferred band and Adoption focus isn't empty. No auto-learn code is on main. (Distinct from the shipped static-dictionary seed, PR #59, made invisible again in alpha.16.)
πŸ”΅Agent session protocol + PassthroughAgent + conversation panelSPEC-006M
πŸ”΅ClaudeCodeAgent β€” long-lived subprocess, streaming eventsSPEC-006M
πŸ”΅Approval prompt UX (overlay morph + buttons)SPEC-006S
πŸ”΅Settings β€” Privacy + Agent panesSPEC-006S; lands with agent impl
πŸ”΅TextPolishEngine protocol + OllamaPolishEngine (HTTP)SPEC-007S
πŸ”΅MLXLMPolishEngine (in-process via mlx-swift-lm)SPEC-007M
πŸ”΅Settings β†’ Polish pane (engine picker, model picker)SPEC-007S
πŸ”΅Bench polish WER delta + latency on openquack-benchSPEC-007S
πŸ”΅Domain-term accuracy bench (e.g. "Claude Code" not "cloud code")SPEC-007S
πŸ”΅"Send-confidence" bench: % of utterances clean enough to ship as-isSPEC-007S
πŸ”΅Engine prompt-token cache β€” offline-path parity for customWordsSPEC-032S; perf-fix groundwork for re-shipping the dictionary seed default
πŸ”΅Per-app tone profilesSPEC-024M; needs SPEC-007 first
πŸ”΅App localisation (i18n) β€” runtime UI strings (READMEs already translated)SPEC-019M
πŸ”΅ANE-cache-only model footprint (investigation)SPEC-029S
πŸ”΅ANE cache footprint: volunteer measurement campaignSPEC-030S
βšͺOllamaAgent (local HTTP)SPEC-006 extS
βšͺMLXLMAgent (in-process via mlx-swift-lm)SPEC-006 extM
βšͺActive-app context: feed foreground app + focused field text into Whisper prompt bias and polish/agent promptβ€”M
βšͺInvestigate streaming for medium-length (15–30s) audio: bench WER vs. wall-time at lower targetChunkSecondsSPEC-012 extS
βšͺLive partial transcripts in pill/popover while speakingβ€”M
βšͺSystem-audio capture (meeting mode)β€”ScreenCaptureKit
βšͺAction confirmation UI for high-risk agent callsβ€”privacy gate
βšͺPer-agent transcript history pane (opt-in, local-only)β€”β€”
βšͺLinux / Windows portsβ€”post-2.0

Done

TaskSpecNotes
🟒Agent kickoff: voice-launched claude --bg session via separate hotkey β€” daemon-managed, notification-drivenSPEC-031shipped in v2.0.0-alpha.14 (#53); post-ship fixes #57/#58
🟒Update flow: install-aware banner + silent one-click brew upgrade (no Terminal, quit-first relaunch)SPEC-011shipped via c193f0e; SemVer-precedence fix #61
🟒Copy button on the last-transcript cardSPEC-020merged in #18
🟒Send-feedback menu item β€” one click from status item to GitHub issue chooserSPEC-018merged in #5
🟒Dictation distribution + personal performance stats (Longest dictation, avg realtime Γ—, length histogram)SPEC-028merged in #45
🟒fn / Globe key as a bindable hotkey (bare fn or fn+key) β€” closes #23SPEC-003ainfra #28 (PR-A) + UI wiring a8371b8 (PR-B)
🟒Launch at login (SMAppService toggle in Settings β†’ General) β€” closes #29SPEC-023merged in #33 (reconcile) + #39 (UI) β€” issue #29 still open, needs closing
🟒Recording overlay follows the cursor across monitors β€” closes #25SPEC-004merged in #27
🟒Usage stats pane: words dictated, time saved, audio processed β€” local-onlySPEC-013merged in c91da06
🟒Local audio + transcript history β€” local-only, retention capSPEC-014merged in c91da06
🟒Stream transcription for long audio (>~30s) β€” chunk while recordingSPEC-012perf; user never sees partials
🟒App shell β€” SwiftPM target, menu bar, About panelSPEC-010β€”
🟒Audio capture β€” AVAudioEngine β†’ 16 kHz mono WAVSPEC-001β€”
🟒Global hotkey (βŒƒβ‡§Space toggle, KeyboardShortcuts pkg)SPEC-003β€”
🟒Record β†’ WhisperKit medium (en) β†’ transcript in popover + clipboardSPEC-002β€”
🟒Floating recording-state pill (top-centre, click-through)SPEC-004β€”
🟒CGEvent ⌘V auto-paste at cursor (Accessibility prompt + clipboard fallback)SPEC-005β€”
🟒Onboarding flow (Welcome β†’ Mic β†’ Paste β†’ Hotkey β†’ Done)β€”β€”
🟒Settings scene MVP (General / Models / Shortcut / About)β€”β€”
🟒Smart text post-processing (capitalise, punct, fillers)β€”β€”
🟒Live level meter + push-to-talkSPEC-001 extβ€”
🟒VAD auto-stop + sounds + custom dictionaryβ€”β€”
🟒App icon (procedural cream-gradient duck)β€”β€”
🟒DMG + Homebrew cask + README polishβ€”β€”
🟒WhisperKit engineSPEC-002primary; Apple Silicon Metal
🟒Lightning engine (Python subprocess)SPEC-002bench-only baseline
🟒Metrics: WER / CER / RTF / RSS / cold-startSPEC-002OpenQuackKit/Metrics/
🟒Corpus: 177 clips (TTS / multilingual / LibriSpeech / noise-aug)β€”bench/corpus/
🟒Bench rerun on enriched corpus β†’ BENCHMARKS.mdβ€”M4/16GB matrix
🟒openquack-cli (single-file transcribe)SPEC-002β€”
🟒SPM scaffolding (Kit + bench + CLI)β€”Package.swift, three targets
🟒Vision + roadmap + AGENTS.md + spec scaffoldβ€”β€”

Becoming autonomous

North-star reflection, not a committed milestone. No item below is claimed, dated, or gated on the Adoption focus band. It records where the repo would have to change to let agents run the contribution loop on their own β€” so the gaps are written down, not rediscovered.

What exists β€” the contract. Specs-as-law (AGENTS.md), four bench harnesses (openquack-bench / -stream-bench / -polish-bench / -bias-bench), issue + PR templates, the GTM trackers and playbooks, and persistent agent memory. An agent that reads these knows what good work looks like and how it is judged.

The meta-gap β€” no machinery. The contract is human-readable, not machine-executable. .claude/ holds only worktrees/ β€” no committed agents/, commands/, workflows/, or settings. AGENTS.md is a manual a human (or a prompted agent) follows by hand; nothing runs the backlog β†’ claim β†’ branch β†’ implement β†’ draft-PR loop. CI smoke-tests the tiny model on the short corpus only, so quality regressions pass unseen.

Three unlocks.

UnlockSpecState
πŸ”΅Committed .claude/ agent harness β€” named roles, saved workflows, trigger + permissions model with human gates on irreversible stepsSPEC-037spec proposal
πŸ”΅CI eval-gate β€” fetchable corpus, medium-model WER/RTF thresholds on every quality-path PRSPEC-038spec proposal
🟑Signed, tag-triggered release pipeline β€” the cut a release-bot can only PREP todaySPEC-025partial
βšͺPrivacy-preserving field-feedback loop β€” local self-diagnosis β†’ consented reports β†’ opt-in aggregatesSPEC-036 / 039 / 040building on shipped diagnostics

Autonomy ceilings, per domain.

  • Product β€” privacy-capped. No telemetry by design, so field validation never closes to a metric automatically; the loop ends at a consented, human-attached report. Self-diagnosis can be autonomous; collection cannot.
  • Ops β€” needs signing. Release stays manual (DMG + appcast + cask SHA) until SPEC-025 lands a notarised, tag-triggered cut. A bot may prep the release; a human gates it.
  • GTM β€” assisted, not autonomous. Platform anti-bot defences and fragile community trust (see the flagged HN launch) make autonomous public posting a liability. Target is agent-assisted: draft, schedule, scan, measure β€” with a human gate on every outward post.

Realistic target. Agents run the loop; humans gate the irreversible and outward steps β€” merge, release, public post.


How to claim a task

  1. Pick from Adoption focus first. Move to Feature backlog only if Adoption is empty.
  2. Open an issue using the Agent Task template; mark yourself as owner.
  3. Read the cited SPEC.
  4. Open a draft PR within ~24h naming the task in the title.
  5. Follow AGENTS.md for PR shape and required tests.