This service receives GitHub webhook events and sends device push via FCM.
- Verify GitHub webhook signature (
X-Hub-Signature-256) - Deduplicate using
X-GitHub-Delivery - Parse PR-related events
- Resolve affected subscribers
- Send FCM push notification
- Cloudflare Workers (TypeScript)
- Optional Queue for async fan-out
- D1 for event dedupe and subscription metadata (or Postgres later)
cd server
npm install
npx wrangler d1 create ghprCopy the database ID into wrangler.toml.
npx wrangler d1 execute ghpr --remote --file=schema.sqlnpx wrangler secret put GITHUB_WEBHOOK_SECRET
npx wrangler secret put FCM_PROJECT_ID
npx wrangler secret put FCM_CLIENT_EMAIL
npx wrangler secret put FCM_PRIVATE_KEYOptional but recommended:
npx wrangler secret put INTERNAL_API_KEYnpx wrangler deploy- Go to your repo (or org) Settings > Webhooks > Add webhook.
- Set Payload URL to
https://<your-server-worker>.workers.dev/github/webhook. - Set Content type to
application/json. - Set Secret to the same value you used for
GITHUB_WEBHOOK_SECRET. - Select events: Pull requests, Pull request reviews, Check runs, Issue comments.
Prerequisite: Node.js 20+ (Wrangler 4 requirement).
cd server
npm install
npm run devManagement endpoints require x-api-key when INTERNAL_API_KEY is set.
POST /devices/registerDELETE /devices/registerGET /devices?userId=...POST /subscriptionsGET /subscriptions?userId=...DELETE /subscriptionsPOST /github/webhookGET /mobile/sync?userId=...&since=...&cursorDeliveryId=...&limit=...GET /healthz
POST /runners/register— register a runnerGET /runners/poll-info— get runner status for current userPOST /commands/retry-ci— submit retry-ci commandPOST /commands/retry-flaky— submit retry-flaky commandGET /commands/retry-flaky— list retry-flaky jobsDELETE /commands/retry-flaky— cancel retry-flaky job
GET /runners/status— runner heartbeat/statusDELETE /runners/register— unregister runnerGET /runners/commands/poll— poll for pending commandsPOST /runners/commands/{id}/result— submit command resultPOST /runners/sync— sync runner statePOST /runners/poll-status— update poll statusGET /runners/subscriptions— list subscriptions for runner's user
- Client calls
POST /devices/registerto binduserId -> token. - Client calls
POST /subscriptionsto binduserId -> repoFullName. - Webhook event resolves
repoFullName -> userId -> tokenand fans out pushes. - Client settings/diagnostics call list endpoints to inspect registered devices/subscriptions.
- Client can query incremental changes via
GET /mobile/sync.
GET /devicesreturns masked token previews only (no raw FCM token leakage).