AI-powered dev update notifications with privacy modes and multi-channel dispatch.
Uses Claude Code to read your git diff and generate human-readable summaries, then dispatches them to any combination of Telegram, Discord, Slack, and Twitter/X channels.
- Privacy modes: Generate separate private (technical) and public (user-facing) summaries from the same push
- Multi-channel: Send to any number of channels — each with its own mode
- AI-powered: Claude Code reads the actual diff and writes the summary (not just commit messages)
- Configurable: Custom rules for what to include/exclude per mode
- Cooldown + aggregation: Avoid notification spam — aggregate changes over a configurable period
# .github/workflows/dev-updates.yml
name: Dev Updates
on:
push:
branches: [main]
jobs:
notify:
runs-on: ubuntu-latest
permissions:
contents: read
id-token: write
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 50
- uses: alphakek-ai/dev-updates-action@v1
with:
channels: |
- name: team-chat
type: telegram
chat_id: "-100123456789"
thread_id: 4
mode: private
- name: announcements
type: telegram
chat_id: "@mychannel"
mode: public
env:
CLAUDE_CODE_OAUTH_TOKEN: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
TELEGRAM_BOT_TOKEN: ${{ secrets.TELEGRAM_BOT_TOKEN }}Each channel is a YAML block with:
| Field | Required | Description |
|---|---|---|
name |
Yes | Display name for logging |
type |
Yes | telegram, discord, slack, or twitter |
mode |
Yes | dev (technical details) or community (user-facing) |
required |
No | true (default) or false. A required: false channel may fail without failing the run — use for flaky external channels (e.g. Twitter/X) so one outage doesn't red the build or trigger duplicate re-posts on the channels that succeeded. The run still fails if a required channel fails, or if no channel delivers. |
| Field | Required | Description |
|---|---|---|
chat_id |
Yes | Chat/channel ID (e.g., "-100123456789" or "@channelname") |
thread_id |
No | Topic/thread ID for supergroups |
bot_token_env |
No | Env var name for bot token (default: TELEGRAM_BOT_TOKEN) |
| Field | Required | Description |
|---|---|---|
webhook_url |
Yes* | Discord webhook URL |
webhook_url_env |
Yes* | Or: env var name containing the webhook URL |
| Field | Required | Description |
|---|---|---|
webhook_url |
Yes* | Slack incoming webhook URL |
webhook_url_env |
Yes* | Or: env var name containing the webhook URL |
| Field | Required | Description |
|---|---|---|
api_key_env |
No | Env var name for API key (default: TWITTER_API_KEY) |
api_secret_env |
No | Env var name for API secret (default: TWITTER_API_SECRET) |
access_token_env |
No | Env var name for access token (default: TWITTER_ACCESS_TOKEN) |
access_token_secret_env |
No | Env var name for access token secret (default: TWITTER_ACCESS_TOKEN_SECRET) |
Tweets are auto-truncated to 280 chars with a link to the repo.
Dev (mode: dev) summaries explain how the system changed — business logic, architecture, data flow — citing files/functions as supporting evidence rather than enumerating them. Good for dev team chats.
Community (mode: community) summaries describe each change as the user value it delivers, in plain language. No file names, technologies, or version numbers. Good for announcement channels, Twitter, community updates.
You can customize the rules:
- uses: alphakek-ai/dev-updates-action@v1
with:
community_rules: |
Lead each bullet with the user benefit, in plain language.
Never mention database, API, or infrastructure changes.
Write in an excited, marketing-friendly tone.
dev_rules: |
Lead with the architecture / business-logic change; cite files as support.
Note any breaking changes or migration steps.
Mention test coverage changes.
channels: |
...Private (team chat):
📦 DB Pool Reconnect Fix
🔧 _ensure_pool() raises InterfaceError instead of RuntimeError
🧪 Added 10 tests for reconnect/retry logic
🚀 Evolution worker recovers from Cloud SQL blips automatically
backend · 2 commits · 4 files
Public (announcement channel):
📦 Infrastructure Reliability Update
🔧 Improved database connection resilience
🧪 Expanded test coverage for critical paths
🚀 Background workers now self-heal from transient failures
backend · 2 commits · 4 files
By default, the action posts on every push. To reduce noise, set a cooldown:
name: Dev Updates
on:
push:
branches: [main]
schedule:
- cron: '0 */12 * * *' # safety net — catches skipped updates
jobs:
notify:
runs-on: ubuntu-latest
permissions:
contents: read
id-token: write
actions: read # required for cooldown state (reads previous run artifacts)
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 50
- uses: alphakek-ai/dev-updates-action@v1
with:
cooldown: '12h' # post at most once per 12 hours
channels: |
...How it works:
- First push after cooldown expires → posts immediately with all changes since last notification
- Subsequent pushes within cooldown → skipped silently
- Cron trigger → catches any skipped updates (set cron interval to match cooldown)
- State is stored in GitHub Actions variables (
DEV_UPDATES_LAST_SHA,DEV_UPDATES_LAST_AT)
Supported cooldown formats: 30m, 6h, 1d, or raw seconds.
State is stored as a workflow artifact (90-day retention). No extra permissions or PATs needed beyond the default GITHUB_TOKEN.
CLAUDE_CODE_OAUTH_TOKENsecret — for Claude Code (get one here)- Channel-specific tokens/webhooks as secrets
actions: readpermission (only if using cooldown, for reading previous run artifacts)
Apache 2.0