Watch Action: GitHub Actions Monitoring with Audio Alerts

A Claude Code skill that polls GitHub Actions runs and fires macOS audio alerts when they complete, so you never miss a build result.

Push, Walk Away, Get Yelled At

You push a commit, kick off a CI build, and then… what? Tab back to GitHub every 30 seconds? Open the Actions tab, refresh, wait, refresh again? Most of us end up context-switching to something else and forgetting about the build entirely, only to discover 45 minutes later that it failed on the second step.

I wanted something simpler. Push the branch, walk away from the keyboard — go make coffee, help one of the kids with math, argue with Nurul about what's for dinner — and have the computer tell me when the build is done. Not a browser notification I'll ignore. Not an email I'll read tomorrow. An actual voice, out loud, that keeps talking until I come back and acknowledge it.

So I built a skill that turns my MacBook into a very persistent build monitor.

How It Works

Say "watch action" or "watch my PR" and Claude figures out what to monitor. No arguments? It watches the current repo, auto-detected from git remote. Pass a run URL, a PR URL, or --all-repos to cast a wider net.

The skill skips anything already finished — it only cares about transitions from in-progress to completed. Every 15 seconds, it queries gh run view for status, printing a timestamped line per run so you can glance at the terminal and see where things stand. When a run finishes, the audio kicks in.

The Alerts Are Obnoxious on Purpose

A successful build plays Funk.aiff three times, then loops a spoken announcement: "GitHub Action Deploy has completed successfully." A failure plays Glass.aiff once — the sad sound — then loops: "GitHub Action Deploy has failed."

The loop doesn't stop. It keeps announcing until you walk back to the keyboard and press Enter. This is not a bug. If I'm in the kitchen helping Nurul prep dinner when a deploy fails, I need something that won't politely give up after one chime. The computer keeps saying "your build failed" until I come deal with it.

On Linux, it falls back to prominent terminal notifications instead of audio. Less dramatic, but functional.

What You Can Watch

Current repo is the default — it reads git remote get-url origin and monitors that. Specific runs work too: paste a GitHub Actions run URL directly. PR runs are the one I use most: pass a PR URL or number and it finds all linked check runs automatically. All repos fetches every repository you have access to and monitors across all of them, caching the repo list to ~/.cache/ so it doesn't hammer the GitHub API on every poll. And --actor-only filters to runs you triggered, which matters when three people are pushing to the same repo and you only care about your own deploys.

The macOS Gotchas

Bash version. macOS still ships Bash 3.2 — ancient enough to lack mapfile. The skill falls back to awk '!seen[$0]++' for deduplication. I didn't discover this until the first time I ran it on a fresh Mac and got a syntax error instead of a build notification. Useful.

afplay and say are macOS-only. The skill gates audio behind an OS check and degrades gracefully on Linux. I briefly considered cross-platform audio libraries and then decided that solving "play a sound on three operating systems" was not the problem I was trying to solve.

Poll interval. Fifteen seconds is fast enough to catch completions without burning through GitHub's rate limit. For --all-repos mode with many repositories, bump it to 30–60 seconds or you'll hit the API ceiling before your build finishes.

The Real Change

I use this on every deploy. Push the branch, say "watch action," go do something else. The spoken alert reaches me in the next room, in the kitchen, on the porch. The acknowledgement loop means I never miss a failure — it keeps going until I come back.

It's a small thing, but it changed how I interact with CI. I stopped polling and started trusting that the computer would come find me. The next step is wiring it into the lesson-plan printing pipeline — when the deploy that updates our curriculum tools finishes, automatically print tomorrow's lesson plans. One push, zero babysitting.