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:
- Every member sees every resource.
- Saved queries can't be team-specific.
- Burn breakdowns lump everything together.
- Hard-cap budgets are org-wide and ungranular.
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
| Surface | Scoped to project? |
|---|---|
| Resources | yes (header filters list, PATCH moves) |
| Stacks | yes (inherits from header on apply) |
| Events | yes (filtered when header set) |
| Saved queries | yes |
| Workstations | via the resources table (kind=workstation) |
| Org settings | no (org-level) |
| API tokens | no (org-level) |
| Members + invites | no (org-level for now; per-project ACL deferred) |