Database Adapters
Kyro CMS is designed to be completely database-agnostic at the collection level. Because your data models are defined using standard Zod schemas in kyro.config.ts, Kyro translates those definitions into the native schema format of your chosen database.
This means you can start building immediately using a local SQLite file, and seamlessly switch to managed PostgreSQL, Neon HTTP, or Turso Edge databases—without altering a single line of your collection schemas.
Supported Adapters
Kyro supports 5 official database adapters out-of-the-box:
1. SQLite Adapter (Local & Development)
The createLocalAdapter is the default adapter for local development. It uses a local SQLite database powered by Node's native node:sqlite.
import { defineKyroConfig, createLocalAdapter } from "@kyro-cms/core";
export default defineKyroConfig({
adapter: createLocalAdapter({ path: "./data/kyro.db" }),
});TIP
createLocalAdapter automatically creates target directories if needed and uses an AdapterFactory with dynamic import() for zero Vite bundle overhead. Additionally, LocalAdapter includes connection handle recovery (SELECT 1 health checks on connect() and state resets on disconnect()) to prevent closed-database ERR_INVALID_STATE exceptions during hot-reloads.
2. Neon HTTP Adapter (Edge-Native PostgreSQL)
The createNeonAdapter connects to Neon PostgreSQL over Web-standard fetch HTTP requests. It is designed for Vercel Edge Functions, Cloudflare Workers, and Netlify Edge.
import { defineKyroConfig, createNeonAdapter } from "@kyro-cms/core";
export default defineKyroConfig({
adapter: createNeonAdapter({
connectionString: process.env.DATABASE_URL!,
}),
});NOTE
The Neon HTTP Adapter is currently in Experimental Preview. For full production PostgreSQL workloads, createDrizzleAdapter with type: 'postgres' is recommended.
3. Turso / libSQL Adapter (Edge-Native SQLite)
The createTursoAdapter connects to Turso / libSQL databases over Web-standard HTTP requests. It allows ultra-fast SQLite capabilities on V8 Edge isolates without requiring native C++ binaries.
import { defineKyroConfig, createTursoAdapter } from "@kyro-cms/core";
export default defineKyroConfig({
adapter: createTursoAdapter({
url: process.env.TURSO_DATABASE_URL!,
authToken: process.env.TURSO_AUTH_TOKEN,
}),
});4. PostgreSQL Adapter (Production SQL)
For robust relational data storage in standard Node.js server environments, use createDrizzleAdapter.
import { defineKyroConfig, createDrizzleAdapter } from "@kyro-cms/core";
export default defineKyroConfig({
adapter: createDrizzleAdapter({
type: "postgres",
connectionString: process.env.DATABASE_URL!,
}),
});5. MongoDB Adapter (NoSQL Document Store)
If your data is document-oriented, use createMongoDBAdapter.
import { defineKyroConfig, createMongoDBAdapter } from "@kyro-cms/core";
export default defineKyroConfig({
adapter: createMongoDBAdapter({
connectionString: process.env.MONGODB_URI!,
}),
});Dynamic Edge Adapter Selection
A common pattern is to choose between local SQLite in development and Turso or Neon in production:
import {
defineKyroConfig,
createLocalAdapter,
createTursoAdapter
} from "@kyro-cms/core";
const isProduction = process.env.NODE_ENV === "production";
const adapter = isProduction
? createTursoAdapter({
url: process.env.TURSO_DATABASE_URL!,
authToken: process.env.TURSO_AUTH_TOKEN
})
: createLocalAdapter({ path: "./data/kyro.db" });
export default defineKyroConfig({
adapter,
});