Appearance
Teams
Teams organize members within or outside organizations. Teams can be standalone or linked to an organization.
Model
Team
├── name, slug, description
├── organizationId? (optional — null for standalone teams)
├── members (with roles: OWNER, ADMIN, MANAGER, MEMBER)
└── tasks (team-scoped convenience endpoint)API Endpoints
| Method | Path | Description |
|---|---|---|
GET | /api/teams | List user's teams |
POST | /api/teams | Create team |
GET | /api/teams/:teamId | Get team details |
PATCH | /api/teams/:teamId | Update team |
DELETE | /api/teams/:teamId | Delete team |
GET | /api/teams/:teamId/members | List members |
POST | /api/teams/:teamId/members | Add member |
PATCH | /api/teams/:teamId/members/:userId | Update member role |
DELETE | /api/teams/:teamId/members/:userId | Remove member |
GET | /api/teams/by-slug/:teamSlug/tasks | Team task board |
Frontend Routes
| Route | View | Description |
|---|---|---|
/teams | TeamListView | List all user teams |
/organizations/:orgId/teams | OrgTeamListView | Org's teams |
/teams/:teamId | TeamDetailView | Team overview |
/teams/:teamId/tasks | TeamTasksView | Team task board |
/teams/:teamId/settings | TeamSettingsView | Team settings |
Frontend Store
typescript
const store = useTeamsStore()
const { teams, currentTeam } = storeToRefs(store)
await store.fetchTeams()
await store.fetchTeam(teamId)
await store.createTeam({ name, slug, description, organizationId })
await store.updateTeam(teamId, { name, description })
// Members
await store.addMember(teamId, email, role)
await store.removeMember(teamId, userId)Key Implementation Details
- Teams linked to an organization inherit organization-level permission constraints
- Standalone teams operate independently with their own permission scope
- The
/teams/by-slug/:teamSlug/tasksendpoint provides a convenient task board view - Team settings control name, description, and member management