Skip to content

Checking access...

Environment Variables ​

NOTE (2026-04-09): PERSONA_API_KEY references below are outdated — Persona was disqualified as KYC provider. New provider: Didit. Environment variables will be updated when Didit integration is built.

NOTE (2026-04-11): VITE_AUTH_SERVICE_CANISTER_ID references below are deprecated. The auth-service canister was decommissioned on 2026-04-11 (AUTH-005.1). Authentication has migrated to PostgreSQL sessions in oracle-bridge. Suites validate sessions via HTTP cookies to oracle-bridge — no canister env var needed. Existing VITE_AUTH_SERVICE_CANISTER_ID entries are unused and will be removed in a future cleanup.

This document lists all environment variables used across the Hello World DAO LLC platform.

Frontend (React + Vite) ​

Located in frontend/app/www/:

  • .env - Base configuration
  • .env.local - Local overrides (gitignored)
  • .env.staging - Staging environment
  • .env.production - Production environment

Canister Configuration ​

VariableDescriptionExample
VITE_USER_SERVICE_CANISTER_IDUser service canister principalj4rvr-3aaaa-aaaao-qkvfq-cai
VITE_AUTH_SERVICE_CANISTER_IDDEPRECATED 2026-04-11 — auth-service decommissioned (AUTH-005.1). Sessions handled by oracle-bridge.(unused)
VITE_INTERNET_IDENTITY_CANISTER_IDInternet Identity canisterrdmx6-jaaaa-aaaaa-aaadq-cai
VITE_NETWORKTarget network (local | ic)ic

OAuth Configuration ​

VariableDescriptionWhere to Get
VITE_GOOGLE_CLIENT_IDGoogle OAuth client IDGoogle Cloud Console
VITE_GITHUB_CLIENT_IDGitHub OAuth client IDGitHub Developer Settings
VITE_GITHUB_CLIENT_SECRETGitHub OAuth client secretGitHub Developer Settings

Security Notes:

  • Client IDs are safe to expose (public)
  • Client Secrets in VITE_ variables are bundled into the app
  • Rotate credentials every 90 days
  • Use different credentials per environment

Oracle Bridge ​

VariableDescriptionDefault
VITE_ORACLE_BRIDGE_URLOracle bridge service URLhttp://localhost:8787
VITE_ORACLE_BRIDGE_API_TOKENAPI authentication token(empty for local)

Environment Values:

EnvironmentURL
Localhttp://localhost:8787
Staginghttps://staging-oracle.helloworlddao.com
Productionhttps://oracle.helloworlddao.com

Analytics ​

VariableDescriptionDefault
VITE_POSTHOG_API_KEYPostHog project key-
VITE_POSTHOG_API_HOSTPostHog API hosthttps://us.i.posthog.com

Cross-App Navigation (FOS-1.2.7) ​

VariableDescriptionDefault
VITE_THINK_TANK_URLURL for "Open Think Tank" navigationhttp://127.0.0.1:5174

Environment Values:

EnvironmentThink Tank URL
Localhttp://127.0.0.1:5174
Staginghttps://staging-think-tank.helloworlddao.com (TBD)
Productionhttps://think-tank.helloworlddao.com (TBD)

UI Configuration ​

VariableDescriptionOptions
VITE_DESIGN_VARIANTTheme variantsunrise, sunset, ocean, forest

Example .env.local ​

bash
# Local Development
VITE_USER_SERVICE_CANISTER_ID=uxrrr-q7777-77774-qaaaq-cai
VITE_AUTH_SERVICE_CANISTER_ID=lqy7q-dh777-77777-aaaaq-cai
VITE_INTERNET_IDENTITY_CANISTER_ID=rdmx6-jaaaa-aaaaa-aaadq-cai
VITE_NETWORK=local
VITE_ORACLE_BRIDGE_URL=http://localhost:8787
VITE_DESIGN_VARIANT=sunrise

think-tank-suite (React + Vite) ​

The productivity suite application (think-tank-suite/) shares authentication with the other DAO suites via cookie-based sessions issued by oracle-bridge.

