Releases · appwrite/appwrite · GitHub
Skip to content

Releases: appwrite/appwrite

2.0.0

Choose a tag to compare

@ChiragAgg5k ChiragAgg5k released this 04 Sep 18:36
033c630

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_VECTORSDB or _APP_DOCUMENTSDB once 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 embedding to COMPOSE_PROFILES and set _APP_EMBEDDING=enabled to 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_ENDPOINT and _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_DEVICE set 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_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 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_PROJECTS raises 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, .internal and 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 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.

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

2.0.0-rc.3

2.0.0-rc.3 Pre-release
Pre-release

Choose a tag to compare

@ChiragAgg5k ChiragAgg5k released this 04 Sep 13:45
dac68ce

Third release candidate for self-hosted 2.0.0. Pre-release — not recommended for production.

Highlights

Changes since 2.0.0-rc.2.

  • PostgreSQL no longer ships with durability turned off. The bundled compose passed fsync=off, synchronous_commit=off and full_page_writes=off, so a crash or power loss could leave the database corrupt. All three are gone.
  • Builds survive non-local storage. With _APP_STORAGE_DEVICE set to any S3-compatible backend, build output went to a local path nothing reads, leaving deployments ready with nothing to run. A failed upload now fails the build.
  • Git installations are isolated per project. Installation repository 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.
  • The Git installation callback no longer dead-ends. GitHub, GitLab, Gitea and Bitbucket all redirect back to the console with an actionable error.
  • Self-hosted GitLab works. _APP_VCS_GITLAB_ENDPOINT for repository integration, _APP_CONSOLE_GITLAB_ENDPOINT for console sign-in.
  • Google sign-in to the console, via _APP_CONSOLE_GOOGLE_APP_ID and _APP_CONSOLE_GOOGLE_SECRET.
  • Index listing returns the right indexes. Lookups used 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 min/max are capped to what the column can hold.
  • teams.total matches confirmed memberships. Four paths could drift it, most visibly deleting a membership after a primary-owner transfer.
  • Buckets are no longer left half-created when their files collection fails.
  • Realtime is cheaper per event — one Swoole worker, the document encoded once per event instead of once per subscriber, presence stored as flags.
  • Build billing is accurate — skipped when the build never started, capped at the build timeout, tagged with the resource id.
  • Execution logs 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.
  • The console works over plain HTTP again. crypto.randomUUID is only exposed on secure origins, so on a self-hosted install reached over HTTP at a LAN IP or an internal hostname every project page died with a full-page error. That is a setup the installer explicitly provisions, since it turns HTTPS off for loopback, .local, .internal and bare IPs.
  • New console 1.1.8, Open Runtimes executor 0.29.0, orchestrator 1.9.2, utopia-php/database 7.3.4.

Removed

  • GET /v1/health/executions.

Try it

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-rc.3

Upgrading from 1.9.x uses the same command with --entrypoint="upgrade". Back up your data first.

Most useful things to exercise: functions and sites with _APP_STORAGE_DEVICE pointed at an S3-compatible backend, and connecting one Git installation from more than one project.

2.0.0-rc.2

2.0.0-rc.2 Pre-release
Pre-release

Choose a tag to compare

@ChiragAgg5k ChiragAgg5k released this 29 Aug 19:37
fb487d3

Second release candidate for self-hosted 2.0.0. Pre-release — not recommended for production.

Highlights

Changes since 2.0.0-rc.1.

  • Build artifacts survive the upgrade from 1.9.x. The 2.0 builds volume rename left them behind, breaking existing function and site deployments.
  • Infrastructure migrations are versioned, so volume and file changes run per release during an upgrade.
  • DocumentsDB and VectorsDB ship off. They need MongoDB and PostgreSQL, which a stock install does not deploy, so their routes return general_service_disabled until enabled and the engine is provisioned.
  • The installer applies the worker topology you pick. Choosing Separate installed a combined stack, and separate topology never started the usage and resource stats workers.
  • HTTPS follows the hostname in the installer — off for loopback, .local, .internal and bare IPs, on for a real domain.
  • The account step is optional and takes a name.
  • Cloudflare Dashboard and Resend OAuth2 providers, alongside the existing set.
  • _APP_OPTIONS_ABUSE_INCREASED_LIMIT_PROJECTS raises rate limits for named projects.
  • 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.
  • Open Runtimes orchestrator 1.8.3, plus CDN, migration, span and websocket updates.

