diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,12 @@
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
diff --git a/Main.hs b/Main.hs
new file mode 100644
--- /dev/null
+++ b/Main.hs
@@ -0,0 +1,72 @@
+import Network.HTTP
+import Network.Stream
+import Rezoom.JSON
+import Rezoom.Builder
+import System.IO
+import System.Environment (getArgs)
+import System.Console.GetOpt
+import Control.Monad (join)
+import Control.Applicative ((<$>))
+import qualified Data.Map as M
+
+version = "0.0.1"
+
+data Flag = Version |
+            Output String |
+            Realname String |
+            Email String |
+            Facebook String |
+            Twitter String |
+            Username String
+            deriving (Show, Eq)
+
+-- Content of the API response
+getAPI :: String -> IO String
+getAPI username = join $ do
+    let url = "http://github.com/api/v2/json/repos/show/" ++ username
+    req <- simpleHTTP $ getRequest url
+    putStrLn "Connected to API..."
+    case req of
+        Left err -> do error "Couldn't ping API. Try again later."
+        x -> do return $ getResponseBody x
+        
+options :: [OptDescr Flag]
+options = [
+            Option ['v'] ["version"] (NoArg Version) "show rezoom's version number and exit",
+            Option ['o'] ["output"] (ReqArg Output "FILE") "where to put the generated resume (default ./resume.html)",
+            Option ['e'] ["email"] (ReqArg Email "ADDR") "your email address (also needed for your gravatar)",
+            Option ['n'] ["name"] (ReqArg Realname "NAME") "your real name",
+            Option ['f'] ["facebook"] (ReqArg Facebook "URL") "your Facebook profile URL",
+            Option ['t'] ["twitter"] (ReqArg Twitter "URL") "your Twitter URL"
+          ]
+          
+saneOpts :: [Flag] -> [(String, String)]
+saneOpts [] = []
+saneOpts (x:xs) = flip (:) (saneOpts xs) $ case x of
+    Version -> ("version", "")
+    Output str -> ("output", str)
+    Realname str -> ("realname", str)
+    Email str -> ("email", str)
+    Facebook str -> ("facebook", str)
+    Twitter str -> ("twitter", str)
+    Username str -> ("username", str)
+    
+
+header :: String
+header = "Usage: rezoom [username] [options...]"
+
+main :: IO ()
+main = do
+    args <- getArgs
+    case getOpt Permute options args of
+        (flags, [], []) -> if Version `elem` flags then do putStrLn ("rezoom " ++ version)
+            else do error $ usageInfo header options
+        (_, [], _) -> error $ "Username required!\n" ++ usageInfo header options
+        (flags, username:_, []) -> do
+            let sane = M.fromList $ saneOpts $ (Username username):flags;
+                filename = M.findWithDefault "resume.html" "output" sane
+            html <- (build sane) <$> parse <$> getAPI username
+            putStrLn "Built resume..."
+            html >>= (\e -> writeFile filename e)
+            putStrLn "All done."
+        (_, _, msgs) -> error $ concat msgs ++ usageInfo header options
diff --git a/README b/README
new file mode 100644
--- /dev/null
+++ b/README
@@ -0,0 +1,1 @@
+rezoom -h
diff --git a/Rezoom/rezoom.css b/Rezoom/rezoom.css
new file mode 100644
--- /dev/null
+++ b/Rezoom/rezoom.css
@@ -0,0 +1,162 @@
+* {
+	margin: 0;
+	padding: 0;
+}
+
+body {
+	background: #404040;
+	font-family: Ubuntu, Aller, Arial, sans-serif;
+	-webkit-font-smoothing: antialiased;
+}
+
+a {
+	color: #4ec3e2;
+	text-decoration: none;
+}
+
+a:hover {
+	text-decoration: underline;
+}
+
+#container {
+	width: 600px;
+	margin: 50px auto;
+	background: #f2f2f2;
+	border-top: 12px solid #2b2b2b;
+}
+
+#container-inner {
+	border-top: 12px solid #4ec3e2;
+	padding: 30px;
+}
+
+#avatar {
+	float: left;
+	border: 4px solid #a1a1a1;
+	background: #d7d7d7;
+	margin-right: 18px;
+}
+
+#avatar img {
+	display: block;
+}
+
+#header {
+	overflow: hidden;
+	padding-bottom: 15px;
+}
+
+#header h2, #header h4 {
+	float: left;
+	width: 358px;
+}
+
+#header h2 {
+	font-weight: normal;
+	color: #5f5f5f;
+	font-size: 32px;
+	letter-spacing: -1px;
+	padding-top: 12px;
+}
+
+h4 {
+	margin-top: 12px;
+	font-size: 15px;
+}
+
+h4 li {
+	float: left;
+	list-style: none;
+	padding-right: 6px;
+	font-weight: normal;
+}
+
+h4 li:before {
+	content: "+";
+	color: #858585;
+}
+
+h4 li a {
+	color: #858585;
+}
+
+#header h2 b {
+	font-weight: normal;
+	color: #c8c8c8;
+	padding: 0 8px;
+}
+
+.section {
+	overflow: hidden;
+	padding-top: 15px;
+	border-top: 1px solid #d7d7d7;
+	margin-top: 15px;
+}
+
+.langs h3 {
+	font-weight: bold !important;
+}
+
+h3.side {
+	padding-top: 5px;
+	float: left;
+	width: 130px;
+	color: #666;
+	font-size: 24px;
+	font-weight: normal;
+	font-style: italic;
+}
+
+.subsection {
+	float: right;
+	width: 398px;
+}
+
+.langs li {
+	float: left;
+	list-style: none;
+	margin-right: 4px;
+	margin-bottom: 4px;
+}
+
+.langs li a {
+	display: block;
+	color: white;
+	background: #4ec3e2;
+	padding: 4px;
+	-webkit-transition: background-color 0.1s linear;
+	-webkit-border-radius: 3px;
+	-moz-border-radius: 3px;
+	border-radius: 3px;
+	white-space: nowrap;
+}
+
+.langs li a:hover {
+	text-decoration: none;
+	background: #404040;
+}
+
+.project {
+	list-style: none;
+	padding-bottom: 17px;
+	border-bottom: 1px solid #ddd;
+	margin-bottom: 13px;
+}
+
+.project:last-child {
+	border-bottom: none;
+	padding-bottom: 0;
+	margin-bottom: 0;
+}
+
+.project .description {
+	padding-top: 7px;
+	font-size: 15px;
+	color: #333;
+}
+
+.pushed {
+	font-weight: normal;
+	font-size: 12px;
+	color: #888;
+}
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/rezoom.cabal b/rezoom.cabal
new file mode 100644
--- /dev/null
+++ b/rezoom.cabal
@@ -0,0 +1,21 @@
+Cabal-Version:	>= 1.6
+Name:			rezoom
+Version:		0.0.1
+Synopsis:		Github resume generator
+Description:	Generates a resume from your github page.
+License:		GPL
+License-File:	LICENSE
+Author:			Joel Taylor
+Maintainer:		Joel Taylor <barebonesgraphics@gmail.com>
+Build-Type: Simple
+Data-Files:		Rezoom/rezoom.css
+Extra-Source-Files:	README
+Category:		Utils
+
+source-repository head
+    type: git
+    location: git://github.com/incluye/rezoom.git
+
+Executable rezoom
+    Main-is: Main.hs
+    Build-Depends: base == 4.*, json == 0.5.*, xhtml == 3000.*, HTTP == 4000.*, nano-md5 == 0.1.*, bytestring == 0.9.*, datetime == 0.2.*, containers == 0.4.*