Located in think-tank-suite/:

  • .env.local.example - Template with documentation
  • .env.local - Local overrides (gitignored)

Canister Configuration ​

VariableDescriptionExample
VITE_IC_HOSTIC replica URLhttp://127.0.0.1:4943
VITE_FOUNDERY_OS_CORE_CANISTER_IDProductivity data canisteruxrrr-q7777-77774-qaaaq-cai
VITE_ORACLE_BRIDGE_URLOracle bridge session APIhttp://localhost:8787

Cross-App Navigation (FOS-1.2.7) ​

VariableDescriptionDefault
VITE_DAO_FRONTEND_URLURL for "Back to DAO" navigationhttp://127.0.0.1:5173

Environment Values:

EnvironmentDAO Frontend URL
Localhttp://127.0.0.1:5173
Staginghttps://staging.helloworlddao.com
Productionhttps://www.helloworlddao.com

Example .env.local ​

bash
# Local Development
VITE_IC_HOST=http://127.0.0.1:4943
VITE_FOUNDERY_OS_CORE_CANISTER_ID=your-canister-id-here
VITE_ORACLE_BRIDGE_URL=http://localhost:8787
VITE_DAO_FRONTEND_URL=http://127.0.0.1:5173

Shared Authentication ​

think-tank-suite uses the same oracle-bridge session API as every other suite (cookie-based, PostgreSQL-backed). When users authenticate:

  1. Login credentials are POSTed to oracle-bridge /api/auth/login
  2. oracle-bridge validates against PostgreSQL and sets an HttpOnly session cookie scoped to .helloworlddao.com (production) or per-origin (local dev)
  3. ProtectedRoute validates the cookie via /api/auth/session on every navigation
  4. Expired sessions trigger a redirect to the login flow

Important (local dev): Cookie sharing across suites only works in production where every suite is on a *.helloworlddao.com subdomain. For local dev (different 127.0.0.1:port origins), users must log in to each application separately — same credentials, independent sessions.

Oracle Bridge (Node.js) ​

Located in oracle-bridge/:

  • .env.example - Template with documentation
  • .env - Actual configuration (gitignored)

Server Configuration ​

VariableDescriptionDefault
NODE_ENVEnvironment modeproduction
PORTHTTP server port8787

SMTP Configuration (Email) ​

VariableDescriptionExample
SMTP_HOSTSMTP server host127.0.0.1
SMTP_PORTSMTP server port1025
SMTP_USERSMTP usernameemail@domain.com
SMTP_PASSSMTP password(Proton Bridge password)
SMTP_FROM_NOREPLYNo-reply sender addressnoreply@domain.com
SMTP_FROM_CONTACTContact sender addresscontact@domain.com

Security Configuration ​

VariableDescriptionNotes
SIGNING_PRIVATE_KEY_BASE64Ed25519 signing keyBase64 encoded
API_KEYAPI authentication keyGenerate securely
CANISTER_PUBLIC_KEYSCanister signature verificationJSON map

Canister Public Keys Format:

json
{
  "rrkah-fqaaa-aaaaa-aaaaq-cai": "Ylx8BF+FVY7nZxE8TN3nPvLF8NJCz3qPxNBBmVMj2g0=",
  "user-service-id": "pubkey2",
  "membership-id": "pubkey3"
}

External API Keys ​

VariableDescriptionService
PERSONA_API_KEYKYC verificationPersona
COMPLYADVANTAGE_API_KEYAML screeningComplyAdvantage
CIRCLE_API_KEYPayment processingCircle

Rate Limiting ​

VariableDescriptionDefault
TEMP_KEY_RATE_LIMITMax temp key requests per 24h5

Recommended Values:

EnvironmentValue
Local/Dev100
Staging10
Production5

Example .env ​

bash
# Server
NODE_ENV=production
PORT=8787

