{
  lib,
  stdenv,
  bzip2,
  expat,
  fontconfig,
  freetype,
  harfbuzz,
  libpng,
  pixman,
  zlib,
  libGL,
  libX11,
  libXcursor,
  libXi,
  libXrandr,
  glib,
  gtk4,
  libadwaita,
  wrapGAppsHook4,
  gsettings-desktop-schemas,
  git,
  ncurses,
  pkg-config,
  zig_0_12,
  revision ? "dirty",
}: let
  # The Zig hook has no way to select the release type without actual
  # overriding of the default flags.
  #
  # TODO: Once
  # https://github.com/ziglang/zig/issues/14281#issuecomment-1624220653 is
  # ultimately acted on and has made its way to a nixpkgs implementation, this
  # can probably be removed in favor of that.
  zig012Hook = zig_0_12.hook.overrideAttrs {
    zig_default_flags = "-Dcpu=baseline -Doptimize=ReleaseFast";
  };

  # This hash is the computation of the zigCache fixed-output derivation. This
  # allows us to use remote package dependencies without breaking the sandbox.
  #
  # This will need updating whenever dependencies get updated (e.g. changes are
  # made to zig.build.zon). If you see that the main build is trying to reach
  # out to the internet and failing, this is likely the cause. Change this
  # value back to lib.fakeHash, and re-run. The build failure should emit the
  # updated hash, which of course, should be validated before updating here.
  #
  # (It's also possible that you might see a hash mismatch - without the
  # network errors - if you don't have a previous instance of the cache
  # derivation in your store already. If so, just update the value as above.)
  zigCacheHash = import ./zigCacheHash.nix;

  zigCache = src:
    stdenv.mkDerivation {
      inherit src;
      name = "ghostty-cache";
      nativeBuildInputs = [git zig_0_12.hook];

      dontConfigure = true;
      dontUseZigBuild = true;
      dontUseZigInstall = true;
      dontFixup = true;

      buildPhase = ''
        runHook preBuild

        zig build --fetch

        runHook postBuild
      '';

      installPhase = ''
        runHook preInstall

        cp -r --reflink=auto $ZIG_GLOBAL_CACHE_DIR $out

        runHook postInstall
      '';

      outputHashMode = "recursive";
      outputHash = zigCacheHash;
    };
in
  stdenv.mkDerivation (finalAttrs: {
    pname = "ghostty";
    version = "0.1.0";

    src = ./..;

    nativeBuildInputs = [
      git
      ncurses
      pkg-config
      zig012Hook
      wrapGAppsHook4
    ];

    buildInputs =
      [
        libGL
      ]
      ++ lib.optionals stdenv.isLinux [
        bzip2
        expat
        fontconfig
        freetype
        harfbuzz
        libpng
        pixman
        zlib

        libX11
        libXcursor
        libXi
        libXrandr

        libadwaita
        gtk4
        glib
        gsettings-desktop-schemas
      ];

    dontConfigure = true;

    zigBuildFlags = "-Dversion-string=${finalAttrs.version}-${revision}-nix";

    preBuild = ''
      rm -rf $ZIG_GLOBAL_CACHE_DIR
      cp -r --reflink=auto ${zigCache finalAttrs.src} $ZIG_GLOBAL_CACHE_DIR
      chmod u+rwX -R $ZIG_GLOBAL_CACHE_DIR
    '';

    outputs = ["out" "terminfo" "shell_integration"];

    postInstall = ''
      terminfo_src=${
        if stdenv.isDarwin
        then ''"$out/Applications/Ghostty.app/Contents/Resources/terminfo"''
        else "$out/share/terminfo"
      }

      mkdir -p "$out/nix-support"

      mkdir -p "$terminfo/share"
      mv "$terminfo_src" "$terminfo/share/terminfo"
      ln -sf "$terminfo/share/terminfo" "$terminfo_src"
      echo "$terminfo" >> "$out/nix-support/propagated-user-env-packages"

      mkdir -p "$shell_integration"
      mv "$out/share/ghostty/shell-integration" "$shell_integration/shell-integration"
      ln -sf "$shell_integration/shell-integration" "$out/share/ghostty/shell-integration"
      echo "$shell_integration" >> "$out/nix-support/propagated-user-env-packages"
    '';

    postFixup = ''
      patchelf --add-rpath "${lib.makeLibraryPath [libX11]}" "$out/bin/.ghostty-wrapped"
    '';

    meta = with lib; {
      homepage = "https://github.com/mitchellh/ghostty";
      license = licenses.mit;
      platforms = ["x86_64-linux" "aarch64-linux" "aarch64-darwin"];
    };
  })
