Overview
maxicfg reads configuration files, checks them against a schema and compares them across environments. It is a single static binary with no runtime dependencies.
Core concepts
Sources
A source is any file maxicfg can read. Supported formats are YAML, TOML,
JSON, dotenv and INI. Format is detected by extension, and can be forced
with --format when the extension is misleading.
Schema
A schema declares which keys are allowed, which are required, and what type each value should have. Schemas are themselves YAML files — there is no separate schema language to learn.
keys:
database.host: { type: string, required: true }
database.port: { type: int, default: 5432, min: 1, max: 65535 }
database.pool_size: { type: int, default: 10 }
logging.level: { type: enum, values: [debug, info, warn, error] }
features.*: { type: bool }
Profiles
A profile is a named group of sources — typically one per environment. Profiles let you run a single command against every environment instead of scripting a loop.
Typical workflow
- Write a schema describing the configuration your service expects.
- Run
maxicfg lintin CI so invalid configs never merge. - Run
maxicfg diffbefore a release to review what changed. - Run
maxicfg scanto make sure no secrets slipped into git.
What it does not do
maxicfg is deliberately narrow. It does not manage secrets, does not talk to remote configuration stores, does not deploy anything and does not run as a daemon. It reads files, prints findings and sets an exit code.
If you need dynamic configuration at runtime, use a configuration service. maxicfg is for the files sitting in your repository.
Next steps
- Install maxicfg on your machine or in CI
- Write your first schema
- Browse the CLI reference