Environment variables
Configuration for the Happier Server.
This page is the runtime environment-variable reference for apps/server.
Notes:
- Legacy aliases prefixed with
HAPPY_are still accepted where listed, butHAPPIER_is preferred. - Billing/subscription provider secrets are intentionally not documented on this page.
Getting started: required vs recommended
The server has many environment variables because it supports multiple storage/auth/networking topologies. Most deployments only need a small subset.
Required for most production deployments
HANDY_MASTER_SECRETRequired forapps/serverto protect server-managed secrets. Use a long random value and keep it stable across restarts.DATABASE_URL(full flavor / external DB) Required whenHAPPIER_DB_PROVIDER=postgres|mysql.HAPPIER_DB_PROVIDERPick your DB backend (postgresis the default in.env.example).- File storage settings for your chosen backend:
HAPPIER_FILES_BACKEND=local: no extra required env, orHAPPIER_FILES_BACKEND=s3: requiresS3_*credentials +S3_PUBLIC_URL
Strongly recommended (prevents pairing / mobile URL confusion)
HAPPIER_PUBLIC_SERVER_URLCanonical/share server URL embedded in QR codes/deep links and advertised viaGET /v1/features. This should be the URL your phone can reach (ideallyhttps://...).HAPPIER_WEBAPP_URL(when self-hosting the web UI, or for OAuth return-to) Base URL for the web client and OAuth redirects. Optional if you use the hosted web app athttps://app.happier.dev.
Recommended when behind a reverse proxy
HAPPIER_SERVER_TRUST_PROXY=1for typical single-proxy setups (Caddy/Nginx/Traefik), so the server can safely useX-Forwarded-*forrequest.ipand protocol detection.
Nice-to-have
- API rate limits:
HAPPIER_API_RATE_LIMITS_*(recommended baseline is included below) - Metrics:
METRICS_*
Canonical template
Use /apps/server/.env.example as the canonical template.
Typical workflow:
cp apps/server/.env.example apps/server/.envThen:
- local/dev: load values from
apps/server/.env, - Docker/Compose/platforms: copy the same key/value set into your deployment env/secret manager.
Core runtime
PORT(default3005)HAPPIER_SERVER_HOST(alias:HAPPY_SERVER_HOST, default0.0.0.0)NODE_ENVSERVER_ROLE(all|api|worker, defaultall)HANDY_MASTER_SECRET(required unless auto-generated in light flavor)DATABASE_URL(required for full flavor; optional for light)HAPPIER_DB_PROVIDER(alias:HAPPY_DB_PROVIDER) Values:postgres|mysql|pglite|sqliteHAPPIER_FILES_BACKEND(alias:HAPPY_FILES_BACKEND) Values:s3|localHAPPIER_SOCKET_ADAPTER(alias:HAPPY_SOCKET_ADAPTER) Values:memory|redis-streamsHAPPIER_SOCKET_REDIS_ADAPTER(alias:HAPPY_SOCKET_REDIS_ADAPTER) Legacy boolean toggle; preferHAPPIER_SOCKET_ADAPTER=redis-streamsREDIS_URL(required when Redis adapter is enabled)HAPPIER_INSTANCE_ID(alias:HAPPY_INSTANCE_ID) Stable process identifier for logs/cluster behaviorMETRICS_ENABLED(defaulttrue)METRICS_PORT(default9090)
Networking / reverse proxy
HAPPIER_SERVER_TRUST_PROXY(optional) Controls whether the server trustsX-Forwarded-*headers for client IP / protocol when running behind a reverse proxy.- unset: use framework defaults (do not trust forwarded headers)
true: trust all proxy hops (only safe if the server is not directly reachable)false: never trust forwarded headers<number>: trust the last N hops (0is equivalent tofalse; recommended for typical single-proxy setups:1)
Canonical URLs (QR/deep links, recommended)
HAPPIER_PUBLIC_SERVER_URLCanonical/share URL for your server. Clients embed this in terminal-connect deep links and QR codes, and the server advertises it viaGET /v1/featuresundercapabilities.server.canonicalServerUrl.- Use the URL that works from your phone (prefer
https://...). - If you intentionally run LAN-only, using
http://<lan-ip>:3005is fine, but QR/deep links will only work on the same LAN/VPN. - If this is unset, or if the active server URL resolves to loopback-only (
localhost,127.0.0.1,::1,*.localhost), Happier may intentionally omit the server URL from mobile-oriented QR/deep links instead of embedding a broken address.
- Use the URL that works from your phone (prefer
HAPPIER_WEBAPP_URL(alias:HAPPY_WEBAPP_URL) Base URL for the web client. The server advertises it viaGET /v1/featuresundercapabilities.server.webappUrl.- For the hosted web app: keep default
https://app.happier.dev. - For self-hosted UI: set this to your UI origin (often the same as
HAPPIER_PUBLIC_SERVER_URL).
- For the hosted web app: keep default
User impact:
- Add your phone
- Restore account
- CLI/mobile auth QR links
- configure-server links
all work best when the embedded server URL is reachable from the target phone/device.
If users see a hint telling them to configure the phone’s server manually, that usually means the current server URL is loopback-only and cannot safely be shared cross-device.
Tailscale Serve inference (optional)
If HAPPIER_PUBLIC_SERVER_URL is unset and the server is exposed via tailscale serve, the server can best-effort infer the https://<machine>.<tailnet>.ts.net URL at boot.
HAPPIER_TAILSCALE_INFER_PUBLIC_URL(defaulttrue) Set to0to disable inference.HAPPIER_TAILSCALE_BIN(defaulttailscale) Override the tailscale binary path/name.HAPPIER_TAILSCALE_SERVE_STATUS_TIMEOUT_MS(default750) Timeout fortailscale serve statusprobing (bounded to1..10000).
API rate limits
Rate limiting is implemented via @fastify/rate-limit. Each *_WINDOW value accepts human-readable durations like 30 seconds, 1 minute, 5 minutes.
For hot endpoints, the server resolves per-route limits from a centralized catalog. Env var names follow a consistent pattern:
HAPPIER_<ID>_RATE_LIMIT_MAXHAPPIER_<ID>_RATE_LIMIT_WINDOW
Where <ID> is the uppercase snake-case id (for example account.profile → ACCOUNT_PROFILE, session.messages.byLocalId → SESSION_MESSAGES_BY_LOCAL_ID).
Global controls:
HAPPIER_API_RATE_LIMITS_ENABLED(defaulttrue) Set to0/falseto disable all API rate limits.HAPPIER_API_RATE_LIMITS_GLOBAL_MAX(default0) Optional global limit applied to all routes. Set to0to disable.HAPPIER_API_RATE_LIMITS_GLOBAL_WINDOW(default1 minute)HAPPIER_API_RATE_LIMITS_GLOBAL_KEY_STRATEGY(defaultip-only) Controls how the global rate limit is keyed:ip-only: key byrequest.ip(recommended storm shield)user-or-ip: key by verified user id when a valid Bearer token is present, otherwise fall back to IP
HAPPIER_API_RATE_LIMITS_ROUTE_KEY_STRATEGY(defaultuser-or-ip) Controls how authenticated hot endpoints are keyed (public endpoints remain IP-keyed):user-or-ip: key by verified user id when a valid Bearer token is present, otherwise fall back to IPip-only: key byrequest.ip(coherent but can throttle shared IPs/NAT)
IP notes:
- All IP-based keying uses Fastify’s
request.ip. - Behind a reverse proxy, configure
HAPPIER_SERVER_TRUST_PROXYsorequest.ipreflects the real client address.
Recommended baseline:
- Enable a global “storm shield” in production by setting:
HAPPIER_API_RATE_LIMITS_GLOBAL_MAX=3000HAPPIER_API_RATE_LIMITS_GLOBAL_WINDOW=1 minuteHAPPIER_API_RATE_LIMITS_GLOBAL_KEY_STRATEGY=ip-only
- Keep route keying as:
HAPPIER_API_RATE_LIMITS_ROUTE_KEY_STRATEGY=user-or-ip
If you have many users behind a shared NAT/VPN egress IP, increase HAPPIER_API_RATE_LIMITS_GLOBAL_MAX to avoid throttling legitimate traffic.
Hot endpoints (set *_MAX=0 to disable a specific limit):
HAPPIER_SESSION_MESSAGES_RATE_LIMIT_MAX(default600)HAPPIER_SESSION_MESSAGES_RATE_LIMIT_WINDOW(default1 minute)HAPPIER_SESSION_MESSAGES_BY_LOCAL_ID_RATE_LIMIT_MAX(default600)HAPPIER_SESSION_MESSAGES_BY_LOCAL_ID_RATE_LIMIT_WINDOW(default1 minute)HAPPIER_SESSIONS_LIST_RATE_LIMIT_MAX(default300)HAPPIER_SESSIONS_LIST_RATE_LIMIT_WINDOW(default1 minute)HAPPIER_CHANGES_RATE_LIMIT_MAX(default600)HAPPIER_CHANGES_RATE_LIMIT_WINDOW(default1 minute)HAPPIER_FEATURES_RATE_LIMIT_MAX(default120)HAPPIER_FEATURES_RATE_LIMIT_WINDOW(default1 minute)HAPPIER_MACHINES_RATE_LIMIT_MAX(default300)HAPPIER_MACHINES_RATE_LIMIT_WINDOW(default1 minute)HAPPIER_ARTIFACTS_RATE_LIMIT_MAX(default300)HAPPIER_ARTIFACTS_RATE_LIMIT_WINDOW(default1 minute)HAPPIER_FEED_RATE_LIMIT_MAX(default300)HAPPIER_FEED_RATE_LIMIT_WINDOW(default1 minute)HAPPIER_KV_LIST_RATE_LIMIT_MAX(default600)HAPPIER_KV_LIST_RATE_LIMIT_WINDOW(default1 minute)HAPPIER_ACCOUNT_PROFILE_RATE_LIMIT_MAX(default300)HAPPIER_ACCOUNT_PROFILE_RATE_LIMIT_WINDOW(default1 minute)HAPPIER_ACCOUNT_SETTINGS_RATE_LIMIT_MAX(default300)HAPPIER_ACCOUNT_SETTINGS_RATE_LIMIT_WINDOW(default1 minute)HAPPIER_SESSION_PENDING_RATE_LIMIT_MAX(default600)HAPPIER_SESSION_PENDING_RATE_LIMIT_WINDOW(default1 minute)HAPPIER_SESSION_PENDING_MATERIALIZE_RATE_LIMIT_MAX(default120)HAPPIER_SESSION_PENDING_MATERIALIZE_RATE_LIMIT_WINDOW(default1 minute)HAPPIER_DIAGNOSTICS_BUG_REPORT_SNAPSHOT_RATE_LIMIT_MAX(default30)HAPPIER_DIAGNOSTICS_BUG_REPORT_SNAPSHOT_RATE_LIMIT_WINDOW(default1 minute)HAPPIER_VOICE_TOKEN_RATE_LIMIT_MAX(default10)HAPPIER_VOICE_TOKEN_RATE_LIMIT_WINDOW(default1 minute)HAPPIER_VOICE_SESSION_COMPLETE_RATE_LIMIT_MAX(default60)HAPPIER_VOICE_SESSION_COMPLETE_RATE_LIMIT_WINDOW(default1 minute)HAPPIER_OAUTH_EXTERNAL_AUTH_PARAMS_RATE_LIMIT_MAX(default60)HAPPIER_OAUTH_EXTERNAL_AUTH_PARAMS_RATE_LIMIT_WINDOW(default1 minute)HAPPIER_OAUTH_EXTERNAL_CONNECT_PARAMS_RATE_LIMIT_MAX(default60)HAPPIER_OAUTH_EXTERNAL_CONNECT_PARAMS_RATE_LIMIT_WINDOW(default1 minute)HAPPIER_OAUTH_EXTERNAL_CALLBACK_RATE_LIMIT_MAX(default60)HAPPIER_OAUTH_EXTERNAL_CALLBACK_RATE_LIMIT_WINDOW(default1 minute)HAPPIER_SHARE_PUBLIC_READ_RATE_LIMIT_MAX(default10)HAPPIER_SHARE_PUBLIC_READ_RATE_LIMIT_WINDOW(default1 minute)HAPPIER_SHARE_PUBLIC_MESSAGES_RATE_LIMIT_MAX(default20)HAPPIER_SHARE_PUBLIC_MESSAGES_RATE_LIMIT_WINDOW(default1 minute)HAPPIER_SHARE_PUBLIC_MANAGE_RATE_LIMIT_MAX(default10)HAPPIER_SHARE_PUBLIC_MANAGE_RATE_LIMIT_WINDOW(default1 minute)HAPPIER_SHARE_SESSION_CREATE_RATE_LIMIT_MAX(default20)HAPPIER_SHARE_SESSION_CREATE_RATE_LIMIT_WINDOW(default1 minute)
Storage backends
S3_HOSTS3_PORT(optional)S3_USE_SSL(true/false, defaulttrue)S3_BUCKETS3_PUBLIC_URLS3_ACCESS_KEYS3_SECRET_KEY
Light flavor paths
HAPPIER_SERVER_LIGHT_DATA_DIR(alias:HAPPY_SERVER_LIGHT_DATA_DIR)HAPPIER_SERVER_LIGHT_DB_DIR(alias:HAPPY_SERVER_LIGHT_DB_DIR)HAPPIER_SERVER_LIGHT_FILES_DIR(alias:HAPPY_SERVER_LIGHT_FILES_DIR)PUBLIC_URL(optional; used for light defaults)
Bug reports
HAPPIER_FEATURE_BUG_REPORTS__ENABLED(default1)HAPPIER_FEATURE_BUG_REPORTS__PROVIDER_URL(defaulthttps://reports.happier.dev)HAPPIER_FEATURE_BUG_REPORTS__DEFAULT_INCLUDE_DIAGNOSTICS(default1)HAPPIER_FEATURE_BUG_REPORTS__MAX_ARTIFACT_BYTES(default10485760)HAPPIER_FEATURE_BUG_REPORTS__UPLOAD_TIMEOUT_MS(default120000)HAPPIER_FEATURE_BUG_REPORTS__CONTEXT_WINDOW_MS(default1800000; min1000, max86400000)HAPPIER_FEATURE_BUG_REPORTS__ACCEPTED_ARTIFACT_KINDS(CSV allowlist)
Server diagnostics snapshot controls
HAPPIER_BUG_REPORTS_SERVER_DIAGNOSTICS_ENABLED(default0)HAPPIER_BUG_REPORTS_SERVER_DIAGNOSTICS_ACCESS_MODE(defaultowner, allowed:authenticated,owner)HAPPIER_SERVER_OWNER_USER_IDS(CSV user ids; used when access mode isowner)HAPPIER_BUG_REPORTS_SERVER_LOG_PATHHAPPIER_SELF_HOST_LOG_DIR(fallback directory forserver.log)HAPPIER_BUG_REPORTS_SERVER_LOG_MAX_BYTES(default262144)HAPPIER_DIAGNOSTICS_BUG_REPORT_SNAPSHOT_RATE_LIMIT_MAX(default30)HAPPIER_DIAGNOSTICS_BUG_REPORT_SNAPSHOT_RATE_LIMIT_WINDOW(default1 minute)
Owner-id note:
HAPPIER_SERVER_OWNER_USER_IDSexpects Happier account ids.- Owners can find their account id in the app under Settings → Account.
OAuth and auth
For policy behavior and examples, see Server Auth.
Global auth policy
AUTH_ANONYMOUS_SIGNUP_ENABLEDAUTH_SIGNUP_PROVIDERS(CSV)AUTH_REQUIRED_LOGIN_PROVIDERS(CSV)AUTH_OFFBOARDING_ENABLEDAUTH_OFFBOARDING_INTERVAL_SECONDSAUTH_OFFBOARDING_STRICTHAPPIER_FEATURE_AUTH_RECOVERY__PROVIDER_RESET_ENABLEDHAPPIER_FEATURE_AUTH_UI__AUTO_REDIRECT_ENABLEDHAPPIER_FEATURE_AUTH_UI__AUTO_REDIRECT_PROVIDER_IDHAPPIER_FEATURE_AUTH_UI__RECOVERY_KEY_REMINDER_ENABLEDAUTH_PROVIDERS_CONFIG_PATHAUTH_PROVIDERS_CONFIG_JSONAUTH_ACCOUNT_DISABLED_TTL_SECONDS
Legacy aliases (still accepted):
AUTH_RECOVERY_PROVIDER_RESET_ENABLEDAUTH_UI_AUTO_REDIRECTAUTH_UI_AUTO_REDIRECT_PROVIDER_IDAUTH_UI_RECOVERY_KEY_REMINDER_ENABLED
Built-in key-challenge login route
Happier’s default “device-key” signup/login flow uses POST /v1/auth.
Server operators can disable this built-in login route (for example when all access should go through a provider like GitHub/OIDC).
HAPPIER_FEATURE_AUTH_LOGIN__KEY_CHALLENGE_ENABLED(default1)
Note: if you disable the key-challenge route, ensure you have at least one viable provider configured (otherwise the server will fail fast at boot to prevent lockouts).
Keyless OAuth login (optional)
Happier can use OAuth providers (GitHub/OIDC) as keyless login methods, meaning accounts can exist without device keys (intended for enterprise + plaintext storage deployments).
Keyless OAuth is gated by feature env vars:
HAPPIER_FEATURE_E2EE__KEYLESS_ACCOUNTS_ENABLED(default0)HAPPIER_FEATURE_AUTH_OAUTH__KEYLESS_ENABLED(default0)HAPPIER_FEATURE_AUTH_OAUTH__KEYLESS_PROVIDERS(CSV allowlist of provider ids, e.g.github,okta)HAPPIER_FEATURE_AUTH_OAUTH__KEYLESS_AUTO_PROVISION(default0)
Notes:
HAPPIER_FEATURE_AUTH_OAUTH__KEYLESS_AUTO_PROVISION=1controls whether new keyless accounts can be created on first login.- Keyless auto-provisioning requires keyless accounts + plaintext defaults to be enabled (see Server Auth for the current prerequisites).
GitHub OAuth
GITHUB_CLIENT_IDGITHUB_CLIENT_SECRETGITHUB_REDIRECT_URL(legacy alias:GITHUB_REDIRECT_URI)GITHUB_HTTP_TIMEOUT_SECONDSGITHUB_STORE_ACCESS_TOKENGITHUB_WEBHOOK_SECRETGITHUB_APP_IDGITHUB_PRIVATE_KEYGITHUB_OAUTH_PENDING_TTL_SECONDS(legacy fallback for pending TTL)HAPPIER_WEBAPP_URL(alias:HAPPY_WEBAPP_URL)HAPPIER_WEBAPP_OAUTH_RETURN_URL_BASE(alias:HAPPY_WEBAPP_OAUTH_RETURN_URL_BASE)HAPPIER_OAUTH_RETURN_ALLOWED_SCHEMES(alias:HAPPY_OAUTH_RETURN_ALLOWED_SCHEMES)OAUTH_PENDING_TTL_SECONDSOAUTH_STATE_TTL_SECONDS
Note on “optional” web app URL env vars:
HAPPIER_WEBAPP_URL/HAPPIER_WEBAPP_OAUTH_RETURN_URL_BASEare only “optional” if you are using the hosted client athttps://app.happier.dev.- If you are self-hosting the web app, or using a local dev web UI, you must set one of these so the server can redirect back to your client after OAuth.
mTLS auth (enterprise)
For full setup guidance, see Server → mTLS Auth.
HAPPIER_FEATURE_AUTH_MTLS__ENABLED(default0)HAPPIER_FEATURE_AUTH_MTLS__MODE(forwarded|direct)HAPPIER_FEATURE_AUTH_MTLS__AUTO_PROVISION(default0)HAPPIER_FEATURE_AUTH_MTLS__IDENTITY_SOURCE(san_email|san_upn|subject_cn|fingerprint)HAPPIER_FEATURE_AUTH_MTLS__ALLOWED_EMAIL_DOMAINS(CSV)HAPPIER_FEATURE_AUTH_MTLS__ALLOWED_ISSUERS(CSV; comma/newline separated issuer values; compared against the issuer CN extracted from the forwarded issuer string)HAPPIER_FEATURE_AUTH_MTLS__TRUST_FORWARDED_HEADERS(default0)HAPPIER_FEATURE_AUTH_MTLS__FORWARDED_EMAIL_HEADERHAPPIER_FEATURE_AUTH_MTLS__FORWARDED_UPN_HEADERHAPPIER_FEATURE_AUTH_MTLS__FORWARDED_SUBJECT_HEADERHAPPIER_FEATURE_AUTH_MTLS__FORWARDED_FINGERPRINT_HEADERHAPPIER_FEATURE_AUTH_MTLS__FORWARDED_ISSUER_HEADERHAPPIER_FEATURE_AUTH_MTLS__RETURN_TO_ALLOW_PREFIXES(CSV)HAPPIER_FEATURE_AUTH_MTLS__CLAIM_TTL_SECONDS
GitHub eligibility restrictions
AUTH_GITHUB_ALLOWED_USERSAUTH_GITHUB_ALLOWED_ORGSAUTH_GITHUB_ORG_MATCHAUTH_GITHUB_ORG_MEMBERSHIP_SOURCEAUTH_GITHUB_APP_IDAUTH_GITHUB_APP_PRIVATE_KEYAUTH_GITHUB_APP_INSTALLATION_ID_BY_ORG
Account / terminal auth TTL controls
ACCOUNT_AUTH_REQUEST_TTL_SECONDSTERMINAL_AUTH_REQUEST_TTL_SECONDSTERMINAL_AUTH_CLAIM_RETRY_WINDOW_SECONDSVENDOR_TOKEN_MAX_LEN
Encryption / plaintext storage (E2EE opt-out)
For an overview and operator guidance, see Server → Encryption & plaintext storage.
Server-wide storage policy:
HAPPIER_FEATURE_ENCRYPTION__STORAGE_POLICY(defaultrequired_e2ee) Values:required_e2ee|optional|plaintext_only
Account-level opt-out (only meaningful when policy is optional):
HAPPIER_FEATURE_ENCRYPTION__ALLOW_ACCOUNT_OPTOUT(default0)HAPPIER_FEATURE_ENCRYPTION__DEFAULT_ACCOUNT_MODE(defaulte2ee) Values:e2ee|plain
Plaintext at-rest sealing (plaintext/keyless accounts only; DB storage):
HAPPIER_FEATURE_ENCRYPTION__PLAIN_ACCOUNT_SETTINGS_AT_REST(defaultserver_sealed) Values:none|server_sealedHAPPIER_FEATURE_ENCRYPTION__PLAIN_ACCOUNT_CREDENTIALS_AT_REST(defaultserver_sealed) Values:none|server_sealed
Friends / social
HAPPIER_FEATURE_SOCIAL_FRIENDS__ENABLEDHAPPIER_FEATURE_SOCIAL_FRIENDS__ALLOW_USERNAMEHAPPIER_FEATURE_SOCIAL_FRIENDS__IDENTITY_PROVIDERFRIENDS_USERNAME_MIN_LENFRIENDS_USERNAME_MAX_LENFRIENDS_USERNAME_REGEX
Voice
Happier voice/server tokening controls:
HAPPIER_FEATURE_VOICE__ENABLEDHAPPIER_FEATURE_VOICE__REQUIRE_SUBSCRIPTIONVOICE_FREE_SESSIONS_PER_MONTHVOICE_FREE_MINUTES_PER_MONTHVOICE_MAX_CONCURRENT_SESSIONSVOICE_MAX_SESSION_SECONDSVOICE_MAX_MINUTES_PER_DAYHAPPIER_VOICE_TOKEN_RATE_LIMIT_MAXHAPPIER_VOICE_TOKEN_RATE_LIMIT_WINDOWHAPPIER_VOICE_SESSION_COMPLETE_RATE_LIMIT_MAXHAPPIER_VOICE_SESSION_COMPLETE_RATE_LIMIT_WINDOWVOICE_LEASE_CLEANUPVOICE_LEASE_RETENTION_DAYSVOICE_LEASE_CLEANUP_INTERVAL_MSELEVENLABS_API_KEYELEVENLABS_AGENT_IDELEVENLABS_AGENT_ID_PROD
UI/static serving
HAPPIER_SERVER_UI_DIR(alias:HAPPIER_SERVER_LIGHT_UI_DIR)HAPPIER_SERVER_UI_PREFIX(alias:HAPPIER_SERVER_LIGHT_UI_PREFIX)HAPPIER_SERVER_UI_REQUIRED(alias:HAPPIER_SERVER_LIGHT_UI_REQUIRED)HAPPIER_SERVER_UI_DEBUG_PATH(debug fallback path visibility)
Background / maintenance jobs
HAPPY_ACCOUNT_CHANGE_CLEANUPHAPPY_ACCOUNT_CHANGE_CLEANUP_INTERVAL_MSHAPPY_PRESENCE_STREAM_MAXLEN
Advanced / debug controls
HAPPY_EXIT_ON_FATALHAPPY_SOCKET_ROOMS_ONLYHAPPIER_RPC_FORWARD_TIMEOUT_MSHAPPIER_RPC_FORWARD_CAPABILITIES_TIMEOUT_MSDANGEROUSLY_LOG_TO_SERVER_FOR_AI_AUTO_DEBUGGING
Flavor/internal markers
HAPPIER_SERVER_FLAVOR(alias:HAPPY_SERVER_FLAVOR) Runtime marker set by server startup; not typically user-set.