diff --git a/manifest.dhall b/manifest.dhall
index 998a6bc94e002848974609688c8066f8d619ce5c..b221ffda30ba9890691ddd6a4f2f09d3f1d76b9a 100644
--- a/manifest.dhall
+++ b/manifest.dhall
@@ -667,6 +667,7 @@ in  [ callHackage "Cabal" "3.8.1.0"
     , callHackage "unliftio-core" "0.2.0.1"
     , callHackage "unliftio" "0.2.23.0"
     , callHackage "unordered-containers" "0.2.19.1"
+    , callHackage "utf8-string" "1.0.2"
     , callHackage "uri-encode" "1.5.0.7"
     , callHackage "uuid-types" "1.0.5"
     , callHackage "uuid" "1.3.15"
diff --git a/overlay.nix b/overlay.nix
index 2f5431e84b759448de9c132b61b1b6785db93f5a..25001bbfeee949379cb058fc36f548325efceab8 100644
--- a/overlay.nix
+++ b/overlay.nix
@@ -959,6 +959,8 @@ self: with pkgs.haskell.lib; {
 
   uri-encode = self.callPackage (./pkgs/uri-encode.nix) { };
 
+  utf8-string = self.callPackage (./pkgs/utf8-string.nix) { };
+
   uuid = self.callPackage (./pkgs/uuid.nix) { };
 
   uuid-types = self.callPackage (./pkgs/uuid-types.nix) { };
diff --git a/pkgs/utf8-string.nix b/pkgs/utf8-string.nix
new file mode 100644
index 0000000000000000000000000000000000000000..d0961e6f7243c055ee75f54e56e66054d066b380
--- /dev/null
+++ b/pkgs/utf8-string.nix
@@ -0,0 +1,22 @@
+{ mkDerivation, base, bytestring, HUnit, lib }:
+mkDerivation {
+  pname = "utf8-string";
+  version = "1.0.2";
+  sha256 = "ee48deada7600370728c4156cb002441de770d0121ae33a68139a9ed9c19b09a";
+  isLibrary = true;
+  isExecutable = false;
+  enableSeparateDataOutput = false;
+  libraryHaskellDepends = [ base bytestring ];
+  testHaskellDepends = [ base HUnit ];
+  enableLibraryProfiling = false;
+  enableExecutableProfiling = false;
+  doHaddock = false;
+  jailbreak = true;
+  doCheck = false;
+  doBenchmark = false;
+  hyperlinkSource = false;
+  homepage = "https://github.com/glguy/utf8-string/";
+  description = "Support for reading and writing UTF8 Strings";
+  license = lib.licenses.bsd3;
+  broken = false;
+}