Kubernetes operator that runs and autoscales self-hosted GitHub Actions runners as ephemeral containers.
kunchenguid/runner-up
Self-hosted GitHub Actions runners across your own Linux, Mac and Windows machines, with a fresh container, VM or account for each job.
Open-source alternative to:GitHub Actions hosted runners
- Stars
- 284
- Forks
- 21
- Open issues
- 2
- Last commit
- 2 days ago
What is it?
runner-up runs GitHub Actions jobs on machines you already own instead of GitHub's hosted runners. A single coordinator connects to GitHub through runner scale sets, watches waiting jobs, and assigns each one to a free place on one of your machines. Each job gets a fresh Docker container or KVM virtual machine on Linux, a fresh tart clone or Apple container guest on a Mac, or a fresh Windows account or Hyper-V virtual machine on Windows, and that environment is removed when the job ends. Places can also run jobs directly on the host.
The coordinator reaches each machine over SSH and needs only SSH access, not a Kubernetes cluster. It tracks each machine's cores and memory, reserves room for the machine's owner, and orders waiting jobs by configurable rules across repositories. Pull requests from forks are refused by default. Running jobs survive a coordinator restart, and a machine whose agent becomes unreachable is paused until it responds again.
The project is young and documents its status per provider: Docker and KVM on Linux and tart and host places on a Mac have run real jobs, while Hyper-V, Apple container and Windows account places are marked experimental. It depends on GitHub's runner scale set API, which GitHub still labels as preview.
Key features
- 01Runs each job in a fresh Docker container, KVM VM, tart clone, or Windows account that is removed afterward.
- 02Connects to machines over SSH, with no Kubernetes cluster required.
- 03Splits each machine's cores and memory into places, reserving room for its owner.
- 04Orders waiting jobs across repositories with configurable rules.
- 05Refuses jobs from fork pull requests by default.
- 06Keeps running jobs alive through a coordinator restart.
Use cases
- Replacing paid GitHub-hosted runner minutes with spare Linux or Mac machines.
- Running macOS build and signing jobs on a Mac you already own.
- Running CI jobs on idle office or home PCs without managing a Kubernetes cluster.
- Giving each CI job an isolated environment on your own hardware.
Quick start
- 1
Install runner-up with Go
go install github.com/kunchenguid/runner-up@latest - 2
Choose the repository to serve and the Linux pool label
runner-up init --repo you/app --pool my-linux - 3
Add a machine reachable over SSH
runner-up machine add box --ssh ci@box - 4
Check the setup and start the coordinator
runner-up check-config && runner-up serve
Things to know
- The coordinator runs only on Linux and macOS, not Windows.
- Runner scale sets are still a preview on GitHub's side, so changes there can break it.
- Hyper-V, Apple container, Windows account, borrowing and draining are experimental and may change between releases.
- The project is young, and some providers have not yet run real jobs.
In collections
Topics
FAQ
- What is runner-up?
- Self-hosted GitHub Actions runners across your own Linux, Mac and Windows machines, with a fresh container, VM or account for each job. runner-up runs GitHub Actions jobs on machines you already own instead of GitHub's hosted runners. A single coordinator connects to GitHub through runner scale sets, watches waiting jobs, and assigns each one to a free place on one of your machines. Each job gets a fresh Docker container or KVM virtual machine on Linux, a fresh tart clone or Apple container guest on a Mac, or a fresh Windows account or Hyper-V virtual machine on Windows, and that environment is removed when the job ends. Places can also run jobs directly on the host.
- Is runner-up free to use? What license does it have?
- runner-up is open source under the MIT license. Check the license terms before using it in commercial products.
- Is runner-up still maintained?
- Actively maintained. The last commit to runner-up was on Nov 6, 2026.
- What can I use runner-up for?
- Replacing paid GitHub-hosted runner minutes with spare Linux or Mac machines. Running macOS build and signing jobs on a Mac you already own. Running CI jobs on idle office or home PCs without managing a Kubernetes cluster. Giving each CI job an isolated environment on your own hardware.
- How do I install runner-up?
- Install runner-up with Go: go install github.com/kunchenguid/runner-up@latest Choose the repository to serve and the Linux pool label: runner-up init --repo you/app --pool my-linux Add a machine reachable over SSH: runner-up machine add box --ssh ci@box Check the setup and start the coordinator: runner-up check-config && runner-up serve
- Where can I get runner-up?
- The source code and installation instructions are on GitHub: https://github.com/kunchenguid/runner-up
Summary generated by AI from the project's README. GitHub stats refresh daily.
Related projects
Runs Windows inside a Docker container with automatic download and unattended installation, accessed through a browser or RDP.
A QEMU wrapper that automatically downloads operating system images and launches optimised Windows, macOS and Linux virtual machines.
Self-hosted macOS CI app for Apple Silicon that runs ephemeral virtual machines for GitHub Actions, Buildkite, GitLab Runner, or custom scripts.
Electron app that runs Windows apps on Linux inside a Docker or Podman container, showing them as native Linux desktop windows.
A minimalist KVM-based virtual machine monitor that runs lightweight microVMs for secure, multi-tenant serverless and container workloads.