diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,8 @@
+# Changelog
+
+## 6.1.0
+
+- RPC functions now return in `Maybe`, for occasions where connection to the AUR
+  was impossible. Previously, that case would result in an empty list.
+- RPC functions now return in a monomorphized `IO`, instead of the previous
+  polymorphic `MonadIO`.
diff --git a/Linux/Arch/Aur/Rpc.hs b/Linux/Arch/Aur/Rpc.hs
--- a/Linux/Arch/Aur/Rpc.hs
+++ b/Linux/Arch/Aur/Rpc.hs
@@ -1,19 +1,16 @@
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE TypeOperators #-}
-{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE OverloadedStrings, TypeOperators, DataKinds #-}
 
 -- |
 -- Module    : Linux.Arch.Aur.Rpc
--- Copyright : (c) Colin Woodbury, 2014, 2015, 2016
+-- Copyright : (c) Colin Woodbury, 2014 - 2018
 -- License   : GPL3
--- Maintainer: Colin Woodbury <colingw@gmail.com>
+-- Maintainer: Colin Woodbury <colin@fosskers.ca>
 --
 -- See https://aur.archlinux.org/rpc for details.
 
-module Linux.Arch.Aur.Rpc
-       ( info, search ) where
+module Linux.Arch.Aur.Rpc ( info, search ) where
 
-import Control.Monad.IO.Class (MonadIO, liftIO)
+import Control.Error.Util (hush)
 import Data.Proxy
 import Data.Text (Text)
 import Linux.Arch.Aur.Types
@@ -45,12 +42,14 @@
 rpcI :<|> rpcS = client api
 
 -- | Perform an @info@ call on one or more package names.
-info :: MonadIO m => Manager -> [Text] -> m [AurInfo]
+-- Will fail with a `Nothing` if there was a connection/decoding error.
+info :: Manager -> [Text] -> IO (Maybe [AurInfo])
 info m ps = unwrap m $ rpcI (Just "5") (Just "info") ps
 
 -- | Perform a @search@ call on a package name or description text.
-search :: MonadIO m => Manager -> Text -> m [AurInfo]
+-- Will fail with a `Nothing` if there was a connection/decoding error.
+search :: Manager -> Text -> IO (Maybe [AurInfo])
 search m p = unwrap m $ rpcS (Just "5") (Just "search") (Just p)
 
-unwrap :: MonadIO m => Manager -> ClientM RPCResp -> m [AurInfo]
-unwrap m r = liftIO . fmap (either (const []) _results) $ runClientM r (ClientEnv m url)
+unwrap :: Manager -> ClientM RPCResp -> IO (Maybe [AurInfo])
+unwrap m r = fmap _results . hush <$> runClientM r (ClientEnv m url Nothing)
diff --git a/Linux/Arch/Aur/Types.hs b/Linux/Arch/Aur/Types.hs
--- a/Linux/Arch/Aur/Types.hs
+++ b/Linux/Arch/Aur/Types.hs
@@ -2,9 +2,9 @@
 
 -- |
 -- Module    : Linux.Arch.Aur.Types
--- Copyright : (c) Colin Woodbury, 2014, 2015, 2016
+-- Copyright : (c) Colin Woodbury, 2014 - 2018
 -- License   : GPL3
--- Maintainer: Colin Woodbury <colingw@gmail.com>
+-- Maintainer: Colin Woodbury <colin@fosskers.ca>
 
 module Linux.Arch.Aur.Types
     ( RPCResp(..)
@@ -79,3 +79,27 @@
                            v .:? "Keywords"    .!= []
 
     parseJSON _ = mzero
+
+instance ToJSON AurInfo where
+  toJSON ai = object
+    [ "ID" .= aurIdOf ai
+    , "Name" .= aurNameOf ai
+    , "PackageBaseID" .= pkgBaseIdOf ai
+    , "PackageBase" .= pkgBaseOf ai
+    , "Version" .= aurVersionOf ai
+    , "Description" .= aurDescriptionOf ai
+    , "URL" .= urlOf ai
+    , "NumVotes" .= aurVotesOf ai
+    , "Popularity" .= popularityOf ai
+    , "OutOfDate" .= dateObsoleteOf ai
+    , "Maintainer" .= aurMaintainerOf ai
+    , "FirstSubmitted" .= submissionDateOf ai
+    , "LastModified" .= modifiedDateOf ai
+    , "URLPath" .= urlPathOf ai
+    , "Depends" .= dependsOf ai
+    , "MakeDepends" .= makeDepsOf ai
+    , "OptDepends" .= optDepsOf ai
+    , "Conflicts" .= conflictsOf ai
+    , "Provides" .= providesOf ai
+    , "License" .= licenseOf ai
+    , "Keywords" .= keywordsOf ai ]
diff --git a/README.md b/README.md
new file mode 100644
--- /dev/null
+++ b/README.md
@@ -0,0 +1,3 @@
+# haskell-aur
+
+Access metadata from the Arch Linux User Repository.
diff --git a/aur.cabal b/aur.cabal
--- a/aur.cabal
+++ b/aur.cabal
@@ -1,68 +1,58 @@
-name:                aur
-
-version:             6.0.0.1
-
-synopsis:            Access metadata from the Arch Linux User Repository.
-
-homepage:            https://github.com/fosskers/haskell-aur
-
-license:             GPL-3
-
-license-file:        LICENSE
-
-author:              Colin Woodbury
-
-maintainer:          colingw@gmail.com
-
-category:            Linux
-
-build-type:          Simple
-
-cabal-version:       >=1.10
+cabal-version: 1.12
 
-description:         Access package information from Arch Linux's AUR via its
-                     RPC interface. The main exposed functions reflect
-                     those of the RPC:
-                     .
-                     * info:      Get metadata for one package.
-                     .
-                     * search:    Get limited metadata for packages that
-                                  match a given regex.
-                     .
-                     By default this library supports version 5 of the RPC,
-                     and hence version 4.2+ of the AUR.
+-- This file has been generated from package.yaml by hpack version 0.30.0.
+--
+-- see: https://github.com/sol/hpack
+--
+-- hash: 9af215c031bd05af2173f07269067c3c3a903e8f9227649fdf2f833699c8f4e8
 
-source-repository head
-  type:     git
-  location: git://github.com/aurapm/haskell-aur.git
+name:           aur
+version:        6.1.0
+synopsis:       Access metadata from the Arch Linux User Repository.
+description:    Access package information from Arch Linux\'s AUR via its RPC interface. The main exposed functions reflect those of the RPC.
+                `info` gets metadata for one package. `search` gets limited metadata for packages that match a given regex.
+                By default this library supports version 5 of the RPC, and hence version 4.2+ of the AUR.
+category:       Linux
+homepage:       https://github.com/aurapm/aura
+author:         Colin Woodbury
+maintainer:     colin@fosskers.ca
+copyright:      2018 Colin Woodbury
+license:        GPL-3
+license-file:   LICENSE
+build-type:     Simple
+extra-source-files:
+    README.md
+    CHANGELOG.md
 
 library
-  exposed-modules:     Linux.Arch.Aur,
-                       Linux.Arch.Aur.Rpc,
-                       Linux.Arch.Aur.Types
-
+  exposed-modules:
+      Linux.Arch.Aur
+      Linux.Arch.Aur.Rpc
+      Linux.Arch.Aur.Types
+  hs-source-dirs:
+      ./.
+  ghc-options: -fwarn-unused-imports -fwarn-unused-binds -fwarn-name-shadowing -fwarn-unused-matches -fwarn-incomplete-patterns -fwarn-redundant-constraints -Wincomplete-uni-patterns
   build-depends:
-                       base >= 4.8 && < 4.10
-                     , aeson >= 0.9 && < 1.2
-                     , http-client >= 0.5 && < 0.6
-                     , servant >= 0.9 && < 0.12
-                     , servant-client >= 0.9 && < 0.12
-                     , text >= 1.2 && < 1.3
-
-  default-language:    Haskell2010
-
-  ghc-options:         -fwarn-unused-imports
+      aeson >=0.9 && <1.4
+    , base >=4.10 && <4.12
+    , errors >=2.3 && <2.4
+    , http-client >=0.5 && <0.6
+    , servant >=0.9 && <0.15
+    , servant-client >=0.13 && <0.15
+    , text
+  default-language: Haskell2010
 
 test-suite aur-test
-  type:                exitcode-stdio-1.0
-
-  build-depends:       aur
-                     , base >= 4.8 && < 4.10
-                     , tasty >= 0.11 && < 0.12
-                     , tasty-hunit >= 0.9 && < 0.10
-                     , http-client >= 0.5 && < 0.6
-                     , http-client-tls >= 0.3 && < 0.4
-
-  hs-source-dirs:      tests
-  main-is:             Test.hs
-  default-language:    Haskell2010
+  type: exitcode-stdio-1.0
+  main-is: Test.hs
+  hs-source-dirs:
+      tests
+  ghc-options: -fwarn-unused-imports -fwarn-unused-binds -fwarn-name-shadowing -fwarn-unused-matches -fwarn-incomplete-patterns -fwarn-redundant-constraints -Wincomplete-uni-patterns -threaded -with-rtsopts=-N
+  build-depends:
+      aur
+    , base >=4.10 && <4.12
+    , http-client >=0.5 && <0.6
+    , http-client-tls >=0.3 && <0.4
+    , tasty >=0.11 && <2.0
+    , tasty-hunit >=0.9 && <0.11
+  default-language: Haskell2010
diff --git a/tests/Test.hs b/tests/Test.hs
--- a/tests/Test.hs
+++ b/tests/Test.hs
@@ -18,13 +18,13 @@
   ]
 
 infoTest :: Manager -> Assertion
-infoTest m = info m ["aura"] >>= assert . not . null
+infoTest m = info m ["aura"] >>= \x -> (not . null <$> x) @?= Just True
 
 infoTest' :: Manager -> Assertion
-infoTest' m = info m ["aura1234567"] >>= assert . null
+infoTest' m = info m ["aura1234567"] >>= \x -> (null <$> x) @?= Just True
 
 searchTest :: Manager -> Assertion
-searchTest m = search m "aura" >>= assert . not . null
+searchTest m = search m "aura" >>= assertBool "Good search" . not . null
 
 main :: IO ()
 main = do
