atuinsh/atuin · error

`atuin update` is only available when atuin was installed…

Error message

`atuin update` is only available when atuin was installed via the standalone installer (https://setup.atuin.sh).
If you installed atuin with a package manager (brew, nix, pacman, cargo, ...), please update it there instead.

What it means

`atuin update` only works when atuin was installed by the standalone installer, which writes an install receipt on disk. If the updater cannot load that receipt, it assumes a package-manager install (brew, nix, pacman, cargo, ...) and refuses to self-update to avoid fighting the package manager.

Solutions

  1. Update via your package manager instead (brew upgrade atuin, cargo install atuin, etc.)
  2. Reinstall via the standalone installer (https://setup.atuin.sh) if you want `atuin update` to work
  3. Check install method with `which atuin` to confirm which channel to update through

Example fix

// before
atuin update   # fails for brew install
// after
brew upgrade atuin
Defensive patterns

Strategy: try-catch

Validate before calling

// check install channel before attempting self-update
let out = std::process::Command::new("atuin").arg("update").output()?;
if !out.status.success() && String::from_utf8_lossy(&out.stderr).contains("package manager") {
    eprintln!("update via your package manager instead");
}

Try / catch

match updater.load_receipt() {
    Err(_) => eprintln!("package-manager install; use brew/cargo/etc to update"),
    Ok(_) => { /* proceed with update */ }
}

Prevention

When it happens

Trigger: Running `atuin update` when no installer receipt exists on disk - i.e. the binary came from a package manager, cargo, or a manually copied binary.

Common situations: Homebrew/Nix/cargo installs, distro packages, binaries downloaded manually, or a receipt deleted during cleanup.

Understand the failure class

Background: UnsupportedOperationException and "is not supported" errors: when a library deliberately refuses a call — this error's family across 30 libraries.

Related errors


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

Appendix: source

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

    /// Update (or roll back) to a specific version, e.g. "18.9.0" or
    /// "18.9.0-nightly.1", instead of the channel's latest release
    #[arg(long, conflicts_with = "check")]
    version: Option<String>,
}

impl Cmd {
    #[instrument(level = "trace", skip_all, err)]
    pub async fn run(self, settings: &Settings) -> Result<()> {
        let current = env!("CARGO_PKG_VERSION");

        let mut updater = AxoUpdater::new_for("atuin");
        updater.disable_installer_output();

        // 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,
            );

View on GitHub (pinned to 900007c480)