- Console IV with new navigation model, redesigned resource views, notifications and realtime event tail
- Appwrite Terminal runs the Appwrite CLI inside the Console with session and project already configured
- Appwrite Explorer loads project's OpenAPI specification, builds requests with guided forms and sends live calls from the browser
- VectorsDB handles embeddings with fixed dimension collections, vector storage, optional metadata and HNSW index supporting cosine, dot product or Euclidean distance
- DocumentsDB handles schemaless JSON documents with different fields per document and field additions as writes rather than migrations
- Embeddings API turns text into vectors without a separate embedding service
- Usage service for self-hosted instances with resource-scoped metrics for every product
- Gitea and Origin VCS providers alongside GitHub, GitLab and Bitbucket
- Self-hosted GitLab support through _APP_VCS_GITLAB_ENDPOINT and _APP_CONSOLE_GITLAB_ENDPOINT
- Google sign-in to the console via _APP_CONSOLE_GOOGLE_APP_ID and _APP_CONSOLE_GOOGLE_SECRET
- Cloudflare Dashboard and Resend join the OAuth2 provider list
- Custom MFA challenge factor plus gravatar and OAuth2 avatar support
- Geo service and new health check endpoint
- Execution logs can dual-write to ClickHouse with _APP_EXECUTIONS_DUAL_WRITE, _APP_CONNECTIONS_DB_EXECUTIONS and _APP_POOL_SIZE_EXECUTIONS
- _APP_OPTIONS_ABUSE_INCREASED_LIMIT_PROJECTS raises rate limits for named projects
- PostgreSQL is the default database for new installs with durability left on
- Git installations are isolated per project with installation endpoints scoped to owning project and signed GitHub App installation state
- Sites build on the orchestrator backend with framework detection from config files
- Realtime is cheaper per event with one Swoole worker, document encoded once per event instead of once per subscriber, and presence stored as flags
- Index listing looked up by collection id instead of sequence, preventing collections sharing an id across databases from seeing each other's indexes
- Transactions reject array queries up front instead of throwing on commit
- Integer attribute min and max are capped to what the column can hold
- teams.total matches confirmed memberships across all four paths that could drift it
- Buckets are no longer left half-created when their files collection fails
- Build billing is skipped when the build never started, capped at the build timeout and tagged with the resource id
- Proxy rule domains are stored lowercase so lookups match however a domain was entered
- SVG files are served as attachments from the file view endpoint
- GET /v1/health/executions endpoint
From Appwrite
Announcing Appwrite 2.0
Appwrite 2.0 is the second major generation of the platform. It replaces the engine underneath, rebuilds the Console on top, and expands what a project can hold: relational, schemaless and vector data, on PostgreSQL, MariaDB or MongoDB, with the same permissions, queries and realtime you already use. Read the full story in the announcement post.
Existing projects keep working. Upgrading from 1.9.x is a single command and a migration, and your data stays on the database engine it is on today.
Highlights
- Console IV. The next-generation Appwrite Console, rebuilt from the ground up with a new navigation model, redesigned resource views, notifications and a realtime event tail. Two developer tools now count as part of the default workflow: Appwrite Terminal runs the Appwrite CLI inside the Console with your session and project already configured, and Appwrite Explorer loads your project's OpenAPI specification, builds requests with guided forms and sends live calls from the browser.
- PostgreSQL is the default database. New installs provision PostgreSQL out of the box, with durability left on. MariaDB and MongoDB remain fully supported for new and existing installs.
- VectorsDB handles embeddings. A collection is created with a fixed dimension, every document stores a vector of that length plus optional metadata, and an HNSW index keeps similarity search fast as the collection grows. Choose cosine, dot product or Euclidean distance.
- DocumentsDB handles schemaless documents. A collection holds JSON, two documents in the same collection can have different fields, and adding a field is a write rather than a migration. Document-level permissions, queries, ordering and pagination work through the same SDK patterns. VectorsDB and DocumentsDB need PostgreSQL and MongoDB engines a stock install does not deploy, so they ship off; enable
_APP_VECTORSDBor_APP_DOCUMENTSDBonce the engine is provisioned. - Embeddings API turns text into vectors without a separate embedding service in your stack. The embedding container is resource heavy and off by default; add
embeddingtoCOMPOSE_PROFILESand set_APP_EMBEDDING=enabledto run it. - Usage service for self-hosted instances, with resource-scoped metrics for every product.
- Gitea and Origin VCS providers, alongside GitHub, GitLab and Bitbucket. Self-hosted GitLab works through
_APP_VCS_GITLAB_ENDPOINTand_APP_CONSOLE_GITLAB_ENDPOINT. - Git installations are isolated per project. Installation endpoints are scoped to the owning project and the GitHub App installation state is signed, so a callback cannot be replayed onto someone else's project. Failed callbacks redirect back to the console with an actionable error instead of dead-ending.
- Sites build on the orchestrator backend, with framework detection from config files.
- Builds survive non-local storage. With
_APP_STORAGE_DEVICEset to an S3-compatible backend, build output is uploaded there and a failed upload fails the build. - Google sign-in to the console, via
_APP_CONSOLE_GOOGLE_APP_IDand_APP_CONSOLE_GOOGLE_SECRET. Cloudflare Dashboard and Resend join the OAuth2 provider list. - Custom MFA challenge factor, plus gravatar and OAuth2 avatar support.
- Geo service and a new health check endpoint.
- Realtime is cheaper per event. One Swoole worker, the document encoded once per event instead of once per subscriber, presence stored as flags.
- Execution logs can dual-write to ClickHouse. Off by default, reads stay on the project database and mirror failures are never fatal.
_APP_EXECUTIONS_DUAL_WRITE,_APP_CONNECTIONS_DB_EXECUTIONS,_APP_POOL_SIZE_EXECUTIONS. _APP_OPTIONS_ABUSE_INCREASED_LIMIT_PROJECTSraises rate limits for named projects.
Installer and upgrade
- Build artifacts survive the upgrade from 1.9.x. The builds volume rename no longer leaves existing function and site deployments behind.
- Infrastructure migrations are versioned, so volume and file changes run per release during an upgrade.
- The installer applies the worker topology you pick, and separate topology starts the usage and resource stats workers.
- HTTPS follows the hostname. Off for loopback,
.local,.internaland bare IPs, on for a real domain. The console works over plain HTTP on those hosts. - The account step is optional and takes a name.
Fixes
- Index listing looked up by collection id instead of sequence, so collections sharing an id across databases could see each other's indexes.
- Transactions reject array queries up front instead of throwing on commit.
- Integer attribute
minandmaxare capped to what the column can hold. teams.totalmatches confirmed memberships across all four paths that could drift it.- Buckets are no longer left half-created when their files collection fails.
- Build billing is skipped when the build never started, capped at the build timeout, and tagged with the resource id.
- Proxy rule domains are stored lowercase, so lookups match however a domain was entered.
- SVG files are served as attachments from the file view endpoint.
Removed
GET /v1/health/executions.
Install
docker run -it --rm \
--volume /var/run/docker.sock:/var/run/docker.sock \
--volume "$(pwd)"/appwrite:/usr/src/code/appwrite:rw \
--entrypoint="install" \
appwrite/appwrite:2.0.0
Upgrade
Upgrading from 1.9.x uses the same command with --entrypoint="upgrade", then run the migration:
cd appwrite
docker compose exec appwrite migrate
Back up your data first. MariaDB and MongoDB installs stay on their current database; PostgreSQL is the default for new installs only.
Contributors
Thank you to everyone who contributed to 2.0.0 across the release candidates:
@abnegate @ArnabChatterjee20k @arpit10128 @atharvadeosthale @bhardwajparth51 @Chehak7 @ChiragAgg5k @cipheraxat @deepshekhardas @eldadfux @fogelito @harsh-sikarwar @HarshMN2345 @ibaraki-douji @imtia33 @jaysomani @levivannoort @lohanidamodar @loks0n @Meldiron @premtsd-code @RushikeshGandhmal @Splinteer @TorstenDittmann