diff --git a/ci-scripts/run_tests_unix.sh b/ci-scripts/run_tests_unix.sh
index f07f89f7..e49b81a0 100755
--- a/ci-scripts/run_tests_unix.sh
+++ b/ci-scripts/run_tests_unix.sh
@@ -5,6 +5,9 @@ set -euxo pipefail
 bins="cargo-deb cargo-llvm-cov cargo-binstall"
 test_bins="cargo-deb cargo-llvm-cov"
 
+unset CARGO_INSTALL_ROOT
+unset CARGO_HOME
+
 # Install binaries using cargo-binstall
 # shellcheck disable=SC2086
 "./$1" binstall --log-level debug --no-confirm $bins
diff --git a/src/helpers.rs b/src/helpers.rs
index 5118722a..768a37a8 100644
--- a/src/helpers.rs
+++ b/src/helpers.rs
@@ -1,8 +1,10 @@
+use std::env;
 use std::fmt::Debug;
 use std::fs;
 use std::io;
 use std::ops;
 use std::path::{Path, PathBuf};
+use std::sync::Arc;
 
 use bytes::Bytes;
 use cargo_toml::Manifest;
@@ -189,32 +191,24 @@ pub async fn download_tar_based_and_visit<V: TarEntriesVisitor + Debug + Send +
 
 /// Fetch install path from environment
 /// roughly follows <https://doc.rust-lang.org/cargo/commands/cargo-install.html#description>
-pub fn get_install_path<P: AsRef<Path>>(install_path: Option<P>) -> Option<PathBuf> {
+///
+/// Return (install_path, is_custom_install_path)
+pub fn get_install_path<P: AsRef<Path>>(install_path: Option<P>) -> (Option<Arc<Path>>, bool) {
     // Command line override first first
     if let Some(p) = install_path {
-        return Some(PathBuf::from(p.as_ref()));
+        return (Some(Arc::from(p.as_ref())), true);
     }
 
     // Environmental variables
     if let Ok(p) = std::env::var("CARGO_INSTALL_ROOT") {
         debug!("using CARGO_INSTALL_ROOT ({p})");
         let b = PathBuf::from(p);
-        return Some(b.join("bin"));
-    }
-    if let Ok(p) = std::env::var("CARGO_HOME") {
-        debug!("using CARGO_HOME ({p})");
-        let b = PathBuf::from(p);
-        return Some(b.join("bin"));
+        return (Some(Arc::from(b.join("bin"))), true);
     }
 
-    // Standard $HOME/.cargo/bin
-    if let Some(d) = dirs::home_dir() {
-        let d = d.join(".cargo/bin");
-        if d.exists() {
-            debug!("using $HOME/.cargo/bin");
-
-            return Some(d);
-        }
+    if let Ok(p) = cargo_home() {
+        debug!("using ({}) as cargo home", p.display());
+        return (Some(p.join("bin").into()), false);
     }
 
     // Local executable dir if no cargo is found
@@ -224,7 +218,7 @@ pub fn get_install_path<P: AsRef<Path>>(install_path: Option<P>) -> Option<PathB
         debug!("Fallback to {}", d.display());
     }
 
-    dir
+    (dir.map(Arc::from), true)
 }
 
 /// Atomically install a file.
diff --git a/src/main.rs b/src/main.rs
index 08a0c59d..b5a79ad0 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -240,12 +240,11 @@ async fn entry(jobserver_client: LazyJobserverClient) -> Result<()> {
     let desired_targets = get_desired_targets(&opts.targets);
 
     // Compute install directory
-    let install_path: Arc<Path> = Arc::from(
-        get_install_path(opts.install_path.as_deref()).ok_or_else(|| {
-            error!("No viable install path found of specified, try `--install-path`");
-            miette!("No install path found or specified")
-        })?,
-    );
+    let (install_path, custom_install_path) = get_install_path(opts.install_path.as_deref());
+    let install_path = install_path.ok_or_else(|| {
+        error!("No viable install path found of specified, try `--install-path`");
+        miette!("No install path found or specified")
+    })?;
     debug!("Using install path: {}", install_path.display());
 
     // Create a temporary directory for downloads etc.
@@ -343,27 +342,29 @@ async fn entry(jobserver_client: LazyJobserverClient) -> Result<()> {
     }
 
     block_in_place(|| {
-        debug!("Writing .crates.toml");
-        metafiles::v1::CratesToml::append(
-            metadata_vec
-                .iter()
-                .map(|metadata| (&metadata.cvs, metadata.bins.clone())),
-        )?;
+        if !custom_install_path {
+            debug!("Writing .crates.toml");
+            metafiles::v1::CratesToml::append(
+                metadata_vec
+                    .iter()
+                    .map(|metadata| (&metadata.cvs, metadata.bins.clone())),
+            )?;
 
-        debug!("Writing .crates2.json");
-        metafiles::v2::Crates2Json::append(metadata_vec.into_iter().map(|metadata| {
-            (
-                metadata.cvs,
-                metafiles::v2::CrateInfo {
-                    version_req: Some(metadata.version_req),
-                    bins: metadata.bins,
-                    profile: "release".into(),
-                    target: metadata.target,
-                    rustc: format!("{} {}", env!("CARGO_PKG_NAME"), env!("CARGO_PKG_VERSION")),
-                    ..Default::default()
-                },
-            )
-        }))?;
+            debug!("Writing .crates2.json");
+            metafiles::v2::Crates2Json::append(metadata_vec.into_iter().map(|metadata| {
+                (
+                    metadata.cvs,
+                    metafiles::v2::CrateInfo {
+                        version_req: Some(metadata.version_req),
+                        bins: metadata.bins,
+                        profile: "release".into(),
+                        target: metadata.target,
+                        rustc: format!("{} {}", env!("CARGO_PKG_NAME"), env!("CARGO_PKG_VERSION")),
+                        ..Default::default()
+                    },
+                )
+            }))?;
+        }
 
         if opts.no_cleanup {
             // Consume temp_dir without removing it from fs.