Self-hosting

Environment variables

Every environment variable the server reads, grouped as in .env.example — generated from that file.

Copy .env.example to .env.local (for npm run dev / npm start) or .env (for Docker Compose). The Supabase URL/keys and SSO flags are read at runtime (restart after changing them); DEPLOYMENT_MODE and the app URL also shape statically rendered routes, so set them at build time too. This list is generated from .env.example.

Supabase (required)

VariableExample / defaultDescription
NEXT_PUBLIC_SUPABASE_URLhttp://127.0.0.1:54321Project URL and anon key: Supabase dashboard → Project Settings → API, or the output of supabase start for a local stack. Read by the server at runtime and handed to the browser through the root layout, so changing them needs a restart, not a rebuild.
NEXT_PUBLIC_SUPABASE_ANON_KEYProject URL and anon key: Supabase dashboard → Project Settings → API, or the output of supabase start for a local stack. Read by the server at runtime and handed to the browser through the root layout, so changing them needs a restart, not a rebuild.
SUPABASE_URL(optional, commented out) Optional runtime-only names; when set they take precedence over the NEXT_PUBLIC_* names above (handy for one Docker image across environments).
SUPABASE_ANON_KEY(optional, commented out) Optional runtime-only names; when set they take precedence over the NEXT_PUBLIC_* names above (handy for one Docker image across environments).
SUPABASE_SERVICE_ROLE_KEYService-role key. Server-only: used by API routes, queue processors and npm run bootstrap. Never expose it to the browser.

Application

VariableExample / defaultDescription
NEXT_PUBLIC_APP_URLhttp://localhost:3000Canonical public origin, no trailing slash. Used for links in emails, OAuth redirects, robots/sitemap and the queue processor's self-calls. APP_URL, when set, takes precedence (runtime-only name).
APP_URL(optional, commented out) Canonical public origin, no trailing slash. Used for links in emails, OAuth redirects, robots/sitemap and the queue processor's self-calls. APP_URL, when set, takes precedence (runtime-only name).
DEPLOYMENT_MODEself_hostedself_hosted (default when unset) disables the marketing site, contact form and self-signup, and sends / straight to the app. cloud is the hosted usertasks.com edition. Set it at build time as well as at runtime.

Secrets

