Skip to content
All docs

Docs

Teams & project access

Give a member access to some projects and not others, without inventing a new role.

A role answers what someone may do. A team answers where. A contractor can be a deployer on the two projects their team owns and not know the others exist. Teams are free, like everything else here.

How it works

  • A team is a name, a set of people, and a set of projects — all three editable at any time under Settings → Organization → Teams
  • Every member has a project scope: organization (the default — sees every project) or teams (sees only the projects their teams reach)
  • Nothing changes for anyone until you switch a member to the teams scope, so adding teams to a running install is safe
  • Deny by default: a teams-scoped member who is in no team sees no projects at all
  • Owners and admins administer the whole organization and cannot be scoped to teams — lower their role first
  • You cannot change your own project scope; ask another admin, so nobody scopes themselves out of the projects they administer

What a hidden project looks like

Not found, never forbidden. A project outside a member's teams is indistinguishable from one that does not exist, for reads and for writes alike — otherwise the error code itself would confirm it is there. The same applies to everything inside it: applications, compose stacks, databases, domains, backups, schedules and the live event stream.

Roles still decide capabilities

A team never grants a capability. Someone who cannot deploy does not gain the ability by joining a team that owns a project, and the rank-bound capabilities (servers, Docker, organization settings, members) stay admin-only. Combine the two axes: the role sets the ceiling, the team sets the reach.

From the API

  • team.all lists teams with their members and projects
  • team.setMembers and team.setProjects replace either list wholesale
  • team.setMemberScope switches one member between organization and teams
  • All of them require members.manage, and every change writes an audit row

Also see the repository guides under docs/ · REST API reference

Rent the box. Keep the rest.

One command, three services, and the first account is yours.