MCPcopy Index your code
hub / github.com/cloudbase/garm

github.com/cloudbase/garm @v0.2.1

Chat with this repo
repository ↗ · DeepWiki ↗ · release v0.2.1 ↗ · + Follow
9,214 symbols 24,532 edges 549 files 4,768 documented · 52%
What it actually does AI analysis from the code graph — generated when you open this
loading…
README
<img src="https://github.com/cloudbase/garm/raw/v0.2.1/doc/images/garm-light.svg#gh-light-mode-only" width="384px" alt="Light mode image" />
<img src="https://github.com/cloudbase/garm/raw/v0.2.1/doc/images/garm-dark.svg#gh-dark-mode-only" width="384px" alt="Dark mode image" />

GitHub Actions Runner Manager (GARM)

Go Tests slack

GARM is an open-source, self-hosted runner manager for GitHub Actions and Gitea Actions. It automatically creates, scales, and destroys ephemeral runner instances across multiple clouds and infrastructure providers from a single controller.

Highlights

  • Multi-cloud from a single controller -- manage runners across AWS, Azure, GCP, OpenStack, OCI, LXD, Incus, Kubernetes, and more, all from one GARM instance. Mix and match providers freely.
  • GitHub.com, GitHub Enterprise Server, and Gitea -- first-class support for all three forges.
  • Pools and Scale Sets -- webhook-driven pools with configurable balancing (round-robin or bin-packing), plus native GitHub Actions Runner Scale Sets.
  • Scale to zero -- create on-demand pools that only spin up runners when jobs are queued.
  • Pluggable provider architecture -- providers are standalone executables. Use the 10+ existing providers or write your own in any language.
  • Single binary, minimal dependencies -- no external database server, no message broker. GARM ships as one binary with an embedded SQLite database.
  • Built-in web UI -- manage runners, pools, credentials, and endpoints from the browser.
  • Kubernetes operator -- production-grade k8s integration via the GARM operator by @mercedes-benz.

Architecture

GARM supports two scaling modes:

Pools receive workflow_job webhooks from GitHub/Gitea, match jobs to pools by label, and create runners on demand. When multiple pools match, a configurable balancer (round-robin or pack) decides which pool handles the job.

Scale Sets use GitHub's native message queue. GitHub handles scheduling; GARM handles provisioning.

Architecture diagram (pools)

GARM architecture diagram GARM architecture diagram

[!IMPORTANT] The README and documentation in the main branch are relevant to the not yet released code that is present in main. Following the documentation from the main branch for a stable release of GARM, may lead to errors. To view the documentation for the latest stable release, please switch to the appropriate tag. For information about setting up v0.2.0-beta1, please refer to the v0.2.0-beta1 tag.

[!CAUTION] The main branch holds the latest code and is not guaranteed to be stable. If you are looking for a stable release, please check the releases page. If you plan to use the main branch, please do so on a new instance. Do not upgrade from a stable release to main.

Getting started

Pick the quickstart that matches your setup:

For Kubernetes deployments, see the GARM operator. To build from source, see Building from Source.

Documentation

Full documentation lives in the doc/ directory:

Section Guides
Setup Credentials · Configuration · Webhooks
Usage Managing Entities · Pools and Scaling · Scale Sets
Advanced Templates · Providers · Gitea · Agent and Object Store
Operations Monitoring · Performance · FAQ

If you find the documentation lacking, please open an issue. Feedback from new users is especially valuable.

Supported providers

GARM uses external providers to create runners in a particular IaaS. Providers are standalone executables that GARM calls to manage runner instances.

Provider Repository
Akamai/Linode flatcar/garm-provider-linode (experimental)
Amazon EC2 cloudbase/garm-provider-aws
Azure cloudbase/garm-provider-azure
CloudStack nexthop-ai/garm-provider-cloudstack
GCP cloudbase/garm-provider-gcp
Incus cloudbase/garm-provider-incus
Kubernetes mercedes-benz/garm-provider-k8s
LXD cloudbase/garm-provider-lxd
OpenStack cloudbase/garm-provider-openstack
Oracle OCI cloudbase/garm-provider-oci

Follow the instructions in each provider's README to install them.

Write your own provider

Providers are external executables that GARM calls to manage runner lifecycle in a given IaaS. They can be written in any language. See Writing an external provider for details.

Community

Whether you're running into issues or just want to drop by and say "hi", feel free to join us on Slack.

Extension points exported contracts — how you extend this code

Middleware (Interface)
Middleware defines an authentication middleware [6 implementers]
auth/interfaces.go
EntityGetter (Interface)
EntityGetter is implemented by all github entities (repositories, organizations and enterprises). It defines the GetEnti [12 …
params/interfaces.go
MessageUnmarshaler (Interface)
MessageUnmarshaler defines types that can unmarshal from AgentMessage data [8 implementers]
workers/websocket/agent/messaging/messaging.go
Provider (Interface)
go:generate go run github.com/vektra/mockery/v2@latest [4 implementers]
runner/common/provider.go
IDGetter (Interface)
(no doc) [9 implementers]
database/watcher/filters.go
GithubEndpointStore (Interface)
(no doc) [6 implementers]
database/common/store.go
IDDBEntity (Interface)
(no doc) [9 implementers]
internal/testing/testing.go
ForgeEntity (Interface)
ForgeEntity represents an entity (Repository, Organization, Enterprise) that can have forge credentials [3 implementers]
database/sql/models.go

Core symbols most depended-on inside this repo

Get
called by 804
runner/pool/cache.go
Error
called by 505
client/login/login_responses.go
Marshal
called by 396
workers/websocket/agent/messaging/messaging.go
Handle
called by 246
util/logging.go
Unlock
called by 222
locking/interface.go
Return
called by 215
database/common/mocks/Store.go
Lock
called by 211
locking/interface.go
handleError
called by 204
apiserver/controllers/controllers.go

Shape

Method 6,605
Function 1,457
Struct 881
Interface 163
Class 48
TypeAlias 38
FuncType 22

Languages

Go93%
TypeScript7%

Modules by API surface

database/common/mocks/Store.go652 symbols
webapp/src/lib/api/generated/api.ts383 symbols
database/common/store.go128 symbols
params/params.go113 symbols
webapp/src/lib/api/generated-client.ts96 symbols
runner/common/mocks/GithubClient.go94 symbols
runner/common/mocks/GithubEntityOperations.go88 symbols
runner/common/mocks/PoolManager.go82 symbols
runner/mocks/PoolManagerController.go76 symbols
runner/metadata_test.go68 symbols
cache/cache_test.go65 symbols
runner/pool/pool.go58 symbols

For agents

$ claude mcp add garm \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact