janhq/jan · warning · UpdateError

No endpoints configured

Error message

No endpoints configured

What it means

The NoEndpointsConfigured variant of UpdateError is returned immediately when the endpoints list passed to check_for_updates is empty. This means the tauri.conf.json plugins.updater.endpoints array is missing, empty, or was not loaded. Unlike other variants, this is a configuration error, not a network error.

Source

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

/// 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>,
    #[serde(default)]
    pub platforms: Option<serde_json::Value>,
    /// URL to download the update
    #[serde(default)]
    pub url: Option<String>,
    /// Signature for verifying the update

View on GitHub (pinned to fad3f12a14)

Solutions

  1. Add plugins.updater.endpoints to tauri.conf.json with at least one URL.
  2. Verify the JSON structure matches the Tauri updater plugin schema.
  3. Ensure the updater plugin is enabled in the Tauri features list.
  4. Check that the config file is not corrupted.

Example fix

// tauri.conf.json — before
{
  "plugins": {}
}

// after
{
  "plugins": {
    "updater": {
      "endpoints": [
        "https://apps.jan.ai/update-check",
        "https://fallback.jan.ai/update"
      ]
    }
  }
}
Defensive patterns

Strategy: validation

Validate before calling

// At build/startup time, verify endpoints are configured
fn verify_updater_config() -> Result<(), String> {
    let config = tauri::Config::from_file("tauri.conf.json")
        .map_err(|e| format!("Cannot read config: {e}"))?;
    let endpoints = config.plugins
        .get("updater")
        .and_then(|u| u.get("endpoints"))
        .and_then(|e| e.as_array());
    match endpoints {
        Some(arr) if !arr.is_empty() => Ok(()),
        _ => Err("plugins.updater.endpoints is missing or empty".into()),
    }
}

Type guard

function hasUpdaterEndpoints(config: unknown): boolean {
  const endpoints = (config as any)?.plugins?.updater?.endpoints;
  return Array.isArray(endpoints) && endpoints.length > 0;
}

Try / catch

Err(UpdateError::NoEndpointsConfigured) => {
    log::info!("No update endpoints configured; update checks are disabled.");
    // Non-fatal — silently skip
}

Prevention

When it happens

Trigger: tauri.conf.json has no plugins.updater.endpoints key. The endpoints array exists but is empty []. The config file failed to load and an empty default was used. The updater plugin was not included in the Tauri build features.

Common situations: Custom build of Jan that omitted the updater config. Misconfigured tauri.conf.json during development. Plugin disabled at compile time. Config file corrupted or replaced with one lacking the endpoints section.

Related errors


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