diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,20 @@
 
 # Releases
 
+## Hakyll 4.13.1.0 (2020-02-26)
+
+- Fix timezone parsing bug with time-1.9
+- Remove constant field for homepage title in example site (by Liang-Ting Chen)
+- Clean up `stack.yaml` (by Hexirp)
+- Use crytonite instead of cryptohash (by Hexirp)
+- Expose CLI argument parser internals (by Jim McStanton)
+- Support GHC-8.8. Add `MonadFail` instances and constraints (by Veronika
+  Romashkina)
+- Fix file path compatibility with Windows (by Hexirp)
+- Fix logging output flushing in `site server` (by robx)
+- Fix spacing of command line usage in `hakyll-init` (by robx)
+- Add titles to tag fields by default
+
 ## Hakyll 4.13.0.1 (2019-09-18)
 
 - Add missing test files (contribution by Justin Humm)
diff --git a/data/example/site.hs b/data/example/site.hs
--- a/data/example/site.hs
+++ b/data/example/site.hs
@@ -49,7 +49,6 @@
             posts <- recentFirst =<< loadAll "posts/*"
             let indexCtx =
                     listField "posts" postCtx (return posts) `mappend`
-                    constField "title" "Home"                `mappend`
                     defaultContext
 
             getResourceBody
diff --git a/hakyll.cabal b/hakyll.cabal
--- a/hakyll.cabal
+++ b/hakyll.cabal
@@ -1,5 +1,5 @@
 Name:    hakyll
-Version: 4.13.0.1
+Version: 4.13.1.0
 
 Synopsis: A static website compiler library
 Description:
@@ -170,24 +170,25 @@
     blaze-markup         >= 0.5.1    && < 0.9,
     bytestring           >= 0.9      && < 0.11,
     containers           >= 0.3      && < 0.7,
-    cryptohash           >= 0.7      && < 0.12,
+    cryptonite           >= 0.25     && < 0.27,
     data-default         >= 0.4      && < 0.8,
     deepseq              >= 1.3      && < 1.5,
     directory            >= 1.0      && < 1.4,
     file-embed           >= 0.0.10.1 && < 0.0.12,
     filepath             >= 1.0      && < 1.5,
     lrucache             >= 1.1.1    && < 1.3,
+    memory               >= 0.14.18  && < 0.16,
     mtl                  >= 1        && < 2.3,
     network-uri          >= 2.6      && < 2.7,
-    optparse-applicative >= 0.12     && < 0.15,
+    optparse-applicative >= 0.12     && < 0.16,
     parsec               >= 3.0      && < 3.2,
     process              >= 1.6      && < 1.7,
     random               >= 1.0      && < 1.2,
-    regex-tdfa           >= 1.1      && < 1.3,
+    regex-tdfa           >= 1.1      && < 1.4,
     resourcet            >= 1.1      && < 1.3,
     scientific           >= 0.3.4    && < 0.4,
     tagsoup              >= 0.13.1   && < 0.15,
-    template-haskell     >= 2.14     && < 2.15,
+    template-haskell     >= 2.14     && < 2.16,
     text                 >= 0.11     && < 1.3,
     time                 >= 1.8      && < 1.10,
     time-locale-compat   >= 0.1      && < 0.2,
@@ -231,7 +232,7 @@
     Other-Modules:
       Hakyll.Web.Pandoc.Binary
     Build-Depends:
-      pandoc          >= 2.0.5    && < 2.8,
+      pandoc          >= 2.0.5    && < 2.10,
       pandoc-citeproc >= 0.14     && < 0.17
     Cpp-options:
       -DUSE_PANDOC
@@ -326,4 +327,4 @@
     base      >= 4     && < 5,
     directory >= 1.0   && < 1.4,
     filepath  >= 1.0   && < 1.5,
-    pandoc    >= 2.0.5 && < 2.8
+    pandoc    >= 2.0.5 && < 2.10
diff --git a/lib/Hakyll/Core/Compiler/Internal.hs b/lib/Hakyll/Core/Compiler/Internal.hs
--- a/lib/Hakyll/Core/Compiler/Internal.hs
+++ b/lib/Hakyll/Core/Compiler/Internal.hs
@@ -40,6 +40,7 @@
 import           Control.Applicative            (Alternative (..))
 import           Control.Exception              (SomeException, handle)
 import           Control.Monad                  (forM_)
+import qualified Control.Monad.Fail             as Fail
 import           Control.Monad.Except           (MonadError (..))
 import           Data.List.NonEmpty             (NonEmpty (..))
 import qualified Data.List.NonEmpty             as NonEmpty
