diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,30 @@
+Copyright Justin Sermeno (c) 2016
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+
+    * Neither the name of Author name here nor the names of other
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
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/example/Basic.hs b/example/Basic.hs
new file mode 100644
--- /dev/null
+++ b/example/Basic.hs
@@ -0,0 +1,31 @@
+module Main where
+
+import Numeric
+
+import Text.Display
+import Text.PrettyPrint.ANSI.Leijen as PP
+
+data MyRecord = MyRecord
+  { numerators :: [Double]
+  , denominator :: Double
+  } deriving (Show)
+
+record :: MyRecord
+record = MyRecord
+  { numerators = [0, 5..100]
+  , denominator = 1326
+  }
+
+instance {-# OVERLAPPING #-} Display MyRecord where
+  display a = mkDisplayTextStr
+      $ show
+      $ toCol "MyRecord (percentage): " <> toCol (displayPerc a)
+    where
+      displayPerc a = showFFloat (Just 2) (toPerc a) "%"
+      toPerc a = sum (numerators a) / denominator a * 100
+      toCol a = (PP.dullgreen . PP.fill 25 . PP.text) a
+
+main :: IO ()
+main = do
+  dPrint record
+  pPrint record
diff --git a/pretty-display.cabal b/pretty-display.cabal
new file mode 100644
--- /dev/null
+++ b/pretty-display.cabal
@@ -0,0 +1,45 @@
+name:                pretty-display
+version:             0.1.0
+synopsis:            Initial project template from stack
+description:         Please see README.md
+homepage:            https://github.com/githubuser/pretty-display#readme
+license:             BSD3
+license-file:        LICENSE
+author:              Author name here
+maintainer:          example@example.com
+copyright:           2016 Author name here
+category:            Web
+build-type:          Simple
+-- extra-source-files:
+cabal-version:       >=1.10
+
+library
+  hs-source-dirs:      src
+  exposed-modules:     Text.Display
+  build-depends:       base >= 4.7 && < 5
+                     , text
+                     , pretty-show
+  default-language:    Haskell2010
+
+executable pretty-display-example
+  hs-source-dirs:      example
+  main-is:             Basic.hs
+  ghc-options:         -threaded -rtsopts -with-rtsopts=-N
+  build-depends:       base
+                     , pretty-display
+                     , pretty-show
+                     , ansi-wl-pprint
+  default-language:    Haskell2010
+
+test-suite pretty-display-test
+  type:                exitcode-stdio-1.0
+  hs-source-dirs:      test
+  main-is:             Spec.hs
+  build-depends:       base
+                     , pretty-display
+  ghc-options:         -threaded -rtsopts -with-rtsopts=-N
+  default-language:    Haskell2010
+
+source-repository head
+  type:     git
+  location: https://github.com/githubuser/pretty-display
diff --git a/src/Text/Display.hs b/src/Text/Display.hs
new file mode 100644
--- /dev/null
+++ b/src/Text/Display.hs
@@ -0,0 +1,79 @@
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE UndecidableInstances #-}
+module Text.Display
+  ( mkDisplayText
+  , unDisplayText
+  , mkDt
+  , unDt
+  , mkDisplayTextStr
+  , unDisplayTextStr
+  , mkDtStr
+  , unDtStr
+  , dPrint
+
+  -- * Re-exports
+  , ppShow
+  , pPrint
+
+  -- * Types
+  , Display(..)
+  , DisplayText
+  )
+  where
+
+import Data.Text (Text)
+import qualified Data.Text as Text
+import qualified Data.Text.IO as TextIO
+
+import Text.Show.Pretty as Pretty
+
+newtype DisplayText = DisplayText { _fromDisplayText :: Text } deriving (Eq)
+
+instance Show DisplayText where
+  show displayText = Text.unpack (unDisplayText displayText)
+
+class Display a where
+  display :: a -> DisplayText
+
+instance {-# Overlappable #-} (Show a) => Display a where
+  display a = (DisplayText . Text.pack . Pretty.ppShow) a
+
+-- | Wrap 'Text' into a 'DisplayText'.
+mkDisplayText :: Text -> DisplayText
+mkDisplayText a = DisplayText a
+
+-- | Alias for 'mkDt'
+mkDt :: Text -> DisplayText
+mkDt = mkDisplayText
+
+-- | Unwrap 'DisplayText' to a 'Text'.
+unDisplayText :: DisplayText -> Text
+unDisplayText a = _fromDisplayText a
+
+-- | Alias for 'unDisplayText'
+unDt :: DisplayText -> Text
+unDt = unDisplayText
+
+-- | Wrap 'String' into a 'DisplayText'.
+mkDisplayTextStr :: String -> DisplayText
+mkDisplayTextStr a = mkDisplayText (Text.pack a)
+
+-- | Alias for 'mkDisplayTextStr'
+mkDtStr :: String -> DisplayText
+mkDtStr = mkDisplayTextStr
+
+-- | Unwrap 'DisplayText' to a 'String'.
+unDisplayTextStr :: DisplayText -> String
+unDisplayTextStr a = Text.unpack (unDisplayText a)
+
+-- | Alias for 'unDisplayTextStr'
+unDtStr :: DisplayText -> String
+unDtStr = unDisplayTextStr
+
+-- | Convert 'Display' instance into 'Text'.
+dShow :: Display a => a -> Text
+dShow a = unDisplayText (display a)
+
+-- | Print 'Display' instance.
+dPrint :: Display a => a -> IO ()
+dPrint a = TextIO.putStrLn (dShow a)
diff --git a/test/Spec.hs b/test/Spec.hs
new file mode 100644
--- /dev/null
+++ b/test/Spec.hs
@@ -0,0 +1,2 @@
+main :: IO ()
+main = putStrLn "Test suite not yet implemented"
