diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,26 @@
+Dan Colish <dcolish@gmail.com>
+Copyright (c) 2010
+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 <organization> 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 Daniel Colish ''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 Daniel Colish 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/imgurder.cabal b/imgurder.cabal
new file mode 100644
--- /dev/null
+++ b/imgurder.cabal
@@ -0,0 +1,18 @@
+Name:                imgurder
+Version:             1.0
+License:             BSD3
+License-file:        LICENSE
+Author:              Dan Colish
+Maintainer:          dcolish@gmail.com
+Build-Type:          Simple
+Cabal-Version:       >=1.2
+Synopsis:            Uploader for Imgur
+Category:            Web
+Description:         A simple uploader for the Imgur api. You should register
+                     for an api key
+
+Executable imgurder
+  Main-is:           imgurder.hs
+  Build-Depends:     base >= 3 && < 5, hxt-xpath >= 8.5.4, hxt >= 8.3.2,
+                     curl >= 1.3.5, directory >= 1.0.0.3, haskell98 >= 1
+
diff --git a/imgurder.hs b/imgurder.hs
new file mode 100644
--- /dev/null
+++ b/imgurder.hs
@@ -0,0 +1,87 @@
+--
+--  Imgur Uploader
+--  Dan Colish <dcolish@gmail.com>
+--  Copyright (c) 2010
+--  All rights reserved
+--
+--  Usage: runghc imgur.hs <filepath>
+--  Be sure to add an api key before using it and put it in ~/imgurder
+--  A sample configuration file would be:
+--  `echo '<your api key>' > ~/.imgurder`
+--
+
+import Data.IORef
+import Data.List
+import Data.Maybe
+import Data.Tree.Class
+import Network.Curl
+import System (getArgs)
+import System.Directory
+import System.IO
+import Text.XML.HXT.DOM.TypeDefs
+import qualified Text.XML.HXT.DOM.XmlNode as N
+import qualified Text.XML.HXT.Parser.XmlParsec as H
+import qualified Text.XML.HXT.XPath.XPathEval as X
+
+
+myCurlPost :: String -> String -> [HttpPost]
+myCurlPost apikey myImage =
+    [ HttpPost { postName = "image"
+               , contentType = Nothing , content = ContentFile myImage
+               , extraHeaders = []
+               , showName = Nothing },
+      HttpPost { postName = "key"
+               , contentType = Nothing
+               , content = ContentString apikey
+               , extraHeaders = []
+               , showName = Nothing }]
+
+
+pathTags :: [String]
+pathTags = [ "/rsp/image_hash"
+           ,"/rsp/delete_hash"
+           ,"/rsp/original_image"
+           ,"/rsp/large_thumbnail"
+           ,"/rsp/small_thumbnail"
+           ,"/rsp/imgur_page"
+           ,"/rsp/delete_page" ]
+
+
+xpathQN:: String -> XmlTree -> String
+xpathQN str = fromJust . N.getQualifiedName . getNode . head . X.getXPath str
+
+
+xpathTxt:: String -> XmlTree -> String
+xpathTxt str = fromJust . N.getText . head . getChildren . head . X.getXPath str
+
+
+keyVal :: XmlTree -> String -> String
+keyVal res str = unwords [(xpathQN str res), " = ", (xpathTxt str res)]
+
+
+formattedResult :: XmlTree -> [String]
+formattedResult res = map (keyVal res) pathTags
+
+
+loadConf :: IO String
+loadConf = do
+    h <- getHomeDirectory
+    key <- readFile (h ++ "/.imgurder")
+    return key
+
+
+main ::  IO ()
+main = withCurlDo $ do
+    [file] <- getArgs
+    key <- loadConf
+    initialize
+    ref <- newIORef []
+    curlMultiPost "http://imgur.com/api/upload.xml"
+            [CurlWriteFunction (gatherOutput ref), CurlVerbose False]
+            $ myCurlPost key file
+    response <- fmap reverse $ readIORef ref
+    putStrLn "== Imgur Upload Complete ==\n"
+    putStrLn . unlines . formattedResult . result $ response
+    where
+        result = head . H.xread . concatMap (unwords.tail.lines)
+
