Releases: appwrite/appwrite
Release list
2.0.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.0Upgrade
Upgrading from 1.9.x uses the same command with --entrypoint="upgrade", then run the migration:
cd appwrite
docker compose exec appwrite migrateBack 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
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=offandfull_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_DEVICEset 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_ENDPOINTfor repository integration,_APP_CONSOLE_GITLAB_ENDPOINTfor console sign-in. - Google sign-in to the console, via
_APP_CONSOLE_GOOGLE_APP_IDand_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/maxare capped to what the column can hold. teams.totalmatches 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.randomUUIDis 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,.internaland 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.3Upgrading 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
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_disableduntil 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,.internaland 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_PROJECTSraises 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.2When 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
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.1When 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
What's Changed
Notable changes
- Automatically repair missing
providerBranchesandproviderPathsattributes 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_RUNTIMESwhen 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
doctortask 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
What's Changed
Public APIs
- Project APIs — Added public endpoints for project variables, keys, policies, SMTP, auth methods, mock phones, services, protocols, platforms, OAuth2 providers, and organization projects (#11615, #11650, #11900, #11964, #11970, #11976, #11981, #11993, #12309, #12317, #12375)
- Proxy API — Added public proxy management endpoints (#12208)
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
pingto 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
--migrateflag with the upgrade task, or manually rundocker 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
- @blueberry-adii made their first contribution in #11794
- @bhardwajparth51 made their first contribution in #11762
- @rathi-yash made their first contribution in #11795
- @FerRubioMorales made their first contribution in #12189
- @abhay-dev2901 made their first contribution in #12219
Full Changelog: 1.9.0...1.9.5
1.9.5-rc.2
What's Changed
- Expose NFT config and remove sunset SDK entries by @ChiragAgg5k in #12691
- Complete V24 schema migrations by @ChiragAgg5k in #12701
- Generate installer compose from base compose by @ChiragAgg5k in #12703
- Fix Composer source fallback in CI builds by @ChiragAgg5k in #12714
Full Changelog: 1.9.5-rc.1...1.9.5-rc.2
1.9.5-rc.1
What's Changed
- Change Usage class from final to non-final by @lohanidamodar in #11735
- Update installation commands in readme for 1.9.0 to include self-hosted wizard by @adityaoberai in #11739
- Speed up PHPStan analysis with result caching by @ChiragAgg5k in #11740
- [codex] Fix PHPStan baseline cleanup issues (part 2) by @ChiragAgg5k in #11737
- Fix PHPStan baseline and code quality issues by @lohanidamodar in #11754
- Fix flaky vectordb migration test by @ChiragAgg5k in #11757
- chore: remove phpstan baseline by @ChiragAgg5k in #11751
- Replace PHPMailer with utopia-php/messaging SMTP adapter by @ChiragAgg5k in #11748
- feat: add support for blocking disposable email addresses by @eldadfux in #10643
- fix(oauth): update Yahoo OAuth scopes from deprecated scopes by @TorstenDittmann in #11745
- [codex] Fail specs when referenced docs are missing by @ChiragAgg5k in #11789
- [codex] Fix flaky VectorsDB metadata bootstrap in migrations by @ChiragAgg5k in #11772
- Improve schedule function logic by @shimonewman in #11790
- fix: add CORS headers to error responses by @lohanidamodar in #11797
- Remove request and response static state by @ChiragAgg5k in #11798
- Use request-scoped cookie domain resource by @ChiragAgg5k in #11799
- revert ScheduleFunctions.php updates by @shimonewman in #11805
- feat: migrate from static Http::setResource() to DI Container by @ChiragAgg5k in #11564
- [codex] Handle null console routes in API middleware by @ChiragAgg5k in #11809
- [codex] Fix post-merge e2e test regressions by @ChiragAgg5k in #11810
- Chore: Migrat elabels API by @Meldiron in #11812
- [codex] Bump utopia-php/framework to 0.34.18 by @ChiragAgg5k in #11814
- fix: reset SDK dev branch to base branch before pushing by @ChiragAgg5k in #11808
- fix appwrite auth broken link in readme by @blueberry-adii in #11794
- fix: persist session before purging user cache in email/password login by @loks0n in #11816
- fix: throw RuntimeException for unresolved response models in spec generation by @ChiragAgg5k in #11817
- bump utopia-php/database to 5.3.19 and fix shared-mode CI failures by @premtsd-code in #11750
- Feat: public platform API by @Meldiron in #11615
- fix: ensure realtime event payload is populated for atomic operations by @bhardwajparth51 in #11762
- Feat: Public keys API by @Meldiron in #11650
- Chore: Mark project response format sub-formats as public by @Meldiron in #11821
- feat: Add X OAuth 2.0 provider by @HarshMN2345 in #11611
- fix: use cURL cookie engine for RFC 6265 compliant cookie handling in e2e client by @loks0n in #11826
- feat(databases): cache purge parameter and improved ttl semantics by @abnegate in #11820
- feat: distinguish user types in audit logs by @lohanidamodar in #11580
- fix: make variableId optional in createProjectVariable endpoint by @rathi-yash in #11795
- remove HTTP server bootstrap from specs task by @ChiragAgg5k in #11830
- fix: Add backwards-compat origin validation for deprecated platform types by @lohanidamodar in #11833
- fix: map deprecated platform types in project response by @lohanidamodar in #11835
- Revert "fix: make variableId optional in createProjectVariable endpoint" by @ChiragAgg5k in #11837
- Fix deletion of partially-uploaded (pending) files by @Meldiron with @Copilot in #11655
- fix(installer): add missing worker-executions service to compose template by @HarshMN2345 in #11838
- feat: extract session alert email into Mails listener by @loks0n in #11642
- fix: storage preview cache misses and stale cache eviction by @loks0n in #11842
- fix: set project on mail queue in session mails listener by @loks0n in #11843
- Realtime query message payload by @ArnabChatterjee20k in #11767
- Use dedicated connection resources in realtime by @ChiragAgg5k in #11831
- feat: add tracing spans for storage file preview timing and cache state by @loks0n in #11844
- Migrate executions, migrations, and stats resources to publishers by @ChiragAgg5k in #11850
- feat: remove error logs by @loks0n in #11854
- Bump phpseclib to 3.0.51 for CVE-2026-40194 by @ChiragAgg5k in #11858
- Make rule deploymentResourceType optional for non-deployment rules by @ChiragAgg5k in #11861
- fix(installer): align self-hosted compose execution stack by @ChiragAgg5k in #11874
- fix: pass response to Http::execute() in GraphQL resolver by @abnegate in #11876
- Fix project SDK spec for web platform hostname and platform type enum by @ChiragAgg5k in #11848
- (fix): cache fallback by @abnegate in #11860
- fix: reset response sent state between batched GraphQL queries by @lohanidamodar in #11879
- Feat: services protocols public apis by @Meldiron in #11839
- added reset in db worker for queue for realtime by @ArnabChatterjee20k in #11749
- fix: trim execution queue payload to project ID only by @loks0n in #11883
- Fix: Webhook API secret rotation and security by @Meldiron in #11884
- Safe delete shared tables v1 by @fogelito in #11691
- feat: increase default build timeout to 45 minutes by @loks0n in #11881
- Upgrade graphql-php to v15.31.5 by @ChiragAgg5k in #11887
- Schedule functions debug by @shimonewman in #11892
- (fix): reset route to avoid clobbering otel by @abnegate in #11885
- [codex] ci: disable functional GraphQL e2e by @ChiragAgg5k in #11893
- fix: replace force-push with regular push in SDK release task by @ChiragAgg5k in #11904
- Docsdb fixes by @ArnabChatterjee20k in #11852
- fix(graphql): isolate coroutine resolver state and sent responses by @lohanidamodar in #11880
- fix: stabilize flaky CI tests by @ChiragAgg5k in #11903
- Refactor audits, certificates, and screenshots queues to publishers by @ChiragAgg5k in #11851
- added backward compat by @ArnabChatterjee20k in #11907
- Fix: protocol & service exception by @Meldiron in #11909
- Allow deleting user account with active memberships by @lohanidamodar in #11787
- Add discriminators to polymorphic API spec unions by @ChiragAgg5k in #11921
- feat(specs): add discriminator for provider repository list union by @ChiragAgg5k in #11924
- Self hosted installer compose fixes by @atharvadeosthale in #11925
- Added delay metric by @ArnabChatterjee20k in #11927
- Feat: Fallback email custom template by @Meldiron in #11912
- Realtime time metric by @ArnabChatterjee20k in #11936
- Remove /status from project endpoint paths; upgrade to platform 0.13 by @Meldiron in #11932
- feat: use buildTimeout from message payload in build worker by @loks0n in #11934
- Update React Admin template metadata by @adityaoberai in #11926
- fix: do not cache error responses for storage preview, bu...
cl-1.9.0-5
Merge pull request #12480 from appwrite/deploy/as-ce-image Publish cloud tags to appwrite/ce image
1.9.0
What's Changed
Database support
- MongoDB support (#11312)
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)
totalSizeon 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
- @levivannoort made their first contribution in #10843
- @Ujjwaljain16 made their first contribution in #10925
- @VijaykumarPujar-tech made their first contribution in #10863
- @tejas-raskar made their first contribution in #10342
- @premtsd-code made their first contribution in #11193
- @Shivangisharma4 made their first contribution in #11185
Full Changelog: 1.8.1...1.9.0