# SMTP (Proton Mail Bridge)
SMTP_HOST=127.0.0.1
SMTP_PORT=1025
SMTP_USER=email@helloworlddao.com
SMTP_PASS=bridge-password-here
SMTP_FROM_NOREPLY=noreply@helloworlddao.com
SMTP_FROM_CONTACT=contact@helloworlddao.com

# Security
SIGNING_PRIVATE_KEY_BASE64=your-base64-private-key
API_KEY=your-secure-api-key

# Canister Auth
CANISTER_PUBLIC_KEYS={"user-service-id":"pubkey1"}

# External APIs
PERSONA_API_KEY=persona_live_xxx
COMPLYADVANTAGE_API_KEY=xxx
CIRCLE_API_KEY=xxx

# Rate Limiting
TEMP_KEY_RATE_LIMIT=5

notification-service (Node.js) ​

Located in notification-service/:

  • .env.example - Template with documentation
  • .env - Actual configuration (gitignored)

Port: 3100. Cluster: AX42-U founderyos namespace (k3s). Repo: Hello-World-Co-Op/notification-service.

Server Configuration ​

VariableDescriptionDefault
NODE_ENVEnvironment modeproduction
PORTHTTP server port3100
SERVICE_TOKENBearer token required by callers (validated by Traefik ForwardAuth in production)(set per env)

Resend (Email Provider) ​

VariableDescriptionNotes
RESEND_API_KEYResend API key — see ~/.config/cloudflare/... style memory entryWithout this, the service runs in stub mode — requests succeed but no real email is sent. Useful for local dev + CI.
RESEND_FROM_HWDAODAO sender addressnoreply@notifications.helloworlddao.com
RESEND_FROM_FOSFOS sender addressnoreply@notifications.founderyos.dev

Example .env ​

bash
NODE_ENV=development
PORT=3100
SERVICE_TOKEN=local-dev-token
# Leave RESEND_API_KEY unset for stub mode (no real email sent)

payment-gateway (Node.js) ​

Located in payment-gateway/:

  • .env.example - Template with documentation
  • .env - Actual configuration (gitignored)

Port: 3200. Cluster: AX42-U platform namespace (k3s). DB: Neon PostgreSQL (own project — not shared with oracle-bridge). Repo: Hello-World-Co-Op/payment-gateway.

Server Configuration ​

VariableDescriptionDefault
NODE_ENVEnvironment modeproduction
PORTHTTP server port3200
SERVICE_TOKENBearer token required by callers (validated by Traefik ForwardAuth in production)(set per env)
DATABASE_URLNeon Postgres connection string(set per env)

Provider Keys (filled in per PLATFORM-007 stories) ​

VariableDescriptionStory
STRIPE_SECRET_KEYStripe API keyPLATFORM-007.2
STRIPE_CONNECT_CLIENT_IDStripe Connect application IDPLATFORM-007.6
STRIPE_WEBHOOK_SECRETStripe webhook signing secretPLATFORM-007.2
ICP_LEDGER_CANISTER_IDICP/DOM ledger canisterPLATFORM-007.7

Tests run with no env vars (npm test). npm run dev requires SERVICE_TOKEN + DATABASE_URL.

Example .env ​

bash
NODE_ENV=development
PORT=3200
SERVICE_TOKEN=local-dev-token
DATABASE_URL=postgresql://user:pass@ep-...neon.tech/payment_gateway
# Provider keys per-story — see PLATFORM-007

GitHub Actions Secrets ​

Configure these in repository Settings → Secrets and variables → Actions:

Deployment Secrets ​

SecretDescriptionUsed By
DFX_IDENTITY_PEMdfx identity private keyAll canister deploys
DFX_IDENTITY_PRINCIPALdfx identity principalDeployment workflows
CYCLES_WALLET_IDCycles wallet canister IDCycles top-up

OAuth Secrets ​

SecretDescriptionFrontend Name
OAUTH_GOOGLE_CLIENT_IDGoogle OAuth IDVITE_GOOGLE_CLIENT_ID
OAUTH_GITHUB_CLIENT_IDGitHub OAuth IDVITE_GITHUB_CLIENT_ID
OAUTH_GITHUB_CLIENT_SECRETGitHub OAuth secretVITE_GITHUB_CLIENT_SECRET

