Documentation Index
Fetch the complete documentation index at: https://setup.despia.com/llms.txt
Use this file to discover all available pages before exploring further.
The PowerSync integration is fully built and production-ready. The cloud sync component will become publicly available when the Despia V4 editor launches. To enable it already contact our support via the Despia live chat and share your PowerSync URL + Bundle ID.
@despia/powersync gives your Despia app a native SQLite database on-device. Reads and writes hit local storage with no network round-trip, the app stays fully usable offline, and optional two-way sync with your existing Postgres, MongoDB, or MySQL backend is a single call away once you have a token for the signed-in user.
Two layers, one API
Thedb object exposes two layers. Local SQLite works without any cloud setup. Sync is a separate layer you activate when you have credentials.
| Layer | Works offline | Requires PowerSync cloud setup | APIs |
|---|---|---|---|
| Local SQLite | Yes | No | init, query, get, execute, batch, transaction, watch, migrate, schema |
| Cloud sync | Yes, sync resumes later | Yes | powersync.connect, powersync.sync, powersync.status, powersync.events.status, powersync.events.upload |
Installation
- Bundle
- CDN
Check for the native runtime
@despia/powersync requires the native PowerSync runtime. Use active() to guard any database calls when your web app also runs in a standard browser.
active() only confirms the runtime is present. It does not mean SQLite is initialized or sync is connected.
How it works
Initialize the database with a schema and schema version, then run migrations to create the actual SQLite tables. These two steps are always required. Sync is optional and starts only afterdb.powersync.connect({ token }) is called with a valid user-scoped JWT.
Subscribe to live query results
db.watch() fires immediately with the current result set, then again whenever matching rows change, including changes arriving from sync. No polling, no manual refresh.
Track sync state
Check the current sync state and subscribe to changes:db.powersync.sync() is a trigger. Sync completes asynchronously, so read the result with db.powersync.status() or subscribe with db.powersync.events.status().
Upload local writes to your backend
Register an upload handler when your backend upload runs in JavaScript. Native calls it when it has pending CRUD rows to send.Search
Register native full-text indexes on any local SQLite table and query them with plain, prefix, or fuzzy matching. Native uses SQLite FTS5 for full-text and prefix search. For large tables,db.search.index() waits for the native build to complete before resolving.
Startup lifecycle
Use this order on every app start. Sync must not start until the schema is active and migrations are applied.init() registers the schema and target version with native. schema() returns the last active schema from a previous session. migrate() applies all pending SQL in one transaction. Native promotes the pending schema to active only after migrations reach schemaVersion. db.powersync.connect() starts sync only after both the active schema and credentials exist.
Use cases
Offline-first apps
Field service, logistics, and inspection apps that must work without connectivity. Data syncs when the device comes back online.
Instant UI
Every read hits local SQLite in milliseconds regardless of network conditions. No loading spinners waiting for API responses.
Real-time collaboration
Subscribe to live queries and reflect changes from other users the moment they arrive via sync.
Data-heavy apps
Store large datasets locally without hitting browser storage quotas. SQLite handles millions of rows efficiently.
Frequently asked questions
Does this work offline?
Does this work offline?
Yes. Queries and writes hit local SQLite. Once initial sync completes, the app works fully offline. Pending writes are queued and uploaded when connectivity returns.
Do I need a token to use the local database?
Do I need a token to use the local database?
No. Local SQLite operations work without any token. A token is only required when you call
db.powersync.connect({ token }) to start cloud sync.Where does the PowerSync App ID come from?
Where does the PowerSync App ID come from?
Native reads the static PowerSync app ID and instance URL from native config. You only pass a user-scoped JWT to
db.powersync.connect({ token }). The token identifies the signed-in user, native owns the rest of the connection setup.What backends does PowerSync support?
What backends does PowerSync support?
PowerSync syncs with Postgres, MongoDB, and MySQL via sync rules you configure in the PowerSync dashboard. Despia handles the native runtime, the backend connection is between PowerSync and your database.
Does this work with Despia Local Server?
Does this work with Despia Local Server?
Yes. PowerSync is compatible with both Remote Hydration (default) and Local Server (
http://localhost). The database runs in the native layer regardless of how the web app is served.Is this App Store compliant?
Is this App Store compliant?
Yes. The database is compiled into the app binary. No executables are downloaded post-install. SQLite is a standard system framework on both iOS and Android.
How do I get access before the public release?
How do I get access before the public release?
The integration is fully built and ready. Contact support@despia.com to enable it on your app before the V4 editor launch.
Resources
NPM Package
@despia/powersync
Reference
Full API, init, query, execute, watch, migrate, search, sync
PowerSync
Backend setup, schema config, and sync rules