EraInfra
EraInfra runs GitHub Actions jobs on Linux, Mac and Windows machines you already own. Each job gets a fresh, isolated environment that is destroyed afterwards. Machines connect out to the control plane, so none of them needs a public IP.
Who it is for
Teams and individuals with spare hardware, such as a home server, a Mac mini or office machines, who want to run CI on it without giving every job a long-lived host. Workflows change one line: runs-on: rc-linux-js.
How it compares
- GitHub-hosted runners need nothing to operate. EraInfra can send a run to them when no machine of yours is free.
- A plain self-hosted runner reuses the same host between jobs. EraInfra prepares an environment for one job and removes it on every exit path, including Worker crashes.
- Actions Runner Controller is the better choice when your whole fleet already runs Kubernetes. EraInfra targets machines without a cluster, including ones behind NAT or a home router.
What works today
| Platform | Executor | Isolation |
|---|---|---|
| Linux x64 and ARM64 | Firecracker | Own guest kernel per job. Use this for untrusted code. Needs KVM. |
| Linux x64 and ARM64 | Docker | Shares the host kernel. Only for jobs that trust each other. |
| Apple Silicon macOS | Tart | Copy-on-write VM per job, two at a time by default. |
| Windows x64 | Hyper-V | Ready once the machine proves Hyper-V works. |
The project's own fleet has run its Linux jobs in Firecracker microVMs since 20 August 2026.
Limits
- The control plane, scheduler and dashboard run on Convex, so you need a Convex deployment.
- Firecracker Workers need KVM and dedicated runtime storage.
- macOS Workers run at most two VMs by default, to stay within Apple's virtualization license.
Get started
- Deploy the Convex backend and dashboard from the repository.
- In the dashboard, open Machines, choose Add machine, and run the generated install command on each host.
- Point a workflow at a Profile with
runs-on.