diff --git a/manifest.dhall b/manifest.dhall
index 7fe4c03e9d6075475250dbef4be596105ceb7399..3c72a23736ccaa8eb46d263f3645e528070a4017 100644
--- a/manifest.dhall
+++ b/manifest.dhall
@@ -686,6 +686,7 @@ in  [ callHackage "Cabal" "3.8.1.0"
     , callHackage "system-filepath" "0.4.14"
     , callHackage "tabular" "0.2.2.8"
     , callHackage "tagged" "0.8.6.1"
+    , callHackage "tagsoup" "0.14.8"
     , callHackage "tar" "0.5.1.1"
     , callCabal2nix
         "tasty"
diff --git a/overlay.nix b/overlay.nix
index 365e14a9b1441078af8dce2ff894b502bd3f89df..6432e5a7d898e60d43aa037275f37746905110bb 100644
--- a/overlay.nix
+++ b/overlay.nix
@@ -1047,6 +1047,8 @@ self: with pkgs.haskell.lib; {
 
   tagged = self.callPackage (./pkgs/tagged.nix) { };
 
+  tagsoup = self.callPackage (./pkgs/tagsoup.nix) { };
+
   tar = self.callPackage (./pkgs/tar.nix) { };
 
   tasty = self.callPackage (./pkgs/tasty.nix) { };
diff --git a/pkgs/tagsoup.nix b/pkgs/tagsoup.nix
new file mode 100644
index 0000000000000000000000000000000000000000..074e2fd612656c2df98960eb09859911be991a36
--- /dev/null
+++ b/pkgs/tagsoup.nix
@@ -0,0 +1,41 @@
+{ mkDerivation
+, base
+, bytestring
+, containers
+, deepseq
+, directory
+, lib
+, process
+, QuickCheck
+, text
+, time
+}:
+mkDerivation {
+  pname = "tagsoup";
+  version = "0.14.8";
+  sha256 = "ba7e5500d853d29f0675b90655b7fdd032a4a7eee82a56e7ee3ef9949fe93ad5";
+  isLibrary = true;
+  isExecutable = false;
+  enableSeparateDataOutput = false;
+  libraryHaskellDepends = [ base bytestring containers text ];
+  testHaskellDepends = [
+    base
+    bytestring
+    deepseq
+    directory
+    process
+    QuickCheck
+    time
+  ];
+  enableLibraryProfiling = false;
+  enableExecutableProfiling = false;
+  doHaddock = false;
+  jailbreak = true;
+  doCheck = false;
+  doBenchmark = false;
+  hyperlinkSource = false;
+  homepage = "https://github.com/ndmitchell/tagsoup#readme";
+  description = "Parsing and extracting information from (possibly malformed) HTML/XML documents";
+  license = lib.licenses.bsd3;
+  broken = false;
+}