Skip to content
GitHub

Updating

./setup update pulls the repository and installs again.

Terminal window
./setup update

It runs git pull --autostash --ff-only, says which version it moved from and to, then everything install does, with the same flags: ./setup update --skip-packages skips the packages on the way through. The install runs from the setup just pulled, so a release that changes the installer takes effect on the same update. A checkout with no upstream branch skips the pull and installs what is there.

The extras install set up once are left alone, so what you changed in those programs stays. One that was skipped is tried again, and Spotify is patched again after a Spotify update has taken the palette away.

main only moves when a version is released. A clone made from the README is on main, so ./setup update brings the latest release and nothing in between. Work in progress lives on dev: git switch dev in your clone follows it, half-finished work included, and git switch main goes back. Every release is a tag, v0.1.0 and on, with its notes under Releases.

The version you have is under Settings → System → This machine, beside the processor, the memory and the uptime: the release, such as v0.2.0, with the branch under it. Between releases the line under it adds the commits since that release and a short hash, and says edited when the checkout has changes of its own.

Every configuration file exists twice, once in the repository and once where it is used. The desk reads the copy, never the repository.

Edit your copy~/.config/hypr/modules/look.lua, say — and the change applies at once. setup notices it has been edited and leaves it alone. When the repository later changes that file, the repository’s version is written beside yours as <name>.new and yours stays in place.

To settle a .new file, compare the two and keep one:

Terminal window
diff ~/.config/hypr/modules/look.lua ~/.config/hypr/modules/look.lua.new
mv ~/.config/hypr/modules/look.lua.new ~/.config/hypr/modules/look.lua # take the repository's
rm ~/.config/hypr/modules/look.lua.new # or keep yours

Either choice is permanent. If you take the repository’s version, the file is unedited again and updates normally. If you keep yours, no .new appears again until the repository changes that file again.

Edit the repository and nothing happens until you copy it:

Terminal window
./setup sync # copy home/ into $HOME once
./setup sync --watch # copy again on every save, until Ctrl+C

A sync that changes the shell’s files ends by asking the running shell to reload, once the last file has landed, so the desk never runs half of a change. --watch needs inotify-tools.

Each copy is written atomically, next to its destination and then renamed, so the shell never reads half a file. The hash of every file is kept in a manifest, ~/.local/state/impasto/home.manifest (and system.manifest for /). On every run it decides file by file:

What it findsWhat it does
Nothing at the pathWrites the file.
A different file, the first timeMoves it to ~/.local/state/impasto/backups/<timestamp>/, then writes. A link in the way is moved there too.
The file it wrote, uneditedReplaces it with the repository’s version.
The file it wrote, edited sinceKeeps yours, and writes the repository’s beside it as <name>.new.
A file gone from the repositoryDeletes it if unedited. If you edited it, it stays, and setup says so.
A file it never wroteNever touches it.

The last row matters. The palette writes themes into ~/.config/btop, cava, yazi, gtk-3.0 and elsewhere, and the shell keeps its settings in ~/.local/state/quickshell/. None of those were written by setup, so none of them are ever overwritten, deleted or backed up.

Under /, what was in the way is copied to the backups rather than moved, because the backups directory belongs to you.

Terminal window
./setup uninstall

It removes every file it installed that has not been edited since, from both $HOME and /. An edited file is left in place and named. Then it puts back what the install moved aside, oldest backup first, wherever the path is free again. Anything that cannot go back because the path is taken stays in ~/.local/state/impasto/backups/, and setup says how many.

What stays behind:

  • the packages, oh-my-zsh and the Hyprland plugins;
  • the shell’s settings, notes, tasks and the rest of ~/.local/state/quickshell/;
  • the themes the palette wrote, and the impasto icon theme;
  • what the extras set: the default applications, dark GTK, Thunar’s and VSCodium’s settings, VSCodium’s extensions, Vesktop’s tick and Spotify’s patch;
  • sddm, still enabled, if install enabled it;
  • /var/lib/impasto/faces, because what is in it is somebody’s photograph.

Add --dry-run to see the list first. Every verb is in The setup script.