diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -1,7 +1,7 @@
 # Shh
 
 [![](https://img.shields.io/hackage/v/shh.svg?colorB=%23999&label=shh)](http://hackage.haskell.org/package/shh)
-[![](https://img.shields.io/hackage/v/shh.svg?colorB=%23999&label=shh-extras)](http://hackage.haskell.org/package/shh-extras)
+[![](https://img.shields.io/hackage/v/shh-extras.svg?colorB=%23999&label=shh-extras)](http://hackage.haskell.org/package/shh-extras)
 [![](https://travis-ci.org/luke-clifton/shh.svg?branch=master)](https://travis-ci.org/luke-clifton/shh)
 
 Shh is a library to enable convinient shell-like programming in Haskell.
diff --git a/app/shh-app.hs b/app/shh-app.hs
--- a/app/shh-app.hs
+++ b/app/shh-app.hs
@@ -48,8 +48,8 @@
         Just s -> pure s
 
     let
-        wrapped :: (Unit a, ExecArgs a) => a
-        wrapped = exe (shhDir <> "/wrapper")
+        wrapper :: String
+        wrapper = shhDir <> "/wrapper"
 
 
     debug $ "Shh home is: " <> shhDir
@@ -66,5 +66,5 @@
             emptyPermissions
         writeIfMissing "Shell.hs" defaultShell
 
-    wrapped "ghci" "-ghci-script" (shhDir <> "/init.ghci") (shhDir <> "/Shell.hs")
+    runProc $ mkProc' True wrapper ["ghci", "-ghci-script", shhDir <> "/init.ghci", shhDir <> "/Shell.hs"]
 
diff --git a/shh.cabal b/shh.cabal
--- a/shh.cabal
+++ b/shh.cabal
@@ -1,5 +1,5 @@
 name:                shh
-version:             0.2.0.4
+version:             0.2.0.5
 synopsis:            Simple shell scripting from Haskell
 description:         Provides a shell scripting environment for Haskell. It
                      helps you all external binaries, and allows you to
diff --git a/src/Shh.hs b/src/Shh.hs
--- a/src/Shh.hs
+++ b/src/Shh.hs
@@ -6,6 +6,7 @@
     -- created for you by using the `loadEnv` template Haskell function.
     , exe
     , mkProc
+    , mkProc'
     , runProc
     , Proc()
     -- | == Piping and Redirection
diff --git a/src/Shh/Internal.hs b/src/Shh/Internal.hs
--- a/src/Shh/Internal.hs
+++ b/src/Shh/Internal.hs
@@ -219,14 +219,17 @@
 runProc (Proc f) = f stdin stdout stderr (pure ()) (pure ())
 
 -- | Create a `Proc` from a command and a list of arguments.
-mkProc :: String -> [String] -> Proc ()
-mkProc cmd args = Proc $ \i o e pl pw -> do
+-- The boolean represents whether we should delegate control-c
+-- or not. Most uses of @`mkProc'`@ in Shh do not delegate control-c.
+mkProc' :: Bool -> String -> [String] -> Proc ()
+mkProc' delegate cmd args = Proc $ \i o e pl pw -> do
     bracket
         (createProcess_ cmd (proc cmd args)
             { std_in = UseHandle i
             , std_out = UseHandle o
             , std_err = UseHandle e
             , close_fds = True
+            , delegate_ctlc = delegate
             }
         )
         (\(_,_,_,ph) -> terminateProcess ph)
@@ -234,6 +237,10 @@
             pl
             (waitProc cmd args ph `onException` terminateProcess ph) `finally` pw
 
+-- | Create a `Proc` from a command and a list of arguments. Does not delegate
+-- control-c handling.
+mkProc :: String -> [String] -> Proc ()
+mkProc = mkProc' False
 
 -- | Read the stdout of a `Proc`. This captures stdout, so further piping will
 -- not see anything on the input.
