BurstGrid is an open-source self-hosted runner platform. A central TypeScript scheduler receives GitHub webhooks, dispatches jobs to a fleet of EC2 bare-metal hosts over SSE, and each job boots into a dedicated Firecracker VM in under 200 ms—then disappears.
What happens from the moment a developer opens a PR to the moment a self-hosted runner picks up the job.
.github/workflows/ci.yml. Any job with runs-on: [self-hosted, ...] is set to queued and GitHub immediately POSTs a workflow_job event to the webhook URL configured in the BurstGrid GitHub App.
X-Hub-Signature-256 header using the webhook secret from the GitHub App. It then authenticates as the App installation and calls the GitHub Runners API to generate a one-time runner registration token for the target repo. The job and token go into a priority queue partitioned by tier. If the queue exceeds maxQueueDepth, the scheduler returns 503—GitHub retries for up to 72 hours.
burstgrid:size=large → 4 vCPU / 4 GiB). The first worker with matching capabilities and enough headroom receives the job as a JSON event on its persistent GET /v1/workers/:id/stream SSE connection. No polling, no database.
/proc/cmdline, registers with GitHub, and picks up the queued job. On completion the VM is terminated, the slot freed, and the worker sends a heartbeat back with updated resource counts. The rootfs is never reused.
The App provides a signed webhook channel and an installation token so the scheduler can call the Runners API to mint the per-repo registration tokens that let VMs self-register with GitHub.
| Variable | What it is |
|---|---|
| GITHUB_APP_ID | Numeric App ID from the App settings page |
| GITHUB_PRIVATE_KEY | PEM private key — signs JWTs for API auth |
| GITHUB_WEBHOOK_SECRET | Set when creating the App — used to verify X-Hub-Signature-256 |
| GITHUB_INSTALLATION_ID | Installation ID for the org the App is installed on |
https://your-scheduler/v1/webhook and generate a webhook secret
3. Grant the permissions above and subscribe to workflow_job events
4. Generate a private key — download the .pem and set it as GITHUB_PRIVATE_KEY
5. Install the App on your org — note the installation ID in the URL
GitHub-hosted runners top out at 4 vCPU / 16 GiB. BurstGrid hands you the metal.
Every job gets its own kernel. No shared namespaces, no container breakout surface. The rootfs is discarded the moment the runner exits.
Workers hold a persistent Server-Sent Events connection. Jobs arrive the instant they're queued—no polling, no long-poll timeouts, no extra infra.
Label jobs with burstgrid:size=large. The scheduler only assigns to workers with enough free vCPU and RAM. No overcommit.
Define separate EC2 launch templates for standard, large, and xlarge fleets. Each scales independently against its own queue threshold.
GitHub API calls trip after 5 consecutive failures and stay open for 30 s. Returns 503 so GitHub keeps retrying for up to 72 hours.
Queue depth, dispatch latency, VM boot time, and job duration—all OTLP. Drop the included OTel Collector config on each host and ship to Grafana or Datadog.