Install
openclaw skills install @lumen01/agent-bark-notifySend Bark notifications from agents
openclaw skills install @lumen01/agent-bark-notifyUse this skill to send Bark notifications from an agent. The bundled script is scripts/bark-notify.py, resolved relative to this SKILL.md.
BARK_KEY.~/.config/bark-notify.env.--key in a shell command: it can be retained in shell history or exposed to local process inspection. Use the private config file or --key-stdin for setup.--agent <name> for agent-originated pushes so group/icon metadata can come from config.--server, --key, --group, or --icon when the user explicitly asks to override defaults.Run the bundled script from this skill directory:
python3 scripts/bark-notify.py "Title" "Body"
python3 scripts/bark-notify.py Title Body words without quoting the body
python3 scripts/bark-notify.py --agent codex --level active "Build finished" "Codex completed the requested task"
python3 scripts/bark-notify.py --agent codex --level active "Milestone reached" "The first migration finished"
Use explicit overrides only when requested:
python3 scripts/bark-notify.py --agent codex --group Custom --icon "https://example.com/custom.png" "Title" "Body"
To send WorkBuddy notifications, add a workbuddy entry to the local agent
configuration with group WorkBuddy and the server-hosted icon URL from the
example configuration.
A progress-update instruction grants permission to send useful notifications; it does not make every agent update notification-worthy.
Send a Bark notification when at least one of these is true:
Skip Bark for routine tool activity, short tasks, tests merely starting or continuing, partial findings, and updates already visible in the active conversation. If an update is too minor for a normal visible notification, usually do not send it. Use passive only when the user explicitly asks for a quiet, passive, background, or Notification Center-only delivery.
After deciding to send, choose the level from this table. Use active when the user did not specify a level and the situation does not require timeSensitive or critical:
| Situation | Level |
|---|---|
| Meaningful progress, requested task completed, or ordinary user-requested notification | active |
| Agent is blocked and needs user input soon | timeSensitive |
| Deployment failed, service is unavailable, long task crashed | timeSensitive |
| User explicitly requested an emergency/critical alert | critical |
| User explicitly requested quiet/background delivery | passive |
Rules:
active whenever a notification is worth sending, including meaningful progress and task completion.passive as a low-stakes default or a fallback for routine progress. Skip the push instead.passive only when the user explicitly requests quiet/background delivery.timeSensitive only when the user should notice promptly.critical only when explicitly requested or clearly safety/incident critical; do not use it for routine task failures.Create ~/.config/bark-notify.env manually when possible. It is private local configuration and the script saves it with mode 0600:
mkdir -p ~/.config
chmod 700 ~/.config
To initialize it without putting the key in shell history, pass the key through standard input:
read -rs BARK_KEY; printf '\n'
printf '%s\n' "$BARK_KEY" | python3 scripts/bark-notify.py --save-config --key-stdin
unset BARK_KEY
Agent metadata is optional and lives outside the repository at ~/.config/bark-notify-agents.json:
{
"codex": {
"group": "Codex",
"icon": "https://example.com/icons/codex.png"
}
}
Bark icons must be URLs reachable by the receiving device. Local .app, .icns, or filesystem paths are not valid notification icon values. If no --icon or agent icon is configured, use the built-in Agent Bark icon hosted from assets/agent-bark.png through jsDelivr. Resolution order is explicit --icon, agent environment/config, then the built-in default.
python3 scripts/bark-notify.py --help
python3 scripts/bark-notify.py --ping
python3 scripts/bark-notify.py --doctor
python3 scripts/bark-notify.py --dry-run --agent codex --level active "Done" "Ready"
--doctor reports the selected server, config-file permissions, agent/group/icon resolution, and ping result without printing the key. --dry-run prints the final request payload with device_key masked and never sends a notification.
If sending fails, first check --doctor; then inspect the reported server/network status. Preserve HTTP status and short messages without exposing credentials.