Skip to content

v0.369.259

Choose a tag to compare

@github-actions github-actions released this 12 Sep 14:35
· 38 commits to trunk since this release

Configure the Nix service through settings, not an option per flag

The home-manager module had an option per command line flag, which capped
what it could express at what the flags cover. The flags predate the config
file and never caught up: meeting capture, the voice activity gate and echo
cancellation have none, so from Nix they could not be turned on at all.

capsper has one settings type and the file names all of it, so the module
now takes a freeform settings attribute and renders it to the ZON file
capsper already reads. It tracks that type without growing an option every
time it gains a field.

ZON is not JSON and there is no pkgs.formats.zon, so nix/to-zon.nix renders
it. The one part with no Nix equivalent is the enum literal, since Nix has
no enums. Ordinary strings render as enums for the settings named in
enumPaths, which keeps trigger.key = "capslock" reading like every other
setting, and tag says so explicitly for an enum added to capsper since.
That list does duplicate a little of the schema; what makes it safe is that
the rendered file is parsed by capsper at build time, so drift fails
nixos-rebuild with capsper's own diagnostic rather than leaving a service
that will not start.

A flake check covers the renderer twice over: against the exact expected
text, because the container syntax and the enum literals are where this goes
wrong, and by handing the result to capsper, because valid ZON is not the
same as settings capsper accepts.

model stays a flag. bin/capsper is a wrapper that always passes --model to
move the default off the read-only store, so a model in the file would
lose to it and silently do nothing.

The trigger loses its default of capslock. capsper with no mode prints its
usage and exits, which under Restart=always is a restart loop rather than
anything anybody sees, so an assertion now requires one of the four modes be
asked for.

Co-Authored-By: Claude Opus 5 (1M context) noreply@anthropic.com
Claude-Session: https://claude.ai/code/session_01Duep6uK3xBdSrsZEpAChvq