Play ComputeBeta
Docs

Quickstart

Three steps, about a minute. Nothing in your workflow changes except where it runs.

1. Install the GitHub App

Install Play Compute on your organisation and pick the repositories it may serve. The App registers runners for those repositories and listens for queued jobs; it never reads your secrets.

Install GitHub App

2. Change runs-on

Change one line per job, or let the App open a pull request that changes every workflow it finds. Pick the size by vCPUs; memory follows at 4 GiB a vCPU and is given to the job as it uses it.

.github/workflows/ci.yml+1-1
 jobs:   test:-    runs-on: ubuntu-latest+    runs-on: play-4vcpu     steps:       - uses: actions/checkout@v5
runs-onvCPUMemory, up toDiskA minuteAn hour
play-2vcpu28 GiB25 GiB$0.00134$0.081
play-4vcpu416 GiB25 GiB$0.00269$0.161
play-8vcpu832 GiB50 GiB$0.00538$0.323
play-16vcpu1664 GiB100 GiB$0.01075$0.645

Shown for a job that uses 25% of its size's memory. A job that uses less pays less.

3. Connect your agent

Press Connect agent, choose how long the machine stays signed in, and paste the command into your agent. It installs the playc CLI, signs the machine in for that time and tells the agent how to use it; an agent says which harness and project it is before it does anything. Unlimited is possible too, after you accept the risk.

In your agent (the ! makes its harness run it)
! curl -fsSL https://compute.play.fast/install | sh -s -- 7K2M-9XQD

What is in the image

The image follows GitHub's ubuntu-24.04 runner image, so setup actions find what they expect.

SystemUbuntu 24.04, kernel 6.12, x86-64, 64 GiB root disk, passwordless sudo
LanguagesNode.js 20, 22 and 24; Python 3.11 to 3.13; Go 1.24 and 1.25; Temurin JDK 17 and 21; Rust stable with rustup
ContainersDocker Engine with buildx and compose; service containers and container jobs
Toolsgit, git-lfs, gh, jq, yq, curl, zstd, build-essential, cmake, pkg-config, awscli, gcloud, az
BrowsersChrome, Firefox and their drivers; Playwright's system dependencies

Limits today

Job lengthUp to 5 days, GitHub's own limit for a job on a self-hosted runner
Sizes2 to 16 vCPU, 4 GiB of memory a vCPU
ConcurrencyNo limit set by us
Regionus-south1 (Dallas), three zones
ArchitecturesLinux x86-64

macOS, Windows and GPU jobs are not offered: keep those on their current runners. See Actions compatibility for the whole list.

API

An org's runs, logs and usage are in the API. Each call is a POST of a JSON body, with the token as a bearer: POST /playcompute.api.v1.OrgService/ListRuns, POST /playcompute.api.v1.OrgService/SearchLogs to search every kept log line, and POST /playcompute.api.v1.OrgService/GetUsage. The same usage is a CSV download at GET /api/v1/usage.csv. Create a token under Settings, API tokens, with the scopes it needs.

The failed runs
curl "https://compute.play.fast/playcompute.api.v1.OrgService/ListRuns" \  -H "Authorization: Bearer $PLAY_COMPUTE_TOKEN" \  -H "Content-Type: application/json" \  -d '{"status": "RUN_STATUS_FILTER_FAILURE"}'