diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,5 +1,9 @@
 # Changelog for Shakebook
 
+## (v0.7.2.0)
+
+* Upgrade to [aeson-with](https://hackage.haskell.org/package/aeson-with) v0.1.1.0.
+
 ## (v0.7.1.0)
 
 * Upgrade to [zipper-extra](https://hackage.haskell.org/package/zipper-extra) v0.1.3.0.
diff --git a/shakebook.cabal b/shakebook.cabal
--- a/shakebook.cabal
+++ b/shakebook.cabal
@@ -4,10 +4,10 @@
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: 3fd5dfe9c0ad89666b06e7a79e4f378fa824b3670c6416345ba0f3af5518c5cc
+-- hash: 0ed9b385c04cfae22cd6f8586c6fd4b3659a7a6697ffaba9679d0823ca37c3a9
 
 name:           shakebook
-version:        0.7.1.0
+version:        0.7.2.0
 synopsis:       Shake-based technical documentation generator; HTML & PDF
 description:    Shakebook is a documentation generator aimed at covering all the bases for mathematical, technical and scientific diagrams and typesetting. Shakebook provides combinators for taking markdown files and combining them into documents, but allowing the user to control how. Shakebook provides general combinators for templating single pages, cofree comonads for representing tables of contents, and zipper comonads for representing pagers.
 category:       Web
@@ -37,7 +37,7 @@
   ghc-options: -Wall -Wcompat -Wincomplete-record-updates -Wincomplete-uni-patterns -Wredundant-constraints
   build-depends:
       aeson >=1.5.2.0
-    , aeson-with >=0.1.0.0
+    , aeson-with >=0.1.1.0
     , base >=4.7 && <5
     , comonad
     , comonad-extras
@@ -70,7 +70,7 @@
   ghc-options: -Wall -Wcompat -Wincomplete-record-updates -Wincomplete-uni-patterns -Wredundant-constraints -threaded -rtsopts -with-rtsopts=-N
   build-depends:
       aeson >=1.5.2.0
-    , aeson-with >=0.1.0.0
+    , aeson-with >=0.1.1.0
     , base >=4.7 && <5
     , comonad
     , comonad-extras
diff --git a/src/Shakebook/Conventions.hs b/src/Shakebook/Conventions.hs
--- a/src/Shakebook/Conventions.hs
+++ b/src/Shakebook/Conventions.hs
@@ -6,7 +6,6 @@
   viewImage
 , viewPostTime
 , viewPostTimeRaw
-, viewSrcPath
 , viewTags
 , viewTitle
 , viewAllPostTags
@@ -78,31 +77,31 @@
 import           Text.Pandoc.Highlighting
 
 -- | View the "image" field of a JSON value.
-viewImage :: Value -> Text
-viewImage = view (key "image" . _String)
+viewImage :: ToJSON a => a -> Text
+viewImage = view' (key "image" . _String)
 
 -- | View the "date" field of a JSON Value as a UTCTime.
-viewPostTime :: Value -> UTCTime
-viewPostTime = parseISODateTime . view (key "date" . _String)
+viewPostTime :: ToJSON a => a -> UTCTime
+viewPostTime = parseISODateTime . view' (key "date" . _String)
 
 -- | View the "date" field of a JSON Value as Text.
-viewPostTimeRaw :: Value -> Text
-viewPostTimeRaw = view (key "date" . _String)
+viewPostTimeRaw :: ToJSON a => a -> Text
+viewPostTimeRaw = view' (key "date" . _String)
 
 -- | View the "tags" field of a JSON Value as a list.
-viewTags :: Value -> [Text]
-viewTags = toListOf (key "tags" . values . _String)
+viewTags :: ToJSON a => a -> [Text]
+viewTags = toListOf' (key "tags" . values . _String)
 
 -- | View the "title" field of a JSON Value.
-viewTitle :: Value -> Text
-viewTitle = view (key "title" . _String)
+viewTitle :: ToJSON a => a -> Text
+viewTitle = view' (key "title" . _String)
 
 -- | View all post tags for a list of posts.
-viewAllPostTags :: [Value] -> [Text]
+viewAllPostTags :: ToJSON a => [a] -> [Text]
 viewAllPostTags = (>>= viewTags)
 
 -- | View all posts times for a list of posts.
-viewAllPostTimes :: [Value] -> [UTCTime]
+viewAllPostTimes :: ToJSON a => [a] -> [UTCTime]
 viewAllPostTimes = fmap viewPostTime
 
 -- | Add "base-url" field from input Text.
@@ -264,14 +263,14 @@
   object ["toc1" A..= [_Object . at "toc2" ?~ Array (V.fromList $ map toc2 xs) $ x]] where
       toc2 (y :< ys) = (_Object . at "toc3" ?~ Array (V.fromList $ map extract ys)) y
 
-genPageData :: Text -> (Text -> Text) -> Zipper [] [Value] -> Value
+genPageData :: ToJSON a => Text -> (Text -> Text) -> Zipper [] [a] -> Value
 genPageData t f xs = let x = T.pack . show $ pos xs + 1
                      in withTitle t
                       . withJSON (genLinkData x (f x))
                       . withPosts (extract xs) $ Object mempty
 
-genIndexPageData :: MonadThrow m
-                 => [Value]
+genIndexPageData :: (MonadThrow m, ToJSON a)
+                 => [a]
                  -> Text
                  -> (Text -> Text)
                  -> Int
diff --git a/src/Shakebook/Pandoc.hs b/src/Shakebook/Pandoc.hs
--- a/src/Shakebook/Pandoc.hs
+++ b/src/Shakebook/Pandoc.hs
@@ -109,24 +109,24 @@
 flattenMeta opts meta = liftAction $ Slick.Pandoc.flattenMeta opts meta
 
 -- | View the "content" field of a JSON value.
-viewContent :: Value -> Text
-viewContent = view (key "content" . _String)
+viewContent :: ToJSON a => a -> Text
+viewContent = view' (key "content" . _String)
 
 -- | Add "content" field from input Text.
 withContent :: Text -> Value -> Value
 withContent = withStringField "content"
 
 -- | View the "src-path" field of a JSON Value.
-viewSrcPath :: Value -> Text
-viewSrcPath = view (key "src-path" . _String)
+viewSrcPath :: ToJSON a => a -> Text
+viewSrcPath = view' (key "src-path" . _String)
 
 -- | Add "src-path" field based on input Text.
 withSrcPath :: Text -> Value -> Value
 withSrcPath = withStringField "src-path"
 
 -- | View the "url" field of a JSON Value.
-viewUrl :: Value -> Text
-viewUrl = view (key "url" . _String)
+viewUrl :: ToJSON a => a -> Text
+viewUrl = view' (key "url" . _String)
 
 -- | Add "url" field from input Text.
 withUrl :: Text -> Value -> Value
diff --git a/test/Spec.hs b/test/Spec.hs
--- a/test/Spec.hs
+++ b/test/Spec.hs
@@ -64,12 +64,12 @@
 
   blogIndexPageData <- newCache $ \fp -> do
     xs <- postsIx fp
-    genIndexPageData (unPost <$> Ix.toList xs) "Posts" ("/posts/pages/" <>) postsPerPage
+    genIndexPageData (Ix.toList xs) "Posts" ("/posts/pages/" <>) postsPerPage
 
   blogTagIndexPageData <- newCache $ \fp -> do
     xs <- postsIx fp
     k <- forM (Ix.groupDescBy xs) $ \(Tag t, ys) -> do
-      z <- genIndexPageData (unPost <$> ys) ("Posts tagged " <> t) (("/posts/tags/" <> t <> "/pages/") <>) postsPerPage
+      z <- genIndexPageData ys ("Posts tagged " <> t) (("/posts/tags/" <> t <> "/pages/") <>) postsPerPage
       return (t, z)
     return $ HM.fromList k
 
@@ -77,7 +77,7 @@
     xs <- postsIx fp
     k <- forM (Ix.groupDescBy xs) $ \(YearMonth (y,m), ys) -> do
       let t' = UTCTime (fromGregorian y m 1) 0
-      z <- genIndexPageData (unPost <$> ys)
+      z <- genIndexPageData ys
                             (("Posts from " <>) . defaultPrettyMonthFormat $ t')
                             (("/posts/months/"  <> defaultMonthUrlFormat t' <> "/pages/") <>)
                             postsPerPage
@@ -113,8 +113,8 @@
   o' "posts/*.html" %^> \out -> do
     src <- blinkAndMapM sourceFolder withMdExtension out
     xs  <- postsZ myPosts
-    xs' <- seekOnThrow (viewSrcPath . unPost) (T.pack . toFilePath . extract $ src) xs
-    myBuildBlogPage $(mkRelFile "templates/post.html") (extract (unPost <$> xs')) out
+    xs' <- seekOnThrow viewSrcPath (T.pack . toFilePath . extract $ src) xs
+    myBuildBlogPage $(mkRelFile "templates/post.html") (toJSON $ extract xs') out
 
   toc' <- mapM (mapM withHtmlExtension) $ fmap o' tableOfContents
   void . sequence . flip extend toc' $ \xs -> (toFilePath <$> extract xs) %^> \out -> do
