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/init.lua
return {
  repos = { "core", "extra", "multilib" },
  packages = { "steam", "mangohud", "obs-studio", "protonup-qt" },

  users = { me = { groups = { "wheel" }, shell = "/usr/bin/zsh" } },
  home = { user = "me" },

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

archix status

current generation: 41 (snapshot 2026-10-09)

the system matches the lock

  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 lua/hosts/desktop/init.lua); 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 that changes something is a generation with its own boot entry, signed when Secure Boot is set up. Roll back from the terminal or pick an older one at boot: archix reinstalls its exact packages from cache.

systemd-boot
› Arch Linux (archix, generation 42)
  Arch Linux (archix, generation 41)
  Arch Linux (archix, generation 40)
  Arch Linux (archix rescue, generation 42)
  Arch Linux (archix rescue, generation 41)

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...
$ sudo archix switch
the system is newer than the lock for 3 packages
(firefox, linux, mesa), probably from pacman or an AUR helper
adopt them into the lock? (no reverts them to the lock) [Y/n] y
switched to generation 43 (snapshot 2026-10-15)

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 and the AUR in one list, resolved from the repos first
Repos
CachyOS, chaotic-aur and other third-party repos, with their pacman.conf blocks and keys
/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 and checked byte for byte against its tests, plus writers for toml, json, yaml, ini, kdl and more

Built not to brick your machine.

No reinstall
archix init takes over the system you already have. It locks to exactly what is installed, so the first diff is empty.
Power cuts
Every switch is journaled. If one is interrupted, archix recover continues it, rolls it back or abandons it.
No live USB
The newest two generations get a rescue boot entry that restores pacman and the core packages from cache.
Tested booting
Every change boots in a QEMU VM with OVMF and Secure Boot enforcing: generations, rollback at boot, signed entries and rescue.

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 packages, services, changed /etc files and users into a config, locked to exactly what is installed. No reinstall, and the first diff is empty.

  3. Switch

    sudo archix switch

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