scooter  ·  2026-09-26

flake.nix

 1{
 2  description = "Local code review tool (lcr) — GitHub PR-like diff view for AI-assisted development";
 3
 4  inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
 5
 6  outputs =
 7    { self, nixpkgs }:
 8    let
 9      systems = [
10        "x86_64-linux"
11        "aarch64-linux"
12        "x86_64-darwin"
13        "aarch64-darwin"
14      ];
15      forAllSystems = f: nixpkgs.lib.genAttrs systems (system: f system);
16      pkgJson = builtins.fromJSON (builtins.readFile ./package.json);
17    in
18    {
19      packages = forAllSystems (
20        system:
21        let
22          pkgs = nixpkgs.legacyPackages.${system};
23          nodejs = pkgs.nodejs;
24          # NOTE: pnpm 11 ignores manage-package-manager-versions=false and tries
25          # to self-download the packageManager-pinned pnpm 12.6.0. pnpm 10
26          # honors the setting and installs this lockfile (lockfileVersion 9.0).
27          pnpm = pkgs.pnpm_10;
28          lcr = pkgs.stdenv.mkDerivation (finalAttrs: {
29            pname = "local-code-review";
30            version = pkgJson.version;
31            src = ./.;
32
33            pnpmDeps = pkgs.fetchPnpmDeps {
34              inherit (finalAttrs) pname version src;
35              pnpm = pnpm;
36              fetcherVersion = 3;
37              hash = "sha256-1lXrCe9FN7JXvijG+hxIgT9SuSs83T6fxsvGwwJtAHo=";
38            };
39
40            nativeBuildInputs = [
41              nodejs
42              pnpm
43              pkgs.pnpmConfigHook
44              pkgs.makeWrapper
45            ];
46
47            buildPhase = ''
48              runHook preBuild
49              pnpm run build
50              runHook postBuild
51            '';
52
53            installPhase = ''
54              runHook preInstall
55
56              # Drop devDependencies so the runtime closure stays small.
57              # build/ copies only what it needs; node_modules must keep
58              # runtime deps (ws, simple-git, shiki, open, node-pty).
59              pnpm prune --prod
60
61              mkdir -p $out/lib/lcr
62              cp -a build bin node_modules package.json $out/lib/lcr/
63
64              makeWrapper ${nodejs}/bin/node $out/bin/lcr \
65                --add-flags "$out/lib/lcr/bin/lcr.js"
66              runHook postInstall
67            '';
68
69            meta = {
70              description = pkgJson.description;
71              homepage = "https://git.kilimanjaro.io/local-code-review";
72              license = pkgs.lib.licenses.mit;
73              mainProgram = "lcr";
74              platforms = systems;
75            };
76          });
77        in
78        {
79          inherit lcr;
80          default = lcr;
81        }
82      );
83
84      apps = forAllSystems (system: {
85        default = {
86          type = "app";
87          program = "${self.packages.${system}.lcr}/bin/lcr";
88        };
89      });
90
91      overlays.default = final: prev: {
92        lcr = self.packages.${final.stdenv.hostPlatform.system}.lcr;
93      };
94
95      formatter = forAllSystems (system: nixpkgs.legacyPackages.${system}.nixfmt);
96    };
97}