{"record":{"id":"5dbfa4c6bb8bad2b","repo":"atuinsh/atuin","slug":"atuin-update-is-only-available-when-atuin-was-in","errorCode":null,"errorMessage":"`atuin update` is only available when atuin was installed via the standalone installer (https://setup.atuin.sh).\nIf you installed atuin with a package manager (brew, nix, pacman, cargo, ...), please update it there instead.","messagePattern":"`atuin update` is only available when atuin was installed via the standalone installer \\(https://setup\\.atuin\\.sh\\)\\.\nIf you installed atuin with a package manager \\(brew, nix, pacman, cargo, \\.\\.\\.\\), please update it there instead\\.","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/atuin/src/command/client/update.rs","lineNumber":31,"sourceCode":"    /// Update (or roll back) to a specific version, e.g. \"18.9.0\" or\n    /// \"18.9.0-nightly.1\", instead of the channel's latest release\n    #[arg(long, conflicts_with = \"check\")]\n    version: Option<String>,\n}\n\nimpl Cmd {\n    #[instrument(level = \"trace\", skip_all, err)]\n    pub async fn run(self, settings: &Settings) -> Result<()> {\n        let current = env!(\"CARGO_PKG_VERSION\");\n\n        let mut updater = AxoUpdater::new_for(\"atuin\");\n        updater.disable_installer_output();\n\n        // The install receipt is written by the shell/powershell installers.\n        // No receipt means atuin came from a package manager, which should\n        // stay in charge of upgrades.\n        if updater.load_receipt().is_err() {\n            bail!(\n                \"`atuin update` is only available when atuin was installed via the standalone installer (https://setup.atuin.sh).\\n\\\n                 If you installed atuin with a package manager (brew, nix, pacman, cargo, ...), please update it there instead.\"\n            );\n        }\n\n        // The receipt records the version the installer wrote; trust the\n        // binary itself in case it was replaced by other means.\n        let _ = updater.set_current_version(current.parse()?);\n\n        if !updater.check_receipt_is_for_this_executable()? {\n            let current_exe = std::env::current_exe()?;\n            let receipt_prefix = updater.install_prefix_root()?;\n            bail!(\n                \"This atuin binary ({}) is not the one the standalone installer installed to {}. \\\n                 Are multiple copies of atuin installed?\",\n                current_exe.display(),\n                receipt_prefix,\n            );","sourceCodeStart":13,"sourceCodeEnd":49,"githubUrl":"https://github.com/atuinsh/atuin/blob/c0c717ab04c881764bcad4b3d169a507e2432643/crates/atuin/src/command/client/update.rs#L13-L49","documentation":"`atuin update` delegates to the standalone installer's self-update machinery, which relies on an install receipt written by the setup.atuin.sh shell/powershell installers. If no receipt can be loaded, atuin assumes it was installed by a package manager (brew, nix, pacman, cargo, ...) and refuses to self-update so as not to fight that manager.","triggerScenarios":"Running `atuin update` when atuin was installed via a package manager or built from source, so `updater.load_receipt()` returns Err (no receipt file present).","commonSituations":"Homebrew/Nix/APT/pacman installs, `cargo install atuin` builds, CI images, or a receipt lost after moving home directories.","solutions":["Update via your package manager instead: `brew upgrade atuin`, `pacman -Syu atuin`, `cargo install atuin`, etc.","If you want self-update, install via the standalone installer: `curl https://setup.atuin.sh | sh` (replaces the package-managed binary with one it owns).","Check your install origin (`which atuin`) to confirm which update path applies."],"exampleFix":"// before\natuin update   # cargo-installed binary, no receipt\n// after\ncargo install atuin   # update through the same channel it was installed from","handlingStrategy":"validation","validationCode":"# shell\n# detect package-manager installs and route update accordingly\nif command -v brew >/dev/null && brew list atuin >/dev/null 2>&1; then\n  brew upgrade atuin\nelse\n  atuin update\nfi","typeGuard":null,"tryCatchPattern":"if ! atuin update 2>&1 | grep -q 'standalone installer'; then :; fi\n# fallback to the channel it was installed from (brew/nix/pacman/cargo)","preventionTips":["Remember which channel installed atuin and update through it.","Package-manager installs (brew/nix/pacman/cargo) never support `atuin update`.","Only the setup.atuin.sh installer writes the receipt that enables self-update."],"tags":["cli","self-update","package-manager"],"backgroundTag":"unsupported-operation","analyzedSha":"c0c717ab04c881764bcad4b3d169a507e2432643","analyzedAt":"2026-09-12T07:40:01.341Z","contentChangedAt":"2026-09-12T07:40:01.341Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}