Try it

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-rc.2

When prompted for a password, use Appwrite2.

Upgrading from 1.9.x uses the same command with --entrypoint="upgrade". Back up your data first.

Please report anything you hit. Upgrades from 1.9.x with functions or sites are the most useful to exercise, since that is where build artifacts were being lost.

2.0.0-rc.1

2.0.0-rc.1 Pre-release
Pre-release

Choose a tag to compare

@ChiragAgg5k ChiragAgg5k released this 27 Aug 13:32
9507ed2

First release candidate for self-hosted 2.0.0. Pre-release — not recommended for production.

Highlights

  • A completely rebuilt console. The web interface has been rewritten from the ground up, with a new
    navigation model, redesigned resource views and a built-in terminal.
  • PostgreSQL is now supported, and is the default database. MariaDB and MongoDB remain available.
  • Embeddings API for generating text embeddings.
  • Usage service for self-hosted instances, with resource-scoped metrics.
  • Notifications in the console.
  • Gitea and Origin VCS providers, alongside GitHub, GitLab and Bitbucket.
  • Sites build on the orchestrator backend, with framework detection from config files.
  • Custom MFA challenge factor, plus gravatar and OAuth2 avatar support.
  • Realtime event tail for live console events.
  • Geo service and a new health check endpoint.

Try it

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-rc.1

When prompted for a password, use Appwrite2.

Upgrading from 1.9.x uses the same command with --entrypoint="upgrade". Back up your data first.

Please report anything you hit. Upgrade paths from 1.9.x on MariaDB and MongoDB are the most useful to exercise.

1.9.6

Choose a tag to compare

@ChiragAgg5k ChiragAgg5k released this 22 Jul 11:52
9f8423e

What's Changed

Notable changes

  • Automatically repair missing providerBranches and providerPaths attributes on Functions and Sites when upgrading from 1.9.5. Operators no longer need to apply the metadata and table changes manually.

Fixes

  • Make migration attribute batches idempotent when some attributes already exist in #12790
  • Replace the side-effecting Appwrite container healthcheck with the public version endpoint in #12765
  • Respect _APP_SITES_RUNTIMES when listing frameworks and creating or updating Sites in #12840
  • Wait for a writable MongoDB replica-set primary before marking the service healthy in #12913
  • Correct database and queue connectivity reporting in the doctor task in #12928
  • Allow additional time for the self-hosted installer to pull images and start Compose services in #12747

Miscellaneous

  • Update the self-hosted Console image to 8.7.30 for recent self-hosted VCS, error rendering, build specification, and security fixes
  • Update Open Runtimes Executor to 0.25.4 for recent build and S3 custom endpoint fixes
  • Update the Browser service to 0.3.3 so screenshot headers work with custom internal Appwrite origins
  • Update release metadata and installation examples for 1.9.6

1.9.5

Choose a tag to compare

@ChiragAgg5k ChiragAgg5k released this 01 Jul 02:08
9852f2b

What's Changed

Public APIs

