
Egress runs your GitHub Actions on the Macs, PCs and Linux boxes you already own. Every job gets a machine of its own and a kernel that won't let it touch anything else on your network.
Six destinations. Five of them are on your network. One of them isn't.
"You want to run other people's code on our network?" It's a fair question and most setups don't have an answer. A runner installed on a host OS can see everything that host can see, and a poisoned postinstall script is one npm ci away from finding out what that is.
Tick off what's actually on your network. The graph draws what a compromised build step can reach.
Note: default-deny with a named exception list, not a sealed box. GitHub and the package registries you build against stay reachable, because otherwise nothing builds. The filter contains what a bad dependency does; it doesn't judge what the dependency is.
The self-hosted runner that broke your Friday probably didn't get hacked. It accumulated. A stale node_modules, a drifted toolchain, a wedged Docker daemon, a job that half-finished and left the box in a state nobody could name.
Egress registers every runner with --ephemeral. One job, then the guest is destroyed and a clean one takes its place. There's no state to drift because there's no state.
Write a file in job one. Run job two. Go looking for it.
It's idle from the moment you close the lid until you sit back down, and all weekend. So is the office iMac, and so is the gaming PC every hour nobody's gaming on it. That's the fleet you already bought.
Drag hours onto a ring and the board re-flaps. Jobs that had nowhere to go get a node.
Drag around a ring to paint or clear a shift.
There's a security argument here too, and it's the one people miss. A machine that's off shift isn't holding a token, isn't polling for work and isn't accepting jobs. It isn't running, so there's nothing on it to compromise at 3am. Availability is an isolation axis, same as the network and the filesystem.
Note: the roster is the one thing on this page that isn't built yet. Everything else here ships today. This is what's next, and it's the reason the section is this big.
Linux takes as many runners as the box has cores for. Windows the same. The macOS arm accepts two and then refuses, because Apple's licence says two virtual macOS instances per physical host and nobody gets to sell you around it.
Egress enforces it in software, so your build farm is legal by construction rather than by everyone remembering.
Foot: two macOS guests per Mac. Uncapped Linux and Windows guests on the same Mac, and on every other box you own. If you need more macOS lanes the answer is another Mac, and it's better to learn that here than after you've paid.
Machines find each other on the local network over mDNS. You read a six-digit code off one screen and type it into the other. They agree a key with X25519, store each other's Ed25519 identity in the OS keychain, and from then on either one can watch the other's queue, cancel a job on it, or hand it work.
Nothing goes through a server of ours, because there isn't one.
Note: the code is out of band on purpose, which also means anyone who can read your screen at that moment can pair with you. Thirty seconds of physical trust, and then it's cryptographic.
egress audit --simulate-adversary boots a throwaway guest and runs the attacks a compromised build step would run. LAN sweep, IMDS token theft, DNS tunnelling out over port 53, ARP spoofing. Then it prints the matrix and exits non-zero if a single probe reached anything.
You get the whole matrix, amber rows included.
Every build can emit a signed in-toto SLSA v1.0 attestation: digests of the source, the workflow and the outputs, signed with the node's Ed25519 identity, with the packet filter's drop counter inside the signed predicate.
It's the difference between telling a client your CI is isolated and handing them something they can verify offline with egress verify-attestation.
Your count from Exhibit 00, in the signed predicate. Fire more packets at the range and press again.
A licence counts computers, not seats, and it counts both kinds. Put the phone on it.
Apple Silicon. MicroVM guests through Virtualization.framework, two macOS lanes, uncapped Linux lanes beside them.
WSL2 and Hyper-V. Containers in an isolated Linux kernel, nftables quarantine, as many lanes as the box will carry.
Containers, nftables quarantine, headless. The box in the cupboard that was already on anyway.
Queue depth, live telemetry, and a stop button. Cancel a job from the pub.
The full dashboard: every node, every runner, every drop event, on the sofa.
Any node can be set to monitor only. Zero local runners, full sight of the mesh.
One-time licence. No subscription, no per-minute billing, and no seat count that grows when your team does.
The filter stops a malicious postinstall from reaching your NAS. It won't tell you the package was malicious, and an allowlisted registry will still serve you whatever it's serving.
No amount of software gets around §2.B.iii. More macOS lanes means another Mac.
Six digits, out of band, for about thirty seconds. That's the design, and it's worth knowing about.
Your electricity, your SSD wear, your box that needs a reboot. Cheaper than hosted minutes isn't the same as free.
It's next, and it's on this page because it's worth telling you about, not because you can use it today.