Platform services
Every project deployed on Cantila gets its own dedicated database, object storage, and an email service — provisioned together with the project and wired into the environment before the first build runs. SMS is opt-in: a project gets no number until you activate SMS on it (see SMS, Voice & Numbers).
This page is the overview. Each service has its own page with the API surface and current phase status:
- Databases & storage — managed Postgres + S3-compatible buckets.
- Domains — search, register, and attach custom domains.
- Mail — first-party email provider.
- SMS, Voice & Numbers — telephony provider and number marketplace.
- Automations — managed n8n / OpenClaw + native workflow canvas.
- Connections — account-wide credentials reused across workflows.
- Agents — the self-healing brain and agent swarm.
- Templates — one-shot create + deploy marketplace.
What's wired, by phase
| Service | Env var(s) | Phase | Default state |
|---|---|---|---|
| Postgres | DATABASE_URL | Live | Real, running on Hetzner |
| Object storage | STORAGE_ENDPOINT, STORAGE_BUCKET, STORAGE_KEY | Live | S3-compatible, per-project |
| Mailbox + SMTP | SMTP_HOST, SMTP_PORT, SMTP_USER, SMTP_PASS | Phase 2 | Real creds, stub MTA today |
| SMS number | CANTILA_SMS_NUMBER, CANTILA_SMS_API_KEY | Opt-in | Activate per project |
| Cantila API key | CANTILA_API_KEY (scoped to the project) | Live | Used by the runtime SDK |
What works today
- Live: Postgres (
DATABASE_URL) and S3-compatible storage are real and running. - Phase 2: Mailbox + per-project SMTP credentials are real and auto-wired, but no real bytes leave the MTA yet — the send path is a stub. See Mail.
- Opt-in: SMS is not auto-wired. Activate it on a project to provision a real number (billed monthly) and inject
CANTILA_SMS_NUMBER/CANTILA_SMS_API_KEY. See SMS.
Phase 2 and Phase 3 env vars exist today against the stub adapters —
you can write code that targets them and it will work against the API; the
live carrier delivery flips on as each phase ships. See the
changelog.
How the wiring works
When you create a project:
- Project row is created in the control plane.
- Database is provisioned in the managed Postgres cluster. A per-
project user and database are created;
DATABASE_URLis generated. - Mailbox is created at
m_<random>@cantila.app(Phase 2 — this becomes<project>@<your-domain>once Mail goes live). - Cantila API key scoped to the project is minted.
- Env injection. All of the above are written to the project's
secrets, marked
cantila-managed: true, and locked from user overwrite. - First build runs with the env in place.
SMS is not provisioned here — it's opt-in. When you activate SMS on the
project, a real number is leased and CANTILA_SMS_NUMBER /
CANTILA_SMS_API_KEY are injected then.
Sleeping when idle
Auto-wired services follow the same sleep policy as the project itself:
- Hobby projects sleep when idle (~10 minutes of no traffic). Their database connections close; storage buckets stay live. Wake on next request.
- Starter / Pro / Agency projects pinned always-on stay live.
A sleeping database doesn't bill on the meter; storage and number leases keep their fixed monthly cost regardless of sleep.
Tearing down
Deleting a project tears down its auto-wired services in lockstep:
project deleted
db dropped
storage bucket emptied + dropped
mailbox deleted (Phase 2)
sms number released (only if SMS was activated)
domain retained (your domain, your call)The domain stays — it's a registrar product, billed separately from the project. Manage from Console → Domains.
Why bundled
The whole point: a builder ships an app and DATABASE_URL already
resolves. No second vendor signup. No glue code. One bill.
Want to bring your own Postgres / S3 / mailbox? Override the Cantila-managed env vars at the project level — Cantila respects user overwrites and stops managing the slot until you delete the override.