glide-browser.url = "github:glide-browser/glide";
glide-browser.flake = false;
flake.nix:inputs

caption: derivation

rec {
  glide-browser = pkgs.wrapFirefox glide-browser-unwrapped { };
  glide-browser-unwrapped = pkgs.callPackage (
    {
      buildMozillaMach,
      fetchFromGitHub,
      lib,
      fetchurl,
      git,
      nodejs,
      pkg-config,
      pnpm,
      python3,
      stdenv,
    }:
 
    let
      info = lib.pipe "${inputs.glide-browser}/firefox.json" [
        builtins.readFile
        builtins.fromJSON
      ];
      glideVersion = info.brands.glide.release.displayVersion;
      glideRevision = inputs.glide-browser.shortRev;
      firefoxVersion = info.version.version;
 
      firefoxSrc = fetchurl {
        url = "mirror://mozilla/firefox/releases/${firefoxVersion}/source/firefox-${firefoxVersion}.source.tar.xz";
        hash = "sha256-zbEYk1Rb+yHuc3ajzoVySlZBpeFKUK+Q+NvogwErAaU=";
      };
 
      src = stdenv.mkDerivation (finalAttrs: {
        pname = "firefox-glide-browser-src-patched";
        version = glideVersion;
        GLIDE_REVISION = glideRevision;
 
        src = inputs.glide-browser;
 
        postUnpack = ''
          mkdir -p source/engine
          # note: the firefox tar unpacks to firefox-$version/
          tar xf ${firefoxSrc} --strip-components=1 -C source/engine
        '';
 
        # revert native-messaging-hosts installation directory to firefox default
        postPatch = ''
          substituteInPlace src/toolkit/xre/nsXREDirProvider-cpp.patch \
            --replace-fail '".glide-browser"' '".mozilla"'
        '';
 
        nativeBuildInputs = [
          git
          nodejs
          python3
          pkg-config
          pnpm.configHook
        ];
 
        pnpmDeps = pnpm.fetchDeps {
          inherit (finalAttrs) pname version src;
          fetcherVersion = 2;
          hash = "sha256-oboo+RfNkJo3EXgsVPUnWJKdPsIKe46QjwmMYdeGbgw=";
        };
 
        buildPhase = ''
          runHook preBuild
 
          patchShebangs scripts/
 
          # dprint requires network access, lets just skip it
          sed -i '/dprint fmt/d' scripts/generate-types.sh
 
          # new firefox is incompatible with a patch in nixpkgs
          # adjusting mac sdk version so that the old patch still works
          sed -i 's|"26.0"|"15.5"|' engine/build/moz.configure/toolchain.configure
 
          echo 'loglevel=silent' > .npmrc
          pnpm bootstrap --offline
          # bootstrap includes a default mozconfig but that can mess with options that `buildMozillaMach` sets, so just remove it.
          rm engine/mozconfig
 
          runHook postBuild
        '';
 
        installPhase = ''
          runHook preInstall
 
          cp -r engine $out
 
          cd $out
          for i in $(find . -type l); do
            realpath=$(readlink $i)
            rm $i
            cp $realpath $i
          done
 
          runHook postInstall
        '';
 
        dontFixup = true;
      });
    in
    (
      (buildMozillaMach {
        pname = "glide-browser";
        version = firefoxVersion;
        packageVersion = glideVersion;
        applicationName = "Glide";
        binaryName = "glide";
        branding = "browser/branding/glide";
        inherit src;
 
        requireSigning = false;
        allowAddonSideload = true;
 
        meta = { description = "Extensible and keyboard-focused web browser built on Firefox"; };
      }).override
      {
        pgoSupport = false;
        crashreporterSupport = false;
        enableOfficialBranding = false;
      }
    ).overrideAttrs
      (
        prev:
        {
          GLIDE_FIREFOX_VERSION = firefoxVersion;
          MOZ_USER_DIR = "Glide Browser";
        }
      )
  ) { };
}
{ pkgs, ... }:
 
{
  home.packages = [ pkgs.glide-browser ];
}
home-manager
{
  _.persist.allUsers.directories = [ ".glide" ".config/glide" ];
}
nixos