Skip to content

Configuration

Configure IdentityScribe through HOCON files, environment variables, or CLI flags. This guide covers all configuration mechanisms with practical deployment examples.

Quick Reference: See reference.conf for inline documentation of all settings with their environment variable overrides.

Identity Scribe uses HOCON (Human-Optimized Config Object Notation) for configuration. Values are resolved in this order (highest priority first):

PrioritySourceExample
1CLI flags-r, --readonly, --config /path/to/config
2System properties-Dreadonly=true, -DSCRIBE_LDAP_URL=ldap://...
3SCRIBE_* env varsSCRIBE_LDAP_URL, SCRIBE_DATABASE_PASSWORD
4Standard env varsOTEL_*, POSTGRES_* (where supported)
5Config fileValues in identity-scribe.conf
6DefaultsBuilt-in fallbacks in reference.conf
identity-scribe.conf
ldap {
url = "ldap://your-ldap-server:389"
bind-dn = "cn=admin,dc=example,dc=com"
bind-password = "secret"
}
database {
url = "postgresql://localhost:5432/identity_scribe"
user = "scribe"
password = "secret"
}
services:
identity-scribe:
image: identity-scribe:latest
environment:
SCRIBE_LDAP_URL: "ldap://ldap:389"
SCRIBE_LDAP_BIND_DN: "cn=admin,dc=example,dc=com"
SCRIBE_LDAP_BIND_PASSWORD: "${LDAP_ADMIN_PASSWORD}"
SCRIBE_DATABASE_URL: "postgresql://postgres:5432/identity_scribe"
SCRIBE_DATABASE_USER: "scribe"
SCRIBE_DATABASE_PASSWORD: "${DB_PASSWORD}"
SCRIBE_HTTP_PORT: "8080"
SCRIBE_LOG_LEVEL: "info"
apiVersion: v1
kind: ConfigMap
metadata:
name: identity-scribe-config
data:
SCRIBE_LDAP_URL: "ldap://ldap-service:389"
SCRIBE_DATABASE_URL: "postgresql://postgres-service:5432/identity_scribe"
SCRIBE_HTTP_PORT: "8080"
SCRIBE_LOG_LEVEL: "info"
SCRIBE_CONCURRENCY: "16"
---
apiVersion: v1
kind: Secret
metadata:
name: identity-scribe-secrets
type: Opaque
stringData:
SCRIBE_LDAP_BIND_DN: "cn=admin,dc=example,dc=com"
SCRIBE_LDAP_BIND_PASSWORD: "secret"
SCRIBE_DATABASE_USER: "scribe"
SCRIBE_DATABASE_PASSWORD: "secret"
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: identity-scribe
spec:
template:
spec:
containers:
- name: identity-scribe
envFrom:
- configMapRef:
name: identity-scribe-config
- secretRef:
name: identity-scribe-secrets

Environment variables generally follow the config path with dots converted to underscores. Some frequently-tuned settings use shorter aliases (notably SCRIBE_HINTS_* and SCRIBE_PROMETHEUS_*):

Config path: monitoring.hints.persistence.enabled
Env var: SCRIBE_HINTS_PERSISTENCE_ENABLED
TypeExamples
Booleanstrue, false, yes, no, on, off
Durations500ms, 5s, 30m, 1h, 2d
Sizes1k, 2m, 3g (bytes)
NumbersPlain integers (no quotes)
StringsQuoted "value" or unquoted simple-value
CLI FlagEnvironment VariableConfig PathDefaultDescription
-m, --modeSCRIBE_APP_MODEapp.modeproductionApplication mode: dev, development, local, test (dev), or other (prod)

The application mode controls AUTO feature toggles:

  • Dev modes (case-insensitive): dev, development, local, test
  • Prod modes: Everything else (e.g., production, staging, uat)

Lookup order (highest to lowest):

  1. CLI: -m <mode> or --mode <mode>
  2. System property: -Dmode=<mode> or -Dapp.mode=<mode>
  3. SCRIBE_APP_MODE environment variable
  4. APP_MODE environment variable (Node.js-style fallback)
  5. APP_ENV environment variable (Node.js-style fallback)
  6. app.mode config value
  7. Fallback: production
Environment VariableConfig PathDefaultDescription
SCRIBE_LOG_LEVELlog.levelinfoGlobal log level: trace, debug, info, warn, error, off
SCRIBE_LOG_FILElog.filestdoutLog output destination

Component-specific log levels (inherit from log.level by default):

