diff --git a/cabal2nix.cabal b/cabal2nix.cabal
--- a/cabal2nix.cabal
+++ b/cabal2nix.cabal
@@ -1,5 +1,5 @@
 Name:                   cabal2nix
-Version:                1.2
+Version:                1.3
 Copyright:              (c) 2011 Peter Simons
 License:                BSD3
 License-File:           LICENSE
@@ -10,18 +10,25 @@
 Synopsis:               Convert Cabal files into Nix build instructions
 Cabal-Version:          >= 1.6
 Build-Type:             Simple
-Tested-With:            GHC == 7.0.2
+Tested-With:            GHC == 7.0.4
 Description:            This utility converts Cabal files into Nix build
-			instructions. Run the binary as follows:
+			instructions. The commandline syntax is:
 			.
-			> cabal2nix foo.cabal 57ae0330a3d0520bae3d1e447d7d5c88de9ecbf0de133f31f2cc42961c81d47f
+			> cabal2nix cabal-file-uri [sha256-hash]
 			.
-			The first argument is the path to the cabal file
-			to be converted, the second argument is the
-			SHA256 hash of the corresponding source tarball.
+			The first argument is the path to the cabal
+			file. That path can be an HTTP URL or local file
+			path. For example:
 			.
-			The Nix build instructions will be written to
-			stdout.
+			> cabal2nix.hs http://hackage.haskell.org/packages/archive/cabal2nix/1.2/cabal2nix.cabal 0m7zgsd1pxmw504xpvl7dg25ana6dkk1mcyjj4c1wdbkvhvbn3gn
+			> cabal2nix.hs file:///tmp/cabal2nix.cabal 0m7zgsd1pxmw504xpvl7dg25ana6dkk1mcyjj4c1wdbkvhvbn3gn
+			> cabal2nix.hs /tmp/cabal2nix.cabal 0m7zgsd1pxmw504xpvl7dg25ana6dkk1mcyjj4c1wdbkvhvbn3gn
+			.
+			The second argument -- the hash of the source
+			tarball -- is optional. If it's not specified,
+			cabal2nix calls @nix-prefetch-url@ to determine
+			the hash automatically. This causes network
+			traffic, obviously.
 
 Source-Repository head
   Type:                 git
@@ -29,5 +36,5 @@
 
 Executable cabal2nix
   main-is:              cabal2nix.hs
-  Build-Depends:        base >= 3 && < 5, Cabal
+  Build-Depends:        base >= 3 && < 5, Cabal, process, HTTP
   Ghc-Options:          -Wall
diff --git a/cabal2nix.hs b/cabal2nix.hs
--- a/cabal2nix.hs
+++ b/cabal2nix.hs
@@ -10,7 +10,6 @@
 import Control.Exception
 import System.Exit
 import Distribution.PackageDescription.Parse
-import Distribution.Verbosity ( silent )
 import Distribution.PackageDescription
 import Distribution.Package
 import Distribution.License
@@ -18,6 +17,8 @@
 import Data.List
 import Control.Monad
 import Data.Char
+import Network.HTTP
+import System.Process
 
 type PkgName = String
 type PkgVersion = [Int]
@@ -77,38 +78,67 @@
       showLic OtherLicense                      = "unknown"
       showLic l                                 = error $ "unknown license: " ++ show l
 
-readPackage :: FilePath -> String -> IO Pkg
-readPackage cabalFile sha256 = do
-  cabal <- readPackageDescription silent cabalFile
-  let pkg = packageDescription cabal
-      PackageName pkgname = pkgName (package pkg)
-      pkgver = versionBranch (pkgVersion (package pkg))
-      lic = license pkg
-      url = homepage pkg
-      desc = synopsis pkg
-      -- globalDeps = buildDepends pkg
-      libDeps = maybe [] (\x -> [x]) (condLibrary cabal)
-      exeDeps = [ tree | (_,tree) <- condExecutables cabal ]
-      libs = concat [ extraLibs (libBuildInfo (condTreeData x)) | x <- libDeps ]
-      libs' = concat [ extraLibs (buildInfo (condTreeData x)) | x <- exeDeps ]
-  return (Pkg pkgname pkgver sha256 url desc lic (map simplify libDeps ++ map simplify exeDeps) (libs++libs'))
-    where
+cabal2nix :: GenericPackageDescription -> PkgSHA256 -> Pkg
+cabal2nix cabal sha256 = Pkg pkgname pkgver sha256 url desc lic (map simplify libDeps ++ map simplify exeDeps) (libs++libs')
+  where
+    pkg = packageDescription cabal
+    PackageName pkgname = pkgName (package pkg)
+    pkgver = versionBranch (pkgVersion (package pkg))
+    lic = license pkg
+    url = homepage pkg
+    desc = synopsis pkg
+    -- globalDeps = buildDepends pkg
+    libDeps = maybe [] (\x -> [x]) (condLibrary cabal)
+    exeDeps = [ tree | (_,tree) <- condExecutables cabal ]
+    libs = concat [ extraLibs (libBuildInfo (condTreeData x)) | x <- libDeps ]
+    libs' = concat [ extraLibs (buildInfo (condTreeData x)) | x <- exeDeps ]
 
 simplify :: CondTree ConfVar [Dependency] a -> CondTree ConfVar [Dependency] ()
 simplify (CondNode _ deps nodes) = CondNode () deps (map simp nodes)
   where
     simp (cond,tree,mtree) = (cond, simplify tree, maybe Nothing (Just . simplify) mtree)
 
+readCabalFile :: FilePath -> IO String
+readCabalFile path
+  | "http://" `isPrefixOf` path = Network.HTTP.simpleHTTP (getRequest path) >>= getResponseBody
+  | "file://" `isPrefixOf` path = readCabalFile (drop 7 path)
+  | otherwise                   = readFile path
+
+hashPackage :: GenericPackageDescription -> IO String
+hashPackage pkg = readProcess "bash" ["-c", "exec nix-prefetch-url 2>/dev/tty " ++ url] ""
+  where
+    url = "http://hackage.haskell.org/packages/archive/" ++ name ++ "/" ++ version ++ "/" ++ name ++ "-" ++ version ++ ".tar.gz"
+    PackageIdentifier (PackageName name) version' = package (packageDescription pkg)
+    version = showVersion version'
+
 main :: IO ()
 main = bracket (return ()) (\() -> hFlush stdout >> hFlush stderr) $ \() -> do
   args <- getArgs
 
-  when (length args /= 2) $ do
+  let usage = "Usage: cabal2nix url-to-cabal-file [sha256-hash]"
+
+  when (length args < 1 || length args > 2) $ do
     mapM_ (hPutStrLn stderr) [ "*** invalid command line syntax"
-                             , "Usage: cabal2nix cabal-file sha256-hash"
+                             , usage
                              ]
     exitFailure
 
-  let cabalFile:sha256:[] = args
-  pkg <- readPackage cabalFile sha256
+  when ("--help" `elem` args || "-h" `elem` args) $ do
+    putStrLn usage
+    exitFailure
+
+  cabal' <- fmap parsePackageDescription (readCabalFile (head args))
+  cabal <- case cabal' of
+             ParseOk _ a -> return a
+             ParseFailed err -> do
+               hPutStrLn stderr ("*** cannot parse cabal file: " ++ show err)
+               exitFailure
+
+  sha256 <- case args of
+              _:hash:[] -> return hash
+              _         -> hashPackage cabal
+
+  let pkg = cabal2nix cabal sha256
   putStr (toNix pkg)
+
+
