Skip to content

Principles

The rules routing follows.

RelayRunner sits between your workflows and the places they can run. These are the rules it follows.

Opting a job in is one change: a relay job and a runs-on. After that, everything else happens in the dashboard or the CLI: changing the runner order, adding a machine, pausing one, switching providers. None of it needs a commit.

A job that names a hosted label still runs when no machine is free. Your machines add capacity, and CI never waits on them. Close the laptop and jobs run on the next runner in your order.

A job lists the runners it may use, and your runner order decides between them. Moving from one provider to another, or adding your own hardware, only means reordering the list. Each provider bills you directly under your own account.

Public repositories never run on your machines

Section titled “Public repositories never run on your machines”

Anyone can run code on a machine through a pull request to a public repo, so a public repo’s jobs never run on one. Public repos can still route between hosted providers.

Jobs wait when machines are busy, and fail with a reason otherwise

Section titled “Jobs wait when machines are busy, and fail with a reason otherwise”

When every machine that fits is busy and no other step can take the job, the job waits for a free slot, the same as on any self-hosted runner. When nothing can take it, the relay fails right away with the reason, such as “No runner available: no self-hosted machine is online and idle”.

Every job on a machine gets a fresh runner that takes that one job and is then removed. Nothing is left behind between jobs, and there’s no long-lived runner credential to leak.

The CLI has readable output for people and --json for agents, setup is safe to retry, and the docs and dashboard data are available to agents too.