diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,17 @@
 
 # Releases
 
+## Hakyll 4.16.4.0 (2024-12-08)
+
+- Fixed an issue where compressing CSS with `clamp` expressions would 
+    result in invalid CSS (#1021) (contribution by Laurent P. René de Cotret)
+- Added `boolFieldM` (#1044) (contribution by 0xd34df00d)
+- Run HLint as part of GitHub Actions (#1045) (contribution by Yoo Chung)
+- Running the `check` command will now consider URLs that respond with a 3XX code
+    (redirection) to be alive.
+- Bump `data-default` upper bound to include 0.8
+- Bump `pandoc` upper bound to include 3.6
+
 ## Hakyll 4.16.3.0 (2024-10-24)
 
 - Bump `pandoc` upper bound to include up to version 3.5
diff --git a/hakyll.cabal b/hakyll.cabal
--- a/hakyll.cabal
+++ b/hakyll.cabal
@@ -1,5 +1,5 @@
 Name:    hakyll
-Version: 4.16.3.0
+Version: 4.16.4.0
 
 Synopsis: A static website compiler library
 Description:
@@ -190,10 +190,9 @@
     base                 >= 4.12     && < 5,
     binary               >= 0.5      && < 0.10,
     blaze-html           >= 0.5      && < 0.10,
-    blaze-markup         >= 0.5.1    && < 0.9,
     bytestring           >= 0.9      && < 0.13,
     containers           >= 0.3      && < 0.8,
-    data-default         >= 0.4      && < 0.8,
+    data-default         >= 0.4      && < 0.9,
     deepseq              >= 1.3      && < 1.6,
     directory            >= 1.2.7.0  && < 1.4,
     file-embed           >= 0.0.10.1 && < 0.0.17,
@@ -214,7 +213,6 @@
     text                 >= 0.11     && < 1.3 || >= 2.0 && < 2.2,
     time                 >= 1.8      && < 1.15,
     time-locale-compat   >= 0.1      && < 0.2,
-    unordered-containers >= 0.2      && < 0.3,
     vector               >= 0.11     && < 0.14,
     wai-app-static       >= 3.1      && < 3.2,
     yaml                 >= 0.8.11   && < 0.12
@@ -254,7 +252,7 @@
     Other-Modules:
       Hakyll.Web.Pandoc.Binary
     Build-Depends:
-      pandoc >= 2.11 && < 2.20 || >= 3.0 && < 3.6
+      pandoc >= 2.11 && < 2.20 || >= 3.0 && < 3.7
     Cpp-options:
       -DUSE_PANDOC
 
@@ -298,8 +296,6 @@
     containers           >= 0.3      && < 0.8,
     filepath             >= 1.0      && < 1.6,
     tagsoup              >= 0.13.1   && < 0.15,
-    text                 >= 0.11     && < 1.3 || >= 2.0 && < 2.2,
-    unordered-containers >= 0.2      && < 0.3,
     yaml                 >= 0.8.11   && < 0.12
 
   If flag(previewServer)
@@ -321,7 +317,7 @@
     Cpp-options:
       -DUSE_PANDOC
     Build-Depends:
-      pandoc >= 2.11 && < 2.20 || >= 3.0 && < 3.6
+      pandoc >= 2.11 && < 2.20 || >= 3.0 && < 3.7
 
 
 Executable hakyll-init
@@ -355,4 +351,4 @@
     base      >= 4.12  && < 5,
     directory >= 1.0   && < 1.4,
     filepath  >= 1.0   && < 1.6,
-    pandoc    >= 2.11  && < 2.20 || >= 3.0 && < 3.6
+    pandoc    >= 2.11  && < 2.20 || >= 3.0 && < 3.7
diff --git a/lib/Hakyll/Check.hs b/lib/Hakyll/Check.hs
--- a/lib/Hakyll/Check.hs
+++ b/lib/Hakyll/Check.hs
@@ -259,7 +259,8 @@
         request  <- Http.parseRequest url
         response <- Http.http (settings request) mgr
         let code = Http.statusCode (Http.responseStatus response)
-        return $ code >= 200 && code < 300
+        -- Recall that 3XX status codes are redirections, which aren't necessarily errors. 
+        return $ code >= 200 && code < 400
     where
         -- Add additional request info
         settings r = r
diff --git a/lib/Hakyll/Web/CompressCss.hs b/lib/Hakyll/Web/CompressCss.hs
--- a/lib/Hakyll/Web/CompressCss.hs
+++ b/lib/Hakyll/Web/CompressCss.hs
@@ -42,14 +42,17 @@
     replaceAll " *[{};,>+~!] *" (take 1 . dropWhile isSpace) .
     replaceAll ": *" (take 1) -- not destroying pseudo selectors (#323)
 
--- | Uses `compressCalcExpression` on all parenthesised calc expressions
--- and applies `transform` to all parts outside of them
+-- | Uses `compressExpression` on all parenthesised calc and 
+-- clamp expressions, and applies `transform` to all parts 
+-- outside of them
 handleCalcExpressions :: (String -> String) -> String -> String
 handleCalcExpressions transform = top transform
   where
-    top f ""                             = f ""
-    top f str | "calc(" `isPrefixOf` str = f "calc" ++ nested 0 compressCalcExpression (drop 4 str)
-    top f (x:xs)                         = top (f . (x:)) xs
+    top f ""                              = f ""
+    top f str | "calc(" `isPrefixOf` str  = f "calc"  ++ nested 0 compressExpression (drop 4 str)
+              -- See issue #1021
+              | "clamp(" `isPrefixOf` str = f "clamp" ++ nested 0 compressExpression (drop 5 str) 
+    top f (x:xs)                          = top (f . (x:)) xs
     
     -- when called with depth=0, the first character must be a '('
     nested :: Int -> (String -> String) -> String -> String
@@ -62,9 +65,10 @@
                                                       _   -> depth
                                                     ) (f . (x:)) xs
 
--- | does not remove whitespace around + and -, which is important in calc() expressions
-compressCalcExpression :: String -> String
-compressCalcExpression =
+-- | does not remove whitespace around + and -, which is important 
+-- in calc() and clamp() expressions
+compressExpression :: String -> String
+compressExpression =
     replaceAll " *[*/] *| *\\)|\\( *" (take 1 . dropWhile isSpace)
 
 --------------------------------------------------------------------------------
diff --git a/lib/Hakyll/Web/Template/Context.hs b/lib/Hakyll/Web/Template/Context.hs
--- a/lib/Hakyll/Web/Template/Context.hs
+++ b/lib/Hakyll/Web/Template/Context.hs
@@ -26,6 +26,7 @@
     , Context (..)
     , field
     , boolField
+    , boolFieldM
     , constField
     , listField
     , listFieldWith
@@ -144,10 +145,26 @@
 -- | Creates a 'field' to use with the @$if()$@ template macro.
 -- Attempting to substitute the field into the template will cause an error.
 boolField
-    :: String
-    -> (Item a -> Bool)
+    :: String           -- ^ Key
+    -> (Item a -> Bool) -- ^ Extract value from an @'Item' a@
     -> Context a
-boolField name f = field' name (\i -> if f i
+boolField name f = boolFieldM name (pure . f)
+
+
+--------------------------------------------------------------------------------
+-- | Creates a 'field' to use with the @$if()$@ template macro, in the 
+-- 'Compiler' monad. Attempting to substitute the field into the template 
+-- will cause an error.
+--
+-- @since 4.16.4.0
+boolFieldM
+    :: String                       -- ^ Key
+    -> (Item a -> Compiler Bool)    -- ^ Extract value from an @'Item' a@ 
+                                    --   from within the 'Compiler' monad
+    -> Context a
+boolFieldM name f = field' name (\i -> do
+  b <- f i
+  if b
     then return EmptyField
     else noResult $ "Field " ++ name ++ " is false")
 
diff --git a/tests/Hakyll/Core/Identifier/Tests.hs b/tests/Hakyll/Core/Identifier/Tests.hs
--- a/tests/Hakyll/Core/Identifier/Tests.hs
+++ b/tests/Hakyll/Core/Identifier/Tests.hs
@@ -6,14 +6,16 @@
 
 
 --------------------------------------------------------------------------------
+import qualified Test.QuickCheck                as Q
 import           Test.Tasty                     (TestTree, testGroup)
 import           Test.Tasty.HUnit               ((@=?))
+import           Test.Tasty.QuickCheck          (testProperty)
 
 
 --------------------------------------------------------------------------------
 import           Hakyll.Core.Identifier
 import           Hakyll.Core.Identifier.Pattern
-import           System.FilePath                ((</>))
+import           System.FilePath                ((</>), isValid, equalFilePath, pathSeparators)
 import           TestSuite.Util
 
 
@@ -22,6 +24,7 @@
 tests = testGroup "Hakyll.Core.Identifier.Tests" $ concat
     [ captureTests
     , matchesTests
+    , [ testProperty "toFilePath . fromFilePath" filepathConversionProp ]
     ]
 
 
@@ -59,3 +62,16 @@
     , True  @=? matches ("foo" .||. "bar") "bar"
     , False @=? matches ("bar" .&&. hasNoVersion) (setVersion (Just "xz") "bar")
     ]
+
+
+--------------------------------------------------------------------------------
+-- Ensure that `fromFilePath` and `toFilePath` are inverses of each other (#791)
+filepathConversionProp :: Q.Property
+filepathConversionProp 
+    = Q.forAll genFilePath 
+    $ \fp -> toFilePath (fromFilePath fp) `equalFilePath` fp
+    where
+        genFilePath 
+            = Q.listOf1 (Q.elements $ ['a'..'z'] <> pathSeparators) 
+                `Q.suchThat` 
+                isValid
diff --git a/tests/Hakyll/Web/CompressCss/Tests.hs b/tests/Hakyll/Web/CompressCss/Tests.hs
--- a/tests/Hakyll/Web/CompressCss/Tests.hs
+++ b/tests/Hakyll/Web/CompressCss/Tests.hs
@@ -43,6 +43,8 @@
         , "a!b"           @=? compressCss "a ! b"
           -- compress calc()
         , "calc(1px + 100%/(5 + 3) - (3px + 2px)*5)" @=? compressCss "calc( 1px + 100% / ( 5 +  3) - calc( 3px + 2px ) * 5 )"
+          -- compress clamp() (issue #1021)
+        , "clamp(2.25rem, 2vw + 1.5rem, 3.25rem)" @=? compressCss "clamp(2.25rem,  2vw  +     1.5rem, 3.25rem)"
           -- compress whitespace even after this curly brace
         , "}"             @=? compressCss ";   }  "
           -- but do not compress separators inside string tokens
