Skip to content

docs: add databases content#3018

Open
abnegate wants to merge 21 commits into
mainfrom
feat-dedicated-db
Open

docs: add databases content#3018
abnegate wants to merge 21 commits into
mainfrom
feat-dedicated-db

Conversation

@abnegate
Copy link
Copy Markdown
Member

@abnegate abnegate commented May 21, 2026

Summary

Content for databases

  • 11 new docs pages under products/databases/dedicated/: overview, specifications, connect, high-availability, backups, branches, extensions, pooler, sql-api, network, monitoring.
  • Announcement blog post with 8 FAQs (author: jake-barnby, category: announcement).
  • Changelog entry dated 2026-05-21 linking to both the blog post and the docs.
  • The new docs are wired into the existing databases sidebar with "New" badges, and a cross-link callout is added from the main databases overview.

Add the docs, blog post, and changelog entry for the dedicated databases
launch. Covers managed PostgreSQL, MySQL, MariaDB, and MongoDB engines on
Appwrite Cloud, with high availability, point-in-time recovery, branching,
extensions, a connection pooler, and a managed SQL API.

* 11 docs pages under products/databases/dedicated (overview, specifications,
  connect, high-availability, backups, branches, extensions, pooler, sql-api,
  network, monitoring) wired into the databases sidebar.
* Cross-link callout from the main databases overview to the new section.
* Hide the "new TablesDB API" banner on the dedicated routes since it's
  scoped to the document store.
* Announcement blog post with 8 FAQs.
* Changelog entry for 2026-05-21.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings May 21, 2026 03:11
@appwrite
Copy link
Copy Markdown

appwrite Bot commented May 21, 2026

Appwrite Website

Project ID: 69d7efb00023389e8d27

Sites (1)
Site Status Logs Preview QR
 website
69d7f2670014e24571ca
Building Building View Logs Preview URL QR Code

Website (appwrite/website)

Project ID: 684969cb000a2f6c0a02

Sites (1)
Site Status Logs Preview QR
 website
68496a17000f03d62013
Queued Queued View Logs Preview URL QR Code


Tip

Sites auto-generate unique domains with the pattern https://randomstring.appwrite.network

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Launches the customer-facing documentation and announcement content for Appwrite Cloud Dedicated databases (managed PostgreSQL/MySQL/MariaDB/MongoDB), and wires the new docs section into the existing Databases documentation navigation.

Changes:

  • Adds a new Dedicated databases docs section (overview + 10 feature pages) under docs/products/databases/dedicated/.
  • Updates Databases docs landing + sidebar layout to surface Dedicated databases and hide the TablesDB “New API” banner on dedicated routes.
  • Adds an announcement blog post and a changelog entry linking to the blog + docs.

Reviewed changes

Copilot reviewed 15 out of 15 changed files in this pull request and generated 5 comments.

