TL;DR
- Fondoo's core is AGPL-3.0 and free to self-host. You need Docker with Compose v2 and OpenSSL.
./scripts/quickstart.shwrites a private.env, builds and starts the API, worker and Postgres, and prints your owner, agent and admin keys once.- Add the local MCP URL to Claude Code with the agent key and ask it to create and publish a starter site.
- A public deployment needs DNS, HTTPS, sign-in and your own provider accounts (Stripe, email, Google, social). Hosted Fondoo exists to skip that part.
"Five minutes" is the hands-on time. The first image build can take longer depending on your machine and connection, and that's mostly waiting.
What you get
The self-hosted engine is the same engine hosted Fondoo runs: sites and pages, payments, SEO, email, social, support, analytics, automations, the MCP server and the REST API. Self-hosting removes Fondoo subscription limits and platform fees. Provider quotas, safety checks and approval rules still apply.
Before you start
- Docker with Compose v2
- OpenSSL
- A checkout of the Fondoo repository
git clone <repository URL, published with the public repo>
cd fondoo
Step 1: Run the quickstart
./scripts/quickstart.sh
That script is the same as running these yourself:
./scripts/init-env.sh
docker compose -f docker-compose.selfhost.yml up -d --build --wait
docker compose -f docker-compose.selfhost.yml exec app /app/docker/entrypoint.sh bootstrap
curl http://localhost:3000/status
What each part does:
init-env.shwrites.envwith file mode 0600, a random database password and separate 32-byte encryption and signing secrets. It refuses to overwrite an existing.env.- Compose builds and starts the API, the worker and Postgres. Defaults bind the API to localhost, use local persistent storage, and leave external payments and email off.
- Bootstrap creates your workspace and prints three keys once: owner, agent and administrator. Save them somewhere private. Give agents only the agent key.
/statusconfirms the API is up.
Two things to keep safe:
- The encryption key in
.env. Lose it and stored provider credentials can't be decrypted. - The owner key. Never give it to an agent; approvals exist so agents can't approve their own requests.
If you plan to enable human sign-in later, set FONDOO_OWNER_EMAIL in .env before running bootstrap.
Step 2: Connect Claude Code
Read the agent key into your shell without echoing it or saving it to history:
read -rs FONDOO_AGENT_KEY
export FONDOO_AGENT_KEY
Then add Fondoo as an MCP server:
claude mcp add-json --scope user fondoo '{"type":"http","url":"http://localhost:3000/mcp","headers":{"Authorization":"Bearer ${FONDOO_AGENT_KEY}"}}'
claude
Inside Claude Code, run /mcp to confirm Fondoo is connected. The config stores the ${FONDOO_AGENT_KEY} placeholder, not the key. A 401 means the key is missing or wrong; a connection error means check /status and the Compose logs.
Using a different agent? Any MCP client works with the same URL and header, and every operation is also available over REST at POST /v1/ops/OPERATION, described by /openapi.json.
Step 3: Publish your first site
Ask Claude:
You, to your agentCreate a business named "My first app" for https://example.com with the SaaS kit. Create a starter site with the waitlist template and subdomain "my-first-app". Show me its pages and preview. When I approve, publish the site and give me the local home-page URL.
Claude runs this sequence:
create_business({ name: "My first app", url: "https://example.com", kit: "saas" })
create_site_from_template({ businessId, template: "waitlist", subdomain: "my-first-app" })
list_pages({ siteId })
preview_site({ siteId })
publish_site({ siteId })
The starter already has a home page, so no AI key or external provider is needed. Open http://my-first-app.sites.localhost:3000. If your system doesn't resolve wildcard localhost names, check routing with:
curl --resolve my-first-app.sites.localhost:3000:127.0.0.1 http://my-first-app.sites.localhost:3000
To change the page, Claude uses edit_page before publishing again. If any call comes back as an approval request, resolve it as the owner. Don't hand the owner key to the agent to skip that step.
Day-to-day commands
# start (after the first run)
docker compose -f docker-compose.selfhost.yml up -d --build --wait
# stop
docker compose -f docker-compose.selfhost.yml down
Data lives in named Docker volumes and survives restarts. Don't remove volumes unless you mean to erase data. The repository's operations guide covers backups.
Going public: what you'll configure
The local defaults are for development. Keep them off the public internet until you've set up HTTPS and authentication. For a real deployment:
Domains and HTTPS
- Set
API_HOSTSto your API hostname andSITE_BASE_DOMAIN(for examplesites.example.com) so a site with subdomainhelloserves athello.sites.example.com. - Put Caddy or Nginx in front. The repo includes
Caddyfile.example. SetTRUSTED_PROXY_IPSto your proxy's exact address. - Custom domains:
set_custom_domain, then point the domain's DNS at your server and add it to your proxy. Domain purchase is a hosted-only feature.
Sign-in
Set AUTH_ENABLED=true, AUTH_ORIGIN and a sender or OAuth identity provider. Then agents can connect with one URL and a browser sign-in instead of a key.
Providers (all bring-your-own)
- Payments: your own Stripe account in direct mode (
PAYMENTS_ENABLED=true, your keys, a webhook per site and mode). No Fondoo platform fee. - Email: Amazon SES, Resend, Postmark or any SMTP server. Verify your sending domain and SPF, DKIM and DMARC with your provider. See the deliverability guide.
- Search Console: your own Google Cloud OAuth client with the Search Console and Site Verification APIs enabled.
- Social: Postiz, Bluesky, Mastodon or your own X key. The 21-network Upload-Post connection is hosted-only.
- AI (optional): any OpenAI-compatible Chat Completions endpoint, including a local Ollama or llama.cpp server, that supports structured JSON output.
Storage and platforms
Local storage works on one machine. For S3-compatible storage, set the S3_* variables; an optional MinIO profile is included. The repo also has Railway (railway.json) and Render (render.yaml) templates for API, worker and Postgres. Run bootstrap once in the API service shell after deploying.
Moving between self-hosted and hosted
export_workspace produces a bundle of pages, subscribers with their consent and unsubscribe state, forms, plans, drafts and media. import_workspace loads it elsewhere. Secrets, API keys, payment tokens, live schedules, Stripe subscriptions and custom domains are deliberately not carried over; you reconnect those.
Self-host or hosted?
| Self-hosted | Hosted | |
|---|---|---|
| Price | Free (AGPL) | $24/site/month after a 7-day trial |
| Provider app reviews (Google, social) | Yours to register and maintain | Fondoo operates the apps |
| Email reputation | Your sender and DNS | Managed sending infrastructure |
| Stripe | Your account, direct mode | Stripe Connect platform run by Fondoo |
| Social networks | Postiz, Bluesky, Mastodon, X (own key) | 21 networks + Reddit drafts |
| Backups and uptime | You | Managed |
| AI | Your agent or model key | Your agent or model key |
FAQ
What does AGPL mean for me?
You can run, modify and self-host Fondoo for free, including for your own business. If you offer a modified Fondoo to others as a network service, the AGPL requires you to publish your changes. The SDK, CLI and connector SDK are MIT.
Do I need an AI model to self-host?
No. The starter site works without one, and your agent does the writing. A model endpoint is optional for Fondoo's own drafting tools.
Can I post to all 21 social networks when self-hosting?
No. The Upload-Post connection that covers all 21 networks is hosted-only. Self-hosted social supports Postiz, Bluesky, Mastodon and your own X key.
Can I move to hosted later?
Yes. Export your workspace and import it into hosted Fondoo, then reconnect providers.
Prefer to skip DNS, app reviews and email warm-up? Start your 7-day trial for $0. Otherwise, self-host free and keep everything on your own machines.



