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.
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
| Option | Type | Description |
|---|---|---|
app.url | string | Public-facing application URL |
db | DbConfig | Database config: { url }, { pglite }, { drizzle }, or factory |
secret | string | Secret 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:
export { default } from "./src/questpie/server/questpie.config";