Architecture
Neutron ships as a single container image. When it runs you get one web server, one helper service beside it, and one database. That is the whole moving-parts list.
The four pieces
| Piece | What it does |
|---|---|
| API | The web server. Serves the chat UI, holds accounts and roles, records every approval and every cost, and enforces the rules. TypeScript, run by Bun. |
| Engine seam | A thin adapter so neutron does not care which AI runs the conversation. Three are supported. Swapping one for another is configuration, not a rewrite. |
| Connectors | The abilities switched on per instance: encrypted vault, web search, knowledge-base search, schedules, agent self-config, agent administration, and driving peer nodes. |
| assay-engine | A small binary running beside the API. Holds encrypted secrets and runs durable timers and workflows — jobs that survive the pod being killed and restarted. |
Persistence is Postgres, reached through typed queries with ordered migrations. That is a deliberate exception to the house default, chosen because the schema is expected to keep growing.
One program, many customers
This is the structural decision that shapes everything else. There is exactly one codebase and one built image. A customer is not a fork or a branch — a customer is a configuration file and a database.
Interchangeable engines
The conversation loop is provided by an engine, and there are three. The codebase is written so that no engine-specific type escapes the adapter folder, which is the enforceable version of “we could switch”.