Environment VariableConfig PathPurpose
SCRIBE_LOG_SUPERVISORlog.SuperVisorStartup/shutdown, orchestration, infrastructure
SCRIBE_LOG_INGESTlog.IngestTranscription pipeline, event store operations
SCRIBE_LOG_MONITORINGlog.MonitoringWide-log output, observability, channels
SCRIBE_LOG_LICENSElog.LicenseLicense verification
SCRIBE_LOG_CONFIGlog.ConfigConfiguration parsing and validation

Set SCRIBE_LOG_MONITORING=off to disable wide-log output entirely, or SCRIBE_LOG_MONITORING=warn to only emit warnings and errors.

Third-party library log levels (default: warn):

Environment VariableConfig PathLibrary
SCRIBE_LOG_KENOXAlog."com.kenoxa"Kenoxa internal loggers
SCRIBE_LOG_HIKARIlog."com.zaxxer.hikari"HikariCP connection pool
SCRIBE_LOG_FLYWAYlog."org.flywaydb"Flyway database migrations
SCRIBE_LOG_JOSE4Jlog."org.jose4j"JOSE4J JWT/JWK library
SCRIBE_LOG_HELIDONlog."io.helidon"Helidon webserver

Log format options (SLF4J SimpleLogger):

Log formatting is controlled by SLF4J SimpleLogger, which reads format options only once at JVM startup. These settings must be configured via JVM system properties—they cannot be changed at runtime via environment variables or config files.

JVM PropertyDefaultDescription
-Dorg.slf4j.simpleLogger.showDateTimefalseShow timestamp
-Dorg.slf4j.simpleLogger.dateTimeFormatmillisSimpleDateFormat pattern (e.g., HH:mm:ss.SSS)
-Dorg.slf4j.simpleLogger.showThreadNametrueShow thread name in output
-Dorg.slf4j.simpleLogger.showShortLogNamefalseUse short logger names
-Dorg.slf4j.simpleLogger.levelInBracketsfalseWrap level in brackets (e.g., [INFO])

Example: Enable timestamps with local time format:

Terminal window
java -Dorg.slf4j.simpleLogger.showDateTime=true \
-Dorg.slf4j.simpleLogger.dateTimeFormat=HH:mm:ss.SSS \
-jar identity-scribe.jar

Or via JAVA_TOOL_OPTIONS environment variable:

Terminal window
export JAVA_TOOL_OPTIONS="-Dorg.slf4j.simpleLogger.showDateTime=true -Dorg.slf4j.simpleLogger.dateTimeFormat=HH:mm:ss.SSS"
java -jar identity-scribe.jar

Leak Detection (HikariCP-style):

Environment VariableConfig PathDefaultDescription
SCRIBE_LOG_LEAK_DETECTIONmonitoring.log.leak-detection.modeautoLeak detection: off, on, auto
SCRIBE_LOG_LEAK_DETECTION_THRESHOLDmonitoring.log.leak-detection.threshold90sThreshold for leak warnings

When enabled, segments open longer than the threshold trigger a warning with the creation stack trace. This helps identify resource leaks during development.

  • off: Never run leak detection
  • on: Always run leak detection
  • auto: Enabled when app.mode is dev/development/local/test; disabled otherwise
Environment VariableConfig PathDefaultDescription
SCRIBE_CONCURRENCYconcurrencyCPU cores × 2.5Thread pool size
SCRIBE_DATABASE_MAX_POOL_SIZEdatabase.max-pool-sizeconcurrency + 5Batch connection pool size
SCRIBE_DATABASE_SYSTEM_POOL_SIZEdatabase.system-pool-sizeAutoSystem operations pool size
SCRIBE_DATABASE_CHANNEL_POOL_SIZEdatabase.channel-pool-sizeconcurrency / 2LDAP channel pool size
Environment VariableConfig PathDefaultDescription
SCRIBE_LDAP_URLldap.urlldap://localhostLDAP server URL(s)
SCRIBE_LDAP_BIND_DNldap.bind-dn(none)Bind DN for authentication
SCRIBE_LDAP_BIND_PASSWORDldap.bind-password(none)Bind password
Environment VariableConfig PathDefaultDescription
SCRIBE_LDAP_MAX_SIZE_LIMITldap.maxSizeLimit5000Max entries per search
SCRIBE_LDAP_PAGE_SIZEldap.pageSizeconcurrency × 8Sync search page size
Environment VariableConfig PathDefaultDescription
SCRIBE_LDAP_SO_KEEPALIVEldap.useKeepAlivetrueTCP keepalive
SCRIBE_LDAP_TCP_NODELAYldap.useTCPNoDelaytrueDisable Nagle algorithm
SCRIBE_LDAP_SO_TIMEOUTldap.soTimeout0Socket timeout (ms)
SCRIBE_LDAP_TCP_KEEPIDLEldap.tcpKeepidle120Keepalive idle time (s)
SCRIBE_LDAP_TCP_KEEPINTERVALldap.tcpKeepinterval30Keepalive interval (s)
SCRIBE_LDAP_TCP_KEEPCOUNTldap.tcpKeepcount10Keepalive probe count
Environment VariableConfig PathDefaultDescription
SCRIBE_DATABASE_URLdatabase.url(none)PostgreSQL connection URL
SCRIBE_DATABASE_USERdatabase.user(none)Database user
SCRIBE_DATABASE_PASSWORDdatabase.password(none)Database password
SCRIBE_DATABASE_QUERY_HTTP_ACQUISITION_TIMEOUTdatabase.queryHttpAcquisitionTimeout5sHTTP query timeout

