diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,11 @@
 # Changelog
 
+## [0.4.0.1] - 2024-07-26
+
+### Added
+
+* The `viaCodec` reader.
+
 ## [0.4.0.0] - 2024-07-23
 
 ### Added
diff --git a/opt-env-conf.cabal b/opt-env-conf.cabal
--- a/opt-env-conf.cabal
+++ b/opt-env-conf.cabal
@@ -5,7 +5,7 @@
 -- see: https://github.com/sol/hpack
 
 name:           opt-env-conf
-version:        0.4.0.0
+version:        0.4.0.1
 synopsis:       Settings parsing for Haskell: command-line arguments, environment variables, and configuration values.
 homepage:       https://github.com/NorfairKing/opt-env-conf#readme
 bug-reports:    https://github.com/NorfairKing/opt-env-conf/issues
diff --git a/src/OptEnvConf/Reader.hs b/src/OptEnvConf/Reader.hs
--- a/src/OptEnvConf/Reader.hs
+++ b/src/OptEnvConf/Reader.hs
@@ -12,6 +12,7 @@
     str,
     auto,
     exists,
+    viaCodec,
 
     -- * Constructing your own reader
     maybeReader,
@@ -29,13 +30,16 @@
   )
 where
 
+import Autodocodec
 import Control.Monad.Reader (MonadReader (..))
+import Data.Aeson.Types as JSON
 import Data.List (intercalate)
 import Data.List.NonEmpty (NonEmpty (..), (<|))
 import qualified Data.List.NonEmpty as NE
 import Data.Set (Set)
 import qualified Data.Set as S
 import Data.String
+import qualified Data.Text as T
 import Text.Read (readMaybe)
 
 newtype Reader a = Reader {unReader :: String -> Either String a}
@@ -83,6 +87,9 @@
 -- > exists = Reader $ const $ pure True
 exists :: Reader Bool
 exists = Reader $ const $ pure True
+
+viaCodec :: (HasCodec a) => Reader a
+viaCodec = eitherReader $ parseEither $ parseJSONViaCodec . JSON.String . T.pack
 
 -- | Turn a 'Maybe' parsing function into a 'Reader'
 maybeReader :: (String -> Maybe a) -> Reader a
