Skip to content

fix(server): update exiftool-vendored to v34 for more robust metadata extraction#24424

Merged
alextran1502 merged 1 commit intoimmich-app:mainfrom
skatsubo:fix/bump-exiftool
Dec 6, 2025
Merged

fix(server): update exiftool-vendored to v34 for more robust metadata extraction#24424
alextran1502 merged 1 commit intoimmich-app:mainfrom
skatsubo:fix/bump-exiftool

Conversation

@skatsubo
Copy link
Copy Markdown
Collaborator

@skatsubo skatsubo commented Dec 6, 2025

Description

Bump exiftool-vendored v33 -> v34 to fix spurious shutdown of exiftool workers upon encountering multiple timeouts.

Upstream ticket:

Fixes #23890
Fixes #24302

How Has This Been Tested?

Tested on an Immich instance with limited CPU, high concurrency, sample video from immich#17574:

  • on main: emits timeouts and "startup task failed", eventually BatchCluster gets shut down, then each metadata read fails due to "BatchCluster has ended"
  • this PR: emits timeouts, no "startup task failed", no BatchCluster shutdown, keeps metadata processing
  1. Deploy Immich
  immich-server:
    cpus: 1
    environment:
      - NODE_DEBUG=exiftool-vendored
      - IMMICH_LOG_LEVEL=debug
  1. Limit CPU: 1 core.
  2. Increase metadata extraction concurrency: 25.
  3. Add a new external library.
  4. In the external library make 100 copies of the video from immich#17574.
VIDEO='video-ee-immich#17574.mp4'
for i in $(seq -w 0 99) ; do
  cp "$VIDEO" "$i-$VIDEO"
done
  1. Scan the external library.
Log: main
  • Error: timeout: waited 20000ms
  • EXIFTOOL-VENDORED 8: BatchCluster.end() { gracefully: true }
  • Error: BatchCluster has ended, cannot enqueue
