appwrite-cli

Appwrite CLI skill. Use when managing Appwrite projects from the command line. Covers installation, login, project initialization, multi-file project…

INSTALLATION
npx skills add https://github.com/appwrite/agent-skills --skill appwrite-cli
Run in your project or agent environment. Adjust flags if your CLI version differs.

SKILL.md

$27

Verify installation:

appwrite -v

Login & Initialization

# Login to your account

appwrite login

# Login to a self-hosted instance

appwrite login --endpoint "https://your-instance.com/v1"

# Switch to a different saved account

appwrite login --switch

# Initialize a project (creates appwrite.config.json)

appwrite init project

# Verify by fetching project info

appwrite projects get --project-id "<PROJECT_ID>"

appwrite whoami can show https://cloud.appwrite.io/v1 as the account login endpoint. That is expected for Appwrite Cloud login. Do not rewrite it to a regional endpoint. Only project configuration and project-scoped API calls use the region endpoint, such as https://<REGION>.cloud.appwrite.io/v1.

Configuration

# Switch endpoint/project for scripted use

appwrite client --endpoint "https://<REGION>.cloud.appwrite.io/v1"

appwrite client --project-id "<PROJECT_ID>"

For the full list of CLI commands, see CLI Commands.

For headless / CI/CD usage, see Non-Interactive Mode.

appwrite.config.json

Resources can be configured inline in appwrite.config.json or split into separate JSON array files using includes.

{

    "projectId": "<PROJECT_ID>",

    "projectName": "Production",

    "endpoint": "https://<REGION>.cloud.appwrite.io/v1",

    "includes": {

        "functions": "appwrite/functions.json",

        "sites": "appwrite/sites.json",

        "webhooks": "appwrite/webhooks.json"

    },

    "settings": {

        "services": {

            "account": true,

            "databases": true,

            "functions": true,

            "sites": true,

            "messaging": true

        },

        "protocols": {

            "rest": true,

            "graphql": true,

            "websocket": true

        },

        "auth": {

            "methods": {

                "email-password": true,

                "magic-url": true

            },

            "security": {

                "sessionsLimit": 10,

                "passwordDictionary": true

            }

        }

    },

    "tablesDB": [],

    "tables": [],

    "buckets": [],

    "teams": [],

    "topics": []

}

Each includes value must be a relative .json path inside the project directory and must point to a JSON array. A resource cannot be defined both inline and in includes. When functions or sites are included, their path values are resolved relative to the include file directory.

Example appwrite/functions.json:

[

    {

        "$id": "<FUNCTION_ID>",

        "name": "userAuth",

        "enabled": true,

        "logging": true,

        "runtime": "node-22",

        "buildSpecification": "s-1vcpu-512mb",

        "runtimeSpecification": "s-1vcpu-512mb",

        "deploymentRetention": 7,

        "events": [],

        "schedule": "",

        "timeout": 15,

        "entrypoint": "src/main.js",

        "commands": "npm install",

        "ignore": "node_modules\n.tmp",

        "path": "../functions/userAuth"

    }

]

Pull and push project configuration

# Pull or push everything

appwrite pull all --all

appwrite push all --all

# Pull or push individual resource groups

appwrite pull settings

appwrite push settings

appwrite pull webhooks

appwrite push webhooks

appwrite pull functions

appwrite push functions

Deploying Functions

# Create a new function

appwrite init functions

# Pull existing functions from Console

appwrite pull functions

# Deploy functions

appwrite push functions

Function configuration in appwrite.config.json

{

    "functions": [

        {

            "$id": "<FUNCTION_ID>",

            "name": "userAuth",

            "enabled": true,

            "logging": true,

            "runtime": "node-22",

            "buildSpecification": "s-1vcpu-512mb",

            "runtimeSpecification": "s-1vcpu-512mb",

            "deploymentRetention": 7,

            "scopes": [],

            "events": [],

            "schedule": "",

            "timeout": 15,

            "entrypoint": "src/main.js",

            "commands": "npm install",

            "ignore": "node_modules\n.tmp",

            "path": "functions/userAuth"

        }

    ]

}

Key function config fields:

Field

Description

enabled

Enables or disables the function. Disabled functions cannot be executed.

logging

Stores execution logs for debugging and observability.

runtime

Runtime used to execute the function, such as node-22.

buildSpecification

Compute specification used while building the deployment.

runtimeSpecification

Compute specification used while running executions.

deploymentRetention

Number of days to retain old deployments before they are automatically deleted.

scopes

API scopes granted to the function's generated execution key.

events

Event patterns that trigger the function.

schedule

