{ inputs, ... }:
{
  flake.overlays.nixvim = inputs.nixvim.overlays.default;

  perSystem =
    { pkgs, system, ... }:
    let
      nixvimLib = inputs.nixvim.lib.${system};
      nixvim = inputs.nixvim.legacyPackages.${system};
      testNvimModule = nixvimLib.check.mkTestDerivationFromNixvimModule;
      nvimModule = extraConfig: {
        inherit pkgs;
        extraSpecialArgs = {
          inherit (inputs) unstable;
          inherit system;
        };
        module = {
          imports = [ (import ../nvim/standalone.nix { standalone = true; }) ];
          config = extraConfig;
        };
      };
      moduleDev = nvimModule { };
      moduleHeadless = nvimModule { jhome.nvim.dev.enable = false; };
      moduleNoLsp = nvimModule { jhome.nvim.dev.bundleLSPs = false; };
      moduleNoTSGrammars = nvimModule { jhome.nvim.dev.bundleGrammars = false; };
      moduleNoBundledBins = nvimModule {
        jhome.nvim.dev = {
          bundleLSPs = false;
          bundleGrammars = false;
        };
      };
    in
    {
      # Check standalone nvim build
      checks = {
        nvimDev = testNvimModule moduleDev;
        nvimHeadless = testNvimModule moduleHeadless;
        nvimNoLsp = testNvimModule moduleNoLsp;
        nvimNoTSGrammars = testNvimModule moduleNoTSGrammars;
        nvimNoBundledBins = testNvimModule moduleNoBundledBins;
      };

      # Nvim standalone module
      packages = {
        nvim = nixvim.makeNixvimWithModule moduleDev;
        # Smaller derivations
        nvim-headless = nixvim.makeNixvimWithModule moduleHeadless;
        nvim-small = nixvim.makeNixvimWithModule moduleNoBundledBins;
        nvim-no-ts = nixvim.makeNixvimWithModule moduleNoTSGrammars;
        nvim-no-lsps = nixvim.makeNixvimWithModule moduleNoLsp;
      };
    };
}