runs-on: fast, cheap, self-hosted GitHub Action runners logo

runs-on is a service that dynamically launches powerful hosted runners of any size, for any GitHub repository.

In your GitHub Action workflow files, instead of using the default base runner:

runs-on: ubuntu-latest

You would use:

runs-on: [self-hosted,aws,ubuntu-22,x64,16cpu,32ram]

And then your workflow will execute with a 16 vCPUs / 32GB RAM instance. After the workflow ends, the instance will automatically terminates.

Make that slow test suite fly

GitHub provides base runners with a most 8GB of RAM and 2vCPUs. Bigger runners are available, but they require a Team or Enterprise plan, as well as not being cheap (e.g. a 16 core linux VM is sold at $0.064/min, i.e. theoretical cost of $2700/month if fully used).

From various experiences at smaller companies, I believe there is a need to provide a simple service that auto-magically provision runners of various sizes (and architectures?), for a much cheaper price than what GitHub provides.

Ephemeral self-hosted runners, in your own AWS account

We can use the workflow events emitted by GitHub to auto-provision runners, on-premise:

From start to end, everything (service + VMs) runs in your own infrastructure, which is a big win in terms of security and observability.

AWS will be the first provider to be supported: with spot pricing, per-minute billing and large choice of instance types and architectures, it is very efficient in terms of cost/performance for CI workflows.

Hetzner would be the next clear choice, since their cloud offering has a great performance/price ratio (although no per-minute billing).

Design choices


The code will be open-source, possibly with a commercial license required after 30+ days of use. This formula seems to work well for my other project PullPreview.

Installation (coming soon)

Service is compatible with any server running Ubuntu 22.04 LTS. A domain (e.g. must point to the server. We strongly recommend using a dedicated VM for that service.

  1. Download the script:
    curl -O
  2. Inspect the script to ensure it's safe to run.
  3. Run the script with the required arguments:
    sudo sh ./ --domain