diff --git a/sitepipe.cabal b/sitepipe.cabal
--- a/sitepipe.cabal
+++ b/sitepipe.cabal
@@ -1,55 +1,55 @@
-name:                sitepipe
-version:             0.3.0.2
-synopsis:            A simple to understand static site generator
-homepage:            https://github.com/ChrisPenner/sitepipe#readme
-license:             BSD3
-license-file:        LICENSE
-author:              Chris Penner
-maintainer:          christopher.penner@gmail.com
-copyright:           2017 Chris Penner
-category:            Web
-build-type:          Simple
-extra-source-files:  README.md
-cabal-version:       >=1.10
-Tested-With:         GHC == 8.0.2, GHC == 8.2.1
-
-library
-  hs-source-dirs:      src
-  exposed-modules:     SitePipe
-                     , SitePipe.Pipes
-                     , SitePipe.Readers
-                     , SitePipe.Templating
-                     , SitePipe.Files
-                     , SitePipe.Parse
-                     , SitePipe.Types
-                     , SitePipe.Utilities
-  build-depends:       base                 >= 4.9      && < 4.11
-                     , optparse-applicative >= 0.13.2
-                     , unordered-containers >= 0.2.8.0  && < 0.3
-                     , directory            >= 1.3.0.0  && < 1.4
-                     , filepath             >= 1.4.1.1  && < 1.5
-                     , megaparsec           >= 5.3.1    && < 6.6
-                     , mtl                  >= 2.2.1    && < 2.3
-                     , pandoc               >= 1.19.2   && < 1.20
-                     , yaml                 >= 0.8.23.3 && < 0.9
-                     , mustache             >= 2.2.3
-                     , bytestring           >= 0.10.8.1 && < 0.11
-                     , text                 >= 1.2.2.2  && < 1.3
-                     , parsec               >= 3.1.11   && < 3.2
-                     , exceptions           >= 0.8.3    && < 0.9
-                     , Glob                 >= 0.8.0    && < 0.10
-                     , lens-aeson           >= 1.0.2    && < 1.1
-                     , lens                 >= 4.15.4   && < 4.17
-                     , aeson                >= 1.1.2.0  && < 1.3
-                     , shelly               >= 1.6.8    && < 1.8
-                     , MissingH             >= 1.4.0.1  && < 1.5
-                     , containers           >= 0.5.7.1  && < 0.6
-
-  if impl(ghc >= 8.2)
-    build-depends:     pandoc >= 1.19.2.4
-
-  default-language:    Haskell2010
+cabal-version: >=1.10
+name: sitepipe
+version: 0.4.0.0
+license: BSD3
+license-file: LICENSE
+copyright: 2017 Chris Penner
+maintainer: christopher.penner@gmail.com
+author: Chris Penner
+tested-with: ghc ==8.0.2 ghc ==8.2.1
+homepage: https://github.com/ChrisPenner/sitepipe#readme
+synopsis: A simple to understand static site generator
+category: Web
+build-type: Simple
+extra-source-files:
+    README.md
 
 source-repository head
-  type:     git
-  location: https://github.com/ChrisPenner/sitepipe
+    type: git
+    location: https://github.com/ChrisPenner/sitepipe
+
+library
+    exposed-modules:
+        SitePipe
+        SitePipe.Pipes
+        SitePipe.Readers
+        SitePipe.Templating
+        SitePipe.Files
+        SitePipe.Parse
+        SitePipe.Types
+        SitePipe.Utilities
+    hs-source-dirs: src
+    default-language: Haskell2010
+    build-depends:
+        base >=4.12.0.0 && <4.13,
+        optparse-applicative >=0.14.3.0 && <0.15,
+        unordered-containers >=0.2.9.0 && <0.3,
+        directory >=1.3.3.0 && <1.4,
+        filepath >=1.4.2.1 && <1.5,
+        megaparsec >=7.0.4 && <7.1,
+        mtl >=2.2.2 && <2.3,
+        pandoc ==2.5.*,
+        yaml >=0.11.0.0 && <0.12,
+        mustache >=2.3.0 && <2.4,
+        bytestring >=0.10.8.2 && <0.11,
+        text >=1.2.3.1 && <1.3,
+        parsec >=3.1.13.0 && <3.2,
+        exceptions >=0.10.0 && <0.11,
+        Glob >=0.9.3 && <0.10,
+        lens-aeson >=1.0.2 && <1.1,
+        lens ==4.17.*,
+        aeson >=1.4.2.0 && <1.5,
+        shelly >=1.8.1 && <1.9,
+        MissingH >=1.4.1.0 && <1.5,
+        containers >=0.6.0.1 && <0.7,
+        transformers >=0.5.5.0 && <0.6
diff --git a/src/SitePipe/Files.hs b/src/SitePipe/Files.hs
--- a/src/SitePipe/Files.hs
+++ b/src/SitePipe/Files.hs
@@ -101,7 +101,7 @@
 -- we copy matching files and directories as-is from the source directory
 -- to the output directory maintaining their relative filepath.
 --
--- For convenience this also returns a list of the files copied as 
+-- For convenience this also returns a list of the files copied as
 -- 'Value's with  "src" and "url" keys
 -- which represent the source path and the url.of the copied file respectively.
 copyFiles :: [GlobPattern] -> SiteM [Value]
diff --git a/src/SitePipe/Parse.hs b/src/SitePipe/Parse.hs
--- a/src/SitePipe/Parse.hs
+++ b/src/SitePipe/Parse.hs
@@ -26,7 +26,7 @@
 resourceP = do
   yaml <- fromMaybe "" <$> optional yamlParser
   space
-  rest <- manyTill anyChar eof
+  rest <- manyTill anySingle eof
   return (yaml, rest)
 
 -- | Given an identifier and file contents runs the yaml parser and returns
@@ -42,15 +42,15 @@
 yamlParser :: Parser String
 yamlParser = do
   _ <- yamlSep
-  manyTill anyChar (try (eol >> yamlSep))
+  manyTill anySingle (try (eol >> yamlSep))
     where
       yamlSep = string "---" >> eol
 
 -- | Decodes a yaml metadata block into an Aeson object containing the data in the yaml.
 decodeMeta :: MonadThrow m => String -> String -> m Value
 decodeMeta ident metaBlock =
-  case decodeEither (pack metaBlock) of
-    Left err -> throwM (YamlErr ident err)
+  case decodeEither' (pack metaBlock) of
+    Left err -> throwM (YamlErr ident (show err))
     Right (Object metaObj) -> return (Object metaObj)
     Right Null -> return (Object HM.empty)
     Right _ -> throwM (YamlErr ident "Top level yaml must be key-value pairs")
diff --git a/src/SitePipe/Readers.hs b/src/SitePipe/Readers.hs
--- a/src/SitePipe/Readers.hs
+++ b/src/SitePipe/Readers.hs
@@ -1,3 +1,5 @@
+{-# LANGUAGE FlexibleContexts #-}
+
 module SitePipe.Readers
   (
   -- * Built-in readers
@@ -6,44 +8,56 @@
 
   -- * Reader Generators
   , mkPandocReader
+  , mkPandocReaderWith
+  , readMarkdown
 
   -- * Pandoc Writers
   , pandocToHTML
   ) where
 
-import Text.Pandoc
+import Control.Monad.Trans.Except
+import Control.Monad.Trans.State.Strict
 import Control.Monad.Catch
+import Text.Pandoc
+import Text.Pandoc.Options
+import Text.Pandoc.Highlighting
+import Data.Text (pack, unpack)
 
 -- | Given any standard pandoc reader (see "Text.Pandoc"; e.g. 'readMarkdown', 'readDocX')
 -- makes a resource reader compatible with 'SitePipe.Files.resourceLoader'.
 --
 -- > docs <- resourceLoader (mkPandocReader readDocX) ["docs/*.docx"]
-mkPandocReader :: (ReaderOptions -> String -> Either PandocError Pandoc) -> String -> IO String
-mkPandocReader pReader = mkPandocReaderWith pReader id pandocToHTML
+mkPandocReader :: (ReaderOptions -> String -> PandocIO Pandoc) -> String -> IO String
+mkPandocReader pReader = mkPandocReaderWith pReader pure pandocToHTML
 
 -- | Like `mkPandocReader`, but allows you to provide both a @'Pandoc' -> 'Pandoc'@ transformation,
--- which is great for things like relativizing links or running transforms over specific document elements. 
+-- which is great for things like relativizing links or running transforms over specific document elements.
 -- See https://hackage.haskell.org/package/pandoc-lens for some useful tranformation helpers. You also specify
 -- the tranformation from @Pandoc -> String@ which allows you to pick the output format of the reader.
 -- If you're unsure what to use in this slot, the pandocToHTML function is a good choice.
-mkPandocReaderWith :: (ReaderOptions -> String -> Either PandocError Pandoc) -> (Pandoc -> Pandoc) -> (Pandoc -> String) -> String -> IO String
-mkPandocReaderWith pReader transformer writer content = writer . transformer <$> runPandocReader (pReader def) content
+mkPandocReaderWith :: (ReaderOptions -> String -> PandocIO Pandoc) -> (Pandoc -> PandocIO Pandoc) -> (Pandoc -> PandocIO String) -> String -> IO String
+mkPandocReaderWith pReader transformer writer content =
+  runPandoc $ writer
+          =<< transformer
+          =<< pReader def{readerExtensions = githubMarkdownExtensions}
+                      content
 
 -- | A simple helper which renders pandoc to HTML; good for use with 'mkPandocReaderWith'
-pandocToHTML :: Pandoc -> String
-pandocToHTML = writeHtmlString def{writerHighlight=True}
+pandocToHTML :: Pandoc -> PandocIO String
+pandocToHTML p = fmap unpack $ writeHtml5String def{writerHighlightStyle = Just pygments} p
 
 -- | Runs the Pandoc reader handling errors.
-runPandocReader :: (MonadThrow m) => (String -> Either PandocError Pandoc) -> String -> m Pandoc
-runPandocReader panReader source =
-  case panReader source of
-    Left err -> throwM err
-    Right pandoc -> return pandoc
+runPandoc :: PandocIO a -> IO a
+runPandoc m = do
+  z <- flip evalStateT def $ runExceptT $ unPandocIO m
+  case z of
+    Left e  -> throwM e
+    Right a -> pure a
 
 -- | Reads markdown files into html
 markdownReader :: String -> IO String
-markdownReader = mkPandocReader readMarkdown
+markdownReader = mkPandocReader $ \ro s -> readMarkdown ro $ pack s
 
 -- | Reads text files without processing
-textReader :: String -> IO String
-textReader = return
+textReader :: String -> PandocIO String
+textReader = pure
diff --git a/src/SitePipe/Types.hs b/src/SitePipe/Types.hs
--- a/src/SitePipe/Types.hs
+++ b/src/SitePipe/Types.hs
@@ -44,7 +44,7 @@
 data SitePipeError =
   YamlErr String String
     | PParseErr P.ParseError
-    | MParseErr (MP.ParseError (MP.Token String) MPErr)
+    | MParseErr (MP.ParseErrorBundle String Void)
     | PandocErr PandocError
     | JSONErr String String
     | TemplateParseErr P.ParseError
@@ -55,7 +55,7 @@
   show (YamlErr path err) = "YAML Parse Error in " ++ path ++ ":\n" ++ err
   show (PandocErr err) = "Pandoc Error: " ++ show err
   show (PParseErr err) = "Template Error: " ++ show err
-  show (MParseErr err) = "Meta-data Error: " ++ MP.parseErrorPretty err
+  show (MParseErr err) = "Meta-data Error: " ++ MP.errorBundlePretty err
   show (JSONErr path err) = "JSON Parse Error in " ++ path ++ ":\n" ++ err
   show (TemplateParseErr err) = "Template Parse Error: " ++ show err
   show (TemplateInterpolateErr path errs) =
