Working on GISNIX¶
There are two different things you might be doing, and they want different loops. One is changing GISNIX itself — a bundle, a module, the installer, these docs. The other is testing a GISNIX change against your own machines before you release it. The first needs nothing but the GISNIX repo. The second has a fast path that never touches GitHub, and it is the one worth learning first because it removes all the waiting.
Where the code lives¶
GISNIX is its own git repository. Check it out wherever suits you — keeping it
inside your fleet's own config repo (git-ignored there) is convenient and
keeps the override path below short. Your fleet consumes GISNIX as a flake
input (github:kartoza/gisnix), so editing your local checkout does not
change what your fleet builds until you push and update. That is by design —
and it is exactly why the override loop exists.
Loop 1 — changing GISNIX itself¶
Most of the time you are working inside the GISNIX repo, and you do not need
your fleet at all. GISNIX is self-contained: it ships an example host and
its own build, VM and test tooling, and Nix reads your working tree
directly — no commit required to try something.
cd gisnix
# edit a bundle / module / the installer / a doc...
# Does it build? (the same thing a real install builds, and what CI gates on)
nix build .#nixosConfigurations.example.config.system.build.toplevel
# Does every bundle still evaluate? (catches unfree/insecure across all bundles)
./utils/check-bundle-eval.sh
# See it run
gisnix vm example --boot --screenshots
The example host is the stand-in for a real install; the build and the
bundle-eval are the same checks the release pipeline runs. A dirty-tree
warning from Nix is normal here — that is it reading your uncommitted edits.
Loop 2 — trying a change on your own machine¶
When you want a GISNIX change on a real host — your laptop, a fleet machine — before releasing it, do not push and re-lock. Override the input to point at your local checkout:
cd ~/your-fleet # your own nix-config
sudo nixos-rebuild switch --flake .#<host> \
--override-input gisnix path:./gisnix
That builds <host> against your local GISNIX checkout, uncommitted edits and
all, with no GitHub round-trip. Drop the --override-input and you are back
on the published GISNIX instantly — nothing on disk changed, so there is
nothing to undo.
path: vs a committed override
path:./gisnix copies your working tree, so it includes uncommitted
edits — ideal while iterating. If that copy is slow (a large checkout),
commit first and use --override-input gisnix ./gisnix, which uses the
git tree and respects .gitignore.
Loop 3 — shipping it¶
Once it builds, evaluates and behaves, publish — this is the only step that touches GitHub, and you only reach it when the change is proven:
- Commit and push GISNIX. If it is release-worthy, tag it (see Releasing, which runs the build and bundle-eval gates before it will publish).
-
In your fleet flake, adopt the published version:
Keep that lock change in its own commit — lockfiles are sacred.
Which loop, when¶
| You are… | Use |
|---|---|
| changing a bundle, module, installer or doc | Loop 1 — build/eval/VM the example host |
| wanting that change on a real machine to live with it | Loop 2 — --override-input, no push |
| done, and it is proven | Loop 3 — push, tag, then nix flake update gisnix |
See also¶
- Checks and hooks — every check that runs on commit, on push and at release, and what each one verifies.
- Architecture — how the pieces fit together.
- Building on GISNIX — consuming GISNIX from your own flake.
- Releasing — cutting a version and what the gates check.