5× faster drop-in GitHub Actions, rebuilt for agents.
preloop is a local, self-hosted equivalent of GitHub Actions. The engine (preloop serve) accepts workflows the same way GitHub does — ${{ }} expressions, matrices, reusable workflows, concurrency groups, OIDC — and runs them in hardware-isolated microVMs. Your .github/workflows run unmodified, including against uncommitted changes.
It speaks the official actions/runner protocol, so the official runner can register against it. Or use our Rust runner, which installs 36× smaller and peaks at 19× lower memory (see benchmarks below).
Install
Pick one:
Homebrew
brew install preloopdev/tap/preloop
npm
npm install -g @preloop-dev/cli
mise
mise use -g github:preloopdev/preloop
Installer script
ver=v0.35.6 # https://github.com/preloopdev/preloop/releases curl -fsSL "https://raw.githubusercontent.com/preloopdev/preloop/$ver/install.sh" -o install.sh less install.sh sh install.sh
Setup, credentials, golden images, preloop init, and first run are in the docs:
Just the runner
preloop-runner is a drop-in Rust replacement for actions/runner. It registers against GitHub or a preloop server the same way.
ver=v0.35.6
curl -fsSL "https://raw.githubusercontent.com/preloopdev/preloop/$ver/install.sh" -o install.sh
less install.sh
sh install.sh --runnerContainer image and full register/run steps: runner install.
What makes it different
- Real runner protocol, not a behavior approximation — the official runner works against it unchanged.
- Hardware-isolated microVMs for control-plane jobs.
- GitHub App and fine-grained PAT support with per-job token minting so checks stay updated.
- Heavily tested: property tests, differential tests, formal verification, and conformance gates.
- NDJSON event output for agents and developer tooling.
Detailed comparison: docs.preloop.dev/comparison.
Benchmarks
Same server, same job, measured on the same machine (M1 Pro, macOS, median of 3):
| Metric | actions/runner 2.336.0 | preloop-runner | |
|---|---|---|---|
| Install footprint | 434 MB · 9,301 files | 11.9 MB · 4 files | 36× |
| Runner code only | 85 MB | 11.9 MB | 7× |
| Cold start | 97 ms | 29 ms | 3.3× |
| Time to listening | 456 ms | 32 ms | 14× |
| Idle RSS | 67 MB | 9 MB | 7.5× |
| Warm pool ×10 idle | 672 MB | 90 MB | 7.5× |
| Job pickup | 268 ms | 100 ms | 2.7× |
| Peak RSS during a job | 206 MB | 11 MB | 19× |
Reproduce: scripts/bench-runner-compare.sh. Chart: benchmarks/runner-compare.html.
Documentation
| Topic | Doc |
|---|---|
| Docs home | docs.preloop.dev |
| Install / quickstart | install · quickstart |
| Configuration | configuration |
| CLI reference | CLI |
| Deploy / self-host | deploy |
| VM images | vm-images |
| GitHub App / tokens | app · tokens |
| Debugging / agents | debugging · agents |
| Runner | overview · install |
| Compatibility / comparison | compatibility · comparison |
| Architecture | overview |
| Contributing | CONTRIBUTING.md |
License
Two licenses, one project:
- Everything except the control plane is MIT — the CLI, the Rust runner, the parser/expression/protocol crates, the VM orchestrator, and the docs.
- The control plane (
preloop serve/preloop-runner-server) is FSL-1.1-MIT — source-available. You may use, modify, and redistribute it for any non-competing purpose; it converts to MIT on the second anniversary of each release. "Non-competing" means you can't offer it as a hosted CI service that competes with preloop's own offering.
Full terms: crates/preloop-runner-server/LICENSE (FSL-1.1-MIT) and MIT for the rest.
Credits
- smolvm — the microVM runtime every job executes in
- runner.server — the protocol reverse-engineering this project builds on


