slop-review

Installation

With nix

Try it without installing anything:

nix run --accept-flake-config gitlab:c0va23/slop-review/stable

The flag lets it use the binary cache CI pushes to, so that is a download rather than a compile. It is for trying this once: answering the prompt behind it permanently writes ~/.local/share/nix/trusted-settings.json, a file outside your configuration that no rebuild reproduces and nothing you version tracks. The snippets below are the same setting where you can see it.

/stable is a branch, not a version. It moves to each new release and nothing else, so a configuration naming it never has to be edited to upgrade — nix flake update moves your lockfile to the newest release. Install from it. Leave the /stable off and you get the default branch: work between releases, and nothing puts it in the cache, so your machine compiles all of it.

On NixOS

# flake.nix
inputs.slop-review.url = "gitlab:c0va23/slop-review/stable";

# configuration.nix
imports = [ inputs.slop-review.nixosModules.default ];
programs.slop-review = {
  enable = true;
  cache.enable = true;   # download builds instead of compiling them
};

With home-manager

Both switches are in the home module, so nothing here needs the system configuration:

imports = [ inputs.slop-review.homeModules.default ];
programs.slop-review = {
  enable = true;
  cache.enable = true;   # download builds instead of compiling them
};

inputs only exists in a flake-based configuration. A plain home.nix has no such argument — name the flake yourself:

let
  slop-review = builtins.getFlake "gitlab:c0va23/slop-review/stable";
in
{
  imports = [ slop-review.homeModules.default ];
  programs.slop-review = { enable = true; cache.enable = true; };
}

The first switch compiles, unless you hand it the cache. cache.enable writes the substituter into the generation it builds, and that generation contains slop-review, so the switch that turns the cache on is built without it. Give that one switch the setting on the command line, the way nix takes any setting:

home-manager switch \
  --option extra-substituters https://cache.slop-review.c0va23.dev \
  --option extra-trusted-public-keys slop-review.c0va23.dev:9TgUtLvniTdru2q33XSSwkT72PdWTFSpjqiWRyOdnDE=

Every switch after it finds the substituter already in place. nixos-rebuild switch takes the same two flags. On NixOS with the program in home-manager, nixosModules.cache in the system configuration walks around the problem instead: the rebuild that writes the substituter builds nothing of slop-review.

If it compiles anyway, you are not a trusted user. The daemon reads a user's substituters only for a user in trusted-users; check with grep trusted-users /etc/nix/nix.conf. That is nix's rule for every cache, not this one's. Where it does not hold, the cache has to be the machine's:

imports = [ inputs.slop-review.nixosModules.default ];
programs.slop-review.cache.enable = true;

Leave the cache out and everything still works; you compile instead of downloading. On nix-darwin the cache half is spelled the same way. On a machine with neither, nix.conf belongs to root:

# /etc/nix/nix.conf
extra-substituters = https://cache.slop-review.c0va23.dev
extra-trusted-public-keys = slop-review.c0va23.dev:9TgUtLvniTdru2q33XSSwkT72PdWTFSpjqiWRyOdnDE=

The home-manager option writes ~/.config/nix/nix.conf, which the daemon honours for a trusted user and ignores for anyone else — silently, by compiling. nixosModules.cache writes /etc/nix/nix.conf instead, which is read whoever you are.

cache.enable appends to the substituters you already have and turning it off takes exactly this back out. It is machine-wide, which is the honest cost: every build on that machine will ask this bucket about paths that have nothing to do with slop-review. The cache only holds what CI built, so a local edit or a different nixpkgs misses it and compiles.

flake.nix also exposes overlays.default and nixosModules.cache, the cache with no options attached.

Do not add inputs.nixpkgs.follows to this input. It is the usual courtesy, and here it costs you every prebuilt binary: pointing this flake at your nixpkgs changes every derivation hash in it, so nothing anyone has built before matches.

Without nix

One file. Download it, make it executable, run it.

curl -LO https://dl.slop-review.c0va23.dev/slop-review/latest/slop-review-x86_64.AppImage
chmod +x slop-review-x86_64.AppImage
./slop-review-x86_64.AppImage

make appimage builds the same file from a checkout, with the same script CI uses.

What rides along, and what stays yours. It carries difftastic, and only because it has to: crates/core parses a JSON format difftastic itself calls unstable, so the version has to be the one this was built against. Everything else is your machine's. git and jj read your repository, so yours win. enchant and your dictionaries are opened by name at run time, so a remark is checked against the words you installed. GL, Vulkan, Wayland and X11 are dlopened by name too, so the window draws on your driver.

What it needs from the machine. glibc 2.39 or newer — Ubuntu 24.04, Debian 13 and anything since. A desktop already has the rest; a bare container needs libgl1, libglx-mesa0, libegl1, libgbm1, libxkbcommon0, libxkbcommon-x11-0, libx11-6, libx11-xcb1, libxcb1, libxcursor1, libxi6 and libxrandr2. The one worth knowing about is libxkbcommon-x11-0: without it the window panics before drawing rather than warning and carrying on.

If it will not mount itself, the machine has no usable FUSE — run it with --appimage-extract-and-run, or set APPIMAGE_EXTRACT_AND_RUN=1.