Show a summary per file
File Description
src/routes/docs/products/databases/dedicated/+page.markdoc Adds Dedicated databases overview (engines, regions, feature cards, limits, billing).
src/routes/docs/products/databases/dedicated/specifications/+page.markdoc Adds specs/pricing, free tier caps, overage/add-ons, resize behavior guidance.
src/routes/docs/products/databases/dedicated/connect/+page.markdoc Documents credential retrieval, connecting via CLIs/drivers, password rotation, extra users.
src/routes/docs/products/databases/dedicated/high-availability/+page.markdoc Documents HA modes, enabling HA, auto/manual failover behavior, limits.
src/routes/docs/products/databases/dedicated/backups/+page.markdoc Documents backups, retention, PITR, restore/verify flows, encryption/storage targets.
src/routes/docs/products/databases/dedicated/branches/+page.markdoc Documents branching from snapshots + CI preview workflow example.
src/routes/docs/products/databases/dedicated/extensions/+page.markdoc Documents PostgreSQL extension management endpoints and limits.
src/routes/docs/products/databases/dedicated/pooler/+page.markdoc Documents per-DB pooler config, modes, read/write splitting, sizing guidance.
src/routes/docs/products/databases/dedicated/sql-api/+page.markdoc Documents SQL API enablement/config, execution, bindings, errors, audit behavior.
src/routes/docs/products/databases/dedicated/network/+page.markdoc Documents hostname/TLS/IP allowlist/connection limits + security guidance.
src/routes/docs/products/databases/dedicated/monitoring/+page.markdoc Documents metrics/usage/slow queries/explain/insights/audit/events endpoints.
src/routes/docs/products/databases/+page.markdoc Adds callout linking users to Dedicated databases from the document-store landing page.
src/routes/docs/products/databases/+layout.svelte Adds Dedicated databases section to the docs sidebar + hides TablesDB subtitle/banner on dedicated routes.
src/routes/blog/post/announcing-dedicated-databases/+page.markdoc Adds announcement post (with FAQs) for Dedicated databases launch.
src/routes/changelog/(entries)/2026-05-21.markdoc Adds changelog entry linking to announcement + docs.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread src/routes/blog/post/announcing-dedicated-databases/+page.markdoc
Comment thread src/routes/changelog/(entries)/2026-05-21.markdoc
Comment thread src/routes/docs/products/databases/dedicated/+page.markdoc Outdated
Comment thread src/routes/docs/products/databases/dedicated/branches/+page.markdoc
Comment thread src/routes/docs/products/databases/dedicated/pooler/+page.markdoc
@greptile-apps
Copy link
Copy Markdown
Contributor

greptile-apps Bot commented May 21, 2026

Greptile Summary

This PR adds 11 new documentation pages for dedicated databases, an announcement blog post, and a changelog entry, plus the necessary sidebar wiring and a Compute service entry in the references index. The infrastructure changes (layout, references.ts, sidebar) are clean; the content pages contain several factual and code-correctness issues that carry over from the previous review round and one new one identified here.

  • New docs (11 pages): overview, specifications, connect, high-availability, backups/PITR, branches, extensions, pooler, SQL API, network, and monitoring under products/databases/dedicated/, each with full multi-language SDK code samples.
  • Blog post + changelog: announcement post with FAQs and a changelog entry dated 2026-05-21; the cover image file is still missing from the PR.
  • Sidebar + references: +layout.svelte adds the Dedicated databases nav section with isNewUntil('31 Aug 2026') badges and correctly suppresses the legacy-API banner; references.ts registers the new Compute service.

Confidence Score: 3/5

The infrastructure changes are safe but several content pages contain code snippets and factual claims that will mislead users who copy them.

The Go connection snippet in the connect page panics on any connection error; the CI workflow example hardcodes a single region endpoint; the SQL API page claims all four engines are supported while providing only SQL examples; the monitoring page omits the subscription-path format for lifecycle events like failover.completed; the network page MongoDB TLS table contradicts the prose beneath it; and the changelog contradicts the blog post FAQ on region selection.

connect/+page.markdoc, branches/+page.markdoc, sql-api/+page.markdoc, monitoring/+page.markdoc, network/+page.markdoc, changelog/2026-05-21.markdoc

Important Files Changed

