GitHub integration
Use GitHub-hosted runners after your own machines.
GitHub-hosted runners work in every repository with nothing to set up. Jobs use GitHub minutes only when your own machines are busy. You change the order from the dashboard, not your workflows.
With routing
GitHub-hosted runners on their own, or in your runner order
GitHub-hosted runners on their own
- Each workflow names ubuntu-latest, so every job uses GitHub minutes.
- Your own machines sit idle.
- When your included minutes run out, you pay for the rest.
- Moving jobs to another host means editing every workflow.
In your runner order
- Jobs run on your machines first, and on GitHub-hosted runners when your machines are busy.
- A minutes limit sends jobs to the next runner once you've used a share of your included minutes.
- Add a hosted provider ahead of GitHub from the dashboard. No workflow edits.
- The Performance page compares GitHub-hosted job times with your other runners.
Setup
How to set up GitHub
-
Nothing to set up
Nothing to set up. GitHub's runners work in every repository.
-
Add GitHub to your runner order
On the Router page, put GitHub where you want it. A common order is your machines, then GitHub-hosted.
-
Add relays to your jobs
Run
npx relayrunner initin your repo. It adds a relay to each job you pick and keeps the label the job uses today as its fallback.
jobs:
relay-test:
uses: relayrunner/actions/.github/workflows/relay.yml@v1
with:
machine: self-hosted
github: ubuntu-latest
test:
needs: relay-test
runs-on: ${{ needs.relay-test.outputs.runner }}
The relay
Name a GitHub label in the relay.
The relay answers in about a second and uses no minutes. It returns the label of the first runner in your order that can take the job, and the job runs there.
Read how routing works →Details
GitHub at a glance
- What it is
- GitHub's own hosted runners, billed per minute in private repos.
- Labels
ubuntu-*, windows-*, macos-*, or a larger runner's own name- Example
runs-on: ubuntu-latest- Relay input
github- Links
- GitHub docs
List prices
| ubuntu-slim | $0.002/min |
|---|---|
| ubuntu-latest | $0.006/min |
| ubuntu-24.04-arm | $0.005/min |
| windows-latest | $0.01/min |
| windows-11-arm | $0.01/min |
| macOS | $0.062/min |
As of November 2026, from GitHub's price page. GitHub bills you directly, so your plan and credits apply.
Common questions
How is this different from using GitHub-hosted runners directly?
Used directly, every job that names a GitHub label uses GitHub minutes. In a runner order, jobs go to your own machines first and to GitHub only when they're busy, and you can put a hosted provider ahead of GitHub from the dashboard without editing workflows.
Do I have to change my workflows to use GitHub?
Once. Run npx relayrunner init in your repo and it adds a relay to each job you pick. After that, you move GitHub up or down in the dashboard.
Which jobs go to GitHub?
Jobs whose relay names a GitHub label, when nothing above GitHub in your runner order is free.
Who bills me for GitHub-hosted runners?
GitHub does, the same way it does today. Jobs that run on your own machines use no GitHub minutes.
Can I stop using GitHub minutes after a limit?
Yes. Give the GitHub step a share of your included minutes. Past it, jobs go to the next step in your order.
Add GitHub-hosted runners to your runner order.
Add relays once. After that, change the order in the dashboard.
-
1. In your repo, add relays to the jobs you want to route
npx relayrunner init -
2. Optionally, turn this computer into a runner
npx relayrunner connect