Milestones
A running log of what's shipped and what's next. Each milestone is a self-contained chunk that ends in a tested, committed state.
Shipped
M1 — Core flake skeleton
A minimal NixOS system boots in a QEMU VM. No glix yet; glix.toml was
stubbed by hand.
core/flake.nixwithnixosModules.glixos,nixosModules.desktop.core/modules/core/*.nixfocused submodules.nix build .#vmworks.
M2 — Manifest contract end-to-end
importManifest.nix ingested a hand-written glix.toml and produced
module lists. Proved the fallback path and the homeModules.default
path both work.
core/lib/importManifest.nixv1.examples/pkg-hello/andexamples/pkg-greeting/.examples/user-packages/— a hand-written reference deployment.
M3 — glix CLI MVP
The Go CLI with init, add, remove, list, rebuild. TOML
round-trip preserving deterministic order. Anchored-region patching.
glix/internal/manifest/,glix/internal/flake/,glix/internal/repo/.- Embedded init templates.
- First end-to-end
glix add→nixos-rebuild.
M4 — Registry + resolver + transactional rollback
Short-name resolution via the chain (URI → glixos registry →
nix registry list). In-memory snapshots cover every mutation.
glix/internal/resolver/.glix/internal/registry/with on-disk cache.glix/internal/repo/snapshot.go.
M5 — Lifecycle commands
update, enable, disable, set, show, doctor, rollback.
- One file per command in
cmd/glix/. glix doctorcovers toolchain, repo, flake, and manifest checks.glix rollbackreverts the last commit and relocks.
M6 — Multi-host, multi-user, pinning, gc
Settings.system,Settings.primary_user,Package.user,Package.pin.homeModulesByUserinimportManifest.nix.glix gcwrappingnix-collect-garbage.- Per-host system tuples allow mixed-arch repos.
M7 — Per-package config and repo introspection
Package.config([packages.<name>.config]flat string map)._module.args.glixConfigwiring viawithGlixConfig.glix set <pkg> config.<key>=<value>(empty value deletes).glix infoshowing repo state andflake.lockinputs.pkg-greetingconsumesglixConfig.message.
M8 — Package the CLI as a derivation
The repo root becomes the canonical flake; core/ is now a plain
subdirectory of modules + lib (no longer its own flake).
- Root
flake.nixexposespackages.${system}.glixviabuildGoModule, plus the existinglib,nixosModules,vmoutputs. nixosModules.glixosis now a function ofinputs; it appliesoverlays.default(which addspkgs.glix) and installs the CLI viaenvironment.systemPackages. Gated byglixos.glix.enable(default true) with aglixos.glix.packageoverride.glix --version/glix -valiases;glix versionprintsglix <ver> (<commit>), with both stamped at build time via ldflags.defaultCoreURLinglix initis nowgithub:donnismoore/glixos(no?dir=core).
Planned
M9 — ISO installer
Installer ISO via nixos-generators. First-boot wizard runs glix init.
M10 — Secrets stories documented
Worked examples for sops-nix and agenix integration. (ADR-006 keeps
secrets out of glix itself; this milestone is doc-only.)
M11 — Public registry
Move the registry into its own repo. Establish a contribution process for adding packages.
Beyond
glix rollback --to <generation>with tag-based mapping.- A real
--dry-runfor every mutation, with a render of the planned diff. - A test harness that boots
nixos-generatorsimages for end-to-end CI.