diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,10 +1,18 @@
 # Changelog
 
+## 0.3.0 - 2022-11-26:
+
+* feat: Improved help text.
+* feat: Allow passing '--impure' flag to Nix (issue: [#40][]) 
+* fix: Use -O1 instead of -O2 to save on compile times.
+
+[#40]: https://github.com/utdemir/nix-tree/issues/40
+
 ## 0.2.1 - 2022-10-24:
 
-* fix: Fix excessive memory use when using why-depends on large dependency graphs (issue: [@31][])
+* fix: Fix excessive memory use when using why-depends on large dependency graphs (issue: [#31][])
 
-[#25]: https://github.com/utdemir/nix-tree/issues/31
+[#31]: https://github.com/utdemir/nix-tree/issues/31
 
 ## 0.2.0 - 2022-01-02:
 
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -31,8 +31,17 @@
 
 ```
 $ nix-tree --help
-Usage: nix-tree [paths...] [-h|--help] [--version]
-  Paths default to $HOME/.nix-profile and /var/run/current-system.
+Usage: nix-tree [--version] [--derivation] [INSTALLABLE]
+  Interactively browse dependency graphs of Nix derivations.
+
+Available options:
+  --version                Show the nix-tree version.
+  --derivation             Operate on the store derivation rather than its
+                           outputs.
+  INSTALLABLE              A store path or a flake reference. Paths default to
+                           "~/.nix-profile" and "/var/run/current-system".
+  -h,--help                Show this help text
+
 Keybindings:
   hjkl/Arrow Keys : Navigate
   w               : Open why-depends mode
@@ -40,7 +49,7 @@
   s               : Change sort order
   y               : Yank selected path to clipboard
   ?               : Show help
-  q/Esc:          : Quit / close modal
+  q/Esc           : Quit / close modal
 ```
 
 ### Glossary
diff --git a/nix-tree.cabal b/nix-tree.cabal
--- a/nix-tree.cabal
+++ b/nix-tree.cabal
@@ -3,7 +3,7 @@
 name:                nix-tree
 synopsis:            Interactively browse a Nix store paths dependencies
 description:         A terminal curses application to browse a Nix store paths dependencies
-version:             0.2.1
+version:             0.3.0
 homepage:            https://github.com/utdemir/nix-tree
 license:             BSD-3-Clause
 license-file:        LICENSE
@@ -65,7 +65,7 @@
 
 executable nix-tree
   import:             common-options
-  ghc-options:        -Wunused-packages -O2 -threaded -with-rtsopts=-N
+  ghc-options:        -Wunused-packages -threaded -with-rtsopts=-N
   main-is:            NixTree/Main.hs
   hs-source-dirs:     src
   default-language:   Haskell2010
diff --git a/src/NixTree/App.hs b/src/NixTree/App.hs
--- a/src/NixTree/App.hs
+++ b/src/NixTree/App.hs
@@ -407,12 +407,12 @@
   T.intercalate
     "\n"
     [ "hjkl/Arrow Keys : Navigate",
-      "w               : Open why-depends mode",
-      "/               : Open search mode",
+      "w               : Open why-depends modal",
+      "/               : Open search modal",
       "s               : Change sort order",
       "y               : Yank selected path to clipboard",
       "?               : Show help",
-      "q/Esc:          : Quit / close modal"
+      "q/Esc           : Quit / close modal"
     ]
 
 helpNotice :: Notice
diff --git a/src/NixTree/Main.hs b/src/NixTree/Main.hs
--- a/src/NixTree/Main.hs
+++ b/src/NixTree/Main.hs
@@ -7,19 +7,21 @@
 import NixTree.App
 import NixTree.PathStats
 import qualified Options.Applicative as Opts
+import qualified Options.Applicative.Help.Pretty as Opts
 import System.Directory (doesDirectoryExist, getHomeDirectory)
 import System.Exit (ExitCode (..))
 import System.FilePath ((</>))
-import System.IO (hPutStr, hPutStrLn)
+import System.IO (hPutStrLn)
 import System.ProgressBar hiding (msg)
 
 version :: Text
 version = VERSION_nix_tree
 
 data Opts = Opts
-  { oVersion :: Bool,
+  { oInstallables :: [Installable],
+    oVersion :: Bool,
     oDerivation :: Bool,
-    oInstallables :: [Installable]
+    oImpure :: Bool
   }
 
 optsParser :: Opts.ParserInfo Opts
@@ -27,34 +29,44 @@
   Opts.info (parser <**> Opts.helper) $
     mconcat
       [ Opts.progDesc "Interactively browse dependency graphs of Nix derivations.",
-        Opts.fullDesc
+        Opts.fullDesc,
+        Opts.footerDoc (Just keybindingsHelp)
       ]
   where
     parser :: Opts.Parser Opts
     parser =
       Opts
-        <$> Opts.switch (Opts.long "version" <> Opts.help "Show the nix-tree version.")
-        <*> Opts.switch (Opts.long "derivation" <> Opts.help "Operate on the store derivation rather than its outputs.")
-        <*> many (Opts.strArgument @Text (Opts.metavar "INSTALLABLE" <> Opts.help "A store path or a flake reference.") <&> Installable)
+        <$> many
+          ( Installable
+              <$> Opts.strArgument @Text
+                ( Opts.metavar "INSTALLABLE"
+                    <> Opts.helpDoc
+                      ( Just $
+                          "A store path or a flake reference."
+                            Opts.<$$> "Paths default to \"~/.nix-profile\" and \"/var/run/current-system\""
+                      )
+                )
+          )
+        <*> Opts.switch (Opts.long "version" <> Opts.help "Show the nix-tree version")
+        <*> Opts.switch (Opts.long "derivation" <> Opts.help "Operate on the store derivation rather than its outputs")
+        <*> Opts.switch (Opts.long "impure" <> Opts.help "Allow access to mutable paths and repositories")
 
-usage :: Text
-usage =
-  unlines
-    [ "Usage: nix-tree [paths...] [-h|--help] [--version]",
-      "  Paths default to $HOME/.nix-profile and /var/run/current-system.",
-      "Keybindings:",
-      unlines . map ("  " <>) . lines $ helpText
-    ]
+    keybindingsHelp :: Opts.Doc
+    keybindingsHelp =
+      "Keybindings:"
+        Opts.<$$> (Opts.indent 2 . Opts.vsep $ map (Opts.text . toString) (lines helpText))
 
-usageAndFail :: Text -> IO a
-usageAndFail msg = do
+showAndFail :: Text -> IO a
+showAndFail msg = do
   hPutStrLn stderr . toString $ "Error: " <> msg
-  hPutStr stderr $ toString usage
   exitWith (ExitFailure 1)
 
 main :: IO ()
 main = do
-  opts <- Opts.execParser optsParser
+  opts <-
+    Opts.customExecParser
+      (Opts.prefs $ Opts.columns 120)
+      optsParser
 
   when (opts & oVersion) $ do
     putTextLn $ "nix-tree " <> version
@@ -72,10 +84,16 @@
             "/var/run/current-system"
           ]
       case roots of
-        [] -> usageAndFail "No store path given."
+        [] -> showAndFail "No store path given."
         p : ps -> return . fmap (Installable . toText) $ p :| ps
 
-  withStoreEnv (opts & oDerivation) installables $ \env' -> do
+  let seo =
+        StoreEnvOptions
+          { seoIsDerivation = opts & oDerivation,
+            seoIsImpure = opts & oImpure
+          }
+
+  withStoreEnv seo installables $ \env' -> do
     let env = calculatePathStats env'
         allPaths = seAll env
 
diff --git a/src/NixTree/StorePath.hs b/src/NixTree/StorePath.hs
--- a/src/NixTree/StorePath.hs
+++ b/src/NixTree/StorePath.hs
@@ -7,6 +7,7 @@
     StorePath (..),
     Installable (..),
     StoreEnv (..),
+    StoreEnvOptions (..),
     withStoreEnv,
     seLookup,
     seAll,
@@ -138,7 +139,8 @@
 
 data PathInfoOptions = PathInfoOptions
   { pioIsRecursive :: Bool,
-    pioIsDerivation :: Bool
+    pioIsDerivation :: Bool,
+    pioIsImpure :: Bool
   }
 
 getPathInfo :: NixStore -> NixVersion -> PathInfoOptions -> NonEmpty Installable -> IO (NonEmpty (StorePath s (StoreName s) ()))
@@ -149,6 +151,7 @@
         ( proc
             "nix"
             ( ["path-info", "--json"]
+                ++ (if options & pioIsImpure then ["--impure"] else [])
                 ++ (if options & pioIsRecursive then ["--recursive"] else [])
                 ++ (if (options & pioIsDerivation) && nixVersion >= Nix2_4 then ["--derivation"] else [])
                 ++ (if nixVersion >= Nix2_4 then ["--extra-experimental-features", "nix-command flakes"] else [])
@@ -189,20 +192,25 @@
   }
   deriving (Functor, Generic, NFData)
 
+data StoreEnvOptions = StoreEnvOptions
+  { seoIsDerivation :: Bool,
+    seoIsImpure :: Bool
+  }
+
 withStoreEnv ::
   forall m a.
   MonadIO m =>
-  Bool ->
+  StoreEnvOptions ->
   NonEmpty Installable ->
   (forall s. StoreEnv s () -> m a) ->
   m a
-withStoreEnv isDerivation names cb = do
+withStoreEnv StoreEnvOptions {seoIsDerivation, seoIsImpure} names cb = do
   nixStore <- liftIO getNixStore
 
   -- See: https://github.com/utdemir/nix-tree/issues/12
   nixVersion <- liftIO getNixVersion
 
-  when (isDerivation && nixVersion < Nix2_4) $
+  when (seoIsDerivation && nixVersion < Nix2_4) $
     liftIO $
       hPutStrLn stderr "Warning: --derivation flag is ignored on Nix versions older than 2.4."
 
@@ -211,7 +219,7 @@
       getPathInfo
         nixStore
         nixVersion
-        (PathInfoOptions {pioIsDerivation = isDerivation, pioIsRecursive = False})
+        (PathInfoOptions {pioIsDerivation = seoIsDerivation, pioIsRecursive = False, pioIsImpure = seoIsImpure})
         names
 
   paths <-
@@ -219,7 +227,7 @@
       getPathInfo
         nixStore
         nixVersion
-        (PathInfoOptions {pioIsDerivation = isDerivation, pioIsRecursive = True})
+        (PathInfoOptions {pioIsDerivation = seoIsDerivation, pioIsRecursive = True, pioIsImpure = seoIsImpure})
         (Installable . toText . storeNameToPath . spName <$> roots)
 
   let env =
