Conversations
A coding-agent chat with its checkout, shell and event stream visible.
Start here to see one run from first prompt to final response.
Self-hosted
The same API, SDK and CLI. Your database, your keys and your sandboxes.
No license key, no seat count and nobody to ask first. Start with Docker Compose, then own more of the stack when you want to.
AGPL-3.0-or-later same release image no sales call
git clone https://github.com/managoat/fountain
cd fountain
cp .env.compose.example .env
echo "SECRET_KEY_BASE=$(openssl rand -base64 48 | tr -d '\n')" >> .env
echo "MASTER_SECRETS_KEY=$(openssl rand 32 | base64 | tr '+/' '-_' | tr -d '=\n')" >> .env
# ... and your sandbox provider token
docker compose up -d
The compose file brings its own Postgres. Back the master key up before you have data, because it is not in the database.
Before you run them: add a sandbox provider token. The app starts without one, but every conversation fails. What each provider needs →
Prefer Kubernetes?
Use the plain manifests in deploy/k8s/—no operator or CRDs. They deploy the same release image as hosted Fountain against your Postgres.
Deploy on Kubernetes →
01 · Ownership
Fountain and Postgres run in your account, protected by a master key you hold. Use a hosted sandbox provider or connect machines from your network. Each user brings their own model credential, and Fountain never marks up inference.
Before you start
Compose tools
For the six-command path, bring Docker Engine with Compose v2 and openssl for the two key lines.
Postgres 16+
Fountain requires it. Compose runs one for you, or point Fountain at a Postgres you operate.
Image access
Pull the release image from ghcr.io. If your network blocks it, Compose can build from the checkout.
Public URL
Set PUBLIC_URL when users or sandboxes reach Fountain anywhere but localhost. It also builds verification links.
02 · First boot
Give first boot up to a minute while migrations run. Then check readiness, create the first admin and disable registration, and run a conversation to test the complete path.
01 · Ready
Wait for
docker compose ps
to report the app as healthy, then call the readiness endpoint. An
ok
database check means Fountain and Postgres are ready.
curl -sS localhost:4000/health/ready
{"checks":{"database":"ok"},"status":"ok"}
02 · Admin
Open http://localhost:4000 and create your account. With the Compose defaults, Fountain verifies the first account and promotes it to admin. Do this before the instance is public, then disable registration.
03 · End to end
Add your model credential, then start a conversation. A run that reaches its first turn confirms Fountain can read Postgres, decrypt the credential, reach the model provider and start a sandbox.
Run the end-to-end check →03 · What you open
Your instance serves an operator console for accounts, keys, agents, environments and audit. Conversations, Team and Workbench are static frontends over the same public API. Point them at your instance or host your own copies.
A coding-agent chat with its checkout, shell and event stream visible.
Start here to see one run from first prompt to final response.
A team messenger whose contacts are agents you configured.
Use it when a thread is the natural place to hand off work.
One board for shared projects, work items and the agents assigned to them.
Use it when several people need the same agents and project setup.
A browser app on another origin needs one CORS entry. Name the origin it is served from.
API_CORS_ORIGINS=https://fountain-conversations.demo.managoat.com
Conversations and Team are also what the console's own links point at, so CONVERSATIONS_APP_URL and TEAM_APP_URL swing them to copies you host, and an empty string says this deployment has none. Both are in the configuration reference.
04 · Built on it
These four put different frontends on the same agent roster. Each source tree is public, and each app points at whichever instance you configure. The app is the part you build; the Agent stays reusable behind the API.
briefing-room.demo.managoat.com
Describe what you need to understand and why. A research agent reads sources on the web and returns a cited brief instead of a chat transcript.
table-talk.demo.managoat.com
Drop in a CSV. An analyst runs Python in its sandbox and returns charts with plain-language findings. Keep asking questions of the same data.
rounds.demo.managoat.com
Dependabot for infrastructure config. Rounds audits an enrolled repository on a schedule, fixes what it can verify and opens a pull request without repeating closed findings.
mission-control.demo.managoat.com
Describe a goal. A coordinator drafts a plan for your approval, then starts one sandboxed agent per task. Watch them work and receive one combined report.
05 · Feature flags
Two capabilities ship behind configuration: Connections and the credential broker. On your instance, each is a switch you control.
Capability
On yours
Sign in to a provider once and the agent gets its tools. The OAuth token never enters the sandbox.
Read the page →Config
Configure the credential broker and your provider apps, then add connections to FEATURE_FLAGS_ON.
The real token never enters the sandbox. The broker attaches it on the way out, and the transcript keeps a placeholder.
Read the page →Config
Set BROKER_LISTEN_PORT and BROKER_PROXY_URL. Every account on the deployment is then brokered.
The rest of the product has no flag on it. Every switch the release image reads is in the configuration reference lists every one of them.
06 · Licenses
The parts your code touches are permissive on purpose. A connection to Fountain must never put an obligation on your application.
apps/fountain
AGPL-3.0-or-later
Run it, change it, host it, charge for it. Offer a changed server to other people over a network and they have a right to your source.
ee/
Elastic 2.0
Free to run in your own instance, and your changes stay yours. The one thing it forbids is selling this code to third parties as a hosted service.
cli/, sdk/typescript, sdk/python
Apache-2.0
Ship them inside a closed product. An application that calls your instance takes on no obligation at all.
07 · Trade-offs
The software is free; running it is not. You pay in infrastructure and operations. Better you know the four line items now than in week three.
Sprites, E2B and Daytona are all hosted. Daytona you can run yourself, and your own runners need no vendor at all. Pick one before your first conversation, because without one every conversation fails.
Runners on your own hardware →Verification and password resets go through Resend, or an SMTP server of yours. So does anything a teammate sends. The compose defaults skip delivery so the first account can register, and that default is for day one only.
Configure email →Back it up before you have data. Lose it and every encrypted secret in the instance is gone, and no database restore brings them back.
Back up and restore →Pull the tag, run the migrations, read the note. There is no window where somebody else does it for you, and no window where somebody else does it to you.
Upgrade an instance →08 · Before the clone
Check whether it is the same code, whether the AGPL reaches your application, what the software costs and how to remove it again.
Read the self-hosting answersDocker Compose, Postgres and one sandbox provider token. The deploy guide has the whole path, and the repository has every open issue.
Questions about running it? Email Jake.