diff --git a/BlogLiterately-diagrams.cabal b/BlogLiterately-diagrams.cabal
--- a/BlogLiterately-diagrams.cabal
+++ b/BlogLiterately-diagrams.cabal
@@ -1,5 +1,5 @@
 name:                BlogLiterately-diagrams
-version:             0.2.1
+version:             0.3
 synopsis:            Include images in blog posts with inline diagrams code
 description:         A plugin for @BlogLiterately@ (<http://hackage.haskell.org/package/BlogLiterately>) which turns inline diagrams
                      code into images.
@@ -63,12 +63,11 @@
 author:              Brent Yorgey
 maintainer:          byorgey@gmail.com
 bug-reports:         http://github.com/byorgey/BlogLiterately-diagrams/issues
-copyright:           Copyright 2012-2015 Brent Yorgey
+copyright:           Copyright 2012-2022 Brent Yorgey
 category:            Web
 build-type:          Simple
 cabal-version:       1.18
-tested-with:         GHC == 8.0.2, GHC == 8.2.2, GHC == 8.4.4, GHC == 8.6.3
-
+tested-with:         GHC ==8.6.5 || ==8.8.4 || ==8.10.7 || ==9.0.2 || ==9.2.1
 
 source-repository head
   type:     git
@@ -77,7 +76,7 @@
 library
   default-language:    Haskell2010
   exposed-modules:     Text.BlogLiterately.Diagrams
-  build-depends:       base >= 4.3 && < 4.13,
+  build-depends:       base >= 4.3 && < 4.17,
                        containers,
                        filepath,
                        directory,
@@ -85,10 +84,11 @@
                        diagrams-rasterific >= 1.3 && < 1.5,
                        JuicyPixels         >= 3.2 && < 3.4,
                        diagrams-builder    >= 0.5 && < 0.9,
-                       BlogLiterately      >= 0.6 && < 0.9,
-                       pandoc              >= 1.16 && < 2.8,
+                       BlogLiterately      >= 0.8.7 && < 0.9,
+                       pandoc              >= 2.8 && < 2.19,
                        safe                ==0.3.*,
-                       split               >= 0.2 && < 0.3
+                       split               >= 0.2 && < 0.3,
+                       text                >= 1.2 && < 2.1
   hs-source-dirs:      src
 
 executable BlogLiteratelyD
diff --git a/CHANGES b/CHANGES
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,9 @@
+* 0.3 (24 May 2022)
+
+  - allow `base-4.16`
+  - Update to work with `pandoc` versions 2.8 through 2.18
+  - Update to work with latest `BlogLiterately`
+
 * 0.2.1 (5 March 2019)
 
   - allow `base-4.12`, `pandoc-2.7`, `JuicyPixels-3.3`
diff --git a/src/Text/BlogLiterately/Diagrams.hs b/src/Text/BlogLiterately/Diagrams.hs
--- a/src/Text/BlogLiterately/Diagrams.hs
+++ b/src/Text/BlogLiterately/Diagrams.hs
@@ -1,3 +1,6 @@
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE TypeApplications  #-}
+
 -----------------------------------------------------------------------------
 -- |
 -- Module      :  Text.BlogLiterately.Diagrams
@@ -29,6 +32,10 @@
 import           Data.List                   (find, isPrefixOf)
 import           Data.List.Split             (splitOn)
 import           Data.Maybe                  (fromMaybe)
+import           Data.Text                   (Text)
+import qualified Data.Text                   as T
+import qualified Data.Text.IO                as T
+
 import           Diagrams.Backend.Rasterific
 import qualified Diagrams.Builder            as DB
 import           Diagrams.Prelude            (SizeSpec, V2, centerXY, pad, zero,
@@ -93,7 +100,7 @@
   where
     defs = queryWith extractDiaDef p
 
-extractDiaDef :: Block -> [String]
+extractDiaDef :: Block -> [Text]
 extractDiaDef (CodeBlock (_, as, _) s)
     = [src | "dia-def" `elem` (maybe id (:) tag) as]
   where
@@ -105,18 +112,18 @@
 --   expression to render, render it and return the filename of the
 --   generated image (or an error message).
 renderDiagram :: Bool               -- ^ Apply padding automatically?
-              -> [String]           -- ^ Declarations
-              -> String             -- ^ Expression to render
+              -> [Text]             -- ^ Declarations
+              -> Text               -- ^ Expression to render
               -> SizeSpec V2 Double -- ^ Requested size
               -> Maybe FilePath     -- ^ Directory to save in ("diagrams" if unspecified)
-              -> IO (Either String FilePath)
+              -> IO (Either Text FilePath)
 renderDiagram shouldPad decls expr sz mdir = do
     createDirectoryIfMissing True diaDir
 
     let bopts = DB.mkBuildOpts Rasterific zero (RasterificOptions sz)
-                  & DB.snippets .~ decls
+                  & DB.snippets .~ map T.unpack decls
                   & DB.imports  .~ ["Diagrams.Backend.Rasterific"]
-                  & DB.diaExpr  .~ expr
+                  & DB.diaExpr  .~ T.unpack expr
                   & DB.postProcess .~ (if shouldPad then pad 1.1 . centerXY else id)
                   & DB.decideRegen .~
                       (DB.hashedRegenerate
@@ -128,11 +135,11 @@
 
     case res of
       DB.ParseErr err    -> do
-        let errStr = "\nParse error:\n" ++ err
+        let errStr = T.append "\nParse error:\n" (T.pack err)
         putErrLn errStr
         return (Left errStr)
       DB.InterpErr ierr  -> do
-        let errStr = "\nInterpreter error:\n" ++ DB.ppInterpError ierr
+        let errStr = T.append "\nInterpreter error:\n" (T.pack (DB.ppInterpError ierr))
         putErrLn errStr
         return (Left errStr)
       DB.Skipped hash    -> return (Right $ mkFile (DB.hashToHexStr hash))
@@ -145,20 +152,20 @@
     diaDir = fromMaybe "diagrams" mdir
     mkFile base = diaDir </> base <.> "png"
 
-renderBlockDiagram :: Maybe FilePath -> Maybe (SizeSpec V2 Double) -> [String] -> Block -> IO Block
+renderBlockDiagram :: Maybe FilePath -> Maybe (SizeSpec V2 Double) -> [Text] -> Block -> IO Block
 renderBlockDiagram ximgDir ximgSize defs c@(CodeBlock attr@(_, cls, fields) s)
     | "dia-def" `elem` classTags = return Null
     | "dia"     `elem` classTags = do
         res <- renderDiagram True (src : defs) "dia" (attrToSize fields) Nothing
         case res of
-          Left  err      -> return (CodeBlock attr (s ++ err))
+          Left  err      -> return (CodeBlock attr (T.append s err))
           Right fileName -> do
             case (ximgDir, ximgSize) of
               (Just _, Just sz) -> do
                 _ <- renderDiagram True (src : defs) "dia" sz ximgDir
                 return ()
               _                 -> return ()
-            return $ Para [Image nullAttr [] (fileName, "")]
+            return $ Para [Image nullAttr [] (T.pack fileName, "")]
 
     | otherwise = return c
 
@@ -169,23 +176,23 @@
 
 renderBlockDiagram _ _ _ b = return b
 
-renderInlineDiagram :: [String] -> Inline -> IO Inline
+renderInlineDiagram :: [Text] -> Inline -> IO Inline
 renderInlineDiagram defs c@(Code attr@(_, cls, fields) expr)
     | "dia" `elem` cls = do
         res <- renderDiagram False defs expr (attrToSize fields) Nothing
         case res of
-          Left err       -> return (Code attr (expr ++ err))
-          Right fileName -> return $ Image nullAttr [] (fileName, "")
+          Left err       -> return (Code attr (T.append expr err))
+          Right fileName -> return $ Image nullAttr [] (T.pack fileName, "")
     | otherwise = return c
 
 renderInlineDiagram _ i = return i
 
-attrToSize :: [(String, String)] -> SizeSpec V2 Double
+attrToSize :: [(Text, Text)] -> SizeSpec V2 Double
 attrToSize fields
   = mkSizeSpec2D
-    (lookup "width" fields >>= readMay)
-    (lookup "height" fields >>= readMay)
+    (lookup "width" fields >>= (readMay . T.unpack))
+    (lookup "height" fields >>= (readMay . T.unpack))
 
 
-putErrLn :: String -> IO ()
-putErrLn = hPutStrLn stderr
+putErrLn :: Text -> IO ()
+putErrLn = T.hPutStrLn stderr
