powersync — Claude Code skill: what it does, how to install
Guides PowerSync integration, Sync Streams setup, local SQLite schema migrations, and troubleshooting for offline-first web and mobile applications.
npx skills add powersync-ja/agent-skills --skill powersync -a claude-codeWhat powersync does
This skill supplies onboarding guides and reference workflows for PowerSync integrations with Supabase, Postgres, MongoDB, Azure DocumentDB, MySQL, and MSSQL. The workflow is CLI-first: agents should manage configurations using the @powersync/cli package instead of drafting config files by hand. For any greenfield implementation, Sync Streams replaces legacy Sync Rules.
It covers debugging stalled uploadData queues, diagnosing apps frozen in a Syncing loop, and configuring reactive useQuery hooks. A local script, node scripts/trim.mjs, generates a report to prune references for client platforms not present in your repository. The powersync login command requires a personal access token and works exclusively with PowerSync Cloud; attempting it on a self-hosted instance fails immediately.
On existing codebases, the agent is restricted to editing sync-config.yaml. Modifying infrastructure files like service.yaml or cli.yaml requires direct operator approval. Destructive or mutating operations such as deploy, destroy, or stop require explicit confirmation of the target instance ID beforehand.
What it helps with
- configure Sync Streams replication from Postgres, Supabase, or MongoDB
- diagnose client apps stuck in the Syncing loop or blocked upload queues
- update client SQLite schemas and wire reactive
useQuerywatchers - migrate existing replication rules from Electric Cloud
Example prompts for the agent
- Connect PowerSync to Supabase and configure Sync Streams for the messages table.
- The mobile app is stuck in the Syncing state, check the uploadData queue status.
- Add a new column to the local SQLite schema and update sync-config.yaml.
How to install powersync
1Skills CLI (Vercel)
npx skills add powersync-ja/agent-skills --skill powersync -a claude-code2Manually: put the files in place
~/.claude/skills/powersync/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/powersync/
1Skills CLI (Vercel)
npx skills add powersync-ja/agent-skills --skill powersync -a codex2Manually: put the files in place
.agents/skills/powersync/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add powersync-ja/agent-skills --skill powersync -a cursor2Manually: put the files in place
.cursor/skills/powersync/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install powersync-ja/agent-skills powersync2Manually: put the files in place
.github/skills/powersync/SKILL.md1Skills CLI (Vercel)
npx skills add powersync-ja/agent-skills --skill powersync -a gemini-cli2Platform CLI
gemini skills install https://github.com/powersync-ja/agent-skills --path skills/powersyncManually: put the files in place
.devin/skills/powersync/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add powersync-ja/agent-skills --skill powersync -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
Step by step, with commands for each platform: How to install skills in Claude Code: five ways
Questions about powersync
How do I install powersync in Claude Code?
Run npx skills add powersync-ja/agent-skills --skill powersync -a claude-code in your terminal.
What does the powersync skill do?
It gives AI agents workflow guides, reference documentation, and CLI rules for building offline-first apps and debugging PowerSync sync pipelines.
Can I use powersync login with a self-hosted setup?
No, powersync login uses personal access tokens (PAT) designed specifically for PowerSync Cloud. Self-hosted instances do not support this command.
Source text
SKILL.md · MIT
--- name: powersync description: "Best practices for building and maintaining applications with PowerSync: Cloud and self-hosted setup, sync configuration, client SDK usage, backend integration (Supabase, custom Postgres, MongoDB, Azure DocumentDB, MySQL, MSSQL), schema changes, watch and reactive queries (useQuery), attachments, the upload queue, and debugging. Use this skill whenever the user mentions PowerSync, a @powersync/* package (@powersync/web, @powersync/react-native, @powersync/node), the powersync Flutter/Dart package, the powersync Rust crate, wa-sqlite, offline-first sync, local-first architecture, sync rules, sync streams, uploadData, fetchCredentials, disconnectAndClear, logout or user switching in a synced app, real-time data replication, Electric Cloud migration, Electric Shapes, an app stuck on Syncing, data not syncing, or wants to add offline-capable sync to a mobile or web app, even if they do not explicitly name PowerSync." when_to_use: "Load before any data, schema, sync, or auth change in a project that already uses PowerSync, even if the request never mentions sync. Examples: adding tables or columns, watch or useQuery results not updating, rows missing on a device, uploads stuck in the queue, a spinner stuck on Syncing, editing sync-config.yaml or service.yaml, running powersync CLI commands, migrating legacy sync configuration to Sync Streams, or implementing logout and account switching with disconnectAndClear." license: MIT compatibility: Works with any skills-compatible agent. Some references include CLI commands requiring the @powersync/cli package. metadata: author: powersync version: "1.6.4" # x-release-please-version organization: PowerSync tags: powersync, offline-first, local-first, sync-streams, sqlite, replication, uploadData, fetchCredentials, service-config, sync-config, cloud, cli, debugging, supabase, postgres, mongodb, mysql, electric, electric-migration, watch-queries, useQuery, attachments, upload-queue, disconnectAndClear, schema, react-native, flutter, node, web, wa-sqlite, rust, cargo, powersync-rust --- # PowerSync Skills Use this skill to onboard a project onto PowerSync and to keep it healthy afterwards, without trial-and-error. Treat this as a guided workflow first and a reference library second. **Agents: Read [AGENTS.md](AGENTS.md) before proceeding.** It contains the mandatory compliance rules and onboarding playbook. The Quick Rules below are a reminder, not a substitute. **`powersync login`** is **PowerSync Cloud only** (PAT); self-hosted does not use it. ## Terminology - **Operator** — the human directing this agent (whose request you are fulfilling). - **User** — an end-user of the operator's PowerSync app (JWT subjects, the row a sync stream filters by, the person calling `disconnectAndClear()`). If a sentence is ambiguous, default to the operator interpretation. Full legend in `AGENTS.md`. ## Quick Rules - **CLI-first.** Use the [PowerSync CLI](https://docs.powersync.com/tools/cli.md) for all operations. Do not hand-write config files. See `references/powersync-cli.md`. - **Ask, don't assume.** Ask the operator: Cloud vs self-hosted, and which backend (Supabase, Postgres, MongoDB, Azure DocumentDB, MySQL, MSSQL). Do not default to Supabase. - **Backend before frontend.** Deploy sync config and verify the service before writing app code. - **Sync Streams for new projects.** Sync Rules are legacy. - **Keep credentials in `.env`, never hardcoded.** Record URLs and keys in `.env` as they become available; config (`!env`) and app code read from there. - **Default scope on existing projects: sync-config only.** Do not edit `service.yaml` or `cli.yaml` unless the operator explicitly authorized service/infra changes in this conversation. - **Confirm the target instance before any mutating command** (`deploy`, `destroy`, `stop`, `link --create`, `pull instance`). Never deploy to an instance not authorized by the operator. Treat production as off-limits unless explicitly approved. - **Use project memory.** If your harness supports it, persist the CLI invocation, sync-config path, authorized instance ids + environment (dev/staging/prod), and allowed scope of changes. Verify saved values still match reality before acting on them. See `AGENTS.md` § "Continuous Use & Guardrails". ## First Use in a Repo: Offer to Trim (agents) This copy ships reference files for every PowerSync platform. On your first use of this skill in a repo, check for `.trim-state.json` next to this file. If it exists, the operator already decided; skip this section. Otherwise run `node scripts/trim.mjs` from this skill's directory. The default run is a read-only report: it detects which PowerSync platforms this repo uses and lists the reference files this copy does not need. It works on this installed copy only, makes no network requests, and is reversible by reinstalling the skill. If it refuses (shared or source install) or detects no PowerSync usage yet, skip this section silently. Otherwise show the report to the operator and ask whether to trim this installed copy. Never trim without explicit operator approval. - Operator approves: run `node scripts/trim.mjs --apply` (add `--keep <platforms>` for platforms the operator wants to keep anyway). - Operator declines: run `node scripts/trim.mjs --decline` so the operator is not asked again. Reinstalling or `npx skills update` restores the full copy and clears the recorded decision; offering again after an update is expected. ## What to Load for Your Task | Task | Start with | Load on demand | |------|-----------|----------------| | Supabase + PowerSync | `references/onboarding-supabase.md` | `references/supabase-auth.md`, `references/sync-config.md`, SDK files | | Custom backend (non-Supabase) | `references/onboarding-custom.md` | `references/custom-backend.md`, `references/sync-config.md`, SDK files | | New project setup | `references/powersync-cli.md` + `references/powersync-service.md` | `references/sync-config.md`, SDK files | | Migrating from Electric Cloud | `references/migration-from-electric.md` | `references/sync-config.md`, SDK files | | Self-hosting / service config | `references/powersync-service.md` + `references/powersync-cli.md` | `references/sync-config.md` | | Terraform / IaC provisioning | `references/terraform.md` | `references/sync-config.md`, `references/supabase-auth.md` (if Supabase source) | | Writing sync config | `references/sync-config.md` | — | | Debugging sync issues | `references/powersync-debug.md` | — | | Raw Tables (advanced) | `references/raw-tables.md` | — | | Attachments | `references/attachments.md` | — | | Architecture overview | `references/powersync-overview.md` | — | | SQLite extensions (vector search, FTS5, custom tokenizers) | `references/sqlite-extensions.md` | — | ## SDK Reference Files ### JavaScript / TypeScript Always load `references/sdks/powersync-js.md` for any JS/TS project, then load the applicable framework file. | Framework | File | Load early if… | |-----------|------|----------------| | React / Next.js | `references/sdks/powersync-js-react.md` | Vite + React project — contains the required `vite.config.ts` setup (`optimizeDeps.exclude`, `worker.format: 'es'`) needed before installing packages | | React Native / Expo | `references/sdks/powersync-js-react-native.md` | | | Vue / Nuxt | `references/sdks/powersync-js-vue.md` | | | Node.js / Electron | `references/sdks/powersync-js-node.md` | | | TanStack | `references/sdks/powersync-js-tanstack.md` | | | Drizzle / Kysely ORM | `references/sdks/powersync-js-orm.md` | Project uses Drizzle or Kysely | ### Other SDKs | Platform | File | |----------| | Dart / Flutter | `references/sdks/powersync-dart.md` | | .NET | `references/sdks/powersync-dotnet.md` | | Kotlin | `references/sdks/powersync-kotlin.md` | | Swift | `references/sdks/powersync-swift.md` | | Rust | `references/sdks/powersync-rust.md` | ### Live debugging Some PowerSync SDKs offer ways for agents to connect to a running app, which can be used to inspect sync state or run queries against the actual app database. For the Dart SDK, load `references/sdks/powersync-dart-debugging.md` for instructions. ## Key Rules to Apply Without Being Asked - Never define the `id` column in a PowerSync table schema; it is created automatically. - Use `column.integer` for booleans and `column.text` for ISO date strings. - `connect()` is fire-and-forget. Use `waitForFirstSync()` if you need readiness. - Call `.connect()` once per session. Do not call it again on window focus events, token refreshes, or network changes; redundant calls open additional sync connections. - `transaction.complete()` is mandatory or the upload queue stalls permanently. - On user sign-out, choose based on what data may remain on the device: if the same user will return and keeping data is acceptable, use `disconnect()` so the next session resumes without re-downloading. If visible rows must be hidden but PowerSync's internal copy may stay, use `disconnectAndClear(soft: true)`, which deletes synced rows but keeps the internal copy, so reconnecting as the same user skips a full re-download in most cases. If no synced data may remain, use the default `disconnectAndClear()`. Never retain one user's data for a different user. - A 4xx response from `uploadData` blocks the upload queue permanently; return 2xx for validation errors.
© powersync · MIT · powersync-ja/agent-skills