A macOS menu bar app that forwards notifications from the macOS Notification Center to a wide range of services — ntfy, Pushover, Slack, Discord, Telegram, Mattermost, Apple Messages, Home Assistant, MQTT, n8n webhooks, generic JSON HTTP endpoints, and CSV file logging. Runs silently in your menubar, polling the system notification database and pushing new notifications to configurable endpoints with template support.
- Menubar App — Lives in your menubar with no Dock icon, shows forwarding status at a glance
- Real-Time Polling — Configurable polling interval (default 5 seconds) for near-instant forwarding
- 12 Notification Services — Forward to ntfy, Pushover, Slack, Discord, Telegram, Mattermost, Apple Messages, Home Assistant, MQTT, n8n, JSON HTTP, or CSV files
- Multiple Endpoints — Configure as many service instances as you need, each with independent settings and enable/disable toggles
- Template Engine — Customize notification titles, messages, and tags using
{{placeholders}}like{{appName}},{{title}},{{body}} - App Filters — Include or exclude specific apps by bundle identifier, with auto-discovery from the notification database
- Time Scheduling — Define active time windows with weekday selection to control when forwarding is active
- Settings UI — Native SwiftUI settings window with tabs for Schedule, Filters, and Services
- Test Notifications — Send a test notification through all enabled services or test a single service before saving
| Service | Description |
|---|---|
| ntfy | Self-hostable push notification server. Supports custom topics, auth tokens, tags, and priority levels (1–5). |
| Pushover | Push notifications to iOS, Android, and desktop. Supports user key, app token, device targeting, sounds, and priority. |
| Slack | Post to Slack channels via incoming webhooks. |
| Discord | Post to Discord channels via webhooks. |
| Telegram | Send messages via Telegram Bot API with bot token and chat ID. |
| Mattermost | Post to Mattermost channels via incoming webhooks. |
| Apple Messages | Send notifications via Apple Messages using AppleScript. Requires a phone number or email. Messages.app notifications are automatically suppressed to prevent loops. |
| n8n | Trigger n8n workflow automations via webhook URL. |
| JSON HTTP | Send to any HTTP endpoint as a JSON POST/PUT with custom headers, auth token, and body template. |
| Home Assistant | Fire events on a Home Assistant instance via the Events API. Supports custom event types. |
| MQTT | Publish notifications to an MQTT broker. Supports TLS, authentication, custom topics, and payload templates. |
| CSV File | Log notifications to local CSV files with configurable columns, directory, and filename template. |
brew tap jordiboehme/tap
brew install --cask ahpushitGrab the latest DMG from GitHub Releases, open it, and drag AhPushIt to Applications.
git clone https://github.com/jordiboehme/ahpushit.git
cd ahpushit
xcodebuild -project AhPushIt/AhPushIt.xcodeproj -scheme AhPushIt -configuration Release build CONFIGURATION_BUILD_DIR=buildThen move build/AhPushIt.app to /Applications and launch it.
- macOS 14 Sonoma or later
- Full Disk Access permission (required to read the macOS Notification Center database)
- Open System Settings > Privacy & Security > Full Disk Access
- Click the + button and add
AhPushIt.app - Restart AhPushIt if it was already running
Note: Without Full Disk Access, the app cannot read the Notification Center database and will show an error in the menubar.
AhPushIt forwards macOS notifications — including their titles, subtitles, and body text — to external services. Notifications may contain sensitive information such as two-factor authentication codes, private messages, banking alerts, or personal details. Be mindful of which apps you allow through the filter settings and which services you forward to, especially when using third-party or cloud-hosted endpoints.
Once running, AhPushIt appears as a bell icon in your menubar:
- Bell icon — Active and forwarding
- Slashed bell — Paused
- Click the icon to see forwarded count, pause/resume, access settings, send a test notification, or quit
Open Settings from the menubar menu or press Cmd+,:
Schedule — Toggle time-based scheduling. Add windows with start/end times and active weekdays. Outside these windows, notifications are not forwarded.
Filters — Choose between exclude or include mode. Click "Scan DB" to auto-discover apps from your notification history. Toggle individual apps on/off. Add apps manually by bundle identifier.
Services — Add and configure notification services. Each service has its own connection settings plus shared template fields:
| Field | Description |
|---|---|
| Name | Display name for this service instance |
| Title Template | Template for notification title (default: {{title}}) |
| Message Template | Template for notification body (default: {{message}}) |
Service-specific parameters (server URLs, tokens, topics, etc.) are shown in the editor for each service type.
| Placeholder | Description |
|---|---|
{{app}} |
Bundle identifier (e.g. com.apple.Safari) |
{{appName}} |
Resolved display name (e.g. Safari) |
{{title}} |
Notification title |
{{subtitle}} |
Notification subtitle |
{{body}} |
Notification body text |
{{message}} |
Composed message (subtitle + body, or just body) |
{{date}} |
Formatted date/time |
{{fileDate}} |
Date for filenames (yyyy-MM-dd) |
{{timestamp}} |
Unix timestamp |
{{isoDate}} |
ISO 8601 date |
AhPushIt works best together with Amphetamine. Amphetamine prevents your Mac from sleeping, ensuring AhPushIt can continuously poll for notifications and forward them without interruption.
AhPushIt reads the macOS Notification Center SQLite database located at:
~/Library/Group Containers/group.com.apple.usernoted/db2/db
It polls for new records, parses the Apple plist blobs to extract app name, title, subtitle, and body, resolves bundle identifiers to display names using Spotlight (mdfind), then forwards matching notifications to your configured services.
ahpushit/
├── AhPushIt/
│ ├── AhPushIt.xcodeproj/
│ ├── App/ # App entry point, menubar UI, app state
│ ├── Polling/ # SQLite access, plist parsing, polling engine
│ ├── Services/ # Service implementations, template engine, protocol
│ ├── Settings/ # SwiftUI settings tabs (Schedule, Filters, Services)
│ ├── Models/ # Data models, settings persistence
│ └── Resources/ # Assets, entitlements
└── build/ # Built .app output
The app needs permission to read the Notification Center database. Go to System Settings > Privacy & Security > Full Disk Access and add AhPushIt.
- Check that the app is not paused (menubar icon should be a bell, not a slashed bell)
- Verify your service configuration in Settings > Services
- Use the Test button on the Services page or inside a service editor to verify connectivity
- Check that the app is not filtered out in Settings > Filters
- If using time scheduling, verify the current time falls within an active window
Display name resolution uses mdfind (Spotlight). If an app isn't indexed by Spotlight, its bundle identifier is used as a fallback.
MIT License — See LICENSE for details.