diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,10 @@
 # Changelog
 
+## v0.1.1.0
+
+Added shell-style parsing of the command to make it easier to pass arguments and
+environment variables.
+
 ## v0.1.0.0
 
 Initial version.
-
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -7,24 +7,70 @@
 
 ## Installation
 
+There is a number of ways to install. Choose one and follow the given steps.
+
+The following installation options provide a complete package which already
+include a D-Bus service configuration file, so require no extra steps after
+installing:
+
+- Install from the Arch User Repository (AUR):
+  [`dbus-app-launcher`](https://aur.archlinux.org/packages/dbus-app-launcher)
+
+The following installation options only provide you with the executable and
+leave it up to you to set up the D-Bus service configuration file, for which
+you will need to follow the steps in the section below:
+
+- Download a static binary from the
+  [releases page](https://github.com/DvdGiessen/dbus-app-launcher/releases).
+- Install from Hackage:
+  [`dbus-app-launcher`](https://hackage.haskell.org/package/dbus-app-launcher)
+
+If none of the above options work for you, you can also follow the instructions
+below to build the executable from source yourself.
+
+### Building from source
+
 To build the code, you will need Haskell and the `stack` command line utility.
-Get it [here](https://docs.haskellstack.org/en/stable/).
+Get them [here](https://docs.haskellstack.org/en/stable/).
 
 To build and install, run `stack install`. This will build the code and copy the
 executable to `~/.local/bin`.
 
-Next, set up a D-Bus service description that will automatically launch the new
-service whenever it is accessed:
+Next, follow the steps to set up the D-Bus service.
 
-`/usr/share/dbus-1/services/nl.dvdgiessen.dbusapplauncher.service`
+### Build a static executable using Docker
 
+To build a static executable (the same as made available on the releases page),
+you can use the following Docker command:
+
+```sh
+docker run -v $PWD:/dbus-app-launcher --rm benz0li/ghc-musl:9.8.4 sh -c "cd /dbus-app-launcher && exec stack --allow-different-user build --no-install-ghc --system-ghc --ghc-options='-static -optl-static'"
+```
+
+This will start a [`ghc-musl`](https://github.com/benz0li/ghc-musl) container,
+mount the current directory (where you've checked out the code) into it, and
+build a statically linked version of the service which should be able to run on
+any system with the same CPU architecture.
+
+When the build succeeded, the executable can be found at the following path:
+`.stack-work/dist/x86_64-linux/ghc-9.8.4/build/dbus-app-launcher/dbus-app-launcher`
+
+### Setting up the D-Bus service configuration
+
+To set up a D-Bus service description that will automatically launch the new
+service whenever it is accessed, create the following file:
+
+`~/.local/share/dbus-1/services/nl.dvdgiessen.dbusapplauncher.service`
+
 ```ini
 [D-BUS Service]
 Name=nl.dvdgiessen.dbusapplauncher
 Exec=/home/USERNAME/.local/bin/dbus-app-launcher
 ```
 
-## Using the service
+Replace the path in `Exec=` with the actual location of the executable.
+
+## Using the D-Bus service from your own code
 
 The service currently exports one interface, `Exec`. Calling any of the methods
 of this interface will start the program using the `exec()` syscall.
diff --git a/app/Main.hs b/app/Main.hs
--- a/app/Main.hs
+++ b/app/Main.hs
@@ -6,11 +6,32 @@
 import           Control.Concurrent.Chan
 import           Control.Exception.Extra (ignore)
 import           Control.Monad
-import           Data.Map
+import           Data.Either
+import           Data.List (uncons)
+import           Data.Map.Strict (fromList, toList)
+import           Data.Maybe (fromMaybe)
 import           DBus.Client
+import           ShellWords (parse)
+import           System.Environment (getEnvironment)
 import           System.Exit
 import           System.Posix.Process
+import           Text.Regex.TDFA
 
+splitEnv :: [String] -> ([String], [String])
+splitEnv = span (\ s -> ((s =~ ("[a-zA-Z_][a-zA-Z0-9_]*=" :: String)) :: Bool))
+
+parseEnv :: [String] -> [(String, String)]
+parseEnv = map ((\ (k, _, v) -> (k, v)) . (\ d -> ((d =~ ("=" :: String)) :: (String, String, String))) )
+
+uniqEnv :: [[(String, String)]] -> [(String, String)]
+uniqEnv envs = toList (fromList (concat envs))
+
+parseCmd :: String -> [String] -> [(String, String)] -> (String, [String], [(String, String)])
+parseCmd cmd args env = (\ (a, b)
+   -> uncurry
+        (,,) (fromMaybe (cmd, args) (uncons (b ++ args)))
+        (uniqEnv [parseEnv a, env])) (splitEnv (fromRight [] (parse cmd)))
+
 main :: IO ()
 main = do
     -- Connect to D-Bus
@@ -18,14 +39,14 @@
 
     -- Channel for transfering exec parameters from the callback thread
     channel <- newChan
-    
+
     -- Export object used for launching programs
     export client "/nl/dvdgiessen/DBusAppLauncher" defaultInterface
              { interfaceName = "nl.dvdgiessen.dbusapplauncher.Exec"
              , interfaceMethods =
-               [ autoMethod "Cmd" (\ cmd -> (writeChan channel (cmd, [], Nothing)))
-               , autoMethod "CmdArgs" (\ cmd args -> (writeChan channel (cmd, args, Nothing)))
-               , autoMethod "CmdArgsEnv" (\ cmd args env -> (writeChan channel (cmd, args, Just (toList env))))
+               [ autoMethod "Cmd" (\ cmd -> writeChan channel (parseCmd cmd [] []))
+               , autoMethod "CmdArgs" (\ cmd args -> writeChan channel (parseCmd cmd args []))
+               , autoMethod "CmdArgsEnv" (\ cmd args env -> writeChan channel (parseCmd cmd args (toList env)))
                ]
              }
 
@@ -50,9 +71,11 @@
     -- Make sure we are in our own process group and session
     ignore (do _ <- createSession; return ())
 
+    -- Environment that spawned processes will inherit
+    globalEnv <- getEnvironment
+
     -- Exec with the requested parameters
-    _ <- executeFile cmd True args env
+    _ <- executeFile cmd True args (Just (uniqEnv [globalEnv, env]))
 
     -- Never reached
     return ()
-
diff --git a/dbus-app-launcher.cabal b/dbus-app-launcher.cabal
--- a/dbus-app-launcher.cabal
+++ b/dbus-app-launcher.cabal
@@ -1,6 +1,6 @@
 cabal-version:      1.12
 name:               dbus-app-launcher
-version:            0.1.0.0
+version:            0.1.1.0
 license:            MIT
 license-file:       LICENSE
 copyright:          2024 Daniël van de Giessen
@@ -34,8 +34,10 @@
         -threaded -rtsopts -with-rtsopts=-N
 
     build-depends:
-        base >=4.7 && <5,
+        base >=4.12 && <5,
         containers >=0.6 && <0.7,
         dbus >=1.3 && <1.4,
         extra >=1.7 && <1.8,
+        regex-tdfa >=1.3 && <1.4,
+        shellwords >=0.1.3.2 && <0.2,
         unix >=2.8 && <2.9
