Quickback Docs

Providers

Runtime, database, auth, and storage provider options for quickback.config.ts.

Providers configure which services your compiled backend targets.

Runtime Providers

ProviderDescription
cloudflareCloudflare Workers (Hono)
bunBun runtime (Hono)
nodeNode.js runtime (Hono)
import { defineRuntime } from "@quickback/compiler";

providers: {
  runtime: defineRuntime("cloudflare"),
}

Database Providers

ProviderDescription
cloudflare-d1Cloudflare D1 (SQLite)
better-sqlite3SQLite via better-sqlite3 (Bun/Node)
libsqlLibSQL / Turso
neonNeon (PostgreSQL)
supabaseSupabase (PostgreSQL)
import { defineDatabase } from "@quickback/compiler";

providers: {
  database: defineDatabase("cloudflare-d1", {
    generateId: "prefixed",          // "uuid" | "cuid" | "nanoid" | "prefixed" | "serial" | false
    namingConvention: "snake_case",   // "camelCase" | "snake_case"
    usePlurals: false,                // Auth table names: "users" vs "user"
  }),
}

Database Options

OptionTypeDefault (D1)Description
generateIdstring | false"prefixed"ID generation strategy
namingConventionstring"snake_case"Column naming convention
usePluralsbooleanfalsePluralize auth table names (e.g. user vs users)
splitDatabasesbooleantrueSeparate auth and features databases
authBindingstring"AUTH_DB"Binding name for auth database
featuresBindingstring"DB"Binding name for features database
databaseIdstringD1 database ID for the features database (used in generated wrangler.toml)
authDatabaseIdstringD1 database ID for the auth database
featuresDatabaseIdstringExplicit features DB ID (falls back to databaseId)
filesDatabaseIdstringD1 database ID for the files metadata database
webhooksDatabaseIdstringD1 database ID for the webhooks database

Setting Database IDs for Deployment

When deploying to production, set your D1 database IDs so the compiler generates a ready-to-deploy wrangler.toml:

providers: {
  database: defineDatabase("cloudflare-d1", {
    authDatabaseId: "fe6c77c4-2131-40be-a8fc-3649eef2a38c",
    databaseId: "bba22981-cb6e-43d6-bf32-4193513c60b1",
    filesDatabaseId: "c3b8866b-cc4f-4e51-8382-0af244584d93",
  }),
}

If these are omitted, the compiler uses local-dev placeholders and you'll need to manually edit wrangler.toml before deploying.

usePlurals only affects auth tables generated by Better Auth (e.g. user vs users, session vs sessions). Feature table names come directly from your Drizzle schema definitions — whatever you pass to sqliteTable() or pgTable() is used as-is. The namingConvention setting applies to both auth and feature column names.

ID Generation Options

ValueDescriptionExample
"uuid"Server generates UUID550e8400-e29b-41d4-a716-446655440000
"cuid"Server generates CUIDclh2v8k9g0000l508h5gx8j1a
"nanoid"Server generates nanoid (21-char, URL-safe)V1StGXR8_Z5jdHi6B-myT
"short"6-char alphanumeric (nanoid customAlphabet)a3F9xK
"prefixed"Prefixed ID from table nameroom_abc123
"serial"Database auto-increments1, 2, 3
falseClient provides ID (enables PUT/upsert)Any string

"short" produces IDs with ~56.8 billion possible values (62^6). That's fine for small/scoped tables like rooms, invites, or share codes — but at roughly 238,000 rows you hit a 50% chance of collision (birthday bound). Don't use it for high-volume records. "nanoid" and "short" both require the nanoid package in your project.

Auth Providers

ProviderDescription
better-authBetter Auth with plugins
supabase-authSupabase Auth
externalExternal auth via Cloudflare service binding
import { defineAuth } from "@quickback/compiler";

providers: {
  auth: defineAuth("better-auth", {
    session: {
      expiresInDays: 7,
      updateAgeInDays: 1,
    },
    rateLimit: {
      enabled: true,
      window: 60,
      max: 100,
    },
  }),
}

Better Auth Options

OptionTypeDescription
session.expiresInDaysnumberSession expiration in days
session.updateAgeInDaysnumberSession refresh interval in days
rateLimit.enabledbooleanEnable rate limiting
rateLimit.windownumberRate limit window in seconds
rateLimit.maxnumberMax requests per window
socialProvidersobjectSocial login providers (google, github, discord)
debugLogsbooleanEnable auth debug logging

Auth table naming (usePlurals, namingConvention) is inherited from your database provider config — you don't need to set it separately on the auth provider. usePlurals controls whether auth tables are named user/session or users/sessions. It does not affect feature tables, which use whatever name you define in your schema.

Better Auth Plugins

When features: ["organizations"] is set in your config, the compiler automatically enables organization-related plugins. Additional plugins can be configured:

PluginDescription
organizationMulti-tenant organizations
adminAdmin panel access
apiKeyAPI key authentication
anonymousAnonymous sessions
upgradeAnonymousConvert anonymous to full accounts
twoFactorTwo-factor authentication
passkeyWebAuthn passkey login
magicLinkEmail magic link login
emailOtpEmail one-time password
deviceAuthorizationDevice auth flow (CLI tools)
jwtJWT token support
openAPIOpenAPI spec generation

Storage Providers

import { defineStorage, defineFileStorage } from "@quickback/compiler";

providers: {
  storage: defineStorage("kv", {
    binding: "KV_STORE",
    namespaceId: "7ed0f824a8c54c388713d9fdf63cd004",
  }),
  fileStorage: defineFileStorage("r2", {
    binding: "FILES",
    maxFileSize: "10mb",
    allowedTypes: ["image/png", "image/jpeg", "application/pdf"],
    publicDomain: "files.example.com",
  }),
}

The KV namespaceId can be set on the storage provider config, or as kvId on the auth provider config (since KV is primarily used for auth sessions). The compiler checks both locations.

Storage Types

TypeDescription
kvKey-value storage (Cloudflare KV, Redis)
r2Object storage (Cloudflare R2)
memoryIn-memory storage (development only)
redisRedis storage

File Storage Options

OptionTypeDescription
bindingstringR2 bucket binding name
maxFileSizestringMaximum file size (e.g. "10mb")
allowedTypesstring[]Allowed MIME types
publicDomainstringPublic domain for file URLs
userScopedBucketsbooleanScope files by user

On this page