4 steps

Install

From nothing to a refused
command, in four minutes

This page is the minimum. It installs nanoinfra, answers the wizard, adds one server, and asks for something the gate refuses. You will have seen the boundary work before you trust it with anything.

uv tool install nanoinfra
nanoinfra onboard --wizard

python 3.11 or newer · nothing else

01 · install

One command. Nothing runs, and nothing reaches a host.

02 · answer the wizard

A provider, a key, a model, a channel. One config file.

03 · add a server

A host, a method, and a credential you paste once.

04 · meet the gate

The same command allowed, then refused, with the grant named.

▸ zsh — first run a laptop, nothing installed recorded
$  
resolved 214 packages · installed nanoinfra 1.0.1
Python 3.11 or newer is the only requirement
note nothing runs yet, and nothing reaches a host

$ nanoinfra onboard --wizard
? Provider setup › anthropic
? anthropic API key › ●●●●●●●● (not echoed, not logged)
? Model › claude-sonnet-4-5
? Channel › WebSocket channel
wrote ~/.nanoinfra/config.json · read it, it is one file
$ nanoinfra gateway
gateway on 127.0.0.1:8765 · localhost only, token required
gates: unattended mutate.remote host=deny group=deny all=deny

webui ▸ Infrastructure → Servers → Add
? name › web-01 · method › ssh · host › 10.0.0.11
? credential › paste the key once. It is encrypted at rest and the agent never reads it back
saved · the executor resolves this credential, once, per action

you ▸ report the uptime of @server:web-01
gate ▸ allow · interactive · you are here, so it runs
host ▸ up 19 days, load average: 0.14 0.09 0.08
you ▸ do that every night at 02:00
gate ▸ REFUSED · unattended · no standing grant

And it tells you what to write, before 02:00 arrives

gates.standingGrants:
  - contexts: ["unattended"]
    hosts: ["web-01"]
    commands: ["uptime"]

A recording of a first run, replayed. The wizard's questions come from your config, so yours may name a different provider.


What you have
after those four steps

One package, one config file, one server, and a boundary you have watched refuse something. No account, no broker, no telemetry.

What to read next

The gate reference states every default. The deployment page states what makes the split kernel-enforced, which a single account does not.

Before production

Create the four accounts, or run the container that creates them. With one account the four processes share a uid, and nanoinfra says so at startup.

If something refuses and you disagree

The refusal names the grant that would permit it. Write the grant, or change the policy. Both live in config, and both are reviewable.

Quick start → Gates → Deployment →

Four minutes, and
one refusal

The refusal is the part worth waiting for. Everything before it is setup, and setup is not evidence.

See the full session →