Project Collaboration
A project on an SDK platform has one owner plus readers, collaborators and project admins. Team access is a platform feature. It is not available for projects deployed straight to Cloudflare.
On this pageInvite teammates to a project · Choose the right role · Manage a project you don't have linked
Roles
| Role | Access |
|---|---|
| Reader | View the project, usage, resources, deployments, builds, logs, and member roster. Cannot deploy. |
| Collaborator | Reader access plus deploy, rollback, cancellation, migrations, secrets, database configuration, and deploy prerequisites. |
| Project administrator | Collaborator access plus domains, email destinations, GitHub configuration, invitations, roles, and member removal. |
| Owner | Project administrator access plus project deletion. |
Only the owner can create, list, renew or revoke the project's CI deploy credentials. These credentials run unattended deploys as the billing owner. They do not depend on any member's login session. Collaborators and project administrators deploy with their own accounts instead.
The owner's plan, limits and suspension state govern the project. A member's own plan does not change the project's usage. Acting through a collaborator does not bypass an owner suspension. A project administrator is not an installation administrator and has no platform-wide access.
Invite a registered user
This step invites a teammate by the email on their existing account on the same platform. Only an owner or project administrator can do it.
Requires: platform login
These commands use your signed-in platform connection from void connect. Sign in first. If you use VOID_TOKEN, keep it out of code and chat.
void project team invite teammate@example.com --role collaboratorExample output: a confirmation for the invitation. If email cannot be sent, the CLI prints the invitation ID and the commands to share.
Pass --project <slug> to manage a project other than the linked one. Unknown emails are rejected. An invitation does not create an account. It also does not add the address to a restricted-signup allowlist.
Invitations expire after seven days. The invited user also sees the invitation with void project team pending on the same platform.
This step lists the current members and the invitations you sent.
void project team list
void project team invitationsExample output: the member roster, then the pending invitations.
Respond to an invitation
This step connects you to the platform named in your invitation.
void connect api.example.comExample output: a browser sign-in if you are not signed in yet.
This step lists the invitations addressed to your account.
void project team pendingExample output: each pending invitation with its ID.
This step accepts or declines one invitation by ID.
void project team accept <invitation-id>
# or
void project team decline <invitation-id>Example output: a confirmation of your choice.
An invitation is bound to the registered account. A forwarded ID does not let another user accept it.
These commands use the active connection from void connect. This holds even inside a directory linked to another project or deployed straight to Cloudflare. VOID_API_URL wins when set. If you use VOID_TOKEN, also set VOID_API_URL to the matching platform. Each command shows the platform it contacts.
Accepting grants access but does not link your directory. Open the app's directory and run void project link if needed. If the directory is linked to another project, use a separate checkout without .void/project.json. Connect to the invited platform there, then run void project link.
Invitation missing? Check the platform and the signed-in account. To switch accounts, set VOID_API_URL to the invitation's platform URL and unset VOID_TOKEN if present. Then run void account logout and void account login with the invited email. For an expired or revoked invitation, ask a project administrator to invite you again.
Change or remove access
This step changes a member's role, removes a member, or revokes a pending invitation. Owners and project administrators can do this for any non-owner member.
void project team role <user-id> reader
void project team remove <user-id>Example output: a confirmation for each change.
void project team revoke <invitation-id>Example output: a confirmation that the invitation is revoked.
A non-owner member can leave with void project team leave. The owner cannot leave. An installation administrator must transfer ownership first.
When a collaborator or admin is removed, leaves, or becomes a reader, the platform replaces the credentials the project's Workers use for platform services such as AI, email and remote bindings. The old credentials stop working once every Worker has the new ones. This usually takes about 10 minutes, and longer during a deploy. If the replacement cannot finish, the old credentials keep working, and owners and admins see a warning in void project status and void project team list.
During the switch, expect brief side effects. WebSocket connections reconnect once. Calls to platform services can fail for a moment. A scheduled run can be skipped. Queue messages are delivered again a few minutes later.
Code the removed person deployed keeps running until you replace it. If you no longer trust it, deploy code you trust. The platform replaces the credentials again after that deploy. Their older deployments kept for rollback still hold the old credentials. After a rollback to one of them, AI, email and ISR revalidation fail until you deploy again.