diff --git a/horizon.dhall b/horizon.dhall
index a149583c36a24fba6b89818f2d56c6619f0ee6b9..b0ecef6ee56d09646b215a7ec9d669a97d780f39 100644
--- a/horizon.dhall
+++ b/horizon.dhall
@@ -4,8 +4,11 @@ let H =
 let packages =
       { Only = H.callHackage "Only" "0.1"
       , attoparsec-iso8601 = H.callHackage "attoparsec-iso8601" "1.1.0.0"
+      , binary-orphans = H.callHackage "binary-orphans" "1.0.4.1"
       , brick = H.callHackage "brick" "1.9"
+      , bytes = H.callHackage "bytes" "0.17.2"
       , cassava = H.callHackage "cassava" "0.5.3.0"
+      , composite-base = H.callHackage "composite-base" "0.8.2.1"
       , constraints-extras = H.callHackage "constraints-extras" "0.4.0.0"
       , cpphs = H.callHackage "cpphs" "1.20.9.1"
       , dependent-map = H.callHackage "dependent-map" "0.4.0.0"
@@ -23,11 +26,17 @@ let packages =
       , hxt-charproperties = H.callHackage "hxt-charproperties" "9.5.0.0"
       , hxt-regex-xmlschema = H.callHackage "hxt-regex-xmlschema" "9.2.0.7"
       , hxt-unicode = H.callHackage "hxt-unicode" "9.0.2.4"
+      , linear = H.callHackage "linear" "1.22"
       , polyparse = H.callHackage "polyparse" "1.13"
       , polysemy = H.callHackage "polysemy" "1.9.1.0"
       , 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"
+      , selda =
+          H.callGit
+            "https://github.com/guibou/selda"
+            "54c12169ce8cd46a7b3c698f65cea55e41a13fe6"
+            (Some "selda")
       , servant =
           H.callGit
             "https://github.com/haskell-servant/servant"
@@ -44,6 +53,7 @@ let packages =
       , th-extras = H.callHackage "th-extras" "0.0.0.6"
       , type-errors = H.callHackage "type-errors" "0.2.0.2"
       , unagi-chan = H.callHackage "unagi-chan" "0.4.1.4"
+      , vinyl = H.callHackage "vinyl" "0.14.3"
       , vty = H.callHackage "vty" "5.38"
       , wai-app-static = H.callHackage "wai-app-static" "3.1.7.4"
       , wai-extra = H.callHackage "wai-extra" "3.1.13.0"
diff --git a/horizon.lock b/horizon.lock
index 2c98898b82d6c4864c412e0302db9825e1eb8891..76e949070e24959e0ad0c1330355ae31d3fe544d 100644
--- a/horizon.lock
+++ b/horizon.lock
@@ -6,14 +6,26 @@
   , mapValue =
       "e9381924b80af1d359ebf5c4d5eeabd059219603adf132913d598c1839e7eb5a"
   }
+, { mapKey = "binary-orphans"
+  , mapValue =
+      "14b21133632546a0c0313eeaeaa0bf77b2dbb381ce190d7b65ff55d8047768d6"
+  }
 , { mapKey = "brick"
   , mapValue =
       "220f9d15bf93eaa2a28c4bc6c2a056031afc9120fd28160948bafeef89e219f2"
   }
+, { mapKey = "bytes"
+  , mapValue =
+      "fbf9341467887f9af671b2b451376e1a77b491afbde39543f7530a1933c80b04"
+  }
 , { mapKey = "cassava"
   , mapValue =
       "27ce84f48eda9b16a2d8319bea7d7b96a5cb5ee41f6622abe46a7eaa667ba2ba"
   }
+, { mapKey = "composite-base"
+  , mapValue =
+      "1b18c5b7c4967631ac81924c8ee64f10f7e25fbce1fa7a7dd715d8a963380998"
+  }
 , { mapKey = "constraints-extras"
   , mapValue =
       "8e853f726b214d8ae4d678575ac47e8f6292ba983354affc7917276348040af0"
@@ -78,6 +90,10 @@
   , mapValue =
       "0f704a54006d45142f4faf04c1f09ffbcb3c11931d0b14076b806a18e3146648"
   }
+, { mapKey = "linear"
+  , mapValue =
+      "edb8c9191d3d13df10761bb4a7a9de7761a87028f7694757f825e2365516abf9"
+  }
 , { mapKey = "polyparse"
   , mapValue =
       "2cac3d1ba9be7501de571a085512834798adc0d76aea9ba65bfa460fa5cf9e09"
@@ -98,6 +114,10 @@
   , mapValue =
       "0b384fc5c7d44f762a315e6a5db0b79ad2d94170ce78099ef2e3166233c5a124"
   }
