{"id":53974,"url":"https://github.com/jonico/awesome-runners","name":"awesome-runners","description":"A curated list of awesome self-hosted GitHub Action runners in a large comparison matrix","projects_count":44,"last_synced_at":"2026-09-26T21:00:26.413Z","repository":{"id":40560513,"uuid":"336353479","full_name":"jonico/awesome-runners","owner":"jonico","description":"A curated list of awesome self-hosted GitHub Action runners in a large comparison matrix","archived":false,"fork":false,"pushed_at":"2026-09-23T14:55:09.000Z","size":110,"stargazers_count":894,"open_issues_count":0,"forks_count":60,"subscribers_count":22,"default_branch":"main","last_synced_at":"2026-09-24T09:21:33.553Z","etag":null,"topics":["actions","actions-runner","arm","auto-scaling","awesome-list","aws","azure","collection","comparison","comparisons-page","docker","gcp","github","hacktoberfest","kubernetes","operator","scaling","security","self-hosted","self-hosted-actions"],"latest_commit_sha":null,"homepage":"https://jonico.github.io/awesome-runners/","language":"SCSS","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jonico.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"claude":null,"gemini":null,"cursor":null,"copilot":null,"dco":null,"cla":null,"disclosure":null},"funding":{"github":"jonico"}},"created_at":"2021-02-05T18:17:36.000Z","updated_at":"2026-09-23T14:55:18.000Z","dependencies_parsed_at":"2026-09-06T23:11:05.437Z","dependency_job_id":null,"html_url":"https://github.com/jonico/awesome-runners","commit_stats":{"total_commits":81,"total_committers":21,"mean_commits":3.857142857142857,"dds":0.308641975308642,"last_synced_commit":"fba9fe8717babba95b29d012adbe6a57aea0db48"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/jonico/awesome-runners","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jonico%2Fawesome-runners","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jonico%2Fawesome-runners/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jonico%2Fawesome-runners/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jonico%2Fawesome-runners/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jonico","download_url":"https://codeload.github.com/jonico/awesome-runners/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jonico%2Fawesome-runners/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":341189360,"owners_count":37648325,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-08-22T15:14:58.755Z","status":"online","status_checked_at":"2026-09-24T02:00:06.325Z","response_time":86,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"created_at":"2024-01-16T07:53:58.493Z","updated_at":"2026-09-26T21:00:26.413Z","primary_language":null,"list_of_lists":false,"displayable":true,"categories":["Purpose","Matrix bonus","The matrix (might be better readable on [GitHub pages](https://jonico.github.io/awesome-runners/))"],"sub_categories":["A word about self-hosted action runner images / virtual environments and how to test locally","General collection of self-hosted runner best practices"],"readme":"![image](https://user-images.githubusercontent.com/1872314/109429007-f211c300-79f9-11eb-940d-2e778c89c9ea.png)\n\n# awesome-runners 🏃\n\n[![Awesome Badges](https://img.shields.io/badge/badges-awesome-green.svg)](https://github.com/Naereen/badges) [![GitHub license](https://img.shields.io/github/license/jonico/awesome-runners.svg)](https://github.com/jonico/awesome-runners/blob/main/LICENSE)\n[![made-with-Markdown](https://img.shields.io/badge/Made%20with-Markdown-1f425f.svg)](http://commonmark.org)\n[![Maintenance](https://img.shields.io/badge/Maintained%3F-yes-green.svg)](https://GitHub.com/jonico/awesome-runners/graphs/commit-activity)\n[![Open Source? Yes!](https://badgen.net/badge/Open%20Source%20%3F/Yes%21/blue?icon=github)](https://github.com/jonico/awesome-runners/)\n\nA curated list of awesome self-hosted GitHub Action runner solutions in a large comparison matrix\n\n## Purpose\n\nThe purpose of this repository is to provide an overview on self-hosted runner solutions for GitHub Actions compared by various criteria. There is no rating implied as the importance of the various categories differ from use case to use case.\nData can be out of date, so if a certain feature is told to be missing, please double check whether this is still the case.\n\n[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com)\n\n### General collection of self-hosted runner best practices\n\nDuring my research, I stumbled over [dduzgun-security/github-self-hosted-runners](https://github.com/dduzgun-security/github-self-hosted-runners) with ✨ tips ✨ on what to consider when using self-hosted runners by yourself.\n\nAdditional security references for self-hosted runner deployments:\n\n- [GitHub Actions secure use reference](https://docs.github.com/actions/security-guides/security-hardening-for-github-actions) - GitHub's guidance for hardening workflows, secrets, permissions, and self-hosted runner usage.\n- [Harden-Runner](https://github.com/step-security/harden-runner) - Runtime security monitoring and egress control for GitHub Actions runners, including self-hosted runner deployments.\n\n### A word about self-hosted action runner images / virtual environments and how to test locally\n\nThe virtual environments provided by GitHub Action managed runners like `ubuntu-latest` contain [a LOT of pre-installed tools](https://github.com/actions/virtual-environments) already. If all of those tools were installed in your self-hosted runner, this would result in [images \u003e 18 GB](https://github.com/nektos/act#alternative-runner-images). In many cases where you have a better picture for which purposes/platforms you will use your self-hosted runners, this is probably not what you want for performance and maintenance reasons. All of the self-hosted solutions compared allow to define custom images with custom tooling.\n\nIf you like to test your custom images with your Actions workflows locally before you expose them to your end users at large scale, you can use [nektos/act](https://github.com/nektos/act) to specify your own Docker image for a specific runner label [using the -P option](https://github.com/nektos/act#use-an-alternative-runner-image), see a more complex example [here](https://github.com/jonico/visualize-actions-matrix-builds-on-k8s/blob/master/simulate-action-workflow.sh).\n\n## The matrix (might be better readable on [GitHub pages](https://jonico.github.io/awesome-runners/))\n\n| Solution name                                                                       | Runtime                       | GHES | RegScope                                    | Scaling                              | AutoScaling                                                    | Architecture           | AutoDereg                | PATInRunner | CleanUp         | Privileged                        | Exposed                            | AllInOne                          | SelfService                      | IdleCosts                                                                 |\n|-------------------------------------------------------------------------------------|-------------------------------|------|---------------------------------------------|--------------------------------------|----------------------------------------------------------------|------------------------|--------------------------|-------------|-----------------|-----------------------------------|------------------------------------|-----------------------------------|----------------------------------|---------------------------------------------------------------------------|\n| [actions/actions-runner-controller](https://github.com/actions/actions-runner-controller)  [![GitHub license](https://img.shields.io/github/license/actions/actions-runner-controller.svg)](https://github.com/actions/actions-runner-controller/blob/master/LICENSE) [![GitHub contributors](https://img.shields.io/github/contributors/actions/actions-runner-controller.svg)](https://github.com/actions/actions-runner-controller/graphs/contributors/) [![GitHub Stars](https://img.shields.io/github/stars/actions/actions-runner-controller.svg)](https://github.com/actions/actions-runner-controller/stargazers/) [![GitHub issues](https://img.shields.io/github/issues/actions/actions-runner-controller.svg)](https://GitHub.com/actions/actions-runner-controller/issues/) [![GitHub issues-closed](https://img.shields.io/github/issues-closed/actions/actions-runner-controller.svg)](https://GitHub.com/actions/actions-runner-controller/issues?q=is%3Aissue+is%3Aclosed)                            | k8s                           | ✅    | Enterprise, Org, Repo, Labels, RunnerGroups | k8s manifests \u0026 dynamic scaling      | ✅ (pending + running jobs or percentage runners already busy, check run events, scale up/down and flapping prevention parameters)       | x86, AMD64, ARM, ARM64 | ✅                        | no          | yes (if ephemeral option is used) | yes (install time, optional DinD) | only if github-webhook autoscaler is used  | no                                | yes ([IssueOps project available](https://github.com/jonico/auto-scaling-github-runners-kubernetes-issueops)) | actions-runner controller + at least one pod per org runner               |\n| [github-aws-runners/terraform-aws-github-runner](https://github.com/github-aws-runners/terraform-aws-github-runner)  [![GitHub license](https://img.shields.io/github/license/github-aws-runners/terraform-aws-github-runner.svg)](https://github.com/github-aws-runners/terraform-aws-github-runner/blob/main/LICENSE.md) [![GitHub contributors](https://img.shields.io/github/contributors/github-aws-runners/terraform-aws-github-runner.svg)](https://github.com/github-aws-runners/terraform-aws-github-runner/graphs/contributors/) [![GitHub Stars](https://img.shields.io/github/stars/github-aws-runners/terraform-aws-github-runner.svg)](https://github.com/github-aws-runners/terraform-aws-github-runner/stargazers/) [![GitHub issues](https://img.shields.io/github/issues/github-aws-runners/terraform-aws-github-runner.svg)](https://GitHub.com/github-aws-runners/terraform-aws-github-runner/issues/) [![GitHub issues-closed](https://img.shields.io/github/issues-closed/github-aws-runners/terraform-aws-github-runner.svg)](https://GitHub.com/github-aws-runners/terraform-aws-github-runner/issues?q=is%3Aissue+is%3Aclosed)                        | AWS EC2/Lambda  for Linux, Windows and macOS VMs               | ✅    | Org, Repo, Labels, Dynamic Labels, RunnerGroups             | Terraform config \u0026 dynamic scaling   | ✅ (pending jobs in org/repo, scale up/down and flapping prevention parameters)                                   | x86, AMD64, ARM, ARM64, macOS (EC2, requires a dedicated host) | ✅                        | no          | yes (if ephemeral option is used)              | no                                | yes (GitHub check_run events)      | yes (at least intended this way)  | yes ([IssueOps project available](https://github.com/jonico/auto-scaling-github-runners-ec2-issueops)) | no (only Lambdas, KMS, queue service, API gateway)                        |\n| [myoung34/docker-github-actions-runner](https://github.com/myoung34/docker-github-actions-runner)  [![GitHub license](https://img.shields.io/github/license/myoung34/docker-github-actions-runner.svg)](https://github.com/myoung34/docker-github-actions-runner/blob/master/LICENSE) [![GitHub contributors](https://img.shields.io/github/contributors/myoung34/docker-github-actions-runner.svg)](https://github.com/myoung34/docker-github-actions-runner/graphs/contributors/) [![GitHub Stars](https://img.shields.io/github/stars/myoung34/docker-github-actions-runner.svg)](https://github.com/myoung34/docker-github-actions-runner/stargazers/) [![GitHub issues](https://img.shields.io/github/issues/myoung34/docker-github-actions-runner.svg)](https://GitHub.com/myoung34/docker-github-actions-runner/issues/) [![GitHub issues-closed](https://img.shields.io/github/issues-closed/myoung34/docker-github-actions-runner.svg)](https://GitHub.com/myoung34/docker-github-actions-runner/issues?q=is%3Aissue+is%3Aclosed)                           | Docker                        | ✅    | Org, Repo, Labels, RunnerGroups             | docker-compose, Nomad \u0026 k8s examples | ❌                                                              | x86, ARM64, ARM        | ✅                        | yes         | no              | yes (DinD)                        | no                                 | no                                | no                               | no                                                                        |\n| [evryfs/github-actions-runner-operator](https://github.com/evryfs/github-actions-runner-operator)  [![GitHub license](https://img.shields.io/github/license/evryfs/github-actions-runner-operator.svg)](https://github.com/evryfs/github-actions-runner-operator/blob/master/LICENSE.txt) [![GitHub contributors](https://img.shields.io/github/contributors/evryfs/github-actions-runner-operator.svg)](https://github.com/evryfs/github-actions-runner-operator/graphs/contributors/) [![GitHub Stars](https://img.shields.io/github/stars/evryfs/github-actions-runner-operator.svg)](https://github.com/evryfs/github-actions-runner-operator/stargazers/) [![GitHub issues](https://img.shields.io/github/issues/evryfs/github-actions-runner-operator.svg)](https://GitHub.com/evryfs/github-actions-runner-operator/issues/) [![GitHub issues-closed](https://img.shields.io/github/issues-closed/evryfs/github-actions-runner-operator.svg)](https://GitHub.com/evryfs/github-actions-runner-operator/issues?q=is%3Aissue+is%3Aclosed)                           | k8s                           | ✅    | Organization, Repo                          | yes (k8s manifests define max and min)                  |✅ scales up to min runners ASAP, then adds one runner at a time up to max if all current runners are busy, scales down idle runners up to min| x86                    | ✅                        | no          | yes (ephemeral from v0.10.0)  | yes (install time, optional DinD) | no                                 | no                                | no                               | actions-runner controller                                                 |\n| [MonolithProjects/ansible-github_actions_runner](https://github.com/MonolithProjects/ansible-github_actions_runner)  [![GitHub license](https://img.shields.io/github/license/MonolithProjects/ansible-github_actions_runner.svg)](https://github.com/MonolithProjects/ansible-github_actions_runner/blob/master/LICENSE) [![GitHub contributors](https://img.shields.io/github/contributors/MonolithProjects/ansible-github_actions_runner.svg)](https://github.com/MonolithProjects/ansible-github_actions_runner/graphs/contributors/) [![GitHub Stars](https://img.shields.io/github/stars/MonolithProjects/ansible-github_actions_runner.svg)](https://github.com/MonolithProjects/ansible-github_actions_runner/stargazers/) [![GitHub issues](https://img.shields.io/github/issues/MonolithProjects/ansible-github_actions_runner.svg)](https://GitHub.com/MonolithProjects/ansible-github_actions_runner/issues/) [![GitHub issues-closed](https://img.shields.io/github/issues-closed/MonolithProjects/ansible-github_actions_runner.svg)](https://GitHub.com/MonolithProjects/ansible-github_actions_runner/issues?q=is%3Aissue+is%3Aclosed)                  | bare metal/VM                 | ✅    | Organization, Repo, Labels                    | based on Ansible playbook            | ❌                                                              | x86, AMD64, ARM, ARM64 | explicitly in playbook   | no          | no              | install Ansible agents            | Ansible agents                     | possible                          | no                               | Ansible agents                                                            |\n| [SanderKnape/github-runner](https://github.com/SanderKnape/github-runner)  [![GitHub license](https://img.shields.io/github/license/SanderKnape/github-runner.svg)](https://github.com/SanderKnape/github-runner/blob/master/LICENSE.md) [![GitHub contributors](https://img.shields.io/github/contributors/SanderKnape/github-runner.svg)](https://github.com/SanderKnape/github-runner/graphs/contributors/) [![GitHub Stars](https://img.shields.io/github/stars/SanderKnape/github-runner.svg)](https://github.com/SanderKnape/github-runner/stargazers/) [![GitHub issues](https://img.shields.io/github/issues/SanderKnape/github-runner.svg)](https://GitHub.com/SanderKnape/github-runner/issues/) [![GitHub issues-closed](https://img.shields.io/github/issues-closed/SanderKnape/github-runner.svg)](https://GitHub.com/SanderKnape/github-runner/issues?q=is%3Aissue+is%3Aclosed)                                       | Docker                        | ❌    | Org, Repo, Labels                           | k8s manifest example                 | ❌                                                              | x86                    | ✅                        | yes         | no              | no                                | no                                 | no                                | no                               | no                                                                        |\n| [machulav/ec2-github-runner](https://github.com/machulav/ec2-github-runner)  [![GitHub license](https://img.shields.io/github/license/machulav/ec2-github-runner.svg)](https://github.com/machulav/ec2-github-runner/blob/master/LICENSE) [![GitHub contributors](https://img.shields.io/github/contributors/machulav/ec2-github-runner.svg)](https://github.com/machulav/ec2-github-runner/graphs/contributors/) [![GitHub Stars](https://img.shields.io/github/stars/machulav/ec2-github-runner.svg)](https://github.com/machulav/ec2-github-runner/stargazers/) [![GitHub issues](https://img.shields.io/github/issues/machulav/ec2-github-runner.svg)](https://GitHub.com/machulav/ec2-github-runner/issues/) [![GitHub issues-closed](https://img.shields.io/github/issues-closed/machulav/ec2-github-runner.svg)](https://GitHub.com/machulav/ec2-github-runner/issues?q=is%3Aissue+is%3Aclosed)                                      | AWS EC2                       | ❌    | Repo                                        | GitHub Actions workflow params       | ✅ (1 runner per workflow run that requests it)                 | x86                    | part of Actions workflow | no          | yes (ephemeral) | no                                | embedded in GitHub Action workflow | possible                          | yes (Actions Workflow)           | no                                                                        |\n| [terraform-google-modules/terraform-google-github-actions-runners](https://github.com/terraform-google-modules/terraform-google-github-actions-runners)  [![GitHub license](https://img.shields.io/github/license/terraform-google-modules/terraform-google-github-actions-runners.svg)](https://github.com/terraform-google-modules/terraform-google-github-actions-runners/blob/master/LICENSE) [![GitHub contributors](https://img.shields.io/github/contributors/terraform-google-modules/terraform-google-github-actions-runners.svg)](https://github.com/terraform-google-modules/terraform-google-github-actions-runners/graphs/contributors/) [![GitHub Stars](https://img.shields.io/github/stars/terraform-google-modules/terraform-google-github-actions-runners.svg)](https://github.com/terraform-google-modules/terraform-google-github-actions-runners/stargazers/) [![GitHub issues](https://img.shields.io/github/issues/terraform-google-modules/terraform-google-github-actions-runners.svg)](https://GitHub.com/terraform-google-modules/terraform-google-github-actions-runners/issues/) [![GitHub issues-closed](https://img.shields.io/github/issues-closed/terraform-google-modules/terraform-google-github-actions-runners.svg)](https://GitHub.com/terraform-google-modules/terraform-google-github-actions-runners/issues?q=is%3Aissue+is%3Aclosed)| k8s (GKE), Docker, VMs (GCE)  | ❌    | Repo                                        | Terraform config/k8s manifests       | only on k8s, based on generic pod CPU consumption (HPA metric) | x86                    | only worked for Docker   | yes         | no              | no                                | no                                 | VMs could be configured like this | no                               | at least one idle runner to allow HPA to kick in based on CPU consumption |\n[github-developer/self-hosted-runners-anthos](https://github.com/github-developer/self-hosted-runners-anthos)  [![GitHub license](https://img.shields.io/github/license/github-developer/self-hosted-runners-anthos.svg)](https://github.com/github-developer/self-hosted-runners-anthos/blob/master/LICENSE) [![GitHub contributors](https://img.shields.io/github/contributors/github-developer/self-hosted-runners-anthos.svg)](https://github.com/github-developer/self-hosted-runners-anthos/graphs/contributors/) [![GitHub Stars](https://img.shields.io/github/stars/github-developer/self-hosted-runners-anthos.svg)](https://github.com/github-developer/self-hosted-runners-anthos/stargazers/) [![GitHub issues](https://img.shields.io/github/issues/github-developer/self-hosted-runners-anthos.svg)](https://GitHub.com/github-developer/self-hosted-runners-anthos/issues/) [![GitHub issues-closed](https://img.shields.io/github/issues-closed/github-developer/self-hosted-runners-anthos.svg)](https://GitHub.com/github-developer/self-hosted-runners-anthos/issues?q=is%3Aissue+is%3Aclosed)| k8s (Anthos GKE) | ❌    | Repo                                        | Terraform config/k8s manifests       | only on k8s, based on generic pod CPU consumption (HPA metric) | x86                    | ✅   | yes         | no              | yes, for DinD (can be turned off)                                | no                                 | no | no                               | at least one idle runner to allow HPA to kick in based on CPU consumption |\n| [cosmoconsult/github-runner-windows](https://github.com/cosmoconsult/github-runner-windows)  [![GitHub license](https://img.shields.io/github/license/cosmoconsult/github-runner-windows.svg)](https://github.com/cosmoconsult/github-runner-windows/blob/master/LICENSE) [![GitHub contributors](https://img.shields.io/github/contributors/cosmoconsult/github-runner-windows.svg)](https://github.com/cosmoconsult/github-runner-windows/graphs/contributors/) [![GitHub Stars](https://img.shields.io/github/stars/cosmoconsult/github-runner-windows.svg)](https://github.com/cosmoconsult/github-runner-windows/stargazers/) [![GitHub issues](https://img.shields.io/github/issues/cosmoconsult/github-runner-windows.svg)](https://GitHub.com/cosmoconsult/github-runner-windows/issues/) [![GitHub issues-closed](https://img.shields.io/github/issues-closed/cosmoconsult/github-runner-windows.svg)](https://GitHub.com/cosmoconsult/github-runner-windows/issues?q=is%3Aissue+is%3Aclosed)                              | Windows Docker container      | ❌    | Org, Repo                                   | docker compose example in [blog post](https://tobiasfenster.io/building-docker-images-for-multiple-windows-server-versions-using-self-hosted-github-runners)      | ❌                                                              | win-x86                | replace but not remove   | yes         | no              | no                                | no                                 | no                                | no                               | no                                                                        |\n| [redhat-actions/self-hosted-runner-installer](https://github.com/redhat-actions/self-hosted-runner-installer)  [![GitHub license](https://img.shields.io/github/license/redhat-actions/self-hosted-runner-installer.svg)](https://github.com/redhat-actions/self-hosted-runner-installer/blob/master/LICENSE) [![GitHub contributors](https://img.shields.io/github/contributors/redhat-actions/self-hosted-runner-installer.svg)](https://github.com/redhat-actions/self-hosted-runner-installer/graphs/contributors/) [![GitHub Stars](https://img.shields.io/github/stars/redhat-actions/self-hosted-runner-installer.svg)](https://github.com/redhat-actions/self-hosted-runner-installer/stargazers/) [![GitHub issues](https://img.shields.io/github/issues/redhat-actions/self-hosted-runner-installer.svg)](https://GitHub.com/redhat-actions/self-hosted-runner-installer/issues/) [![GitHub issues-closed](https://img.shields.io/github/issues-closed/redhat-actions/self-hosted-runner-installer.svg)](https://GitHub.com/redhat-actions/self-hosted-runner-installer/issues?q=is%3Aissue+is%3Aclosed)                     | Kubernetes (OpenShift)        | ✅    | Org, Repo, Labels                           | HELM chart parameters                | ❌                                                              | x86                    | ✅                        | yes         | no              | no                                | no                                 | no                                | no                               | no                                                                        |\n| [peter-murray/github-actions-runner-container](https://github.com/peter-murray/github-actions-runner-container)  [![GitHub license](https://img.shields.io/github/license/peter-murray/github-actions-runner-container.svg)](https://github.com/peter-murray/github-actions-runner-container/blob/master/LICENSE) [![GitHub contributors](https://img.shields.io/github/contributors/peter-murray/github-actions-runner-container.svg)](https://github.com/peter-murray/github-actions-runner-container/graphs/contributors/) [![GitHub Stars](https://img.shields.io/github/stars/peter-murray/github-actions-runner-container.svg)](https://github.com/peter-murray/github-actions-runner-container/stargazers/) [![GitHub issues](https://img.shields.io/github/issues/peter-murray/github-actions-runner-container.svg)](https://GitHub.com/peter-murray/github-actions-runner-container/issues/) [![GitHub issues-closed](https://img.shields.io/github/issues-closed/peter-murray/github-actions-runner-container.svg)](https://GitHub.com/peter-murray/github-actions-runner-container/issues?q=is%3Aissue+is%3Aclosed)                    | Docker                        | ❌    | Enterprise, Org, Repo, Labels, RunnerGroups | ❌                                    | ❌                                                              | x86                    | ✅                        | yes         | yes             | no                                | no                                 | no                                | no                               | no                                                                        |\n| [lts-beratung/ansible-github-action-runner](https://github.com/lts-beratung/ansible-github-action-runner)  [![GitHub license](https://img.shields.io/github/license/lts-beratung/ansible-github-action-runner.svg)](https://github.com/lts-beratung/ansible-github-action-runner/blob/master/LICENSE.md) [![GitHub contributors](https://img.shields.io/github/contributors/lts-beratung/ansible-github-action-runner.svg)](https://github.com/lts-beratung/ansible-github-action-runner/graphs/contributors/) [![GitHub Stars](https://img.shields.io/github/stars/lts-beratung/ansible-github-action-runner.svg)](https://github.com/lts-beratung/ansible-github-action-runner/stargazers/) [![GitHub issues](https://img.shields.io/github/issues/lts-beratung/ansible-github-action-runner.svg)](https://GitHub.com/lts-beratung/ansible-github-action-runner/issues/) [![GitHub issues-closed](https://img.shields.io/github/issues-closed/lts-beratung/ansible-github-action-runner.svg)](https://GitHub.com/lts-beratung/ansible-github-action-runner/issues?q=is%3Aissue+is%3Aclosed)                       | bare metal or VM              | ❌    | Org, Repo                                   | Ansible playbook                     | ❌                                                              | x86                    | ✅                        | yes         | no              | install Ansible agents            | Ansible agents                     | possible                          | no                               | Ansible agents                                                            |\n| [rakheshster/github-runner-on-ubuntu](https://github.com/rakheshster/github-runner-on-ubuntu)  [![GitHub license](https://img.shields.io/github/license/rakheshster/github-runner-on-ubuntu.svg)](https://github.com/rakheshster/github-runner-on-ubuntu/blob/master/LICENSE) [![GitHub contributors](https://img.shields.io/github/contributors/rakheshster/github-runner-on-ubuntu.svg)](https://github.com/rakheshster/github-runner-on-ubuntu/graphs/contributors/) [![GitHub Stars](https://img.shields.io/github/stars/rakheshster/github-runner-on-ubuntu.svg)](https://github.com/rakheshster/github-runner-on-ubuntu/stargazers/) [![GitHub issues](https://img.shields.io/github/issues/rakheshster/github-runner-on-ubuntu.svg)](https://GitHub.com/rakheshster/github-runner-on-ubuntu/issues/) [![GitHub issues-closed](https://img.shields.io/github/issues-closed/rakheshster/github-runner-on-ubuntu.svg)](https://GitHub.com/rakheshster/github-runner-on-ubuntu/issues?q=is%3Aissue+is%3Aclosed)                             | Azure VM (ARM template)       | ❌    | Repo                                        | ❌                                    | ❌                                                              | x86                    | ❌                        | yes         | no              | no                                | no                                 | possible                          | no                               | no                                                                        |\n| [ChristopherHX/github-act-runner](https://github.com/ChristopherHX/github-act-runner)  [![GitHub license](https://img.shields.io/github/license/ChristopherHX/github-act-runner.svg)](https://github.com/ChristopherHX/github-act-runner/blob/master/LICENSE) [![GitHub contributors](https://img.shields.io/github/contributors/ChristopherHX/github-act-runner.svg)](https://github.com/ChristopherHX/github-act-runner/graphs/contributors/) [![GitHub Stars](https://img.shields.io/github/stars/ChristopherHX/github-act-runner.svg)](https://github.com/ChristopherHX/github-act-runner/stargazers/) [![GitHub issues](https://img.shields.io/github/issues/ChristopherHX/github-act-runner.svg)](https://github.com/ChristopherHX/github-act-runner/issues/) [![GitHub issues-closed](https://img.shields.io/github/issues-closed/ChristopherHX/github-act-runner.svg)](https://github.com/ChristopherHX/github-act-runner/issues?q=is%3Aissue+is%3Aclosed)|bare metal|✅|Enterprise, Org, Repo, Labels, RunnerGroups|❌|❌|x86, AMD64, ARM, ARM64, riscv64, s390x, ppc64, ppc64le, mips, mipsle, mips64, mips64le on Linux, Windows, macOS, Openbsd, Freebsd, Netbsd, Solaris, Dragonfly, Plan9, Android and Illumos|❌|no|yes|no|no|no|no|no|\n| [related-sciences/gce-github-runner](https://github.com/related-sciences/gce-github-runner)  [![GitHub license](https://img.shields.io/github/license/related-sciences/gce-github-runner.svg)](https://github.com/related-sciences/gce-github-runner/blob/main/LICENSE) [![GitHub contributors](https://img.shields.io/github/contributors/related-sciences/gce-github-runner.svg)](https://github.com/related-sciences/gce-github-runner/graphs/contributors/) [![GitHub Stars](https://img.shields.io/github/stars/related-sciences/gce-github-runner.svg)](https://github.com/related-sciences/gce-github-runner/stargazers/) [![GitHub issues](https://img.shields.io/github/issues/related-sciences/gce-github-runner.svg)](https://GitHub.com/related-sciences/gce-github-runner/issues/) [![GitHub issues-closed](https://img.shields.io/github/issues-closed/related-sciences/gce-github-runner.svg)](https://GitHub.com/related-sciences/gce-github-runner/issues?q=is%3Aissue+is%3Aclosed)                                      | GCP GCE                       | ❌    | Repo                                        | GitHub Actions workflow params       | ✅ (1 runner per workflow run that requests it)                 | x86                    | part of Actions workflow | no          | yes (ephemeral) | no                                | embedded in GitHub Action workflow | possible                          | yes (Actions Workflow)           | no                                                                        |\n| [whywaita/myshoes](https://github.com/whywaita/myshoes)  [![GitHub license](https://img.shields.io/github/license/whywaita/myshoes.svg)](https://github.com/whywaita/myshoes/blob/master/LICENSE) [![GitHub contributors](https://img.shields.io/github/contributors/whywaita/myshoes.svg)](https://github.com/whywaita/myshoes/graphs/contributors/) [![GitHub Stars](https://img.shields.io/github/stars/whywaita/myshoes.svg)](https://github.com/whywaita/myshoes/stargazers/) [![GitHub issues](https://img.shields.io/github/issues/whywaita/myshoes.svg)](https://github.com/whywaita/myshoes/issues/) [![GitHub issues-closed](https://img.shields.io/github/issues-closed/whywaita/myshoes.svg)](https://github.com/whywaita/myshoes/issues?q=is%3Aissue+is%3Aclosed) | Virtual Machine: LXD, OpenStack, AWS, and more! (pluggable, can implement any platform) The already implemented provider is [whywaita/myshoes-providers](https://github.com/whywaita/myshoes-providers) | ✅ | Repo, Org | GitHub Actions workflow params | ✅ (1 runner per workflow run that requests it) | any platform that can start bash script or transpiled script from a bash script | part of Actions workflow | no | yes (ephemeral) | no | yes (GitHub check_run events) | possible (provide image in some provider, e.g. [whywaita/virtual-environments-lxd](https://github.com/whywaita/virtual-environments-lxd/) and [shoes-lxd](https://github.com/whywaita/myshoes-providers/tree/master/shoes-lxd/images)) | no | myshoes daemon process |\n| [boozallen/goobernetes](https://github.com/boozallen/goobernetes)  [![GitHub license](https://img.shields.io/github/license/boozallen/goobernetes.svg)](https://github.com/boozallen/goobernetes/blob/main/LICENSE.md) [![GitHub contributors](https://img.shields.io/github/contributors/boozallen/goobernetes.svg)](https://github.com/boozallen/goobernetes/graphs/contributors/) [![GitHub Stars](https://img.shields.io/github/stars/boozallen/goobernetes.svg)](https://github.com/boozallen/goobernetes/stargazers/) [![GitHub issues](https://img.shields.io/github/issues/boozallen/goobernetes.svg)](https://GitHub.com/boozallen/goobernetes/issues/) [![GitHub issues-closed](https://img.shields.io/github/issues-closed/boozallen/goobernetes.svg)](https://GitHub.com/boozallen/goobernetes/issues?q=is%3Aissue+is%3Aclosed)                                       | k8s                           | ✅    | Enterprise, Org, Repo, Labels, RunnerGroups | k8s manifests \u0026 dynamic scaling      | ✅ (pending + running jobs or percentage runners already busy, check run events, scale up/down and flapping prevention parameters)       | AMD64, others possible | ✅                        | no          | yes (if ephemeral option is used) | yes (install time, optional DInD) | only if github-webhook autoscaler is used  | no                                | yes ([IssueOps project available](https://github.com/jonico/auto-scaling-github-runners-kubernetes-issueops)) | actions-runner controller + at least one pod per org runner               |\n| [some-natalie/kubernoodles](https://github.com/some-natalie/kubernoodles)  [![GitHub license](https://img.shields.io/github/license/some-natalie/kubernoodles.svg)](https://github.com/some-natalie/kubernoodles/blob/main/LICENSE) [![GitHub contributors](https://img.shields.io/github/contributors/some-natalie/kubernoodles.svg)](https://github.com/some-natalie/kubernoodles/graphs/contributors/) [![GitHub Stars](https://img.shields.io/github/stars/some-natalie/kubernoodles.svg)](https://github.com/some-natalie/kubernoodles/stargazers/) [![GitHub issues](https://img.shields.io/github/issues/some-natalie/kubernoodles.svg)](https://GitHub.com/some-natalie/kubernoodles/issues/) [![GitHub issues-closed](https://img.shields.io/github/issues-closed/some-natalie/kubernoodles.svg)](https://GitHub.com/some-natalie/kubernoodles/issues?q=is%3Aissue+is%3Aclosed)                                       | k8s                           | ✅    | Enterprise, Org, Repo, Labels, RunnerGroups | k8s manifests \u0026 dynamic scaling      | ✅ (pending + running jobs or percentage runners already busy, check run events, scale up/down and flapping prevention parameters)       | AMD64, others possible | ✅                        | no          | yes (if ephemeral option is used) | yes (install time, optional DinD) | only if github-webhook autoscaler is used  | no                                | yes ([IssueOps project available](https://github.com/jonico/auto-scaling-github-runners-kubernetes-issueops)) | actions-runner controller + at least one pod per org runner               |\n| [knatnetwork/github-runner](https://github.com/knatnetwork/github-runner)  [![GitHub license](https://img.shields.io/github/license/knatnetwork/github-runner.svg)](https://github.com/knatnetwork/github-runner/blob/master/LICENSE.md) [![GitHub contributors](https://img.shields.io/github/contributors/knatnetwork/github-runner.svg)](https://github.com/knatnetwork/github-runner/graphs/contributors/) [![GitHub Stars](https://img.shields.io/github/stars/knatnetwork/github-runner.svg)](https://github.com/knatnetwork/github-runner/stargazers/) [![GitHub issues](https://img.shields.io/github/issues/knatnetwork/github-runner.svg)](https://GitHub.com/knatnetwork/github-runner/issues/) [![GitHub issues-closed](https://img.shields.io/github/issues-closed/knatnetwork/github-runner.svg)](https://GitHub.com/knatnetwork/github-runner/issues?q=is%3Aissue+is%3Aclosed)                                       | Docker for single machine quick start or K8s deployments for multiple replicas                          | ❌    | Org, Repo, Labels | docker-compose or k8s deployment      | ❌       | AMD64, ARM64 | ✅                        | no          | yes (if ephemeral option is used) | yes (install time, optional DinD) | no  | no                                | no | no               |\n| [CloudSnorkel/cdk-github-runners](https://github.com/CloudSnorkel/cdk-github-runners)  [![GitHub license](https://img.shields.io/github/license/CloudSnorkel/cdk-github-runners.svg)](https://github.com/CloudSnorkel/cdk-github-runners/blob/main/LICENSE) [![GitHub contributors](https://img.shields.io/github/contributors/CloudSnorkel/cdk-github-runners.svg)](https://github.com/CloudSnorkel/cdk-github-runners/graphs/contributors/) [![GitHub Stars](https://img.shields.io/github/stars/CloudSnorkel/cdk-github-runners.svg)](https://github.com/CloudSnorkel/cdk-github-runners/stargazers/) [![GitHub issues](https://img.shields.io/github/issues/CloudSnorkel/cdk-github-runners.svg)](https://GitHub.com/CloudSnorkel/cdk-github-runners/issues/) [![GitHub issues-closed](https://img.shields.io/github/issues-closed/CloudSnorkel/cdk-github-runners.svg)](https://GitHub.com/CloudSnorkel/cdk-github-runners/issues?q=is%3Aissue+is%3Aclosed)                                       | Docker on AWS CodeBuild, Fargate or Lambda | ✅    | Labels | On-demand | ✅       | AMD64, ARM64 | ✅                        | no          | yes (always ephemeral) | yes | yes (Lambda URL with secret)  | possible | no | no               |\n| [vbem/multi-runners](https://github.com/vbem/multi-runners) [![GitHub license](https://img.shields.io/github/license/vbem/multi-runners.svg)](https://github.com/vbem/multi-runners/blob/main/LICENSE) [![GitHub contributors](https://img.shields.io/github/contributors/vbem/multi-runners.svg)](https://github.com/vbem/multi-runners/graphs/contributors/) [![GitHub Stars](https://img.shields.io/github/stars/vbem/multi-runners.svg)](https://github.com/vbem/multi-runners/stargazers/) [![GitHub issues](https://img.shields.io/github/issues/vbem/multi-runners.svg)](https://GitHub.com/vbem/multi-runners/issues/) [![GitHub issues-closed](https://img.shields.io/github/issues-closed/vbem/multi-runners.svg)](https://GitHub.com/vbem/multi-runners/issues?q=is%3Aissue+is%3Aclosed) | bare metal/VM | ✅ | Org, Repo, Labels, RunnerGroups | CLI control | ❌ | x86, AMD64, ARM, ARM64 | CLI control | yes | no | yes | no | possible | yes (CLI) | no |\n| [runs-on/runs-on](https://github.com/runs-on/runs-on) [![GitHub license](https://img.shields.io/github/license/runs-on/runs-on.svg)](https://github.com/runs-on/runs-on/blob/master/LICENSE) [![GitHub contributors](https://img.shields.io/github/contributors/runs-on/runs-on.svg)](https://github.com/runs-on/runs-on/graphs/contributors/) [![GitHub Stars](https://img.shields.io/github/stars/runs-on/runs-on.svg)](https://github.com/runs-on/runs-on/stargazers/) [![GitHub issues](https://img.shields.io/github/issues/runs-on/runs-on.svg)](https://GitHub.com/runs-on/runs-on/issues/) [![GitHub issues-closed](https://img.shields.io/github/issues-closed/runs-on/runs-on.svg)](https://GitHub.com/runs-on/runs-on/issues?q=is%3Aissue+is%3Aclosed) | AWS EC2 | ✅ | Repo, Dynamic Labels | On-demand | ✅ | x86, AMD64, ARM64 | ✅ | No PAT, only JIT token | Auto-cleanup | No runtime privilege | GitHub App exposed | AllInOne and custom images possible | yes (Actions Workflow) | $15/month |\n|[cloudbase/garm](https://github.com/cloudbase/garm) [![GitHub license](https://img.shields.io/github/license/cloudbase/garm.svg)](https://github.com/cloudbase/garm/blob/main/LICENSE) [![GitHub contributors](https://img.shields.io/github/contributors/cloudbase/garm.svg)](https://github.com/cloudbase/garm/graphs/contributors/) [![GitHub Stars](https://img.shields.io/github/stars/cloudbase/garm.svg)](https://github.com/cloudbase/garm/stargazers/) [![GitHub issues](https://img.shields.io/github/issues/cloudbase/garm.svg)](https://GitHub.com/cloudbase/garm/issues/) [![GitHub issues-closed](https://img.shields.io/github/issues-closed/cloudbase/garm.svg)](https://GitHub.com/cloudbase/garm/issues?q=is%3Aissue+is%3Aclosed)|k8s,VM,Bare Metal ([pluggable](https://github.com/cloudbase/garm/blob/main/doc/external_provider.md)), available providers: [k8s](https://github.com/mercedes-benz/garm-provider-k8s), [EC2](https://github.com/cloudbase/garm-provider-aws), [OpenStack](https://github.com/cloudbase/garm-provider-openstack), [OCI](https://github.com/cloudbase/garm-provider-oci), [GCP](https://github.com/cloudbase/garm-provider-gcp), [LXD](https://github.com/cloudbase/garm-provider-lxd), [Incus](https://github.com/cloudbase/garm-provider-incus), [Equinix Metal](https://github.com/cloudbase/garm-provider-equinix), [Azure](https://github.com/cloudbase/garm-provider-azure).|✅|Enterprise, Org, Repo, Labels, RunnerGroups|On-demand|✅ Scales based on workflow jobs, allows setting min/max runners per pool, scales up to \"min\" immediately, maintains \"min\" idle runners as long as \"max\" is not reached|x86, AMD64, ARM, ARM64|✅|no|yes (all runners are ephemeral and automatically disposed from the provider once removed from GitHub)|no (GARM can run as a non privileged user)|yes, required for github-webhook endpoint, needed for auto scaling|yes (if used as standalone, optionally it can be integrated in k8s using the [garm-operator](https://github.com/mercedes-benz/garm-operator/))|yes, GARM has pools which can be created in any number on any entity (org, repo, enterprise), with any runner group and with any labels|the cost of running a single container or VM with GARM, and any idle runners configured in the pools, cost depends on provider used (EC2, Azure, etc)|\n| [Privatehive/gcp-hosted-github-runner](https://github.com/Privatehive/gcp-hosted-github-runner) [![GitHub license](https://img.shields.io/github/license/Privatehive/gcp-hosted-github-runner.svg)](https://github.com/Privatehive/gcp-hosted-github-runner/blob/master/LICENSE) [![GitHub contributors](https://img.shields.io/github/contributors/Privatehive/gcp-hosted-github-runner.svg)](https://github.com/Privatehive/gcp-hosted-github-runner/graphs/contributors/) [![GitHub Stars](https://img.shields.io/github/stars/Privatehive/gcp-hosted-github-runner.svg)](https://github.com/Privatehive/gcp-hosted-github-runner/stargazers/) [![GitHub issues](https://img.shields.io/github/issues/Privatehive/gcp-hosted-github-runner.svg)](https://GitHub.com/Privatehive/gcp-hosted-github-runner/issues/) [![GitHub issues-closed](https://img.shields.io/github/issues-closed/Privatehive/gcp-hosted-github-runner.svg)](https://GitHub.com/Privatehive/gcp-hosted-github-runner/issues?q=is%3Aissue+is%3Aclosed) | GCP GCE | ✅ | Enterprise, Org, Repo, Labels, RunnerGroups | On-demand | ✅ 1 runner per workflow job. Created when job is \"queued\". Deleted when job is \"completed\". | x86, AMD64, ARM64 | ✅ | No PAT, only JIT token | yes (always ephemeral) | no | yes, required for github-webhook endpoint, needed for auto scaling | possible | no | no (covered by GCP free tier) |\n| [sprinters-sh/sprinters](https://github.com/sprinters-sh/sprinters) [![GitHub license](https://img.shields.io/github/license/sprinters-sh/sprinters.svg)](https://github.com/sprinters-sh/sprinters/blob/master/LICENSE) [![GitHub contributors](https://img.shields.io/github/contributors/sprinters-sh/sprinters.svg)](https://github.com/sprinters-sh/sprinters/graphs/contributors/) [![GitHub Stars](https://img.shields.io/github/stars/sprinters-sh/sprinters.svg)](https://github.com/sprinters-sh/sprinters/stargazers/) [![GitHub issues](https://img.shields.io/github/issues/sprinters-sh/sprinters.svg)](https://GitHub.com/sprinters-sh/sprinters/issues/) [![GitHub issues-closed](https://img.shields.io/github/issues-closed/sprinters-sh/sprinters.svg)](https://GitHub.com/sprinters-sh/sprinters/issues?q=is%3Aissue+is%3Aclosed) | AWS EC2 | ❌ | Repo, Dynamic Labels | On-demand | ✅ | AMD64, ARM64 | ✅ | No PAT, only JIT token | Ephemeral instances with auto-cleanup | No privileges needed | Not exposed | Full and minimal images | Yes | $0 |\n| [cisco-open/forge](https://github.com/cisco-open/forge) [![GitHub license](https://img.shields.io/github/license/cisco-open/forge.svg)](https://github.com/cisco-open/forge/blob/main/LICENSE) [![GitHub contributors](https://img.shields.io/github/contributors/cisco-open/forge.svg)](https://github.com/cisco-open/forge/graphs/contributors/) [![GitHub Stars](https://img.shields.io/github/stars/cisco-open/forge.svg)](https://github.com/cisco-open/forge/stargazers/) [![GitHub issues](https://img.shields.io/github/issues/cisco-open/forge.svg)](https://GitHub.com/cisco-open/forge/issues/) [![GitHub issues-closed](https://img.shields.io/github/issues-closed/cisco-open/forge.svg)](https://GitHub.com/cisco-open/forge/issues?q=is%3Aissue+is%3Aclosed)\u003cbr\u003eMulti-tenant wrapper around [ARC](https://github.com/actions/actions-runner-controller) \u0026 [terraform-aws-github-runner](https://github.com/github-aws-runners/terraform-aws-github-runner), adding automation \u0026 extra features on top with a single interface to deploy \u0026 manage | k8s (ARC) \u0026 AWS EC2/Lambda for Linux and Windows VMs (terraform-aws-github-runner) | ✅ | Org (multiple GitHub Apps per org scoped to selected repos, or one App for all repos in the org), Dynamic Labels (EC2), RunnerGroups | k8s manifests (ARC) \u0026 Terraform config (terraform-aws-github-runner), dynamic scaling | ✅ (ARC: pending + running jobs or percentage runners already busy, check run events, scale up/down and flapping prevention parameters; terraform-aws-github-runner: pending jobs in org/repo, scale up/down and flapping prevention parameters) | x86, AMD64, ARM, ARM64, macOS (EC2 lane, requires a dedicated host) | ✅ | no | yes (if ephemeral option is used) | yes for ARC (install time, optional DinD), no for terraform-aws-github-runner | only if github-webhook autoscaler is used (ARC), no for terraform-aws-github-runner | yes (merges ARC \u0026 terraform-aws-github-runner features) | yes ([IssueOps project available](https://github.com/jonico/auto-scaling-github-runners-kubernetes-issueops)) | EKS cluster + ARC controller + at least one pod per org runner (ARC); no, only Lambdas, KMS, queue service, API gateway (terraform-aws-github-runner) |\n| [Flinner/gh-runnerctl](https://github.com/Flinner/gh-runnerctl)  [![GitHub license](https://img.shields.io/github/license/Flinner/gh-runnerctl.svg)](https://github.com/Flinner/gh-runnerctl/blob/main/LICENSE) [![GitHub contributors](https://img.shields.io/github/contributors/Flinner/gh-runnerctl.svg)](https://github.com/Flinner/gh-runnerctl/graphs/contributors/) [![GitHub Stars](https://img.shields.io/github/stars/Flinner/gh-runnerctl.svg)](https://github.com/Flinner/gh-runnerctl/stargazers/) [![GitHub issues](https://img.shields.io/github/issues/Flinner/gh-runnerctl.svg)](https://GitHub.com/Flinner/gh-runnerctl/issues/) [![GitHub issues-closed](https://img.shields.io/github/issues-closed/Flinner/gh-runnerctl.svg)](https://GitHub.com/Flinner/gh-runnerctl/issues?q=is%3Aissue+is%3Aclosed) | bare metal/VM, local or over ssh — no root, no Docker (user-level systemd or detached supervisor; targets HPC login nodes and shared hosts) | ❌ | Org, Repo, Labels, RunnerGroups | declarative `runners.toml` (`count` per pool), converged by `up`/`reload`; crashed runners restarted with backoff | ❌ (fixed-size pools by design) | x64, ARM64 (Linux) | busy-aware CLI/converge (`up` prunes, `rm` deregisters; skips busy runners unless `--force`) | no (token never leaves the control machine; remotes get short-lived registration tokens over ssh stdin) | no (persistent runners) | no (never root; no sudo at any step) | no | no | no | one user-level supervisor process per machine |\n| [Manzanita](https://manzanita.run/) (managed service, not self-hosted) | managed macOS VM (Apple Silicon M4 Pro) | ❌ | Org, Repo, Labels (via GitHub App) | managed by provider (buy N concurrent runners) | managed (jobs dispatched to purchased concurrency) | macOS (Apple Silicon, M4 Pro) | ✅ (ephemeral, one job per VM) | no (GitHub App) | yes (fresh VM per job) | n/a (fully managed) | no | yes (Xcode + toolchain preinstalled) | yes (dashboard + GitHub App) | none (flat monthly price, no infra to idle) |\n| [eyupio/zoomies](https://github.com/eyupio/zoomies) [![GitHub license](https://img.shields.io/github/license/eyupio/zoomies.svg)](https://github.com/eyupio/zoomies/blob/main/LICENSE) [![GitHub contributors](https://img.shields.io/github/contributors/eyupio/zoomies.svg)](https://github.com/eyupio/zoomies/graphs/contributors/) [![GitHub Stars](https://img.shields.io/github/stars/eyupio/zoomies.svg)](https://github.com/eyupio/zoomies/stargazers/) [![GitHub issues](https://img.shields.io/github/issues/eyupio/zoomies.svg)](https://github.com/eyupio/zoomies/issues/) [![GitHub issues-closed](https://img.shields.io/github/issues-closed/eyupio/zoomies.svg)](https://github.com/eyupio/zoomies/issues?q=is%3Aissue+is%3Aclosed) | Docker, Podman, bare process; no Kubernetes required | configurable API endpoint; untested | Org, Repo, Labels | UI, CLI and YAML; per-pool limits across existing hosts | ✅ (queued jobs via workflow_job webhooks; polling fallback; min/max runners) | Linux AMD64, ARM64; Windows AMD64 process agent builds, runtime unqualified; macOS controller for development | ✅ (ephemeral registration and cleanup reconciliation) | no (GitHub App; single-use JIT config for ephemeral runners) | yes (ephemeral containers by default; process runners do not reset the host) | rootless Docker/Podman supported; optional DinD uses a privileged sidecar | controller webhook optional with polling fallback; agents connect outbound | no (customisable runner images) | yes (web UI and CLI for pools) | controller + existing agent hosts; zero idle runners possible, host costs remain |\n| [Gondola](https://gondola.build/docs/architecture) | AWS EC2 jobs; ECS Fargate controller | ❌ | Org, Repo, Labels, RunnerGroups (org) | Terraform/OpenTofu fleet definitions | ✅ (assigned jobs; configured minimum and maximum runners) | Linux AMD64, ARM64 | ✅ (ephemeral registration) | No PAT; short-lived JIT runner configuration | One job per EC2 instance; instance and root-volume termination | AWS deployment permissions; Docker socket gives a job control of its host | No inbound GitHub webhook; outbound long polling | Lean/development image profiles; custom AMIs and runner containers | Fleet setup through Terraform/OpenTofu; workflows select approved labels | Controller tasks, coordination and network services; subscription for paid plans; zero idle EC2 runners possible |\n| [CRACI](https://craci.com/features/ci-cd) (managed service, not self-hosted) | managed Linux VMs, one isolated VM per job | ❌ | Org, Repo (via GitHub App, all or selected repositories) | managed by provider; runner size 1 to 32 vCPU per job | managed | Linux x86-64, ARM64 | ✅ (one VM per job) | no (GitHub App) | yes (VM discarded after the job) | n/a (fully managed) | no | yes (GitHub-compatible Ubuntu 24.04 image; Docker Engine, Buildx, Compose) | yes (dashboard + GitHub App) | monthly plan fee; build minutes billed per second |\n\n## Comparison categories\n\n#### Runtime - Container, Kubernetes, virtual machines\n\nSpecifies whether the self-hosted runners are running on a container, Kubernetes cluster or virtual machine. Virtual machine based runners typically have some cloud specific dependencies.\n\n#### GHES - GitHub Enterprise Server support\n\nWhile GitHub.com is supported by all self-hosted runner solutions evaluated, not all of them support GitHub Enterprise Server yet (although supporting GitHub Enterprise Server is often just a matter on changing the API endpoint).\n\n#### RegScope - Registration Scope\n\nSelf-hosted runners can be registered on the repo, org and enterprise level and may register with custom labels inside runner groups - but not all runner solutions provide support for all those options.\n\n#### Scaling - Ability to specify multiple runner instances\n\nSome self-hosted runner solutions have the ability to specify how many runners of a certain kind should be launched and whether crashed runners should be restarted.\n\n#### Scaling\n\nSome self-hosted runner solutions have the ability to scale automatically with the amount of pending jobs, busy runners, CPU utilization, ...\n\n#### Architecture - Operating systems supported\n\nWhile self-hosted action runners can support Linux (x86, ARM, ARM64), Mac and Windows - most self-hosted runner solutions are restricted to a subset of those architectures\n\n#### Dereg - Automatic Runner Deregistration\n\nNot all runner solutions remove themselves after they have been deleted, which can be problematic, especially, if combined aith auto-scaling capabilities.\n\n#### PATInRunner - Personal access or OAuth token needed in runner\n\nSome runner solutions provide a personal access token (PAT) or OAuth token directly to the runner so that it can register itself. This imposes the risk of a malicious job trying to steal the token and use it to elevate its permissions. Solutions that only pass a runner token to the actual runners are preferred from a security perspective.\n\n#### CleanUp - Automated clean up after a build\n\nWhile self-hosted runner provide some isolation between jobs, it is the responsibility of the job to clean up in most cases. Some self-runner solutions automatically de-register and clean-up runners after every build to avoid any interference between jobs.\n\n\n#### Privileged - Any special privileges needed to run or install the solution\n\nCalls out any special privileges (like Kubernetes cluster admin, Docker privileged mode) needed to run or install the solution.\n\n#### Exposed - Need for GitHub to reach parts of the runner solution via web hooks\n\nSome centralized runner solutions rely on the ability to receive web hook events from GitHub about new jobs. This approach might not be feasible for some installations, although a reverse proxy may help.\n\n#### AllInOne - Software installed in the self-hosted runners\n\nGitHub's own, hosted runners have a lot of software already pre-installed. Most container based solutions follow a different philosophy where only a minimum amount of software is pre-installed.\n\n#### Contributors - Number of contributors to the solution\n\nWhile the number of contributors is not the only criteria, it is typically a good indicator for the maturity of a solution.\n\n#### SelfService - Ability for end users to setup new runner scale sets\n\nSome runner solutions have add-ons that allow end users to stand up new runner groups in a self-service fashion, e.g. via IssueOps.\n\n#### IdleCosts - Costs that incur even if no jobs are running\n\nSome solutions require certain central components to be up and running all the time or at least one idle runner to allow scaling up properly - this category provides an idea of what is needed in terms of components, not concrete $$$ costs.\n\n## Matrix bonus\n\nIf you like to test the auto-scaling capabilities of your awesome runners with Matrix inspired action build runs, including LED matrices and Raspberry PIs, check out [this repo](https://github.com/jonico/raspberry-pi-actions).\n\n![image](https://user-images.githubusercontent.com/1872314/109425278-cbe32780-79e7-11eb-96b0-bd8be7b70896.png)\n\n![image](https://user-images.githubusercontent.com/1872314/109425509-d8b44b00-79e8-11eb-9494-c860ee4d00b1.png)\n\n![image](https://user-images.githubusercontent.com/1872314/109425714-f46c2100-79e9-11eb-892e-2eb123862356.png)\n\n![image](https://user-images.githubusercontent.com/1872314/109425741-22e9fc00-79ea-11eb-903d-1b7ad782ef52.png)\n\n![image](https://user-images.githubusercontent.com/1872314/109425763-3dbc7080-79ea-11eb-9c98-0cc59f1a22f8.png)\n","projects_url":"https://awesome.ecosyste.ms/api/v1/lists/jonico%2Fawesome-runners/projects"}