GitHub - preloopdev/preloop: agent-native, drop-in Github Actions that run locally or self-hosted in microvms, with debug/pause-on-failure and step-level retries

GitHub

3 min read Original article ↗

preloop

5× faster drop-in GitHub Actions, rebuilt for agents.

Status: beta Docs Latest release npm version

Watch the preloop demo: a failed step, a fix in another pane, and a re-run, all local, no push required

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 --runner

Container 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):

preloop-runner vs actions/runner

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