+, { mapKey = "selda"
+  , mapValue =
+      "4049c43c686ba027052b4916e3b97a4c724c9e2b69acb90632cd441727e17319"
+  }
 , { mapKey = "servant"
   , mapValue =
       "16507876e4f9cddcca51bdf96704910d2cac52a088d901743712b78e52bff38c"
@@ -130,6 +150,10 @@
   , mapValue =
       "a36ee8a9b63ae33a8b988289492c36f60f68d7b6c8984b3916283f49051da076"
   }
+, { mapKey = "vinyl"
+  , mapValue =
+      "217b7957c5b8a2321ffc5f5b8a3d68604e41148f4a20b51ba6bc7eddc4510d06"
+  }
 , { mapKey = "vty"
   , mapValue =
       "ad47834af1f16c2c1b011f283fc82294b7d5d6985e85686bf234ea3e968575a0"
diff --git a/overlay.nix b/overlay.nix
index a23640c24d661fa5d50510ab4c6c868b1979a89a..f05416fda84c361d001e41e9977a573e4bdf41f4 100644
--- a/overlay.nix
+++ b/overlay.nix
@@ -5,10 +5,16 @@ final: prev: with pkgs.haskell.lib; {
 
   attoparsec-iso8601 = final.callPackage (./pkgs/attoparsec-iso8601.nix) { };
 
+  binary-orphans = final.callPackage (./pkgs/binary-orphans.nix) { };
+
   brick = final.callPackage (./pkgs/brick.nix) { };
 
+  bytes = final.callPackage (./pkgs/bytes.nix) { };
+
   cassava = final.callPackage (./pkgs/cassava.nix) { };
 
+  composite-base = final.callPackage (./pkgs/composite-base.nix) { };
+
   constraints-extras = final.callPackage (./pkgs/constraints-extras.nix) { };
 
   cpphs = final.callPackage (./pkgs/cpphs.nix) { };
@@ -41,6 +47,8 @@ final: prev: with pkgs.haskell.lib; {
 
   hxt-unicode = final.callPackage (./pkgs/hxt-unicode.nix) { };
 
+  linear = final.callPackage (./pkgs/linear.nix) { };
+
   polyparse = final.callPackage (./pkgs/polyparse.nix) { };
 
   polysemy = final.callPackage (./pkgs/polysemy.nix) { };
@@ -51,6 +59,8 @@ final: prev: with pkgs.haskell.lib; {
 
   regex-compat = final.callPackage (./pkgs/regex-compat.nix) { };
 
+  selda = final.callPackage (./pkgs/selda.nix) { };
+
   servant = final.callPackage (./pkgs/servant.nix) { };
 
   servant-server = final.callPackage (./pkgs/servant-server.nix) { };
@@ -67,6 +77,8 @@ final: prev: with pkgs.haskell.lib; {
 
   unagi-chan = final.callPackage (./pkgs/unagi-chan.nix) { };
 
+  vinyl = final.callPackage (./pkgs/vinyl.nix) { };
+
   vty = final.callPackage (./pkgs/vty.nix) { };
 
   wai-app-static = final.callPackage (./pkgs/wai-app-static.nix) { };
diff --git a/pkgs/binary-orphans.nix b/pkgs/binary-orphans.nix
new file mode 100644
index 0000000000000000000000000000000000000000..a62abd4e41a9dfe09dd216865528bfc801453eff
--- /dev/null
+++ b/pkgs/binary-orphans.nix
@@ -0,0 +1,29 @@
+{ mkDerivation, OneTuple, QuickCheck, base, binary, lib
+, quickcheck-instances, tagged, tasty, tasty-quickcheck
+, transformers
+}:
+mkDerivation {
+  pname = "binary-orphans";
+  version = "1.0.4.1";
+  sha256 = "5f5b789bc86d25bbd054b86b2d9a6a03f4ac0dd480f283564b6d6465cfa2f0d2";
+  revision = "2";
+  editedCabalFile = "1q9fbn41fi4wfk8mrm9izy5jna86gmy7gxhz94crqfhp5f89v58l";
+  isLibrary = true;
+  isExecutable = false;
+  enableSeparateDataOutput = false;
+  libraryHaskellDepends = [ base binary transformers ];
+  testHaskellDepends = [
+    base binary OneTuple QuickCheck quickcheck-instances tagged tasty
+    tasty-quickcheck
+  ];
+  enableLibraryProfiling = true;
+  enableExecutableProfiling = true;
+  doHaddock = false;
+  jailbreak = true;
+  doCheck = false;
+  doBenchmark = false;
+  hyperlinkSource = false;
+  description = "Compatibility package for binary; provides instances";
+  license = lib.licenses.bsd3;
+  broken = false;
+}
\ No newline at end of file
diff --git a/pkgs/bytes.nix b/pkgs/bytes.nix
new file mode 100644
index 0000000000000000000000000000000000000000..5bbe9720d11b2444e466bdf83d017d4da474bca8
--- /dev/null
+++ b/pkgs/bytes.nix
@@ -0,0 +1,30 @@
+{ mkDerivation, base, binary, binary-orphans, bytestring, cereal
+, containers, hashable, lib, mtl, scientific, text, time
+, transformers, transformers-compat, unordered-containers, void
+}:
+mkDerivation {
+  pname = "bytes";
+  version = "0.17.2";
+  sha256 = "bc55f41edad589bc0ba389e8b106d7425a87390dcd5f1371e3194a9cc2c4781a";
+  revision = "1";
+  editedCabalFile = "0frs6ag93kmg2fw3vd686czx8g7h9qmdn1ip6wdk96d94ap0fz9i";
+  isLibrary = true;
+  isExecutable = false;
+  enableSeparateDataOutput = false;
+  libraryHaskellDepends = [
+    base binary binary-orphans bytestring cereal containers hashable
+    mtl scientific text time transformers transformers-compat
+    unordered-containers void
+  ];
+  enableLibraryProfiling = true;
+  enableExecutableProfiling = true;
+  doHaddock = false;
+  jailbreak = true;
+  doCheck = false;
+  doBenchmark = false;
+  hyperlinkSource = false;
+  homepage = "https://github.com/ekmett/bytes";
+  description = "Sharing code for serialization between binary and cereal";
+  license = lib.licenses.bsd3;
+  broken = false;
+}
\ No newline at end of file
diff --git a/pkgs/composite-base.nix b/pkgs/composite-base.nix
new file mode 100644
index 0000000000000000000000000000000000000000..9eca883b45de734a8314f830b35fa7fddcb53e9a
--- /dev/null
+++ b/pkgs/composite-base.nix
@@ -0,0 +1,33 @@
+{ mkDerivation, QuickCheck, base, deepseq, exceptions, hspec, lens
+, lib, monad-control, mtl, profunctors, template-haskell, text
+, transformers, transformers-base, unliftio-core, vinyl
+}:
+mkDerivation {
+  pname = "composite-base";
+  version = "0.8.2.1";
+  sha256 = "31b7fe24885d2db164524a4477058157592ae06a75da5259f0eafc5760555544";
+  isLibrary = true;
+  isExecutable = false;
+  enableSeparateDataOutput = false;
+  libraryHaskellDepends = [
+    base deepseq exceptions lens monad-control mtl profunctors
+    template-haskell text transformers transformers-base unliftio-core
+    vinyl
+  ];
+  testHaskellDepends = [
+    base deepseq exceptions hspec lens monad-control mtl profunctors
+    QuickCheck template-haskell text transformers transformers-base
+    unliftio-core vinyl
+  ];
+  enableLibraryProfiling = true;
+  enableExecutableProfiling = true;
+  doHaddock = false;
+  jailbreak = true;
+  doCheck = false;
+  doBenchmark = false;
+  hyperlinkSource = false;
+  homepage = "https://github.com/composite-hs/composite-base#readme";
+  description = "Shared utilities for composite-* packages";
+  license = lib.licenses.bsd3;
+  broken = false;
+}
\ No newline at end of file
diff --git a/pkgs/linear.nix b/pkgs/linear.nix
new file mode 100644
index 0000000000000000000000000000000000000000..56b6bbe6822c95ddde224192dba6cfb6d605984c
--- /dev/null
+++ b/pkgs/linear.nix
@@ -0,0 +1,39 @@
+{ mkDerivation, HUnit, adjunctions, base, base-orphans, binary
+, bytes, bytestring, cereal, containers, deepseq, distributive
+, ghc-prim, hashable, indexed-traversable, lens, lib, random
+, reflection, semigroupoids, simple-reflect, tagged
+, template-haskell, test-framework, test-framework-hunit
+, transformers, transformers-compat, unordered-containers, vector
+, void
+}:
+mkDerivation {
+  pname = "linear";
+  version = "1.22";
+  sha256 = "cfe43e392d0e9b2fd5647bde962b0678681de580260ad30e5f29ae490a03b9b5";
+  revision = "1";
+  editedCabalFile = "1p94bq3pwqvj4qd1lp0w84k514xd9vib76gw0d16q1xh27c2sz4h";
+  isLibrary = true;
+  isExecutable = false;
+  enableSeparateDataOutput = false;
+  libraryHaskellDepends = [
+    adjunctions base base-orphans binary bytes cereal containers
+    deepseq distributive ghc-prim hashable indexed-traversable lens
+    random reflection semigroupoids tagged template-haskell
+    transformers transformers-compat unordered-containers vector void
+  ];
+  testHaskellDepends = [
+    base binary bytestring deepseq HUnit reflection simple-reflect
+    test-framework test-framework-hunit vector
+  ];
+  enableLibraryProfiling = true;
+  enableExecutableProfiling = true;
+  doHaddock = false;
+  jailbreak = true;
+  doCheck = false;
+  doBenchmark = false;
+  hyperlinkSource = false;
+  homepage = "http://github.com/ekmett/linear/";
+  description = "Linear Algebra";
+  license = lib.licenses.bsd3;
+  broken = false;
+}
\ No newline at end of file
diff --git a/pkgs/selda.nix b/pkgs/selda.nix
new file mode 100644
index 0000000000000000000000000000000000000000..b4b3e73ee74d91e59daca197c23d0ba00ea6eed9
--- /dev/null
+++ b/pkgs/selda.nix
@@ -0,0 +1,32 @@
+{ mkDerivation, base, bytestring, containers, exceptions, fetchgit
+, lib, mtl, random, text, time, uuid-types
+}:
+mkDerivation {
+  pname = "selda";
+  version = "0.5.2.1";
+  src = fetchgit {
+    url = "https://github.com/guibou/selda";
+    sha256 = "0q8m8asmb83mpa3j3adlrhc446xif7gv6lql20gv05k33lmbjfhg";
+    rev = "54c12169ce8cd46a7b3c698f65cea55e41a13fe6";
+    fetchSubmodules = true;
+  };
+  postUnpack = "sourceRoot+=/selda/; echo source root reset to $sourceRoot";
+  isLibrary = true;
+  isExecutable = false;
+  enableSeparateDataOutput = false;
+  libraryHaskellDepends = [
+    base bytestring containers exceptions mtl random text time
+    uuid-types
+  ];
+  enableLibraryProfiling = true;
+  enableExecutableProfiling = true;
+  doHaddock = false;
+  jailbreak = true;
+  doCheck = false;
+  doBenchmark = false;
+  hyperlinkSource = false;
+  homepage = "https://selda.link";
+  description = "Multi-backend, high-level EDSL for interacting with SQL databases";
+  license = lib.licenses.mit;
+  broken = false;
+}
\ No newline at end of file
diff --git a/pkgs/vinyl.nix b/pkgs/vinyl.nix
new file mode 100644
index 0000000000000000000000000000000000000000..a494aeef1e859991dafbc5f315422c9b92121ad3
--- /dev/null
+++ b/pkgs/vinyl.nix
@@ -0,0 +1,31 @@
+{ mkDerivation, aeson, array, base, criterion, deepseq, ghc-prim
+, hspec, lens, lens-aeson, lib, linear, microlens, mtl, mwc-random
+, primitive, should-not-typecheck, tagged, text
+, unordered-containers, vector
+}:
+mkDerivation {
+  pname = "vinyl";
+  version = "0.14.3";
+  sha256 = "e6789cbf9d3db493065cc85251e1a4596e4ab561c857d2757ae2593dd53ce6d2";
+  isLibrary = true;
+  isExecutable = false;
+  enableSeparateDataOutput = false;
+  libraryHaskellDepends = [ array base deepseq ghc-prim ];
+  testHaskellDepends = [
+    aeson base hspec lens lens-aeson microlens mtl should-not-typecheck
+    text unordered-containers vector
+  ];
+  benchmarkHaskellDepends = [
+    base criterion linear microlens mwc-random primitive tagged vector
+  ];
+  enableLibraryProfiling = true;
+  enableExecutableProfiling = true;
+  doHaddock = false;
+  jailbreak = true;
+  doCheck = false;
+  doBenchmark = false;
+  hyperlinkSource = false;
+  description = "Extensible Records";
+  license = lib.licenses.mit;
+  broken = false;
+}
\ No newline at end of file