diff --git a/flake.lock b/flake.lock
index 093225c35b43d447d89e70ebea8a71a4c5cce54c..97e57d3f2f6753ed4a998b414f9e31780ad6e827 100644
--- a/flake.lock
+++ b/flake.lock
@@ -134,6 +134,22 @@
         "url": "https://gitlab.horizon-haskell.net/haskell/horizon-gen-nix"
       }
     },
+    "horizon-shell-flake": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1680415280,
+        "narHash": "sha256-33DGfEUJP56lSAjXMPUdfR8OpL1PFri/Tnwr9EsDb9Q=",
+        "ref": "refs/heads/master",
+        "rev": "1eadace0dfaab411ad43d874116fa65d4e6aab70",
+        "revCount": 26,
+        "type": "git",
+        "url": "https://gitlab.horizon-haskell.net/shells/horizon-shell"
+      },
+      "original": {
+        "type": "git",
+        "url": "https://gitlab.horizon-haskell.net/shells/horizon-shell"
+      }
+    },
     "horizon-shell-flake-source": {
       "flake": false,
       "locked": {
@@ -275,6 +291,7 @@
         "flake-utils": "flake-utils",
         "get-flake": "get-flake",
         "horizon-core": "horizon-core",
+        "horizon-shell-flake": "horizon-shell-flake",
         "lint-utils": "lint-utils_2",
         "nixpkgs": "nixpkgs_4"
       }
diff --git a/flake.nix b/flake.nix
index 195e84cffdf51730d785c359873dc2c20f5fe113..cbbcec5cde95b9968b31ad687e1ac8c1ab3e55e7 100644
--- a/flake.nix
+++ b/flake.nix
@@ -9,6 +9,10 @@
   inputs = {
     get-flake.url = "github:ursi/get-flake";
     horizon-core.url = "git+https://gitlab.horizon-haskell.net/package-sets/horizon-core";
+    horizon-shell-flake = {
+      url = "git+https://gitlab.horizon-haskell.net/shells/horizon-shell";
+      flake = false;
+    };
     lint-utils.url = "git+https://gitlab.nixica.dev/nix/lint-utils";
     nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
   };
@@ -19,6 +23,7 @@
     , flake-utils
     , get-flake
     , horizon-core
+    , horizon-shell-flake
     , lint-utils
     , nixpkgs
     , ...
@@ -30,6 +35,7 @@
     with pkgs.lib;
     with pkgs.writers;
     let
+      horizon-shell = get-flake horizon-shell-flake;
 
       overrides = composeManyExtensions [
         (import ./overlay.nix { inherit pkgs; })
@@ -40,6 +46,15 @@
 
       packages = filterAttrs (_: isDerivation) legacyPackages;
 
+      devShell = pkgs.mkShell {
+        buildInputs = [
+          horizon-shell.packages.${system}.default
+        ];
+        shellHook = ''
+          horizon-shell
+          exit
+        '';
+      };
     in
     {
       checks = with lint-utils.outputs.linters.${system}; {
@@ -47,6 +62,8 @@
         nixpkgs-fmt = nixpkgs-fmt { src = self; find = "flake.nix"; };
       };
 
+      devShells.default = devShell;
+
       inherit legacyPackages;
       inherit packages;
     });
diff --git a/horizon.dhall b/horizon.dhall
index 48976875c7903f4218123b744da2da01b30d54ea..57586e3e651f0d418a12af74d7cff2f38443c356 100644
--- a/horizon.dhall
+++ b/horizon.dhall
@@ -16,11 +16,15 @@ let packages =
             (None H.Subdir)
       , constraints-extras = H.callHackage "constraints-extras" "0.4.0.0"
       , cpphs = H.callHackage "cpphs" "1.20.9.1"
+      , criterion = H.callHackage "criterion" "1.6.3.0"
+      , cryptohash-md5 = H.callHackage "cryptohash-md5" "0.11.101.0"
+      , dense-linear-algebra = H.callHackage "dense-linear-algebra" "0.1.0.0"
       , dependent-map = H.callHackage "dependent-map" "0.4.0.0"
       , dependent-sum = H.callHackage "dependent-sum" "0.7.2.0"
       , dependent-sum-template =
           H.callHackage "dependent-sum-template" "0.2.0.0"
       , deriving-compat = H.callHackage "deriving-compat" "0.6.5"
+      , doctest = H.callHackage "doctest" "0.22.1"
       , extensible-effects = H.callHackage "extensible-effects" "5.0.0.1"
       , file-embed = H.callHackage "file-embed" "0.0.15.0"
       , formatting = H.callHackage "formatting" "7.2.0"
@@ -33,14 +37,23 @@ let packages =
       , hxt-regex-xmlschema = H.callHackage "hxt-regex-xmlschema" "9.2.0.7"
       , hxt-unicode = H.callHackage "hxt-unicode" "9.0.2.4"
       , indexed-profunctors = H.callHackage "indexed-profunctors" "0.1.1.1"
+      , js-chart = H.callHackage "js-chart" "2.9.4.1"
+      , lift-type = H.callHackage "lift-type" "0.1.1.1"
       , linear = H.callHackage "linear" "1.22"
+      , microstache = H.callHackage "microstache" "1.0.2.3"
+      , monad-logger = H.callHackage "monad-logger" "0.3.40"
+      , monad-loops = H.callHackage "monad-loops" "0.4.3"
       , monoidal-containers = H.callHackage "monoidal-containers" "0.6.4.0"
       , mtl-compat = H.callHackage "mtl-compat" "0.2.2"
+      , network-info = H.callHackage "network-info" "0.2.1"
       , newtype = H.callHackage "newtype" "0.2.2.0"
       , optics = H.callHackage "optics" "0.4.2.1"
       , optics-core = H.callHackage "optics-core" "0.4.1.1"
       , optics-extra = H.callHackage "optics-extra" "0.4.2.1"
       , optics-th = H.callHackage "optics-th" "0.4.1"
+      , path-pieces = H.callHackage "path-pieces" "0.2.1"
+      , persistent = H.callHackage "persistent" "2.14.6.0"
+      , persistent-template = H.callHackage "persistent-template" "2.12.0.0"
       , polyparse = H.callHackage "polyparse" "1.13"
       , polysemy =
           H.callGit
@@ -55,6 +68,7 @@ let packages =
             "cc2e88c3400a6548e975830c9addb12ab087545f"
             (None H.Subdir)
       , regex-compat = H.callHackage "regex-compat" "0.95.2.1"
+      , resource-pool = H.callHackage "resource-pool" "0.4.0.0"
       , rio = H.callHackage "rio" "0.1.22.0"
       , sdl2 = H.callHackage "sdl2" "2.5.5.0"
       , selda =
@@ -72,8 +86,11 @@ let packages =
             "https://github.com/haskell-servant/servant"
             "459ecef93b16a5f5efedb4c4af29bb0674a23bb9"
             (Some "servant-server/")
+      , shakespeare = H.callHackage "shakespeare" "2.1.0.1"
       , should-not-typecheck = H.callHackage "should-not-typecheck" "2.1.0"
       , sop-core = H.callHackage "sop-core" "0.5.0.2"
+      , statistics = H.callHackage "statistics" "0.16.2.1"
+      , stm-chans = H.callHackage "stm-chans" "3.0.0.9"
       , string-conversions = H.callHackage "string-conversions" "0.4.0.1"
       , th-extras =
           H.callGit
@@ -82,6 +99,7 @@ let packages =
             (None H.Subdir)
       , type-errors = H.callHackage "type-errors" "0.2.0.2"
       , unagi-chan = H.callHackage "unagi-chan" "0.4.1.4"
+      , uuid = H.callHackage "uuid" "1.3.15"
       , vinyl = H.callHackage "vinyl" "0.14.3"
       , vty = H.callHackage "vty" "5.38"
       , wai-app-static = H.callHackage "wai-app-static" "3.1.8"
diff --git a/horizon.lock b/horizon.lock
index 7a235d688534fa8396847a9e85fb36e869762a7c..86c46eceb002136d8a03307e54829f4e62bb51b2 100644
--- a/horizon.lock
+++ b/horizon.lock
@@ -38,6 +38,18 @@
   , mapValue =
       "2314e817039ecf916fb0e32fc664f980eb3d78de1aeda9265cc519bafa3fc8a4"
   }
