Generated reference · Configuration

Configuration reference

Every environment variable the platform reads — parsed from .env.example, classified, with secret values redacted.

1006variables51sections207secrets

On this page

Every environment variable the platform reads, parsed from the committed root .env.example template plus each app/service’s own .env.example (the 30 per-service surfaces below carry the feature flags, auth issuers, CORS, rate-limit, and service-discovery variables the root template does not). Oshun is domain-isolated (each domain owns its database/Redis/queue/object-store URLs and ports) and fail-closed: an integration activates only when all of its variables are present, and absent ones leave the feature honestly unavailable rather than fabricated. Variables classified as secrets show •••, never a value — this reference is a secret schema, not a secret store (§6).

1006Variables
51Config sections
207Secrets (redacted)
407Supply to activate
secret redacted credential · endpoint / model / toggle · port / value · has default ships a working dev default · supply to activate empty until you set it

Athena Infrastructure (Maker Intelligence & Workshop Operations) (20)#

ATHENA_DATABASE_URL= postgresql://oshun:oshun_dev@localhost:6432/athenaendpointhas default
ATHENA_DIRECT_DATABASE_URL= postgresql://oshun:oshun_dev@localhost:5432/athenaendpointhas default
ATHENA_MQTT_URL= mqtt://localhost:1886endpointhas default
ATHENA_KAFKA_BROKERS= localhost:29092endpointhas default
ATHENA_INFLUXDB_URL= http://localhost:8090endpointhas default
ATHENA_INFLUXDB_TOKEN= •••secrethas default
ATHENA_INFLUXDB_ORG= oshunvaluehas default
ATHENA_INFLUXDB_BUCKET= athena_telemetryvaluehas default
ATHENA_MINIO_ENDPOINT= http://localhost:9000endpointhas default
ATHENA_MINIO_ACCESS_KEY= •••secrethas default
ATHENA_MINIO_SECRET_KEY= •••secrethas default
ATHENA_CAD_BUCKET= athena-cad-modelsvaluehas default
ATHENA_CNC_BUCKET= athena-cnc-programsvaluehas default
ATHENA_FIRMWARE_BUCKET= athena-firmware-imagesvaluehas default
ATHENA_MEDIA_BUCKET= athena-quality-mediavaluehas default
ATHENA_GATEWAY_PORT= 3700porthas default
ATHENA_IOT_PORT= 3701porthas default
ATHENA_PRODUCTION_PORT= 3702porthas default
ATHENA_MQTT_PORT= 1886porthas default
ATHENA_INFLUXDB_PORT= 8090porthas default

Cybele Infrastructure (Real Estate & Construction Intelligence) (38)#

CYBELE_DATABASE_URL= postgresql://oshun:oshun_dev@cybele-pgbouncer:5432/cybeleendpointhas default
Primary database URL — via PgBouncer (transaction mode)
CYBELE_DIRECT_DATABASE_URL= postgresql://oshun:oshun_dev@cybele-postgres:5432/cybeleendpointhas default
Direct connection — used for DDL (migrations) and TimescaleDB operations
CYBELE_IOT_DATABASE_URL= postgresql://oshun:oshun_dev@cybele-postgres:5432/cybeleendpointhas default
IoT service uses direct connection for hypertable chunk management
CYBELE_DEV_DATABASE_URL= postgresql://oshun:oshun_dev@localhost:5432/cybeleendpointhas default
Dev convenience: shared postgres (add cybele to POSTGRES_MULTIPLE_DATABASES)
CYBELE_REDIS_URL= redis://cybele-redis:6379endpointhas default
CYBELE_REDIS_PASSWORD= •••secretsupply to activate
CYBELE_KAFKA_BROKERS= kafka:9092endpointhas default
CYBELE_MINIO_ENDPOINT= http://minio:9000endpointhas default
CYBELE_MINIO_ACCESS_KEY= •••secrethas default
CYBELE_MINIO_SECRET_KEY= •••secrethas default
CYBELE_JWT_SECRET= •••secrethas default
JWT signing secret — MUST be changed in production (min 64 chars)
CYBELE_JWT_ISSUER= https://cybele.oshun.iovaluehas default
CYBELE_JWT_EXPIRY_SECONDS= 3600timinghas default

External service integrations (Ghana-specific)#

GHANA_LANDS_COMMISSION_URL= https://api.lands.gov.ghendpointhas default
GHANA_LANDS_COMMISSION_API_KEY= •••secretsupply to activate
GHIPSS_BASE_URL= https://api.ghipss.netendpointhas default
GHIPSS_API_KEY= •••secretsupply to activate
MTN_MOMO_BASE_URL= https://sandbox.momodeveloper.mtn.comendpointhas default
MTN_MOMO_SUBSCRIPTION_KEY= •••secretsupply to activate
VODAFONE_CASH_BASE_URL= https://api.vodafonecash.com.ghendpointhas default
VODAFONE_CASH_API_KEY= •••secretsupply to activate
AIRTELTIGO_MONEY_BASE_URL= https://api.airteltigomoney.com.ghendpointhas default
AIRTELTIGO_MONEY_API_KEY= •••secretsupply to activate
GHANA_REVENUE_AUTHORITY_URL= https://api.gra.gov.ghendpointhas default
GHANA_REVENUE_AUTHORITY_API_KEY= •••secretsupply to activate
GHANA_STATISTICAL_SERVICE_URL= https://www.statsghana.gov.gh/apiendpointhas default
MORTGAGE_BANK_FEED_URLendpointsupply to activate
MORTGAGE_BANK_FEED_API_KEY= •••secretsupply to activate

OpenTelemetry (shared with other domains)#

OTEL_EXPORTER_OTLP_ENDPOINT= http://jaeger:4318/v1/tracesendpointhas default

Service ports#

CYBELE_GATEWAY_PORT= 3600porthas default
CYBELE_PROPERTY_PORT= 3601porthas default
CYBELE_CONSTRUCTION_PORT= 3602porthas default
CYBELE_LEASE_PORT= 3603porthas default
CYBELE_FINANCE_PORT= 3604porthas default
CYBELE_IOT_PORT= 3605porthas default
CYBELE_POSTGRES_PORT= 5431porthas default
CYBELE_PGBOUNCER_PORT= 6431porthas default
CYBELE_REDIS_PORT= 6380porthas default

Product-graph Neo4j projection (compose `graph` profile; phase 7) (4)#

OSHUN_PRODUCT_GRAPH_NEO4J_URL= bolt://localhost:7687endpointhas default
Analysis surface only — never a serving dependency. Load with `node tools/load-product-graph-neo4j.mjs` after bringing up the profile: docker compose -f docker/docker-compose.dev.yml --profile graph up -d The Neo4j graph is a disposable projection of the checked-in artifact (full-replaced per graph version, scoped to the :ProductGraph label). On RAM-constrained dev machines override the Kalika-sized defaults, e.g. KALIKA_NEO4J_MEM_LIMIT=2500m KALIKA_NEO4J_HEAP_MAX=1G KALIKA_NEO4J_PAGECACHE=512m.
OSHUN_PRODUCT_GRAPH_NEO4J_USER= neo4jvaluehas default
OSHUN_PRODUCT_GRAPH_NEO4J_PASSWORD= •••secrethas default
OSHUN_PRODUCT_GRAPH_NEO4J_DBvaluesupply to activate
Optional: defaults to the server's default database (kalika_knowledge in the dev compose profile — community edition serves a single database).

Maat Infrastructure (13)#

MAAT_DATABASE_URL= postgresql://oshun:oshun_dev@pgbouncer:6432/maatendpointhas default
MAAT_REDIS_URL= redis://redis:6379endpointhas default
MAAT_NEO4J_URL= bolt://maat-neo4j:7687endpointhas default
MAAT_NEO4J_USER= neo4jvaluehas default
MAAT_NEO4J_PASSWORD= •••secrethas default
MAAT_NEO4J_DATABASE= maat_knowledgevaluehas default
MAAT_KAFKA_BROKERS= kafka:9092endpointhas default
MAAT_TOPIC_INTELLIGENCE_MARKET= maat.intelligence.markettopichas default
MAAT_TOPIC_AGENTS_TASKS= maat.agents.taskstopichas default
MAAT_TOPIC_SIMULATION_STATE= maat.simulation.statetopichas default
MAAT_TOPIC_COMPLIANCE_ALERTS= maat.compliance.alertstopichas default
MAAT_TOPIC_STRATEGY_DECISIONS= maat.strategy.decisionstopichas default
MAAT_QDRANT_URL= http://qdrant:6333endpointhas default

Nisaba Infrastructure (5)#

NISABA_DATABASE_URL= postgresql://oshun:oshun_dev@localhost:5432/nisabaendpointhas default
NISABA_REDIS_PREFIX= nisaba:valuehas default
NISABA_SEFARIA_API_URL= https://www.sefaria.org/apiendpointhas default
NISABA_CDLI_API_URL= https://cdli.mpiwg-berlin.mpg.de/apiendpointhas default
NISABA_IIIF_BASE_URL= http://localhost:8182/iiifendpointhas default

Calliope Infrastructure (1)#

CALLIOPE_DATABASE_URL= postgresql://oshun:oshun_dev@localhost:5432/calliopeendpointhas default

Tara Infrastructure (App Store Safe Meditation Platform) (7)#

TARA_DATABASE_URL= postgresql://oshun:oshun_dev@localhost:5432/taraendpointhas default
TARA_REDIS_PREFIX= tara:valuehas default
TARA_API_PORT= 3001porthas default
TARA_API_HOST= 0.0.0.0endpointhas default
TARA_WEB_URL= http://localhost:3001endpointhas default
TARA_CDN_URL= http://localhost:9000/tara-contentendpointhas default
TARA_CONTENT_BUCKET= tara-contentvaluehas default

V1 Domain Databases — Arete / Veritas / Nyx / Metis (shared oshun_dev) (4)#

ARETE_DATABASE_URL= postgresql://oshun:oshun_dev@localhost:5432/oshun_devendpointhas default
V1-launch decision (TODOS §35 / DEPENDENCIES §21): these four domains run against the SHARED `oshun_dev` database for V1 launch — they are deliberately NOT in POSTGRES_MULTIPLE_DATABASES (docker/docker-compose.dev.yml), unlike tara/nisaba/isis/etc. The vars below exist because real code reads them: - libs/metis/knowledge-graph pgvector store resolves METIS_DATABASE_URL ?? DATABASE_URL (fails loud when neither is set); - libs/oshun/persistence/src/migration-plan.ts names each var as the per-domain SOURCE database for the post-V1 split, so pointing one at a dedicated database later migrates that domain without code changes. Keep all four at the shared URL until a per-domain database is provisioned.
VERITAS_DATABASE_URL= postgresql://oshun:oshun_dev@localhost:5432/oshun_devendpointhas default
NYX_DATABASE_URL= postgresql://oshun:oshun_dev@localhost:5432/oshun_devendpointhas default
METIS_DATABASE_URL= postgresql://oshun:oshun_dev@localhost:5432/oshun_devendpointhas default

Nyx Prediction Sources (DEPENDENCIES §18 / TODOS §35) (9)#

