Web / Product surfaces
Organizations and invites
Ship the demo-style org loop: create, switch, invite, roles, leave, and danger-zone delete.
Setup and configuration
Organization workspaces are distinct from personal workspaces in packages/db. After signup, onboarding gates (/onboarding, /new-organization, /select-organization, /choose-plan) push the user into an active org before product billing and settings.
Invites create a pending workspace_invitation row and send transactional email with a /invite/[token] accept URL. Accept requires a matching signed-in email. Member list, role updates, and leave live under /settings/members; rename/delete and leave also appear on /organization/settings.
Routes
/new-organization
/select-organization
/invite/[token]
/settings/members
/organization/settings
Server actions
createOrganizationAction
createWorkspaceInviteAction
acceptWorkspaceInviteAction
updateMemberRoleAction
leaveOrganizationAction
renameOrganizationAction
deleteOrganizationActionImplementation workflow
Resolve the active workspace from cookie → user preference → membership, then verify membership on every write. Owners and admins manage invites/roles; sole owners cannot leave or demote themselves.
Prefer evaluateLeaveOrganization and evaluateMemberRoleUpdate from @starterkit/db before mutating memberships. Emit member.left / member.role_changed in-app notifications after successful mutations when inAppProduct is enabled.
Keep Platform Admin / impersonation frozen until PRODUCT.md explicitly authorizes it. Guest roles remain deferred.
Verification and troubleshooting
Focused Vitest: workspace leave/role helpers, invite acceptance, organization-onboarding gates. Manual: create org → invite → accept on a second account → update role → leave as non-owner → delete as owner with typed confirm.