+, { mapKey = "criterion"
+  , mapValue =
+      "e4a8b1b9003ab5ebf8d54263b48541a622f74ea64d70c4023fc08135544b3811"
+  }
+, { mapKey = "cryptohash-md5"
+  , mapValue =
+      "9674a2823622cb598a3180aacca7dbeeebac6490658fed5740bf38f565c57509"
+  }
+, { mapKey = "dense-linear-algebra"
+  , mapValue =
+      "b2c7ef19ebfeb4ef13393811be0daeabfb5bd3df0726eff251861c2e536ef4d6"
+  }
 , { mapKey = "dependent-map"
   , mapValue =
       "96b2695552bc9e2863556d74f32201821a98855f4b42ed93d46bf123b756af93"
@@ -54,6 +66,10 @@
   , mapValue =
       "37ababbac7b4467bef58102592594bce7fcd1765eaec2455106e21a5696a1af7"
   }
+, { mapKey = "doctest"
+  , mapValue =
+      "e4aff9faa004cbd56316713962d054728ddab06e787050cf19ccd8d79c248bc5"
+  }
 , { mapKey = "extensible-effects"
   , mapValue =
       "c86a27821039fbd713bd92bf5f08a6eff0222acbe4ed6e9ac37645e1cd1bb96c"
@@ -102,10 +118,30 @@
   , mapValue =
       "4dfbaf4c685ff831b3a9e5a35e673b6bf245da467485e96ed4fb654bb5c0b6ef"
   }
+, { mapKey = "js-chart"
+  , mapValue =
+      "19eeffb5e19abfa212398cbe7ebfee92f63777fd2effbe63441376bab1165f94"
+  }
+, { mapKey = "lift-type"
+  , mapValue =
+      "be05eab1dfcaa5cb8435ea4612dd7eabdb02828ee8aeb720458d5572f53619ee"
+  }
 , { mapKey = "linear"
   , mapValue =
       "41364bb735224396e6cf581df0894067b046c6b25a49edfd181a1397ad36e704"
   }
+, { mapKey = "microstache"
+  , mapValue =
+      "50fb2927ba54206a2c984fa16321c754b5503300c60d08be0f34fd2613f3cc3e"
+  }
+, { mapKey = "monad-logger"
+  , mapValue =
+      "84ca4de5631f2dd87dbacf3727c07845132bfbddfeb5d6ba6550543d65b33f29"
+  }
+, { mapKey = "monad-loops"
+  , mapValue =
+      "069cf82ce5a085a77258ebfaabfba2566bc2888f5d72a4b57514d5409731686c"
+  }
 , { mapKey = "monoidal-containers"
   , mapValue =
       "fe231d0deb7d8ad6d8fc5e7887988bd45703811de4708b6a2980c6fb9f6a9c02"
@@ -114,6 +150,10 @@
   , mapValue =
       "1406171089b80250e5a8094b71f1f18190a8c6cac67d96f527342154a195144e"
   }
+, { mapKey = "network-info"
+  , mapValue =
+      "12e87155cbaf5ea6a2f22cd9aec97de13b2728ab88832ed6c437ad96b0435f3f"
+  }
 , { mapKey = "newtype"
   , mapValue =
       "e98b8094fe2444ddb67d04b900970f9f27e6949647f4863943bd93c9cf726cc8"
@@ -134,6 +174,18 @@
   , mapValue =
       "e341b0f6a4ef55382564c1f355e073f9f7eb77b39c694056b82975596fffed5c"
   }
