diff --git a/versioned_docs/version-3.x/_components/PackageInstall.tsx b/versioned_docs/version-3.x/_components/PackageInstall.tsx
index 53bf880..20dbf00 100644
--- a/versioned_docs/version-3.x/_components/PackageInstall.tsx
+++ b/versioned_docs/version-3.x/_components/PackageInstall.tsx
@@ -20,9 +20,8 @@ const PackageInstall = ({ devDependencies, dependencies }: Props) => {
{pkgManagers.map((pkg) => (
- {`${devDependencies?.length ? `${pkg.command} ${pkg.dev} ${devDependencies.join(' ')}\n` : ''}${
- dependencies?.length ? `${pkg.command} ${dependencies.join(' ')}` : ''
- }`}
+ {`${dependencies?.length ? `${pkg.command} ${dependencies.join(' ')}` : ''}
+${devDependencies?.length ? `${pkg.command} ${pkg.dev} ${devDependencies.join(' ')}\n` : ''}`}
))}
diff --git a/versioned_docs/version-3.x/recipe/databases/_category_.yml b/versioned_docs/version-3.x/recipe/databases/_category_.yml
new file mode 100644
index 0000000..649e74c
--- /dev/null
+++ b/versioned_docs/version-3.x/recipe/databases/_category_.yml
@@ -0,0 +1,7 @@
+position: 1
+label: Databases
+collapsible: true
+collapsed: true
+link:
+ type: generated-index
+ title: Databases
diff --git a/versioned_docs/version-3.x/recipe/databases/neon.md b/versioned_docs/version-3.x/recipe/databases/neon.md
new file mode 100644
index 0000000..4004c3f
--- /dev/null
+++ b/versioned_docs/version-3.x/recipe/databases/neon.md
@@ -0,0 +1,43 @@
+---
+sidebar_position: 3
+---
+
+import PackageInstall from '../../_components/PackageInstall';
+
+# Neon
+
+Neon can be used with the regular `pg` driver as described in the [PostgreSQL](./postgres) guide. It also provides a serverless driver that uses HTTP/WebSocket protocol which works in edge environments. This guide explains how to use the serverless driver with ZenStack.
+
+## Installing driver
+
+
+
+## Creating ZenStackClient
+
+```ts
+import { schema } from '@/zenstack/schema';
+import { Pool } from '@neondatabase/serverless';
+import { ZenStackClient } from '@zenstackhq/orm';
+import { PostgresDialect } from '@zenstackhq/orm/dialects/postgres';
+
+const db = new ZenStackClient(schema, {
+ dialect: new PostgresDialect({
+ pool: new Pool({
+ connectionString: process.env.DATABASE_URL,
+ }),
+ }),
+});
+```
+
+## Notes about edge runtime
+
+Edge environments are ephemeral and often only live to serve a single request. Instead of holding a global singleton client instance, you should create a new one per request. The serverless driver is designed to be used this way.
+
+```ts
+export async function handler(req: Request): Promise {
+ const db = createClient();
+ // use db...
+ await db.$disconnect();
+ return new Response('ok');
+}
+```
diff --git a/versioned_docs/version-3.x/recipe/databases/postgres.md b/versioned_docs/version-3.x/recipe/databases/postgres.md
new file mode 100644
index 0000000..15c0de2
--- /dev/null
+++ b/versioned_docs/version-3.x/recipe/databases/postgres.md
@@ -0,0 +1,28 @@
+---
+sidebar_position: 1
+---
+
+import PackageInstall from '../../_components/PackageInstall';
+
+# PostgreSQL
+
+## Installing driver
+
+
+
+## Creating ZenStackClient
+
+```ts
+import { schema } from './zenstack/schema';
+import { Pool } from 'pg';
+import { ZenStackClient } from '@zenstackhq/orm';
+import { PostgresDialect } from '@zenstackhq/orm/dialects/postgres';
+
+const db = new ZenStackClient(schema, {
+ dialect: new PostgresDialect({
+ pool: new Pool({
+ connectionString: process.env.DATABASE_URL,
+ }),
+ }),
+});
+```
diff --git a/versioned_docs/version-3.x/recipe/databases/sqlite.md b/versioned_docs/version-3.x/recipe/databases/sqlite.md
new file mode 100644
index 0000000..581e126
--- /dev/null
+++ b/versioned_docs/version-3.x/recipe/databases/sqlite.md
@@ -0,0 +1,24 @@
+---
+sidebar_position: 2
+---
+
+import PackageInstall from '../../_components/PackageInstall';
+
+# SQLite
+
+## Installing driver
+
+
+
+## Creating ZenStackClient
+
+```ts
+import { schema } from './zenstack/schema';
+import SQLite from 'better-sqlite3';
+import { ZenStackClient } from '@zenstackhq/orm';
+import { SqliteDialect } from '@zenstackhq/orm/dialects/sqlite';
+
+const db = new ZenStackClient(schema, {
+ dialect: new SqliteDialect({ database: new SQLite('./dev.db') }),
+});
+```