Codapult
料金プラグインドキュメントデモ
Codapult

開発者のためのSaaSボイラープレート

プロダクト

  • 料金
  • プラグイン
  • ドキュメント

会社情報

  • お問い合わせ
  • GitHub

法的情報

  • プライバシーポリシー
  • 利用規約

© 2026 Codapult. All rights reserved.

全記事

Getting Started

  • Introduction
  • Quick Start
  • Project Structure

Configuration

  • Environment Variables
  • App Configuration

Authentication

  • Authentication
  • OAuth Providers
  • Two-Factor & Passwordless
  • Enterprise SSO (SAML)

Database

  • Database
  • Migrations

Teams

  • Teams & Organizations
  • Permissions & RBAC

Payments

  • Payments & Billing
  • Stripe Setup
  • LemonSqueezy Setup
  • Polar Setup
  • Payment Webhooks

Api

  • API Layer
  • tRPC
  • GraphQL

Ai

  • AI Features

Email

  • Email
  • Email Templates

Infrastructure

  • Infrastructure
  • File Storage
  • Background Jobs

Ui

  • UI & Theming

I18n

  • Internationalization

Content Management

  • Content Management

Admin

  • Admin Panel

Security

  • Security

Monitoring

  • Analytics & Monitoring

Modules

  • Module Architecture

Plugins

  • Plugin System
  • AI Kit Plugin
  • CRM Plugin
  • Helpdesk Plugin
  • Email Marketing Plugin

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. Always use env.* from @/lib/config instead of reading process.env directly — this ensures consistent defaults and type safety. See the App Configuration page for the full env object reference.


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), "lemonsqueezy", or "polar"

Stripe variables

VariableRequiredDescription
STRIPE_SECRET_KEYYes*Stripe secret API key
STRIPE_WEBHOOK_SECRETYes*Webhook signing secret from Stripe dashboard
NEXT_PUBLIC_STRIPE_CONNECT_FEE_PERCENTNoPlatform fee percentage for Stripe Connect marketplace (overrides appConfig.payments.stripeConnectFeePercent, default 10)
STRIPE_CONNECT_ONBOARDING_RETURN_URLNoReturn URL after Connect onboarding. Defaults to /dashboard/connect
STRIPE_CONNECT_ONBOARDING_REFRESH_URLNoRefresh URL for Connect onboarding. Defaults to /dashboard/connect

* 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.

Polar variables

VariableRequiredDescription
POLAR_ACCESS_TOKENYes*Polar Personal Access Token
POLAR_WEBHOOK_SECRETYes*Webhook signing secret from Polar

* Required when PAYMENT_PROVIDER=polar.


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_KEYNoResend API key — used for transactional emails, magic links, and drip campaigns. Emails are skipped when not set
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_URLNoRuntime base URL. Defaults to http://localhost:3000. Access via appConfig.appUrl
NEXT_PUBLIC_APP_NAMENoTechnical project name (lowercase). Defaults to "codapult". Access via appConfig.appName
DEFAULT_MONTHLY_CREDITSNoMonthly AI usage credits per organization. Defaults to "100". Access via env.defaultMonthlyCredits

Referral Program

VariableRequiredDescription
REFERRAL_REWARD_AMOUNTNoReward amount per successful referral. Defaults to 0
REFERRAL_REWARD_TYPENoReward type: "credit" (default) or "discount"

Custom Domains

VariableRequiredDescription
CUSTOM_DOMAIN_CNAME_TARGETNoCNAME target for custom domain verification (e.g. cname.yourdomain.com)

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 appConfig.appName
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

Showcase / Checkout (AUTH_PROVIDER=none)

VariableRequiredDescription
CHECKOUT_URL_STARTERNoExternal checkout URL for the Starter license tier
CHECKOUT_URL_PRONoExternal checkout URL for the Pro license tier
CHECKOUT_URL_ENTERPRISENoExternal checkout URL for the Enterprise tier
CHECKOUT_URL_PLUGIN_AI_KITNoCheckout URL for the AI Kit plugin
CHECKOUT_URL_PLUGIN_CRMNoCheckout URL for the CRM plugin
CHECKOUT_URL_PLUGIN_HELPDESKNoCheckout URL for the Helpdesk plugin
CHECKOUT_URL_PLUGIN_EMAIL_MARKETINGNoCheckout URL for the Email Marketing plugin
CHECKOUT_URL_PLUGIN_BUNDLENoCheckout URL for the plugin bundle

These link CTA buttons directly to an external checkout page.

API checkout variant IDs

VariableRequiredDescription
CHECKOUT_VARIANT_STARTERNoProvider variant/price ID for the Starter tier
CHECKOUT_VARIANT_PRONoProvider variant/price ID for the Pro tier
CHECKOUT_VARIANT_ENTERPRISENoProvider variant/price ID for the Enterprise tier
CHECKOUT_VARIANT_PLUGIN_AI_KITNoVariant/price ID for the AI Kit plugin
CHECKOUT_VARIANT_PLUGIN_CRMNoVariant/price ID for the CRM plugin
CHECKOUT_VARIANT_PLUGIN_HELPDESKNoVariant/price ID for the Helpdesk plugin
CHECKOUT_VARIANT_PLUGIN_EMAIL_MARKETINGNoVariant/price ID for the Email Marketing plugin
CHECKOUT_VARIANT_PLUGIN_BUNDLENoVariant/price ID for the plugin bundle

When set, CTA buttons link to /api/checkout?product=<key>, which creates a checkout session via the active PAYMENT_PROVIDER adapter and redirects. This is provider-agnostic — switch between Stripe and LemonSqueezy by changing PAYMENT_PROVIDER and the variant IDs.

Priority: CHECKOUT_URL_* (direct link) > CHECKOUT_VARIANT_* (API session) > fallback (/sign-up or /#plugins).

All checkout variables are only used in showcase mode (AUTH_PROVIDER=none). See Marketing / Showcase Checkout for details.


Demo Mode

VariableRequiredDescription
NEXT_PUBLIC_DEMO_MODENoSet to "true" to enable demo mode (read-only dashboard)
DEMO_URLNoURL of the demo deployment — shown on the landing page

Feature Toggles

VariableRequiredDescription
ENABLE_API_DOCSNoSet to "false" to disable the interactive API docs page. Defaults to enabled
ENABLE_HELP_CENTERNoSet to "false" to disable the help center. Defaults to enabled
ENABLE_CHANGELOGNo"true" / "file" — curated CHANGELOG.md (default). "git" — from git tags/commits. "false" — disabled
ENABLE_FEATURE_REQUESTSNoSet to "false" to disable the feature request board. Defaults to enabled

Tips

  • Start minimal. With the default adapters (Turso + Better-Auth + Stripe), only three variables are required: TURSO_DATABASE_URL, BETTER_AUTH_SECRET (≥32 characters), and STRIPE_SECRET_KEY. Use test keys from the Stripe dashboard for development. Emails are skipped when RESEND_API_KEY is not set.
  • Skip Stripe for now? Set AUTH_PROVIDER=none to run in showcase/marketing mode — only TURSO_DATABASE_URL is required.
  • 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