Let your assistant reach you on Slack on purpose. Route notifications by topic to the right channel at the right volume, with heartbeat-based change detection so it only pings when something actually changed.
Let an AI assistant reach you on Slack on purpose β without becoming a noise machine.
Most assistants are silent until you message them. This is a small plugin that gives yours a way to reach out first: when a draft is ready, when a build is blocked, when a number looks wrong. It pings you only when something actually changed, and it lands in the right channel at the right volume.
Three pieces:
A routing table (config/notifications.txt) β plain text you edit by
hand. Each line maps a topic to a channel and a level:
reports.daily #my-reports fyi
ops.deploy_fail #my-ops urgent push
private DM ask
A helper (bin/proactive-slacks) β one command your assistant calls:
proactive-slacks reports.daily "Daily numbers are in: https://..."
It reads the table, posts to the channel, at the level the table says. Channel decides where. Level decides how loud. They're independent.
A heartbeat β a scheduled wake (hourly is a good default) that checks
what changed and pings only on a real delta. A small state file remembers
what it already told you, so nothing nags. See SKILL.md.
| level | what happens |
|---|---|
silent | log only, no message |
fyi | post in the channel, no push |
ask | post; the first line is what the assistant needs from you |
urgent | post + lock-screen push |
A topic with no row falls back to its category, then to default. Nothing is
ever silently dropped.
export PSLACK_TOKEN="xoxb-..." # or PSLACK_TOKEN_CMD to fetch it
export PSLACK_DM_USER="U0XXXXXXX" # only if you route any topic to DM
# optional: a command that fires a lock-screen push, gets the message as last arg
export PSLACK_PUSH_CMD="/usr/local/bin/my-push"
cp config/notifications.txt config/mine.txt # edit to your channels
export PSLACK_TABLE="$(pwd)/config/mine.txt"
proactive-slacks --list # see your routes
proactive-slacks reports.daily "hello" --dry-run
Slack scopes: chat:write (plus chat:write.public, or invite the bot to
each target channel), and im:write if you use DM rows.
Because a wall of DMs is the same as no signal. Topic channels let you mute the noisy ones, keep the loud ones loud, and skim the rest when you have a minute. The point isn't to message you more. It's to message you well.
MIT.