TapPass is configured entirely through environment variables. All variables are read with the TAPPASS_ prefix (Conjur uses CONJUR_; telemetry uses standard SENTRY_* / OTEL_* names).
Loading order: .tappass-secrets.env and .env in the working directory are auto-loaded at startup (secrets file first, neither overrides already-set variables). Every sensitive key also supports a Docker-secrets _FILE variant — e.g. TAPPASS_ADMIN_API_KEY_FILE=/run/secrets/tappass_admin_key reads the secret from that file. _FILE variants exist for TAPPASS_ADMIN_API_KEY, TAPPASS_JWT_SECRET, TAPPASS_VAULT_KEY, TAPPASS_VAULT_DEK, OPENAI_API_KEY, ANTHROPIC_API_KEY, DASHSCOPE_API_KEY, TAPPASS_SSO_GOOGLE_CLIENT_SECRET, TAPPASS_SSO_AZURE_CLIENT_SECRET, and POSTGRES_PASSWORD/REDIS_PASSWORD, among others.
| Variable |
Default |
Description |
TAPPASS_HOST |
0.0.0.0 |
Bind address for the FastAPI app |
TAPPASS_PORT |
9620 |
TCP port the gateway listens on |
TAPPASS_DEBUG |
false |
Verbose error responses. Never true in production — leaks stack traces |
TAPPASS_CORS_ORIGINS |
— |
Comma-separated CORS origins (read in api/main.py); * entries are stripped |
TAPPASS_DASHBOARD_HOSTS |
— |
Comma-separated dashboard host allowlist (*.eu.tappass.ai wildcards); empty = host scoping off |
TAPPASS_GATEWAY_HOSTS |
— |
Comma-separated gateway host allowlist; empty = off |
TAPPASS_HOST_SCOPE_ALLOW_LOCALHOST |
true |
Dev bypass for host-scoping middleware; set false in production |
TAPPASS_WORKSPACE_DOMAINS |
— |
Per-workspace URL routing: region=suffix,... (e.g. eu=eu.tappass.ai,us=us.tappass.ai) |
TAPPASS_PRODUCTION |
false |
Explicit production-mode flag; also auto-detected from TAPPASS_ENV=production |
TAPPASS_PUBLIC_URL / TAPPASS_BASE_URL |
http://localhost:9620 |
Public base URL used to build external links (invitation emails, connector OAuth callbacks, MCP connect URLs). Set this when self-hosting on a custom domain or those links won’t resolve |
TAPPASS_CAPTURE_IO |
1 |
Capture request/response bodies into the audit trail. Set 0 to record metadata only (stricter privacy) |
TAPPASS_GATEWAY_MODEL_TIMEOUT_SEC |
180 |
Timeout for upstream provider calls made by the gateway |
TAPPASS_RESEND_API_KEY / TAPPASS_RESEND_FROM_EMAIL |
— |
Email-provider key + from-address for outbound invitation emails; unset = email sending off |
| Variable |
Default |
Description |
TAPPASS_ADMIN_API_KEY |
— |
Admin API key. Empty = authentication disabled (dev only) |
TAPPASS_JWT_SECRET |
— |
JWT signing key for capability tokens. Empty = ephemeral per-process key (dev); must be ≥ 32 chars in production |
TAPPASS_JWT_ISSUER |
tappass |
JWT iss claim |
TAPPASS_SESSION_TTL_HOURS |
8 |
Login session lifetime |
TAPPASS_API_KEY_DEFAULT_TTL_DAYS |
90 |
Agent API key default lifetime; 0 = no expiry |
TAPPASS_LOCKOUT_THRESHOLD |
5 |
Failed logins before lockout fires |
TAPPASS_LOCKOUT_WINDOW_SECONDS |
300 |
Sliding window over which failures count |
TAPPASS_LOCKOUT_DURATION_SECONDS |
900 |
How long a locked account stays locked |
| Variable |
Default |
Description |
DATABASE_URL |
— |
Required. PostgreSQL DSN; boot refuses without it |
TAPPASS_DB_POOL_MIN_SIZE |
2 |
Min idle connections in the asyncpg pool |
TAPPASS_DB_POOL_MAX_SIZE |
10 |
Max connections in the asyncpg pool |
TAPPASS_DB_ASYNC_POOL_MIN_SIZE |
1 |
Min idle connections in the async (govern hot-path) pool |
TAPPASS_DB_ASYNC_POOL_MAX_SIZE |
5 |
Max connections in the async pool |
TAPPASS_DB_POOL_TIMEOUT_SECONDS |
30.0 |
Wait for a free pool connection before erroring |
TAPPASS_KV_URL |
— |
Redis URL (redis://…) for the shared KV store; unset = in-memory |
TAPPASS_RUN_MIGRATIONS_ON_BOOT |
off |
1/true/yes runs migrations at startup (advisory-locked); leave off in production |
TAPPASS_ALLOW_EPHEMERAL |
false |
Test-only escape hatch: boot without DATABASE_URL using in-memory stores. Never in production |
| Variable |
Default |
Description |
TAPPASS_VAULT_KEY |
— |
Master key for credential-vault encryption at rest. Empty = publicly known dev key |
TAPPASS_TOKEN_KEY_FILE |
— |
Path to the PEM used to sign capability tokens. Empty = ephemeral in-memory key |
TAPPASS_VAULT_KEY_KMS |
— |
KMS key URI for envelope encryption (checked before TAPPASS_VAULT_KEY) |
TAPPASS_VAULT_DEK |
— |
Base64 KMS-wrapped data-encryption key (AWS/GCP envelope mode) |
TAPPASS_SECRETS_BACKEND |
— |
External secrets backend name; conjur = CyberArk Conjur |
When Conjur is configured (CONJUR_APPLIANCE_URL set), sensitive fields are overlaid from the vault at startup. Conjur connection settings use the CONJUR_ prefix: CONJUR_APPLIANCE_URL, CONJUR_ACCOUNT (default), CONJUR_VARIABLE_PREFIX (tappass), CONJUR_CACHE_TTL (300), CONJUR_FAIL_CLOSED (false), plus authn-method variables (CONJUR_AUTHN_JWT_TOKEN, CONJUR_AUTHN_API_KEY, …).
Any LiteLLM provider/model string works (gpt-4o-mini, mistral/mistral-small-latest, ollama/llama3.1, azure/gpt-4o-mini, anthropic/claude-3-haiku-20240307, …).
| Variable |
Default |
Description |
TAPPASS_LLM_JUDGE_MODEL |
gpt-4o-mini |
Primary judge model |
TAPPASS_LLM_JUDGE_ENABLED |
true |
Master switch for the LLM judge |
TAPPASS_LLM_JUDGE_FALLBACK_MODEL |
— |
Fallback when the primary fails |
TAPPASS_OLLAMA_API_BASE |
http://localhost:11434 |
Base URL of the local Ollama server (only for ollama/* models) |
OPENAI_API_KEY / ANTHROPIC_API_KEY / DASHSCOPE_API_KEY |
— |
Provider credentials consumed by LiteLLM |
TAPPASS_EU_DATA_RESIDENCY |
false |
Restrict the judge to EU-hosted models (TAPPASS_EU_ALLOWED_JUDGE_MODELS) |
| Variable |
Default |
Description |
TAPPASS_DEFAULT_TOKEN_TTL_SECONDS |
60 |
Default token lifetime when the caller omits one |
TAPPASS_MAX_TOKEN_TTL_SECONDS |
300 |
Hard ceiling on token TTL; mint requests above this are rejected |
TAPPASS_DEFAULT_MAX_INVOCATIONS |
10 |
Default tool-invocation cap per token |
TAPPASS_MAX_INVOCATIONS_LIMIT |
100 |
Hard ceiling on per-token invocation counts |
| Variable |
Default |
Description |
TAPPASS_AUDIT_FILE |
data/audit.jsonl |
Path to the JSONL audit log |
TAPPASS_AUDIT_ROTATION_MAX_MB |
100 |
Rotate the audit file above this size |
TAPPASS_AUDIT_RETENTION_DAYS |
365 |
Auto-purge audit records older than this (GDPR storage limitation); 0 = forever |
TAPPASS_AUDIT_LOG_PARAMS |
false |
Include request params in audit records. Never true in production |
TAPPASS_AUDIT_SIGNING_KEY |
— |
Path to the audit signing key PEM; unset = auto-generated in TAPPASS_KEYS_DIR |
TAPPASS_AUDIT_KEY_PASSWORD |
— |
Encrypts the signing-key PEM at rest |
TAPPASS_KEYS_DIR |
keys |
Directory for auto-generated audit signing keys |
| Variable |
Default |
Description |
TAPPASS_SSO_PROVIDERS |
— |
Comma-separated active providers, e.g. google,azure. Empty = SSO off |
TAPPASS_SSO_REDIRECT_URI |
— |
OAuth redirect URI shared across providers |
TAPPASS_SSO_ALLOWED_DOMAINS |
— |
Comma-separated email-domain allowlist; empty = allow any |
TAPPASS_SSO_GOOGLE_CLIENT_ID / TAPPASS_SSO_GOOGLE_CLIENT_SECRET |
— |
Google OAuth client |
TAPPASS_SSO_AZURE_CLIENT_ID / TAPPASS_SSO_AZURE_CLIENT_SECRET |
— |
Azure AD application client |
TAPPASS_SSO_AZURE_TENANT_ID |
organizations |
Azure AD tenant; organizations for multi-tenant B2B |
TAPPASS_GOOGLE_CLIENT_IDS |
— |
Extra trusted Google audiences for /auth/google-token (e.g. a gcloud CLI client) |
TAPPASS_GOOGLE_TOKEN_ALLOW_ANY_AUDIENCE |
false |
Dev only — disables audience verification; production refuses to start |
| Variable |
Default |
Description |
TAPPASS_SAML_ENABLED |
false |
Master switch — enables /saml/acs + /saml/metadata |
TAPPASS_SAML_ENTITY_ID |
https://tappass.company.com/saml/metadata |
SP entity ID published in SAML metadata |
TAPPASS_SAML_ACS_URL |
http://localhost:9620/saml/acs |
Assertion Consumer Service URL |
TAPPASS_SAML_IDP_SSO_URL |
— |
IdP SSO endpoint |
TAPPASS_SAML_IDP_CERT |
— |
Base64 X.509 cert for IdP signature verification |
TAPPASS_SAML_IDP_METADATA_URL |
— |
IdP metadata URL (alternative to pinning the cert) |
TAPPASS_SAML_ALLOWED_DOMAINS |
— |
Email-domain allowlist for SAML sign-in |
TAPPASS_SAML_DEFAULT_ROLE |
user |
Role when no group→role mapping fires |
TAPPASS_SAML_WANT_ASSERTIONS_SIGNED |
true |
Require IdP-signed assertions (enforced in production) |
TAPPASS_SAML_WANT_RESPONSE_SIGNED |
true |
Require IdP-signed responses (enforced in production) |
TAPPASS_SAML_ROLE_MAPPING |
— |
Group→role mapping: group=role,group=role |
| Variable |
Default |
Description |
TAPPASS_SIEM_URL |
— |
SIEM endpoint; unset = export disabled |
TAPPASS_SIEM_DESTINATION |
webhook |
Destination type |
TAPPASS_SIEM_AUTH_TOKEN |
— |
Bearer token for the SIEM endpoint |
| Variable |
Default |
Description |
TAPPASS_ALERT_WEBHOOK_URL |
— |
Slack/Teams/generic webhook; unset = alerting disabled |
TAPPASS_ALERT_WEBHOOK_TYPE |
slack |
slack | teams | generic |
TAPPASS_ALERT_MIN_SEVERITY |
block |
block | detect | all |
| Variable |
Default |
Description |
TAPPASS_WEBAUTHN_RP_ID |
tappass.ai |
Relying-Party identifier — the eTLD+1 the browser sees; localhost for dev |
TAPPASS_WEBAUTHN_RP_NAME |
TapPass |
Display name on the credential-create prompt |
TAPPASS_WEBAUTHN_EXPECTED_ORIGIN |
https://app.tappass.ai |
Origin the WebAuthn assertion must match |
TAPPASS_WEBAUTHN_CHALLENGE_TTL_SECONDS |
300 |
Challenge validity window |
| Variable |
Default |
Description |
TAPPASS_RATE_LIMIT_ENABLED |
true |
Master switch; disable only for local testing |
TAPPASS_RATE_LIMIT_REQUESTS_PER_MINUTE |
600 |
Per-identity request budget |
TAPPASS_RATE_LIMIT_TOKENS_PER_MINUTE |
300 |
Per-agent /chat/completions budget |
TAPPASS_RATE_LIMIT_BURST |
100 |
Burst allowance over the per-minute rate |
TAPPASS_RATE_LIMIT_ORG_REQUESTS_PER_MINUTE |
3000 |
Aggregate per-org budget; 0 = disabled |
Defaults are sized for an agent doing real work (30–60 tool calls/min per Claude Code session); tighten per deployment once the agent footprint is known.
| Variable |
Default |
Description |
SENTRY_DSN |
— |
Error/trace reporting (unset = off) |
TAPPASS_ENABLE_DEV_TELEMETRY |
false |
In non-production, Sentry/PostHog also require this set to 1 (production auto-enables when the keys are present) |
SENTRY_TRACES_SAMPLE_RATE / SENTRY_PROFILES_SAMPLE_RATE |
0.2 / 0.1 |
Transaction sampling rates once SENTRY_DSN is set |
TAPPASS_SENTRY_PROFILE_SAMPLE_RATE |
0.0 |
Continuous-profiling session sample rate (0.0–1.0); recommend 0.1 on staging |
TAPPASS_POSTHOG_KEY |
— |
PostHog project token (phc_…); unset = off |
TAPPASS_POSTHOG_HOST |
https://eu.i.posthog.com |
PostHog ingestion host (EU cloud default) |
OTEL_EXPORTER_OTLP_ENDPOINT |
— |
OTLP/gRPC collector endpoint; setting it enables push export and tracing |
TAPPASS_OTLP_AUDIT_SPANS |
— |
Set (1/true) with an OTLP endpoint to export every governance decision as an OTel span; opt-in, off by default (see Observability) |
TAPPASS_ENV |
development |
deployment.environment resource attribute; production also triggers the production gate |
Served by GET /api/workspace/branding. Defaults are the canonical TapPass branding.
| Variable |
Default |
Description |
TAPPASS_BRAND_NAME |
TapPass |
Product name on login / sidebar |
TAPPASS_BRAND_TAGLINE |
AI Governance Platform |
Tagline under the brand name |
TAPPASS_BRAND_LOGO_URL |
/tappass-logo.svg |
Logo URL; empty = inline wordmark |
TAPPASS_BRAND_ACCENT |
#15803d |
Accent colour hex |
TAPPASS_BRAND_FOOTER |
— |
Static footer text (empty = live © {year} {brand_name}) |
| Variable |
Default |
Description |
TAPPASS_REGION |
— |
Short region code, e.g. eu-west |
TAPPASS_REGION_LABEL |
— |
Human-readable region name, e.g. EU Frankfurt |