← All integrations

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.

Get started with GitHub

With routing

GitHub-hosted runners on their own, or in your runner order

GitHub-hosted runners on their own

  1. Each workflow names ubuntu-latest, so every job uses GitHub minutes.
  2. Your own machines sit idle.
  3. When your included minutes run out, you pay for the rest.
  4. Moving jobs to another host means editing every workflow.

In your runner order

  1. Jobs run on your machines first, and on GitHub-hosted runners when your machines are busy.
  2. A minutes limit sends jobs to the next runner once you've used a share of your included minutes.
  3. Add a hosted provider ahead of GitHub from the dashboard. No workflow edits.
  4. The Performance page compares GitHub-hosted job times with your other runners.

Setup

How to set up GitHub

  1. Nothing to set up

    Nothing to set up. GitHub's runners work in every repository.

  2. 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.

  3. Add relays to your jobs

    Run npx relayrunner init in your repo. It adds a relay to each job you pick and keeps the label the job uses today as its fallback.

.github/workflows/ci.yml
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

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. 1. In your repo, add relays to the jobs you want to route
    npx relayrunner init
  2. 2. Optionally, turn this computer into a runner
    npx relayrunner connect