Skip to content

balakumardev/NameAlert

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

9 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

NameAlert

Build

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.

Features

  • 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

Requirements

  • macOS 26.0+ (Tahoe)
  • Xcode 16+
  • XcodeGen (brew install xcodegen)

Permissions

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.

Permission Persistence

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.xcodeproj in Xcode, set your team under Signing & Capabilities, and build from Xcode — permissions will then survive across local rebuilds

Install

Download the latest DMG from the GitHub Actions page (click the latest run, then download NameAlert.dmg under Artifacts).

Opening an Unsigned App

Since NameAlert is not signed with an Apple Developer certificate, Gatekeeper will block it the first time. To open it anyway:

  1. Ctrl+click (or right-click) NameAlert.appOpen
  2. 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.

Build & Run

Local Development

# 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.app

CI Build (GitHub Actions)

Every 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.app

Project Structure

NameAlert.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

License

MIT

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages