immich-app/immich · warning

Version check request failed with status

Error message

Version check request failed with status ${response.status}: ${await response.text()}

What it means

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.

Solutions

  1. Check the response status/body in the message — 403 usually means GitHub API rate limiting; wait or use an authenticated token
  2. Verify the release-check URL is correct for this build/version
  3. Retry the version check later; this is transient and does not affect core functionality
  4. Disable/skip version checking if the server has no outbound internet access
Defensive patterns

Strategy: retry

Validate before calling

const url = buildReleaseUrl(serverVersion);
if (!URL.canParse(url)) throw new Error(`Invalid release-check URL: ${url}`);

Try / catch

try {
  return await getLatestRelease();
} catch (e) {
  // non-fatal: log and continue without version check
  logger.warn(`Version check skipped: ${(e as Error).message}`);
  return null;
}

Prevention

When it happens

Trigger: GitHub API returning 403 (rate limited), 404 (bad buildMetadataUrl), 5xx outages, or network-level failures during the version check.

Common situations: Unauthenticated GitHub API rate-limiting a busy server (X-RateLimit exhausted), a configured/derived release URL that no longer exists, or transient GitHub outages.

Understand the failure class

Background: "API error: {status}" and "HTTP 401/403/404/429/5xx" errors: non-2xx HTTP responses explained — this error's family across 27 libraries.

Related errors


AI-assisted analysis of immich-app/immich@e55ac299a4 (2026-09-15). Data as JSON: /api/errors/e2a60b0e8a0f9fbb. Report an issue: GitHub.

Appendix: source

Thrown at server/src/repositories/server-info.repository.ts:75

  async getLatestRelease(channel: ReleaseChannel): Promise<VersionResponse> {
    try {
      const { versionCheck } = this.configRepository.getEnv();
      const url = new URL(versionCheck.url);
      switch (channel) {
        case ReleaseChannel.Stable: {
          url.searchParams.append('channel', 'stable');
          break;
        }
        case ReleaseChannel.ReleaseCandidate: {
          url.searchParams.append('channel', 'rc');
          break;
        }
      }
      const response = await fetch(url);

      if (!response.ok) {
        throw new Error(`Version check request failed with status ${response.status}: ${await response.text()}`);
      }

      return response.json();
    } catch (error) {
      throw new Error('Failed to fetch latest release', { cause: error });
    }
  }

  buildVersions?: ServerBuildVersions;

  private async retrieveVersionFallback(
    command: string,
    commandTransform?: (output: string) => string,
    version?: string,
  ): Promise<string> {
    if (!version) {
      const output = await maybeFirstLine(command);
      version = commandTransform ? commandTransform(output) : output;

View on GitHub (pinned to e55ac299a4)