diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,27 @@
+Copyright (c) 2012, Doug Beardsley
+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 the Snap Framework authors nor the names of its
+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 HOLDER 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/README.md b/README.md
new file mode 100644
--- /dev/null
+++ b/README.md
@@ -0,0 +1,9 @@
+Readable
+========
+
+The Read type class is very useful for building data types from String
+representations.  But String has high overhead, so sometimes it isn't suitable
+for applications where space usage and performance are important.  This
+library provides a simpler version of Read's functionality for Text and UTF8
+encoded ByteStrings.
+
diff --git a/Setup.hs b/Setup.hs
new file mode 100644
--- /dev/null
+++ b/Setup.hs
@@ -0,0 +1,3 @@
+import Distribution.Simple
+
+main = defaultMain
diff --git a/readable.cabal b/readable.cabal
new file mode 100644
--- /dev/null
+++ b/readable.cabal
@@ -0,0 +1,39 @@
+name:           readable
+version:        0.1
+synopsis:       Reading from Text and ByteString
+
+description:
+  Provides a Readable type class for reading data types from ByteString and
+  Text.
+
+license:        BSD3
+license-file:   LICENSE
+author:         Doug Beardsley
+maintainer:     mightybyte@gmail.com
+build-type:     Simple
+cabal-version:  >= 1.6
+homepage:       https://github.com/mightybyte/readable
+category:       Text
+
+extra-source-files:
+  LICENSE,
+  README.md,
+  Setup.hs
+
+Library
+  hs-source-dirs: src
+
+  exposed-modules:
+    Data.Readable
+
+  build-depends:
+    base        >= 4    && < 5,
+    bytestring  >= 0.9  && < 0.10,
+    text        >= 0.11 && < 0.12
+
+  ghc-prof-options: -prof -auto-all
+  ghc-options: -Wall -fwarn-tabs
+
+source-repository head
+  type:     git
+  location: git://github.com/mightybyte/readable.git
diff --git a/src/Data/Readable.hs b/src/Data/Readable.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Readable.hs
@@ -0,0 +1,75 @@
+{-|
+
+The Read type class is very useful for building data types from String
+representations.  But String has high overhead, so sometimes it isn't suitable
+for applications where space usage and performance are important.  This
+library provides a simpler version of Read's functionality for Text and UTF8
+encoded ByteStrings.
+
+-}
+
+module Data.Readable
+  ( Readable(..)
+  ) where
+
+------------------------------------------------------------------------------
+import           Control.Monad
+import           Data.ByteString.Char8 (ByteString)
+import           Data.Int
+import           Data.Text (Text)
+import qualified Data.Text as T
+import           Data.Text.Encoding
+import           Data.Text.Read
+import           Data.Word
+
+
+------------------------------------------------------------------------------
+-- | ByteString and Text reading using MonadPlus to handle parse failure.  On
+-- error, fromText and fromBS will return mzero.  You can use mplus to provide
+-- fallback defaults.
+class Readable a where
+    -- | Reads data from a Text representation.
+    fromText :: MonadPlus m => Text -> m a
+    -- | Reads data from a UTF8 encoded ByteString.
+    fromBS   :: MonadPlus m => ByteString -> m a
+    fromBS = fromText . decodeUtf8
+
+
+------------------------------------------------------------------------------
+-- | Fails if the input wasn't parsed completely.
+checkComplete :: MonadPlus m => (t, Text) -> m t
+checkComplete (a,rest)
+  | T.null rest = return a
+  | otherwise   = mzero
+
+
+instance Readable ByteString where
+    fromText = return . encodeUtf8
+instance Readable Text where
+    fromText = return
+instance Readable Int where
+    fromText = either (const mzero) checkComplete . signed decimal
+instance Readable Integer where
+    fromText = either (const mzero) checkComplete . signed decimal
+instance Readable Float where
+    fromText = either (const mzero) checkComplete . rational
+instance Readable Double where
+    fromText = either (const mzero) checkComplete . double
+
+instance Readable Int8 where
+    fromText = either (const mzero) checkComplete . signed decimal
+instance Readable Int16 where
+    fromText = either (const mzero) checkComplete . signed decimal
+instance Readable Int32 where
+    fromText = either (const mzero) checkComplete . signed decimal
+instance Readable Int64 where
+    fromText = either (const mzero) checkComplete . signed decimal
+
+instance Readable Word8 where
+    fromText = either (const mzero) checkComplete . decimal
+instance Readable Word16 where
+    fromText = either (const mzero) checkComplete . decimal
+instance Readable Word32 where
+    fromText = either (const mzero) checkComplete . decimal
+instance Readable Word64 where
+    fromText = either (const mzero) checkComplete . decimal
