atuinsh/atuin · error

please provide a password

Error message

please provide a password

What it means

Headless registration via the legacy v0 API (when username, email and password are all supplied to `atuin register`) rejects an empty password. The password is the only secret in headless mode, so an empty string is invalid and `run` bails before calling `client.register`.

Solutions

  1. Supply a non-empty password via the password flag/env var in your registration script
  2. Fail fast in the script if the password variable is empty before invoking atuin
  3. Use interactive registration (omit flags) so the password is prompted, if a TTY is available

Example fix

// before
atuin register -u ci -e ci@example.com --password "$REG_PW"  # REG_PW empty
// after
: "${REG_PW:?REG_PW must be set}"
atuin register -u ci -e ci@example.com --password "$REG_PW"
Defensive patterns

Strategy: validation

Validate before calling

: "${REG_PW:?registration password must be set}"
[ -n "$REG_PW" ] || exit 1

Try / catch

atuin register -u "$U" -e "$E" --password "$REG_PW" || { echo 'registration failed'; exit 1; }

Prevention

When it happens

Trigger: Running `atuin register -u user -e email --password ''` or with an unset env var in CI/scripting headless registration.

Common situations: CI provisioning scripts with unset PASSWORD vars; YAML/TOML config where the password key is present but empty; shell quoting dropping the value.

Understand the failure class

Background: "must not be empty", "cannot be empty" — required-field validation errors across open-source libraries — this error's family across 41 libraries.

Related errors


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

Appendix: source

Thrown at crates/atuin/src/command/client/account/register.rs:67

            let provided = [self.username.is_some(), self.email.is_some(), self.password.is_some()]
                .iter()
                .filter(|&b| *b)
                .count();
            if provided < required_for_headless {
                println!(
                    "Username, password, and email are all required for headless registration. \
                     Continuing with interactive registration.\n"
                );
            }

            if let (Some(username), Some(email), Some(password)) =
                (&self.username, &self.email, &self.password)
            {
                // Headless registration via v0 API (for CI / scripting).
                let client = auth::auth_client(settings).await;

                if password.is_empty() {
                    bail!("please provide a password");
                }

                let response = client.register(username, email, password).await?;

                match response {
                    AuthResponse::Success { session, auth_type } => {
                        let meta = Settings::meta_store().await?;
                        let is_hub_token =
                            auth_type.as_deref() == Some("hub") || session.starts_with("atapi_");

                        if is_hub_token {
                            meta.save_hub_session(&session).await?;
                        } else {
                            meta.save_session(&session).await?;
                            println!(
                                "\nNote: Your account has not been fully migrated to Atuin Hub."
                            );
                            println!(

View on GitHub (pinned to 900007c480)