Internal Documentation internal
TalkIDE internal documentation

What this context does

Owns the lifecycle of a Project — the user’s web app that Mara builds. Project = the unit at which we provision a working tree (NFS), a deterministic port pair, a per-app DB, a K8s namespace and a public URL.

Scope boundary

  • Owns: Project entity, status state machine, scaffold, slug validation, archival.
  • Owns scaffolding side effects: per-project NFS subdirectory creation, .talkide/ plugin rsync, project.yml write.
  • Does not own: build/deploy of the project (Stopa B — see ADR-017, ADR-019, ADR-021); conversations on the project (UC-04); versions (ProjectVersion is owned here but applied via the deploy service).

Main entities

PROJECTid, tenantId, name, description, status (DRAFT/BUILDING/LIVE/ UPDATED/PAUSED/ARCHIVED), previousStatus, url, accent, 4× tech stack columns, timestamps. PROJECT_VERSIONversionNumber, description, status, appliedAt.

Use cases

UCWhat it does
UC-03001List Projects — paginated, sorted, status-filtered
UC-03002Create Project — slug + scaffold + .talkide/project.yml write
UC-03003Project Detail
UC-03004Update Project
UC-03005Archive Project
UC-03006Restore Project
UC-03007Delete Project

Component diagram

{/* Image missing: UC-03 Project Management — Component View (../../assets/diagrams/uc03Components.svg) */}

Dependencies on other contexts

  • UC-02 Tenant Management — every Project belongs to a Tenant.
  • UC-04 Conversation — Conversations are scoped to a Project; archived projects can’t start new conversations.
  • UC-05 Workspace Activity — activity feed is per-project.
  • UC-07 Project Explorer — files/DB explorer reads from the project’s NFS subdir + per-app DB.
  • Build / Deploy (ADR-017, ADR-019) — applying a ProjectVersion triggers BuildServiceAppDeployer → ingress reconcile.

Cross-cutting

  • Slug reservation list is enforced at Create Project time — see CLAUDE.md root § Reserved slugs.
  • Deterministic ports — local dev only: BE = 8090 + project.id, FE = 5200 + project.id, read by plugin scripts via yq from .talkide/project.yml (see ADR-011). Cloud (Stopa B) doesn’t use these — every user app gets its own namespace and standard ports.

Was this page helpful?

Thanks for the feedback.