# OpenVibe.Design — environment (production: /etc/openvibe/design.env). Names only; never commit values. NODE_ENV=production PORT=5090 HOST=127.0.0.1 BASE_URL=https://openvibe.design TRUST_PROXY=2 # OpenVibe.Network: the theme API this service proxies, sign-in (OAuth client `design`, PKCE S256) and its JWKS. OV_NETWORK_INTERNAL_URL=http://127.0.0.1:4000 OV_OAUTH_CLIENT_ID=design OV_OAUTH_CLIENT_SECRET= # The browser is sent to the public origin; the token exchange and the JWKS use the internal one above. # OV_NETWORK_URL=https://openvibe.network # OV_NETWORK_ISSUER=https://openvibe.network # OV_OAUTH_REDIRECT_URI=https://openvibe.design/auth/callback # OV_SESSION_AUDIENCE=openvibe.network # Optional: the public catalogue's in-process cache (default 5 minutes), the Network timeout, the per-IP limit. # DESIGN_THEME_CACHE_MS=300000 # DESIGN_UPSTREAM_TIMEOUT_MS=8000 # DESIGN_RATE_LIMIT_PER_MIN=120 # optional: defaults to true in production # COOKIE_SECURE=true # The Arena's PostgreSQL (ADR-035): DATABASE_URL serves (PgBouncer), DATABASE_DIRECT_URL migrates (owner role). # In development without DATABASE_URL an embedded PGlite database in data/pglite is used. DATABASE_URL= DATABASE_DIRECT_URL= # DESIGN_PGLITE_DIR= # OpenVibe.AI: the generate operation, called as Design with a client-credentials token. # Network grants scope ai.run.create (audience openvibe.ai, namespace ai.generate). OV_AI_INTERNAL_URL=http://127.0.0.1:4700 # DESIGN_AI_AUDIENCE=openvibe.ai # DESIGN_AI_SCOPE=ai.run.create # DESIGN_AI_WAIT_MS=55000 # DESIGN_AI_TIMEOUT_MS=120000 # DESIGN_AI_POLL_MS=1500 # OpenVibe.Exchange's icon reference search (the Exchange platform API, served by OpenVibe.AI): Design mints its own # client-credentials token (audience openvibe.ai, scope exchange.search.icons), so no Exchange key is needed. # EXCHANGE_SEARCH_KEY is the owner's override; Iconify is the fallback when neither answers. # EXCHANGE_API_URL=https://api.openvibe.exchange # DESIGN_EXCHANGE_AUDIENCE=openvibe.ai # DESIGN_EXCHANGE_SCOPE=exchange.search.icons # DESIGN_EXCHANGE_TIMEOUT_MS=5000 # EXCHANGE_SEARCH_KEY= # Three explicit provider:model slots; unset pins AI's generate-route offers (fewer than three falls back to its pool). # DESIGN_ARENA_MODELS=shared:gpt-5-mini,local:qwen2.5 # OpenVibe.Billing: the person's Balance for the create estimate, read with their own token. A missing # service leaves the Balance unknown, never zero. OV_BILLING_INTERNAL_URL=http://127.0.0.1:4600 # DESIGN_BILLING_TIMEOUT_MS=3000 # OpenVibe.Media: a starting picture is uploaded there and named by its id; this is the public file origin. # OV_MEDIA_PUBLIC_ORIGIN=https://openvibe.media # OpenVibe.Bench owns new Arena rounds, entries, votes and boards. OV_BENCH_INTERNAL_URL=http://127.0.0.1:5230 # OV_BENCH_URL=https://bench.openvibe.services # DESIGN_BENCH_AUDIENCE=openvibe.bench # DESIGN_BENCH_SCOPE=bench.task.create bench.round.create bench.round.read bench.judgement.cast bench.entry.create bench.board.read # Design Studio part B: AI edits allowed per design (each accepted chat edit is one paid AI run). # DESIGN_CHAT_EDITS_PER_DESIGN=5 # Legacy Arena settings retained for compatibility; Bench enforces active round limits and runs generation. # DESIGN_ARENA_PER_DAY=3 # DESIGN_ARENA_DAILY=20 # DESIGN_ARENA_JOB_INTERVAL_MS=1500 # The drill flag controls other Design background work. # DESIGN_DRILL=0 # OpenVibe.Events → this service for ADR-033 account export/deletion; unset turns the route off (503). # DESIGN_EVENTS_SECRET= # DESIGN_EVENTS_URL= # DESIGN_EVENTS_ENDPOINT= # Drawing an icon without signing in (plan L50 step 5): caps a day per guest, per address and for all guests. DESIGN_GLYPH_GUEST_PER_DAY=2 DESIGN_GLYPH_GUEST_PER_ADDRESS=4 DESIGN_GLYPH_GUEST_DAILY=25 # Cloudflare Turnstile on the guest form: on only when both are set (the site key is public, the secret is not). DESIGN_TURNSTILE_SITE_KEY= DESIGN_TURNSTILE_SECRET= # Publishing tokens (D11 owner settings): the admin panel's design.publishing namespace wins; this is # the fallback when no value was entered there. #FIGMA_TOKEN=