+, { mapKey = "path-pieces"
+  , mapValue =
+      "b5cb94b7f0268c5881e43369618d89c27538b6af59fa73224c29ec55b1bcf74e"
+  }
+, { mapKey = "persistent"
+  , mapValue =
+      "c13cc5787b978ed858a47a23d49059153438299a017d3b81c5d93d51d463b589"
+  }
+, { mapKey = "persistent-template"
+  , mapValue =
+      "f12bf8f404c528949bf51ed6ca77cf88f761e3131a90f6af9cdfcc2d23898c89"
+  }
 , { mapKey = "polyparse"
   , mapValue =
       "55494b6d76632a3bccd046bfadf42f16a38ee2fea97c8be2332288f046828166"
@@ -158,6 +210,10 @@
   , mapValue =
       "8f62026ce56b7b9d9e49385de464d123d7746324eb2f8c01bccd809be74420fe"
   }
+, { mapKey = "resource-pool"
+  , mapValue =
+      "5990c9369973151e2432bd0de2a0e15e834bf9d269a981c564428199580c0b48"
+  }
 , { mapKey = "rio"
   , mapValue =
       "d70148f3743e3ffb129682ab5e19ee02f72438ee09d0841f8b14678116447928"
@@ -178,6 +234,10 @@
   , mapValue =
       "27857d9dc7754cb85de3b0e9df3826b7b6c28443a773a91c8bb21cfe42e2fa90"
   }
+, { mapKey = "shakespeare"
+  , mapValue =
+      "41d2c7df9a33d8abf6c226daa491f4acc6c2845629d64064c48b6982b7716f37"
+  }
 , { mapKey = "should-not-typecheck"
   , mapValue =
       "3fea0aa4c2841b8816816771fa19d65c5d88c9a4c7f3d2ba029f721e53c40b2d"
@@ -186,6 +246,14 @@
   , mapValue =
       "1dd4a5554cfd3bf9f28a96b2df0acb0e13494d73f1cfe97e58881cf2c20ff6de"
   }
+, { mapKey = "statistics"
+  , mapValue =
+      "286f3816d821d547ede9f8f6ded0b00ad177c712b9d3bcb8ddecf49461df9dac"
+  }
+, { mapKey = "stm-chans"
+  , mapValue =
+      "fc9289f0bec683860594e5edc8db3d1d5d35a1fe8846635afe0635dc94f37490"
+  }
 , { mapKey = "string-conversions"
   , mapValue =
       "3b17cdddd313ca9f56fba686a9fbe7a3471b1b2296cee0f45c201529ea727f87"
@@ -202,6 +270,10 @@
   , mapValue =
       "7c414bdc0a1007c4aded0b3c5069bc544fa36d369914245cc3c31c13fd591129"
   }
