diff --git a/maintainers/maintainer-list.nix b/maintainers/maintainer-list.nix
index 602cd5bdd94..67a03de4e6a 100644
--- a/maintainers/maintainer-list.nix
+++ b/maintainers/maintainer-list.nix
@@ -4420,6 +4420,11 @@
     email = "zef@zef.me";
     name = "Zef Hemel";
   };
+  zgrannan = {
+    email = "zgrannan@gmail.com";
+    github = "zgrannan";
+    name = "Zack Grannan";
+  };
   zimbatm = {
     email = "zimbatm@zimbatm.com";
     github = "zimbatm";
diff --git a/pkgs/tools/text/markdown-pp/default.nix b/pkgs/tools/text/markdown-pp/default.nix
new file mode 100644
index 00000000000..f479c221b65
--- /dev/null
+++ b/pkgs/tools/text/markdown-pp/default.nix
@@ -0,0 +1,24 @@
+{ fetchFromGitHub, pythonPackages, stdenv }:
+
+with pythonPackages;
+buildPythonApplication rec {
+  pname = "MarkdownPP";
+  version = "1.4";
+  propagatedBuildInputs = [ pillow watchdog ];
+  checkPhase = ''
+    cd test
+    PATH=$out/bin:$PATH ${python}/bin/${python.executable} test.py
+  '';
+  src = fetchFromGitHub {
+    owner = "jreese";
+    repo = "markdown-pp";
+    rev = "v${version}";
+    sha256 = "1xmc0cxvvf6jzr7p4f0hm8icysrd44sy2kgff9b99lr1agwkmysq";
+  };
+  meta = with stdenv.lib; {
+    description = "Preprocessor for Markdown files to generate a table of contents and other documentation needs";
+    license = licenses.mit;
+    homepage = "https://github.com/jreese/markdown-pp";
+    maintainers = with maintainers; [ zgrannan ];
+  };
+}
diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix
index e276ebc706a..d61efc2be4a 100644
--- a/pkgs/top-level/all-packages.nix
+++ b/pkgs/top-level/all-packages.nix
@@ -17131,6 +17131,8 @@ with pkgs;
   marathon = callPackage ../applications/networking/cluster/marathon { };
   marathonctl = callPackage ../tools/virtualization/marathonctl { } ;
 
+  markdown-pp = callPackage ../tools/text/markdown-pp { };
+
   marp = callPackage ../applications/office/marp { };
 
   matchbox = callPackage ../applications/window-managers/matchbox { };