Cron expression for scheduled execution. Empty string disables scheduling.

timeout

Maximum execution duration in seconds.

entrypoint

File inside path that starts the function.

commands

Build/install command run before deployment.

ignore

Extra newline-separated ignore rules used when packaging code. .gitignore is read automatically.

path

Local function source directory. If configured through includes, this is resolved relative to the include file.

Function commands

Command

Description

appwrite functions list

List all functions

appwrite functions create

Create a new function

appwrite functions get --function-id <ID>

Get a function by ID

appwrite functions update --function-id <ID>

Update a function

appwrite functions delete --function-id <ID>

Delete a function

appwrite functions list-runtimes

List all active runtimes

appwrite functions list-deployments --function-id <ID>

List deployments

appwrite functions create-deployment --function-id <ID>

Upload a new deployment

appwrite functions update-deployment --function-id <ID> --deployment-id <ID>

Set active deployment

appwrite functions delete-deployment --function-id <ID> --deployment-id <ID>

Delete a deployment

appwrite functions download-deployment --function-id <ID> --deployment-id <ID>

Download deployment

appwrite functions create-execution --function-id <ID>

Trigger execution

appwrite functions list-executions --function-id <ID>

List execution logs

appwrite functions get-execution --function-id <ID> --execution-id <ID>

Get execution log

appwrite functions list-variables --function-id <ID>

List variables

appwrite functions create-variable --function-id <ID> --key <KEY> --value <VALUE>

Create variable

appwrite functions update-variable --function-id <ID> --variable-id <ID> --key <KEY> --value <VALUE>

Update variable

appwrite functions delete-variable --function-id <ID> --variable-id <ID>

Delete variable

List functions with flag-based queries

Prefer the query flags for common filtering, sorting, and pagination. Use --queries only for raw Appwrite JSON query strings or advanced automation.

appwrite functions list \

    --where 'name=api' \

    --sort-desc '$createdAt' \

    --limit 10 \

    --offset 0 \

    --json

appwrite functions list-deployments \

    --function-id <FUNCTION_ID> \

    --limit 5 \

    --cursor-after <DEPLOYMENT_ID>

Trigger a function with body

appwrite functions create-execution \

    --function-id <FUNCTION_ID> \

    --body '{"key": "value"}'

Local development

appwrite run functions

Deployment activation

# Deploy and activate the deployment

appwrite push functions --function-id <FUNCTION_ID> --activate

# Deploy without switching live traffic

appwrite push functions --function-id <FUNCTION_ID> --activate=false

Function variables

Do not define function variables in appwrite.config.json. Put them in a .env file inside the configured function path. Variables are saved after they are pushed, so use --with-variables only when you want to create, replace, or remove the remote variables from the local .env file.

# functions/userAuth/.env

PUBLIC_FLAG=enabled

SECRET_TOKEN=replace-me

# Sync function variables from .env

appwrite push functions --function-id <FUNCTION_ID> --with-variables

# Push code without changing saved variables

appwrite push functions --function-id <FUNCTION_ID>

# Run locally with variables fetched from function settings

appwrite run functions --with-variables

Deploying Sites

# Create a new site

appwrite init sites

# Pull existing sites from Console

appwrite pull sites

# Deploy sites

appwrite push sites

Site configuration in appwrite.config.json

{

    "sites": [

        {

            "$id": "<SITE_ID>",

            "name": "Documentation template",

            "logging": true,

            "framework": "astro",

            "timeout": 30,

            "installCommand": "npm install",

            "buildCommand": "npm run build",

            "outputDirectory": "./dist",

            "buildSpecification": "s-1vcpu-512mb",

            "runtimeSpecification": "s-1vcpu-512mb",

            "buildRuntime": "node-22",

            "adapter": "ssr",

            "fallbackFile": "",

            "startCommand": "npm run start",

            "deploymentRetention": 7,

            "path": "sites/documentation-template"

        }

    ]

}

Key site config fields:

Field

Description

logging

Stores site request and build logs.

framework

Framework preset used for build and deployment defaults.

timeout

Maximum request or function duration in seconds for server-rendered sites.

installCommand

Command used to install dependencies.

buildCommand

Command used to build the site.

outputDirectory

Directory containing static build output.

buildSpecification

Compute specification used while building the deployment.

runtimeSpecification

Compute specification used while serving runtime workloads.

buildRuntime

Runtime used to build the site, such as node-22.

adapter

Deployment adapter, such as static or SSR behavior.

fallbackFile

Fallback file for SPA routing or missing routes.

startCommand

Command used to start server-rendered output.

deploymentRetention

