diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -2,6 +2,7 @@
 
 [![Windows build status](https://ci.appveyor.com/api/projects/status/github/vmchale/madlang?svg=true)](https://ci.appveyor.com/project/vmchale/madlang)
 [![Build Status](https://travis-ci.org/vmchale/madlang.svg?branch=master)](https://travis-ci.org/vmchale/madlang)
+[![Hackage](https://img.shields.io/hackage/v/madlang.svg)](http://hackage.haskell.org/package/madlang)
 
 This is the Madlang DSL for generating text. You specify a template, and Madlang
 will create randomized text from the template.
diff --git a/app/Main.hs b/app/Main.hs
--- a/app/Main.hs
+++ b/app/Main.hs
@@ -127,5 +127,5 @@
                 (Debug _) -> putStr . either show displayTree =<< makeTree ins "" filepath
                 (Lint _ _) -> do
                     parsed <- parseFile ins "" filepath
-                    putStrLn $ either parseErrorPretty (const "No syntax errors found.") parsed
+                    putStrLn $ either parseErrorPretty (pure "No syntax errors found.") parsed
                 _ -> pure ()
diff --git a/demo/bi-update.mad b/demo/bi-update.mad
--- a/demo/bi-update.mad
+++ b/demo/bi-update.mad
@@ -1,5 +1,5 @@
 # inspired by https://twitter.com/biupdatebot
-# install libraries with `madlang install` if necessary.
+# install libraries with `madlang install` before running.
 :include adverbs.mad
 
 :return
diff --git a/madlang.cabal b/madlang.cabal
--- a/madlang.cabal
+++ b/madlang.cabal
@@ -1,6 +1,6 @@
 cabal-version: >=1.10
 name: madlang
-version: 4.0.2.2
+version: 4.0.2.5
 license: BSD3
 license-file: LICENSE
 copyright: Copyright: (c) 2016-2018 Vanessa McHale
diff --git a/man/madlang.1 b/man/madlang.1
--- a/man/madlang.1
+++ b/man/madlang.1
@@ -98,8 +98,8 @@
 https://hub.darcs.net/vmchale/madlang\-insults.
 .SH COPYRIGHT
 .PP
-Copyright 2017.
+Copyright 2017\-2018.
 Vanessa McHale.
 All Rights Reserved.
 .SH AUTHORS
-Vanessa McHale<vanessa.mchale@reconfigure.io>.
+Vanessa McHale<vamchale@gmail.com>.
diff --git a/src/Text/Madlibs/Ana/Resolve.hs b/src/Text/Madlibs/Ana/Resolve.hs
--- a/src/Text/Madlibs/Ana/Resolve.hs
+++ b/src/Text/Madlibs/Ana/Resolve.hs
@@ -42,14 +42,14 @@
 getInclusionCtx :: (MonadIO m) => Bool -> [T.Text] -> FilePath -> FilePath -> m (Either (ParseError Char (ErrorFancy Void)) [(Key, RandTok)])
 getInclusionCtx isTree ins folder filepath = liftIO $ do
     libDir <- do { home <- getEnv "HOME" ; pure (home <> (pathSep : ".madlang" <> pure pathSep)) }
-    file <- catch (readFile' (folder ++ filepath)) (const (readLibFile (libDir <> folder <> filepath)) :: IOException -> IO T.Text)
+    file <- catch (readFile' (folder ++ filepath)) (pure (readLibFile (libDir <> folder <> filepath)) :: IOException -> IO T.Text)
     let filenames = map T.unpack $ either (error . show) id $ parseInclusions filepath file -- TODO pass up errors correctly
     let resolveKeys file' = fmap (first (((T.pack . (<> "-")) . dropExtension) file' <>))
     ctxPure <- mapM (getInclusionCtx isTree ins folder) filenames
     let ctx = zipWith resolveKeys filenames <$> sequence ctxPure
     catch
-        (parseCtx isTree ins (concat . either (const []) id $ ctx) (folder ++ filepath))
-        (const (do { home <- getEnv "HOME" ; parseCtx isTree ins (concat . either (const []) id $ ctx) (home <> (pathSep : ".madlang") <> [pathSep] <> folder <> filepath) }) :: IOException -> IO (Either (ParseError Char (ErrorFancy Void)) [(Key, RandTok)]))
+        (parseCtx isTree ins (mconcat . either (pure []) id $ ctx) (folder ++ filepath))
+        (pure (do { home <- getEnv "HOME" ; parseCtx isTree ins (mconcat . either (pure []) id $ ctx) (home <> (pathSep : ".madlang") <> [pathSep] <> folder <> filepath) }) :: IOException -> IO (Either (ParseError Char (ErrorFancy Void)) [(Key, RandTok)]))
 
 pathSep :: Char
 pathSep | os == "windows" = '\\'
