{ config ? {}, system ? builtins.currentSystem, ... }@args:

let
  sources = import ../nix/sources.nix;
  pkgs = import sources.nixpkgs args;
  unstable = import sources.nixpkgs-unstable args;

  callPackage = pkgs.lib.callPackageWith (pkgs // newpkgs);

  newpkgs = {
    alps = callPackage ./alps {};

    docker = pkgs.docker.overrideAttrs (super: {
      moby = super.moby.overrideAttrs (super: {
        extraPath = super.extraPath + ":${pkgs.zfs}/bin";
      });
    });

    linuxPackagesFor = kernel: (pkgs.linuxPackagesFor kernel).extend (_: ksuper: {
      decklink = callPackage ./decklink { kernel = ksuper.kernel; };
    });

    blackmagicDesktopVideo = callPackage ./blackmagic-desktop-video { };

    obs-studio = unstable.obs-studio.overrideAttrs (_: rec {
      wrapLibraries = with (pkgs // newpkgs); [
        xorg.libX11.out
        libvlc
        blackmagicDesktopVideo
        libcxx
        libcxxabi
      ];
      postInstall = ''
        wrapProgram $out/bin/obs \
          --prefix "LD_LIBRARY_PATH" : "${pkgs.lib.makeLibraryPath wrapLibraries}"
      '';
    });

    mattermost = callPackage ./mattermost {};

    # a version of the lounge with some extra css that
    # hides things the hacc-voc doesn't need
    thelounge-hacked = pkgs.stdenv.mkDerivation {
      name = "thelounge-hacked";
      src = pkgs.thelounge;

      phases = [ "buildPhase" "installPhase" ];
      buildPhase = ''
        cp $src/* -r .
        chmod 777 lib/node_modules/thelounge/public/css/style.css
        cat ${./thelounge/css-patch.css} >> lib/node_modules/thelounge/public/css/style.css
      '';

      installPhase = ''
        mkdir -p $out
        cp * -r $out
      '';
    };

    inherit (unstable) bottom;
  };

in pkgs.extend(_: _: newpkgs)