Installing on macOS and Linux
Windows gets the tray application and a single-file installer. macOS and Linux get the same broker
without a graphical tray: a background process called agentnotifyd, plus the same agentnotify
command-line client that agents already use. The API, the bearer token, the notification model, and
SKILL.md are identical on all three platforms, so an agent written against the Windows build needs
no changes.
Status. These builds are part of the
0.0.3-alpha.1prerelease. The broker itself has been run and exercised end to end on Linux, but the macOS build and the graphical notification backends have not been run on real hardware yet. See VERIFICATION.md for exactly what has and has not been observed.
Install
curl -fsSL https://raw.githubusercontent.com/Akash97p/agent-notify/main/scripts/install.sh | sh
The script detects your platform, downloads the matching archive from GitHub Releases, verifies
its SHA-256 against the published checksum file, and installs both binaries into ~/.local/bin.
It refuses to install anything it cannot verify.
To install elsewhere or pin a version:
AGENTNOTIFY_PREFIX=/usr/local/bin AGENTNOTIFY_VERSION=v0.0.3-alpha.1 sh install.sh
Manual install
Download the archive for your platform from the
releases page, check it against
SHA256SUMS.txt, then:
tar -xzf agentnotify-linux-x64.tar.gz
install -m 0755 agentnotify-linux-x64/agentnotify ~/.local/bin/
install -m 0755 agentnotify-linux-x64/agentnotifyd ~/.local/bin/
Supported archives: linux-x64, linux-arm64, osx-x64, osx-arm64, and win-x64 for a portable
Windows copy without the installer.
macOS marks downloaded binaries with a quarantine attribute. These builds are not yet notarized, so the first run needs:
xattr -d com.apple.quarantine ~/.local/bin/agentnotify ~/.local/bin/agentnotifyd
Run the broker
agentnotifyd
It prints the address it listens on, how provider secrets are protected, and which notification backend it selected:
AgentNotify broker listening on http://127.0.0.1:47821
secrets : Secret Service keyring via secret-tool
notifications: notify-send
Press Ctrl+C to stop.
Options:
| Option | Effect |
|---|---|
--port <n> |
Listen on a different loopback port |
--config-dir <path> |
Use a different per-user data directory |
--no-desktop |
Print notifications to standard output instead of the desktop |
--version, --help |
Print version or usage and exit |
Then, from any shell:
agentnotify health
agentnotify send --agent codex --project payments --type input_required \
--key payments-decision --title "Need a decision" --message "Normalized or denormalized?"
Run it in the background
Linux (systemd user service)
Create ~/.config/systemd/user/agentnotify.service:
[Unit]
Description=AgentNotify broker
After=graphical-session.target
[Service]
ExecStart=%h/.local/bin/agentnotifyd
Restart=on-failure
[Install]
WantedBy=default.target
systemctl --user daemon-reload
systemctl --user enable --now agentnotify
agentnotifyd stops cleanly on SIGTERM, so systemctl --user stop agentnotify shuts the broker
down rather than killing it.
macOS (launchd agent)
Create ~/Library/LaunchAgents/dev.agentnotify.broker.plist:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key><string>dev.agentnotify.broker</string>
<key>ProgramArguments</key>
<array><string>/Users/YOUR_USER/.local/bin/agentnotifyd</string></array>
<key>RunAtLoad</key><true/>
<key>KeepAlive</key><true/>
</dict>
</plist>
launchctl load ~/Library/LaunchAgents/dev.agentnotify.broker.plist
Desktop notifications
| Platform | Backend | Requirement |
|---|---|---|
| Linux | notify-send |
Install libnotify-bin (Debian/Ubuntu) or libnotify (Fedora/Arch), and run inside a graphical session |
| macOS | terminal-notifier if installed, otherwise Notification Center via osascript |
None; terminal-notifier gives better grouping |
| Any | console | Automatic fallback when no graphical session is available, for example over SSH |
The console fallback means a notification is never silently dropped: if nothing can display it, the
broker writes it to standard output instead. osascript cannot render a notification that stays on
screen, so on macOS sticky attention types behave like ordinary banners; the entry still stays
active in history until it is resolved.
Where your data lives
| Path | Contents |
|---|---|
$XDG_DATA_HOME/AgentNotify or ~/.local/share/AgentNotify |
Everything below |
config.json |
Settings and the local bearer token |
agentnotify.db |
Notification history |
secret.key |
Present only when no keyring is available |
logs/ |
Daily log files |
agentnotifyd.lock |
Single-instance lock |
The directory is created 0700 and those files 0600. Do not copy or commit config.json: anyone
holding the token can post notifications to your broker.
Provider credential protection
Outbound channels are opt-in and disabled until you configure them. When you do, credentials are encrypted before they reach SQLite:
- macOS — AES-GCM under a key kept in your login keychain.
- Linux — AES-GCM under a key kept in the Secret Service keyring, via
secret-tool(libsecret-toolson Debian/Ubuntu,libsecretelsewhere). - No keyring available — AES-GCM under an owner-only
secret.keyfile. The broker warns about this at startup. It is weaker: any process running as you can read that file.
Installing secret-tool before configuring providers gets you the stronger option on Linux. See
SECURITY.md.
What is missing compared with Windows
There is no tray icon, no notification center window, and no Settings UI yet. Configure the broker by
editing config.json (see CONFIGURATION.md) and restarting it, and use the CLI
to list, resolve, and dismiss notifications. Native macOS and Linux desktop clients are planned;
see CROSS_PLATFORM.md.
Troubleshooting
Most symptoms and fixes are shared with Windows and live in TROUBLESHOOTING.md. Platform-specific ones:
| Symptom | Cause | Fix |
|---|---|---|
AgentNotify is already running for this user |
Another agentnotifyd holds the lock |
agentnotify health; stop the other instance, or pass a different --config-dir |
| Broker starts but nothing appears on screen | No notify-send, or no graphical session |
Install libnotify-bin; over SSH the console fallback is expected |
notifications: console on a desktop machine |
DISPLAY/WAYLAND_DISPLAY not visible to the service |
Ensure the user service inherits the graphical session environment |
| Startup warns about the key file | No keyring found | Install and unlock secret-tool, then re-enter provider credentials |
| macOS refuses to run the binary | Quarantine on an unsigned download | xattr -d com.apple.quarantine <path> |