Integrations¶
Every external service a Fountain instance can talk to, what it is for, and what breaks without it. One page per integration covers what to create on the provider side, which env vars result, and how to verify it works.
| Integration | Required? | Env vars | Without it |
|---|---|---|---|
| Sprites | Yes | SPRITES_TOKEN, SPRITES_BASE_URL, SPRITES_TIMEOUT_MS |
The app boots, but every conversation fails |
| A decision, yes | RESEND_API_KEY or SMTP_* or EMAIL_DELIVERY=none, EMAIL_FROM |
Production refuses to boot with none of the three set | |
| GitHub OAuth | Optional | GITHUB_OAUTH_CLIENT_ID, GITHUB_OAUTH_CLIENT_SECRET |
Email + password auth only |
| Stripe | Optional | BILLING_ENABLED, STRIPE_SECRET_KEY, STRIPE_WEBHOOK_SECRET, STRIPE_PRICE_ID |
No billing. Correct for most self-hosted instances — leave the gate off |
| Sentry | Optional | SENTRY_DSN, SENTRY_ENVIRONMENT |
No error tracking; the SDK is inert and nothing leaves the instance |
The integration you do not configure¶
Inference providers — Anthropic, OpenAI, Gemini — are not set up by the
operator. There is no platform-level API key: each user brings their own
credentials, entered at /account/inference-credentials in the running app
(an Anthropic API key or Claude Code OAuth token, an OpenAI API key, a Gemini
API key — validated against the provider on save, stored encrypted per
tenant, and never echoed back).
This is a deliberate design
(ADR 0008):
inference cost scales with usage and belongs to the person using it, and many
users want their own Claude subscription doing the work. If you are looking
for where to put ANTHROPIC_API_KEY in the server environment — there is
nowhere, on purpose.