Number of days to retain old deployments before they are automatically deleted.

path

Local site source directory. If configured through includes, this is resolved relative to the include file.

Site commands

Command

Description

appwrite sites list

List all sites

appwrite sites create

Create a new site

appwrite sites get --site-id <ID>

Get a site by ID

appwrite sites update --site-id <ID>

Update a site

appwrite sites delete --site-id <ID>

Delete a site

appwrite sites list-frameworks

List available frameworks

appwrite sites list-specifications

List allowed specs

appwrite sites list-templates

List available templates

appwrite sites get-template --template-id <ID>

Get template details

appwrite sites list-deployments --site-id <ID>

List deployments

appwrite sites create-deployment --site-id <ID>

Create deployment

appwrite sites get-deployment --site-id <ID> --deployment-id <ID>

Get deployment

appwrite sites delete-deployment --site-id <ID> --deployment-id <ID>

Delete deployment

appwrite sites update-site-deployment --site-id <ID> --deployment-id <ID>

Set active deployment

appwrite sites update-deployment-status --site-id <ID> --deployment-id <ID>

Cancel ongoing build

appwrite sites list-variables --site-id <ID>

List variables

appwrite sites create-variable --site-id <ID> --key <KEY> --value <VALUE>

Create variable

appwrite sites update-variable --site-id <ID> --variable-id <ID> --key <KEY> --value <VALUE>

Update variable

appwrite sites delete-variable --site-id <ID> --variable-id <ID>

Delete variable

appwrite sites list-logs --site-id <ID>

List request logs

appwrite sites get-log --site-id <ID> --log-id <ID>

Get a log

appwrite sites delete-log --site-id <ID> --log-id <ID>

Delete a log

Site variables

Do not define site variables in appwrite.config.json. Put them in a .env file inside the configured site path. Variables are saved after they are pushed, so use --with-variables only when you want to create, replace, or remove the remote variables from the local .env file.

# sites/documentation-template/.env

PUBLIC_SITE_NAME=docs

appwrite push sites --site-id <SITE_ID> --with-variables

# Push code without changing saved variables

appwrite push sites --site-id <SITE_ID>

Managing Tables (Databases)

# Create a new table

appwrite init tables

# Pull existing tables from Console

appwrite pull tables

# Deploy tables

appwrite push tables

Table configuration in appwrite.config.json

{

    "tablesDB": [

        {

            "$id": "<DATABASE_ID>",

            "name": "songs",

            "enabled": true

        }

    ],

    "tables": [

        {

            "$id": "<TABLE_ID>",

            "$permissions": ["create(\"any\")", "read(\"any\")"],

            "databaseId": "<DATABASE_ID>",

            "name": "music",

            "enabled": true,

            "rowSecurity": false,

            "columns": [

                {

                    "key": "title",

                    "type": "varchar",

                    "required": true,

                    "size": 255

                }

            ],

            "indexes": []

        }

    ]

}

Database commands (TablesDB)

Command

Description

appwrite tables-db list-tables --database-id <ID>

List tables

appwrite tables-db create-table --database-id <ID>

Create table

appwrite tables-db get-table --database-id <ID> --table-id <ID>

Get table

appwrite tables-db update-table --database-id <ID> --table-id <ID>

Update table

appwrite tables-db delete-table --database-id <ID> --table-id <ID>

Delete table

appwrite tables-db list-columns --database-id <ID> --table-id <ID>

List columns

appwrite tables-db get-column --database-id <ID> --table-id <ID> --key <KEY>

Get column

appwrite tables-db delete-column --database-id <ID> --table-id <ID> --key <KEY>

Delete column

appwrite tables-db list-column-indexes --database-id <ID> --table-id <ID>

List indexes

appwrite tables-db create-column-index --database-id <ID> --table-id <ID>

Create index

appwrite tables-db delete-column-index --database-id <ID> --table-id <ID> --key <KEY>

Delete index

Column type commands

Note: The legacy string type is deprecated. Use explicit string column types instead.

Command

Description

create-varchar-column

Varchar column — inline storage, fully indexable (max 16,383 chars, size ≤ 768 for full index)

create-text-column

Text column — off-page storage, prefix index only (max 16,383 chars)

create-mediumtext-column

Mediumtext column — off-page storage (max ~4M chars)

create-longtext-column

Longtext column — off-page storage (max ~1B chars)

create-boolean-column

Boolean column

create-integer-column

Integer column (optional min/max)

create-float-column

Float column (optional min/max)

create-email-column

Email column

create-url-column

URL column

create-ip-column

IP address column

create-datetime-column

Datetime column (ISO 8601)

