QUESTPIE

Config API

runtimeConfig() — all configuration options for your QUESTPIE application.

runtimeConfig(options)

The central configuration for your QUESTPIE application. Defines database connection, infrastructure adapters, custom codegen plugins, and CLI settings.

questpie.config.ts
import { runtimeConfig } from "questpie/app";
import { ConsoleAdapter } from "questpie/adapters/console";
import { pgBossAdapter } from "questpie/adapters/pg-boss";
import { pgNotifyAdapter } from "questpie/adapters/pg-notify";
import { PlunkAdapter } from "questpie/adapters/plunk";
import { redisStreamsAdapter } from "questpie/adapters/redis-streams";
import { ResendAdapter } from "questpie/adapters/resend";
import { SmtpAdapter } from "questpie/adapters/smtp";
import { S3Driver } from "flydrive/drivers/s3";

export default runtimeConfig({
	// Required
	app: { url: process.env.APP_URL ?? "http://localhost:3000" },
	db: { url: process.env.DATABASE_URL! },
	secret: process.env.AUTH_SECRET!,

	// Infrastructure
	storage: {
		driver: new S3Driver({
			bucket: process.env.S3_BUCKET!,
			region: process.env.S3_REGION!,
			accessKeyId: process.env.S3_ACCESS_KEY!,
			secretAccessKey: process.env.S3_SECRET_KEY!,
		}),
	},
	email: {
		adapter: new SmtpAdapter({
			transport: {
				host: process.env.SMTP_HOST!,
				port: Number(process.env.SMTP_PORT),
				auth: {
					user: process.env.SMTP_USER!,
					pass: process.env.SMTP_PASS!,
				},
			},
		}),
	},
	queue: {
		adapter: pgBossAdapter({ connectionString: process.env.DATABASE_URL! }),
	},
	realtime: {
		adapter: redisStreamsAdapter({ client: redis }),
	},
	kv: {
		adapter: myKvAdapter,
		defaultTtl: 3600,
	},
	translations: {
		messages: {
			en: { "app.name": "My App" },
			sk: { "app.name": "Moja Aplikacia" },
		},
	},
	cli: {
		migrations: { directory: "./src/migrations" },
		seeds: { directory: "./src/seeds" },
	},
});

Options Reference

Required

OptionTypeDescription
app.urlstringPublic-facing application URL
dbDbConfigDatabase config: { url }, { pglite }, { drizzle }, or factory
secretstringSecret key for sessions and auth tokens

plugins

Array of custom codegen plugins. Package modules such as adminModule and openApiModule contribute their plugins automatically through modules.ts.

plugins: [myProjectPlugin()],

See Plugin API for creating custom plugins.

db

Database configuration. The default { url } path creates a Bun SQL-backed Drizzle client. Serverless runtimes can provide a prebuilt Drizzle client or a factory that receives the generated schema.

// Default Bun runtime
db: { url: process.env.DATABASE_URL! }

// Custom Drizzle client
db: {
  drizzle,
  connectionString: process.env.DATABASE_URL,
  close: () => client.end?.(),
}

// Runtime-owned driver, for example Cloudflare Hyperdrive
db: {
  create: async ({ schema }) => {
    const { env } = await import("cloudflare:workers");
    const sql = postgres(env.HYPERDRIVE.connectionString, {
      max: 5,
      fetch_types: false,
      prepare: true,
    });

    return {
      drizzle: drizzle(sql, { schema }),
      close: () => sql.end(),
    };
  },
}

storage

File storage configuration using FlyDrive.

// Local filesystem (default)
storage: {
  location: "./uploads",
  basePath: "/api",
}

// Amazon S3 / S3-compatible
storage: {
  driver: new S3Driver({
    bucket: "my-bucket",
    region: "us-east-1",
    accessKeyId: "...",
    secretAccessKey: "...",
    endpoint: "https://...",  // Optional, for S3-compatible providers
  }),
}

email

Email adapter configuration.

// Resend or a Resend-compatible API
email: {
  adapter: new ResendAdapter({
    apiKey: process.env.RESEND_API_KEY!,
  }),
}

// Plunk
email: {
  adapter: new PlunkAdapter({
    apiKey: process.env.PLUNK_SECRET_KEY!,
  }),
}

// SMTP
email: {
  adapter: new SmtpAdapter({
    transport: {
      host: "smtp.example.com",
      port: 587,
      auth: { user: "...", pass: "..." },
    },
  }),
}

// Console (development — logs to stdout)
email: {
  adapter: new ConsoleAdapter(),
}

queue

Job queue adapter.

import { cloudflareQueuesAdapter } from "questpie/adapters/cloudflare";

// pg-boss, for long-running Node/Bun workers
queue: {
  adapter: pgBossAdapter({
    connectionString: process.env.DATABASE_URL!,
  }),
}

// Cloudflare Queues, for Workers push consumers
queue: {
  adapter: cloudflareQueuesAdapter({
    queue: async () => {
      const { env } = await import("cloudflare:workers");
      return env.QUESTPIE_QUEUE;
    },
  }),
}

realtime

Realtime event broadcasting adapter.

import { cloudflareRealtimeAdapter } from "questpie/adapters/cloudflare";

// Redis Streams (recommended for production)
realtime: {
  adapter: redisStreamsAdapter({ client: redis }),
}

// PostgreSQL NOTIFY (simpler, single-instance)
realtime: {
  adapter: pgNotifyAdapter({ connectionString: process.env.DATABASE_URL! }),
}

// Cloudflare Durable Objects
realtime: {
  adapter: cloudflareRealtimeAdapter({
    namespace: async () => {
      const { env } = await import("cloudflare:workers");
      return env.QUESTPIE_REALTIME;
    },
  }),
}

kv

Key-value store for caching and session data.

import { cloudflareKVAdapter } from "questpie/adapters/cloudflare";

// Cloudflare Workers KV
kv: {
  adapter: cloudflareKVAdapter({
    namespace: async () => {
      const { env } = await import("cloudflare:workers");
      return env.QUESTPIE_KV;
    },
  }),
  defaultTtl: 3600,
}

// Custom adapter
kv: {
  adapter: myKvAdapter,
  defaultTtl: 3600,
}

// In-memory default
kv: {
  defaultTtl: 3600,
}

translations

Backend translation messages keyed by locale.

translations: {
  messages: {
    en: {
      "auth.loginRequired": "Please log in to continue",
      "validation.required": "{field} is required",
    },
    sk: {
      "auth.loginRequired": "Prosim prihlaste sa",
      "validation.required": "{field} je povinne",
    },
  },
}

cli

CLI-related settings for migration and seed directories.

cli: {
  migrations: {
    directory: "./src/migrations",
  },
  seeds: {
    directory: "./src/seeds",
  },
}

Environment Variables

A typical .env file:

APP_URL=http://localhost:3000
DATABASE_URL=postgres://user:pass@localhost:5432/mydb
AUTH_SECRET=your-secret-key-at-least-32-chars

# Storage (S3)
S3_BUCKET=my-bucket
S3_REGION=us-east-1
S3_ACCESS_KEY=...
S3_SECRET_KEY=...

# Redis (queue, KV, realtime)
REDIS_URL=redis://localhost:6379

# Email
SMTP_HOST=smtp.example.com
SMTP_PORT=587
SMTP_USER=...
SMTP_PASS=...

Config File Location

The CLI reads questpie.config.ts from the project root, which re-exports your runtime config:

questpie.config.ts
export { default } from "./src/questpie/server/questpie.config";

On this page