ForgeMT is a multi-tenant platform for self-hosted GitHub Actions runners on AWS. It gives platform teams an IaC-driven way to operate ephemeral EC2 runners and ARC/Kubernetes runner scale sets for many tenant repositories.
See the codeForgeMT is a multi-tenant platform for self-hosted GitHub Actions runners on AWS. It gives platform teams an IaC-driven way to operate ephemeral EC2 runners and ARC/Kubernetes runner scale sets for many tenant repositories.
Think of ForgeMT as the runner control plane and operating model, not only a
Terraform module. The platform team owns GitHub App integration, runner images,
AWS placement, tenant configuration, lifecycle cleanup, and optional
observability. Tenant teams consume approved runs-on labels and AWS role
access from their workflow YAML.

Use ForgeMT when you need:
Do not start by deploying every module. The smallest useful install is one GitHub.com organization, one tenant, one runner lane, and one smoke workflow. Add helpers, EKS, Splunk, Teleport, OpenCost, OpenTelemetry, and webhook relay modules only when your operating model needs them.
Have these answers before applying the examples:
| Decision | Minimum answer |
|---|---|
| GitHub target | GitHub.com or GHES URL, organization, runner group, and GitHub App installation scope. |
| AWS placement | Account, region, VPC, subnets, security groups, and tenant AWS role access. |
| State backend | S3 bucket and DynamoDB lock table for Terraform or OpenTofu state. |
| First lane | EC2, ARC on EKS, or both. Start with one lane and add the other after the first smoke workflow. |
| Runner image | AMI owner/name for EC2 runners or reachable container images for ARC runners. |
| Tenant boundary | Tenant name, generated labels, allowed repositories, IAM roles, and metadata ownership. |
| Integrations | Which systems are mandatory now and which can be skipped until the runner path works. |
Pick EC2 first when you already have a runner AMI or need VM-level isolation. Pick ARC first when EKS is already available and the first workloads fit a Kubernetes runner model. You can skip EKS for an EC2-only first deployment.
ForgeMT modules are grouped by operating responsibility:
| Category | Path | Purpose |
|---|---|---|
| Platform | modules/platform | Forge runtime modules for EC2 and ARC tenant runners. |
| Infrastructure | modules/infra | EKS foundation for ARC/Kubernetes runner scale sets. |
| Helpers | modules/helpers | Account preparation and operations helpers such as AMI, ECR, S3. |
| Integrations | modules/integrations | Optional external systems such as Splunk, Teleport, and relays. |
| Examples | examples/deployments/... | Functional Terragrunt roots grouped like the module layout. |
Splunk is optional. If your company does not use Splunk, skip the Splunk
example folders, all modules/integrations/splunk_* modules, and
modules/integrations/splunk_dependency_monitor.
Start with the platform path:
examples/deployments/platform into your operations IaC repo.terragrunt init, terragrunt plan, and terragrunt apply.The first install path is the platform example:
examples/deployments/platform
After replacing the values and storing the real GitHub App PEM in SSM, run from the tenant folder:
cd examples/deployments/platform/terragrunt/environments/prod/regions/eu-west-1/vpcs/main/tenants/acme
terragrunt init
terragrunt plan
terragrunt apply
For the full sequence, including backend bootstrap and GitHub App registration, use Bootstrap and Minimal Install.
Read next:
After the platform team onboards a tenant, repository owners request the runner with labels generated by ForgeMT:
---
name: Forge smoke
on:
workflow_dispatch:
jobs:
smoke:
runs-on:
- self-hosted
- type:small
- x64
- ec2
- tnt:acme
steps:
- run: echo "Forge runner is online"
Tenant teams should use Tenant Usage for label, AWS role, ECR, and troubleshooting patterns.
Technical background:
Implementation foundations:
Contributions are welcome via issues or pull requests. See CONTRIBUTING.md for details.
Apache 2.0. See LICENSE.
Track progress or open issues on GitHub: https://github.com/cisco-open/forge/issues
478 commits
106 commits
52 commits
6 commits
HCL
73.5%
Python
22.8%
Shell
3.1%
ForgeMT is a multi-tenant platform for self-hosted GitHub Actions runners on AWS. It gives platform teams an IaC-driven way to operate ephemeral EC2 runners and ARC/Kubernetes runner scale sets for many tenant repositories.
See the codeForgeMT is a multi-tenant platform for self-hosted GitHub Actions runners on AWS. It gives platform teams an IaC-driven way to operate ephemeral EC2 runners and ARC/Kubernetes runner scale sets for many tenant repositories.
Think of ForgeMT as the runner control plane and operating model, not only a
Terraform module. The platform team owns GitHub App integration, runner images,
AWS placement, tenant configuration, lifecycle cleanup, and optional
observability. Tenant teams consume approved runs-on labels and AWS role
access from their workflow YAML.

