Nix Config Update logo

Nix Config Update

CommunityPopular
ryan4yin
nix-config-update

Use when a version changes here: upgrading or updating a package or nixpkgs, bumping or pinning a flake input (a tag or commit, not a branch), or deploying the result to hosts, VMs, and MicroVM guests.

Overview

Publisherryan4yin
Repositorynix-config
Skill namenix-config-update
Stars
2.1K
Forks
104
Bundled files
Instructions only
LicenseMIT
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • Self-contained

    Everything the model needs lives in the instructions — no extra files to sync.

  • Open source

    Published by ryan4yin on GitHub. Read the source before you install it.

Installation

Install the Nix Config Update AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
    https://github.com/ryan4yin/nix-config/tree/main/.agents/skills/nix-config-update
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/ryan4yin/nix-config.git /tmp/nix-config
mkdir -p .claude/skills
cp -r /tmp/nix-config/.agents/skills/nix-config-update .claude/skills/nix-config-update
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Nix Config Update in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Nix Config Update on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Nix Config Update is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

Updating this flake safely

Read this before running just up, just upp, just up-nix, or just override-pkgs, and before deploying the result to any host.

Core rules

  1. Update and deploy are two steps. Never fold "bump the lock file" and "switch every host" into one blind action.
  2. Validate before touching a host. An update is only a candidate until just test is green and the affected hosts build locally.
  3. One reviewable commit per update. The convention here is a flake.lock: Update commit for the bump; a config change gets its own commit or PR.
  4. Keep a way back. Anything that reaches a host needs a rollback path: the previous generation, boot mode, just darwin-rollback, or git revert.
  5. Security first. An update re-opens the supply chain. Re-audit every input whose revision moved before you deploy it.
  6. Pin third-party inputs. A third-party input — not one of the user's own ryan4yin/* repositories — MUST name a version tag or a fixed commit, not a branch. Official channel upstreams that publish no release (nixpkgs' nixos-unstable/master) are the exception. When only a branch carries a needed third-party change, keep the resolved revision in the lock, record why next to the declaration, and re-audit each update.

1. Pre-flight

  • git status is clean, and you are on main or a fresh branch for the work. If you are on an unrelated feature branch, stop and ask for the right branch before bumping.
  • just test is green before the update, so you have a baseline to compare against. It and every eval fetch the private mysecrets input over SSH; without that access they hang instead of failing.
  • Check WORKAROUNDS.md for the inputs and recipes you are about to use; an active row that names one of them replaces its command here.
  • Enough disk for the new closures: df -h /nix/store. Broad nixpkgs bumps pull a lot.
  • Know what will move and choose the narrowest recipe that does the job.

2. Run the update

  • Everything: just up — updates and commits the lock file automatically; audit before pushing
  • One input: just upp <input> — same, for a single input, e.g. just upp catppuccin; audit before pushing
  • The nixpkgs family: just up-nix — updates nixpkgs-stable/-master/-darwin/-patched; not nixpkgs
  • Pin nixpkgs: just override-pkgs <hash> — pin nixpkgs to a known-good Hydra commit
  • Update but keep it dirty: nix flake update <input> — leaves the change uncommitted so you can inspect it first
  • Nix itself (macOS): just nix-upgrade — determinate-nixd upgrade; macOS only

After an update, read git diff flake.lock: it lists exactly which inputs moved and by how many commits. Because just up and just upp commit automatically, either use nix flake update <input> while auditing or amend the generated lock commit after the audit so its message records the conclusion.

3. Audit the change

Treat an update as a supply-chain event.

  1. From git diff flake.lock, list every input whose locked.rev changed.

  2. Find the inputs that contribute modules this repo imports:

    bash
    grep -rn "homeModules\.\|nixosModules\.\|darwinModules\." --include='*.nix' .
  3. For each of those inputs, read what changed between the old and new revision in the module files we actually import. Look for:

    • restricted nix.settings (substituters, extra-substituters, trusted-public-keys, trusted-users) — at the Home Manager layer these are ignored for an untrusted user and only warn, but at the system layer they are a root-equivalent trust boundary;
    • environment.etc / home.file entries with a mode or user that widens access;
    • system.activationScripts, systemd.services running as root, sudo/polkit rules;
    • lib.mkForce overrides that silently replace existing settings;
    • eval-time network access or import-from-derivation.
  4. For nixpkgs-class inputs, skim the lock diff and expect broken packages and eval deprecation warnings.

  5. Write the audit conclusion into the update commit message. If an automatic recipe already made the commit, amend it only after reviewing the diff; do not push the unaudited commit first.

