.agents/features/projects.md
A Project is the workspace within a platform where flows, connections, tables, and other resources live. Every platform has at least one project. Projects are always scoped to a platform via platformId. The Community edition allows a single user to have one personal project; the EE platform-projects module extends this with team projects, per-project limits, and an admin list API. Projects support soft-delete (via deleted timestamp), icon customization, concurrency pool assignment, and optional release management.
packages/server/api/src/app/project/project-controller.ts — GET /:id, GET /, POST /:id routes (CE level)packages/server/api/src/app/project/project-service.ts — core service: create, update, getOne, getOneOrThrow, getAllForUser, getUserProjectOrThrowpackages/server/api/src/app/project/project-entity.ts — project TypeORM entity with all relationspackages/server/api/src/app/project/project-repo.ts — repoFactory wrapper with optional EntityManager supportpackages/server/api/src/app/project/project-hooks.ts — hooksFactory hook point for EE post-create behaviorpackages/server/api/src/app/project/project-worker-controller.ts — internal endpoint used by engine to read project datapackages/shared/src/lib/management/project/project.ts — Project, ProjectPlan, ProjectIcon, UpdateProjectRequestInCommunity schemaspackages/web/src/features/projects/components/projects-selector.tsx — project-switcher dropdown in the sidebarpackages/web/src/features/projects/components/platform-switcher.tsx — platform-level switcher componentpackages/web/src/features/projects/stores/project-collection.ts — Zustand store for current projectAll editions. The CE controller exposes a minimal set: get, list (returns only the personal project), and update display name/metadata. EE adds ee-projects module with platformProjectService for full admin CRUD, project limits, and per-project piece filters.
PERSONAL (auto-created on sign-up, one per user per platform) or TEAM (EE multi-member workspace){ color: ColorName } stored as JSONB; color chosen from a 12-color paletteconcurrency_pool for worker concurrency limitingproject (ProjectEntity)| Column | Type | Notes |
|---|---|---|
| id | string | ApId |
| ownerId | string | FK to user |
| platformId | string | FK to platform |
| displayName | string | |
| type | string | ProjectType enum |
| icon | jsonb | { color: ColorName } |
| externalId | string (nullable) | embedding integration ID |
| maxConcurrentJobs | number (nullable) | concurrency cap |
| releasesEnabled | boolean | default false |
| metadata | jsonb (nullable) | arbitrary key-value |
| poolId | string (nullable) | FK to concurrency_pool |
| deleted | timestamp (nullable) | soft-delete date |
Indices: ownerId, platformId, poolId, unique (platformId, externalId) where deleted IS NULL.
Relations (one-to-many): flows, files, folders, events, appConnections, tables, fields, records, cells, tableWebhooks.
| Method | Path | Security | Description |
|---|---|---|---|
| GET | /v1/projects | publicPlatform (USER) | List projects accessible to the current user (CE: returns personal project only) |
| GET | /v1/projects/:id | project scoped (USER, PARAM) | Get a single project by ID |
| POST | /v1/projects/:id | publicPlatform (USER, SERVICE) | Update project display name and metadata |
projectServicecreate({ displayName, ownerId, platformId, type, callPostCreateHooks?, entityManager? }) — creates project record with random icon color, calls projectHooks.postCreate if enabledupdate(projectId, request, entityManager?) — updates allowed fields; TEAM projects allow displayName and icon update; PERSONAL projects do notgetOne(projectId) / getOneOrThrow(projectId) — single project fetchgetAllForUser({ platformId, userId, isPrivileged }) — returns all projects visible to a user (admins see all platform projects, members see their assigned projects)getUserProjectOrThrow(userId) — returns the personal project owned by the user; used in CE list endpointgetProjectIdsByPlatform(platformId) — returns all project IDs for a platform; used during platform deletioncountByPlatformIdAndType(platformId, type) — used to enforce project limitsprojectHooks.postCreate, which in EE creates an associated ProjectPlan and sets piece filters