create-enum-column

Enum column (whitelist of accepted values)

create-relationship-column

Relationship column

All column commands use appwrite tables-db <command> --database-id <ID> --table-id <ID>.

Row operations

# Create a row

appwrite tables-db create-row \

    --database-id "<DATABASE_ID>" --table-id "<TABLE_ID>" \

    --row-id 'unique()' --data '{ "title": "Hello World" }' \

    --permissions 'read("any")' 'write("team:abc")'

# List rows (JSON output)

appwrite tables-db list-rows \

    --database-id "<DATABASE_ID>" --table-id "<TABLE_ID>" --json

# Get a row

appwrite tables-db get-row \

    --database-id "<DATABASE_ID>" --table-id "<TABLE_ID>" --row-id "<ROW_ID>"

List rows and documents with query flags

Use --where, --sort-asc, --sort-desc, --limit, --offset, --cursor-after, and --cursor-before on list commands. Row and document list/get commands also support repeated --select flags.

appwrite tables-db list-rows \

    --database-id "<DATABASE_ID>" \

    --table-id "<TABLE_ID>" \

    --where 'status=active' \

    --where 'score>=10' \

    --sort-asc 'name' \

    --select '$id' \

    --select 'name' \

    --limit 25 \

    --json

appwrite databases list-documents \

    --database-id "<DATABASE_ID>" \

    --collection-id "<COLLECTION_ID>" \

    --where 'email!=null' \

    --cursor-before "<DOCUMENT_ID>"

--where parses strings, numbers, booleans, null, and JSON arrays. Supported operators are =, !=, >, >=, <, and <=.

Managing Buckets (Storage)

# Create a new bucket

appwrite init buckets

# Pull existing buckets from Console

appwrite pull buckets

# Deploy buckets

appwrite push buckets

Storage commands

Command

Description

appwrite storage list-buckets

List all buckets

appwrite storage create-bucket

Create a bucket

appwrite storage get-bucket --bucket-id <ID>

Get a bucket

appwrite storage update-bucket --bucket-id <ID>

Update a bucket

appwrite storage delete-bucket --bucket-id <ID>

Delete a bucket

appwrite storage list-files --bucket-id <ID>

List files

appwrite storage create-file --bucket-id <ID>

Upload a file

appwrite storage get-file --bucket-id <ID> --file-id <ID>

Get file metadata

appwrite storage delete-file --bucket-id <ID> --file-id <ID>

Delete a file

appwrite storage get-file-download --bucket-id <ID> --file-id <ID>

Download a file

appwrite storage get-file-preview --bucket-id <ID> --file-id <ID>

Get image preview

appwrite storage get-file-view --bucket-id <ID> --file-id <ID>

View file in browser

Managing Teams

# Create a new team

appwrite init teams

# Pull existing teams from Console

appwrite pull teams

# Deploy teams

appwrite push teams

Team commands

Command

Description

appwrite teams list

List all teams

appwrite teams create

Create a team

appwrite teams get --team-id <ID>

Get a team

appwrite teams update-name --team-id <ID>

Update team name

appwrite teams delete --team-id <ID>

Delete a team

appwrite teams list-memberships --team-id <ID>

List members

appwrite teams create-membership --team-id <ID>

Invite a member

appwrite teams update-membership --team-id <ID> --membership-id <ID>

Update member roles

appwrite teams delete-membership --team-id <ID> --membership-id <ID>

Remove a member

appwrite teams get-prefs --team-id <ID>

Get team preferences

appwrite teams update-prefs --team-id <ID>

Update team preferences

Managing Webhooks

# Pull existing webhooks from Console

appwrite pull webhooks

# Deploy configured webhooks

appwrite push webhooks

Webhook configuration in appwrite/webhooks.json

[

    {

        "$id": "<WEBHOOK_ID>",

        "name": "Deploy events",

        "url": "https://example.com/appwrite/webhook",

        "events": ["functions.*.deployments.*.create"],

        "enabled": true,

        "tls": true

    }

]

Webhook commands

Command

Description

appwrite webhooks list

List webhooks

appwrite webhooks create

Create a webhook

appwrite webhooks get --webhook-id <ID>

Get a webhook

appwrite webhooks update --webhook-id <ID>

Update a webhook

appwrite webhooks delete --webhook-id <ID>

Delete a webhook

Managing Topics (Messaging)

# Create a new topic

appwrite init topics

# Pull existing topics from Console

appwrite pull topics

# Deploy topics

appwrite push topics

Messaging commands

Command

Description

appwrite messaging list-messages

List all messages

appwrite messaging create-email

