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.conffor inline documentation of all settings with their environment variable overrides.
Configuration priority
Section titled “Configuration priority”Identity Scribe uses HOCON (Human-Optimized Config Object Notation) for configuration. Values are resolved in this order (highest priority first):
| Priority | Source | Example |
|---|---|---|
| 1 | CLI flags | -r, --readonly, --config /path/to/config |
| 2 | System properties | -Dreadonly=true, -DSCRIBE_LDAP_URL=ldap://... |
| 3 | SCRIBE_* env vars | SCRIBE_LDAP_URL, SCRIBE_DATABASE_PASSWORD |
| 4 | Standard env vars | OTEL_*, POSTGRES_* (where supported) |
| 5 | Config file | Values in identity-scribe.conf |
| 6 | Defaults | Built-in fallbacks in reference.conf |
Quick start
Section titled “Quick start”Minimal configuration
Section titled “Minimal configuration”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"}Docker Compose
Section titled “Docker Compose”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"Kubernetes
Section titled “Kubernetes”apiVersion: v1kind: ConfigMapmetadata: name: identity-scribe-configdata: 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: v1kind: Secretmetadata: name: identity-scribe-secretstype: OpaquestringData: 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/v1kind: Deploymentmetadata: name: identity-scribespec: template: spec: containers: - name: identity-scribe envFrom: - configMapRef: name: identity-scribe-config - secretRef: name: identity-scribe-secretsEnvironment variable reference
Section titled “Environment variable reference”Naming convention
Section titled “Naming convention”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.enabledEnv var: SCRIBE_HINTS_PERSISTENCE_ENABLEDValue formats
Section titled “Value formats”| Type | Examples |
|---|---|
| Booleans | true, false, yes, no, on, off |
| Durations | 500ms, 5s, 30m, 1h, 2d |
| Sizes | 1k, 2m, 3g (bytes) |
| Numbers | Plain integers (no quotes) |
| Strings | Quoted "value" or unquoted simple-value |
Complete reference
Section titled “Complete reference”Application mode
Section titled “Application mode”| CLI Flag | Environment Variable | Config Path | Default | Description |
|---|---|---|---|---|
-m, --mode | SCRIBE_APP_MODE | app.mode | production | Application 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):
- CLI:
-m <mode>or--mode <mode> - System property:
-Dmode=<mode>or-Dapp.mode=<mode> SCRIBE_APP_MODEenvironment variableAPP_MODEenvironment variable (Node.js-style fallback)APP_ENVenvironment variable (Node.js-style fallback)app.modeconfig value- Fallback:
production
Logging
Section titled “Logging”| Environment Variable | Config Path | Default | Description |
|---|---|---|---|
SCRIBE_LOG_LEVEL | log.level | info | Global log level: trace, debug, info, warn, error, off |
SCRIBE_LOG_FILE | log.file | stdout | Log output destination |
Component-specific log levels (inherit from log.level by default):
| Environment Variable | Config Path | Purpose |
|---|---|---|
SCRIBE_LOG_SUPERVISOR | log.SuperVisor | Startup/shutdown, orchestration, infrastructure |
SCRIBE_LOG_INGEST | log.Ingest | Transcription pipeline, event store operations |
SCRIBE_LOG_MONITORING | log.Monitoring | Wide-log output, observability, channels |
SCRIBE_LOG_LICENSE | log.License | License verification |
SCRIBE_LOG_CONFIG | log.Config | Configuration 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 Variable | Config Path | Library |
|---|---|---|
SCRIBE_LOG_KENOXA | log."com.kenoxa" | Kenoxa internal loggers |
SCRIBE_LOG_HIKARI | log."com.zaxxer.hikari" | HikariCP connection pool |
SCRIBE_LOG_FLYWAY | log."org.flywaydb" | Flyway database migrations |
SCRIBE_LOG_JOSE4J | log."org.jose4j" | JOSE4J JWT/JWK library |
SCRIBE_LOG_HELIDON | log."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 Property | Default | Description |
|---|---|---|
-Dorg.slf4j.simpleLogger.showDateTime | false | Show timestamp |
-Dorg.slf4j.simpleLogger.dateTimeFormat | millis | SimpleDateFormat pattern (e.g., HH:mm:ss.SSS) |
-Dorg.slf4j.simpleLogger.showThreadName | true | Show thread name in output |
-Dorg.slf4j.simpleLogger.showShortLogName | false | Use short logger names |
-Dorg.slf4j.simpleLogger.levelInBrackets | false | Wrap level in brackets (e.g., [INFO]) |
Example: Enable timestamps with local time format:
java -Dorg.slf4j.simpleLogger.showDateTime=true \ -Dorg.slf4j.simpleLogger.dateTimeFormat=HH:mm:ss.SSS \ -jar identity-scribe.jarOr via JAVA_TOOL_OPTIONS environment variable:
export JAVA_TOOL_OPTIONS="-Dorg.slf4j.simpleLogger.showDateTime=true -Dorg.slf4j.simpleLogger.dateTimeFormat=HH:mm:ss.SSS"java -jar identity-scribe.jarLeak Detection (HikariCP-style):
| Environment Variable | Config Path | Default | Description |
|---|---|---|---|
SCRIBE_LOG_LEAK_DETECTION | monitoring.log.leak-detection.mode | auto | Leak detection: off, on, auto |
SCRIBE_LOG_LEAK_DETECTION_THRESHOLD | monitoring.log.leak-detection.threshold | 90s | Threshold 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 detectionon: Always run leak detectionauto: Enabled whenapp.modeis dev/development/local/test; disabled otherwise
Concurrency and pools
Section titled “Concurrency and pools”| Environment Variable | Config Path | Default | Description |
|---|---|---|---|
SCRIBE_CONCURRENCY | concurrency | CPU cores × 2.5 | Thread pool size |
SCRIBE_DATABASE_MAX_POOL_SIZE | database.max-pool-size | concurrency + 5 | Batch connection pool size |
SCRIBE_DATABASE_SYSTEM_POOL_SIZE | database.system-pool-size | Auto | System operations pool size |
SCRIBE_DATABASE_CHANNEL_POOL_SIZE | database.channel-pool-size | concurrency / 2 | LDAP channel pool size |
LDAP connection
Section titled “LDAP connection”| Environment Variable | Config Path | Default | Description |
|---|---|---|---|
SCRIBE_LDAP_URL | ldap.url | ldap://localhost | LDAP server URL(s) |
SCRIBE_LDAP_BIND_DN | ldap.bind-dn | (none) | Bind DN for authentication |
SCRIBE_LDAP_BIND_PASSWORD | ldap.bind-password | (none) | Bind password |
LDAP tuning
Section titled “LDAP tuning”| Environment Variable | Config Path | Default | Description |
|---|---|---|---|
SCRIBE_LDAP_MAX_SIZE_LIMIT | ldap.maxSizeLimit | 5000 | Max entries per search |
SCRIBE_LDAP_PAGE_SIZE | ldap.pageSize | concurrency × 8 | Sync search page size |
LDAP socket options
Section titled “LDAP socket options”| Environment Variable | Config Path | Default | Description |
|---|---|---|---|
SCRIBE_LDAP_SO_KEEPALIVE | ldap.useKeepAlive | true | TCP keepalive |
SCRIBE_LDAP_TCP_NODELAY | ldap.useTCPNoDelay | true | Disable Nagle algorithm |
SCRIBE_LDAP_SO_TIMEOUT | ldap.soTimeout | 0 | Socket timeout (ms) |
SCRIBE_LDAP_TCP_KEEPIDLE | ldap.tcpKeepidle | 120 | Keepalive idle time (s) |
SCRIBE_LDAP_TCP_KEEPINTERVAL | ldap.tcpKeepinterval | 30 | Keepalive interval (s) |
SCRIBE_LDAP_TCP_KEEPCOUNT | ldap.tcpKeepcount | 10 | Keepalive probe count |
Database connection
Section titled “Database connection”| Environment Variable | Config Path | Default | Description |
|---|---|---|---|
SCRIBE_DATABASE_URL | database.url | (none) | PostgreSQL connection URL |
SCRIBE_DATABASE_USER | database.user | (none) | Database user |
SCRIBE_DATABASE_PASSWORD | database.password | (none) | Database password |
SCRIBE_DATABASE_QUERY_HTTP_ACQUISITION_TIMEOUT | database.queryHttpAcquisitionTimeout | 5s | HTTP query timeout |
Database connection hints
Section titled “Database connection hints”Session-level PostgreSQL parameters applied to channel queries. Channels can override these in their own connection-hints section.
| Environment Variable | Config Path | Default | Description |
|---|---|---|---|
SCRIBE_DATABASE_STATEMENT_TIMEOUT | database.connection-hints.statement-timeout | (unset) | Query statement timeout |
SCRIBE_DATABASE_LOCK_TIMEOUT | database.connection-hints.lock-timeout | (unset) | Lock acquisition timeout |
SCRIBE_DATABASE_WORK_MEM | database.connection-hints.work-mem | (unset) | Per-query memory (e.g., 256MB) |
SCRIBE_DATABASE_SESSION_FLAGS | database.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)$).
Feature toggles
Section titled “Feature toggles”| Environment Variable | Config Path | Default | Description |
|---|---|---|---|
SCRIBE_READONLY | readonly | false | Read-only mode |
SCRIBE_HINTS_ENABLED | monitoring.hints.enabled | true | Hint engine |
SCRIBE_LDAP_RECONCILIATION_ENABLED | ldap.reconciliation.enabled | true | Reconciliation task |
SCRIBE_PROMETHEUS_ENABLED | monitoring.prometheus.enabled | true | Prometheus metrics |
Hints engine
Section titled “Hints engine”| Environment Variable | Config Path | Default | Description |
|---|---|---|---|
SCRIBE_HINTS_ENABLED | monitoring.hints.enabled | true | Enable hint collection |
SCRIBE_HINTS_CACHE_TTL | monitoring.hints.cache.ttl | 1 hour | Signature cache TTL |
SCRIBE_HINTS_CACHE_SIZE | monitoring.hints.cache.size | 500 | Signature cache max entries |
SCRIBE_HINTS_EXPLAIN_ENABLED | monitoring.hints.explain.enabled | true | EXPLAIN sampling |
SCRIBE_HINTS_EXPLAIN_SAMPLE_EVERY | monitoring.hints.explain.sampleEvery | 1000 | Re-EXPLAIN interval |
SCRIBE_HINTS_EXPLAIN_SLOW_QUERY_DURATION | monitoring.hints.explain.slowQueryDuration | 1000ms | Slow query threshold |
SCRIBE_HINTS_PERSISTENCE_ENABLED | monitoring.hints.persistence.enabled | false | Persist hints to DB |
SCRIBE_HINTS_PERSISTENCE_TTL | monitoring.hints.persistence.ttl | 7 days | Persisted hints TTL |
SCRIBE_HINTS_PERSISTENCE_MAX_ROWS | monitoring.hints.persistence.maxRows | 50000 | Max persisted hints |
SCRIBE_HINTS_PERSISTENCE_MAX_QUEUE | monitoring.hints.persistence.maxQueue | 5000 | Memory queue size |
SCRIBE_HINTS_PERSISTENCE_BATCH_SIZE | monitoring.hints.persistence.batchSize | 100 | DB insert batch size |
SCRIBE_HINTS_PERSISTENCE_BATCH_INTERVAL | monitoring.hints.persistence.batchInterval | 5s | Batch flush interval |
HTTP server
Section titled “HTTP server”| Environment Variable | Config Path | Default | Description |
|---|---|---|---|
SCRIBE_HTTP_PORT | http.port | 8080 | HTTP server port |
SCRIBE_HTTP_HOST | http.host | auto | Bind address (auto, localhost, 0.0.0.0) |
See HTTP Server Configuration for socket binding, TLS, and named sockets.
Monitoring
Section titled “Monitoring”| Environment Variable | Config Path | Default | Description |
|---|---|---|---|
SCRIBE_MONITORING_SOCKET | monitoring.socket | @default | Socket for monitoring endpoints |
SCRIBE_PROMETHEUS_ENABLED | monitoring.prometheus.enabled | true | Enable Prometheus /metrics |
SCRIBE_PROMETHEUS_SCRAPE_INTERVAL | monitoring.prometheus.scrapeInterval | 30s | Internal /metrics scrape interval |
Telemetry (OpenTelemetry)
Section titled “Telemetry (OpenTelemetry)”| Environment Variable | Config Path | Default | Description |
|---|---|---|---|
SCRIBE_TELEMETRY_ENABLED | monitoring.telemetry.enabled | true | Enable OTel SDK |
SCRIBE_TELEMETRY_TRACES_ENABLED | monitoring.telemetry.traces.enabled | false | Enable trace export |
SCRIBE_TELEMETRY_TRACES_ENDPOINT | monitoring.telemetry.traces.endpoint | localhost:4317 | OTLP traces endpoint |
SCRIBE_TELEMETRY_METRICS_ENABLED | monitoring.telemetry.metrics.enabled | false | Enable OTLP metrics push |
SCRIBE_TELEMETRY_METRICS_ENDPOINT | monitoring.telemetry.metrics.endpoint | localhost:4317 | OTLP metrics endpoint |
SCRIBE_TELEMETRY_SERVICE_NAME | monitoring.telemetry.resource.serviceName | identity-scribe | OTel service name |
Terminal and output
Section titled “Terminal and output”These standard environment variables control terminal behavior. They are not SCRIBE_-prefixed as they follow cross-platform conventions.
| Environment Variable | Default | Description |
|---|---|---|
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.
Migration from IDENTITY_SCRIBE_*
Section titled “Migration from IDENTITY_SCRIBE_*”If you’re upgrading from a version that used IDENTITY_SCRIBE_* environment variables, rename them to SCRIBE_*:
Mapping table
Section titled “Mapping table”| Old Variable | New Variable |
|---|---|
IDENTITY_SCRIBE_READONLY | SCRIBE_READONLY |
IDENTITY_SCRIBE_CONFIG_FILE | SCRIBE_CONFIG_FILE |
IDENTITY_SCRIBE_LDAP_SO_KEEPALIVE | SCRIBE_LDAP_SO_KEEPALIVE |
IDENTITY_SCRIBE_LDAP_TCP_NODELAY | SCRIBE_LDAP_TCP_NODELAY |
IDENTITY_SCRIBE_LDAP_SO_TIMEOUT | SCRIBE_LDAP_SO_TIMEOUT |
IDENTITY_SCRIBE_LDAP_TCP_KEEPIDLE | SCRIBE_LDAP_TCP_KEEPIDLE |
IDENTITY_SCRIBE_LDAP_TCP_KEEPINTERVAL | SCRIBE_LDAP_TCP_KEEPINTERVAL |
IDENTITY_SCRIBE_LDAP_TCP_KEEPCOUNT | SCRIBE_LDAP_TCP_KEEPCOUNT |
IDENTITY_SCRIBE_TELEMETRY_ENABLED | SCRIBE_TELEMETRY_ENABLED |
IDENTITY_SCRIBE_TELEMETRY_TRACES_ENABLED | SCRIBE_TELEMETRY_TRACES_ENABLED |
Bulk rename script
Section titled “Bulk rename script”# For shell scripts or .env filessed -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 -Verification
Section titled “Verification”After migration, verify the resolved configuration:
identity-scribe --printconfigThis shows all resolved values with sources, helping identify any misconfigured variables.
Troubleshooting
Section titled “Troubleshooting”Configuration not taking effect
Section titled “Configuration not taking effect”- Check priority: A higher-priority source may be overriding your value
- Verify naming: Ensure underscores match dots in the config path
- Case sensitivity: Environment variables are case-insensitive for lookup
Debug configuration loading
Section titled “Debug configuration loading”# Print resolved config (sensitive values masked)identity-scribe --printconfig
# Enable debug logging for SettingsSCRIBE_LOG_LEVEL=debug identity-scribeCommon issues
Section titled “Common issues”| Symptom | Cause | Solution |
|---|---|---|
| Env var ignored | Wrong prefix | Use SCRIBE_ not IDENTITY_SCRIBE_ |
| Value not parsed | Wrong format | Use HOCON format: 5s, true, 1024 |
| Config file not found | Wrong search path | Use --config or SCRIBE_CONFIG_FILE |
Advanced: CONFIG_FORCE_*
Section titled “Advanced: CONFIG_FORCE_*”HOCON supports a built-in mechanism for overriding any config key via environment variables:
# Enable with system propertyidentity-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.urlCONFIG_FORCE_ldap_use__keep__alive=true # → ldap.use-keep-aliveThis is orthogonal to SCRIBE_* variables and can override keys without explicit ${?...} substitution.