Skip to content

Route GitHub Actions jobs to any runner

RelayRunner routes each GitHub Actions job to the first runner in your list that can take it, from your own machines to hosted runners.

RelayRunner is a router for GitHub Actions. You tell it which runners a job may use, and it sends each job to the first one in your list that can take it right now: your laptop when it’s online and free, a self-hosted runner your org already has, a hosted provider such as Blacksmith or Depot, or GitHub’s hosted runners.

Your workflows stay the same. Checks keep their names, logs stay in GitHub, and you change where jobs go from the dashboard, not with a commit.

  • Your minutes ran out. Coding agents push all day and use up a plan’s included minutes early in the month. Send jobs to a machine you already own first, and keep GitHub as the fallback.
  • Your bill spiked. Use your included minutes, then switch to your own machines before you pay overage.
  • macOS builds cost 10x. Run them on the Mac on your desk, and fall back to hosted Macs when it’s asleep.
  • One spare machine isn’t enough. A home server or old laptop is free, but jobs queue behind each other. It only gets a job when it’s idle, and the rest go to hosted runners.
  • Workspace. Your team in RelayRunner. Each one is a GitHub organization or personal account with the RelayRunner GitHub App installed, and its members come from GitHub.
  • Runners. Where jobs can run: machines you connect with the CLI, self-hosted runners you already have, hosted providers and GitHub-hosted runners. See Providers.
  • Relay job. A small job you add in front of each job you want routed. It names the runners that job may use and finishes in about a second, with no runner and no billed minutes. See Routing.
  • Runner order. The order the workspace tries runners in, set on the dashboard’s Router page. See Runner order.
jobs:
relay-test:
uses: relayrunner/actions/.github/workflows/relay.yml@v1
with:
machine: self-hosted # any machine in your workspace
github: ubuntu-latest # when no machine is free
test:
needs: relay-test
runs-on: ${{ needs.relay-test.outputs.runner }}
steps:
- uses: actions/checkout@v4
- run: npm test

Each job on a machine gets a fresh one-job runner, so nothing is left behind between jobs. Public repositories never run on your machines.

  • Quickstart: a green job on your own machine in a few minutes.
  • Principles: the rules routing follows.