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
- Update via your package manager instead (brew upgrade atuin, cargo install atuin, etc.)
- Reinstall via the standalone installer (https://setup.atuin.sh) if you want `atuin update` to work
- 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
- Track how atuin was installed and use that channel for upgrades
- Only use `atuin update` on installer-based installs
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
- `atuin hook ` is not supported. Use `atuin hook install `.
- This atuin binary ( ) is not the one the standalone…
- A script named ' ' already exists
- `atuin history tail` requires Atuin to be built with the…
- authentication canceled
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)