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/nixfromnpm.cabal b/nixfromnpm.cabal
new file mode 100644
--- /dev/null
+++ b/nixfromnpm.cabal
@@ -0,0 +1,70 @@
+-- Initial nixfromnpm.cabal generated by cabal init.  For further
+-- documentation, see http://haskell.org/cabal/users-guide/
+
+name:                nixfromnpm
+version:             0.1.0.0
+synopsis: Generate nix expressions from npm packages.
+-- description:
+license:             MIT
+author:              Allen Nelson
+maintainer:          anelson@narrativescience.com
+-- copyright:
+-- category:
+build-type:          Simple
+-- extra-source-files:
+cabal-version:       >=1.10
+
+executable nixfromnpm
+  main-is:             Main.hs
+  -- other-modules:
+  other-extensions:    NoImplicitPrelude, OverloadedStrings
+  build-depends:       base >=4.8 && <4.9
+                     , classy-prelude
+                     , text
+                     , mtl
+                     , bytestring
+                     , unordered-containers
+                     , parsec
+                     , aeson
+                     , data-default
+                     , shelly
+                     , MissingH
+                     , error-list
+                     , text-render
+                     , system-filepath
+                     , filepath
+                     , network-uri
+                     , directory
+                     , simple-nix
+  hs-source-dirs:      src
+  default-language:    Haskell2010
+
+Test-Suite spec
+  Type:                exitcode-stdio-1.0
+  Default-Language:    Haskell2010
+  Hs-Source-Dirs:      src
+                     , test
+  Main-Is:             Spec.hs
+  Build-Depends:       base >=4.8 && <4.9
+                     , classy-prelude
+                     , mtl
+                     , text
+                     , bytestring
+                     , unordered-containers
+                     , parsec
+                     , io-streams
+                     , http-client-streams
+                     , aeson
+                     , data-default
+                     , shelly
+                     , MissingH
+                     , github
+                     , hspec
+                     , hspec-expectations
+                     , error-list
+                     , text-render
+                     , system-filepath
+                     , filepath
+                     , network-uri
+                     , directory
+                     , simple-nix
diff --git a/src/Main.hs b/src/Main.hs
new file mode 100644
--- /dev/null
+++ b/src/Main.hs
@@ -0,0 +1,16 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+module Main where
+
+----------------------------------------------------------------------------
+import NixFromNpm
+import Data.Text (Text)
+import qualified Data.Text as T
+----------------------------------------------------------------------------
+
+main :: IO ()
+main = getArgs >>= \case
+  pkgName:path:_ -> dumpPkgNamed False pkgName path
+  _ -> error "Incorrect number of arguments"
diff --git a/test/Spec.hs b/test/Spec.hs
new file mode 100644
--- /dev/null
+++ b/test/Spec.hs
@@ -0,0 +1,1 @@
+{-# OPTIONS_GHC -F -pgmF hspec-discover #-}
