Update Arch without fear.

Declare your whole system in one Lua config: packages, AUR, services, /etc, dotfiles. archix locks every version, turns every switch into a generation, and rolls back in one command. On Arch, CachyOS and EndeavourOS.

git clone https://aur.archlinux.org/archix.git && cd archix && makepkg -si
Star on GitHub
lua/hosts/desktop.lua
return {
  imports = { "modules.common", "modules.gaming" },

  repos = { "core", "extra", "multilib" },
  packages = { "steam", "mangohud", "obs-studio", "protonup-qt" },

  programs = {
    kitty = {
      enable = true,
      font = { name = "JetBrainsMono Nerd Font", size = archix.force(11) },
    },
  },
}
terminal

archix status

generation 41 · locked to 2026-10-09 · clean

  1. 38Sep 18
  2. 39Sep 25
  3. 40Oct 02
  4. 41Oct 09
  5. 42Oct 15

Current generation: 41

Declared. Locked. Reversible.

Declared

One config for every machine, laid out like a neovim config. Modules declare typed options, so a typo is an error with a suggestion, not a setting that silently does nothing.

archix diff
error: `programs.kity`: option does not exist
       (set in hosts.desktop); did you mean
       `programs.kitty`?

Locked

Official packages are pinned to a dated Arch Linux Archive snapshot, AUR packages to a commit. Commit the lock and every machine gets exactly the same versions.

archix.lock
[hosts.desktop]
date = "2026-10-15"
repos = ["core", "extra", "multilib"]
declared = ["mangohud", "steam", …]

[hosts.desktop.packages]
mesa = { version = "1:25.3.0-1", repo = "extra", … }

Reversible

Every switch is a generation with its own boot entry. Roll back from the terminal or pick an older one at boot. btrfs makes it instant; on ext4 it still works.

systemd-boot
› archix · generation 42 · Oct 15
  archix · generation 41 · Oct 09
  archix · generation 40 · Oct 02
  archix rescue · generation 42

pacman and yay keep working.

No lockdown. Run pacman -Syu when you feel like it. A pacman hook records what changed, and the next switch asks whether to keep it. Say yes and the lock moves forward; say no and the system goes back to the lock.

Or skip the question: archix -Syu updates and adopts in one go.

terminal
$ sudo pacman -Syu
:: Starting full system upgrade...
$ archix switch
System is newer than the lock: adopt? [Y/n] y
  lock      2026-10-09 → 2026-10-15
  apply     ✓ generation 43 is live

Your AUR helper, too.

Keep the flags you already type. Every AUR build runs in a clean chroot at the locked snapshot date and gets cached. You read the whole PKGBUILD on first install and only the diff on updates.

pacman-style commands
archixFull update, like running yay with no arguments
archix -S <pkg>Install from the repos or the AUR, and add it to your config
archix -Ss <query>Search the repos and the AUR
archix -SyuUpdate from live mirrors and adopt the result into the lock
archix -R <pkg>Remove it from the system and from your config

Everything on the machine, in one place.

Packages
Official repos, the AUR, local PKGBUILDs, CachyOS and other third-party repos
/etc
Any file under /etc, written atomically and tracked by hash
systemd
System and user units, enabled and started on switch
Kernel
Kernel parameters, sysctl, modprobe and udev rules
Users
Users and groups. Passwords stay yours: archix never touches them
Dotfiles
Real files with recorded hashes, so edits made outside archix show up in diff
Apps
programs.* modules ported from Home Manager, plus writers for toml, json, yaml, ini, kdl and more
Hooks
Activation scripts that run on every switch

Coming from NixOS?

You already know the ideas. Keep the declarative config, the lockfile and the rollback. Drop the derivations, the wait for nixpkgs to catch up, and the update that breaks the build for reasons nobody can explain.

Read the migration guide

NixOSarchix
configuration.nixinit.lua
flake.lockarchix.lock
nixos-rebuild switcharchix switch
nixos-rebuild switch --rollbackarchix rollback
lib.mkDefault / lib.mkForcearchix.default / archix.force
Home Manager programs.*programs.*, ported from Home Manager
nix-collect-garbagearchix gc
nixpkgsArch repos, the AUR, CachyOS

Three commands from here.

  1. Bootstrap from the AUR

    git clone https://aur.archlinux.org/archix.git && cd archix && makepkg -si

    After the first switch, archix updates itself through its own lock.

  2. Capture your system

    sudo archix init

    Reads your installed packages, enabled services, changed /etc files and users into a config. Nothing changes until the diff against your system is empty.

  3. Switch

    sudo archix switch

    Generation 1. From here on, every change is one you can undo.