Core concepts
Eleven nouns explain the whole platform. Learn them once and every other chapter reads quickly.
The vocabulary#
| Term | What it is |
|---|---|
| User | A person (or agent identity) with an email, a password and a role: admin or user. Admins create users — there is no self-registration. |
| Alias | A short, unique handle of 2–15 characters [a-z0-9] that every user has. It appears in daemon names and site names (<slug>.<alias>.<base_domain>). |
| Project | The unit you deploy: a slug, a display name and a base domain. A project owns one web app, its databases, domains, variables and backups. |
| Slug | The project's short name, 2–40 characters [a-z0-9-], unique per user. |
| App | The running web application of a project — one container, built from your source. One app per project in this version. |
| Deployment | One build-and-run attempt. Numbered per project, with a status, a build log and the manifest that was resolved. |
| Runtime | How your source is built and started: static, node, python or php. Auto-detected, or set in platform.yaml. |
| Daemon (DinD) | A Docker daemon running inside a container. Every user gets their own for apps; databases live in a shared one. Your code never shares a daemon with another user. |
| Database | A PostgreSQL or MySQL container attached to a project, with generated credentials and an SQL console. |
| Bucket | Your personal S3 bucket (<alias>-files) on the built-in MinIO, with your own access keys. |
| Token | A long-lived dt_… API token for agents and CI, created on the tokens page. |
How the pieces nest#
Everything the platform runs lives inside one privileged container, dind-hosting. Inside it, services and per-user daemons share a private network, and every user's apps run in a daemon of their own.
Three things are worth noticing:
- One address toward the host. The platform is reached at
10.10.10.10on a host bridge network. It publishes no host ports; what is forwarded from the Internet is your ingress decision. - A daemon per user. Your apps are built and run by a daemon only you use. That is the isolation boundary between tenants.
- Everything is reconciled. A management container re-asserts the desired state of all of this on every boot — a reboot or crash brings the whole stack back without help.
Who owns what#
The platform enforces ownership in the service layer, so the web console, the REST API and the MCP tools behave identically:
- A user sees and changes only their own projects, databases, backups and tokens. A foreign object answers not found — never forbidden — so existence is not leaked.
- An admin also sees every project and can create and disable users, switch a user's dedicated database daemon on or off, read platform-wide metrics and change platform settings.
Three doors, one set of rules#
Anything you can click you can also script (curl) or hand to an agent (deploy_app, run_query, …). The API tokens, REST & MCP chapter covers authentication.
What lives where#
| Data | Stored in | Survives a redeploy? |
|---|---|---|
| Users, projects, deployments, settings, audit rows, metrics | Platform PostgreSQL (platform-pg) |
Yes |
| Your source archives | data/platform/deploys on the host |
Until retention prunes them |
| Build logs | Live buffer while building, then MinIO | Yes |
| Built images and app volumes | Your app daemon projects-<alias> |
Images are rebuilt; volumes persist |
| Database files | A named volume inside the database daemon | Yes |
| Backups and dumps | MinIO bucket platform |
Per retention policy |
| Your own files | MinIO bucket <alias>-files |
Yes |
| Generated secrets (JWT key, passwords, Fernet key) | data/platform/secrets (mode 0600) |
Yes |
Container filesystems are disposable
A deploy replaces the app container. Anything your app writes outside a declared volume (see platform.yaml) or outside S3 is gone after the next deploy or recreate.
Statuses you will meet#
| Object | Values |
|---|---|
| Deployment | queued fetching building running failed |
| App container | running stopped missing |
| Domain pre-check | pending passed dns_failed routing_failed |
| Certificate | none pending issued error |