---
title: "Architecture builder"
slug: /architecture/builder
question: Which backend should each engine service run on, and what does my architecture look like then?

---

# Architecture builder

Pick a secondary adapter for each engine service and see the architecture it gives you: a diagram, the `services:` block for `config.yaml`, an SVG to download and a link to share. Every adapter offered is one the ABI commit pinned in `.abi` ships, read from the generated adapter catalog, plus `nats_rpc` (the service becomes a client of the serving engine) and `custom` (your own class). [Services and adapters](/architecture/services-and-adapters) explains each one.

1. **Start from a preset.** Each is an `abi new project` template: abi dev (`config.yaml`), Docker Compose (`config.local.yaml`) or Remote (`config.remote.yaml`). Choosing one sets every service to what that template runs, and the engine default where it leaves a service out. NATS mode is on, as `abi new project` creates projects; turn it off for a project made with `--without-nats`.
2. **Change any service.** The secret service takes a list, read in order. The cache takes one entry per tier. In NATS mode the bus is fixed: the engine runs it on JetStream.
3. **Or start from a backend.** Highlight a technology, such as PostgreSQL, Redis, S3-compatible storage or SQLite, to see which services can run on it, then switch all of them at once.

The Architecture builder is interactive: open [/architecture/builder](/architecture/builder) in a browser. It starts from a preset, one of the three `abi new project` templates, and lets you pick an adapter for each of the 14 engine services: a shipped one, `nats_rpc` (a client of the serving engine) or `custom` (your own class). It draws the architecture, writes the matching `services:` block, downloads the diagram as SVG, and keeps the selection in the link.

Presets, and the backends each template names:

- [abi dev](/architecture/builder?preset=dev) (`config.yaml`): Oxigraph (triple store), SQLite + sqlite-vec (vector store), SQLite (document), DuckLake (dataset), Filesystem (object storage), Python (key-value), dotenv (secret).
- [Docker Compose](/architecture/builder?preset=local) (`config.local.yaml`): Apache Jena (triple store), Qdrant (vector store), PostgreSQL (document), DuckLake (dataset), S3 (object storage), Redis (key-value), dotenv (secret), Filesystem (email).
- [Remote](/architecture/builder?preset=remote) (`config.remote.yaml`): Apache Jena (triple store), Qdrant (vector store), PostgreSQL (document), S3 (object storage), Redis (key-value), dotenv (secret: its block gives `config` as a one-item list, which the engine rejects, so the builder writes the mapping).

A service the template leaves out runs the engine's default. In NATS mode, the `abi new project` default, no template names the bus: the engine runs it on JetStream at the `nats:` block's `nats_url`.

Every adapter, its backend and its settings: [Services and adapters](/architecture/services-and-adapters).

## Use the output

- **The `services:` block** replaces the `services:` block of your `config.yaml` (or `config.<ENV>.yaml`). Keep the rest of the file: in NATS mode, the `nats:` block is what makes the engine run the bus on JetStream, which is why the block has no `bus:` entry. Settings come from the preset (its template, or the engine default it falls back to) when it runs that adapter, and from the catalog's example otherwise. Lines marked as the engine default are blocks the template leaves out. Check hosts, paths and bucket names before you deploy.
- **Secrets stay references.** The secret adapters resolve every `{{ secret.NAME }}` when the engine loads `config.yaml`. Put the values in a secret adapter (the `dotenv` adapter reads `.env` unless its `path` says otherwise), never in `config.yaml`.
- **The engine checks the file.** It validates every adapter block against its configuration model when it loads `config.yaml`, and stops before serving anything when one does not validate. Every block the builder writes validates against the pinned ABI.
- **The diagram** downloads as an SVG in the theme you are reading in, with its colours written into the file, so it opens the same in a browser or a slide outside this site.
- **The link** holds the preset and every service that differs from it (`?preset=dev&document=postgresql`). Opening it restores the same diagram and block. A value the pinned ABI does not ship falls back to the preset, with a notice.

## Related

- [Services and adapters](/architecture/services-and-adapters): every service, its adapters, where each keeps its data, and how to write a `custom` one.
- [Data plane](/architecture/data-plane): where each kind of data lives.
- [Overview](/architecture/overview): how a running ABI system is put together.
