a simple and declarative configuration manager, written in lua
  • Lua 99.9%
  • Nix 0.1%
Find a file
2026-04-23 16:30:10 +03:00
bin init: nix in lua, what could possibly go wrong? 2026-03-31 21:40:55 +03:00
docs init: nix in lua, what could possibly go wrong? 2026-03-31 21:40:55 +03:00
lua/dess feat: make apply nicer to use 2026-04-23 16:30:10 +03:00
.envrc init: nix in lua, what could possibly go wrong? 2026-03-31 21:40:55 +03:00
.gitignore init: nix in lua, what could possibly go wrong? 2026-03-31 21:40:55 +03:00
devenv.lock init: nix in lua, what could possibly go wrong? 2026-03-31 21:40:55 +03:00
devenv.nix init: nix in lua, what could possibly go wrong? 2026-03-31 21:40:55 +03:00
devenv.yaml init: nix in lua, what could possibly go wrong? 2026-03-31 21:40:55 +03:00
README.md init: nix in lua, what could possibly go wrong? 2026-03-31 21:40:55 +03:00

dess

a simple and declarative configuration manager, written in lua

why?

as a fellow nixxer, i desperately want to escape it. the recent changes for age verification have made me want to get out of the systemd ecosystem. however, using nix for about four months on and off made it difficult to escape the "declarative everything" model, and i actually found it quite simple and even easier than imperative distros.

nixos, as a distro and as a system, is heavily dependent on systemd. projects like nixng have been tried before, yet they do not even boot on real hardware.

how?

everything in your system can be declared as an "entity": a collection of four simple "functions" (really just data), bound by an id into a dag. those four "functions" being:

  • check: is this already in the state we want it? returns a boolean
  • apply: make it how we want it, should make check return true (for a package, this would be installation)
  • destroy: tear it down (for a package, this would be uninstallation)
  • notify: heavily optional, called when something needs to change based on another thing (for example, a config file notifies a service to restart)

notice how we say "function": its all represented as lua tables under the hood, such that it can be serialized and read back for pruning if you remove something from the config.