Releases: NikitaHerndlhofer/superwhisper-rag
v0.9.5
Menu-bar recording counter now ticks while the menu is open
v0.9.4 added .eventTracking registration to the recording-tick Timer so the callback would fire while the NSMenu was in tracking mode, but the visible "Recording M:SS" header still froze. The reason: rebuildMenu() constructs a fresh NSMenu and reassigns statusItem.menu, but NSMenu snapshots its layout when it opens — the reassignment only takes effect on the next open. So the tick was running, but it was mutating an off-screen menu.
v0.9.5 fixes this by mutating the title on the currently-tracking menu item in-place + calling NSMenu.update() to force a redraw. Same pattern applied to the "Undo auto-stop (Ns)" banner whose countdown had the identical freeze.
Also: bundle-materialisation race hardening
Added a retry pass to materialiseHelper's renameSync: when both launchd watchers (meeting-watch + meeting-menubar) extract the helper bundle concurrently on first-kickstart after brew upgrade, the loser sometimes hit ENOTEMPTY in a window the existing pre-rename rmSync couldn't close. A single retry resolves it.
Full Changelog: v0.9.4...v0.9.5
v0.9.4
Full Changelog: v0.9.3...v0.9.4
Full Changelog: v0.9.3...v0.9.4
v0.9.3
Full Changelog: v0.9.2...v0.9.3
v0.9.2
Full Changelog: v0.9.1...v0.9.2
v0.9.1
Full Changelog: v0.9.0...v0.9.1
v0.9.0
Full Changelog: v0.8.0...v0.9.0
v0.8.0
Full Changelog: v0.7.0...v0.8.0
v0.7.0
Meeting capture pipeline (phases 1–5)
Grow swrag from a read-only Super Whisper archive into a full meeting
capture + queue pipeline: detect calls event-driven (NSWorkspace +
CoreAudio notifications, no polling), offer to record, queue audio,
drive SW one item at a time, patch SW's datetime to the real capture
time, then targeted-ingest the result into the archive.
Phase 1 — SW patching backbone
- migration
005_meeting_queue.sql+meeting_queue_stateconfig key src/meeting/{queue,sw-control,patcher,processor}.ts- targeted re-ingest via
readSourceRecordingByFolder+runIndexFolder
(fixes the patched-row-missed-by-since-filter bug) - FSEvents-driven SW completion gate (mtime-quiescence based; no polling)
swrag enqueue+swrag meeting queue list/start/pause/state/discard
Phase 2 — Swift helper + event-driven detection
swift-helper/SPM package, universal Mach-O at
vendor/swrag-helper-darwin-universalswrag-helper eventssubscribes to NSWorkspace + CoreAudio
notifications, emits line-delimited JSONsrc/meeting/detect.tsconsumes events with 1.5 s edge debounceswrag meeting status+swrag meeting permissions-check
Phase 3 — Audio recorder
swift-helper/Sources/SwragHelper/Record.swift(AVAudioEngine with
VoiceProcessingIO for free AEC/AGC/NR; ScreenCaptureKit for system
audio, opt-in)src/meeting/record.tsowns the recorder subprocess lifecycleswrag meeting record start/stop
Phase 4 — Daemon + popup + menu bar
src/meeting/daemon.tsowns processor, detector, recorder; exposes
unix socket (mode 0600) with request/response ops + subscribe push
events- start-only popup (90 s timeout) on
NONE → HIGH; non-modal
notification + 5 s undo onHIGH → NONEwhile recording - Swift
menubarsubcommand connects viaNWConnection, renders from
push events (no polling) swrag meeting enable-watcher / disable-watcherinstall both launchd
agents atomically with rollback
Phase 5 — Drop the hourly cron + cleanup
- delete
enable-sync/disable-sync; collapse plist template to
keepalive-only - bootstrap rewritten: ollama → embed model → warm permissions →
install watcher → ingest → install skill → doctor - doctor: replace launchd-sync check with meeting-watcher (launchd) +
macOS permissions (mic / screen / automation) - README + architecture docs rewritten
Documented regression
Meeting recordings made via the watcher ingest immediately on SW
completion. Live SW dictations made outside the watcher pay a one-time
~5–30 s embed pass on first swrag sql (covered by ensureFresh).
Verification
276 tests pass / 727 expect() calls across 27 files. bun run typecheck clean. bun run build produces working
dist/swrag-darwin-{arm64,x64} plus the universal Swift helper.
Full Changelog: v0.6.3...v0.7.0
v0.6.3
Full Changelog: v0.6.2...v0.6.3
v0.6.2
Full Changelog: v0.6.1...v0.6.2