Install AgentNotify — instructions for a coding agent
You are a coding agent (Claude Code, Codex, OpenCode, or similar) and the person you work for has asked you to install AgentNotify on this computer, set it up, and prove it works. Follow these steps in order. Work in the terminal you already have. At the end, show the person the checklist described in Report and nothing longer.
AgentNotify is a local notification broker for coding agents: agents tell it when a task finishes, when they need an answer, or when something failed, and it shows a desktop notification (and, if the person sets it up, sends it to their phone). It also has a web interface, token usage and live quota views for agent accounts, and an optional local model router. Project: https://github.com/Akash97p/agent-notify.
Rules
- Never print or paste the bearer token (
agentnotify token,authTokeninconfig.json) or the router key. Commands below that need them read them themselves. - Do not change the person's agent configuration beyond what this file says. Installing the AgentNotify skill for yourself is in scope. Installing hook harnesses, connecting agents to the model router, turning the router on, pairing a phone Relay, or adding providers is not — mention them at the end as optional next steps.
- Ask before anything that needs administrator rights or that accepts a licence on the person's behalf. The default install needs neither.
- If a step fails, do not guess around it. Record the failure, carry on with the checks that can still run, and report it as ❌ with the reason.
- The broker listens only on
127.0.0.1, port47821by default. Ifagentnotify ui --printshows a different address, use that one everywhere below.
1. Find the platform and what is already there
Work out the OS and CPU (uname -sm on macOS/Linux; on Windows, $env:PROCESSOR_ARCHITECTURE in
PowerShell). If you are inside WSL, install the Windows build: AgentNotify runs on the Windows
side and WSL reaches it on 127.0.0.1.
Check for an existing install: agentnotify --version (Windows: agentnotify.exe --version). If it is
already installed, find the newest release (step 2) and update only if it is newer; otherwise keep it
and go to step 3.
The newest build is a prerelease, so GitHub's releases/latest link does not find it. Ask the API
instead and take the first entry:
curl -fsSL "https://api.github.com/repos/Akash97p/agent-notify/releases?per_page=1"
2. Install
macOS and Linux
curl -fsSL https://raw.githubusercontent.com/Akash97p/agent-notify/main/scripts/install.sh | sh
It picks the newest release (prereleases included), verifies the SHA-256 checksum, refuses anything it
cannot verify, and installs agentnotify (CLI) and agentnotifyd (broker) into ~/.local/bin. A
macOS archive that contains agentnotify-menubar installs it too, and the script re-signs every
installed executable. Make sure ~/.local/bin is on PATH
for the checks below (or call the binaries by full path).
If a binary exits immediately with status 137 on macOS, re-sign it and clear the quarantine flag:
codesign --force --sign - ~/.local/bin/agentnotify ~/.local/bin/agentnotifyd \
~/.local/bin/agentnotify-menubar 2>/dev/null || true
xattr -d com.apple.quarantine ~/.local/bin/agentnotify ~/.local/bin/agentnotifyd \
~/.local/bin/agentnotify-menubar 2>/dev/null
Start the broker so it survives logouts and reboots. Linux has no tray; on macOS the broker starts the installed quota-only status item.
macOS — a launchd agent (replace the path if HOME differs):
mkdir -p ~/Library/LaunchAgents
cat > ~/Library/LaunchAgents/dev.agentnotify.broker.plist <<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>$HOME/.local/bin/agentnotifyd</string></array>
<key>RunAtLoad</key><true/>
<key>KeepAlive</key><true/>
</dict>
</plist>
PLIST
launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/dev.agentnotify.broker.plist 2>/dev/null \
|| launchctl kickstart -k gui/$(id -u)/dev.agentnotify.broker
If the plist already existed (an update), just restart it:
launchctl kickstart -k gui/$(id -u)/dev.agentnotify.broker.
Linux — a systemd user service:
mkdir -p ~/.config/systemd/user
cat > ~/.config/systemd/user/agentnotify.service <<UNIT
[Unit]
Description=AgentNotify broker
[Service]
ExecStart=%h/.local/bin/agentnotifyd
Restart=on-failure
[Install]
WantedBy=default.target
UNIT
systemctl --user daemon-reload
systemctl --user enable --now agentnotify.service
On an update, systemctl --user restart agentnotify.service. Without systemd, run
nohup agentnotifyd >/dev/null 2>&1 & and say in the report that it will not survive a reboot.
Windows
Download AgentNotifySetup.exe from the newest release's assets (step 1) and run it. It installs per
user under %LOCALAPPDATA%\Programs\AgentNotify with no administrator rights, adds the CLI to the
user PATH, starts the tray app, and starts it at sign-in. Run it normally so the person sees and
accepts the licence. Use the silent mode (AgentNotifySetup.exe --silent --accept-license) only if
the person has told you they accept the MIT licence; an update needs no licence switch
(--silent alone). Windows may show a SmartScreen prompt because the installer is not code-signed.
A new PATH is only visible to new shells. If agentnotify.exe is not found afterwards, call
"$env:LOCALAPPDATA\Programs\AgentNotify\agentnotify.exe" directly.
3. Check the broker
agentnotify --version
agentnotify health
health must print JSON with "status": "ok" (and the version, when it can authenticate). If it
cannot connect, the broker is not running: check the service from step 2 (macOS:
launchctl print gui/$(id -u)/dev.agentnotify.broker; Linux: systemctl --user status agentnotify;
Windows: the tray icon). Its log is under the data directory: ~/Library/Application Support/AgentNotify/logs
on macOS, ~/.local/share/AgentNotify/logs on Linux,
%LOCALAPPDATA%\AgentNotify\logs on Windows.
Then prove a notification goes through, and clean it up:
agentnotify send --title "AgentNotify installed" --message "Test from your coding agent" --type success --key agentnotify-install-check
agentnotify list --limit 5
The new notification must appear in list. Ask the person whether they saw a desktop notification;
if you cannot ask, report it as sent but not confirmed. Resolve it afterwards with
agentnotify resolve <id> using the id from list.
4. Install the skill for yourself
This is what makes you (and future sessions) notify the person without being told each time.
agentnotify install-skill claude # if you are Claude Code
agentnotify install-skill codex # if you are Codex
agentnotify install-skill opencode # if you are OpenCode
For any other agent, pass its skills folder: agentnotify install-skill claude --path <skills-root>
installs the same SKILL.md there. If the file already exists and differs, the command refuses; say so
rather than adding --force. Confirm the file exists afterwards (for example
~/.claude/skills/agentnotify/SKILL.md).
5. Check the features
Every check below is a read-only call to the local web interface. Its /ui/api/... endpoints need no
token on this machine.
BASE="$(agentnotify ui --print 2>/dev/null | sed 's#/ui/*$##')"; BASE="${BASE:-http://127.0.0.1:47821}"
| Feature | How to check | Works when |
|---|---|---|
| Web interface | curl -s -o /dev/null -w '%{http_code}' "$BASE/ui/" |
200; tell the person the address, $BASE/ui/ |
| Agents detected | curl -s "$BASE/ui/api/agents" |
accounts lists at least one agent account (Codex, Claude Code, …); name them and whether each has the skill and harness installed |
| Token usage | curl -s "$BASE/ui/api/usage" |
events greater than 0, with sources naming the agents it read |
| Live quota | curl -s "$BASE/ui/api/quota" |
at least one entry in providers whose status is not an error; name each account and its status |
| Model router | curl -s "$BASE/ui/api/router" and curl -s "$BASE/ui/api/router/agents" |
the endpoints answer. Report enabled and how many upstreams it has. It is optional and off by default, so off is not a failure |
| Phone delivery (Relay) | curl -s "$BASE/ui/api/providers" |
optional; report whether any provider is enabled |
On Windows use curl.exe or Invoke-RestMethod. A feature with no data (a fresh machine with no agent
history has no usage) is a warning, not a failure: say what is missing.
6. Report
Finish with this, and only this, filled in from what you actually observed. Use ✅ for works, ❌ for does not work (with the reason in a few words), and ⚪ for an optional feature that is simply not set up.
AgentNotify <version> installed on <OS> and verified.
✅ Broker running — <service kind>, http://127.0.0.1:47821
✅ CLI — agentnotify <version>
✅ Test notification — sent and listed (desktop banner: seen / not confirmed)
✅ Web interface — http://127.0.0.1:47821/ui/
✅ Skill installed — <path>
✅ Agents detected — <names>
✅ Token usage — <n> events from <sources>
✅ Live quota — <accounts and status>
⚪ Model router — off (optional)
⚪ Phone delivery — not set up (optional)
Next steps (optional): <only the ones not already done>
The optional next steps to choose from: the hook harness for automatic notifications
(agentnotify install-harness <agent>) for an agent that lacks it, pairing a phone (Delivery →
Channels in the web interface), and the model router (Model router → Providers). Leave out any that
the checks showed is already set up; if all are, leave the line out.