astrid-runtime/astrid · error

no GitHub releases found for {org}/{repo}

Error message

no GitHub releases found for {org}/{repo}

What it means

Raised by `fetch_github_latest_version` when the GitHub releases API responds with 404 NOT_FOUND for `https://api.github.com/repos/{org}/{repo}/releases/latest`. GitHub returns 404 here when the repository does not exist, is private/unauthenticated, or exists but has no published releases. `astrid capsule update` surfaces this as a failed update check for that capsule.

Source

Thrown at crates/astrid-cli/src/commands/capsule/install_update.rs:46

    Failed { reason: String },
    Skipped { reason: String },
}

/// Fetch the latest release version from GitHub for a given org/repo.
async fn fetch_github_latest_version(
    client: &reqwest::Client,
    org: &str,
    repo: &str,
) -> anyhow::Result<semver::Version> {
    let api_url = format!("https://api.github.com/repos/{org}/{repo}/releases/latest");
    let response = client
        .get(&api_url)
        .send()
        .await
        .context("failed to reach GitHub API")?;

    if response.status() == reqwest::StatusCode::NOT_FOUND {
        bail!("no GitHub releases found for {org}/{repo}");
    }
    if response.status() == reqwest::StatusCode::TOO_MANY_REQUESTS
        || response.status() == reqwest::StatusCode::FORBIDDEN
    {
        bail!("GitHub API rate limit exceeded - try again later");
    }
    if !response.status().is_success() {
        bail!("GitHub API returned {}", response.status());
    }

    let json: serde_json::Value = response
        .json()
        .await
        .context("failed to parse GitHub API response")?;
    let tag_name = json
        .get("tag_name")
        .and_then(serde_json::Value::as_str)
        .filter(|s| !s.is_empty())

View on GitHub (pinned to affd8760f4)

Solutions

  1. Verify the repo exists and has at least one published release at https://github.com/{org}/{repo}/releases; if the author only pushes tags, ask them to publish a Release.
  2. If the repo was renamed, reinstall the capsule with the new `org/repo` source so meta.json records the correct location.
  3. If the repo is private, ensure credentials/GITHUB_TOKEN are available to your environment or use an accessible mirror.
  4. If the capsule is abandoned, keep the currently installed version or reinstall from a local `.capsule` file instead of updating.

Example fix

// meta.json source pointing at a removed repo
"source": "github.com/old-org/my-capsule"
// update fails: no GitHub releases found for old-org/my-capsule

// after — reinstall from the relocated repo
astrid capsule install github.com/new-org/my-capsule
Defensive patterns

Strategy: fallback

Try / catch

match check_remote_version(&client, &source, &version) {
    UpdateCheck::Failed { reason } if reason.contains("no GitHub releases found") => {
        eprintln!("Skipping update: {reason}");
    },
    other => handle(other),
}

Prevention

When it happens

Trigger: Calling `astrid capsule update` (workspace mode) for a capsule whose recorded source points to a GitHub org/repo where the `/releases/latest` endpoint returns 404 — repo deleted or renamed, repo made private, or repo has zero published releases (only draft/prerelease-only tags).

Common situations: Capsule author renamed or deleted the GitHub repo after you installed; repo went private; author tags the repo but never publishes a GitHub Release; typo in source URL recorded in meta.json.

Understand the failure class

Background: 'Could not be found', 'does not exist', 'not found in database': the resource-not-found family when an ID, slug, key, or URI lookup comes back empty — this error's family across 20 libraries.

Related errors


AI-assisted analysis of astrid-runtime/astrid@affd8760f4 (2026-09-09). Data as JSON: /api/errors/843ed8a03a3336c0. Report an issue: GitHub.