v0.19.0
Highlights
Web config editor — The dashboard now includes a full schema-driven configuration editor, replacing manual YAML editing as the primary way to configure Airut. The editor supports all settings — global options, per-repo configuration, channel setup (email/Slack), credentials with source selectors (!env/!var/literal), and config variables with cross-reference tracking and atomic rename. An edit buffer pattern provides diff preview before saving, and validation catches errors before they reach the YAML file. Documentation has been rewritten to present the web editor as the recommended path. (#375, #383, #404, #416, #423, #438)
Dashboard overhaul — The dashboard has been rebuilt on Jinja2 templates and htmx, replacing ~4,400 lines of f-string HTML generation. The new stack brings a unified light/dark theme via CSS custom properties, a persistent navbar with breadcrumbs, restructured URLs, cache-busted static assets, and SSE-driven live updates throughout. The main page now shows config reload status and uses consistent section headings and badge styling. (#342, #348, #350, #377, #402)
Declarative config layer — A new config infrastructure underpins both the web editor and live reload. Server configuration is now backed by self-documenting schema metadata (FieldMeta with doc strings, reload scopes, and secret flags), a ConfigSource protocol for format-agnostic loading, version-stamped schema migration, and a ConfigSnapshot that tracks which fields are user-set vs defaults. Config variables (vars: / !var) allow defining a value once and referencing it across repos. (#340, #343, #355, #337, #338)
Live config reload — Changes to airut.yaml are picked up automatically via Linux inotify file watching, with SIGHUP as a fallback. Reload is scope-aware: TASK-scoped changes (secrets, model, effort) take effect on the next task immediately, REPO-scoped changes restart the affected listener, and SERVER-scoped changes are deferred until idle. The dashboard shows a reload status badge. (#359, #361, #399, #408, #435)
Optional airut init — The gateway now starts without a config file, using built-in defaults (dashboard enabled, no repos). The config directory is created at startup so the web editor can write the initial config file. This streamlines fresh installs — just uv tool install airut && airut start, then configure everything through the browser. (#434)
Bug Fixes
- Security dependency upgrade — Upgraded
requests2.32.5 → 2.33.0 to fix GHSA-gc5v-m9x4-r6x2. (#407)
Other Changes
- Parallel CI — Split the single CI job into three parallel GitHub Actions jobs (code, security, integration), reducing wall-clock time. (#378)
- Integration test speedups — Replaced hard sleeps with interruptible
Event.wait(), addedselect+pipe for instant shutdown, reduced polling intervals, and cached SSL certs. (#382, #384, #385, #386, #387, #389, #390, #391, #392) - Dashboard polish — Fixed navbar on iOS, aligned config editor styling, improved field descriptions, added screenshots to documentation. (#395, #429, #431, #432, #433, #436)