diff --git a/pkgs/development/python-modules/htmltools/default.nix b/pkgs/development/python-modules/htmltools/default.nix
new file mode 100644
index 000000000000..a1764a06407b
--- /dev/null
+++ b/pkgs/development/python-modules/htmltools/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, setuptools
+, packaging
+, typing-extensions
+, pytestCheckHook
+, syrupy
+}:
+
+buildPythonPackage rec {
+ pname = "htmltools";
+ version = "0.5.2";
+ pyproject = true;
+
+ disabled = pythonOlder "3.8";
+
+ src = fetchFromGitHub {
+ owner = "posit-dev";
+ repo = "py-htmltools";
+ rev = "refs/tags/v${version}";
+ hash = "sha256-H0M9dY8CNQAMEGEGHhPIWEYRmk4omCuVFgJUg8ef8Zw=";
+ };
+
+ build-system = [
+ setuptools
+ ];
+
+ dependencies = [
+ packaging
+ typing-extensions
+ ];
+
+ pythonImportsCheck = [ "htmltools" ];
+
+ nativeCheckInputs = [
+ pytestCheckHook
+ syrupy
+ ];
+
+ meta = {
+ description = "Tools for HTML generation and output";
+ homepage = "https://github.com/posit-dev/py-htmltools";
+ changelog = "https://github.com/posit-dev/py-htmltools/blob/${src.rev}/CHANGELOG.md";
+ license = lib.licenses.mit;
+ maintainers = with lib.maintainers; [ bcdarwin ];
+ };
+}
diff --git a/pkgs/top-level/python-packages.nix b/pkgs/top-level/python-packages.nix
index 34507f439945..b5ce6f7083e3 100644
--- a/pkgs/top-level/python-packages.nix
+++ b/pkgs/top-level/python-packages.nix
@@ -5624,6 +5624,8 @@ self: super: with self; {
htmlmin = callPackage ../development/python-modules/htmlmin { };
+ htmltools = callPackage ../development/python-modules/htmltools { };
+
html-sanitizer = callPackage ../development/python-modules/html-sanitizer { };
html-tag-names = callPackage ../development/python-modules/html-tag-names { };