diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,9 @@
+# Changelog
+
+`simple-cmd-args` uses [PVP Versioning][1].
+
+0.1.0
+=====
+* Initial release with subcommands and option Mod functions
+
+[1]: https://pvp.haskell.org
diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2019 Jens Petersen
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/README.md b/README.md
new file mode 100644
--- /dev/null
+++ b/README.md
@@ -0,0 +1,29 @@
+# simple-cmd-args
+
+[![Hackage](https://img.shields.io/hackage/v/simple-cmd-args.svg)](https://hackage.haskell.org/package/simple-cmd-args)
+[![BSD license](https://img.shields.io/badge/license-BSD-blue.svg)](LICENSE)
+[![Stackage Lts](http://stackage.org/package/simple-cmd-args/badge/lts)](http://stackage.org/lts/package/simple-cmd-args)
+[![Stackage Nightly](http://stackage.org/package/simple-cmd-args/badge/nightly)](http://stackage.org/nightly/package/simple-cmd-args)
+[![Build status](https://secure.travis-ci.org/juhp/simple-cmd-args.svg)](https://travis-ci.org/juhp/simple-cmd-args)
+
+A thin layer over optparse-applicative that avoids type plumbing for
+the common use case of a commandline tool with subcommands,
+by using `Parser (IO ())`
+
+## Usage
+
+```haskell
+import SimpleCmdArgs
+import Control.Applicative (some)
+import SimpleCmd (cmd_)
+
+main =
+  simpleCmdArgs Nothing "my example tool" "Longer description..." $
+  subcommands
+    [ Subcommand "echo" (putStrLn <$> strArg "NAME") "Print name"
+    , Subcommand "ls" (cmd_ "ls" <$> some (strArg "FILE...")) "Touch FILE"
+    ]
+```
+
+See more [https://github.com/juhp/simple-cmd-args/tree/master/examples](examples/).
+
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/SimpleCmdArgs.hs b/SimpleCmdArgs.hs
new file mode 100644
--- /dev/null
+++ b/SimpleCmdArgs.hs
@@ -0,0 +1,96 @@
+module SimpleCmdArgs
+  (optionMods,
+   optionalMods,
+   simpleCmdArgs,
+   simpleCmdArgs',
+   strArg,
+   Subcommand(..),
+   subcommands,
+   switchMods
+  )
+where
+
+import Control.Monad (join)
+#if (defined(MIN_VERSION_base) && MIN_VERSION_base(4,8,0))
+#else
+import Data.Monoid (mconcat)
+#endif
+import Data.Semigroup ((<>))
+import Data.Version
+import Options.Applicative
+
+-- | Parser executor (allows interspersed args and options)
+simpleCmdArgs ::
+  Maybe Version
+  -- ^ version string
+  -> String
+  -- ^ header
+  -> String
+  -- ^ program description
+  -> Parser (IO ())
+  -- ^ commands
+  -> IO ()
+simpleCmdArgs mversion h pd =
+  simpleCmdArgsWithMods mods mversion
+  where
+    mods = fullDesc <> header h <> progDesc pd
+
+-- | Parser executor without interspersing options and args
+simpleCmdArgs'
+  :: Maybe Version
+  -- ^ version string
+  -> String
+  -- ^ header
+  -> String
+  -- ^ program description
+  -> Parser (IO ())
+  -- ^ commands
+  -> IO ()
+simpleCmdArgs' mversion h pd =
+  simpleCmdArgsWithMods mods mversion
+  where
+    mods = fullDesc <> header h <> progDesc pd <> noIntersperse
+
+-- | Generic parser executor with explicit info modifiers
+simpleCmdArgsWithMods ::
+  InfoMod (IO ()) ->
+  -- ^ modifiers
+  Maybe Version
+  -- ^ version string
+  -> Parser (IO ())
+  -- ^ commands
+  -> IO ()
+simpleCmdArgsWithMods mods mversion cmdsParser = join $
+  customExecParser (prefs showHelpOnEmpty)
+  (case mversion of
+    (Just version) -> info (helper <*> versionOption version <*> cmdsParser) mods
+    Nothing -> info (helper <*> cmdsParser) mods)
+  where 
+    versionOption ver =
+      infoOption (showVersion ver) (long "version" <> help "Show version")
+
+data Subcommand = Subcommand String String (Parser (IO ()))
+
+subcommands :: [Subcommand] -> Parser (IO ())
+subcommands = subparser . mconcat . map cmdToParse
+  where
+    cmdToParse (Subcommand name cmddesc cmdparse) =
+      command name (info cmdparse (progDesc cmddesc))
+
+strArg :: String -> Parser String
+strArg var = strArgument (metavar var)
+
+switchMods :: HasName f =>
+  Char -> String -> String -> Mod f a
+switchMods s l h =
+  short s <> long l <> help h
+
+optionMods :: (HasMetavar f, HasName f) =>
+  Char -> String -> String -> String -> Mod f a
+optionMods s l meta h =
+  short s <> long l <> metavar meta <> help h
+
+optionalMods :: (HasMetavar f, HasName f, HasValue f) =>
+  Char -> String -> String -> String -> a -> Mod f a
+optionalMods s l meta h d =
+  short s <> long l <> metavar meta <> help h <> value d
diff --git a/simple-cmd-args.cabal b/simple-cmd-args.cabal
new file mode 100644
--- /dev/null
+++ b/simple-cmd-args.cabal
@@ -0,0 +1,39 @@
+cabal-version:       1.18
+name:                simple-cmd-args
+version:             0.1.0
+synopsis:            Simple command args parsing and execution
+description:
+            This a small wrapper over optparse-applicative which
+            allows combining args parsers directly with IO commands,
+            avoiding command types boilerplate. It also provides
+            a few option Mod functions.
+homepage:            https://github.com/juhp/simple-cmd-args
+bug-reports:         https://github.com/juhp/simple-cmd-args/issues
+license:             BSD3
+license-file:        LICENSE
+author:              Jens Petersen
+maintainer:          juhpetersen@gmail.com
+copyright:           2019 Jens Petersen
+category:            System
+build-type:          Simple
+extra-doc-files:     README.md
+                   , CHANGELOG.md
+tested-with:         GHC == 7.10.3, GHC == 8.0.2, GHC == 8.2.2,
+                     GHC == 8.4.4, GHC == 8.6.3
+
+source-repository head
+  type:                git
+  location:            https://github.com/juhp/simple-cmd-args.git
+
+library
+  exposed-modules:     SimpleCmdArgs
+
+  build-depends:       base >= 4 && < 5
+                     , optparse-applicative
+  if impl(ghc<8.0)
+      build-depends: semigroups
+
+  ghc-options:         -Wall -fwarn-missing-signatures
+
+  default-language:    Haskell2010
+  default-extensions:  CPP
