nikivdev/code · error
registry upload failed for {} ({})
Error message
registry upload failed for {} ({}) What it means
During publish, each binary is PUT/POSTed to the registry with an Authorization bearer token and X-Sha256 header. If the registry responds with a non-2xx status, publish bails with 'registry upload failed for <bin> (<status>)'.
Source
Thrown at src/registry.rs:191
.unwrap_or(DEFAULT_TOKEN_ENV);
let token = resolve_registry_token(token_env)?;
let client = Client::builder().timeout(Duration::from_secs(60)).build()?;
for bin in &bins {
let path = project_root.join("target").join("release").join(bin);
let key = format!("packages/{}/{}/{}/{}", package, version, target, bin);
let url = format!("{}/{}", registry_url, key);
let body = fs::read(&path)?;
let sha = sha256_file(&path)?;
let response = client
.put(url)
.header("Authorization", format!("Bearer {}", token))
.header("X-Sha256", sha)
.body(body)
.send()
.context("failed to upload binary")?;
if !response.status().is_success() {
bail!("registry upload failed for {} ({})", bin, response.status());
}
}
let manifest_url = format!(
"{}/packages/{}/{}/manifest.json",
registry_url, package, version
);
let mut request = client
.put(manifest_url)
.header("Authorization", format!("Bearer {}", token))
.body(serde_json::to_string_pretty(&manifest)?);
if latest {
request = request.query(&[("latest", "1")]);
}
let response = request.send().context("failed to upload manifest")?;
if !response.status().is_success() {
bail!("registry manifest upload failed ({})", response.status());
}View on GitHub (pinned to a747e741ae)
Solutions
- Check the HTTP status printed in the error and the registry server logs for the exact rejection reason.
- Refresh or correct your bearer token (login again / update registry credentials).
- If 409 conflict, bump the version or use an appropriate overwrite flag.
- Retry later if the status is 5xx (registry-side problem).
Example fix
null
Defensive patterns
Strategy: retry
Validate before calling
// Pre-flight: verify credentials and that the version is new
let status = client.get(format!("{registry}/packages/{pkg}/{ver}/manifest.json")).send()?.status();
if status == reqwest::StatusCode::CONFLICT {
return Err("version already published; bump version first".into());
} Try / catch
match publish(opts) {
Err(e) if e.to_string().contains("registry upload failed") => {
if is_server_error(&e) {
retry_with_backoff(3, || publish(opts.clone()));
} else {
eprintln!("Upload rejected: check token/permissions/version conflict");
std::process::exit(1);
}
}
other => other,
} Prevention
- Refresh registry tokens before CI publish jobs; check expiry.
- Bump versions before publishing; never republish the same version.
- Monitor registry status/uptime before release windows.
When it happens
Trigger: Uploading binary `bin` to `<registry_url>/packages/...` and receiving a non-success HTTP status, e.g. 401 (bad/expired token), 403 (no permission), 409 (version exists), or 5xx (registry outage).
Common situations: Expired or wrong registry token; publishing a version that already exists; registry rejecting too-large binaries; registry maintenance/downtime.
Related errors
- registry manifest upload failed ({})
- download failed ({})
- registry returned {}
- device auth start failed: HTTP {}
- device auth poll failed: HTTP {}
AI-assisted analysis of nikivdev/code@a747e741ae (2026-09-01).
Data as JSON: /api/errors/0ac494959bf5be02.
Report an issue: GitHub.