Use ForgeMT when you need:
Do not start by deploying every module. The smallest useful install is one GitHub.com organization, one tenant, one runner lane, and one smoke workflow. Add helpers, EKS, Splunk, Teleport, OpenCost, OpenTelemetry, and webhook relay modules only when your operating model needs them.
Have these answers before applying the examples:
| Decision | Minimum answer |
|---|---|
| GitHub target | GitHub.com or GHES URL, organization, runner group, and GitHub App installation scope. |
| AWS placement | Account, region, VPC, subnets, security groups, and tenant AWS role access. |
| State backend | S3 bucket and DynamoDB lock table for Terraform or OpenTofu state. |
| First lane | EC2, ARC on EKS, or both. Start with one lane and add the other after the first smoke workflow. |
| Runner image | AMI owner/name for EC2 runners or reachable container images for ARC runners. |
| Tenant boundary | Tenant name, generated labels, allowed repositories, IAM roles, and metadata ownership. |
| Integrations | Which systems are mandatory now and which can be skipped until the runner path works. |
Pick EC2 first when you already have a runner AMI or need VM-level isolation. Pick ARC first when EKS is already available and the first workloads fit a Kubernetes runner model. You can skip EKS for an EC2-only first deployment.
ForgeMT modules are grouped by operating responsibility:
| Category | Path | Purpose |
|---|---|---|
| Platform | modules/platform | Forge runtime modules for EC2 and ARC tenant runners. |
| Infrastructure | modules/infra | EKS foundation for ARC/Kubernetes runner scale sets. |
| Helpers | modules/helpers | Account preparation and operations helpers such as AMI, ECR, S3. |
| Integrations | modules/integrations | Optional external systems such as Splunk, Teleport, and relays. |
| Examples | examples/deployments/... | Functional Terragrunt roots grouped like the module layout. |
Splunk is optional. If your company does not use Splunk, skip the Splunk
example folders, all modules/integrations/splunk_* modules, and
modules/integrations/splunk_dependency_monitor.
Start with the platform path:
examples/deployments/platform into your operations IaC repo.terragrunt init, terragrunt plan, and terragrunt apply.The first install path is the platform example:
examples/deployments/platform
After replacing the values and storing the real GitHub App PEM in SSM, run from the tenant folder:
cd examples/deployments/platform/terragrunt/environments/prod/regions/eu-west-1/vpcs/main/tenants/acme
terragrunt init
terragrunt plan
terragrunt apply
For the full sequence, including backend bootstrap and GitHub App registration, use Bootstrap and Minimal Install.
Read next:
After the platform team onboards a tenant, repository owners request the runner with labels generated by ForgeMT:
---
name: Forge smoke
on:
workflow_dispatch:
jobs:
smoke:
runs-on:
- self-hosted
- type:small
- x64
- ec2
- tnt:acme
steps:
- run: echo "Forge runner is online"
Tenant teams should use Tenant Usage for label, AWS role, ECR, and troubleshooting patterns.
Technical background:
Implementation foundations:
Contributions are welcome via issues or pull requests. See CONTRIBUTING.md for details.
Apache 2.0. See LICENSE.
Track progress or open issues on GitHub: https://github.com/cisco-open/forge/issues
478 commits
106 commits
52 commits
6 commits
HCL
73.5%
Python
22.8%
Shell
3.1%