chore: prepare 2.3.0 release by ChiragAgg5k · Pull Request #13857 · appwrite/appwrite · GitHub
Skip to content

chore: prepare 2.3.0 release - #13857

Merged
ChiragAgg5k merged 4 commits into
2.3.xfrom
release/2.3.0
Sep 23, 2026
Merged

ChiragAgg5k merged 4 commits into
2.3.xfrom
release/2.3.0

Conversation

@ChiragAgg5k

@ChiragAgg5k ChiragAgg5k commented Sep 23, 2026 •

Copy link
Copy Markdown
Member

Appwrite 2.3 removes dev keys, builds every console link from one _APP_CONSOLE_URL, reports execution duration the way the caller experienced it, adds Jaspr to Sites and a nightly channel for self-hosting, and folds in two weeks of fixes across auth, databases, functions, messaging, storage and the installer. It ships with the 1.1.159 self-hosted Console (was 1.1.96). Upgrading from 2.2.0 is a single command and a migration that touches every project's users and identities collections.

Highlights

  • Dev keys are gone. Creating dev keys was already switched off, but existing ones were still accepted and still bypassed abuse limits, CSRF protection and origin and redirect checks, including the OAuth2 success and failure URLs. The dev key endpoints, the X-Appwrite-Dev-Key header and devKey query parameter, the devKeys.read / devKeys.write scopes and the devKeys collection are removed; migrate drops the collection and strips the scopes from API keys, functions and sites. Until you run it, the API keeps serving. (chore: remove dev keys #13696, fix: keep pre-2.3.0 installs readable after the dev keys removal #13800)
  • One setting for console links. _APP_CONSOLE_URL is the origin every console link is built from: OAuth2 success and failure defaults, magic URL, build and webhook-failure emails, VCS comments and commit statuses, and VCS installation callbacks, which now land on /projects/:projectId/settings. Leave it empty to use _APP_CONSOLE_DOMAIN (or _APP_DOMAIN) as before; set it when the console runs on a different host from the API. _APP_CONSOLE_URL_SCHEME and the legacy /console/... link shapes are gone, and /invite, /login, /recover and /register redirect to the matching console pages again. (fix(console): link the new console everywhere and drop the legacy /console scheme #13689)
  • Execution duration includes cold start. duration on an execution is now the time the caller waited, however it was triggered. Executions created through the API or run asynchronously used to report only the time after the runtime was warm, so a cold start that took 6 seconds could show as 311ms in the Console. Expect higher numbers for cold-started executions and in compute usage. (feat(functions): report execution duration as wall clock in every path #13754)
  • Native ID token sign-in keeps the token. POST /v1/account/sessions/id-token stores the verified ID token on the identity as providerIdToken (encrypted at rest, refreshed on every sign-in), so clients can read claims Appwrite does not model, such as Google's locale. The Console shows it on the user's identities. The provider parameter now only accepts providers that support ID tokens (Apple and Google) and gets its own IdTokenProvider enum in the SDKs. (feat(account): store the ID token on the identity #13698, fix(account): offer only ID token providers on the ID token session #13759)
  • Jaspr on Sites. Jaspr is available as an SSR framework, built with jaspr build on the Flutter 3.44 runtime. Pick it by hand for now; repository detection does not suggest it yet. (feat: add Jaspr SSR framework support #13710, chore: upgrade utopia-php/detector to 0.2.8 #13773, appwrite/vibes#407)
  • A nightly channel. install and upgrade take --channel nightly, or set _APP_VERSION=X.Y-nightly, to follow the newest CI-green commit on the active release branch, rebuilt daily. Nightly is unsupported and stays within one patch line; stable remains the default. (feat(releases): a nightly channel for self-hosting #13659)
  • Console 1.1.159, self-hosted build. Site preview authorization works, guests can accept organization invitations, self-hosted member invites offer Owner and Developer roles, impersonation loads files and avatars as the impersonated user, the datetime picker shows and switches time zones, and Jaspr is selectable.

Fixes

Console

  • Site preview domains send visitors to a console /auth/preview page that exists, instead of the console's 404. (appwrite/vibes#366, chore: bump self-hosted console to 1.1.101 #13714, fixes Site preview domains 404: API redirects to /auth/preview, a route the bundled Console does not implement (2.2.0 self-hosted) #13713)
  • People without an account or session can accept organization invitations. (appwrite/vibes#384, chore: bump self-hosted console to 1.1.107 #13727)
  • Member invitations and edits on self-hosted offer the organization-wide Owner and Developer roles and save the one selected. (appwrite/vibes#387, chore: bump self-hosted console to 1.1.114 #13734)
  • While impersonating a user, file previews and downloads, avatars and deployment downloads load as that user instead of returning 401. (appwrite/vibes#393, appwrite/vibes#394)
  • The datetime picker accepts hours of 10 or more and shows and switches the time zone. (appwrite/vibes#361, appwrite/vibes#356)
  • Enum values containing commas are kept intact, and creating a row with a custom ID creates it instead of trying to update a missing row. (appwrite/vibes#363, appwrite/vibes#391)
  • The users list pages past 5,000 users, and deleted users and teams show a proper not-found page. (appwrite/vibes#425, appwrite/vibes#441)
  • Function and site pages render when a referenced deployment is missing; the deployment details panel shows on small screens. (appwrite/vibes#386, appwrite/vibes#442)
  • The function create wizard takes its domains from console variables and no longer pins the domain to a branch. (appwrite/vibes#379, appwrite/vibes#416)
  • Deleting function executions and site logs works again, and the logs Method filter matches the stored request method. (appwrite/vibes#423, appwrite/vibes#422)
  • Usage and activity pages keep working when ClickHouse is unavailable. (Console 1.1.139)
  • Self-hosted shows the S3 settings, and hides the database Specification tab, account Applications and the old console link. (appwrite/vibes#362, appwrite/vibes#367, appwrite/vibes#371)

Auth and users

Databases and TablesDB

Functions and Sites

Messaging

Storage

Domains and certificates

API and GraphQL

Installer and workers

Under the hood

Removed

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.3.0

Upgrade

Upgrading from 2.2.0 uses the same command with --entrypoint="upgrade", then run the migration:

cd appwrite
docker compose exec appwrite migrate

The migration drops the devKeys collection and project attribute from the console database, removes the dev key scopes from API keys, functions and sites, and in every project adds providerIdToken to identities and a passwordPwned attribute and index to users, restoring any missing email metadata attributes on the way. Its run time grows with the number of projects. The upgraded compose file adds an appwrite-mqtt container and has Traefik publish ports 8883 and 8084; set _APP_MQTT_PORT and _APP_MQTT_WSS_PORT in .env if those are taken. Remove _APP_CONSOLE_URL_SCHEME from your .env, and set _APP_CONSOLE_URL if your console is served from a different host than the API. To roll back to 2.2.0, stop the workers and let queued jobs drain first, since the older queue client can't recover jobs the new one has reserved. Back up your data first.

Contributors

Thank you to everyone who contributed to 2.3.0:

@HarshMN2345 @ChiragAgg5k @Meldiron @levivannoort @loks0n @TorstenDittmann @ArnabChatterjee20k @imtia33 @jaysomani @deepshekhardas @abnegate @lohanidamodar


Left out of the notes

These are in 2.3.0 but have no screen in the 1.1.159 self-hosted console, or only matter on Cloud, so the notes above leave them out:

Also in this PR

  • app/config/variables.php: introduction for _APP_CONSOLE_URL was 2.2.1 (no such release) and for _APP_PWNED_PASSWORDS_DSN was TBD; both are now 2.3.0. _APP_GEO_ENDPOINT, _APP_GEO_SECRET and _APP_MAINTENANCE_RETENTION_SCHEDULES said TBD but shipped in 2.0.0.
  • The 2.2.0 tag shipped console 1.1.96 (the 1.1.101–1.1.114 bumps landed after the tag), so the console fixes cover vibes 1.1.97 → 1.1.159.
  • app/config/variables.php: new MQTT category defining _APP_MQTT_PORT, _APP_MQTT_WSS_PORT, _APP_MQTT_REPLAY_DEPTH and _APP_MQTT_MAX_PACKET_SIZE (introduced 2.3.0), so the installer writes them and the docs list them. The Upgrade notes refer to the two port overrides. _APP_MQTT_WS_PORT stays internal because Traefik routes to 8083.
  • docker-compose.yml: removed _APP_LOGGING_CONFIG_REALTIME and _APP_POOL_ADAPTER=swoole from appwrite-mqtt; nothing reads them.

@greptile-apps

greptile-apps Bot commented Sep 23, 2026 •

Copy link
Copy Markdown
Contributor

@github-actions

github-actions Bot commented Sep 23, 2026 •

Copy link
Copy Markdown

✨ Benchmark results

Comparing 2.3.x (before) → release/2.3.0 (after).

Metric Before After Change
🚀 Requests/sec 183.76 183.15 ⚪ -0.3%
⏱️ Latency P50 94.65 ms 94.34 ms ⚪ -0.3%
⏱️ Latency P95 223.03 ms 225.06 ms ⚪ +0.9%
Per-scenario breakdown & investigation details

Metrics below reflect the current branch (after). Δ P95 compares against the base.

Scenario P50 (ms) P95 (ms) Requests RPS Δ P95 (ms)
API total 94.34 225.06 11,400 183.15 +2.03
Account 178.37 341.07 600 10.33 -14.22
TablesDB 91.27 177.08 6,200 102.22 +2.74
Storage 87.3 196.43 3,000 51 +8.54
Functions 136.14 263.62 1,600 27.79 -3.12

Top API waits (after)

API request Max wait (ms)
account.name.update 560.6
tablesdb.rows.update 461.93
tablesdb.rows.create 460.73
functions.delete 448.04
account.prefs.update 423.12

Comment thread tests/unit/Migration/Version/V25Test.php Outdated
@ChiragAgg5k
ChiragAgg5k merged commit d66a7ef into 2.3.x Sep 23, 2026
50 checks passed
@ChiragAgg5k
ChiragAgg5k deleted the release/2.3.0 branch September 23, 2026 13:12
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant