Migrate from Self-Hosted to Managed Runners (Drop the Ops)
You already run self-hosted to save money or get bigger machines. Managed runners give you both without the ops burden - usually a one-line runs-on: change.
Self-hosted runners mean you own scaling, patching, security, and cleanup. Managed runners take that over while keeping your workflows identical. You move by repointing the runs-on: label, one workflow at a time.
What changes
| Self-hosted | Managed (Latchkey) |
|---|---|
runs-on: [self-hosted, linux] | runs-on: latchkey-medium |
| You patch the host and runner agent | Patched and rebuilt for you |
| You build the autoscaler | Warm pools + autoscale built in |
| You clean up stuck/orphaned runners | Ephemeral and self-healing |
Before and after
Before: .github/workflows/ci.yml
jobs:
build:
runs-on: [self-hosted, linux, x64] # was: your own fleet
steps:
- uses: actions/checkout@v4
- run: make build testThe managed equivalent
After: .github/workflows/ci.yml
jobs:
build:
runs-on: latchkey-medium # managed, ephemeral, self-healing
steps:
- uses: actions/checkout@v4
- run: make build testMigration steps
- Pick one workflow currently on self-hosted runners.
- Connect the managed-runner provider to your org or repo.
- Swap
runs-on: [self-hosted, ...]for the managed label. - Run in parallel, confirm timing and results match, then expand.
- Decommission idle self-hosted hosts once everything is moved.
Gotchas
- If steps assumed persisted workspace or host state, fix that - managed runners are ephemeral (this is usually a latent bug self-hosting masked).
- Recreate any host-installed tools as setup steps or use a custom runner image.
- Map self-hosted labels carefully so jobs land on the right managed size.
What you gain
- Roughly 69% lower per-minute cost than GitHub-hosted runners.
- Warm pools remove queue time - jobs start almost immediately.
- Self-healing detects, fixes, and auto-retries transient and mechanical failures.
- Zero ops: no agents, autoscalers, or controllers to patch and babysit.
Key takeaways
- Migration is a
runs-on:label swap, not a rewrite. - You drop autoscaling, patching, and orphan cleanup.
- Ephemeral + self-healing runners replace fragile long-lived hosts.
Related guides
Migrate to Latchkey in 10 MinutesMove your GitHub Actions to Latchkey managed runners in about 10 minutes: connect the app, swap a label, and…
GitHub Actions Cost Calculator - Estimate & Cut Your CI BillFree GitHub Actions cost calculator: enter your monthly CI minutes and runner size to see your current bill a…
GitHub-Hosted vs Self-Hosted vs Managed Runners (2026)GitHub-hosted vs self-hosted vs managed GitHub Actions runners compared on cost, speed, maintenance, and reli…