Invite-only alpha · admission closed
CI runners that show their work.
Ephemeral GitHub Actions runners on Firecracker microVMs, a serverless cache, and a waterfall of evidence for every job. Zero idle. Apache-2.0.
Built on open standards
- GitHub Actions
- Firecracker
- Rust
- PostgreSQL
- OpenTelemetry
- Cosign
- Apache-2.0
Platform
Everything a job leaves behind, in one place.
Pick a surface. The dashboard, CLI, API and MCP server read the same operation registry, so a person and an agent see the same state and the same limits.
A fresh machine for every job.
- One Firecracker microVM per job, launched through jailer.
- Created from GitHub job events and removed after the job.
- Fork pull requests and unknown repositories are denied.
- queuedQueued
- admittedAdmitted
- provisioningProvisioning
- runner_connectingRunner connecting
- executingExecuting
- finalizingFinalizing
- cleanupCleanup confirmed
See every run, not just the failures.
- Queued, admitted, provisioning, executing and cleanup.
- A reason for every terminal state, from platform receipts.
- A lost node is shown as lost. It is never reported as success.
| Workflow | Ref | Status | Elapsed | Size |
|---|---|---|---|---|
| build / linux | main | Completed | 1m 54s | 8 vCPU |
| test / unit | feat/queue | Completed | 3m 08s | 4 vCPU |
| e2e / chromium | fix/cache | Running | 0m 41s | 8 vCPU |
| lint | main | Completed | 0m 22s | 2 vCPU |
| deploy / preview | feat/api | Failed | 2m 17s | 4 vCPU |
| bench / rust | perf/pool | Queued | — | 16 vCPU |
Illustration with sample data.
Illustration. Bar heights show layout, not measured load.
Built for the agent that opens the pull request.
- JSON by default in the CLI. Scoped bearer tokens on the API.
- An MCP server with two tools that cover every operation.
- The same operation IDs, scopes and limits as the dashboard.
# list recent runs as JSON
$ openrunners runs list --limit 20
# watch one run until it ends
$ openrunners runs watch <run-id>
# read the lifecycle waterfall
$ openrunners runs timeline <run-id>
# fleet metrics for the last week
$ openrunners runs metrics --window 7d
$ curl -H 'Authorization: Bearer $OPENRUNNERS_TOKEN' \
https://api.openrunners.dev/v1/runs/{run_id}/timeline
# every operation, with scopes and limits
$ curl https://api.openrunners.dev/v1/operations
$ openrunners mcp serve
# tools: openrunners_search, openrunners_call
# the agent searches the operation registry,
# then calls one operation with scoped credentials
- 1microVM per job, never reused
- 0idle compute between jobs
- 7lifecycle phases on every run
- 4surfaces: dashboard, CLI, API, MCP
How it works
From GitHub job to evidence record.
GitHub creates demand. OpenRunners admits it, runs it on a disposable machine, removes the machine, and keeps a record of what happened.
- 01
Install the GitHub App
Connect an organization and select trusted repositories in the dashboard. GitHub keeps your workflows, checks, logs and artifacts.
- 02
Get a fresh microVM per job
Each accepted job gets one Firecracker microVM behind jailer. It is never reused and nothing waits idle between jobs.
- 03
Cache without a cache server
actions/cache v4 and Buildx type=gha are served by a serverless cache plane on object storage, scoped to organization, repository and ref. Cache performance is not yet measured.
- 04
Keep the evidence
Lifecycle states, failure class and cleanup confirmation are recorded from authenticated platform receipts, separate from guest output.
Capabilities
Built to be checked, not trusted.
Each capability carries its current state. We change a label only when there is evidence to change it.
- Runtime in validation
One job, one VM
A slot is never reused. Fork pull requests and unknown repositories are denied by policy.
- Design
Zero idle compute
Runners are created on demand from GitHub job events and removed after the job.
- Billing disabled
Per-second billing
Planned: customer-code time only, after a 10-second minimum. Failed provisioning is not billed.
- API implemented
Run timeline
Queued, admitted, provisioning, connecting, executing, finalizing and cleanup, with a reason for every terminal state.
- API implemented
Explicit uncertainty
A lost node or unconfirmed cleanup is a visible state. It is never reported as success.
- API implemented
One operation registry
The API, CLI, MCP server and dashboard use the same operation IDs, scopes and limits.

Security posture
Assume the workflow is hostile.
- One Firecracker microVM per job, launched through jailer.
- Public egress only. No ingress, no private networks.
- No host Docker, host filesystem, metadata or control-plane credentials in the guest.
- Guest output is recorded as untrusted, never as proof.
Pricing
Per-second billing. No seat fee.
Planned alpha rate: $0.002 per vCPU-minute on Linux x64, billed per second after a 10-second minimum. Billing is disabled during the alpha.
- 2 vCPU$0.004/min2 performance vCPU / 8 GB
- 4 vCPU$0.008/min4 performance vCPU / 16 GB
- 8 vCPU$0.016/min8 performance vCPU / 32 GB
- 16 vCPU$0.032/min16 performance vCPU / 64 GB
Open source
Apache-2.0. No lock-in by design.
The control plane, scheduler and evidence model are written to be self-hosted. Hosted runner vendors have shut down before; an open license means your CI does not depend on one company staying open.
Open-source commitments- License
- Apache-2.0
- Backend
- Rust, PostgreSQL
- Boundary
- Firecracker + jailer
- Source
- Published after release review
FAQ
Questions before you switch.
Only by invitation. OpenRunners is an invite-only alpha. Customer admission stays closed until every runtime, network and node-registration release gate has observed evidence. Sign in with GitHub to request access; we review each organization when a slot opens.
No. You keep GitHub Actions. After your organization is admitted, you change the runs-on label of a job to an OpenRunners label such as openrunners-4vcpu-ubuntu-2404.
The customer boundary is one Firecracker microVM per job, launched through jailer with its own disk, cgroup and network namespace. Jobs get public egress only, no ingress, and no access to host Docker, metadata or control-plane credentials. These gates are being validated before admission opens.
The planned alpha rate is $0.002 per vCPU-minute for Linux x64, billed per second after a 10-second minimum, with no seat or platform fee. Billing is disabled during the alpha and rates may change before launch.
OpenRunners is licensed under Apache-2.0 and designed to be self-hosted. The repository stays private until its secrets, licenses, security defaults and release process pass review.
We do not publish speed claims yet. Startup, cache and cleanup numbers will appear here only after reproducible measurements on the production runtime.
Run your next job on a runner that shows its work.
Admission is manual for trusted GitHub repositories while the release gates close. Sign in with GitHub to request access and we will review your organization when a slot opens.
