{"record":{"id":"e2a60b0e8a0f9fbb","repo":"immich-app/immich","slug":"version-check-request-failed-with-status-response-status","errorCode":null,"errorMessage":"Version check request failed with status ${response.status}: ${await response.text()}","messagePattern":"Version check request failed with status (.+?): (.+?)","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"server/src/repositories/server-info.repository.ts","lineNumber":75,"sourceCode":"\n  async getLatestRelease(channel: ReleaseChannel): Promise<VersionResponse> {\n    try {\n      const { versionCheck } = this.configRepository.getEnv();\n      const url = new URL(versionCheck.url);\n      switch (channel) {\n        case ReleaseChannel.Stable: {\n          url.searchParams.append('channel', 'stable');\n          break;\n        }\n        case ReleaseChannel.ReleaseCandidate: {\n          url.searchParams.append('channel', 'rc');\n          break;\n        }\n      }\n      const response = await fetch(url);\n\n      if (!response.ok) {\n        throw new Error(`Version check request failed with status ${response.status}: ${await response.text()}`);\n      }\n\n      return response.json();\n    } catch (error) {\n      throw new Error('Failed to fetch latest release', { cause: error });\n    }\n  }\n\n  buildVersions?: ServerBuildVersions;\n\n  private async retrieveVersionFallback(\n    command: string,\n    commandTransform?: (output: string) => string,\n    version?: string,\n  ): Promise<string> {\n    if (!version) {\n      const output = await maybeFirstLine(command);\n      version = commandTransform ? commandTransform(output) : output;","sourceCodeStart":57,"sourceCodeEnd":93,"githubUrl":"https://github.com/immich-app/immich/blob/e55ac299a4ec7cb372e35dbf2c6c05ee9ce77f6c/server/src/repositories/server-info.repository.ts#L57-L93","documentation":"getLatestRelease fetches the GitHub release feed to check for a new version. When the HTTP response is not ok (non-2xx), it throws an error embedding the status code and response body, which is then wrapped in 'Failed to fetch latest release' by the outer catch.","triggerScenarios":"GitHub API returning 403 (rate limited), 404 (bad buildMetadataUrl), 5xx outages, or network-level failures during the version check.","commonSituations":"Unauthenticated GitHub API rate-limiting a busy server (X-RateLimit exhausted), a configured/derived release URL that no longer exists, or transient GitHub outages.","solutions":["Check the response status/body in the message — 403 usually means GitHub API rate limiting; wait or use an authenticated token","Verify the release-check URL is correct for this build/version","Retry the version check later; this is transient and does not affect core functionality","Disable/skip version checking if the server has no outbound internet access"],"exampleFix":null,"handlingStrategy":"retry","validationCode":"const url = buildReleaseUrl(serverVersion);\nif (!URL.canParse(url)) throw new Error(`Invalid release-check URL: ${url}`);","typeGuard":null,"tryCatchPattern":"try {\n  return await getLatestRelease();\n} catch (e) {\n  // non-fatal: log and continue without version check\n  logger.warn(`Version check skipped: ${(e as Error).message}`);\n  return null;\n}","preventionTips":["Treat version checks as best-effort, never blocking startup","Handle GitHub 403 rate limits by backing off or caching results","Verify outbound network/proxy access in containerized deployments","Cache the last successful release check to reduce API calls"],"tags":["network","http","version-check"],"backgroundTag":"http-error-response","analyzedSha":"e55ac299a4ec7cb372e35dbf2c6c05ee9ce77f6c","analyzedAt":"2026-09-15T07:20:19.675Z","contentChangedAt":"2026-09-15T07:20:19.675Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}