4. Validate before deploying

Run these before any host is touched:

  • just test — fails (non-zero) unless the suite returns true.
  • just eval-host <host> — fast, evaluation only.
  • just build-host <host> — builds the full system closure and catches broken packages or build failures that eval misses.
  • just build-microvm <guest> — same, for a MicroVM guest.
  • just test-vm — the runtime security-VM check (needs /dev/kvm); just test does not run it.
  • nix flake check — broader checks when the change touches shared code.

Cover every host you are about to deploy, and prefer building the closure over trusting a green eval.

Preview what the machine you are on will change before it is deployed:

bash
nix store diff-closures /run/current-system '.#nixosConfigurations.<host>.config.system.build.toplevel'

It lists every package whose version or size moves; an empty result means nothing changes. Read it for unexpected removals, major-version jumps, and kernel or systemd changes that need a reboot.

5. Deploy in stages

Modes are switch (take effect now, the default) and boot (only the next boot). Add debug for verbose output. Anything else is rejected.

The user runs these for the machine you are on:

  • Current desktop: just niri [mode] [verbosity]
  • Other local NixOS host: just local [mode] [verbosity]
  • macOS: just local [debug] (build then switch; macOS has no switch/boot split)

The rest authenticate over SSH as root on the target, so they run non-interactively — but they still change remote state. Confirm the target instead of trusting the recipe's default, then state it back to the user and get authorization for that host:

bash
hostname                  # which machine you are on
git branch --show-current
git remote -v
getent hosts <host>       # the address the tag will connect to
ssh root@<host> hostname  # the host that actually answers
  • Remote servers: just shoryu [mode], just shushou, just youko, just ruby, just kana
  • All VM hosts at once: just lab [mode]; any Colmena tag: just col <tag> [mode]
  • k3s test nodes: just k3s-test [mode]
  • MicroVM guest: just microvm-deploy <guest> <physical-host> installs the runner on the physical host and restarts the guest unit there (WA-026); switch that host afterwards, or the next activation reverts the guest to its own runner. Deploy guests serially and check each one before moving on.

Use boot plus a deliberate reboot for anything that can drop networking mid-flight: the VM hosts with the br0 bridge, and broad nixpkgs bumps. See hosts/README.md. Pause Flux sync on the k3s cluster before changing a node's networking, and resume it once the node is back.

6. Verify after deploying

  • systemctl --failed and just list-failed for failed units.
  • journalctl -b -p err for boot-time errors.
  • The user-visible surface: network, the desktop session, and the specific service you changed.
  • Re-run just test so a dirty tree cannot hide a regression.

7. Roll back

  • NixOS: just history lists system generations; pick the previous one in the bootloader menu, or re-deploy a reverted tree.
  • macOS: just darwin-rollback (darwin-rebuild --rollback).
  • Remote (Colmena): git revert <sha> and re-apply, or apply with boot and reboot.
  • Update failed but never deployed: drop the bump's own uncommitted lock change with git checkout -- flake.lock, then reproduce. If the tree holds other uncommitted work, ask before discarding anything.
  • Isolate a bad bump by moving one input at a time with nix flake update <input>, and pin a known-good nixpkgs with just override-pkgs <hash> while the breakage is fixed upstream.

8. Clean up only after it is stable

just gc (older than 7 days) and just clean (wipes profile history) delete the generations you would roll back to, so run them last, once the update has proven stable. just gcroot only lists GC roots. The full list of hazardous recipes is in the Command Hazards section of AGENTS.md.

Frequently asked questions

What does the Nix Config Update AI skill do?

Use when a version changes here: upgrading or updating a package or nixpkgs, bumping or pinning a flake input (a tag or commit, not a branch), or deploying the result to hosts, VMs, and MicroVM guests.

Why use Nix Config Update on TypingMind?

Because you install it once and use it with any model. Nix Config Update is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Nix Config Update in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/ryan4yin/nix-config/tree/main/.agents/skills/nix-config-update. TypingMind reads its SKILL.md and installs it as a skill you can enable per chat.

Which AI models can use Nix Config Update?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Nix Config Update?

As many as you like. As long as a model supports skills, you can use Nix Config Update with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Nix Config Update AI skill free?

Yes. It is published on GitHub by ryan4yin under the MIT license. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