Notifiers deliver AO events — session stuck, PR opened, review requested, CI failed — to wherever you actually pay attention.
Stacking notifiers
Notifier config is a map. Add as many named notifiers as you want, then route
priorities with notificationRouting:
notifiers:
desktop:
plugin: desktop
discord:
plugin: discord
webhookUrl: ${DISCORD_URL}
slack:
plugin: slack
webhookUrl: ${SLACK_URL}
notificationRouting:
urgent: [desktop, discord, slack]
action: [discord, slack]
warning: [slack]
info: []
Setup commands can write this routing for you with --routing-preset urgent-only, urgent-action, or all. AO does not dedupe across channels, so
route only the priorities each destination should receive.
Testing
ao notify test --to slack --template basic
ao notify test --route urgent
ao notify test --all --dry-run
Use --to for one target, --route for a priority route, or --all for every
configured/default/routed notifier. Without --dry-run, real providers receive
a real test message.
What gets notified
| Event | When |
|---|---|
session.spawned | ao spawn succeeds |
session.working | Agent is actively editing code |
pr.opened | Agent pushed a branch and opened a PR |
ci.failed | Required check fails |
review.requested | Reviewer asks for changes |
session.mergeable | CI green, no blockers |
session.merged | PR merged |
session.blocked | Agent is stuck — you need to intervene |
You can tune which events fire via reactions config.