Inviting your team and setting access levels
Invitation links, six-character join codes, the three member roles, invite expiry, and restricting a member to specific views.
Two ways to invite
You can share an invitation link, or a six-character join code that someone enters at the join page. Both carry the same information: which project, which role, when the invitation expires, and how many times it can be used.
Someone who is signed out can still accept. The code is remembered through sign-up and redeemed once their account exists, so you do not have to coordinate the order.
The three roles
Editor gives full task management. Contributor can update progress and effort but not restructure the project. Viewer is read-only.
These are enforced in the database through row-level security, not just hidden in the interface. A Contributor cannot change a task name by any route, including a direct API call.
The project owner is separate from these three and cannot be assigned; ownership belongs to whoever created the project.
Expiry
Invitations expire after 3, 7, or 14 days, with 7 as the default. There is deliberately no never-expires option: an invitation link that works forever is a link that ends up in a document somebody forwards two years later.
Expired invitations are shown as expired in the directory rather than disappearing, so you can see what was sent.
Restricting a member to specific views
A member can be restricted to a named set of views. A restricted member sees only those views in the sidebar, and reaching one of the others by typing its URL directly gets them a blocked screen rather than the content.
Their own private views always remain visible to them regardless of the restriction.
Seats
Starter supports 2 seats per project. Basic, Standard, and Professional have no per-project seat cap.
Paid seats work through single-use activation codes rather than headcount syncing. Each code puts one person on your plan, is redeemable once, and stays with them while your subscription is active.