diff --git a/horizon.dhall b/horizon.dhall
index 5a7035a505192f991dfad6227e317dfc95ad24cd..29c1f375dc42ec8b330bf62acc0bcd9fb1959a73 100644
--- a/horizon.dhall
+++ b/horizon.dhall
@@ -4,6 +4,7 @@ let H =
 let packages =
       { Only = H.callHackage "Only" "0.1"
       , attoparsec-iso8601 = H.callHackage "attoparsec-iso8601" "1.1.0.0"
+      , bin = H.callHackage "bin" "0.1.3"
       , binary-orphans = H.callHackage "binary-orphans" "1.0.4.1"
       , brick = H.callHackage "brick" "1.9"
       , bytes = H.callHackage "bytes" "0.17.2"
@@ -28,12 +29,16 @@ let packages =
       , hxt-unicode = H.callHackage "hxt-unicode" "9.0.2.4"
       , indexed-profunctors = H.callHackage "indexed-profunctors" "0.1.1"
       , linear = H.callHackage "linear" "1.22"
+      , monoidal-containers = H.callHackage "monoidal-containers" "0.6.4.0"
+      , mtl-compat = H.callHackage "mtl-compat" "0.2.2"
+      , newtype = H.callHackage "newtype" "0.2.2.0"
       , optics = H.callHackage "optics" "0.4.2"
       , optics-core = H.callHackage "optics-core" "0.4.1"
       , optics-extra = H.callHackage "optics-extra" "0.4.2.1"
       , optics-th = H.callHackage "optics-th" "0.4.1"
       , polyparse = H.callHackage "polyparse" "1.13"
       , polysemy = H.callHackage "polysemy" "1.9.1.0"
+      , protolude = H.callHackage "protolude" "0.3.3"
       , quiet = H.callHackage "quiet" "0.2"
       , recursion-schemes = H.callHackage "recursion-schemes" "5.2.2.4"
       , regex-compat = H.callHackage "regex-compat" "0.95.2.1"
diff --git a/horizon.lock b/horizon.lock
index 23ef6b05ccb7fb86c0cf0f9d290aa3aae0541410..fcc9006262eee81350c4001afcd0d2fea74bf27f 100644
--- a/horizon.lock
+++ b/horizon.lock
@@ -6,6 +6,10 @@
   , mapValue =
       "e9381924b80af1d359ebf5c4d5eeabd059219603adf132913d598c1839e7eb5a"
   }
+, { mapKey = "bin"
+  , mapValue =
+      "84a00ef558f47e01ff3fc4b8233b9ff3015b0455a4f7b604a40a2de9b87df003"
+  }
 , { mapKey = "binary-orphans"
   , mapValue =
       "14b21133632546a0c0313eeaeaa0bf77b2dbb381ce190d7b65ff55d8047768d6"
@@ -98,6 +102,18 @@
   , mapValue =
       "edb8c9191d3d13df10761bb4a7a9de7761a87028f7694757f825e2365516abf9"
   }
+, { mapKey = "monoidal-containers"
+  , mapValue =
+      "21022d66ca689e3c47f87f4c5ab58b1c30d77482517dffce29cc9fe9fde63945"
+  }
+, { mapKey = "mtl-compat"
+  , mapValue =
+      "f8d1aae5c34ffc10d4e7197d4a2996a7f7704b62e5c9089e905a8e1dedd48034"
+  }
+, { mapKey = "newtype"
+  , mapValue =
+      "a6816e1319ce4c405481ba87e26afa7d2a3a3bee60b2ad1d5f1f74f5bcc36214"
+  }
 , { mapKey = "optics"
   , mapValue =
       "6f0526b6ddc61746262cb635b40c53bffc6779d040de8eeab794e18304028361"
@@ -122,6 +138,10 @@
   , mapValue =
       "b134fcf0c950011e7c4bb8c074b99f70b11d26de8db9fa05db498008dae61cdb"
   }
