diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,30 @@
+Copyright Bernard Pope 2012, 2013
+
+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 Bernard Pope 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.lhs b/Setup.lhs
new file mode 100644
--- /dev/null
+++ b/Setup.lhs
@@ -0,0 +1,3 @@
+#!/usr/bin/env runhaskell
+> import Distribution.Simple
+> main = defaultMain
diff --git a/readpyc.cabal b/readpyc.cabal
new file mode 100644
--- /dev/null
+++ b/readpyc.cabal
@@ -0,0 +1,27 @@
+Name:                readpyc
+Version:             0.1.0
+Synopsis:            Read and pretty print Python bytecode (.pyc) files.
+Homepage:            https://github.com/bjpop/blip 
+License:             BSD3
+License-file:        LICENSE
+Author:              Bernie Pope
+Maintainer:          Bernie Pope <florbitous@gmail.com>
+Stability:           Experimental
+category:            Language 
+Build-type:          Simple
+Cabal-version:       >=1.8
+Description:         Read and pretty print Python bytecode (.pyc) files.
+
+source-repository head
+  type: git
+  location: git://github.com/bjpop/blip.git
+
+Executable readpyc {
+   ghc-options: -Wall -fno-warn-name-shadowing -fno-warn-orphans
+   main-is: Main.hs
+   hs-source-dirs: src
+   build-depends:
+      base==4.*,
+      bliplib==0.1.*,
+      parseargs==0.1.*
+}
diff --git a/src/Main.hs b/src/Main.hs
new file mode 100644
--- /dev/null
+++ b/src/Main.hs
@@ -0,0 +1,81 @@
+-----------------------------------------------------------------------------
+-- |
+-- Module      : Main 
+-- Copyright   : (c) 2012, 2013 Bernie Pope
+-- License     : BSD-style
+-- Maintainer  : florbitous@gmail.com
+-- Stability   : experimental
+-- Portability : ghc
+--
+-- A program to read and pretty print a Python bytecode file (.pyc file).
+--
+-----------------------------------------------------------------------------
+
+module Main where
+
+import System.Exit (ExitCode (..), exitWith)
+import System.IO (openFile, IOMode(..), hClose)
+import Control.Monad (when)
+import System.Console.ParseArgs
+   (Argtype (..), argDataOptional, Arg (..)
+   , gotArg, getArg, parseArgsIO, ArgsComplete (..), Args(..))
+import Blip.Version (versionString)
+import Blip.Marshal (readPyc)
+import Blip.Pretty (prettyString)
+
+data ArgIndex
+   = Help
+   | InputFile
+   | Version
+   deriving (Eq, Ord, Show)
+
+help :: Arg ArgIndex
+help =
+   Arg
+   { argIndex = Help
+   , argAbbr = Just 'h'
+   , argName = Just "help"
+   , argData = Nothing
+   , argDesc = "Display a help message."
+   }
+
+inputFile :: Arg ArgIndex
+inputFile =
+   Arg
+   { argIndex = InputFile
+   , argAbbr = Nothing
+   , argName = Nothing
+   , argData = argDataOptional "input file" ArgtypeString
+   , argDesc = "Name of the input Python file."
+   }
+
+version :: Arg ArgIndex
+version =
+   Arg
+   { argIndex = Version
+   , argAbbr = Nothing
+   , argName = Just "version"
+   , argData = Nothing
+   , argDesc = "Show the version number of readpyc."
+   }
+
+getInputFile :: Args ArgIndex -> Maybe FilePath
+getInputFile argMap = getArg argMap InputFile 
+
+main :: IO ()
+main = do
+   let args = [version, help, inputFile]
+   argMap <- parseArgsIO ArgsComplete args
+   when (gotArg argMap Help) $ do
+      putStrLn $ argsUsage argMap
+      exitWith ExitSuccess
+   when (gotArg argMap Version) $ do
+      putStrLn $ "readpyc version " ++ versionString
+      exitWith ExitSuccess
+   case getInputFile argMap of
+      Nothing -> return ()
+      Just inFile -> do
+         handle <- openFile inFile ReadMode
+         pycFile <- readPyc handle
+         putStrLn $ prettyString pycFile
+         hClose handle
