Skip to content

fix(mobile): handle image stream completion when no image is emitted#25984

Merged
mertalev merged 5 commits intoimmich-app:mainfrom
LeLunZ:bugfix/image-not-loading
Feb 9, 2026
Merged

fix(mobile): handle image stream completion when no image is emitted#25984
mertalev merged 5 commits intoimmich-app:mainfrom
LeLunZ:bugfix/image-not-loading

Conversation

@LeLunZ
Copy link
Contributor

@LeLunZ LeLunZ commented Feb 6, 2026

Description

Issue:
Currently if you press on a loading Thumbnail (image not present), the new route (or how its called in flutter) gets created where the RemoteFullImageProvider will try to wait on the initialImageStream of the same Thumbnail (where the request is loading and is still the cache).

The problem: the Thumbnail widget calls .cancel on the Thumbnail provider after the RemoteFullImageProvider already loaded the provider RemoteThumbProvider(assetId: key.assetId, thumbhash: key.thumbhash).

So now the RemoteThumbProvider waits on the initialImage, while the Thumbnail widget canceled the request. So the provider never emits an image, and the RemoteFullImageProvider will wait forever.

So short: race condition because one calls cancel, while the other one waits on the request


In the current immich application there are 2 ways the image request can get cancelled:

  • by calling provider.cancel() (currently only the Thumbnail widget does that)
  • by the OneFramePlaceholderImageStreamCompleter if its disposed and invokes the callback

That makes it problematical, as no Widget actually owns an image/imagestream or whatever. So it actually shouldn't be able to forcefully cancel an image request.
It can be that the "same" stream is used by multiple widgets


The fix:

Instead of letting widgets call cancel or waiting till the OneFramePlaceholderImageStreamCompleter is disposed (whenever flutter engine decides to), I think we should just cancel the image if no more listener is subscribed to the ImageStream.

So I think I implemented the quickest fix with the addOnLastListenerRemovedCallback in the ImageStreamCompleter.

No need to call .cancel anymore from the widgets, its just important that you always unsubscribe the stream if you don't need it anymore (same as before).

Fixes #25723

How Has This Been Tested?

  • Tested locally by opening a bunch of images on a really slow network connection

Checklist:

  • I have performed a self-review of my own code
  • I have made corresponding changes to the documentation if applicable
  • I have no unrelated changes in the PR.
  • I have confirmed that any new dependencies are strictly necessary.
  • I have written tests for new code (if applicable)
  • I have followed naming conventions/patterns in the surrounding code
  • All code in src/services/ uses repositories implementations for database calls, filesystem operations, etc.
  • All code in src/repositories/ is pretty basic/simple and does not have any immich specific logic (that belongs in src/services/)

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

Getting a quick overview of the code, and some insights on where to investigate.

Copilot AI review requested due to automatic review settings February 6, 2026 22:13
@LeLunZ
Copy link
Contributor Author

LeLunZ commented Feb 6, 2026

@mertalev sorry for creating a new pr, seems I messed up something up with the branching in pr #25895 and included some other commits from another fix


Also now after having an actual fix, and not some workaround like throwing an error, the title of the PR doesn't make any sense anymore.

fix(mobile): fix image stream cancellation for multiple listeners

@LeLunZ
Copy link
Contributor Author

LeLunZ commented Feb 6, 2026

Also @mertalev

Another question, which does not really have anything to do with the issue but just in general:
Why are we waiting on the initialImageStream in the FullImageProviders? If the images already exists in cache OneFramePlaceholderImageStreamCompleter synchronously sets it as preview.
If the preview doesn't exist, why wait on it and not send the actual request directly instead?

From OneFramePlaceholderImageStreamCompleter

 /// The [initialImage] is an optional image that will be emitted synchronously
  /// until the first stream image is completed, useful as a thumbnail or placeholder.

Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR fixes a mobile image-loading race condition where opening an asset before its thumbnail finished loading could cause the full image to wait forever, by moving cancellation logic from widget disposal to ImageStream listener lifecycle.

Changes:

  • Removed widget-driven cancel() calls from Thumbnail disposal to avoid canceling shared in-flight requests.
  • Updated cancellable image providers to cancel when the last ImageStream listener is removed (instead of waiting for completer disposal).
  • Refactored OneFramePlaceholderImageStreamCompleter to use addOnLastListenerRemovedCallback for cancellation signaling.

Reviewed changes

Copilot reviewed 5 out of 5 changed files in this pull request and generated no comments.

Show a summary per file
File Description
mobile/lib/presentation/widgets/images/thumbnail.widget.dart Stops canceling image providers on widget dispose; relies on listener removal instead.
mobile/lib/presentation/widgets/images/thumb_hash_provider.dart Wires cancellation to “last listener removed” on the stream completer.
mobile/lib/presentation/widgets/images/remote_image_provider.dart Same cancellation wiring for remote thumb/full providers.
mobile/lib/presentation/widgets/images/local_image_provider.dart Same cancellation wiring for local thumb/full providers.
mobile/lib/presentation/widgets/images/one_frame_multi_image_stream_completer.dart Switches from onDisposed to addOnLastListenerRemovedCallback to trigger cancellation.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Copy link
Member

@mertalev mertalev left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

addOnLastListenerRemovedCallback was what this code used to use and I agree it's a cleaner approach, but it rarely gets called and when it does it's way too late. The Thumbnail widget canceling on dispose is a much more reliable way to actually cancel image requests.

@LeLunZ
Copy link
Contributor Author

LeLunZ commented Feb 7, 2026

@mertalev Hm, just saw in the docs addOnLastListenerRemovedCallback is only called when there are no keepAlive Handler outstanding. So this delays the removal a bit.

I have pushed another change, where we have a synchronous onLastListenerRemoved invocation. This should now have the same timing as the previous implementation where .cancel was called from the component.


But if this is also not wanted, what else do you suggest?
Other things that come to my mind:

  • we have to check in the ThumbnailWidget before calling .cancel if the next route actually uses the image we want to cancel. And if the image is used, we don't cancel.
  • we say, the ThumbnailWidget has full control over the stream, and just let it cancel, but then we need some way of telling other subscribers that no more frames will come, by eg. throwing an error if listeners are still subscribed.

The bug is really annoying, so it would be cool if we could find a fix :) because if you see a blurry image in the Gallery, and already know its the image you want to open, you currently still have to wait till the full thumbnail is shown or else this bug will happen.

Copy link
Member

@mertalev mertalev left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There are many possible approaches here, like making the thumbnail widget not cancel on tap (though this also needs care since disposal happens a lot and doing expensive checks for this will slow things down), marking a request so it can only be canceled by a full-size provider and not a thumbnail provider, tweaking the initial stream / getInitialImage behavior, etc. I'm not sure which is the best approach, but this approach has a higher chance of performance regression than others.

@mertalev
Copy link
Member

mertalev commented Feb 9, 2026

I did some profiling and didn't identify any regressions, which makes this a strictly better solution since it avoids image provider ownership issues.
horizon_with_coverage

