-The [PowerSync Service](/architecture/powersync-service) and client SDK operate in unison to keep client-side SQLite databases in sync with a backend database. Learn about their architecture:
+The [PowerSync Service](/architecture/powersync-service) and client SDK operate in unison to keep client-side SQLite databases in sync with a backend source database. Learn about their architecture:
-
-
-The local SQLite database embedded in the PowerSync SDK is automatically kept in sync with the backend database, based on the [Sync Rules](/usage/sync-rules) configured by the developer:
+The Client SDK provides access to a managed [SQLite](/resources/faq#why-does-powersync-use-sqlite-as-the-client-side-database) database that is automatically kept in sync with the backend source database via the PowerSync Service, based on the [Sync Rules](/sync/rules/overview) that are active on the PowerSync Service instance.
-#### Writing Data
-Client-side data modifications, namely updates, deletes and inserts, are persisted in the embedded SQLite database as well as stored in an upload queue. The upload queue is a blocking [FIFO](https://en.wikipedia.org/wiki/FIFO_%28computing_and_electronics%29) queue that gets processed when network connectivity is available.
+## Reading Data (SQLite)
-Each entry in the queue is processed by writing the entry to your existing backend application API, using a function [defined by you](/installation/client-side-setup/integrating-with-your-backend) (the developer). This is to ensure that existing backend business logic is honored when uploading data changes. For more information, see the section on [integrating with your backend](/installation/client-side-setup/integrating-with-your-backend).
+App clients always read data from the client-side [SQLite](https://sqlite.org/) database. When the user is online and the app is connected to the PowerSync Service, changes on the source database reflect in real-time in the SQLite database, and [Live Queries / Watch Queries](/client-sdks/watch-queries) allows the app UI to have real-time reactivity too.
-
-
-
-### Schema
+## Client-Side Schema and SQLite Database Structure
-On the client, the application [defines a schema](/installation/client-side-setup/define-your-schema) with tables, columns and indexes.
+When you implement the PowerSync Client SDK in your application, you need to define a [client-side schema](/intro/setup-guide#define-your-client-side-schema) with tables, columns and indexes that correspond to your [Sync Rules](/sync/rules/overview). You provide this schema when the PowerSync-managed SQLite database is [instantiated](/intro/setup-guide#instantiate-the-powersync-database).
-These are then usable as if they were actual SQLite tables, while in reality these are created as SQLite views.
+The tables defined in your client-side schema are usable in SQL queries as if they were actual SQLite tables, while in reality they are created as _SQLite views_ based on the schemaless JSON data being synced (see [PowerSync Protocol](/architecture/powersync-protocol)).
-The client SDK maintains the following tables:
-1. `ps_data__| Task | +Used For | +Description | +
|---|---|---|
| `generate_keys` | ++ [Authentication Integration](/configuration/app-backend/setup) + | +This is a task that can be used to generate a private/public key pair which the `jwks` and `token` tasks (see below) require. This task does **not** expose an HTTP endpoint and should only be used for development and getting started. | +
| `jwks` | ++ [Authentication Integration](/configuration/app-backend/setup) + | +This task [exposes an HTTP endpoint](https://docs.journeyapps.com/reference/cloudcode/triggering-a-cloudcode-task/trigger-cc-via-http) which has a `GET` function which returns the public [JWKS](https://stytch.com/blog/understanding-jwks/) details. | +
| `token` | ++ [Authentication Integration](/configuration/app-backend/setup) + | +This task exposes an HTTP endpoint which has a `GET` function. The HTTP endpoint can be called by your [`fetchCredentials()` function](/configuration/app-backend/client-side-integration) when implementing the PowerSync Client SDK, to generate a JWT that the Client SDK can use to authenticate against the PowerSync Service. | +
| `upload` | ++ [Client Mutations](/configuration/app-backend/setup) + | +This task exposes an HTTP endpoint which has a `POST` function which is used to process uploaded mutations from a PowerSync client and persist it to the source MongoDB database. The HTTP endpoint can be called by your [`uploadData()` function](/configuration/app-backend/client-side-integration) when implementing the PowerSync Client SDK. | +
-3. Capture the variable name in the **Name** text field.
-4. Capture the variable value in the **Value** text field.
-5. (Suggested) Check the **Masked** checkbox to obfuscate the variable value for security purposes.
-6. Repeat until all the variables are added.
+4. Capture the variable name in the **Name** text field.
+5. Capture the variable value in the **Value** text field.
+6. (Suggested) Check the **Masked** checkbox to obfuscate the variable value for security purposes.
+7. Repeat until all the variables are added.
To finalize the setup, do the following:
1. Select the **Save** button. This is important, otherwise the variables will not save.
2. Deploy the deployment: you can do so by selecting the **Deploy app** button.
-### 4. Test
-Open your browser and navigate to `
+
+
+
+### Processing Mutations From Clients
+
+- **Server-Side Implementation**: [Writing Client Changes](/handling-writes/writing-client-changes) provides guidance on how you can handle mutations in your backend application.
+- **Client-Side Implementation**: See [Client-Side Integration](/configuration/app-backend/client-side-integration)
+
+
+### Authentication (Optional)
+
+Some authentication providers already generate JWTs for users which PowerSync can work with directly — see [Authentication Setup](/configuration/auth/overview).
+
+For others, some backend code/logic must be added to your backend application to generate the JWTs needed for PowerSync — see [Custom](/configuration/auth/custom) authentication.
+
+In your [client-side](/configuration/app-backend/client-side-integration) _backend connector_ implementation, you need to define the `fetchCredentials()` function so that it returns a JWT which can be used by PowerSync Client SDK to authenticate with the [PowerSync Service](/architecture/powersync-service).
+
+
+## Backend Options
+
+If you already some kind of backend application as part of your stack, it's best to use that existing backend. Otherwise, there are several options for what you can use: (this is not an exhaustive list)
+
+### Custom Backend
+
+Our [Example Projects](/intro/examples#backend-examples) page provides simple reference implementations of custom backends (e.g. Node.js, Django, Rails, .NET, etc.)
+
+
+### Backend-as-a-Service / Developer Platforms
+
+There are several backend-as-a-service developer platforms that work well with PowerSync, for example:
+- **Supabase** (for Postgres): Several of our demo apps demonstrate how to use [Supabase](https://supabase.com/) as the Postgres-based backend. Supabase provides both an authentication service, PostgREST data APIs, and edge functions for more custom logic. See our [integration guide](/integrations/supabase/guide).
+- **Neon** (for Postgres): Similarly to Supabase, [Neon](http://neon.tech/) provides PostgREST data APIs and an authentication service. See our [integration guide](/integrations/neon).
+
+
+### Serverless Functions
+
+You can use a serverless functions system like Azure Functions, AWS Lambda, Google Cloud Functions, Cloudflare Workers, Vercel Functions, Netlify Functions, Fastly Compute, Deno Deploy, etc.
+
+
+###
+
+
+
+## Custom Authentication Flow
+
+The process is as follows:
+
+1. Your client app authenticates the user using the app's authentication provider (either a third-party authentication provider or a custom one) and typically gets a session token.
+2. The client makes a call to your backend API (authenticated using the above session token), which generates and signs a JWT for PowerSync. (You define the [`fetchCredentials()` function](/configuration/app-backend/client-side-integration) in your _backend connector_ so that it makes the API call, and the PowerSync Client SDK automatically invokes `fetchCredentials()` as needed).
+ 1. For example implementations of this backend API endpoint, see [Custom Backend Examples](/intro/examples#backend-examples)
+3. The client connects to the PowerSync Service using the above JWT (this is automatically managed by the PowerSync Client SDK).
+4. The PowerSync Service verifies the JWT.
+
+
+## JWT Requirements
+
+Requirements for the signed JWT:
+
+1. The JWT must be signed using a key in the JWKS URL ([Option 1](#option-1:-asymmetric-jwts-—-using-jwks-url)) or the HS256 key ([Option 2](#option-2%3A-symmetric-jwts-—-using-hs256))
+2. JWT must have a `kid` matching that of the key.
+3. The `aud` of the JWT must match the PowerSync instance URL (for Cloud) or one of the audiences configured in `client_auth.audience` (for self-hosted).
+ 1. To get the instance URL when using PowerSync Cloud: In the [PowerSync Dashboard](https://dashboard.powersync.com/), click **Connect** in the top bar and copy the instance URL from the dialog.
+ 2. Alternatively, specify a custom audience in the instance settings (Cloud) or in your config file ([self-hosted](#self-hosted-configuration)).
+4. The JWT must expire in 60 minutes or less. Specifically, both `iat` and `exp` fields must be present, with a difference of 3600 or less between them.
+5. The user ID must be used as the `sub` of the JWT.
+6. Additional fields can be added which can be referenced in Sync Rules [parameter queries](/sync/rules/parameter-queries) or Sync Streams (as [`auth.parameters()`](/sync/streams/overview#accessing-parameters)).
+
+
+## Option 1: Asymmetric JWTs — Using JWKS URL
+
+A key pair (private + public key) is required to sign and verify JWTs. The private key is used to sign the JWT,
+and the public key is advertised on a public [JWKS](https://auth0.com/docs/secure/tokens/json-web-tokens/json-web-key-sets) URL.
+
+Requirements for the key in the JWKS URL:
+1. The URL must be a public URL in the [JWKS](https://auth0.com/docs/secure/tokens/json-web-tokens/json-web-key-sets) format.
+ 1. We have an example endpoint available [here](https://hlstmcktecziostiaplz.supabase.co/functions/v1/powersync-jwks) — ensure that your response looks similar.
+2. Supported signature schemes: RSA, EdDSA and ECDSA.
+3. Key type (`kty`): `RSA`, `OKP` (EdDSA) or `EC` (ECDSA).
+4.
+
+
+
+## Client Authentication Options
+
+For a quick way to get up and running during development, you can generate [Development Tokens](/configuration/auth/development-tokens) directly from the [PowerSync Dashboard](https://dashboard.powersync.com/) (PowerSync Cloud) or [locally](/configuration/auth/development-tokens#self-hosted) with a self-hosted setup.
+
+For proper authentication integration:
+
+Some authentication providers already generate JWTs for users which PowerSync can verify directly — see [Common Authentication Providers](#common-authentication-providers) below.
+
+For others, some backend code must be added to your application backend to generate the JWTs needed for PowerSync — see [Custom](/configuration/auth/custom) authentication.
+
+
+## Common Authentication Providers
+
+PowerSync supports JWT-based authentication from various providers. The table below shows commonly used authentication providers, their JWKS URLs, and any specific configuration requirements.
+
+
-2. Add all the required [binlog configuration](/installation/database-setup#binlog-configuration) parameters. For example:
+2. Add all the required [binlog configuration](/configuration/source-db/setup#binlog-configuration) parameters. For example:
3. Associate your newly created parameter group with your Aurora cluster:
- 1. In the navigation pane, choose Databases.
+ 1. In the navigation pane, choose **Databases**.
2. Select your Aurora cluster.
- 3. Choose Modify.
- 4. In the DB Parameter Group section, select the parameter group you created.
- 5. Click Continue and then Apply immediately.
-4. Whitelist PowerSync's IPs in your Aurora cluster's security group to allow access. See [Security and IP Filtering](/installation/database-setup/security-and-ip-filtering) for more details.
+ 3. Choose **Modify**.
+ 4. In the **DB Parameter Group** section, select the parameter group you created.
+ 5. Click **Continue** and then **Apply** immediately.
+4. Whitelist PowerSync's IPs in your Aurora cluster's security group to allow access. See [Security and IP Filtering](/configuration/source-db/security-and-ip-filtering) for more details.
5. In the [PowerSync Dashboard](https://dashboard.powersync.com/), select your project and instance and go to the **Database Connections** view.
-6. Click **Connect to Source Database** and ensure the **"MySQL"** tab is selected.
+6. Click **Connect to Source Database** and ensure the **MySQL** tab is selected.
7. Fill in your MySQL connection details from AWS Aurora:
1. "**Name**", "**Host**", "**Port**", "**Database name**", "**Username**", "**Password**" are required.
2. "**Name**" can be any name for the connection.
@@ -209,9 +216,10 @@ PowerSync deploys and configures an isolated cloud environment for you, which ca
diff --git a/docs.json b/docs.json
index 176829af..e1b26dbd 100644
--- a/docs.json
+++ b/docs.json
@@ -13,6 +13,9 @@
"dark": "/logo/dark.svg",
"href": "https://www.powersync.com/"
},
+ "interaction": {
+ "drilldown": true
+ },
"navbar": {
"links": [
{
@@ -34,7 +37,30 @@
"x": "https://x.com/powersync_",
"youtube": "https://www.youtube.com/@powersync_",
"linkedin": "https://www.linkedin.com/showcase/journeyapps-powersync/"
- }
+ },
+ "links": [
+ {
+ "header": "Resources",
+ "items": [
+ {
+ "label": "Release Notes",
+ "href": "https://releases.powersync.com"
+ },
+ {
+ "label": "System Status",
+ "href": "https://status.powersync.com/"
+ },
+ {
+ "label": "Roadmap",
+ "href": "https://roadmap.powersync.com"
+ },
+ {
+ "label": "Blog",
+ "href": "https://www.powersync.com/blog"
+ }
+ ]
+ }
+ ]
},
"contextual": {
"options": [
@@ -54,430 +80,343 @@
"navigation": {
"tabs": [
{
- "tab": "Documentation",
+ "tab": " ",
"groups": [
{
- "group": "Introduction",
+ "group": "Get Started",
+ "icon": "rocket",
"pages": [
"intro/powersync-overview",
- "intro/powersync-philosophy"
+ "intro/setup-guide",
+ {
+ "group": "Understand PowerSync",
+ "pages": [
+ "intro/powersync-philosophy",
+ {
+ "group": "Architecture",
+ "pages": [
+ "architecture/architecture-overview",
+ "architecture/powersync-service",
+ "architecture/client-architecture",
+ "architecture/powersync-protocol",
+ "architecture/consistency"
+ ]
+ }
+ ]
+ },
+ "intro/examples",
+ "intro/self-hosting",
+ "migration-guides/atlas-device-sync"
]
},
{
- "group": "Installation",
+ "group": "Configuration Details",
+ "icon": "gear",
"pages": [
- "installation/quickstart-guide",
{
- "group": "Source Database Setup",
+ "group": "Source Database",
"pages": [
- "installation/database-setup",
- "installation/database-setup/security-and-ip-filtering",
- "installation/database-setup/private-endpoints"
+ "configuration/source-db/setup",
+ "configuration/source-db/connection",
+ "configuration/source-db/security-and-ip-filtering",
+ "configuration/source-db/private-endpoints",
+ "configuration/source-db/postgres-maintenance"
]
},
- "installation/database-connection",
{
- "group": "Client-Side Setup",
+ "group": "PowerSync Service Setup",
"pages": [
- "installation/client-side-setup",
- "installation/client-side-setup/define-your-schema",
- "installation/client-side-setup/instantiate-powersync-database",
- "installation/client-side-setup/integrating-with-your-backend"
+ "configuration/powersync-service/cloud-instances",
+ "configuration/powersync-service/self-hosted-instances"
]
},
{
- "group": "App Backend Setup",
+ "group": "App Backend",
"pages": [
- "installation/app-backend-setup",
- "installation/app-backend-setup/writing-client-changes"
+ "configuration/app-backend/setup",
+ "configuration/app-backend/client-side-integration",
+ "configuration/app-backend/cloudcode"
]
},
{
- "group": "Authentication Setup",
+ "group": "Authentication",
"pages": [
- "installation/authentication-setup",
- "installation/authentication-setup/development-tokens",
+ "configuration/auth/overview",
+ "configuration/auth/development-tokens",
+ "configuration/auth/custom",
{
- "group": "Supabase Auth",
+ "group": "Provider Specifics",
"pages": [
- "installation/authentication-setup/supabase-auth",
- "installation/authentication-setup/supabase-auth/stytch-+-supabase"
+ {
+ "group": "Supabase Auth",
+ "pages": [
+ "configuration/auth/supabase-auth",
+ "configuration/auth/supabase-auth/stytch"
+ ]
+ },
+ "configuration/auth/firebase-auth",
+ "configuration/auth/auth0"
]
- },
- "installation/authentication-setup/firebase-auth",
- "installation/authentication-setup/auth0",
- "installation/authentication-setup/custom",
- "installation/authentication-setup/hs256-auth-tokens"
+ }
]
}
]
},
{
- "group": "Usage",
+ "group": "Sync Rules & Streams",
+ "icon": "arrows-rotate",
"pages": [
+ "sync/overview",
{
- "group": "Sync Rules",
+ "group": "Sync Rules (GA)",
"pages": [
- "usage/sync-rules",
- "usage/sync-rules/example-global-data",
- "usage/sync-rules/organize-data-into-buckets",
- "usage/sync-rules/parameter-queries",
- "usage/sync-rules/data-queries",
- "usage/sync-rules/types",
- "usage/sync-rules/client-id",
- "usage/sync-rules/compatibility",
- "usage/sync-rules/operators-and-functions",
- "usage/sync-rules/schemas-and-connections",
- "usage/sync-rules/case-sensitivity",
- "usage/sync-rules/glossary",
- "usage/sync-rules/guide-many-to-many-and-join-tables",
- {
- "group": "Advanced Topics",
- "pages": [
- "usage/sync-streams",
- "usage/sync-rules/advanced-topics",
- "usage/sync-rules/advanced-topics/multiple-client-versions",
- "usage/sync-rules/advanced-topics/client-parameters",
- "usage/sync-rules/advanced-topics/partitioned-tables",
- "usage/sync-rules/advanced-topics/sharded-databases"
- ]
- }
- ]
- },
- {
- "group": "Lifecycle / Maintenance",
- "pages": [
- "usage/lifecycle-maintenance",
- "usage/lifecycle-maintenance/implementing-schema-changes",
- {
- "group": "Deploying Schema Changes",
- "pages": [
- "usage/lifecycle-maintenance/deploying-schema-changes",
- "usage/lifecycle-maintenance/deploying-schema-changes/additive-changes",
- "usage/lifecycle-maintenance/deploying-schema-changes/renaming-a-table-on-the-server",
- "usage/lifecycle-maintenance/deploying-schema-changes/renaming-a-table-on-the-client",
- "usage/lifecycle-maintenance/deploying-schema-changes/renaming-a-table-on-both-server-and-client",
- "usage/lifecycle-maintenance/deploying-schema-changes/renaming-a-column-on-the-server",
- "usage/lifecycle-maintenance/deploying-schema-changes/renaming-a-column-on-the-client",
- "usage/lifecycle-maintenance/deploying-schema-changes/changing-a-column-type"
- ]
- },
- {
- "group": "Handling Update Conflicts",
- "pages": [
- "usage/lifecycle-maintenance/handling-update-conflicts",
- "usage/lifecycle-maintenance/handling-update-conflicts/custom-conflict-resolution"
- ]
- },
- "usage/lifecycle-maintenance/client-database-diagnostics",
- "usage/lifecycle-maintenance/handling-write-validation-errors",
- "usage/lifecycle-maintenance/upgrading-the-client-sdk",
- "usage/lifecycle-maintenance/postgres-maintenance",
- "usage/lifecycle-maintenance/compacting-buckets"
+ "sync/rules/overview",
+ "sync/rules/organize-data-into-buckets",
+ "sync/rules/global-buckets",
+ "sync/rules/parameter-queries",
+ "sync/rules/data-queries",
+ "sync/rules/client-parameters"
]
},
{
- "group": "Use Case Examples",
+ "group": "Sync Streams (Early Alpha)",
"pages": [
- "usage/use-case-examples",
- "usage/use-case-examples/attachments-files",
- "usage/use-case-examples/background-syncing",
- "usage/use-case-examples/crdts",
- "usage/use-case-examples/custom-types-arrays-and-json",
- "usage/use-case-examples/data-encryption",
- "usage/use-case-examples/full-text-search",
- "usage/use-case-examples/infinite-scrolling",
- "usage/use-case-examples/watch-queries",
- "usage/use-case-examples/high-performance-diffs",
- "usage/use-case-examples/offline-only-usage",
- "usage/use-case-examples/postgis",
- "usage/use-case-examples/pre-seeded-sqlite",
- "usage/use-case-examples/prioritized-sync",
- "usage/use-case-examples/query-json-in-sqlite",
- "usage/use-case-examples/raw-tables",
- "usage/use-case-examples/custom-write-checkpoints"
+ "sync/streams/overview"
]
},
+ "sync/types",
+ "sync/operators-and-functions",
{
- "group": "Tools",
+ "group": "Advanced",
"pages": [
- "usage/tools",
- "usage/tools/powersync-dashboard",
- "usage/tools/cli",
- "usage/tools/diagnostic-app",
- "usage/tools/monitoring-and-alerting",
- "usage/tools/cloudcode"
+ "sync/advanced/overview",
+ "sync/advanced/prioritized-sync",
+ "sync/advanced/client-id",
+ "sync/advanced/case-sensitivity",
+ "sync/advanced/compatibility",
+ "sync/advanced/many-to-many-and-join-tables",
+ "sync/advanced/schemas-and-connections",
+ "sync/advanced/multiple-client-versions",
+ "sync/advanced/partitioned-tables",
+ "sync/advanced/sharded-databases"
]
}
]
},
- {
- "group": "Integration Guides",
- "pages": [
- "integration-guides/integrations-overview",
- {
- "group": "Supabase",
- "pages": [
- "integration-guides/supabase-+-powersync",
- "integration-guides/supabase-+-powersync/handling-attachments",
- "integration-guides/supabase-+-powersync/realtime-streaming",
- "integration-guides/supabase-+-powersync/rls-and-sync-rules",
- "integration-guides/supabase-+-powersync/local-development"
- ]
- },
- {
- "group": "FlutterFlow",
- "hidden": true,
- "pages": [
- "integration-guides/flutterflow-+-powersync",
- "integration-guides/flutterflow-+-powersync/handling-attachments",
- "integration-guides/flutterflow-+-powersync/flutter-web",
- "integration-guides/flutterflow-+-powersync/full-text-search",
- "integration-guides/flutterflow-+-powersync/powersync-+-flutterflow-legacy"
- ]
- },
- "integration-guides/neon-+-powersync",
- "integration-guides/serverpod",
- "integration-guides/railway-+-powersync",
- "integration-guides/coolify"
- ]
- },
- {
- "group": "Migration Guides",
- "pages": [
- "migration-guides/mongodb-atlas",
- "migration-guides/watermelondb"
- ]
- },
- {
- "group": "Architecture",
- "pages": [
- "architecture/architecture-overview",
- "architecture/powersync-service",
- "architecture/client-architecture",
- "architecture/powersync-protocol",
- "architecture/consistency"
- ]
- }
- ]
- },
- {
- "tab": "Client SDKs",
- "groups": [
{
"group": "Client SDKs",
+ "icon": "code",
"pages": [
- "client-sdk-references/introduction",
+ "client-sdks/overview",
{
- "group": "Dart/Flutter",
- "icon": "flutter",
+ "group": "SDK Guides",
"pages": [
- "client-sdk-references/flutter",
- "client-sdk-references/flutter/flutter-web-support",
- "client-sdk-references/flutter/flutter-orm-support",
- "client-sdk-references/flutter/usage-examples",
- "client-sdk-references/flutter/state-management",
- "client-sdk-references/flutter/unit-testing",
- "client-sdk-references/flutter/encryption",
- "client-sdk-references/flutter/api-reference"
+ "client-sdks/reference/flutter",
+ "client-sdks/reference/react-native-and-expo",
+ "client-sdks/reference/javascript-web",
+ "client-sdks/reference/capacitor",
+ "client-sdks/reference/node",
+ "client-sdks/reference/kotlin",
+ "client-sdks/reference/swift",
+ "client-sdks/reference/dotnet"
]
},
{
- "group": "React Native & Expo",
- "icon": "react",
+ "group": "Frameworks/Integrations",
"pages": [
- "client-sdk-references/react-native-and-expo",
- "client-sdk-references/react-native-and-expo/expo-go-support",
- "client-sdk-references/react-native-and-expo/react-native-web-support",
- "client-sdk-references/react-native-and-expo/javascript-orm-support",
- "client-sdk-references/react-native-and-expo/usage-examples",
- "client-sdk-references/react-native-and-expo/encryption",
- "client-sdk-references/react-native-and-expo/api-reference"
+ "client-sdks/frameworks/react",
+ "client-sdks/frameworks/vue",
+ "client-sdks/frameworks/tanstack",
+ "client-sdks/frameworks/next-js",
+ "client-sdks/frameworks/flutter-web-support",
+ "client-sdks/frameworks/expo-go-support",
+ "client-sdks/frameworks/react-native-web-support"
]
},
{
- "group": "JavaScript Web",
- "icon": "js",
+ "group": "ORMs",
"pages": [
- "client-sdk-references/javascript-web",
+ "/client-sdks/orms/overview",
+ "/client-sdks/orms/flutter-orm-support",
+ {
+ "group": "JavaScript ORMs",
+ "pages": [
+ "client-sdks/orms/js/overview",
+ "client-sdks/orms/js/kysely",
+ "client-sdks/orms/js/drizzle",
+ "client-sdks/orms/js/tanstack-db"
+ ]
+ },
{
- "group": "ORM Support",
+ "group": "Kotlin SQL Libraries",
"pages": [
- "client-sdk-references/javascript-web/javascript-orm/overview",
- "client-sdk-references/javascript-web/javascript-orm/kysely",
- "client-sdk-references/javascript-web/javascript-orm/drizzle",
- "client-sdk-references/javascript-web/javascript-orm/tanstack-db"
+ "client-sdks/orms/kotlin/overview",
+ "client-sdks/orms/kotlin/sqldelight",
+ "client-sdks/orms/kotlin/room"
]
},
- "client-sdk-references/javascript-web/javascript-spa-frameworks",
- "client-sdk-references/javascript-web/usage-examples",
- "client-sdk-references/javascript-web/encryption",
- "client-sdk-references/javascript-web/api-reference"
+ "/client-sdks/orms/swift/grdb"
]
},
{
- "group": "Capacitor",
- "icon": "c",
+ "group": "Reading Data",
"pages": [
- "client-sdk-references/capacitor",
- "client-sdk-references/capacitor/javascript-orm-support"
+ "client-sdks/reading-data",
+ "client-sdks/watch-queries",
+ "client-sdks/high-performance-diffs",
+ "client-sdks/full-text-search",
+ "client-sdks/infinite-scrolling"
]
},
{
- "group": "Node.js",
- "icon": "node-js",
+ "group": "Writing Data",
"pages": [
- "client-sdk-references/node",
- "client-sdk-references/node/javascript-orm-support"
+ "client-sdks/writing-data",
+ "client-sdks/cascading-delete"
]
},
+ "client-sdks/usage-examples",
+ "client-sdks/api-references",
{
- "group": "Kotlin",
- "icon": "k",
+ "group": "Advanced",
"pages": [
- "client-sdk-references/kotlin",
{
- "group": "SQL Library Support",
+ "group": "Syncing Attachments",
"pages": [
- "client-sdk-references/kotlin/libraries/overview",
- "client-sdk-references/kotlin/libraries/sqldelight",
- "client-sdk-references/kotlin/libraries/room"
+ "client-sdks/advanced/attachments",
+ "client-sdks/advanced/attachments-aws-s3-storage",
+ "client-sdks/advanced/attachments-pdfs"
]
},
- "client-sdk-references/kotlin/usage-examples",
- "client-sdk-references/kotlin/encryption"
+ "client-sdks/advanced/custom-types-arrays-and-json",
+ "client-sdks/advanced/query-json-in-sqlite",
+ "client-sdks/advanced/sequential-id-mapping",
+ "client-sdks/advanced/raw-tables",
+ "client-sdks/advanced/pre-seeded-sqlite",
+ "client-sdks/advanced/state-management",
+ "client-sdks/advanced/crdts",
+ "client-sdks/advanced/gis-data-postgis",
+ "client-sdks/advanced/unit-testing",
+ "client-sdks/advanced/local-only-usage",
+ "client-sdks/advanced/background-syncing",
+ "client-sdks/advanced/data-encryption"
+ ]
+ }
+ ]
+ },
+ {
+ "group": "Handling Writes",
+ "icon": "pen",
+ "pages": [
+ {
+ "group": "Upload Queue/Uploads",
+ "pages": [
+ "handling-writes/writing-client-changes",
+ "handling-writes/handling-write-validation-errors"
]
},
{
- "group": "Swift",
- "icon": "swift",
+ "group": "Conflicts",
"pages": [
- "client-sdk-references/swift",
- "client-sdk-references/swift/usage-examples",
- "client-sdk-references/swift/grdb"
+ "handling-writes/handling-update-conflicts",
+ "handling-writes/custom-conflict-resolution"
]
},
{
- "group": ".NET",
- "icon": "microsoft",
+ "group": "Advanced",
"pages": [
- "client-sdk-references/dotnet"
+ "handling-writes/custom-write-checkpoints"
]
}
]
- }
- ]
- },
- {
- "tab": "Self-Hosting",
- "groups": [
+ },
{
- "group": "Self-Hosting",
+ "group": "Maintenance & Ops",
+ "icon": "screwdriver-wrench",
"pages": [
- "self-hosting/getting-started",
{
- "group": "Installation",
+ "group": "Debugging",
"pages": [
- "self-hosting/installation",
- "self-hosting/installation/database-setup",
- "self-hosting/installation/powersync-service-setup",
- "self-hosting/installation/client-side-setup",
- "self-hosting/installation/app-backend-setup"
+ "debugging/troubleshooting",
+ "debugging/error-codes",
+ "tools/diagnostics-client",
+ "maintenance-ops/client-database-diagnostics"
]
},
- "self-hosting/local-development",
+ "maintenance-ops/monitoring-and-alerting",
+ "maintenance-ops/production-readiness-guide",
+ "maintenance-ops/compacting-buckets",
{
- "group": "Lifecycle / Maintenance",
+ "group": "Handling Schema Changes",
"pages": [
- "self-hosting/lifecycle-maintenance",
- "self-hosting/lifecycle-maintenance/securing-your-deployment",
- "self-hosting/lifecycle-maintenance/healthchecks",
- "self-hosting/lifecycle-maintenance/telemetry",
- "self-hosting/lifecycle-maintenance/metrics",
- "self-hosting/lifecycle-maintenance/diagnostics",
- "self-hosting/lifecycle-maintenance/migrating",
- "self-hosting/lifecycle-maintenance/multiple-instances"
+ "maintenance-ops/implementing-schema-changes",
+ "maintenance-ops/deploying-schema-changes"
]
},
- "self-hosting/enterprise",
{
- "group": "Appendix",
+ "group": "Self-Hosting",
"pages": [
- "self-hosting/appendix",
- "self-hosting/appendix/database-connection"
+ "maintenance-ops/self-hosting/advanced",
+ "maintenance-ops/self-hosting/deployment-architecture",
+ "maintenance-ops/self-hosting/update-sync-rules",
+ "maintenance-ops/self-hosting/healthchecks",
+ "maintenance-ops/self-hosting/securing-your-deployment",
+ "maintenance-ops/self-hosting/metrics",
+ "maintenance-ops/self-hosting/telemetry",
+ "maintenance-ops/self-hosting/diagnostics",
+ "maintenance-ops/self-hosting/multiple-instances",
+ "maintenance-ops/self-hosting/migrating-instances"
]
}
]
- }
- ]
- },
- {
- "tab": "Tutorials",
- "groups": [
- {
- "group": " ",
- "pages": [
- "tutorials/overview"
- ]
},
{
- "group": "Client",
+ "group": "Integrations",
+ "icon": "plug",
"pages": [
- "tutorials/client/overview",
- {
- "group": "Client SDKs",
- "pages": [
- "tutorials/client/sdks/web/next-js"
- ]
- },
+ "integrations/overview",
{
- "group": "Attachments / Files",
+ "group": "Supabase",
"pages": [
- "tutorials/client/attachments-and-files/overview",
- "tutorials/client/attachments-and-files/aws-s3-storage-adapter",
- "tutorials/client/attachments-and-files/pdf-attachment"
+ "integrations/supabase/guide",
+ "integrations/supabase/attachments",
+ "integrations/supabase/realtime-streaming",
+ "integrations/supabase/rls-and-sync-rules",
+ "integrations/supabase/local-development",
+ "integrations/supabase/connector-performance"
]
},
{
- "group": "Performance",
+ "group": "FlutterFlow",
+ "hidden": true,
"pages": [
- "tutorials/client/performance/overview",
- "tutorials/client/performance/supabase-connector-performance"
+ "integrations/flutterflow/guide",
+ "integrations/flutterflow/attachments",
+ "integrations/flutterflow/legacy-guide"
]
},
- {
- "group": "Data Management",
- "pages": [
- "tutorials/client/data/overview",
- "tutorials/client/data/cascading-delete",
- "tutorials/client/data/sequential-id-mapping"
- ]
- }
+ "integrations/neon",
+ "integrations/serverpod",
+ "integrations/railway",
+ "integrations/coolify"
]
},
{
- "group": "Self-Hosting",
+ "group": "Tools",
+ "icon": "toolbox",
"pages": [
- "tutorials/self-host/overview",
- "tutorials/self-host/generate-dev-token"
- ]
- }
- ]
- },
- {
- "tab": "Resources",
- "groups": [
+ "tools/overview",
+ "tools/cli",
+ "tools/powersync-dashboard",
+ "tools/diagnostics-client",
+ "tools/local-development",
+ "tools/ai-tools"
+ ]
+ },
{
"group": "Resources",
+ "icon": "book",
"pages": [
- "resources/demo-apps-example-projects",
- {
- "group": "Troubleshooting",
- "pages": [
- "resources/troubleshooting",
- "resources/troubleshooting/error-codes"
- ]
- },
{
"group": "Usage & Billing",
"pages": [
@@ -486,16 +425,11 @@
"resources/usage-and-billing/usage-and-billing-faq"
]
},
- "resources/ai-tools",
"resources/performance-and-limits",
- "resources/production-readiness-guide",
"resources/supported-platforms",
"resources/feature-status",
"resources/faq",
"resources/local-first-software",
- "resources/release-notes",
- "resources/roadmap",
- "resources/blog",
"resources/security",
"resources/hipaa",
"resources/contact-us"
@@ -529,177 +463,785 @@
"source": "/overview-1",
"destination": "/intro/powersync-overview"
},
+ {
+ "source": "/overview/powersync-philosophy",
+ "destination": "/intro/powersync-philosophy"
+ },
{
"source": "/quickstart-guide",
- "destination": "/installation/quickstart-guide"
+ "destination": "/intro/setup-guide"
},
{
- "source": "/overview/powersync-philosophy",
- "destination": "/intro/powersync-philosophy"
+ "source": "/installation/quickstart-guide",
+ "destination": "/intro/setup-guide"
},
{
"source": "/usage/quickstart-guide",
- "destination": "/installation/quickstart-guide"
+ "destination": "/intro/setup-guide"
},
{
"source": "/usage/installation",
- "destination": "/installation/quickstart-guide"
+ "destination": "/intro/setup-guide"
+ },
+ {
+ "source": "/tutorials/overview",
+ "destination": "/intro/powersync-overview"
+ },
+ {
+ "source": "/resources/demo-apps-example-projects",
+ "destination": "/intro/examples"
+ },
+ {
+ "source": "/resources/migration-guides",
+ "destination": "/migration-guides/atlas-device-sync"
+ },
+ {
+ "source": "/resources/migration-guides/mongodb-atlas",
+ "destination": "/migration-guides/atlas-device-sync"
+ },
+ {
+ "source": "/migration-guides/mongodb-atlas",
+ "destination": "/migration-guides/atlas-device-sync"
+ },
+ {
+ "source": "/self-hosting/enterprise",
+ "destination": "/intro/self-hosting#enterprise-self-hosted-edition"
+ },
+ {
+ "source": "/self-hosting/getting-started",
+ "destination": "/intro/self-hosting"
},
{
"source": "/usage/installation/database-setup",
- "destination": "/installation/database-setup"
+ "destination": "/configuration/source-db/setup"
},
{
- "source": "/usage/installation/database-setup/security-and-ip-filtering",
- "destination": "installation/database-setup/security-and-ip-filtering"
+ "source": "/installation/database-setup",
+ "destination": "/configuration/source-db/setup"
},
{
"source": "/usage/installation/database-connection",
- "destination": "/installation/database-connection"
+ "destination": "/configuration/source-db/connection"
},
{
- "source": "/usage/installation/client-side-setup",
- "destination": "/installation/client-side-setup"
+ "source": "/installation/database-connection",
+ "destination": "/configuration/source-db/connection"
},
{
- "source": "/usage/installation/client-side-setup/define-your-schema",
- "destination": "/installation/client-side-setup/define-your-schema"
+ "source": "/usage/installation/database-setup/security-and-ip-filtering",
+ "destination": "/configuration/source-db/security-and-ip-filtering"
},
{
- "source": "/usage/installation/client-side-setup/instantiate-powersync-database",
- "destination": "/installation/client-side-setup/instantiate-powersync-database"
+ "source": "/installation/database-setup/security-and-ip-filtering",
+ "destination": "/configuration/source-db/security-and-ip-filtering"
+ },
+ {
+ "source": "/installation/database-setup/private-endpoints",
+ "destination": "/configuration/source-db/private-endpoints"
+ },
+ {
+ "source": "/usage/lifecycle-maintenance/postgres-maintenance",
+ "destination": "/configuration/source-db/postgres-maintenance"
+ },
+ {
+ "source": "/self-hosting/installation/powersync-service-setup",
+ "destination": "/configuration/powersync-service/self-hosted-instances"
},
{
"source": "/usage/installation/client-side-setup/integrating-with-your-backend",
- "destination": "/installation/client-side-setup/integrating-with-your-backend"
+ "destination": "/configuration/app-backend/client-side-integration"
},
{
"source": "/usage/installation/app-backend-setup",
- "destination": "/installation/app-backend-setup"
+ "destination": "/configuration/app-backend/setup"
},
{
- "source": "/usage/installation/app-backend-setup/writing-client-changes",
- "destination": "installation/app-backend-setup/writing-client-changes"
+ "source": "/installation/app-backend-setup",
+ "destination": "/configuration/app-backend/setup"
+ },
+ {
+ "source": "/installation/authentication-setup/hs256-auth-tokens",
+ "destination": "/configuration/auth/custom#option-2%3A-symmetric-jwts-—-using-hs256"
+ },
+ {
+ "source": "/installation/client-side-setup/integrating-with-your-backend",
+ "destination": "/configuration/app-backend/client-side-integration"
+ },
+ {
+ "source": "/usage/tools/cloudcode",
+ "destination": "/configuration/app-backend/cloudcode"
},
{
"source": "/usage/installation/authentication-setup",
- "destination": "/installation/authentication-setup"
+ "destination": "/configuration/auth/overview"
+ },
+ {
+ "source": "/installation/authentication-setup",
+ "destination": "/configuration/auth/overview"
},
{
"source": "/usage/installation/authentication-setup/development-tokens",
- "destination": "/installation/authentication-setup/development-tokens"
+ "destination": "/configuration/auth/development-tokens"
+ },
+ {
+ "source": "/installation/authentication-setup/development-tokens",
+ "destination": "/configuration/auth/development-tokens"
+ },
+ {
+ "source": "/tutorials/self-host/generate-dev-token",
+ "destination": "/configuration/auth/development-tokens#self-hosted"
},
{
"source": "/usage/installation/authentication-setup/supabase-auth",
- "destination": "/installation/authentication-setup/supabase-auth"
+ "destination": "/configuration/auth/supabase-auth"
+ },
+ {
+ "source": "/installation/authentication-setup/supabase-auth",
+ "destination": "/configuration/auth/supabase-auth"
},
{
"source": "/usage/installation/authentication-setup/supabase-auth/stytch-+-supabase",
- "destination": "/installation/authentication-setup/supabase-auth/stytch-+-supabase"
+ "destination": "/configuration/auth/supabase-auth/stytch"
+ },
+ {
+ "source": "/installation/authentication-setup/supabase-auth/stytch-+-supabase",
+ "destination": "/configuration/auth/supabase-auth/stytch"
},
{
- "source": "usage/installation/authentication-setup/firebase-auth",
- "destination": "/installation/authentication-setup/firebase-auth"
+ "source": "/usage/installation/authentication-setup/firebase-auth",
+ "destination": "/configuration/auth/firebase-auth"
},
{
- "source": "usage/installation/authentication-setup/auth0",
- "destination": "/installation/authentication-setup/auth0"
+ "source": "/installation/authentication-setup/firebase-auth",
+ "destination": "/configuration/auth/firebase-auth"
+ },
+ {
+ "source": "/usage/installation/authentication-setup/auth0",
+ "destination": "/configuration/auth/auth0"
+ },
+ {
+ "source": "/installation/authentication-setup/auth0",
+ "destination": "/configuration/auth/auth0"
},
{
"source": "/usage/installation/authentication-setup/custom",
- "destination": "/installation/authentication-setup/custom"
+ "destination": "/configuration/auth/custom"
+ },
+ {
+ "source": "/installation/authentication-setup/custom",
+ "destination": "/configuration/auth/custom"
},
{
"source": "/installation/sync-rules",
- "destination": "/usage/sync-rules"
+ "destination": "/sync/rules/overview"
+ },
+ {
+ "source": "/usage/sync-rules",
+ "destination": "/sync/rules/overview"
+ },
+ {
+ "source": "/usage/sync-rules/example-global-data",
+ "destination": "/sync/rules/global-data"
+ },
+ {
+ "source": "/usage/sync-rules/organize-data-into-buckets",
+ "destination": "/sync/rules/organize-data-into-buckets"
+ },
+ {
+ "source": "/usage/sync-rules/parameter-queries",
+ "destination": "/sync/rules/parameter-queries"
+ },
+ {
+ "source": "/usage/sync-rules/data-queries",
+ "destination": "/sync/rules/data-queries"
},
{
"source": "/usage/sync-rules/advanced-topics/client-parameters-beta",
- "destination": "/usage/sync-rules/advanced-topics/client-parameters"
+ "destination": "/sync/rules/client-parameters"
+ },
+ {
+ "source": "/usage/sync-rules/advanced-topics/client-parameters",
+ "destination": "/sync/rules/client-parameters"
+ },
+ {
+ "source": "/usage/sync-rules/glossary",
+ "destination": "/sync/rules/overview"
+ },
+ {
+ "source": "/usage/sync-streams",
+ "destination": "/sync/streams/overview"
+ },
+ {
+ "source": "/usage/sync-rules/types",
+ "destination": "/sync/types"
+ },
+ {
+ "source": "/usage/sync-rules/operators-and-functions",
+ "destination": "/sync/operators-and-functions"
+ },
+ {
+ "source": "/usage/sync-rules/advanced-topics",
+ "destination": "/sync/advanced/overview"
+ },
+ {
+ "source": "/usage/use-case-examples/prioritized-sync",
+ "destination": "/sync/advanced/prioritized-sync"
+ },
+ {
+ "source": "/usage/sync-rules/client-id",
+ "destination": "/sync/advanced/client-id"
+ },
+ {
+ "source": "/usage/sync-rules/case-sensitivity",
+ "destination": "/sync/advanced/case-sensitivity"
+ },
+ {
+ "source": "/usage/sync-rules/compatibility",
+ "destination": "/sync/advanced/compatibility"
+ },
+ {
+ "source": "/usage/sync-rules/guide-many-to-many-and-join-tables",
+ "destination": "/sync/advanced/many-to-many-and-join-tables"
+ },
+ {
+ "source": "/usage/sync-rules/schemas-and-connections",
+ "destination": "/sync/advanced/schemas-and-connections"
+ },
+ {
+ "source": "/usage/sync-rules/advanced-topics/multiple-client-versions",
+ "destination": "/sync/advanced/multiple-client-versions"
+ },
+ {
+ "source": "/usage/sync-rules/advanced-topics/partitioned-tables",
+ "destination": "/sync/advanced/partitioned-tables"
+ },
+ {
+ "source": "/usage/sync-rules/advanced-topics/sharded-databases",
+ "destination": "/sync/advanced/sharded-databases"
+ },
+ {
+ "source": "/client-sdk-references/introduction",
+ "destination": "/client-sdks/overview"
+ },
+ {
+ "source": "/usage/lifecycle-maintenance/upgrading-the-client-sdk",
+ "destination": "client-sdks/overview"
+ },
+ {
+ "source": "/client-sdk-references/flutter",
+ "destination": "/client-sdks/reference/flutter"
+ },
+ {
+ "source": "/client-sdk-references/flutter/usage-examples",
+ "destination": "/client-sdks/usage-examples"
},
{
"source": "/client-sdk-references/flutter/flutter-web-support-alpha",
- "destination": "/client-sdk-references/flutter/flutter-web-support"
+ "destination": "/client-sdks/frameworks/flutter-web-support"
},
{
- "source": "/resources/migration-guides",
- "destination": "/migration-guides/mongodb-atlas"
+ "source": "/client-sdk-references/flutter/flutter-web-support",
+ "destination": "/client-sdks/frameworks/flutter-web-support"
},
{
- "source": "/resources/migration-guides/mongodb-atlas",
- "destination": "/migration-guides/mongodb-atlas"
+ "source": "/client-sdk-references/react-native-and-expo",
+ "destination": "/client-sdks/reference/react-native-and-expo"
},
{
- "source": "/resources/migration-guides/watermelondb",
- "destination": "/migration-guides/watermelondb"
+ "source": "/client-sdk-references/react-native-and-expo/usage-examples",
+ "destination": "/client-sdks/usage-examples"
},
{
- "source": "/resources/monitoring-and-alerting",
- "destination": "/usage/tools/monitoring-and-alerting"
+ "source": "/client-sdk-references/react-native-and-expo/expo-go-support",
+ "destination": "/client-sdks/frameworks/expo-go-support"
+ },
+ {
+ "source": "/client-sdk-references/react-native-and-expo/react-native-web-support",
+ "destination": "/client-sdks/frameworks/react-native-web-support"
+ },
+ {
+ "source": "/tutorials/client/sdks/web/next-js",
+ "destination": "/client-sdks/frameworks/next-js"
},
{
"source": "/client-sdk-references/js-web",
- "destination": "/client-sdk-references/javascript-web"
+ "destination": "/client-sdks/reference/javascript-web"
+ },
+ {
+ "source": "/client-sdk-references/javascript-web",
+ "destination": "/client-sdks/reference/javascript-web"
},
{
"source": "/client-sdk-references/js-web/javascript-spa-frameworks",
- "destination": "/client-sdk-references/javascript-web/javascript-spa-frameworks"
+ "destination": "/client-sdks/reference/javascript-web#single-page-application-spa-frameworks"
+ },
+ {
+ "source": "/client-sdk-references/javascript-web/javascript-spa-frameworks",
+ "destination": "/client-sdks/reference/javascript-web#single-page-application-spa-frameworks"
+ },
+ {
+ "source": "/client-sdk-references/javascript-web/usage-examples",
+ "destination": "/client-sdks/usage-examples"
+ },
+ {
+ "source": "/client-sdk-references/capacitor",
+ "destination": "/client-sdks/reference/capacitor"
+ },
+ {
+ "source": "/client-sdk-references/node",
+ "destination": "/client-sdks/reference/node"
+ },
+ {
+ "source": "/client-sdk-references/kotlin-multiplatform",
+ "destination": "/client-sdks/reference/kotlin"
+ },
+ {
+ "source": "/client-sdk-references/kotlin",
+ "destination": "/client-sdks/reference/kotlin"
+ },
+ {
+ "source": "/client-sdk-references/kotlin-multiplatform/usage-examples",
+ "destination": "/client-sdks/usage-examples"
+ },
+ {
+ "source": "/client-sdk-references/kotlin/usage-examples",
+ "destination": "/client-sdks/usage-examples"
+ },
+ {
+ "source": "/client-sdk-references/swift",
+ "destination": "/client-sdks/reference/swift"
+ },
+ {
+ "source": "/client-sdk-references/swift/usage-examples",
+ "destination": "/client-sdks/usage-examples"
+ },
+ {
+ "source": "/client-sdk-references/dotnet",
+ "destination": "/client-sdks/reference/dotnet"
+ },
+ {
+ "source": "/client-sdk-references/flutter/flutter-orm-support",
+ "destination": "/client-sdks/orms/flutter-orm-support"
},
{
"source": "/client-sdk-references/js-web/javascript-orm-support",
- "destination": "/client-sdk-references/javascript-web/javascript-orm/overview"
+ "destination": "/client-sdks/orms/js/overview"
+ },
+ {
+ "source": "/client-sdk-references/javascript-web/javascript-orm/overview",
+ "destination": "/client-sdks/orms/js/overview"
+ },
+ {
+ "source": "/client-sdk-references/javascript-web/javascript-orm/kysely",
+ "destination": "/client-sdks/orms/js/kysely"
+ },
+ {
+ "source": "/client-sdk-references/javascript-web/javascript-orm/drizzle",
+ "destination": "/client-sdks/orms/js/drizzle"
+ },
+ {
+ "source": "/client-sdk-references/javascript-web/javascript-orm/tanstack-db",
+ "destination": "/client-sdks/orms/js/tanstack-db"
+ },
+ {
+ "source": "/client-sdk-references/kotlin-multiplatform/libraries/overview",
+ "destination": "/client-sdks/orms/kotlin/overview"
+ },
+ {
+ "source": "/client-sdk-references/kotlin/libraries/overview",
+ "destination": "/client-sdks/orms/kotlin/overview"
+ },
+ {
+ "source": "/client-sdk-references/kotlin-multiplatform/libraries/sqldelight",
+ "destination": "/client-sdks/orms/kotlin/sqldelight"
+ },
+ {
+ "source": "/client-sdk-references/kotlin/libraries/sqldelight",
+ "destination": "/client-sdks/orms/kotlin/sqldelight"
+ },
+ {
+ "source": "/client-sdk-references/kotlin-multiplatform/libraries/room",
+ "destination": "/client-sdks/orms/kotlin/room"
+ },
+ {
+ "source": "/client-sdk-references/kotlin/libraries/room",
+ "destination": "/client-sdks/orms/kotlin/room"
+ },
+ {
+ "source": "/client-sdk-references/swift/grdb",
+ "destination": "/client-sdks/orms/swift/grdb"
+ },
+ {
+ "source": "/usage/use-case-examples/watch-queries",
+ "destination": "/client-sdks/watch-queries"
+ },
+ {
+ "source": "/usage/use-case-examples/infinite-scrolling",
+ "destination": "/client-sdks/infinite-scrolling"
+ },
+ {
+ "source": "/usage/use-case-examples/high-performance-diffs",
+ "destination": "/client-sdks/high-performance-diffs"
},
{
"source": "/client-sdk-references/js-web/usage-examples",
- "destination": "/client-sdk-references/javascript-web/usage-examples"
+ "destination": "/client-sdks/usage-examples"
},
{
"source": "/client-sdk-references/js-web/api-reference",
- "destination": "/client-sdk-references/javascript-web/api-reference"
+ "destination": "/client-sdks/api-references"
},
{
- "source": "/integration-guides/supabase",
- "destination": "/integration-guides/supabase-+-powersync"
+ "source": "/usage/installation/client-side-setup",
+ "destination": "/intro/setup-guide#7-use-the-client-sdk"
+ },
+ {
+ "source": "/installation/client-side-setup",
+ "destination": "/intro/setup-guide#7-use-the-client-sdk"
+ },
+ {
+ "source": "/self-hosting/installation",
+ "destination": "/intro/setup-guide"
+ },
+ {
+ "source": "/self-hosting/installation/client-side-setup",
+ "destination": "/intro/setup-guide#7-use-the-client-sdk"
+ },
+ {
+ "source": "/usage/installation/client-side-setup/define-your-schema",
+ "destination": "/intro/setup-guide#define-your-client-side-schema"
+ },
+ {
+ "source": "/installation/client-side-setup/define-your-schema",
+ "destination": "/intro/setup-guide#define-your-client-side-schema"
+ },
+ {
+ "source": "/usage/installation/client-side-setup/instantiate-powersync-database",
+ "destination": "/intro/setup-guide#instantiate-the-powersync-database"
+ },
+ {
+ "source": "/installation/client-side-setup/instantiate-powersync-database",
+ "destination": "/intro/setup-guide#instantiate-the-powersync-database"
+ },
+ {
+ "source": "/self-hosting/appendix",
+ "destination": "/intro/setup-guide#3-connect-powersync-to-your-source-database"
+ },
+ {
+ "source": "/self-hosting/appendix/database-connection",
+ "destination": "/intro/setup-guide#3-connect-powersync-to-your-source-database"
+ },
+ {
+ "source": "/client-sdk-references/flutter/state-management",
+ "destination": "/client-sdks/advanced/state-management"
+ },
+ {
+ "source": "/usage/use-case-examples/attachments-files",
+ "destination": "/client-sdks/advanced/attachments"
+ },
+ {
+ "source": "/tutorials/client/attachments-and-files/aws-s3-storage-adapter",
+ "destination": "/client-sdks/advanced/attachments-aws-s3-storage"
+ },
+ {
+ "source": "/tutorials/client/attachments-and-files/pdf-attachment",
+ "destination": "/client-sdks/advanced/attachments-pdfs"
+ },
+ {
+ "source": "/usage/use-case-examples/full-text-search",
+ "destination": "/client-sdks/full-text-search"
+ },
+ {
+ "source": "/client-sdks/advanced/full-text-search",
+ "destination": "/client-sdks/full-text-search"
+ },
+ {
+ "source": "/usage/use-case-examples/custom-types-arrays-and-json",
+ "destination": "/client-sdks/advanced/custom-types-arrays-and-json"
+ },
+ {
+ "source": "/usage/use-case-examples/query-json-in-sqlite",
+ "destination": "/client-sdks/advanced/query-json-in-sqlite"
+ },
+ {
+ "source": "/tutorials/client/data/cascading-delete",
+ "destination": "/client-sdks/cascading-delete"
+ },
+ {
+ "source": "/client-sdks/advanced/cascading-delete",
+ "destination": "/client-sdks/cascading-delete"
+ },
+ {
+ "source": "/tutorials/client/data/sequential-id-mapping",
+ "destination": "/client-sdks/advanced/sequential-id-mapping"
+ },
+ {
+ "source": "/usage/use-case-examples/raw-tables",
+ "destination": "/client-sdks/advanced/raw-tables"
+ },
+ {
+ "source": "/usage/use-case-examples/pre-seeded-sqlite",
+ "destination": "/client-sdks/advanced/pre-seeded-sqlite"
+ },
+ {
+ "source": "/usage/use-case-examples/crdts",
+ "destination": "/client-sdks/advanced/crdts"
+ },
+ {
+ "source": "/usage/use-case-examples/postgis",
+ "destination": "/client-sdks/advanced/gis-data-postgis"
+ },
+ {
+ "source": "/client-sdk-references/flutter/unit-testing",
+ "destination": "/client-sdks/advanced/unit-testing"
+ },
+ {
+ "source": "/usage/use-case-examples/offline-only-usage",
+ "destination": "/client-sdks/advanced/local-only-usage"
+ },
+ {
+ "source": "/usage/use-case-examples/background-syncing",
+ "destination": "/client-sdks/advanced/background-syncing"
+ },
+ {
+ "source": "/usage/use-case-examples/data-encryption",
+ "destination": "/client-sdks/advanced/data-encryption"
+ },
+ {
+ "source": "/usage/installation/app-backend-setup/writing-client-changes",
+ "destination": "/handling-writes/writing-client-changes"
+ },
+ {
+ "source": "/installation/app-backend-setup/writing-client-changes",
+ "destination": "/handling-writes/writing-client-changes"
+ },
+ {
+ "source": "/usage/lifecycle-maintenance/handling-write-validation-errors",
+ "destination": "/handling-writes/handling-write-validation-errors"
+ },
+ {
+ "source": "/usage/lifecycle-maintenance/handling-update-conflicts",
+ "destination": "/handling-writes/handling-update-conflicts"
+ },
+ {
+ "source": "/usage/lifecycle-maintenance/handling-update-conflicts/custom-conflict-resolution",
+ "destination": "/handling-writes/custom-conflict-resolution"
+ },
+ {
+ "source": "/usage/use-case-examples/custom-write-checkpoints",
+ "destination": "/handling-writes/custom-write-checkpoints"
+ },
+ {
+ "source": "/resources/troubleshooting",
+ "destination": "/debugging/troubleshooting"
+ },
+ {
+ "source": "/resources/troubleshooting/error-codes",
+ "destination": "/debugging/error-codes"
+ },
+ {
+ "source": "/usage/tools/diagnostic-app",
+ "destination": "/tools/diagnostics-client"
+ },
+ {
+ "source": "/usage/lifecycle-maintenance/client-database-diagnostics",
+ "destination": "/maintenance-ops/client-database-diagnostics"
+ },
+ {
+ "source": "/resources/monitoring-and-alerting",
+ "destination": "/maintenance-ops/monitoring-and-alerting"
+ },
+ {
+ "source": "/usage/tools/monitoring-and-alerting",
+ "destination": "/maintenance-ops/monitoring-and-alerting"
+ },
+ {
+ "source": "/resources/production-readiness-guide",
+ "destination": "/maintenance-ops/production-readiness-guide"
+ },
+ {
+ "source": "/usage/lifecycle-maintenance/compacting-buckets",
+ "destination": "/maintenance-ops/compacting-buckets"
+ },
+ {
+ "source": "/usage/lifecycle-maintenance/implementing-schema-changes",
+ "destination": "/maintenance-ops/implementing-schema-changes"
+ },
+ {
+ "source": "/usage/lifecycle-maintenance/deploying-schema-changes",
+ "destination": "/maintenance-ops/deploying-schema-changes"
+ },
+ {
+ "source": "/usage/lifecycle-maintenance/deploying-schema-changes/additive-changes",
+ "destination": "/maintenance-ops/deploying-schema-changes#additive-changes"
+ },
+ {
+ "source": "/usage/lifecycle-maintenance/deploying-schema-changes/renaming-a-table-on-the-server",
+ "destination": "/maintenance-ops/deploying-schema-changes#renaming-a-table-on-the-server"
+ },
+ {
+ "source": "/usage/lifecycle-maintenance/deploying-schema-changes/renaming-a-table-on-the-client",
+ "destination": "/maintenance-ops/deploying-schema-changes#renaming-a-table-on-the-client"
+ },
+ {
+ "source": "/usage/lifecycle-maintenance/deploying-schema-changes/renaming-a-table-on-both-server-and-client",
+ "destination": "/maintenance-ops/deploying-schema-changes#renaming-a-table-on-both-server-and-client"
+ },
+ {
+ "source": "/usage/lifecycle-maintenance/deploying-schema-changes/renaming-a-column-on-the-server",
+ "destination": "/maintenance-ops/deploying-schema-changes#renaming-a-column-on-the-server"
+ },
+ {
+ "source": "/usage/lifecycle-maintenance/deploying-schema-changes/renaming-a-column-on-the-client",
+ "destination": "/maintenance-ops/deploying-schema-changes#renaming-a-column-on-the-client"
+ },
+ {
+ "source": "/usage/lifecycle-maintenance/deploying-schema-changes/changing-a-column-type",
+ "destination": "/maintenance-ops/deploying-schema-changes#changing-a-column-type"
+ },
+ {
+ "source": "/self-hosting/lifecycle-maintenance",
+ "destination": "/maintenance-ops/self-hosting/deployment-architecture"
},
{
"source": "/self-hosting/lifecycle-maintenance/server-specs",
- "destination": "/self-hosting/lifecycle-maintenance"
+ "destination": "/maintenance-ops/self-hosting/deployment-architecture"
},
{
- "source": "/self-hosting/telemetry",
- "destination": "/self-hosting/lifecycle-maintenance/telemetry"
+ "source": "/self-hosting/lifecycle-maintenance/update-sync-rules",
+ "destination": "/self-hosting/advanced/update-sync-rules"
+ },
+ {
+ "source": "/self-hosting/lifecycle-maintenance/healthchecks",
+ "destination": "/maintenance-ops/self-hosting/healthchecks"
+ },
+ {
+ "source": "/self-hosting/lifecycle-maintenance/securing-your-deployment",
+ "destination": "/maintenance-ops/self-hosting/securing-your-deployment"
},
{
"source": "/self-hosting/metrics",
- "destination": "/self-hosting/lifecycle-maintenance/metrics"
+ "destination": "/maintenance-ops/self-hosting/metrics"
+ },
+ {
+ "source": "/self-hosting/lifecycle-maintenance/metrics",
+ "destination": "/maintenance-ops/self-hosting/metrics"
+ },
+ {
+ "source": "/self-hosting/telemetry",
+ "destination": "/maintenance-ops/self-hosting/telemetry"
+ },
+ {
+ "source": "/self-hosting/lifecycle-maintenance/telemetry",
+ "destination": "/maintenance-ops/self-hosting/telemetry"
},
{
"source": "/self-hosting/diagnostics",
- "destination": "/self-hosting/lifecycle-maintenance/diagnostics"
+ "destination": "/maintenance-ops/self-hosting/diagnostics"
},
{
- "source": "/resources/usage-and-billing-faq",
- "destination": "/resources/usage-and-billing/usage-and-billing-faq"
+ "source": "/self-hosting/lifecycle-maintenance/diagnostics",
+ "destination": "/maintenance-ops/self-hosting/diagnostics"
},
{
- "source": "/client-sdk-references/kotlin-multiplatform",
- "destination": "/client-sdk-references/kotlin"
+ "source": "/self-hosting/lifecycle-maintenance/multiple-instances",
+ "destination": "/maintenance-ops/self-hosting/multiple-instances"
},
{
- "source": "/client-sdk-references/kotlin-multiplatform/usage-examples",
- "destination": "/client-sdk-references/kotlin/usage-examples"
+ "source": "/self-hosting/lifecycle-maintenance/migrating",
+ "destination": "/maintenance-ops/self-hosting/migrating-instances"
},
{
- "source": "/client-sdk-references/kotlin-multiplatform/libraries/overview",
- "destination": "/client-sdk-references/kotlin/libraries/overview"
+ "source": "/maintenance-ops/self-hosting/migrating",
+ "destination": "/maintenance-ops/self-hosting/migrating-instances"
},
{
- "source": "/client-sdk-references/kotlin-multiplatform/libraries/sqldelight",
- "destination": "/client-sdk-references/kotlin/libraries/sqldelight"
+ "source": "/integration-guides/integrations-overview",
+ "destination": "/integrations/overview"
},
{
- "source": "/client-sdk-references/kotlin-multiplatform/libraries/room",
- "destination": "/client-sdk-references/kotlin/libraries/room"
+ "source": "/integration-guides/supabase",
+ "destination": "/integrations/supabase/guide"
+ },
+ {
+ "source": "/integration-guides/supabase-+-powersync",
+ "destination": "/integrations/supabase/guide"
+ },
+ {
+ "source": "/integration-guides/supabase-+-powersync/handling-attachments",
+ "destination": "/integrations/supabase/attachments"
+ },
+ {
+ "source": "/integration-guides/supabase-+-powersync/realtime-streaming",
+ "destination": "/integrations/supabase/realtime-streaming"
+ },
+ {
+ "source": "/integration-guides/supabase-+-powersync/rls-and-sync-rules",
+ "destination": "/integrations/supabase/rls-and-sync-rules"
+ },
+ {
+ "source": "/integration-guides/supabase-+-powersync/local-development",
+ "destination": "/integrations/supabase/local-development"
+ },
+ {
+ "source": "/tutorials/client/performance/supabase-connector-performance",
+ "destination": "/integrations/supabase/connector-performance"
+ },
+ {
+ "source": "/integration-guides/flutterflow-+-powersync",
+ "destination": "/integrations/flutterflow/guide"
+ },
+ {
+ "source": "/integration-guides/flutterflow-+-powersync/handling-attachments",
+ "destination": "/integrations/flutterflow/attachments"
+ },
+ {
+ "source": "/integration-guides/flutterflow-+-powersync/flutter-web",
+ "destination": "/integrations/flutterflow/guide"
+ },
+ {
+ "source": "/integration-guides/flutterflow-+-powersync/full-text-search",
+ "destination": "/client-sdks/full-text-search"
+ },
+ {
+ "source": "/integration-guides/flutterflow-+-powersync/powersync-+-flutterflow-legacy",
+ "destination": "/integrations/flutterflow/legacy-guide"
+ },
+ {
+ "source": "/integration-guides/neon-+-powersync",
+ "destination": "/integrations/neon"
+ },
+ {
+ "source": "/integration-guides/serverpod",
+ "destination": "/integrations/serverpod"
+ },
+ {
+ "source": "/integration-guides/railway-+-powersync",
+ "destination": "/integrations/railway"
+ },
+ {
+ "source": "/integration-guides/coolify",
+ "destination": "/integrations/coolify"
+ },
+ {
+ "source": "/usage/tools/cli",
+ "destination": "/tools/cli"
+ },
+ {
+ "source": "/usage/tools/powersync-dashboard",
+ "destination": "/tools/powersync-dashboard"
+ },
+ {
+ "source": "/self-hosting/local-development",
+ "destination": "/tools/local-development"
+ },
+ {
+ "source": "/resources/ai-tools",
+ "destination": "/tools/ai-tools"
+ },
+ {
+ "source": "/resources/usage-and-billing-faq",
+ "destination": "/resources/usage-and-billing/usage-and-billing-faq"
}
],
"appearance": {
diff --git a/usage/lifecycle-maintenance/handling-update-conflicts/custom-conflict-resolution.mdx b/handling-writes/custom-conflict-resolution.mdx
similarity index 99%
rename from usage/lifecycle-maintenance/handling-update-conflicts/custom-conflict-resolution.mdx
rename to handling-writes/custom-conflict-resolution.mdx
index 40d63adf..febc0c06 100644
--- a/usage/lifecycle-maintenance/handling-update-conflicts/custom-conflict-resolution.mdx
+++ b/handling-writes/custom-conflict-resolution.mdx
@@ -1252,7 +1252,7 @@ If batch processing fails midway, how do you recover? Use database transactions
Track how often conflicts occur and why. This data helps you improve UX or adjust resolution strategies.
**Leverage CRDTs for collaborative docs:**
-For scenarios with real-time collaboration, consider CRDTs to automatically handle concurrent edits. For information on CRDTs, see [our separate guide](/usage/use-case-examples/crdts).
+For scenarios with real-time collaboration, consider CRDTs to automatically handle concurrent edits. For information on CRDTs, see [our separate guide](/client-sdks/advanced/crdts).
**Collaborative editing without using CRDTs:**
You can use PowerSync for collaborative text editing without the complexity of CRDTs. See Matthew Weidner's blog post on [collaborative text editing using PowerSync](https://www.powersync.com/blog/collaborative-text-editing-over-powersync).
diff --git a/usage/use-case-examples/custom-write-checkpoints.mdx b/handling-writes/custom-write-checkpoints.mdx
similarity index 97%
rename from usage/use-case-examples/custom-write-checkpoints.mdx
rename to handling-writes/custom-write-checkpoints.mdx
index 9782ea01..a2a2d460 100644
--- a/usage/use-case-examples/custom-write-checkpoints.mdx
+++ b/handling-writes/custom-write-checkpoints.mdx
@@ -4,16 +4,16 @@ sidebarTitle: "Data Pipelines"
description: "Use Custom Write Checkpoints to handle asynchronous data uploads, as in chained data pipelines."
---
-
-
-
-
-### Processing Writes from Clients
-
-The next section, [Writing Client Changes](/installation/app-backend-setup/writing-client-changes), provides guidance on how can handle write operations in your backend application.
-
-
-### Authentication
-
-General authentication for your app users is outside the scope of PowerSync. A service such as [Auth0](https://auth0.com/) or [Clerk](https://clerk.com/) may be used, or any other authentication system.
-
-PowerSync assumes that you have some kind of authentication system already in place that allows you to communicate securely between your client-side app and backend application.
-
-The `fetchCredentials()` function that you defined in the [Client-Side Setup](/installation/client-side-setup/integrating-with-your-backend) can therefore call your backend application API to generate a JWT which can be used by PowerSync Client SDK to authenticate with the [PowerSync Service](/architecture/powersync-service).
-
-See [Authentication Setup](/installation/authentication-setup) for details.
-
-### Backend Implementation Examples
-
-See our [Example Projects](/resources/demo-apps-example-projects#backend-examples) page for examples of custom backend implementations (e.g. Django, Node.js, Rails, etc.)
-
-For Postgres developers, using [Supabase](/integration-guides/supabase-+-powersync) is an easy alternative to a custom backend. Several of our demo apps demonstrate how to use [Supabase](https://supabase.com/) as the Postgres backend.
-
-### Hosted/Managed Option for MongoDB
-
-
-
-
-The [PowerSync Service](/architecture/powersync-service) uses database native credentials and authenticates directly against the [backend database](/installation/database-setup) using the configured credentials:
-
-
-
-
-
-When the PowerSync client SDK is included in an app project, it uses [existing app-to-backend](/installation/app-backend-setup) authentication to [retrieve a JSON Web Token (JWT)](/installation/authentication-setup):
-
-
-
-
-
-The PowerSync client SDK uses the retrieved JWT to authenticate directly against the PowerSync Service:
-
-
-
-
-
-Users are not persisted in PowerSync, and there is no server-to-server communication used for client authentication.
-
-## Common Authentication Providers
-
-PowerSync supports JWT-based authentication from various providers. The table below shows commonly used authentication providers, their JWKS URLs, and any specific configuration requirements.
-
-PS_DATABASE_URIPS_PORT
diff --git a/integration-guides/flutterflow-+-powersync/handling-attachments.mdx b/integrations/flutterflow/attachments.mdx
similarity index 98%
rename from integration-guides/flutterflow-+-powersync/handling-attachments.mdx
rename to integrations/flutterflow/attachments.mdx
index fab721e7..018773ad 100644
--- a/integration-guides/flutterflow-+-powersync/handling-attachments.mdx
+++ b/integrations/flutterflow/attachments.mdx
@@ -4,7 +4,7 @@ description: "Learn how to sync attachments such as images and PDFs with PowerSy
---
import SupabaseStorage from '/snippets/supabase-storage-config.mdx';
-You can sync attachments, such as images and PDFs, between user devices and a remote storage provider using the [`powersync_attachments_helper`](https://pub.dev/packages/powersync_attachments_helper) package for Flutter. This guide uses Supabase Storage as the remote storage provider to store and serves photos. Other media types, like [PDFs](/tutorials/client/attachments-and-files/pdf-attachment), and [storage providers](/tutorials/client/attachments-and-files/aws-s3-storage-adapter), are also supported.
+You can sync attachments, such as images and PDFs, between user devices and a remote storage provider using the [`powersync_attachments_helper`](https://pub.dev/packages/powersync_attachments_helper) package for Flutter. This guide uses Supabase Storage as the remote storage provider to store and serves photos. Other media types, like [PDFs](/client-sdks/advanced/attachments-pdfs), and [storage providers](/client-sdks/advanced/attachments-aws-s3-storage), are also supported.
-
@@ -184,7 +184,7 @@ For once, a blank screen means success:
-
-
-
-
diff --git a/integration-guides/supabase-+-powersync/local-development.mdx b/integrations/supabase/local-development.mdx
similarity index 93%
rename from integration-guides/supabase-+-powersync/local-development.mdx
rename to integrations/supabase/local-development.mdx
index 0c2247c4..684c6996 100644
--- a/integration-guides/supabase-+-powersync/local-development.mdx
+++ b/integrations/supabase/local-development.mdx
@@ -5,7 +5,7 @@ description: "Local development with Supabase and PowerSync."
Developers using [Supabase local dev](https://supabase.com/docs/guides/cli) might prefer being able to develop against PowerSync locally too, for use cases such as running end-to-end integration tests.
-Local development is possible with either self-hosted PowerSync or PowerSync Cloud instances. [Self-hosting PowerSync](/self-hosting/getting-started) for local development is the recommended workflow as it's more user-friendly.
+Local development is possible with either self-hosted PowerSync or PowerSync Cloud instances. Self-hosting PowerSync for local development is the recommended workflow as it's more user-friendly.
## Self-hosted Supabase & PowerSync (via Docker)
@@ -23,13 +23,13 @@ See the README for instructions.
## Self-hosted Supabase & PowerSync Cloud (via ngrok)
-
+
\ No newline at end of file
diff --git a/self-hosting/lifecycle-maintenance/diagnostics.mdx b/maintenance-ops/self-hosting/diagnostics.mdx
similarity index 90%
rename from self-hosting/lifecycle-maintenance/diagnostics.mdx
rename to maintenance-ops/self-hosting/diagnostics.mdx
index 2c1cf057..1184bbcc 100644
--- a/self-hosting/lifecycle-maintenance/diagnostics.mdx
+++ b/maintenance-ops/self-hosting/diagnostics.mdx
@@ -6,7 +6,7 @@ description: "How to use the PowerSync Service Diagnostics API"
All self-hosted PowerSync Service instances ship with a Diagnostics API.
This API provides the following diagnostic information:
-- Connections → Connected source backend database and any active errors associated with the connection.
+- Connections → Connected backend source database and any active errors associated with the connection.
- Active Sync Rules → Currently deployed sync rules and the status of the sync rules.
# Configuration
@@ -20,7 +20,7 @@ api:
```
+
Data doesn't always flow in the direction of your firewall rules, so the below table documents which components are making connections to others:
diff --git a/self-hosting/lifecycle-maintenance/telemetry.mdx b/maintenance-ops/self-hosting/telemetry.mdx
similarity index 86%
rename from self-hosting/lifecycle-maintenance/telemetry.mdx
rename to maintenance-ops/self-hosting/telemetry.mdx
index c0b6d244..ea787052 100644
--- a/self-hosting/lifecycle-maintenance/telemetry.mdx
+++ b/maintenance-ops/self-hosting/telemetry.mdx
@@ -28,11 +28,11 @@ Below are the data points collected every few minutes and associated with a rand
| parameter\_storage\_size\_bytes | gauge |
| concurrent\_connections | gauge |
-
+
+Migrating to PowerSync results in this architecture: (new components in green)
+
+
+
+Here is a quick overview of the resulting PowerSync architecture:
+* The **PowerSync Service** is the server-side component of PowerSync. It's available as a cloud-hosted service ([PowerSync Cloud](https://powersync.com/pricing)), or you can [self-host](/intro/self-hosting) using our Open Edition.
+* **Authentication**: PowerSync piggybacks off your app’s existing [authentication](/configuration/auth/overview), and JWTs are used to authenticate between clients and the PowerSync Service. If you are using Atlas Device SDKs for authentication, you will need to implement an authentication provider.
+* **PowerSync Client SDKs** use **SQLite** under the hood. Even though MongoDB is a "NoSQL" document database, PowerSync’s use of SQLite works well with MongoDB, since the [PowerSync protocol](/architecture/powersync-protocol) is schemaless (it syncs schemaless JSON data) and we dynamically apply a [client-side schema](/intro/setup-guide#define-your-client-side-schema) to the data in SQLite using SQLite views. Client-side queries can be written in SQL or you can make use of an ORM (we provide a few [ORM integrations](https://www.powersync.com/blog/using-orms-with-powersync)). Working with embedded documents and arrays from MongoDB is easy with SQLite due to [its JSON support](/client-sdks/advanced/query-json-in-sqlite).
+* **Reads vs Writes**: PowerSync handles syncing of reads differently from writes (mutations)
+ * **Reads**: The PowerSync Service connects to your MongoDB database for real-time replication of data, and syncs data to clients based on the [Sync Rules](/sync/rules/overview) configuration. Sync Rules are more flexible than MongoDB Realm Flexible Sync, but are defined on the server-side, not on the client-side.
+ * **Writes**: The client-side application can perform writes (mutations) directly on the SQLite database. The PowerSync Client SDK automatically places those mutations into an [upload queue](/architecture/client-architecture#writing-data-via-sqlite-database-and-upload-queue) and invokes an `uploadData()` function (defined by you) as needed to upload those mutations sequentially to your backend application.
+* **Authorization**: Authorization is controlled separately for reads vs. writes.
+ * **Reads**: The [Sync Rules](/sync/rules/overview) control which users can access which data.
+ * **Writes**: Your backend application controls authorization for how users can modify data, when it receives uploaded mutations from clients.
+* **Backend Application**: PowerSync requires a backend API interface to upload mutations to MongoDB (and optionally for custom authentication too). There are currently two options:
+ * **"Bring your own backend"**: If you already have a backend application as part of your stack, you should use your existing backend. If you don’t yet have one, but would like to run your own backend, we have example implementations available. See the [instructions below](#2-accept-uploads-on-the-backend) for more details.
+ * **Serverless cloud functions (hosted/managed)**: An alternative option is to use CloudCode, a serverless cloud functions environment provided by PowerSync. We have a template available that you can use as a turnkey starting point. Details are [explained below](#2-accept-uploads-on-the-backend).
+
+
+## Migration Steps
+
+Follow the steps below to migrate a MongoDB Atlas Device Sync app to PowerSync.
+
+
-
-Migrating to PowerSync results in this architecture: (new components in green)
-
-
-
-Here is a quick overview of the resulting PowerSync architecture:
-* **PowerSync Service** is available as a cloud-hosted service ([PowerSync Cloud](https://powersync.com/pricing)), or you can self-host using our Open Edition.
-* **Authentication**: PowerSync piggybacks off your app’s existing authentication, and JWTs are used to authenticate between clients and the PowerSync Service. If you are using Atlas Device SDKs for authentication, you will need to implement an authentication provider.
-* **PowerSync Client SDKs** use **SQLite** under the hood. Even though MongoDB is a "NoSQL" document database, PowerSync’s use of SQLite works well with MongoDB, since the [PowerSync protocol](/architecture/powersync-protocol) is schemaless (it syncs schemaless JSON data) and we dynamically apply a [client-side schema](/installation/client-side-setup/define-your-schema) to the data in SQLite using SQLite views. Client-side queries can be written in SQL or you can make use of an ORM (we provide a few [ORM integrations](https://www.powersync.com/blog/using-orms-with-powersync))
-* **Reads vs Writes**: PowerSync handles syncing of reads differently from writes.
- * **Reads**: The PowerSync Service connects to your MongoDB database and replicates data in real-time to PowerSync clients. Reads are configured using PowerSync’s ["Sync Rules"](/usage/sync-rules/). Sync Rules are more flexible than MongoDB Realm Flexible Sync, but are defined on the server-side, not on the client-side.
- * **Writes**: The client-side application can perform writes directly on the local SQLite database. The writes are also automatically placed into an upload queue by the PowerSync Client SDK. The SDK then uses a developer-defined `uploadData()` function to manage the uploading of those writes sequentially to the backend.
-* **Authorization**: Authorization is controlled separately for reads vs. writes.
- * **Reads**: The [Sync Rules](/usage/sync-rules/) control which users can access which data.
- * **Writes**: The backend controls authorization for how users can modify data.
-* **Backend**: PowerSync requires a backend API interface to upload writes to MongoDB. There are currently two options:
- * **Custom self-hosted backend**: If you already have a backend application as part of your stack, you should use your existing backend. If you don’t yet have one: We have [example implementations](/resources/demo-apps-example-projects#backend-examples) available (e.g. Node.js, Django, Rails).
- * **Serverless cloud functions (hosted/managed)**: An alternative option is to use CloudCode, a serverless cloud functions environment provided by PowerSync. We have a template available that you can use as a turnkey starting point.
-
-
-## Migration Steps
-
-Follow the steps below to migrate a MongoDB Atlas Device Sync app to PowerSync.
-
-
-
-
- - Under **Direct connection**, copy the connection string. The hostname should be `db.
-
-
- - Paste this URI into the `uri` field under `replication` \> `connections` in your configuration file, for example:
- ```yaml
- # config.yaml
-
- replication:
- connections:
- - type: postgresql
- uri: postgresql://postgres:[YOUR-PASSWORD]@db.abc.supabase.co:5432/postgres
- ```
- 2. Replace `[YOUR-PASSWORD]` with the password for the `postgres` user in your Supabase database.
- - Supabase also [refers to this password](https://supabase.com/docs/guides/database/managing-passwords) as the *database password* or *project password*.
- 3. PowerSync has the Supabase CA certificate pre-configured — `verify-full` SSL mode can be used directly, without any custom certificates.
- 4. Under `client_auth` enable Supabase Authentication:
-
- ```yaml
- client_auth:
- supabase: true
- supabase_jwt_secret: [secret]
- ```
- For more details, see [Supabase Auth](/installation/authentication-setup/supabase-auth).
-
-2. In the **Direct connection** section, copy the complete connection string (including the `[YOUR-PASSWORD]` placeholder)
+2. In the **Direct connection** section, copy the complete connection string (including the `[YOUR-PASSWORD]` placeholder):
-3. In the [PowerSync Dashboard](https://dashboard.powersync.com/), select your project and instance and go to the **Database Connections** view.
-4. Click **Connect to Source Database** and ensure the "Postgres" tab is selected.
+3. In the [PowerSync Dashboard](https://dashboard.powersync.com/), select your project and instance and go to **Database Connections**.
+4. Click **Connect to Source Database** and ensure the **Postgres** tab is selected.
4. Paste the connection string into the **URI** field. PowerSync will automatically parse this URI to populate the database connection details.
-5. Update the **Username** and **Password** fields to use the `powersync_role` and password you created when configuring your Supabase for PowerSync (see [Source Database Setup](/installation/database-setup#supabase)).
+5. Update the **Username** and **Password** fields to use the `powersync_role` and password you created when configuring your Supabase for PowerSync (see [Source Database Setup](/configuration/source-db/setup#supabase)).
6. Note: PowerSync includes Supabase's CA certificate by default, so you can use `verify-full` SSL mode without additional configuration.
@@ -29,7 +29,7 @@ PowerSync will now create an isolated cloud environment for your instance. This
After your database connection is configured, enable Supabase Auth:
-1. In the PowerSync Dashboard, go to the **Client Auth** view.
-2. Enable the **"Use Supabase Auth"** checkbox.
-3. If your Supabase project uses the legacy JWT signing keys, copy your JWT Secret from your project's settings ([JWT Keys](https://supabase.com/dashboard/project/_/settings/jwt)) and paste the secret into the **"Supabase JWT Secret (optional) Legacy"** field. If you're using Supabase's new [JWT signing keys](https://supabase.com/blog/jwt-signing-keys), you can leave this field empty (PowerSync will auto-configure the JWKS endpoint for your project).
+1. In the PowerSync Dashboard, go to **Client Auth** for your instance.
+2. Enable the **Use Supabase Auth** checkbox.
+3. If your Supabase project uses the legacy JWT signing keys, copy your JWT Secret from your Supabase project's settings ([JWT Keys](https://supabase.com/dashboard/project/_/settings/jwt)) and paste the secret into the **Supabase JWT Secret (optional) Legacy** field in the PowerSync Dashboard. If you're using Supabase's new [JWT signing keys](https://supabase.com/blog/jwt-signing-keys), you can leave this field empty (PowerSync will auto-configure the JWKS endpoint for your project).
4. Click **Save and Deploy** to apply the changes.
diff --git a/usage/sync-rules/case-sensitivity.mdx b/sync/advanced/case-sensitivity.mdx
similarity index 89%
rename from usage/sync-rules/case-sensitivity.mdx
rename to sync/advanced/case-sensitivity.mdx
index 0d865f3d..8b2ebf5c 100644
--- a/usage/sync-rules/case-sensitivity.mdx
+++ b/sync/advanced/case-sensitivity.mdx
@@ -15,7 +15,7 @@ When using `SELECT *`, the original case is preserved for the returned columns/f
### Client-Side Case
-On the client side, the case of table and column names in the [client-side schema](/installation/client-side-setup/define-your-schema) must match the case produced by Sync Rules exactly. For the above example, use the following in Dart:
+On the client side, the case of table and column names in the [client-side schema](/intro/setup-guide#define-your-client-side-schema) must match the case produced by Sync Rules exactly. For the above example, use the following in Dart:
```dart
Table('TODOs', [
diff --git a/usage/sync-rules/client-id.mdx b/sync/advanced/client-id.mdx
similarity index 88%
rename from usage/sync-rules/client-id.mdx
rename to sync/advanced/client-id.mdx
index 9a0d8ef2..bca6fd94 100644
--- a/usage/sync-rules/client-id.mdx
+++ b/sync/advanced/client-id.mdx
@@ -14,9 +14,9 @@ To use a different column/field from the server-side database as the record ID o
SELECT client_id as id FROM my_data
```
-
+
+
+
+### Sync Rules/Streams Determine Real-Time Streaming Sync to Clients
+
+Whenever buckets are updated (buckets added or removed, or operations added to existing buckets), these changes are [streamed in real-time](/architecture/powersync-service#streaming-sync) to clients based on the Sync Rules/Streams.
+
+This syncing behavior can be highly dynamic: in the case of Sync Rules, syncing will dynamically adjust based on changes in _client parameters_ and _authentication parameters_, and in the case of Sync Streams, syncing will dynamically adjust based on the stream subscriptions (which can make use of _subscription parameters_), as well as _connection parameters_ and _authentication parameters_ (from the JWT).
+
+The bucket data is persisted in SQLite on the client-side, where it is easily queryable based on the [client-side schema](/intro/setup-guide#define-your-client-side-schema), which corresponds to the Sync Rules/Streams.
+
+
+
+
+
+
diff --git a/usage/sync-rules/advanced-topics/client-parameters.mdx b/sync/rules/client-parameters.mdx
similarity index 80%
rename from usage/sync-rules/advanced-topics/client-parameters.mdx
rename to sync/rules/client-parameters.mdx
index 3e32b706..2d72655a 100644
--- a/usage/sync-rules/advanced-topics/client-parameters.mdx
+++ b/sync/rules/client-parameters.mdx
@@ -7,21 +7,21 @@ description: "Pass parameters from the client directly for use in Sync Rules."
Use client parameters with caution. Please make sure to read the [Security consideration](#security-consideration) section below.
-
-
-
-
-Functionality includes:
-
-* Selecting tables/collections and columns/fields to sync.
-* Filtering data according to user ID.
-* Filter data with static conditions.
-* Filter data with custom parameters (from [the JWT](/installation/authentication-setup) or [from clients directly](/usage/sync-rules/advanced-topics/client-parameters))
-* Transforming column/field values.
-
-## Replication Into Sync Buckets
-
-PowerSync replicates and transforms relevant data from the backend source database according to Sync Rules.
-
-Data from this step is persisted in separate sync buckets on the PowerSync Service. Data is incrementally updated so that sync buckets always contain current state data as well as a full history of changes.
-
-
-
-
-
-## Client Database Hydration
-
-PowerSync asynchronously hydrates local SQLite databases embedded in the PowerSync Client SDK based on data in sync buckets.
-
-
-
-
-
-
-
diff --git a/usage/sync-rules/advanced-topics.mdx b/usage/sync-rules/advanced-topics.mdx
deleted file mode 100644
index 3650bd38..00000000
--- a/usage/sync-rules/advanced-topics.mdx
+++ /dev/null
@@ -1,12 +0,0 @@
----
-title: "Advanced Topics"
-description: "Advanced topics relating to Sync Rules."
-sidebarTitle: Overview
----
-
-