Pour a foundation on the machines you already own. One daemon gives you containers, ingress, databases, secrets, public tunnels, one-shot jobs, and systems that span your laptop, the mac mini in the closet, and a $5 VPS. No cloud account. No YAML.
curl -fsSL https://runslab.run/install | bash
needs docker · node ≥ 20 · git · the installer checks and tells you the exact fix
this is the dashboard's actual language: every app a rack unit, flip one open for its board · skinnable (this page too: try the switcher ↑)
see the real thing move: the demo lives in the README · rack breathing, a board flipped open, the two-node fleet
$ slab deploy owner/repo deployed repo -> http://repo.localhost:8080
$ slab run . -- npm test scheduling on garage (0 active jobs) test-a1b2 succeeded in 41s
$ slab up ./system.toml game -> http://game.localhost:8080 scoreboard -> @ garage (via trunk)
apps and jobs are the vertices; wires are the edges. a system is a graph. a node is a daemon, and it carries a set of systems. that's the whole surface. nothing to memorize, nothing to hold wrong, for you or for an agent.
No wires. Members rest directly on the ingress: maximum clear ceiling height.
no beamsLoad travels one direction. Pipelines, feeders, ingest chains.
directedBending in all directions: members that call each other.
mutualSpans machines. The trunks are the utilities concealed in the voids.
multi-nodethe dashboard stamps every system's nameplate with its type, computed
from the wire graph, not declared. examples/ ships one of each.
the types are computed from the edges: no wires is flat, acyclic is
one-way, cyclic is two-way, and a system carried by more than one node is a waffle.
jobs arrive and leave, so the graph breathes. what the daemon can compute, it can
guarantee: the type stamp is a computation, a patched wire redeploys exactly its
caller, and an agent traverses the topology instead of guessing at it.
app.localhost:8080 host-header routing, wake-on-requestpostgres = true → DATABASE_URL appears, one db per appslab expose → public https, no account, no domain--node garage targeting, --node any scheduling--target aws: services → App Runner, functions → Lambda; your account, no stored keysslab upgrade — pull, rebuild, restart; state survivesAgents create infrastructure faster than humans can track it. The platform must make running things legible, bounded, reversible.
slab ships an MCP server: an agent takes a repo to a running, routable app, or drops a sandbox job inside a system's private network to probe real members over real wiring, without ever learning Docker. Timeouts reap what nobody remembers.
› slab_run { systems: ["arcade"], image: "alpine:3", command: ["wget","-qO-","http://scoreboard:4000/health"] } { state: "succeeded", exitCode: 0, logs: "ok" } › scoreboard is healthy; patching the ssl bug, redeploying… › slab_deploy { name: "scoreboard" } { state: "running", version: 8 } › system arcade repaired; probe rerun, all members answering