[Nest] 23  - 12/06/2025, 12:20:00 PM     LOG [Api:LibraryService~lqxvir8i] Starting to scan library 5bd66993-5c3f-4f15-abba-6c1621621b7e
[Nest] 23  - 12/06/2025, 12:20:00 PM   DEBUG [Api:LoggingInterceptor~lqxvir8i] POST /api/libraries/5bd66993-5c3f-4f15-abba-6c1621621b7e/scan 204 8.46ms ::ffff:192.168.117.1
[Nest] 8  - 12/06/2025, 12:20:00 PM   DEBUG [Microservices:LibraryService] Validating import paths for library 5bd66993-5c3f-4f15-abba-6c1621621b7e...
[Nest] 8  - 12/06/2025, 12:20:00 PM     LOG [Microservices:LibraryService] Starting disk crawl of 1 import path(s) for library 5bd66993-5c3f-4f15-abba-6c1621621b7e...
[Nest] 8  - 12/06/2025, 12:20:00 PM     LOG [Microservices:LibraryService] Library 5bd66993-5c3f-4f15-abba-6c1621621b7e is empty, no need to check assets
[Nest] 8  - 12/06/2025, 12:20:00 PM     LOG [Microservices:LibraryService] Crawled 102 file(s) so far: 102 of current batch of 102 will be imported to library 5bd66993-5c3f-4f15-abba-6c1621621b7e...
[Nest] 8  - 12/06/2025, 12:20:00 PM     LOG [Microservices:LibraryService] Finished disk crawl, 102 file(s) found on disk and queued 102 file(s) for import into 5bd66993-5c3f-4f15-abba-6c1621621b7e
[Nest] 8  - 12/06/2025, 12:20:00 PM     LOG [Microservices:LibraryService] Imported 102 (102 done so far) file(s) into library 5bd66993-5c3f-4f15-abba-6c1621621b7e
[Nest] 8  - 12/06/2025, 12:20:00 PM   DEBUG [Microservices:LibraryService] Queuing sidecar discovery for 102 asset(s)
[Nest] 8  - 12/06/2025, 12:20:00 PM   DEBUG [Microservices:MetadataService] Sidecar check found old=undefined, new=null will update  asset dbb5bb1a-fd54-46f4-ba6b-c198fe05c98c: /exiftool/00-video-ee-immich#17574.mp4
...
[Nest] 8  - 12/06/2025, 12:20:01 PM   DEBUG [Microservices:MetadataService] Sidecar check found old=undefined, new=null will update  asset 0126e8c8-70e0-47db-973d-e2c36f6acbfd: /exiftool/05-video-ee-immich#17574.mp4
EXIFTOOL-VENDORED 8: ProcessPoolManager.maybeSpawnProcs() started healthy child process { pid: 38 }
[Nest] 8  - 12/06/2025, 12:20:01 PM   DEBUG [Microservices:MetadataService] Sidecar check found old=undefined, new=null will update  asset 863e16a9-b2a4-4952-b5fa-b50baf640c00: /exiftool/07-video-ee-immich#17574.mp4
...
[Nest] 8  - 12/06/2025, 12:20:01 PM   DEBUG [Microservices:MetadataService] Sidecar check found old=undefined, new=null will update  asset 84b6eebc-0107-4165-a4ba-fc7b5f86ab64: /exiftool/video-ee-immich#17574.mp4
EXIFTOOL-VENDORED 8: ProcessPoolManager.maybeSpawnProcs() started healthy child process { pid: 64 }
[Nest] 8  - 12/06/2025, 12:20:02 PM   DEBUG [Microservices:MapRepository] Request: 35.685063,139.706478
[Nest] 8  - 12/06/2025, 12:20:03 PM   DEBUG [Microservices:MediaRepository] ffmpeg -n 10 /usr/bin/ffmpeg -skip_frame nointra -sws_flags accurate_rnd+full_chroma_int -i /exiftool/00-video-ee-immich#17574.mp4 -y -fps_mode vfr -frames:v 1 -update 1 -v verbose -vf fps=12:start_time=0:eof_action=pass:round=down,thumbnail=12,select=gt(scene\,0.1)-eq(prev_selected_n\,n)+isnan(prev_selected_n)+gt(n\,20),trim=end_frame=2,reverse /data/thumbs/7a18f962-7c77-4a35-a165-c8fbb4291e65/db/b5/dbb5bb1a-fd54-46f4-ba6b-c198fe05c98c-preview.jpeg
[Nest] 8  - 12/06/2025, 12:20:03 PM   DEBUG [Microservices:MediaRepository] ffmpeg -n 10 /usr/bin/ffmpeg -skip_frame nointra -sws_flags accurate_rnd+full_chroma_int -i /exiftool/00-video-ee-immich#17574.mp4 -y -fps_mode vfr -frames:v 1 -update 1 -v verbose -vf fps=12:start_time=0:eof_action=pass:round=down,thumbnail=12,select=gt(scene\,0.1)-eq(prev_selected_n\,n)+isnan(prev_selected_n)+gt(n\,20),trim=end_frame=2,reverse,scale=-2:250:flags=lanczos+accurate_rnd+full_chroma_int:out_range=pc /data/thumbs/7a18f962-7c77-4a35-a165-c8fbb4291e65/db/b5/dbb5bb1a-fd54-46f4-ba6b-c198fe05c98c-thumbnail.webp
EXIFTOOL-VENDORED 8: ProcessPoolManager.maybeSpawnProcs() started healthy child process { pid: 142 }
[Nest] 8  - 12/06/2025, 12:20:04 PM     LOG [Microservices:MediaService] Transcoding video dbb5bb1a-fd54-46f4-ba6b-c198fe05c98c without hardware acceleration
[Nest] 8  - 12/06/2025, 12:20:04 PM   DEBUG [Microservices:MediaRepository] ffmpeg -n 10 /usr/bin/ffmpeg -i /exiftool/00-video-ee-immich#17574.mp4 -y -c:v h264 -c:a copy -movflags faststart -fps_mode passthrough -map 0:0 -map_metadata -1 -v verbose -vf scale=-2:720 -preset ultrafast -crf 23 /data/encoded-video/7a18f962-7c77-4a35-a165-c8fbb4291e65/db/b5/dbb5bb1a-fd54-46f4-ba6b-c198fe05c98c.mp4
[Nest] 8  - 12/06/2025, 12:20:05 PM   DEBUG [Microservices:DuplicateService] Found 12 duplicates for asset dbb5bb1a-fd54-46f4-ba6b-c198fe05c98c
EXIFTOOL-VENDORED 8: ProcessPoolManager.maybeSpawnProcs() started healthy child process { pid: 191 }
[Nest] 8  - 12/06/2025, 12:20:05 PM   DEBUG [Microservices:PersonService] 0 faces detected in /data/thumbs/7a18f962-7c77-4a35-a165-c8fbb4291e65/db/b5/dbb5bb1a-fd54-46f4-ba6b-c198fe05c98c-preview.jpeg
[Nest] 8  - 12/06/2025, 12:20:05 PM   DEBUG [Microservices:OcrService] Processed 0 OCR result(s) for dbb5bb1a-fd54-46f4-ba6b-c198fe05c98c
[Nest] 8  - 12/06/2025, 12:20:06 PM   DEBUG [Microservices:MediaRepository] Transcoding 7.11% done, estimated 26s remaining for output dbb5bb1a-fd54-46f4-ba6b-c198fe05c98c.mp4
EXIFTOOL-VENDORED 8: ProcessPoolManager.maybeSpawnProcs() started healthy child process { pid: 192 }
[Nest] 8  - 12/06/2025, 12:20:08 PM   DEBUG [Microservices:MediaRepository] Transcoding 13.56% done, estimated 22s remaining for output dbb5bb1a-fd54-46f4-ba6b-c198fe05c98c.mp4
EXIFTOOL-VENDORED 8: ProcessPoolManager.maybeSpawnProcs() started healthy child process { pid: 193 }
[Nest] 8  - 12/06/2025, 12:20:09 PM   DEBUG [Microservices:MediaRepository] Transcoding 18.67% done, estimated 21s remaining for output dbb5bb1a-fd54-46f4-ba6b-c198fe05c98c.mp4
EXIFTOOL-VENDORED 8: ProcessPoolManager.maybeSpawnProcs() started healthy child process { pid: 194 }
[Nest] 8  - 12/06/2025, 12:20:11 PM   DEBUG [Microservices:MapRepository] Request: 35.685063,139.706478
EXIFTOOL-VENDORED 8: ProcessPoolManager.maybeSpawnProcs() started healthy child process { pid: 195 }
[Nest] 8  - 12/06/2025, 12:20:12 PM   DEBUG [Microservices:MediaRepository] Transcoding 24.67% done, estimated 22s remaining for output dbb5bb1a-fd54-46f4-ba6b-c198fe05c98c.mp4
[Nest] 8  - 12/06/2025, 12:20:13 PM   DEBUG [Microservices:MediaRepository] ffmpeg -n 10 /usr/bin/ffmpeg -skip_frame nointra -sws_flags accurate_rnd+full_chroma_int -i /exiftool/03-video-ee-immich#17574.mp4 -y -fps_mode vfr -frames:v 1 -update 1 -v verbose -vf fps=12:start_time=0:eof_action=pass:round=down,thumbnail=12,select=gt(scene\,0.1)-eq(prev_selected_n\,n)+isnan(prev_selected_n)+gt(n\,20),trim=end_frame=2,reverse /data/thumbs/7a18f962-7c77-4a35-a165-c8fbb4291e65/d2/00/d200d6c0-c605-4074-8122-bce449aa3a18-preview.jpeg
EXIFTOOL-VENDORED 8: ProcessPoolManager.maybeSpawnProcs() started healthy child process { pid: 200 }
[Nest] 8  - 12/06/2025, 12:20:14 PM   DEBUG [Microservices:MapRepository] Request: 35.685063,139.706478
EXIFTOOL-VENDORED 8: ProcessPoolManager.maybeSpawnProcs() started healthy child process { pid: 215 }
[Nest] 8  - 12/06/2025, 12:20:16 PM   DEBUG [Microservices:MediaRepository] ffmpeg -n 10 /usr/bin/ffmpeg -skip_frame nointra -sws_flags accurate_rnd+full_chroma_int -i /exiftool/01-video-ee-immich#17574.mp4 -y -fps_mode vfr -frames:v 1 -update 1 -v verbose -vf fps=12:start_time=0:eof_action=pass:round=down,thumbnail=12,select=gt(scene\,0.1)-eq(prev_selected_n\,n)+isnan(prev_selected_n)+gt(n\,20),trim=end_frame=2,reverse /data/thumbs/7a18f962-7c77-4a35-a165-c8fbb4291e65/d2/b2/d2b216c9-00b2-43f6-90b7-799c5d0481ec-preview.jpeg
EXIFTOOL-VENDORED 8: ProcessPoolManager.maybeSpawnProcs() started healthy child process { pid: 219 }
[Nest] 8  - 12/06/2025, 12:20:17 PM   DEBUG [Microservices:MediaRepository] Transcoding 29.78% done, estimated 28s remaining for output dbb5bb1a-fd54-46f4-ba6b-c198fe05c98c.mp4
EXIFTOOL-VENDORED 8: ProcessPoolManager.maybeSpawnProcs() started healthy child process { pid: 229 }
EXIFTOOL-VENDORED 8: ProcessPoolManager.maybeSpawnProcs() started healthy child process { pid: 234 }
EXIFTOOL-VENDORED 8: ProcessPoolManager.maybeSpawnProcs() started healthy child process { pid: 235 }
[Nest] 8  - 12/06/2025, 12:20:22 PM   DEBUG [Microservices:MapRepository] Request: 35.685063,139.706478
EXIFTOOL-VENDORED 8: ProcessPoolManager.maybeSpawnProcs() started healthy child process { pid: 238 }
[Nest] 8  - 12/06/2025, 12:20:23 PM   DEBUG [Microservices:MediaRepository] ffmpeg -n 10 /usr/bin/ffmpeg -skip_frame nointra -sws_flags accurate_rnd+full_chroma_int -i /exiftool/02-video-ee-immich#17574.mp4 -y -fps_mode vfr -frames:v 1 -update 1 -v verbose -vf fps=12:start_time=0:eof_action=pass:round=down,thumbnail=12,select=gt(scene\,0.1)-eq(prev_selected_n\,n)+isnan(prev_selected_n)+gt(n\,20),trim=end_frame=2,reverse /data/thumbs/7a18f962-7c77-4a35-a165-c8fbb4291e65/c3/f8/c3f8cde7-bcc9-4e28-824a-b769afd5a1f6-preview.jpeg
[Nest] 8  - 12/06/2025, 12:20:24 PM   DEBUG [Microservices:MapRepository] Request: 35.685063,139.706478
EXIFTOOL-VENDORED 8: ProcessPoolManager.maybeSpawnProcs() started healthy child process { pid: 241 }
[Nest] 8  - 12/06/2025, 12:20:26 PM   DEBUG [Microservices:MediaRepository] Transcoding 35.11% done, estimated 41s remaining for output dbb5bb1a-fd54-46f4-ba6b-c198fe05c98c.mp4
EXIFTOOL-VENDORED 8: ProcessPoolManager.maybeSpawnProcs() started healthy child process { pid: 243 }
BatchProcess(192).onError() {
  reason: 'timeout',
  task: '-json\n' +
    '-ee\n' +
    ...
    '/exiftool/05-video-ee-immich#17574.mp4\n' +
    '-ignoreMinorErrors\n' +
    '-execute\n',
  error: waited 20000ms
      at BatchProcess._BatchProcess_onTimeout (/usr/src/app/server/node_modules/.pnpm/batch-cluster@15.0.1/node_modules/batch-cluster/dist/BatchProcess.js:312:113)
      at Timeout._onTimeout (/usr/src/app/server/node_modules/.pnpm/batch-cluster@15.0.1/node_modules/batch-cluster/dist/BatchProcess.js:249:195)
      at listOnTimeout (node:internal/timers:588:17)
      at process.processTimers (node:internal/timers:523:7)
}
BatchProcess(192).onError(): startup task failed: Error: timeout: waited 20000ms
BatchCluster.onStartError(): Error: timeout: waited 20000ms
BatchProcess(192).terminate(): force-killing still-running child.
EXIFTOOL-VENDORED 8: ProcessPoolManager.maybeSpawnProcs() started healthy child process { pid: 244 }
BatchProcess(193).onError() {
  reason: 'timeout',
  task: '-json\n' +
    '-ee\n' +
    ...
    '/exiftool/06-video-ee-immich#17574.mp4\n' +
    '-ignoreMinorErrors\n' +
    '-execute\n',
  error: waited 20000ms
      at BatchProcess._BatchProcess_onTimeout (/usr/src/app/server/node_modules/.pnpm/batch-cluster@15.0.1/node_modules/batch-cluster/dist/BatchProcess.js:312:113)
      at Timeout._onTimeout (/usr/src/app/server/node_modules/.pnpm/batch-cluster@15.0.1/node_modules/batch-cluster/dist/BatchProcess.js:249:195)
      at listOnTimeout (node:internal/timers:588:17)
      at process.processTimers (node:internal/timers:523:7)
}
BatchProcess(193).onError(): startup task failed: Error: timeout: waited 20000ms
BatchCluster.onStartError(): Error: timeout: waited 20000ms
BatchProcess(193).terminate(): force-killing still-running child.
EXIFTOOL-VENDORED 8: ProcessPoolManager.maybeSpawnProcs() started healthy child process { pid: 258 }
BatchProcess(194).onError() {
  reason: 'timeout',
  task: '-json\n' +
    '-ee\n' +
    ...
    '/exiftool/07-video-ee-immich#17574.mp4\n' +
    '-ignoreMinorErrors\n' +
    '-execute\n',
  error: waited 20000ms
      at BatchProcess._BatchProcess_onTimeout (/usr/src/app/server/node_modules/.pnpm/batch-cluster@15.0.1/node_modules/batch-cluster/dist/BatchProcess.js:312:113)
      at Timeout._onTimeout (/usr/src/app/server/node_modules/.pnpm/batch-cluster@15.0.1/node_modules/batch-cluster/dist/BatchProcess.js:249:195)
      at listOnTimeout (node:internal/timers:588:17)
      at process.processTimers (node:internal/timers:523:7)
}
[Nest] 8  - 12/06/2025, 12:20:31 PM   DEBUG [Microservices:MapRepository] Request: 35.685063,139.706478
BatchProcess(194).onError(): startup task failed: Error: timeout: waited 20000ms
BatchCluster.onStartError(): Error: timeout: waited 20000ms
BatchProcess(194).terminate(): force-killing still-running child.
EXIFTOOL-VENDORED 8: ProcessPoolManager.maybeSpawnProcs() started healthy child process { pid: 259 }
[Nest] 8  - 12/06/2025, 12:20:32 PM   DEBUG [Microservices:MediaRepository] Transcoding 40.44% done, estimated 44s remaining for output dbb5bb1a-fd54-46f4-ba6b-c198fe05c98c.mp4
EXIFTOOL-VENDORED 8: ProcessPoolManager.maybeSpawnProcs() started healthy child process { pid: 261 }
BatchProcess(195).onError() {
  reason: 'timeout',
  task: '-json\n' +
    '-ee\n' +
    ...
    '/exiftool/10-video-ee-immich#17574.mp4\n' +
    '-ignoreMinorErrors\n' +
    '-execute\n',
  error: waited 20000ms
      at BatchProcess._BatchProcess_onTimeout (/usr/src/app/server/node_modules/.pnpm/batch-cluster@15.0.1/node_modules/batch-cluster/dist/BatchProcess.js:312:113)
      at Timeout._onTimeout (/usr/src/app/server/node_modules/.pnpm/batch-cluster@15.0.1/node_modules/batch-cluster/dist/BatchProcess.js:249:195)
      at listOnTimeout (node:internal/timers:588:17)
      at process.processTimers (node:internal/timers:523:7)
}
BatchProcess(195).onError(): startup task failed: Error: timeout: waited 20000ms
BatchCluster.onStartError(): Error: timeout: waited 20000ms
BatchProcess(195).terminate(): force-killing still-running child.
BatchProcess(38).onError() {
  reason: 'timeout',
  task: '-json\n' +
    '-ee\n' +
    ...
    '/exiftool/09-video-ee-immich#17574.mp4\n' +
    '-ignoreMinorErrors\n' +
    '-execute\n',
  error: waited 20000ms
      at BatchProcess._BatchProcess_onTimeout (/usr/src/app/server/node_modules/.pnpm/batch-cluster@15.0.1/node_modules/batch-cluster/dist/BatchProcess.js:312:113)
      at Timeout._onTimeout (/usr/src/app/server/node_modules/.pnpm/batch-cluster@15.0.1/node_modules/batch-cluster/dist/BatchProcess.js:249:195)
      at listOnTimeout (node:internal/timers:588:17)
      at process.processTimers (node:internal/timers:523:7)
}
BatchProcess(38).terminate(): force-killing still-running child.
BatchProcess(200).onError() {
  reason: 'timeout',
  task: '-json\n' +
    '-ee\n' +
    ...
    '/exiftool/14-video-ee-immich#17574.mp4\n' +
    '-ignoreMinorErrors\n' +
    '-execute\n',
  error: waited 20000ms
      at BatchProcess._BatchProcess_onTimeout (/usr/src/app/server/node_modules/.pnpm/batch-cluster@15.0.1/node_modules/batch-cluster/dist/BatchProcess.js:312:113)
      at Timeout._onTimeout (/usr/src/app/server/node_modules/.pnpm/batch-cluster@15.0.1/node_modules/batch-cluster/dist/BatchProcess.js:249:195)
      at listOnTimeout (node:internal/timers:588:17)
      at process.processTimers (node:internal/timers:523:7)
}
BatchProcess(200).onError(): startup task failed: Error: timeout: waited 20000ms
BatchCluster.onStartError(): Error: timeout: waited 20000ms
BatchProcess(200).terminate(): force-killing still-running child.
EXIFTOOL-VENDORED 8: ProcessPoolManager.maybeSpawnProcs() started healthy child process { pid: 262 }
EXIFTOOL-VENDORED 8: ProcessPoolManager.maybeSpawnProcs() started healthy child process { pid: 276 }
BatchProcess(215).onError() {
  reason: 'timeout',
  task: '-json\n' +
    '-ee\n' +
    ...
    '/exiftool/12-video-ee-immich#17574.mp4\n' +
    '-ignoreMinorErrors\n' +
    '-execute\n',
  error: waited 20000ms
      at BatchProcess._BatchProcess_onTimeout (/usr/src/app/server/node_modules/.pnpm/batch-cluster@15.0.1/node_modules/batch-cluster/dist/BatchProcess.js:312:113)
      at Timeout._onTimeout (/usr/src/app/server/node_modules/.pnpm/batch-cluster@15.0.1/node_modules/batch-cluster/dist/BatchProcess.js:249:195)
      at listOnTimeout (node:internal/timers:588:17)
      at process.processTimers (node:internal/timers:523:7)
}
BatchProcess(215).onError(): startup task failed: Error: timeout: waited 20000ms
BatchCluster.onStartError(): Error: timeout: waited 20000ms
BatchProcess(215).terminate(): force-killing still-running child.
EXIFTOOL-VENDORED 8: ProcessPoolManager.maybeSpawnProcs() started healthy child process { pid: 280 }
BatchProcess(219).onError() {
  reason: 'timeout',
  task: '-json\n' +
    '-ee\n' +
    ...
    '/exiftool/11-video-ee-immich#17574.mp4\n' +
    '-ignoreMinorErrors\n' +
    '-execute\n',
  error: waited 20000ms
      at BatchProcess._BatchProcess_onTimeout (/usr/src/app/server/node_modules/.pnpm/batch-cluster@15.0.1/node_modules/batch-cluster/dist/BatchProcess.js:312:113)
      at Timeout._onTimeout (/usr/src/app/server/node_modules/.pnpm/batch-cluster@15.0.1/node_modules/batch-cluster/dist/BatchProcess.js:249:195)
      at listOnTimeout (node:internal/timers:588:17)
      at process.processTimers (node:internal/timers:523:7)
}
BatchProcess(219).onError(): startup task failed: Error: timeout: waited 20000ms
BatchCluster.onStartError(): Error: timeout: waited 20000ms
BatchProcess(219).terminate(): force-killing still-running child.
EXIFTOOL-VENDORED 8: ProcessPoolManager.maybeSpawnProcs() started healthy child process { pid: 282 }
BatchProcess(229).onError() {
  reason: 'timeout',
  task: '-json\n' +
    '-ee\n' +
    ...
    '/exiftool/13-video-ee-immich#17574.mp4\n' +
    '-ignoreMinorErrors\n' +
    '-execute\n',
  error: waited 20000ms
      at BatchProcess._BatchProcess_onTimeout (/usr/src/app/server/node_modules/.pnpm/batch-cluster@15.0.1/node_modules/batch-cluster/dist/BatchProcess.js:312:113)
      at Timeout._onTimeout (/usr/src/app/server/node_modules/.pnpm/batch-cluster@15.0.1/node_modules/batch-cluster/dist/BatchProcess.js:249:195)
      at listOnTimeout (node:internal/timers:588:17)
      at process.processTimers (node:internal/timers:523:7)
}
BatchProcess(229).onError(): startup task failed: Error: timeout: waited 20000ms
BatchCluster.onStartError(): Error: timeout: waited 20000ms
BatchProcess(229).terminate(): force-killing still-running child.
EXIFTOOL-VENDORED 8: ProcessPoolManager.maybeSpawnProcs() started healthy child process { pid: 283 }
BatchProcess(234).onError() {
  reason: 'timeout',
  task: '-json\n' +
    '-ee\n' +
    ...
    '/exiftool/15-video-ee-immich#17574.mp4\n' +
    '-ignoreMinorErrors\n' +
    '-execute\n',
  error: waited 20000ms
      at BatchProcess._BatchProcess_onTimeout (/usr/src/app/server/node_modules/.pnpm/batch-cluster@15.0.1/node_modules/batch-cluster/dist/BatchProcess.js:312:113)
      at Timeout._onTimeout (/usr/src/app/server/node_modules/.pnpm/batch-cluster@15.0.1/node_modules/batch-cluster/dist/BatchProcess.js:249:195)
      at listOnTimeout (node:internal/timers:588:17)
      at process.processTimers (node:internal/timers:523:7)
}
BatchProcess(234).onError(): startup task failed: Error: timeout: waited 20000ms
BatchCluster.onStartError(): Error: timeout: waited 20000ms
BatchProcess(234).terminate(): force-killing still-running child.
BatchProcess(142).onError() {
  reason: 'timeout',
  task: '-json\n' +
    '-ee\n' +
    ...
    '/exiftool/16-video-ee-immich#17574.mp4\n' +
    '-ignoreMinorErrors\n' +
    '-execute\n',
  error: waited 20000ms
      at BatchProcess._BatchProcess_onTimeout (/usr/src/app/server/node_modules/.pnpm/batch-cluster@15.0.1/node_modules/batch-cluster/dist/BatchProcess.js:312:113)
      at Timeout._onTimeout (/usr/src/app/server/node_modules/.pnpm/batch-cluster@15.0.1/node_modules/batch-cluster/dist/BatchProcess.js:249:195)
      at listOnTimeout (node:internal/timers:588:17)
      at process.processTimers (node:internal/timers:523:7)
}
BatchProcess(142).terminate(): force-killing still-running child.
BatchProcess(235).onError() {
  reason: 'timeout',
  task: '-json\n' +
    '-ee\n' +
    ...
    '/exiftool/18-video-ee-immich#17574.mp4\n' +
    '-ignoreMinorErrors\n' +
    '-execute\n',
  error: waited 20000ms
      at BatchProcess._BatchProcess_onTimeout (/usr/src/app/server/node_modules/.pnpm/batch-cluster@15.0.1/node_modules/batch-cluster/dist/BatchProcess.js:312:113)
      at Timeout._onTimeout (/usr/src/app/server/node_modules/.pnpm/batch-cluster@15.0.1/node_modules/batch-cluster/dist/BatchProcess.js:249:195)
      at listOnTimeout (node:internal/timers:588:17)
      at process.processTimers (node:internal/timers:523:7)
}
BatchProcess(235).onError(): startup task failed: Error: timeout: waited 20000ms
BatchCluster.onStartError(): Error: timeout: waited 20000ms
BatchProcess(235).terminate(): force-killing still-running child.
EXIFTOOL-VENDORED 8: ProcessPoolManager.maybeSpawnProcs() started healthy child process { pid: 284 }
BatchProcess(191).onError() {
  reason: 'timeout',
  task: '-json\n' +
    '-ee\n' +
    ...
    '/exiftool/20-video-ee-immich#17574.mp4\n' +
    '-ignoreMinorErrors\n' +
    '-execute\n',
  error: waited 20000ms
      at BatchProcess._BatchProcess_onTimeout (/usr/src/app/server/node_modules/.pnpm/batch-cluster@15.0.1/node_modules/batch-cluster/dist/BatchProcess.js:312:113)
      at Timeout._onTimeout (/usr/src/app/server/node_modules/.pnpm/batch-cluster@15.0.1/node_modules/batch-cluster/dist/BatchProcess.js:249:195)
      at listOnTimeout (node:internal/timers:588:17)
      at process.processTimers (node:internal/timers:523:7)
}
BatchProcess(191).terminate(): force-killing still-running child.
EXIFTOOL-VENDORED 8: ProcessPoolManager.maybeSpawnProcs() started healthy child process { pid: 285 }
[Nest] 8  - 12/06/2025, 12:20:45 PM    WARN [Microservices:MetadataRepository] Error reading exif data (/exiftool/17-video-ee-immich#17574.mp4): Error: BatchCluster has ended, cannot enqueue -json
-ee
...
/exiftool/17-video-ee-immich#17574.mp4
-ignoreMinorErrors
-execute

Error: BatchCluster has ended, cannot enqueue -json
-ee
...
/exiftool/17-video-ee-immich#17574.mp4
-ignoreMinorErrors
-execute

    at BatchCluster.enqueueTask (/usr/src/app/server/node_modules/.pnpm/batch-cluster@15.0.1/node_modules/batch-cluster/dist/BatchCluster.js:150:25)
    at f (/usr/src/app/server/node_modules/.pnpm/exiftool-vendored@33.5.0/node_modules/exiftool-vendored/dist/ExifTool.js:458:38)
    at async g (/usr/src/app/server/node_modules/.pnpm/exiftool-vendored@33.5.0/node_modules/exiftool-vendored/dist/AsyncRetry.js:8:20)
BatchProcess(238).onError() {
  reason: 'timeout',
  task: '-json\n' +
    '-ee\n' +
    ...
    '/exiftool/17-video-ee-immich#17574.mp4\n' +
    '-ignoreMinorErrors\n' +
    '-execute\n',
  error: waited 20000ms
      at BatchProcess._BatchProcess_onTimeout (/usr/src/app/server/node_modules/.pnpm/batch-cluster@15.0.1/node_modules/batch-cluster/dist/BatchProcess.js:312:113)
      at Timeout._onTimeout (/usr/src/app/server/node_modules/.pnpm/batch-cluster@15.0.1/node_modules/batch-cluster/dist/BatchProcess.js:249:195)
      at listOnTimeout (node:internal/timers:588:17)
      at process.processTimers (node:internal/timers:523:7)
}
BatchProcess(238).onError(): startup task failed: Error: timeout: waited 20000ms
BatchCluster.onStartError(): Error: timeout: waited 20000ms

EXIFTOOL-VENDORED 8: BatchCluster.end() { gracefully: true }

BatchProcess(238).terminate(): force-killing still-running child.
[Nest] 8  - 12/06/2025, 12:20:45 PM   DEBUG [Microservices:MetadataService] No timezone information found for asset b80e6796-c5d8-402c-912c-9052c75725e7: /exiftool/17-video-ee-immich#17574.mp4
[Nest] 8  - 12/06/2025, 12:20:45 PM   DEBUG [Microservices:MetadataService] No exif date time found, falling back on 2025-12-06T11:39:41.170+00:00, earliest of file creation and modification for asset b80e6796-c5d8-402c-912c-9052c75725e7: /exiftool/17-video-ee-immich#17574.mp4
[Nest] 8  - 12/06/2025, 12:20:45 PM   DEBUG [Microservices:MediaRepository] Transcoding 45.56% done, estimated 49s remaining for output dbb5bb1a-fd54-46f4-ba6b-c198fe05c98c.mp4
[Nest] 8  - 12/06/2025, 12:20:46 PM    WARN [Microservices:MetadataRepository] Error reading exif data (/exiftool/30-video-ee-immich#17574.mp4): Error: BatchCluster has ended, cannot enqueue -json
-ee
...
/exiftool/30-video-ee-immich#17574.mp4
-ignoreMinorErrors
-execute

Error: BatchCluster has ended, cannot enqueue -json
-ee
...
/exiftool/30-video-ee-immich#17574.mp4
-ignoreMinorErrors
-execute

    at BatchCluster.enqueueTask (/usr/src/app/server/node_modules/.pnpm/batch-cluster@15.0.1/node_modules/batch-cluster/dist/BatchCluster.js:150:25)
    at f (/usr/src/app/server/node_modules/.pnpm/exiftool-vendored@33.5.0/node_modules/exiftool-vendored/dist/ExifTool.js:458:38)
    at process.processTicksAndRejections (node:internal/process/task_queues:105:5)
    at async g (/usr/src/app/server/node_modules/.pnpm/exiftool-vendored@33.5.0/node_modules/exiftool-vendored/dist/AsyncRetry.js:8:20)
Log: this PR
  • Error: timeout: waited 30000ms
  • No other issues
[Nest] 22  - 12/06/2025, 12:26:01 PM     LOG [Api:LibraryService~n9r3gs2s] Starting to scan library 97d84a49-4aab-4426-b0bd-5e760f25063f
[Nest] 22  - 12/06/2025, 12:26:01 PM   DEBUG [Api:LoggingInterceptor~n9r3gs2s] POST /api/libraries/97d84a49-4aab-4426-b0bd-5e760f25063f/scan 204 17.69ms ::ffff:192.168.117.1
[Nest] 7  - 12/06/2025, 12:26:01 PM   DEBUG [Microservices:LibraryService] Validating import paths for library 97d84a49-4aab-4426-b0bd-5e760f25063f...
[Nest] 7  - 12/06/2025, 12:26:01 PM     LOG [Microservices:LibraryService] Starting disk crawl of 1 import path(s) for library 97d84a49-4aab-4426-b0bd-5e760f25063f...
[Nest] 7  - 12/06/2025, 12:26:01 PM     LOG [Microservices:LibraryService] Crawled 102 file(s) so far: 102 of current batch of 102 will be imported to library 97d84a49-4aab-4426-b0bd-5e760f25063f...
[Nest] 7  - 12/06/2025, 12:26:01 PM     LOG [Microservices:LibraryService] Finished disk crawl, 102 file(s) found on disk and queued 102 file(s) for import into 97d84a49-4aab-4426-b0bd-5e760f25063f
[Nest] 7  - 12/06/2025, 12:26:01 PM     LOG [Microservices:LibraryService] Library 97d84a49-4aab-4426-b0bd-5e760f25063f is empty, no need to check assets
[Nest] 7  - 12/06/2025, 12:26:01 PM     LOG [Microservices:LibraryService] Imported 102 (102 done so far) file(s) into library 97d84a49-4aab-4426-b0bd-5e760f25063f
[Nest] 7  - 12/06/2025, 12:26:01 PM   DEBUG [Microservices:LibraryService] Queuing sidecar discovery for 102 asset(s)
[Nest] 7  - 12/06/2025, 12:26:01 PM   DEBUG [Microservices:MetadataService] Sidecar check found old=undefined, new=null will update  asset b400d985-cf8f-40bb-aff5-7b3d707c8bb1: /exiftool/01-video-ee-immich#17574.mp4
...
[Nest] 7  - 12/06/2025, 12:26:01 PM   DEBUG [Microservices:MetadataService] Sidecar check found old=undefined, new=null will update  asset 7793f013-679e-4215-95fe-6e6eb86b03dd: /exiftool/06-video-ee-immich#17574.mp4
EXIFTOOL-VENDORED 7: ProcessPoolManager.maybeSpawnProcs() started healthy child process { pid: 37 }
[Nest] 7  - 12/06/2025, 12:26:01 PM   DEBUG [Microservices:MetadataService] Sidecar check found old=undefined, new=null will update  asset 58a70b62-9da9-4863-93a4-ba64c816bb64: /exiftool/05-video-ee-immich#17574.mp4
...
[Nest] 7  - 12/06/2025, 12:26:02 PM   DEBUG [Microservices:MetadataService] Sidecar check found old=undefined, new=null will update  asset 66dc0ddb-94c0-4399-88f1-3687012928bb: /exiftool/video-ee-immich#17574.mp4
EXIFTOOL-VENDORED 7: ProcessPoolManager.maybeSpawnProcs() started healthy child process { pid: 63 }
[Nest] 7  - 12/06/2025, 12:26:04 PM   DEBUG [Microservices:MapRepository] Request: 35.685063,139.706478
[Nest] 7  - 12/06/2025, 12:26:04 PM   DEBUG [Microservices:MediaRepository] ffmpeg -n 10 /usr/bin/ffmpeg -skip_frame nointra -sws_flags accurate_rnd+full_chroma_int -i /exiftool/01-video-ee-immich#17574.mp4 -y -fps_mode vfr -frames:v 1 -update 1 -v verbose -vf fps=12:start_time=0:eof_action=pass:round=down,thumbnail=12,select=gt(scene\,0.1)-eq(prev_selected_n\,n)+isnan(prev_selected_n)+gt(n\,20),trim=end_frame=2,reverse /data/thumbs/7a18f962-7c77-4a35-a165-c8fbb4291e65/b4/00/b400d985-cf8f-40bb-aff5-7b3d707c8bb1-preview.jpeg
EXIFTOOL-VENDORED 7: ProcessPoolManager.maybeSpawnProcs() started healthy child process { pid: 83 }
[Nest] 7  - 12/06/2025, 12:26:04 PM   DEBUG [Microservices:MediaRepository] ffmpeg -n 10 /usr/bin/ffmpeg -skip_frame nointra -sws_flags accurate_rnd+full_chroma_int -i /exiftool/01-video-ee-immich#17574.mp4 -y -fps_mode vfr -frames:v 1 -update 1 -v verbose -vf fps=12:start_time=0:eof_action=pass:round=down,thumbnail=12,select=gt(scene\,0.1)-eq(prev_selected_n\,n)+isnan(prev_selected_n)+gt(n\,20),trim=end_frame=2,reverse,scale=-2:250:flags=lanczos+accurate_rnd+full_chroma_int:out_range=pc /data/thumbs/7a18f962-7c77-4a35-a165-c8fbb4291e65/b4/00/b400d985-cf8f-40bb-aff5-7b3d707c8bb1-thumbnail.webp
[Nest] 7  - 12/06/2025, 12:26:06 PM     LOG [Microservices:MediaService] Transcoding video b400d985-cf8f-40bb-aff5-7b3d707c8bb1 without hardware acceleration
EXIFTOOL-VENDORED 7: ProcessPoolManager.maybeSpawnProcs() started healthy child process { pid: 144 }
[Nest] 7  - 12/06/2025, 12:26:06 PM   DEBUG [Microservices:MediaRepository] ffmpeg -n 10 /usr/bin/ffmpeg -i /exiftool/01-video-ee-immich#17574.mp4 -y -c:v h264 -c:a copy -movflags faststart -fps_mode passthrough -map 0:0 -map_metadata -1 -v verbose -vf scale=-2:720 -preset ultrafast -crf 23 /data/encoded-video/7a18f962-7c77-4a35-a165-c8fbb4291e65/b4/00/b400d985-cf8f-40bb-aff5-7b3d707c8bb1.mp4
[Nest] 7  - 12/06/2025, 12:26:06 PM   DEBUG [Microservices:PersonService] 0 faces detected in /data/thumbs/7a18f962-7c77-4a35-a165-c8fbb4291e65/b4/00/b400d985-cf8f-40bb-aff5-7b3d707c8bb1-preview.jpeg
[Nest] 7  - 12/06/2025, 12:26:06 PM   DEBUG [Microservices:DuplicateService] Found 12 duplicates for asset b400d985-cf8f-40bb-aff5-7b3d707c8bb1
[Nest] 7  - 12/06/2025, 12:26:07 PM   DEBUG [Microservices:OcrService] Processed 0 OCR result(s) for b400d985-cf8f-40bb-aff5-7b3d707c8bb1
EXIFTOOL-VENDORED 7: ProcessPoolManager.maybeSpawnProcs() started healthy child process { pid: 191 }
[Nest] 7  - 12/06/2025, 12:26:08 PM   DEBUG [Microservices:MediaRepository] Transcoding 5.78% done, estimated 32s remaining for output b400d985-cf8f-40bb-aff5-7b3d707c8bb1.mp4
[Nest] 7  - 12/06/2025, 12:26:08 PM   DEBUG [Microservices:MapRepository] Request: 35.685063,139.706478
EXIFTOOL-VENDORED 7: ProcessPoolManager.maybeSpawnProcs() started healthy child process { pid: 192 }
[Nest] 7  - 12/06/2025, 12:26:09 PM   DEBUG [Microservices:MediaRepository] Transcoding 11.78% done, estimated 28s remaining for output b400d985-cf8f-40bb-aff5-7b3d707c8bb1.mp4
[Nest] 7  - 12/06/2025, 12:26:10 PM   DEBUG [Microservices:MediaRepository] ffmpeg -n 10 /usr/bin/ffmpeg -skip_frame nointra -sws_flags accurate_rnd+full_chroma_int -i /exiftool/00-video-ee-immich#17574.mp4 -y -fps_mode vfr -frames:v 1 -update 1 -v verbose -vf fps=12:start_time=0:eof_action=pass:round=down,thumbnail=12,select=gt(scene\,0.1)-eq(prev_selected_n\,n)+isnan(prev_selected_n)+gt(n\,20),trim=end_frame=2,reverse /data/thumbs/7a18f962-7c77-4a35-a165-c8fbb4291e65/55/c9/55c912dd-21c5-447a-8e4f-bec5cfd0f696-preview.jpeg
EXIFTOOL-VENDORED 7: ProcessPoolManager.maybeSpawnProcs() started healthy child process { pid: 210 }
EXIFTOOL-VENDORED 7: ProcessPoolManager.maybeSpawnProcs() started healthy child process { pid: 211 }
[Nest] 7  - 12/06/2025, 12:26:12 PM   DEBUG [Microservices:MediaRepository] Transcoding 17.33% done, estimated 31s remaining for output b400d985-cf8f-40bb-aff5-7b3d707c8bb1.mp4
EXIFTOOL-VENDORED 7: ProcessPoolManager.maybeSpawnProcs() started healthy child process { pid: 212 }
[Nest] 7  - 12/06/2025, 12:26:14 PM   DEBUG [Microservices:MapRepository] Request: 35.685063,139.706478
EXIFTOOL-VENDORED 7: ProcessPoolManager.maybeSpawnProcs() started healthy child process { pid: 214 }
[Nest] 7  - 12/06/2025, 12:26:16 PM   DEBUG [Microservices:MediaRepository] ffmpeg -n 10 /usr/bin/ffmpeg -skip_frame nointra -sws_flags accurate_rnd+full_chroma_int -i /exiftool/06-video-ee-immich#17574.mp4 -y -fps_mode vfr -frames:v 1 -update 1 -v verbose -vf fps=12:start_time=0:eof_action=pass:round=down,thumbnail=12,select=gt(scene\,0.1)-eq(prev_selected_n\,n)+isnan(prev_selected_n)+gt(n\,20),trim=end_frame=2,reverse /data/thumbs/7a18f962-7c77-4a35-a165-c8fbb4291e65/77/93/7793f013-679e-4215-95fe-6e6eb86b03dd-preview.jpeg
EXIFTOOL-VENDORED 7: ProcessPoolManager.maybeSpawnProcs() started healthy child process { pid: 227 }
[Nest] 7  - 12/06/2025, 12:26:17 PM   DEBUG [Microservices:MediaRepository] Transcoding 22.44% done, estimated 38s remaining for output b400d985-cf8f-40bb-aff5-7b3d707c8bb1.mp4
EXIFTOOL-VENDORED 7: ProcessPoolManager.maybeSpawnProcs() started healthy child process { pid: 249 }
[Nest] 7  - 12/06/2025, 12:26:19 PM   DEBUG [Microservices:MapRepository] Request: 35.685063,139.706478
EXIFTOOL-VENDORED 7: ProcessPoolManager.maybeSpawnProcs() started healthy child process { pid: 251 }
[Nest] 7  - 12/06/2025, 12:26:21 PM   DEBUG [Microservices:MediaRepository] ffmpeg -n 10 /usr/bin/ffmpeg -skip_frame nointra -sws_flags accurate_rnd+full_chroma_int -i /exiftool/00-video-ee-immich#17574.mp4 -y -fps_mode vfr -frames:v 1 -update 1 -v verbose -vf fps=12:start_time=0:eof_action=pass:round=down,thumbnail=12,select=gt(scene\,0.1)-eq(prev_selected_n\,n)+isnan(prev_selected_n)+gt(n\,20),trim=end_frame=2,reverse,scale=-2:250:flags=lanczos+accurate_rnd+full_chroma_int:out_range=pc /data/thumbs/7a18f962-7c77-4a35-a165-c8fbb4291e65/55/c9/55c912dd-21c5-447a-8e4f-bec5cfd0f696-thumbnail.webp
[Nest] 7  - 12/06/2025, 12:26:21 PM   DEBUG [Microservices:MediaRepository] ffmpeg -n 10 /usr/bin/ffmpeg -skip_frame nointra -sws_flags accurate_rnd+full_chroma_int -i /exiftool/03-video-ee-immich#17574.mp4 -y -fps_mode vfr -frames:v 1 -update 1 -v verbose -vf fps=12:start_time=0:eof_action=pass:round=down,thumbnail=12,select=gt(scene\,0.1)-eq(prev_selected_n\,n)+isnan(prev_selected_n)+gt(n\,20),trim=end_frame=2,reverse /data/thumbs/7a18f962-7c77-4a35-a165-c8fbb4291e65/f0/36/f03644df-02ba-412d-807b-a18d5adb2300-preview.jpeg
EXIFTOOL-VENDORED 7: ProcessPoolManager.maybeSpawnProcs() started healthy child process { pid: 257 }
EXIFTOOL-VENDORED 7: ProcessPoolManager.maybeSpawnProcs() started healthy child process { pid: 276 }
EXIFTOOL-VENDORED 7: ProcessPoolManager.maybeSpawnProcs() started healthy child process { pid: 285 }
[Nest] 7  - 12/06/2025, 12:26:25 PM   DEBUG [Microservices:MediaRepository] Transcoding 27.56% done, estimated 54s remaining for output b400d985-cf8f-40bb-aff5-7b3d707c8bb1.mp4
[Nest] 7  - 12/06/2025, 12:26:26 PM   DEBUG [Microservices:MapRepository] Request: 35.685063,139.706478
EXIFTOOL-VENDORED 7: ProcessPoolManager.maybeSpawnProcs() started healthy child process { pid: 287 }
EXIFTOOL-VENDORED 7: ProcessPoolManager.maybeSpawnProcs() started healthy child process { pid: 288 }
EXIFTOOL-VENDORED 7: ProcessPoolManager.maybeSpawnProcs() started healthy child process { pid: 289 }
[Nest] 7  - 12/06/2025, 12:26:31 PM   DEBUG [Microservices:MapRepository] Request: 35.685063,139.706478
EXIFTOOL-VENDORED 7: ProcessPoolManager.maybeSpawnProcs() started healthy child process { pid: 306 }
[Nest] 7  - 12/06/2025, 12:26:34 PM   DEBUG [Microservices:MapRepository] Request: 35.685063,139.706478
EXIFTOOL-VENDORED 7: ProcessPoolManager.maybeSpawnProcs() started healthy child process { pid: 308 }
EXIFTOOL-VENDORED 7: ProcessPoolManager.maybeSpawnProcs() started healthy child process { pid: 310 }
EXIFTOOL-VENDORED 7: ProcessPoolManager.maybeSpawnProcs() started healthy child process { pid: 312 }
EXIFTOOL-VENDORED 7: ProcessPoolManager.maybeSpawnProcs() started healthy child process { pid: 323 }
BatchProcess(192).onError() {
  reason: 'timeout',
  task: '-json\n' +
    '-ee\n' +
    ...
    '/exiftool/07-video-ee-immich#17574.mp4\n' +
    '-ignoreMinorErrors\n' +
    '-execute\n',
  error: waited 30000ms
      at #onTimeout (/usr/src/app/server/node_modules/.pnpm/batch-cluster@16.0.0/node_modules/batch-cluster/dist/BatchProcess.js:309:38)
      at Timeout._onTimeout (/usr/src/app/server/node_modules/.pnpm/batch-cluster@16.0.0/node_modules/batch-cluster/dist/BatchProcess.js:230:94)
      at listOnTimeout (node:internal/timers:588:17)
      at process.processTimers (node:internal/timers:523:7)
}
BatchProcess(192).terminate(): force-killing still-running child.
[Nest] 7  - 12/06/2025, 12:26:41 PM   DEBUG [Microservices:MapRepository] Request: 35.685063,139.706478
EXIFTOOL-VENDORED 7: ProcessPoolManager.maybeSpawnProcs() started healthy child process { pid: 339 }
BatchProcess(210).onError() {
  reason: 'timeout',
  task: '-json\n' +
    '-ee\n' +
    ...
    '/exiftool/05-video-ee-immich#17574.mp4\n' +
    '-ignoreMinorErrors\n' +
    '-execute\n',
  error: waited 30000ms
      at #onTimeout (/usr/src/app/server/node_modules/.pnpm/batch-cluster@16.0.0/node_modules/batch-cluster/dist/BatchProcess.js:309:38)
      at Timeout._onTimeout (/usr/src/app/server/node_modules/.pnpm/batch-cluster@16.0.0/node_modules/batch-cluster/dist/BatchProcess.js:230:94)
      at listOnTimeout (node:internal/timers:588:17)
      at process.processTimers (node:internal/timers:523:7)
}
BatchProcess(210).terminate(): force-killing still-running child.
[Nest] 7  - 12/06/2025, 12:26:42 PM   DEBUG [Microservices:MediaRepository] Transcoding 32.67% done, estimated 1m, 15s remaining for output b400d985-cf8f-40bb-aff5-7b3d707c8bb1.mp4
[Nest] 7  - 12/06/2025, 12:26:42 PM   DEBUG [Microservices:MediaRepository] ffmpeg -n 10 /usr/bin/ffmpeg -skip_frame nointra -sws_flags accurate_rnd+full_chroma_int -i /exiftool/06-video-ee-immich#17574.mp4 -y -fps_mode vfr -frames:v 1 -update 1 -v verbose -vf fps=12:start_time=0:eof_action=pass:round=down,thumbnail=12,select=gt(scene\,0.1)-eq(prev_selected_n\,n)+isnan(prev_selected_n)+gt(n\,20),trim=end_frame=2,reverse,scale=-2:250:flags=lanczos+accurate_rnd+full_chroma_int:out_range=pc /data/thumbs/7a18f962-7c77-4a35-a165-c8fbb4291e65/77/93/7793f013-679e-4215-95fe-6e6eb86b03dd-thumbnail.webp
EXIFTOOL-VENDORED 7: ProcessPoolManager.maybeSpawnProcs() started healthy child process { pid: 350 }
BatchProcess(211).onError() {
  reason: 'timeout',
  task: '-json\n' +
    '-ee\n' +
    ...
    '/exiftool/09-video-ee-immich#17574.mp4\n' +
    '-ignoreMinorErrors\n' +
    '-execute\n',
  error: waited 30000ms
      at #onTimeout (/usr/src/app/server/node_modules/.pnpm/batch-cluster@16.0.0/node_modules/batch-cluster/dist/BatchProcess.js:309:38)
      at Timeout._onTimeout (/usr/src/app/server/node_modules/.pnpm/batch-cluster@16.0.0/node_modules/batch-cluster/dist/BatchProcess.js:230:94)
      at listOnTimeout (node:internal/timers:588:17)
      at process.processTimers (node:internal/timers:523:7)
}
BatchProcess(211).terminate(): force-killing still-running child.
EXIFTOOL-VENDORED 7: ProcessPoolManager.maybeSpawnProcs() started healthy child process { pid: 351 }
BatchProcess(212).onError() {
  reason: 'timeout',
  task: '-json\n' +
    '-ee\n' +
    ...
    '/exiftool/12-video-ee-immich#17574.mp4\n' +
    '-ignoreMinorErrors\n' +
    '-execute\n',
  error: waited 30000ms
      at #onTimeout (/usr/src/app/server/node_modules/.pnpm/batch-cluster@16.0.0/node_modules/batch-cluster/dist/BatchProcess.js:309:38)
      at Timeout._onTimeout (/usr/src/app/server/node_modules/.pnpm/batch-cluster@16.0.0/node_modules/batch-cluster/dist/BatchProcess.js:230:94)
      at listOnTimeout (node:internal/timers:588:17)
      at process.processTimers (node:internal/timers:523:7)
}
BatchProcess(212).terminate(): force-killing still-running child.
EXIFTOOL-VENDORED 7: ProcessPoolManager.maybeSpawnProcs() started healthy child process { pid: 368 }
BatchProcess(214).onError() {
  reason: 'timeout',
  task: '-json\n' +
    '-ee\n' +
    ...
    '/exiftool/11-video-ee-immich#17574.mp4\n' +
    '-ignoreMinorErrors\n' +
    '-execute\n',
  error: waited 30000ms
      at #onTimeout (/usr/src/app/server/node_modules/.pnpm/batch-cluster@16.0.0/node_modules/batch-cluster/dist/BatchProcess.js:309:38)
      at Timeout._onTimeout (/usr/src/app/server/node_modules/.pnpm/batch-cluster@16.0.0/node_modules/batch-cluster/dist/BatchProcess.js:230:94)
      at listOnTimeout (node:internal/timers:588:17)
      at process.processTimers (node:internal/timers:523:7)
}
BatchProcess(214).terminate(): force-killing still-running child.
EXIFTOOL-VENDORED 7: ProcessPoolManager.maybeSpawnProcs() started healthy child process { pid: 371 }
BatchProcess(227).onError() {
  reason: 'timeout',
  task: '-json\n' +
    '-ee\n' +
    ...
    '/exiftool/13-video-ee-immich#17574.mp4\n' +
    '-ignoreMinorErrors\n' +
    '-execute\n',
  error: waited 30000ms
      at #onTimeout (/usr/src/app/server/node_modules/.pnpm/batch-cluster@16.0.0/node_modules/batch-cluster/dist/BatchProcess.js:309:38)
      at Timeout._onTimeout (/usr/src/app/server/node_modules/.pnpm/batch-cluster@16.0.0/node_modules/batch-cluster/dist/BatchProcess.js:230:94)
      at listOnTimeout (node:internal/timers:588:17)
      at process.processTimers (node:internal/timers:523:7)
}
BatchProcess(227).terminate(): force-killing still-running child.
[Nest] 7  - 12/06/2025, 12:26:50 PM   DEBUG [Microservices:MediaRepository] Transcoding 37.78% done, estimated 1m, 33s remaining for output b400d985-cf8f-40bb-aff5-7b3d707c8bb1.mp4
BatchProcess(83).onError() {
  reason: 'timeout',
  task: '-json\n' +
    '-ee\n' +
    ...
    '/exiftool/14-video-ee-immich#17574.mp4\n' +
    '-ignoreMinorErrors\n' +
    '-execute\n',
  error: waited 30000ms
      at #onTimeout (/usr/src/app/server/node_modules/.pnpm/batch-cluster@16.0.0/node_modules/batch-cluster/dist/BatchProcess.js:309:38)
      at Timeout._onTimeout (/usr/src/app/server/node_modules/.pnpm/batch-cluster@16.0.0/node_modules/batch-cluster/dist/BatchProcess.js:230:94)
      at listOnTimeout (node:internal/timers:588:17)
      at process.processTimers (node:internal/timers:523:7)
}
BatchProcess(83).terminate(): force-killing still-running child.
EXIFTOOL-VENDORED 7: ProcessPoolManager.maybeSpawnProcs() started healthy child process { pid: 376 }
BatchProcess(249).onError() {
  reason: 'timeout',
  task: '-json\n' +
    '-ee\n' +
    ...
    '/exiftool/15-video-ee-immich#17574.mp4\n' +
    '-ignoreMinorErrors\n' +
    '-execute\n',
  error: waited 30000ms
      at #onTimeout (/usr/src/app/server/node_modules/.pnpm/batch-cluster@16.0.0/node_modules/batch-cluster/dist/BatchProcess.js:309:38)
      at Timeout._onTimeout (/usr/src/app/server/node_modules/.pnpm/batch-cluster@16.0.0/node_modules/batch-cluster/dist/BatchProcess.js:230:94)
      at listOnTimeout (node:internal/timers:588:17)
      at process.processTimers (node:internal/timers:523:7)
}
BatchProcess(249).terminate(): force-killing still-running child.
EXIFTOOL-VENDORED 7: ProcessPoolManager.maybeSpawnProcs() started healthy child process { pid: 377 }
EXIFTOOL-VENDORED 7: ProcessPoolManager.maybeSpawnProcs() started healthy child process { pid: 379 }

...

[Nest] 7  - 12/06/2025, 12:31:05 PM    WARN [Microservices:MetadataRepository] Error reading exif data (/exiftool/90-video-ee-immich#17574.mp4): Error: timeout: waited 30000ms
waited 30000ms
    at #onTimeout (/usr/src/app/server/node_modules/.pnpm/batch-cluster@16.0.0/node_modules/batch-cluster/dist/BatchProcess.js:309:38)
    at Timeout._onTimeout (/usr/src/app/server/node_modules/.pnpm/batch-cluster@16.0.0/node_modules/batch-cluster/dist/BatchProcess.js:230:94)
    at listOnTimeout (node:internal/timers:588:17)
    at process.processTimers (node:internal/timers:523:7)
BatchProcess(1054).terminate(): force-killing still-running child.
[Nest] 7  - 12/06/2025, 12:31:05 PM   DEBUG [Microservices:MetadataService] No timezone information found for asset e50a126e-f8f5-41fb-916a-301387caa374: /exiftool/90-video-ee-immich#17574.mp4
[Nest] 7  - 12/06/2025, 12:31:05 PM   DEBUG [Microservices:MetadataService] No exif date time found, falling back on 2025-12-06T11:39:41.610+00:00, earliest of file creation and modification for asset e50a126e-f8f5-41fb-916a-301387caa374: /exiftool/90-video-ee-immich#17574.mp4
BatchProcess(1133).onError() {
  reason: 'timeout',
  task: '-json\n' +
    '-ee\n' +
    ...
    '/exiftool/91-video-ee-immich#17574.mp4\n' +
    '-ignoreMinorErrors\n' +
    '-execute\n',
  error: waited 30000ms
      at #onTimeout (/usr/src/app/server/node_modules/.pnpm/batch-cluster@16.0.0/node_modules/batch-cluster/dist/BatchProcess.js:309:38)
      at Timeout._onTimeout (/usr/src/app/server/node_modules/.pnpm/batch-cluster@16.0.0/node_modules/batch-cluster/dist/BatchProcess.js:230:94)
      at listOnTimeout (node:internal/timers:588:17)
      at process.processTimers (node:internal/timers:523:7)
}
[Nest] 7  - 12/06/2025, 12:31:06 PM    WARN [Microservices:MetadataRepository] Error reading exif data (/exiftool/91-video-ee-immich#17574.mp4): Error: timeout: waited 30000ms
waited 30000ms
    at #onTimeout (/usr/src/app/server/node_modules/.pnpm/batch-cluster@16.0.0/node_modules/batch-cluster/dist/BatchProcess.js:309:38)
    at Timeout._onTimeout (/usr/src/app/server/node_modules/.pnpm/batch-cluster@16.0.0/node_modules/batch-cluster/dist/BatchProcess.js:230:94)
    at listOnTimeout (node:internal/timers:588:17)
    at process.processTimers (node:internal/timers:523:7)
[Nest] 7  - 12/06/2025, 12:31:06 PM   DEBUG [Microservices:MetadataService] No timezone information found for asset d1e38532-c427-45fe-97b2-7efec5551664: /exiftool/91-video-ee-immich#17574.mp4
[Nest] 7  - 12/06/2025, 12:31:06 PM   DEBUG [Microservices:MetadataService] No exif date time found, falling back on 2025-12-06T11:39:41.615+00:00, earliest of file creation and modification for asset d1e38532-c427-45fe-97b2-7efec5551664: /exiftool/91-video-ee-immich#17574.mp4
BatchProcess(1133).terminate(): force-killing still-running child.
[Nest] 7  - 12/06/2025, 12:31:07 PM   DEBUG [Microservices:MediaRepository] Transcoding 27.33% done, estimated 5m, 27s remaining for output 55c912dd-21c5-447a-8e4f-bec5cfd0f696.mp4
[Nest] 7  - 12/06/2025, 12:31:07 PM   DEBUG [Microservices:MediaRepository] ffmpeg -n 10 /usr/bin/ffmpeg -skip_frame nointra -sws_flags accurate_rnd+full_chroma_int -i /exiftool/13-video-ee-immich#17574.mp4 -y -fps_mode vfr -frames:v 1 -update 1 -v verbose -vf fps=12:start_time=0:eof_action=pass:round=down,thumbnail=12,select=gt(scene\,0.1)-eq(prev_selected_n\,n)+isnan(prev_selected_n)+gt(n\,20),trim=end_frame=2,reverse,scale=-2:250:flags=lanczos+accurate_rnd+full_chroma_int:out_range=pc /data/thumbs/7a18f962-7c77-4a35-a165-c8fbb4291e65/a2/26/a2267530-6086-462a-ab45-4188e91b1d10-thumbnail.webp
[Nest] 7  - 12/06/2025, 12:31:08 PM   DEBUG [Microservices:MediaRepository] ffmpeg -n 10 /usr/bin/ffmpeg -skip_frame nointra -sws_flags accurate_rnd+full_chroma_int -i /exiftool/14-video-ee-immich#17574.mp4 -y -fps_mode vfr -frames:v 1 -update 1 -v verbose -vf fps=12:start_time=0:eof_action=pass:round=down,thumbnail=12,select=gt(scene\,0.1)-eq(prev_selected_n\,n)+isnan(prev_selected_n)+gt(n\,20),trim=end_frame=2,reverse /data/thumbs/7a18f962-7c77-4a35-a165-c8fbb4291e65/01/aa/01aac60f-86b0-4cd6-8012-5f3c755600f1-preview.jpeg
[Nest] 7  - 12/06/2025, 12:31:08 PM   DEBUG [Microservices:MapRepository] Request: 35.685063,139.706478
[Nest] 7  - 12/06/2025, 12:31:08 PM   DEBUG [Microservices:PersonService] 0 faces detected in /data/thumbs/7a18f962-7c77-4a35-a165-c8fbb4291e65/5f/56/5f562c4b-4ba0-4e25-8d41-ecb0e1fe319e-preview.jpeg
[Nest] 7  - 12/06/2025, 12:31:08 PM   DEBUG [Microservices:MediaRepository] ffmpeg -n 10 /usr/bin/ffmpeg -skip_frame nointra -sws_flags accurate_rnd+full_chroma_int -i /exiftool/15-video-ee-immich#17574.mp4 -y -fps_mode vfr -frames:v 1 -update 1 -v verbose -vf fps=12:start_time=0:eof_action=pass:round=down,thumbnail=12,select=gt(scene\,0.1)-eq(prev_selected_n\,n)+isnan(prev_selected_n)+gt(n\,20),trim=end_frame=2,reverse /data/thumbs/7a18f962-7c77-4a35-a165-c8fbb4291e65/13/12/1312adcf-a5e7-45a1-81b3-c3504313e744-preview.jpeg
[Nest] 7  - 12/06/2025, 12:31:08 PM   DEBUG [Microservices:PersonService] 0 faces detected in /data/thumbs/7a18f962-7c77-4a35-a165-c8fbb4291e65/c3/7b/c37ba4ca-9a78-4cf1-bfad-423e6a9d0e55-preview.jpeg
[Nest] 7  - 12/06/2025, 12:31:08 PM   DEBUG [Microservices:OcrService] Processed 0 OCR result(s) for 5f562c4b-4ba0-4e25-8d41-ecb0e1fe319e
[Nest] 7  - 12/06/2025, 12:31:08 PM   DEBUG [Microservices:MediaRepository] Transcoding 32.89% done, estimated 5m, 2s remaining for output 55c912dd-21c5-447a-8e4f-bec5cfd0f696.mp4
[Nest] 7  - 12/06/2025, 12:31:08 PM   DEBUG [Microservices:DuplicateService] Found 24 duplicates for asset 5f562c4b-4ba0-4e25-8d41-ecb0e1fe319e
[Nest] 7  - 12/06/2025, 12:31:08 PM   DEBUG [Microservices:DuplicateService] Found 24 duplicates for asset c37ba4ca-9a78-4cf1-bfad-423e6a9d0e55
[Nest] 7  - 12/06/2025, 12:31:08 PM   DEBUG [Microservices:OcrService] Processed 0 OCR result(s) for c37ba4ca-9a78-4cf1-bfad-423e6a9d0e55
[Nest] 7  - 12/06/2025, 12:31:09 PM   DEBUG [Microservices:MediaRepository] ffmpeg -n 10 /usr/bin/ffmpeg -skip_frame nointra -sws_flags accurate_rnd+full_chroma_int -i /exiftool/15-video-ee-immich#17574.mp4 -y -fps_mode vfr -frames:v 1 -update 1 -v verbose -vf fps=12:start_time=0:eof_action=pass:round=down,thumbnail=12,select=gt(scene\,0.1)-eq(prev_selected_n\,n)+isnan(prev_selected_n)+gt(n\,20),trim=end_frame=2,reverse,scale=-2:250:flags=lanczos+accurate_rnd+full_chroma_int:out_range=pc /data/thumbs/7a18f962-7c77-4a35-a165-c8fbb4291e65/13/12/1312adcf-a5e7-45a1-81b3-c3504313e744-thumbnail.webp
[Nest] 7  - 12/06/2025, 12:31:10 PM   DEBUG [Microservices:MediaRepository] Transcoding 39.56% done, estimated 2m, 16s remaining for output 55c912dd-21c5-447a-8e4f-bec5cfd0f696.mp4
[Nest] 7  - 12/06/2025, 12:31:10 PM   DEBUG [Microservices:MapRepository] Request: 35.685063,139.706478
...
[Nest] 7  - 12/06/2025, 12:31:10 PM   DEBUG [Microservices:MapRepository] Request: 35.685063,139.706478
...
[Nest] 7  - 12/06/2025, 12:46:25 PM     LOG [Microservices:MediaService] Transcoding video 1b9557fd-4b3c-4f4f-ba7d-3db3fe63e9b4 without hardware acceleration
[Nest] 7  - 12/06/2025, 12:46:25 PM   DEBUG [Microservices:MediaRepository] ffmpeg -n 10 /usr/bin/ffmpeg -i /exiftool/99-video-ee-immich#17574.mp4 -y -c:v h264 -c:a copy -movflags faststart -fps_mode passthrough -map 0:0 -map_metadata -1 -v verbose -vf scale=-2:720 -preset ultrafast -crf 23 /data/encoded-video/7a18f962-7c77-4a35-a165-c8fbb4291e65/1b/95/1b9557fd-4b3c-4f4f-ba7d-3db3fe63e9b4.mp4
[Nest] 7  - 12/06/2025, 12:46:26 PM   DEBUG [Microservices:MediaRepository] Transcoding 10.44% done, estimated 8s remaining for output 1b9557fd-4b3c-4f4f-ba7d-3db3fe63e9b4.mp4
...
[Nest] 7  - 12/06/2025, 12:46:34 PM   DEBUG [Microservices:MediaRepository] Transcoding 89.33% done, estimated 1s remaining for output 1b9557fd-4b3c-4f4f-ba7d-3db3fe63e9b4.mp4
[Nest] 7  - 12/06/2025, 12:46:34 PM   DEBUG [Microservices:MediaRepository] Transcoding 96.00% done for output 1b9557fd-4b3c-4f4f-ba7d-3db3fe63e9b4.mp4
[Nest] 7  - 12/06/2025, 12:46:34 PM     LOG [Microservices:MediaService] Successfully encoded 1b9557fd-4b3c-4f4f-ba7d-3db3fe63e9b4

Please describe to which degree, if any, an LLM was used in creating this pull request.

None.

@alextran1502
Copy link
Copy Markdown
Member

My man is too fast, I was going to check for if the update is already out. Thanks ❤️

@alextran1502 alextran1502 merged commit 42136f9 into immich-app:main Dec 6, 2025
53 of 54 checks passed
@mceachen
Copy link
Copy Markdown

mceachen commented Dec 7, 2025

Is there a running hypothesis for why you're seeing timeouts? Is it excessive iowait, or excessive CPU load, or something else?

@skatsubo
Copy link
Copy Markdown
Collaborator Author

Is there a running hypothesis for why you're seeing timeouts? Is it excessive iowait, or excessive CPU load, or something else?

Seemingly it's both IO and CPU when invoking exiftool -ee against certain video files:

  • CPU for videos rich with geodata, such as the sample from immich#17574 (which we used to reproduce the batch-cluster issue). Exiftool with -ee -Location:All returns 4500 lines for that sample and runs much longer (5x) than without -ee.
  • IO when exiftool extracts the special track and reads the whole file (though I'm not sure)

Immich added -ee recently for all video files. Its impact manifested in November.

So we get tickets reporting the issue, but no details/insights yet. E.g.:

lwbio pushed a commit to lwbio/immich that referenced this pull request Dec 16, 2025
dadezzz pushed a commit to dadezzz/kubernetes that referenced this pull request Dec 18, 2025
This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [ghcr.io/immich-app/immich-machine-learning](https://github.com/immich-app/immich) | minor | `v2.3.1` -> `v2.4.0` |
| [ghcr.io/immich-app/immich-server](https://github.com/immich-app/immich) | minor | `v2.3.1` -> `v2.4.0` |

---

> ⚠️ **Warning**
>
> Some dependencies could not be looked up. Check the Dependency Dashboard for more information.

---

### Release Notes

<details>
<summary>immich-app/immich (ghcr.io/immich-app/immich-machine-learning)</summary>

### [`v2.4.0`](https://github.com/immich-app/immich/releases/tag/v2.4.0)

[Compare Source](immich-app/immich@v2.3.1...v2.4.0)

##### v2.4.0

##### Highlights

Welcome to the release `v2.4.0` of Immich. This release focuses on bug fixes, QoL improvements, and polished UI components and animation across mobile and the web. Let’s dive right in.

- Show the owner's name in the shared album
- Command palette
- Change search type directly in the search bar
- Better action button placement in the mobile asset viewer
- Notable fix: fix an issue where metadata extraction could fail on high concurrency

##### Show the owner's name in the shared album.

On the web, in shared albums, you can now toggle an option to display the asset’s owner name at the bottom right corner of the thumbnail.

<img width="800" alt="asset owner name in album" src="https://github.com/user-attachments/assets/90f425b3-91d4-4ef3-9455-234b2c28b0f0" />

##### Command palette

The web app now has an integrated command palette, which can be opened  `ctrl + k` on Windows/Linux or `cmd + k` on macOS. This first iteration of this lets you quickly navigate between administration pages by typing the name of the page you want to go to. It also already supports some common actions when on the respective admin pages, many of which also support shortcuts. Have a look around and check them out!

<img width="800"  alt="command pallet" src="https://github.com/user-attachments/assets/e9fb1638-a926-4df2-92ce-3ddfd0b04e02" />

##### Change search type directly in the search bar

You can now click on the pill from the search bar to select a different search type without opening the search filter panel.

<img width="800" alt="search type" src="https://github.com/user-attachments/assets/493d0b74-8b6f-4581-b2ba-9f00da9bcc30" />

##### Better placement of action buttons in the mobile asset viewer

Previously, to perform a specific action on the asset, you needed first to swipe up to open the detail panel, then swipe all the way to the right and tap the action. It limits the discoverability of some actions. To help resolve that issue, all the action buttons in the detail panel are now moved to the drop-down menu when tapping on the vertical dot icon (or kebab menu), along with some buttons that used to be on the top bar, clearing up space to display more helpful information when viewing the asset.

 <img width="350" alt="kebab menu" src="https://github.com/user-attachments/assets/7b4610c4-d04b-4f5e-8b7b-02504a9ee531" />

##### Support Immich

<p align="center">

<img src="https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExbjY2eWc5Y2F0ZW56MmR4aWE0dDhzZXlidXRmYWZyajl1bWZidXZpcyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/87CKDqErVfMqY/giphy.gif" width="450" title="SUPPORT THE PROJECT!">

</p>

If you find the project helpful, you can support Immich by purchasing a product key at <https://buy.immich.app> or our merchandise at <https://immich.store>

##### What's Changed

##### 🫥 Deprecated Changes

- feat: queues by [@&#8203;jrasm91](https://github.com/jrasm91) in [#&#8203;24142](immich-app/immich#24142)

##### 🚀 Features

- feat: improve performance: don't sort timeline buckets from server by [@&#8203;midzelis](https://github.com/midzelis) in [#&#8203;24032](immich-app/immich#24032)
- feat: command palette by [@&#8203;danieldietzler](https://github.com/danieldietzler) in [#&#8203;23693](immich-app/immich#23693)
- feat(web): Shared album owner labels by [@&#8203;xCJPECKOVERx](https://github.com/xCJPECKOVERx) in [#&#8203;21171](immich-app/immich#21171)
- feat(mobile): persist album sorting & layout in settings by [@&#8203;YarosMallorca](https://github.com/YarosMallorca) in [#&#8203;22133](immich-app/immich#22133)
- feat: queue detail page by [@&#8203;jrasm91](https://github.com/jrasm91) in [#&#8203;24352](immich-app/immich#24352)
- chore(mobile): add kebabu menu in asset viewer by [@&#8203;idubnori](https://github.com/idubnori) in [#&#8203;24387](immich-app/immich#24387)
- feat(mobile): create new album from add to modal by [@&#8203;YarosMallorca](https://github.com/YarosMallorca) in [#&#8203;24431](immich-app/immich#24431)
- feat(mobile): move buttons in the bottom sheet to the kebabu menu by [@&#8203;idubnori](https://github.com/idubnori) in [#&#8203;24175](immich-app/immich#24175)

##### 🌟 Enhancements

- feat(web): allow navigating the map with arrow keys by [@&#8203;lukashass](https://github.com/lukashass) in [#&#8203;24080](immich-app/immich#24080)
- feat: separate camera and lens info in detail panel by [@&#8203;fabianbees](https://github.com/fabianbees) in [#&#8203;23670](immich-app/immich#23670)
- feat(web): shared link card tweaks by [@&#8203;jrasm91](https://github.com/jrasm91) in [#&#8203;24192](immich-app/immich#24192)
- feat(server): exclude syncthing folders from external libraries by [@&#8203;SaphuA](https://github.com/SaphuA) in [#&#8203;24240](immich-app/immich#24240)
- feat(web): search type selection dropdown by [@&#8203;YarosMallorca](https://github.com/YarosMallorca) in [#&#8203;24091](immich-app/immich#24091)
- feat: header context menu by [@&#8203;jrasm91](https://github.com/jrasm91) in [#&#8203;24374](immich-app/immich#24374)
- feat(mobile): move top bar buttons into kebabu menu in AssetViewer by [@&#8203;idubnori](https://github.com/idubnori) in [#&#8203;24461](immich-app/immich#24461)
- feat(web): asset selection bar in tags view by [@&#8203;YarosMallorca](https://github.com/YarosMallorca) in [#&#8203;24522](immich-app/immich#24522)
- feat(web): slideshow feature on shared albums by [@&#8203;YarosMallorca](https://github.com/YarosMallorca) in [#&#8203;24598](immich-app/immich#24598)
- feat: replace heart icons to thumbs-up across activity by [@&#8203;idubnori](https://github.com/idubnori) in [#&#8203;24590](immich-app/immich#24590)

##### 🐛 Bug fixes

- fix: effect loop by [@&#8203;jrasm91](https://github.com/jrasm91) in [#&#8203;24014](immich-app/immich#24014)
- fix: do not clear hash on updated\_at change by [@&#8203;shenlong-tanwen](https://github.com/shenlong-tanwen) in [#&#8203;24039](immich-app/immich#24039)
- fix: disable animation "add to" action menu by [@&#8203;bwees](https://github.com/bwees) in [#&#8203;24040](immich-app/immich#24040)
- fix: Use correct app store link by [@&#8203;Mraedis](https://github.com/Mraedis) in [#&#8203;24062](immich-app/immich#24062)
- fix: show archived assets in favorite page by [@&#8203;bwees](https://github.com/bwees) in [#&#8203;24052](immich-app/immich#24052)
- fix(mobile): first video memory on page doesn't play by [@&#8203;YarosMallorca](https://github.com/YarosMallorca) in [#&#8203;23906](immich-app/immich#23906)
- feat(web): show detected faces in spherical photos by [@&#8203;meesfrensel](https://github.com/meesfrensel) in [#&#8203;23974](immich-app/immich#23974)
- fix: add users to album by [@&#8203;danieldietzler](https://github.com/danieldietzler) in [#&#8203;24133](immich-app/immich#24133)
- fix(server): sanitize DB\_URL for pg\_dumpall to remove unknown query params by [@&#8203;lutostag](https://github.com/lutostag) in [#&#8203;23333](immich-app/immich#23333)
- fix: use proper updatedAt value in local assets by [@&#8203;shenlong-tanwen](https://github.com/shenlong-tanwen) in [#&#8203;24137](immich-app/immich#24137)
- fix: albums page reactivity loops by [@&#8203;danieldietzler](https://github.com/danieldietzler) in [#&#8203;24046](immich-app/immich#24046)
- fix: getAspectRatio fallback to db width and height by [@&#8203;shenlong-tanwen](https://github.com/shenlong-tanwen) in [#&#8203;24131](immich-app/immich#24131)
- fix(web): fix support & feedback modal wrapping by [@&#8203;Snowknight26](https://github.com/Snowknight26) in [#&#8203;24018](immich-app/immich#24018)
- fix: don't get OCR data in shared link by [@&#8203;alextran1502](https://github.com/alextran1502) in [#&#8203;24152](immich-app/immich#24152)
- fix: duration extraction by [@&#8203;jrasm91](https://github.com/jrasm91) in [#&#8203;24178](immich-app/immich#24178)
- fix(ml): Upgrade ONNX Runtime to v1.22.1 to fix ROCm build failures by [@&#8203;LukaPrebil](https://github.com/LukaPrebil) in [#&#8203;24045](immich-app/immich#24045)
- fix: update timeline-manager after archive actions by [@&#8203;midzelis](https://github.com/midzelis) in [#&#8203;24010](immich-app/immich#24010)
- fix: theme switcher by [@&#8203;jrasm91](https://github.com/jrasm91) in [#&#8203;24209](immich-app/immich#24209)
- fix: label 'for' attributes in user-api-key-grid by [@&#8203;kimsey0](https://github.com/kimsey0) in [#&#8203;24232](immich-app/immich#24232)
- fix(mobile): enable backup text overflows by [@&#8203;YarosMallorca](https://github.com/YarosMallorca) in [#&#8203;24227](immich-app/immich#24227)
- fix(web): integrate zoom toggle button into panorama photo viewer by [@&#8203;meesfrensel](https://github.com/meesfrensel) in [#&#8203;24189](immich-app/immich#24189)
- fix(web): use full tag path when creating nested subtags by [@&#8203;NiklasvonM](https://github.com/NiklasvonM) in [#&#8203;24249](immich-app/immich#24249)
- fix: only generate memory based on users assets by [@&#8203;alextran1502](https://github.com/alextran1502) in [#&#8203;24151](immich-app/immich#24151)
- fix(mobile): docs link by [@&#8203;mmomjian](https://github.com/mmomjian) in [#&#8203;24277](immich-app/immich#24277)
- fix(server): use bigrams for cjk by [@&#8203;mertalev](https://github.com/mertalev) in [#&#8203;24285](immich-app/immich#24285)
- fix(ml): do not upscale preview by [@&#8203;mertalev](https://github.com/mertalev) in [#&#8203;24322](immich-app/immich#24322)
- fix(web): open onboarding documentation link in new tab by [@&#8203;carbonemys](https://github.com/carbonemys) in [#&#8203;24289](immich-app/immich#24289)
- fix(mobile): use correct timezone displayed in the info sheet by [@&#8203;kao-byte](https://github.com/kao-byte) in [#&#8203;24310](immich-app/immich#24310)
- fix(web): folder view sort oder by [@&#8203;etnoy](https://github.com/etnoy) in [#&#8203;24337](immich-app/immich#24337)
- fix(server): do not delete offline assets by [@&#8203;mertalev](https://github.com/mertalev) in [#&#8203;24355](immich-app/immich#24355)
- fix: exposure info and better readability by [@&#8203;alextran1502](https://github.com/alextran1502) in [#&#8203;24344](immich-app/immich#24344)
- fix: Adjust the zoom level by [@&#8203;jforseth210](https://github.com/jforseth210) in [#&#8203;24353](immich-app/immich#24353)
- fix: local full sync on Android on resume by [@&#8203;alextran1502](https://github.com/alextran1502) in [#&#8203;24348](immich-app/immich#24348)
- fix(web): Add minimum content size to logo for consistent visual on small screens by [@&#8203;kiloomar](https://github.com/kiloomar) in [#&#8203;24372](immich-app/immich#24372)
- fix: use adjustment time in iOS for hash reset by [@&#8203;shenlong-tanwen](https://github.com/shenlong-tanwen) in [#&#8203;24047](immich-app/immich#24047)
- fix(server): update exiftool-vendored to v34 for more robust metadata extraction by [@&#8203;skatsubo](https://github.com/skatsubo) in [#&#8203;24424](immich-app/immich#24424)
- fix(mobile): cannot create album while name field is focused by [@&#8203;YarosMallorca](https://github.com/YarosMallorca) in [#&#8203;24449](immich-app/immich#24449)
- fix(web): \[album table view] long album title overflows table row by [@&#8203;simonkub](https://github.com/simonkub) in [#&#8203;24450](immich-app/immich#24450)
- fix(mobile): fix overflow text in backup card by [@&#8203;YarosMallorca](https://github.com/YarosMallorca) in [#&#8203;24448](immich-app/immich#24448)
- fix(mobile): timeline bottom padding on selection by [@&#8203;YarosMallorca](https://github.com/YarosMallorca) in [#&#8203;24480](immich-app/immich#24480)
- feat(mobile): Localized backup upload details page by [@&#8203;ArnyminerZ](https://github.com/ArnyminerZ) in [#&#8203;21136](immich-app/immich#21136)
- fix(mobile): iOS local permission dialog extra whitespace by [@&#8203;kurtmckee](https://github.com/kurtmckee) in [#&#8203;24491](immich-app/immich#24491)
- fix(mobile): versionStatus.message text overflow by [@&#8203;idubnori](https://github.com/idubnori) in [#&#8203;24504](immich-app/immich#24504)
- fix(server): prevent metadata extraction failures on large video files by [@&#8203;hubert-taieb](https://github.com/hubert-taieb) in [#&#8203;24094](immich-app/immich#24094)
- fix(web): show inferred timezone in date editor by [@&#8203;skatsubo](https://github.com/skatsubo) in [#&#8203;24513](immich-app/immich#24513)
- fix(mobile): local videos with '#' don't play on android by [@&#8203;YarosMallorca](https://github.com/YarosMallorca) in [#&#8203;24373](immich-app/immich#24373)
- fix: refresh appear in list after asset is added to a current or new album by [@&#8203;alextran1502](https://github.com/alextran1502) in [#&#8203;24523](immich-app/immich#24523)
- fix(mobile): birthday off by one day on remote by [@&#8203;YarosMallorca](https://github.com/YarosMallorca) in [#&#8203;24527](immich-app/immich#24527)
- fix(web): download panel being hidden by admin sidebar by [@&#8203;diogotcorreia](https://github.com/diogotcorreia) in [#&#8203;24583](immich-app/immich#24583)
- fix(web): recent search doesn't use search type by [@&#8203;YarosMallorca](https://github.com/YarosMallorca) in [#&#8203;24578](immich-app/immich#24578)
- fix(server): only extract image's duration if format supports animation by [@&#8203;meesfrensel](https://github.com/meesfrensel) in [#&#8203;24587](immich-app/immich#24587)
- fix(mobile): local delete missing from sheet on some routes  by [@&#8203;YarosMallorca](https://github.com/YarosMallorca) in [#&#8203;24505](immich-app/immich#24505)
- fix(mobile): better UI for metadata panel by [@&#8203;kao-byte](https://github.com/kao-byte) in [#&#8203;24428](immich-app/immich#24428)
- fix: shared link expiration and small styling by [@&#8203;alextran1502](https://github.com/alextran1502) in [#&#8203;24566](immich-app/immich#24566)
- fix: asset update race condition by [@&#8203;danieldietzler](https://github.com/danieldietzler) in [#&#8203;24384](immich-app/immich#24384)

##### 📚 Documentation

- docs: DB\_STORAGE\_TYPE is only used by the database container by [@&#8203;dionysius](https://github.com/dionysius) in [#&#8203;24215](immich-app/immich#24215)
- fix(docs): build `cli` for e2e tests by [@&#8203;roschaefer](https://github.com/roschaefer) in [#&#8203;24184](immich-app/immich#24184)
- docs(faq): add more info on archiving by [@&#8203;etnoy](https://github.com/etnoy) in [#&#8203;24326](immich-app/immich#24326)
- fix(docs): server and machine-learning use IMMICH\_HOST and IMMICH\_PORT by [@&#8203;dionysius](https://github.com/dionysius) in [#&#8203;24335](immich-app/immich#24335)
- fix: prevent OOM on nginx reverse proxy servers by [@&#8203;NicholasFlamy](https://github.com/NicholasFlamy) in [#&#8203;24351](immich-app/immich#24351)
- fix(docs): obsolete docs about rootless docker by [@&#8203;roschaefer](https://github.com/roschaefer) in [#&#8203;24376](immich-app/immich#24376)
- fix(docs): websockets in nginx example by [@&#8203;fourthwall](https://github.com/fourthwall) in [#&#8203;24411](immich-app/immich#24411)
- fix(docs): slow upload speed with example nginx reverse proxy config by [@&#8203;goalie2002](https://github.com/goalie2002) in [#&#8203;24490](immich-app/immich#24490)
- fix(docs): typo in maintenance mode command by [@&#8203;bartvanvelden](https://github.com/bartvanvelden) in [#&#8203;24518](immich-app/immich#24518)

##### 🌐 Translations

- chore: add new language requests by [@&#8203;danieldietzler](https://github.com/danieldietzler) in [#&#8203;23991](immich-app/immich#23991)
- chore(web): update translations by [@&#8203;weblate](https://github.com/weblate) in [#&#8203;24004](immich-app/immich#24004)

##### New Contributors

- [@&#8203;ujjwal123123](https://github.com/ujjwal123123) made their first contribution in [#&#8203;24101](immich-app/immich#24101)
- [@&#8203;lutostag](https://github.com/lutostag) made their first contribution in [#&#8203;23333](immich-app/immich#23333)
- [@&#8203;LukaPrebil](https://github.com/LukaPrebil) made their first contribution in [#&#8203;24045](immich-app/immich#24045)
- [@&#8203;kimsey0](https://github.com/kimsey0) made their first contribution in [#&#8203;24232](immich-app/immich#24232)
- [@&#8203;SaphuA](https://github.com/SaphuA) made their first contribution in [#&#8203;24240](immich-app/immich#24240)
- [@&#8203;dionysius](https://github.com/dionysius) made their first contribution in [#&#8203;24215](immich-app/immich#24215)
- [@&#8203;NiklasvonM](https://github.com/NiklasvonM) made their first contribution in [#&#8203;24249](immich-app/immich#24249)
- [@&#8203;kao-byte](https://github.com/kao-byte) made their first contribution in [#&#8203;24098](immich-app/immich#24098)
- [@&#8203;carbonemys](https://github.com/carbonemys) made their first contribution in [#&#8203;24289](immich-app/immich#24289)
- [@&#8203;kiloomar](https://github.com/kiloomar) made their first contribution in [#&#8203;24372](immich-app/immich#24372)
- [@&#8203;fourthwall](https://github.com/fourthwall) made their first contribution in [#&#8203;24411](immich-app/immich#24411)
- [@&#8203;simonkub](https://github.com/simonkub) made their first contribution in [#&#8203;24450](immich-app/immich#24450)
- [@&#8203;ArnyminerZ](https://github.com/ArnyminerZ) made their first contribution in [#&#8203;21136](immich-app/immich#21136)
- [@&#8203;kurtmckee](https://github.com/kurtmckee) made their first contribution in [#&#8203;24491](immich-app/immich#24491)
- [@&#8203;hubert-taieb](https://github.com/hubert-taieb) made their first contribution in [#&#8203;24094](immich-app/immich#24094)
- [@&#8203;bartvanvelden](https://github.com/bartvanvelden) made their first contribution in [#&#8203;24518](immich-app/immich#24518)

**Full Changelog**: <immich-app/immich@v2.3.1...v2.4.0>

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about these updates again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi41Mi44IiwidXBkYXRlZEluVmVyIjoiNDIuNTIuOCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Co-authored-by: Renovate Bot <renovate@zarantonello.dev>
Co-committed-by: Renovate Bot <renovate@zarantonello.dev>
alexlebens pushed a commit to alexlebens/infrastructure that referenced this pull request Dec 20, 2025
This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [ghcr.io/immich-app/immich-server](https://github.com/immich-app/immich) | minor | `v2.3.1` -> `v2.4.1` |

---

### Release Notes

<details>
<summary>immich-app/immich (ghcr.io/immich-app/immich-server)</summary>

### [`v2.4.1`](https://github.com/immich-app/immich/releases/tag/v2.4.1)

[Compare Source](immich-app/immich@v2.4.0...v2.4.1)

### 2.4.1

#### What's Changed

##### 🐛 Bug fixes

- fix(web): shared link expiry does not save by [@&#8203;YarosMallorca](https://github.com/YarosMallorca) in [#&#8203;24569](immich-app/immich#24569)
- fix(mobile): infinite loading screen when hiding UI in map viewer on iOS by [@&#8203;timonrieger](https://github.com/timonrieger) in [#&#8203;24563](immich-app/immich#24563)
- fix(web): auto-start slideshow when confirming settings modal by [@&#8203;timonrieger](https://github.com/timonrieger) in [#&#8203;24629](immich-app/immich#24629)
- fix(mobile): merged video in On This Device played with incorrect ratio by [@&#8203;alextran1502](https://github.com/alextran1502) in [#&#8203;24656](immich-app/immich#24656)
- fix: dateTimeOriginal timezone updates by [@&#8203;danieldietzler](https://github.com/danieldietzler) in [#&#8203;24712](immich-app/immich#24712)
- fix(web): timezone dropdown showing "No results" when seconds are set to 00 by [@&#8203;timonrieger](https://github.com/timonrieger) in [#&#8203;24662](immich-app/immich#24662)
- fix(web): search-bar usability improvements  by [@&#8203;LeLunZ](https://github.com/LeLunZ) in [#&#8203;24705](immich-app/immich#24705)

##### 📚 Documentation

- fix(docs): add & fix missing alt text to store badge images by [@&#8203;divulgacheur](https://github.com/divulgacheur) in [#&#8203;24637](immich-app/immich#24637)

#### New Contributors

- [@&#8203;timonrieger](https://github.com/timonrieger) made their first contribution in [#&#8203;24563](immich-app/immich#24563)
- [@&#8203;LeLunZ](https://github.com/LeLunZ) made their first contribution in [#&#8203;24705](immich-app/immich#24705)
- [@&#8203;divulgacheur](https://github.com/divulgacheur) made their first contribution in [#&#8203;24637](immich-app/immich#24637)

**Full Changelog**: <immich-app/immich@v2.4.0...v2.4.1>

### [`v2.4.0`](https://github.com/immich-app/immich/releases/tag/v2.4.0)

[Compare Source](immich-app/immich@v2.3.1...v2.4.0)

### v2.4.0

#### Highlights

Welcome to the release `v2.4.0` of Immich. This release focuses on bug fixes, QoL improvements, and polished UI components and animation across mobile and the web. Let’s dive right in.

- Show the owner's name in the shared album
- Command palette
- Change search type directly in the search bar
- Better action button placement in the mobile asset viewer
- Notable fix: fix an issue where metadata extraction could fail on high concurrency

##### Show the owner's name in the shared album.

On the web, in shared albums, you can now toggle an option to display the asset’s owner name at the bottom right corner of the thumbnail.

<img width="800" alt="asset owner name in album" src="https://github.com/user-attachments/assets/90f425b3-91d4-4ef3-9455-234b2c28b0f0" />

##### Command palette

The web app now has an integrated command palette, which can be opened  `ctrl + k` on Windows/Linux or `cmd + k` on macOS. This first iteration of this lets you quickly navigate between administration pages by typing the name of the page you want to go to. It also already supports some common actions when on the respective admin pages, many of which also support shortcuts. Have a look around and check them out!

<img width="800"  alt="command pallet" src="https://github.com/user-attachments/assets/e9fb1638-a926-4df2-92ce-3ddfd0b04e02" />

##### Change search type directly in the search bar

You can now click on the pill from the search bar to select a different search type without opening the search filter panel.

<img width="800" alt="search type" src="https://github.com/user-attachments/assets/493d0b74-8b6f-4581-b2ba-9f00da9bcc30" />

##### Better placement of action buttons in the mobile asset viewer

Previously, to perform a specific action on the asset, you needed first to swipe up to open the detail panel, then swipe all the way to the right and tap the action. It limits the discoverability of some actions. To help resolve that issue, all the action buttons in the detail panel are now moved to the drop-down menu when tapping on the vertical dot icon (or kebab menu), along with some buttons that used to be on the top bar, clearing up space to display more helpful information when viewing the asset.

 <img width="350" alt="kebab menu" src="https://github.com/user-attachments/assets/7b4610c4-d04b-4f5e-8b7b-02504a9ee531" />

#### Support Immich

<p align="center">

<img src="https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExbjY2eWc5Y2F0ZW56MmR4aWE0dDhzZXlidXRmYWZyajl1bWZidXZpcyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/87CKDqErVfMqY/giphy.gif" width="450" title="SUPPORT THE PROJECT!">

</p>

If you find the project helpful, you can support Immich by purchasing a product key at <https://buy.immich.app> or our merchandise at <https://immich.store>

#### What's Changed

##### 🫥 Deprecated Changes

- feat: queues by [@&#8203;jrasm91](https://github.com/jrasm91) in [#&#8203;24142](immich-app/immich#24142)

##### 🚀 Features

- feat: improve performance: don't sort timeline buckets from server by [@&#8203;midzelis](https://github.com/midzelis) in [#&#8203;24032](immich-app/immich#24032)
- feat: command palette by [@&#8203;danieldietzler](https://github.com/danieldietzler) in [#&#8203;23693](immich-app/immich#23693)
- feat(web): Shared album owner labels by [@&#8203;xCJPECKOVERx](https://github.com/xCJPECKOVERx) in [#&#8203;21171](immich-app/immich#21171)
- feat(mobile): persist album sorting & layout in settings by [@&#8203;YarosMallorca](https://github.com/YarosMallorca) in [#&#8203;22133](immich-app/immich#22133)
- feat: queue detail page by [@&#8203;jrasm91](https://github.com/jrasm91) in [#&#8203;24352](immich-app/immich#24352)
- chore(mobile): add kebabu menu in asset viewer by [@&#8203;idubnori](https://github.com/idubnori) in [#&#8203;24387](immich-app/immich#24387)
- feat(mobile): create new album from add to modal by [@&#8203;YarosMallorca](https://github.com/YarosMallorca) in [#&#8203;24431](immich-app/immich#24431)
- feat(mobile): move buttons in the bottom sheet to the kebabu menu by [@&#8203;idubnori](https://github.com/idubnori) in [#&#8203;24175](immich-app/immich#24175)

##### 🌟 Enhancements

- feat(web): allow navigating the map with arrow keys by [@&#8203;lukashass](https://github.com/lukashass) in [#&#8203;24080](immich-app/immich#24080)
- feat: separate camera and lens info in detail panel by [@&#8203;fabianbees](https://github.com/fabianbees) in [#&#8203;23670](immich-app/immich#23670)
- feat(web): shared link card tweaks by [@&#8203;jrasm91](https://github.com/jrasm91) in [#&#8203;24192](immich-app/immich#24192)
- feat(server): exclude syncthing folders from external libraries by [@&#8203;SaphuA](https://github.com/SaphuA) in [#&#8203;24240](immich-app/immich#24240)
- feat(web): search type selection dropdown by [@&#8203;YarosMallorca](https://github.com/YarosMallorca) in [#&#8203;24091](immich-app/immich#24091)
- feat: header context menu by [@&#8203;jrasm91](https://github.com/jrasm91) in [#&#8203;24374](immich-app/immich#24374)
- feat(mobile): move top bar buttons into kebabu menu in AssetViewer by [@&#8203;idubnori](https://github.com/idubnori) in [#&#8203;24461](immich-app/immich#24461)
- feat(web): asset selection bar in tags view by [@&#8203;YarosMallorca](https://github.com/YarosMallorca) in [#&#8203;24522](immich-app/immich#24522)
- feat(web): slideshow feature on shared albums by [@&#8203;YarosMallorca](https://github.com/YarosMallorca) in [#&#8203;24598](immich-app/immich#24598)
- feat: replace heart icons to thumbs-up across activity by [@&#8203;idubnori](https://github.com/idubnori) in [#&#8203;24590](immich-app/immich#24590)

##### 🐛 Bug fixes

- fix: effect loop by [@&#8203;jrasm91](https://github.com/jrasm91) in [#&#8203;24014](immich-app/immich#24014)
- fix: do not clear hash on updated\_at change by [@&#8203;shenlong-tanwen](https://github.com/shenlong-tanwen) in [#&#8203;24039](immich-app/immich#24039)
- fix: disable animation "add to" action menu by [@&#8203;bwees](https://github.com/bwees) in [#&#8203;24040](immich-app/immich#24040)
- fix: Use correct app store link by [@&#8203;Mraedis](https://github.com/Mraedis) in [#&#8203;24062](immich-app/immich#24062)
- fix: show archived assets in favorite page by [@&#8203;bwees](https://github.com/bwees) in [#&#8203;24052](immich-app/immich#24052)
- fix(mobile): first video memory on page doesn't play by [@&#8203;YarosMallorca](https://github.com/YarosMallorca) in [#&#8203;23906](immich-app/immich#23906)
- feat(web): show detected faces in spherical photos by [@&#8203;meesfrensel](https://github.com/meesfrensel) in [#&#8203;23974](immich-app/immich#23974)
- fix: add users to album by [@&#8203;danieldietzler](https://github.com/danieldietzler) in [#&#8203;24133](immich-app/immich#24133)
- fix(server): sanitize DB\_URL for pg\_dumpall to remove unknown query params by [@&#8203;lutostag](https://github.com/lutostag) in [#&#8203;23333](immich-app/immich#23333)
- fix: use proper updatedAt value in local assets by [@&#8203;shenlong-tanwen](https://github.com/shenlong-tanwen) in [#&#8203;24137](immich-app/immich#24137)
- fix: albums page reactivity loops by [@&#8203;danieldietzler](https://github.com/danieldietzler) in [#&#8203;24046](immich-app/immich#24046)
- fix: getAspectRatio fallback to db width and height by [@&#8203;shenlong-tanwen](https://github.com/shenlong-tanwen) in [#&#8203;24131](immich-app/immich#24131)
- fix(web): fix support & feedback modal wrapping by [@&#8203;Snowknight26](https://github.com/Snowknight26) in [#&#8203;24018](immich-app/immich#24018)
- fix: don't get OCR data in shared link by [@&#8203;alextran1502](https://github.com/alextran1502) in [#&#8203;24152](immich-app/immich#24152)
- fix: duration extraction by [@&#8203;jrasm91](https://github.com/jrasm91) in [#&#8203;24178](immich-app/immich#24178)
- fix(ml): Upgrade ONNX Runtime to v1.22.1 to fix ROCm build failures by [@&#8203;LukaPrebil](https://github.com/LukaPrebil) in [#&#8203;24045](immich-app/immich#24045)
- fix: update timeline-manager after archive actions by [@&#8203;midzelis](https://github.com/midzelis) in [#&#8203;24010](immich-app/immich#24010)
- fix: theme switcher by [@&#8203;jrasm91](https://github.com/jrasm91) in [#&#8203;24209](immich-app/immich#24209)
- fix: label 'for' attributes in user-api-key-grid by [@&#8203;kimsey0](https://github.com/kimsey0) in [#&#8203;24232](immich-app/immich#24232)
- fix(mobile): enable backup text overflows by [@&#8203;YarosMallorca](https://github.com/YarosMallorca) in [#&#8203;24227](immich-app/immich#24227)
- fix(web): integrate zoom toggle button into panorama photo viewer by [@&#8203;meesfrensel](https://github.com/meesfrensel) in [#&#8203;24189](immich-app/immich#24189)
- fix(web): use full tag path when creating nested subtags by [@&#8203;NiklasvonM](https://github.com/NiklasvonM) in [#&#8203;24249](immich-app/immich#24249)
- fix: only generate memory based on users assets by [@&#8203;alextran1502](https://github.com/alextran1502) in [#&#8203;24151](immich-app/immich#24151)
- fix(mobile): docs link by [@&#8203;mmomjian](https://github.com/mmomjian) in [#&#8203;24277](immich-app/immich#24277)
- fix(server): use bigrams for cjk by [@&#8203;mertalev](https://github.com/mertalev) in [#&#8203;24285](immich-app/immich#24285)
- fix(ml): do not upscale preview by [@&#8203;mertalev](https://github.com/mertalev) in [#&#8203;24322](immich-app/immich#24322)
- fix(web): open onboarding documentation link in new tab by [@&#8203;carbonemys](https://github.com/carbonemys) in [#&#8203;24289](immich-app/immich#24289)
- fix(mobile): use correct timezone displayed in the info sheet by [@&#8203;kao-byte](https://github.com/kao-byte) in [#&#8203;24310](immich-app/immich#24310)
- fix(web): folder view sort oder by [@&#8203;etnoy](https://github.com/etnoy) in [#&#8203;24337](immich-app/immich#24337)
- fix(server): do not delete offline assets by [@&#8203;mertalev](https://github.com/mertalev) in [#&#8203;24355](immich-app/immich#24355)
- fix: exposure info and better readability by [@&#8203;alextran1502](https://github.com/alextran1502) in [#&#8203;24344](immich-app/immich#24344)
- fix: Adjust the zoom level by [@&#8203;jforseth210](https://github.com/jforseth210) in [#&#8203;24353](immich-app/immich#24353)
- fix: local full sync on Android on resume by [@&#8203;alextran1502](https://github.com/alextran1502) in [#&#8203;24348](immich-app/immich#24348)
- fix(web): Add minimum content size to logo for consistent visual on small screens by [@&#8203;kiloomar](https://github.com/kiloomar) in [#&#8203;24372](immich-app/immich#24372)
- fix: use adjustment time in iOS for hash reset by [@&#8203;shenlong-tanwen](https://github.com/shenlong-tanwen) in [#&#8203;24047](immich-app/immich#24047)
- fix(server): update exiftool-vendored to v34 for more robust metadata extraction by [@&#8203;skatsubo](https://github.com/skatsubo) in [#&#8203;24424](immich-app/immich#24424)
- fix(mobile): cannot create album while name field is focused by [@&#8203;YarosMallorca](https://github.com/YarosMallorca) in [#&#8203;24449](immich-app/immich#24449)
- fix(web): \[album table view] long album title overflows table row by [@&#8203;simonkub](https://github.com/simonkub) in [#&#8203;24450](immich-app/immich#24450)
- fix(mobile): fix overflow text in backup card by [@&#8203;YarosMallorca](https://github.com/YarosMallorca) in [#&#8203;24448](immich-app/immich#24448)
- fix(mobile): timeline bottom padding on selection by [@&#8203;YarosMallorca](https://github.com/YarosMallorca) in [#&#8203;24480](immich-app/immich#24480)
- feat(mobile): Localized backup upload details page by [@&#8203;ArnyminerZ](https://github.com/ArnyminerZ) in [#&#8203;21136](immich-app/immich#21136)
- fix(mobile): iOS local permission dialog extra whitespace by [@&#8203;kurtmckee](https://github.com/kurtmckee) in [#&#8203;24491](immich-app/immich#24491)
- fix(mobile): versionStatus.message text overflow by [@&#8203;idubnori](https://github.com/idubnori) in [#&#8203;24504](immich-app/immich#24504)
- fix(server): prevent metadata extraction failures on large video files by [@&#8203;hubert-taieb](https://github.com/hubert-taieb) in [#&#8203;24094](immich-app/immich#24094)
- fix(web): show inferred timezone in date editor by [@&#8203;skatsubo](https://github.com/skatsubo) in [#&#8203;24513](immich-app/immich#24513)
- fix(mobile): local videos with '#' don't play on android by [@&#8203;YarosMallorca](https://github.com/YarosMallorca) in [#&#8203;24373](immich-app/immich#24373)
- fix: refresh appear in list after asset is added to a current or new album by [@&#8203;alextran1502](https://github.com/alextran1502) in [#&#8203;24523](immich-app/immich#24523)
- fix(mobile): birthday off by one day on remote by [@&#8203;YarosMallorca](https://github.com/YarosMallorca) in [#&#8203;24527](immich-app/immich#24527)
- fix(web): download panel being hidden by admin sidebar by [@&#8203;diogotcorreia](https://github.com/diogotcorreia) in [#&#8203;24583](immich-app/immich#24583)
- fix(web): recent search doesn't use search type by [@&#8203;YarosMallorca](https://github.com/YarosMallorca) in [#&#8203;24578](immich-app/immich#24578)
- fix(server): only extract image's duration if format supports animation by [@&#8203;meesfrensel](https://github.com/meesfrensel) in [#&#8203;24587](immich-app/immich#24587)
- fix(mobile): local delete missing from sheet on some routes  by [@&#8203;YarosMallorca](https://github.com/YarosMallorca) in [#&#8203;24505](immich-app/immich#24505)
- fix(mobile): better UI for metadata panel by [@&#8203;kao-byte](https://github.com/kao-byte) in [#&#8203;24428](immich-app/immich#24428)
- fix: shared link expiration and small styling by [@&#8203;alextran1502](https://github.com/alextran1502) in [#&#8203;24566](immich-app/immich#24566)
- fix: asset update race condition by [@&#8203;danieldietzler](https://github.com/danieldietzler) in [#&#8203;24384](immich-app/immich#24384)

##### 📚 Documentation

- docs: DB\_STORAGE\_TYPE is only used by the database container by [@&#8203;dionysius](https://github.com/dionysius) in [#&#8203;24215](immich-app/immich#24215)
- fix(docs): build `cli` for e2e tests by [@&#8203;roschaefer](https://github.com/roschaefer) in [#&#8203;24184](immich-app/immich#24184)
- docs(faq): add more info on archiving by [@&#8203;etnoy](https://github.com/etnoy) in [#&#8203;24326](immich-app/immich#24326)
- fix(docs): server and machine-learning use IMMICH\_HOST and IMMICH\_PORT by [@&#8203;dionysius](https://github.com/dionysius) in [#&#8203;24335](immich-app/immich#24335)
- fix: prevent OOM on nginx reverse proxy servers by [@&#8203;NicholasFlamy](https://github.com/NicholasFlamy) in [#&#8203;24351](immich-app/immich#24351)
- fix(docs): obsolete docs about rootless docker by [@&#8203;roschaefer](https://github.com/roschaefer) in [#&#8203;24376](immich-app/immich#24376)
- fix(docs): websockets in nginx example by [@&#8203;fourthwall](https://github.com/fourthwall) in [#&#8203;24411](immich-app/immich#24411)
- fix(docs): slow upload speed with example nginx reverse proxy config by [@&#8203;goalie2002](https://github.com/goalie2002) in [#&#8203;24490](immich-app/immich#24490)
- fix(docs): typo in maintenance mode command by [@&#8203;bartvanvelden](https://github.com/bartvanvelden) in [#&#8203;24518](immich-app/immich#24518)

##### 🌐 Translations

- chore: add new language requests by [@&#8203;danieldietzler](https://github.com/danieldietzler) in [#&#8203;23991](immich-app/immich#23991)
- chore(web): update translations by [@&#8203;weblate](https://github.com/weblate) in [#&#8203;24004](immich-app/immich#24004)

#### New Contributors

- [@&#8203;ujjwal123123](https://github.com/ujjwal123123) made their first contribution in [#&#8203;24101](immich-app/immich#24101)
- [@&#8203;lutostag](https://github.com/lutostag) made their first contribution in [#&#8203;23333](immich-app/immich#23333)
- [@&#8203;LukaPrebil](https://github.com/LukaPrebil) made their first contribution in [#&#8203;24045](immich-app/immich#24045)
- [@&#8203;kimsey0](https://github.com/kimsey0) made their first contribution in [#&#8203;24232](immich-app/immich#24232)
- [@&#8203;SaphuA](https://github.com/SaphuA) made their first contribution in [#&#8203;24240](immich-app/immich#24240)
- [@&#8203;dionysius](https://github.com/dionysius) made their first contribution in [#&#8203;24215](immich-app/immich#24215)
- [@&#8203;NiklasvonM](https://github.com/NiklasvonM) made their first contribution in [#&#8203;24249](immich-app/immich#24249)
- [@&#8203;kao-byte](https://github.com/kao-byte) made their first contribution in [#&#8203;24098](immich-app/immich#24098)
- [@&#8203;carbonemys](https://github.com/carbonemys) made their first contribution in [#&#8203;24289](immich-app/immich#24289)
- [@&#8203;kiloomar](https://github.com/kiloomar) made their first contribution in [#&#8203;24372](immich-app/immich#24372)
- [@&#8203;fourthwall](https://github.com/fourthwall) made their first contribution in [#&#8203;24411](immich-app/immich#24411)
- [@&#8203;simonkub](https://github.com/simonkub) made their first contribution in [#&#8203;24450](immich-app/immich#24450)
- [@&#8203;ArnyminerZ](https://github.com/ArnyminerZ) made their first contribution in [#&#8203;21136](immich-app/immich#21136)
- [@&#8203;kurtmckee](https://github.com/kurtmckee) made their first contribution in [#&#8203;24491](immich-app/immich#24491)
- [@&#8203;hubert-taieb](https://github.com/hubert-taieb) made their first contribution in [#&#8203;24094](immich-app/immich#24094)
- [@&#8203;bartvanvelden](https://github.com/bartvanvelden) made their first contribution in [#&#8203;24518](immich-app/immich#24518)

**Full Changelog**: <immich-app/immich@v2.3.1...v2.4.0>

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi4zOS4xIiwidXBkYXRlZEluVmVyIjoiNDIuMzkuMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiaW1hZ2UiXX0=-->

Reviewed-on: https://gitea.alexlebens.dev/alexlebens/infrastructure/pulls/2736
Co-authored-by: Renovate Bot <renovate-bot@alexlebens.net>
Co-committed-by: Renovate Bot <renovate-bot@alexlebens.net>
kiloomar pushed a commit to kiloomar/immich that referenced this pull request Jan 12, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

EXIF metadata not showing Error reading exif data - BatchCluster has ended, cannot enqueue -json ...

3 participants