Self-hosted

Run Fountain on your infrastructure.

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

Six commands and one provider token.

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

Run the control plane. Choose where the work runs.

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.

Runs in your account Control plane and database
The API, console, conversations, transcripts, audit events and API keys live in your deployment and Postgres.
Yours to protect Master key
You generate the key that encrypts every tenant's environment variables. Fountain never stores it in Postgres, so back it up with the database.
Hosted or yours Sandbox compute
Use a hosted sandbox provider or connect a Mac mini, home server or GPU box from your network. The runner dials out, so you open no inbound port and hand it no platform credential.
Your provider account Inference
Each user supplies their own model credential. Their provider bills them directly, and Fountain adds no markup to token usage.

Run sandboxes on your own machines →

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

Three checks before you go live.

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

Check readiness

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

Create the first 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.

Create the first admin safely →

03 · End to end

Run an end-to-end conversation

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

Use the apps or host your own.

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.

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.

Team

A team messenger whose contacts are agents you configured.

Use it when a thread is the natural place to hand off work.

Workbench

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

12 open-source apps already run on the API.

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.

See all 12 apps and their source →

05 · Feature flags

On your instance, every feature flag is yours to set.

Two capabilities ship behind configuration: Connections and the credential broker. On your instance, each is a switch you control.

Connections

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.

Brokered credentials

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

Three licenses, and what each one asks of you.

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

The server

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

Credits and Stripe

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

The CLI and the SDKs

Ship them inside a closed product. An application that calls your instance takes on no obligation at all.

What is open, what is not, and where each thing lives →

07 · Trade-offs

What it costs you.

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.

Bring machines or choose a sandbox provider

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 →

Configure email before inviting anyone

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 up the master key with the database

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 →

Own every upgrade

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

Read the questions before you 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 answers

Run your own instance.

Docker 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.