+, { mapKey = "protolude"
+  , mapValue =
+      "cc9f210868d00056459d18ac7168c229d49dc5a8cdb5dd874df062807572b405"
+  }
 , { mapKey = "quiet"
   , mapValue =
       "4eb2e0bc3630024c7d3fc31000e587fe368d272ddcaeb8f4c511c8b682980df7"
diff --git a/overlay.nix b/overlay.nix
index a5950031896e6787a498f56175cb81e7afaeded0..1a34a8965d227f0c76072b694c2ec893fa601e74 100644
--- a/overlay.nix
+++ b/overlay.nix
@@ -5,6 +5,8 @@ final: prev: with pkgs.haskell.lib; {
 
   attoparsec-iso8601 = final.callPackage (./pkgs/attoparsec-iso8601.nix) { };
 
+  bin = final.callPackage (./pkgs/bin.nix) { };
+
   binary-orphans = final.callPackage (./pkgs/binary-orphans.nix) { };
 
   brick = final.callPackage (./pkgs/brick.nix) { };
@@ -51,6 +53,12 @@ final: prev: with pkgs.haskell.lib; {
 
   linear = final.callPackage (./pkgs/linear.nix) { };
 
+  monoidal-containers = final.callPackage (./pkgs/monoidal-containers.nix) { };
+
+  mtl-compat = final.callPackage (./pkgs/mtl-compat.nix) { };
+
+  newtype = final.callPackage (./pkgs/newtype.nix) { };
+
   optics = final.callPackage (./pkgs/optics.nix) { };
 
   optics-core = final.callPackage (./pkgs/optics-core.nix) { };
@@ -63,6 +71,8 @@ final: prev: with pkgs.haskell.lib; {
 
   polysemy = final.callPackage (./pkgs/polysemy.nix) { };
 
+  protolude = final.callPackage (./pkgs/protolude.nix) { };
+
   quiet = final.callPackage (./pkgs/quiet.nix) { };
 
   recursion-schemes = final.callPackage (./pkgs/recursion-schemes.nix) { };
diff --git a/pkgs/bin.nix b/pkgs/bin.nix
new file mode 100644
index 0000000000000000000000000000000000000000..8b7a11d7acf8198d1328ea6afbeefd25b858cf19
--- /dev/null
+++ b/pkgs/bin.nix
@@ -0,0 +1,25 @@
+{ mkDerivation, QuickCheck, base, boring, dec, deepseq, fin
+, hashable, lib, some
+}:
+mkDerivation {
+  pname = "bin";
+  version = "0.1.3";
+  sha256 = "fb9cf773bd6e36802748c538696187fe66efbc817c52bfe2f6cfdeff75126d92";
+  isLibrary = true;
+  isExecutable = false;
+  enableSeparateDataOutput = false;
+  libraryHaskellDepends = [
+    base boring dec deepseq fin hashable QuickCheck some
+  ];
+  enableLibraryProfiling = true;
+  enableExecutableProfiling = true;
+  doHaddock = false;
+  jailbreak = true;
+  doCheck = false;
+  doBenchmark = false;
+  hyperlinkSource = false;
+  homepage = "https://github.com/phadej/vec";
+  description = "Bin: binary natural numbers";
+  license = lib.licenses.gpl2Plus;
+  broken = false;
+}
\ No newline at end of file
diff --git a/pkgs/monoidal-containers.nix b/pkgs/monoidal-containers.nix
new file mode 100644
index 0000000000000000000000000000000000000000..202e6477b73f7602b3d18653b754389b6f8ea122
--- /dev/null
+++ b/pkgs/monoidal-containers.nix
@@ -0,0 +1,26 @@
+{ mkDerivation, aeson, base, containers, deepseq, hashable, lens
+, lib, newtype, semialign, these, unordered-containers, witherable
+}:
+mkDerivation {
+  pname = "monoidal-containers";
+  version = "0.6.4.0";
+  sha256 = "03019ebf5533dbebf70d5c60bdac52eb2409a8d057a78044f0dabe9df5234f27";
+  isLibrary = true;
+  isExecutable = false;
+  enableSeparateDataOutput = false;
+  libraryHaskellDepends = [
+    aeson base containers deepseq hashable lens newtype semialign these
+    unordered-containers witherable
+  ];
+  enableLibraryProfiling = true;
+  enableExecutableProfiling = true;
+  doHaddock = false;
+  jailbreak = true;
+  doCheck = false;
+  doBenchmark = false;
+  hyperlinkSource = false;
+  homepage = "http://github.com/bgamari/monoidal-containers";
+  description = "Containers with monoidal accumulation";
+  license = lib.licenses.bsd3;
+  broken = false;
+}
\ No newline at end of file
diff --git a/pkgs/mtl-compat.nix b/pkgs/mtl-compat.nix
new file mode 100644
index 0000000000000000000000000000000000000000..4fd885bdb490fcc8bc13c17596f8f48571c3f8ad
--- /dev/null
+++ b/pkgs/mtl-compat.nix
@@ -0,0 +1,21 @@
+{ mkDerivation, base, lib, mtl }:
+mkDerivation {
+  pname = "mtl-compat";
+  version = "0.2.2";
+  sha256 = "1955398fe2115674f47f553b2caaf928c6aa3424271a5cd13bc191e54bfe3a9e";
+  isLibrary = true;
+  isExecutable = false;
+  enableSeparateDataOutput = false;
+  libraryHaskellDepends = [ base mtl ];
+  enableLibraryProfiling = true;
+  enableExecutableProfiling = true;
+  doHaddock = false;
+  jailbreak = true;
+  doCheck = false;
+  doBenchmark = false;
+  hyperlinkSource = false;
+  homepage = "https://github.com/haskell-compat/mtl-compat";
+  description = "Backported Control.Monad.Except module from mtl";
+  license = lib.licenses.bsd3;
+  broken = false;
+}
\ No newline at end of file
diff --git a/pkgs/newtype.nix b/pkgs/newtype.nix
new file mode 100644
index 0000000000000000000000000000000000000000..abe1b3f0fb264439045364828c0193d5a8edf22b
--- /dev/null
+++ b/pkgs/newtype.nix
@@ -0,0 +1,22 @@
+{ mkDerivation, base, lib }:
+mkDerivation {
+  pname = "newtype";
+  version = "0.2.2.0";
+  sha256 = "3a00ffd1bb48a81e09f8be6510fa4c642ba1482b2f8d4777af1b5dd06c55ebac";
+  revision = "3";
+  editedCabalFile = "0yll88ydchd2gqcvdk28fchf2vygpd42ky2bigg4ga08jan2nacx";
+  isLibrary = true;
+  isExecutable = false;
+  enableSeparateDataOutput = false;
+  libraryHaskellDepends = [ base ];
+  enableLibraryProfiling = true;
+  enableExecutableProfiling = true;
+  doHaddock = false;
+  jailbreak = true;
+  doCheck = false;
+  doBenchmark = false;
+  hyperlinkSource = false;
+  description = "A typeclass and set of functions for working with newtypes";
+  license = lib.licenses.bsd3;
+  broken = false;
+}
\ No newline at end of file
diff --git a/pkgs/protolude.nix b/pkgs/protolude.nix
new file mode 100644
index 0000000000000000000000000000000000000000..cab517190d8195bd357ea26501e671c7311c796b
--- /dev/null
+++ b/pkgs/protolude.nix
@@ -0,0 +1,27 @@
+{ mkDerivation, array, async, base, bytestring, containers, deepseq
+, ghc-prim, hashable, lib, mtl, mtl-compat, stm, text, transformers
+, transformers-compat
+}:
+mkDerivation {
+  pname = "protolude";
+  version = "0.3.3";
+  sha256 = "6c39ded2c7e9f7b1a508e4400f0151cb325f4d80e35010c1d5afa58b48971a46";
+  isLibrary = true;
+  isExecutable = false;
+  enableSeparateDataOutput = false;
+  libraryHaskellDepends = [
+    array async base bytestring containers deepseq ghc-prim hashable
+    mtl mtl-compat stm text transformers transformers-compat
+  ];
+  enableLibraryProfiling = true;
+  enableExecutableProfiling = true;
+  doHaddock = false;
+  jailbreak = true;
+  doCheck = false;
+  doBenchmark = false;
+  hyperlinkSource = false;
+  homepage = "https://github.com/sdiehl/protolude";
+  description = "A small prelude";
+  license = lib.licenses.mit;
+  broken = false;
+}
\ No newline at end of file