Native macOS 26+ (Tahoe) menu-bar app that continuously transcribes audio on-device using Apple's Speech framework, watches for user-defined keywords, and fires configurable alerts.
Sits in the menu bar — no Dock icon, no window. Pick a keyword (like your name), and get notified whenever it's spoken over system audio or your microphone.
- Two audio sources — System Audio (Zoom/Teams/YouTube) via ScreenCaptureKit, or Microphone via AVAudioEngine
- On-device speech recognition — uses macOS 26's
SpeechAnalyzer+SpeechTranscriber; nothing leaves your machine - Fuzzy keyword matching — Damerau–Levenshtein distance for near-miss detection (typos, mumbles, accents)
- Per-keyword cooldown — prevent spam from repeated mentions
- Five alert channels:
| Alert | Description |
|---|---|
| System Beep | Plays any macOS system sound (Glass, Ping, Submarine, etc.) |
| macOS Notification | Standard notification center banner |
| Persistent Alert | Looping sound + modal dialog that must be dismissed |
| ntfy.sh Push | Push notification to any device via ntfy.sh |
| CallMeBot Telegram | Free Telegram voice call via CallMeBot TTS |
- Launch at login via
SMAppService - Global cooldown — suppress all alerts for N seconds after a match
- Test buttons in Settings to verify each alert channel
- macOS 26.0+ (Tahoe)
- Xcode 16+
- XcodeGen (
brew install xcodegen)
| Source | Permission Required |
|---|---|
| System Audio | Screen & System Audio Recording (TCC) |
| Microphone | Microphone + Speech Recognition |
After granting Screen Recording, you must quit and relaunch the app for the permission to take effect.
TCC permissions (Screen Recording, Microphone, Speech Recognition) are stored in macOS's TCC database and persist across restarts — you only grant them once per app build.
However, because CI builds are not signed with an Apple Developer certificate, each new DMG build gets a different ad-hoc code signature. This means macOS may re-prompt for permissions after you update to a new build. To avoid this:
- Use a single DMG build for as long as possible before upgrading
- Or sign locally with your own development certificate: open
NameAlert.xcodeprojin Xcode, set your team under Signing & Capabilities, and build from Xcode — permissions will then survive across local rebuilds
Download the latest DMG from the GitHub Actions page (click the latest run, then download NameAlert.dmg under Artifacts).
Since NameAlert is not signed with an Apple Developer certificate, Gatekeeper will block it the first time. To open it anyway:
- Ctrl+click (or right-click) NameAlert.app → Open
- Click Open in the dialog
This registers a Gatekeeper exception for that specific build. You only need to do this once per DMG download.
On Apple Silicon (M-series), you may also need to browse to the app in Finder, Ctrl+click → Open to get past the "cannot be opened because the developer cannot be verified" warning.
# Generate Xcode project
xcodegen generate
# Build and run from Xcode, or use the command line:
xcodebuild -project NameAlert.xcodeproj -scheme NameAlert -configuration Debug \
-destination 'platform=macOS' build
# Run tests
xcodebuild -project NameAlert.xcodeproj -scheme NameAlert \
-destination 'platform=macOS' test
# Launch the built app
open ~/Library/Developer/Xcode/DerivedData/NameAlert-*/Build/Products/Debug/NameAlert.appEvery push to main and every pull request triggers an automated build and packages a DMG. See the workflow at .github/workflows/build.yml.
# Generate Xcode project
xcodegen generate
# Build
xcodebuild -project NameAlert.xcodeproj -scheme NameAlert -configuration Debug \
-destination 'platform=macOS' build
# Test
xcodebuild -project NameAlert.xcodeproj -scheme NameAlert \
-destination 'platform=macOS' test
# Launch
open ~/Library/Developer/Xcode/DerivedData/NameAlert-*/Build/Products/Debug/NameAlert.appNameAlert.xcodeproj/ — Generated by XcodeGen (do not edit directly)
project.yml — XcodeGen project spec (source of truth)
NameAlert/
├── NameAlertApp.swift — MenuBarExtra + Settings + lifecycle
├── Menu/
│ └── MenuBarContent.swift — Status item, listening toggle, recent hits
├── Core/
│ ├── ListeningEngine.swift — Wires transcription → matching → alerts
│ ├── TranscriptionService.swift — SpeechAnalyzer/Transcriber actor (mic + system audio)
│ ├── SystemAudioCapture.swift — SCStream actor for system audio capture
│ ├── KeywordMatcher.swift — Rolling token window + fuzzy matching
│ ├── Hit.swift — Match result value type
│ └── AlertCoordinator.swift — Parallel alert dispatch with cooldown
├── Alerts/
│ ├── Alert.swift — Alert protocol
│ ├── BeepAlert.swift — System sound
│ ├── NotificationAlert.swift — macOS Notification Center
│ ├── PersistentAlert.swift — Looping sound + modal dialog
│ ├── NtfyAlert.swift — ntfy.sh push
│ └── CallMeBotAlert.swift — Telegram voice call
├── Settings/
│ ├── AppSettings.swift — @AppStorage-backed model
│ ├── SettingsView.swift — Tabbed settings window
│ ├── KeywordsTab.swift — Keyword list management
│ └── AlertsTab.swift — Alert channel toggles & config
└── Info.plist
NameAlertTests/
├── KeywordMatcherTests.swift
└── AlertCoordinatorTests.swift
MIT