People
Invite teammates, pending invites, roles display, and General access — every control, including what is not persisted.
Panel
Sidebar: Project → People
Header: People — Invite teammates to collaborate on this project.
People with access
| Control | Behavior |
|---|---|
| Invite | Opens InviteMembersModal for this project |
| Loading | Loading people… |
| Empty table | No people yet. |
Table
Sortable headers:
| Column | Sort |
|---|---|
| User | Name / email (current user pinned first) |
| Role | Role string |
Rows include members and pending invites.
| Cell | Detail |
|---|---|
| User | Avatar, display name, email; (you) on your row |
| Role | Dropdown: Project owner / Member |
| Invite row status | Pill Invite pending; on hover: Resend, revoke (trash) |
Footer: All people loaded
Role dropdown
Changing the role dropdown calls a no-op handler. Roles are displayed but cannot be changed from this UI today.
Pending invites
| Control | API |
|---|---|
| Resend | POST /api/projects/:id/invites/:inviteId with browser timezone |
| Revoke (trash) | DELETE /api/projects/:id/invites/:inviteId |
General access
Row title General access with a select:
| Option | Description shown when selected |
|---|---|
| Restricted | Only people with access can open with the link |
| Anyone with the link | Anyone on the internet with the link can view |
Anyone from @{domain} | Shown when a work email domain or project URL domain can be inferred; Anyone from @{domain} can view with the link |
selection updates local UI state only — it is not saved to the server from this panel.
Invite lifecycle
- Owner/member clicks Invite and sends addresses from the modal.
- Invitee signs in and accepts.
- Expired or revoked invites require a new invite.