| name | config-loading-precedence |
| description | How Xberg resolves configuration — CLI-mode and server/MCP-mode precedence orders, config file auto-discovery (xberg.{toml,yaml,json}), field-level inline JSON merge (merge_json_into_config), config file formats, and apply_extraction_overrides. Load when adding a config flag or env var, changing config precedence, or debugging why a setting is or isn't taking effect. |
Configuration Loading & Precedence
CLI Mode Precedence (highest to lowest)
- Individual CLI flags (
--ocr, --output-format, --chunk)
- Inline JSON config (
--config-json or --config-json-base64)
- Config file (
--config path.toml)
- Auto-discovered config (
xberg.{toml,yaml,json} in cwd/parents)
- Default values
Server/MCP Mode Precedence
- CLI arguments (
--host, --port)
- Environment variables (
XBERG_HOST, XBERG_PORT)
- Config file
[server] section
- Defaults (
127.0.0.1:8000)
Config File Discovery
Searches current directory and parents for xberg.toml, xberg.yaml, or xberg.json. Stops at first match.
Inline JSON Config
Field-level merge (not whole-object replacement):
fn merge_json_into_config(base: &ExtractionConfig, json: Value) -> Result<ExtractionConfig> {
let mut config_json = serde_json::to_value(base)?;
serde_json::from_value(merged)?
}
Use --config-json-base64 for shell escaping.
Config File Formats
TOML (xberg.toml):
use_cache = true
[ocr]
backend = "tesseract"
languages = ["eng", "deu"]
[security_limits]
max_archive_size = 524288000
YAML and JSON follow equivalent structure.
CLI Flag Overrides
In commands.rs: apply_extraction_overrides() applies individual flags on top of merged config.
Critical Rules
- CLI flags always win over config file
- JSON merge is field-level, not whole-object
- Auto-discovery stops at first config file found
--config-json-base64 for shell-safe JSON passing
- Server config uses
[server] section + extraction config