Loading...
Loading...
How to use the Appwrite CLI well. Covers when to use appwrite.config.json vs `appwrite client`, pull/push vs one-shot service calls, type-safe SDK and model generation, query flags, CI auth, Cloud regional endpoints, function/site variables, and traps that `--help` will not mention. Does not catalog commands — run `appwrite <command> --help` for flags. Use whenever running `appwrite`, deploying or pulling functions/sites/tables, generating application code from a table schema, initializing or linking a project, scripting Appwrite, or when the user mentions the Appwrite CLI, appwrite.config.json, `appwrite generate`, `appwrite types`, or `appwrite client`.
npx skill4agent add appwrite/skills appwrite-cliappwrite <command> --helpclientappwrite.config.jsonappwrite client --project-idappwrite client# Good — project
appwrite login
appwrite list-projects --json
appwrite init project --project-id <ID>
appwrite pull table
# edit appwrite.config.json, then:
appwrite push table --force
# Bad — project treated as a pile of API calls
appwrite tablesdb create-table --database-id main --table-id songs ...
appwrite tablesdb create-varchar-column --database-id main --table-id songs ...
# the next clone has no record of this
# Good — one-off (already logged in)
appwrite client --project-id <ID>
appwrite users get --user-id <ID> --json
# Bad — one-off that litters a repo
cd ~/some-unrelated-app && appwrite init projectappwrite client --endpoint https://<REGION>.cloud.appwrite.io/v1 --key "$APPWRITE_API_KEY" --project-id <ID>appwrite client --project-idappwrite.config.jsonAPPWRITE_PROJECT_IDAPPWRITE_ENDPOINT| Layer | Lives in | Set with |
|---|---|---|
| Who you are (session or API key) | global CLI prefs | |
| Which project | | |
init project# Good — CI against a checked-in config
appwrite client --key "$APPWRITE_API_KEY"
appwrite push function --force
# Bad — CI that bakes the key into the repo
appwrite client --key 'standard_....'
# and commits appwrite.config.json with secrets insideAPPWRITE_PROJECT_IDAPPWRITE_ENDPOINTAPPWRITE_ORGANIZATION_ID--forcePass --force instead--forceappwrite login --switchappwrite client --debugappwrite client --resetappwrite whoamihttps://cloud.appwrite.io/v1https://fra.cloud.appwrite.io/v1init projectclient --project-id# Good — project work uses the config's regional endpoint
cat appwrite.config.json # "endpoint": "https://fra.cloud.appwrite.io/v1"
# Bad — "fixing" whoami
appwrite client --endpoint https://fra.cloud.appwrite.io/v1
# now login/session calls go to a region host they do not belong on| Pull / push (config) | Service commands (not in the config) |
|---|---|
| settings, functions, sites, tables and columns, buckets, teams, webhooks, topics | rows, users, files, executions, messages |
tablesdb create-*functions createpullpushdatabasestablesdbpush table--forcepull settings id │ key │ remote │ local
───────────────┼─────────────────┼────────┼───────
Service │ account │ true │
Auth method │ email-password │ true │# Good — local column was empty, so sync first, then push
appwrite pull settings
appwrite push settings --force
# Bad — empty local, forced through
appwrite push settings --forcepush all --all --forcepush function --function-id apiunique()$idappwrite.config.jsonappwrite pull tableappwrite generateappwrite generateimport { databases, type Songs } from "./generated/appwrite/index.js";
// Database lookup uses its ID; table lookup uses its name from the config.
const songs = databases.use("main").use("Songs");
const page = await songs.list({
queries: (query) => [
query.equal("published", true),
query.orderDesc("createdAt"),
query.limit(20),
],
});
const first: Songs | undefined = page.rows[0];.use()name$idgenerateAPPWRITE_API_KEYappwrite generate --helpappwrite types <output-directory>tsjsphpkotlinswiftjavadartcs--languagetypescriptcsharpQuery.tsappwrite.d.tsappwrite types ./src/appwrite-types.ts --language tsimport { Client, TablesDB } from "appwrite";
import type { Songs } from "./appwrite-types.js";
// Read these values from appwrite.config.json and expose them through the
// application's existing configuration mechanism.
const client = new Client()
.setEndpoint("https://<REGION>.cloud.appwrite.io/v1")
.setProject("<PROJECT_ID>");
const tablesDB = new TablesDB(client);
const page = await tablesDB.listRows<Songs>({
databaseId: "main", // still an unchecked string
tableId: "songs", // still an unchecked string
});types --strictgenerateappwrite.config.json<path>/.envappwrite.config.json--with-variables# Good — ship code, leave remote vars alone
appwrite push function --function-id api --activate --force
# Bad — remote vars you did not list locally are gone
appwrite push function --function-id api --with-variables --force
# Good — deploy without switching live traffic
appwrite push function --function-id api --activate=false --force--asyncappwrite run function--filter--sort-asc--sort-desc--limit--select--cursor-after--where--queries# Good
appwrite users list \
--filter 'emailVerification=true' \
--sort-desc '$createdAt' \
--limit 20 \
--json
# Bad
appwrite users list --queries '[{"method":"equal","attribute":"emailVerification","values":[true]}]'--filtertruefalsenull--cursor-after <lastId>--offset--json--raw--show-secretsappwrite.config.jsonappwrite.jsonpushfunctions/api/includes.jsonpathinit projectpull