NYX_NASA_JPL_HORIZONS_URL= https://ssd.jpl.nasa.gov/api/horizons.apiendpointhas default
Base URLs for the external authorities behind Nyx sky-event predictions. Each maps to a `PredictionSourceKind` in libs/contracts/src/nyx (so customers see exactly which authority predicted an event). The values below are the same canonical endpoints compiled into the client libraries — override at deploy to route through a mirror/proxy: - NASA JPL: libs/nyx/catalogs/solar-system/horizons (HORIZONS_API_URL) and .../neo + .../comets (ssd-api CAD/Sentry/Scout/SBDB clients) - NOAA SWPC: libs/nyx/realtime/solar (DEFAULT_NOAA_CONFIG.baseUrl) - IMO: libs/nyx/events/src/meteor-showers.ts (imo-meteor-calendar refs) - IERS / weather / Bortle: consumed through per-client config objects (`iers-bulletin-a`, `weather-provider`, `bortle-light-pollution-atlas`)
NYX_NASA_JPL_SSD_API_URL= https://ssd-api.jpl.nasa.govendpointhas default
NYX_IMO_METEOR_CALENDAR_URL= https://www.imo.net/resources/calendar/endpointhas default
NYX_IERS_BULLETIN_A_URL= https://datacenter.iers.org/data/latestVersion/bulletinA.txtendpointhas default
NYX_NOAA_SWPC_URL= https://services.swpc.noaa.govendpointhas default
NYX_WEATHER_PROVIDER_URL= https://api.open-meteo.com/v1/forecastendpointhas default
NYX_BORTLE_ATLAS_URL= https://djlorenz.github.io/astronomy/lp2022/endpointhas default
NYX_NASA_API_KEY= •••secrethas default
Per-source API keys. NASA accepts DEMO_KEY at heavily throttled rates — set a real key (https://api.nasa.gov) before launch. Open-Meteo needs no key; a commercial weather provider key goes here if one is swapped in.
NYX_WEATHER_PROVIDER_API_KEY= •••secretsupply to activate

Kalika Infrastructure (1)#

KALIKA_DATABASE_URL= postgresql://oshun:oshun_dev@localhost:5432/kalika?schema=kalikaendpointhas default

Aphrodite Infrastructure (Live Publisher Edge) (5)#

STREAM_INGEST_RTMP_URL= rtmp://localhost:1935endpointhas default
Public publisher endpoint returned with newly issued, stream-bound grants.
MEDIAMTX_HOOK_SECRET= •••secretsupply to activate
MediaMTX external-auth and lifecycle-hook credential. Use a distinct random secret; hook requests fail closed when this is unset.
MEDIAMTX_CONTROL_URL= http://127.0.0.1:9997endpointhas default
MediaMTX Control API used for authoritative publisher reconciliation. EDGE_ID must be stable and unique per edge instance. The scheduler starts only when both values are set; interval accepts 1000–300000 milliseconds.
MEDIAMTX_EDGE_ID= aphrodite-edge-local-1valuehas default
MEDIAMTX_RECONCILE_INTERVAL_MS= 15000timinghas default

Oya Infrastructure (Home-Robotics Hive — drones/rovers/manipulation) (1)#

OYA_DATABASE_URL= postgresql://oshun:oshun_dev@localhost:5432/oyaendpointhas default
Domain-isolated DB (pgvector enabled for telemetry/map embeddings), created by docker/scripts/init-multiple-databases.sh from POSTGRES_MULTIPLE_DATABASES. Consumed by @oya/database and apps/oya/* services (OYA_DATABASE_URL first, then DATABASE_URL, then the dev default).

LLM Provider API Keys (41)#

ANTHROPIC_API_KEY= •••secretsupply to activate
OPENROUTER_API_KEY= •••secretsupply to activate
OPENROUTER_PROVIDER_SORTvaluesupply to activate
Optional OpenRouter route overrides. The assistant model registry supplies a measured provider allowlist by default; set ONLY explicitly to replace it.
OPENROUTER_PROVIDER_QUANTIZATIONSvaluesupply to activate
OPENROUTER_PROVIDER_ONLYvaluesupply to activate
OPENAI_API_KEY= •••secretsupply to activate
GOOGLE_API_KEY= •••secretsupply to activate
GEMINI_API_KEY= •••secretsupply to activate
GOOGLE_AI_API_KEY= •••secretsupply to activate
XAI_API_KEY= •••secretsupply to activate
COHERE_API_KEY= •••secretsupply to activate
MISTRAL_API_KEY= •••secretsupply to activate
GROQ_API_KEY= •••secretsupply to activate
TOGETHER_API_KEY= •••secretsupply to activate
REPLICATE_API_TOKEN= •••secretsupply to activate
AZURE_OPENAI_API_KEY= •••secretsupply to activate
AZURE_OPENAI_ENDPOINTendpointsupply to activate
AWS_BEDROCK_ACCESS_KEY_IDvaluesupply to activate
AWS_BEDROCK_SECRET_ACCESS_KEY= •••secretsupply to activate
AWS_BEDROCK_REGION= us-east-1valuehas default
METIS_SOURCE_GENERATION_MODEL_PROVIDER= disabledmodelhas default
Metis source-forge lesson authoring is disabled by default. Set the provider to `openrouter` or `openai` and provide a dedicated key to enable the real retrieval-fed model path. Model/base URL may be left empty to use the Metis provider defaults. If unavailable, requests use the labeled non-release template only when `allow_template_fallback` remains true.
METIS_SOURCE_GENERATION_MODELmodelsupply to activate
METIS_SOURCE_GENERATION_MODEL_BASE_URLmodelsupply to activate
METIS_SOURCE_GENERATION_MODEL_API_KEY= •••secretsupply to activate
METIS_SOURCE_GENERATION_MODEL_TIMEOUT_SECONDS= 30modelhas default
METIS_LESSON_ASSIST_MODEL_PROVIDER= disabledmodelhas default
Per-block lesson assistance is a separate, zero-tool provider boundary and is disabled by default. Pricing rates are USD minor units per million tokens; the exact pricing version and realized cost are retained with each proposal.
METIS_LESSON_ASSIST_MODELmodelsupply to activate
METIS_LESSON_ASSIST_MODEL_BASE_URLmodelsupply to activate
METIS_LESSON_ASSIST_MODEL_API_KEY= •••secretsupply to activate
METIS_LESSON_ASSIST_MODEL_TIMEOUT_SECONDS= 30modelhas default
METIS_LESSON_ASSIST_PRICING_VERSION= configured-v1valuehas default
METIS_LESSON_ASSIST_INPUT_COST_PER_MILLION_MINOR_UNITS= 0valuehas default
METIS_LESSON_ASSIST_OUTPUT_COST_PER_MILLION_MINOR_UNITS= 0valuehas default
METIS_SOURCE_PROMOTION_VERIFICATION_HMAC_SECRET= •••secretsupply to activate
Shared only by trusted TypeScript verification and Python promotion services. Required for promotion and must contain at least 32 high-entropy characters.
METIS_SOURCE_PUBLICATION_SIGNING_HMAC_SECRETvaluesupply to activate
Separate publication authority used for administrator review, release, and learner-delivery receipts. Required for publication; minimum 32 high-entropy characters and intentionally distinct from the promotion verification key.
METIS_CONTINUOUS_RECERTIFICATION_ADMISSION_HMAC_SECRET= •••secretsupply to activate
Separate trust boundary used by the canonical REL-003 evaluator to admit one exact candidate for a short release/delivery window. Required for publication.
METIS_ASSESSMENT_INTERLOCK_HMAC_SECRET= •••secretsupply to activate
Signs M6.9 assessment-context assertions, so a tutor or visualization tool can revalidate the assessment mode it is operating under at every request. Minting an assertion without it raises; verifying without it DENIES, because an interlock that cannot check its context must not permit the operation it guards. Minimum 32 high-entropy characters.
METIS_ITEM_BANK_CURSOR_HMAC_SECRET= •••secretsupply to activate
OSHUN_LLM_API_BASEendpointsupply to activate
Sophia answer synthesizer (OPTIONAL enhancement over the always-on extractive composer). Any OpenAI-compatible /chat/completions endpoint works (a vendor or a self-hosted gateway). Fail-closed: all THREE must be set or the route serves the real extractive grounded answer. The route also fails SOFT — any synthesizer error/timeout falls back to extractive, never a 500 or un-cited prose.
OSHUN_LLM_API_KEY= •••secretsupply to activate
OSHUN_LLM_MODELmodelsupply to activate

Oshun V1 BFF — core runtime, data, auth & service-trust (72)#

OSHUN_ENVvaluesupply to activate
Runtime posture. The BFF treats the process as PRODUCTION when OSHUN_ENV or RUNTIME_ENV is `production` (independent of NODE_ENV) — this flips signed-token enforcement and the fail-closed governance seams on. OSHUN_RUNTIME_ENV selects which upstream domain-service environment to resolve (domain-service-discovery).
RUNTIME_ENVvaluesupply to activate
OSHUN_RUNTIME_ENVvaluesupply to activate
OSHUN_C2PA_EXPORT_CERT_PEMvaluesupply to activate
C2PA export signing (TODOS §35 / DEPENDENCIES §19) — the X.509 credential that signs standards-compliant Content Credentials embedded into off-platform exports (Living Scene share media). PEM values may be single-line with \n escapes. Unset → production share creation FAILS CLOSED (c2pa_export_signing_not_configured); dev/test proceeds sidecar-only and the share response reports standardC2pa.embedded=false with the reason. The c2pa-node 0.5.x native binding timestamps every signature, so signing needs egress to the TSA URL (defaults to http://timestamp.digicert.com).
OSHUN_C2PA_EXPORT_KEY_PEMvaluesupply to activate
OSHUN_C2PA_EXPORT_ALGORITHM= es256valuehas default
OSHUN_C2PA_EXPORT_TSA_URLendpointsupply to activate
OSHUN_ADMIN_DATABASE_URLendpointsupply to activate
Postgres — durable admin / trust-safety / billing / contract stores (the admin_store_snapshot + admin_audit_event tables, hydrated at boot). Preferred name first; OSHUN_V1_DATABASE_URL is accepted as a single-URL fallback so one env can drive every persistence surface. Unset → in-memory stores (do NOT survive restart). DATABASE_URL is the generic Postgres fallback the persistence layer + domain-stubs use.
OSHUN_ADMIN_AUDIT_INTEGRITY_KEYvaluesupply to activate
Required in production. HMAC key is held outside PostgreSQL; use >=32 random bytes.
OSHUN_ADMIN_AUDIT_INTEGRITY_KEY_ID= primaryvaluehas default
OSHUN_ADMIN_AUDIT_RETENTION_PURGE_INTERVAL_MS= 86400000timinghas default
OSHUN_V1_DATABASE_URLendpointsupply to activate
DATABASE_URLendpointsupply to activate
OSHUN_BFF_IDEMPOTENCY_REDIS_URLendpointsupply to activate
Redis — durable, cross-instance BFF idempotency + auth/abuse rate-limit counters (survive restart, shared across instances). Preferred name first; OSHUN_REDIS_URL is accepted as a shared fallback. Unset → per-process only. OSHUN_BFF_ABUSE_REDIS_KEY_PREFIX optionally namespaces the rate-limit keys. OSHUN_BFF_REMINDER_CYCLE_LEASE_REDIS_KEY does the same for the reminder delivery lease — set it per stack if two ever share one Redis, or each would skip the other's ticks and reminders would arrive late on both.
OSHUN_REDIS_URLendpointsupply to activate
OSHUN_BFF_ABUSE_REDIS_KEY_PREFIXvaluesupply to activate
OSHUN_BFF_REMINDER_CYCLE_LEASE_REDIS_KEYvaluesupply to activate
OSHUN_BFF_JWT_SECRET= •••secretsupply to activate
Session auth. OSHUN_BFF_JWT_SECRET (min 32 chars; JWT_SECRET accepted as a fallback) is the HMAC key the BFF signs + verifies member session tokens with; issuer/audience default to the built-in constants. In production (see above) signed tokens are REQUIRED; OSHUN_BFF_FORCE_SIGNED_TOKENS=true forces the same enforcement in non-prod. Dev tokens are accepted by default in non-prod; set OSHUN_BFF_ALLOW_DEV_TOKENS=false to refuse the unsigned dev-token shortcut.
OSHUN_BFF_JWT_ISSUERvaluesupply to activate
OSHUN_BFF_JWT_AUDIENCEvaluesupply to activate
OSHUN_BFF_FORCE_SIGNED_TOKENSvaluesupply to activate
OSHUN_BFF_ALLOW_DEV_TOKENSvaluesupply to activate
OSHUN_AUTH_ACCESS_TOKEN_TTL_MS= •••secretsupply to activate
Session token lifetimes (all optional ms overrides; sensible defaults apply): access-token TTL, refresh-token TTL, the refresh-rotation reuse grace window, and the account-recovery-code TTL.
OSHUN_AUTH_REFRESH_TOKEN_TTL_MStimingsupply to activate
OSHUN_AUTH_REFRESH_ROTATION_GRACE_MStimingsupply to activate
OSHUN_AUTH_RECOVERY_CODE_TTL_MStimingsupply to activate
OSHUN_DOMAIN_SERVICE_TOKEN= •••secretsupply to activate
Service-to-service trust. OSHUN_DOMAIN_SERVICE_TOKEN is the bearer the BFF presents to the upstream domain APIs (the domain facade fails CLOSED in production without it). TARA_/ARETE_OSHUN_FACADE_TOKEN are per-domain tokens for those services' inbound checks. OSHUN_SCIM_BEARER_TOKEN gates the SCIM 2.0 enterprise provisioning routes (unset → SCIM refuses).
TARA_OSHUN_FACADE_TOKEN= •••secretsupply to activate
ARETE_OSHUN_FACADE_TOKEN= •••secretsupply to activate
OSHUN_SCIM_BEARER_TOKEN= •••secretsupply to activate
OSHUN_PUBLIC_ORIGINvaluesupply to activate
Public origins. OSHUN_PUBLIC_ORIGIN backs absolute links the BFF mints (e.g. the scene-recap postcard route fails closed when unset); OSHUN_PUBLIC_WEB_URL / OSHUN_WEB_ORIGIN are the web-app origin used for share links + the Apple Pay initiative context. OSHUN_PUBLIC_WEB_URL is also where Sophia's citations point when she answers in Telegram — unset, that builder falls back to a literal https://oshun.app, so a staging deployment cites production. OSHUN_DEPLOYMENT_RESIDENCY_ZONE tags the data-residency zone for residency-aware routing.
OSHUN_PUBLIC_WEB_URLendpointsupply to activate
OSHUN_WEB_ORIGINvaluesupply to activate
OSHUN_DEPLOYMENT_RESIDENCY_ZONEvaluesupply to activate
OSHUN_WEB_APP_URLendpointsupply to activate
Where `/upgrade` sends a member. The Telegram bot deliberately does not mint an invoice from a chat message (a chat message carries no session, and a Tier-B rail is gated on a recorded click-through), so it links to the billing surface instead — and with neither of these set it can only answer "unavailable", leaving the crypto rail reachable by nobody. Set the app origin and `/billing/crypto` is appended; set OSHUN_BILLING_URL to override the whole URL. Both were read by the code and declared nowhere until 2026-08-07.
OSHUN_BILLING_URLendpointsupply to activate
OSHUN_BFF_AUTH_RATELIMIT_MAXvaluesupply to activate
Auth rate-limit tuning (all optional; sensible defaults apply). Raise the ceiling for a trusted high-concurrency caller (E2E suite, staging load test) without disabling the limiter. Positive integers only.
OSHUN_BFF_AUTH_RATELIMIT_WINDOW_MStimingsupply to activate
OSHUN_BFF_AUTH_RATELIMIT_BLOCK_MStimingsupply to activate
OSHUN_INTEGRATIONS_WEBHOOK_WORKER_INTERVAL_MS= •••secretsupply to activate
In-process autonomous worker (opt-in; run on ONE instance / behind leader election). Interval in ms (>0) starts the outbound-webhook replay ticker; unset → off (the admin route can still be driven by an external cron). LIMIT caps deliveries per tick. (Reminder delivery = OSHUN_REMINDER_WORKER_INTERVAL_MS in the Messaging block; deletion grace-expiry = OSHUN_DELETION_WORKER_INTERVAL_MS.)
OSHUN_INTEGRATIONS_WEBHOOK_WORKER_LIMIT= •••secretsupply to activate
OSHUN_FFMPEG_PATHvaluesupply to activate
Optional media-tool path overrides (default: resolved from PATH). Set when ffmpeg/ffprobe are not on PATH in the deployment image.
OSHUN_FFPROBE_PATHvaluesupply to activate
OSHUN_AUTONOMY_LLM_MODELmodelsupply to activate
Optional feature config (all have safe defaults). The autonomy + lecture pipelines select their models here (the autonomy plane itself stays fail-closed without OSHUN_LLM_API_KEY below); the tenant flag/experiment overrides + the mobile release gate accept JSON.
OSHUN_AUTONOMY_VISION_MODELmodelsupply to activate
OSHUN_AUTONOMY_CYCLE_BUDGET_UNITSvaluesupply to activate
OSHUN_AUTONOMY_ECONOMICS_MIN_QUALITY_BARvaluesupply to activate
OSHUN_AUTONOMY_PRICE_TABLE_VERSIONvaluesupply to activate
Versioned USD transfer rates + pre-dispatch hard monetary caps. Blank values use the checked-in production defaults. Recovery headroom is unavailable to ordinary work; COST_CAP_ACTION is stop, degrade, or require-approval.
OSHUN_AUTONOMY_COST_POLICY_VERSIONvaluesupply to activate
OSHUN_AUTONOMY_INPUT_USD_PER_MILLIONvaluesupply to activate
OSHUN_AUTONOMY_OUTPUT_USD_PER_MILLIONvaluesupply to activate
OSHUN_AUTONOMY_CACHED_INPUT_USD_PER_MILLIONvaluesupply to activate
OSHUN_AUTONOMY_COST_CAP_CALL_USDvaluesupply to activate
OSHUN_AUTONOMY_COST_CAP_RUN_USDvaluesupply to activate
OSHUN_AUTONOMY_COST_CAP_CYCLE_USDvaluesupply to activate
OSHUN_AUTONOMY_COST_CAP_DAILY_USDvaluesupply to activate
OSHUN_AUTONOMY_COST_CAP_MONTHLY_USDvaluesupply to activate
OSHUN_AUTONOMY_COST_CAP_TENANT_USDvaluesupply to activate
OSHUN_AUTONOMY_COST_CAP_PROVIDER_USDvaluesupply to activate
OSHUN_AUTONOMY_COST_CAP_PORTFOLIO_USDvaluesupply to activate
OSHUN_AUTONOMY_COST_CAP_ACTIONvaluesupply to activate
OSHUN_AUTONOMY_RECOVERY_HEADROOM_PERCENTvaluesupply to activate
OSHUN_AUTONOMY_RECONCILIATION_DRIFT_BPSvaluesupply to activate
OSHUN_AUTONOMY_SNAPSHOT_KEY_BASE64valuesupply to activate
Required whenever durable BFF storage is configured: 32 random bytes encoded as base64, plus the KMS/secret-manager version reference used to rotate it. V1 review artifacts, human feedback, learner state, and standing direction are persisted only in a tenant-bound AES-256-GCM envelope.
OSHUN_AUTONOMY_SNAPSHOT_KEY_REFvaluesupply to activate
OSHUN_AUTONOMY_TENANT_IDvaluesupply to activate
Keep the default oshun-system scope for the one-time legacy singleton migration.
OSHUN_AUTONOMY_REGIONvaluesupply to activate
OSHUN_AUTONOMY_QUALITY_TIERvaluesupply to activate
OSHUN_LECTURE_LLM_MODELmodelsupply to activate
OSHUN_TENANT_FEATURE_FLAG_OVERRIDESvaluesupply to activate
OSHUN_TENANT_EXPERIMENT_SCOPESvaluesupply to activate
OSHUN_MOBILE_RELEASE_GATE_CONFIGvaluesupply to activate

V10 Rail mobile read model — production channel-runtime authorities (RB.5) (10)#

OSHUN_V10_RAIL_MOBILE_DRIPS_URLendpointsupply to activate
Configure all three together. The BFF POSTs the authenticated user's exact timeline window to the drips authority and the observation instant to the Veritas ticker authority. Responses must use the versioned envelopes enforced by apps/oshun/bff/src/v10/rail-mobile-source.ts; partial or mismatched configuration fails at boot instead of serving a half-connected mobile Rail.
OSHUN_V10_RAIL_MOBILE_TICKER_URLendpointsupply to activate
OSHUN_V10_RAIL_MOBILE_SOURCE_TOKEN= •••secretsupply to activate
OSHUN_V10_RAIL_THREAD_URLendpointsupply to activate
Configure both together. The authority composes only references to canonical Tara, Veritas, Case Files, Wonder, and Nyx editions for the authenticated user's exact morning date/window; the BFF rejects mismatched or future output.
OSHUN_V10_RAIL_THREAD_SOURCE_TOKEN= •••secretsupply to activate
OSHUN_V10_RAIL_TV_PROGRAM_URLendpointsupply to activate
OSHUN_V10_RAIL_TV_PROGRAM_TOKEN= •••secretsupply to activate
OSHUN_APHRODITE_AGE_ASSERTION_URLendpointsupply to activate
OSHUN_APHRODITE_AGE_ASSERTION_TOKEN= •••secretsupply to activate
APHRODITE_RAIL_AGE_ASSERTION_TOKEN= •••secretsupply to activate
OSHUN_V10_ORI_PRESENCE_ENABLED= falsetogglehas default
The feature is inert unless BOTH the strict boolean flag is true and the V1 user id is in the comma-separated cohort. A durable V1 Postgres connection and a 32+ character HMAC secret are required for usable consent; the model and both per-million-token prices are required for generation. See V10/RB2_ORI_PRESENCE_BETA_RUNBOOK.md for staged rollout and incident rollback.
OSHUN_V10_ORI_PRESENCE_COHORT_USER_IDSvaluesupply to activate
OSHUN_V10_ORI_MODELmodelsupply to activate
OSHUN_V10_ORI_PROVIDERvaluesupply to activate
OSHUN_V10_ORI_PROVIDER_BASE_URLendpointsupply to activate
OSHUN_V10_ORI_MODEL_INPUT_PER_MTOK_USDmodelsupply to activate
OSHUN_V10_ORI_MODEL_OUTPUT_PER_MTOK_USDmodelsupply to activate
OSHUN_V10_ORI_RUN_STORE_PATH= /var/lib/oshun/run-state/v10-ori.jsonvaluehas default
Required for generation. RUN-001/RUN-002 cognition checkpoints, child reservations, kill scopes, and quarantines share this durable store.
OSHUN_V10_ORI_DAILY_CALL_LIMIT= 12valuehas default
Hard per-user UTC-day ceilings and stricter per-request reservations. Failed dispatches and crash-uncertain reservations are charged at their reserved maximum so provider spend can never be retried outside the ceiling.
OSHUN_V10_ORI_DAILY_TOKEN_LIMIT= 60000valuehas default
OSHUN_V10_ORI_DAILY_COST_USD= 0.5valuehas default
OSHUN_V10_ORI_REQUEST_TOKEN_LIMIT= 20000valuehas default
OSHUN_V10_ORI_OUTPUT_TOKEN_LIMIT_PER_CALL= 600valuehas default
OSHUN_V10_ORI_REQUEST_COST_USD= 0.2valuehas default
OSHUN_V10_ORI_NARRATION_TTL_SECONDS= 3600timinghas default
OSHUN_V10_ORI_COARSE_PRESENCE_URLendpointsupply to activate
Optional separately consented awareness authorities. Every configured URL requires its matching service bearer. Unset authorities simply omit that context; remembrance date creation fails loud without memorial eligibility.
OSHUN_V10_ORI_COARSE_PRESENCE_TOKEN= •••secretsupply to activate
OSHUN_V10_ORI_CONTINUITY_URLendpointsupply to activate
OSHUN_V10_ORI_CONTINUITY_TOKEN= •••secretsupply to activate
OSHUN_V10_ORI_MEMORIAL_ELIGIBILITY_URLendpointsupply to activate
OSHUN_V10_ORI_MEMORIAL_ELIGIBILITY_TOKEN= •••secretsupply to activate

Generation providers (AI media — Isis) (64)#

OSHUN_STABILITY_API_KEY= •••secretsupply to activate
Image (illustration / explainer) — Stability SD3.5. Key required; model optional.
OSHUN_STABILITY_MODELmodelsupply to activate
OSHUN_IMAGE_MODERATION_API_BASEendpointsupply to activate
Image output safety scan (the release gate's safetyScanScore source) — an OpenAI-moderations-compatible vision endpoint that accepts an image input. Base + key required to activate; model optional (default omni-moderation-latest). WITHOUT these the image release measurement has no safety score and the gate BLOCKS every image (fail-closed) — a generated image releases only once this moderation scan + a watermark step + C2PA provenance are all deployed.
OSHUN_IMAGE_MODERATION_API_KEY= •••secretsupply to activate
OSHUN_IMAGE_MODERATION_MODELmodelsupply to activate
MESHY_API_KEY= •••secretsupply to activate
Meshy hosted 3D lane (Isis generation API, operator/internal only; tracker T.22). Read through @oshun/config getMeshyConfig(). The Oshun sky briefing no longer falls back to Meshy (T.22.05), and OSHUN_MESHY_API_KEY is read by nothing.
OSHUN_VIDEO_FAL_KEYvaluesupply to activate
Video (text-to-video + image-to-video) — fal.ai-hosted LTX-Video. Key required (OSHUN_VIDEO_FAL_KEY, or the bare FAL_KEY); model optional (default ltx-video-2.0). WITHOUT a key both video executors fail closed (provider_not_configured). NOTE: there is NO in-repo video safety scanner, watermarker, or C2PA video signer, so even WITH a valid key the video release measurement has no safety/watermark/provenance signals and the gate BLOCKS every clip (fail-closed) — a generated video releases only once a deploy-bound video safety scan + watermark + provenance step are all present.
OSHUN_VIDEO_MODELmodelsupply to activate
OSHUN_ELEVENLABS_API_KEY= •••secretsupply to activate
Narration (TTS) — ElevenLabs. BOTH required (an API key AND a voice id).
OSHUN_ELEVENLABS_VOICE_IDvaluesupply to activate
OSHUN_TEXT_MODERATION_API_BASEendpointsupply to activate
Text output safety scan (the release gate's safetyScanScore source for NARRATION) — an OpenAI-moderations-compatible endpoint that accepts a text input. For TTS the output content IS the spoken text, so moderating that text is a faithful output-content safety scan. Base + key required to activate; model optional (default omni-moderation-latest). If unset, these FALL BACK to the OSHUN_IMAGE_MODERATION_* vars above so one moderation endpoint can serve both. WITHOUT either pair the narration release measurement has no safety score and the gate BLOCKS every narration (fail-closed) — narration releases only once this scan + an audio watermark + C2PA provenance are all deployed. (Music is instrumental and sky-briefing is 3D geometry, so neither has an in-repo output-content scanner; both honestly block at the gate until a deploy-bound audio/3D safety scanner + watermark/provenance land.)
OSHUN_TEXT_MODERATION_API_KEY= •••secretsupply to activate
OSHUN_TEXT_MODERATION_MODELmodelsupply to activate
OSHUN_ASSET_STORE_BUCKETvaluesupply to activate
Asset object store (S3-compatible) — backs caption-dub / accessibility-pass (e.g. the WCAG contrast pass decodes stored asset bytes; caption-dub also persists each dubbed output here and returns a signed download URL). BUCKET + ACCESS_KEY_ID + SECRET_ACCESS_KEY are all required to activate; REGION (default us-east-1) and ENDPOINT (set → MinIO/path-style) are optional. Unset → the dub/a11y asset path is honestly unavailable, never fabricated.
OSHUN_ASSET_STORE_ACCESS_KEY_IDvaluesupply to activate
OSHUN_ASSET_STORE_SECRET_ACCESS_KEY= •••secretsupply to activate
OSHUN_ASSET_STORE_REGIONvaluesupply to activate
OSHUN_ASSET_STORE_ENDPOINTendpointsupply to activate
OSHUN_GENERATED_ARTIFACT_OBJECT_STORES_JSONvaluesupply to activate
Generated-artifact account erasure purges every stored S3/MinIO object version before deleting its GeneratedOutput metadata. Unset → the single asset store above is the only allowed bucket. Multi-bucket/provider deployments set a JSON array whose entries name bucket/provider/region/optional endpoint and refer to credentials by environment-variable name (never embed secrets in the JSON), e.g. [{"bucket":"oshun-assets","provider":"minio","region":"us-east-1", "endpoint":"https://s3.example.com","accessKeyIdEnv":"MINIO_ROOT_USER", "secretAccessKeyEnv":"MINIO_ROOT_PASSWORD"}]. An unknown bucket fails closed.
OSHUN_DUBBING_ELEVENLABS_API_KEY= •••secretsupply to activate
Caption-dub — ElevenLabs Dubbing API (submit → poll → download per target language; the source speakers' voices are CLONED into the target language). Activates with the asset store above PLUS an ElevenLabs key: the dedicated OSHUN_DUBBING_ELEVENLABS_API_KEY if set, else the narration OSHUN_ELEVENLABS_API_KEY (same account). API_BASE is an optional gateway override (default https://api.elevenlabs.io). WITHOUT key+store the caption-dub executor fails closed (provider_not_configured). Even WITH them, every dub's release measurement carries the canonical `cloned-voice-used` human-review trigger (released only with an assigned reviewer), its safetyScanScore comes from a REAL text-moderation scan of the dubbed transcript (OSHUN_TEXT_MODERATION_* / OSHUN_IMAGE_MODERATION_* above — absent ⇒ the gate BLOCKS), and provenance/watermark are honestly absent (deploy-bound) so the gate blocks release until those steps land. Never a fabricated dub.
OSHUN_DUBBING_API_BASEendpointsupply to activate
OSHUN_A11Y_ML_API_BASEendpointsupply to activate
Accessibility-pass ML half — an OpenAI-compatible endpoint serving BOTH vision /chat/completions (alt-text-generation describes the image for a screen-reader user) and Whisper /audio/transcriptions (transcript-generation). BASE + KEY required to activate; model overrides optional (defaults gpt-4o-mini / whisper-1). Unset → alt-text/transcript passes honestly report requires-external-provider (the in-repo WCAG contrast pass still runs off the asset store alone); caption-verification stays external (needs the caption track). ML failures are reported with their error detail, never fabricated.
OSHUN_A11Y_ML_API_KEY= •••secretsupply to activate
OSHUN_A11Y_ML_VISION_MODELmodelsupply to activate
OSHUN_A11Y_ML_TRANSCRIPTION_MODELmodelsupply to activate
OSHUN_WATERMARK_IMAGE_CONFIGUREDvaluesupply to activate
------------------------------------------------------------------------------ Media release gate — deploy-bound governance attestations (Isis) ------------------------------------------------------------------------------ A credentialed provider (above) GENERATES the media, but the Isis release gate only lets an output reach the customer once the deploy-bound governance steps for that KIND are present. No in-repo adapter runs a watermark, C2PA signer, or synthetic-voice disclosure — so these are OPERATOR ATTESTATION flags: set one to `1`/`true` ONLY once you have really deployed that step. Each unset flag keeps every output of that kind BLOCKED (fail-closed). Setting a flag without the real step defeats the gate — it is a deploy promise, not a shortcut. image: OSHUN_WATERMARK_IMAGE_CONFIGURED + OSHUN_PROVENANCE_IMAGE_CONFIGURED audio: OSHUN_WATERMARK_AUDIO_CONFIGURED + OSHUN_PROVENANCE_AUDIO_CONFIGURED + OSHUN_SYNTHESIS_DISCLOSURE_AUDIO_CONFIGURED (narration synthetic voice) video: OSHUN_WATERMARK_VIDEO_CONFIGURED + OSHUN_PROVENANCE_VIDEO_CONFIGURED (Safety-scan, the third floor, is the OSHUN_*_MODERATION_* endpoints above.)
OSHUN_PROVENANCE_IMAGE_CONFIGUREDvaluesupply to activate
OSHUN_WATERMARK_AUDIO_CONFIGUREDvaluesupply to activate
OSHUN_PROVENANCE_AUDIO_CONFIGUREDvaluesupply to activate
OSHUN_SYNTHESIS_DISCLOSURE_AUDIO_CONFIGUREDvaluesupply to activate
OSHUN_WATERMARK_VIDEO_CONFIGUREDvaluesupply to activate
OSHUN_PROVENANCE_VIDEO_CONFIGUREDvaluesupply to activate
OSHUN_DISABLE_MEDIA_QUALITY_PROBEtogglesupply to activate
Opt OUT of the image media-quality probe floor (default: on). Set to disable it.
OSHUN_LIVING_SCENES_C2PA_SIGNING_KEY= •••secretsupply to activate
C2PA provenance signer (Living Scenes shares). SIGNING_KEY is a 64-hex Ed25519 private scalar; KEY_ID is a stable public identifier published to verifiers. In non-prod an unset key falls back to a dev signer; in production an unset/invalid key makes the share route fail closed (503 c2pa_signing_not_configured) rather than emit an unsigned manifest. Ensure NODE_ENV=production so fail-closed is active.
OSHUN_LIVING_SCENES_C2PA_KEY_IDvaluesupply to activate
OSHUN_SCENE_UNLOCK_TOKEN_SECRET= •••secretsupply to activate
Living Scenes scene-unlock token signer. HMAC secret that signs the short-lived unlock tokens for shared scenes. In production the BFF REFUSES to sign with the dev fallback (unset → it throws at first use); set a strong random secret.
OSHUN_DELETION_ATTESTATION_ED25519_PRIVATE_KEY= •••secretsupply to activate
Account-deletion attestation signer (4.1). The audit Ed25519 key every domain deletion consumer signs its erase receipt with + the orchestrator verifies against. SIGNING_KEY is a 32-byte hex private scalar; KEY_ID is the stable public id published to verifiers — OPTIONAL, but it defaults to a dev id (`oshun-deletion-attestation-dev`): SET IT IN PRODUCTION, or real erase receipts are published under a dev-looking key id. In non-prod an unset SIGNING_KEY uses a deterministic dev signer so the fan-out is exercisable; in production an unset SIGNING_KEY FAILS CLOSED (no signer → no fan-out runner → deletions stay 'scheduled', never a fabricated 'completed'). A configured-but-malformed key throws at boot (fail loud). The grace-expiry worker runs on OSHUN_DELETION_WORKER_INTERVAL_MS (unset → off).
OSHUN_DELETION_ATTESTATION_KEY_IDvaluesupply to activate
OSHUN_DELETION_WORKER_INTERVAL_MStimingsupply to activate
OSHUN_RECOVERY_DELETION_LEDGER_PATHvaluesupply to activate
32 random bytes encoded as base64. Keep it in the secret manager and escrow it with clean-host recovery credentials; it never belongs in a backup receipt.
OSHUN_RECOVERY_DELETION_KEY_B64valuesupply to activate
OSHUN_RECOVERY_DELETION_KEY_ID= recovery-deletion-v1valuehas default
OSHUN_RECOVERY_DELETION_REMOTE_ENDPOINTendpointsupply to activate
Independent, Object-Lock-enabled S3-compatible receipt replica. These credentials need ListBucket/GetObject/PutObject but MUST be denied deletion, retention shortening, and bucket administration. The endpoint cannot be this stack's MinIO. Retention must cover the longest restorable backup plus its maximum capture age (minimum accepted by the BFF: 32 days).
OSHUN_RECOVERY_DELETION_REMOTE_REGIONvaluesupply to activate
OSHUN_RECOVERY_DELETION_REMOTE_BUCKETvaluesupply to activate
OSHUN_RECOVERY_DELETION_REMOTE_PREFIXvaluesupply to activate
OSHUN_RECOVERY_DELETION_REMOTE_FAILURE_DOMAINvaluesupply to activate
OSHUN_RECOVERY_DELETION_REMOTE_ACCESS_KEY_IDvaluesupply to activate
OSHUN_RECOVERY_DELETION_REMOTE_SECRET_ACCESS_KEY= •••secretsupply to activate
OSHUN_RECOVERY_DELETION_REMOTE_RETENTION_DAYSvaluesupply to activate
OSHUN_PAYMENTS_RECEIPT_ED25519_PRIVATE_KEY= •••secretsupply to activate
Crypto payments (4.3) — the settlement RECEIPT signer (32-byte hex Ed25519 + its published audit key id). Resolved by payments-composition.ts: unset → no signer → the crypto quote route FAILS CLOSED (503, no address issued); a configured-but-malformed key throws at boot (fail loud). NOTE: the receipt key alone is NOT enough — a deploy must also construct + bind the InvoiceTargetProvisioner (BTCPay/OpenNode/@aje wallets: live rate + asset-precise amount + per-charge address). Until a provisioner is bound, quoting stays 503 (never a fabricated rate/amount/address).
OSHUN_PAYMENTS_RECEIPT_AUDIT_KEY_IDvaluesupply to activate
OSHUN_PLAN_PRICE_BOOK_JSONvaluesupply to activate
Canonical plan price book (server-side pricing authority; audit HIGH-1). The crypto quote + fiat rails derive the charge amount FROM this book and refuse a client amount that disagrees; settlement re-verifies against it before granting entitlements. JSON override; a MALFORMED value THROWS at boot (fail loud — never silently sells at defaults). Defaults: pro $9.99/mo, $99.90/yr; premium $19.99/mo, $199.90/yr. Shape: {"pro":{"month":{"amountMinor":999,"currency":"USD"},"year":{...}}, "premium":{"month":{...},"year":{...}}}
OSHUN_CRYPTO_SETTLEMENT_WEBHOOK_SECRET= •••secretsupply to activate
Crypto settlement receiver webhook (the deploy-bound chain watcher → entitlement grant). HMAC-SHA256 shared secret verified over `${timestamp}.${rawBody}` (±300s replay window); unset → POST /v1/payments/crypto/settlements 503s (no fabricated confirmation). Pairs with the OSHUN_PAYMENTS_RECEIPT_* signer above.
STRIPE_SECRET_KEY= •••secretsupply to activate
------------------------------------------------------------------------------ Fiat rail — Stripe Billing + Apple Pay / Google Pay (@oshun/fiat-payments) ------------------------------------------------------------------------------ The BFF /v1/payments/fiat/* routes fail CLOSED like the crypto rail: no STRIPE_SECRET_KEY → 503 stripe_not_configured; no STRIPE_WEBHOOK_SECRET → the webhook 503s (Stripe events refused, never a fabricated settlement). The Stripe API version + base URL are pinned in-code (not env). STRIPE_SECRET_KEY is the only required secret; STRIPE_PUBLISHABLE_KEY is additionally required for the Google Pay tokenization config. STRIPE_WEBHOOK_SECRET_PREVIOUS is an OPTIONAL second active secret for zero-downtime webhook-secret rotation.
STRIPE_PUBLISHABLE_KEYvaluesupply to activate
STRIPE_WEBHOOK_SECRET= •••secretsupply to activate
STRIPE_WEBHOOK_SECRET_PREVIOUS= •••secretsupply to activate
APPLE_PAY_MERCHANT_IDvaluesupply to activate
Wallets (server leg tokenized through Stripe). APPLE_PAY_MERCHANT_ID activates the Apple Pay config + merchant-validation routes (unset → 503 apple_pay_not_configured); the live Apple merchant-identity session transport is a separate deploy-bound seam (503 apple_merchant_identity_not_configured until injected). GOOGLE_PAY_MERCHANT_ID + STRIPE_PUBLISHABLE_KEY together activate the Google Pay config route.
GOOGLE_PAY_MERCHANT_IDvaluesupply to activate
OSHUN_APPLE_BUNDLE_IDvaluesupply to activate
------------------------------------------------------------------------------ App-store IAP — Apple StoreKit 2 + Google Play billing (@oshun/billing-support) ------------------------------------------------------------------------------ The BFF /v1/billing/app-store/* routes verify signed transactions/notifications through injectable verifier seams that fail LOUD (503 apple_verifier_not_ configured / play_verifier_not_configured) until a deploy injects the Apple root-CA chain + the Play Developer API service account — those trust roots are deploy-bound, NOT env vars. The env below only sets the expected app identity and the Play RTDN push gate: OSHUN_APPLE_BUNDLE_ID expected StoreKit bundle id (default com.oshun.app) OSHUN_PLAY_PACKAGE_NAME expected Play package name (default com.oshun.app) OSHUN_PLAY_RTDN_PUSH_TOKEN shared secret the Pub/Sub RTDN push must present (unset → /play/rtdn 503s, like the telegram webhook)
OSHUN_PLAY_PACKAGE_NAMEvaluesupply to activate
OSHUN_PLAY_RTDN_PUSH_TOKEN= •••secretsupply to activate
OSHUN_TELEGRAM_PAYMENTS_ENABLEDtogglesupply to activate
Telegram in-bot payments provider toggle. `true` advertises the payments provider as configured on the telegram surface (pairs with the bot token + webhook secret in the Messaging block below); anything else keeps it off.

Messaging / Notifications (multi-channel delivery) (59)#

OSHUN_SENDGRID_API_KEY= •••secretsupply to activate
Email — needs OSHUN_MESSAGING_EMAIL_FROM + one transport (subject optional): SendGrid (HTTPS): set OSHUN_SENDGRID_API_KEY. SMTP relay / Mailpit (below): set OSHUN_SMTP_HOST — takes PRECEDENCE over SendGrid when set. Mailpit dev sink = host 127.0.0.1 port 1025 (plain).
OSHUN_MESSAGING_EMAIL_FROMvaluesupply to activate
OSHUN_MESSAGING_EMAIL_SUBJECTvaluesupply to activate
OSHUN_SMTP_HOSTendpointsupply to activate
Email (SMTP relay / Mailpit) — OSHUN_SMTP_HOST activates the SMTP transport (preferred over SendGrid). Port defaults to 587 (or 465 when _SECURE=true); the dev Mailpit sink is 127.0.0.1:1025 (plain). _SECURE=true → implicit TLS; _STARTTLS=true → STARTTLS upgrade on a plain connection. _USERNAME + _PASSWORD (both, for AUTH PLAIN/LOGIN) are optional — Mailpit needs neither.
OSHUN_SMTP_PORTportsupply to activate
OSHUN_SMTP_SECUREtogglesupply to activate
OSHUN_SMTP_STARTTLStimingsupply to activate
OSHUN_SMTP_USERNAMEvaluesupply to activate
OSHUN_SMTP_PASSWORD= •••secretsupply to activate
OSHUN_TWILIO_ACCOUNT_SIDvaluesupply to activate
SMS (Twilio) — all three required
OSHUN_TWILIO_AUTH_TOKEN= •••secretsupply to activate
OSHUN_TWILIO_FROMvaluesupply to activate
OSHUN_FCM_ACCESS_TOKEN= •••secretsupply to activate
Push — Android (FCM) — both required
OSHUN_FCM_PROJECT_IDvaluesupply to activate
OSHUN_APNS_TEAM_IDvaluesupply to activate
Push — iOS (APNs) — all four required. OSHUN_APNS_PRIVATE_KEY is the multi-line .p8 PEM (keep its internal newlines, e.g. quote the value or use \n). APNs requires HTTP/2 (Node's global fetch is HTTP/1.1); the BFF reminder delivery path wires a dedicated HTTP/2 transport for the push-apns channel automatically (no env needed) — set the four creds below to activate APNs delivery.
OSHUN_APNS_KEY_IDvaluesupply to activate
OSHUN_APNS_PRIVATE_KEY= •••secretsupply to activate
OSHUN_APNS_BUNDLE_IDvaluesupply to activate
OSHUN_APNS_SANDBOXtogglesupply to activate
OSHUN_EXPO_ACCESS_TOKEN= •••secretsupply to activate
Push — Expo (Exponent push service). The access token is OPTIONAL: Expo delivers to an ExponentPushToken[...] in basic mode without it; set it only when the project enables push security (then it authenticates the send). The push-expo channel is gated on the recipient's Expo token, not on this var.
OSHUN_VAPID_PUBLIC_KEYvaluesupply to activate
Push — Web Push (browser). VAPID application-server identity for RFC 8291/8292 encrypted web-push. ALL THREE are required together to activate the push-webpush channel (delivery also needs the recipient's PushSubscription). Public/private are the P-256 VAPID keypair; subject is a mailto: or https: contact URL. The WEB app gets the public key via NEXT_PUBLIC_VAPID_PUBLIC_KEY (set it to the same value as OSHUN_VAPID_PUBLIC_KEY at web build time — the /profile "This device" push registration row honestly reports "not configured" without it); the mobile app uses EXPO_PUBLIC_VAPID_PUBLIC_KEY.
OSHUN_VAPID_PRIVATE_KEY= •••secretsupply to activate
OSHUN_VAPID_SUBJECTvaluesupply to activate
NEXT_PUBLIC_VAPID_PUBLIC_KEYvaluesupply to activate
OSHUN_MESSAGING_PUSH_TITLEvaluesupply to activate
Optional push notification title (FCM + APNs + Expo + Web Push)
OSHUN_WHATSAPP_ACCESS_TOKEN= •••secretsupply to activate
WhatsApp (Meta) — all four required
OSHUN_WHATSAPP_PHONE_NUMBER_IDvaluesupply to activate
OSHUN_WHATSAPP_TEMPLATEvaluesupply to activate
OSHUN_WHATSAPP_LANGUAGEvaluesupply to activate

Slack / Discord (ops-only bot tokens)#

OSHUN_SLACK_BOT_TOKEN= •••secretsupply to activate
OSHUN_DISCORD_BOT_TOKEN= •••secretsupply to activate
OSHUN_REMINDER_WORKER_INTERVAL_MStimingsupply to activate
Reminder DELIVERY worker — interval in ms (>0) starts the in-process worker. Disabled when unset, and that is NOT a neutral default: every scheduled reminder then sits on the schedule and is never sent, including every one a member sets with `/remind` in Telegram AFTER the bot has replied naming a time. Safe on more than one instance when OSHUN_BFF_IDEMPOTENCY_REDIS_URL is set — the worker takes a Redis lease per tick so exactly one runs the cycle; without that Redis it falls back to a single-process lease, and running that on several instances sends every reminder once per instance. The interval is how late a reminder may be, not a load knob.
OSHUN_ASSISTANT_STT_PROVIDERvaluesupply to activate
Eve assistant microphone transcription. With OPENROUTER_API_KEY (above), the default is microsoft/mai-transcribe-2. Otherwise auto-detect Deepgram, then Whisper. Explicit choices with missing credentials fail closed to browser STT. Set provider to openrouter, deepgram, or whisper to override auto-detection.
OSHUN_ASSISTANT_STT_MODELmodelsupply to activate
Overrides OpenRouter/Deepgram only; Whisper remains whisper-1.
OSHUN_ASSISTANT_STT_ENDPOINTendpointsupply to activate
OpenRouter/Whisper API root; Deepgram full /v1/listen URL. Empty uses vendor.
OSHUN_ASSISTANT_TTS_PROVIDERvaluesupply to activate
Eve reply speech. With OPENROUTER_API_KEY, default to Qwen Plus and the longanlingxin catalog voice. Voice output remains opt-in in the chat UI. Without that key, auto-detect ElevenLabs, then Cartesia (requires a voice id).
OSHUN_ASSISTANT_TTS_MODELmodelsupply to activate
OpenRouter only. When changing model, also select a voice it supports.
OSHUN_ASSISTANT_TTS_ENDPOINTendpointsupply to activate
OSHUN_ASSISTANT_TTS_VOICE_IDvaluesupply to activate
Provider-specific voice id; defaults to longanlingxin (OpenRouter) or Rachel (ElevenLabs). Set this together with PROVIDER for legacy/custom voices.
OSHUN_TELEGRAM_BOT_TOKEN= •••secretsupply to activate
Telegram voice-note transcription (STT). Both the bot token AND the STT key are required to transcribe; without them the bot replies honestly ("could not transcribe") — it NEVER fabricates a transcript (resolveSttVoiceProvider is fail-closed). OSHUN_STT_API_KEY targets any OpenAI-compatible /audio/transcriptions endpoint (Whisper-class). OSHUN_TELEGRAM_BOT_TOKEN is read by the BFF webhook; the standalone bot uses OSHUN_TELEGRAM_BOT_TOKEN_{DEV,STAGING,PROD}.
OSHUN_STT_API_KEY= •••secretsupply to activate
OSHUN_STT_API_BASEendpointsupply to activate
OSHUN_STT_MODELmodelsupply to activate
OSHUN_TELEGRAM_WEBHOOK_SECRET= •••secretsupply to activate
Telegram webhook hardening + identity. OSHUN_TELEGRAM_WEBHOOK_SECRET is the secret the BFF requires on inbound webhook calls (unset in production → the webhook fails closed); OSHUN_TELEGRAM_BOT_USERNAME is the bot's @username used to build deep links + resolve mentions. (In-bot payments toggle: OSHUN_TELEGRAM_PAYMENTS_ENABLED in the Payments block above.)
OSHUN_TELEGRAM_BOT_USERNAMEvaluesupply to activate
OSHUN_TELEGRAM_WEBHOOK_URL= •••secretsupply to activate
This deployment's own webhook URL (https://api.<domain>/telegram/webhook). The BFF does NOT register it — a bot token carries exactly one webhook, so a service that claimed it at boot would let two stacks sharing a token take it from each other silently. Registration is deliberate and per-stack (infra/hetzner/scripts/telegram-webhook.sh). What this variable buys is the boot check: with it the BFF can say "the webhook points somewhere else" instead of only "a webhook exists". Unset, it still reports registered vs not.
OSHUN_TELEGRAM_MINIAPP_URLendpointsupply to activate
Origin of the deployed Telegram Mini App (@oshun/telegram-miniapp, served on tg.<domain>). Read by the BFF for two things: the chat MENU BUTTON published at boot, and every "Open in <room>" Web App button the bot attaches to a reply. Unset, the bot degrades honestly — no Web App buttons at all, and the menu button opens the command list — so the Mini App ships and no member can reach it. Must be HTTPS (Telegram refuses to open anything else).
OSHUN_WEB_BASE_URLendpointsupply to activate
Email verification round-trip. A fresh signup is emailVerified:false; the user requests a token (POST /v1/auth/verify-email/request, auth-gated) and confirms it (POST /v1/auth/verify-email/confirm). TTL defaults to 24h. The verification email is SENT (fail-soft) on signup AND on each request when a transport is wired: set OSHUN_MESSAGING_EMAIL_FROM (§Messaging) + OSHUN_WEB_BASE_URL below (the link origin, e.g. https://app.oshun.app — the link is {base}/auth/verify-email?token=...) + a transport — either OSHUN_SENDGRID_API_KEY or OSHUN_SMTP_HOST (§Messaging; e.g. Mailpit 127.0.0.1:1025 for a dev round-trip verified via http://localhost:8025/api/v1/messages). With from+base+transport set, delivery is 'email'; otherwise it stays honest: 'missing-config' (prod) / 'preview' (non-prod, token returned). A send failure never fails the signup. Set OSHUN_DEV_AUTO_VERIFY_EMAIL=true ONLY for headless tests that need signup→signed-in without the round-trip (never in committed/prod config).
OSHUN_AUTH_EMAIL_VERIFICATION_TTL_MStimingsupply to activate
OSHUN_DEV_AUTO_VERIFY_EMAILtogglesupply to activate
OSHUN_LMS_CONNECTORSvaluesupply to activate
LMS connectors (per-tenant LTI 1.3 / SCORM). OSHUN_LMS_CONNECTORS is a JSON array of connector descriptors, each validated at boot — an invalid one is surfaced via GET /v1/admin/lms/connectors with its issues (never silently skipped), and POST /v1/admin/lms/connectors/validate dry-runs a descriptor. Unset → no connectors registered (the routes 404 / return empty). Each connector's live JWKS is fetched at runtime; nothing is fabricated.
OSHUN_CALENDAR_CONNECTORSvaluesupply to activate
Two-way calendar sync (Google). OSHUN_CALENDAR_CONNECTORS is a JSON array of CalendarConnectorDescriptor (per-tenant; mirrors OSHUN_LMS_CONNECTORS). Only `google` connectors are registered (the only transport implemented); others are surfaced as `unsupported_provider`. The Google transport exchanges each connector's refresh token (stored under the env var NAMED by the descriptor's `auth.refreshTokenRef`) for an access token using the client id/secret below. Without these the admin routes 404/return-empty and import/export fail loud (no fabricated events). The interactive OAuth consent flow that mints the refresh token + a durable (non-Memory) sync store are not yet wired. For the per-user interactive connect flow (POST /v1/calendar/connect → Google consent → GET /v1/calendar/callback), also set OSHUN_GOOGLE_CALENDAR_REDIRECT_URI (the registered callback URL) + OSHUN_WEB_BASE_URL (where the callback redirects on success).
OSHUN_GOOGLE_CALENDAR_CLIENT_IDvaluesupply to activate
OSHUN_GOOGLE_CALENDAR_CLIENT_SECRET= •••secretsupply to activate
OSHUN_GOOGLE_CALENDAR_REDIRECT_URIvaluesupply to activate
OSHUN_OUTLOOK_CALENDAR_CLIENT_IDvaluesupply to activate
Outlook / Microsoft 365 calendar connect (same interactive flow as Google, provider `outlook`). OSHUN_CALENDAR_REDIRECT_URI is a generic fallback used for the Outlook redirect when OSHUN_OUTLOOK_CALENDAR_REDIRECT_URI is unset.
OSHUN_OUTLOOK_CALENDAR_CLIENT_SECRET= •••secretsupply to activate
OSHUN_OUTLOOK_CALENDAR_REDIRECT_URIvaluesupply to activate
OSHUN_CALENDAR_REDIRECT_URIvaluesupply to activate

Shakti Infrastructure (5)#

SHAKTI_DATABASE_URL= postgresql://oshun:oshun_dev@localhost:5432/shaktiendpointhas default
SHAKTI_REDIS_PREFIX= shakti:valuehas default
SHAKTI_API_PORT= 4007porthas default
SHAKTI_API_HOST= 0.0.0.0endpointhas default
SHAKTI_S3_BUCKET= shakti-mediavaluehas default

Saraswati Infrastructure (Advanced Technology Intelligence) (56)#

SARASWATI_DATABASE_URL= postgresql://oshun:oshun_dev@localhost:6437/saraswatiendpointhas default
SARASWATI_DIRECT_DATABASE_URL= postgresql://oshun:oshun_dev@localhost:5437/saraswatiendpointhas default
SARASWATI_REDIS_URL= redis://localhost:6387endpointhas default
SARASWATI_MQTT_BROKER_URL= mqtt://localhost:1885endpointhas default
SARASWATI_MQTT_TLS_URL= mqtts://localhost:8887endpointhas default
SARASWATI_MQTT_CLIENT_ID= saraswati-gateway-localvaluehas default
SARASWATI_INFLUXDB_URL= http://localhost:8089endpointhas default
SARASWATI_INFLUXDB_TOKEN= •••secrethas default
SARASWATI_INFLUXDB_ORG= oshunvaluehas default
SARASWATI_INFLUXDB_BUCKET= saraswati_telemetryvaluehas default
SARASWATI_JWT_SECRET= •••secrethas default
SARASWATI_API_PORT= 3900porthas default

Port overrides (Docker Compose)#

SARASWATI_POSTGRES_PORT= 5437porthas default
SARASWATI_PGBOUNCER_PORT= 6437porthas default
SARASWATI_REDIS_PORT= 6387porthas default
SARASWATI_MQTT_PORT= 1885porthas default
SARASWATI_MQTT_TLS_PORT= 8887porthas default
SARASWATI_MQTT_DASHBOARD_PORT= 18085porthas default
SARASWATI_INFLUXDB_PORT= 8089porthas default
SARASWATI_INFLUXDB_ADMIN_PORT= 8082porthas default
SARASWATI_PROMETHEUS_PORT= 9093porthas default
SARASWATI_GRAFANA_PORT= 3003porthas default
SARASWATI_GATEWAY_PORT= 3900porthas default
SARASWATI_IOT_PORT= 3901porthas default
SARASWATI_MFG_PORT= 3902porthas default
SARASWATI_FLEET_PORT= 3903porthas default
SARASWATI_MARKET_PORT= 3904porthas default

Regulatory APIs (Ghana)#

GHANA_GCAA_URLendpointsupply to activate
GHANA_GCAA_API_KEY= •••secretsupply to activate
GHANA_DVLA_URLendpointsupply to activate
GHANA_DVLA_API_KEY= •••secretsupply to activate
GHANA_FDA_API_KEY= •••secretsupply to activate
GHANA_FDA_BATCH_URLendpointsupply to activate
GHANA_EPA_REPORTING_URLendpointsupply to activate

IoT Network Servers#

LORAWAN_NS_URLendpointsupply to activate
LORAWAN_NS_API_KEY= •••secretsupply to activate
NBIOT_DCP_URLendpointsupply to activate
NBIOT_DCP_KEYvaluesupply to activate

Market Intelligence APIs#

BLOOMBERG_API_KEY= •••secretsupply to activate
QUANDL_API_KEY= •••secretsupply to activate
AFDB_API_URLendpointsupply to activate
AFDB_API_KEY= •••secretsupply to activate
EPO_CONSUMER_KEYvaluesupply to activate
EPO_CONSUMER_SECRET= •••secretsupply to activate
GIPC_API_URLendpointsupply to activate

Pharma & Manufacturing#

PHARMA_GMP_CERT_NUMBERvaluesupply to activate
PHARMA_QMS_URLendpointsupply to activate
PCB_AOI_THRESHOLD_PERCENT= 98.5valuehas default

Fleet Management#

EV_OTA_SERVER_URLendpointsupply to activate
ROS2_BRIDGE_URLendpointsupply to activate
MAPS_API_KEY= •••secretsupply to activate

Container Images (CI/CD)#

SARASWATI_GATEWAY_IMAGE= ghcr.io/greychimp/oshun/saraswati-gateway:latestimagehas default
SARASWATI_IOT_IMAGE= ghcr.io/greychimp/oshun/saraswati-iot:latestimagehas default
SARASWATI_MFG_IMAGE= ghcr.io/greychimp/oshun/saraswati-manufacturing:latestimagehas default
SARASWATI_FLEET_IMAGE= ghcr.io/greychimp/oshun/saraswati-fleet:latestimagehas default
SARASWATI_MARKET_IMAGE= ghcr.io/greychimp/oshun/saraswati-market-intel:latestimagehas default

Lakshmi Infrastructure (Comprehensive Personal Finance Intelligence) (84)#

LAKSHMI_DATABASE_URL= postgresql://oshun:oshun_dev@lakshmi-pgbouncer:6438/lakshmiendpointhas default
Primary database URL — via PgBouncer (transaction mode)
LAKSHMI_DIRECT_DATABASE_URL= postgresql://oshun:oshun_dev@lakshmi-timescale:5432/lakshmiendpointhas default
Direct connection — used for DDL (migrations), TimescaleDB, and pgvector operations
LAKSHMI_DEV_DATABASE_URL= postgresql://oshun:oshun_dev@localhost:5432/lakshmiendpointhas default
Dev convenience: shared postgres (lakshmi is in POSTGRES_MULTIPLE_DATABASES)
LAKSHMI_DEV_PGBOUNCER_URL= postgresql://oshun:oshun_dev@localhost:6432/lakshmiendpointhas default
LAKSHMI_DEV_INGEST_DATABASE_URL= postgresql://oshun:oshun_dev@localhost:6432/lakshmi_ingestendpointhas default
LAKSHMI_DEV_ANALYTICS_DATABASE_URL= postgresql://oshun:oshun_dev@localhost:6432/lakshmi_analyticsendpointhas default
LAKSHMI_REDIS_URL= redis://lakshmi-redis:6379endpointhas default
LAKSHMI_REDIS_PASSWORD= •••secretsupply to activate
LAKSHMI_KAFKA_BROKERS= kafka:9092endpointhas default
LAKSHMI_MINIO_ENDPOINT= http://minio:9000endpointhas default
LAKSHMI_MINIO_ACCESS_KEY= •••secrethas default
LAKSHMI_MINIO_SECRET_KEY= •••secrethas default
LAKSHMI_MINIO_BUCKET_RECEIPTS= lakshmi-receiptsvaluehas default
LAKSHMI_MINIO_BUCKET_TAX_DOCS= lakshmi-tax-docsvaluehas default
LAKSHMI_MINIO_BUCKET_ESTATE= lakshmi-estate-docsvaluehas default
LAKSHMI_MINIO_BUCKET_STATEMENTS= lakshmi-statementsvaluehas default
LAKSHMI_JWT_SECRET= •••secrethas default
JWT signing secret — MUST be changed in production (min 64 chars)
LAKSHMI_JWT_ISSUER= https://lakshmi.oshun.iovaluehas default
LAKSHMI_JWT_EXPIRY_SECONDS= 3600timinghas default
LAKSHMI_REFRESH_TOKEN_EXPIRY_SECONDS= 2592000timinghas default

Open Banking Aggregation Providers#

PLAID_CLIENT_IDvaluesupply to activate
PLAID_SECRET= •••secretsupply to activate
PLAID_ENV= sandboxvaluehas default
PLAID_PRODUCTS= transactions,identity,investments,liabilitiesvaluehas default
PLAID_COUNTRY_CODES= US,CA,GBvaluehas default
YODLEE_CLIENT_IDvaluesupply to activate
YODLEE_CLIENT_SECRET= •••secretsupply to activate
YODLEE_ENV= sandboxvaluehas default
MX_CLIENT_IDvaluesupply to activate
MX_API_KEY= •••secretsupply to activate
MX_ENV= sandboxvaluehas default
FINICITY_APP_KEY= •••secretsupply to activate
FINICITY_APP_TOKEN= •••secretsupply to activate
FINICITY_PARTNER_IDvaluesupply to activate
TINK_CLIENT_IDvaluesupply to activate
TINK_CLIENT_SECRET= •••secretsupply to activate

Market Data & Financial Data Providers#

ALPHA_VANTAGE_API_KEY= •••secretsupply to activate
POLYGON_IO_API_KEY= •••secretsupply to activate
XIGNITE_API_TOKEN= •••secretsupply to activate
QUANDL_API_KEY is defined once under the Saraswati section (shared with Lakshmi).
MORNINGSTAR_API_KEY= •••secretsupply to activate

Credit Monitoring#

EXPERIAN_CLIENT_IDvaluesupply to activate
EXPERIAN_CLIENT_SECRET= •••secretsupply to activate
EQUIFAX_CLIENT_IDvaluesupply to activate
EQUIFAX_CLIENT_SECRET= •••secretsupply to activate
TRANSUNION_API_KEY= •••secretsupply to activate

Automated Valuation Model (Property)#

ZILLOW_ZWSID= •••secretsupply to activate
ATTOM_API_KEY= •••secretsupply to activate
CORELOGIC_API_KEY= •••secretsupply to activate

Crypto Data#

COINGECKO_API_KEY= •••secretsupply to activate
CMC_API_KEY= •••secretsupply to activate
ALCHEMY_API_KEY= •••secretsupply to activate
INFURA_PROJECT_IDvaluesupply to activate
MORALIS_API_KEY= •••secretsupply to activate

AI/ML Configuration#

LAKSHMI_OPENAI_MODEL= gpt-4omodelhas default
LAKSHMI_ANTHROPIC_MODEL= claude-opus-4-5modelhas default
LAKSHMI_EMBEDDING_MODEL= text-embedding-3-smallmodelhas default
LAKSHMI_EMBEDDING_DIMENSIONS= 1536valuehas default
LAKSHMI_ML_MODEL_CACHE_DIR= /var/cache/lakshmi/ml-modelsmodelhas default
LAKSHMI_API_PORT= 3800porthas default
Service Ports (Lakshmi namespace: 38xx)
LAKSHMI_SYNC_PORT= 3801porthas default
LAKSHMI_AI_PORT= 3802porthas default
LAKSHMI_WORKER_PORT= 3803porthas default
LAKSHMI_SCHEDULER_PORT= 3804porthas default
LAKSHMI_POSTGRES_PORT= 5438porthas default
LAKSHMI_PGBOUNCER_PORT= 6438porthas default
LAKSHMI_REDIS_PORT= 6388porthas default

Recurring Task Cadence#

LAKSHMI_SCHEDULER_ACCOUNT_SYNC_EVERY_MS= 900000timinghas default
LAKSHMI_SCHEDULER_CATEGORIZATION_EVERY_MS= 300000timinghas default
LAKSHMI_SCHEDULER_AI_RECOMMENDATION_CRON= "0 3 * * *"timinghas default
LAKSHMI_SCHEDULER_REPORT_GENERATION_CRON= "0 5 * * *"timinghas default
LAKSHMI_SCHEDULER_DATA_EXPORT_MAINTENANCE_CRON= "0 * * * *"timinghas default

Kafka Topics#

LAKSHMI_TOPIC_ACCOUNTS_SYNC= lakshmi.accounts.synctopichas default
LAKSHMI_TOPIC_TRANSACTIONS_NEW= lakshmi.transactions.newtopichas default
LAKSHMI_TOPIC_TRANSACTIONS_CATEGORIZED= lakshmi.transactions.categorizedtopichas default
LAKSHMI_TOPIC_ALERTS_TRIGGERED= lakshmi.alerts.triggeredtopichas default
LAKSHMI_TOPIC_INVESTMENTS_REBALANCE= lakshmi.investments.rebalancetopichas default
LAKSHMI_TOPIC_TAX_HARVEST= lakshmi.tax.harvesttopichas default
LAKSHMI_TOPIC_GOALS_MILESTONE= lakshmi.goals.milestonetopichas default
LAKSHMI_TOPIC_AI_RECOMMENDATION= lakshmi.ai.recommendationtopichas default

Container Images (CI/CD)#

LAKSHMI_API_IMAGE= ghcr.io/greychimp/oshun/lakshmi-api-gateway:latestimagehas default
LAKSHMI_SYNC_IMAGE= ghcr.io/greychimp/oshun/lakshmi-sync-engine:latestimagehas default
LAKSHMI_AI_IMAGE= ghcr.io/greychimp/oshun/lakshmi-ai-agents:latestimagehas default
LAKSHMI_WORKER_IMAGE= ghcr.io/greychimp/oshun/lakshmi-worker:latestimagehas default
LAKSHMI_SCHEDULER_IMAGE= ghcr.io/greychimp/oshun/lakshmi-scheduler:latestimagehas default

Service · V2/ue/Build/Rust (8)#

RUSTC_WRAPPER= sccachevaluehas default
SCCACHE_CONF= $(Workspace)/V2/ue/Build/Rust/sccache-client.tomlvaluehas default
SCCACHE_BUCKET= oshun-v2-rust-sccachevaluehas default
SCCACHE_REGION= us-east-1valuehas default
SCCACHE_ENDPOINT= $(SCCACHE_S3_ENDPOINT)endpointhas default
SCCACHE_S3_USE_SSL= truetogglehas default
SCCACHE_IDLE_TIMEOUT= 1800valuehas default
SCCACHE_CACHE_SIZE= 50Gvaluehas default

Service · V3/ue/Build/PixelStreaming (12)#

V3_WORKER_ROOT= /opt/v3/workervaluehas default
V3_PIXELSTREAMING_URL= wss://lilith-pxstream-signaller.internal/wsendpointhas default
V3_WORKER_MAP= /Game/World/Atrium/L_LilithCommonsAtriumvaluehas default
V3_PIXELSTREAMING_WIDTH= 1920valuehas default
V3_PIXELSTREAMING_HEIGHT= 1080valuehas default
V3_PIXELSTREAMING_FPS= 60valuehas default
V3_PIXELSTREAMING_CODEC= H264valuehas default
V3_PIXELSTREAMING_START_BITRATE= 12000000valuehas default
Use AV1 only for Chrome/Edge probes on Ada-generation GPU workers. V3_PIXELSTREAMING_CODEC=AV1
V3_PIXELSTREAMING_MIN_BITRATE= 4000000valuehas default
V3_PIXELSTREAMING_MAX_BITRATE= 20000000valuehas default
V3_EXTRA_WORKER_ARGS= -log -NoVSyncvaluehas default
V3_ALLOW_INSECURE_LOCAL_PIXELSTREAMING= 0togglehas default
Local ws:// signallers are rejected unless this is explicitly set to 1.

Service · apps/demeter/api (17)#

PORT= 3030porthas default
Server
HOST= 127.0.0.1valuehas default
NODE_ENV= developmentvaluehas default
LOG_LEVEL= infovaluehas default
JWT_SECRET= •••secrethas default
Authentication (JWT)
JWT_ISSUER= demeter-apivaluehas default
JWT_ACCESS_TOKEN_TTL= •••secrethas default
JWT_REFRESH_TOKEN_TTL= 604800timinghas default
DB_POOL_MIN= 2valuehas default
DB_POOL_MAX= 10valuehas default
REDIS_URL= redis://localhost:6379endpointhas default
Redis
CORS_ORIGIN= *valuehas default
CORS
RATE_LIMIT_MAX= 100valuehas default
Rate Limiting
RATE_LIMIT_WINDOW_MS= 60000timinghas default
METRICS_PORT= 9091porthas default
Metrics
WEATHER_API_KEY= •••secretsupply to activate
External APIs
IOT_API_KEY= •••secretsupply to activate

Service · apps/hestia/api (2)#

AI_API_KEY= •••secretsupply to activate
AI (optional — for recipe generation features)
AI_MODEL= gpt-4modelhas default

Service · apps/iris/api (30)#

IRIS_DATABASE_URL= postgresql://oshun:oshun_dev@localhost:5432/irisendpointhas default
Local development
DATABASE_POOL_MIN= 2valuehas default
Connection pool
DATABASE_POOL_MAX= 10valuehas default
IRIS_REDIS_PREFIX= iris:valuehas default
IRIS_QDRANT_URL= http://localhost:6333endpointhas default
IRIS_QDRANT_COLLECTION= iris_memoriesvaluehas default
IRIS_MEMORY_WORKING_TTL_HOURS= 24timinghas default
Working memory TTL before archival (hours)
IRIS_MEMORY_EMBEDDING_MODEL= text-embedding-3-smallmodelhas default
Embedding model for semantic search
IRIS_MEMORY_EMBEDDING_DIMENSIONS= 1536valuehas default
IRIS_MEMORY_CORE_PERSONA_LIMIT= 2000valuehas default
Core memory limits (characters)
IRIS_MEMORY_CORE_HUMAN_LIMIT= 2000valuehas default
IRIS_MEMORY_CORE_SYSTEM_LIMIT= 2000valuehas default
IRIS_DEFAULT_MODEL= claude-sonnet-4-20250514modelhas default
IRIS_DEFAULT_PROVIDER= anthropicvaluehas default
IRIS_DEFAULT_TEMPERATURE= 0.7valuehas default
IRIS_DEFAULT_MAX_TOKENS= 4096valuehas default
IRIS_DEFAULT_TOP_P= 0.9valuehas default
IRIS_RATE_LIMIT_REQUESTS_PER_MINUTE= 60valuehas default
IRIS_RATE_LIMIT_TOKENS_PER_MINUTE= 100000valuehas default
IRIS_RATE_LIMIT_WINDOW_MS= 60000timinghas default
JWT_EXPIRES_IN= 7dvaluehas default
API_KEY_HASH_ROUNDS= •••secrethas default
API Key settings
API_KEY_PREFIX= •••secrethas default
CORS_ORIGINS= http://localhost:3000,http://localhost:4000valuehas default
CORS
ENABLE_TRACING= falsetogglehas default
ENABLE_METRICS= falsetogglehas default
FEATURE_STREAMING= truetogglehas default
FEATURE_MEMORY= truetogglehas default
FEATURE_TOOLS= truetogglehas default
FEATURE_VOICE= falsetogglehas default

Service · apps/lilith/bff (15)#

SERVICE_NAME= bffvaluehas default
SERVICE_VERSION= 1.0.0valuehas default
REDIS_HOST= localhostendpointhas default
REDIS_PORT= 6379porthas default
REDIS_PASSWORD= •••secretsupply to activate
SECURITY_MIDDLEWARE_ENABLED= truetogglehas default
Security Middleware
SECURITY_MONITOR_ONLY= falsetogglehas default
IP_ALLOW_LISTvaluesupply to activate
IP Filtering
IP_DENY_LISTvaluesupply to activate
ADMIN_IP_ALLOW_LIST= 127.0.0.1,::1valuehas default
TRUSTED_PROXIESvaluesupply to activate
RATE_LIMIT_MAX_REQUESTS= 100valuehas default
WAF_BLOCK_MODE= truetogglehas default
WAF Configuration
WAF_IP_WHITELIST= 127.0.0.1,::1valuehas default
APM_ENABLED= falsetogglehas default
Feature Flags

Service · apps/lilith/contracts (13)#

PRIVATE_KEY= •••secrethas default
Private key for deployment (WITHOUT 0x prefix) NEVER commit this file with a real private key!
SEPOLIA_RPC_URL= https://rpc.sepolia.orgendpointhas default
ETHERSCAN_API_KEY= •••secrethas default
Etherscan API Key for contract verification
AMOY_RPC_URL= https://rpc-amoy.polygon.technologyendpointhas default
POLYGONSCAN_API_KEY= •••secrethas default
Polygonscan API Key
ARBITRUM_SEPOLIA_RPC_URL= https://sepolia-rollup.arbitrum.io/rpcendpointhas default
ARBISCAN_API_KEY= •••secrethas default
Arbiscan API Key
OPTIMISM_SEPOLIA_RPC_URL= https://sepolia.optimism.ioendpointhas default
OPTIMISM_API_KEY= •••secrethas default
Optimism Etherscan API Key
BASE_SEPOLIA_RPC_URL= https://sepolia.base.orgendpointhas default
BASESCAN_API_KEY= •••secrethas default
Basescan API Key
REPORT_GAS= truetogglehas default
COINMARKETCAP_API_KEY= •••secrethas default

Service · apps/lilith/svc-ai (7)#

DEFAULT_MODEL= gpt-4modelhas default
Model Configuration
MAX_TOKENS= 4096valuehas default
TEMPERATURE= 0.7valuehas default
VECTOR_STORE_URLendpointsupply to activate
Vector Store Configuration
PINECONE_API_KEY= •••secretsupply to activate
PINECONE_ENVIRONMENTvaluesupply to activate
ENABLE_CACHING= truetogglehas default

Service · apps/lilith/svc-auth (14)#

JWT_REFRESH_SECRET= •••secrethas default
JWT_REFRESH_EXPIRES_IN= 7dvaluehas default
SMTP_HOST= smtp.example.comendpointhas default
Email Configuration
SMTP_PORT= 587porthas default
SMTP_USERvaluesupply to activate
SMTP_PASSWORD= •••secretsupply to activate
EMAIL_FROM= noreply@example.comvaluehas default
APP_URL= http://localhost:3000endpointhas default
Application URLs
FRONTEND_URL= http://localhost:3000endpointhas default
APP_NAME= Lilithvaluehas default
AUDIT_SECRET_KEY= •••secrethas default
Security
PII_MASTER_KEY_ID= default_pii_keyvaluehas default
TRANSCRIPT_MASTER_KEY_ID= default_transcript_keyvaluehas default
USE_NOTIFICATION_SERVICE= falsetogglehas default

Service · apps/lilith/svc-conversation (5)#

WS_HEARTBEAT_INTERVAL= 30000timinghas default
WebSocket Configuration
WS_MAX_CONNECTIONS= 1000valuehas default
MAX_MESSAGE_LENGTH= 4096valuehas default
Message Settings
MESSAGE_RETENTION_DAYS= 90valuehas default
ENABLE_REAL_TIME_SYNC= truetogglehas default

Service · apps/lilith/svc-media (10)#

AWS_ACCESS_KEY_IDvaluesupply to activate
AWS S3 Configuration
AWS_SECRET_ACCESS_KEY= •••secretsupply to activate
AWS_REGION= us-east-1valuehas default
S3_BUCKET= media-bucketvaluehas default
S3_ENDPOINTendpointsupply to activate
CLOUDFRONT_DISTRIBUTION_IDvaluesupply to activate
CloudFront Configuration
CLOUDFRONT_KEY_PAIR_IDvaluesupply to activate
CLOUDFRONT_PRIVATE_KEY= •••secretsupply to activate
MAX_FILE_SIZE= 104857600valuehas default
Upload Configuration
ALLOWED_MIME_TYPES= image/*,video/*,audio/*valuehas default

Service · apps/lilith/svc-moderation (4)#

PERSPECTIVE_API_KEY= •••secretsupply to activate
TOXICITY_THRESHOLD= 0.7valuehas default
Moderation Settings
AUTO_MODERATE= truetogglehas default
BLOCK_FLAGGED_CONTENT= falsetogglehas default

Service · apps/lilith/svc-notification (3)#

FIREBASE_PROJECT_IDvaluesupply to activate
Push Notifications
FIREBASE_PRIVATE_KEY= •••secretsupply to activate
FIREBASE_CLIENT_EMAILvaluesupply to activate

Service · apps/nyx/api (16)#

WS_PATH= /wsvaluehas default
LOG_FORMAT= prettyvaluehas default
RATE_LIMIT_ANONYMOUS= 60valuehas default
----------------------------------------------------------------------------- Rate Limiting (requests per minute by tier) -----------------------------------------------------------------------------
RATE_LIMIT_FREE= 300valuehas default
RATE_LIMIT_PRO= 1000valuehas default
RATE_LIMIT_ENTERPRISE= 5000valuehas default
EPHEMERIS_PRECISION= HIGHvaluehas default
----------------------------------------------------------------------------- Ephemeris Configuration -----------------------------------------------------------------------------
EPHEMERIS_CACHE_TTL= 3600timinghas default
STAR_CATALOG_PATH= /data/catalogsvaluehas default
----------------------------------------------------------------------------- Star Catalog Configuration -----------------------------------------------------------------------------
STAR_MAGNITUDE_LIMIT= 12valuehas default
TLE_UPDATE_INTERVAL= 3600timinghas default
----------------------------------------------------------------------------- Satellite Tracking -----------------------------------------------------------------------------
SATELLITE_PREDICTION_DAYS= 14valuehas default
EVENT_LOOKAHEAD_DAYS= 365valuehas default
----------------------------------------------------------------------------- Event Configuration -----------------------------------------------------------------------------
WS_PING_INTERVAL= 30000timinghas default
----------------------------------------------------------------------------- WebSocket Configuration -----------------------------------------------------------------------------
WS_PING_TIMEOUT= 10000valuehas default
CORS_METHODS= GET,OPTIONSvaluehas default

Service · apps/oshun/bff (17)#

REQUEST_TIMEOUT_MS= 12000timinghas default
OSHUN_TARA_API_BASE_URL= http://localhost:4101endpointhas default
------------------------------------------------------------------------------ Upstream Domain APIs In staging and production these must be explicit environment-specific HTTPS origins. The BFF only falls back to localhost defaults in development/test. ------------------------------------------------------------------------------
OSHUN_VERITAS_API_BASE_URL= http://localhost:4201endpointhas default
OSHUN_NYX_API_BASE_URL= http://localhost:4301endpointhas default
OSHUN_ARETE_API_BASE_URL= http://localhost:4401endpointhas default
OSHUN_NISABA_API_BASE_URL= http://localhost:4501endpointhas default
OSHUN_METIS_API_BASE_URL= http://localhost:4601endpointhas default
OSHUN_PRODUCT_GRAPH_PG_SYNC= 0valuehas default
Product-graph Postgres projection (phase 6): set to 1 to mirror the checked-in composed artifact into product_graph_node/_edge at boot (full-replace on graph_version mismatch; requires the admin database). The tables are a rebuildable PROJECTION — the artifact stays the truth.
OSHUN_PRODUCT_GRAPH_ARTIFACT_DIRvaluesupply to activate
Optional absolute artifact directory for a packaged deployment. Source and monorepo production-bundle layouts auto-resolve when unset.
SENTRY_DSN= •••secretsupply to activate
------------------------------------------------------------------------------ Observability ------------------------------------------------------------------------------
OTEL_SERVICE_NAME= oshun-bffvaluehas default
FEATURE_FLAGS= {}valuehas default
------------------------------------------------------------------------------ Feature Flags (JSON string for remote/local overrides) ------------------------------------------------------------------------------
OSHUN_RUNPOD_API_KEY= •••secretsupply to activate
------------------------------------------------------------------------------ Open self-hosted generation providers (RunPod ComfyUI) — DEFAULT WHEN SET ------------------------------------------------------------------------------ The generation plane DEFAULTS to open, self-hosted, license-clean models, but ONLY when the RunPod endpoints below are provisioned. With these UNSET, each modality silently falls back to its commercial provider (Stability / fal / ElevenLabs) or fails closed. Music is open-only (no commercial fallback). So "default open" is inert until you set these — provision the RunPod endpoints and point each var at the deployment that bakes the modality's model (see infra/runpod/endpoints/). One shared RunPod API key + one endpoint id per modality:
OSHUN_IMAGE_RUNPOD_ENDPOINT= # -> a comfyui-flagship-image deploy (Z-Image, Apache-2.0)endpointhas default
OSHUN_VIDEO_RUNPOD_ENDPOINT= # -> a comfyui-flagship-video deploy (Wan 2.2, Apache-2.0; ~5…endpointhas default
OSHUN_AUDIO_MUSIC_RUNPOD_ENDPOINT= # -> an audio-music deploy (ACE-Step 1.5, MIT)endpointhas default
OSHUN_VOICE_RUNPOD_ENDPOINT= # -> an audio-voice deploy (default Chatterbox/MIT; Kokoro/Ap…endpointhas default

Service · apps/oshun/mobile (11)#

APP_ENV= developmentvaluehas default
App environment
EXPO_PUBLIC_OSHUN_BFF_URL= http://localhost:4010endpointhas default
API endpoints
EXPO_PUBLIC_OSHUN_WEB_URL= http://localhost:3010endpointhas default
EXPO_PUBLIC_OSHUN_DEV_AUTH_TOKENvaluesupply to activate
Optional local/dev auth token for BFF protected routes
EXPO_PUBLIC_TARA_API_URL= http://localhost:4101endpointhas default
Domain service base URLs (used by adapters as they are introduced)
EXPO_PUBLIC_VERITAS_API_URL= http://localhost:4102endpointhas default
EXPO_PUBLIC_NYX_API_URL= http://localhost:4103endpointhas default
EXPO_PUBLIC_ARETE_API_URL= http://localhost:4104endpointhas default
EXPO_PUBLIC_SENTRY_DSNvaluesupply to activate
Observability
EXPO_PUBLIC_ANALYTICS_WRITE_KEYvaluesupply to activate
EXPO_PUBLIC_FEATURE_FLAGS= {}valuehas default
Feature flags (JSON string for remote/local overrides)

Service · apps/oshun/web (12)#

NEXT_PUBLIC_APP_ENV= developmentvaluehas default
------------------------------------------------------------------------------ App Environment ------------------------------------------------------------------------------
NEXT_PUBLIC_OSHUN_WEB_URL= http://localhost:3010endpointhas default
NEXT_PUBLIC_OSHUN_BFF_URL= http://localhost:4010endpointhas default
------------------------------------------------------------------------------ API Endpoints ------------------------------------------------------------------------------
NEXT_PUBLIC_TARA_API_URL= http://localhost:4101endpointhas default
Domain service base URLs (used by adapters as they are introduced)
NEXT_PUBLIC_VERITAS_API_URL= http://localhost:4102endpointhas default
NEXT_PUBLIC_NYX_API_URL= http://localhost:4103endpointhas default
NEXT_PUBLIC_ARETE_API_URL= http://localhost:4104endpointhas default
NEXT_PUBLIC_ENABLE_PWA= truetogglehas default
------------------------------------------------------------------------------ PWA and Runtime Flags ------------------------------------------------------------------------------
NEXT_PUBLIC_ENABLE_OFFLINE= truetogglehas default
NEXT_PUBLIC_FEATURE_FLAGS= {}valuehas default
NEXT_PUBLIC_SENTRY_DSNvaluesupply to activate
------------------------------------------------------------------------------ Observability ------------------------------------------------------------------------------
NEXT_PUBLIC_ANALYTICS_WRITE_KEYvaluesupply to activate

Service · apps/tara/web (7)#

NEXT_PUBLIC_API_BASE_URL= http://localhost:8080endpointhas default
Base URL for the Tara API server
NEXT_PUBLIC_WS_URL= ws://localhost:8080endpointhas default
WebSocket URL for real-time features (meditation sync, live sessions)
NEXT_PUBLIC_CDN_URLendpointsupply to activate
CDN URL for static assets (images, audio files) Leave empty to serve from the application server
NEXT_PUBLIC_ANALYTICS_IDvaluesupply to activate
Analytics tracking ID (Google Analytics, Mixpanel, etc.)
NEXT_PUBLIC_ENVIRONMENT= developmentvaluehas default
Current environment name (development, staging, production)
NEXT_PUBLIC_VERSION= localvaluehas default
Build version (populated during CI/CD)
NEXT_PUBLIC_DEBUG= falsetogglehas default
Enable debug mode (extra logging, dev tools)

Service · docker (118)#

POSTGRES_USER= oshunvaluehas default
POSTGRES_PASSWORD= •••secrethas default
POSTGRES_DB= oshunvaluehas default
POSTGRES_PORT= 5432porthas default
MINIO_ROOT_USER= oshunvaluehas default
MINIO_ROOT_PASSWORD= •••secrethas default
MINIO_PORT= 9000porthas default
MINIO_CONSOLE_PORT= 9001porthas default
ELASTICSEARCH_PORT= 9200porthas default
QDRANT_PORT= 6333porthas default
QDRANT_GRPC_PORT= 6334porthas default
KAFKA_PORT= 29092porthas default
ENCRYPTION_KEY= change_me_32_characters_exactly!!valuehas default
YEMAYA_API_PORT= 3001porthas default
YEMAYA_WEB_PORT= 4001porthas default
YEMAYA_API_URL= http://localhost:3001endpointhas default
LILITH_API_PORT= 3002porthas default
LILITH_WEB_PORT= 4002porthas default
LILITH_API_URL= http://localhost:3002endpointhas default
ISIS_API_PORT= 3003porthas default
SOPHIA_API_PORT= 3004porthas default
IRIS_API_PORT= 3100porthas default
IRIS_KAFKA_BROKERS= kafka:9092endpointhas default
PROMETHEUS_PORT= 9090porthas default
GRAFANA_PORT= 3100porthas default
GRAFANA_ADMIN_USER= adminvaluehas default
GRAFANA_ADMIN_PASSWORD= •••secrethas default
GRAFANA_ROOT_URL= http://localhost:3100endpointhas default
JAEGER_UI_PORT= 16686porthas default
JAEGER_COLLECTOR_PORT= 14268porthas default
JAEGER_AGENT_PORT= 6831porthas default
TRAEFIK_DASHBOARD_PORT= 8080porthas default
ACME_EMAIL= admin@oshun.iovaluehas default
VITE_API_URLendpointsupply to activate
VITE_PUBLIC_URLendpointsupply to activate
VITE_SENTRY_DSN= •••secretsupply to activate
VITE_POSTHOG_KEYvaluesupply to activate
VITE_FEATURE_FLAGSvaluesupply to activate
FREYA_DATABASE_URL= postgresql://oshun:change_me_in_production@postgres:5432/freyaendpointhas default
--- 57.1.5.1 Core Infrastructure ---
FREYA_REDIS_URL= redis://redis:6379endpointhas default
FREYA_USE_PGBOUNCER= falsetogglehas default
FREYA_DATABASE_REPLICA_URLSendpointsupply to activate
PgBouncer: set to true in production and use port 6432 FREYA_DATABASE_URL=postgresql://oshun:change_me_in_production@pgbouncer:6432/freya FREYA_USE_PGBOUNCER=true
FREYA_S3_BUCKET_DESIGN= freya-design-assetsvaluehas default
--- 57.1.5.2 S3 / MinIO Asset Storage --- Design assets: sketches, tech packs, CAD files, patterns
FREYA_S3_BUCKET_PRODUCTS= freya-product-imageryvaluehas default
Product imagery: studio shots, lifestyle, 360-degree, AR assets
FREYA_S3_BUCKET_MANUFACTURING= freya-manufacturing-docsvaluehas default
Manufacturing documents: batch records, QC reports, certifications
FREYA_S3_ENDPOINT= http://minio:9000endpointhas default
General S3 endpoint (shared with platform S3_ENDPOINT if using MinIO)
FREYA_S3_ACCESS_KEY= •••secrethas default
FREYA_S3_SECRET_KEY= •••secrethas default
FREYA_S3_REGION= us-east-1valuehas default
FREYA_CDN_BASE_URL= http://localhost:9000/freya-product-imageryendpointhas default
FREYA_KAFKA_BROKERS= kafka:9092endpointhas default
--- 57.1.5.3 Kafka Event Streaming ---
FREYA_KAFKA_CLIENT_ID= freya-servicevaluehas default
FREYA_KAFKA_GROUP_ID_ORDERS= freya-orders-consumervaluehas default
FREYA_KAFKA_GROUP_ID_INVENTORY= freya-inventory-consumervaluehas default
FREYA_KAFKA_GROUP_ID_MANUFACTURING= freya-manufacturing-consumervaluehas default
FREYA_KAFKA_GROUP_ID_QUALITY= freya-quality-consumervaluehas default
FREYA_KAFKA_TOPIC_ORDERS= freya.orderstopichas default
FREYA_KAFKA_TOPIC_INVENTORY= freya.inventorytopichas default
FREYA_KAFKA_TOPIC_PRODUCTION= freya.productiontopichas default
FREYA_KAFKA_TOPIC_QUALITY= freya.qualitytopichas default
FREYA_KAFKA_TOPIC_CUSTOMERS= freya.customerstopichas default
FREYA_STRIPE_SECRET_KEY= •••secretsupply to activate
--- 57.1.5.4 Payment Gateways --- Stripe (international cards, diaspora markets)
FREYA_STRIPE_PUBLISHABLE_KEYvaluesupply to activate
FREYA_STRIPE_WEBHOOK_SECRET= •••secretsupply to activate
FREYA_PAYSTACK_SECRET_KEY= •••secretsupply to activate
Paystack (Ghana, Nigeria)
FREYA_PAYSTACK_PUBLIC_KEYvaluesupply to activate
FREYA_PAYSTACK_WEBHOOK_SECRET= •••secretsupply to activate
FREYA_FLUTTERWAVE_SECRET_KEY= •••secretsupply to activate
Flutterwave (pan-African)
FREYA_FLUTTERWAVE_PUBLIC_KEYvaluesupply to activate
FREYA_FLUTTERWAVE_ENCRYPTION_KEYvaluesupply to activate
FREYA_FLUTTERWAVE_WEBHOOK_SECRET= •••secretsupply to activate
FREYA_MTN_MOMO_API_KEY= •••secretsupply to activate
MTN Mobile Money (Ghana)
FREYA_MTN_MOMO_API_USERvaluesupply to activate
FREYA_MTN_MOMO_SUBSCRIPTION_KEY= •••secretsupply to activate
FREYA_MTN_MOMO_ENVIRONMENT= sandboxvaluehas default
FREYA_AIRTEL_CLIENT_IDvaluesupply to activate
Airtel Money (Kenya, Nigeria, Tanzania)
FREYA_AIRTEL_CLIENT_SECRET= •••secretsupply to activate
FREYA_AIRTEL_ENVIRONMENT= sandboxvaluehas default
FREYA_DHL_API_KEY= •••secretsupply to activate
--- 57.1.5.5 Shipping & Logistics --- DHL (international, diaspora fulfillment)
FREYA_DHL_ACCOUNT_NUMBERvaluesupply to activate
FREYA_DHL_BASE_URL= https://api-mock.dhl.comendpointhas default
FREYA_FEDEX_CLIENT_IDvaluesupply to activate
FedEx (US diaspora, premium courier)
FREYA_FEDEX_CLIENT_SECRET= •••secretsupply to activate
FREYA_FEDEX_ACCOUNT_NUMBERvaluesupply to activate
FREYA_FEDEX_BASE_URL= https://apis-sandbox.fedex.comendpointhas default
FREYA_UPS_CLIENT_IDvaluesupply to activate
UPS (UK, Europe diaspora)
FREYA_UPS_CLIENT_SECRET= •••secretsupply to activate
FREYA_UPS_ACCOUNT_NUMBERvaluesupply to activate
FREYA_JUMIA_LOGISTICS_API_KEY= •••secretsupply to activate
Local African logistics
FREYA_SENDY_API_KEY= •••secretsupply to activate
FREYA_KWIK_DELIVERY_API_KEY= •••secretsupply to activate
FREYA_KOBO360_API_KEY= •••secretsupply to activate
FREYA_SHIPPING_ORIGIN_COUNTRY= GHvaluehas default
Shipping origin address
FREYA_SHIPPING_ORIGIN_CITY= Accravaluehas default
FREYA_SHIPPING_ORIGIN_ADDRESSvaluesupply to activate
FREYA_INSTAGRAM_APP_IDvaluesupply to activate
--- 57.1.5.6 Social Media APIs --- Instagram / Facebook Commerce
FREYA_INSTAGRAM_APP_SECRET= •••secretsupply to activate
FREYA_INSTAGRAM_ACCESS_TOKEN= •••secretsupply to activate
FREYA_FACEBOOK_APP_IDvaluesupply to activate
FREYA_FACEBOOK_APP_SECRET= •••secretsupply to activate
FREYA_FACEBOOK_PAGE_ACCESS_TOKEN= •••secretsupply to activate
FREYA_FACEBOOK_CATALOG_IDvaluesupply to activate
FREYA_TIKTOK_APP_IDvaluesupply to activate
TikTok Shop / Ads
FREYA_TIKTOK_APP_SECRET= •••secretsupply to activate
FREYA_TIKTOK_ACCESS_TOKEN= •••secretsupply to activate
FREYA_TIKTOK_SHOP_IDvaluesupply to activate
FREYA_PINTEREST_APP_IDvaluesupply to activate
Pinterest Ads
FREYA_PINTEREST_APP_SECRET= •••secretsupply to activate
FREYA_PINTEREST_ACCESS_TOKEN= •••secretsupply to activate
FREYA_PINTEREST_AD_ACCOUNT_IDvaluesupply to activate
FREYA_EMBEDDING_MODEL= text-embedding-3-smallmodelhas default
--- 57.1.5.7 AI / ML API Keys --- Trend prediction & design generation (uses shared ANTHROPIC_API_KEY / OPENAI_API_KEY) Embedding model for product/trend/customer vectors
FREYA_EMBEDDING_DIMENSIONS= 1536valuehas default
FREYA_VISION_PROVIDER= openaivaluehas default
Computer vision QC (defect detection)
FREYA_TRYON_PROVIDER= internalvaluehas default
Virtual try-on AR provider
FREYA_TRYON_API_KEY= •••secretsupply to activate
FREYA_PANTONE_API_KEY= •••secretsupply to activate
Colour matching / Pantone API
FREYA_FRAGRANCE_API_KEY= •••secretsupply to activate
Fragrance note analysis

Service · docker/psyche (27)#

QDRANT_HTTP_PORT= 6334porthas default
----------------------------------------------------------------------------- Qdrant Configuration (Vector Database) -----------------------------------------------------------------------------
MINIO_API_PORT= 9002porthas default
KAFKA_EXTERNAL_PORT= 9095porthas default
----------------------------------------------------------------------------- Kafka Configuration -----------------------------------------------------------------------------
GRAFANA_USER= adminvaluehas default
GRAFANA_PASSWORD= •••secrethas default
JAEGER_OTLP_GRPC_PORT= 4319porthas default
JAEGER_OTLP_HTTP_PORT= 4320porthas default
REDIS_COMMANDER_PORT= 8082porthas default
----------------------------------------------------------------------------- Admin Tools Ports -----------------------------------------------------------------------------
PGADMIN_PORT= 5051porthas default
PGADMIN_EMAIL= admin@psyche.localvaluehas default
PGADMIN_PASSWORD= •••secrethas default
TRITON_HTTP_PORT= 8000porthas default
Triton Inference Server
TRITON_GRPC_PORT= 8001porthas default
TRITON_METRICS_PORT= 8002porthas default
REASONING_HTTP_PORT= 8010porthas default
Reasoning Engine (LLM Inference)
REASONING_GRPC_PORT= 8011porthas default
REASONING_WS_PORT= 8012porthas default
EMBEDDING_HTTP_PORT= 8020porthas default
Embedding Service
EMBEDDING_GRPC_PORT= 8021porthas default
TOOLS_HTTP_PORT= 8030porthas default
Tool Executor
TOOLS_GRPC_PORT= 8031porthas default
GPU_METRICS_PORT= 9400porthas default
GPU Monitoring
DEFAULT_LLM_MODEL= llama-3.1-8b-instructmodelhas default
----------------------------------------------------------------------------- Model Configuration -----------------------------------------------------------------------------
EMBEDDING_MODEL= sentence-transformers/all-MiniLM-L6-v2modelhas default
EMBEDDING_DIMENSION= 384valuehas default
MAX_BATCH_SIZE= 32valuehas default
HF_TOKEN= •••secretsupply to activate
Hugging Face Token (for downloading gated models)

Service · infra/bellona-remote/hetzner (19)#

BELLONA_GATEWAY_DOMAIN= bellona-gateway.example.comvaluehas default
--- Public edge ------------------------------------------------------------- The domain whose A/AAAA records point at this VM (drives ACME + coturn realm).
BELLONA_ACME_EMAIL= ops@example.comvaluehas default
ACME contact email (Let's Encrypt expiry notices).
BELLONA_GATEWAY_IMAGE= oshun/bellona-remote-gateway:latestimagehas default
--- Gateway ----------------------------------------------------------------- Container image. Build locally with `docker compose build gateway` or pin a registry tag your CI pushed.
BELLONA_REMOTE_GATEWAY_LOG_LEVEL= infovaluehas default
BELLONA_REMOTE_GATEWAY_HOST_TOKEN_SIGNING_SECRET= •••secrethas default
>=32 byte unique secret signing host tokens. NEVER commit the real value.
BELLONA_REMOTE_GATEWAY_HOST_TOKEN_TTL_MS= 7776000000timinghas default
BELLONA_REMOTE_GATEWAY_PAIRING_CODE_TTL_MS= 600000timinghas default
BELLONA_REMOTE_GATEWAY_APPROVAL_REQUEST_TTL_MS= 60000timinghas default
BELLONA_REMOTE_GATEWAY_HOST_HEARTBEAT_INTERVAL_MS= 30000timinghas default
BELLONA_REMOTE_GATEWAY_HOST_HEARTBEAT_TIMEOUT_MS= 90000timinghas default
BELLONA_REMOTE_GATEWAY_SHUTDOWN_GRACE_MS= 5000timinghas default
BELLONA_ARTIFACT_BUCKET= bellona-remote-artifactsvaluehas default
BELLONA_TURN_EXTERNAL_IP= 203.0.113.10valuehas default
--- coturn (TURN relay, 180.C.25.04) --------------------------------------- The VM's public IPv4, advertised in relay ICE candidates.
BELLONA_TURN_STATIC_AUTH_SECRET= •••secrethas default
Shared static-auth-secret. The gateway derives short-lived TURN credentials from the SAME value; it must match coturn's static-auth-secret.
BELLONA_METRICS_BASIC_AUTH_USER= metricsvaluehas default
Basic-auth gate for the internal Prometheus route through Caddy. Hash: caddy hash-password --plaintext '<password>' NOTE: bcrypt hashes contain '$'. In a real .env, escape each '$' as '$$' so docker compose does not treat it as a variable, e.g. $$2a$$14$$abc...
BELLONA_METRICS_BASIC_AUTH_HASH= $$2a$$14$$replaceWithARealCaddyBcryptHashValueHere000000000000valuehas default
BACKUP_RETENTION_DAYS= 14valuehas default
--- Backups -----------------------------------------------------------------
BACKUP_CRON= 30 2 * * *timinghas default
BELLONA_BACKUP_BUCKET= bellona-remote-backupsvaluehas default

Service · infra/hetzner (13)#

STACK= stagingvaluehas default
---- Stack identity --------------------------------------------------------- staging | production. Drives the compose project name (oshun-<STACK>), the edge upstream aliases (<STACK>-bff, ...), and OSHUN_ENV in every container.
PLATFORM_DOMAIN= staging.example.comvaluehas default
Platform domain for THIS stack (staging: e.g. staging.example.com; production: e.g. example.com). Must match the edge's OSHUN_<STACK>_DOMAIN.
OSHUN_IMAGE_PREFIX= ghcr.io/greychimp/oshunvaluehas default
---- Images ----------------------------------------------------------------- GHCR prefix deploy-hetzner.yml pushes to (lowercase owner).
IMAGE_TAG= stagingvaluehas default
Mutable per-environment tag moved by CI on every deploy (staging|production). deploy.sh overrides this per invocation for pinned/rollback deploys.
POSTGRES_LOOPBACK_PORT= 5433porthas default
Loopback-only host publish for operator psql + migration debugging. Keep unique per stack on a shared box (staging 5433, production 5434).
REDIS_MAXMEMORY= 160mbvaluehas default
---- Redis ------------------------------------------------------------------ Keep below the redis container's mem_limit (256m in the 6 GiB budget).
OSHUN_OBSERVABILITY_ENABLED= 0togglehas default
---- Observability ---------------------------------------------------------- Staging may stay 0 while the external endpoints are provisioned. Production deploys fail closed unless this is 1. Before enabling, create three separate operator-owned files beside this .env, each mode 0640 and all sharing the deploy user's private group (the containers receive only that supplemental group so their non-root processes can read the bind-mounted files): alert-webhook-url one external HTTPS receiver for firing/resolved alerts deadman-webhook-url a DIFFERENT external HTTPS watchdog that alerts when its once-per-minute OshunDeadMansSwitch POST stops grafana-admin-password at least 20 bytes; never put it in this env file Both receiver hosts must be outside PLATFORM_DOMAIN and the Hetzner box.
PROMETHEUS_LOOPBACK_PORT= 9090porthas default
Loopback-only operator ports. Keep them unique when two stacks share a box.
ALERTMANAGER_LOOPBACK_PORT= 9093porthas default
GRAFANA_LOOPBACK_PORT= 3000porthas default
OSHUN_GAME_DAY_ALLOWED= falsetogglehas default
A supervised non-destructive BFF freeze game day also requires this explicit stack opt-in. The runner re-reads the resulting container label immediately before injection and refuses when it is false. Keep false outside a scheduled, announced production-like drill window.
METIS_JWT_SECRET= •••secretsupply to activate
---- Metis ------------------------------------------------------------------
PSYCHE_SECRET_KEY= •••secretsupply to activate
---- Psyche ----------------------------------------------------------------- FastAPI session-signing secret for psyche-api-gateway.

Service · infra/hetzner (11)#

OSHUN_OFFBOX_BACKUP_ENABLED= 0togglehas default
Keep 0 until repository credentials, an independent failure-domain target, provider-side immutability, and separately escrowed recovery credentials have been configured and tested.
RESTIC_REPOSITORYvaluesupply to activate
Examples: s3:https://s3.example.net/oshun-dr/production or rest:https://backup.example.net/production. Never use a local path or this box's MinIO endpoint.
RESTIC_PASSWORD= •••secretsupply to activate
AWS_DEFAULT_REGION= us-east-1valuehas default
OSHUN_OFFBOX_FAILURE_DOMAINvaluesupply to activate
A human-readable independent domain recorded in every receipt.
OSHUN_OFFBOX_IMMUTABILITY_MODEvaluesupply to activate
provider-object-lock | append-only-rest-server | provider-retention-lock
OSHUN_OFFBOX_INTERVAL_SECONDS= 21600timinghas default
OSHUN_OFFBOX_MAX_PG_AGE_SECONDS= 90000timinghas default
OSHUN_OFFBOX_CHECK_SUBSET= 5%valuehas default
OSHUN_OFFBOX_RETENTION_DAYS= 30valuehas default
OSHUN_OFFBOX_ALLOW_REPOSITORY_INIT= 0valuehas default
Set to 1 only for the first controlled run against a verified empty target.

Service · infra/hetzner/edge (2)#

OSHUN_ACME_EMAIL= ops@example.comvaluehas default
ACME (Let's Encrypt) registration email — expiry warnings go here.
OSHUN_STAGING_DOMAIN= staging.example.comvaluehas default
Staging platform domain. Hosts served: apex + api/metis-api/psyche-api/s3/ admin/tenant/tg/metis/metis-admin subdomains. Point them (or a wildcard) at this box before first start — ACME issuance needs resolving DNS.

Service · infra/nous/phase-87 (4)#

ARGILLA_AUTH_SECRET_KEY= •••secrethas default
LABEL_STUDIO_HOST= http://localhost:8080endpointhas default
LABEL_STUDIO_PORT= 8080porthas default
ARGILLA_PORT= 6900porthas default

Service · infra/nous/phase-98 (18)#

LANGFUSE_URL= http://localhost:3100endpointhas default
LANGFUSE_PORT= 3100porthas default
LANGFUSE_MINIO_PORT= 9190porthas default
LANGFUSE_MEDIA_ENDPOINT= http://localhost:9190endpointhas default
LANGFUSE_POSTGRES_PASSWORD= •••secrethas default
LANGFUSE_CLICKHOUSE_PASSWORD= •••secrethas default
LANGFUSE_REDIS_PASSWORD= •••secrethas default
LANGFUSE_MINIO_USER= replace-with-random-access-keyvaluehas default
LANGFUSE_MINIO_PASSWORD= •••secrethas default
LANGFUSE_SALT= replace-with-long-random-valuevaluehas default
LANGFUSE_ENCRYPTION_KEY= replace-with-64-character-hex-valuevaluehas default
LANGFUSE_NEXTAUTH_SECRET= •••secrethas default
LANGFUSE_INIT_ORG_ID= oshunvaluehas default
LANGFUSE_INIT_ORG_NAME= Oshunvaluehas default
LANGFUSE_INIT_PROJECT_ID= ai-platformvaluehas default
LANGFUSE_INIT_PROJECT_NAME= AI Platformvaluehas default
LANGFUSE_INIT_PROJECT_PUBLIC_KEYvaluesupply to activate
LANGFUSE_INIT_PROJECT_SECRET_KEY= •••secretsupply to activate

Service · infra/themis/music-shield (21)#

THEMIS_SHIELD_IMAGE= ghcr.io/greychimp/oshun/themis-shieldimagehas default
THEMIS_SHIELD_IMAGE_TAG= localvaluehas default
THEMIS_SHIELD_API_PORT= 8080porthas default
THEMIS_SHIELD_API_KEYS= •••secrethas default
THEMIS_SHIELD_ASYNC_SCANS= truetogglehas default
THEMIS_SHIELD_QUEUE_NAME= themis.shield.scanvaluehas default
THEMIS_SHIELD_RATE_LIMIT_MAX= 600valuehas default
THEMIS_SHIELD_RATE_LIMIT_WINDOW_MS= 60000timinghas default
THEMIS_SHIELD_WORKER_CONCURRENCY= 2valuehas default
THEMIS_REFERENCE_DB_USER= themis_shieldvaluehas default
THEMIS_REFERENCE_DB_PASSWORD= •••secrethas default
THEMIS_REFERENCE_DB_NAME= themis_shieldvaluehas default
THEMIS_REFERENCE_DB_PORT= 55432porthas default
THEMIS_REDIS_PORT= 56379porthas default
THEMIS_REDIS_MAXMEMORY= 512mbvaluehas default
THEMIS_QDRANT_HTTP_PORT= 6335porthas default
THEMIS_QDRANT_GRPC_PORT= 6336porthas default
THEMIS_PROMETHEUS_PORT= 9090porthas default
THEMIS_GRAFANA_PORT= 3000porthas default
THEMIS_GRAFANA_ADMIN_USER= adminvaluehas default
THEMIS_GRAFANA_ADMIN_PASSWORD= •••secrethas default

Service · infra/yemaya/gateway (17)#

DOMAIN= yemaya.iovaluehas default
Domain configuration
TRAEFIK_DASHBOARD_USER= adminvaluehas default
Traefik Dashboard credentials Generate password hash: htpasswd -nb admin yourpassword | sed -e s/\\$/\\$\\$/g
TRAEFIK_DASHBOARD_PASSWORD_HASH= •••secrethas default
API_SERVICE_URL= http://api:3000endpointhas default
Service URLs (internal Docker network)
AUTH_SERVICE_URL= http://auth:3001endpointhas default
WS_SERVICE_URL= http://websocket:3002endpointhas default
CDN_SERVICE_URL= http://minio:9000endpointhas default
TLS_MIN_VERSION= 1.2valuehas default
TLS Configuration
TLS_MAX_VERSION= 1.3valuehas default
RATE_LIMIT_AVERAGE= 100valuehas default
Rate Limiting
RATE_LIMIT_BURST= 200valuehas default
RATE_LIMIT_AUTH_AVERAGE= 60valuehas default
ACCESS_LOG_ENABLED= truetogglehas default
METRICS_ENABLED= truetogglehas default
Metrics
PROMETHEUS_ENTRYPOINT= metricsvaluehas default
TRACING_ENABLED= falsetogglehas default
Tracing (optional)
JAEGER_AGENT_HOST= jaegerendpointhas default

Service · libs/aglaea (31)#

AGLAEA_DATABASE_URL= postgresql://oshun:oshun_dev@localhost:5432/aglaeaendpointhas default
Database
AGLAEA_REDIS_URL= redis://localhost:6379/5endpointhas default
Redis (caching, sessions, rate limiting)
AGLAEA_S3_ENDPOINT= http://localhost:9000endpointhas default
S3 / MinIO (image storage for analysis uploads, wardrobe photos, try-on renders)
AGLAEA_S3_ACCESS_KEY= •••secrethas default
AGLAEA_S3_SECRET_KEY= •••secrethas default
AGLAEA_S3_BUCKET= aglaea-imagesvaluehas default
AGLAEA_S3_REGION= us-east-1valuehas default
AGLAEA_AI_ENDPOINT= http://localhost:8080endpointhas default
AI Model Inference
AGLAEA_AI_API_KEY= •••secretsupply to activate
AGLAEA_SKIN_MODEL_ENDPOINT= http://localhost:8081modelhas default
Skin Analysis Model
AGLAEA_SKIN_MODEL_VERSION= v2modelhas default
AGLAEA_BODY_MODEL_ENDPOINT= http://localhost:8082modelhas default
Body Analysis Model
AGLAEA_BODY_MODEL_VERSION= v1modelhas default
AGLAEA_TRYON_ENDPOINT= http://localhost:8083endpointhas default
Virtual Try-On Renderer
AGLAEA_TRYON_GPU_ENABLED= falsetogglehas default
AGLAEA_TREND_DATA_DIR= ./data/trendsvaluehas default
Trend Forecasting Data Sources
AGLAEA_TREND_REFRESH_INTERVAL_HOURS= 24timinghas default
AGLAEA_API_PORT= 4034porthas default
API Server
AGLAEA_API_HOST= 0.0.0.0endpointhas default
AGLAEA_API_CORS_ORIGINS= http://localhost:3000,http://localhost:4200valuehas default
AGLAEA_LOG_LEVEL= infovaluehas default
Logging
AGLAEA_LOG_FORMAT= jsonvaluehas default
AGLAEA_ENABLE_VIRTUAL_TRYON= truetogglehas default
Feature Flags
AGLAEA_ENABLE_FRAGRANCE_AI= truetogglehas default
AGLAEA_ENABLE_GENERATIVE_DESIGN= falsetogglehas default
AGLAEA_ENABLE_SMART_MIRROR= falsetogglehas default
AGLAEA_RATE_LIMIT_ANALYSIS_PER_MINUTE= 30valuehas default
Rate Limiting
AGLAEA_RATE_LIMIT_RECOMMENDATION_PER_MINUTE= 60valuehas default
AGLAEA_RATE_LIMIT_TRYON_PER_MINUTE= 10valuehas default
AGLAEA_WEATHER_API_KEY= •••secretsupply to activate
External Integrations (optional)
AGLAEA_RETAILER_API_BASE_URLendpointsupply to activate

Service · libs/isis/database (1)#

ISIS_DATABASE_URL= postgresql://postgres:postgres@localhost:5432/isisendpointhas default