+, { mapKey = "uuid"
+  , mapValue =
+      "5ccb648a6c71bf6d73ccd03ee29f09c56085745e69d2f530a6be1b534cce6c51"
+  }
 , { mapKey = "vinyl"
   , mapValue =
       "5ab98e7da960ec2c46107f055eaa833b4ae75c6956191350c638d29b24018cd6"
diff --git a/overlay.nix b/overlay.nix
index 1bc50f1f0a776b7bb458e35b34e5a7eb328485b4..cbabb0aae2eff7059d01aff3f246848bcdf95748 100644
--- a/overlay.nix
+++ b/overlay.nix
@@ -21,6 +21,12 @@ final: prev: with pkgs.haskell.lib; {
 
   cpphs = final.callPackage (./pkgs/cpphs.nix) { };
 
+  criterion = final.callPackage (./pkgs/criterion.nix) { };
+
+  cryptohash-md5 = final.callPackage (./pkgs/cryptohash-md5.nix) { };
+
+  dense-linear-algebra = final.callPackage (./pkgs/dense-linear-algebra.nix) { };
+
   dependent-map = final.callPackage (./pkgs/dependent-map.nix) { };
 
   dependent-sum = final.callPackage (./pkgs/dependent-sum.nix) { };
@@ -29,6 +35,8 @@ final: prev: with pkgs.haskell.lib; {
 
   deriving-compat = final.callPackage (./pkgs/deriving-compat.nix) { };
 
+  doctest = final.callPackage (./pkgs/doctest.nix) { };
+
   extensible-effects = final.callPackage (./pkgs/extensible-effects.nix) { };
 
   file-embed = final.callPackage (./pkgs/file-embed.nix) { };
@@ -53,12 +61,24 @@ final: prev: with pkgs.haskell.lib; {
 
   indexed-profunctors = final.callPackage (./pkgs/indexed-profunctors.nix) { };
 
+  js-chart = final.callPackage (./pkgs/js-chart.nix) { };
+
+  lift-type = final.callPackage (./pkgs/lift-type.nix) { };
+
   linear = final.callPackage (./pkgs/linear.nix) { };
 
+  microstache = final.callPackage (./pkgs/microstache.nix) { };
+
+  monad-logger = final.callPackage (./pkgs/monad-logger.nix) { };
+
+  monad-loops = final.callPackage (./pkgs/monad-loops.nix) { };
+
   monoidal-containers = final.callPackage (./pkgs/monoidal-containers.nix) { };
 
   mtl-compat = final.callPackage (./pkgs/mtl-compat.nix) { };
 
+  network-info = final.callPackage (./pkgs/network-info.nix) { };
+
   newtype = final.callPackage (./pkgs/newtype.nix) { };
 
   optics = final.callPackage (./pkgs/optics.nix) { };
@@ -69,6 +89,12 @@ final: prev: with pkgs.haskell.lib; {
 
   optics-th = final.callPackage (./pkgs/optics-th.nix) { };
 
+  path-pieces = final.callPackage (./pkgs/path-pieces.nix) { };
+
+  persistent = final.callPackage (./pkgs/persistent.nix) { };
+
+  persistent-template = final.callPackage (./pkgs/persistent-template.nix) { };
+
   polyparse = final.callPackage (./pkgs/polyparse.nix) { };
 
   polysemy = final.callPackage (./pkgs/polysemy.nix) { };
@@ -81,6 +107,8 @@ final: prev: with pkgs.haskell.lib; {
 
   regex-compat = final.callPackage (./pkgs/regex-compat.nix) { };
 
+  resource-pool = final.callPackage (./pkgs/resource-pool.nix) { };
+
   rio = final.callPackage (./pkgs/rio.nix) { };
 
   sdl2 = final.callPackage (./pkgs/sdl2.nix) { };
@@ -91,10 +119,16 @@ final: prev: with pkgs.haskell.lib; {
 
   servant-server = final.callPackage (./pkgs/servant-server.nix) { };
 
+  shakespeare = final.callPackage (./pkgs/shakespeare.nix) { };
+
   should-not-typecheck = final.callPackage (./pkgs/should-not-typecheck.nix) { };
 
   sop-core = final.callPackage (./pkgs/sop-core.nix) { };
 
+  statistics = final.callPackage (./pkgs/statistics.nix) { };
+
+  stm-chans = final.callPackage (./pkgs/stm-chans.nix) { };
+
   string-conversions = final.callPackage (./pkgs/string-conversions.nix) { };
 
   th-extras = final.callPackage (./pkgs/th-extras.nix) { };
@@ -103,6 +137,8 @@ final: prev: with pkgs.haskell.lib; {
 
   unagi-chan = final.callPackage (./pkgs/unagi-chan.nix) { };
 
+  uuid = final.callPackage (./pkgs/uuid.nix) { };
+
   vinyl = final.callPackage (./pkgs/vinyl.nix) { };
 
   vty = final.callPackage (./pkgs/vty.nix) { };
diff --git a/pkgs/criterion.nix b/pkgs/criterion.nix
new file mode 100644
index 0000000000000000000000000000000000000000..c9168567cbf51a06d1ef2d992b45e5a443a93f0d
--- /dev/null
+++ b/pkgs/criterion.nix
@@ -0,0 +1,44 @@
+{ mkDerivation, Glob, HUnit, QuickCheck, aeson, base, base-compat
+, base-compat-batteries, binary, binary-orphans, bytestring
+, cassava, code-page, containers, criterion-measurement, deepseq
+, directory, exceptions, filepath, js-chart, lib, microstache, mtl
+, mwc-random, optparse-applicative, parsec, prettyprinter
+, prettyprinter-ansi-terminal, statistics, tasty, tasty-hunit
+, tasty-quickcheck, text, time, transformers, transformers-compat
+, vector, vector-algorithms
+}:
+mkDerivation {
+  pname = "criterion";
+  version = "1.6.3.0";
+  sha256 = "c31711e2596adf0c46b2451a151357d28633b1bc1a430070758ef3d49ede9ba2";
+  isLibrary = true;
+  isExecutable = true;
+  enableSeparateDataOutput = true;
+  libraryHaskellDepends = [
+    aeson base base-compat-batteries binary binary-orphans bytestring
+    cassava code-page containers criterion-measurement deepseq
+    directory exceptions filepath Glob js-chart microstache mtl
+    mwc-random optparse-applicative parsec prettyprinter
+    prettyprinter-ansi-terminal statistics text time transformers
+    transformers-compat vector vector-algorithms
+  ];
+  executableHaskellDepends = [
+    base base-compat-batteries optparse-applicative
+  ];
+  testHaskellDepends = [
+    aeson base base-compat base-compat-batteries bytestring deepseq
+    directory HUnit QuickCheck statistics tasty tasty-hunit
+    tasty-quickcheck vector
+  ];
+  enableLibraryProfiling = true;
+  enableExecutableProfiling = true;
+  doHaddock = false;
+  jailbreak = true;
+  doCheck = false;
+  doBenchmark = false;
+  hyperlinkSource = false;
+  homepage = "http://www.serpentine.com/criterion";
+  description = "Robust, reliable performance measurement and analysis";
+  license = lib.licenses.bsd3;
+  broken = false;
+}
\ No newline at end of file
diff --git a/pkgs/cryptohash-md5.nix b/pkgs/cryptohash-md5.nix
new file mode 100644
index 0000000000000000000000000000000000000000..6d3bc5cdf99dd91e68f11cc88971fb4d430bc985
--- /dev/null
+++ b/pkgs/cryptohash-md5.nix
@@ -0,0 +1,30 @@
+{ mkDerivation, base, base16-bytestring, bytestring, criterion, lib
+, pureMD5, tasty, tasty-hunit, tasty-quickcheck
+}:
+mkDerivation {
+  pname = "cryptohash-md5";
+  version = "0.11.101.0";
+  sha256 = "3b08db0ae39df2b44e83053ad30d7546a4c6200a852c22a240a7e03ae1080f05";
+  revision = "3";
+  editedCabalFile = "1v7gv0xa9yfkxq3g9j79ppzn6hjf467aajzb4x5882yflibfi9ki";
+  isLibrary = true;
+  isExecutable = false;
+  enableSeparateDataOutput = false;
+  libraryHaskellDepends = [ base bytestring ];
+  testHaskellDepends = [
+    base base16-bytestring bytestring pureMD5 tasty tasty-hunit
+    tasty-quickcheck
+  ];
+  benchmarkHaskellDepends = [ base bytestring criterion ];
+  enableLibraryProfiling = true;
+  enableExecutableProfiling = true;
+  doHaddock = false;
+  jailbreak = true;
+  doCheck = false;
+  doBenchmark = false;
+  hyperlinkSource = false;
+  homepage = "https://github.com/haskell-hvr/cryptohash-md5";
+  description = "Fast, pure and practical MD5 implementation";
+  license = lib.licenses.bsd3;
+  broken = false;
+}
\ No newline at end of file
diff --git a/pkgs/dense-linear-algebra.nix b/pkgs/dense-linear-algebra.nix
new file mode 100644
index 0000000000000000000000000000000000000000..f7459184c240f3389b7c3f9461d556f8c69091ee
--- /dev/null
+++ b/pkgs/dense-linear-algebra.nix
@@ -0,0 +1,27 @@
+{ mkDerivation, QuickCheck, base, deepseq, hspec, lib
+, math-functions, primitive, vector, vector-algorithms
+, vector-binary-instances, vector-th-unbox
+}:
+mkDerivation {
+  pname = "dense-linear-algebra";
+  version = "0.1.0.0";
+  sha256 = "f7777a7931b40332ebbc716f64abb63697cbab0128e5c1228d47760c5597f2d4";
+  isLibrary = true;
+  isExecutable = false;
+  enableSeparateDataOutput = false;
+  libraryHaskellDepends = [
+    base deepseq math-functions primitive vector vector-algorithms
+    vector-binary-instances vector-th-unbox
+  ];
+  testHaskellDepends = [ base hspec QuickCheck ];
+  enableLibraryProfiling = true;
+  enableExecutableProfiling = true;
+  doHaddock = false;
+  jailbreak = true;
+  doCheck = false;
+  doBenchmark = false;
+  hyperlinkSource = false;
+  description = "Simple and incomplete pure haskell implementation of linear algebra";
+  license = lib.licenses.bsd2;
+  broken = false;
+}
\ No newline at end of file
diff --git a/pkgs/doctest.nix b/pkgs/doctest.nix
new file mode 100644
index 0000000000000000000000000000000000000000..7fb87bc3390aecb3e634274e7ce655ecad03d406
--- /dev/null
+++ b/pkgs/doctest.nix
@@ -0,0 +1,38 @@
+{ mkDerivation, HUnit, QuickCheck, base, code-page, deepseq
+, directory, exceptions, filepath, ghc, ghc-paths, hspec
+, hspec-core, hspec-discover, lib, mockery, process, setenv
+, silently, stringbuilder, syb, transformers
+}:
+mkDerivation {
+  pname = "doctest";
+  version = "0.22.1";
+  sha256 = "b39be8ba2b0f94dced352515955c5cce68c9ec5edc116bf52b8ed61f296b5f77";
+  isLibrary = true;
+  isExecutable = true;
+  enableSeparateDataOutput = false;
+  libraryHaskellDepends = [
+    base code-page deepseq directory exceptions filepath ghc ghc-paths
+    process syb transformers
+  ];
+  executableHaskellDepends = [
+    base code-page deepseq directory exceptions filepath ghc ghc-paths
+    process syb transformers
+  ];
+  testHaskellDepends = [
+    base code-page deepseq directory exceptions filepath ghc ghc-paths
+    hspec hspec-core HUnit mockery process QuickCheck setenv silently
+    stringbuilder syb transformers
+  ];
+  testToolDepends = [ hspec-discover ];
+  enableLibraryProfiling = true;
+  enableExecutableProfiling = true;
+  doHaddock = false;
+  jailbreak = true;
+  doCheck = false;
+  doBenchmark = false;
+  hyperlinkSource = false;
+  homepage = "https://github.com/sol/doctest#readme";
+  description = "Test interactive Haskell examples";
+  license = lib.licenses.mit;
+  broken = false;
+}
\ No newline at end of file
diff --git a/pkgs/js-chart.nix b/pkgs/js-chart.nix
new file mode 100644
index 0000000000000000000000000000000000000000..00670ec0f027a18af8acd74d29c7670377445ecc
--- /dev/null
+++ b/pkgs/js-chart.nix
@@ -0,0 +1,22 @@
+{ mkDerivation, base, lib }:
+mkDerivation {
+  pname = "js-chart";
+  version = "2.9.4.1";
+  sha256 = "0a08efdd35bd1b8f293f9163f59305f31835304b74c3e3a1a840fc94bbc9bd0e";
+  isLibrary = true;
+  isExecutable = false;
+  enableSeparateDataOutput = true;
+  libraryHaskellDepends = [ base ];
+  testHaskellDepends = [ base ];
+  enableLibraryProfiling = true;
+  enableExecutableProfiling = true;
+  doHaddock = false;
+  jailbreak = true;
+  doCheck = false;
+  doBenchmark = false;
+  hyperlinkSource = false;
+  homepage = "https://github.com/jonascarpay/js-chart#readme";
+  description = "Obtain minified chart.js code";
+  license = lib.licenses.mit;
+  broken = false;
+}
\ No newline at end of file
diff --git a/pkgs/lift-type.nix b/pkgs/lift-type.nix
new file mode 100644
index 0000000000000000000000000000000000000000..314d012a46605ab8329a58f08fd6615a1a7919bb
--- /dev/null
+++ b/pkgs/lift-type.nix
@@ -0,0 +1,22 @@
+{ mkDerivation, base, lib, template-haskell }:
+mkDerivation {
+  pname = "lift-type";
+  version = "0.1.1.1";
+  sha256 = "10d81032a69175a9c0c6f97358962ac8e5663b1b9a798fc96c7ec227aad7370d";
+  isLibrary = true;
+  isExecutable = false;
+  enableSeparateDataOutput = false;
+  libraryHaskellDepends = [ base template-haskell ];
+  testHaskellDepends = [ base template-haskell ];
+  enableLibraryProfiling = true;
+  enableExecutableProfiling = true;
+  doHaddock = false;
+  jailbreak = true;
+  doCheck = false;
+  doBenchmark = false;
+  hyperlinkSource = false;
+  homepage = "https://github.com/parsonsmatt/lift-type#readme";
+  description = "Lift a type from a Typeable constraint to a Template Haskell type";
+  license = lib.licenses.bsd3;
+  broken = false;
+}
\ No newline at end of file
diff --git a/pkgs/microstache.nix b/pkgs/microstache.nix
new file mode 100644
index 0000000000000000000000000000000000000000..c59deb92689fd332a0c520096a387be4165a2f70
--- /dev/null
+++ b/pkgs/microstache.nix
@@ -0,0 +1,33 @@
+{ mkDerivation, aeson, base, base-orphans, bytestring, containers
+, deepseq, directory, filepath, lib, parsec, tasty, tasty-hunit
+, text, transformers, unordered-containers, vector
+}:
+mkDerivation {
+  pname = "microstache";
+  version = "1.0.2.3";
+  sha256 = "df7a13175783603bfb095e7a5eda9a24eec7d5fd490946d107ad578bb436d29a";
+  revision = "2";
+  editedCabalFile = "0rafypnzzxmxhbc3lyd8ylyfrygijipbgh267slzkwfa8hikd0nz";
+  isLibrary = true;
+  isExecutable = false;
+  enableSeparateDataOutput = false;
+  libraryHaskellDepends = [
+    aeson base containers deepseq directory filepath parsec text
+    transformers unordered-containers vector
+  ];
+  testHaskellDepends = [
+    aeson base base-orphans bytestring containers parsec tasty
+    tasty-hunit text
+  ];
+  enableLibraryProfiling = true;
+  enableExecutableProfiling = true;
+  doHaddock = false;
+  jailbreak = true;
+  doCheck = false;
+  doBenchmark = false;
+  hyperlinkSource = false;
+  homepage = "https://github.com/haskellari/microstache";
+  description = "Mustache templates for Haskell";
+  license = lib.licenses.bsd3;
+  broken = false;
+}
\ No newline at end of file
diff --git a/pkgs/monad-logger.nix b/pkgs/monad-logger.nix
new file mode 100644
index 0000000000000000000000000000000000000000..f88fb156aa64f029e1aec178fbbe8e2658b720fa
--- /dev/null
+++ b/pkgs/monad-logger.nix
@@ -0,0 +1,31 @@
+{ mkDerivation, base, bytestring, conduit, conduit-extra
+, exceptions, fast-logger, lib, lifted-base, monad-control
+, monad-loops, mtl, resourcet, stm, stm-chans, template-haskell
+, text, transformers, transformers-base, transformers-compat
+, unliftio-core
+}:
+mkDerivation {
+  pname = "monad-logger";
+  version = "0.3.40";
+  sha256 = "cbed8667cff6dede6ceac5127bc713b30b700c480fd1405028bd0493f424cea9";
+  isLibrary = true;
+  isExecutable = false;
+  enableSeparateDataOutput = false;
+  libraryHaskellDepends = [
+    base bytestring conduit conduit-extra exceptions fast-logger
+    lifted-base monad-control monad-loops mtl resourcet stm stm-chans
+    template-haskell text transformers transformers-base
+    transformers-compat unliftio-core
+  ];
+  enableLibraryProfiling = true;
+  enableExecutableProfiling = true;
+  doHaddock = false;
+  jailbreak = true;
+  doCheck = false;
+  doBenchmark = false;
+  hyperlinkSource = false;
+  homepage = "https://github.com/snoyberg/monad-logger#readme";
+  description = "A class of monads which can log messages";
+  license = lib.licenses.mit;
+  broken = false;
+}
\ No newline at end of file
diff --git a/pkgs/monad-loops.nix b/pkgs/monad-loops.nix
new file mode 100644
index 0000000000000000000000000000000000000000..aa45a2dc955dd599973560636ea6720c510d44ee
--- /dev/null
+++ b/pkgs/monad-loops.nix
@@ -0,0 +1,22 @@
+{ mkDerivation, base, lib, tasty, tasty-hunit }:
+mkDerivation {
+  pname = "monad-loops";
+  version = "0.4.3";
+  sha256 = "7eaaaf6bc43661e9e86e310ff8c56fbea16eb6bf13c31a2e28103138ac164c18";
+  isLibrary = true;
+  isExecutable = false;
+  enableSeparateDataOutput = false;
+  libraryHaskellDepends = [ base ];
+  testHaskellDepends = [ base tasty tasty-hunit ];
+  enableLibraryProfiling = true;
+  enableExecutableProfiling = true;
+  doHaddock = false;
+  jailbreak = true;
+  doCheck = false;
+  doBenchmark = false;
+  hyperlinkSource = false;
+  homepage = "https://github.com/mokus0/monad-loops";
+  description = "Monadic loops";
+  license = lib.licenses.publicDomain;
+  broken = false;
+}
\ No newline at end of file
diff --git a/pkgs/network-info.nix b/pkgs/network-info.nix
new file mode 100644
index 0000000000000000000000000000000000000000..26fd5d93db318fe98da9bb044831176a435e429a
--- /dev/null
+++ b/pkgs/network-info.nix
@@ -0,0 +1,21 @@
+{ mkDerivation, base, lib }:
+mkDerivation {
+  pname = "network-info";
+  version = "0.2.1";
+  sha256 = "9b2d88312fc8280351d5003200cc07decbb865f85d3aa7b1094b238bd6a8b404";
+  isLibrary = true;
+  isExecutable = false;
+  enableSeparateDataOutput = false;
+  libraryHaskellDepends = [ base ];
+  enableLibraryProfiling = true;
+  enableExecutableProfiling = true;
+  doHaddock = false;
+  jailbreak = true;
+  doCheck = false;
+  doBenchmark = false;
+  hyperlinkSource = false;
+  homepage = "http://github.com/jacobstanley/network-info";
+  description = "Access the local computer's basic network configuration";
+  license = lib.licenses.bsd3;
+  broken = false;
+}
\ No newline at end of file
diff --git a/pkgs/path-pieces.nix b/pkgs/path-pieces.nix
new file mode 100644
index 0000000000000000000000000000000000000000..dc93c5252299b78f2b6970d7acfff93ee79d3cf4
--- /dev/null
+++ b/pkgs/path-pieces.nix
@@ -0,0 +1,23 @@
+{ mkDerivation, HUnit, QuickCheck, base, hspec, lib, text, time }:
+mkDerivation {
+  pname = "path-pieces";
+  version = "0.2.1";
+  sha256 = "080bd49f53e20597ca3e5962e0c279a3422345f5b088840a30a751cd76d4a36f";
+  revision = "1";
+  editedCabalFile = "0p7wsphh513s8l5d62lzgbhk2l1h6kj5y7bc27qqjsry9g8ah4y7";
+  isLibrary = true;
+  isExecutable = false;
+  enableSeparateDataOutput = false;
+  libraryHaskellDepends = [ base text time ];
+  testHaskellDepends = [ base hspec HUnit QuickCheck text ];
+  enableLibraryProfiling = true;
+  enableExecutableProfiling = true;
+  doHaddock = false;
+  jailbreak = true;
+  doCheck = false;
+  doBenchmark = false;
+  hyperlinkSource = false;
+  description = "Components of paths";
+  license = lib.licenses.bsd3;
+  broken = false;
+}
\ No newline at end of file
diff --git a/pkgs/persistent-template.nix b/pkgs/persistent-template.nix
new file mode 100644
index 0000000000000000000000000000000000000000..bf30342e7263e6db49a48c21d3c07ba9c7f358e6
--- /dev/null
+++ b/pkgs/persistent-template.nix
@@ -0,0 +1,21 @@
+{ mkDerivation, base, lib }:
+mkDerivation {
+  pname = "persistent-template";
+  version = "2.12.0.0";
+  sha256 = "dc488b567d373ebfbf5f3df8bba240e6203d1b13556872648d5f0d228fd02c31";
+  isLibrary = true;
+  isExecutable = false;
+  enableSeparateDataOutput = false;
+  libraryHaskellDepends = [ base ];
+  enableLibraryProfiling = true;
+  enableExecutableProfiling = true;
+  doHaddock = false;
+  jailbreak = true;
+  doCheck = false;
+  doBenchmark = false;
+  hyperlinkSource = false;
+  homepage = "http://www.yesodweb.com/book/persistent";
+  description = "Type-safe, non-relational, multi-backend persistence";
+  license = lib.licenses.mit;
+  broken = false;
+}
\ No newline at end of file
diff --git a/pkgs/persistent.nix b/pkgs/persistent.nix
new file mode 100644
index 0000000000000000000000000000000000000000..f99372dd186956560411eab89ac06cc12f909e35
--- /dev/null
+++ b/pkgs/persistent.nix
@@ -0,0 +1,47 @@
+{ mkDerivation, QuickCheck, aeson, attoparsec, attoparsec-aeson
+, base, base64-bytestring, blaze-html, bytestring, conduit
+, containers, criterion, deepseq, fast-logger, file-embed, hspec
+, http-api-data, lib, lift-type, monad-logger, mtl, path-pieces
+, quickcheck-instances, resource-pool, resourcet, scientific
+, shakespeare, silently, template-haskell, text, th-lift-instances
+, time, transformers, unliftio, unliftio-core, unordered-containers
+, vault, vector
+}:
+mkDerivation {
+  pname = "persistent";
+  version = "2.14.6.0";
+  sha256 = "6e2b300797060e091624ebd4d1d5b0b3dad200acf7b9bf2bccfb1c538db6e53b";
+  isLibrary = true;
+  isExecutable = false;
+  enableSeparateDataOutput = false;
+  libraryHaskellDepends = [
+    aeson attoparsec attoparsec-aeson base base64-bytestring blaze-html
+    bytestring conduit containers deepseq fast-logger http-api-data
+    lift-type monad-logger mtl path-pieces resource-pool resourcet
+    scientific silently template-haskell text th-lift-instances time
+    transformers unliftio unliftio-core unordered-containers vault
+    vector
+  ];
+  testHaskellDepends = [
+    aeson attoparsec base base64-bytestring blaze-html bytestring
+    conduit containers deepseq fast-logger hspec http-api-data
+    monad-logger mtl path-pieces QuickCheck quickcheck-instances
+    resource-pool resourcet scientific shakespeare silently
+    template-haskell text th-lift-instances time transformers unliftio
+    unliftio-core unordered-containers vector
+  ];
+  benchmarkHaskellDepends = [
+    base criterion deepseq file-embed template-haskell text
+  ];
+  enableLibraryProfiling = true;
+  enableExecutableProfiling = true;
+  doHaddock = false;
+  jailbreak = true;
+  doCheck = false;
+  doBenchmark = false;
+  hyperlinkSource = false;
+  homepage = "http://www.yesodweb.com/book/persistent";
+  description = "Type-safe, multi-backend data serialization";
+  license = lib.licenses.mit;
+  broken = false;
+}
\ No newline at end of file
diff --git a/pkgs/resource-pool.nix b/pkgs/resource-pool.nix
new file mode 100644
index 0000000000000000000000000000000000000000..1d620cdf273d9087272adfc87db2a908b100ca2b
--- /dev/null
+++ b/pkgs/resource-pool.nix
@@ -0,0 +1,20 @@
+{ mkDerivation, base, hashable, lib, primitive, time }:
+mkDerivation {
+  pname = "resource-pool";
+  version = "0.4.0.0";
+  sha256 = "8c0d783e3e75788d65f79157309132999f1bbb70684bacc2ea5dd18f904ae9b1";
+  isLibrary = true;
+  isExecutable = false;
+  enableSeparateDataOutput = false;
+  libraryHaskellDepends = [ base hashable primitive time ];
+  enableLibraryProfiling = true;
+  enableExecutableProfiling = true;
+  doHaddock = false;
+  jailbreak = true;
+  doCheck = false;
+  doBenchmark = false;
+  hyperlinkSource = false;
+  description = "A high-performance striped resource pooling implementation";
+  license = lib.licenses.bsd3;
+  broken = false;
+}
\ No newline at end of file
diff --git a/pkgs/shakespeare.nix b/pkgs/shakespeare.nix
new file mode 100644
index 0000000000000000000000000000000000000000..4ee81244ae9b6931edc34a6f38e0938cc482b7c4
--- /dev/null
+++ b/pkgs/shakespeare.nix
@@ -0,0 +1,36 @@
+{ mkDerivation, HUnit, aeson, base, blaze-html, blaze-markup
+, bytestring, containers, directory, exceptions, file-embed
+, ghc-prim, hspec, lib, parsec, process, scientific
+, template-haskell, text, th-lift, time, transformers
+, unordered-containers, vector
+}:
+mkDerivation {
+  pname = "shakespeare";
+  version = "2.1.0.1";
+  sha256 = "6cb655f3734de1b920faf67f313d45e31fc7f8fcf0a2e00a45f986d8e107d22f";
+  isLibrary = true;
+  isExecutable = false;
+  enableSeparateDataOutput = false;
+  libraryHaskellDepends = [
+    aeson base blaze-html blaze-markup bytestring containers directory
+    exceptions file-embed ghc-prim parsec process scientific
+    template-haskell text th-lift time transformers
+    unordered-containers vector
+  ];
+  testHaskellDepends = [
+    aeson base blaze-html blaze-markup bytestring containers directory
+    exceptions ghc-prim hspec HUnit parsec process template-haskell
+    text time transformers
+  ];
+  enableLibraryProfiling = true;
+  enableExecutableProfiling = true;
+  doHaddock = false;
+  jailbreak = true;
+  doCheck = false;
+  doBenchmark = false;
+  hyperlinkSource = false;
+  homepage = "http://www.yesodweb.com/book/shakespearean-templates";
+  description = "A toolkit for making compile-time interpolated templates";
+  license = lib.licenses.mit;
+  broken = false;
+}
\ No newline at end of file
diff --git a/pkgs/statistics.nix b/pkgs/statistics.nix
new file mode 100644
index 0000000000000000000000000000000000000000..3615e76c181fa82ff9028f6fdbe842062f47bc68
--- /dev/null
+++ b/pkgs/statistics.nix
@@ -0,0 +1,37 @@
+{ mkDerivation, QuickCheck, aeson, async, base, binary
+, data-default-class, deepseq, dense-linear-algebra, erf, ieee754
+, lib, math-functions, mwc-random, parallel, primitive, random
+, tasty, tasty-expected-failure, tasty-hunit, tasty-quickcheck
+, vector, vector-algorithms, vector-binary-instances
+, vector-th-unbox
+}:
+mkDerivation {
+  pname = "statistics";
+  version = "0.16.2.1";
+  sha256 = "a7c0c068a0d1f784d865163748a40fbbdda48febe3b905063a22ce7a32e05ce4";
+  isLibrary = true;
+  isExecutable = false;
+  enableSeparateDataOutput = false;
+  libraryHaskellDepends = [
+    aeson async base binary data-default-class deepseq
+    dense-linear-algebra math-functions mwc-random parallel primitive
+    random vector vector-algorithms vector-binary-instances
+    vector-th-unbox
+  ];
+  testHaskellDepends = [
+    aeson base binary dense-linear-algebra erf ieee754 math-functions
+    primitive QuickCheck tasty tasty-expected-failure tasty-hunit
+    tasty-quickcheck vector vector-algorithms
+  ];
+  enableLibraryProfiling = true;
+  enableExecutableProfiling = true;
+  doHaddock = false;
+  jailbreak = true;
+  doCheck = false;
+  doBenchmark = false;
+  hyperlinkSource = false;
+  homepage = "https://github.com/haskell/statistics";
+  description = "A library of statistical types, data, and functions";
+  license = lib.licenses.bsd2;
+  broken = false;
+}
\ No newline at end of file
diff --git a/pkgs/stm-chans.nix b/pkgs/stm-chans.nix
new file mode 100644
index 0000000000000000000000000000000000000000..ff8dc589535ce3f5ae1adf2b4d67da3be10a6f13
--- /dev/null
+++ b/pkgs/stm-chans.nix
@@ -0,0 +1,21 @@
+{ mkDerivation, base, lib, stm }:
+mkDerivation {
+  pname = "stm-chans";
+  version = "3.0.0.9";
+  sha256 = "7a060df537cb93c98380a770f88d4a1ff08b79fe07203c859be7bc815dc1325d";
+  isLibrary = true;
+  isExecutable = false;
+  enableSeparateDataOutput = false;
+  libraryHaskellDepends = [ base stm ];
+  enableLibraryProfiling = true;
+  enableExecutableProfiling = true;
+  doHaddock = false;
+  jailbreak = true;
+  doCheck = false;
+  doBenchmark = false;
+  hyperlinkSource = false;
+  homepage = "https://wrengr.org/software/hackage.html";
+  description = "Additional types of channels for STM";
+  license = lib.licenses.bsd3;
+  broken = false;
+}
\ No newline at end of file
diff --git a/pkgs/uuid.nix b/pkgs/uuid.nix
new file mode 100644
index 0000000000000000000000000000000000000000..da38074af20574ca667410cf128ae7e2b182c849
--- /dev/null
+++ b/pkgs/uuid.nix
@@ -0,0 +1,34 @@
+{ mkDerivation, QuickCheck, base, binary, bytestring
+, cryptohash-md5, cryptohash-sha1, entropy, lib, network-info
+, random, tasty, tasty-hunit, tasty-quickcheck, text, time
+, uuid-types
+}:
+mkDerivation {
+  pname = "uuid";
+  version = "1.3.15";
+  sha256 = "f885958d8934930b7c0f9b91f980722f7f992c9383fc98f075cf9df64c800564";
+  revision = "3";
+  editedCabalFile = "089q2i4rmw8iqzjn2fif4yarnbb7gsnsa4c4zhl24l2hlyakymbx";
+  isLibrary = true;
+  isExecutable = false;
+  enableSeparateDataOutput = false;
+  libraryHaskellDepends = [
+    base binary bytestring cryptohash-md5 cryptohash-sha1 entropy
+    network-info random text time uuid-types
+  ];
+  testHaskellDepends = [
+    base bytestring QuickCheck random tasty tasty-hunit
+    tasty-quickcheck
+  ];
+  enableLibraryProfiling = true;
+  enableExecutableProfiling = true;
+  doHaddock = false;
+  jailbreak = true;
+  doCheck = false;
+  doBenchmark = false;
+  hyperlinkSource = false;
+  homepage = "https://github.com/haskell-hvr/uuid";
+  description = "For creating, comparing, parsing and printing Universally Unique Identifiers";
+  license = lib.licenses.bsd3;
+  broken = false;
+}
\ No newline at end of file