janhq/jan · warning · UpdateError

All endpoints failed

Error message

All endpoints failed

What it means

The AllEndpointsFailed variant of UpdateError is returned when every configured update endpoint in the list returned an error (RequestFailed, ParseError, or InvalidResponse). The check_for_updates method iterates endpoints, trying the first with HMAC signing and the rest without, and returns this error only after all have been exhausted. The last individual error is logged per-endpoint but the final return is AllEndpointsFailed.

Source

Thrown at src-tauri/src/core/updater/custom_updater.rs:37

/// - In CI: Set JAN_SIGNING_KEY environment variable at build time
/// - In local dev: Falls back to a test key
const SECRET_KEY: &str = match option_env!("JAN_SIGNING_KEY") {
    Some(key) => key,
    None => "local-dev-test-key-not-for-production",
};

/// Timeout for HTTP requests
const REQUEST_TIMEOUT_SECS: u64 = 30;

#[derive(Debug, Error)]
pub enum UpdateError {
    #[error("HTTP request failed: {0}")]
    RequestFailed(#[from] reqwest::Error),

    #[error("Failed to parse update response: {0}")]
    ParseError(String),

    #[error("All endpoints failed")]
    AllEndpointsFailed,

    #[error("Invalid response from server: {0}")]
    InvalidResponse(String),

    #[error("No endpoints configured")]
    NoEndpointsConfigured,
}

/// Update information returned by the update check endpoint
/// Compatible with Tauri's updater format
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UpdateInfo {
    pub version: String,
    #[serde(default)]
    pub notes: Option<String>,
    #[serde(default)]
    pub pub_date: Option<String>,

View on GitHub (pinned to fad3f12a14)

Solutions

  1. Check the per-endpoint warning logs to see which specific error each endpoint returned.
  2. Verify at least one endpoint is reachable: `curl -v <endpoint-url>`.
  3. Check overall network connectivity.
  4. Review tauri.conf.json plugins.updater.endpoints for stale URLs.

Example fix

// enable debug logging to see per-endpoint errors
RUST_LOG=jan_core::updater=debug ./jan

// then check logs for: "Endpoint <url> failed: <error>"
Defensive patterns

Strategy: fallback

Validate before calling

// Before update check, verify at least one endpoint is configured
if endpoints.is_empty() {
    log::info!("No update endpoints configured; skipping update check");
    return Ok(None);
}

// Optionally, probe endpoint reachability
let reachable = endpoints.iter().filter(|u| reqwest::Client::new().head(u).send().await.is_ok()).count();
if reachable == 0 {
    log::warn!("No update endpoints are currently reachable");
}

Try / catch

match updater.check_for_updates(endpoints, nonce, version).await {
    Ok(Some(info)) => { /* offer update */ }
    Ok(None) => { /* up to date */ }
    Err(UpdateError::AllEndpointsFailed) => {
        log::info!("All update endpoints failed; skipping update check silently");
        // Non-fatal — the app is still usable
    }
    Err(other) => { log::warn!("Update check error: {other}"); }
}

Prevention

When it happens

Trigger: All endpoints are down or unreachable (total network outage). All endpoints return non-2xx status codes. All endpoints return malformed responses. The primary signed endpoint rejects the HMAC signature AND all fallback endpoints also fail independently.

Common situations: Complete network outage during an update check. All endpoints decommissioned during a migration. Corporate firewall blocking all jan.ai domains. System clock wildly wrong causing all TLS certs to appear invalid. DNS server failure affecting all endpoints.

Related errors


AI-assisted analysis of janhq/jan@fad3f12a14 (2026-08-12). Data as JSON: /api/errors/0c3626749742debe. Report an issue: GitHub.