Docs ยท Multi-tenancy

Projects.

Projects are namespaces inside an org. They keep a single org's prod, staging, data-pipeline, and research clusters from colliding in one bucket of resources. Every org gets a default project; create more as you grow.

Why projects

An org with 100 resources, three teams, and four environments needs scope. Without projects:

Projects fix that. Resources, stacks, events, and saved queries all carry project_id. The API filters by project when the X-Remoco-Project header is set; absent header = org-wide view (back-compat).

Create a project

From the console: Admin tab โ†’ Projects card โ†’ + New project. Pick a slug (lowercase kebab) and display name. From the CLI:

$ remoco projects create prod-api --name="Prod API"
{
  "id": "doss-labs-prod-api",
  "slug": "prod-api",
  "name": "Prod API",
  "is_default": false,
  "created_at": "2026-04-26T22:30:00Z"
}

Switch the active project

Console: topbar dropdown next to the search button. The selection persists per env (prod/staging/local) in localStorage and gets sent on every API call as X-Remoco-Project: <slug>.

CLI / API:

$ curl -H "X-Remoco-Project: prod-api" https://api.remoco.dev/v1/resources

Move resources between projects

Open a resource detail in the console; the Project row shows the current assignment with a dropdown to move it. Owner/admin only; emits a resource.moved audit event.

API:

$ curl -X PATCH https://api.remoco.dev/v1/resources/cloud-run-foo \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"project_slug":"prod-api"}'

Default project

Every org has exactly one default project (is_default = true). Resources created without an active project header land here. The default cannot be archived; it's the safety net.

Archiving a project

Move all live resources out (or destroy them) before archiving. The archive is a soft delete: archived_at is set, the project disappears from the switcher, but rows pointing at it (audit events, etc.) keep working.

$ remoco projects archive old-experiment

What scopes to projects

SurfaceScoped to project?
Resourcesyes (header filters list, PATCH moves)
Stacksyes (inherits from header on apply)
Eventsyes (filtered when header set)
Saved queriesyes
Workstationsvia the resources table (kind=workstation)
Org settingsno (org-level)
API tokensno (org-level)
Members + invitesno (org-level for now; per-project ACL deferred)
Per-project ACL (member can only see their project's resources) is deferred to v0.4. Today, all members see every project's resources; the switcher just narrows the view.