@mertalev mertalev merged commit 561469b into immich-app:main Feb 9, 2026
47 of 48 checks passed
dadezzz pushed a commit to dadezzz/kubernetes that referenced this pull request Feb 11, 2026
This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [ghcr.io/immich-app/immich-machine-learning](https://github.com/immich-app/immich) | patch | `v2.5.5` → `v2.5.6` |
| [ghcr.io/immich-app/immich-server](https://github.com/immich-app/immich) | patch | `v2.5.5` → `v2.5.6` |

---

> ⚠️ **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.5.6`](https://github.com/immich-app/immich/releases/tag/v2.5.6)

[Compare Source](immich-app/immich@v2.5.5...v2.5.6)

##### v2.5.6

This patch release addresses the following issues

- Fixed an issue where thumbnail generation runs every night when `full-size image generation` option is enabled.
- Fixed an issue where iOS is slow to start in some cases.
- Fixed an issue where Android device cannot delete asset using Free Up Space feature if it has more than a few thousand assets

<!-- Release notes generated using configuration in .github/release.yml at v2.5.6 -->

##### 🐛 Bug fixes

- fix: enhance album sorting functionality with order handling by [@&#8203;LeLunZ](https://github.com/LeLunZ) in [#&#8203;24816](immich-app/immich#24816)
- fix: add missing translations for image editor by [@&#8203;michelheusschen](https://github.com/michelheusschen) in [#&#8203;25957](immich-app/immich#25957)
- fix: image and video download complete notification shows "file\_name" by [@&#8203;romoisverycool](https://github.com/romoisverycool) in [#&#8203;25975](immich-app/immich#25975)
- fix: user profile refetched each time on opening app dialog by [@&#8203;shenlong-tanwen](https://github.com/shenlong-tanwen) in [#&#8203;25992](immich-app/immich#25992)
- fix: improve albums page load time on firefox by [@&#8203;michelheusschen](https://github.com/michelheusschen) in [#&#8203;26025](immich-app/immich#26025)
- fix: reduce queue graph jitter and include paused count by [@&#8203;michelheusschen](https://github.com/michelheusschen) in [#&#8203;26023](immich-app/immich#26023)
- fix(web): toast fixed location by [@&#8203;YarosMallorca](https://github.com/YarosMallorca) in [#&#8203;25966](immich-app/immich#25966)
- fix: scroll jump when opening show & hide people by [@&#8203;michelheusschen](https://github.com/michelheusschen) in [#&#8203;25932](immich-app/immich#25932)
- fix(web): display storage unit next to value instead of absolute positioning in admin user page by [@&#8203;K0lin](https://github.com/K0lin) in [#&#8203;25985](immich-app/immich#25985)
- fix: iOS slow start by [@&#8203;alextran1502](https://github.com/alextran1502) in [#&#8203;26043](immich-app/immich#26043)
- fix: profile dialog auto dismiss after opening on iPad by [@&#8203;alextran1502](https://github.com/alextran1502) in [#&#8203;26046](immich-app/immich#26046)
- fix(web): prevent context menu from overflowing viewport by [@&#8203;ttpss930141011](https://github.com/ttpss930141011) in [#&#8203;26041](immich-app/immich#26041)
- fix: slideshow setting dropdown overflow by [@&#8203;michelheusschen](https://github.com/michelheusschen) in [#&#8203;26066](immich-app/immich#26066)
- fix: free up space using small batch size to reliably work on Android by [@&#8203;alextran1502](https://github.com/alextran1502) in [#&#8203;26047](immich-app/immich#26047)
- fix(web): removing a person in an asset, doesn't remove the asset in … by [@&#8203;dolfje](https://github.com/dolfje) in [#&#8203;26068](immich-app/immich#26068)
- fix(mobile): handle image stream completion when no image is emitted by [@&#8203;LeLunZ](https://github.com/LeLunZ) in [#&#8203;25984](immich-app/immich#25984)
- fix: evict image from cache on error during image loading by [@&#8203;LeLunZ](https://github.com/LeLunZ) in [#&#8203;26078](immich-app/immich#26078)
- fix(server): thumbnail queueing by [@&#8203;mertalev](https://github.com/mertalev) in [#&#8203;26077](immich-app/immich#26077)
- fix: create face exif orientation handling by [@&#8203;bwees](https://github.com/bwees) in [#&#8203;26108](immich-app/immich#26108)
- fix(web): refresh text by [@&#8203;jrasm91](https://github.com/jrasm91) in [#&#8203;26071](immich-app/immich#26071)
- fix: correctly cancel select all assets by [@&#8203;michelheusschen](https://github.com/michelheusschen) in [#&#8203;26067](immich-app/immich#26067)
- fix: person thumbnail generation on edited assets by [@&#8203;bwees](https://github.com/bwees) in [#&#8203;26112](immich-app/immich#26112)
- fix: local date time group fall back by [@&#8203;alextran1502](https://github.com/alextran1502) in [#&#8203;26110](immich-app/immich#26110)

##### 📚 Documentation

- feat(docs): version policy by [@&#8203;mmomjian](https://github.com/mmomjian) in [#&#8203;25979](immich-app/immich#25979)
- feat(deployment): rootless compose file  by [@&#8203;mmomjian](https://github.com/mmomjian) in [#&#8203;25931](immich-app/immich#25931)
- docs: update ml-hardware-acceleration.md by [@&#8203;cmrtdev](https://github.com/cmrtdev) in [#&#8203;25755](immich-app/immich#25755)

##### 🌐 Translations

- chore(web): update translations by [@&#8203;weblate](https://github.com/weblate) in [#&#8203;25947](immich-app/immich#25947)

##### New Contributors

- [@&#8203;ttpss930141011](https://github.com/ttpss930141011) made their first contribution in [#&#8203;26041](immich-app/immich#26041)
- [@&#8203;dolfje](https://github.com/dolfje) made their first contribution in [#&#8203;26068](immich-app/immich#26068)
- [@&#8203;cmrtdev](https://github.com/cmrtdev) made their first contribution in [#&#8203;25755](immich-app/immich#25755)
- [@&#8203;nicosemp](https://github.com/nicosemp) made their first contribution in [#&#8203;25599](immich-app/immich#25599)

**Full Changelog**: <immich-app/immich@v2.5.5...v2.5.6>

</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:eyJjcmVhdGVkSW5WZXIiOiI0Mi45Ni4yIiwidXBkYXRlZEluVmVyIjoiNDIuOTYuMiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Co-authored-by: Renovate Bot <renovate@zarantonello.dev>
Co-committed-by: Renovate Bot <renovate@zarantonello.dev>
kiloomar pushed a commit to kiloomar/immich that referenced this pull request Feb 13, 2026
…mmich-app#25984)

* Fix image cancellation to be stream-scoped instead of widget-scoped

* fix(OneFramePlaceholderImageStreamCompleter): make onLastListenerRemoved callback synchronous with removing the last listener

* fix(OneFrameMultiImageStreamCompleter): remove unnecessary blank line in code

* fix(OneFramePlaceholderImageStreamCompleter): cancel pending requests when only cache listener remains

* fix(OneFrameMultiImageStreamCompleter): ensure onLastListenerRemoved callback is invoked only once
renovate bot added a commit to sdwilsh/ansible-playbooks that referenced this pull request Feb 19, 2026
##### [\`v2.5.6\`](https://github.com/immich-app/immich/releases/tag/v2.5.6)

##### v2.5.6

This patch release addresses the following issues

- Fixed an issue where thumbnail generation runs every night when `full-size image generation` option is enabled.
- Fixed an issue where iOS is slow to start in some cases.
- Fixed an issue where Android device cannot delete asset using Free Up Space feature if it has more than a few thousand assets

<!-- Release notes generated using configuration in .github/release.yml at v2.5.6 -->

##### 🐛 Bug fixes

- fix: enhance album sorting functionality with order handling by [@LeLunZ](https://github.com/LeLunZ) in [#24816](immich-app/immich#24816)
- fix: add missing translations for image editor by [@michelheusschen](https://github.com/michelheusschen) in [#25957](immich-app/immich#25957)
- fix: image and video download complete notification shows "file\_name" by [@romoisverycool](https://github.com/romoisverycool) in [#25975](immich-app/immich#25975)
- fix: user profile refetched each time on opening app dialog by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#25992](immich-app/immich#25992)
- fix: improve albums page load time on firefox by [@michelheusschen](https://github.com/michelheusschen) in [#26025](immich-app/immich#26025)
- fix: reduce queue graph jitter and include paused count by [@michelheusschen](https://github.com/michelheusschen) in [#26023](immich-app/immich#26023)
- fix(web): toast fixed location by [@YarosMallorca](https://github.com/YarosMallorca) in [#25966](immich-app/immich#25966)
- fix: scroll jump when opening show & hide people by [@michelheusschen](https://github.com/michelheusschen) in [#25932](immich-app/immich#25932)
- fix(web): display storage unit next to value instead of absolute positioning in admin user page by [@K0lin](https://github.com/K0lin) in [#25985](immich-app/immich#25985)
- fix: iOS slow start by [@alextran1502](https://github.com/alextran1502) in [#26043](immich-app/immich#26043)
- fix: profile dialog auto dismiss after opening on iPad by [@alextran1502](https://github.com/alextran1502) in [#26046](immich-app/immich#26046)
- fix(web): prevent context menu from overflowing viewport by [@ttpss930141011](https://github.com/ttpss930141011) in [#26041](immich-app/immich#26041)
- fix: slideshow setting dropdown overflow by [@michelheusschen](https://github.com/michelheusschen) in [#26066](immich-app/immich#26066)
- fix: free up space using small batch size to reliably work on Android by [@alextran1502](https://github.com/alextran1502) in [#26047](immich-app/immich#26047)
- fix(web): removing a person in an asset, doesn't remove the asset in … by [@dolfje](https://github.com/dolfje) in [#26068](immich-app/immich#26068)
- fix(mobile): handle image stream completion when no image is emitted by [@LeLunZ](https://github.com/LeLunZ) in [#25984](immich-app/immich#25984)
- fix: evict image from cache on error during image loading by [@LeLunZ](https://github.com/LeLunZ) in [#26078](immich-app/immich#26078)
- fix(server): thumbnail queueing by [@mertalev](https://github.com/mertalev) in [#26077](immich-app/immich#26077)
- fix: create face exif orientation handling by [@bwees](https://github.com/bwees) in [#26108](immich-app/immich#26108)
- fix(web): refresh text by [@jrasm91](https://github.com/jrasm91) in [#26071](immich-app/immich#26071)
- fix: correctly cancel select all assets by [@michelheusschen](https://github.com/michelheusschen) in [#26067](immich-app/immich#26067)
- fix: person thumbnail generation on edited assets by [@bwees](https://github.com/bwees) in [#26112](immich-app/immich#26112)
- fix: local date time group fall back by [@alextran1502](https://github.com/alextran1502) in [#26110](immich-app/immich#26110)

##### 📚 Documentation

- feat(docs): version policy by [@mmomjian](https://github.com/mmomjian) in [#25979](immich-app/immich#25979)
- feat(deployment): rootless compose file  by [@mmomjian](https://github.com/mmomjian) in [#25931](immich-app/immich#25931)
- docs: update ml-hardware-acceleration.md by [@cmrtdev](https://github.com/cmrtdev) in [#25755](immich-app/immich#25755)

##### 🌐 Translations

- chore(web): update translations by [@weblate](https://github.com/weblate) in [#25947](immich-app/immich#25947)

##### New Contributors

- [@ttpss930141011](https://github.com/ttpss930141011) made their first contribution in [#26041](immich-app/immich#26041)
- [@dolfje](https://github.com/dolfje) made their first contribution in [#26068](immich-app/immich#26068)
- [@cmrtdev](https://github.com/cmrtdev) made their first contribution in [#25755](immich-app/immich#25755)
- [@nicosemp](https://github.com/nicosemp) made their first contribution in [#25599](immich-app/immich#25599)

**Full Changelog**: <immich-app/immich@v2.5.5...v2.5.6>

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

##### v2.5.5

*`v2.5.4` was in the way of getting out, and we got another annoyance bug fixed, so we rolled it into `v2.5.5`*

Happy Friday! This release addresses more bugs from the `v2.5.0` release. Enjoy!

- Fixed an issue where changing the timezone on the web changes the time instead of the timezone
- Fixed an issue where background task on iOS don't get triggered as often
- Fixes some issues regarding the usage of self-signed certificate and mLTS on the mobile app

##### 🐛 Bug fixes

- fix(mobile): cancel share download when dialog is dismissed by [@cmdPromptCritical](https://github.com/cmdPromptCritical) in [#25466](immich-app/immich#25466)
- fix: album dto docs by [@jrasm91](https://github.com/jrasm91) in [#25873](immich-app/immich#25873)
- fix: null validation by [@jrasm91](https://github.com/jrasm91) in [#25891](immich-app/immich#25891)
- fix(server): deleting stacked assets by [@jrasm91](https://github.com/jrasm91) in [#25874](immich-app/immich#25874)
- fix: close tag modal after tagging assets by [@michelheusschen](https://github.com/michelheusschen) in [#25884](immich-app/immich#25884)
- fix: correctly sync shared link download with metadata toggle by [@michelheusschen](https://github.com/michelheusschen) in [#25885](immich-app/immich#25885)
- fix: date time picker text color in dark mode by [@alextran1502](https://github.com/alextran1502) in [#25883](immich-app/immich#25883)
- fix: allow null tagIds in search dto by [@michelheusschen](https://github.com/michelheusschen) in [#25920](immich-app/immich#25920)
- fix: improve asset editor exit handling by [@michelheusschen](https://github.com/michelheusschen) in [#25917](immich-app/immich#25917)
- fix: make switch labels properly clickable by [@michelheusschen](https://github.com/michelheusschen) in [#25898](immich-app/immich#25898)
- fix: ensure theme stays in sync with [@immich/ui](https://github.com/immich/ui) by [@michelheusschen](https://github.com/michelheusschen) in [#25922](immich-app/immich#25922)
- fix: preserve hidden people state across pagination by [@michelheusschen](https://github.com/michelheusschen) in [#25886](immich-app/immich#25886)
- fix: file name search label by [@alextran1502](https://github.com/alextran1502) in [#25916](immich-app/immich#25916)
- fix(mobile): mtls on native clients by [@mertalev](https://github.com/mertalev) in [#25802](immich-app/immich#25802)
- fix: time zone upserts by [@danieldietzler](https://github.com/danieldietzler) in [#25889](immich-app/immich#25889)
- fix(web): Ensure profile picture is cropped to 1:1 ratio by [@aditya-ai-architect](https://github.com/aditya-ai-architect) in [#25892](immich-app/immich#25892)
- fix(mobile): reset asset index on timeline refresh by [@uhthomas](https://github.com/uhthomas) in [#25729](immich-app/immich#25729)
- fix: timezone in timeline bucketing by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#25894](immich-app/immich#25894)
- fix(mobile): Update preview and PageController position when the asset count decreases while the last item is selected by [@PeterOmbodi](https://github.com/PeterOmbodi) in [#25563](immich-app/immich#25563)
- fix(server): use provided database username for restore & ensure name is not mangled by [@insertish](https://github.com/insertish) in [#25679](immich-app/immich#25679)
- fix: image download complete notification shows an extra {file\_name} template tag by [@romoisverycool](https://github.com/romoisverycool) in [#25936](immich-app/immich#25936)
- fix: face and edit handling by [@bwees](https://github.com/bwees) in [#25738](immich-app/immich#25738)
- fix: queue assets missing fullsize files for thumbnail regeneration by [@midzelis](https://github.com/midzelis) in [#25794](immich-app/immich#25794)
- fix: dedupe version announcement modal by [@jrasm91](https://github.com/jrasm91) in [#25946](immich-app/immich#25946)
- fix(cli): suppress startup messages for immich-admin by [@VahantSharma](https://github.com/VahantSharma) in [#25928](immich-app/immich#25928)

##### 📚 Documentation

- docs: update manual backup/restore to match the automatic process by [@insertish](https://github.com/insertish) in [#25924](immich-app/immich#25924)
- fix(docs): add missing --json-output arg to CLI example by [@Xiol](https://github.com/Xiol) in [#25870](immich-app/immich#25870)
- docs: remove writeTimeout on traefik example by [@kaysond](https://github.com/kaysond) in [#25837](immich-app/immich#25837)

##### 🌐 Translations

- chore(web): update translations by [@weblate](https://github.com/weblate) in [#25585](immich-app/immich#25585)

##### New Contributors

- [@aditya-ai-architect](https://github.com/aditya-ai-architect) made their first contribution in [#25892](immich-app/immich#25892)
- [@VahantSharma](https://github.com/VahantSharma) made their first contribution in [#25927](immich-app/immich#25927)
- [@Xiol](https://github.com/Xiol) made their first contribution in [#25870](immich-app/immich#25870)
- [@cmdPromptCritical](https://github.com/cmdPromptCritical) made their first contribution in [#25466](immich-app/immich#25466)
- [@romoisverycool](https://github.com/romoisverycool) made their first contribution in [#25936](immich-app/immich#25936)
- [@didekoning](https://github.com/didekoning) made their first contribution in [#25937](immich-app/immich#25937)

**Full Changelog**: <immich-app/immich@v2.5.3...v2.5.5>

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

##### What's Changed

##### 🐛 Bug fixes

- chore: remove random code snippet by [@jrasm91](https://github.com/jrasm91) in [#25677](immich-app/immich#25677)
- fix: reset and unsaved change states in editor by [@bwees](https://github.com/bwees) in [#25588](immich-app/immich#25588)
- fix: no notification if release check is disabled by [@jrasm91](https://github.com/jrasm91) in [#25688](immich-app/immich#25688)
- fix(mobile): hide latest version if disabled by [@uhthomas](https://github.com/uhthomas) in [#25691](immich-app/immich#25691)
- fix(web): enable asset viewer navigation across memory boundaries by [@midzelis](https://github.com/midzelis) in [#25741](immich-app/immich#25741)
- fix: upload progress bar flickering by [@alextran1502](https://github.com/alextran1502) in [#25829](immich-app/immich#25829)
- fix: prevent stale values in edit user form after save by [@michelheusschen](https://github.com/michelheusschen) in [#25859](immich-app/immich#25859)
- fix: prevent album page get rebuilt when resuming app by [@alextran1502](https://github.com/alextran1502) in [#25862](immich-app/immich#25862)
- fix: prevent backspace from accidentally triggering delete modals by [@michelheusschen](https://github.com/michelheusschen) in [#25858](immich-app/immich#25858)
- fix: metadata extraction race condition by [@danieldietzler](https://github.com/danieldietzler) in [#25866](immich-app/immich#25866)
- fix: reset zoom when navigating between assets by [@michelheusschen](https://github.com/michelheusschen) in [#25863](immich-app/immich#25863)

##### 📚 Documentation

- docs(openapi): Add descriptions to OpenAPI specification by [@timonrieger](https://github.com/timonrieger) in [#25185](immich-app/immich#25185)
- fix(docs): clarify supported vector version  by [@mmomjian](https://github.com/mmomjian) in [#25753](immich-app/immich#25753)

**Full Changelog**: <immich-app/immich@v2.5.2...v2.5.3>
renovate bot added a commit to sdwilsh/ansible-playbooks that referenced this pull request Feb 19, 2026
##### [\`v2.5.6\`](https://github.com/immich-app/immich/releases/tag/v2.5.6)

##### v2.5.6

This patch release addresses the following issues

- Fixed an issue where thumbnail generation runs every night when `full-size image generation` option is enabled.
- Fixed an issue where iOS is slow to start in some cases.
- Fixed an issue where Android device cannot delete asset using Free Up Space feature if it has more than a few thousand assets

<!-- Release notes generated using configuration in .github/release.yml at v2.5.6 -->

##### 🐛 Bug fixes

- fix: enhance album sorting functionality with order handling by [@LeLunZ](https://github.com/LeLunZ) in [#24816](immich-app/immich#24816)
- fix: add missing translations for image editor by [@michelheusschen](https://github.com/michelheusschen) in [#25957](immich-app/immich#25957)
- fix: image and video download complete notification shows "file\_name" by [@romoisverycool](https://github.com/romoisverycool) in [#25975](immich-app/immich#25975)
- fix: user profile refetched each time on opening app dialog by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#25992](immich-app/immich#25992)
- fix: improve albums page load time on firefox by [@michelheusschen](https://github.com/michelheusschen) in [#26025](immich-app/immich#26025)
- fix: reduce queue graph jitter and include paused count by [@michelheusschen](https://github.com/michelheusschen) in [#26023](immich-app/immich#26023)
- fix(web): toast fixed location by [@YarosMallorca](https://github.com/YarosMallorca) in [#25966](immich-app/immich#25966)
- fix: scroll jump when opening show & hide people by [@michelheusschen](https://github.com/michelheusschen) in [#25932](immich-app/immich#25932)
- fix(web): display storage unit next to value instead of absolute positioning in admin user page by [@K0lin](https://github.com/K0lin) in [#25985](immich-app/immich#25985)
- fix: iOS slow start by [@alextran1502](https://github.com/alextran1502) in [#26043](immich-app/immich#26043)
- fix: profile dialog auto dismiss after opening on iPad by [@alextran1502](https://github.com/alextran1502) in [#26046](immich-app/immich#26046)
- fix(web): prevent context menu from overflowing viewport by [@ttpss930141011](https://github.com/ttpss930141011) in [#26041](immich-app/immich#26041)
- fix: slideshow setting dropdown overflow by [@michelheusschen](https://github.com/michelheusschen) in [#26066](immich-app/immich#26066)
- fix: free up space using small batch size to reliably work on Android by [@alextran1502](https://github.com/alextran1502) in [#26047](immich-app/immich#26047)
- fix(web): removing a person in an asset, doesn't remove the asset in … by [@dolfje](https://github.com/dolfje) in [#26068](immich-app/immich#26068)
- fix(mobile): handle image stream completion when no image is emitted by [@LeLunZ](https://github.com/LeLunZ) in [#25984](immich-app/immich#25984)
- fix: evict image from cache on error during image loading by [@LeLunZ](https://github.com/LeLunZ) in [#26078](immich-app/immich#26078)
- fix(server): thumbnail queueing by [@mertalev](https://github.com/mertalev) in [#26077](immich-app/immich#26077)
- fix: create face exif orientation handling by [@bwees](https://github.com/bwees) in [#26108](immich-app/immich#26108)
- fix(web): refresh text by [@jrasm91](https://github.com/jrasm91) in [#26071](immich-app/immich#26071)
- fix: correctly cancel select all assets by [@michelheusschen](https://github.com/michelheusschen) in [#26067](immich-app/immich#26067)
- fix: person thumbnail generation on edited assets by [@bwees](https://github.com/bwees) in [#26112](immich-app/immich#26112)
- fix: local date time group fall back by [@alextran1502](https://github.com/alextran1502) in [#26110](immich-app/immich#26110)

##### 📚 Documentation

- feat(docs): version policy by [@mmomjian](https://github.com/mmomjian) in [#25979](immich-app/immich#25979)
- feat(deployment): rootless compose file  by [@mmomjian](https://github.com/mmomjian) in [#25931](immich-app/immich#25931)
- docs: update ml-hardware-acceleration.md by [@cmrtdev](https://github.com/cmrtdev) in [#25755](immich-app/immich#25755)

##### 🌐 Translations

- chore(web): update translations by [@weblate](https://github.com/weblate) in [#25947](immich-app/immich#25947)

##### New Contributors

- [@ttpss930141011](https://github.com/ttpss930141011) made their first contribution in [#26041](immich-app/immich#26041)
- [@dolfje](https://github.com/dolfje) made their first contribution in [#26068](immich-app/immich#26068)
- [@cmrtdev](https://github.com/cmrtdev) made their first contribution in [#25755](immich-app/immich#25755)
- [@nicosemp](https://github.com/nicosemp) made their first contribution in [#25599](immich-app/immich#25599)

**Full Changelog**: <immich-app/immich@v2.5.5...v2.5.6>

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

##### v2.5.5

*`v2.5.4` was in the way of getting out, and we got another annoyance bug fixed, so we rolled it into `v2.5.5`*

Happy Friday! This release addresses more bugs from the `v2.5.0` release. Enjoy!

- Fixed an issue where changing the timezone on the web changes the time instead of the timezone
- Fixed an issue where background task on iOS don't get triggered as often
- Fixes some issues regarding the usage of self-signed certificate and mLTS on the mobile app

##### 🐛 Bug fixes

- fix(mobile): cancel share download when dialog is dismissed by [@cmdPromptCritical](https://github.com/cmdPromptCritical) in [#25466](immich-app/immich#25466)
- fix: album dto docs by [@jrasm91](https://github.com/jrasm91) in [#25873](immich-app/immich#25873)
- fix: null validation by [@jrasm91](https://github.com/jrasm91) in [#25891](immich-app/immich#25891)
- fix(server): deleting stacked assets by [@jrasm91](https://github.com/jrasm91) in [#25874](immich-app/immich#25874)
- fix: close tag modal after tagging assets by [@michelheusschen](https://github.com/michelheusschen) in [#25884](immich-app/immich#25884)
- fix: correctly sync shared link download with metadata toggle by [@michelheusschen](https://github.com/michelheusschen) in [#25885](immich-app/immich#25885)
- fix: date time picker text color in dark mode by [@alextran1502](https://github.com/alextran1502) in [#25883](immich-app/immich#25883)
- fix: allow null tagIds in search dto by [@michelheusschen](https://github.com/michelheusschen) in [#25920](immich-app/immich#25920)
- fix: improve asset editor exit handling by [@michelheusschen](https://github.com/michelheusschen) in [#25917](immich-app/immich#25917)
- fix: make switch labels properly clickable by [@michelheusschen](https://github.com/michelheusschen) in [#25898](immich-app/immich#25898)
- fix: ensure theme stays in sync with [@immich/ui](https://github.com/immich/ui) by [@michelheusschen](https://github.com/michelheusschen) in [#25922](immich-app/immich#25922)
- fix: preserve hidden people state across pagination by [@michelheusschen](https://github.com/michelheusschen) in [#25886](immich-app/immich#25886)
- fix: file name search label by [@alextran1502](https://github.com/alextran1502) in [#25916](immich-app/immich#25916)
- fix(mobile): mtls on native clients by [@mertalev](https://github.com/mertalev) in [#25802](immich-app/immich#25802)
- fix: time zone upserts by [@danieldietzler](https://github.com/danieldietzler) in [#25889](immich-app/immich#25889)
- fix(web): Ensure profile picture is cropped to 1:1 ratio by [@aditya-ai-architect](https://github.com/aditya-ai-architect) in [#25892](immich-app/immich#25892)
- fix(mobile): reset asset index on timeline refresh by [@uhthomas](https://github.com/uhthomas) in [#25729](immich-app/immich#25729)
- fix: timezone in timeline bucketing by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#25894](immich-app/immich#25894)
- fix(mobile): Update preview and PageController position when the asset count decreases while the last item is selected by [@PeterOmbodi](https://github.com/PeterOmbodi) in [#25563](immich-app/immich#25563)
- fix(server): use provided database username for restore & ensure name is not mangled by [@insertish](https://github.com/insertish) in [#25679](immich-app/immich#25679)
- fix: image download complete notification shows an extra {file\_name} template tag by [@romoisverycool](https://github.com/romoisverycool) in [#25936](immich-app/immich#25936)
- fix: face and edit handling by [@bwees](https://github.com/bwees) in [#25738](immich-app/immich#25738)
- fix: queue assets missing fullsize files for thumbnail regeneration by [@midzelis](https://github.com/midzelis) in [#25794](immich-app/immich#25794)
- fix: dedupe version announcement modal by [@jrasm91](https://github.com/jrasm91) in [#25946](immich-app/immich#25946)
- fix(cli): suppress startup messages for immich-admin by [@VahantSharma](https://github.com/VahantSharma) in [#25928](immich-app/immich#25928)

##### 📚 Documentation

- docs: update manual backup/restore to match the automatic process by [@insertish](https://github.com/insertish) in [#25924](immich-app/immich#25924)
- fix(docs): add missing --json-output arg to CLI example by [@Xiol](https://github.com/Xiol) in [#25870](immich-app/immich#25870)
- docs: remove writeTimeout on traefik example by [@kaysond](https://github.com/kaysond) in [#25837](immich-app/immich#25837)

##### 🌐 Translations

- chore(web): update translations by [@weblate](https://github.com/weblate) in [#25585](immich-app/immich#25585)

##### New Contributors

- [@aditya-ai-architect](https://github.com/aditya-ai-architect) made their first contribution in [#25892](immich-app/immich#25892)
- [@VahantSharma](https://github.com/VahantSharma) made their first contribution in [#25927](immich-app/immich#25927)
- [@Xiol](https://github.com/Xiol) made their first contribution in [#25870](immich-app/immich#25870)
- [@cmdPromptCritical](https://github.com/cmdPromptCritical) made their first contribution in [#25466](immich-app/immich#25466)
- [@romoisverycool](https://github.com/romoisverycool) made their first contribution in [#25936](immich-app/immich#25936)
- [@didekoning](https://github.com/didekoning) made their first contribution in [#25937](immich-app/immich#25937)

**Full Changelog**: <immich-app/immich@v2.5.3...v2.5.5>

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

##### What's Changed

##### 🐛 Bug fixes

- chore: remove random code snippet by [@jrasm91](https://github.com/jrasm91) in [#25677](immich-app/immich#25677)
- fix: reset and unsaved change states in editor by [@bwees](https://github.com/bwees) in [#25588](immich-app/immich#25588)
- fix: no notification if release check is disabled by [@jrasm91](https://github.com/jrasm91) in [#25688](immich-app/immich#25688)
- fix(mobile): hide latest version if disabled by [@uhthomas](https://github.com/uhthomas) in [#25691](immich-app/immich#25691)
- fix(web): enable asset viewer navigation across memory boundaries by [@midzelis](https://github.com/midzelis) in [#25741](immich-app/immich#25741)
- fix: upload progress bar flickering by [@alextran1502](https://github.com/alextran1502) in [#25829](immich-app/immich#25829)
- fix: prevent stale values in edit user form after save by [@michelheusschen](https://github.com/michelheusschen) in [#25859](immich-app/immich#25859)
- fix: prevent album page get rebuilt when resuming app by [@alextran1502](https://github.com/alextran1502) in [#25862](immich-app/immich#25862)
- fix: prevent backspace from accidentally triggering delete modals by [@michelheusschen](https://github.com/michelheusschen) in [#25858](immich-app/immich#25858)
- fix: metadata extraction race condition by [@danieldietzler](https://github.com/danieldietzler) in [#25866](immich-app/immich#25866)
- fix: reset zoom when navigating between assets by [@michelheusschen](https://github.com/michelheusschen) in [#25863](immich-app/immich#25863)

##### 📚 Documentation

- docs(openapi): Add descriptions to OpenAPI specification by [@timonrieger](https://github.com/timonrieger) in [#25185](immich-app/immich#25185)
- fix(docs): clarify supported vector version  by [@mmomjian](https://github.com/mmomjian) in [#25753](immich-app/immich#25753)

**Full Changelog**: <immich-app/immich@v2.5.2...v2.5.3>

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
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.

Mobile: Image doesn’t load if clicked before thumbnail has finished loading

3 participants