All posts
CI / CD5 min read

GitHub Actions iPhone notifications without Slack or email

Slack and email turn green-and-red CI signal into background noise. Push GitHub Actions iPhone notifications and a Live Activity straight to your lock screen with three lines of YAML.

There is a familiar shape to a deploy that takes nine minutes. You push, you switch tabs, you forget. Twenty minutes later you remember, alt-tab back to GitHub, and the run has been red for fifteen of them. The fix is half a line. The waste was the context switch back to checking.

GitHub Actions iPhone notifications should fix this, and mostly don't. The default channels — Slack #ci, an email digest, the GitHub mobile app — are tuned for inbox triage, not for "is my deploy still alive right now." You want a glanceable surface that opens on start, updates as the job moves, and closes green or red. That is what Live Activities are for, and it is what Chirp ships for GitHub Actions.

Why the usual notification paths feel broken

Slack notifications for CI start out useful and decay fast. After a week of green runs they are noise. After a month people mute the channel, and the one red run that mattered drowns in standup chatter. Email is worse — it batches, lands in a folder you check on a different cadence, and never tells you about the run that is currently in progress.

The GitHub mobile app gets closer, but it is still a notification: a banner you tap to see status. There is no persistent lock-screen surface that tracks the run's progress without you opening anything. For a long deploy, polling is exactly the wrong shape.

What Chirp gives you instead

  • A Live Activity that opens when the job starts and closes when it ends — green on exit 0, red on anything else.
  • Lock-screen and Dynamic Island progress without unlocking your phone.
  • Optional rich push notifications on success or failure, with a tap-through to the workflow run page.
  • The same shell helper across GitHub Actions, GitLab CI, Bitbucket Pipelines, Buildkite, Docker, and raw bash — one mental model, every runner.

Wire it up in three lines of YAML

The core integration is a bash helper sourced into any run: step. There is nothing to install on the runner, no marketplace action to vet, no version pin to bump.

  1. 1Grab your API key from the Chirp dashboard. It starts with chirp_sk_.
  2. 2GitHub repo → Settings → Secrets and variables → Actions → New repository secret. Name CHIRP_API_KEY, paste the value.
  3. 3In any run: step, source chirp.sh from the connectors URL and wrap the command you actually care about.
- name: Deploy env: CHIRP_API_KEY: ${{ secrets.CHIRP_API_KEY }} run: | source <(curl -fsSL https://chirpapp.dev/connectors/bash/chirp.sh) chirp_wrap @deploy "prod-${{ github.sha }}" -- ./scripts/deploy.sh

chirp_wrap brackets the command with start and end events. Exit code propagates: zero closes the Live Activity green, anything else closes it red and includes the last few lines of stderr in the failure card. The card title is the schema prefix (DEPLOY) plus the name you passed (prod-<sha>) plus the repo path.

Push a notification on success or failure

If you also want a classic alert — a banner with title and body, tappable to a URL — call chirp_notify in conditional steps. This is the closest replacement for the Slack-on-failure pattern, except it lands on your lock screen with sound and a deep link to the run.

- name: Notify success if: success() run: | source <(curl -fsSL https://chirpapp.dev/connectors/bash/chirp.sh) chirp_notify "Deploy succeeded" "${{ github.repository }} → production" - name: Notify failure if: failure() run: | source <(curl -fsSL https://chirpapp.dev/connectors/bash/chirp.sh) chirp_notify "Deploy failed" "${{ github.repository }} on ${{ github.sha }}"

Notification payloads support sounds, subtitles, images, and tap-to-open URLs — full schema in the notifications reference. For most CI use cases the two-arg call above is what you want.

Span build → test → deploy as one activity

chirp_wrap is one command in, one card out. When you want a single Live Activity that follows the run through multiple steps and updates a progress field as you go, drop down to the lower-level helpers. chirp_start returns an activity ID via $CHIRP_ACTIVITY_ID; subsequent steps that source the helper see it in the env, push updates, then close at the end with chirp_end.

This is the pattern to reach for when a deploy is long enough that a halfway progress update is worth more than a banner at the end. The full multi-step example is in the GitHub Actions integration walkthrough, alongside cross-job state, fork-PR gating, and the runner troubleshooting list.

Where this fits in the lock-screen story

GitHub Actions is the most common case, but it is not special. The same helper script ships for Bitbucket Pipelines, Buildkite, Docker entrypoints, and any shell where curl works. The wider argument for treating long-running work as a Live Activity instead of a push notification is in the companion post, Lock-screen status for long-running jobs.

If your stack already has a CHIRP_API_KEY for some other job, you can reuse it here — no separate setup. If it doesn't, the dashboard onboarding takes about a minute and the free tier covers a normal CI pipeline.

Try it on the next deploy

  1. 1Install Chirp on your iPhone (iOS 16.1+) and run chirp login.
  2. 2Add CHIRP_API_KEY to your repo secrets.
  3. 3Drop chirp_wrap around the step you actually care about — usually the deploy or the long test job.

Push a commit, lock your phone, and watch the card open. The next failed deploy is the one you'll catch in the first thirty seconds instead of the next twenty minutes. Setup details and edge cases live on the GitHub Actions integration page.

Frequently asked

Do I need a custom GitHub App or marketplace action to get GitHub Actions iPhone notifications?
No. The current integration is a plain shell helper sourced from chirpapp.dev. Add CHIRP_API_KEY as a repo secret and call chirp_wrap or chirp_notify from any run: step. A first-class composite action is in progress, but the bash helper covers the same ground today.
Will the helper break my CI run if Chirp is down or my key is missing?
No. The helper silently no-ops when CHIRP_API_KEY is empty and never throws inside the wrapped command. Chirp is intentionally designed so an outage on our end can never fail your build.
Do GitHub Actions iPhone notifications work for forked-PR builds?
Not by default. GitHub does not expose secrets to workflows triggered by PRs from forks, so the helper will no-op. Either gate the Chirp step on github.event.pull_request.head.repo.full_name == github.repository, or use pull_request_target if you understand the implications.
How is this different from the GitHub mobile app's notifications?
The GitHub mobile app pushes a banner you have to tap to see status. Chirp uses iOS Live Activities, so the workflow run pins to your lock screen and Dynamic Island and updates as it progresses. You glance, you don't unlock.
Is there a free tier?
Yes. The free tier covers personal projects and small teams sending the volume a normal CI pipeline produces. See /#pricing for current limits.