Users can create, view, edit, archive, restore, and permanently delete projects. Archived projects are hidden from the main list but remain accessible in a filtered view. Projects progress through a defined lifecycle from DRAFT to PUBLISHED, with UPDATED representing unpublished local changes.
Naming: stav
LIVEbyl v ADR-022 (Stopa B.7) přejmenován naPUBLISHED— konzistence se semver “publish” terminologií. Kompletní design publish flow viz ADR-022 a Version Lifecycle Flow.
Project Status Lifecycle
stateDiagram-v2
[*] --> DRAFT: Project created
DRAFT --> BUILDING: User clicks Publish (first deploy)
BUILDING --> PUBLISHED: Build + deploy succeeds
BUILDING --> DRAFT: Build fails (project was never PUBLISHED)
BUILDING --> UPDATED: Build fails (project was previously PUBLISHED)
PUBLISHED --> UPDATED: New commit detected (post-commit hook, automatic)
UPDATED --> BUILDING: User clicks Publish (update deploy)
PUBLISHED --> PAUSED: User pauses project
PAUSED --> PUBLISHED: User resumes project
DRAFT --> ARCHIVED: User archives
BUILDING --> ARCHIVED: User archives
PUBLISHED --> ARCHIVED: User archives
UPDATED --> ARCHIVED: User archives
PAUSED --> ARCHIVED: User archives
ARCHIVED --> DRAFT: User restores (previously DRAFT)
ARCHIVED --> PUBLISHED: User restores (previously PUBLISHED)
ARCHIVED --> PAUSED: User restores (previously PAUSED)
ARCHIVED --> UPDATED: User restores (previously UPDATED)
States
| State | Description | Transitions |
|---|---|---|
| DRAFT | Project created but never deployed. User can make changes via conversations or editor; status stays DRAFT until user clicks Publish. | BUILDING (Publish), ARCHIVED (Archive) |
| BUILDING | Active build + deploy process in progress. Progress tracking available (stub: always 0 in MVP). | PUBLISHED (success), DRAFT (fail, never PUBLISHED), UPDATED (fail, was PUBLISHED), ARCHIVED (Archive) |
| PUBLISHED | Deployed to PROD and accessible at {slug}.talkide.app. | UPDATED (automatic, on first new commit), PAUSED (Pause), ARCHIVED (Archive) |
| UPDATED | Was previously PUBLISHED, but has unpublished commits. Like a git working tree with new commits ahead of the production tag. User can continue making changes; status stays UPDATED until Publish. | BUILDING (Publish), ARCHIVED (Archive) |
| PAUSED | Temporarily stopped by user. Can be resumed. | PUBLISHED (Resume), ARCHIVED (Archive) |
| ARCHIVED | Soft-deleted. Not visible in default project list. Can be restored to previous status or permanently deleted. | Previous status (Restore), permanent deletion (Delete) |
Navigation Flow
stateDiagram-v2
[*] --> PROJECT_LIST: User opens dashboard
PROJECT_LIST --> PROJECT_DETAIL: User opens a project
PROJECT_DETAIL --> PROJECT_LIST: User navigates back
PROJECT_LIST --> ARCHIVED_LIST: User switches to archived view
ARCHIVED_LIST --> PROJECT_LIST: User switches back
PROJECT_DETAIL --> CONFIRM_ARCHIVE: User clicks "Archive"
CONFIRM_ARCHIVE --> ARCHIVED_LIST: Confirmed
ARCHIVED_LIST --> CONFIRM_RESTORE: User clicks "Restore"
CONFIRM_RESTORE --> PROJECT_LIST: Confirmed
ARCHIVED_LIST --> CONFIRM_DELETE: User clicks "Delete Permanently"
CONFIRM_DELETE --> ARCHIVED_LIST: Confirmed
Business Rules
- The default project list shows all non-ARCHIVED projects (DRAFT, BUILDING, PUBLISHED, UPDATED, PAUSED).
- Archived projects are shown only when explicitly filtered by
status=ARCHIVED. - Only ARCHIVED projects can be permanently deleted. Non-archived projects must be archived first.
- Deleting a project is permanent and removes all conversations, messages, versions, and associated data (DB CASCADE).
- A confirmation dialog is shown before archive, restore, and delete actions.
- The transition
PUBLISHED → UPDATEDhappens automatically when a new commit is detected (git post-commit hook on user, Mara, or Kai commit) — it is not a user-initiated action on the project entity. Bot bump commits ([skip-bump]marker) are excluded. - The transition
DRAFT/UPDATED → BUILDINGis triggered by an explicit “Publish” action by the user (POST /api/v1/projects/{slug}/publish). Hosting billing status (hosting_billing_account.status) is validated before transition —SUSPENDEDaccount returns402 HOSTING_BUDGET_EXCEEDED. (Note: legacyhostingCreditUsdprepaid check removed in be#142 — hosting is postpaid-only, DP-7.) - Concurrent Publish protection:
status := BUILDINGis set in a transaction with the preconditionstatus IN (DRAFT, PUBLISHED, UPDATED)— a second concurrent Publish click returns409 CONFLICT_PROJECT_STATUS. - Archived projects cannot start new conversations and cannot accept new commits (editor commit gesture is disabled).
- The
previous_statusfield tracks the status before archiving, enabling correct restoration. Supports all non-ARCHIVED states including PUBLISHED and UPDATED. - DEV preview URL (
{projectUuid}.talkide.app) remains available regardless of project status (except ARCHIVED) — independent of PROD publish lifecycle.
Was this page helpful?
Thanks for the feedback.