Skip to content

Projects

A project is the durable name of an application. Versions live under it. Production is a pointer on the project, not a separate environment object.

Create

bash
curl -sS -X POST "$CELLP_URL/v1/projects" \
  -H "Authorization: Bearer $ADMIN_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"id":"my-shop","git_remote":"https://github.com/acme/my-shop"}'

id is the project id used in ingress Host names: {project}.{base-domain} (prod) and {version}.{project}.{base-domain} (preview). Path prefixes /{id}/ are deprecated — use Host-based routing.

git_remote is optional metadata. cellp never clones it.

Production pointer

GET /v1/projects/{id} returns prod_version_id and prod_url.

SituationBehavior
No prod yetThe first version that reaches ready is assigned production automatically (prod Host is created). You do not need a separate “bootstrap promote.”
Prod already setNew versions are preview-only until you promote one of them.

The prod Host stays the same across promote; only the backing version changes.

Listing

GET /v1/projects is cursor-paginated (limit, cursor). Dashboard uses the same endpoint.

Mental model

project: my-shop
  versions: v-seed, pr-42-abc, v-2026-08-30
  prod_version_id: v-2026-08-30    →  Host: my-shop.ingress.local
  preview (pr-42-abc):             →  Host: pr-42-abc.my-shop.ingress.local

There are no “Preview / Production / Development” environment records like Vercel env targets. Isolation is per version. Env vars are per version as well.

Self-hosted Workers control plane. Not affiliated with Cloudflare or Vercel.