Recipe · GitHub Actions

Get a phone notification when a GitHub Actions run fails

Add one curl step to a workflow and CI failures show up as an alert on your phone, without a GitHub App or a third-party integration.

GitHub’s own notification settings bury a CI failure in an inbox with everything else. A curl step at the end of the job sends it straight to a channel of its own.

The step

- name: Notify Paperplane
  if: failure()
  run: |
    curl -sS -X POST "${{ secrets.PAPERPLANE_ENDPOINT }}" \
      -H "Content-Type: application/json" \
      -H "X-Paperplane-Endpoint-Key: ${{ secrets.PAPERPLANE_KEY }}" \
      -d '{
        "title": "CI failed on main",
        "message": "'"${{ github.workflow }}"' · ${{ github.sha }}",
        "priority": "High",
        "nature": "error"
      }'

PAPERPLANE_ENDPOINT is the full channel URL from Channel → Details; PAPERPLANE_KEY is that channel’s endpoint key, if you set one. priority: High and nature: error promote this from a message you scroll past to an alert you have to acknowledge or resolve.

Only on success, too

Drop if: failure() for if: always() and branch on ${{ job.status }} in the message if you also want a quiet confirmation when a deploy job succeeds — useful for anything long enough that you’ve stopped watching the terminal.

Add a button

A Paperplane callback fires a plain, unauthenticated GET/POST — GitHub’s re-run API needs a bearer token, so you can’t point a callback straight at api.github.com. Put a small relay in between (a Cloudflare Worker route or similar) that holds the GitHub token and calls the re-run API when hit:

"callback": [
  { "label": "Re-run", "webhook": "https://your-relay.example.com/rerun/RUN_ID" }
]

See the API contract for the full callback shape and its cooldown.