Skip to content

immich

Version 2026.144.1531
Repo superproject

Immich self-hosted photo and video management server on port 2283. Builds the Immich Node server from source with pnpm into /opt/immich/server, installs a PostgreSQL-aware startup wrapper and an idempotent DB-migration wrapper, and seeds Postgres with the vector / vchord / earthdistance extensions before serving the photo+video API on port 2283. Library, cache, import and external media live under ~/.immich. The behaviour is verifiable as the built server bundle, the installed wrappers, the image-codec toolchain, the seeded init SQL, and a live /api/server/ping response.

  • immich-db-init
  • immich-server

This candy’s plan: — the runnable spec charly check executes against a live deployment. check: steps are idempotent probes; run: steps change state.

Intent Step
run command=curl -fL –retry 3 –retry-delay 2 “https://github.com/immich-app/immich/archive/refs/tags/${IMMICH_VERSION}.tar.gz” | tar xz -C /tmp mv /tmp/immich-$(echo ${IMMICH_VERSION} | sed ‘s/^v//’) /tmp/immich
run command=cd /tmp/immich && npm_config_cache=/tmp/npm-root-cache pnpm install –frozen-lockfile cd /tmp/immich && npm_config_cache=/tmp/npm-root-cache pnpm –filter immich build cd /tmp/immich && npm_config_cache=/tmp/npm-root-cache pnpm –filter immich deploy –prod /opt/immich/server
run command=mkdir -p /build/geodata cd /build/geodata curl -fsSL –retry 3 –retry-delay 2 https://download.geonames.org/export/dump/admin1CodesASCII.txt -o admin1CodesASCII.txt curl -fsSL –retry 3 –retry-delay 2 https://download.geonames.org/export/dump/admin2Codes.txt -o admin2Codes.txt curl -fsSL –retry 3 –retry-delay 2 https://download.geonames.org/export/dump/cities500.zip -o cities500.zip && unzip -o cities500.zip && rm cities500.zip curl -fsSL –retry 3 –retry-delay 2 “https://raw.githubusercontent.com/nvkelso/natural-earth-vector/master/geojson/ne_10m_admin_0_countries.geojson” -o ne_10m_admin_0_countries.geojson date -I > geodata-date.txt echo ‘{}’ > /build/build-lock.json mkdir -p /build/corePlugin cp /tmp/immich/plugins/manifest.json /build/corePlugin/manifest.json
run command=cd /tmp/immich && npm_config_cache=/tmp/npm-root-cache pnpm –filter @immich/sdk –filter immich-web build cp -r /tmp/immich/web/build /build/www
run command=EXTISM_JS_VERSION=1.6.0 BINARYEN_VERSION=124 ARCH=$(uname -m) curl -sL “https://github.com/extism/js-pdk/releases/download/v${EXTISM_JS_VERSION}/extism-js-${ARCH}-linux-v${EXTISM_JS_VERSION}.gz” | gunzip > /usr/local/bin/extism-js chmod +x /usr/local/bin/extism-js curl -sL “https://github.com/WebAssembly/binaryen/releases/download/version_${BINARYEN_VERSION}/binaryen-version_${BINARYEN_VERSION}-${ARCH}-linux.tar.gz” | tar xz -C /tmp cp /tmp/binaryen-version_${BINARYEN_VERSION}/bin/* /usr/local/bin/ rm -rf /tmp/binaryen-version_${BINARYEN_VERSION} cd /tmp/immich/plugins npm_config_cache=/tmp/npm-root-cache pnpm install –frozen-lockfile npm_config_cache=/tmp/npm-root-cache pnpm run build mkdir -p /build/corePlugin/dist cp -r dist/* /build/corePlugin/dist/ rm -f /usr/local/bin/extism-js /usr/local/bin/wasm-opt /usr/local/bin/wasm-merge /usr/local/bin/wasm-as /usr/local/bin/wasm-dis /usr/local/bin/wasm-ctor-check /usr/local/bin/wasm-emscripten-finalize /usr/local/bin/wasm-metadce /usr/local/bin/wasm-reduce /usr/local/bin/wasm-shell /usr/local/bin/wasm-split /usr/local/bin/wasm2js
run command=rm -rf /tmp/immich
run write=/docker-entrypoint-initdb.d/01-immich-extensions.sql
run write=/usr/local/bin/immich-db-migrate.sh
run write=/usr/local/bin/immich-server-start.sh
run mkdir=${HOME}/.immich/library
run mkdir=${HOME}/.immich/cache
run mkdir=${HOME}/.immich/import
run mkdir=${HOME}/.immich/external
check the Immich Node server bundle is built into /opt/immich/server
check the PostgreSQL-aware server startup wrapper is installed and executable
check the idempotent DB-migration wrapper is installed and executable
check the libvips image-processing library is installed for thumbnailing and transcoding
check the Postgres init script seeds the pgvector extension Immich requires
check the running Immich API answers its health ping on port 2283
agent-check the web UI presents a usable first-run / login experience
check file=/docker-entrypoint-initdb.d/01-immich-extensions.sql
check file=${HOME}/.immich/library
check service=immich-server
check addr=127.0.0.1:${HOST_PORT:2283}
check http=http://127.0.0.1:${HOST_PORT:2283}/api/server/ping