Session-level PostgreSQL parameters applied to channel queries. Channels can override these in their own connection-hints section.

Environment VariableConfig PathDefaultDescription
SCRIBE_DATABASE_STATEMENT_TIMEOUTdatabase.connection-hints.statement-timeout(unset)Query statement timeout
SCRIBE_DATABASE_LOCK_TIMEOUTdatabase.connection-hints.lock-timeout(unset)Lock acquisition timeout
SCRIBE_DATABASE_WORK_MEMdatabase.connection-hints.work-mem(unset)Per-query memory (e.g., 256MB)
SCRIBE_DATABASE_SESSION_FLAGSdatabase.connection-hints.session-flags(unset)Session flags: force-custom-plan, jit-off

Note: work-mem values are validated against a strict allowlist (^[0-9]+\s*(B|kB|MB|GB|TB)$).

Environment VariableConfig PathDefaultDescription
SCRIBE_READONLYreadonlyfalseRead-only mode
SCRIBE_HINTS_ENABLEDmonitoring.hints.enabledtrueHint engine
SCRIBE_LDAP_RECONCILIATION_ENABLEDldap.reconciliation.enabledtrueReconciliation task
SCRIBE_PROMETHEUS_ENABLEDmonitoring.prometheus.enabledtruePrometheus metrics
Environment VariableConfig PathDefaultDescription
SCRIBE_HINTS_ENABLEDmonitoring.hints.enabledtrueEnable hint collection
SCRIBE_HINTS_CACHE_TTLmonitoring.hints.cache.ttl1 hourSignature cache TTL
SCRIBE_HINTS_CACHE_SIZEmonitoring.hints.cache.size500Signature cache max entries
SCRIBE_HINTS_EXPLAIN_ENABLEDmonitoring.hints.explain.enabledtrueEXPLAIN sampling
SCRIBE_HINTS_EXPLAIN_SAMPLE_EVERYmonitoring.hints.explain.sampleEvery1000Re-EXPLAIN interval
SCRIBE_HINTS_EXPLAIN_SLOW_QUERY_DURATIONmonitoring.hints.explain.slowQueryDuration1000msSlow query threshold
SCRIBE_HINTS_PERSISTENCE_ENABLEDmonitoring.hints.persistence.enabledfalsePersist hints to DB
SCRIBE_HINTS_PERSISTENCE_TTLmonitoring.hints.persistence.ttl7 daysPersisted hints TTL
SCRIBE_HINTS_PERSISTENCE_MAX_ROWSmonitoring.hints.persistence.maxRows50000Max persisted hints
SCRIBE_HINTS_PERSISTENCE_MAX_QUEUEmonitoring.hints.persistence.maxQueue5000Memory queue size
SCRIBE_HINTS_PERSISTENCE_BATCH_SIZEmonitoring.hints.persistence.batchSize100DB insert batch size
SCRIBE_HINTS_PERSISTENCE_BATCH_INTERVALmonitoring.hints.persistence.batchInterval5sBatch flush interval
Environment VariableConfig PathDefaultDescription
SCRIBE_HTTP_PORThttp.port8080HTTP server port
SCRIBE_HTTP_HOSThttp.hostautoBind address (auto, localhost, 0.0.0.0)

See HTTP Server Configuration for socket binding, TLS, and named sockets.

