diff --git a/manifest.dhall b/manifest.dhall
index c13d3c7e36aee8eb2df8f0ff2eda5674a1c0ddf0..010e2aa2d054d85b23a89c78d9635b274ea72179 100644
--- a/manifest.dhall
+++ b/manifest.dhall
@@ -218,6 +218,7 @@ in  [ callHackage "Cabal" "3.8.1.0"
         (None Text)
     , callHackage "doctemplates" "0.10.0.2"
     , callHackage "doctest-parallel" "0.2.5"
+    , callHackage "dotgen" "0.4.3"
     , callCabal2nix
         "double-conversion"
         "https://github.com/haskell/double-conversion"
diff --git a/overlay.nix b/overlay.nix
index bbb6be65eda7918d59da952a052bfc3f214569fe..3ace3f99a4097bd84fb43850bb736033770dff77 100644
--- a/overlay.nix
+++ b/overlay.nix
@@ -273,6 +273,8 @@ self: with pkgs.haskell.lib; {
 
   doctest-parallel = self.callPackage (./pkgs/doctest-parallel.nix) { };
 
+  dotgen = self.callPackage (./pkgs/dotgen.nix) { };
+
   double-conversion = self.callPackage (./pkgs/double-conversion.nix) { };
 
   echo = self.callPackage (./pkgs/echo.nix) { };
diff --git a/pkgs/dotgen.nix b/pkgs/dotgen.nix
new file mode 100644
index 0000000000000000000000000000000000000000..24f66b3847e526f9c584abd2dbd392e395a95e9e
--- /dev/null
+++ b/pkgs/dotgen.nix
@@ -0,0 +1,21 @@
+{ mkDerivation, base, containers, lib }:
+mkDerivation {
+  pname = "dotgen";
+  version = "0.4.3";
+  sha256 = "da1c78f7daf0470465ce095fd0f3b3e8a4e4744d5b582a0f6e590a32522d96c9";
+  isLibrary = true;
+  isExecutable = true;
+  enableSeparateDataOutput = false;
+  libraryHaskellDepends = [ base containers ];
+  enableLibraryProfiling = false;
+  enableExecutableProfiling = false;
+  doHaddock = false;
+  jailbreak = true;
+  doCheck = false;
+  doBenchmark = false;
+  hyperlinkSource = false;
+  homepage = "https://github.com/ku-fpg/dotgen";
+  description = "A simple interface for building .dot graph files.";
+  license = lib.licenses.bsd3;
+  broken = false;
+}