diff --git a/gnu/packages/ocaml.scm b/gnu/packages/ocaml.scm
index 75a42058d6..97ba9c5cff 100644
--- a/gnu/packages/ocaml.scm
+++ b/gnu/packages/ocaml.scm
@@ -1710,6 +1710,56 @@ (define-public ocaml-junit-alcotest
     ;; with OCaml linking exception
     (license license:gpl3+)))
 
+(define-public ocaml-jingoo
+  (package
+    (name "ocaml-jingoo")
+    (version "1.5.0")
+    (home-page "https://github.com/tategakibunko/jingoo")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url home-page)
+             (commit version)))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "08qymg1p598q75i7zlma17kwqms83iym46m0wdgfffi0rank0rpd"))))
+    (build-system dune-build-system)
+    (propagated-inputs (list ocaml-menhir ocaml-ppx-deriving ocaml-re
+                             ocaml-uutf ocaml-uucp))
+    (native-inputs (list ocaml-ounit))
+    (synopsis "Template engine almost compatible with Jinja2")
+    (description "Jingoo is an OCaml template engine almost compatible with
+Jinja2 (the Python template engine).")
+    (license license:expat)))
+
+(define-public ocaml-lambdasoup
+  (package
+    (name "ocaml-lambdasoup")
+    (version "1.0.0")
+    (home-page "https://github.com/aantron/lambdasoup")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url home-page)
+             (commit version)))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "04jd0rjjqcrzm0w490v2bg0bsyps9qgaw63q0fybp474kcvj369x"))))
+    (build-system dune-build-system)
+    (propagated-inputs (list ocaml-camlp-streams ocaml-markup))
+    (native-inputs (list ocaml-bisect-ppx ocaml-ounit2))
+    (synopsis "Functional HTML scraping and rewriting with CSS in OCaml")
+    (description
+     "Lambda Soup is a functional HTML scraping and manipulation
+library for OCaml aimed at being easy to use.  It provides a set of elementary
+traversals for getting from node to node, familiar functional combinators such
+as filter, map, and fold, and support for all CSS selectors that still make
+sense when not running in a browser (and a few obvious extensions on top of
+that).")
+    (license license:expat)))
+
 (define-public camlzip
   (package
     (name "camlzip")
@@ -2402,6 +2452,38 @@ (define-public ocaml-toml
     (home-page "https://github.com/ocaml-toml/To.ml")
     (license license:expat)))
 
+(define-public ocaml-otoml
+  (package
+    (name "ocaml-otoml")
+    (version "1.0.5")
+    (home-page "https://github.com/dmbaturin/otoml")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url home-page)
+             (commit version)))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "0cchvfwzxrckr4zj5psinq47z2y9lhvb5vyc5hjvi8l7l9vnml3v"))))
+    (build-system dune-build-system)
+    (propagated-inputs (list ocaml-menhir ocaml-uutf))
+    (native-inputs (list ocaml-ounit2 ocaml-odoc))
+    (synopsis
+     "TOML parsing, manipulation, and pretty-printing library (1.0.0-compliant)")
+    (description
+     "OTOML is a library for parsing, manipulating, and
+pretty-printing TOML files.
+
+* Fully 1.0.0-compliant.
+* No extra dependencies: default implementation uses native numbers and
+represents dates as strings.
+* Provides a functor for building alternative implementations: plug your own
+bignum and calendar libraries if required.
+* Informative parse error reporting.
+* Pretty-printer offers flexible indentation options.")
+    (license license:expat)))
+
 (define-public ocaml-grain-dypgen
   (package
     (name "ocaml-grain-dypgen")
@@ -2630,6 +2712,32 @@ (define-public ocaml-calendar
       ;; With linking exception.
       (license license:lgpl2.1+))))
 
