Configuration
IdentityScribe uses HOCON files, environment variables, and CLI flags. You only need to set what differs from the defaults — everything else comes from reference.conf.
Configuration priority
Section titled “Configuration priority”Who wins when the same key is set at multiple levels?
http.port Values are resolved 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 |
Starter templates
Section titled “Starter templates”IdentityScribe ships three config templates. Copy one to identity-scribe.conf and edit it for your environment.
| Template | Use case | What it sets up |
|---|---|---|
minimal.conf | Evaluation, getting started | Database, LDAP, one transcribe, REST channel |
recommended.conf | Staging, internal deployments | All channels (LDAP, REST, GraphQL, MCP), Prometheus, health probes, indices |
production.conf | Production, real traffic | Everything in recommended + TLS, auth, network isolation, locked-down APIs |
minimal.conf gets IdentityScribe running with the fewest settings. It connects to one LDAP source, syncs one entry type, and exposes a REST API. Use it to evaluate Scribe or build up a config from scratch.
recommended.conf turns on every channel and adds monitoring. It includes user and group transcribes with indices, Prometheus metrics, health probes, and observability endpoints. Auth is disabled so you can explore without tokens.
production.conf applies the full Production Checklist. It enables TLS on all endpoints, requires bearer token auth, isolates monitoring on a separate socket, and disables API schema endpoints. All secrets come from environment variables — no hardcoded defaults.
Required settings
Section titled “Required settings”Every template needs a database and an LDAP source.
ldap { url = "ldap://your-ldap-server:389" bind-dn = "cn=admin,dc=example,dc=com" bind-password = ${LDAP_BIND_PASSWORD}}
database { url = "postgresql://localhost:5432/identity_scribe" user = "scribe" password = ${DB_PASSWORD}}Secrets use ${ENV_VAR} substitution so they stay out of config files. See Secrets management for more.
Environment variables
Section titled “Environment variables”Environment variables follow the config path with dots converted to underscores:
Config path: monitoring.hints.persistence.enabledEnv var: SCRIBE_HINTS_PERSISTENCE_ENABLED| 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 |
The configuration reference lists every environment variable alongside its config path and default value.
Extending defaults with HOCON
Section titled “Extending defaults with HOCON”Customize defaults without copying them. These patterns keep configs short and pick up new defaults automatically on upgrade.
Append to arrays
Section titled “Append to arrays”Use += to add items after defaults:
# Single itemmonitoring.log.rules += { action = include, name = "Audit.*" }
# Multiple items (use ${path} [...] pattern, not += [...])monitoring.log.rules = ${monitoring.log.rules} [ { action = include, name = "Debug.*" } { action = exclude, name = "Noisy.*", where = "duration.seconds<=10ms" }]
# Any array workshttp.cors.allow-origins += "http://localhost:3000"ssl.cipher-suites += "TLS_AES_256_GCM_SHA384"Prepend to arrays
Section titled “Prepend to arrays”Place items before defaults. For log rules, earlier items take priority:
# Your rule first, then defaultsmonitoring.log.rules = [ { action = include, name = "Critical.*" }] ${monitoring.log.rules}Merge objects
Section titled “Merge objects”Objects merge automatically. Specify only what changes:
# Change port, inherit everything elsehttp.sockets.admin { port = 9001 }
# Override format, keep other log settingsmonitoring.log.format = "json"Inheritance chains
Section titled “Inheritance chains”Child sections inherit all keys from their parent — override only what changes
ssl base config http.ssl overrides 2 keys http.sockets.admin.ssl overrides 1 key Many settings cascade automatically:
| Setting | Inherits from |
|---|---|
| Socket SSL | http.sockets.<name>.ssl ← http.ssl ← ssl |
| Socket CORS | http.sockets.<name>.cors ← http.cors |
| Auth caches | auth.bearer.cache, auth.ropc.cache, auth.ldap.cache ← auth.cache |
| LDAP auth | auth.ldap ← ldap |
| Transcribe LDAP | transcribes.<name>.ldap ← ldap |
| Channel UI | channels.*.ui ← openapi.ui |
| Observe UI | monitoring.observe.ui ← openapi.ui |
| Retry services | retry.services ← retry |
Override at any level:
# Start with http.ssl, change just the cert for this sockethttp.sockets.secure.ssl = ${http.ssl} { cert = "/custom/server.crt" key = "/custom/server.key"}Example: dev config
Section titled “Example: dev config”include required("production.conf")
# Priority rules + relaxed thresholdsmonitoring.log.rules = [ { action = include, name = "*.Dev*" } # Always log dev ops] ${monitoring.log.rules} [ { action = exclude, where = "duration.seconds<=2s" } # Relax timing]
# Extra CORS originshttp.cors.allow-origins += "http://localhost:3000"http.cors.allow-origins += "http://localhost:4321"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 config parsingSCRIBE_LOG_CONFIG=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 |
Related
Section titled “Related”- Configuration reference — Every setting, env var, and default value
- Deployment — Docker Compose and Kubernetes examples
- Upgrading — Migration from older config formats