bettersync

Adapters

Drizzle, Prisma, Kysely, pg, PGlite, better-sqlite3, Memory

Drizzle + Postgres

import { drizzleAdapter } from 'bettersync/adapters/drizzle'
import { projects } from './db/schema'

drizzleAdapter(db, { schema: { project: projects } })

Column mapping is automatic from Drizzle table definitions.

Prisma + Postgres

import { prismaAdapter } from 'bettersync/adapters/prisma'

prismaAdapter(prisma)

Uses $queryRawUnsafe under the hood. Works with any Prisma schema.

Kysely + Postgres

import { kyselyAdapter } from 'bettersync/adapters/kysely'

kyselyAdapter(db)

Uses CompiledQuery.raw() for parameterized queries.

pg (node-postgres)

import { pgAdapter } from 'bettersync/adapters/pg'
import { Pool } from 'pg'

pgAdapter(new Pool({ connectionString: DATABASE_URL }))

Raw SQL, no ORM. Minimal dependency.

PGlite (Browser)

import { pgliteAdapter } from 'bettersync/adapters/pglite'
import { PGlite } from '@electric-sql/pglite'

pgliteAdapter(new PGlite('idb://my-app'))

Postgres WASM in the browser. Same SQL dialect as server.

better-sqlite3 (Node.js / Electron)

import { betterSqlite3Adapter }
  from 'bettersync/adapters/better-sqlite3'
import Database from 'better-sqlite3'

betterSqlite3Adapter(new Database('app.db'))

Synchronous SQLite. Ideal for Electron, CLI tools, or edge.

Memory (Tests)

import { memoryAdapter } from 'bettersync/adapters/memory'
memoryAdapter()

Conformance Suite

Every adapter passes 19 shared tests:

import { CONFORMANCE_TESTS } from 'bettersync/test'

for (const test of CONFORMANCE_TESTS) {
  it(test.name, () =>
    test.run({ factory: () => myAdapter() }))
}

On this page