Filename Overview
src/routes/docs/products/databases/dedicated/monitoring/+page.markdoc New monitoring page; lifecycle event names (spindown, storage.autoscaled, failover.completed) are mentioned in prose without a documented subscription path, and DATABASE_INTERNAL_ID is unexplained relative to DATABASE_ID (flagged in previous review).
src/routes/docs/products/databases/dedicated/connect/+page.markdoc New connect page; the Go snippet at line 527 discards the error from pgx.Connect and then unconditionally defers conn.Close, causing a nil-pointer panic on connection failure (flagged in previous review).
src/routes/docs/products/databases/dedicated/branches/+page.markdoc New branches page; CI workflow example hardcodes the Frankfurt region for both create and delete calls (flagged in previous review).
src/routes/docs/products/databases/dedicated/sql-api/+page.markdoc New SQL API page; claims "supports all four engines" but every example and concept (SELECT/INSERT/UPDATE/DELETE, positional $1/$2 bindings, DDL restrictions) is SQL-only with no MongoDB guidance, and truncation vs. hard-rejection behaviour is undocumented (both flagged in previous review).
src/routes/docs/products/databases/dedicated/network/+page.markdoc New network page; MongoDB TLS table lists ssl=true but the next sentence says MongoDB is not yet TLS-terminated and returns ssl=false (flagged in previous review).
src/routes/changelog/(entries)/2026-05-21.markdoc New changelog entry; "pick a region" wording contradicts the blog post FAQ's explicit statement that there is no per-database region selector (flagged in previous review).
src/routes/blog/post/announcing-dedicated-databases/+page.markdoc New announcement blog post; cover image reference is present but the image file is not included in the PR (flagged in previous review); body content is consistent with dedicated database docs.
src/routes/docs/products/databases/+layout.svelte Adds Dedicated databases sidebar section with 11 entries and correct isNewUntil dates; hideSubtitleRoutes correctly includes 'dedicated' to suppress the TablesDB legacy API banner on all dedicated pages.
src/lib/utils/references.ts Adds Compute to the Service enum and serviceMap; consistent with the new references sidebar entry and compute.md description.

Reviews (14): Last reviewed commit: "docs(databases): use appwrite.center for..." | Re-trigger Greptile

Comment thread src/routes/blog/post/announcing-dedicated-databases/+page.markdoc
Comment thread src/routes/docs/products/databases/dedicated/branches/+page.markdoc
Comment thread src/routes/docs/products/databases/dedicated/sql-api/+page.markdoc
…onnect page

`nodejs` is not a registered highlight.js language alias — only `server-nodejs`
(which maps to `js`) works. The SSR pass blew up with "Unknown language: nodejs"
on every request, so the page 500'd and the sidebar link looked like it did
nothing.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Comment thread src/routes/docs/products/databases/dedicated/connect/+page.markdoc
Switch '125m CPU' / '125 mCPU' / '125m – 16000m' to '0.125 vCPU' /
'0.125 – 16 vCPU'. mCPU is a Kubernetes/internal unit; users think in
fractional vCPUs.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Comment thread src/routes/docs/products/databases/dedicated/branches/+page.markdoc
50% per replica is not sustainable at the higher specifications — at $860/mo
the underlying infrastructure cost per replica is close to the full spec
price. Raising to 75% matches the cross-region replica rate and preserves
margin on Business+ tiers.

Applied to cloud config and tests in a separate change.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Comment thread src/routes/docs/products/databases/dedicated/pooler/+page.markdoc
abnegate and others added 4 commits May 21, 2026 15:54
All replica-style add-ons (HA replicas, cross-region replicas, and the
cross-region standby) now bill at 75% of the underlying specification.
The standby is just a cross-region replica configured for automatic
failover, so they price identically.