Databases and migrations

  • JSON import/export — Added JSON import/export references for DocumentsDB and VectorsDB and larger database ID support (#11646)
  • BigInt support — Added BigInt attributes and columns for Databases and TablesDB (#11673)
  • Migration coverage — Added backup, API key, project variable, webhook, policies, SMTP, custom domains, email templates, and OAuth provider migrations (#11632, #12308, #12313, #12314, #12363, #12364, #12368, #12415, #12417)
  • Migration reliability — Added migration API support, source host validation, and improved failure handling (#11946, #12352, #12382, #12280)
  • Migration fixes — Fixed schema migration gaps and provider trigger attributes (#11730, #12701)
  • Database stability — Fixed collection metadata writes against unready data-plane databases, transaction deletes, listRows total casting, and VectorsDB metadata bootstrap flakiness (#12593, #12302, #11967, #11772, #11757)

Auth and users

  • Email policies — Added disposable email blocking and corporate email policies (#10643, #12503)
  • Password policies — Added project password policy settings (#11825)
  • OAuth providers — Added X OAuth 2.0 provider (#11611)
  • OAuth fixes — Fixed OIDC params, Google prompt handling, Yahoo scopes, provider ordering, sparse provider updates, and project cache purging after config updates (#12224, #12263, #11745, #12398, #12646, #12654)
  • Impersonation — Added impersonation support through query params and SDK auth metadata (#12167, #12492, #12532)
  • User and membership responses — Added email metadata fields and membership userAccessedAt (#12504, #12461)
  • MFA — Improved MFA authenticator ordering and coverage (#12485)
  • Teams and sessions — Fixed membership privacy, active membership account deletion, ownership transfer edge cases, email/password session cache races, and refresh session handling (#11979, #11787, #11816, #12228)

Messaging, realtime, and presence

  • Presences API — Added Presences API and console presence support (#11886, #12343, #12393, #12397, #12408, #12412)
  • Realtime — Added action channels, logs, richer message payloads, query subscription fixes, and atomic payload handling (#12070, #11992, #11767, #11762)
  • Realtime fixes — Fixed websocket stability, HTTP dependency, and reset behavior (#12540, #11831, #11885)
  • Amazon SES — Added SES as a messaging provider (#12464)
  • Messaging scale — Improved fan-out with bounded concurrency and retry handling for throttled recipients (#12465)
  • SMTP delivery — Improved SMTP email delivery reliability (#11748)

Functions, Sites, and Storage

  • Build timeouts — Added 45-minute build timeout support (#11881, #11934)
  • Deployment triggers — Added skip-deployment commit patterns and custom trigger fields (#12278, #11955, #12373)
  • Runtimes and templates — Added Bun and Deno site runtimes and a Rust starter function template (#12337, #12198)
  • Build caching — Added node modules cache key support for builds (#12555)
  • File size — Added actual file size tracking (#12344)
  • Chunked uploads — Improved out-of-order and parallel chunk uploads, S3 multipart ETag handling, chunk permission checks, and deployment chunk upload stability (#12138, #12209, #12585, #12466, #12456, #12574)
  • Build and rule fixes — Fixed canceled deployment status overwrites, build log parsing, orphaned deployment rules, rule creation races, and rules without deployments (#12569, #12498, #12571, #12307, #11974)
  • Scheduler and cache fixes — Fixed scheduled function documents, scheduler handling, and storage cache fallback (#11790, #11892, #12285, #11860, #11842)

Installer and self-hosted

  • Release updates — Updated Console image to 8.7.5, kept PostgreSQL disabled by default for fresh installs, and fixed installer database, secret key, and compose release wiring (#12666)
  • Compose generation — Generate installer compose files from base compose and fix Mongo copy failures, dependency rewriting, override loading, and Traefik command preservation (#12703)
  • Installer fixes — Fixed local installer dev flow, missing worker-executions service, and executor config in installer compose output (#12627, #11838, #11874)
  • Installer Docker flow — Fixed MongoDB helper script bind mounts when running the documented Docker installer against the host Docker daemon (#12745)
  • Host validation — Fixed public hostname validation under Swoole DNS and regional endpoint validation (#12431, #12411, #12357)

API and SDKs

  • SDK updates — Added Unity SDK docs/configuration and ping to SDK specs (#12482, #12330, #12604)
  • Auth schemes — Added platform parameter enums, unified auth headers, query/path project auth schemes, and repository branch search pagination (#12358, #12211, #12481, #12554, #12213, #12243)
  • Spec fixes — Fixed generated API metadata, summaries, text responses, enum keys, unresolved models, provider repository discriminators, method IDs, and parameter naming consistency (#12544, #12312, #12402, #11817, #12392, #11924, #12235, #12238, #12244, #12212)
  • SDK compatibility — Fixed legacy database SDK deprecation metadata (#12615)

Reliability and performance

  • Queue workers — Improved queue worker concurrency and made the webhooks worker safer under concurrent load (#12468, #12552)
  • Worker stability — Fixed connection pool behavior, deletes worker connection collisions, and DB worker memory behavior (#12338, #12639, #11749)
  • Request handling — Improved request-scoped resource handling and response state isolation (#12220, #11564, #11798)

Security and dependencies

  • Base images — Bumped Appwrite base images and patched OS package CVEs (#12174, #12201, #12204, #12516, #12546)
  • Dependency fixes — Updated phpseclib for CVEs and fixed a Composer audit issue for GraphQL PHP (#11858, #11887)
  • Runtime and data updates — Upgraded DB-IP Country Lite to 2026-06 and PHP runtimes (#12473, #11731, #12196, #12378)

Notable Fixes

  • GraphQL coroutine-safe responses, batch reset, audit handling, preview assertions, and disabled functional tests
  • Large execution payloads and function execution request metadata
  • Execution log behavior
  • Webhook API security and flaky webhook/site deployment tests
  • VCS typed client exceptions, repository preservation on update, cross-project installation validation, and server-side branch search
  • Platform type backwards compatibility and deprecated origin validation
  • CORS for paused projects and error responses
  • RFC 6265 cookie handling and request-scoped cookie domain behavior
  • Favicon empty-body handling and AVIF preview behavior
  • Cache-control callbacks, query syntax errors, missing console scopes, and double policy scopes
  • Variables API feature parity and project variable ID behavior
  • SMTP template regressions, empty string template params, test email platform vars, and SMTP port type
  • Project delete events and cache health checks

Upgrade Path

  • Upgrade from 1.9.0 to 1.9.5. Use the database migration step in the web installer, the --migrate flag with the upgrade task, or manually run docker compose exec appwrite migrate.
  • Self-hosted users should review generated compose changes before upgrading, especially if using installer-generated compose files or PostgreSQL.

New Contributors

Full Changelog: 1.9.0...1.9.5

1.9.5-rc.2

1.9.5-rc.2 Pre-release
Pre-release

Choose a tag to compare

@ChiragAgg5k ChiragAgg5k released this 29 Jun 05:56
3e3e67c

What's Changed

Full Changelog: 1.9.5-rc.1...1.9.5-rc.2

1.9.5-rc.1

1.9.5-rc.1 Pre-release
Pre-release

Choose a tag to compare

@ChiragAgg5k ChiragAgg5k released this 24 Jun 09:35
3b26a7d

What's Changed

Read more

cl-1.9.0-5

cl-1.9.0-5 Pre-release
Pre-release

Choose a tag to compare

@loks0n loks0n released this 03 Jun 10:21
3006c98
Merge pull request #12480 from appwrite/deploy/as-ce-image

Publish cloud tags to appwrite/ce image

1.9.0

Choose a tag to compare

@abnegate abnegate released this 01 Apr 02:50
8c6d4d8

What's Changed

Database support

Database features

  • String types — New varchar, text, mediumtext, and longtext attribute types (#11174)
  • Int64 format — Integer attributes support int64 format for large numbers (#11123)
  • Collection/row storage size — Expose column bytes used and bytes free per collection/table (#11254,
    #11069)
  • Cached document lists — Document list queries can be cached with configurable TTL (#10832)

New admin APIs

  • Webhooks API — First-class webhooks management endpoints for creating, listing, and managing
    webhook configurations (#11033, #11566)
  • Schedules API — New endpoints to view and manage scheduled tasks within projects (#11331)
  • User impersonation — Admins can now impersonate users for debugging and support (#11533)
  • Public project variables — Project environment variables can now be marked public and accessed
    via API (#11577)

Realtime

  • Query subscriptions — Subscribe to realtime channels with query filters for targeted updates
    (#11202, #11237)
  • Realtime metrics — Track connections, messages, and bandwidth in project usage stats (#11438,
    #11488)
  • TablesDB channels — Explicit top level TablesDB events for realtime (#11404, #11430)

Auth & security

  • Custom JWT duration — Configure JWT expiration time when creating tokens (#11009)
  • Resource-based API keys — New key structure with granular resource permissions, custom IDs, and
    list queries (#11003, #11277, #11278)
  • Project labels — Tag and organize projects with custom labels (#11056)
  • Project status attribute — Track project lifecycle state (#11291)
  • Multiple application domains — Support multiple domains per project for CORS and OAuth (#10911)
  • Trusted console projects — Mark projects as trusted for elevated access (#11248)
  • Blocked user errors — Changed from 401 to 403 for blocked users/resources (#11469)
  • OAuth email verification — Enforce email verification when linking OAuth2 providers (#10986)
  • Tauri origin support — tauri://localhost accepted as an allowed origin (#11589)
  • Trusted headers — Improved client IP resolution via _APP_TRUSTED_HEADERS env var

Compute

  • Custom start command — Sites and functions support custom start commands (#10842)
  • Separate build/runtime specs — Configure build and runtime resources independently (#10849)
  • Deployment retention — Automatic cleanup of old deployments with configurable limits (#10959)
  • Async screenshots — Screenshot generation moved to a dedicated worker (#11110)
  • Stale execution cleanup — Automatic cleanup of stale/orphaned function executions (#11146)
  • Graceful worker shutdown — Workers shut down cleanly without dropping jobs (#11104)
  • Function queue job TTL — 7-day TTL for functions queue to prevent unbounded growth (#11226)

Storage

  • File encryption/compression parameters — Configure per-file encryption and compression (#11135)
  • totalSize on list responses — List endpoints return total storage size (#11102)

Migrations

  • Site migration — Import sites from other Appwrite instances
  • Messaging resource migration — Migrate messaging resources between instances (#11495)
  • Migration resource enums — SDK enums for migration resource types

GraphQL

  • Introspection toggle — Enable/disable GraphQL introspection independently (#11159)

SDKs

  • Rust SDK — New official Rust SDK (#11614)
  • Cursor plugin SDK — SDK for Cursor IDE integration (#11371)
  • Agent skills SDK — SDK for AI agent integration
  • Array param enums — Enum support for array parameters across all SDKs

Installer

  • New web installer UI — Redesigned installer with light/dark modes, progress tracking SSL,
    certificate checks, migrations built in (#11175, #11247)

Refactoring

  • Migrated to Utopia Platform modules architecture — all HTTP endpoints, workers, and tasks
    organized into feature modules (#11035, #11049, #11057, #11103, #11208, #11398)
  • Refactored auth to single instance pattern (#10872, #11130)
  • Refactored usage metrics to stateless Bus event publisher pattern (#11449)
  • Removed proxy container — Traefik handled directly (#11039)
  • Consolidated CI workflows with dynamic database/mode matrix (#11531, #11551)
  • Upgraded PHPStan to v2 with full codebase baseline (#11550)
  • Upgraded to PHPUnit 11/12 with PHP 8 attributes

Performance

  • Sparse document updates — updateDocument() sends only changed attributes (#11465)
  • Domain caching via shared Swoole Tables instead of per-worker Config cache (#11346)
  • Memory leak fixes in webhook/stats/event processing (#11067, #11241)
  • SMTP keep-alive for connection reuse across mail jobs (#11496)
  • Static file loading optimization with copy-on-write memory sharing
  • Pre-parsed queries on hot paths
  • Realtime performance improvements (#11251)
  • Simplified repository authorization checks (#11616)

Notable Fixes

  • OAuth fixes for custom domains, redirect schemes, and verified emails
  • MFA recovery code validation fix
  • CORS wildcard and preflight request handling
  • Execution status and timeout reporting
  • Relationship document validation
  • Cache key improvements with attribute/index hash
  • Realtime region handling and error resilience
  • PostgreSQL race condition in shared mode project creation
  • VCS template flow, deployment, and comment fixes
  • Storage health error handling
  • Schedule execution trigger and deletion fixes
  • Abuse rate limiting reset on success

Upgrade Path

  • Upgrade from 1.8.1 to 1.9.0. Use the database migration step in the web installer, the --migrate flag with the upgrade task, or manually run docker compose exec appwrite migrate.

New Contributors

Full Changelog: 1.8.1...1.9.0