atuinsh/atuin · error

This atuin binary ( ) is not the one the standalone…

Error message

This atuin binary ({}) is not the one the standalone installer installed to {}. Are multiple copies of atuin installed?

What it means

Even when an installer receipt exists, `atuin update` verifies that the currently running executable is the one the installer placed. If the running binary path does not match the receipt's install prefix, the updater refuses, since updating the installed copy would not update (and could confuse) the copy actually running.

Solutions

  1. Find all copies: `which -a atuin` and remove or shadow the non-installer ones
  2. Run the installer-installed binary directly, or fix PATH order so it wins
  3. Reinstall with the standalone installer to refresh the receipt and binary together

Example fix

// before
# cargo bin shadows installer copy in PATH
export PATH="$HOME/.cargo/bin:$PATH"
// after
export PATH="$PATH:$HOME/.cargo/bin"   # installer copy found first
atuin update
Defensive patterns

Strategy: validation

Validate before calling

let exe = std::env::current_exe()?;
println!("running: {}", exe.display());
// confirm this matches the receipt install prefix before updating

Prevention

When it happens

Trigger: Running `atuin update` while executing a different atuin binary than the installer-installed one - e.g. a cargo-built copy earlier in PATH while an installer copy also exists.

Common situations: Multiple installs (brew + installer, cargo + installer), PATH shadowing, moving/renaming the installed binary, or running atuin from a build directory.

Understand the failure class

Background: "Invalid state transition" errors: "status must be X, actually Y", "already rejected/charging/uninstalled", "cannot ... while running" — what they mean when a library rejects your call — this error's family across 31 libraries.

Related errors


AI-assisted analysis of atuinsh/atuin@900007c480 (2026-09-19). Data as JSON: /api/errors/71ef8ac29dbaaa32. Report an issue: GitHub.

Appendix: source

Thrown at crates/atuin/src/command/client/update.rs:44

        // The install receipt is written by the shell/powershell installers.
        // No receipt means atuin came from a package manager, which should
        // stay in charge of upgrades.
        if updater.load_receipt().is_err() {
            bail!(
                "`atuin update` is only available when atuin was installed via the standalone installer (https://setup.atuin.sh).\n\
                 If you installed atuin with a package manager (brew, nix, pacman, cargo, ...), please update it there instead."
            );
        }

        // The receipt records the version the installer wrote; trust the
        // binary itself in case it was replaced by other means.
        let _ = updater.set_current_version(current.parse()?);

        if !updater.check_receipt_is_for_this_executable()? {
            let current_exe = std::env::current_exe()?;
            let receipt_prefix = updater.install_prefix_root()?;
            bail!(
                "This atuin binary ({}) is not the one the standalone installer installed to {}. \
                 Are multiple copies of atuin installed?",
                current_exe.display(),
                receipt_prefix,
            );
        }

        let request = match (&self.version, settings.update_channel) {
            (Some(version), _) => {
                UpdateRequest::SpecificVersion(version.trim_start_matches('v').to_string())
            }
            (None, UpdateChannel::Stable) => UpdateRequest::Latest,
            (None, UpdateChannel::Nightly) => UpdateRequest::LatestMaybePrerelease,
        };
        updater.configure_version_specifier(request);

        let channel = match settings.update_channel {
            UpdateChannel::Stable => "stable",

View on GitHub (pinned to 900007c480)