Removes the separate "Cross-region standby" row from the add-on table
and adds a one-liner explaining that the standby is a special-case
cross-region replica.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The endpoint mutates an existing resource (the primary user's password),
which is what PATCH is for. POST was the wrong verb. Updated the docs
example to use PATCH.

The same change ships in cloud (endpoint, e2e tests, internal docs).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Replace the bare CURL examples in the Connect page with multicode blocks
covering all server SDKs (Node.js, Deno, PHP, Python, Ruby, .NET, Dart,
Kotlin, Swift, Go, Rust) plus CURL as the last entry, matching the
pattern used elsewhere in the docs and blog posts. SDK calls go through
the Compute service since the endpoint lives at /v1/compute/...

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…lover steps

- Replace every em-dash with a comma in the new docs and blog post (12 files).
- 'Appwrite's internal regional network' becomes 'the Appwrite network'.
- Reduce the automatic-failover numbered list to a two-sentence summary.
  The engine-specific promote commands and per-step accounting belonged
  in the internal docs, not the user-facing page.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Comment thread src/routes/docs/products/databases/dedicated/pooler/+page.markdoc Outdated
abnegate and others added 2 commits May 21, 2026 16:17
Convert every API curl example in the dedicated databases docs to a
{% multicode %} block. Server SDKs (Node.js, Deno, PHP, Python, Ruby,
.NET, Dart, Kotlin, Swift, Go, Rust) come first, with curl as the last
tab. ~32 endpoints converted across high-availability, backups,
branches, extensions, pooler, sql-api, network, and monitoring pages.

Mark cross-region failover and cross-region replicas as 'coming soon'
in the HA and specifications pages. Replace 'quiesce' on the branches
page with 'pause writes', since the term reads as jargon to anyone who
isn't a DB engineer.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The branches page had two adjacent identical {% multicode %} blocks
calling listDatabaseBranches. Drop the one in the 'Create a branch'
section in favour of a sentence that links to the canonical 'List
branches' section below.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@abnegate abnegate changed the title docs: add dedicated databases launch content docs: add databases content May 21, 2026
abnegate and others added 3 commits May 21, 2026 16:56
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
cover: /images/blog/announcing-dedicated-databases/cover.avif
---

Appwrite Cloud now supports [**Dedicated databases**](/docs/products/databases/dedicated), managed PostgreSQL, MySQL, MariaDB, and MongoDB engines running next to your existing Functions, Sites, and Storage. Pick an engine (Postgres 17/18, MySQL 8.0/8.4, MariaDB 10.11/11.4, MongoDB 7.0/8.0), pick a region (Frankfurt, New York, San Francisco, Singapore, Sydney, Toronto), pick a specification from `s-1vcpu-1gb` at $13/mo to `s-8vcpu-64gb` at $699/mo, and connect with `psql`, `mysql`, `mongosh`, or any standard driver.
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 "Pick a region" contradicts the blog post FAQ

The changelog entry tells readers they can "pick a region (Frankfurt, New York, San Francisco, Singapore, Sydney, Toronto)" when creating a dedicated database. The blog post FAQ in the same PR explicitly states the opposite: "there's no per-database region selector" and "A dedicated database lives in the same region as the project that owns it." A user who reads the changelog first will arrive at the Console expecting a region dropdown and be confused when one doesn't exist — or will open a support ticket asking why they can't move the database to a different region from their project. One of the two needs to align with the actual product behaviour.

description: Execute parameterised SQL against a dedicated database over HTTPS without opening a TCP connection. Useful from edge runtimes, serverless functions, and CI scripts.
---

The **SQL API** is a managed HTTP endpoint that executes one parameterised SQL statement against a dedicated database and returns the result as JSON. It runs alongside the database itself, so it sees the same latency as a local connection, but you call it from anywhere a TCP database connection isn't practical (edge runtimes, serverless functions on cold starts, CI scripts, internal admin tools).
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 SQL API engine support claim contradicts MongoDB-incompatible examples

The introduction states "The SQL API is opt-in per database and supports all four engines," yet the entire page uses SQL-only concepts: SELECT/INSERT/UPDATE/DELETE statement types, sqlApiAllowedStatements, positional $1/$2 bindings, and schema-altering SQL DDL restrictions. MongoDB uses MQL, not SQL — a MongoDB user who enables the SQL API and POSTs a standard MongoDB query will receive a parse error with no guidance on what format is actually expected. If the API genuinely translates SQL to MQL for MongoDB, the page needs at least one MongoDB-specific example and a note on syntax differences; if it doesn't, the "supports all four engines" claim should be corrected or scoped explicitly to SQL engines.

Comment on lines +215 to +220
compute.WithUpdateDatabaseSqlApiAllowedStatements([]string{"SELECT"}),
compute.WithUpdateDatabaseSqlApiMaxRows(10000),
compute.WithUpdateDatabaseSqlApiMaxBytes(10485760),
compute.WithUpdateDatabaseSqlApiTimeoutSeconds(30),
)
if err != nil {
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Truncation vs rejection behavior is undocumented and contradicted by the config table

The configuration table says sqlApiMaxBytes is a "Hard payload cap; truncates beyond," implying the response is always truncated with truncated: true. But the error table says dedicated_database_sql_api_result_too_large is "returned as 200 with truncated: true if soft-truncating, 400 if rejecting outright." There is no explanation of when a request is soft-truncated versus hard-rejected: a user who relies on truncated: true to page through results and receives an unexpected 400 will have no way to understand what changed or what threshold triggers rejection rather than truncation.

abnegate and others added 4 commits June 8, 2026 13:41
Registers the Compute service in the API reference sidebar, landing grid,
and service description, and bumps @appwrite.io/specs to a console spec
carrying the current compute database API (PATCH credential rotation,
database specifications, and backup policy endpoints). Per-endpoint
rendering of the console-only spec is left as follow-up for the UI work.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Updates connect and network pages to the connection-string parameters the
credentials endpoint actually returns (ssl=true for MySQL/MariaDB,
sslmode=require for PostgreSQL), notes MySQL 8.x caching_sha2_password
requires TLS, flags that MongoDB is not yet TLS-terminated at the proxy,
and documents the longer provisioning window.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Comment on lines +25 to +32
| Engine | Connection string parameter |
|------------|--------------------------------------------------------------------------------------|
| PostgreSQL | `sslmode=require` |
| MySQL | `ssl=true` |
| MariaDB | `ssl=true` |
| MongoDB | `ssl=true`, alongside `authSource=admin`, `directConnection=true`, and `retryWrites=true` |

Proxy TLS termination currently covers PostgreSQL, MySQL, and MariaDB. MongoDB connections are not yet TLS-terminated at the proxy and return `ssl=false`.
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 MongoDB TLS table contradicts the implementation note below it

The TLS parameter table lists ssl=true for MongoDB, but the very next sentence says "MongoDB connections are not yet TLS-terminated at the proxy and return ssl=false." A user who manually builds a MongoDB connection string from the table will include ssl=true; if the proxy forwards a non-TLS stream, the driver may either reject the connection (TLS handshake failure) or silently downgrade — both of which are hard to diagnose. The MongoDB row in the table should reflect the actual behaviour (ssl=false with a "(TLS not yet supported)" note) until the proxy gains MongoDB TLS support.

The dedicated database endpoints live on the appwrite.center domain, not
appwrite.network. Update the region table, connection strings, CLI and
driver examples, branch/pooler hostnames, and the launch blog post.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Comment on lines +904 to +916
# Webhooks & realtime {% #events %}

Every database lifecycle transition emits an event that fans out through Appwrite's standard event system. Subscribe with webhooks, realtime channels, or function triggers to react in your own systems:

| Event | When |
|------------------------------------------------|-----------------------------------------------|
| `databases.<id>.create` | Provisioning completed |
| `databases.<id>.update` | Any update applied (resize, HA, backups, etc.)|
| `databases.<id>.delete` | Database removed |
| `databases.<id>.backups.<bId>.create` | A backup completed (scheduled or manual) |
| `databases.<id>.restore` | A restore (full or PITR) completed |

Lifecycle events emitted by the edge, `spindown`, `storage.autoscaled`, `failover.completed`, also fan out through this same channel.
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Lifecycle event names lack documented subscription path format

The table (lines 908–914) lists CRUD events in full databases.<id>.* notation so a webhook author knows exactly what path to subscribe to. The three lifecycle events in the closing prose — spindown, storage.autoscaled, failover.completed — are listed as bare names with no indication of whether they follow the same databases.<id>.<event> pattern or a flat top-level namespace. The blog post FAQ confirms failover.completed is the literal emitted name, which does not follow the table's pattern. A developer who subscribes to databases.<id>.failover.completed based on the table's convention will never receive the event.

Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

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.

2 participants