.env.example in the repo as a starting point.
Required refers to production. Setting
OMNARA_ALLOW_INSECURE_DEV_DEFAULTS=1
fills the fallbacks marked dev below (local Compose services, console email,
an insecure secret-encryption key). Never set it in production.Core
Database and Redis
PostgreSQL 18 or newer is required. The API, worker, and maintenance services
default to a pool of 1–10 connections, a 30-minute idle timeout, a 30-minute
connection lifetime, and five minutes of lifetime jitter. Override these with
pool_* settings in OMNARA_DATABASE_URL, and budget connections across all
service replicas.
Direct PostgreSQL, RDS Proxy, and PgBouncer session pooling work with these
settings. PgBouncer transaction pooling requires max_prepared_statements > 0;
statement pooling is not supported.
The migrator defaults to a 30-second lock timeout and a 15-minute statement
timeout. Explicit values in OMNARA_DATABASE_URL take precedence.
Web serving and proxy
OMNARA_EMAIL_DRIVER. In production, use smtp or sendgrid — or disable both flows with OMNARA_AUTH_SIGNUP_ENABLED=0 and OMNARA_AUTH_PASSWORD_RESET_ENABLED=0.
Auth and SSO connectors
GitHub uses
kind:"github" (endpoints default to github.com; GitHub-compatible providers must supply issuer, authorization_url, token_url, and userinfo_url). Google and generic SSO providers — Keycloak, Okta, Auth0, Azure, ZITADEL — use kind:"oidc" with issuer discovery. An example is shown below:
Secret encryption
Secret values are envelope-encrypted with keys from this ring.
Generate each key with
openssl rand -base64 32. To rotate: add the new key to the ring, set it active, rewrap stored versions, then remove the old key once nothing references it.
Skill download capabilities
Skill archive offers use a short-lived capability bound to one machine, skill, and revision.Blob storage
Artifact content lives in S3-compatible object storage; a bucket is required.Machine daemon and pools
API daemon configuration
Machine pool templates automatically create a base machine pool for any new organization. The supported providers are listed below:
Provider notes:
- Custom pool images must provide a writable
HOMEorOMNARA_HOME, plus a POSIX shell, standard Unix utilities,curl, andsha256sumorshasumfor the Omnara launcher (startup_scriptadditionally requiresbase64). - Blaxel images must be sandbox images built or pushed through Blaxel (custom images must include
sandbox-api), and unlimited persistence requires quota Tier 2 or higher — Tier 0 and Tier 1 cap sandbox lifetimes at 7 and 30 days. - Daytona snapshots are allowed by name, must be active in the selected target, must allow sandboxes to reach
OMNARA_PUBLIC_URL, and their API-resolved CPU and memory count against the pool caps. - For Unikraft and Blaxel,
sleep_after_msenables scale-to-zero after that many milliseconds of daemon inactivity; omit or0disables it, and enabled values must be at least30000.
Operator-provisioned default model provider
An installation can give each new organization a model provider without storing the upstream credential in configuration. Leave these variables unset to let organization owners configure providers themselves.
The credential service contract has these invariants:
POST /model-provider-credentialsreceives the organization ID, creator user ID, and provider template. A successful response is201with{"credential_value":"..."};202and5xxare retryable, while409represents a durable identity or provisioner conflict.- The organization ID is the stable issuance identity. The same request may be repeated until Omnara commits the credential, provider, models, grants, and job completion together. The credential service must recover ambiguous issuance without returning an unusable credential.
- Organization creation never depends on credential issuance. The API attempts provisioning after commit, and maintenance retries failures.
- Apply migrations before deploying both binaries. The API and maintenance must use the same template, credential-service configuration, and secret-encryption key ring.
Host daemon configuration
Web tools
Web tools work out of the box:web_fetch has no vendor dependency, and web_search defaults to Exa’s keyless endpoint.