VariableExample / defaultDescription
ENCRYPTION_KEY32-byte key (base64 or hex) for AES-256-GCM encryption of stored connector and integration secrets. Strongly recommended: when unset, secrets are stored in plaintext. Generate with: openssl rand -base64 32
CRON_SECRETBearer secret for /api/cron/* and the queue processors. pg_cron sends it (stored in Supabase Vault as cron_secret). Generate with: openssl rand -hex 32
PACKAGE_SIGNING_KEY(optional, commented out) Optional. ed25519 private key (PEM; \n escapes allowed) that signs built packages (.utpkg). Default: a key generated on first build, stored encrypted with ENCRYPTION_KEY. Without either, packages are built unsigned.
PACKAGE_TRUSTED_FINGERPRINTS(optional, commented out) Optional. Comma-separated signer fingerprints (aa:bb:…) installs show as trusted (packages signed by this instance are always recognised).
WORKFLOW_PROCESSOR_SECRET(optional, commented out) Optional. When set, it REPLACES CRON_SECRET as the secret every service endpoint accepts (and the Vault cron_secret must then hold this value). Leave it commented out rather than empty: an empty value disables the CRON_SECRET fallback and every cron/processor call is rejected.
WORKFLOW_CONCURRENCY5(optional, commented out) Queue tuning (optional): jobs one processor invocation runs at once (default 5), how long it keeps starting jobs (ms, default 50000), and days finished workflow_queue / agent_queue rows are kept (default 7).
WORKFLOW_PROCESSOR_BUDGET_MS50000(optional, commented out) Queue tuning (optional): jobs one processor invocation runs at once (default 5), how long it keeps starting jobs (ms, default 50000), and days finished workflow_queue / agent_queue rows are kept (default 7).
QUEUE_RETENTION_DAYS7(optional, commented out) Queue tuning (optional): jobs one processor invocation runs at once (default 5), how long it keeps starting jobs (ms, default 50000), and days finished workflow_queue / agent_queue rows are kept (default 7).
CRON_TICK_CONCURRENCY4(optional, commented out) Scheduler tick (optional): jobs /api/cron/tick runs at once (default 4).

Email (optional)

VariableExample / defaultDescription
RESEND_API_KEYResend API key (the default email provider). Without it, sending email (invitations, task notifications, workflow email nodes) fails with "Email service not configured". See EMAIL_PROVIDER below for SMTP, SES, Azure Communication Services, Microsoft Graph, Gmail and the console sink.
EMAIL_FROMSender address, e.g. "UserTasks <noreply@example.com>" (required by every provider except resend and console).
EMAIL_REPLY_TO(optional, commented out) Default Reply-To for app email (workflow nodes can set their own).

Security toggles (optional, all off by default)

VariableExample / defaultDescription
ENABLE_CUSTOM_ACTIVITY_CODEfalseAllow workflow activities with custom JavaScript to run. The code runs unsandboxed in-process: enable only in trusted environments.
ALLOW_PRIVATE_EGRESSfalseAllow outbound HTTP (integrations, connectors, webhooks) to private and loopback addresses. Cloud metadata endpoints stay blocked.
LOG_EXPORT_DATADOG_URL(optional, commented out) Log export: send every Datadog destination to this intake URL instead of https://http-intake.logs.<site>/api/v2/logs (an Observability Pipelines worker or proxy). Private CAs for self-hosted Splunk HEC / OTLP collectors: set NODE_EXTRA_CA_CERTS (certificate checks cannot be turned off).
LOG_EXPORT_ALLOW_INSTANCE_IDENTITYfalse(optional, commented out) Azure Monitor / Event Hubs / Cloud Logging / Pub/Sub / CloudWatch Logs destinations use the credentials a workspace supplies; true also lets them use this server's managed / workload identity or AWS role (only for single-tenant installs: it reaches whatever the operator's identity can).
LOG_EXPORT_EVENT_HUBS_URL(optional, commented out) Private endpoints (or test doubles) for the cloud destinations.
LOG_EXPORT_GCP_LOGGING_URL(optional, commented out) Private endpoints (or test doubles) for the cloud destinations.
LOG_EXPORT_GCP_PUBSUB_URL(optional, commented out) Private endpoints (or test doubles) for the cloud destinations.
LOG_EXPORT_AZURE_AUTHORITY_URL(optional, commented out) Private endpoints (or test doubles) for the cloud destinations.
LOG_EXPORT_GCP_TOKEN_URL(optional, commented out) Private endpoints (or test doubles) for the cloud destinations.
LOG_EXPORT_AWS_ENDPOINT_URL(optional, commented out) Private endpoints (or test doubles) for the cloud destinations.
ALLOW_QUERY_KEY_AUTHfalseAccept API keys in a ?key= query parameter (for MCP connectors that cannot send an Authorization header).
MCP_ALLOWED_ORIGINSComma-separated browser origins allowed to call /api/mcp (CORS).

Sign-in (optional)

VariableExample / defaultDescription
NEXT_PUBLIC_SSO_MICROSOFTSet to 1 to show "Sign in with Microsoft" on /login (requires the Azure provider to be configured in Supabase Auth). Read at runtime; SSO_MICROSOFT takes precedence when set.
SSO_MICROSOFT(optional, commented out) Set to 1 to show "Sign in with Microsoft" on /login (requires the Azure provider to be configured in Supabase Auth). Read at runtime; SSO_MICROSOFT takes precedence when set.

Infrastructure providers (optional)

VariableExample / defaultDescription
DB_PROVIDERpostgres serves server-side queries in-process over DATABASE_URL(optional, commented out) Provider per area. Unset means today's stack: supabase (DB, auth, storage, realtime), pg_cron (scheduler), resend (email), env (secrets). These override the providers.<area> rows in the instance_settings table.
DB_PROVIDERsupabase(optional, commented out) (same RLS, same results as PostgREST) instead of through Supabase's REST API; it is read from the environment only. It needs DATABASE_URL (a role that can SET ROLE anon/authenticated/service_role, e.g. postgres; PgBouncer transaction mode is fine) and, to verify HS256 session tokens without a round trip to Supabase Auth, SUPABASE_JWT_SECRET. Pool size: DATABASE_POOL_MAX (default 10).
AUTH_PROVIDERsupabase(optional, commented out) (same RLS, same results as PostgREST) instead of through Supabase's REST API; it is read from the environment only. It needs DATABASE_URL (a role that can SET ROLE anon/authenticated/service_role, e.g. postgres; PgBouncer transaction mode is fine) and, to verify HS256 session tokens without a round trip to Supabase Auth, SUPABASE_JWT_SECRET. Pool size: DATABASE_POOL_MAX (default 10).
STORAGE_PROVIDERsupabase(optional, commented out) (same RLS, same results as PostgREST) instead of through Supabase's REST API; it is read from the environment only. It needs DATABASE_URL (a role that can SET ROLE anon/authenticated/service_role, e.g. postgres; PgBouncer transaction mode is fine) and, to verify HS256 session tokens without a round trip to Supabase Auth, SUPABASE_JWT_SECRET. Pool size: DATABASE_POOL_MAX (default 10).
REALTIME_PROVIDERsupabase(optional, commented out) (same RLS, same results as PostgREST) instead of through Supabase's REST API; it is read from the environment only. It needs DATABASE_URL (a role that can SET ROLE anon/authenticated/service_role, e.g. postgres; PgBouncer transaction mode is fine) and, to verify HS256 session tokens without a round trip to Supabase Auth, SUPABASE_JWT_SECRET. Pool size: DATABASE_POOL_MAX (default 10).
SCHEDULER_PROVIDERpg_cron(optional, commented out) (same RLS, same results as PostgREST) instead of through Supabase's REST API; it is read from the environment only. It needs DATABASE_URL (a role that can SET ROLE anon/authenticated/service_role, e.g. postgres; PgBouncer transaction mode is fine) and, to verify HS256 session tokens without a round trip to Supabase Auth, SUPABASE_JWT_SECRET. Pool size: DATABASE_POOL_MAX (default 10).
EMAIL_PROVIDERresend(optional, commented out) (same RLS, same results as PostgREST) instead of through Supabase's REST API; it is read from the environment only. It needs DATABASE_URL (a role that can SET ROLE anon/authenticated/service_role, e.g. postgres; PgBouncer transaction mode is fine) and, to verify HS256 session tokens without a round trip to Supabase Auth, SUPABASE_JWT_SECRET. Pool size: DATABASE_POOL_MAX (default 10).
SECRETS_PROVIDERenv(optional, commented out) (same RLS, same results as PostgREST) instead of through Supabase's REST API; it is read from the environment only. It needs DATABASE_URL (a role that can SET ROLE anon/authenticated/service_role, e.g. postgres; PgBouncer transaction mode is fine) and, to verify HS256 session tokens without a round trip to Supabase Auth, SUPABASE_JWT_SECRET. Pool size: DATABASE_POOL_MAX (default 10).
CACHE_PROVIDERmemory(optional, commented out) (same RLS, same results as PostgREST) instead of through Supabase's REST API; it is read from the environment only. It needs DATABASE_URL (a role that can SET ROLE anon/authenticated/service_role, e.g. postgres; PgBouncer transaction mode is fine) and, to verify HS256 session tokens without a round trip to Supabase Auth, SUPABASE_JWT_SECRET. Pool size: DATABASE_POOL_MAX (default 10).
KMS_PROVIDERenv(optional, commented out) (same RLS, same results as PostgREST) instead of through Supabase's REST API; it is read from the environment only. It needs DATABASE_URL (a role that can SET ROLE anon/authenticated/service_role, e.g. postgres; PgBouncer transaction mode is fine) and, to verify HS256 session tokens without a round trip to Supabase Auth, SUPABASE_JWT_SECRET. Pool size: DATABASE_POOL_MAX (default 10).
DATABASE_URL(optional, commented out) Direct Postgres connection string, for providers that talk to the database without Supabase (not used by the defaults).
SUPABASE_JWT_SECRET(optional, commented out) Direct Postgres connection string, for providers that talk to the database without Supabase (not used by the defaults).
DATABASE_POOL_MAX10(optional, commented out) Direct Postgres connection string, for providers that talk to the database without Supabase (not used by the defaults).
DB_MAX_ROWS1000(optional, commented out) Row cap per read, as Supabase's API "max rows" setting (0 = none).
DATABASE_AUTHpassword(optional, commented out) How the app authenticates its Postgres connections: password (default, the URL's password), azure (Microsoft Entra ID token for Azure Database for PostgreSQL, via managed identity / DefaultAzureCredential), gcp (IAM access token for Cloud SQL / AlloyDB, via Application Default Credentials) or aws (RDS / Aurora / RDS Proxy IAM database auth: a 15-minute token from the task role / instance profile / IRSA; the URL's user is granted rds_iam). Token modes need TLS (sslmode=require) or the Cloud SQL Auth Proxy; aws turns TLS on itself and verifies the server with DATABASE_SSL_CA_FILE, else the RDS CA bundle shipped in the image (certs/rds-global-bundle.pem). DATABASE_AWS_REGION defaults to the region in the RDS host name, then AWS_REGION.
DATABASE_AWS_REGION(optional, commented out) How the app authenticates its Postgres connections: password (default, the URL's password), azure (Microsoft Entra ID token for Azure Database for PostgreSQL, via managed identity / DefaultAzureCredential), gcp (IAM access token for Cloud SQL / AlloyDB, via Application Default Credentials) or aws (RDS / Aurora / RDS Proxy IAM database auth: a 15-minute token from the task role / instance profile / IRSA; the URL's user is granted rds_iam). Token modes need TLS (sslmode=require) or the Cloud SQL Auth Proxy; aws turns TLS on itself and verifies the server with DATABASE_SSL_CA_FILE, else the RDS CA bundle shipped in the image (certs/rds-global-bundle.pem). DATABASE_AWS_REGION defaults to the region in the RDS host name, then AWS_REGION.
DATABASE_SSL_CA_FILE(optional, commented out) How the app authenticates its Postgres connections: password (default, the URL's password), azure (Microsoft Entra ID token for Azure Database for PostgreSQL, via managed identity / DefaultAzureCredential), gcp (IAM access token for Cloud SQL / AlloyDB, via Application Default Credentials) or aws (RDS / Aurora / RDS Proxy IAM database auth: a 15-minute token from the task role / instance profile / IRSA; the URL's user is granted rds_iam). Token modes need TLS (sslmode=require) or the Cloud SQL Auth Proxy; aws turns TLS on itself and verifies the server with DATABASE_SSL_CA_FILE, else the RDS CA bundle shipped in the image (certs/rds-global-bundle.pem). DATABASE_AWS_REGION defaults to the region in the RDS host name, then AWS_REGION.
MIGRATION_DATABASE_URL(optional, commented out) Migrations on any PostgreSQL: usertasks-admin db migrate (npm run admin -- db migrate; node admin.cjs db migrate in the Docker image). It uses MIGRATION_DATABASE_URL, else DATABASE_URL (a direct / session-mode connection, not PgBouncer transaction mode), and the files in MIGRATIONS_DIR (default ./supabase/migrations).
MIGRATIONS_DIR(optional, commented out) Migrations on any PostgreSQL: usertasks-admin db migrate (npm run admin -- db migrate; node admin.cjs db migrate in the Docker image). It uses MIGRATION_DATABASE_URL, else DATABASE_URL (a direct / session-mode connection, not PgBouncer transaction mode), and the files in MIGRATIONS_DIR (default ./supabase/migrations).
REALTIME_PROVIDERsse pushes live updates (task lists, queue, notification(optional, commented out) Migrations on any PostgreSQL: usertasks-admin db migrate (npm run admin -- db migrate; node admin.cjs db migrate in the Docker image). It uses MIGRATION_DATABASE_URL, else DATABASE_URL (a direct / session-mode connection, not PgBouncer transaction mode), and the files in MIGRATIONS_DIR (default ./supabase/migrations).
REALTIME_DATABASE_URL(optional, commented out) bell, live logs) over Server-Sent Events from the app instead of Supabase Realtime. Each app instance LISTENs on Postgres (migration 20261105000000_realtime_notify.sql) over a session-mode connection: REALTIME_DATABASE_URL, else DATABASE_URL, else SUPABASE_DB_URL (the project's direct or session-pooler string; not the 6543 transaction pooler). With none set it polls the tables every 2 s instead.
SUPABASE_DB_URL(optional, commented out) bell, live logs) over Server-Sent Events from the app instead of Supabase Realtime. Each app instance LISTENs on Postgres (migration 20261105000000_realtime_notify.sql) over a session-mode connection: REALTIME_DATABASE_URL, else DATABASE_URL, else SUPABASE_DB_URL (the project's direct or session-pooler string; not the 6543 transaction pooler). With none set it polls the tables every 2 s instead.
STORAGE_PROVIDERlocal|s3|azure_blob|gcs stores uploads (logos, fonts,(optional, commented out) bell, live logs) over Server-Sent Events from the app instead of Supabase Realtime. Each app instance LISTENs on Postgres (migration 20261105000000_realtime_notify.sql) over a session-mode connection: REALTIME_DATABASE_URL, else DATABASE_URL, else SUPABASE_DB_URL (the project's direct or session-pooler string; not the 6543 transaction pooler). With none set it polls the tables every 2 s instead.
STORAGE_BUCKET_MAP(optional, commented out) data-table files, workflow documents) outside Supabase Storage; the app then serves them at /files/<bucket>/<key> unless STORAGE_PUBLIC_BASE_URL points at the store or a CDN. Secrets (keys, connection strings, service-account JSON) can instead be stored encrypted as storage.<option> instance settings. Buckets: task-files, logos, brand-fonts. STORAGE_BUCKET_MAP is JSON ({"logos": "acme-logos"}), STORAGE_BUCKET puts everything in one bucket under <bucket>/<key>, STORAGE_BUCKET_PREFIX prefixes each bucket name.
STORAGE_BUCKET(optional, commented out) data-table files, workflow documents) outside Supabase Storage; the app then serves them at /files/<bucket>/<key> unless STORAGE_PUBLIC_BASE_URL points at the store or a CDN. Secrets (keys, connection strings, service-account JSON) can instead be stored encrypted as storage.<option> instance settings. Buckets: task-files, logos, brand-fonts. STORAGE_BUCKET_MAP is JSON ({"logos": "acme-logos"}), STORAGE_BUCKET puts everything in one bucket under <bucket>/<key>, STORAGE_BUCKET_PREFIX prefixes each bucket name.
STORAGE_BUCKET_PREFIX(optional, commented out) data-table files, workflow documents) outside Supabase Storage; the app then serves them at /files/<bucket>/<key> unless STORAGE_PUBLIC_BASE_URL points at the store or a CDN. Secrets (keys, connection strings, service-account JSON) can instead be stored encrypted as storage.<option> instance settings. Buckets: task-files, logos, brand-fonts. STORAGE_BUCKET_MAP is JSON ({"logos": "acme-logos"}), STORAGE_BUCKET puts everything in one bucket under <bucket>/<key>, STORAGE_BUCKET_PREFIX prefixes each bucket name.
STORAGE_PUBLIC_BASE_URLhttps://{bucket}.s3.eu-west-1.amazonaws.com(optional, commented out) data-table files, workflow documents) outside Supabase Storage; the app then serves them at /files/<bucket>/<key> unless STORAGE_PUBLIC_BASE_URL points at the store or a CDN. Secrets (keys, connection strings, service-account JSON) can instead be stored encrypted as storage.<option> instance settings. Buckets: task-files, logos, brand-fonts. STORAGE_BUCKET_MAP is JSON ({"logos": "acme-logos"}), STORAGE_BUCKET puts everything in one bucket under <bucket>/<key>, STORAGE_BUCKET_PREFIX prefixes each bucket name.
STORAGE_LOCAL_ROOT/var/lib/usertasks/storage(optional, commented out) local: a directory (local disk, NFS or SMB mount) the app can write to.
S3_ENDPOINThttp://minio:9000(optional, commented out) s3: AWS S3 or any S3-compatible store (MinIO, Ceph RGW, R2, …). Without keys the AWS SDK's default chain is used (env, IAM role, IRSA).
S3_REGIONus-east-1(optional, commented out) s3: AWS S3 or any S3-compatible store (MinIO, Ceph RGW, R2, …). Without keys the AWS SDK's default chain is used (env, IAM role, IRSA).
S3_ACCESS_KEY_ID(optional, commented out) s3: AWS S3 or any S3-compatible store (MinIO, Ceph RGW, R2, …). Without keys the AWS SDK's default chain is used (env, IAM role, IRSA).
S3_SECRET_ACCESS_KEY(optional, commented out) s3: AWS S3 or any S3-compatible store (MinIO, Ceph RGW, R2, …). Without keys the AWS SDK's default chain is used (env, IAM role, IRSA).
S3_FORCE_PATH_STYLEtrue(optional, commented out) s3: AWS S3 or any S3-compatible store (MinIO, Ceph RGW, R2, …). Without keys the AWS SDK's default chain is used (env, IAM role, IRSA).
AZURE_STORAGE_CONNECTION_STRING(optional, commented out) azure_blob: a connection string, or the account name with a key or SAS token; the account name alone uses Microsoft Entra ID (managed identity / workload identity) via DefaultAzureCredential.
AZURE_STORAGE_ACCOUNT(optional, commented out) azure_blob: a connection string, or the account name with a key or SAS token; the account name alone uses Microsoft Entra ID (managed identity / workload identity) via DefaultAzureCredential.
AZURE_STORAGE_KEY(optional, commented out) azure_blob: a connection string, or the account name with a key or SAS token; the account name alone uses Microsoft Entra ID (managed identity / workload identity) via DefaultAzureCredential.
AZURE_STORAGE_SAS_TOKEN(optional, commented out) azure_blob: a connection string, or the account name with a key or SAS token; the account name alone uses Microsoft Entra ID (managed identity / workload identity) via DefaultAzureCredential.
AZURE_STORAGE_BLOB_ENDPOINT(optional, commented out) azure_blob: a connection string, or the account name with a key or SAS token; the account name alone uses Microsoft Entra ID (managed identity / workload identity) via DefaultAzureCredential.
GCS_PROJECT_ID(optional, commented out) gcs: a service-account key (JSON), or Application Default Credentials (workload identity, attached service account, GOOGLE_APPLICATION_CREDENTIALS).
GCS_CREDENTIALS_JSON(optional, commented out) gcs: a service-account key (JSON), or Application Default Credentials (workload identity, attached service account, GOOGLE_APPLICATION_CREDENTIALS).
GCS_API_ENDPOINT(optional, commented out) gcs: a service-account key (JSON), or Application Default Credentials (workload identity, attached service account, GOOGLE_APPLICATION_CREDENTIALS).
SCHEDULER_PROVIDERworker runs the scheduled jobs inside the app (or in a(optional, commented out) gcs: a service-account key (JSON), or Application Default Credentials (workload identity, attached service account, GOOGLE_APPLICATION_CREDENTIALS).
SCHEDULER_PROVIDERexternal: an outside scheduler calls POST /api/cron/tick(optional, commented out) usertasks worker container) instead of pg_cron; replicas elect one leader with a Postgres advisory lock on SCHEDULER_DATABASE_URL, else DATABASE_URL (a session connection, not a transaction pooler), else the tick lease. Set SCHEDULER_IN_PROCESS=false on web replicas when a separate worker runs.
SCHEDULER_IN_PROCESStrue(optional, commented out) every minute with CRON_SECRET, or with a Google Cloud Scheduler OIDC token (SCHEDULER_OIDC_SERVICE_ACCOUNTS, audience SCHEDULER_OIDC_AUDIENCE, default <APP_URL>/api/cron/tick) or an Entra ID managed-identity token (SCHEDULER_ENTRA_TENANT_ID, SCHEDULER_ENTRA_AUDIENCE, SCHEDULER_ENTRA_ALLOWED_PRINCIPALS: object or client ids), or an Amazon Cognito access token from an EventBridge API destination whose connection uses OAuth client credentials (SCHEDULER_COGNITO_USER_POOL_ID, SCHEDULER_COGNITO_ALLOWED_CLIENTS: app client ids, SCHEDULER_COGNITO_SCOPE optional, SCHEDULER_COGNITO_REGION default the pool id's prefix). SCHEDULER_PG_CRON_BASE_URL is the URL pg_cron calls (default APP_URL).
SCHEDULER_DATABASE_URL(optional, commented out) every minute with CRON_SECRET, or with a Google Cloud Scheduler OIDC token (SCHEDULER_OIDC_SERVICE_ACCOUNTS, audience SCHEDULER_OIDC_AUDIENCE, default <APP_URL>/api/cron/tick) or an Entra ID managed-identity token (SCHEDULER_ENTRA_TENANT_ID, SCHEDULER_ENTRA_AUDIENCE, SCHEDULER_ENTRA_ALLOWED_PRINCIPALS: object or client ids), or an Amazon Cognito access token from an EventBridge API destination whose connection uses OAuth client credentials (SCHEDULER_COGNITO_USER_POOL_ID, SCHEDULER_COGNITO_ALLOWED_CLIENTS: app client ids, SCHEDULER_COGNITO_SCOPE optional, SCHEDULER_COGNITO_REGION default the pool id's prefix). SCHEDULER_PG_CRON_BASE_URL is the URL pg_cron calls (default APP_URL).
SCHEDULER_OIDC_SERVICE_ACCOUNTS(optional, commented out) every minute with CRON_SECRET, or with a Google Cloud Scheduler OIDC token (SCHEDULER_OIDC_SERVICE_ACCOUNTS, audience SCHEDULER_OIDC_AUDIENCE, default <APP_URL>/api/cron/tick) or an Entra ID managed-identity token (SCHEDULER_ENTRA_TENANT_ID, SCHEDULER_ENTRA_AUDIENCE, SCHEDULER_ENTRA_ALLOWED_PRINCIPALS: object or client ids), or an Amazon Cognito access token from an EventBridge API destination whose connection uses OAuth client credentials (SCHEDULER_COGNITO_USER_POOL_ID, SCHEDULER_COGNITO_ALLOWED_CLIENTS: app client ids, SCHEDULER_COGNITO_SCOPE optional, SCHEDULER_COGNITO_REGION default the pool id's prefix). SCHEDULER_PG_CRON_BASE_URL is the URL pg_cron calls (default APP_URL).
SCHEDULER_OIDC_AUDIENCE(optional, commented out) every minute with CRON_SECRET, or with a Google Cloud Scheduler OIDC token (SCHEDULER_OIDC_SERVICE_ACCOUNTS, audience SCHEDULER_OIDC_AUDIENCE, default <APP_URL>/api/cron/tick) or an Entra ID managed-identity token (SCHEDULER_ENTRA_TENANT_ID, SCHEDULER_ENTRA_AUDIENCE, SCHEDULER_ENTRA_ALLOWED_PRINCIPALS: object or client ids), or an Amazon Cognito access token from an EventBridge API destination whose connection uses OAuth client credentials (SCHEDULER_COGNITO_USER_POOL_ID, SCHEDULER_COGNITO_ALLOWED_CLIENTS: app client ids, SCHEDULER_COGNITO_SCOPE optional, SCHEDULER_COGNITO_REGION default the pool id's prefix). SCHEDULER_PG_CRON_BASE_URL is the URL pg_cron calls (default APP_URL).
SCHEDULER_ENTRA_TENANT_ID(optional, commented out) every minute with CRON_SECRET, or with a Google Cloud Scheduler OIDC token (SCHEDULER_OIDC_SERVICE_ACCOUNTS, audience SCHEDULER_OIDC_AUDIENCE, default <APP_URL>/api/cron/tick) or an Entra ID managed-identity token (SCHEDULER_ENTRA_TENANT_ID, SCHEDULER_ENTRA_AUDIENCE, SCHEDULER_ENTRA_ALLOWED_PRINCIPALS: object or client ids), or an Amazon Cognito access token from an EventBridge API destination whose connection uses OAuth client credentials (SCHEDULER_COGNITO_USER_POOL_ID, SCHEDULER_COGNITO_ALLOWED_CLIENTS: app client ids, SCHEDULER_COGNITO_SCOPE optional, SCHEDULER_COGNITO_REGION default the pool id's prefix). SCHEDULER_PG_CRON_BASE_URL is the URL pg_cron calls (default APP_URL).
SCHEDULER_ENTRA_AUDIENCE(optional, commented out) every minute with CRON_SECRET, or with a Google Cloud Scheduler OIDC token (SCHEDULER_OIDC_SERVICE_ACCOUNTS, audience SCHEDULER_OIDC_AUDIENCE, default <APP_URL>/api/cron/tick) or an Entra ID managed-identity token (SCHEDULER_ENTRA_TENANT_ID, SCHEDULER_ENTRA_AUDIENCE, SCHEDULER_ENTRA_ALLOWED_PRINCIPALS: object or client ids), or an Amazon Cognito access token from an EventBridge API destination whose connection uses OAuth client credentials (SCHEDULER_COGNITO_USER_POOL_ID, SCHEDULER_COGNITO_ALLOWED_CLIENTS: app client ids, SCHEDULER_COGNITO_SCOPE optional, SCHEDULER_COGNITO_REGION default the pool id's prefix). SCHEDULER_PG_CRON_BASE_URL is the URL pg_cron calls (default APP_URL).
SCHEDULER_ENTRA_ALLOWED_PRINCIPALS(optional, commented out) every minute with CRON_SECRET, or with a Google Cloud Scheduler OIDC token (SCHEDULER_OIDC_SERVICE_ACCOUNTS, audience SCHEDULER_OIDC_AUDIENCE, default <APP_URL>/api/cron/tick) or an Entra ID managed-identity token (SCHEDULER_ENTRA_TENANT_ID, SCHEDULER_ENTRA_AUDIENCE, SCHEDULER_ENTRA_ALLOWED_PRINCIPALS: object or client ids), or an Amazon Cognito access token from an EventBridge API destination whose connection uses OAuth client credentials (SCHEDULER_COGNITO_USER_POOL_ID, SCHEDULER_COGNITO_ALLOWED_CLIENTS: app client ids, SCHEDULER_COGNITO_SCOPE optional, SCHEDULER_COGNITO_REGION default the pool id's prefix). SCHEDULER_PG_CRON_BASE_URL is the URL pg_cron calls (default APP_URL).
SCHEDULER_COGNITO_USER_POOL_ID(optional, commented out) every minute with CRON_SECRET, or with a Google Cloud Scheduler OIDC token (SCHEDULER_OIDC_SERVICE_ACCOUNTS, audience SCHEDULER_OIDC_AUDIENCE, default <APP_URL>/api/cron/tick) or an Entra ID managed-identity token (SCHEDULER_ENTRA_TENANT_ID, SCHEDULER_ENTRA_AUDIENCE, SCHEDULER_ENTRA_ALLOWED_PRINCIPALS: object or client ids), or an Amazon Cognito access token from an EventBridge API destination whose connection uses OAuth client credentials (SCHEDULER_COGNITO_USER_POOL_ID, SCHEDULER_COGNITO_ALLOWED_CLIENTS: app client ids, SCHEDULER_COGNITO_SCOPE optional, SCHEDULER_COGNITO_REGION default the pool id's prefix). SCHEDULER_PG_CRON_BASE_URL is the URL pg_cron calls (default APP_URL).
SCHEDULER_COGNITO_ALLOWED_CLIENTS(optional, commented out) every minute with CRON_SECRET, or with a Google Cloud Scheduler OIDC token (SCHEDULER_OIDC_SERVICE_ACCOUNTS, audience SCHEDULER_OIDC_AUDIENCE, default <APP_URL>/api/cron/tick) or an Entra ID managed-identity token (SCHEDULER_ENTRA_TENANT_ID, SCHEDULER_ENTRA_AUDIENCE, SCHEDULER_ENTRA_ALLOWED_PRINCIPALS: object or client ids), or an Amazon Cognito access token from an EventBridge API destination whose connection uses OAuth client credentials (SCHEDULER_COGNITO_USER_POOL_ID, SCHEDULER_COGNITO_ALLOWED_CLIENTS: app client ids, SCHEDULER_COGNITO_SCOPE optional, SCHEDULER_COGNITO_REGION default the pool id's prefix). SCHEDULER_PG_CRON_BASE_URL is the URL pg_cron calls (default APP_URL).
SCHEDULER_COGNITO_SCOPE(optional, commented out) every minute with CRON_SECRET, or with a Google Cloud Scheduler OIDC token (SCHEDULER_OIDC_SERVICE_ACCOUNTS, audience SCHEDULER_OIDC_AUDIENCE, default <APP_URL>/api/cron/tick) or an Entra ID managed-identity token (SCHEDULER_ENTRA_TENANT_ID, SCHEDULER_ENTRA_AUDIENCE, SCHEDULER_ENTRA_ALLOWED_PRINCIPALS: object or client ids), or an Amazon Cognito access token from an EventBridge API destination whose connection uses OAuth client credentials (SCHEDULER_COGNITO_USER_POOL_ID, SCHEDULER_COGNITO_ALLOWED_CLIENTS: app client ids, SCHEDULER_COGNITO_SCOPE optional, SCHEDULER_COGNITO_REGION default the pool id's prefix). SCHEDULER_PG_CRON_BASE_URL is the URL pg_cron calls (default APP_URL).
SCHEDULER_COGNITO_REGION(optional, commented out) every minute with CRON_SECRET, or with a Google Cloud Scheduler OIDC token (SCHEDULER_OIDC_SERVICE_ACCOUNTS, audience SCHEDULER_OIDC_AUDIENCE, default <APP_URL>/api/cron/tick) or an Entra ID managed-identity token (SCHEDULER_ENTRA_TENANT_ID, SCHEDULER_ENTRA_AUDIENCE, SCHEDULER_ENTRA_ALLOWED_PRINCIPALS: object or client ids), or an Amazon Cognito access token from an EventBridge API destination whose connection uses OAuth client credentials (SCHEDULER_COGNITO_USER_POOL_ID, SCHEDULER_COGNITO_ALLOWED_CLIENTS: app client ids, SCHEDULER_COGNITO_SCOPE optional, SCHEDULER_COGNITO_REGION default the pool id's prefix). SCHEDULER_PG_CRON_BASE_URL is the URL pg_cron calls (default APP_URL).
SCHEDULER_PG_CRON_BASE_URL(optional, commented out) every minute with CRON_SECRET, or with a Google Cloud Scheduler OIDC token (SCHEDULER_OIDC_SERVICE_ACCOUNTS, audience SCHEDULER_OIDC_AUDIENCE, default <APP_URL>/api/cron/tick) or an Entra ID managed-identity token (SCHEDULER_ENTRA_TENANT_ID, SCHEDULER_ENTRA_AUDIENCE, SCHEDULER_ENTRA_ALLOWED_PRINCIPALS: object or client ids), or an Amazon Cognito access token from an EventBridge API destination whose connection uses OAuth client credentials (SCHEDULER_COGNITO_USER_POOL_ID, SCHEDULER_COGNITO_ALLOWED_CLIENTS: app client ids, SCHEDULER_COGNITO_SCOPE optional, SCHEDULER_COGNITO_REGION default the pool id's prefix). SCHEDULER_PG_CRON_BASE_URL is the URL pg_cron calls (default APP_URL).
EMAIL_PROVIDERsmtp sends through any SMTP relay (Exchange, Postfix,(optional, commented out) every minute with CRON_SECRET, or with a Google Cloud Scheduler OIDC token (SCHEDULER_OIDC_SERVICE_ACCOUNTS, audience SCHEDULER_OIDC_AUDIENCE, default <APP_URL>/api/cron/tick) or an Entra ID managed-identity token (SCHEDULER_ENTRA_TENANT_ID, SCHEDULER_ENTRA_AUDIENCE, SCHEDULER_ENTRA_ALLOWED_PRINCIPALS: object or client ids), or an Amazon Cognito access token from an EventBridge API destination whose connection uses OAuth client credentials (SCHEDULER_COGNITO_USER_POOL_ID, SCHEDULER_COGNITO_ALLOWED_CLIENTS: app client ids, SCHEDULER_COGNITO_SCOPE optional, SCHEDULER_COGNITO_REGION default the pool id's prefix). SCHEDULER_PG_CRON_BASE_URL is the URL pg_cron calls (default APP_URL).
SMTP_TLS_REJECT_UNAUTHORIZEDfalse (prefer NODE_EXTRA_CA_CERTS for a(optional, commented out) Microsoft 365, Workspace SMTP relay, Mailpit). SMTP_SECURE=true is implicit TLS (port 465); otherwise SMTP_STARTTLS=required|opportunistic|off (default opportunistic). Certificates are verified unless
SMTP_HOST(optional, commented out) private CA). SMTP_NAME is the EHLO host name.
SMTP_PORT587(optional, commented out) private CA). SMTP_NAME is the EHLO host name.
SMTP_SECUREfalse(optional, commented out) private CA). SMTP_NAME is the EHLO host name.
SMTP_STARTTLSopportunistic(optional, commented out) private CA). SMTP_NAME is the EHLO host name.
SMTP_USER(optional, commented out) private CA). SMTP_NAME is the EHLO host name.
SMTP_PASSWORD(optional, commented out) private CA). SMTP_NAME is the EHLO host name.
SMTP_TLS_REJECT_UNAUTHORIZEDtrue(optional, commented out) private CA). SMTP_NAME is the EHLO host name.
SMTP_TLS_SERVERNAME(optional, commented out) private CA). SMTP_NAME is the EHLO host name.
SMTP_NAME(optional, commented out) private CA). SMTP_NAME is the EHLO host name.
SES_REGION(optional, commented out) ses: Amazon SES (SESv2 API). Without keys the AWS default chain is used.
SES_ACCESS_KEY_ID(optional, commented out) ses: Amazon SES (SESv2 API). Without keys the AWS default chain is used.
SES_SECRET_ACCESS_KEY(optional, commented out) ses: Amazon SES (SESv2 API). Without keys the AWS default chain is used.
SES_CONFIGURATION_SET(optional, commented out) ses: Amazon SES (SESv2 API). Without keys the AWS default chain is used.
ACS_EMAIL_CONNECTION_STRING(optional, commented out) azure_communication: Azure Communication Services Email, by connection string, or by endpoint with Entra ID (managed identity).
ACS_EMAIL_ENDPOINT(optional, commented out) azure_communication: Azure Communication Services Email, by connection string, or by endpoint with Entra ID (managed identity).
GRAPH_TENANT_ID(optional, commented out) microsoft_graph: Graph sendMail (Mail.Send application permission), with a client secret or, without one, a managed identity. GRAPH_SENDER is the mailbox to send as (default: the EMAIL_FROM address); GRAPH_ENDPOINT for national clouds.
GRAPH_CLIENT_ID(optional, commented out) microsoft_graph: Graph sendMail (Mail.Send application permission), with a client secret or, without one, a managed identity. GRAPH_SENDER is the mailbox to send as (default: the EMAIL_FROM address); GRAPH_ENDPOINT for national clouds.
GRAPH_CLIENT_SECRET(optional, commented out) microsoft_graph: Graph sendMail (Mail.Send application permission), with a client secret or, without one, a managed identity. GRAPH_SENDER is the mailbox to send as (default: the EMAIL_FROM address); GRAPH_ENDPOINT for national clouds.
GRAPH_SENDER(optional, commented out) microsoft_graph: Graph sendMail (Mail.Send application permission), with a client secret or, without one, a managed identity. GRAPH_SENDER is the mailbox to send as (default: the EMAIL_FROM address); GRAPH_ENDPOINT for national clouds.
GRAPH_ENDPOINThttps://graph.microsoft.com(optional, commented out) microsoft_graph: Graph sendMail (Mail.Send application permission), with a client secret or, without one, a managed identity. GRAPH_SENDER is the mailbox to send as (default: the EMAIL_FROM address); GRAPH_ENDPOINT for national clouds.
GMAIL_SERVICE_ACCOUNT_JSON(optional, commented out) gmail: Gmail API, a service account with domain-wide delegation impersonating GMAIL_SENDER (default: the EMAIL_FROM address).
GMAIL_SENDER(optional, commented out) gmail: Gmail API, a service account with domain-wide delegation impersonating GMAIL_SENDER (default: the EMAIL_FROM address).
EMAIL_CONSOLE_DIR(optional, commented out) console: log each message and, with EMAIL_CONSOLE_DIR, write .eml files.
SECRETS_NAME_PREFIX(optional, commented out) SECRETS_PROVIDER: where secret://<name>[#field] references in any provider option (e.g. SMTP_PASSWORD=secret://smtp#password) are read from: env (default; also <VAR>_FILE and SECRETS_FILES_DIR), db (encrypted secrets.<name> instance settings), supabase_vault, hashicorp_vault (also OpenBao), azure_key_vault, gcp_secret_manager, aws_secrets_manager. Values are cached for SECRETS_CACHE_TTL_SECONDS (default 300). ENCRYPTION_KEY may itself be a secret:// reference; when it is unset, an external store's SECRETS_ENCRYPTION_KEY_NAME (default encryption_key) is used.
SECRETS_CACHE_TTL_SECONDS300(optional, commented out) SECRETS_PROVIDER: where secret://<name>[#field] references in any provider option (e.g. SMTP_PASSWORD=secret://smtp#password) are read from: env (default; also <VAR>_FILE and SECRETS_FILES_DIR), db (encrypted secrets.<name> instance settings), supabase_vault, hashicorp_vault (also OpenBao), azure_key_vault, gcp_secret_manager, aws_secrets_manager. Values are cached for SECRETS_CACHE_TTL_SECONDS (default 300). ENCRYPTION_KEY may itself be a secret:// reference; when it is unset, an external store's SECRETS_ENCRYPTION_KEY_NAME (default encryption_key) is used.
SECRETS_ENCRYPTION_KEY_NAMEencryption_key(optional, commented out) SECRETS_PROVIDER: where secret://<name>[#field] references in any provider option (e.g. SMTP_PASSWORD=secret://smtp#password) are read from: env (default; also <VAR>_FILE and SECRETS_FILES_DIR), db (encrypted secrets.<name> instance settings), supabase_vault, hashicorp_vault (also OpenBao), azure_key_vault, gcp_secret_manager, aws_secrets_manager. Values are cached for SECRETS_CACHE_TTL_SECONDS (default 300). ENCRYPTION_KEY may itself be a secret:// reference; when it is unset, an external store's SECRETS_ENCRYPTION_KEY_NAME (default encryption_key) is used.
SECRETS_FILES_DIR/run/secrets(optional, commented out) SECRETS_PROVIDER: where secret://<name>[#field] references in any provider option (e.g. SMTP_PASSWORD=secret://smtp#password) are read from: env (default; also <VAR>_FILE and SECRETS_FILES_DIR), db (encrypted secrets.<name> instance settings), supabase_vault, hashicorp_vault (also OpenBao), azure_key_vault, gcp_secret_manager, aws_secrets_manager. Values are cached for SECRETS_CACHE_TTL_SECONDS (default 300). ENCRYPTION_KEY may itself be a secret:// reference; when it is unset, an external store's SECRETS_ENCRYPTION_KEY_NAME (default encryption_key) is used.
SECRETS_DATABASE_URL(optional, commented out) SECRETS_PROVIDER: where secret://<name>[#field] references in any provider option (e.g. SMTP_PASSWORD=secret://smtp#password) are read from: env (default; also <VAR>_FILE and SECRETS_FILES_DIR), db (encrypted secrets.<name> instance settings), supabase_vault, hashicorp_vault (also OpenBao), azure_key_vault, gcp_secret_manager, aws_secrets_manager. Values are cached for SECRETS_CACHE_TTL_SECONDS (default 300). ENCRYPTION_KEY may itself be a secret:// reference; when it is unset, an external store's SECRETS_ENCRYPTION_KEY_NAME (default encryption_key) is used.
VAULT_ADDR(optional, commented out) hashicorp_vault: KV v2 at VAULT_KV_MOUNT (default secret). Auth by VAULT_TOKEN, AppRole (VAULT_ROLE_ID + VAULT_SECRET_ID) or Kubernetes (VAULT_K8S_ROLE); VAULT_AUTH_METHOD picks one explicitly.
VAULT_NAMESPACE(optional, commented out) hashicorp_vault: KV v2 at VAULT_KV_MOUNT (default secret). Auth by VAULT_TOKEN, AppRole (VAULT_ROLE_ID + VAULT_SECRET_ID) or Kubernetes (VAULT_K8S_ROLE); VAULT_AUTH_METHOD picks one explicitly.
VAULT_KV_MOUNTsecret(optional, commented out) hashicorp_vault: KV v2 at VAULT_KV_MOUNT (default secret). Auth by VAULT_TOKEN, AppRole (VAULT_ROLE_ID + VAULT_SECRET_ID) or Kubernetes (VAULT_K8S_ROLE); VAULT_AUTH_METHOD picks one explicitly.
VAULT_AUTH_METHOD(optional, commented out) hashicorp_vault: KV v2 at VAULT_KV_MOUNT (default secret). Auth by VAULT_TOKEN, AppRole (VAULT_ROLE_ID + VAULT_SECRET_ID) or Kubernetes (VAULT_K8S_ROLE); VAULT_AUTH_METHOD picks one explicitly.
VAULT_TOKEN(optional, commented out) hashicorp_vault: KV v2 at VAULT_KV_MOUNT (default secret). Auth by VAULT_TOKEN, AppRole (VAULT_ROLE_ID + VAULT_SECRET_ID) or Kubernetes (VAULT_K8S_ROLE); VAULT_AUTH_METHOD picks one explicitly.
VAULT_ROLE_ID(optional, commented out) hashicorp_vault: KV v2 at VAULT_KV_MOUNT (default secret). Auth by VAULT_TOKEN, AppRole (VAULT_ROLE_ID + VAULT_SECRET_ID) or Kubernetes (VAULT_K8S_ROLE); VAULT_AUTH_METHOD picks one explicitly.
VAULT_SECRET_ID(optional, commented out) hashicorp_vault: KV v2 at VAULT_KV_MOUNT (default secret). Auth by VAULT_TOKEN, AppRole (VAULT_ROLE_ID + VAULT_SECRET_ID) or Kubernetes (VAULT_K8S_ROLE); VAULT_AUTH_METHOD picks one explicitly.
VAULT_APPROLE_MOUNTapprole(optional, commented out) hashicorp_vault: KV v2 at VAULT_KV_MOUNT (default secret). Auth by VAULT_TOKEN, AppRole (VAULT_ROLE_ID + VAULT_SECRET_ID) or Kubernetes (VAULT_K8S_ROLE); VAULT_AUTH_METHOD picks one explicitly.
VAULT_K8S_ROLE(optional, commented out) hashicorp_vault: KV v2 at VAULT_KV_MOUNT (default secret). Auth by VAULT_TOKEN, AppRole (VAULT_ROLE_ID + VAULT_SECRET_ID) or Kubernetes (VAULT_K8S_ROLE); VAULT_AUTH_METHOD picks one explicitly.
VAULT_K8S_MOUNTkubernetes(optional, commented out) hashicorp_vault: KV v2 at VAULT_KV_MOUNT (default secret). Auth by VAULT_TOKEN, AppRole (VAULT_ROLE_ID + VAULT_SECRET_ID) or Kubernetes (VAULT_K8S_ROLE); VAULT_AUTH_METHOD picks one explicitly.
VAULT_K8S_TOKEN_PATH/var/run/secrets/kubernetes.io/serviceaccount/token(optional, commented out) hashicorp_vault: KV v2 at VAULT_KV_MOUNT (default secret). Auth by VAULT_TOKEN, AppRole (VAULT_ROLE_ID + VAULT_SECRET_ID) or Kubernetes (VAULT_K8S_ROLE); VAULT_AUTH_METHOD picks one explicitly.
AZURE_KEY_VAULT_URLhttps://my-vault.vault.azure.net(optional, commented out) azure_key_vault: managed identity / DefaultAzureCredential.
GCP_SECRET_MANAGER_PROJECT(optional, commented out) gcp_secret_manager: Application Default Credentials / workload identity.
GCP_SECRET_MANAGER_CREDENTIALS_JSON(optional, commented out) gcp_secret_manager: Application Default Credentials / workload identity.
GCP_SECRET_MANAGER_ENDPOINT(optional, commented out) Regional or private endpoint, e.g. https://secretmanager.europe-west1.rep.googleapis.com
AWS_SECRETS_MANAGER_REGION(optional, commented out) aws_secrets_manager: AWS default credential chain.
AWS_SECRETS_MANAGER_ENDPOINT(optional, commented out) aws_secrets_manager: AWS default credential chain.
CACHE_KEY_PREFIXusertasks:(optional, commented out) CACHE_PROVIDER: where rate-limit windows (API keys, OAuth tokens, sign-in, agent runs, signups), credential / settings cache invalidations and idempotency claims live. memory (default): per instance, as before — with several replicas every limit multiplies by the replica count. postgres: an UNLOGGED table in this database (migration 20261108000000), no extra service. redis: Redis / Valkey / KeyDB / Dragonfly, Azure Cache for Redis, Memorystore, ElastiCache (rediss:// for TLS). Other processes see a revoked credential or a changed instance setting within CACHE_INVALIDATION_CHECK_MS (default 1000).
CACHE_INVALIDATION_CHECK_MS1000(optional, commented out) CACHE_PROVIDER: where rate-limit windows (API keys, OAuth tokens, sign-in, agent runs, signups), credential / settings cache invalidations and idempotency claims live. memory (default): per instance, as before — with several replicas every limit multiplies by the replica count. postgres: an UNLOGGED table in this database (migration 20261108000000), no extra service. redis: Redis / Valkey / KeyDB / Dragonfly, Azure Cache for Redis, Memorystore, ElastiCache (rediss:// for TLS). Other processes see a revoked credential or a changed instance setting within CACHE_INVALIDATION_CHECK_MS (default 1000).
CACHE_REDIS_URLredis://valkey:6379(optional, commented out) CACHE_PROVIDER: where rate-limit windows (API keys, OAuth tokens, sign-in, agent runs, signups), credential / settings cache invalidations and idempotency claims live. memory (default): per instance, as before — with several replicas every limit multiplies by the replica count. postgres: an UNLOGGED table in this database (migration 20261108000000), no extra service. redis: Redis / Valkey / KeyDB / Dragonfly, Azure Cache for Redis, Memorystore, ElastiCache (rediss:// for TLS). Other processes see a revoked credential or a changed instance setting within CACHE_INVALIDATION_CHECK_MS (default 1000).
CACHE_REDIS_USERNAME(optional, commented out) CACHE_PROVIDER: where rate-limit windows (API keys, OAuth tokens, sign-in, agent runs, signups), credential / settings cache invalidations and idempotency claims live. memory (default): per instance, as before — with several replicas every limit multiplies by the replica count. postgres: an UNLOGGED table in this database (migration 20261108000000), no extra service. redis: Redis / Valkey / KeyDB / Dragonfly, Azure Cache for Redis, Memorystore, ElastiCache (rediss:// for TLS). Other processes see a revoked credential or a changed instance setting within CACHE_INVALIDATION_CHECK_MS (default 1000).
CACHE_REDIS_PASSWORD(optional, commented out) CACHE_PROVIDER: where rate-limit windows (API keys, OAuth tokens, sign-in, agent runs, signups), credential / settings cache invalidations and idempotency claims live. memory (default): per instance, as before — with several replicas every limit multiplies by the replica count. postgres: an UNLOGGED table in this database (migration 20261108000000), no extra service. redis: Redis / Valkey / KeyDB / Dragonfly, Azure Cache for Redis, Memorystore, ElastiCache (rediss:// for TLS). Other processes see a revoked credential or a changed instance setting within CACHE_INVALIDATION_CHECK_MS (default 1000).
CACHE_REDIS_DB(optional, commented out) CACHE_PROVIDER: where rate-limit windows (API keys, OAuth tokens, sign-in, agent runs, signups), credential / settings cache invalidations and idempotency claims live. memory (default): per instance, as before — with several replicas every limit multiplies by the replica count. postgres: an UNLOGGED table in this database (migration 20261108000000), no extra service. redis: Redis / Valkey / KeyDB / Dragonfly, Azure Cache for Redis, Memorystore, ElastiCache (rediss:// for TLS). Other processes see a revoked credential or a changed instance setting within CACHE_INVALIDATION_CHECK_MS (default 1000).
CACHE_REDIS_AUTHpassword(optional, commented out) CACHE_REDIS_AUTH: password (default), entra (Azure: Entra ID token for the managed identity whose object id is CACHE_REDIS_USERNAME) or gcp_iam (Memorystore IAM auth with Application Default Credentials) or aws_iam (ElastiCache / MemoryDB IAM auth: CACHE_REDIS_USERNAME is the IAM-enabled user id, CACHE_REDIS_AWS_CACHE_NAME the replication group / serverless cache / MemoryDB cluster; tokens are signed with the task role and re-sent every 14 minutes; TLS on by default).
CACHE_REDIS_TLS(optional, commented out) CACHE_REDIS_AUTH: password (default), entra (Azure: Entra ID token for the managed identity whose object id is CACHE_REDIS_USERNAME) or gcp_iam (Memorystore IAM auth with Application Default Credentials) or aws_iam (ElastiCache / MemoryDB IAM auth: CACHE_REDIS_USERNAME is the IAM-enabled user id, CACHE_REDIS_AWS_CACHE_NAME the replication group / serverless cache / MemoryDB cluster; tokens are signed with the task role and re-sent every 14 minutes; TLS on by default).
CACHE_REDIS_TLS_CA_FILE(optional, commented out) CACHE_REDIS_AUTH: password (default), entra (Azure: Entra ID token for the managed identity whose object id is CACHE_REDIS_USERNAME) or gcp_iam (Memorystore IAM auth with Application Default Credentials) or aws_iam (ElastiCache / MemoryDB IAM auth: CACHE_REDIS_USERNAME is the IAM-enabled user id, CACHE_REDIS_AWS_CACHE_NAME the replication group / serverless cache / MemoryDB cluster; tokens are signed with the task role and re-sent every 14 minutes; TLS on by default).
CACHE_REDIS_TLS_SERVERNAME(optional, commented out) CACHE_REDIS_AUTH: password (default), entra (Azure: Entra ID token for the managed identity whose object id is CACHE_REDIS_USERNAME) or gcp_iam (Memorystore IAM auth with Application Default Credentials) or aws_iam (ElastiCache / MemoryDB IAM auth: CACHE_REDIS_USERNAME is the IAM-enabled user id, CACHE_REDIS_AWS_CACHE_NAME the replication group / serverless cache / MemoryDB cluster; tokens are signed with the task role and re-sent every 14 minutes; TLS on by default).
CACHE_REDIS_TLS_REJECT_UNAUTHORIZEDtrue(optional, commented out) CACHE_REDIS_AUTH: password (default), entra (Azure: Entra ID token for the managed identity whose object id is CACHE_REDIS_USERNAME) or gcp_iam (Memorystore IAM auth with Application Default Credentials) or aws_iam (ElastiCache / MemoryDB IAM auth: CACHE_REDIS_USERNAME is the IAM-enabled user id, CACHE_REDIS_AWS_CACHE_NAME the replication group / serverless cache / MemoryDB cluster; tokens are signed with the task role and re-sent every 14 minutes; TLS on by default).
CACHE_REDIS_ENTRA_SCOPEhttps://redis.azure.com/.default(optional, commented out) CACHE_REDIS_AUTH: password (default), entra (Azure: Entra ID token for the managed identity whose object id is CACHE_REDIS_USERNAME) or gcp_iam (Memorystore IAM auth with Application Default Credentials) or aws_iam (ElastiCache / MemoryDB IAM auth: CACHE_REDIS_USERNAME is the IAM-enabled user id, CACHE_REDIS_AWS_CACHE_NAME the replication group / serverless cache / MemoryDB cluster; tokens are signed with the task role and re-sent every 14 minutes; TLS on by default).
CACHE_REDIS_AWS_CACHE_NAME(optional, commented out) CACHE_REDIS_AUTH: password (default), entra (Azure: Entra ID token for the managed identity whose object id is CACHE_REDIS_USERNAME) or gcp_iam (Memorystore IAM auth with Application Default Credentials) or aws_iam (ElastiCache / MemoryDB IAM auth: CACHE_REDIS_USERNAME is the IAM-enabled user id, CACHE_REDIS_AWS_CACHE_NAME the replication group / serverless cache / MemoryDB cluster; tokens are signed with the task role and re-sent every 14 minutes; TLS on by default).
CACHE_REDIS_AWS_REGION(optional, commented out) CACHE_REDIS_AUTH: password (default), entra (Azure: Entra ID token for the managed identity whose object id is CACHE_REDIS_USERNAME) or gcp_iam (Memorystore IAM auth with Application Default Credentials) or aws_iam (ElastiCache / MemoryDB IAM auth: CACHE_REDIS_USERNAME is the IAM-enabled user id, CACHE_REDIS_AWS_CACHE_NAME the replication group / serverless cache / MemoryDB cluster; tokens are signed with the task role and re-sent every 14 minutes; TLS on by default).
CACHE_REDIS_AWS_SERVICEelasticache(optional, commented out) CACHE_REDIS_AUTH: password (default), entra (Azure: Entra ID token for the managed identity whose object id is CACHE_REDIS_USERNAME) or gcp_iam (Memorystore IAM auth with Application Default Credentials) or aws_iam (ElastiCache / MemoryDB IAM auth: CACHE_REDIS_USERNAME is the IAM-enabled user id, CACHE_REDIS_AWS_CACHE_NAME the replication group / serverless cache / MemoryDB cluster; tokens are signed with the task role and re-sent every 14 minutes; TLS on by default).
CACHE_REDIS_AWS_SERVERLESSfalse(optional, commented out) CACHE_REDIS_AUTH: password (default), entra (Azure: Entra ID token for the managed identity whose object id is CACHE_REDIS_USERNAME) or gcp_iam (Memorystore IAM auth with Application Default Credentials) or aws_iam (ElastiCache / MemoryDB IAM auth: CACHE_REDIS_USERNAME is the IAM-enabled user id, CACHE_REDIS_AWS_CACHE_NAME the replication group / serverless cache / MemoryDB cluster; tokens are signed with the task role and re-sent every 14 minutes; TLS on by default).
CACHE_REDIS_COMMAND_TIMEOUT_MS2000(optional, commented out) CACHE_REDIS_AUTH: password (default), entra (Azure: Entra ID token for the managed identity whose object id is CACHE_REDIS_USERNAME) or gcp_iam (Memorystore IAM auth with Application Default Credentials) or aws_iam (ElastiCache / MemoryDB IAM auth: CACHE_REDIS_USERNAME is the IAM-enabled user id, CACHE_REDIS_AWS_CACHE_NAME the replication group / serverless cache / MemoryDB cluster; tokens are signed with the task role and re-sent every 14 minutes; TLS on by default).
KMS_REFRESH_SECONDS60(optional, commented out) KMS_PROVIDER: the key-encryption key for envelope encryption of stored secrets. env (default): ENCRYPTION_KEY; without data keys (nobody ran usertasks-admin kms rotate) secrets are enc:v1 with ENCRYPTION_KEY, as before. vault_transit (Vault / OpenBao Transit; VAULT_ADDR and Vault auth as above), aws_kms, azure_key_vault (Key Vault key / Managed HSM), gcp_kms. Data keys are unwrapped at startup (other providers fail closed) and picked up by running processes every KMS_REFRESH_SECONDS; a rotated key is used for new values KMS_ACTIVATION_SECONDS after kms rotate.
KMS_ACTIVATION_SECONDS120(optional, commented out) KMS_PROVIDER: the key-encryption key for envelope encryption of stored secrets. env (default): ENCRYPTION_KEY; without data keys (nobody ran usertasks-admin kms rotate) secrets are enc:v1 with ENCRYPTION_KEY, as before. vault_transit (Vault / OpenBao Transit; VAULT_ADDR and Vault auth as above), aws_kms, azure_key_vault (Key Vault key / Managed HSM), gcp_kms. Data keys are unwrapped at startup (other providers fail closed) and picked up by running processes every KMS_REFRESH_SECONDS; a rotated key is used for new values KMS_ACTIVATION_SECONDS after kms rotate.
VAULT_TRANSIT_KEYusertasks(optional, commented out) KMS_PROVIDER: the key-encryption key for envelope encryption of stored secrets. env (default): ENCRYPTION_KEY; without data keys (nobody ran usertasks-admin kms rotate) secrets are enc:v1 with ENCRYPTION_KEY, as before. vault_transit (Vault / OpenBao Transit; VAULT_ADDR and Vault auth as above), aws_kms, azure_key_vault (Key Vault key / Managed HSM), gcp_kms. Data keys are unwrapped at startup (other providers fail closed) and picked up by running processes every KMS_REFRESH_SECONDS; a rotated key is used for new values KMS_ACTIVATION_SECONDS after kms rotate.
VAULT_TRANSIT_MOUNTtransit(optional, commented out) KMS_PROVIDER: the key-encryption key for envelope encryption of stored secrets. env (default): ENCRYPTION_KEY; without data keys (nobody ran usertasks-admin kms rotate) secrets are enc:v1 with ENCRYPTION_KEY, as before. vault_transit (Vault / OpenBao Transit; VAULT_ADDR and Vault auth as above), aws_kms, azure_key_vault (Key Vault key / Managed HSM), gcp_kms. Data keys are unwrapped at startup (other providers fail closed) and picked up by running processes every KMS_REFRESH_SECONDS; a rotated key is used for new values KMS_ACTIVATION_SECONDS after kms rotate.
AWS_KMS_KEY_IDalias/usertasks(optional, commented out) KMS_PROVIDER: the key-encryption key for envelope encryption of stored secrets. env (default): ENCRYPTION_KEY; without data keys (nobody ran usertasks-admin kms rotate) secrets are enc:v1 with ENCRYPTION_KEY, as before. vault_transit (Vault / OpenBao Transit; VAULT_ADDR and Vault auth as above), aws_kms, azure_key_vault (Key Vault key / Managed HSM), gcp_kms. Data keys are unwrapped at startup (other providers fail closed) and picked up by running processes every KMS_REFRESH_SECONDS; a rotated key is used for new values KMS_ACTIVATION_SECONDS after kms rotate.
AWS_KMS_REGION(optional, commented out) KMS_PROVIDER: the key-encryption key for envelope encryption of stored secrets. env (default): ENCRYPTION_KEY; without data keys (nobody ran usertasks-admin kms rotate) secrets are enc:v1 with ENCRYPTION_KEY, as before. vault_transit (Vault / OpenBao Transit; VAULT_ADDR and Vault auth as above), aws_kms, azure_key_vault (Key Vault key / Managed HSM), gcp_kms. Data keys are unwrapped at startup (other providers fail closed) and picked up by running processes every KMS_REFRESH_SECONDS; a rotated key is used for new values KMS_ACTIVATION_SECONDS after kms rotate.
AWS_KMS_ENDPOINT(optional, commented out) KMS_PROVIDER: the key-encryption key for envelope encryption of stored secrets. env (default): ENCRYPTION_KEY; without data keys (nobody ran usertasks-admin kms rotate) secrets are enc:v1 with ENCRYPTION_KEY, as before. vault_transit (Vault / OpenBao Transit; VAULT_ADDR and Vault auth as above), aws_kms, azure_key_vault (Key Vault key / Managed HSM), gcp_kms. Data keys are unwrapped at startup (other providers fail closed) and picked up by running processes every KMS_REFRESH_SECONDS; a rotated key is used for new values KMS_ACTIVATION_SECONDS after kms rotate.
AZURE_KMS_KEY_IDhttps://my-vault.vault.azure.net/keys/usertasks(optional, commented out) KMS_PROVIDER: the key-encryption key for envelope encryption of stored secrets. env (default): ENCRYPTION_KEY; without data keys (nobody ran usertasks-admin kms rotate) secrets are enc:v1 with ENCRYPTION_KEY, as before. vault_transit (Vault / OpenBao Transit; VAULT_ADDR and Vault auth as above), aws_kms, azure_key_vault (Key Vault key / Managed HSM), gcp_kms. Data keys are unwrapped at startup (other providers fail closed) and picked up by running processes every KMS_REFRESH_SECONDS; a rotated key is used for new values KMS_ACTIVATION_SECONDS after kms rotate.
AZURE_KMS_KEY_ALGORITHMRSA-OAEP-256(optional, commented out) KMS_PROVIDER: the key-encryption key for envelope encryption of stored secrets. env (default): ENCRYPTION_KEY; without data keys (nobody ran usertasks-admin kms rotate) secrets are enc:v1 with ENCRYPTION_KEY, as before. vault_transit (Vault / OpenBao Transit; VAULT_ADDR and Vault auth as above), aws_kms, azure_key_vault (Key Vault key / Managed HSM), gcp_kms. Data keys are unwrapped at startup (other providers fail closed) and picked up by running processes every KMS_REFRESH_SECONDS; a rotated key is used for new values KMS_ACTIVATION_SECONDS after kms rotate.
GCP_KMS_KEY_NAMEprojects/p/locations/l/keyRings/r/cryptoKeys/k(optional, commented out) KMS_PROVIDER: the key-encryption key for envelope encryption of stored secrets. env (default): ENCRYPTION_KEY; without data keys (nobody ran usertasks-admin kms rotate) secrets are enc:v1 with ENCRYPTION_KEY, as before. vault_transit (Vault / OpenBao Transit; VAULT_ADDR and Vault auth as above), aws_kms, azure_key_vault (Key Vault key / Managed HSM), gcp_kms. Data keys are unwrapped at startup (other providers fail closed) and picked up by running processes every KMS_REFRESH_SECONDS; a rotated key is used for new values KMS_ACTIVATION_SECONDS after kms rotate.
GCP_KMS_CREDENTIALS_JSON(optional, commented out) KMS_PROVIDER: the key-encryption key for envelope encryption of stored secrets. env (default): ENCRYPTION_KEY; without data keys (nobody ran usertasks-admin kms rotate) secrets are enc:v1 with ENCRYPTION_KEY, as before. vault_transit (Vault / OpenBao Transit; VAULT_ADDR and Vault auth as above), aws_kms, azure_key_vault (Key Vault key / Managed HSM), gcp_kms. Data keys are unwrapped at startup (other providers fail closed) and picked up by running processes every KMS_REFRESH_SECONDS; a rotated key is used for new values KMS_ACTIVATION_SECONDS after kms rotate.
GCP_KMS_ENDPOINT(optional, commented out) KMS_PROVIDER: the key-encryption key for envelope encryption of stored secrets. env (default): ENCRYPTION_KEY; without data keys (nobody ran usertasks-admin kms rotate) secrets are enc:v1 with ENCRYPTION_KEY, as before. vault_transit (Vault / OpenBao Transit; VAULT_ADDR and Vault auth as above), aws_kms, azure_key_vault (Key Vault key / Managed HSM), gcp_kms. Data keys are unwrapped at startup (other providers fail closed) and picked up by running processes every KMS_REFRESH_SECONDS; a rotated key is used for new values KMS_ACTIVATION_SECONDS after kms rotate.
AUTH_PROVIDERbuiltin keeps accounts, bcrypt hashes and sessions in this(optional, commented out) KMS_PROVIDER: the key-encryption key for envelope encryption of stored secrets. env (default): ENCRYPTION_KEY; without data keys (nobody ran usertasks-admin kms rotate) secrets are enc:v1 with ENCRYPTION_KEY, as before. vault_transit (Vault / OpenBao Transit; VAULT_ADDR and Vault auth as above), aws_kms, azure_key_vault (Key Vault key / Managed HSM), gcp_kms. Data keys are unwrapped at startup (other providers fail closed) and picked up by running processes every KMS_REFRESH_SECONDS; a rotated key is used for new values KMS_ACTIVATION_SECONDS after kms rotate.
AUTH_DATABASE_URL(optional, commented out) Postgres (schema app_auth; migration 20261106100000_builtin_auth.sql) instead of Supabase Auth: email + password, invitations, confirmation and reset emails through EMAIL_PROVIDER, plus any OIDC / SAML IdPs in AUTH_SSO_PROVIDERS. AUTH_PROVIDER=oidc or saml: SSO only (no passwords). Needs DATABASE_URL (or AUTH_DATABASE_URL), APP_URL (links and redirect URIs) and, with DB_PROVIDER=supabase or REALTIME_PROVIDER=supabase, SUPABASE_JWT_SECRET (the session's database identity is a short-lived token signed with it). Migrate existing Supabase users first (docs: Infrastructure → Auth); everyone signs in again after the switch.
AUTH_DATABASE_POOL_MAX5(optional, commented out) Postgres (schema app_auth; migration 20261106100000_builtin_auth.sql) instead of Supabase Auth: email + password, invitations, confirmation and reset emails through EMAIL_PROVIDER, plus any OIDC / SAML IdPs in AUTH_SSO_PROVIDERS. AUTH_PROVIDER=oidc or saml: SSO only (no passwords). Needs DATABASE_URL (or AUTH_DATABASE_URL), APP_URL (links and redirect URIs) and, with DB_PROVIDER=supabase or REALTIME_PROVIDER=supabase, SUPABASE_JWT_SECRET (the session's database identity is a short-lived token signed with it). Migrate existing Supabase users first (docs: Infrastructure → Auth); everyone signs in again after the switch.
AUTH_SSO_PROVIDERS(optional, commented out) JSON array of identity providers, e.g. [{"id":"entra","type":"oidc","preset":"entra","tenantId":"…","clientId":"…","clientSecret":"secret://entra-client-secret","defaultOrg":"acme"}] OIDC redirect URI: <APP_URL>/auth/sso/<id>/callback. SAML ACS: <APP_URL>/auth/saml/<id>/acs, SP metadata <APP_URL>/auth/saml/<id>/metadata.
AUTH_ALLOW_SIGNUPfalse(optional, commented out) Anyone may create a password account (default: invited emails only).
AUTH_REQUIRE_EMAIL_CONFIRMATIONtrue(optional, commented out) Confirmation email before the first password sign-in (default true).
AUTH_SESSION_IDLE_HOURS168(optional, commented out) Sessions: rolling idle timeout in hours (default 168) and absolute lifetime in days (default 30). Lockout after N wrong passwords for M minutes.
AUTH_SESSION_MAX_DAYS30(optional, commented out) Sessions: rolling idle timeout in hours (default 168) and absolute lifetime in days (default 30). Lockout after N wrong passwords for M minutes.
AUTH_LOCKOUT_THRESHOLD10(optional, commented out) Sessions: rolling idle timeout in hours (default 168) and absolute lifetime in days (default 30). Lockout after N wrong passwords for M minutes.
AUTH_LOCKOUT_MINUTES15(optional, commented out) Sessions: rolling idle timeout in hours (default 168) and absolute lifetime in days (default 30). Lockout after N wrong passwords for M minutes.
AUTH_PASSWORD_MIN_LENGTH8(optional, commented out) Sessions: rolling idle timeout in hours (default 168) and absolute lifetime in days (default 30). Lockout after N wrong passwords for M minutes.
AUTH_COOKIE_SECURE(optional, commented out) Force the Secure flag on auth cookies on/off (default: on unless APP_URL is http://).

Instance administration (optional)

VariableExample / defaultDescription
INSTANCE_ADMIN_EMAILSops@example.com(optional, commented out) Instance admins: who may open Settings → Infrastructure (read-only provider status, health checks and the provider switch log). Comma-separated emails; matched against the signed-in account's verified address. Workspace roles never grant it. Also settable with usertasks-admin instance-admins add.
BACKUP_DIR/var/backups/usertasks(optional, commented out) usertasks-admin switch: where backups go (default ./backups/switches; keep it private — it holds config snapshots and, for auth, password hashes) and the pg_dump binary to use (default pg_dump on PATH; must be >= the server version).
PG_DUMP/usr/lib/postgresql/17/bin/pg_dump(optional, commented out) usertasks-admin switch: where backups go (default ./backups/switches; keep it private — it holds config snapshots and, for auth, password hashes) and the pg_dump binary to use (default pg_dump on PATH; must be >= the server version).

GitHub sync (optional)

VariableExample / defaultDescription
GITHUB_SYNC_AUTHOR_EMAILusertasks-sync@users.noreply.github.comAuthor email on commits made by GitHub sync.

Cloud edition only

VariableExample / defaultDescription
CHIRPME_API_KEYContact form delivery (/api/contact) and search-console verification.
CHIRPME_CHANNEL_IDContact form delivery (/api/contact) and search-console verification.
GOOGLE_SITE_VERIFICATIONContact form delivery (/api/contact) and search-console verification.
NEXT_PUBLIC_REPOSITORY_URLPublic source repository URL (e.g. https://github.com/<org>/<repo>), inlined at build time. While unset, the marketing site shows no repository links and omits it from structured data. See docs/launch-checklist.md.

Build output (Docker only)

VariableExample / defaultDescription
NEXT_OUTPUT_STANDALONEtrue(optional, commented out) Set to true to emit .next/standalone (the Dockerfile sets this itself).

Queue and runtime tuning

VariableDefaultEffect
WORKFLOW_CONCURRENCY5Jobs one processor invocation runs at once
WORKFLOW_PROCESSOR_BUDGET_MS50000How long one invocation keeps starting jobs
QUEUE_RETENTION_DAYS7Finished queue rows kept by the daily cleanup
CRON_TICK_CONCURRENCY4Scheduled jobs one scheduler tick (/api/cron/tick) runs at once
NODE_EXTRA_CA_CERTS—Trust a private CA for integrations, connectors and log destinations