diff --git a/manifest.dhall b/manifest.dhall
index eec2832e11e1a5910145c5ee1ed14a4be54c95fe..51b7eaadd3cdf0ad8d5f6e814a6af6a8cd960682 100644
--- a/manifest.dhall
+++ b/manifest.dhall
@@ -116,6 +116,7 @@ in  [ callHackage "Cabal" "3.8.1.0"
     , callHackage "cereal" "0.5.8.3"
     , callHackage "cborg" "0.2.8.0"
     , callHackage "cborg-json" "0.2.5.0"
+    , callHackage "charset" "0.3.9"
     , callHackage "citeproc" "0.8.0.1"
     , callHackage "co-log-core" "0.3.1.0"
     , callHackage "co-log-polysemy" "0.0.1.3"
diff --git a/overlay.nix b/overlay.nix
index 17e3f1116c5ec99f2613c2b82d0bac2106090572..06cef18ba674ef180b9e85f9cf5d201508930338 100644
--- a/overlay.nix
+++ b/overlay.nix
@@ -107,6 +107,8 @@ final: prev: with pkgs.haskell.lib; {
 
   cereal = prev.callPackage (./pkgs/cereal.nix) { };
 
+  charset = prev.callPackage (./pkgs/charset.nix) { };
+
   citeproc = prev.callPackage (./pkgs/citeproc.nix) { };
 
   co-log-core = prev.callPackage (./pkgs/co-log-core.nix) { };
diff --git a/pkgs/charset.nix b/pkgs/charset.nix
new file mode 100644
index 0000000000000000000000000000000000000000..f4d9729e5b3970d123c88a82ab40d7e89dd21b5b
--- /dev/null
+++ b/pkgs/charset.nix
@@ -0,0 +1,34 @@
+{ mkDerivation
+, array
+, base
+, bytestring
+, containers
+, lib
+, unordered-containers
+}:
+mkDerivation {
+  pname = "charset";
+  version = "0.3.9";
+  sha256 = "cb4f8781491d1e346e7eef7b33bfadae96642c81777165ec585a05591abc998b";
+  isLibrary = true;
+  isExecutable = false;
+  enableSeparateDataOutput = false;
+  libraryHaskellDepends = [
+    array
+    base
+    bytestring
+    containers
+    unordered-containers
+  ];
+  enableLibraryProfiling = false;
+  enableExecutableProfiling = false;
+  doHaddock = false;
+  jailbreak = true;
+  doCheck = false;
+  doBenchmark = false;
+  hyperlinkSource = false;
+  homepage = "http://github.com/ekmett/charset";
+  description = "Fast unicode character sets based on complemented PATRICIA tries";
+  license = lib.licenses.bsd3;
+  broken = false;
+}