From 509ad9cc769a0c8bdd102122056ef66509769bf9 Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Tue, 24 Sep 2024 11:59:56 +0000 Subject: [PATCH 1/4] chore: add docs for roles --- .../advanced/platform/roles/+page.markdoc | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 src/routes/docs/advanced/platform/roles/+page.markdoc diff --git a/src/routes/docs/advanced/platform/roles/+page.markdoc b/src/routes/docs/advanced/platform/roles/+page.markdoc new file mode 100644 index 0000000000..ccb150ae41 --- /dev/null +++ b/src/routes/docs/advanced/platform/roles/+page.markdoc @@ -0,0 +1,32 @@ +--- +layout: article +title: Console Roles +description: Learn how to setup RBAC roles for the Appwrite Console +--- + +Roles + +The Appwrite Console supports granular permissions to improve team collaboration and security. Each members of your Console team can be assigned with a specific role that grant them access to specific areas in your organization’s projects. Below is a breakdown of the new roles available, detailing their permissions and intended use cases. + +> This page covers team roles for the Appwrite console. Visit the Auth product [roles documentation](https://appwrite.io/docs/products/auth/teams#permissions) if you want to learn more about roles for the [Teams service](https://appwrite.io/docs/references/cloud/client-web/teams). + +## Breakdown + +Owner +The highest level of access, the Owner role has full control over all aspects of the console, including team management, billing, and all development resources. Only owners can create new projects. + +Developer +Developers have access to all resources and scopes available to the Owner, with the exception of team management and billing writes. This role is ideal for team members focusing solely on development tasks. + +Editor +Editors can modify most resources but do not have write permissions for critical backend elements like collections, buckets, topics, and others. This role is intended for users who need to modify content or make changes but should not alter key infrastructure elements. This is great if you need to give access for updating your documents, creating messages or uploading files. + +Analyst +Analysts are limited to read-only access across all resources. This role is suitable for team members who need to view data, analytics, or reports but do not require editing permissions. + +Billing +Billing users are restricted to billing-related actions, with access to billing.read and billing.write scopes only. They can view and manage billing details but cannot interact with other parts of the system. + +## Custom roles + +Custom roles will soon be available on the Appwrite Console. Custom roles will be a Scale and Enterprise plans feature. \ No newline at end of file From f07a8750b493cf1415d402b6f691d9a6fe1030cf Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Tue, 24 Sep 2024 17:55:42 +0000 Subject: [PATCH 2/4] chore: add docs for the new roles --- .../docs/advanced/platform/+layout.svelte | 4 + .../advanced/platform/roles/+page.markdoc | 281 +++++++++++++++++- 2 files changed, 272 insertions(+), 13 deletions(-) diff --git a/src/routes/docs/advanced/platform/+layout.svelte b/src/routes/docs/advanced/platform/+layout.svelte index 2f4b939b6c..d47a57aa86 100644 --- a/src/routes/docs/advanced/platform/+layout.svelte +++ b/src/routes/docs/advanced/platform/+layout.svelte @@ -18,6 +18,10 @@ { label: 'Shortcuts', href: '/docs/advanced/platform/shortcuts' + }, + { + label: 'Roles', + href: '/docs/advanced/platform/roles' } ] }, diff --git a/src/routes/docs/advanced/platform/roles/+page.markdoc b/src/routes/docs/advanced/platform/roles/+page.markdoc index ccb150ae41..fd32c82720 100644 --- a/src/routes/docs/advanced/platform/roles/+page.markdoc +++ b/src/routes/docs/advanced/platform/roles/+page.markdoc @@ -1,32 +1,287 @@ --- layout: article -title: Console Roles +title: Roles description: Learn how to setup RBAC roles for the Appwrite Console --- -Roles +The Appwrite Console supports granular permissions to improve team collaboration and security. Each member of your Console team can be assigned a specific role that grants them access to certain areas of your organization's projects. Below is a breakdown of the new roles available, detailing their permissions and intended use cases. -The Appwrite Console supports granular permissions to improve team collaboration and security. Each members of your Console team can be assigned with a specific role that grant them access to specific areas in your organization’s projects. Below is a breakdown of the new roles available, detailing their permissions and intended use cases. +{% info title="Note" %} +This page covers team member roles for the Appwrite console. Visit the Auth product [roles documentation](https://appwrite.io/docs/products/auth/teams#permissions) if you want to learn more about roles for the [Teams service](https://appwrite.io/docs/references/cloud/client-web/teams). +{% /info %} -> This page covers team roles for the Appwrite console. Visit the Auth product [roles documentation](https://appwrite.io/docs/products/auth/teams#permissions) if you want to learn more about roles for the [Teams service](https://appwrite.io/docs/references/cloud/client-web/teams). - -## Breakdown - -Owner +## Owner {% #owner %} The highest level of access, the Owner role has full control over all aspects of the console, including team management, billing, and all development resources. Only owners can create new projects. -Developer +## Developer {% #developer %} Developers have access to all resources and scopes available to the Owner, with the exception of team management and billing writes. This role is ideal for team members focusing solely on development tasks. -Editor +## Editor {% #editor %} Editors can modify most resources but do not have write permissions for critical backend elements like collections, buckets, topics, and others. This role is intended for users who need to modify content or make changes but should not alter key infrastructure elements. This is great if you need to give access for updating your documents, creating messages or uploading files. -Analyst +## Analyst {% #analyst %} Analysts are limited to read-only access across all resources. This role is suitable for team members who need to view data, analytics, or reports but do not require editing permissions. -Billing +## Billing {% #billing %} Billing users are restricted to billing-related actions, with access to billing.read and billing.write scopes only. They can view and manage billing details but cannot interact with other parts of the system. -## Custom roles +## Scopes {% #scopes %} +Here is a detailed breakdown of the allowed scopes for each of the above roles + +{% table %} +* Scope +* Billing {% align="center" %} {% width=28 %} +* Analyst {% align="center" %} {% width=28 %} +* Editor {% align="center" %} {% width=28 %} +* Developer {% align="center" %} {% width=28 %} +* Owner {% align="center" %} {% width=28 %} +--- +* `billing.read` +* {% icon icon="check" /%} {% align="center" %} +* +* +* +* {% icon icon="check" /%} {% align="center" %} +--- +* `billing.write` +* {% icon icon="check" /%} {% align="center" %} +* +* +* +* {% icon icon="check" /%} {% align="center" %} +--- +* `teams.read` +* {% icon icon="check" /%} {% align="center" %} +* {% icon icon="check" /%} {% align="center" %} +* {% icon icon="check" /%} {% align="center" %} +* {% icon icon="check" /%} {% align="center" %} +* {% icon icon="check" /%} {% align="center" %} +--- +* `users.read` +* +* {% icon icon="check" /%} {% align="center" %} +* {% icon icon="check" /%} {% align="center" %} +* {% icon icon="check" /%} {% align="center" %} +* {% icon icon="check" /%} {% align="center" %} +--- +* `databases.read` +* +* {% icon icon="check" /%} {% align="center" %} +* {% icon icon="check" /%} {% align="center" %} +* {% icon icon="check" /%} {% align="center" %} +* {% icon icon="check" /%} {% align="center" %} +--- +* `collections.read` +* +* {% icon icon="check" /%} {% align="center" %} +* {% icon icon="check" /%} {% align="center" %} +* {% icon icon="check" /%} {% align="center" %} +* {% icon icon="check" /%} {% align="center" %} +--- +* `attributes.read` +* +* {% icon icon="check" /%} {% align="center" %} +* {% icon icon="check" /%} {% align="center" %} +* {% icon icon="check" /%} {% align="center" %} +* {% icon icon="check" /%} {% align="center" %} +--- +* `indexes.read` +* +* {% icon icon="check" /%} {% align="center" %} +* {% icon icon="check" /%} {% align="center" %} +* {% icon icon="check" /%} {% align="center" %} +* {% icon icon="check" /%} {% align="center" %} +--- +* `documents.read` +* +* {% icon icon="check" /%} {% align="center" %} +* {% icon icon="check" /%} {% align="center" %} +* {% icon icon="check" /%} {% align="center" %} +* {% icon icon="check" /%} {% align="center" %} +--- +* `files.read` +* +* {% icon icon="check" /%} {% align="center" %} +* {% icon icon="check" /%} {% align="center" %} +* {% icon icon="check" /%} {% align="center" %} +* {% icon icon="check" /%} {% align="center" %} +--- +* `buckets.read` +* +* {% icon icon="check" /%} {% align="center" %} +* {% icon icon="check" /%} {% align="center" %} +* {% icon icon="check" /%} {% align="center" %} +* {% icon icon="check" /%} {% align="center" %} +--- +* `functions.read` +* +* {% icon icon="check" /%} {% align="center" %} +* {% icon icon="check" /%} {% align="center" %} +* {% icon icon="check" /%} {% align="center" %} +* {% icon icon="check" /%} {% align="center" %} +--- +* `execution.read` +* +* {% icon icon="check" /%} {% align="center" %} +* {% icon icon="check" /%} {% align="center" %} +* {% icon icon="check" /%} {% align="center" %} +* {% icon icon="check" /%} {% align="center" %} +--- +* `rules.read` +* +* {% icon icon="check" /%} {% align="center" %} +* {% icon icon="check" /%} {% align="center" %} +* {% icon icon="check" /%} {% align="center" %} +* {% icon icon="check" /%} {% align="center" %} +--- +* `migrations.read` +* +* {% icon icon="check" /%} {% align="center" %} +* {% icon icon="check" /%} {% align="center" %} +* {% icon icon="check" /%} {% align="center" %} +* {% icon icon="check" /%} {% align="center" %} +--- +* `vcs.read` +* +* {% icon icon="check" /%} {% align="center" %} +* {% icon icon="check" /%} {% align="center" %} +* {% icon icon="check" /%} {% align="center" %} +* {% icon icon="check" /%} {% align="center" %} +--- +* `locale.read` +* +* {% icon icon="check" /%} {% align="center" %} +* {% icon icon="check" /%} {% align="center" %} +* {% icon icon="check" /%} {% align="center" %} +* {% icon icon="check" /%} {% align="center" %} +--- +* `avatars.read` +* +* {% icon icon="check" /%} {% align="center" %} +* {% icon icon="check" /%} {% align="center" %} +* {% icon icon="check" /%} {% align="center" %} +* {% icon icon="check" /%} {% align="center" %} +--- +* `health.read` +* +* {% icon icon="check" /%} {% align="center" %} +* {% icon icon="check" /%} {% align="center" %} +* {% icon icon="check" /%} {% align="center" %} +* {% icon icon="check" /%} {% align="center" %} +--- +* `assistant.read` +* +* {% icon icon="check" /%} {% align="center" %} +* {% icon icon="check" /%} {% align="center" %} +* {% icon icon="check" /%} {% align="center" %} +* {% icon icon="check" /%} {% align="center" %} +--- +* `documents.write` +* +* +* {% icon icon="check" /%} {% align="center" %} +* {% icon icon="check" /%} {% align="center" %} +* {% icon icon="check" /%} {% align="center" %} +--- +* `files.write` +* +* +* {% icon icon="check" /%} {% align="center" %} +* {% icon icon="check" /%} {% align="center" %} +* {% icon icon="check" /%} {% align="center" %} +--- +* `execution.write` +* +* +* {% icon icon="check" /%} {% align="center" %} +* {% icon icon="check" /%} {% align="center" %} +* {% icon icon="check" /%} {% align="center" %} +--- +* `teams.write` +* +* +* +* {% icon icon="check" /%} {% align="center" %} +* {% icon icon="check" /%} {% align="center" %} +--- +* `users.write` +* +* +* +* {% icon icon="check" /%} {% align="center" %} +* {% icon icon="check" /%} {% align="center" %} +--- +* `databases.write` +* +* +* +* {% icon icon="check" /%} {% align="center" %} +* {% icon icon="check" /%} {% align="center" %} +--- +* `collections.write` +* +* +* +* {% icon icon="check" /%} {% align="center" %} +* {% icon icon="check" /%} {% align="center" %} +--- +* `attributes.write` +* +* +* +* {% icon icon="check" /%} {% align="center" %} +* {% icon icon="check" /%} {% align="center" %} +--- +* `indexes.write` +* +* +* +* {% icon icon="check" /%} {% align="center" %} +* {% icon icon="check" /%} {% align="center" %} +--- +* `buckets.write` +* +* +* +* {% icon icon="check" /%} {% align="center" %} +* {% icon icon="check" /%} {% align="center" %} +--- +* `functions.write` +* +* +* +* {% icon icon="check" /%} {% align="center" %} +* {% icon icon="check" /%} {% align="center" %} +--- +* `rules.write` +* +* +* +* {% icon icon="check" /%} {% align="center" %} +* {% icon icon="check" /%} {% align="center" %} +--- +* `migrations.write` +* +* +* +* {% icon icon="check" /%} {% align="center" %} +* {% icon icon="check" /%} {% align="center" %} +--- +* `vcs.write` +* +* +* +* {% icon icon="check" /%} {% align="center" %} +* {% icon icon="check" /%} {% align="center" %} +--- +* `projects.write` +* +* +* +* +* {% icon icon="check" /%} {% align="center" %} +{% /table %} + +## Custom roles {% #custom-roles %} Custom roles will soon be available on the Appwrite Console. Custom roles will be a Scale and Enterprise plans feature. \ No newline at end of file From decb0050ecf8f74ad922db08461fbe37f45a257d Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Wed, 25 Sep 2024 00:38:00 +0400 Subject: [PATCH 3/4] Apply suggestions from code review Co-authored-by: Steven Nguyen <1477010+stnguyen90@users.noreply.github.com> --- .../docs/advanced/platform/roles/+page.markdoc | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/routes/docs/advanced/platform/roles/+page.markdoc b/src/routes/docs/advanced/platform/roles/+page.markdoc index fd32c82720..a4a808a347 100644 --- a/src/routes/docs/advanced/platform/roles/+page.markdoc +++ b/src/routes/docs/advanced/platform/roles/+page.markdoc @@ -1,32 +1,32 @@ --- layout: article title: Roles -description: Learn how to setup RBAC roles for the Appwrite Console +description: Learn how to setup role-based access controls in the Appwrite Console --- The Appwrite Console supports granular permissions to improve team collaboration and security. Each member of your Console team can be assigned a specific role that grants them access to certain areas of your organization's projects. Below is a breakdown of the new roles available, detailing their permissions and intended use cases. {% info title="Note" %} -This page covers team member roles for the Appwrite console. Visit the Auth product [roles documentation](https://appwrite.io/docs/products/auth/teams#permissions) if you want to learn more about roles for the [Teams service](https://appwrite.io/docs/references/cloud/client-web/teams). +This page covers organization member roles for the Appwrite Console. Visit the Auth [roles documentation](https://appwrite.io/docs/products/auth/teams#permissions) if you want to learn more about roles for the [Teams service](https://appwrite.io/docs/references/cloud/client-web/teams). {% /info %} ## Owner {% #owner %} -The highest level of access, the Owner role has full control over all aspects of the console, including team management, billing, and all development resources. Only owners can create new projects. +The highest level of access, the Owner role has full control over all aspects of the Console, including team management, billing, and all development resources. Only owners can create new projects. ## Developer {% #developer %} Developers have access to all resources and scopes available to the Owner, with the exception of team management and billing writes. This role is ideal for team members focusing solely on development tasks. ## Editor {% #editor %} -Editors can modify most resources but do not have write permissions for critical backend elements like collections, buckets, topics, and others. This role is intended for users who need to modify content or make changes but should not alter key infrastructure elements. This is great if you need to give access for updating your documents, creating messages or uploading files. +Editors can modify most resources but do not have write permissions for critical backend elements like collections, buckets, topics, and others. This role is intended for users who need to modify content or make changes but should not alter key infrastructure elements. This is great if you need to give access for updating your documents, creating messages, or uploading files. ## Analyst {% #analyst %} Analysts are limited to read-only access across all resources. This role is suitable for team members who need to view data, analytics, or reports but do not require editing permissions. ## Billing {% #billing %} -Billing users are restricted to billing-related actions, with access to billing.read and billing.write scopes only. They can view and manage billing details but cannot interact with other parts of the system. +Billing users are restricted to billing-related actions, with access to `billing.read` and `billing.write` scopes only. They can view and manage billing details but cannot interact with other parts of the system. ## Scopes {% #scopes %} -Here is a detailed breakdown of the allowed scopes for each of the above roles +Below is a detailed breakdown of the allowed scopes for each of the above roles. {% table %} * Scope From f04eba422982ff7539b4a50802acaae6a12a8412 Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Tue, 24 Sep 2024 20:38:23 +0000 Subject: [PATCH 4/4] chore: remove table --- .../advanced/platform/roles/+page.markdoc | 258 ------------------ 1 file changed, 258 deletions(-) diff --git a/src/routes/docs/advanced/platform/roles/+page.markdoc b/src/routes/docs/advanced/platform/roles/+page.markdoc index fd32c82720..cc39796f71 100644 --- a/src/routes/docs/advanced/platform/roles/+page.markdoc +++ b/src/routes/docs/advanced/platform/roles/+page.markdoc @@ -25,263 +25,5 @@ Analysts are limited to read-only access across all resources. This role is suit ## Billing {% #billing %} Billing users are restricted to billing-related actions, with access to billing.read and billing.write scopes only. They can view and manage billing details but cannot interact with other parts of the system. -## Scopes {% #scopes %} -Here is a detailed breakdown of the allowed scopes for each of the above roles - -{% table %} -* Scope -* Billing {% align="center" %} {% width=28 %} -* Analyst {% align="center" %} {% width=28 %} -* Editor {% align="center" %} {% width=28 %} -* Developer {% align="center" %} {% width=28 %} -* Owner {% align="center" %} {% width=28 %} ---- -* `billing.read` -* {% icon icon="check" /%} {% align="center" %} -* -* -* -* {% icon icon="check" /%} {% align="center" %} ---- -* `billing.write` -* {% icon icon="check" /%} {% align="center" %} -* -* -* -* {% icon icon="check" /%} {% align="center" %} ---- -* `teams.read` -* {% icon icon="check" /%} {% align="center" %} -* {% icon icon="check" /%} {% align="center" %} -* {% icon icon="check" /%} {% align="center" %} -* {% icon icon="check" /%} {% align="center" %} -* {% icon icon="check" /%} {% align="center" %} ---- -* `users.read` -* -* {% icon icon="check" /%} {% align="center" %} -* {% icon icon="check" /%} {% align="center" %} -* {% icon icon="check" /%} {% align="center" %} -* {% icon icon="check" /%} {% align="center" %} ---- -* `databases.read` -* -* {% icon icon="check" /%} {% align="center" %} -* {% icon icon="check" /%} {% align="center" %} -* {% icon icon="check" /%} {% align="center" %} -* {% icon icon="check" /%} {% align="center" %} ---- -* `collections.read` -* -* {% icon icon="check" /%} {% align="center" %} -* {% icon icon="check" /%} {% align="center" %} -* {% icon icon="check" /%} {% align="center" %} -* {% icon icon="check" /%} {% align="center" %} ---- -* `attributes.read` -* -* {% icon icon="check" /%} {% align="center" %} -* {% icon icon="check" /%} {% align="center" %} -* {% icon icon="check" /%} {% align="center" %} -* {% icon icon="check" /%} {% align="center" %} ---- -* `indexes.read` -* -* {% icon icon="check" /%} {% align="center" %} -* {% icon icon="check" /%} {% align="center" %} -* {% icon icon="check" /%} {% align="center" %} -* {% icon icon="check" /%} {% align="center" %} ---- -* `documents.read` -* -* {% icon icon="check" /%} {% align="center" %} -* {% icon icon="check" /%} {% align="center" %} -* {% icon icon="check" /%} {% align="center" %} -* {% icon icon="check" /%} {% align="center" %} ---- -* `files.read` -* -* {% icon icon="check" /%} {% align="center" %} -* {% icon icon="check" /%} {% align="center" %} -* {% icon icon="check" /%} {% align="center" %} -* {% icon icon="check" /%} {% align="center" %} ---- -* `buckets.read` -* -* {% icon icon="check" /%} {% align="center" %} -* {% icon icon="check" /%} {% align="center" %} -* {% icon icon="check" /%} {% align="center" %} -* {% icon icon="check" /%} {% align="center" %} ---- -* `functions.read` -* -* {% icon icon="check" /%} {% align="center" %} -* {% icon icon="check" /%} {% align="center" %} -* {% icon icon="check" /%} {% align="center" %} -* {% icon icon="check" /%} {% align="center" %} ---- -* `execution.read` -* -* {% icon icon="check" /%} {% align="center" %} -* {% icon icon="check" /%} {% align="center" %} -* {% icon icon="check" /%} {% align="center" %} -* {% icon icon="check" /%} {% align="center" %} ---- -* `rules.read` -* -* {% icon icon="check" /%} {% align="center" %} -* {% icon icon="check" /%} {% align="center" %} -* {% icon icon="check" /%} {% align="center" %} -* {% icon icon="check" /%} {% align="center" %} ---- -* `migrations.read` -* -* {% icon icon="check" /%} {% align="center" %} -* {% icon icon="check" /%} {% align="center" %} -* {% icon icon="check" /%} {% align="center" %} -* {% icon icon="check" /%} {% align="center" %} ---- -* `vcs.read` -* -* {% icon icon="check" /%} {% align="center" %} -* {% icon icon="check" /%} {% align="center" %} -* {% icon icon="check" /%} {% align="center" %} -* {% icon icon="check" /%} {% align="center" %} ---- -* `locale.read` -* -* {% icon icon="check" /%} {% align="center" %} -* {% icon icon="check" /%} {% align="center" %} -* {% icon icon="check" /%} {% align="center" %} -* {% icon icon="check" /%} {% align="center" %} ---- -* `avatars.read` -* -* {% icon icon="check" /%} {% align="center" %} -* {% icon icon="check" /%} {% align="center" %} -* {% icon icon="check" /%} {% align="center" %} -* {% icon icon="check" /%} {% align="center" %} ---- -* `health.read` -* -* {% icon icon="check" /%} {% align="center" %} -* {% icon icon="check" /%} {% align="center" %} -* {% icon icon="check" /%} {% align="center" %} -* {% icon icon="check" /%} {% align="center" %} ---- -* `assistant.read` -* -* {% icon icon="check" /%} {% align="center" %} -* {% icon icon="check" /%} {% align="center" %} -* {% icon icon="check" /%} {% align="center" %} -* {% icon icon="check" /%} {% align="center" %} ---- -* `documents.write` -* -* -* {% icon icon="check" /%} {% align="center" %} -* {% icon icon="check" /%} {% align="center" %} -* {% icon icon="check" /%} {% align="center" %} ---- -* `files.write` -* -* -* {% icon icon="check" /%} {% align="center" %} -* {% icon icon="check" /%} {% align="center" %} -* {% icon icon="check" /%} {% align="center" %} ---- -* `execution.write` -* -* -* {% icon icon="check" /%} {% align="center" %} -* {% icon icon="check" /%} {% align="center" %} -* {% icon icon="check" /%} {% align="center" %} ---- -* `teams.write` -* -* -* -* {% icon icon="check" /%} {% align="center" %} -* {% icon icon="check" /%} {% align="center" %} ---- -* `users.write` -* -* -* -* {% icon icon="check" /%} {% align="center" %} -* {% icon icon="check" /%} {% align="center" %} ---- -* `databases.write` -* -* -* -* {% icon icon="check" /%} {% align="center" %} -* {% icon icon="check" /%} {% align="center" %} ---- -* `collections.write` -* -* -* -* {% icon icon="check" /%} {% align="center" %} -* {% icon icon="check" /%} {% align="center" %} ---- -* `attributes.write` -* -* -* -* {% icon icon="check" /%} {% align="center" %} -* {% icon icon="check" /%} {% align="center" %} ---- -* `indexes.write` -* -* -* -* {% icon icon="check" /%} {% align="center" %} -* {% icon icon="check" /%} {% align="center" %} ---- -* `buckets.write` -* -* -* -* {% icon icon="check" /%} {% align="center" %} -* {% icon icon="check" /%} {% align="center" %} ---- -* `functions.write` -* -* -* -* {% icon icon="check" /%} {% align="center" %} -* {% icon icon="check" /%} {% align="center" %} ---- -* `rules.write` -* -* -* -* {% icon icon="check" /%} {% align="center" %} -* {% icon icon="check" /%} {% align="center" %} ---- -* `migrations.write` -* -* -* -* {% icon icon="check" /%} {% align="center" %} -* {% icon icon="check" /%} {% align="center" %} ---- -* `vcs.write` -* -* -* -* {% icon icon="check" /%} {% align="center" %} -* {% icon icon="check" /%} {% align="center" %} ---- -* `projects.write` -* -* -* -* -* {% icon icon="check" /%} {% align="center" %} -{% /table %} - - ## Custom roles {% #custom-roles %} Custom roles will soon be available on the Appwrite Console. Custom roles will be a Scale and Enterprise plans feature. \ No newline at end of file