diff --git a/Setup.hs b/Setup.hs
new file mode 100644
--- /dev/null
+++ b/Setup.hs
@@ -0,0 +1,2 @@
+import Distribution.Simple
+main = defaultMain
diff --git a/Text/Groom.hs b/Text/Groom.hs
new file mode 100644
--- /dev/null
+++ b/Text/Groom.hs
@@ -0,0 +1,12 @@
+module Text.Groom (groom, groomString) where
+
+import Language.Haskell.Exts.Parser
+import Language.Haskell.Exts.Pretty
+
+groomString :: String -> String
+groomString s = case parseExp s of
+    ParseOk x -> prettyPrint x
+    ParseFailed{} -> s
+
+groom :: Show a => a -> String
+groom = groomString . show
diff --git a/groom.cabal b/groom.cabal
new file mode 100644
--- /dev/null
+++ b/groom.cabal
@@ -0,0 +1,37 @@
+Name:               groom
+Version:            0.1
+Synopsis:           Slightly prettier printing for well-behaved Show
+                    instances.
+Description:        Automatically derived Show instances are an easy way
+                    to inspect data in your program.  However, for large
+                    data-structures, the resulting output lacks
+                    whitespace, making it unreadable.  Groom offers an
+                    replacement to `show' called `groom' which attempts
+                    to pretty-print the output of `show'.  For example:
+                    .
+                    > let x = parseExp "foobar 1 [1,2]"
+                    > in do
+                    >   putStrLn (show x)
+                    >   putStrLn (groom x)
+                    .
+                    results in:
+                    .
+                    > ParseOk (App (App (Var (UnQual (Ident "foobar"))) (Lit (Int 1))) (List [Lit (Int 1),Lit (Int 2)]))
+                    > ParseOk
+                    >   (App (App (Var (UnQual (Ident "foobar"))) (Lit (Int 1)))
+                    >      (List [Lit (Int 1), Lit (Int 2)]))
+                    .
+                    Groom works only on Show instances that output valid
+                    Haskell code; if Groom can't understand its input,
+                    it will not make any changes.
+License:            PublicDomain
+Author:             Edward Z. Yang
+Maintainer:         ezyang@mit.edu
+Category:           Text
+Build-type:         Simple
+Cabal-version:      >=1.2
+
+Library
+  Exposed-modules:      Text.Groom
+  Build-depends:        haskell-src-exts >= 1.0.0 && < 1.10,
+                        base >= 3 && < 5
