An image, a database, an auth token, and a config file. No control plane, no account, no build step.
Any Postgres 16+. Point neutron at it with DATABASE_URL; migrations run on boot.
A Claude Agent SDK OAuth token (or API key) in CLAUDE_CODE_OAUTH_TOKEN. That is the model access.
instance.yamlName, brand, admins, and whatever seams you want on — theme, capabilities, channels, tools, workspace, safety.
The container serves the API and the built UI on one port. Front it with your own TLS / ingress.
The shortest path — Docker or Podman.
# minimal instance.yaml name: acme theme: { brand: "Acme Agent" } admins: ["you@acme.example"] safety: { read_only: true } # run it docker run -p 8080:8080 \ -e DATABASE_URL=postgres://… \ -e CLAUDE_CODE_OAUTH_TOKEN=sk-ant-oat01-… \ -v ./instance.yaml:/config/instance.yaml:ro \ -e NEUTRON_INSTANCE=/config/instance.yaml \ registry.example/neutron:latest
Deploy the image as a stateless Deployment behind your ingress; keep the config in a ConfigMap and the two secrets in your secret store. A Helm chart renders one instance per entry in an instances: map — the same image, many agents.
instances: acme: host: agent.acme.example config: name: acme theme: { brand: "Acme Agent" } capabilities: [ # landing cards … ] channels: { gitlab: { enabled: true } } safety: { read_only: false, approval_required: [Bash] }
A first-run wizard is on the roadmap — a fresh install with an empty database will walk you through the basics in the browser (name, model auth, admins, theme) and hand off to Settings for the advanced seams. Until then, the config above is the whole story.