Skip to content
Pre-MVP. The 1.0 codebase is not a released product — see the 1.0 product boundary.

One word per thing

Five words in this product have been used for more than one thing, and each overlap has cost somebody an hour. This is the register. A word not on this list is not a product term, and a term on this list means exactly what it says here — in the UI, in the CLI, in the specs and in commit messages.

One deployment of Dee Wan. An admin Worker, an admin UI, a control database, and the accounts and credentials behind them. Created once by the installer.

  • The thing npm run setup produces.
  • Has ONE control database, ONE claim link, ONE set of superadmins.
  • Serves many sites.
  • NOT “an install of a site”. A site is not installed; it is created.

Related but distinct: installer is the engine, and it has two interfaces — the web installer and the CLI installer. Both drive the same engine.

One tenant inside an installation. A name, a slug, a hostname, its own content, its own languages, its own roles and grants.

  • Created through POST /api/sites, never through the installer.
  • Under the per-site topology a site also has its own content database; under the shared topology it shares the installation’s one. Which one it has is a row in site_binding, not a property of the word.
  • NOT a Cloudflare “site” or a zone. When the Cloudflare object is meant, say zone.

Making one piece of content readable by the public read worker. A content lifecycle transition; nothing to do with infrastructure.

  • publish / unpublish, per content item, per locale group.
  • Changes what /api/… on the public hostname answers. Changes no code, no binding, no deployment.
  • NOT “publishing the site”. A site is not published; its content is.

Generating a standalone, typed backend project from a site’s content model. Source code emission, and only that.

IN CUSTOMER-FACING UI, SAY “GENERATE STANDALONE BACKEND”. Nobody outside this repository knows what a site graduating means, and the word describes the mechanism rather than what the person gets. graduation stays as the internal technical term — module names, CLI scripts (npm run graduate), specs, commit messages, this register — and never appears in a screen, button, toast or error sentence an adopter reads. scripts/check-vocabulary.mjs fails CI on a user-visible string that breaks this rule.

  • npm run graduate writes a project: Prisma schema, migrations, a Worker, a wrangler.jsonc, typed routes.
  • The output is detached — it knows nothing about the installation that produced it, and calls nothing back (SPEC.md §13.1).
  • Graduation deploys nothing. graduate:all deploys nothing either.
  • NOT a migration, NOT an export, NOT a deployment. It is code generation.

Getting a specific revision running on Cloudflare. Two different things wear this word, and they are kept apart by what they act on:

Term Acts on Command
installation deployment the admin Worker and admin UI npm run deploy
site deployment one graduated site’s own Worker and D1 the Deploy button, via CI
  • A site deployment is the CI pipeline of SPEC.md §13.1: mint a build credential, regenerate generator-owned files, append a migration, migrate D1, deploy that revision, verify, report back. site_deployment is the row that records it.
  • NOT graduation. Graduation produces the code a deployment runs.

Creating the Cloudflare resources a thing needs, and recording that it exists.

  • Installation provisioning: D1, R2 or Images, Pages, DNS — what setup does.
  • Site provisioning: create → migrate → bind → redeploy → verify for a site’s own content database, recorded in provision_attempt / provision_ledger.
  • Always ledgered, always resumable, never inferred from a name.
  • NOT installation, NOT deployment. Provisioning makes the resource; deployment puts code on it.
Avoid Because Say
“tenant” in the UI it is an implementation word; operators think in sites site
“instance” for a deployment content_instance is a row, and it is everywhere installation
“migrate” for content import migrate is schema migration import
“export” for graduation export is content leaving; graduation is code arriving graduate
“sync” it has meant four things name the direction
“graduate” in the UI it names a mechanism, not what the adopter gets generate standalone backend
“workflow” for a site with review off there is no review to be in publish / unpublish