diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,7 +1,11 @@
+# 0.3.0.0
+
+* Added `lucidT`.
+
 # 0.2.0.0
 
-* Change types (the previous version was unusable).
-* Actually return the value returned by the Lucid action.
+* Changed types (the previous version was unusable).
+* Now the value returned by the Lucid action is *actually* returned.
 
 # 0.1.0.0 (deprecated)
 
diff --git a/Spock-lucid.cabal b/Spock-lucid.cabal
--- a/Spock-lucid.cabal
+++ b/Spock-lucid.cabal
@@ -1,5 +1,5 @@
 name:                Spock-lucid
-version:             0.2.0.0
+version:             0.3.0.0
 synopsis:            Lucid support for Spock
 description:
   Lucid support for Spock
diff --git a/lib/Web/Spock/Lucid.hs b/lib/Web/Spock/Lucid.hs
--- a/lib/Web/Spock/Lucid.hs
+++ b/lib/Web/Spock/Lucid.hs
@@ -9,12 +9,14 @@
 (
   lucid,
   lucidIO,
+  lucidT,
 )
 where
 
 
 import Data.Functor.Identity
 import Control.Monad.IO.Class
+import Control.Monad.Trans.Class
 import Web.Spock
 import Lucid.Base
 import Blaze.ByteString.Builder
@@ -42,3 +44,12 @@
   return a
 {-# INLINE lucidIO #-}
 
+-- | Like 'lucid', but for arbitrary monads. Might require some additional
+-- boilerplate.
+lucidT :: MonadIO m => HtmlT m a -> ActionCtxT cxt m a
+lucidT x = do
+  setHeader "Content-Type" "text/html; charset=utf-8"
+  (render, a) <- lift (runHtmlT x)
+  lazyBytes (toLazyByteString (render mempty))
+  return a
+{-# INLINE lucidT #-}