+(define-public ocaml-odate
+  (package
+    (name "ocaml-odate")
+    (version "0.7")
+    (home-page "https://github.com/hhugo/odate")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append home-page
+                           "/releases/download/"
+                           version
+                           "/odate-"
+                           version
+                           ".tbz"))
+       (sha256
+        (base32 "1bsmix8qbsk04a1l2x4lrh919xq6a3pmanvgkdlc5wwp3p42q6bl"))))
+    (build-system dune-build-system)
+    (propagated-inputs (list ocaml-menhir))
+    (arguments
+     ;; broken tests, see https://github.com/hhugo/odate/issues/7
+     '(#:tests? #f))
+    (synopsis "Date & duration library for OCaml")
+    (description "Simple date and duration manipulation.  Also implements
+duration printer based on string format.")
+    (license license:expat)))
+
 (define-public ocaml-cmdliner
   (package
     (name "ocaml-cmdliner")
@@ -5551,6 +5659,59 @@ (define-public ocaml-zed
 capabilities, Zed provides macro recording and cursor management facilities.")
     (license license:bsd-3)))
 
+(define-public ocaml-spelll
+  (package
+    (name "ocaml-spelll")
+    (version "0.4")
+    (home-page "https://github.com/c-cube/spelll")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url home-page)
+             (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "1rx8i98wqn8pp5rzb185i1xl4q40m06242gms1xp9jnq19s1z3ww"))))
+    (build-system dune-build-system)
+    (propagated-inputs (list ocaml-seq ocaml-stdlib-shims))
+    (native-inputs (list ocaml-qcheck ocaml-mdx ocaml-odoc))
+    (synopsis "Fuzzy string searching, using Levenshtein automaton")
+    (description "Fuzzy string searching, using Levenshtein automaton.  Can be
+used for spell-checking.")
+    (license license:bsd-2)))
+
+(define-public ocaml-tsort
+  (package
+    (name "ocaml-tsort")
+    (version "2.1.0")
+    (home-page "https://github.com/dmbaturin/ocaml-tsort")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url home-page)
+             (commit version)))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "07m88nxb9w6wv64h18xyz7js6flpglkk5c8lhs8wgh46r13p89s8"))))
+    (build-system dune-build-system)
+    (inputs (list ocaml-containers))
+    (arguments
+     ;; no tests with dune build system
+     '(#:tests? #f))
+    (synopsis
+     "Easy to use and user-friendly topological sort module for OCaml")
+    (description
+     "@code{ocaml-tsort} is a library for sorting graphs in topological
+order.
+
+* Uses Kahn's algorithm.
+* Easy to use, but not very fast.
+* Provides friendly error reporting (e.g., if there's a cycle, tells you what
+the offending nodes are).")
+    (license license:expat)))
+
 (define-public ocaml-lambda-term
   (package
     (name "ocaml-lambda-term")
@@ -6487,6 +6648,56 @@ (define-public ocaml5.0-base
            "15vsiv3q53l1bzrvqgspf3lp2104s9dzw62z3nl75f53jvjvsyf6"))))
       (properties '())))))
 
+(define-public ocaml-iter
+  (package
+    (name "ocaml-iter")
+    (version "1.8")
+    (home-page "https://github.com/c-cube/iter")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append home-page
+                           "/releases/download/v"
+                           version
+                           "/iter-"
+                           version
+                           ".tbz"))
+       (sha256
+        (base32 "08rhykcizbs21mri4zx1b6vg42a4wybl238cla5bmi79bah9qwzq"))))
+    (build-system dune-build-system)
+    (native-inputs (list ocaml-qcheck ocaml-ounit2 ocaml-mdx ocaml-odoc))
+    (synopsis "Simple iterator abstract datatype")
+    (description
+     "A simple abstraction over @code{iter} functions intended to
+iterate efficiently on collections while performing some transformations.
+Common operations supported include @code{filter}, @code{map}, @code{take},
+@code{drop}, @code{append}, @code{flat_map}, etc.")
+    (license license:bsd-2)))
+
+(define-public ocaml-containers
+  (package
+    (name "ocaml-containers")
+    (version "3.13.1")
+    (home-page "https://github.com/c-cube/ocaml-containers")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append home-page
+                           "/releases/download/v"
+                           version
+                           "/containers-"
+                           version
+                           ".tbz"))
+       (sha256
+        (base32 "114pcswmscbh5mvniiarbk5jqma3kjs6w9bx2p2lzw1w5kmjd6zb"))))
+    (build-system dune-build-system)
+    (propagated-inputs (list ocaml-either))
+    (native-inputs (list ocaml-qcheck ocaml-iter ocaml-gen ocaml-yojson ocaml-mdx))
+    (synopsis "Lightweight, modular standard library extension of OCaml")
+    (description "Containers is an extension of OCaml's standard library
+focused on data structures, combinators and iterators.")
+    (license license:bsd-2)))
+
 (define-public ocaml-compiler-libs
   (package
     (name "ocaml-compiler-libs")
@@ -9362,6 +9573,28 @@ (define-public ocaml-bibtex2html
 bibliography files in BibTeX format, a bibliography in HTML format.")
     (license license:gpl2)))
 
+(define-public ocaml-lua-ml
+  (package
+    (name "ocaml-lua-ml")
+    (version "0.9.4")
+    (home-page "https://github.com/lindig/lua-ml")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url home-page)
+             (commit version)))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "0rz9v7wss4i8jc87c9rmn7b3mhv1cdnxy1kcln6ibbd574gm7h4h"))))
+    (build-system dune-build-system)
+    (native-inputs (list ocaml-odoc))
+    (synopsis "Embeddable Lua 2.5 interpreter implemented in OCaml")
+    (description
+     "Lua-ML is an implementation of the Lua 2.5 programming
+language written in OCaml and designed for extending OCaml programs.")
+    (license license:bsd-2)))
+
 (define-public ocaml-guile
   (package
     (name "ocaml-guile")
diff --git a/gnu/packages/web.scm b/gnu/packages/web.scm
index a71a0e07a3..d4149b571f 100644
--- a/gnu/packages/web.scm
+++ b/gnu/packages/web.scm
@@ -96,6 +96,7 @@ (define-module (gnu packages web)
   #:use-module (guix build-system cargo)
   #:use-module (guix build-system cmake)
   #:use-module (guix build-system copy)
+  #:use-module (guix build-system dune)
   #:use-module (guix build-system glib-or-gtk)
   #:use-module (guix build-system gnu)
   #:use-module (guix build-system go)
@@ -178,6 +179,7 @@ (define-module (gnu packages web)
   #:use-module (gnu packages networking)
   #:use-module (gnu packages node)
   #:use-module (gnu packages nss)
+  #:use-module (gnu packages ocaml)
   #:use-module (gnu packages openldap)
   #:use-module (gnu packages openstack)
   #:use-module (gnu packages package-management)
@@ -8833,6 +8835,48 @@ (define-public kiln
 and can be extended with the use of external commands.")
     (license license:expat)))
 
+(define-public soupault
+  (package
+    (name "soupault")
+    (version "4.10.0")
+    (home-page "https://soupault.app/")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/PataphysicalSociety/soupault")
+             (commit version)))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "17jxxlrxpwsmhn9g7zf36pq842vh7l8122f4v1jbm3qh1rdx2ils"))))
+    (build-system dune-build-system)
+    (inputs (list ocaml-base64
+                  ocaml-camomile
+                  ocaml-containers
+                  ocaml-csv
+                  ocaml-digestif
+                  ocaml-ezjsonm
+                  ocaml-fileutils
+                  ocaml-fmt
+                  ocaml-jingoo
+                  ocaml-lambdasoup
+                  ocaml-lua-ml
+                  ocaml-logs
+                  ocaml-markup
+                  ocaml-odate
+                  ocaml-otoml
+                  ocaml-re
+                  ocaml-spelll
+                  ocaml-tsort
+                  ocaml-yaml))
+    (synopsis "Static website management tool")
+    (description
+     "A static website generator/framework that works with HTML
+element trees and can automatically manipulate them.  It can be described as a
+robotic webmaster that can edit HTML pages according to your rules, but
+doesn’t get tired of editing them.")
+    (license license:expat)))
+
 (define-public siege
   (package
     (name "siege")
