Disposable, hardened containers for self-hosted GitHub Actions runners.
Self-hosted GitHub Actions runners give you control over hardware, cost, and access to private networks. They also inherit a security model that hosted runners avoid by accident. A self-hosted runner on bare metal is a shared, persistent environment, and a malicious dependency or compromised Action can read SSH keys, exfiltrate cloud credentials, plant background processes, and reach internal services that were never meant to be exposed to CI.
RunSecure is the layer between needing a self-hosted runner and trusting the runner. Every job runs in a fresh, hardened container that is built from a minimal base, dropped to a non-root user, stripped of capabilities and setuid bits, locked to a custom seccomp profile, and routed through an egress allowlist that you explicitly approve. When the job ends, the container ends. Nothing persists, nothing carries forward. For teams that want it always on, a Compose-based orchestrator watches GitHub for queued jobs and spins up these hardened runners on demand.
The egress allowlist is the load-bearing piece. The reason the tj-actions/changed-files compromise of March 2025 had the impact it did is that the attacker could reach arbitrary domains from inside the runner. RunSecure assumes that compromise will happen and ensures that, when it does, the blast radius stops at the network boundary you control. Even a malicious package executing inside the container cannot talk to anything you have not already approved.
It is also deliberately honest about what it does not do. It will not stop exfiltration over a domain you have allowed, vet third-party Actions for you, or keep a workflow from echoing its own secrets into a log. The promise is narrower and more defensible: make the blast radius of a compromised job something you defined in advance. The project is open source under Apache 2.0, because a security floor like this should not be a competitive advantage.