Cut GitHub Actions
cost by 8x
Change one line of a workflow to runs-on: play-4vcpu. Every job runs on its own fresh microVM, and you pay per second for what it used.
A month of the five open-source workflows in the race below, on each runner. Sample numbers, not measurements.
Same job, same commit, two runners
Five open-source workflows, replayed on a GitHub-hosted runner and on Play Compute.
| Workflow | GitHub-hosted | Play Compute | Speed | Cost | Saved a month |
|---|---|---|---|---|---|
| 2.2x faster | $2,604 | ||||
| 2.3x faster | $1,559 | ||||
| 1.9x faster | $1,675 | ||||
| 1.8x faster | $641 | ||||
| 2.0x faster | $1,977 |
Sample numbers, not measurements. Each row is one job at one commit with the same vCPUs on both sides; GitHub-hosted is priced at list price for a private repository, and a month is the job's runs in the last 30 days.
Pay for the memory a job used
A GitHub-hosted runner bills its whole machine for every minute it starts. Play Compute bills the memory a job is using, second by second.
than GitHub-hosted for this 7m 29s build on play-16vcpu, priced on each runner.
- play-2vcpu2 vCPUs · 8 GiB$0.081 an hour$0.360 on GitHub-hosted
- play-4vcpu4 vCPUs · 16 GiB$0.161 an hour$0.720 on GitHub-hosted
- play-8vcpu8 vCPUs · 32 GiB$0.323 an hour$1.32 on GitHub-hosted
- play-16vcpu16 vCPUs · 64 GiB$0.645 an hour$2.52 on GitHub-hosted
Linux x86-64 on Ubuntu 24.04, 4 GiB of memory for each vCPU. An hour is priced for a job that uses 25% of its memory; a job that uses less pays less.
Change one line. Keep the rest.
The pull request changes runs-on and nothing else. The actions a workflow already uses answer on the same service APIs as on GitHub, run next to the machines.
- 1OIDC tokensid-token: write for keyless sign-in to AWS, GCP, Azure, Vault
- 2Matrix, needs, if, strategyFan-out, fail-fast, max-parallel, include and exclude
- 3Service containersservices: postgres, redis, ... with health checks and ports
- 4Tool cachesetup-node, setup-python, setup-go, setup-java, rustup
- 5Cache service v2actions/cache@v4, setup-* caches, restore keys, cross-branch scopes
- 6Artifacts v4actions/upload-artifact@v4 and download-artifact@v4, retention, merge
Also unchanged: Live logs and log archive, Job summaries, Annotations and problem matchers, Artifact attestations, Packages and container registry, Reusable workflows and composite actions, Outputs and environment files, Concurrency groups, Environments and approvals, Re-run failed jobs, Timeouts and cancel, Every trigger, Container jobs, Docker, buildx and compose.
Not offered: KVM inside the job, Linux arm64, macOS and Windows, GPU. Keep those jobs on their current runners: the switch is per job.
The GitHub App opens it for you
One pull request per repository you pick, covering every workflow in it.
- 1
Install the App
Pick the repositories it may serve. It never reads your secrets.
- 2
Review the pull request
It changes runs-on and nothing else, with a size suggested for each job.
- 3
Merge it
The next push runs here, with the same actions, caches and secrets.
Your coding agent gets the CLI
One command signs a machine in for as long as you choose, installs the playc CLI and tells your agent how to use it.
An agent never sees secrets and cannot change billing or settings.
A failed job opens at the error
Steps and logs come first, scrolled to the first error, and every log is searchable across runs.
- Set up job1.1 s
- Run actions/checkout@v52.1 s
- Restore cache3.7 s
- Install dependencies28 s
- Build app1m 48s
- Run Playwright tests2m 33s
- Upload artifact
- Post Restore cache1.4 s
- Complete job512 ms
- Memory at its peak
- 9.1 GiB of 32 GiB
- Cost
- $0.026
Questions before you switch
- Is a job isolated from other jobs?
- Yes. Each job gets a new microVM with its own kernel, and the machine is deleted when the job ends. Jobs share nothing but the caches you save.
- How do I switch back?
- Change runs-on back, for one job or for all of them. There is no contract to end and nothing to uninstall first.
- What is on the machine?
- An image that follows GitHub's ubuntu-24.04 runner image: the same languages, Docker, browsers and tools, with passwordless sudo, so setup actions find what they expect.
- How long can a job run, and how many at once?
- Up to 5 days, GitHub's own limit for a job on a self-hosted runner. We set no limit on how many jobs run at once.
- Where do jobs run?
- In us-south1 (Dallas), across three zones. Cache and artifacts are stored in the same region as the job.
- What does a slow queue or a lost job cost me?
- Nothing. Billing starts when the runner picks up the job, and a job lost to the platform is re-run without a charge.