{
  mkShell,
  lib,
  stdenv,
  bashInteractive,
  gdb,
  #, glxinfo # unused
  ncurses,
  nodejs,
  nodePackages,
  oniguruma,
  parallel,
  pkg-config,
  python3,
  scdoc,
  tracy,
  valgrind,
  #, vulkan-loader # unused
  vttest,
  wabt,
  wasmtime,
  wraptest,
  zig,
  zip,
  zls,
  llvmPackages_latest,
  bzip2,
  expat,
  fontconfig,
  freetype,
  glib,
  gtk4,
  libadwaita,
  gnome,
  hicolor-icon-theme,
  harfbuzz,
  libpng,
  libGL,
  libX11,
  libXcursor,
  libXext,
  libXi,
  libXinerama,
  libXrandr,
  pixman,
  zlib,
  alejandra,
}: let
  # See package.nix. Keep in sync.
  rpathLibs =
    [
      libGL
    ]
    ++ lib.optionals stdenv.isLinux [
      bzip2
      expat
      fontconfig
      freetype
      harfbuzz
      libpng
      oniguruma
      pixman
      zlib

      libX11
      libXcursor
      libXi
      libXrandr

      libadwaita
      gtk4
      glib
    ];
in
  mkShell {
    name = "ghostty";

    nativeBuildInputs =
      [
        # For builds
        llvmPackages_latest.llvm
        ncurses
        pkg-config
        scdoc
        zig
        zip
        zls

        # For web and wasm stuff
        nodejs

        # Linting
        nodePackages.prettier
        alejandra

        # Testing
        parallel
        python3
        tracy
        vttest

        # wasm
        wabt
        wasmtime
      ]
      ++ lib.optionals stdenv.isLinux [
        # My nix shell environment installs the non-interactive version
        # by default so we have to include this.
        bashInteractive

        gdb
        valgrind
        wraptest
      ];

    buildInputs =
      [
        # TODO: non-linux
      ]
      ++ lib.optionals stdenv.isLinux [
        bzip2
        expat
        fontconfig
        freetype
        harfbuzz
        libpng
        oniguruma
        pixman
        zlib

        libX11
        libXcursor
        libXext
        libXi
        libXinerama
        libXrandr

        # Only needed for GTK builds
        libadwaita
        gtk4
        glib
      ];

    # This should be set onto the rpath of the ghostty binary if you want
    # it to be "portable" across the system.
    LD_LIBRARY_PATH = lib.makeLibraryPath rpathLibs;

    # On Linux we need to setup the environment so that all GTK data
    # is available (namely icons).
    shellHook = lib.optionalString stdenv.isLinux ''
      # Minimal subset of env set by wrapGAppsHook4 for icons and global settings
      export XDG_DATA_DIRS=$XDG_DATA_DIRS:${hicolor-icon-theme}/share:${gnome.adwaita-icon-theme}/share
      export XDG_DATA_DIRS=$XDG_DATA_DIRS:$GSETTINGS_SCHEMAS_PATH # from glib setup hook
    '';
  }