Create email message

appwrite messaging create-push

Create push notification

appwrite messaging create-sms

Create SMS message

appwrite messaging get-message --message-id <ID>

Get a message

appwrite messaging delete --message-id <ID>

Delete a message

appwrite messaging list-topics

List all topics

appwrite messaging create-topic

Create a topic

appwrite messaging get-topic --topic-id <ID>

Get a topic

appwrite messaging update-topic --topic-id <ID>

Update a topic

appwrite messaging delete-topic --topic-id <ID>

Delete a topic

appwrite messaging list-subscribers --topic-id <ID>

List subscribers

appwrite messaging create-subscriber --topic-id <ID>

Add subscriber

appwrite messaging delete-subscriber --topic-id <ID> --subscriber-id <ID>

Remove subscriber

User Management

# Create a user

appwrite users create --user-id "unique()" \

    --email hello@appwrite.io

# List users

appwrite users list

# Get a user

appwrite users get --user-id "<USER_ID>"

# Delete a user

appwrite users delete --user-id "<USER_ID>"

Project Management

Project-level commands use the singular project service for current-project operations that do not need --project-id.

# Project settings and policies

appwrite project update-service --service-id functions --enabled true

appwrite project update-protocol --protocol-id rest --enabled true

appwrite project list-policies

appwrite project get-policy --policy-id "<POLICY_ID>"

# OAuth2 providers

appwrite project list-o-auth-2-providers

appwrite project get-o-auth-2-provider --provider github

appwrite project update-o-auth-2-git-hub --enabled true

# Mock phones and short-lived API keys

appwrite project create-mock-phone --phone "+12025550123" --otp "123456"

appwrite project list-mock-phones

appwrite project create-ephemeral-key

Generate Type-Safe SDK

# Auto-detect language and generate

appwrite generate

# Specify output directory

appwrite generate --output ./src/generated

# Specify language

appwrite generate --language typescript

# Override generated import settings

appwrite generate --appwrite-import-source node-appwrite --import-extension .js

Generated files:

File

Description

types.ts

Type definitions from your database schema

databases.ts

Typed database helpers for querying and mutating rows

constants.ts

Configuration constants (endpoint, project ID)

index.ts

Entry point that exports all helpers

Usage:

import { databases } from "./generated/appwrite";

const customers = databases.use("main").use("customers");

// Create

const customer = await customers.create({

    name: "Walter O' Brian",

    email: "walter@example.com"

});

// List with typed queries

const results = await customers.list({

    queries: (q) => [

        q.equal("name", "Walter O' Brian"),

        q.orderDesc("$createdAt"),

        q.limit(10)

    ]

});

// Update

await customers.update("customer-id-123", {

    email: "walter@scorpion.com"

});

// Delete

await customers.delete("customer-id-123");

// Bulk create

await customers.createMany([

    { name: "Walter O' Brian", email: "walter@example.com" },

    { name: "Paige Dineen", email: "paige@example.com" }

]);

Non-Interactive / CI/CD Mode

For headless automation, see the Non-Interactive Mode docs.

Deploy non-interactively

# Push everything

appwrite push all --all --force

# Push specific resources

appwrite push functions --all --force

appwrite push functions --function-id <FUNCTION_ID> --force

appwrite push sites --all --force

appwrite push tables --all --force

appwrite push teams --all --force

appwrite push buckets --all --force

appwrite push webhooks --all --force

appwrite push topics --all --force

Global Command Options

Option

Description

-v, --version

Output version number

-V, --verbose

Show complete error log

-j, --json

Output in JSON format

-f, --force

Confirm all warnings

-a, --all

Select all resources

--id [id...]

Pass a list of IDs

--report

Generate GitHub error report link

--console

Get direct link to Console

--open

Open Console link in browser

-h, --help

Display help

Maintenance Commands

# Update CLI using the detected install method

appwrite update

# Show manual update instructions

appwrite update --manual

# Install shell completions

appwrite completion install

Examples

# List users with JSON output

appwrite users list --json

# Get verbose error output

appwrite users list --verbose

# View a row in the Console

appwrite tables-db get-row \

    --database-id "<DATABASE_ID>" \

    --table-id "<TABLE_ID>" \

    --row-id "<ROW_ID>" \

    --console --open

# Generate error report

appwrite login --report
BrowserAct

Let your agent run on any real-world website

Bypass CAPTCHA & anti-bot for free. Start local, scale to cloud.

Explore BrowserAct Skills →

Stop writing automation&scrapers

Install the CLI. Run your first Skill in 30 seconds. Scale when you're ready.

Start free
free · no credit card