This document is the canonical environment-variable reference for the Portal
repo and the cross-repo bridge contract with atl.chat.
Use apps/portal/.env.example as your starting point.
DATABASE_URLBETTER_AUTH_SECRETBETTER_AUTH_URL
BRIDGE_SERVICE_TOKEN(must equalatl.chatBRIDGE_PORTAL_TOKEN)
DISCORD_CLIENT_IDDISCORD_CLIENT_SECRETDISCORD_BOT_TOKENNEXT_PUBLIC_DISCORD_GUILD_IDIRC_SERVERIRC_PORTIRC_ATHEME_JSONRPC_URLIRC_ATHEME_INSECURE_SKIP_VERIFYIRC_ATHEME_OPER_ACCOUNTIRC_ATHEME_OPER_PASSWORDIRC_UNREAL_JSONRPC_URLIRC_UNREAL_RPC_USERIRC_UNREAL_RPC_PASSWORDIRC_UNREAL_INSECURE_SKIP_VERIFYXMPP_DOMAINPROSODY_REST_URLPROSODY_REST_TOKENMAILCOW_API_URLMAILCOW_API_KEYMAILCOW_DOMAINMAILCOW_OAUTH_CLIENT_IDMAILCOW_OAUTH_CLIENT_SECRETNEXT_PUBLIC_MAILCOW_WEB_URLNEXT_PUBLIC_MAILCOW_OAUTH_ENABLEDWIKI_API_URLWIKI_BOT_USERNAMEWIKI_BOT_PASSWORD
SENTRY_DSNGITHUB_TOKENNEXT_PUBLIC_DEV_TOOLS_ENABLED
atl.chat uses an explicit layered model:
.envfor shared baseline values..env.devfor local development overrides..env.prodfor production overrides.
Execution entrypoints:
just dev=>scripts/init.sh dev+ compose with.envand.env.devjust prod=>scripts/init.sh prod+ compose with.envand.env.prod
No runtime behavior depends on ATL_ENVIRONMENT.
Cross-repo bridge auth requires the same secret under different names:
- Portal:
BRIDGE_SERVICE_TOKEN - atl.chat:
BRIDGE_PORTAL_TOKEN
The bridge no longer accepts these aliases:
BRIDGE_PORTAL_URLBRIDGE_PORTAL_API_TOKEN