Note: GitHub doesn't allow secrets starting with GITHUB_, so OAuth secrets use OAUTH_ prefix.

Oracle Bridge Secrets ​

SecretDescription
ORACLE_SIGNING_KEYEd25519 private key (base64)
ORACLE_API_KEYAPI authentication key
PERSONA_API_KEYPersona KYC API key

Analytics Secrets ​

SecretDescription
POSTHOG_API_KEYPostHog project key

dfx Configuration ​

Network settings are in ops-infra/dfx.networks.json:

json
{
  "local": {
    "bind": "127.0.0.1:4943",
    "type": "ephemeral"
  },
  "testnet": {
    "providers": ["https://ic0.app"]
  },
  "mainnet": {
    "providers": ["https://ic0.app"]
  }
}

Most canister repos symlink to this shared config.

Local Development Setup ​

1. Suite Setup (per suite) ​

bash
cd <repo-root>/<suite-name>     # e.g. dao-suite, marketing-suite, ...

# Copy example files
cp .env.example .env
cp .env.local.example .env.local

# Edit with your local canister IDs
nano .env.local

2. Oracle Bridge Setup ​

bash
cd <repo-root>/oracle-bridge

# Copy example file
cp .env.example .env

# Configure for local development
nano .env

Minimum local config:

bash
NODE_ENV=development
PORT=8787
TEMP_KEY_RATE_LIMIT=100
# Leave other fields empty for local dev

3. notification-service Setup (optional for local dev) ​

bash
cd <repo-root>/notification-service
cp .env.example .env
# Stub mode is fine — leave RESEND_API_KEY unset
npm install && npm run dev    # http://localhost:3100

4. payment-gateway Setup (optional for local dev) ​

bash
cd <repo-root>/payment-gateway
cp .env.example .env
# Set SERVICE_TOKEN + DATABASE_URL (Neon Postgres) to run dev mode
npm install && npm run dev    # http://localhost:3200

5. Get Local Canister IDs ​

After deploying canisters locally:

bash
# Get user-service canister ID
cd <repo-root>/user-service
dfx canister id user_service --network local

# Get membership canister ID
cd <repo-root>/membership
dfx canister id membership --network local

# Get foundery-os-core canister ID (when available)
cd <repo-root>/foundery-os-core
dfx canister id foundery_os_core --network local

Update each suite's .env.local files with these IDs.

Environment-Specific Values ​

Local Development ​

bash
VITE_NETWORK=local
VITE_ORACLE_BRIDGE_URL=http://localhost:8787
TEMP_KEY_RATE_LIMIT=100

Staging ​

bash
VITE_NETWORK=ic
VITE_ORACLE_BRIDGE_URL=https://staging-oracle.helloworlddao.com
TEMP_KEY_RATE_LIMIT=10

Production ​

bash
VITE_NETWORK=ic
VITE_ORACLE_BRIDGE_URL=https://oracle.helloworlddao.com
TEMP_KEY_RATE_LIMIT=5

Security Best Practices ​

  1. Never commit secrets - All .env files (except .example) are gitignored
  2. Use GitHub Secrets - Store production secrets in repository settings
  3. Rotate regularly - OAuth credentials every 90 days
  4. Environment separation - Different credentials per environment
  5. Minimal exposure - Only include secrets needed for each service

Troubleshooting ​

"Canister ID not found" ​

Ensure you've deployed canisters and updated .env.local:

bash
dfx canister id user_service --network local

"Network error" connecting to Oracle Bridge ​

  1. Verify oracle-bridge is running: npm run dev
  2. Check VITE_ORACLE_BRIDGE_URL matches the running port
  3. Ensure no firewall blocking localhost:8787

"OAuth login failed" ​

  1. Verify OAuth credentials in .env
  2. Check OAuth app redirect URIs match your development URL
  3. For GitHub, ensure correct scopes are configured

Hello World DAO