- Account and Project are separate authorization domains. Granting account-level permissions does not grant access to projects’ resources. Project access is granted explicitly, per project, on top.
- The first user (the Owner) has everything. Every other member you invite gets a deliberately narrower scope.
Two domains: Account vs Project
Every permission in Raff is prefixed with one of two domains:
A member can hold roles in both domains independently. They can have the
Admin account role and a Viewer project role on customer1 — those are two separate grants, evaluated separately.
Crucially: an account-level role doesn’t grant project-level access automatically. If a member has Admin (account) but no project role on customer1, they cannot list, view, or touch any VM in customer1. They can manage account settings, invite members, generate API keys — but they have zero visibility into the actual workloads running inside projects unless explicitly granted a project role.
This is the safety property the model is designed around. Compliance, ops, and billing folks can hold powerful account-level roles without seeing customer data.
The Owner — special, automatic, and unique
The user who signs up the account is the Owner. This is automatic; you don’t pick it.
The Owner badge is the orange tag you see on the first row of the Members list. Every other member shows either
Account (the role you assigned at the account level) or Project-only (no account role; project roles only).
The Roles tab
The Roles tab on the Team & Projects page is where you see and manage all the role definitions in your account.
- ACCOUNT ROLES — applied to a member at the account level. The screenshot shows 3 system-provided ones
- PROJECT ROLES — applied to a member on a specific project. The screenshot shows 4 system-provided ones
+N more badge tells you how many additional permissions the row hides — click the eye icon to see them all.
The ⋮ menu offers different actions depending on the role’s type:

System roles vs Custom roles
Roles come in two types, shown by theType column:
The 7 System roles ship with every account. Most teams never need to create Custom roles — pick from the predefined ones until you genuinely need something the System set doesn’t cover.
For the full list of System roles and what each one’s permissions add up to, see Permissions matrix.
What a role’s permissions look like — Account example
Click the eye icon on the Admin account role to see what it actually grants.

- Permissions are grouped by category — Projects, Members, Roles, API Keys, Billing, Account Settings, Audit Log. Each category shows
(enabled / total)so you can see the role’s coverage at a glance. - The Admin role intentionally excludes destructive and billing permissions —
account.projects.delete,account.members.remove,account.roles.delete,account.apikeys.revoke, and the entire Billing category are all OFF. The role description (Account admin without billing) reflects this. - System roles can’t be modified — the toggles render but submission is blocked. To change behavior, copy into a Custom role.
- Permission names are dot-separated in
<domain>.<resource>.<action>form. Predictable and greppable.
What a role’s permissions look like — Project example
Click the eye icon on the Project Admin role to see the project-domain permission catalog.
- Categories are resources — Project Members, Virtual Machines, Networking, etc. — not account-level concepts like Billing
- Resource permissions like
vm.view,vm.create,vm.delete,vm.power,vm.manage,vm.consoleare individually toggleable - Project Admin has 40 permissions — the full project-domain set. Compare with Project Member (~11) and Viewer (~9) to see what each level peels back
How a member’s effective access is computed
When a member tries to do anything in the dashboard or via the API, Raff checks the action against their grants:Custom roles — when to build one
Reach for a Custom role when:- You need a permission combination none of the System roles offers (e.g. “can manage VMs but cannot delete them and cannot manage VPCs”)
- You want to remove a single permission from a System role for a specific subset of members
- You’re building a least-privilege role for a script / API key (give exactly the permissions the automation needs, nothing more)
Option 1 — Duplicate a System role (recommended starting point)
The fastest way: pick the System role closest to what you want, click⋮ → Duplicate. A new Custom role is created with the System role’s exact permission set, and you tweak from there. Most teams need a small variation on a System role — duplicate, rename, toggle one or two permissions, save.
The duplicate inherits the scope (account vs project) of the source — duplicating Project Admin produces a Project-scoped Custom role; duplicating Admin produces an Account-scoped one.
Option 2 — Create from scratch via ”+ Create Role”
The right path when no System role is close to what you want, or when you’re building a tightly-scoped role for automation. Click + Create Role in the top right of the Roles tab.
A few things about the Permissions area worth knowing:
- The total count depends on the scope. Account scope shows 21 permissions; Project scope shows 40 permissions. The live counter (
0 / 21 selected) updates as you toggle. - Bulk actions: Select All / Clear All at the top apply to the whole catalog.
- Per-category None: the None checkbox on the right of each category header turns off every permission in that category in one click — useful when you want everything except a specific category (e.g. “every Account permission except Billing”).
- Categories show their coverage:
(N/M)next to each category name —(0/4),(2/4),(4/4)— so you can see a role’s shape at a glance without expanding it.
Choosing scope at create time
The Scope dropdown is the most consequential choice in this dialog because it’s locked after creation:- Pick Account for roles that mix account-wide responsibilities — think “billing + audit”, “members admin without project access”, “support engineer with audit-only access”
- Pick Project for roles that touch project resources — anything involving VMs, VPCs, IPs, project members, project settings
After save
The new role appears in the Roles tab with TypeCustom. From the row’s ⋮ menu, you can Edit, Duplicate, and Delete. To assign the role to members:
- For a fresh invite: pick this role in the Invite Member dialog
- For an existing member: open the Members tab, click the row’s
⋮→ Change Role, pick this role
API keys use the same role model
API keys are created with the same Account / Project role pair members get — the key’s permissions come from a role you pick at create time, not from the creator’s identity. The Create API Key flow asks for:- Account Role — the key’s
account.*permission set (Owner / Admin / Billing / Member, or a Custom Account role) - Project Role + projects — the key’s
project.*permission set, applied to one or more selected projects (skipped when Step 1 is Owner, since Owner covers everything) - Expiration — auto-revoke after a fixed time
- Permissions Preview — the live preview of the resulting permission set
Related
Permissions matrix
The full list of system roles with every permission they grant.
Invite a member
Account vs project scope at invite time.
Change a role
Re-scope an existing member.