diff --git a/ats-pkg.cabal b/ats-pkg.cabal
--- a/ats-pkg.cabal
+++ b/ats-pkg.cabal
@@ -1,5 +1,5 @@
 name:                ats-pkg
-version:             2.2.0.1
+version:             2.2.0.2
 synopsis:            Package manager for ATS
 description:         A collection of scripts to make building ATS projects easy.
 homepage:            https://github.com/vmchale/atspkg#readme
diff --git a/man/atspkg.1 b/man/atspkg.1
--- a/man/atspkg.1
+++ b/man/atspkg.1
@@ -53,6 +53,11 @@
 Ignore cached configuration file
 .RS
 .RE
+.TP
+.B \f[B]\-r\f[], \f[B]\-\-rebuild\f[]
+Rebuild all binary targets.
+.RS
+.RE
 .SH CONFIGURATION
 .PP
 \f[B]atspkg\f[] is configured with Dhall, in an atspkg.dhall file.
diff --git a/src/Language/ATS/Package/Upgrade.hs b/src/Language/ATS/Package/Upgrade.hs
--- a/src/Language/ATS/Package/Upgrade.hs
+++ b/src/Language/ATS/Package/Upgrade.hs
@@ -6,10 +6,15 @@
 import qualified Data.ByteString.Lazy.Char8 as BSL
 import           Data.Char                  (isDigit)
 import           Data.List                  (intersperse)
+import           Data.Maybe                 (fromMaybe)
 import           Data.Semigroup
+import           Development.Shake.FilePath
 import           Network.HTTP.Client
 import           Network.HTTP.Client.TLS    (tlsManagerSettings)
+import           System.Directory           (createDirectoryIfMissing)
+import           System.Environment
 import           System.Info
+import           System.Posix.Files
 
 manufacturer :: String
 manufacturer = case os of
@@ -17,16 +22,29 @@
     _        -> "unknown"
 
 targetArch :: String
-targetArch = mconcat . intersperse "-" $ [arch, manufacturer, os]
+targetArch = g [arch, manufacturer, os]
+    where g = mconcat . intersperse "-"
 
+atspkgPath :: IO String
+atspkgPath = do
+    home <- fromMaybe "." <$> lookupEnv "HOME"
+    pure $ home <> "/.local/bin/atspkg"
+
 upgradeAtsPkg :: IO ()
 upgradeAtsPkg = do
+
+    putStrLn "Finding latest release..."
     manager <- newManager tlsManagerSettings
     initialRequest <- parseRequest "https://github.com/vmchale/atspkg/releases/latest"
     response <- responseBody <$> httpLbs (initialRequest { method = "GET", redirectCount = 0 }) manager
+
+    putStrLn "Downloading latest release..."
     let strVersion = BSL.takeWhile (/='"') . BSL.dropWhile (not . isDigit) . BSL.dropWhile (/='"') $ response
         binRequest = "https://github.com/vmchale/atspkg/releases/download/" <> BSL.unpack strVersion <> "/atspkg-" <> targetArch
-    putStrLn binRequest
     followupRequest <- parseRequest binRequest
     binBytes <- responseBody <$> httpLbs (followupRequest { method = "GET" }) manager
-    BSL.writeFile "atspkg" binBytes
+
+    atsPath <- atspkgPath
+    createDirectoryIfMissing True (takeDirectory atsPath)
+    BSL.writeFile atsPath binBytes
+    setFileMode atsPath ownerModes
