Skip to content

What you are deploying

fountain is a server: you run it, people register accounts on it, and it runs agent conversations in sandboxes. This repo deploys it to Kubernetes and proves the deployment works. You drive everything with just commands.

Every deployment is the same few parts, whatever shape it takes:

partwhat it is
the appthe fountain server itself — accounts, conversations, the web UI
a Postgreswhere everything is stored. Bundled locally; yours, or operator-run, elsewhere
a platform Secretthe master key, the database URL, the data-plane token. One Kubernetes Secret
the data planewhere sandboxes run. An in-cluster emulator locally; the real Sprites API with a real token
a backup joba nightly pg_dump to an S3 bucket — emulated locally, yours elsewhere

Two questions pick the shape. Where does it run (target): a k3d cluster this repo creates on your machine, or a kubernetes cluster you already have. How durable is it (tier): light is one replica and a single-instance database; ha is two clustered app replicas over a replicated database.

how you get it
laptop, lightjust upStand it up locally
laptop, hajust operators, then one just up with four parameters — Make it durable
real cluster, lightbuild, dry-run, apply — Stand it up on a real cluster
real cluster, hathe same page; ha is the default it previews

Not every pair is a free choice: the laptop defaults are emulators, and ha refuses to stand on an emulator. When a combination is refused, the error names the parameter that fixes it — Make it durable walks through the three you hit.

Target — where the substrate runs: k3d or kubernetes.

Tier — how durable it is: light or ha. Orthogonal to size (small · medium · large), which is how much of the machine one pod asks for — a bigger pod is not a more durable one.

Seam — a dependency with a mode. postgres can be bundled, cnpg or reference; ingress can be omit, ingress or traefik; there are eight. The target picks defaults that make sense on that substrate, and setting one replaces exactly that seam. The full list is in Seams.

Parameter — how you say any of the above: just params="--param tier=ha" up. Every input is a declared parameter with a default; Build parameters is the whole table.

The manifests are compiled from TypeScript by chant. That is why the same parameters always produce the same resources, and why incoherent combinations are refused at build time rather than discovered in the cluster — but you never invoke it directly, and no page in the getting-started section needs you to know more than this paragraph.

Status records what has actually been stood up and exercised, what only builds, and what does not work yet. It is authoritative: where any other page disagrees with it, including this one, status is right.