Codapult
FeaturesPricingAPIHelpChangelog
Codapult

Ship Your SaaS Faster

Product

  • Features
  • Pricing
  • Plugins
  • API Reference
  • Help Center
  • Feature Requests
  • Changelog

Company

  • Contact
  • GitHub

Legal

  • Privacy Policy
  • Terms of Service

© 2026 Codapult. All rights reserved.

All articles

Getting Started

  • Introduction
  • Quick Start
  • Project Structure

Configuration

  • Environment Variables
  • App Configuration

Authentication

  • Authentication

Database

  • Database

Teams

  • Teams & Organizations

Payments

  • Payments & Billing

Api

  • API Layer

Ai

  • AI Features

Email

  • Email

Infrastructure

  • Infrastructure

Ui

  • UI & Theming

I18n

  • Internationalization

Content Management

  • Content Management

Admin

  • Admin Panel

Security

  • Security

Monitoring

  • Analytics & Monitoring

Modules

  • Module Architecture

Plugins

  • Plugin System

Deployment

  • Deployment
  • Troubleshooting

Upgrading

  • Upgrading Codapult

Developer Tools

  • MCP Server
  • Testing
Configuration

Environment Variables

Complete reference for all environment variables used by Codapult, grouped by module.

Codapult uses environment variables for secrets, provider selection, and per-environment configuration. Copy .env.example to .env.local and fill in the values relevant to your setup.

cp .env.example .env.local

Variables prefixed with NEXT_PUBLIC_ are exposed to the browser. Never put secrets in NEXT_PUBLIC_ variables.

All env vars are accessed through src/lib/config.ts for type-safe usage in server code.


Database

VariableRequiredDescription
DB_PROVIDERNoDatabase engine: "turso" (default) or "postgres"
TURSO_DATABASE_URLYes*Turso connection URL. Format: libsql://your-db.turso.io for cloud, or file:local.db for local development
TURSO_AUTH_TOKENYes**Auth token for Turso cloud databases
TURSO_API_TOKENNoTurso Platform API token — required for multi-region replication
TURSO_ORG_SLUGNoYour Turso organization slug — used with the Platform API
DATABASE_URLYes***PostgreSQL connection string. Format: postgresql://user:password@host:5432/dbname?sslmode=require

* Required when DB_PROVIDER=turso (the default). ** Required for Turso cloud databases. Not needed for local file: URLs. *** Required when DB_PROVIDER=postgres.


Authentication

VariableRequiredDescription
AUTH_PROVIDERNoAuth backend: "better-auth" (default), "kinde", or "none"

Better-Auth variables

VariableRequiredDescription
BETTER_AUTH_SECRETYes*Session encryption secret. Generate with openssl rand -base64 32
BETTER_AUTH_URLNoAuth callback base URL. Defaults to http://localhost:3000

* Required when AUTH_PROVIDER=better-auth (the default).

Kinde variables

VariableRequiredDescription
KINDE_CLIENT_IDYes*Kinde application client ID
KINDE_CLIENT_SECRETYes*Kinde application client secret
KINDE_ISSUER_URLYes*Your Kinde domain, e.g. https://your-app.kinde.com
KINDE_SITE_URLNoSite URL for callbacks. Defaults to http://localhost:3000
KINDE_POST_LOGOUT_REDIRECT_URLNoRedirect after logout
KINDE_POST_LOGIN_REDIRECT_URLNoRedirect after login. Defaults to /dashboard

* Required when AUTH_PROVIDER=kinde.

OAuth providers (Better-Auth)

VariableRequiredDescription
GOOGLE_CLIENT_IDNoGoogle OAuth client ID — enable Google sign-in
GOOGLE_CLIENT_SECRETNoGoogle OAuth client secret
GITHUB_CLIENT_IDNoGitHub OAuth app client ID — enable GitHub sign-in
GITHUB_CLIENT_SECRETNoGitHub OAuth app client secret

Payments

VariableRequiredDescription
PAYMENT_PROVIDERNoPayment backend: "stripe" (default) or "lemonsqueezy"

Stripe variables

VariableRequiredDescription
STRIPE_SECRET_KEYYes*Stripe secret API key
STRIPE_WEBHOOK_SECRETYes*Webhook signing secret from Stripe dashboard
STRIPE_CONNECT_APPLICATION_FEE_PERCENTNoPlatform fee percentage for Stripe Connect marketplace (e.g. "10")

* Required when PAYMENT_PROVIDER=stripe (the default).

LemonSqueezy variables

VariableRequiredDescription
LEMONSQUEEZY_API_KEYYes*LemonSqueezy API key
LEMONSQUEEZY_STORE_IDYes*Your LemonSqueezy store ID
LEMONSQUEEZY_WEBHOOK_SECRETYes*Webhook signing secret

* Required when PAYMENT_PROVIDER=lemonsqueezy.


AI

VariableRequiredDescription
OPENAI_API_KEYNoOpenAI API key — enables GPT models in AI chat
ANTHROPIC_API_KEYNoAnthropic API key — enables Claude models in AI chat
EMBEDDING_PROVIDERNoEmbedding backend: "openai" (default) or "ollama"
VECTOR_STORE_PROVIDERNoVector storage: "sqlite" (default) or "memory" (useful for tests)
OLLAMA_BASE_URLNoOllama server URL. Defaults to http://localhost:11434
OLLAMA_EMBEDDING_MODELNoOllama model for embeddings. Defaults to nomic-embed-text

