Framework Adapters | Kunii | Primitives Docs

Framework Adapters

Use kunii from Cloudflare-hosted SvelteKit, Next, Nuxt, Astro, and Koze apps

kunii is Cloudflare-only. The adapters below do not add support for Node SQLite, Postgres, or external SQL providers. They make the same D1 migration and query-client flow work wherever Cloudflare exposes env.

Each adapter exports an adapter-specific initKuniiORM. All adapters run migrateOnce(env) before your handler and expose schema-aware clients. Direct client creation (kunii, orm.db, and orm.clients) never runs DDL by itself.

Plain Workers

Plain Workers do not need an adapter. Use the top-level ORM primitives inside the native fetch(request, env, ctx) handler:

import { initKuniiORM } from '@kuratchi/kunii';
import { appSchema } from './schemas/app';

const orm = initKuniiORM({ DB: appSchema });

export default {
  async fetch(request, env, ctx) {
    await orm.migrateOnce(env);
    const db = orm.db(env, 'DB');
    const todos = await db.todos.orderBy({ created_at: 'desc' }).many();
    return Response.json(todos.data);
  },
};

Koze

import { defineMiddleware } from '@kuratchi/koze';
import { initKuniiORM } from '@kuratchi/kunii/koze';
import { appSchema } from './server/schemas/app';

const orm = initKuniiORM({ DB: appSchema });

export default defineMiddleware({
  orm: orm.middleware(),
});

The existing autoMigrate({ DB: appSchema }) helper remains supported for compatibility.

SvelteKit

Use this in src/hooks.server.ts with @sveltejs/adapter-cloudflare:

import { initKuniiORM } from '@kuratchi/kunii/sveltekit';
import { appSchema } from '$lib/server/schemas/app';

const orm = initKuniiORM({ DB: appSchema });

export const handle = orm.handle();

The adapter stores clients on event.locals.koze.DB.

Astro

Use this with @astrojs/cloudflare middleware:

import { initKuniiORM } from '@kuratchi/kunii/astro';
import { appSchema } from './schemas/app';

const orm = initKuniiORM({ DB: appSchema });

export const

The adapter reads Cloudflare bindings from context.locals.runtime.env and stores clients on context.locals.koze.DB.

Nuxt

Use this in Nitro server middleware on Cloudflare:

import { initKuniiORM } from '@kuratchi/kunii/nuxt';
import { appSchema } from '../schemas/app';

const orm = initKuniiORM({ DB: appSchema });

export default orm.eventHandler();

The adapter reads event.context.cloudflare.env and stores clients on event.context.koze.DB.

Plain Vue apps do not have a server ORM lifecycle. On Cloudflare, a Vue SPA uses a Worker backend, so use the top-level Worker primitives there.

Next.js

Use this with Next.js deployed through OpenNext on Cloudflare:

import { initKuniiORM } from '@kuratchi/kunii/next';
import { appSchema } from '@/server/schemas/app';

const orm = initKuniiORM({ DB: appSchema });

export const GET = orm.route(async ({ db }) => {
  const todos = await db.DB.todos.many();
  return Response.json(todos.data);
});

The Next adapter migrates inside the request wrapper. It does not rely on startup instrumentation because Cloudflare Workers do not allow D1 I/O outside a request context.

Durable Objects

Durable Objects still use synchronous setup in the constructor:

import { initKuniiDO } from '@kuratchi/kunii';

export class OrgDO extends DurableObject {
  db;

  constructor(ctx, env) {
    super(ctx, env);
    this.db = initKuniiDO(ctx.storage, orgSchema);
  }
}