Skip to content

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

Who wins when the same key is set at multiple levels?

Resolving http.port
1
CLI flags --port 8443
8443
2
System properties not set
3
Environment variables SCRIBE_HTTP_PORT
3000
4
Config file http { port = 9090 }
9090
5
Defaults reference.conf
8080

Values are resolved 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

IdentityScribe ships three config templates. Copy one to identity-scribe.conf and edit it for your environment.

TemplateUse caseWhat it sets up
minimal.confEvaluation, getting startedDatabase, LDAP, one transcribe, REST channel
recommended.confStaging, internal deploymentsAll channels (LDAP, REST, GraphQL, MCP), Prometheus, health probes, indices
production.confProduction, real trafficEverything 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.

Every template needs a database and an LDAP source.

identity-scribe.conf
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 follow the config path with dots converted to underscores:

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

The configuration reference lists every environment variable alongside its config path and default value.

Customize defaults without copying them. These patterns keep configs short and pick up new defaults automatically on upgrade.

Use += to add items after defaults:

# Single item
monitoring.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 works
http.cors.allow-origins += "http://localhost:3000"
ssl.cipher-suites += "TLS_AES_256_GCM_SHA384"

Place items before defaults. For log rules, earlier items take priority:

# Your rule first, then defaults
monitoring.log.rules = [
{ action = include, name = "Critical.*" }
] ${monitoring.log.rules}

Objects merge automatically. Specify only what changes:

# Change port, inherit everything else
http.sockets.admin { port = 9001 }
# Override format, keep other log settings
monitoring.log.format = "json"
Configuration Inheritance

Child sections inherit all keys from their parent — override only what changes

ssl base config
protocol = "TLSv1.3"
port = 443
cert = "default.crt"
inherits
http.ssl overrides 2 keys
protocol = "TLSv1.3" ← ssl
port = 8443 override
cert = "server.crt" override
inherits
http.sockets.admin.ssl overrides 1 key
protocol = "TLSv1.3" ← ssl
port = 8443 ← http.ssl
cert = "admin.crt" override

Many settings cascade automatically:

SettingInherits from
Socket SSLhttp.sockets.<name>.sslhttp.sslssl
Socket CORShttp.sockets.<name>.corshttp.cors
Auth cachesauth.bearer.cache, auth.ropc.cache, auth.ldap.cacheauth.cache
LDAP authauth.ldapldap
Transcribe LDAPtranscribes.<name>.ldapldap
Channel UIchannels.*.uiopenapi.ui
Observe UImonitoring.observe.uiopenapi.ui
Retry servicesretry.servicesretry

Override at any level:

# Start with http.ssl, change just the cert for this socket
http.sockets.secure.ssl = ${http.ssl} {
cert = "/custom/server.crt"
key = "/custom/server.key"
}
dev.conf
include required("production.conf")
# Priority rules + relaxed thresholds
monitoring.log.rules = [
{ action = include, name = "*.Dev*" } # Always log dev ops
] ${monitoring.log.rules} [
{ action = exclude, where = "duration.seconds<=2s" } # Relax timing
]
# Extra CORS origins
http.cors.allow-origins += "http://localhost:3000"
http.cors.allow-origins += "http://localhost:4321"
  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 config parsing
SCRIBE_LOG_CONFIG=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