At least one of OPENAI_API_KEY or ANTHROPIC_API_KEY is needed to use the AI chat feature. RAG (retrieval-augmented generation) requires an embedding provider to be configured.


Email

VariableRequiredDescription
RESEND_API_KEYYesResend API key — used for transactional emails, magic links, and drip campaigns
EMAIL_FROMNoDefault sender address. Defaults to [email protected]

Analytics

VariableRequiredDescription
NEXT_PUBLIC_POSTHOG_KEYNoPostHog project API key
NEXT_PUBLIC_POSTHOG_HOSTNoPostHog instance URL. Defaults to https://us.i.posthog.com
NEXT_PUBLIC_ANALYTICS_ENABLEDNoSet to "true" to enable the built-in first-party analytics module. Useful when PostHog is not configured

Error Monitoring

VariableRequiredDescription
NEXT_PUBLIC_SENTRY_DSNNoSentry DSN — enables client, server, and edge error tracking
SENTRY_ORGNoSentry organization slug (used for source map uploads)
SENTRY_PROJECTNoSentry project name
SENTRY_AUTH_TOKENNoSentry auth token (used for source map uploads during build)

Storage

VariableRequiredDescription
STORAGE_PROVIDERNoFile storage backend: "local" (default), "s3", or "r2"

S3 / R2 variables

VariableRequiredDescription
S3_BUCKETYes*S3 bucket name
S3_REGIONNoAWS region. Defaults to "auto" (required for R2)
S3_ENDPOINTYes**Custom S3 endpoint URL (required for R2 and S3-compatible providers)
S3_ACCESS_KEY_IDYes*Access key ID
S3_SECRET_ACCESS_KEYYes*Secret access key
S3_PUBLIC_URLNoPublic URL prefix for uploaded files (e.g. CDN domain)

* Required when STORAGE_PROVIDER=s3 or STORAGE_PROVIDER=r2. ** Required for Cloudflare R2 and other S3-compatible providers.


Background Jobs

VariableRequiredDescription
JOB_PROVIDERNoJob runner: "memory" (default, in-process) or "bullmq" (Redis-backed)
REDIS_URLYes*Redis connection URL, e.g. redis://localhost:6379
JOB_QUEUE_NAMENoBullMQ queue name. Defaults to "codapult"

* Required when JOB_PROVIDER=bullmq.

Use memory for development and bullmq for production workloads that need durable, concurrent job processing.


Notifications

VariableRequiredDescription
NOTIFICATION_TRANSPORTNoServer-side transport: "poll" (default), "sse", or "ws"
NEXT_PUBLIC_WS_URLYes*WebSocket server URL, e.g. ws://localhost:3001
WS_PORTNoPort for the WebSocket server. Defaults to 3001

* Required when NOTIFICATION_TRANSPORT=ws.


Enterprise SSO (SAML)

VariableRequiredDescription
SSO_PROVIDERNoSSO engine: "jackson" (BoxyHQ Jackson, default)
SSO_PRODUCTNoProduct identifier for SSO connections. Defaults to "codapult"
SSO_DB_ENGINENoJackson storage engine: "mem" (default), "sql", "mongo", or "redis"
SSO_DB_TYPENoDatabase type when SSO_DB_ENGINE=sql: "postgres" (default)
SSO_DB_URLYes*Database URL for Jackson persistence

* Required when SSO_DB_ENGINE=sql (recommended for production).

For development, Jackson defaults to in-memory storage. For production, use a Postgres database for durable SSO connections.


App

VariableRequiredDescription
NEXT_PUBLIC_APP_URLNoPublic base URL. Defaults to http://localhost:3000
NEXT_PUBLIC_APP_NAMENoApp display name. Defaults to "Codapult"
DEFAULT_MONTHLY_CREDITSNoMonthly AI usage credits per organization. Defaults to "100"

Support Widget

VariableRequiredDescription
NEXT_PUBLIC_SUPPORT_PROVIDERNoSupport chat provider: "crisp", "intercom", or "none" (default)
NEXT_PUBLIC_CRISP_WEBSITE_IDYes*Crisp website ID
NEXT_PUBLIC_INTERCOM_APP_IDYes**Intercom app ID

* Required when NEXT_PUBLIC_SUPPORT_PROVIDER=crisp. ** Required when NEXT_PUBLIC_SUPPORT_PROVIDER=intercom.


OpenTelemetry

VariableRequiredDescription
OTEL_EXPORTER_OTLP_ENDPOINTNoOTLP collector endpoint, e.g. http://localhost:4318. Tracing is disabled when not set
OTEL_SERVICE_NAMENoService name in traces. Defaults to "codapult"
OTEL_TRACES_SAMPLE_RATENoSampling rate from 0 to 1. Defaults to "0.1" (10%)
OTEL_EXPORTER_OTLP_HEADERSNoHeaders for the OTLP exporter, e.g. Authorization=Bearer token

Tips

  • Start minimal. Only TURSO_DATABASE_URL, BETTER_AUTH_SECRET, and RESEND_API_KEY are needed to run the app locally.
  • Use the setup wizard. Run npx @codapult/cli setup to generate .env.local interactively.
  • Adapter defaults. If you omit a provider variable (e.g. AUTH_PROVIDER), Codapult falls back to the default adapter — no configuration needed.
  • Conditional requirements. Variables marked "Yes*" are only required when you select their corresponding provider or feature.
Project StructureApp Configuration