diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -16,9 +16,9 @@
 
 contents :: Svg ()
 contents = do
-  rect_ [width_ "100%", height_ "100%", fill_ "red"]
+  rect_   [width_ "100%", height_ "100%", fill_ "red"]
   circle_ [cx_ "150", cy_ "100", r_ "80", fill_ "green"]
-  text_ [x_ "150", y_ "125", fontSize_ "60", textAnchor_ "middle", fill_ "white"] "SVG"
+  text_   [x_ "150", y_ "125", font_size_ "60", text_anchor_ "middle", fill_ "white"] "SVG"
 
 
 main :: IO ()
diff --git a/lucid-svg.cabal b/lucid-svg.cabal
--- a/lucid-svg.cabal
+++ b/lucid-svg.cabal
@@ -1,5 +1,5 @@
 name:                lucid-svg
-version:             0.3
+version:             0.4
 synopsis:            DSL for SVG using lucid for HTML
 homepage:            http://github.com/jeffreyrosenbluth/lucid-svg.git
 license:             BSD3
@@ -18,10 +18,10 @@
                        Lucid.Svg.Path,
                        Lucid.Svg.Elements,
                        Lucid.Svg.Attributes
-  build-depends:       base          >=4.7 && <4.8,
-                       blaze-builder >= 0.3 && < 0.4,
-                       transformers  >= 0.4  && < 0.5,
-                       text          >= 1.2  && < 1.3,
-                       lucid         >=2.8.1 && < 2.9
+  build-depends:       base          >= 4.7   && < 4.8,
+                       blaze-builder >= 0.3   && < 0.4,
+                       transformers  >= 0.4   && < 0.5,
+                       text          >= 1.2   && < 1.3,
+                       lucid         >= 2.8.1 && < 2.9
   hs-source-dirs:      src
   default-language:    Haskell2010
diff --git a/src/Lucid/Svg.hs b/src/Lucid/Svg.hs
--- a/src/Lucid/Svg.hs
+++ b/src/Lucid/Svg.hs
@@ -1,3 +1,5 @@
+{-# LANGUAGE OverloadedStrings       #-}
+
 {-# OPTIONS -fno-warn-unused-imports #-}
 
 -------------------------------------------------------------------------------
@@ -15,6 +17,8 @@
     -- $intro
     -- * Types
     Svg
+    -- * Rendering
+  , prettyText
     -- * Re-exports
   , module Lucid.Svg.Path
   , module Lucid.Svg.Elements
@@ -39,15 +43,41 @@
   , With(..)
   ) where
 
-import Data.Functor.Identity
-import Lucid.Base
-import qualified Lucid.Svg.Attributes as A
-import Lucid.Svg.Attributes hiding (colorProfile_, cursor_, filter_, path_, style_)
-import Lucid.Svg.Elements
-import Lucid.Svg.Path
+import           Data.Functor.Identity
+import           Data.Int               (Int64)
+import           Data.Monoid
+import           Data.Text.Lazy
+import           Data.Text.Lazy         as LT
+import           Data.Text.Lazy.Builder as B
+import           Lucid.Base
+import qualified Lucid.Svg.Attributes   as A
+import           Lucid.Svg.Attributes   hiding (colorProfile_, cursor_, filter_, path_, style_)
+import           Lucid.Svg.Elements
+import           Lucid.Svg.Path
 
 type Svg = SvgT Identity
 
+prettyText :: Svg a -> Text
+prettyText svg = B.toLazyText $ go (-1) text
+  where
+    text = renderText svg
+    go :: Int64 -> Text -> B.Builder
+    go n t
+      | isPrefixOf "<?" t = "<?" <> go n (LT.drop 2 t)
+      | isPrefixOf "<!" t = "<!" <> go n (LT.drop 2 t)
+      | isPrefixOf "</" t = "\n" <> (B.fromLazyText $ LT.replicate n "  ")
+                                 <> "</"
+                                 <> go (n - 1) (LT.drop 2 t)
+
+      | isPrefixOf "<"  t = "\n" <> (B.fromLazyText $ LT.replicate (n + 1) "  ")
+                                 <> B.singleton '<'
+                                 <> go (n + 1) (LT.drop 1 t)
+
+      | isPrefixOf "/>" t = "/>" <> go (n - 1) (LT.drop 2 t)
+
+      | not . LT.null $ t = (B.singleton $ LT.head t) <> go n (LT.drop 1 t)
+      | otherwise         = mempty
+                     
 -- $intro
 --
 -- SVG elements and attributes in Lucid-Svg are written with a postfix ‘@_@’. 