@@ -183,9 +184,14 @@
             CompilerError e       -> return $ CompilerError e
     {-# INLINE (>>=) #-}
 
-    fail = compilerThrow . return
+#if !(MIN_VERSION_base(4,13,0))
+    fail = Fail.fail
     {-# INLINE fail #-}
+#endif
 
+instance Fail.MonadFail Compiler where
+    fail = compilerThrow . return
+    {-# INLINE fail #-}
 
 --------------------------------------------------------------------------------
 instance Applicative Compiler where
diff --git a/lib/Hakyll/Core/Identifier.hs b/lib/Hakyll/Core/Identifier.hs
--- a/lib/Hakyll/Core/Identifier.hs
+++ b/lib/Hakyll/Core/Identifier.hs
@@ -21,7 +21,8 @@
 --------------------------------------------------------------------------------
 import           Control.DeepSeq     (NFData (..))
 import           Data.List           (intercalate)
-import           System.FilePath     (dropTrailingPathSeparator, splitPath)
+import           System.FilePath     (dropTrailingPathSeparator, splitPath,
+                                      pathSeparator)
 
 
 --------------------------------------------------------------------------------
@@ -72,7 +73,9 @@
 --------------------------------------------------------------------------------
 -- | Convert an identifier to a relative 'FilePath'
 toFilePath :: Identifier -> FilePath
-toFilePath = identifierPath
+toFilePath = intercalate [pathSeparator] . split' . identifierPath
+  where
+    split' = map dropTrailingPathSeparator . splitPath
 
 
 --------------------------------------------------------------------------------
diff --git a/lib/Hakyll/Core/Metadata.hs b/lib/Hakyll/Core/Metadata.hs
--- a/lib/Hakyll/Core/Metadata.hs
+++ b/lib/Hakyll/Core/Metadata.hs
@@ -66,7 +66,7 @@
 --------------------------------------------------------------------------------
 -- | Version of 'getMetadataField' which throws an error if the field does not
 -- exist.
-getMetadataField' :: MonadMetadata m => Identifier -> String -> m String
+getMetadataField' :: (MonadFail m, MonadMetadata m) => Identifier -> String -> m String
 getMetadataField' identifier key = do
     field <- getMetadataField identifier key
     case field of
diff --git a/lib/Hakyll/Core/Rules/Internal.hs b/lib/Hakyll/Core/Rules/Internal.hs
--- a/lib/Hakyll/Core/Rules/Internal.hs
+++ b/lib/Hakyll/Core/Rules/Internal.hs
@@ -88,7 +88,7 @@
 -- | The monad used to compose rules
 newtype Rules a = Rules
     { unRules :: RWST RulesRead RuleSet RulesState IO a
-    } deriving (Monad, Functor, Applicative)
+    } deriving (Monad, MonadFail, Functor, Applicative)
 
 
 --------------------------------------------------------------------------------
diff --git a/lib/Hakyll/Core/Store.hs b/lib/Hakyll/Core/Store.hs
--- a/lib/Hakyll/Core/Store.hs
+++ b/lib/Hakyll/Core/Store.hs
@@ -16,7 +16,8 @@
 
 
 --------------------------------------------------------------------------------
-import qualified Crypto.Hash.MD5      as MD5
+import qualified Data.ByteArray       as BA
+import qualified Crypto.Hash          as CH
 import           Data.Binary          (Binary, decode, encodeFile)
 import qualified Data.ByteString      as B
 import qualified Data.ByteString.Lazy as BL
@@ -193,8 +194,21 @@
 --------------------------------------------------------------------------------
 -- | Mostly meant for internal usage
 hash :: [String] -> String
-hash = toHex . B.unpack . MD5.hash . T.encodeUtf8 . T.pack . intercalate "/"
+hash = toHex . B.unpack . hashMD5 . T.encodeUtf8 . T.pack . intercalate "/"
   where
     toHex [] = ""
     toHex (x : xs) | x < 16 = '0' : showHex x (toHex xs)
                    | otherwise = showHex x (toHex xs)
+
+
+--------------------------------------------------------------------------------
+-- | Hash by MD5
+hashMD5 :: B.ByteString -> B.ByteString
+hashMD5 x =
+  let
+    digest :: CH.Digest CH.MD5
+    digest = CH.hash x
+    bytes :: B.ByteString
+    bytes = BA.convert digest
+  in
+    bytes
diff --git a/lib/Hakyll/Main.hs b/lib/Hakyll/Main.hs
--- a/lib/Hakyll/Main.hs
+++ b/lib/Hakyll/Main.hs
@@ -3,13 +3,22 @@
 {-# LANGUAGE CPP #-}
 
 module Hakyll.Main
-    ( hakyll
+    ( -- * Entry points
+      hakyll
     , hakyllWith
     , hakyllWithArgs
     , hakyllWithExitCode
     , hakyllWithExitCodeAndArgs
+
+      -- * Command line argument parsers
     , Options(..)
     , Command(..)
+    , optionParser
+    , commandParser
+    , defaultParser
+    , defaultParserPure
+    , defaultParserPrefs
+    , defaultParserInfo
     ) where
 
 
@@ -72,11 +81,24 @@
 --------------------------------------------------------------------------------
 defaultParser :: Config.Configuration -> IO Options
 defaultParser conf =
-    OA.customExecParser (OA.prefs OA.showHelpOnError)
-        (OA.info (OA.helper <*> optionParser conf)
-        (OA.fullDesc <> OA.progDesc
-        (progName ++ " - Static site compiler created with Hakyll")))
+    OA.customExecParser defaultParserPrefs (defaultParserInfo conf)
 
+
+--------------------------------------------------------------------------------
+defaultParserPure :: Config.Configuration -> [String] -> OA.ParserResult Options
+defaultParserPure conf =
+  OA.execParserPure defaultParserPrefs (defaultParserInfo conf)
+
+
+--------------------------------------------------------------------------------
+defaultParserPrefs :: OA.ParserPrefs
+defaultParserPrefs = OA.prefs OA.showHelpOnError
+
+--------------------------------------------------------------------------------
+defaultParserInfo :: Config.Configuration -> OA.ParserInfo Options
+defaultParserInfo conf =
+  OA.info (OA.helper <*> optionParser conf) (OA.fullDesc <> OA.progDesc (
+                                                progName ++ " - Static site compiler created with Hakyll"))
 
 --------------------------------------------------------------------------------
 invokeCommands :: Command -> Config.Configuration ->
diff --git a/lib/Hakyll/Preview/Server.hs b/lib/Hakyll/Preview/Server.hs
--- a/lib/Hakyll/Preview/Server.hs
+++ b/lib/Hakyll/Preview/Server.hs
@@ -24,6 +24,7 @@
              -> IO ()                -- ^ Blocks forever
 staticServer logger directory host port = do
     Logger.header logger $ "Listening on http://" ++ host ++ ":" ++ show port
+    Logger.flush logger -- ensure this line is logged before Warp errors
     Warp.runSettings warpSettings $
         Static.staticApp (Static.defaultFileServerSettings directory)
   where
diff --git a/lib/Hakyll/Web/Feed.hs b/lib/Hakyll/Web/Feed.hs
--- a/lib/Hakyll/Web/Feed.hs
+++ b/lib/Hakyll/Web/Feed.hs
@@ -39,24 +39,29 @@
 
 --------------------------------------------------------------------------------
 import           Data.FileEmbed              (makeRelativeToProject)
+import           System.FilePath             ((</>))
 
 
 --------------------------------------------------------------------------------
 rssTemplate :: Template
 rssTemplate =
-    $(makeRelativeToProject "data/templates/rss.xml" >>= embedTemplate)
+    $(makeRelativeToProject ("data" </> "templates" </> "rss.xml")
+        >>= embedTemplate)
 
 rssItemTemplate :: Template
 rssItemTemplate =
-    $(makeRelativeToProject "data/templates/rss-item.xml" >>= embedTemplate)
+    $(makeRelativeToProject ("data" </> "templates" </> "rss-item.xml")
+        >>= embedTemplate)
 
 atomTemplate :: Template
 atomTemplate =
-    $(makeRelativeToProject "data/templates/atom.xml" >>= embedTemplate)
+    $(makeRelativeToProject ("data" </> "templates" </> "atom.xml")
+        >>= embedTemplate)
 
 atomItemTemplate :: Template
 atomItemTemplate =
-    $(makeRelativeToProject "data/templates/atom-item.xml" >>= embedTemplate)
+    $(makeRelativeToProject ("data" </> "templates" </> "atom-item.xml")
+        >>= embedTemplate)
 
 
 --------------------------------------------------------------------------------
diff --git a/lib/Hakyll/Web/Tags.hs b/lib/Hakyll/Web/Tags.hs
--- a/lib/Hakyll/Web/Tags.hs
+++ b/lib/Hakyll/Web/Tags.hs
@@ -326,8 +326,10 @@
 -- | Render one tag link
 simpleRenderLink :: String -> (Maybe FilePath) -> Maybe H.Html
 simpleRenderLink _   Nothing         = Nothing
-simpleRenderLink tag (Just filePath) =
-  Just $ H.a ! A.href (toValue $ toUrl filePath) $ toHtml tag
+simpleRenderLink tag (Just filePath) = Just $
+    H.a ! A.title (H.stringValue ("All pages tagged '"++tag++"'."))
+        ! A.href (toValue $ toUrl filePath)
+        $ toHtml tag
 
 
 --------------------------------------------------------------------------------
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
@@ -14,7 +14,7 @@
 --
 -- > $partial(concat("templates/categories/", category))$
 --
--- This will evaluate the @category@ field in the context, then prepend he path,
+-- This will evaluate the @category@ field in the context, then prepend the path,
 -- and include the referenced file as a template.
 
 
@@ -365,7 +365,7 @@
 -- | Parser to try to extract and parse the time from the @published@
 -- field or from the filename. See 'dateField' for more information.
 -- Exported for user convenience.
-getItemUTC :: MonadMetadata m
+getItemUTC :: (MonadMetadata m, MonadFail m)
            => TimeLocale        -- ^ Output time locale
            -> Identifier        -- ^ Input page
            -> m UTCTime         -- ^ Parsed UTCTime
@@ -385,8 +385,11 @@
     parseTime' = parseTimeM True locale
     formats    =
         [ "%a, %d %b %Y %H:%M:%S %Z"
+        , "%a, %d %b %Y %H:%M:%S"
         , "%Y-%m-%dT%H:%M:%S%Z"
+        , "%Y-%m-%dT%H:%M:%S"
         , "%Y-%m-%d %H:%M:%S%Z"
+        , "%Y-%m-%d %H:%M:%S"
         , "%Y-%m-%d"
         , "%B %e, %Y %l:%M %p"
         , "%B %e, %Y"
diff --git a/lib/Hakyll/Web/Template/List.hs b/lib/Hakyll/Web/Template/List.hs
--- a/lib/Hakyll/Web/Template/List.hs
+++ b/lib/Hakyll/Web/Template/List.hs
@@ -60,7 +60,7 @@
 --------------------------------------------------------------------------------
 -- | Sort pages chronologically. Uses the same method as 'dateField' for
 -- extracting the date.
-chronological :: MonadMetadata m => [Item a] -> m [Item a]
+chronological :: (MonadMetadata m, MonadFail m) => [Item a] -> m [Item a]
 chronological =
     sortByM $ getItemUTC defaultTimeLocale . itemIdentifier
   where
@@ -71,14 +71,14 @@
 
 --------------------------------------------------------------------------------
 -- | The reverse of 'chronological'
-recentFirst :: MonadMetadata m => [Item a] -> m [Item a]
+recentFirst :: (MonadMetadata m, MonadFail m) => [Item a] -> m [Item a]
 recentFirst = liftM reverse . chronological
 
 
 --------------------------------------------------------------------------------
 -- | Version of 'chronological' which doesn't need the actual items.
 sortChronological
-    :: MonadMetadata m => [Identifier] -> m [Identifier]
+    :: (MonadMetadata m, MonadFail m) => [Identifier] -> m [Identifier]
 sortChronological ids =
     liftM (map itemIdentifier) $ chronological [Item i () | i <- ids]
 
@@ -86,6 +86,6 @@
 --------------------------------------------------------------------------------
 -- | Version of 'recentFirst' which doesn't need the actual items.
 sortRecentFirst
-    :: MonadMetadata m => [Identifier] -> m [Identifier]
+    :: (MonadMetadata m, MonadFail m) => [Identifier] -> m [Identifier]
 sortRecentFirst ids =
     liftM (map itemIdentifier) $ recentFirst [Item i () | i <- ids]
diff --git a/src/Init.hs b/src/Init.hs
--- a/src/Init.hs
+++ b/src/Init.hs
@@ -46,7 +46,7 @@
         ["-f", dstDir] ->
             createFiles True srcDir files dstDir
         _ -> do
-            putStrLn $ "Usage: " ++ progName ++ "[-f] <directory>"
+            putStrLn $ "Usage: " ++ progName ++ " [-f] <directory>"
             exitFailure
 
     where
diff --git a/web/site.hs b/web/site.hs
--- a/web/site.hs
+++ b/web/site.hs
@@ -3,12 +3,11 @@
 import           Control.Arrow    (second)
 import           Control.Monad    (filterM, forM_)
 import           Data.List        (isPrefixOf, sortBy)
-import           Data.Monoid      ((<>))
 import           Data.Ord         (comparing)
 import           Hakyll
 import           System.Directory (copyFile)
 import           System.FilePath  (dropTrailingPathSeparator, splitPath)
-import           Text.Pandoc
+import qualified Text.Pandoc      as Pandoc
 
 
 --------------------------------------------------------------------------------
@@ -67,9 +66,15 @@
     match "templates/*" $ compile templateCompiler
   where
     withToc = defaultHakyllWriterOptions
-        { writerTableOfContents = True
-        , writerTemplate        = Just "$toc$\n$body$"
+        { Pandoc.writerTableOfContents = True
+        , Pandoc.writerTemplate        = Just tocTemplate
         }
+
+    -- When did it get so hard to compile a string to a Pandoc template?
+    tocTemplate =
+        either error id $ either (error . show) id $
+        Pandoc.runPure $ Pandoc.runWithDefaultPartials $
+        Pandoc.compileTemplate "" "$toc$\n$body$"
 
 
 --------------------------------------------------------------------------------