Environment VariableConfig PathDefaultDescription
SCRIBE_MONITORING_SOCKETmonitoring.socket@defaultSocket for monitoring endpoints
SCRIBE_PROMETHEUS_ENABLEDmonitoring.prometheus.enabledtrueEnable Prometheus /metrics
SCRIBE_PROMETHEUS_SCRAPE_INTERVALmonitoring.prometheus.scrapeInterval30sInternal /metrics scrape interval
Environment VariableConfig PathDefaultDescription
SCRIBE_TELEMETRY_ENABLEDmonitoring.telemetry.enabledtrueEnable OTel SDK
SCRIBE_TELEMETRY_TRACES_ENABLEDmonitoring.telemetry.traces.enabledfalseEnable trace export
SCRIBE_TELEMETRY_TRACES_ENDPOINTmonitoring.telemetry.traces.endpointlocalhost:4317OTLP traces endpoint
SCRIBE_TELEMETRY_METRICS_ENABLEDmonitoring.telemetry.metrics.enabledfalseEnable OTLP metrics push
SCRIBE_TELEMETRY_METRICS_ENDPOINTmonitoring.telemetry.metrics.endpointlocalhost:4317OTLP metrics endpoint
SCRIBE_TELEMETRY_SERVICE_NAMEmonitoring.telemetry.resource.serviceNameidentity-scribeOTel service name

These standard environment variables control terminal behavior. They are not SCRIBE_-prefixed as they follow cross-platform conventions.

Environment VariableDefaultDescription
NO_COLOR(unset)Disable ANSI colors when set to any non-empty value (no-color.org)
FORCE_COLOR(unset)Force colors on (1, true) or off (0, false) — overrides all other detection
CI(unset)Detected as CI environment when true; bypass CI detection with false
TERM(unset)Terminal type; dumb disables colors

Color support is auto-detected based on TTY presence and CI environment (GitHub Actions, GitLab CI, CircleCI, Travis, Buildkite, Jenkins). See HTTP Server for details.

If you’re upgrading from a version that used IDENTITY_SCRIBE_* environment variables, rename them to SCRIBE_*:

Old VariableNew Variable
IDENTITY_SCRIBE_READONLYSCRIBE_READONLY
IDENTITY_SCRIBE_CONFIG_FILESCRIBE_CONFIG_FILE
IDENTITY_SCRIBE_LDAP_SO_KEEPALIVESCRIBE_LDAP_SO_KEEPALIVE
IDENTITY_SCRIBE_LDAP_TCP_NODELAYSCRIBE_LDAP_TCP_NODELAY
IDENTITY_SCRIBE_LDAP_SO_TIMEOUTSCRIBE_LDAP_SO_TIMEOUT
IDENTITY_SCRIBE_LDAP_TCP_KEEPIDLESCRIBE_LDAP_TCP_KEEPIDLE
IDENTITY_SCRIBE_LDAP_TCP_KEEPINTERVALSCRIBE_LDAP_TCP_KEEPINTERVAL
IDENTITY_SCRIBE_LDAP_TCP_KEEPCOUNTSCRIBE_LDAP_TCP_KEEPCOUNT
IDENTITY_SCRIBE_TELEMETRY_ENABLEDSCRIBE_TELEMETRY_ENABLED
IDENTITY_SCRIBE_TELEMETRY_TRACES_ENABLEDSCRIBE_TELEMETRY_TRACES_ENABLED
Terminal window
# For shell scripts or .env files
sed -i 's/IDENTITY_SCRIBE_/SCRIBE_/g' .env
# For Kubernetes ConfigMaps/Secrets (backup first!)
kubectl get configmap identity-scribe-config -o yaml | \
sed 's/IDENTITY_SCRIBE_/SCRIBE_/g' | \
kubectl apply -f -

After migration, verify the resolved configuration:

Terminal window
identity-scribe --printconfig

This shows all resolved values with sources, helping identify any misconfigured variables.

  1. Check priority: A higher-priority source may be overriding your value
  2. Verify naming: Ensure underscores match dots in the config path
  3. Case sensitivity: Environment variables are case-insensitive for lookup
Terminal window
# Print resolved config (sensitive values masked)
identity-scribe --printconfig
# Enable debug logging for Settings
SCRIBE_LOG_LEVEL=debug identity-scribe
SymptomCauseSolution
Env var ignoredWrong prefixUse SCRIBE_ not IDENTITY_SCRIBE_
Value not parsedWrong formatUse HOCON format: 5s, true, 1024
Config file not foundWrong search pathUse --config or SCRIBE_CONFIG_FILE

HOCON supports a built-in mechanism for overriding any config key via environment variables:

Terminal window
# Enable with system property
identity-scribe -Dconfig.override_with_env_vars=true
# Override any key using CONFIG_FORCE_*
# Name mangling: _ → . (dot), __ → - (hyphen), ___ → _ (underscore)
CONFIG_FORCE_ldap_url=ldap://override # → ldap.url
CONFIG_FORCE_ldap_use__keep__alive=true # → ldap.use-keep-alive

This is orthogonal to SCRIBE_* variables and can override keys without explicit ${?...} substitution.