immich-app/immich · critical

The extension version is , which means it is a nightly…

Error message

    The ${name} extension version is ${version}, which means it is a nightly release.

    Please run 'DROP EXTENSION IF EXISTS ${extension}' and switch to a release version.
    See https://docs.immich.app/guides/database-queries for how to query the database.

What it means

If either the available or installed version of the vector extension resolves to 0.0.0, Immich treats it as a nightly build, which has incompatible/unknown behavior. Startup aborts with instructions to drop the extension and switch to a release version.

Solutions

  1. Connect to the database and run: DROP EXTENSION IF EXISTS vectorchord (or the affected extension name), then install a stable release of the extension and restart Immich so it is recreated.
  2. Reinstall the extension from an official release tag (e.g. pgvector v0.8.0, VectorChord release) instead of nightly/master.
  3. Re-create the DB container from the official Immich Postgres image which ships release versions.

Example fix

-- psql
DROP EXTENSION IF EXISTS vectorchord CASCADE;
-- then restart Immich with a release-version extension installed
Defensive patterns

Strategy: validation

Validate before calling

const { rows } = await db.query("SELECT extversion FROM pg_extension WHERE extname IN ('vectorchord','vectors','pgvector')");
if (rows.some((r) => r.extversion === '0.0.0')) console.error('Nightly extension build detected; reinstall a release');

Try / catch

try {
  await server.start();
} catch (e) {
  if (/nightly release/.test(e.message)) {
    console.error('Drop the extension and reinstall from a stable release tag.');
  } else throw e;
}

Prevention

When it happens

Trigger: pgvector or VectorChord installed from a git nightly/master build that reports version 0.0.0; upgrading the extension from source without checking out a release tag.

Common situations: Building pgvector from the main branch; distro packages compiled from snapshot; leftover nightly extension after switching images.

Understand the failure class

Background: "value must be between 0 and 1" / "out of range" / "must not be negative" errors: fixing range-validation failures across open-source libraries — this error's family across 42 libraries.

Related errors


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

Appendix: source

Thrown at server/src/services/database.service.ts:79

    if (!current || !satisfies(current, postgresRange)) {
      throw new Error(
        `Invalid PostgreSQL version. Found ${version}, but needed ${postgresRange}. Please use a supported version.`,
      );
    }

    await this.databaseRepository.withLock(DatabaseLock.Migrations, async () => {
      const extension = await this.databaseRepository.getVectorExtension();
      const name = EXTENSION_NAMES[extension];
      const extensionRange = this.databaseRepository.getExtensionVersionRange(extension);

      const extensionVersions = await this.databaseRepository.getExtensionVersions(VECTOR_EXTENSIONS);
      const { installedVersion, availableVersion } = extensionVersions.find((v) => v.name === extension) ?? {};
      if (!availableVersion) {
        throw new Error(messages.notInstalled(name));
      }

      if ([availableVersion, installedVersion].some((version) => version && eq(version, '0.0.0'))) {
        throw new Error(messages.nightlyVersion({ name, extension, version: '0.0.0' }));
      }

      if (!satisfies(availableVersion, extensionRange)) {
        throw new Error(messages.outOfRange({ name, extension, version: availableVersion, range: extensionRange }));
      }

      if (!installedVersion) {
        await this.createExtension(extension);
      }

      if (installedVersion && gt(availableVersion, installedVersion)) {
        await this.updateExtension(extension, availableVersion);
      } else if (installedVersion && !satisfies(installedVersion, extensionRange)) {
        throw new Error(messages.outOfRange({ name, extension, version: installedVersion, range: extensionRange }));
      } else if (installedVersion && lt(availableVersion, installedVersion)) {
        throw new Error(messages.invalidDowngrade({ name, extension, availableVersion, installedVersion }));
      }

View on GitHub (pinned to e55ac299a4)