A generic, plug‑and‑play tool for generating text configs — from a form, not a text editor.
Config Engineers fill in a guided form and get a validated, rendered config in one click. Template Engineers write the schema and Jinja2 template that define that form. Add a new config type by dropping in a file — no core code changes, no restart.
id: router_base_config template: router_base_config.j2 fields: - key: hostname pattern: '^[a-z0-9-]+$' - key: mgmt_ip type: ip_cidr - key: enable_ospf type: bool
! Generated by ConfigGen | 2026-08-06 hostname rtr-core-01 interface GigabitEthernet0/0 ip address 10.10.10.1 255.255.255.0 router ospf 1 network 10.10.10.0 0.0.0.255 area 0 ntp server 192.0.2.123 snmp-server community public-ro RO
Three files, at most.
Nothing else changes. No core code, no registration step, no restart — the CLI and the GUI dashboard both re-scan schemas/ every time.
build() function for values a form field can't hold — database lookups, derived addresses.Everything a config-generation tool needs, and nothing it doesn't.
It grew out of network configs — router and switch examples run through the docs — but there's nothing network-specific in the engine itself.
Two-tier generation
Tier 1 validates a schema's fields straight into the template. Tier 2 adds an optional hook — plain Python, with services.db and services.net — for values a form field alone can't express.
Full GUI
Dashboard of template tiles, a guided form with live preview and diff-against-last, a Template Editor with Check / Test Render / version history, Bulk Generate, User Admin, and an in-app Help browser.
Every action, scriptable
Everything the GUI does has a CLI equivalent — check, generate, bulk, diff, history, export/import, and full user/group/API-key management.
Bulk generation
Generate many configs from one CSV/XLSX file, or a database query — every row validated independently, one bad row never blocks the rest.
Multi-database service
A generic, read-only SQL layer backed by queries.yaml — one SQLite file or several, named and addressed per query.
Roles & groups
Admin, Template Engineer, and Config Engineer, with group-scoped template visibility — or skip it entirely and run solo, where none of it ever comes up.
Config packs
Export a schema + template + hook + preflight check as one .zip; import it elsewhere with explicit overwrite/rename conflict handling.
Preflight checks
Advisory syntax sanity checks after rendering — unclosed interface blocks, bad VLAN ranges, unbalanced braces — for IOS, JunOS, SR OS, VRP8, or your own.
GUI exe, CLI exe, or Docker
One build produces a windowed ConfigGen.exe and a standalone console ConfigGen-CLI.exe — or run the CLI-only Docker image in CI, no Qt required either way.
Click through it, or script around it.
The GUI and the CLI call the exact same core — nothing the form does is unavailable to a script, and nothing the CLI does needs a window open.
Fill in a form, get a config
Pick a template from the dashboard, fill in the guided form, preview the rendered output, and save — with diff-against-last and a full generation log along the way.
Same pipeline, zero clicks
Validate, generate, and batch-process from a terminal or a CI job — every command returns exit code 0 or 1, scriptable without parsing output.
Seven docs. No wiki spelunking.
The same set is one click away inside the app too — the sidebar's Help button opens an in-app browser for all of it.
Python 3.10+, a Windows exe, or Docker.
Pick whichever matches how you'll actually run it.
From source
The desktop GUI, from a clone.
CLI only
No PySide6/Qt pulled in at all.
Docker
CLI-only image, for CI or a server.
Your next config doesn't need a text editor.
Clone it, run it, and drop in your first schema — the example configs under examples/ are self-contained, try one immediately.