{
  lib,
  nix-gitignore,
  pkgs,
  keepDebugInfo,
  buildStdenv ? pkgs.clangStdenv,

  cmake,
  ninja,
  qt6,
  spirv-tools,
  cli11,
  breakpad,
  jemalloc,
  wayland,
  wayland-protocols,
  libdrm,
  libgbm ? null,
  xorg,
  pipewire,
  pam,

  gitRev ? (let
    headExists = builtins.pathExists ./.git/HEAD;
    headContent = builtins.readFile ./.git/HEAD;
  in if headExists
     then (let
       matches = builtins.match "ref: refs/heads/(.*)\n" headContent;
     in if matches != null
        then builtins.readFile ./.git/refs/heads/${builtins.elemAt matches 0}
        else headContent)
     else "unknown"),

  debug ? false,
  withCrashReporter ? true,
  withJemalloc ? true, # masks heap fragmentation
  withQtSvg ? true,
  withWayland ? true,
  withX11 ? true,
  withPipewire ? true,
  withPam ? true,
  withHyprland ? true,
  withI3 ? true,
}: buildStdenv.mkDerivation {
  pname = "quickshell${lib.optionalString debug "-debug"}";
  version = "0.1.0";
  src = nix-gitignore.gitignoreSource "/docs\n/examples\n" ./.;

  nativeBuildInputs = with pkgs; [
    cmake
    ninja
    qt6.qtshadertools
    spirv-tools
    qt6.wrapQtAppsHook
    pkg-config
  ] ++ (lib.optionals withWayland [
    wayland-protocols
    wayland-scanner
  ]);

  buildInputs = [
    qt6.qtbase
    qt6.qtdeclarative
    cli11
  ]
  ++ lib.optional withCrashReporter breakpad
  ++ lib.optional withJemalloc jemalloc
  ++ lib.optional withQtSvg qt6.qtsvg
  ++ lib.optionals withWayland ([ qt6.qtwayland wayland ] ++ (if libgbm != null then [ libdrm libgbm ] else []))
  ++ lib.optional withX11 xorg.libxcb
  ++ lib.optional withPam pam
  ++ lib.optional withPipewire pipewire;

  cmakeBuildType = if debug then "Debug" else "RelWithDebInfo";

  cmakeFlags = [
    (lib.cmakeFeature "DISTRIBUTOR" "Official-Nix-Flake")
    (lib.cmakeFeature "INSTALL_QML_PREFIX" qt6.qtbase.qtQmlPrefix)
    (lib.cmakeBool "DISTRIBUTOR_DEBUGINFO_AVAILABLE" true)
    (lib.cmakeFeature "GIT_REVISION" gitRev)
    (lib.cmakeBool "CRASH_REPORTER" withCrashReporter)
    (lib.cmakeBool "USE_JEMALLOC" withJemalloc)
    (lib.cmakeBool "WAYLAND" withWayland)
    (lib.cmakeBool "SCREENCOPY" (libgbm != null))
    (lib.cmakeBool "SERVICE_PIPEWIRE" withPipewire)
    (lib.cmakeBool "SERVICE_PAM" withPam)
    (lib.cmakeBool "HYPRLAND" withHyprland)
    (lib.cmakeBool "I3" withI3)
  ];

  # How to get debuginfo in gdb from a release build:
  # 1. build `quickshell.debug`
  # 2. set NIX_DEBUG_INFO_DIRS="<quickshell.debug store path>/lib/debug"
  # 3. launch gdb / coredumpctl and debuginfo will work
  separateDebugInfo = !debug;
  dontStrip = debug;

  meta = with lib; {
    homepage = "https://git.outfoxxed.me/outfoxxed/quickshell";
    description = "Flexbile QtQuick based desktop shell toolkit";
    license = licenses.lgpl3Only;
    platforms = platforms.linux;
  };
}