Why a generic config panel

A config file without a schema is a photograph of the keys someone happened to need. The rest of the legal vocabulary — enums, defaults, descriptions — lives in docs, provider plugins, or someone else’s example.

Linux already solved this for opt-in apps: GSettings schemas plus dconf-editor, or KDE KConfigXT. Windows Group Policy templates do the same from ADMX. Developers get a weaker cousin: SchemaStore plus editor completion.

Nothing trustworthy sits in the middle: open this Terraform tfvars, that dub.sdl, that .gitconfig, register them after touch, and keep the same panel widgets.

Left: two-line gitconfig. Right: panel listing unset email and autocrlf

Two layers (do not confuse them)

Syntax / codec

INI, YAML, TOML, SDLang, HCL-lite — parsers in uniconfig-core. Always in the engine.

Vocabulary / schema

Which fields exist, types, enums — JSON Schema reached via catalog profiles. Shipped by app authors, registered on the user’s machine.

You are not loading profiles to parse profiles. You parse with codecs; you overlay vocabulary from catalogs.

ConfigUI’s resolution ladder

When a file opens, the engine tries, in order:

  1. Glob match from registered app catalogs (catalog-index.sdl) or bundled fallback

  2. Sidecar / $schema next to the file

  3. On-the-fly inference from instance keys (weakest — no unset fields)

Registration is lazy: catalogs load when needed, stale paths prune on read. No merged mega-catalog on disk.

What app developers do

  1. Ship uniconfig/catalog.sdl + schemas in their repo

  2. Register the catalog path on startup (registerCatalogSource)

  3. Provide a repository URL or declare closed source (required metadata)

See Ship vocabulary. The bundled fallback-catalog/ in the ConfigUI app covers Git/Terraform/DUB only.

What ConfigUI still does locally

  • Register after touch — opened file paths in registry.sdl (left tree)

  • Round-trip — write instance back to the project’s config file; vocabulary stays in catalog/schema or sidecars

HCL programs and for_each stay out of v0.1; .tfvars assignments are in.

Making settings follow the activity (where settings sit relative to work) and Config UI as the field vocabulary (what the surface is allowed to name).