janhq/jan · error · Error
Failed to fetch supported backends: ${error instanceof Error
Error message
Failed to fetch supported backends: ${error instanceof Error ? error.message : error} What it means
Wrapping error thrown when listSupportedBackends itself throws — the inner error (network failure, parse failure, API error) is caught and re-thrown with a 'Failed to fetch supported backends' prefix and the original message. This is distinct from error 5 which fires when the call succeeds but returns an empty list.
Source
Thrown at extensions/llamacpp-extension/src/index.ts:1438
this.isConfiguringBackends = true
try {
let version_backends: { version: string; backend: string }[] = []
try {
version_backends = await listSupportedBackends(
this.config.check_for_updates !== false
)
if (version_backends.length === 0) {
throw new Error(
'No supported backend binaries found for this system. Backend selection and auto-update will be unavailable.'
)
} else {
version_backends.sort((a, b) => b.version.localeCompare(a.version))
}
} catch (error) {
throw new Error(
`Failed to fetch supported backends: ${
error instanceof Error ? error.message : error
}`
)
}
// Get stored backend preference
const storedBackendType = await this.getStoredBackendType()
let bestAvailableBackendString = ''
// "Recommended" is computed against upstream releases only — a
// user-side-loaded backend (Install from File) must not bias the
// suggestion. If we have no remote data (check_for_updates off or
// offline), there is no honest recommendation to surface.
const remoteOnly =
this.config.check_for_updates !== false
? await fetchRemoteBackends()
: []View on GitHub (pinned to fad3f12a14)
Solutions
- Retry after confirming network connectivity — transient rate limits and CDN hiccups are the most common cause.
- Set a GitHub API token in the environment to raise the rate-limit ceiling if running in CI.
- Switch the configured source between 'github' and 'cdn' to bypass a failing endpoint.
- Pre-cache backend manifests locally if the environment is offline or behind a strict firewall.
Defensive patterns
Strategy: retry
Try / catch
async function fetchBackendsWithRetry(maxAttempts = 3): Promise<typeof backends> {
for (let i = 0; i < maxAttempts; i++) {
try {
return await listSupportedBackends(true)
} catch (e) {
if (i === maxAttempts - 1) throw e
await new Promise(r => setTimeout(r, 1000 * (i + 1)))
}
}
throw new Error('unreachable')
} Prevention
- Set a GITHUB_TOKEN in CI to avoid unauthenticated rate limits.
- Provide a CDN fallback source in environments where GitHub is unreliable.
- Cache the manifest response to survive transient outages.
When it happens
Trigger: listSupportedBackends throws: GitHub API rate limit (403), network timeout/DNS failure, malformed JSON in the fetched manifest, CDN returning an error page, or an internal assertion in the manifest parser.
Common situations: GitHub unauthenticated API rate limit in CI; corporate firewall blocking api.github.com or the CDN; CDN outage during a release window; proxy returning an HTML error page that fails JSON parsing.
Related errors
- API key rotation exhausted
- Failed to fetch models from ${provider.provider}: ${lastStat
- Checksum mismatch for ${name}; the download was corrupt or t
- No supported backend binaries found for this system. Backend
- Invalid backend string: ${targetBackendString} supplied to u
AI-assisted analysis of janhq/jan@fad3f12a14 (2026-08-12).
Data as JSON: /api/errors/1e5c073aa1e69a1f.
Report an issue: GitHub.