Skip to content

fix(ml): stabilize MIGraphX inference - #28444

Merged
mertalev merged 5 commits into
immich-app:mainfrom
fabianwimberger:fix/migraphx-rocm-stability
May 26, 2026
Merged

mertalev merged 5 commits into
immich-app:mainfrom
fabianwimberger:fix/migraphx-rocm-stability

Conversation

@fabianwimberger

Copy link
Copy Markdown
Contributor

Description

Fixes #27387

ROCm machine-learning containers can crash when multiple requests reach MIGraphX sessions before the lazy compilation step has finished. This serializes MIGraphX-backed ONNX Runtime runs inside the worker, so those first compiles cannot overlap.

Face recognition also used dynamic ONNX batching by default. With MIGraphX this caused a separate cached program to be compiled for each detected face count in an image. This keeps the default face-recognition batch size at 1 for MIGraphX, matching the existing fixed-batch behavior used for OpenVINO.

How Has This Been Tested?

  • uv run --extra cpu pytest test_main.py -q
  • uv run ruff check immich_ml test_main.py
  • Built immich-machine-learning with DEVICE=rocm
  • Ran face detection and smart search jobs against a ROCm ML container on a Radeon RX 7900 XTX

Screenshots (if appropriate)

N/A

Checklist:

  • I have carefully read CONTRIBUTING.md
  • 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.

Used to help implement, test, and prepare the change.

Serialize MIGraphX session runs so lazy compiles cannot overlap within a worker.

Use a fixed face-recognition batch size for MIGraphX to avoid compiling a new program for each detected face count.
@sztupy

sztupy commented May 15, 2026 •

Copy link
Copy Markdown

I'm just doing an import of 400k pictures, so this would be great if works. Currently I'm downgraded to v2.4.1.

Let me see if I can get this running locally

@fabianwimberger

fabianwimberger commented May 15, 2026 •

Copy link
Copy Markdown
Contributor Author

Follow-up from testing on my second device (Ryzen AI HX 370 / Radeon 890M || No HSA_OVERRIDE):

The public test image is now available as ghcr.io/fabianwimberger/immich-machine-learning:migraphx-stability-rocm. It is built from this PR branch.

For testers: the first facial-recognition run will still spend a long time in MIGraphX compilation, especially for buffalo_l. Before the batch-size part of this fix, recognition could compile again for every dynamic face-count batch shape, such as 1 face, 2 faces, 3 faces and so on. This PR forces MIGraphX recognition to batch size 1, so that compile should happen for the fixed recognition shape instead of every face-count combination, saving a lot of time.

Because this image is built from current main, OCR may not work right now. There appears to be next-release OCR preparation on main, so for this image I would focus testing on smart search and facial recognition.

@mertalev

Copy link
Copy Markdown
Member

Thanks for the PR. There are recent seemingly relevant issues about this upstream (here, here and here). Serializing requests with a lock is a poor solution; I'd much rather find a different workaround for this. There are a few things to try (ideally one at a time to isolate any difference in behavior):

  1. Use rocm/dev-ubuntu-24.04:7.2.3-complete instead of rocm/dev-ubuntu-24.04:7.2-complete
  2. Update onnxruntime-migraphx to 1.25.0
  3. Set MIGRAPHX_DISABLE_MIOPEN_FUSION=1, MIGRAPHX_DISABLE_SCHEDULE_PASS=1 and MIGRAPHX_DISABLE_REDUCE_FUSION=1
  4. Set MIGRAPHX_ENABLE_FULL_DYNAMIC=1

You'll need to clear the migraphx folders within /cache in the ML volume after each test to make sure it recompiles. Also, is the batch size change required to make it work, or is it just to avoid recompilation?

@fabianwimberger

Copy link
Copy Markdown
Contributor Author

@mertalev thanks for linking those, I indeed did not check for upstream issues well enough.

1 and 2 were the first things I tried, but neither changed the behavior in my tests. I’ll test 3 and 4 separately after clearing the /cache/migraphx directories between runs tomorrow.

The batch size change is only to avoid repeated migraph compilation for each dynamic face-count shape. Without it, a 1-face image triggered a long compile, then shortly after a 2-face image triggered another one, and so on. Even though these cached versions would be perfectly fitted, it's just not worth the time and effort into compiling so many times IMO.

To clarify the locking part: this PR does not change Immich job queue concurrency, but it does serialize MIGraphX-backed ONNX Runtime session.run() calls inside the ML worker process. So concurrent jobs can still be scheduled, but they will wait when they reach MIGraphX inference. I did not see a noticeable slowdown in my processing.

@sztupy

sztupy commented May 15, 2026 •

Copy link
Copy Markdown

Here's my experience so far

Config:

  • Host: Ubuntu 26.04 LTS
  • GPU: Radeon 6090 XT, gfx1030

Environment:

HSA_OVERRIDE_GFX_VERSION="10.3.0"
HSA_USE_SVM=0
MACHINE_LEARNING_WORKER_TIMEOUT=1800

Models:

  • Face recognition: buffalo_l
  • Smart search: ViT-SO400M-16-SigLIP2-384__webli
  • OCR: disabled

Compared to the latest release:

  • It doesn't crash, and actually works, yay!

Compared to v2.4.1:

  • Boot time is very slow. I have MACHINE_LEARNING_WORKER_TIMEOUT=1800 in my .env, without it model compilation is constantly killed, and it cannot finish. v2.4.1 works with the default config I assume because it doesn't need as much time to compile the bits
  • Until compilation is finished the server hangs, and there are errors in the immich server logs complaining about fetch timeouts. I guess the timeout in the server is not matching the MACHINE_LEARNING_WORKER_TIMEOUT value and is likely lower.
  • Once compilation finishes the jobs work as expected, speed is similar to v2.4.1. I first imported a batch of 200 pictures, and then gave it 20k more. It finished around the same time as the v2.4.1 version did.
  • Smart search is also very slow on the first attempt - compilation takes around 2-3 minutes. Once it's done, smart search is instant, until the box gets cleaned up due to inactivity. Smart search on the second boot is much quicker, but it's still a 20-30 second boot, before it's actually useable.

All in all, this PR at least works, although boot times are much-much-much slower than what we had with v.2.4.1

Note: I had OCR disabled as it was crashing with v2.4.1 and I didn't really need it anyway. I might enable it and do a test run once the full import of 400k pictures have finished.

Note: In total I had 4 Model Compile: Begins. Two for buffalo_l during first import (detection model, recognition model), one for ViT-SO400M-16-SigLIP2-384__webli at the first import (visual model), and one for ViT-SO400M-16-SigLIP2-384__webli after the first search query (textual model).

@sztupy

sztupy commented May 16, 2026

Copy link
Copy Markdown

I am now at 200k imported images, no errors, crashes or exceptions whatsoever.

@fabianwimberger

Copy link
Copy Markdown
Contributor Author

@mertalev I retested the alternatives one at a time with /cache/**/migraphx cleared between runs on a RX 7900 XTX.

  • ROCm 7.2.3-complete: show same behaviour as 7.2-complete
  • onnxruntime-migraphx==1.25.0: show same behaviour as default on 7.2-complete
  • MIGRAPHX_DISABLE_MIOPEN_FUSION=1 MIGRAPHX_DISABLE_SCHEDULE_PASS=1 MIGRAPHX_DISABLE_REDUCE_FUSION=1: dynamic recognition compile was still running after 35min, stopped manually.
  • MIGRAPHX_ENABLE_FULL_DYNAMIC=1: failed the first face request with a GPU memory access fault.
  1. The lock: fixes SIGSEGV when two MIGraphX face compiles started together.
  2. Batch size: fixes compile taking 90min+ for cold requests (all face combinations).

@sztupy v2.4.1 used ROCMExecutionProvider, not MIGraphXExecutionProvider. Current main/this PR uses MIGraphX EP, so the first run has the time-consuming compile/cache.

I did not explicitly set MACHINE_LEARNING_WORKER_TIMEOUT=1800 in my direct ML tests. The compiles were not killed by the ML worker timeout, instead, no jobs could make progress while the model was compiling. In the full stack this can look misleading because the job counters go down while requests time out. Once CPU load dropped and model compiles had finished, I had to restart job processing and it was running without issues.

So the slower first boot is expected with MIGraphX EP. The server-side fetch timeout during ML compile is a separate issue from the ML worker timeout. If you are ok with the basic approach in this PR, I can amend either code or docs to make the initial launch and timeout behavior clearer. Whatever is preferred.

A downgrade to ROCm EP seems not feasible, since ROCM EP was dropped from onnxruntime in v1.23.0 and is therefore unsupported. They list Migraphx and Vitis AI as alternative EPs. migraphx is what we are using now, Vitis AI seems to support Ryzen NPUs only. Even though very interesting, not relevant for this PR.

In summary, this looks like fallout from the ROCm EP -> MIGraphX EP migration. I currently see this PR plus a follow-up clarification for initial compile behavior as the practical path forward.

@sztupy

sztupy commented May 16, 2026

Copy link
Copy Markdown

@fabianwimberger I know 2.4.1 uses a different system, hence my comparisons to that, as that was the last version that worked for me before this fix.

If I don't add the timeout settings my compilation gets killed, and then I need to clear cache. I might not need to set it to 1800, but it has to be a fairly high number otherwise compilation gets killed for me.

@immich-push-o-matic immich-push-o-matic Bot added the documentation Improvements or additions to documentation label May 16, 2026
@mertalev

Copy link
Copy Markdown
Member

@fabianwimberger Thanks for the detailed testing! Were these tests running all model tasks or just one?

It seems like the specific failure mode is when it gets two concurrent requests to compile different input shapes for the same model. A global lock is pretty coarse for this. Can you try making it only acquire a lock if it's a new input shape for a given model?

@fabianwimberger

fabianwimberger commented May 16, 2026 •

Copy link
Copy Markdown
Contributor Author

@sztupy Thank you for clarifying. I reproduced the failure by limiting the ML container to 8 cores. The ML worker is killed during the cold MIGraphX compile path, and the queued Immich jobs then fail with ML fetch failed errors.

Compile timings:

  • buffalo_l detection: 34s
  • buffalo_l recognition: 82s
  • SigLIP2 visual: 287s
  • SigLIP2 textual: 33s

The image-upload relevant cold path is detection + recognition + visual, which is 404s of MIGraphX compile time. The current default ML worker timeout is 300s.

There is precedent for a backend-specific timeout bump: OpenVINO was changed in #11174 to use 300s instead of the previous 120s default because its startup/compile path could exceed the generic timeout. That old OpenVINO-specific logic was in machine-learning/start.sh. Later, #17153 removed start.sh and moved ML startup config into Python, where current main now defaults MACHINE_LEARNING_WORKER_TIMEOUT to 300s globally. So the docs still showing 120 (300 if using OpenVINO) are outdated compared to current code.

I pushed an update following the same pattern in the current config system: ROCm now defaults MACHINE_LEARNING_WORKER_TIMEOUT to 900s, while other images stay at 300s and an explicit MACHINE_LEARNING_WORKER_TIMEOUT still overrides the default. I also updated the environment variable docs and added focused tests for the default, ROCm default, and env override behavior.

For testing, I updated ghcr.io/fabianwimberger/immich-machine-learning:migraphx-stability-rocm with these fixes. It is built from commit c8049ba25dd4.

@mertalev the full-stack tests were the normal upload flow with smart search and facial recognition enabled, OCR disabled. So that exercised the relevant Immich jobs together and the compile timings above reflect that.

I agree the current global MIGraphX run lock is coarse. I will try narrowing it down to only lock cold compiles for a new input signature on a given model. Let's hope we won't cause the return of SIGSEGV :)

@fabianwimberger

fabianwimberger commented May 16, 2026 •

Copy link
Copy Markdown
Contributor Author

@mertalev I implemented the narrower locking approach and retested it in my local immich instances.

There is no longer a single global MIGraphX run lock. The lock is now scoped to a model path and only used for the first cold run of a new input signature. Once that input signature has run successfully, later runs for that model/signature are unlocked. Different models no longer block each other just because one of them is compiling.

This behaved as expected in the end-to-end test. While Face Detection/Recognition compiled, Smart Search continued to process. When Face Detection/Recognition finished, all three ran in parallel. No SIGSEGV after processing 20k+ Assets.

The remaining issues are separate from the global-lock problem:

  • During model compile, Immich server can still hit ML fetch failed and fail the active jobs because the server-side queue uses one attempt by default -> Users may need to retry "missing" for few failed jobs during compile.
  • Inference + Compile running at the same time uses roughly double the memory on APUs -> limitation on model chosen by users.

I would be glad if somebody with different, possibly weaker hardware and older Kernels could do another test. I tested with 7800x3d + 7900XTX on CachyOS and a Ryzen HX 370 (890M) on Ubuntu 26.04 with Xanmod Kernel.

@amo13

amo13 commented May 16, 2026 •

Copy link
Copy Markdown

I just tried it out. Not sure if I did it right though since I am totally new to immich.
I replaced ghcr.io/immich-app/immich-machine-learning:v2-rocm with your image, stopped the container, removed everything from the cache volume of the ML container and restarted the container. In Immich, I went into Administration > Job queues > Facial Recognition and hit Reset.
My observations:

  • My two named faces are gone (which is okay, I am still setting up and testing)
  • Finding and grouping faces seems to have worked because I have faces again
  • The immich container logs showed lots of Creating new person for face 3a8ad975-...
  • The immich-machine-learning container did not log anything after clicking Reset
  • The cache volume mounted to the ML container is still empty afterwards

Edit: gmktec-nucbox-k8-plus, AMD Ryzen 7 8845HS, AMD Radeon 780M
Edit2: >40k faces (that number after "Waiting" on the job card means faces, right?)

@mertalev

Copy link
Copy Markdown
Member

I went into Administration > Job queues > Facial Recognition and hit Reset.

This only resets data in the database. You'd need to go to Face Detection and hit All for it to actually rerun the models.

@amo13

amo13 commented May 17, 2026

Copy link
Copy Markdown

Thank you for helping me help :)

It looks like compiling the model works now. But it looks like it compiles it twice if I am not misinterpreting the logs. And I get repeated failures afterwards unfortunately. I have attached the logs of my ML container running with ghcr.io/fabianwimberger/immich-machine-learning:migraphx-stability-rocm.
From what I found out, my iGPU should be supported by ROCm since 7.0 and we now have 7.2. But what stands out to me is HW Exception by GPU node-1 (Agent handle: 0x7f6898248910) reason :GPU Hang followed by a core dump with a reference to /opt/rocm-7.2.0/lib/librocroller.so. Did I misconfigure something?

gpu-hang.log


I am running the container(s) as rootless podman quadlets on archlinux.

# /home/amo/.config/containers/systemd/immich-machine-learning.container
[Unit]
Description=Immich Machine Learning
StartLimitBurst=3
StartLimitIntervalSec=30

[Container]
ContainerName=immich-machine-learning
Image=ghcr.io/fabianwimberger/immich-machine-learning:migraphx-stability-rocm
Volume=immich-ml-model-cache.volume:/cache
Network=immich.network
# Temporary workaround for github.com/immich-app/immich/issues/27228
Environment=GUNICORN_CMD_ARGS=--no-control-socket
AddDevice=/dev/dri
AddDevice=/dev/kfd
AddDevice=/dev/accel
GroupAdd=987
GroupAdd=983

[Service]
Restart=always
CPUQuota=800%
MemoryHigh=16G
MemoryMax=24G

[Install]
WantedBy=default.target

gmktec-nucbox-k8-plus, AMD Ryzen 7 8845HS, AMD Radeon 780M

@fabianwimberger

Copy link
Copy Markdown
Contributor Author

@amo13 Unfortunately your hardware is not natively supported by ROCM 7.X. Please see Release Notes.

You can however try different HSA overrides:

  • I had HSA_OVERRIDE_GFX_VERSION=10.3.0 working on 7735HS (680M) in the past
  • For your CPU, it would probably be either 10.3.0 or 11.0.1 or 11.0.3 that may work

And please make sure to reference ghcr.io/fabianwimberger/immich-machine-learning:migraphx-stability-rocm-95e940192535 tag. I overwrite the general stability fix tag a few times during testing, only this tag guarantees you get the current PR commit.

Thank you for testing!

@amo13

amo13 commented May 17, 2026

Copy link
Copy Markdown

Thank you.
With your image tag and HSA_OVERRIDE_GFX_VERSION=11.0.3 I still get the same core dumps. After a while only though. And with some time, the jobs eventually finish to process everything and I have faces in my library.

But for the first time I was able to observe my GPU actually do something:

Screenshot From 2026-05-17 11-33-21

Not sure what the situations means now...

@amo13

amo13 commented May 17, 2026

Copy link
Copy Markdown

Not sure if that is related or not, but when doing a context search for "forest", I also encounter that core dump:

May 17 21:42:04 server immich-machine-learning[406314]: [05/17/26 19:42:04] INFO     Loading textual model 'ViT-B-32__openai' to memory 
May 17 21:42:04 server immich-machine-learning[406314]: [05/17/26 19:42:04] INFO     Setting execution providers to                     
May 17 21:42:04 server immich-machine-learning[406314]:                              ['MIGraphXExecutionProvider',                      
May 17 21:42:04 server immich-machine-learning[406314]:                              'CPUExecutionProvider'], in descending order of    
May 17 21:42:04 server immich-machine-learning[406314]:                              preference                                         
May 17 21:42:05 server immich-machine-learning[406314]: 2026-05-17 19:42:05.295086241 [W:onnxruntime:Default, migraphx_execution_provider.cc:167 MIGraphXExecutionProvider] [MIGraphX EP] MIGraphX ENV Override Variables Set:
May 17 21:42:15 server systemd-coredump[1019660]: [🡕] Process 1018003 (python) of user 1000 dumped core.
                                                  
                                                  Module /opt/rocm-7.2.0/lib/librocroller.so.1.0.0 without build-id.
                                                  Module /opt/rocm-7.2.0/lib/librocroller.so.1.0.0
                                                  Module /dev/zero (deleted) without build-id.
                                                  Module /dev/zero (deleted) without build-id.
                                                  ...
                                                  Module /usr/lib/x86_64-linux-gnu/libgcc_s.so.1 from deb gcc-14-14.2.0-4ubuntu2~24.04.1.amd64
                                                  Module /opt/venv/lib/python3.12/site-packages/numpy/linalg/_umath_linalg.cpython-312-x86_64-linux-gnu.so without build-id.
                                                  Module /opt/venv/lib/python3.12/site-packages/numpy/linalg/_umath_linalg.cpython-312-x86_64-linux-gnu.so
                                                  Stack trace of thread 6850:
                                                  #0  0x00007f6722676f1e n/a (/opt/rocm-7.2.0/lib/libamdhip64.so.7.2.70200 + 0x5cf1e)
                                                  ELF object binary architecture: AMD x86-64

I don't see that when switching to CPU ML (though I don't find the results very convincing either 😕)

@mertalev

Copy link
Copy Markdown
Member

@amo13 I think your iGPU is just not supported unfortunately. The env overrides are just a luck of the draw in case it works, but there are no stability guarantees.

@acigolotti

Copy link
Copy Markdown

Don't know if it's better than the default image on cpu only but at least it works now with my AMD Ryzen AI 9 HX PRO 370 w/ Radeon 890M, thank you!

@opswhisperer

Copy link
Copy Markdown

the image in #27387 works for me

@artgpz

artgpz commented May 25, 2026 •

Copy link
Copy Markdown

Can confirm the image built from this PR fixes all my issues with smart search and facial recognition on a 9060xt, thanks Fabian.

@fabianwimberger

Copy link
Copy Markdown
Contributor Author

I pushed a small docs formatting fix for the Docs Build failure. The failing Prettier check was only the MACHINE_LEARNING_WORKER_TIMEOUT row in docs/docs/install/environment-variables.md.

The remaining validate-release-label failure needs maintainer action. The PR currently has documentation and machine-learning, but the validation requires exactly one changelog:* label. The Zizmor / zizmor failure looks unrelated to this PR branch.

@mertalev
mertalev enabled auto-merge (squash) May 26, 2026 16:43
@mertalev

Copy link
Copy Markdown
Member

I assume you tried to format it manually? You need to run pnpm run format:fix to fix the docs.

auto-merge was automatically disabled May 26, 2026 18:13

Head branch was pushed to by a user without write access

@fabianwimberger

Copy link
Copy Markdown
Contributor Author

@mertalev sorry, I assumed to not touch anything except my own changes is sufficient. I applied pnpm run format:fix in docs now and pushed the resulting Prettier output. It passes locally now.

@mertalev
mertalev enabled auto-merge (squash) May 26, 2026 18:29
@mertalev
mertalev merged commit 53a2478 into immich-app:main May 26, 2026
68 checks passed
@sztupy

sztupy commented May 26, 2026

Copy link
Copy Markdown

Thanks everyone for this fix!

renovate Bot added a commit to sdwilsh/ansible-playbooks that referenced this pull request Jul 7, 2026
##### [\`v3.0.1\`](https://github.com/immich-app/immich/releases/tag/v3.0.1)

##### v3.0.1

- Fixes a bug that causes albums don't show up in the mobile app

##### What's Changed

##### 🚀 Features

- feat(web): recently added link in sidebar by [@benbeckford](https://github.com/benbeckford) in [#29039](https://github.com/immich-app/immich/pull/29039)

##### 🐛 Bug fixes

- fix: albums broken on v2 mobile clients by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#29446](https://github.com/immich-app/immich/pull/29446)
- fix: setting input field description spacing for description snippet by [@danieldietzler](https://github.com/danieldietzler) in [#29433](https://github.com/immich-app/immich/pull/29433)

##### 🌐 Translations

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

**Full Changelog**: <https://github.com/immich-app/immich/compare/v3.0.0...v3.0.1>

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

##### v3.0.0

Welcome to Immich `v3.0.0`!

After months of hard work from the team and our amazing contributors, we're thrilled to announce the next major version of Immich: `v3.0.0`!  🎉

##### Breaking changes

This release includes several breaking changes; read the full migration guide [here](https://immich.app/blog/v3-migration). *It's worth mentioning that many of the breaking changes are updates to API endpoints and affect only **third-party tools** that integrate with Immich's API*. For the vast majority of users, updating works exactly as it always has.

##### How to update

> \[!WARNING]
> `v3.0.0` drops support for pgvecto.rs. If you run Immich before `v1.133.0` and haven't done the migration step yet, see the migration guide here. <https://docs.immich.app/install/upgrading/#migrating-to-vectorchord>

First, update the `IMMICH_VERSION` in your `.env` file to `v3`:

```diff
- IMMICH_VERSION=v2
+ IMMICH_VERSION=v3
```

Then run the usual update commands:

```bash
docker compose pull && docker compose up -d
```

##### Release candidates

If you missed it, `v3.0.0` was the first time we used release candidates, also known as prereleases. Release candidates are tested but not yet official releases of Immich, and they allow us to find and fix any outstanding bugs before a final release. If you would like to be notified about release candidates directly through Immich, you can change the release channel from "Stable" to "Release candidate" in the `Admin settings > Version check` options ([here](https://my.immich.app/admin/system-settings?isOpen=version-check)).

<img alt="New release channel option in version check settings" src="https://github.com/user-attachments/assets/fc8f6008-d486-4915-ad1b-feaddb856315" />
##### New Merch

As part of this release, we're happy to announce we also have some new swag for you!

- Kids clothing: For those who are likely the reason for your Immich library's size
- Colored embroidery: We now have clothes with a full color embroidered Immich logo

<a href="https://immich.store/collections/immich-3-0">
<img width="1200" alt="immich-store (1)" src="https://github.com/user-attachments/assets/ce114e7b-1424-4eca-975d-b23debadb32b" />
</a>

Check it out now at [https://immich.store](https://immich.store/collections/immich-3-0)!

##### Highlights

Now, let's get right into all the new features in this release:

- Mobile non-destructive editing
- Workflows (preview)
- Background backup improvement
- Recently added page
- Integrity checks
- Slideshow on mobile app
- HLS and real-time video transcoding (preview)
- New video player for web
- Open photo in Immich as gallery on Android
- OCR on mobile app
- Upload asset directly to album on the mobile app
- Option to select image size when sharing on the mobile app
- Timeline performance improvement for browsing a large amount of assets in a single month

##### Mobile non-destructive editing

<p align="center">
<img width="300" alt="image" src="https://github.com/user-attachments/assets/e9ddf97c-a4f8-42c1-9910-49ef3c8d4b0a" />
</p>

This is a follow-up to Image Editing on the web, which was released in `v2.5.0`. This feature allows you to make non-destructive edits to your photos inside of Immich. Until now, the mobile editor used a completely different system that created new assets instead of editing the photo in place.

With this update, we bring a new, easier-to-use editor to mobile devices that has the same features as the web version. You can now edit photos directly in the mobile app, including cropping, rotating, and adjusting your images without ever touching the original file. Similar to the web, edits are non-destructive, so you can revisit or revert them at any time. You can even make edits on mobile and then adjust them on the web later!

Some features from the previous mobile editing implementation have been removed including:

- Recoloring photos
- Editing live photos
- Editing local assets

We have plans to bring some of these capabilities back in future releases.

##### Workflows (preview)

The first preview of Workflows is here! Workflows let you automate actions in your library by chaining triggers, filters, and actions together with a drag-and-drop builder. This is the foundation for many exciting automations to come, and we'd love your feedback as we continue building on it.

You can access the feature from [Utilities > Workflows](https://my.immich.app/workflows) on the web.

<img width="800"  alt="Workflows link on the utilities page" src="https://github.com/user-attachments/assets/db7e139e-89b0-481a-9a66-530a40dc175a" />

From there, you can either create a new blank workflow or browse the premade templates to get a basic understanding of how workflows can be used.

<p align="center">
<img width="400" alt="image" src="https://github.com/user-attachments/assets/23fdb017-e439-4221-9be8-a14bd690fa9b" />
</p>
##### Workflows editor

<img alt="Workflow editor with an example workflow" src="https://github.com/user-attachments/assets/c6a569de-d884-4bdb-8bb0-0ff2c805bfb9" />

In the workflows editor, you can switch between the Visual or JSON editor. The visual editor is nice for building out the workflow; the JSON editor is nice for sharing and receiving workflow content from others.

In each workflow, there is a ***trigger*** and a sequence of ***steps.***

- Trigger: this is the entry point of each workflow; when the trigger occurs, the steps are evaluated.
- Steps: they include Filters (conditions) and Actions (effects); they can be combined to produce the desired effect of the use case you aim for.

<p align="center">
<img width="400" alt="List of available workflow steps" src="https://github.com/user-attachments/assets/50e89454-2bf9-4d41-bfa6-fd54f8944ea3" />
</p>
##### Sharing a workflow

You can share the workflow you made with others in two ways: text and JSON. Text is nice for sharing on a forum or for show-and-tell content. JSON is nice for others to make an exact copy of your workflow's configuration.

You can copy the text in the workflows summary panel on the lower right of the screen

<p align="center">
<img width="400"  alt="workflow summary in text" src="https://github.com/user-attachments/assets/dda24c88-f403-4189-a57b-71f6da3816e7" />
</p>

You can share the JSON content from the copy workflows button in the app bar, switch to the JSON editor, or use the `Show schema` button in the context menu in the workflows list

<img  alt="JSON editor" src="https://github.com/user-attachments/assets/307297cc-36d6-477c-bd72-d52be1dec0c5" />

<img  alt="Show workflow schema" src="https://github.com/user-attachments/assets/b6efada4-44fc-4d35-9e24-0f143c003313" />

> \[!NOTE]
> Please use this [discussion thread](https://github.com/immich-app/immich/discussions/29167) to propose new ideas of triggers and actions. We are looking for extensive feedback and suggestions from you all.

##### Background backup improvements

Background backup on Android is now significantly more reliable. Previously, the background backup on Android was limited to newly taken photos. Now, the app uses a new periodic task scheduler, which allows you to upload your entire library in the background, and it plays nicer with Android's background execution limits, properly cleans up tasks, and warns you when battery optimization and notification settings might interfere with backups.

On iOS, the background refresh task now runs its sync and upload work in parallel, so uploads actually start within the short time window iOS allows.

<p align="center">
<img width="300"  alt="Enable backup option on mobile" src="https://github.com/user-attachments/assets/82be41f3-93b9-4231-9f91-53eb317bb3fe" />
</p>
##### Recently added page

A new "Recently Added" page on the web and mobile lets you browse your library sorted by when assets were added to Immich, rather than when they were taken. This makes it easier to find what's new when browsing a new batch of imports. You can find the new page in the "Explore" tab on the web and in the "Search" tab on mobile.

<img width="798" height="220" alt="Recently added" src="https://github.com/user-attachments/assets/d4729864-f736-4554-a672-91861aad5f7f" />
##### Integrity checks

The maintenance page has gotten a new addition: integrity reports! Immich will scan its directories on your file system, and compare it to what it has stored in its database. If there are deviations, they will be surfaced as

- untracked, if there is a file in Immich's directories that Immich does not know of
- missing, if Immich references a file in its database that does not exist in that place (anymore)
- a checksum mismatch, if the checksum of the file on disk does not match the checksum Immich has stored for that file. Typically, this would happen through file corruption but could also be the result of a bad rename.

<img alt="Integrity report on the maintenance page showing a count of untracked and missing files, as well as checksum mismatches." src="https://github.com/user-attachments/assets/0e59537e-89b7-4d06-b5e6-731bb1e453c0" />

You can configure when and how long the job runs each night.

<img width="800" alt="image" src="https://github.com/user-attachments/assets/13da49ac-5cfa-40a1-b852-b89b0ed7fff6" />
##### Slideshow (mobile)

The slideshow experience comes to mobile! You can now sit back and let your photos and videos play across the screen, just like on the web.

<p align="center">
<img width="300" alt="Slideshow view on mobile" src="https://github.com/user-attachments/assets/b3325f3c-0505-405f-9b79-322f738030f4" />
</p>
##### HLS and Real-Time Video transcoding (preview)

Immich can now transcode videos on-the-fly without needing to generate offline transcodes. This has been a long-requested feature with many benefits:

- Quality switching (both manual and automatic)
- Transcoding to the best codecs supported by the client
- Lower storage overhead when offline transcoding is disabled
- HDR for compatible clients (not implemented yet)
- Remuxing rather than transcoding the original when bandwidth allows it (not implemented yet)

Please note that this feature is still experimental and can change behavior from version to version. It's currently only implemented in the web app, with the mobile app implementation in progress.

To enable real-time transcoding, go to the [video transcoding settings](https://my.immich.app/admin/system-settings?isOpen=video-transcoding+realtime-transcoding) (scroll down). Offline transcoding isn't directly affected by enabling it, so if you'd like to disable offline transcoding, you should also adjust the transcode policy.

> \[!NOTE]
> For assets imported prior to v3, you will also need to re-run Metadata Extraction in the job panel for them to be re-processed.

<img alt="HLS Transcoding settings" src="https://github.com/user-attachments/assets/6313ea40-ae1a-4495-aaea-212ef67fd338" />

Keep in mind that your server needs to be powerful enough to transcode in real-time for this feature to work well. Hardware acceleration is recommended, but not required, when using this feature.

##### New video player for web

A new custom video player on the web app ensures all your devices share the same controls and layout, matching the Immich design. Some basic functions, like changing the playback rate, are available. This should also fix a lot of the problems on iOS, where the OS's controls are hidden behind the Immich navbar.

##### Open photos in Immich as a gallery on Android

Immich can now act as a gallery/image viewer app on Android. Tap a photo or video in another app, choose Immich, and it opens directly in the asset viewer with options to share the file or upload it to your library.

This is the first iteration of the feature, and refinements to how Immich recognizes files that are already in your library are on the way

<img width="350" alt="image" src="https://github.com/user-attachments/assets/f98c2a65-1b84-4580-a7af-ead54ab737d8" />
<img width="350" alt="image" src="https://github.com/user-attachments/assets/fb783bed-c6c4-4634-af71-c2e888274121" />
##### OCR on the mobile app

The asset viewer now has a toggle that highlights recognized text in a photo, and you can select and copy it directly from the image.

<p align="center">
<img width="350" alt="OCR in the mobile app" src="https://github.com/user-attachments/assets/5f870d38-53a5-4b05-9dba-5d8838b86934" />
</p>
##### Upload assets directly to an album on mobile

You can now upload local photos directly to an album in the mobile app, including from the asset bottom sheet, instead of uploading first and organizing later. A small change that removes a lot of friction from the backup-and-organize flow.

##### Select image size when sharing on mobile

When sharing photos from the mobile app, you can now choose the image size before sending; it is handy for keeping shared files small for messaging apps while preserving the option to share at full quality when needed.

You can change the default behavior in the `App Settings > Preferences`

<p align="center">
<img width="350"  alt="Share file's size settings" src="https://github.com/user-attachments/assets/fe1c95d7-39e4-4c25-8981-dea4d07fce5a" />
</p>

You can also pick the option when sharing on-the-fly by long pressing the `Share` button

<p align="center">
<img width="350"  alt="On-the-fly picker" src="https://github.com/user-attachments/assets/667b79a7-efac-462b-8736-9e674e083d6b" />
</p>
##### Timeline performance Improvements

Browsing months with a large number of assets is now dramatically smoother and prevents the browser tab from locking up when your instance encounters that scenario.

##### 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>

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

##### What's Changed

##### 🚨 Breaking Changes

- refactor!: migrate class-validator to zod by [@timonrieger](https://github.com/timonrieger) in [#26597](https://github.com/immich-app/immich/pull/26597)
- refactor!: remove replace asset by [@jrasm91](https://github.com/jrasm91) in [#27022](https://github.com/immich-app/immich/pull/27022)
- refactor!: remove my shared link dto by [@jrasm91](https://github.com/jrasm91) in [#27023](https://github.com/immich-app/immich/pull/27023)
- chore!: remove deprecated env variables by [@jrasm91](https://github.com/jrasm91) in [#27802](https://github.com/immich-app/immich/pull/27802)
- chore!: remove getRandom api endpoint by [@bwees](https://github.com/bwees) in [#27780](https://github.com/immich-app/immich/pull/27780)
- chore!: remove unused token response param by [@jrasm91](https://github.com/jrasm91) in [#27805](https://github.com/immich-app/immich/pull/27805)
- refactor: yeet old timeline by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#27666](https://github.com/immich-app/immich/pull/27666)
- chore!: remove old timeline sync endpoints by [@jrasm91](https://github.com/jrasm91) in [#27804](https://github.com/immich-app/immich/pull/27804)
- chore!: remove deviceId and deviceAssetId by [@danieldietzler](https://github.com/danieldietzler) in [#27818](https://github.com/immich-app/immich/pull/27818)
- chore!: rename API key schemas by [@jrasm91](https://github.com/jrasm91) in [#27828](https://github.com/immich-app/immich/pull/27828)
- chore!: remove without assets by [@jrasm91](https://github.com/jrasm91) in [#27835](https://github.com/immich-app/immich/pull/27835)
- fix: oauth issuerUrl validation by [@bo0tzz](https://github.com/bo0tzz) in [#27848](https://github.com/immich-app/immich/pull/27848)
- fix!: do not allow insecure oauth requests by default by [@bo0tzz](https://github.com/bo0tzz) in [#27844](https://github.com/immich-app/immich/pull/27844)
- fix!: set duration to null when not present by [@meesfrensel](https://github.com/meesfrensel) in [#26982](https://github.com/immich-app/immich/pull/26982)
- chore!: remove /api/server/theme endpoint by [@jrasm91](https://github.com/jrasm91) in [#27880](https://github.com/immich-app/immich/pull/27880)
- chore!: migrate album owner to album\_user by [@danieldietzler](https://github.com/danieldietzler) in [#27467](https://github.com/immich-app/immich/pull/27467)
- refactor!: change number to integer types by [@timonrieger](https://github.com/timonrieger) in [#27912](https://github.com/immich-app/immich/pull/27912)
- refactor(server)!: move correlationId to X-Correlation-ID response header by [@timonrieger](https://github.com/timonrieger) in [#28139](https://github.com/immich-app/immich/pull/28139)
- refactor(server)!: remove redundant error and statusCode fields from error responses by [@timonrieger](https://github.com/timonrieger) in [#28140](https://github.com/immich-app/immich/pull/28140)
- chore(server)!: drop pgvecto.rs support by [@mertalev](https://github.com/mertalev) in [#28159](https://github.com/immich-app/immich/pull/28159)
- chore!: duration in milliseconds by [@mertalev](https://github.com/mertalev) in [#28003](https://github.com/immich-app/immich/pull/28003)
- refactor(server)!: sanitize error messages to avoid leaking resource details by [@timonrieger](https://github.com/timonrieger) in [#28154](https://github.com/immich-app/immich/pull/28154)
- refactor(server)!: structured validation error responses by [@timonrieger](https://github.com/timonrieger) in [#28204](https://github.com/immich-app/immich/pull/28204)
- feat(server)!: add isOwned filter to albums API by [@timonrieger](https://github.com/timonrieger) in [#28213](https://github.com/immich-app/immich/pull/28213)
- chore(ml)!: require numpy 2.4 by [@mertalev](https://github.com/mertalev) in [#28158](https://github.com/immich-app/immich/pull/28158)
- fix(deps): update dependency nestjs-otel to v8 by [@renovate](https://github.com/renovate)\[bot] in [#27863](https://github.com/immich-app/immich/pull/27863)
- chore(ml)!: remove deprecated envs by [@mertalev](https://github.com/mertalev) in [#28326](https://github.com/immich-app/immich/pull/28326)
- chore(server)!: remove libopus enum by [@mertalev](https://github.com/mertalev) in [#28325](https://github.com/immich-app/immich/pull/28325)
- refactor!: remove asset faces from AssetResponseDto by [@bwees](https://github.com/bwees) in [#27779](https://github.com/immich-app/immich/pull/27779)
- refactor(server)!: drop empty string to null conversion by [@timonrieger](https://github.com/timonrieger) in [#28808](https://github.com/immich-app/immich/pull/28808)
- refactor(server)!: remove changeExpiryTime by [@timonrieger](https://github.com/timonrieger) in [#28816](https://github.com/immich-app/immich/pull/28816)
- refactor!: disallow star rating < 1 by [@meesfrensel](https://github.com/meesfrensel) in [#27896](https://github.com/immich-app/immich/pull/27896)
- fix!: search endpoints visibility can be omitted by [@danieldietzler](https://github.com/danieldietzler) in [#29385](https://github.com/immich-app/immich/pull/29385)

##### 🫥 Deprecated Changes

- refactor(server): deprecate PUT routes in favor of PATCH by [@timonrieger](https://github.com/timonrieger) in [#28859](https://github.com/immich-app/immich/pull/28859)

##### 🔒 Security

- fix: run profile picture through thumbnail pipeline by [@bo0tzz](https://github.com/bo0tzz) in [#27890](https://github.com/immich-app/immich/pull/27890)

##### 🚀 Features

- feat: mobile editing by [@bwees](https://github.com/bwees) in [#25397](https://github.com/immich-app/immich/pull/25397)
- feat: album map markers endpoint by [@jrasm91](https://github.com/jrasm91) in [#27830](https://github.com/immich-app/immich/pull/27830)
- feat(server): added backchannel logout api endpoint by [@santanoce](https://github.com/santanoce) in [#26235](https://github.com/immich-app/immich/pull/26235)
- feat(server): add OIDC logout URL override option by [@LJspice](https://github.com/LJspice) in [#27389](https://github.com/immich-app/immich/pull/27389)
- feat: android periodic work manager task by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#23563](https://github.com/immich-app/immich/pull/23563)
- feat(web): custom video player controls by [@meesfrensel](https://github.com/meesfrensel) in [#26183](https://github.com/immich-app/immich/pull/26183)
- feat(web): add full-path search mode to UI by [@mws-weekend-projects](https://github.com/mws-weekend-projects) in [#26758](https://github.com/immich-app/immich/pull/26758)
- feat: recently added assets page by [@benbeckford](https://github.com/benbeckford) in [#28272](https://github.com/immich-app/immich/pull/28272)
- feat(mobile): slideshow view by [@benbeckford](https://github.com/benbeckford) in [#28421](https://github.com/immich-app/immich/pull/28421)
- feat(mobile): "Add Tags" asset multiselect option by [@benjamonnguyen](https://github.com/benjamonnguyen) in [#26269](https://github.com/immich-app/immich/pull/26269)
- feat: workflows & plugins by [@jrasm91](https://github.com/jrasm91) in [#26727](https://github.com/immich-app/immich/pull/26727)
- feat(server): hls with real-time transcoding by [@mertalev](https://github.com/mertalev) in [#28230](https://github.com/immich-app/immich/pull/28230)
- feat(web): hls player by [@mertalev](https://github.com/mertalev) in [#28312](https://github.com/immich-app/immich/pull/28312)
- feat(mobile): Android. Immich as a gallery / image viewer app by [@PeterOmbodi](https://github.com/PeterOmbodi) in [#26109](https://github.com/immich-app/immich/pull/26109)
- feat: user upload heatmap by [@bondeabhijeet](https://github.com/bondeabhijeet) in [#28593](https://github.com/immich-app/immich/pull/28593)
- feat(mobile): ocr support by [@YarosMallorca](https://github.com/YarosMallorca) in [#26523](https://github.com/immich-app/immich/pull/26523)
- feat: geolocation workflow filter by [@benbeckford](https://github.com/benbeckford) in [#28961](https://github.com/immich-app/immich/pull/28961)
- feat: image quality option in sharing by [@alextran1502](https://github.com/alextran1502) in [#28918](https://github.com/immich-app/immich/pull/28918)
- feat: integrity check jobs (missing files, untracked files, checksums) by [@insertish](https://github.com/insertish) in [#24205](https://github.com/immich-app/immich/pull/24205)
- feat: new feature message by [@alextran1502](https://github.com/alextran1502) in [#29388](https://github.com/immich-app/immich/pull/29388)

##### 🌟 Enhancements

- feat(web): persist state of file path information in details panel by [@cratoo](https://github.com/cratoo) in [#27770](https://github.com/immich-app/immich/pull/27770)
- feat: commands by [@jrasm91](https://github.com/jrasm91) in [#27546](https://github.com/immich-app/immich/pull/27546)
- feat: upgrade immich/ui by [@jrasm91](https://github.com/jrasm91) in [#27792](https://github.com/immich-app/immich/pull/27792)
- feat: filter users on share by [@OdinOxin](https://github.com/OdinOxin) in [#27732](https://github.com/immich-app/immich/pull/27732)
- fix(server): render storage template date/time tokens in UTC ([#24350](https://github.com/immich-app/immich/issues/24350)) by [@migpovrap](https://github.com/migpovrap) in [#26917](https://github.com/immich-app/immich/pull/26917)
- feat(web): lazy load library and server statistics by [@etnoy](https://github.com/etnoy) in [#26406](https://github.com/immich-app/immich/pull/26406)
- feat: sort users alphabetically when adding to album by [@OdinOxin](https://github.com/OdinOxin) in [#27731](https://github.com/immich-app/immich/pull/27731)
- feat: auth logout page by [@jrasm91](https://github.com/jrasm91) in [#27831](https://github.com/immich-app/immich/pull/27831)
- chore: improve randomness of /search/random endpoint by [@StevenMassaro](https://github.com/StevenMassaro) in [#27531](https://github.com/immich-app/immich/pull/27531)
- feat: dynamic languages by [@jrasm91](https://github.com/jrasm91) in [#27869](https://github.com/immich-app/immich/pull/27869)
- feat: cache shared link by [@danieldietzler](https://github.com/danieldietzler) in [#27889](https://github.com/immich-app/immich/pull/27889)
- feat(server): add configurable OAuth prompt parameter by [@sparsh985](https://github.com/sparsh985) in [#26755](https://github.com/immich-app/immich/pull/26755)
- feat(server): add MPO file type support by [@git-akihakune](https://github.com/git-akihakune) in [#27963](https://github.com/immich-app/immich/pull/27963)
- feat(mobile): action bottom sheet on map timeline by [@YarosMallorca](https://github.com/YarosMallorca) in [#27515](https://github.com/immich-app/immich/pull/27515)
- feat(server): track video metadata by [@mertalev](https://github.com/mertalev) in [#28023](https://github.com/immich-app/immich/pull/28023)
- feat(enhancement): Navigate stack with up and down arrow keys by [@cratoo](https://github.com/cratoo) in [#27854](https://github.com/immich-app/immich/pull/27854)
- fix(web): migrate people management component to page, enabling tooltips by [@SkyDev125](https://github.com/SkyDev125) in [#26971](https://github.com/immich-app/immich/pull/26971)
- chore(mobile): add box shadow to asset details by [@uhthomas](https://github.com/uhthomas) in [#27510](https://github.com/immich-app/immich/pull/27510)
- feat: hide hidden person from memories by [@sakshamchawla](https://github.com/sakshamchawla) in [#20877](https://github.com/immich-app/immich/pull/20877)
- feat(mobile): increased tap area on video player overlay by [@YarosMallorca](https://github.com/YarosMallorca) in [#27269](https://github.com/immich-app/immich/pull/27269)
- feat(web): Add metadata overlay to slideshow by [@timonrieger](https://github.com/timonrieger) in [#24627](https://github.com/immich-app/immich/pull/24627)
- feat(web): add individual filter removal from search result chips by [@timonrieger](https://github.com/timonrieger) in [#28166](https://github.com/immich-app/immich/pull/28166)
- feat(mobile): trash/restore all by [@YarosMallorca](https://github.com/YarosMallorca) in [#28116](https://github.com/immich-app/immich/pull/28116)
- feat: display more info in asset viewer by [@alextran1502](https://github.com/alextran1502) in [#24630](https://github.com/immich-app/immich/pull/24630)
- feat(server): allow subpaths for machine learning URL by [@gnojus](https://github.com/gnojus) in [#28427](https://github.com/immich-app/immich/pull/28427)
- feat(ui): Shared URL input configuration by [@Lauritz-Tieste](https://github.com/Lauritz-Tieste) in [#27105](https://github.com/immich-app/immich/pull/27105)
- refactor: enhance shared link UI and functionality by [@Lauritz-Tieste](https://github.com/Lauritz-Tieste) in [#26464](https://github.com/immich-app/immich/pull/26464)
- feat: upload and add local asset directly to album by [@alextran1502](https://github.com/alextran1502) in [#28123](https://github.com/immich-app/immich/pull/28123)
- feat: Selectable metadata in duplicates utility with diffing by [@ollioddi](https://github.com/ollioddi) in [#26328](https://github.com/immich-app/immich/pull/26328)
- fix: improve form control focus visibility by [@Caltsic](https://github.com/Caltsic) in [#28512](https://github.com/immich-app/immich/pull/28512)
- feat: command for user pages by [@alextran1502](https://github.com/alextran1502) in [#28554](https://github.com/immich-app/immich/pull/28554)
- refactor: use ControlBar UI Library component by [@bwees](https://github.com/bwees) in [#28567](https://github.com/immich-app/immich/pull/28567)
- feat: workflow template by [@alextran1502](https://github.com/alextran1502) in [#28553](https://github.com/immich-app/immich/pull/28553)
- feat(mobile): improve downloading algorithm for sharing by [@YarosMallorca](https://github.com/YarosMallorca) in [#27312](https://github.com/immich-app/immich/pull/27312)
- feat: search by album name and id by [@jrasm91](https://github.com/jrasm91) in [#28672](https://github.com/immich-app/immich/pull/28672)
- feat: upload local assets to album from bottom sheet by [@alextran1502](https://github.com/alextran1502) in [#28531](https://github.com/immich-app/immich/pull/28531)
- feat: places in context search by [@timonrieger](https://github.com/timonrieger) in [#28768](https://github.com/immich-app/immich/pull/28768)
- feat: minimum face count per user by [@timjonez](https://github.com/timjonez) in [#27452](https://github.com/immich-app/immich/pull/27452)
- feat: show notification and battery optimization warning by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#26610](https://github.com/immich-app/immich/pull/26610)
- feat: workflows drag and drop enhancements by [@danieldietzler](https://github.com/danieldietzler) in [#28764](https://github.com/immich-app/immich/pull/28764)
- feat(mobile): min face count per-user by [@YarosMallorca](https://github.com/YarosMallorca) in [#28805](https://github.com/immich-app/immich/pull/28805)
- refactor(server): allow -1 rating again by [@timonrieger](https://github.com/timonrieger) in [#28886](https://github.com/immich-app/immich/pull/28886)
- feat(web): warn before overwriting existing locations in geolocation utility by [@yoshovski](https://github.com/yoshovski) in [#28840](https://github.com/immich-app/immich/pull/28840)
- feat: warn if microservices worker is missing by [@bo0tzz](https://github.com/bo0tzz) in [#28869](https://github.com/immich-app/immich/pull/28869)
- fix(web): show album names in duplicate review by [@meesfrensel](https://github.com/meesfrensel) in [#29080](https://github.com/immich-app/immich/pull/29080)
- feat: keyboard seeking for new video player by [@danieldietzler](https://github.com/danieldietzler) in [#29208](https://github.com/immich-app/immich/pull/29208)
- feat(web): Add text-white-shadow to elements and increase the shadows effect by [@Vogeluff](https://github.com/Vogeluff) in [#29165](https://github.com/immich-app/immich/pull/29165)
- feat: webhook workflow action by [@benbeckford](https://github.com/benbeckford) in [#29258](https://github.com/immich-app/immich/pull/29258)
- feat: integrity checks admin settings by [@danieldietzler](https://github.com/danieldietzler) in [#29406](https://github.com/immich-app/immich/pull/29406)

##### 🐛 Bug fixes

- fix(web): center images in RTL layouts ([#27678](https://github.com/immich-app/immich/issues/27678)) by [@Nicolas-micuda-becker](https://github.com/Nicolas-micuda-becker) in [#27753](https://github.com/immich-app/immich/pull/27753)
- fix(mobile): add keys for person tiles in search by [@YarosMallorca](https://github.com/YarosMallorca) in [#27689](https://github.com/immich-app/immich/pull/27689)
- fix(web): selection clearing on preview by [@YarosMallorca](https://github.com/YarosMallorca) in [#27702](https://github.com/immich-app/immich/pull/27702)
- fix: asset multi select download shortcut by [@danieldietzler](https://github.com/danieldietzler) in [#27784](https://github.com/immich-app/immich/pull/27784)
- fix(web): add partner photo to album from multiselect by [@YarosMallorca](https://github.com/YarosMallorca) in [#27767](https://github.com/immich-app/immich/pull/27767)
- fix: redirect original by [@danieldietzler](https://github.com/danieldietzler) in [#27759](https://github.com/immich-app/immich/pull/27759)
- fix: make web build stage deterministic by [@bo0tzz](https://github.com/bo0tzz) in [#27823](https://github.com/immich-app/immich/pull/27823)
- fix(web): svelte regression - cancel video preview fetch when bind:this is cleared early by [@midzelis](https://github.com/midzelis) in [#27713](https://github.com/immich-app/immich/pull/27713)
- fix(web): stale adaptive image when original overlays preview by [@midzelis](https://github.com/midzelis) in [#27621](https://github.com/immich-app/immich/pull/27621)
- fix(mobile): readonly redirect when not logged in by [@YarosMallorca](https://github.com/YarosMallorca) in [#27728](https://github.com/immich-app/immich/pull/27728)
- fix(web): close edit faces panel on Escape key press by [@midzelis](https://github.com/midzelis) in [#27519](https://github.com/immich-app/immich/pull/27519)
- fix(oauth): normalize email claim to lowercase and trim before account lookup and registration by [@timdobras](https://github.com/timdobras) in [#26841](https://github.com/immich-app/immich/pull/26841)
- fix(web): use event for zooming out after opening face editor by [@meesfrensel](https://github.com/meesfrensel) in [#27789](https://github.com/immich-app/immich/pull/27789)
- fix: sanitize filenames before adding to zip by [@bo0tzz](https://github.com/bo0tzz) in [#27893](https://github.com/immich-app/immich/pull/27893)
- fix(server): require at least one field to be set when updating memory by [@fredfloydd](https://github.com/fredfloydd) in [#27842](https://github.com/immich-app/immich/pull/27842)
- fix(web): compute hashes for uploads in chunks by [@fredfloydd](https://github.com/fredfloydd) in [#27878](https://github.com/immich-app/immich/pull/27878)
- fix(web): fix stale album page load by [@fredfloydd](https://github.com/fredfloydd) in [#27825](https://github.com/immich-app/immich/pull/27825)
- fix(web): prevent interaction with detail panel behind person side panel by [@midzelis](https://github.com/midzelis) in [#27309](https://github.com/immich-app/immich/pull/27309)
- fix: show neon light by [@alextran1502](https://github.com/alextran1502) in [#27994](https://github.com/immich-app/immich/pull/27994)
- fix(mobile): zero exposure by [@YarosMallorca](https://github.com/YarosMallorca) in [#28017](https://github.com/immich-app/immich/pull/28017)
- fix(mobile): clear local data on forced logout by [@LeLunZ](https://github.com/LeLunZ) in [#27957](https://github.com/immich-app/immich/pull/27957)
- fix(mobile): enable autoplay for motion photos in video viewer by [@LeLunZ](https://github.com/LeLunZ) in [#27961](https://github.com/immich-app/immich/pull/27961)
- fix(mobile): thumbnail transition to asset viewer by [@LeLunZ](https://github.com/LeLunZ) in [#27850](https://github.com/immich-app/immich/pull/27850)
- fix: jump to timeline on new auto\_router update by [@alextran1502](https://github.com/alextran1502) in [#28022](https://github.com/immich-app/immich/pull/28022)
- fix(mobile): delete assets on trash empty, Android by [@PeterOmbodi](https://github.com/PeterOmbodi) in [#26070](https://github.com/immich-app/immich/pull/26070)
- fix(ml): handle empty/corrupt images in face detection by [@yosit](https://github.com/yosit) in [#27391](https://github.com/immich-app/immich/pull/27391)
- fix(web): refresh memories hourly by [@meesfrensel](https://github.com/meesfrensel) in [#28114](https://github.com/immich-app/immich/pull/28114)
- fix(web): large files: better handling of asset deletions by [@meesfrensel](https://github.com/meesfrensel) in [#28117](https://github.com/immich-app/immich/pull/28117)
- fix(web): double video playback on map timeline by [@YarosMallorca](https://github.com/YarosMallorca) in [#28090](https://github.com/immich-app/immich/pull/28090)
- fix(mobile): suppress asset stack UI in trash timeline by [@PeterOmbodi](https://github.com/PeterOmbodi) in [#26536](https://github.com/immich-app/immich/pull/26536)
- fix(web): timeline scroll when pressing back from stacked asset by [@Snowknight26](https://github.com/Snowknight26) in [#28163](https://github.com/immich-app/immich/pull/28163)
- fix(server): selectively apply metadata bitstream filter for video thumbnails by [@pinhao](https://github.com/pinhao) in [#28162](https://github.com/immich-app/immich/pull/28162)
- fix(web): fix shared link /s/photos.\* navigation after password login by [@meesfrensel](https://github.com/meesfrensel) in [#27788](https://github.com/immich-app/immich/pull/27788)
- fix(ml): respect time zone for logs in cuda container by [@AyaanMAG](https://github.com/AyaanMAG) in [#28155](https://github.com/immich-app/immich/pull/28155)
- fix: librknnrt permissions in machine-learning by [@DavidTheFighter](https://github.com/DavidTheFighter) in [#28216](https://github.com/immich-app/immich/pull/28216)
- fix(server): validate duplicate group ownership before dismissal by [@timonrieger](https://github.com/timonrieger) in [#28221](https://github.com/immich-app/immich/pull/28221)
- fix(web): correct timeline yesterday label across month boundaries by [@michelheusschen](https://github.com/michelheusschen) in [#28183](https://github.com/immich-app/immich/pull/28183)
- fix(mobile): show lens info without lens name by [@benbeckford](https://github.com/benbeckford) in [#28234](https://github.com/immich-app/immich/pull/28234)
- fix: stale person name after merge by [@danieldietzler](https://github.com/danieldietzler) in [#28222](https://github.com/immich-app/immich/pull/28222)
- fix(web): shared album avatars opening modal by [@meesfrensel](https://github.com/meesfrensel) in [#26719](https://github.com/immich-app/immich/pull/26719)
- fix(mobile): prevent asset loading issues when changing page or when closing memories by [@LeLunZ](https://github.com/LeLunZ) in [#27596](https://github.com/immich-app/immich/pull/27596)
- fix(mobile): correct filter default and UI desync in similar photos search by [@TheBestX11](https://github.com/TheBestX11) in [#27516](https://github.com/immich-app/immich/pull/27516)
- fix(server): hide isFavorite from partner asset sync stream by [@timonrieger](https://github.com/timonrieger) in [#28035](https://github.com/immich-app/immich/pull/28035)
- fix(mobile): restore notification plugin init by [@santoshakil](https://github.com/santoshakil) in [#28284](https://github.com/immich-app/immich/pull/28284)
- fix(mobile): mounted check before setState in album sync action by [@santoshakil](https://github.com/santoshakil) in [#28300](https://github.com/immich-app/immich/pull/28300)
- fix(mobile): avoid duplicate assets in album view by [@stfn42](https://github.com/stfn42) in [#28152](https://github.com/immich-app/immich/pull/28152)
- fix(mobile): Deduplicate assets in person view timeline by [@thowdev](https://github.com/thowdev) in [#26723](https://github.com/immich-app/immich/pull/26723)
- fix(deployment): remove unneeded volume by [@mmomjian](https://github.com/mmomjian) in [#28307](https://github.com/immich-app/immich/pull/28307)
- fix: mobile upload duration type by [@alextran1502](https://github.com/alextran1502) in [#28362](https://github.com/immich-app/immich/pull/28362)
- fix: deep link for assets when asset viewer already open by [@bwees](https://github.com/bwees) in [#27971](https://github.com/immich-app/immich/pull/27971)
- fix: kekab icon colors in light mode by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#28366](https://github.com/immich-app/immich/pull/28366)
- fix: indexes on remote\_asset\_entity by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#28264](https://github.com/immich-app/immich/pull/28264)
- fix(mobile): clear linkedRemoteAlbumId in reset() so FK refs dont dangle by [@santoshakil](https://github.com/santoshakil) in [#28382](https://github.com/immich-app/immich/pull/28382)
- fix: ignore icc profile make and model by [@jrasm91](https://github.com/jrasm91) in [#28412](https://github.com/immich-app/immich/pull/28412)
- fix(mobile): don't block app open on slow validateAccessToken by [@santoshakil](https://github.com/santoshakil) in [#28405](https://github.com/immich-app/immich/pull/28405)
- fix(mobile): add restore option to trashed assets by [@inesiscosta](https://github.com/inesiscosta) in [#27442](https://github.com/immich-app/immich/pull/27442)
- fix(mobile): use correct delete action by [@ByteSizedMarius](https://github.com/ByteSizedMarius) in [#26575](https://github.com/immich-app/immich/pull/26575)
- fix(server): dedupe database backup jobs by [@rdeaton](https://github.com/rdeaton) in [#28341](https://github.com/immich-app/immich/pull/28341)
- fix(mobile): cronet buffer overflow on compressed thumbnails by [@santoshakil](https://github.com/santoshakil) in [#28439](https://github.com/immich-app/immich/pull/28439)
- fix(mobile): cronet thumbnail buffer overflow regression from [#28439](https://github.com/immich-app/immich/issues/28439) by [@santoshakil](https://github.com/santoshakil) in [#28450](https://github.com/immich-app/immich/pull/28450)
- fix(mobile): mounted check in ThumbnailTile hero flight listener by [@santoshakil](https://github.com/santoshakil) in [#28451](https://github.com/immich-app/immich/pull/28451)
- fix(mobile): don't force-unwrap nil localizedTitle in ios getAlbums by [@santoshakil](https://github.com/santoshakil) in [#28452](https://github.com/immich-app/immich/pull/28452)
- fix(web): work around Chrome HDR image seam lines during zoom by [@midzelis](https://github.com/midzelis) in [#27715](https://github.com/immich-app/immich/pull/27715)
- fix(ios): respect status bar scroll to top in timeline views by [@agg23](https://github.com/agg23) in [#28469](https://github.com/immich-app/immich/pull/28469)
- fix(mobile): asset viewer stuck on spinner after rotation by [@LeLunZ](https://github.com/LeLunZ) in [#28019](https://github.com/immich-app/immich/pull/28019)
- fix(web): timeline stuttering with many assets in 1 day by [@benbeckford](https://github.com/benbeckford) in [#28509](https://github.com/immich-app/immich/pull/28509)
- fix(mobile): preserve zoom level during image loading and live photo playback by [@LeLunZ](https://github.com/LeLunZ) in [#27960](https://github.com/immich-app/immich/pull/27960)
- fix(ml): stabilize MIGraphX inference by [@fabianwimberger](https://github.com/fabianwimberger) in [#28444](https://github.com/immich-app/immich/pull/28444)
- fix: await sync asset v2 by [@bwees](https://github.com/bwees) in [#28569](https://github.com/immich-app/immich/pull/28569)
- fix: strip metadata from timeline responses for shared links without exif sharing by [@danieldietzler](https://github.com/danieldietzler) in [#28644](https://github.com/immich-app/immich/pull/28644)
- fix: Refresh local album overview page after asset deletion by [@Lauritz-Tieste](https://github.com/Lauritz-Tieste) in [#28586](https://github.com/immich-app/immich/pull/28586)
- fix(server): prevent locked assets from leaking to partners by [@timonrieger](https://github.com/timonrieger) in [#28652](https://github.com/immich-app/immich/pull/28652)
- refactor(web): replace per-asset viewport proximity with day-tier active indices by [@midzelis](https://github.com/midzelis) in [#28597](https://github.com/immich-app/immich/pull/28597)
- fix: timeline scroll flicker by [@alextran1502](https://github.com/alextran1502) in [#28653](https://github.com/immich-app/immich/pull/28653)
- fix: api repositories using stale endpoint by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#28667](https://github.com/immich-app/immich/pull/28667)
- fix: disallow cross origin/non http protocols for continueUrl on login by [@bwees](https://github.com/bwees) in [#28706](https://github.com/immich-app/immich/pull/28706)
- fix(web): skip thumbhash fade for offscreen thumbnails by [@midzelis](https://github.com/midzelis) in [#27335](https://github.com/immich-app/immich/pull/27335)
- fix(web): prevent partner assets from being selected in geolocation utility by [@okxint](https://github.com/okxint) in [#28737](https://github.com/immich-app/immich/pull/28737)
- fix(mobile): invisible ink splashes in asset sheet by [@timonrieger](https://github.com/timonrieger) in [#28756](https://github.com/immich-app/immich/pull/28756)
- fix!: unauthorized face creation by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#28561](https://github.com/immich-app/immich/pull/28561)
- fix(mobile): proper background task cleanup by [@mertalev](https://github.com/mertalev) in [#28694](https://github.com/immich-app/immich/pull/28694)
- fix(cli): prevent out-of-memory on file upload due to undici storing the request body by [@moversity](https://github.com/moversity) in [#28723](https://github.com/immich-app/immich/pull/28723)
- fix: error log on aborted uploads by [@jrasm91](https://github.com/jrasm91) in [#28806](https://github.com/immich-app/immich/pull/28806)
- fix(server): respect timezone in iso date string encoding by [@timonrieger](https://github.com/timonrieger) in [#28810](https://github.com/immich-app/immich/pull/28810)
- test: fix tests when OpenVINO provider is available by [@nekowinston](https://github.com/nekowinston) in [#28802](https://github.com/immich-app/immich/pull/28802)
- fix(mobile): run iOS bg task phases in parallel by [@santoshakil](https://github.com/santoshakil) in [#28293](https://github.com/immich-app/immich/pull/28293)
- fix: error handling by [@jrasm91](https://github.com/jrasm91) in [#28843](https://github.com/immich-app/immich/pull/28843)
- fix: cross isolate drift watchers by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#28862](https://github.com/immich-app/immich/pull/28862)
- fix: reload timeline on group by setting change by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#28864](https://github.com/immich-app/immich/pull/28864)
- fix(web): use irot/imir tags for HEIF Orientation by [@joojoooo](https://github.com/joojoooo) in [#27820](https://github.com/immich-app/immich/pull/27820)
- fix: detail panel faces reactivity issues by [@danieldietzler](https://github.com/danieldietzler) in [#28910](https://github.com/immich-app/immich/pull/28910)
- fix(server): hide isFavorite from album asset sync stream by [@timonrieger](https://github.com/timonrieger) in [#28923](https://github.com/immich-app/immich/pull/28923)
- fix(mobile): show memory and folder dates in local time by [@santoshakil](https://github.com/santoshakil) in [#28941](https://github.com/immich-app/immich/pull/28941)
- fix(mobile): show error when creating an album fails by [@santoshakil](https://github.com/santoshakil) in [#28942](https://github.com/immich-app/immich/pull/28942)
- fix(mobile): add album picker to archive bottom sheet by [@santoshakil](https://github.com/santoshakil) in [#28953](https://github.com/immich-app/immich/pull/28953)
- fix: normalize diacritics in person name search in Web & Mobile by [@pedrovieira](https://github.com/pedrovieira) in [#28887](https://github.com/immich-app/immich/pull/28887)
- fix(web): Prevent face editor from closing when dismissing tag confirmation by [@pedrovieira](https://github.com/pedrovieira) in [#28900](https://github.com/immich-app/immich/pull/28900)
- fix(mobile): map timeline layout crash by [@YarosMallorca](https://github.com/YarosMallorca) in [#28878](https://github.com/immich-app/immich/pull/28878)
- fix(mobile): deduplicate people in asset details panel by [@santoshakil](https://github.com/santoshakil) in [#28972](https://github.com/immich-app/immich/pull/28972)
- fix(mobile): keep timezone when editing asset date time by [@santoshakil](https://github.com/santoshakil) in [#28978](https://github.com/immich-app/immich/pull/28978)
- fix(mobile): stale details after editing asset date by [@santoshakil](https://github.com/santoshakil) in [#28977](https://github.com/immich-app/immich/pull/28977)
- fix(mobile): show albums whose assets are all trashed by [@santoshakil](https://github.com/santoshakil) in [#28985](https://github.com/immich-app/immich/pull/28985)
- fix(mobile): give android notification channels proper names by [@santoshakil](https://github.com/santoshakil) in [#28986](https://github.com/immich-app/immich/pull/28986)
- fix: Improving scroll behavior on image stacks that overflow the screen by [@BlankCanvasStudio](https://github.com/BlankCanvasStudio) in [#28885](https://github.com/immich-app/immich/pull/28885)
- fix(web): focus on scrollable element on load by [@timonrieger](https://github.com/timonrieger) in [#29004](https://github.com/immich-app/immich/pull/29004)
- fix(mobile): show like and comment options on album photo deep links by [@santoshakil](https://github.com/santoshakil) in [#29020](https://github.com/immich-app/immich/pull/29020)
- fix(web): correctly handle person search with more than 100 results by [@maxinegardenas](https://github.com/maxinegardenas) in [#29002](https://github.com/immich-app/immich/pull/29002)
- fix(web): prevent upload status panel from overlapping album action bar by [@okxint](https://github.com/okxint) in [#29044](https://github.com/immich-app/immich/pull/29044)
- fix(web): error loading image state by [@bwees](https://github.com/bwees) in [#29058](https://github.com/immich-app/immich/pull/29058)
- fix(web): show asset arrows by [@timonrieger](https://github.com/timonrieger) in [#29010](https://github.com/immich-app/immich/pull/29010)
- fix(server): hide partner archived asset locations from map by [@timonrieger](https://github.com/timonrieger) in [#29028](https://github.com/immich-app/immich/pull/29028)
- fix: lock transcoding options by [@timonrieger](https://github.com/timonrieger) in [#29076](https://github.com/immich-app/immich/pull/29076)
- fix(server): do not merge metadata when multiple duplicates are kept by [@timonrieger](https://github.com/timonrieger) in [#29035](https://github.com/immich-app/immich/pull/29035)
- fix: integrity report checksum query by [@danieldietzler](https://github.com/danieldietzler) in [#29136](https://github.com/immich-app/immich/pull/29136)
- fix: map settings by [@danieldietzler](https://github.com/danieldietzler) in [#29134](https://github.com/immich-app/immich/pull/29134)
- fix: too strict cron expression validation by [@danieldietzler](https://github.com/danieldietzler) in [#29138](https://github.com/immich-app/immich/pull/29138)
- fix(web): respect local timezone when building date range for search by [@okxint](https://github.com/okxint) in [#29128](https://github.com/immich-app/immich/pull/29128)
- fix(web): language selector by [@meesfrensel](https://github.com/meesfrensel) in [#29065](https://github.com/immich-app/immich/pull/29065)
- fix: update datetimeRelative description to minutes instead of seconds by [@meesfrensel](https://github.com/meesfrensel) in [#29137](https://github.com/immich-app/immich/pull/29137)
- fix: video thumbnail quality sharing by [@bwees](https://github.com/bwees) in [#29104](https://github.com/immich-app/immich/pull/29104)
- fix(mobile): stop sync albums crashing on the main isolate by [@santoshakil](https://github.com/santoshakil) in [#29133](https://github.com/immich-app/immich/pull/29133)
- fix(mobile): show memories with no showAt/hideAt in the timeline lane by [@santoshakil](https://github.com/santoshakil) in [#29158](https://github.com/immich-app/immich/pull/29158)
- fix(mobile): keep toasts off the dynamic island when keyboard is open by [@santoshakil](https://github.com/santoshakil) in [#29159](https://github.com/immich-app/immich/pull/29159)
- fix(server): skip existing users when sharing albums by [@jeevan6996](https://github.com/jeevan6996) in [#28884](https://github.com/immich-app/immich/pull/28884)
- fix: web i18n by [@danieldietzler](https://github.com/danieldietzler) in [#29175](https://github.com/immich-app/immich/pull/29175)
- fix(web): shift+click on GPS asset extends range selection in geolocation utility by [@timonrieger](https://github.com/timonrieger) in [#29022](https://github.com/immich-app/immich/pull/29022)
- fix(server): allow non-utc datetime offsets by [@timonrieger](https://github.com/timonrieger) in [#29186](https://github.com/immich-app/immich/pull/29186)
- fix: remove local-only step ids from workflow json by [@danieldietzler](https://github.com/danieldietzler) in [#29188](https://github.com/immich-app/immich/pull/29188)
- fix: asset type filter by [@danieldietzler](https://github.com/danieldietzler) in [#29190](https://github.com/immich-app/immich/pull/29190)
- fix(mobile): prevent duplicate login pages for unauthenticated share intent warm start by [@olildu](https://github.com/olildu) in [#29054](https://github.com/immich-app/immich/pull/29054)
- fix(mobile): refresh memories on resume and day change by [@santoshakil](https://github.com/santoshakil) in [#28983](https://github.com/immich-app/immich/pull/28983)
- fix(mobile): re-lock locked folder when the app is backgrounded by [@santoshakil](https://github.com/santoshakil) in [#29089](https://github.com/immich-app/immich/pull/29089)
- fix(mobile): endless spinner on album selection when device has no albums by [@santoshakil](https://github.com/santoshakil) in [#28994](https://github.com/immich-app/immich/pull/28994)
- fix: rc version check by [@danieldietzler](https://github.com/danieldietzler) in [#29194](https://github.com/immich-app/immich/pull/29194)
- fix: detail panel people reactivity and iterator consumption by [@danieldietzler](https://github.com/danieldietzler) in [#29250](https://github.com/immich-app/immich/pull/29250)
- fix(server): use VBR for QSV so the max bitrate is respected by [@aclerici38](https://github.com/aclerici38) in [#29240](https://github.com/immich-app/immich/pull/29240)
- fix: ignore external libraries for integrity report checksum check by [@danieldietzler](https://github.com/danieldietzler) in [#29248](https://github.com/immich-app/immich/pull/29248)
- fix(web): remove map's fullscreen button by [@meesfrensel](https://github.com/meesfrensel) in [#29192](https://github.com/immich-app/immich/pull/29192)
- refactor: use SemVer classes for version compatability message by [@bwees](https://github.com/bwees) in [#29056](https://github.com/immich-app/immich/pull/29056)
- fix: sync backfill by [@jrasm91](https://github.com/jrasm91) in [#29267](https://github.com/immich-app/immich/pull/29267)
- fix(mobile): force AssetViewerPage recreation on repeated view intents by [@okxint](https://github.com/okxint) in [#29235](https://github.com/immich-app/immich/pull/29235)
- fix(mobile): blank notifications page after enabling notifications by [@santoshakil](https://github.com/santoshakil) in [#29232](https://github.com/immich-app/immich/pull/29232)
- fix(mobile): app doesn't exit full-screen mode by [@YarosMallorca](https://github.com/YarosMallorca) in [#29301](https://github.com/immich-app/immich/pull/29301)
- fix(mobile): only toggle backup from the switch, not the whole row by [@santoshakil](https://github.com/santoshakil) in [#29236](https://github.com/immich-app/immich/pull/29236)
- fix(mobile): hide video thumbnail when video is ready by [@santoshakil](https://github.com/santoshakil) in [#29012](https://github.com/immich-app/immich/pull/29012)
- fix(mobile): apply exif orientation to android raw photos by [@santoshakil](https://github.com/santoshakil) in [#29337](https://github.com/immich-app/immich/pull/29337)
- fix(server): face region coordinates parsing by [@djbravo06](https://github.com/djbravo06) in [#29333](https://github.com/immich-app/immich/pull/29333)
- feat: honor album access permissions in search endpoints by [@danieldietzler](https://github.com/danieldietzler) in [#29352](https://github.com/immich-app/immich/pull/29352)
- fix: version compatability check by [@bwees](https://github.com/bwees) in [#29405](https://github.com/immich-app/immich/pull/29405)

##### 📚 Documentation

- fix(docs): instructions on how to use local immich ui by [@YarosMallorca](https://github.com/YarosMallorca) in [#27813](https://github.com/immich-app/immich/pull/27813)
- fix(docs): helmet file affected containers  by [@mmomjian](https://github.com/mmomjian) in [#27939](https://github.com/immich-app/immich/pull/27939)
- fix(docs): Update Tailscale free tier user and device limits by [@Hakuin123](https://github.com/Hakuin123) in [#28151](https://github.com/immich-app/immich/pull/28151)
- docs: update rocm installation instructions by [@aigarius](https://github.com/aigarius) in [#25434](https://github.com/immich-app/immich/pull/25434)
- fix(docs): document `upgrade-insecure-requests` default by [@meesfrensel](https://github.com/meesfrensel) in [#28279](https://github.com/immich-app/immich/pull/28279)
- fix(docs): missing colon in config file doc by [@SuperSandro2000](https://github.com/SuperSandro2000) in [#28313](https://github.com/immich-app/immich/pull/28313)
- fix: update server-commands subcommand list by [@bo0tzz](https://github.com/bo0tzz) in [#28402](https://github.com/immich-app/immich/pull/28402)
- feat(docs): add fixed subnet guide for Synology to prevent firewall issues by [@racehd](https://github.com/racehd) in [#26554](https://github.com/immich-app/immich/pull/26554)
- chore(docs): update FAQ with profile picture change instructions by [@tvangemert](https://github.com/tvangemert) in [#28634](https://github.com/immich-app/immich/pull/28634)
- chore: update documentation to use mise commands by [@timonrieger](https://github.com/timonrieger) in [#28515](https://github.com/immich-app/immich/pull/28515)
- fix(docs): v3 bumps by [@mmomjian](https://github.com/mmomjian) in [#29007](https://github.com/immich-app/immich/pull/29007)
- docs(server): clarify AssetBulkUploadCheckItem.id is a correlation token by [@timonrieger](https://github.com/timonrieger) in [#29141](https://github.com/immich-app/immich/pull/29141)
- docs(mobile-app): add Play App Signing certificate hash by [@tlvince](https://github.com/tlvince) in [#29168](https://github.com/immich-app/immich/pull/29168)
- docs(mobile): point users towards shared setup docs by [@agg23](https://github.com/agg23) in [#29078](https://github.com/immich-app/immich/pull/29078)
- docs: clarify duplicate exif merging intent by [@timonrieger](https://github.com/timonrieger) in [#29203](https://github.com/immich-app/immich/pull/29203)
- fix(docsc): v3 bump by [@mmomjian](https://github.com/mmomjian) in [#29246](https://github.com/immich-app/immich/pull/29246)
- docs: MS smtp guide by [@jameskimmel](https://github.com/jameskimmel) in [#29289](https://github.com/immich-app/immich/pull/29289)

##### 🌐 Translations

- feat: latest language requests by [@danieldietzler](https://github.com/danieldietzler) in [#28858](https://github.com/immich-app/immich/pull/28858)
- chore: update translations by [@weblate](https://github.com/weblate) in [#27764](https://github.com/immich-app/immich/pull/27764)
- feat: languages by [@danieldietzler](https://github.com/danieldietzler) in [#29088](https://github.com/immich-app/immich/pull/29088)
- chore(web): update translations by [@weblate](https://github.com/weblate) in [#29036](https://github.com/immich-app/immich/pull/29036)
- chore(web): update translations by [@weblate](https://github.com/weblate) in [#29162](https://github.com/immich-app/immich/pull/29162)
- fix: turkish readme translation by [@MuySup](https://github.com/MuySup) in [#29234](https://github.com/immich-app/immich/pull/29234)
- chore(web): update translations by [@weblate](https://github.com/weblate) in [#29204](https://github.com/immich-app/immich/pull/29204)
- chore(web): update translations by [@weblate](https://github.com/weblate) in [#29290](https://github.com/immich-app/immich/pull/29290)
- chore(web): update translations by [@weblate](https://github.com/weblate) in [#29347](https://github.com/immich-app/immich/pull/29347)

##### New Contributors

- [@OdinOxin](https://github.com/OdinOxin) made their first contribution in [#27732](https://github.com/immich-app/immich/pull/27732)
- [@migpovrap](https://github.com/migpovrap) made their first contribution in [#26917](https://github.com/immich-app/immich/pull/26917)
- [@StevenMassaro](https://github.com/StevenMassaro) made their first contribution in [#27531](https://github.com/immich-app/immich/pull/27531)
- [@timdobras](https://github.com/timdobras) made their first contribution in [#26841](https://github.com/immich-app/immich/pull/26841)
- [@santanoce](https://github.com/santanoce) made their first contribution in [#26235](https://github.com/immich-app/immich/pull/26235)
- [@fredfloydd](https://github.com/fredfloydd) made their first contribution in [#27842](https://github.com/immich-app/immich/pull/27842)
- [@sparsh985](https://github.com/sparsh985) made their first contribution in [#26755](https://github.com/immich-app/immich/pull/26755)
- [@LJspice](https://github.com/LJspice) made their first contribution in [#27389](https://github.com/immich-app/immich/pull/27389)
- [@git-akihakune](https://github.com/git-akihakune) made their first contribution in [#27963](https://github.com/immich-app/immich/pull/27963)
- [@shaun0927](https://github.com/shaun0927) made their first contribution in [#27900](https://github.com/immich-app/immich/pull/27900)
- [@yosit](https://github.com/yosit) made their first contribution in [#27391](https://github.com/immich-app/immich/pull/27391)
- [@Hakuin123](https://github.com/Hakuin123) made their first contribution in [#28151](https://github.com/immich-app/immich/pull/28151)
- [@pinhao](https://github.com/pinhao) made their first contribution in [#28162](https://github.com/immich-app/immich/pull/28162)
- [@AyaanMAG](https://github.com/AyaanMAG) made their first contribution in [#28155](https://github.com/immich-app/immich/pull/28155)
- [@DavidTheFighter](https://github.com/DavidTheFighter) made their first contribution in [#28216](https://github.com/immich-app/immich/pull/28216)
- [@benbeckford](https://github.com/benbeckford) made their first contribution in [#28234](https://github.com/immich-app/immich/pull/28234)
- [@bhugh](https://github.com/bhugh) made their first contribution in [#27884](https://github.com/immich-app/immich/pull/27884)
- [@SkyDev125](https://github.com/SkyDev125) made their first contribution in [#26971](https://github.com/immich-app/immich/pull/26971)
- [@aigarius](https://github.com/aigarius) made their first contribution in [#25434](https://github.com/immich-app/immich/pull/25434)
- [@mws-weekend-projects](https://github.com/mws-weekend-projects) made their first contribution in [#26758](https://github.com/immich-app/immich/pull/26758)
- [@TheBestX11](https://github.com/TheBestX11) made their first contribution in [#27516](https://github.com/immich-app/immich/pull/27516)
- [@sakshamchawla](https://github.com/sakshamchawla) made their first contribution in [#20877](https://github.com/immich-app/immich/pull/20877)
- [@santoshakil](https://github.com/santoshakil) made their first contribution in [#28284](https://github.com/immich-app/immich/pull/28284)
- [@stfn42](https://github.com/stfn42) made their first contribution in [#28152](https://github.com/immich-app/immich/pull/28152)
- [@thowdev](https://github.com/thowdev) made their first contribution in [#26723](https://github.com/immich-app/immich/pull/26723)
- [@SuperSandro2000](https://github.com/SuperSandro2000) made their first contribution in [#28313](https://github.com/immich-app/immich/pull/28313)
- [@racehd](https://github.com/racehd) made their first contribution in [#26554](https://github.com/immich-app/immich/pull/26554)
- [@inesiscosta](https://github.com/inesiscosta) made their first contribution in [#27442](https://github.com/immich-app/immich/pull/27442)
- [@gnojus](https://github.com/gnojus) made their first contribution in [#28427](https://github.com/immich-app/immich/pull/28427)
- [@rdeaton](https://github.com/rdeaton) made their first contribution in [#28341](https://github.com/immich-app/immich/pull/28341)
- [@agg23](https://github.com/agg23) made their first contribution in [#28469](https://github.com/immich-app/immich/pull/28469)
- [@ollioddi](https://github.com/ollioddi) made their first contribution in [#26328](https://github.com/immich-app/immich/pull/26328)
- [@Caltsic](https://github.com/Caltsic) made their first contribution in [#28512](https://github.com/immich-app/immich/pull/28512)
- [@fabianwimberger](https://github.com/fabianwimberger) made their first contribution in [#28444](https://github.com/immich-app/immich/pull/28444)
- [@tvangemert](https://github.com/tvangemert) made their first contribution in [#28634](https://github.com/immich-app/immich/pull/28634)
- [@BlankCanvasStudio](https://github.com/BlankCanvasStudio) made their first contribution in [#28620](https://github.com/immich-app/immich/pull/28620)
- [@pneuly](https://github.com/pneuly) made their first contribution in [#28610](https://github.com/immich-app/immich/pull/28610)
- [@timjonez](https://github.com/timjonez) made their first contribution in [#27452](https://github.com/im…
renovate Bot added a commit to sdwilsh/ansible-playbooks that referenced this pull request Jul 8, 2026
##### [\`v3.0.1\`](https://github.com/immich-app/immich/releases/tag/v3.0.1)

##### v3.0.1

- Fixes a bug that causes albums don't show up in the mobile app

##### What's Changed

##### 🚀 Features

- feat(web): recently added link in sidebar by [@benbeckford](https://github.com/benbeckford) in [#29039](https://github.com/immich-app/immich/pull/29039)

##### 🐛 Bug fixes

- fix: albums broken on v2 mobile clients by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#29446](https://github.com/immich-app/immich/pull/29446)
- fix: setting input field description spacing for description snippet by [@danieldietzler](https://github.com/danieldietzler) in [#29433](https://github.com/immich-app/immich/pull/29433)

##### 🌐 Translations

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

**Full Changelog**: <https://github.com/immich-app/immich/compare/v3.0.0...v3.0.1>

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

##### v3.0.0

Welcome to Immich `v3.0.0`!

After months of hard work from the team and our amazing contributors, we're thrilled to announce the next major version of Immich: `v3.0.0`!  🎉

##### Breaking changes

This release includes several breaking changes; read the full migration guide [here](https://immich.app/blog/v3-migration). *It's worth mentioning that many of the breaking changes are updates to API endpoints and affect only **third-party tools** that integrate with Immich's API*. For the vast majority of users, updating works exactly as it always has.

##### How to update

> \[!WARNING]
> `v3.0.0` drops support for pgvecto.rs. If you run Immich before `v1.133.0` and haven't done the migration step yet, see the migration guide here. <https://docs.immich.app/install/upgrading/#migrating-to-vectorchord>

First, update the `IMMICH_VERSION` in your `.env` file to `v3`:

```diff
- IMMICH_VERSION=v2
+ IMMICH_VERSION=v3
```

Then run the usual update commands:

```bash
docker compose pull && docker compose up -d
```

##### Release candidates

If you missed it, `v3.0.0` was the first time we used release candidates, also known as prereleases. Release candidates are tested but not yet official releases of Immich, and they allow us to find and fix any outstanding bugs before a final release. If you would like to be notified about release candidates directly through Immich, you can change the release channel from "Stable" to "Release candidate" in the `Admin settings > Version check` options ([here](https://my.immich.app/admin/system-settings?isOpen=version-check)).

<img alt="New release channel option in version check settings" src="https://github.com/user-attachments/assets/fc8f6008-d486-4915-ad1b-feaddb856315" />
##### New Merch

As part of this release, we're happy to announce we also have some new swag for you!

- Kids clothing: For those who are likely the reason for your Immich library's size
- Colored embroidery: We now have clothes with a full color embroidered Immich logo

<a href="https://immich.store/collections/immich-3-0">
<img width="1200" alt="immich-store (1)" src="https://github.com/user-attachments/assets/ce114e7b-1424-4eca-975d-b23debadb32b" />
</a>

Check it out now at [https://immich.store](https://immich.store/collections/immich-3-0)!

##### Highlights

Now, let's get right into all the new features in this release:

- Mobile non-destructive editing
- Workflows (preview)
- Background backup improvement
- Recently added page
- Integrity checks
- Slideshow on mobile app
- HLS and real-time video transcoding (preview)
- New video player for web
- Open photo in Immich as gallery on Android
- OCR on mobile app
- Upload asset directly to album on the mobile app
- Option to select image size when sharing on the mobile app
- Timeline performance improvement for browsing a large amount of assets in a single month

##### Mobile non-destructive editing

<p align="center">
<img width="300" alt="image" src="https://github.com/user-attachments/assets/e9ddf97c-a4f8-42c1-9910-49ef3c8d4b0a" />
</p>

This is a follow-up to Image Editing on the web, which was released in `v2.5.0`. This feature allows you to make non-destructive edits to your photos inside of Immich. Until now, the mobile editor used a completely different system that created new assets instead of editing the photo in place.

With this update, we bring a new, easier-to-use editor to mobile devices that has the same features as the web version. You can now edit photos directly in the mobile app, including cropping, rotating, and adjusting your images without ever touching the original file. Similar to the web, edits are non-destructive, so you can revisit or revert them at any time. You can even make edits on mobile and then adjust them on the web later!

Some features from the previous mobile editing implementation have been removed including:

- Recoloring photos
- Editing live photos
- Editing local assets

We have plans to bring some of these capabilities back in future releases.

##### Workflows (preview)

The first preview of Workflows is here! Workflows let you automate actions in your library by chaining triggers, filters, and actions together with a drag-and-drop builder. This is the foundation for many exciting automations to come, and we'd love your feedback as we continue building on it.

You can access the feature from [Utilities > Workflows](https://my.immich.app/workflows) on the web.

<img width="800"  alt="Workflows link on the utilities page" src="https://github.com/user-attachments/assets/db7e139e-89b0-481a-9a66-530a40dc175a" />

From there, you can either create a new blank workflow or browse the premade templates to get a basic understanding of how workflows can be used.

<p align="center">
<img width="400" alt="image" src="https://github.com/user-attachments/assets/23fdb017-e439-4221-9be8-a14bd690fa9b" />
</p>
##### Workflows editor

<img alt="Workflow editor with an example workflow" src="https://github.com/user-attachments/assets/c6a569de-d884-4bdb-8bb0-0ff2c805bfb9" />

In the workflows editor, you can switch between the Visual or JSON editor. The visual editor is nice for building out the workflow; the JSON editor is nice for sharing and receiving workflow content from others.

In each workflow, there is a ***trigger*** and a sequence of ***steps.***

- Trigger: this is the entry point of each workflow; when the trigger occurs, the steps are evaluated.
- Steps: they include Filters (conditions) and Actions (effects); they can be combined to produce the desired effect of the use case you aim for.

<p align="center">
<img width="400" alt="List of available workflow steps" src="https://github.com/user-attachments/assets/50e89454-2bf9-4d41-bfa6-fd54f8944ea3" />
</p>
##### Sharing a workflow

You can share the workflow you made with others in two ways: text and JSON. Text is nice for sharing on a forum or for show-and-tell content. JSON is nice for others to make an exact copy of your workflow's configuration.

You can copy the text in the workflows summary panel on the lower right of the screen

<p align="center">
<img width="400"  alt="workflow summary in text" src="https://github.com/user-attachments/assets/dda24c88-f403-4189-a57b-71f6da3816e7" />
</p>

You can share the JSON content from the copy workflows button in the app bar, switch to the JSON editor, or use the `Show schema` button in the context menu in the workflows list

<img  alt="JSON editor" src="https://github.com/user-attachments/assets/307297cc-36d6-477c-bd72-d52be1dec0c5" />

<img  alt="Show workflow schema" src="https://github.com/user-attachments/assets/b6efada4-44fc-4d35-9e24-0f143c003313" />

> \[!NOTE]
> Please use this [discussion thread](https://github.com/immich-app/immich/discussions/29167) to propose new ideas of triggers and actions. We are looking for extensive feedback and suggestions from you all.

##### Background backup improvements

Background backup on Android is now significantly more reliable. Previously, the background backup on Android was limited to newly taken photos. Now, the app uses a new periodic task scheduler, which allows you to upload your entire library in the background, and it plays nicer with Android's background execution limits, properly cleans up tasks, and warns you when battery optimization and notification settings might interfere with backups.

On iOS, the background refresh task now runs its sync and upload work in parallel, so uploads actually start within the short time window iOS allows.

<p align="center">
<img width="300"  alt="Enable backup option on mobile" src="https://github.com/user-attachments/assets/82be41f3-93b9-4231-9f91-53eb317bb3fe" />
</p>
##### Recently added page

A new "Recently Added" page on the web and mobile lets you browse your library sorted by when assets were added to Immich, rather than when they were taken. This makes it easier to find what's new when browsing a new batch of imports. You can find the new page in the "Explore" tab on the web and in the "Search" tab on mobile.

<img width="798" height="220" alt="Recently added" src="https://github.com/user-attachments/assets/d4729864-f736-4554-a672-91861aad5f7f" />
##### Integrity checks

The maintenance page has gotten a new addition: integrity reports! Immich will scan its directories on your file system, and compare it to what it has stored in its database. If there are deviations, they will be surfaced as

- untracked, if there is a file in Immich's directories that Immich does not know of
- missing, if Immich references a file in its database that does not exist in that place (anymore)
- a checksum mismatch, if the checksum of the file on disk does not match the checksum Immich has stored for that file. Typically, this would happen through file corruption but could also be the result of a bad rename.

<img alt="Integrity report on the maintenance page showing a count of untracked and missing files, as well as checksum mismatches." src="https://github.com/user-attachments/assets/0e59537e-89b7-4d06-b5e6-731bb1e453c0" />

You can configure when and how long the job runs each night.

<img width="800" alt="image" src="https://github.com/user-attachments/assets/13da49ac-5cfa-40a1-b852-b89b0ed7fff6" />
##### Slideshow (mobile)

The slideshow experience comes to mobile! You can now sit back and let your photos and videos play across the screen, just like on the web.

<p align="center">
<img width="300" alt="Slideshow view on mobile" src="https://github.com/user-attachments/assets/b3325f3c-0505-405f-9b79-322f738030f4" />
</p>
##### HLS and Real-Time Video transcoding (preview)

Immich can now transcode videos on-the-fly without needing to generate offline transcodes. This has been a long-requested feature with many benefits:

- Quality switching (both manual and automatic)
- Transcoding to the best codecs supported by the client
- Lower storage overhead when offline transcoding is disabled
- HDR for compatible clients (not implemented yet)
- Remuxing rather than transcoding the original when bandwidth allows it (not implemented yet)

Please note that this feature is still experimental and can change behavior from version to version. It's currently only implemented in the web app, with the mobile app implementation in progress.

To enable real-time transcoding, go to the [video transcoding settings](https://my.immich.app/admin/system-settings?isOpen=video-transcoding+realtime-transcoding) (scroll down). Offline transcoding isn't directly affected by enabling it, so if you'd like to disable offline transcoding, you should also adjust the transcode policy.

> \[!NOTE]
> For assets imported prior to v3, you will also need to re-run Metadata Extraction in the job panel for them to be re-processed.

<img alt="HLS Transcoding settings" src="https://github.com/user-attachments/assets/6313ea40-ae1a-4495-aaea-212ef67fd338" />

Keep in mind that your server needs to be powerful enough to transcode in real-time for this feature to work well. Hardware acceleration is recommended, but not required, when using this feature.

##### New video player for web

A new custom video player on the web app ensures all your devices share the same controls and layout, matching the Immich design. Some basic functions, like changing the playback rate, are available. This should also fix a lot of the problems on iOS, where the OS's controls are hidden behind the Immich navbar.

##### Open photos in Immich as a gallery on Android

Immich can now act as a gallery/image viewer app on Android. Tap a photo or video in another app, choose Immich, and it opens directly in the asset viewer with options to share the file or upload it to your library.

This is the first iteration of the feature, and refinements to how Immich recognizes files that are already in your library are on the way

<img width="350" alt="image" src="https://github.com/user-attachments/assets/f98c2a65-1b84-4580-a7af-ead54ab737d8" />
<img width="350" alt="image" src="https://github.com/user-attachments/assets/fb783bed-c6c4-4634-af71-c2e888274121" />
##### OCR on the mobile app

The asset viewer now has a toggle that highlights recognized text in a photo, and you can select and copy it directly from the image.

<p align="center">
<img width="350" alt="OCR in the mobile app" src="https://github.com/user-attachments/assets/5f870d38-53a5-4b05-9dba-5d8838b86934" />
</p>
##### Upload assets directly to an album on mobile

You can now upload local photos directly to an album in the mobile app, including from the asset bottom sheet, instead of uploading first and organizing later. A small change that removes a lot of friction from the backup-and-organize flow.

##### Select image size when sharing on mobile

When sharing photos from the mobile app, you can now choose the image size before sending; it is handy for keeping shared files small for messaging apps while preserving the option to share at full quality when needed.

You can change the default behavior in the `App Settings > Preferences`

<p align="center">
<img width="350"  alt="Share file's size settings" src="https://github.com/user-attachments/assets/fe1c95d7-39e4-4c25-8981-dea4d07fce5a" />
</p>

You can also pick the option when sharing on-the-fly by long pressing the `Share` button

<p align="center">
<img width="350"  alt="On-the-fly picker" src="https://github.com/user-attachments/assets/667b79a7-efac-462b-8736-9e674e083d6b" />
</p>
##### Timeline performance Improvements

Browsing months with a large number of assets is now dramatically smoother and prevents the browser tab from locking up when your instance encounters that scenario.

##### 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>

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

##### What's Changed

##### 🚨 Breaking Changes

- refactor!: migrate class-validator to zod by [@timonrieger](https://github.com/timonrieger) in [#26597](https://github.com/immich-app/immich/pull/26597)
- refactor!: remove replace asset by [@jrasm91](https://github.com/jrasm91) in [#27022](https://github.com/immich-app/immich/pull/27022)
- refactor!: remove my shared link dto by [@jrasm91](https://github.com/jrasm91) in [#27023](https://github.com/immich-app/immich/pull/27023)
- chore!: remove deprecated env variables by [@jrasm91](https://github.com/jrasm91) in [#27802](https://github.com/immich-app/immich/pull/27802)
- chore!: remove getRandom api endpoint by [@bwees](https://github.com/bwees) in [#27780](https://github.com/immich-app/immich/pull/27780)
- chore!: remove unused token response param by [@jrasm91](https://github.com/jrasm91) in [#27805](https://github.com/immich-app/immich/pull/27805)
- refactor: yeet old timeline by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#27666](https://github.com/immich-app/immich/pull/27666)
- chore!: remove old timeline sync endpoints by [@jrasm91](https://github.com/jrasm91) in [#27804](https://github.com/immich-app/immich/pull/27804)
- chore!: remove deviceId and deviceAssetId by [@danieldietzler](https://github.com/danieldietzler) in [#27818](https://github.com/immich-app/immich/pull/27818)
- chore!: rename API key schemas by [@jrasm91](https://github.com/jrasm91) in [#27828](https://github.com/immich-app/immich/pull/27828)
- chore!: remove without assets by [@jrasm91](https://github.com/jrasm91) in [#27835](https://github.com/immich-app/immich/pull/27835)
- fix: oauth issuerUrl validation by [@bo0tzz](https://github.com/bo0tzz) in [#27848](https://github.com/immich-app/immich/pull/27848)
- fix!: do not allow insecure oauth requests by default by [@bo0tzz](https://github.com/bo0tzz) in [#27844](https://github.com/immich-app/immich/pull/27844)
- fix!: set duration to null when not present by [@meesfrensel](https://github.com/meesfrensel) in [#26982](https://github.com/immich-app/immich/pull/26982)
- chore!: remove /api/server/theme endpoint by [@jrasm91](https://github.com/jrasm91) in [#27880](https://github.com/immich-app/immich/pull/27880)
- chore!: migrate album owner to album\_user by [@danieldietzler](https://github.com/danieldietzler) in [#27467](https://github.com/immich-app/immich/pull/27467)
- refactor!: change number to integer types by [@timonrieger](https://github.com/timonrieger) in [#27912](https://github.com/immich-app/immich/pull/27912)
- refactor(server)!: move correlationId to X-Correlation-ID response header by [@timonrieger](https://github.com/timonrieger) in [#28139](https://github.com/immich-app/immich/pull/28139)
- refactor(server)!: remove redundant error and statusCode fields from error responses by [@timonrieger](https://github.com/timonrieger) in [#28140](https://github.com/immich-app/immich/pull/28140)
- chore(server)!: drop pgvecto.rs support by [@mertalev](https://github.com/mertalev) in [#28159](https://github.com/immich-app/immich/pull/28159)
- chore!: duration in milliseconds by [@mertalev](https://github.com/mertalev) in [#28003](https://github.com/immich-app/immich/pull/28003)
- refactor(server)!: sanitize error messages to avoid leaking resource details by [@timonrieger](https://github.com/timonrieger) in [#28154](https://github.com/immich-app/immich/pull/28154)
- refactor(server)!: structured validation error responses by [@timonrieger](https://github.com/timonrieger) in [#28204](https://github.com/immich-app/immich/pull/28204)
- feat(server)!: add isOwned filter to albums API by [@timonrieger](https://github.com/timonrieger) in [#28213](https://github.com/immich-app/immich/pull/28213)
- chore(ml)!: require numpy 2.4 by [@mertalev](https://github.com/mertalev) in [#28158](https://github.com/immich-app/immich/pull/28158)
- fix(deps): update dependency nestjs-otel to v8 by [@renovate](https://github.com/renovate)\[bot] in [#27863](https://github.com/immich-app/immich/pull/27863)
- chore(ml)!: remove deprecated envs by [@mertalev](https://github.com/mertalev) in [#28326](https://github.com/immich-app/immich/pull/28326)
- chore(server)!: remove libopus enum by [@mertalev](https://github.com/mertalev) in [#28325](https://github.com/immich-app/immich/pull/28325)
- refactor!: remove asset faces from AssetResponseDto by [@bwees](https://github.com/bwees) in [#27779](https://github.com/immich-app/immich/pull/27779)
- refactor(server)!: drop empty string to null conversion by [@timonrieger](https://github.com/timonrieger) in [#28808](https://github.com/immich-app/immich/pull/28808)
- refactor(server)!: remove changeExpiryTime by [@timonrieger](https://github.com/timonrieger) in [#28816](https://github.com/immich-app/immich/pull/28816)
- refactor!: disallow star rating < 1 by [@meesfrensel](https://github.com/meesfrensel) in [#27896](https://github.com/immich-app/immich/pull/27896)
- fix!: search endpoints visibility can be omitted by [@danieldietzler](https://github.com/danieldietzler) in [#29385](https://github.com/immich-app/immich/pull/29385)

##### 🫥 Deprecated Changes

- refactor(server): deprecate PUT routes in favor of PATCH by [@timonrieger](https://github.com/timonrieger) in [#28859](https://github.com/immich-app/immich/pull/28859)

##### 🔒 Security

- fix: run profile picture through thumbnail pipeline by [@bo0tzz](https://github.com/bo0tzz) in [#27890](https://github.com/immich-app/immich/pull/27890)

##### 🚀 Features

- feat: mobile editing by [@bwees](https://github.com/bwees) in [#25397](https://github.com/immich-app/immich/pull/25397)
- feat: album map markers endpoint by [@jrasm91](https://github.com/jrasm91) in [#27830](https://github.com/immich-app/immich/pull/27830)
- feat(server): added backchannel logout api endpoint by [@santanoce](https://github.com/santanoce) in [#26235](https://github.com/immich-app/immich/pull/26235)
- feat(server): add OIDC logout URL override option by [@LJspice](https://github.com/LJspice) in [#27389](https://github.com/immich-app/immich/pull/27389)
- feat: android periodic work manager task by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#23563](https://github.com/immich-app/immich/pull/23563)
- feat(web): custom video player controls by [@meesfrensel](https://github.com/meesfrensel) in [#26183](https://github.com/immich-app/immich/pull/26183)
- feat(web): add full-path search mode to UI by [@mws-weekend-projects](https://github.com/mws-weekend-projects) in [#26758](https://github.com/immich-app/immich/pull/26758)
- feat: recently added assets page by [@benbeckford](https://github.com/benbeckford) in [#28272](https://github.com/immich-app/immich/pull/28272)
- feat(mobile): slideshow view by [@benbeckford](https://github.com/benbeckford) in [#28421](https://github.com/immich-app/immich/pull/28421)
- feat(mobile): "Add Tags" asset multiselect option by [@benjamonnguyen](https://github.com/benjamonnguyen) in [#26269](https://github.com/immich-app/immich/pull/26269)
- feat: workflows & plugins by [@jrasm91](https://github.com/jrasm91) in [#26727](https://github.com/immich-app/immich/pull/26727)
- feat(server): hls with real-time transcoding by [@mertalev](https://github.com/mertalev) in [#28230](https://github.com/immich-app/immich/pull/28230)
- feat(web): hls player by [@mertalev](https://github.com/mertalev) in [#28312](https://github.com/immich-app/immich/pull/28312)
- feat(mobile): Android. Immich as a gallery / image viewer app by [@PeterOmbodi](https://github.com/PeterOmbodi) in [#26109](https://github.com/immich-app/immich/pull/26109)
- feat: user upload heatmap by [@bondeabhijeet](https://github.com/bondeabhijeet) in [#28593](https://github.com/immich-app/immich/pull/28593)
- feat(mobile): ocr support by [@YarosMallorca](https://github.com/YarosMallorca) in [#26523](https://github.com/immich-app/immich/pull/26523)
- feat: geolocation workflow filter by [@benbeckford](https://github.com/benbeckford) in [#28961](https://github.com/immich-app/immich/pull/28961)
- feat: image quality option in sharing by [@alextran1502](https://github.com/alextran1502) in [#28918](https://github.com/immich-app/immich/pull/28918)
- feat: integrity check jobs (missing files, untracked files, checksums) by [@insertish](https://github.com/insertish) in [#24205](https://github.com/immich-app/immich/pull/24205)
- feat: new feature message by [@alextran1502](https://github.com/alextran1502) in [#29388](https://github.com/immich-app/immich/pull/29388)

##### 🌟 Enhancements

- feat(web): persist state of file path information in details panel by [@cratoo](https://github.com/cratoo) in [#27770](https://github.com/immich-app/immich/pull/27770)
- feat: commands by [@jrasm91](https://github.com/jrasm91) in [#27546](https://github.com/immich-app/immich/pull/27546)
- feat: upgrade immich/ui by [@jrasm91](https://github.com/jrasm91) in [#27792](https://github.com/immich-app/immich/pull/27792)
- feat: filter users on share by [@OdinOxin](https://github.com/OdinOxin) in [#27732](https://github.com/immich-app/immich/pull/27732)
- fix(server): render storage template date/time tokens in UTC ([#24350](https://github.com/immich-app/immich/issues/24350)) by [@migpovrap](https://github.com/migpovrap) in [#26917](https://github.com/immich-app/immich/pull/26917)
- feat(web): lazy load library and server statistics by [@etnoy](https://github.com/etnoy) in [#26406](https://github.com/immich-app/immich/pull/26406)
- feat: sort users alphabetically when adding to album by [@OdinOxin](https://github.com/OdinOxin) in [#27731](https://github.com/immich-app/immich/pull/27731)
- feat: auth logout page by [@jrasm91](https://github.com/jrasm91) in [#27831](https://github.com/immich-app/immich/pull/27831)
- chore: improve randomness of /search/random endpoint by [@StevenMassaro](https://github.com/StevenMassaro) in [#27531](https://github.com/immich-app/immich/pull/27531)
- feat: dynamic languages by [@jrasm91](https://github.com/jrasm91) in [#27869](https://github.com/immich-app/immich/pull/27869)
- feat: cache shared link by [@danieldietzler](https://github.com/danieldietzler) in [#27889](https://github.com/immich-app/immich/pull/27889)
- feat(server): add configurable OAuth prompt parameter by [@sparsh985](https://github.com/sparsh985) in [#26755](https://github.com/immich-app/immich/pull/26755)
- feat(server): add MPO file type support by [@git-akihakune](https://github.com/git-akihakune) in [#27963](https://github.com/immich-app/immich/pull/27963)
- feat(mobile): action bottom sheet on map timeline by [@YarosMallorca](https://github.com/YarosMallorca) in [#27515](https://github.com/immich-app/immich/pull/27515)
- feat(server): track video metadata by [@mertalev](https://github.com/mertalev) in [#28023](https://github.com/immich-app/immich/pull/28023)
- feat(enhancement): Navigate stack with up and down arrow keys by [@cratoo](https://github.com/cratoo) in [#27854](https://github.com/immich-app/immich/pull/27854)
- fix(web): migrate people management component to page, enabling tooltips by [@SkyDev125](https://github.com/SkyDev125) in [#26971](https://github.com/immich-app/immich/pull/26971)
- chore(mobile): add box shadow to asset details by [@uhthomas](https://github.com/uhthomas) in [#27510](https://github.com/immich-app/immich/pull/27510)
- feat: hide hidden person from memories by [@sakshamchawla](https://github.com/sakshamchawla) in [#20877](https://github.com/immich-app/immich/pull/20877)
- feat(mobile): increased tap area on video player overlay by [@YarosMallorca](https://github.com/YarosMallorca) in [#27269](https://github.com/immich-app/immich/pull/27269)
- feat(web): Add metadata overlay to slideshow by [@timonrieger](https://github.com/timonrieger) in [#24627](https://github.com/immich-app/immich/pull/24627)
- feat(web): add individual filter removal from search result chips by [@timonrieger](https://github.com/timonrieger) in [#28166](https://github.com/immich-app/immich/pull/28166)
- feat(mobile): trash/restore all by [@YarosMallorca](https://github.com/YarosMallorca) in [#28116](https://github.com/immich-app/immich/pull/28116)
- feat: display more info in asset viewer by [@alextran1502](https://github.com/alextran1502) in [#24630](https://github.com/immich-app/immich/pull/24630)
- feat(server): allow subpaths for machine learning URL by [@gnojus](https://github.com/gnojus) in [#28427](https://github.com/immich-app/immich/pull/28427)
- feat(ui): Shared URL input configuration by [@Lauritz-Tieste](https://github.com/Lauritz-Tieste) in [#27105](https://github.com/immich-app/immich/pull/27105)
- refactor: enhance shared link UI and functionality by [@Lauritz-Tieste](https://github.com/Lauritz-Tieste) in [#26464](https://github.com/immich-app/immich/pull/26464)
- feat: upload and add local asset directly to album by [@alextran1502](https://github.com/alextran1502) in [#28123](https://github.com/immich-app/immich/pull/28123)
- feat: Selectable metadata in duplicates utility with diffing by [@ollioddi](https://github.com/ollioddi) in [#26328](https://github.com/immich-app/immich/pull/26328)
- fix: improve form control focus visibility by [@Caltsic](https://github.com/Caltsic) in [#28512](https://github.com/immich-app/immich/pull/28512)
- feat: command for user pages by [@alextran1502](https://github.com/alextran1502) in [#28554](https://github.com/immich-app/immich/pull/28554)
- refactor: use ControlBar UI Library component by [@bwees](https://github.com/bwees) in [#28567](https://github.com/immich-app/immich/pull/28567)
- feat: workflow template by [@alextran1502](https://github.com/alextran1502) in [#28553](https://github.com/immich-app/immich/pull/28553)
- feat(mobile): improve downloading algorithm for sharing by [@YarosMallorca](https://github.com/YarosMallorca) in [#27312](https://github.com/immich-app/immich/pull/27312)
- feat: search by album name and id by [@jrasm91](https://github.com/jrasm91) in [#28672](https://github.com/immich-app/immich/pull/28672)
- feat: upload local assets to album from bottom sheet by [@alextran1502](https://github.com/alextran1502) in [#28531](https://github.com/immich-app/immich/pull/28531)
- feat: places in context search by [@timonrieger](https://github.com/timonrieger) in [#28768](https://github.com/immich-app/immich/pull/28768)
- feat: minimum face count per user by [@timjonez](https://github.com/timjonez) in [#27452](https://github.com/immich-app/immich/pull/27452)
- feat: show notification and battery optimization warning by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#26610](https://github.com/immich-app/immich/pull/26610)
- feat: workflows drag and drop enhancements by [@danieldietzler](https://github.com/danieldietzler) in [#28764](https://github.com/immich-app/immich/pull/28764)
- feat(mobile): min face count per-user by [@YarosMallorca](https://github.com/YarosMallorca) in [#28805](https://github.com/immich-app/immich/pull/28805)
- refactor(server): allow -1 rating again by [@timonrieger](https://github.com/timonrieger) in [#28886](https://github.com/immich-app/immich/pull/28886)
- feat(web): warn before overwriting existing locations in geolocation utility by [@yoshovski](https://github.com/yoshovski) in [#28840](https://github.com/immich-app/immich/pull/28840)
- feat: warn if microservices worker is missing by [@bo0tzz](https://github.com/bo0tzz) in [#28869](https://github.com/immich-app/immich/pull/28869)
- fix(web): show album names in duplicate review by [@meesfrensel](https://github.com/meesfrensel) in [#29080](https://github.com/immich-app/immich/pull/29080)
- feat: keyboard seeking for new video player by [@danieldietzler](https://github.com/danieldietzler) in [#29208](https://github.com/immich-app/immich/pull/29208)
- feat(web): Add text-white-shadow to elements and increase the shadows effect by [@Vogeluff](https://github.com/Vogeluff) in [#29165](https://github.com/immich-app/immich/pull/29165)
- feat: webhook workflow action by [@benbeckford](https://github.com/benbeckford) in [#29258](https://github.com/immich-app/immich/pull/29258)
- feat: integrity checks admin settings by [@danieldietzler](https://github.com/danieldietzler) in [#29406](https://github.com/immich-app/immich/pull/29406)

##### 🐛 Bug fixes

- fix(web): center images in RTL layouts ([#27678](https://github.com/immich-app/immich/issues/27678)) by [@Nicolas-micuda-becker](https://github.com/Nicolas-micuda-becker) in [#27753](https://github.com/immich-app/immich/pull/27753)
- fix(mobile): add keys for person tiles in search by [@YarosMallorca](https://github.com/YarosMallorca) in [#27689](https://github.com/immich-app/immich/pull/27689)
- fix(web): selection clearing on preview by [@YarosMallorca](https://github.com/YarosMallorca) in [#27702](https://github.com/immich-app/immich/pull/27702)
- fix: asset multi select download shortcut by [@danieldietzler](https://github.com/danieldietzler) in [#27784](https://github.com/immich-app/immich/pull/27784)
- fix(web): add partner photo to album from multiselect by [@YarosMallorca](https://github.com/YarosMallorca) in [#27767](https://github.com/immich-app/immich/pull/27767)
- fix: redirect original by [@danieldietzler](https://github.com/danieldietzler) in [#27759](https://github.com/immich-app/immich/pull/27759)
- fix: make web build stage deterministic by [@bo0tzz](https://github.com/bo0tzz) in [#27823](https://github.com/immich-app/immich/pull/27823)
- fix(web): svelte regression - cancel video preview fetch when bind:this is cleared early by [@midzelis](https://github.com/midzelis) in [#27713](https://github.com/immich-app/immich/pull/27713)
- fix(web): stale adaptive image when original overlays preview by [@midzelis](https://github.com/midzelis) in [#27621](https://github.com/immich-app/immich/pull/27621)
- fix(mobile): readonly redirect when not logged in by [@YarosMallorca](https://github.com/YarosMallorca) in [#27728](https://github.com/immich-app/immich/pull/27728)
- fix(web): close edit faces panel on Escape key press by [@midzelis](https://github.com/midzelis) in [#27519](https://github.com/immich-app/immich/pull/27519)
- fix(oauth): normalize email claim to lowercase and trim before account lookup and registration by [@timdobras](https://github.com/timdobras) in [#26841](https://github.com/immich-app/immich/pull/26841)
- fix(web): use event for zooming out after opening face editor by [@meesfrensel](https://github.com/meesfrensel) in [#27789](https://github.com/immich-app/immich/pull/27789)
- fix: sanitize filenames before adding to zip by [@bo0tzz](https://github.com/bo0tzz) in [#27893](https://github.com/immich-app/immich/pull/27893)
- fix(server): require at least one field to be set when updating memory by [@fredfloydd](https://github.com/fredfloydd) in [#27842](https://github.com/immich-app/immich/pull/27842)
- fix(web): compute hashes for uploads in chunks by [@fredfloydd](https://github.com/fredfloydd) in [#27878](https://github.com/immich-app/immich/pull/27878)
- fix(web): fix stale album page load by [@fredfloydd](https://github.com/fredfloydd) in [#27825](https://github.com/immich-app/immich/pull/27825)
- fix(web): prevent interaction with detail panel behind person side panel by [@midzelis](https://github.com/midzelis) in [#27309](https://github.com/immich-app/immich/pull/27309)
- fix: show neon light by [@alextran1502](https://github.com/alextran1502) in [#27994](https://github.com/immich-app/immich/pull/27994)
- fix(mobile): zero exposure by [@YarosMallorca](https://github.com/YarosMallorca) in [#28017](https://github.com/immich-app/immich/pull/28017)
- fix(mobile): clear local data on forced logout by [@LeLunZ](https://github.com/LeLunZ) in [#27957](https://github.com/immich-app/immich/pull/27957)
- fix(mobile): enable autoplay for motion photos in video viewer by [@LeLunZ](https://github.com/LeLunZ) in [#27961](https://github.com/immich-app/immich/pull/27961)
- fix(mobile): thumbnail transition to asset viewer by [@LeLunZ](https://github.com/LeLunZ) in [#27850](https://github.com/immich-app/immich/pull/27850)
- fix: jump to timeline on new auto\_router update by [@alextran1502](https://github.com/alextran1502) in [#28022](https://github.com/immich-app/immich/pull/28022)
- fix(mobile): delete assets on trash empty, Android by [@PeterOmbodi](https://github.com/PeterOmbodi) in [#26070](https://github.com/immich-app/immich/pull/26070)
- fix(ml): handle empty/corrupt images in face detection by [@yosit](https://github.com/yosit) in [#27391](https://github.com/immich-app/immich/pull/27391)
- fix(web): refresh memories hourly by [@meesfrensel](https://github.com/meesfrensel) in [#28114](https://github.com/immich-app/immich/pull/28114)
- fix(web): large files: better handling of asset deletions by [@meesfrensel](https://github.com/meesfrensel) in [#28117](https://github.com/immich-app/immich/pull/28117)
- fix(web): double video playback on map timeline by [@YarosMallorca](https://github.com/YarosMallorca) in [#28090](https://github.com/immich-app/immich/pull/28090)
- fix(mobile): suppress asset stack UI in trash timeline by [@PeterOmbodi](https://github.com/PeterOmbodi) in [#26536](https://github.com/immich-app/immich/pull/26536)
- fix(web): timeline scroll when pressing back from stacked asset by [@Snowknight26](https://github.com/Snowknight26) in [#28163](https://github.com/immich-app/immich/pull/28163)
- fix(server): selectively apply metadata bitstream filter for video thumbnails by [@pinhao](https://github.com/pinhao) in [#28162](https://github.com/immich-app/immich/pull/28162)
- fix(web): fix shared link /s/photos.\* navigation after password login by [@meesfrensel](https://github.com/meesfrensel) in [#27788](https://github.com/immich-app/immich/pull/27788)
- fix(ml): respect time zone for logs in cuda container by [@AyaanMAG](https://github.com/AyaanMAG) in [#28155](https://github.com/immich-app/immich/pull/28155)
- fix: librknnrt permissions in machine-learning by [@DavidTheFighter](https://github.com/DavidTheFighter) in [#28216](https://github.com/immich-app/immich/pull/28216)
- fix(server): validate duplicate group ownership before dismissal by [@timonrieger](https://github.com/timonrieger) in [#28221](https://github.com/immich-app/immich/pull/28221)
- fix(web): correct timeline yesterday label across month boundaries by [@michelheusschen](https://github.com/michelheusschen) in [#28183](https://github.com/immich-app/immich/pull/28183)
- fix(mobile): show lens info without lens name by [@benbeckford](https://github.com/benbeckford) in [#28234](https://github.com/immich-app/immich/pull/28234)
- fix: stale person name after merge by [@danieldietzler](https://github.com/danieldietzler) in [#28222](https://github.com/immich-app/immich/pull/28222)
- fix(web): shared album avatars opening modal by [@meesfrensel](https://github.com/meesfrensel) in [#26719](https://github.com/immich-app/immich/pull/26719)
- fix(mobile): prevent asset loading issues when changing page or when closing memories by [@LeLunZ](https://github.com/LeLunZ) in [#27596](https://github.com/immich-app/immich/pull/27596)
- fix(mobile): correct filter default and UI desync in similar photos search by [@TheBestX11](https://github.com/TheBestX11) in [#27516](https://github.com/immich-app/immich/pull/27516)
- fix(server): hide isFavorite from partner asset sync stream by [@timonrieger](https://github.com/timonrieger) in [#28035](https://github.com/immich-app/immich/pull/28035)
- fix(mobile): restore notification plugin init by [@santoshakil](https://github.com/santoshakil) in [#28284](https://github.com/immich-app/immich/pull/28284)
- fix(mobile): mounted check before setState in album sync action by [@santoshakil](https://github.com/santoshakil) in [#28300](https://github.com/immich-app/immich/pull/28300)
- fix(mobile): avoid duplicate assets in album view by [@stfn42](https://github.com/stfn42) in [#28152](https://github.com/immich-app/immich/pull/28152)
- fix(mobile): Deduplicate assets in person view timeline by [@thowdev](https://github.com/thowdev) in [#26723](https://github.com/immich-app/immich/pull/26723)
- fix(deployment): remove unneeded volume by [@mmomjian](https://github.com/mmomjian) in [#28307](https://github.com/immich-app/immich/pull/28307)
- fix: mobile upload duration type by [@alextran1502](https://github.com/alextran1502) in [#28362](https://github.com/immich-app/immich/pull/28362)
- fix: deep link for assets when asset viewer already open by [@bwees](https://github.com/bwees) in [#27971](https://github.com/immich-app/immich/pull/27971)
- fix: kekab icon colors in light mode by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#28366](https://github.com/immich-app/immich/pull/28366)
- fix: indexes on remote\_asset\_entity by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#28264](https://github.com/immich-app/immich/pull/28264)
- fix(mobile): clear linkedRemoteAlbumId in reset() so FK refs dont dangle by [@santoshakil](https://github.com/santoshakil) in [#28382](https://github.com/immich-app/immich/pull/28382)
- fix: ignore icc profile make and model by [@jrasm91](https://github.com/jrasm91) in [#28412](https://github.com/immich-app/immich/pull/28412)
- fix(mobile): don't block app open on slow validateAccessToken by [@santoshakil](https://github.com/santoshakil) in [#28405](https://github.com/immich-app/immich/pull/28405)
- fix(mobile): add restore option to trashed assets by [@inesiscosta](https://github.com/inesiscosta) in [#27442](https://github.com/immich-app/immich/pull/27442)
- fix(mobile): use correct delete action by [@ByteSizedMarius](https://github.com/ByteSizedMarius) in [#26575](https://github.com/immich-app/immich/pull/26575)
- fix(server): dedupe database backup jobs by [@rdeaton](https://github.com/rdeaton) in [#28341](https://github.com/immich-app/immich/pull/28341)
- fix(mobile): cronet buffer overflow on compressed thumbnails by [@santoshakil](https://github.com/santoshakil) in [#28439](https://github.com/immich-app/immich/pull/28439)
- fix(mobile): cronet thumbnail buffer overflow regression from [#28439](https://github.com/immich-app/immich/issues/28439) by [@santoshakil](https://github.com/santoshakil) in [#28450](https://github.com/immich-app/immich/pull/28450)
- fix(mobile): mounted check in ThumbnailTile hero flight listener by [@santoshakil](https://github.com/santoshakil) in [#28451](https://github.com/immich-app/immich/pull/28451)
- fix(mobile): don't force-unwrap nil localizedTitle in ios getAlbums by [@santoshakil](https://github.com/santoshakil) in [#28452](https://github.com/immich-app/immich/pull/28452)
- fix(web): work around Chrome HDR image seam lines during zoom by [@midzelis](https://github.com/midzelis) in [#27715](https://github.com/immich-app/immich/pull/27715)
- fix(ios): respect status bar scroll to top in timeline views by [@agg23](https://github.com/agg23) in [#28469](https://github.com/immich-app/immich/pull/28469)
- fix(mobile): asset viewer stuck on spinner after rotation by [@LeLunZ](https://github.com/LeLunZ) in [#28019](https://github.com/immich-app/immich/pull/28019)
- fix(web): timeline stuttering with many assets in 1 day by [@benbeckford](https://github.com/benbeckford) in [#28509](https://github.com/immich-app/immich/pull/28509)
- fix(mobile): preserve zoom level during image loading and live photo playback by [@LeLunZ](https://github.com/LeLunZ) in [#27960](https://github.com/immich-app/immich/pull/27960)
- fix(ml): stabilize MIGraphX inference by [@fabianwimberger](https://github.com/fabianwimberger) in [#28444](https://github.com/immich-app/immich/pull/28444)
- fix: await sync asset v2 by [@bwees](https://github.com/bwees) in [#28569](https://github.com/immich-app/immich/pull/28569)
- fix: strip metadata from timeline responses for shared links without exif sharing by [@danieldietzler](https://github.com/danieldietzler) in [#28644](https://github.com/immich-app/immich/pull/28644)
- fix: Refresh local album overview page after asset deletion by [@Lauritz-Tieste](https://github.com/Lauritz-Tieste) in [#28586](https://github.com/immich-app/immich/pull/28586)
- fix(server): prevent locked assets from leaking to partners by [@timonrieger](https://github.com/timonrieger) in [#28652](https://github.com/immich-app/immich/pull/28652)
- refactor(web): replace per-asset viewport proximity with day-tier active indices by [@midzelis](https://github.com/midzelis) in [#28597](https://github.com/immich-app/immich/pull/28597)
- fix: timeline scroll flicker by [@alextran1502](https://github.com/alextran1502) in [#28653](https://github.com/immich-app/immich/pull/28653)
- fix: api repositories using stale endpoint by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#28667](https://github.com/immich-app/immich/pull/28667)
- fix: disallow cross origin/non http protocols for continueUrl on login by [@bwees](https://github.com/bwees) in [#28706](https://github.com/immich-app/immich/pull/28706)
- fix(web): skip thumbhash fade for offscreen thumbnails by [@midzelis](https://github.com/midzelis) in [#27335](https://github.com/immich-app/immich/pull/27335)
- fix(web): prevent partner assets from being selected in geolocation utility by [@okxint](https://github.com/okxint) in [#28737](https://github.com/immich-app/immich/pull/28737)
- fix(mobile): invisible ink splashes in asset sheet by [@timonrieger](https://github.com/timonrieger) in [#28756](https://github.com/immich-app/immich/pull/28756)
- fix!: unauthorized face creation by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#28561](https://github.com/immich-app/immich/pull/28561)
- fix(mobile): proper background task cleanup by [@mertalev](https://github.com/mertalev) in [#28694](https://github.com/immich-app/immich/pull/28694)
- fix(cli): prevent out-of-memory on file upload due to undici storing the request body by [@moversity](https://github.com/moversity) in [#28723](https://github.com/immich-app/immich/pull/28723)
- fix: error log on aborted uploads by [@jrasm91](https://github.com/jrasm91) in [#28806](https://github.com/immich-app/immich/pull/28806)
- fix(server): respect timezone in iso date string encoding by [@timonrieger](https://github.com/timonrieger) in [#28810](https://github.com/immich-app/immich/pull/28810)
- test: fix tests when OpenVINO provider is available by [@nekowinston](https://github.com/nekowinston) in [#28802](https://github.com/immich-app/immich/pull/28802)
- fix(mobile): run iOS bg task phases in parallel by [@santoshakil](https://github.com/santoshakil) in [#28293](https://github.com/immich-app/immich/pull/28293)
- fix: error handling by [@jrasm91](https://github.com/jrasm91) in [#28843](https://github.com/immich-app/immich/pull/28843)
- fix: cross isolate drift watchers by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#28862](https://github.com/immich-app/immich/pull/28862)
- fix: reload timeline on group by setting change by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#28864](https://github.com/immich-app/immich/pull/28864)
- fix(web): use irot/imir tags for HEIF Orientation by [@joojoooo](https://github.com/joojoooo) in [#27820](https://github.com/immich-app/immich/pull/27820)
- fix: detail panel faces reactivity issues by [@danieldietzler](https://github.com/danieldietzler) in [#28910](https://github.com/immich-app/immich/pull/28910)
- fix(server): hide isFavorite from album asset sync stream by [@timonrieger](https://github.com/timonrieger) in [#28923](https://github.com/immich-app/immich/pull/28923)
- fix(mobile): show memory and folder dates in local time by [@santoshakil](https://github.com/santoshakil) in [#28941](https://github.com/immich-app/immich/pull/28941)
- fix(mobile): show error when creating an album fails by [@santoshakil](https://github.com/santoshakil) in [#28942](https://github.com/immich-app/immich/pull/28942)
- fix(mobile): add album picker to archive bottom sheet by [@santoshakil](https://github.com/santoshakil) in [#28953](https://github.com/immich-app/immich/pull/28953)
- fix: normalize diacritics in person name search in Web & Mobile by [@pedrovieira](https://github.com/pedrovieira) in [#28887](https://github.com/immich-app/immich/pull/28887)
- fix(web): Prevent face editor from closing when dismissing tag confirmation by [@pedrovieira](https://github.com/pedrovieira) in [#28900](https://github.com/immich-app/immich/pull/28900)
- fix(mobile): map timeline layout crash by [@YarosMallorca](https://github.com/YarosMallorca) in [#28878](https://github.com/immich-app/immich/pull/28878)
- fix(mobile): deduplicate people in asset details panel by [@santoshakil](https://github.com/santoshakil) in [#28972](https://github.com/immich-app/immich/pull/28972)
- fix(mobile): keep timezone when editing asset date time by [@santoshakil](https://github.com/santoshakil) in [#28978](https://github.com/immich-app/immich/pull/28978)
- fix(mobile): stale details after editing asset date by [@santoshakil](https://github.com/santoshakil) in [#28977](https://github.com/immich-app/immich/pull/28977)
- fix(mobile): show albums whose assets are all trashed by [@santoshakil](https://github.com/santoshakil) in [#28985](https://github.com/immich-app/immich/pull/28985)
- fix(mobile): give android notification channels proper names by [@santoshakil](https://github.com/santoshakil) in [#28986](https://github.com/immich-app/immich/pull/28986)
- fix: Improving scroll behavior on image stacks that overflow the screen by [@BlankCanvasStudio](https://github.com/BlankCanvasStudio) in [#28885](https://github.com/immich-app/immich/pull/28885)
- fix(web): focus on scrollable element on load by [@timonrieger](https://github.com/timonrieger) in [#29004](https://github.com/immich-app/immich/pull/29004)
- fix(mobile): show like and comment options on album photo deep links by [@santoshakil](https://github.com/santoshakil) in [#29020](https://github.com/immich-app/immich/pull/29020)
- fix(web): correctly handle person search with more than 100 results by [@maxinegardenas](https://github.com/maxinegardenas) in [#29002](https://github.com/immich-app/immich/pull/29002)
- fix(web): prevent upload status panel from overlapping album action bar by [@okxint](https://github.com/okxint) in [#29044](https://github.com/immich-app/immich/pull/29044)
- fix(web): error loading image state by [@bwees](https://github.com/bwees) in [#29058](https://github.com/immich-app/immich/pull/29058)
- fix(web): show asset arrows by [@timonrieger](https://github.com/timonrieger) in [#29010](https://github.com/immich-app/immich/pull/29010)
- fix(server): hide partner archived asset locations from map by [@timonrieger](https://github.com/timonrieger) in [#29028](https://github.com/immich-app/immich/pull/29028)
- fix: lock transcoding options by [@timonrieger](https://github.com/timonrieger) in [#29076](https://github.com/immich-app/immich/pull/29076)
- fix(server): do not merge metadata when multiple duplicates are kept by [@timonrieger](https://github.com/timonrieger) in [#29035](https://github.com/immich-app/immich/pull/29035)
- fix: integrity report checksum query by [@danieldietzler](https://github.com/danieldietzler) in [#29136](https://github.com/immich-app/immich/pull/29136)
- fix: map settings by [@danieldietzler](https://github.com/danieldietzler) in [#29134](https://github.com/immich-app/immich/pull/29134)
- fix: too strict cron expression validation by [@danieldietzler](https://github.com/danieldietzler) in [#29138](https://github.com/immich-app/immich/pull/29138)
- fix(web): respect local timezone when building date range for search by [@okxint](https://github.com/okxint) in [#29128](https://github.com/immich-app/immich/pull/29128)
- fix(web): language selector by [@meesfrensel](https://github.com/meesfrensel) in [#29065](https://github.com/immich-app/immich/pull/29065)
- fix: update datetimeRelative description to minutes instead of seconds by [@meesfrensel](https://github.com/meesfrensel) in [#29137](https://github.com/immich-app/immich/pull/29137)
- fix: video thumbnail quality sharing by [@bwees](https://github.com/bwees) in [#29104](https://github.com/immich-app/immich/pull/29104)
- fix(mobile): stop sync albums crashing on the main isolate by [@santoshakil](https://github.com/santoshakil) in [#29133](https://github.com/immich-app/immich/pull/29133)
- fix(mobile): show memories with no showAt/hideAt in the timeline lane by [@santoshakil](https://github.com/santoshakil) in [#29158](https://github.com/immich-app/immich/pull/29158)
- fix(mobile): keep toasts off the dynamic island when keyboard is open by [@santoshakil](https://github.com/santoshakil) in [#29159](https://github.com/immich-app/immich/pull/29159)
- fix(server): skip existing users when sharing albums by [@jeevan6996](https://github.com/jeevan6996) in [#28884](https://github.com/immich-app/immich/pull/28884)
- fix: web i18n by [@danieldietzler](https://github.com/danieldietzler) in [#29175](https://github.com/immich-app/immich/pull/29175)
- fix(web): shift+click on GPS asset extends range selection in geolocation utility by [@timonrieger](https://github.com/timonrieger) in [#29022](https://github.com/immich-app/immich/pull/29022)
- fix(server): allow non-utc datetime offsets by [@timonrieger](https://github.com/timonrieger) in [#29186](https://github.com/immich-app/immich/pull/29186)
- fix: remove local-only step ids from workflow json by [@danieldietzler](https://github.com/danieldietzler) in [#29188](https://github.com/immich-app/immich/pull/29188)
- fix: asset type filter by [@danieldietzler](https://github.com/danieldietzler) in [#29190](https://github.com/immich-app/immich/pull/29190)
- fix(mobile): prevent duplicate login pages for unauthenticated share intent warm start by [@olildu](https://github.com/olildu) in [#29054](https://github.com/immich-app/immich/pull/29054)
- fix(mobile): refresh memories on resume and day change by [@santoshakil](https://github.com/santoshakil) in [#28983](https://github.com/immich-app/immich/pull/28983)
- fix(mobile): re-lock locked folder when the app is backgrounded by [@santoshakil](https://github.com/santoshakil) in [#29089](https://github.com/immich-app/immich/pull/29089)
- fix(mobile): endless spinner on album selection when device has no albums by [@santoshakil](https://github.com/santoshakil) in [#28994](https://github.com/immich-app/immich/pull/28994)
- fix: rc version check by [@danieldietzler](https://github.com/danieldietzler) in [#29194](https://github.com/immich-app/immich/pull/29194)
- fix: detail panel people reactivity and iterator consumption by [@danieldietzler](https://github.com/danieldietzler) in [#29250](https://github.com/immich-app/immich/pull/29250)
- fix(server): use VBR for QSV so the max bitrate is respected by [@aclerici38](https://github.com/aclerici38) in [#29240](https://github.com/immich-app/immich/pull/29240)
- fix: ignore external libraries for integrity report checksum check by [@danieldietzler](https://github.com/danieldietzler) in [#29248](https://github.com/immich-app/immich/pull/29248)
- fix(web): remove map's fullscreen button by [@meesfrensel](https://github.com/meesfrensel) in [#29192](https://github.com/immich-app/immich/pull/29192)
- refactor: use SemVer classes for version compatability message by [@bwees](https://github.com/bwees) in [#29056](https://github.com/immich-app/immich/pull/29056)
- fix: sync backfill by [@jrasm91](https://github.com/jrasm91) in [#29267](https://github.com/immich-app/immich/pull/29267)
- fix(mobile): force AssetViewerPage recreation on repeated view intents by [@okxint](https://github.com/okxint) in [#29235](https://github.com/immich-app/immich/pull/29235)
- fix(mobile): blank notifications page after enabling notifications by [@santoshakil](https://github.com/santoshakil) in [#29232](https://github.com/immich-app/immich/pull/29232)
- fix(mobile): app doesn't exit full-screen mode by [@YarosMallorca](https://github.com/YarosMallorca) in [#29301](https://github.com/immich-app/immich/pull/29301)
- fix(mobile): only toggle backup from the switch, not the whole row by [@santoshakil](https://github.com/santoshakil) in [#29236](https://github.com/immich-app/immich/pull/29236)
- fix(mobile): hide video thumbnail when video is ready by [@santoshakil](https://github.com/santoshakil) in [#29012](https://github.com/immich-app/immich/pull/29012)
- fix(mobile): apply exif orientation to android raw photos by [@santoshakil](https://github.com/santoshakil) in [#29337](https://github.com/immich-app/immich/pull/29337)
- fix(server): face region coordinates parsing by [@djbravo06](https://github.com/djbravo06) in [#29333](https://github.com/immich-app/immich/pull/29333)
- feat: honor album access permissions in search endpoints by [@danieldietzler](https://github.com/danieldietzler) in [#29352](https://github.com/immich-app/immich/pull/29352)
- fix: version compatability check by [@bwees](https://github.com/bwees) in [#29405](https://github.com/immich-app/immich/pull/29405)

##### 📚 Documentation

- fix(docs): instructions on how to use local immich ui by [@YarosMallorca](https://github.com/YarosMallorca) in [#27813](https://github.com/immich-app/immich/pull/27813)
- fix(docs): helmet file affected containers  by [@mmomjian](https://github.com/mmomjian) in [#27939](https://github.com/immich-app/immich/pull/27939)
- fix(docs): Update Tailscale free tier user and device limits by [@Hakuin123](https://github.com/Hakuin123) in [#28151](https://github.com/immich-app/immich/pull/28151)
- docs: update rocm installation instructions by [@aigarius](https://github.com/aigarius) in [#25434](https://github.com/immich-app/immich/pull/25434)
- fix(docs): document `upgrade-insecure-requests` default by [@meesfrensel](https://github.com/meesfrensel) in [#28279](https://github.com/immich-app/immich/pull/28279)
- fix(docs): missing colon in config file doc by [@SuperSandro2000](https://github.com/SuperSandro2000) in [#28313](https://github.com/immich-app/immich/pull/28313)
- fix: update server-commands subcommand list by [@bo0tzz](https://github.com/bo0tzz) in [#28402](https://github.com/immich-app/immich/pull/28402)
- feat(docs): add fixed subnet guide for Synology to prevent firewall issues by [@racehd](https://github.com/racehd) in [#26554](https://github.com/immich-app/immich/pull/26554)
- chore(docs): update FAQ with profile picture change instructions by [@tvangemert](https://github.com/tvangemert) in [#28634](https://github.com/immich-app/immich/pull/28634)
- chore: update documentation to use mise commands by [@timonrieger](https://github.com/timonrieger) in [#28515](https://github.com/immich-app/immich/pull/28515)
- fix(docs): v3 bumps by [@mmomjian](https://github.com/mmomjian) in [#29007](https://github.com/immich-app/immich/pull/29007)
- docs(server): clarify AssetBulkUploadCheckItem.id is a correlation token by [@timonrieger](https://github.com/timonrieger) in [#29141](https://github.com/immich-app/immich/pull/29141)
- docs(mobile-app): add Play App Signing certificate hash by [@tlvince](https://github.com/tlvince) in [#29168](https://github.com/immich-app/immich/pull/29168)
- docs(mobile): point users towards shared setup docs by [@agg23](https://github.com/agg23) in [#29078](https://github.com/immich-app/immich/pull/29078)
- docs: clarify duplicate exif merging intent by [@timonrieger](https://github.com/timonrieger) in [#29203](https://github.com/immich-app/immich/pull/29203)
- fix(docsc): v3 bump by [@mmomjian](https://github.com/mmomjian) in [#29246](https://github.com/immich-app/immich/pull/29246)
- docs: MS smtp guide by [@jameskimmel](https://github.com/jameskimmel) in [#29289](https://github.com/immich-app/immich/pull/29289)

##### 🌐 Translations

- feat: latest language requests by [@danieldietzler](https://github.com/danieldietzler) in [#28858](https://github.com/immich-app/immich/pull/28858)
- chore: update translations by [@weblate](https://github.com/weblate) in [#27764](https://github.com/immich-app/immich/pull/27764)
- feat: languages by [@danieldietzler](https://github.com/danieldietzler) in [#29088](https://github.com/immich-app/immich/pull/29088)
- chore(web): update translations by [@weblate](https://github.com/weblate) in [#29036](https://github.com/immich-app/immich/pull/29036)
- chore(web): update translations by [@weblate](https://github.com/weblate) in [#29162](https://github.com/immich-app/immich/pull/29162)
- fix: turkish readme translation by [@MuySup](https://github.com/MuySup) in [#29234](https://github.com/immich-app/immich/pull/29234)
- chore(web): update translations by [@weblate](https://github.com/weblate) in [#29204](https://github.com/immich-app/immich/pull/29204)
- chore(web): update translations by [@weblate](https://github.com/weblate) in [#29290](https://github.com/immich-app/immich/pull/29290)
- chore(web): update translations by [@weblate](https://github.com/weblate) in [#29347](https://github.com/immich-app/immich/pull/29347)

##### New Contributors

- [@OdinOxin](https://github.com/OdinOxin) made their first contribution in [#27732](https://github.com/immich-app/immich/pull/27732)
- [@migpovrap](https://github.com/migpovrap) made their first contribution in [#26917](https://github.com/immich-app/immich/pull/26917)
- [@StevenMassaro](https://github.com/StevenMassaro) made their first contribution in [#27531](https://github.com/immich-app/immich/pull/27531)
- [@timdobras](https://github.com/timdobras) made their first contribution in [#26841](https://github.com/immich-app/immich/pull/26841)
- [@santanoce](https://github.com/santanoce) made their first contribution in [#26235](https://github.com/immich-app/immich/pull/26235)
- [@fredfloydd](https://github.com/fredfloydd) made their first contribution in [#27842](https://github.com/immich-app/immich/pull/27842)
- [@sparsh985](https://github.com/sparsh985) made their first contribution in [#26755](https://github.com/immich-app/immich/pull/26755)
- [@LJspice](https://github.com/LJspice) made their first contribution in [#27389](https://github.com/immich-app/immich/pull/27389)
- [@git-akihakune](https://github.com/git-akihakune) made their first contribution in [#27963](https://github.com/immich-app/immich/pull/27963)
- [@shaun0927](https://github.com/shaun0927) made their first contribution in [#27900](https://github.com/immich-app/immich/pull/27900)
- [@yosit](https://github.com/yosit) made their first contribution in [#27391](https://github.com/immich-app/immich/pull/27391)
- [@Hakuin123](https://github.com/Hakuin123) made their first contribution in [#28151](https://github.com/immich-app/immich/pull/28151)
- [@pinhao](https://github.com/pinhao) made their first contribution in [#28162](https://github.com/immich-app/immich/pull/28162)
- [@AyaanMAG](https://github.com/AyaanMAG) made their first contribution in [#28155](https://github.com/immich-app/immich/pull/28155)
- [@DavidTheFighter](https://github.com/DavidTheFighter) made their first contribution in [#28216](https://github.com/immich-app/immich/pull/28216)
- [@benbeckford](https://github.com/benbeckford) made their first contribution in [#28234](https://github.com/immich-app/immich/pull/28234)
- [@bhugh](https://github.com/bhugh) made their first contribution in [#27884](https://github.com/immich-app/immich/pull/27884)
- [@SkyDev125](https://github.com/SkyDev125) made their first contribution in [#26971](https://github.com/immich-app/immich/pull/26971)
- [@aigarius](https://github.com/aigarius) made their first contribution in [#25434](https://github.com/immich-app/immich/pull/25434)
- [@mws-weekend-projects](https://github.com/mws-weekend-projects) made their first contribution in [#26758](https://github.com/immich-app/immich/pull/26758)
- [@TheBestX11](https://github.com/TheBestX11) made their first contribution in [#27516](https://github.com/immich-app/immich/pull/27516)
- [@sakshamchawla](https://github.com/sakshamchawla) made their first contribution in [#20877](https://github.com/immich-app/immich/pull/20877)
- [@santoshakil](https://github.com/santoshakil) made their first contribution in [#28284](https://github.com/immich-app/immich/pull/28284)
- [@stfn42](https://github.com/stfn42) made their first contribution in [#28152](https://github.com/immich-app/immich/pull/28152)
- [@thowdev](https://github.com/thowdev) made their first contribution in [#26723](https://github.com/immich-app/immich/pull/26723)
- [@SuperSandro2000](https://github.com/SuperSandro2000) made their first contribution in [#28313](https://github.com/immich-app/immich/pull/28313)
- [@racehd](https://github.com/racehd) made their first contribution in [#26554](https://github.com/immich-app/immich/pull/26554)
- [@inesiscosta](https://github.com/inesiscosta) made their first contribution in [#27442](https://github.com/immich-app/immich/pull/27442)
- [@gnojus](https://github.com/gnojus) made their first contribution in [#28427](https://github.com/immich-app/immich/pull/28427)
- [@rdeaton](https://github.com/rdeaton) made their first contribution in [#28341](https://github.com/immich-app/immich/pull/28341)
- [@agg23](https://github.com/agg23) made their first contribution in [#28469](https://github.com/immich-app/immich/pull/28469)
- [@ollioddi](https://github.com/ollioddi) made their first contribution in [#26328](https://github.com/immich-app/immich/pull/26328)
- [@Caltsic](https://github.com/Caltsic) made their first contribution in [#28512](https://github.com/immich-app/immich/pull/28512)
- [@fabianwimberger](https://github.com/fabianwimberger) made their first contribution in [#28444](https://github.com/immich-app/immich/pull/28444)
- [@tvangemert](https://github.com/tvangemert) made their first contribution in [#28634](https://github.com/immich-app/immich/pull/28634)
- [@BlankCanvasStudio](https://github.com/BlankCanvasStudio) made their first contribution in [#28620](https://github.com/immich-app/immich/pull/28620)
- [@pneuly](https://github.com/pneuly) made their first contribution in [#28610](https://github.com/immich-app/immich/pull/28610)
- [@timjonez](https://github.com/timjonez) made their first contribution …
renovate Bot added a commit to sdwilsh/ansible-playbooks that referenced this pull request Jul 8, 2026
##### [\`v3.0.1\`](https://github.com/immich-app/immich/releases/tag/v3.0.1)

##### v3.0.1

- Fixes a bug that causes albums don't show up in the mobile app

##### What's Changed

##### 🚀 Features

- feat(web): recently added link in sidebar by [@benbeckford](https://github.com/benbeckford) in [#29039](https://github.com/immich-app/immich/pull/29039)

##### 🐛 Bug fixes

- fix: albums broken on v2 mobile clients by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#29446](https://github.com/immich-app/immich/pull/29446)
- fix: setting input field description spacing for description snippet by [@danieldietzler](https://github.com/danieldietzler) in [#29433](https://github.com/immich-app/immich/pull/29433)

##### 🌐 Translations

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

**Full Changelog**: <https://github.com/immich-app/immich/compare/v3.0.0...v3.0.1>

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

##### v3.0.0

Welcome to Immich `v3.0.0`!

After months of hard work from the team and our amazing contributors, we're thrilled to announce the next major version of Immich: `v3.0.0`!  🎉

##### Breaking changes

This release includes several breaking changes; read the full migration guide [here](https://immich.app/blog/v3-migration). *It's worth mentioning that many of the breaking changes are updates to API endpoints and affect only **third-party tools** that integrate with Immich's API*. For the vast majority of users, updating works exactly as it always has.

##### How to update

> \[!WARNING]
> `v3.0.0` drops support for pgvecto.rs. If you run Immich before `v1.133.0` and haven't done the migration step yet, see the migration guide here. <https://docs.immich.app/install/upgrading/#migrating-to-vectorchord>

First, update the `IMMICH_VERSION` in your `.env` file to `v3`:

```diff
- IMMICH_VERSION=v2
+ IMMICH_VERSION=v3
```

Then run the usual update commands:

```bash
docker compose pull && docker compose up -d
```

##### Release candidates

If you missed it, `v3.0.0` was the first time we used release candidates, also known as prereleases. Release candidates are tested but not yet official releases of Immich, and they allow us to find and fix any outstanding bugs before a final release. If you would like to be notified about release candidates directly through Immich, you can change the release channel from "Stable" to "Release candidate" in the `Admin settings > Version check` options ([here](https://my.immich.app/admin/system-settings?isOpen=version-check)).

<img alt="New release channel option in version check settings" src="https://github.com/user-attachments/assets/fc8f6008-d486-4915-ad1b-feaddb856315" />
##### New Merch

As part of this release, we're happy to announce we also have some new swag for you!

- Kids clothing: For those who are likely the reason for your Immich library's size
- Colored embroidery: We now have clothes with a full color embroidered Immich logo

<a href="https://immich.store/collections/immich-3-0">
<img width="1200" alt="immich-store (1)" src="https://github.com/user-attachments/assets/ce114e7b-1424-4eca-975d-b23debadb32b" />
</a>

Check it out now at [https://immich.store](https://immich.store/collections/immich-3-0)!

##### Highlights

Now, let's get right into all the new features in this release:

- Mobile non-destructive editing
- Workflows (preview)
- Background backup improvement
- Recently added page
- Integrity checks
- Slideshow on mobile app
- HLS and real-time video transcoding (preview)
- New video player for web
- Open photo in Immich as gallery on Android
- OCR on mobile app
- Upload asset directly to album on the mobile app
- Option to select image size when sharing on the mobile app
- Timeline performance improvement for browsing a large amount of assets in a single month

##### Mobile non-destructive editing

<p align="center">
<img width="300" alt="image" src="https://github.com/user-attachments/assets/e9ddf97c-a4f8-42c1-9910-49ef3c8d4b0a" />
</p>

This is a follow-up to Image Editing on the web, which was released in `v2.5.0`. This feature allows you to make non-destructive edits to your photos inside of Immich. Until now, the mobile editor used a completely different system that created new assets instead of editing the photo in place.

With this update, we bring a new, easier-to-use editor to mobile devices that has the same features as the web version. You can now edit photos directly in the mobile app, including cropping, rotating, and adjusting your images without ever touching the original file. Similar to the web, edits are non-destructive, so you can revisit or revert them at any time. You can even make edits on mobile and then adjust them on the web later!

Some features from the previous mobile editing implementation have been removed including:

- Recoloring photos
- Editing live photos
- Editing local assets

We have plans to bring some of these capabilities back in future releases.

##### Workflows (preview)

The first preview of Workflows is here! Workflows let you automate actions in your library by chaining triggers, filters, and actions together with a drag-and-drop builder. This is the foundation for many exciting automations to come, and we'd love your feedback as we continue building on it.

You can access the feature from [Utilities > Workflows](https://my.immich.app/workflows) on the web.

<img width="800"  alt="Workflows link on the utilities page" src="https://github.com/user-attachments/assets/db7e139e-89b0-481a-9a66-530a40dc175a" />

From there, you can either create a new blank workflow or browse the premade templates to get a basic understanding of how workflows can be used.

<p align="center">
<img width="400" alt="image" src="https://github.com/user-attachments/assets/23fdb017-e439-4221-9be8-a14bd690fa9b" />
</p>
##### Workflows editor

<img alt="Workflow editor with an example workflow" src="https://github.com/user-attachments/assets/c6a569de-d884-4bdb-8bb0-0ff2c805bfb9" />

In the workflows editor, you can switch between the Visual or JSON editor. The visual editor is nice for building out the workflow; the JSON editor is nice for sharing and receiving workflow content from others.

In each workflow, there is a ***trigger*** and a sequence of ***steps.***

- Trigger: this is the entry point of each workflow; when the trigger occurs, the steps are evaluated.
- Steps: they include Filters (conditions) and Actions (effects); they can be combined to produce the desired effect of the use case you aim for.

<p align="center">
<img width="400" alt="List of available workflow steps" src="https://github.com/user-attachments/assets/50e89454-2bf9-4d41-bfa6-fd54f8944ea3" />
</p>
##### Sharing a workflow

You can share the workflow you made with others in two ways: text and JSON. Text is nice for sharing on a forum or for show-and-tell content. JSON is nice for others to make an exact copy of your workflow's configuration.

You can copy the text in the workflows summary panel on the lower right of the screen

<p align="center">
<img width="400"  alt="workflow summary in text" src="https://github.com/user-attachments/assets/dda24c88-f403-4189-a57b-71f6da3816e7" />
</p>

You can share the JSON content from the copy workflows button in the app bar, switch to the JSON editor, or use the `Show schema` button in the context menu in the workflows list

<img  alt="JSON editor" src="https://github.com/user-attachments/assets/307297cc-36d6-477c-bd72-d52be1dec0c5" />

<img  alt="Show workflow schema" src="https://github.com/user-attachments/assets/b6efada4-44fc-4d35-9e24-0f143c003313" />

> \[!NOTE]
> Please use this [discussion thread](https://github.com/immich-app/immich/discussions/29167) to propose new ideas of triggers and actions. We are looking for extensive feedback and suggestions from you all.

##### Background backup improvements

Background backup on Android is now significantly more reliable. Previously, the background backup on Android was limited to newly taken photos. Now, the app uses a new periodic task scheduler, which allows you to upload your entire library in the background, and it plays nicer with Android's background execution limits, properly cleans up tasks, and warns you when battery optimization and notification settings might interfere with backups.

On iOS, the background refresh task now runs its sync and upload work in parallel, so uploads actually start within the short time window iOS allows.

<p align="center">
<img width="300"  alt="Enable backup option on mobile" src="https://github.com/user-attachments/assets/82be41f3-93b9-4231-9f91-53eb317bb3fe" />
</p>
##### Recently added page

A new "Recently Added" page on the web and mobile lets you browse your library sorted by when assets were added to Immich, rather than when they were taken. This makes it easier to find what's new when browsing a new batch of imports. You can find the new page in the "Explore" tab on the web and in the "Search" tab on mobile.

<img width="798" height="220" alt="Recently added" src="https://github.com/user-attachments/assets/d4729864-f736-4554-a672-91861aad5f7f" />
##### Integrity checks

The maintenance page has gotten a new addition: integrity reports! Immich will scan its directories on your file system, and compare it to what it has stored in its database. If there are deviations, they will be surfaced as

- untracked, if there is a file in Immich's directories that Immich does not know of
- missing, if Immich references a file in its database that does not exist in that place (anymore)
- a checksum mismatch, if the checksum of the file on disk does not match the checksum Immich has stored for that file. Typically, this would happen through file corruption but could also be the result of a bad rename.

<img alt="Integrity report on the maintenance page showing a count of untracked and missing files, as well as checksum mismatches." src="https://github.com/user-attachments/assets/0e59537e-89b7-4d06-b5e6-731bb1e453c0" />

You can configure when and how long the job runs each night.

<img width="800" alt="image" src="https://github.com/user-attachments/assets/13da49ac-5cfa-40a1-b852-b89b0ed7fff6" />
##### Slideshow (mobile)

The slideshow experience comes to mobile! You can now sit back and let your photos and videos play across the screen, just like on the web.

<p align="center">
<img width="300" alt="Slideshow view on mobile" src="https://github.com/user-attachments/assets/b3325f3c-0505-405f-9b79-322f738030f4" />
</p>
##### HLS and Real-Time Video transcoding (preview)

Immich can now transcode videos on-the-fly without needing to generate offline transcodes. This has been a long-requested feature with many benefits:

- Quality switching (both manual and automatic)
- Transcoding to the best codecs supported by the client
- Lower storage overhead when offline transcoding is disabled
- HDR for compatible clients (not implemented yet)
- Remuxing rather than transcoding the original when bandwidth allows it (not implemented yet)

Please note that this feature is still experimental and can change behavior from version to version. It's currently only implemented in the web app, with the mobile app implementation in progress.

To enable real-time transcoding, go to the [video transcoding settings](https://my.immich.app/admin/system-settings?isOpen=video-transcoding+realtime-transcoding) (scroll down). Offline transcoding isn't directly affected by enabling it, so if you'd like to disable offline transcoding, you should also adjust the transcode policy.

> \[!NOTE]
> For assets imported prior to v3, you will also need to re-run Metadata Extraction in the job panel for them to be re-processed.

<img alt="HLS Transcoding settings" src="https://github.com/user-attachments/assets/6313ea40-ae1a-4495-aaea-212ef67fd338" />

Keep in mind that your server needs to be powerful enough to transcode in real-time for this feature to work well. Hardware acceleration is recommended, but not required, when using this feature.

##### New video player for web

A new custom video player on the web app ensures all your devices share the same controls and layout, matching the Immich design. Some basic functions, like changing the playback rate, are available. This should also fix a lot of the problems on iOS, where the OS's controls are hidden behind the Immich navbar.

##### Open photos in Immich as a gallery on Android

Immich can now act as a gallery/image viewer app on Android. Tap a photo or video in another app, choose Immich, and it opens directly in the asset viewer with options to share the file or upload it to your library.

This is the first iteration of the feature, and refinements to how Immich recognizes files that are already in your library are on the way

<img width="350" alt="image" src="https://github.com/user-attachments/assets/f98c2a65-1b84-4580-a7af-ead54ab737d8" />
<img width="350" alt="image" src="https://github.com/user-attachments/assets/fb783bed-c6c4-4634-af71-c2e888274121" />
##### OCR on the mobile app

The asset viewer now has a toggle that highlights recognized text in a photo, and you can select and copy it directly from the image.

<p align="center">
<img width="350" alt="OCR in the mobile app" src="https://github.com/user-attachments/assets/5f870d38-53a5-4b05-9dba-5d8838b86934" />
</p>
##### Upload assets directly to an album on mobile

You can now upload local photos directly to an album in the mobile app, including from the asset bottom sheet, instead of uploading first and organizing later. A small change that removes a lot of friction from the backup-and-organize flow.

##### Select image size when sharing on mobile

When sharing photos from the mobile app, you can now choose the image size before sending; it is handy for keeping shared files small for messaging apps while preserving the option to share at full quality when needed.

You can change the default behavior in the `App Settings > Preferences`

<p align="center">
<img width="350"  alt="Share file's size settings" src="https://github.com/user-attachments/assets/fe1c95d7-39e4-4c25-8981-dea4d07fce5a" />
</p>

You can also pick the option when sharing on-the-fly by long pressing the `Share` button

<p align="center">
<img width="350"  alt="On-the-fly picker" src="https://github.com/user-attachments/assets/667b79a7-efac-462b-8736-9e674e083d6b" />
</p>
##### Timeline performance Improvements

Browsing months with a large number of assets is now dramatically smoother and prevents the browser tab from locking up when your instance encounters that scenario.

##### 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>

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

##### What's Changed

##### 🚨 Breaking Changes

- refactor!: migrate class-validator to zod by [@timonrieger](https://github.com/timonrieger) in [#26597](https://github.com/immich-app/immich/pull/26597)
- refactor!: remove replace asset by [@jrasm91](https://github.com/jrasm91) in [#27022](https://github.com/immich-app/immich/pull/27022)
- refactor!: remove my shared link dto by [@jrasm91](https://github.com/jrasm91) in [#27023](https://github.com/immich-app/immich/pull/27023)
- chore!: remove deprecated env variables by [@jrasm91](https://github.com/jrasm91) in [#27802](https://github.com/immich-app/immich/pull/27802)
- chore!: remove getRandom api endpoint by [@bwees](https://github.com/bwees) in [#27780](https://github.com/immich-app/immich/pull/27780)
- chore!: remove unused token response param by [@jrasm91](https://github.com/jrasm91) in [#27805](https://github.com/immich-app/immich/pull/27805)
- refactor: yeet old timeline by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#27666](https://github.com/immich-app/immich/pull/27666)
- chore!: remove old timeline sync endpoints by [@jrasm91](https://github.com/jrasm91) in [#27804](https://github.com/immich-app/immich/pull/27804)
- chore!: remove deviceId and deviceAssetId by [@danieldietzler](https://github.com/danieldietzler) in [#27818](https://github.com/immich-app/immich/pull/27818)
- chore!: rename API key schemas by [@jrasm91](https://github.com/jrasm91) in [#27828](https://github.com/immich-app/immich/pull/27828)
- chore!: remove without assets by [@jrasm91](https://github.com/jrasm91) in [#27835](https://github.com/immich-app/immich/pull/27835)
- fix: oauth issuerUrl validation by [@bo0tzz](https://github.com/bo0tzz) in [#27848](https://github.com/immich-app/immich/pull/27848)
- fix!: do not allow insecure oauth requests by default by [@bo0tzz](https://github.com/bo0tzz) in [#27844](https://github.com/immich-app/immich/pull/27844)
- fix!: set duration to null when not present by [@meesfrensel](https://github.com/meesfrensel) in [#26982](https://github.com/immich-app/immich/pull/26982)
- chore!: remove /api/server/theme endpoint by [@jrasm91](https://github.com/jrasm91) in [#27880](https://github.com/immich-app/immich/pull/27880)
- chore!: migrate album owner to album\_user by [@danieldietzler](https://github.com/danieldietzler) in [#27467](https://github.com/immich-app/immich/pull/27467)
- refactor!: change number to integer types by [@timonrieger](https://github.com/timonrieger) in [#27912](https://github.com/immich-app/immich/pull/27912)
- refactor(server)!: move correlationId to X-Correlation-ID response header by [@timonrieger](https://github.com/timonrieger) in [#28139](https://github.com/immich-app/immich/pull/28139)
- refactor(server)!: remove redundant error and statusCode fields from error responses by [@timonrieger](https://github.com/timonrieger) in [#28140](https://github.com/immich-app/immich/pull/28140)
- chore(server)!: drop pgvecto.rs support by [@mertalev](https://github.com/mertalev) in [#28159](https://github.com/immich-app/immich/pull/28159)
- chore!: duration in milliseconds by [@mertalev](https://github.com/mertalev) in [#28003](https://github.com/immich-app/immich/pull/28003)
- refactor(server)!: sanitize error messages to avoid leaking resource details by [@timonrieger](https://github.com/timonrieger) in [#28154](https://github.com/immich-app/immich/pull/28154)
- refactor(server)!: structured validation error responses by [@timonrieger](https://github.com/timonrieger) in [#28204](https://github.com/immich-app/immich/pull/28204)
- feat(server)!: add isOwned filter to albums API by [@timonrieger](https://github.com/timonrieger) in [#28213](https://github.com/immich-app/immich/pull/28213)
- chore(ml)!: require numpy 2.4 by [@mertalev](https://github.com/mertalev) in [#28158](https://github.com/immich-app/immich/pull/28158)
- fix(deps): update dependency nestjs-otel to v8 by [@renovate](https://github.com/renovate)\[bot] in [#27863](https://github.com/immich-app/immich/pull/27863)
- chore(ml)!: remove deprecated envs by [@mertalev](https://github.com/mertalev) in [#28326](https://github.com/immich-app/immich/pull/28326)
- chore(server)!: remove libopus enum by [@mertalev](https://github.com/mertalev) in [#28325](https://github.com/immich-app/immich/pull/28325)
- refactor!: remove asset faces from AssetResponseDto by [@bwees](https://github.com/bwees) in [#27779](https://github.com/immich-app/immich/pull/27779)
- refactor(server)!: drop empty string to null conversion by [@timonrieger](https://github.com/timonrieger) in [#28808](https://github.com/immich-app/immich/pull/28808)
- refactor(server)!: remove changeExpiryTime by [@timonrieger](https://github.com/timonrieger) in [#28816](https://github.com/immich-app/immich/pull/28816)
- refactor!: disallow star rating < 1 by [@meesfrensel](https://github.com/meesfrensel) in [#27896](https://github.com/immich-app/immich/pull/27896)
- fix!: search endpoints visibility can be omitted by [@danieldietzler](https://github.com/danieldietzler) in [#29385](https://github.com/immich-app/immich/pull/29385)

##### 🫥 Deprecated Changes

- refactor(server): deprecate PUT routes in favor of PATCH by [@timonrieger](https://github.com/timonrieger) in [#28859](https://github.com/immich-app/immich/pull/28859)

##### 🔒 Security

- fix: run profile picture through thumbnail pipeline by [@bo0tzz](https://github.com/bo0tzz) in [#27890](https://github.com/immich-app/immich/pull/27890)

##### 🚀 Features

- feat: mobile editing by [@bwees](https://github.com/bwees) in [#25397](https://github.com/immich-app/immich/pull/25397)
- feat: album map markers endpoint by [@jrasm91](https://github.com/jrasm91) in [#27830](https://github.com/immich-app/immich/pull/27830)
- feat(server): added backchannel logout api endpoint by [@santanoce](https://github.com/santanoce) in [#26235](https://github.com/immich-app/immich/pull/26235)
- feat(server): add OIDC logout URL override option by [@LJspice](https://github.com/LJspice) in [#27389](https://github.com/immich-app/immich/pull/27389)
- feat: android periodic work manager task by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#23563](https://github.com/immich-app/immich/pull/23563)
- feat(web): custom video player controls by [@meesfrensel](https://github.com/meesfrensel) in [#26183](https://github.com/immich-app/immich/pull/26183)
- feat(web): add full-path search mode to UI by [@mws-weekend-projects](https://github.com/mws-weekend-projects) in [#26758](https://github.com/immich-app/immich/pull/26758)
- feat: recently added assets page by [@benbeckford](https://github.com/benbeckford) in [#28272](https://github.com/immich-app/immich/pull/28272)
- feat(mobile): slideshow view by [@benbeckford](https://github.com/benbeckford) in [#28421](https://github.com/immich-app/immich/pull/28421)
- feat(mobile): "Add Tags" asset multiselect option by [@benjamonnguyen](https://github.com/benjamonnguyen) in [#26269](https://github.com/immich-app/immich/pull/26269)
- feat: workflows & plugins by [@jrasm91](https://github.com/jrasm91) in [#26727](https://github.com/immich-app/immich/pull/26727)
- feat(server): hls with real-time transcoding by [@mertalev](https://github.com/mertalev) in [#28230](https://github.com/immich-app/immich/pull/28230)
- feat(web): hls player by [@mertalev](https://github.com/mertalev) in [#28312](https://github.com/immich-app/immich/pull/28312)
- feat(mobile): Android. Immich as a gallery / image viewer app by [@PeterOmbodi](https://github.com/PeterOmbodi) in [#26109](https://github.com/immich-app/immich/pull/26109)
- feat: user upload heatmap by [@bondeabhijeet](https://github.com/bondeabhijeet) in [#28593](https://github.com/immich-app/immich/pull/28593)
- feat(mobile): ocr support by [@YarosMallorca](https://github.com/YarosMallorca) in [#26523](https://github.com/immich-app/immich/pull/26523)
- feat: geolocation workflow filter by [@benbeckford](https://github.com/benbeckford) in [#28961](https://github.com/immich-app/immich/pull/28961)
- feat: image quality option in sharing by [@alextran1502](https://github.com/alextran1502) in [#28918](https://github.com/immich-app/immich/pull/28918)
- feat: integrity check jobs (missing files, untracked files, checksums) by [@insertish](https://github.com/insertish) in [#24205](https://github.com/immich-app/immich/pull/24205)
- feat: new feature message by [@alextran1502](https://github.com/alextran1502) in [#29388](https://github.com/immich-app/immich/pull/29388)

##### 🌟 Enhancements

- feat(web): persist state of file path information in details panel by [@cratoo](https://github.com/cratoo) in [#27770](https://github.com/immich-app/immich/pull/27770)
- feat: commands by [@jrasm91](https://github.com/jrasm91) in [#27546](https://github.com/immich-app/immich/pull/27546)
- feat: upgrade immich/ui by [@jrasm91](https://github.com/jrasm91) in [#27792](https://github.com/immich-app/immich/pull/27792)
- feat: filter users on share by [@OdinOxin](https://github.com/OdinOxin) in [#27732](https://github.com/immich-app/immich/pull/27732)
- fix(server): render storage template date/time tokens in UTC ([#24350](https://github.com/immich-app/immich/issues/24350)) by [@migpovrap](https://github.com/migpovrap) in [#26917](https://github.com/immich-app/immich/pull/26917)
- feat(web): lazy load library and server statistics by [@etnoy](https://github.com/etnoy) in [#26406](https://github.com/immich-app/immich/pull/26406)
- feat: sort users alphabetically when adding to album by [@OdinOxin](https://github.com/OdinOxin) in [#27731](https://github.com/immich-app/immich/pull/27731)
- feat: auth logout page by [@jrasm91](https://github.com/jrasm91) in [#27831](https://github.com/immich-app/immich/pull/27831)
- chore: improve randomness of /search/random endpoint by [@StevenMassaro](https://github.com/StevenMassaro) in [#27531](https://github.com/immich-app/immich/pull/27531)
- feat: dynamic languages by [@jrasm91](https://github.com/jrasm91) in [#27869](https://github.com/immich-app/immich/pull/27869)
- feat: cache shared link by [@danieldietzler](https://github.com/danieldietzler) in [#27889](https://github.com/immich-app/immich/pull/27889)
- feat(server): add configurable OAuth prompt parameter by [@sparsh985](https://github.com/sparsh985) in [#26755](https://github.com/immich-app/immich/pull/26755)
- feat(server): add MPO file type support by [@git-akihakune](https://github.com/git-akihakune) in [#27963](https://github.com/immich-app/immich/pull/27963)
- feat(mobile): action bottom sheet on map timeline by [@YarosMallorca](https://github.com/YarosMallorca) in [#27515](https://github.com/immich-app/immich/pull/27515)
- feat(server): track video metadata by [@mertalev](https://github.com/mertalev) in [#28023](https://github.com/immich-app/immich/pull/28023)
- feat(enhancement): Navigate stack with up and down arrow keys by [@cratoo](https://github.com/cratoo) in [#27854](https://github.com/immich-app/immich/pull/27854)
- fix(web): migrate people management component to page, enabling tooltips by [@SkyDev125](https://github.com/SkyDev125) in [#26971](https://github.com/immich-app/immich/pull/26971)
- chore(mobile): add box shadow to asset details by [@uhthomas](https://github.com/uhthomas) in [#27510](https://github.com/immich-app/immich/pull/27510)
- feat: hide hidden person from memories by [@sakshamchawla](https://github.com/sakshamchawla) in [#20877](https://github.com/immich-app/immich/pull/20877)
- feat(mobile): increased tap area on video player overlay by [@YarosMallorca](https://github.com/YarosMallorca) in [#27269](https://github.com/immich-app/immich/pull/27269)
- feat(web): Add metadata overlay to slideshow by [@timonrieger](https://github.com/timonrieger) in [#24627](https://github.com/immich-app/immich/pull/24627)
- feat(web): add individual filter removal from search result chips by [@timonrieger](https://github.com/timonrieger) in [#28166](https://github.com/immich-app/immich/pull/28166)
- feat(mobile): trash/restore all by [@YarosMallorca](https://github.com/YarosMallorca) in [#28116](https://github.com/immich-app/immich/pull/28116)
- feat: display more info in asset viewer by [@alextran1502](https://github.com/alextran1502) in [#24630](https://github.com/immich-app/immich/pull/24630)
- feat(server): allow subpaths for machine learning URL by [@gnojus](https://github.com/gnojus) in [#28427](https://github.com/immich-app/immich/pull/28427)
- feat(ui): Shared URL input configuration by [@Lauritz-Tieste](https://github.com/Lauritz-Tieste) in [#27105](https://github.com/immich-app/immich/pull/27105)
- refactor: enhance shared link UI and functionality by [@Lauritz-Tieste](https://github.com/Lauritz-Tieste) in [#26464](https://github.com/immich-app/immich/pull/26464)
- feat: upload and add local asset directly to album by [@alextran1502](https://github.com/alextran1502) in [#28123](https://github.com/immich-app/immich/pull/28123)
- feat: Selectable metadata in duplicates utility with diffing by [@ollioddi](https://github.com/ollioddi) in [#26328](https://github.com/immich-app/immich/pull/26328)
- fix: improve form control focus visibility by [@Caltsic](https://github.com/Caltsic) in [#28512](https://github.com/immich-app/immich/pull/28512)
- feat: command for user pages by [@alextran1502](https://github.com/alextran1502) in [#28554](https://github.com/immich-app/immich/pull/28554)
- refactor: use ControlBar UI Library component by [@bwees](https://github.com/bwees) in [#28567](https://github.com/immich-app/immich/pull/28567)
- feat: workflow template by [@alextran1502](https://github.com/alextran1502) in [#28553](https://github.com/immich-app/immich/pull/28553)
- feat(mobile): improve downloading algorithm for sharing by [@YarosMallorca](https://github.com/YarosMallorca) in [#27312](https://github.com/immich-app/immich/pull/27312)
- feat: search by album name and id by [@jrasm91](https://github.com/jrasm91) in [#28672](https://github.com/immich-app/immich/pull/28672)
- feat: upload local assets to album from bottom sheet by [@alextran1502](https://github.com/alextran1502) in [#28531](https://github.com/immich-app/immich/pull/28531)
- feat: places in context search by [@timonrieger](https://github.com/timonrieger) in [#28768](https://github.com/immich-app/immich/pull/28768)
- feat: minimum face count per user by [@timjonez](https://github.com/timjonez) in [#27452](https://github.com/immich-app/immich/pull/27452)
- feat: show notification and battery optimization warning by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#26610](https://github.com/immich-app/immich/pull/26610)
- feat: workflows drag and drop enhancements by [@danieldietzler](https://github.com/danieldietzler) in [#28764](https://github.com/immich-app/immich/pull/28764)
- feat(mobile): min face count per-user by [@YarosMallorca](https://github.com/YarosMallorca) in [#28805](https://github.com/immich-app/immich/pull/28805)
- refactor(server): allow -1 rating again by [@timonrieger](https://github.com/timonrieger) in [#28886](https://github.com/immich-app/immich/pull/28886)
- feat(web): warn before overwriting existing locations in geolocation utility by [@yoshovski](https://github.com/yoshovski) in [#28840](https://github.com/immich-app/immich/pull/28840)
- feat: warn if microservices worker is missing by [@bo0tzz](https://github.com/bo0tzz) in [#28869](https://github.com/immich-app/immich/pull/28869)
- fix(web): show album names in duplicate review by [@meesfrensel](https://github.com/meesfrensel) in [#29080](https://github.com/immich-app/immich/pull/29080)
- feat: keyboard seeking for new video player by [@danieldietzler](https://github.com/danieldietzler) in [#29208](https://github.com/immich-app/immich/pull/29208)
- feat(web): Add text-white-shadow to elements and increase the shadows effect by [@Vogeluff](https://github.com/Vogeluff) in [#29165](https://github.com/immich-app/immich/pull/29165)
- feat: webhook workflow action by [@benbeckford](https://github.com/benbeckford) in [#29258](https://github.com/immich-app/immich/pull/29258)
- feat: integrity checks admin settings by [@danieldietzler](https://github.com/danieldietzler) in [#29406](https://github.com/immich-app/immich/pull/29406)

##### 🐛 Bug fixes

- fix(web): center images in RTL layouts ([#27678](https://github.com/immich-app/immich/issues/27678)) by [@Nicolas-micuda-becker](https://github.com/Nicolas-micuda-becker) in [#27753](https://github.com/immich-app/immich/pull/27753)
- fix(mobile): add keys for person tiles in search by [@YarosMallorca](https://github.com/YarosMallorca) in [#27689](https://github.com/immich-app/immich/pull/27689)
- fix(web): selection clearing on preview by [@YarosMallorca](https://github.com/YarosMallorca) in [#27702](https://github.com/immich-app/immich/pull/27702)
- fix: asset multi select download shortcut by [@danieldietzler](https://github.com/danieldietzler) in [#27784](https://github.com/immich-app/immich/pull/27784)
- fix(web): add partner photo to album from multiselect by [@YarosMallorca](https://github.com/YarosMallorca) in [#27767](https://github.com/immich-app/immich/pull/27767)
- fix: redirect original by [@danieldietzler](https://github.com/danieldietzler) in [#27759](https://github.com/immich-app/immich/pull/27759)
- fix: make web build stage deterministic by [@bo0tzz](https://github.com/bo0tzz) in [#27823](https://github.com/immich-app/immich/pull/27823)
- fix(web): svelte regression - cancel video preview fetch when bind:this is cleared early by [@midzelis](https://github.com/midzelis) in [#27713](https://github.com/immich-app/immich/pull/27713)
- fix(web): stale adaptive image when original overlays preview by [@midzelis](https://github.com/midzelis) in [#27621](https://github.com/immich-app/immich/pull/27621)
- fix(mobile): readonly redirect when not logged in by [@YarosMallorca](https://github.com/YarosMallorca) in [#27728](https://github.com/immich-app/immich/pull/27728)
- fix(web): close edit faces panel on Escape key press by [@midzelis](https://github.com/midzelis) in [#27519](https://github.com/immich-app/immich/pull/27519)
- fix(oauth): normalize email claim to lowercase and trim before account lookup and registration by [@timdobras](https://github.com/timdobras) in [#26841](https://github.com/immich-app/immich/pull/26841)
- fix(web): use event for zooming out after opening face editor by [@meesfrensel](https://github.com/meesfrensel) in [#27789](https://github.com/immich-app/immich/pull/27789)
- fix: sanitize filenames before adding to zip by [@bo0tzz](https://github.com/bo0tzz) in [#27893](https://github.com/immich-app/immich/pull/27893)
- fix(server): require at least one field to be set when updating memory by [@fredfloydd](https://github.com/fredfloydd) in [#27842](https://github.com/immich-app/immich/pull/27842)
- fix(web): compute hashes for uploads in chunks by [@fredfloydd](https://github.com/fredfloydd) in [#27878](https://github.com/immich-app/immich/pull/27878)
- fix(web): fix stale album page load by [@fredfloydd](https://github.com/fredfloydd) in [#27825](https://github.com/immich-app/immich/pull/27825)
- fix(web): prevent interaction with detail panel behind person side panel by [@midzelis](https://github.com/midzelis) in [#27309](https://github.com/immich-app/immich/pull/27309)
- fix: show neon light by [@alextran1502](https://github.com/alextran1502) in [#27994](https://github.com/immich-app/immich/pull/27994)
- fix(mobile): zero exposure by [@YarosMallorca](https://github.com/YarosMallorca) in [#28017](https://github.com/immich-app/immich/pull/28017)
- fix(mobile): clear local data on forced logout by [@LeLunZ](https://github.com/LeLunZ) in [#27957](https://github.com/immich-app/immich/pull/27957)
- fix(mobile): enable autoplay for motion photos in video viewer by [@LeLunZ](https://github.com/LeLunZ) in [#27961](https://github.com/immich-app/immich/pull/27961)
- fix(mobile): thumbnail transition to asset viewer by [@LeLunZ](https://github.com/LeLunZ) in [#27850](https://github.com/immich-app/immich/pull/27850)
- fix: jump to timeline on new auto\_router update by [@alextran1502](https://github.com/alextran1502) in [#28022](https://github.com/immich-app/immich/pull/28022)
- fix(mobile): delete assets on trash empty, Android by [@PeterOmbodi](https://github.com/PeterOmbodi) in [#26070](https://github.com/immich-app/immich/pull/26070)
- fix(ml): handle empty/corrupt images in face detection by [@yosit](https://github.com/yosit) in [#27391](https://github.com/immich-app/immich/pull/27391)
- fix(web): refresh memories hourly by [@meesfrensel](https://github.com/meesfrensel) in [#28114](https://github.com/immich-app/immich/pull/28114)
- fix(web): large files: better handling of asset deletions by [@meesfrensel](https://github.com/meesfrensel) in [#28117](https://github.com/immich-app/immich/pull/28117)
- fix(web): double video playback on map timeline by [@YarosMallorca](https://github.com/YarosMallorca) in [#28090](https://github.com/immich-app/immich/pull/28090)
- fix(mobile): suppress asset stack UI in trash timeline by [@PeterOmbodi](https://github.com/PeterOmbodi) in [#26536](https://github.com/immich-app/immich/pull/26536)
- fix(web): timeline scroll when pressing back from stacked asset by [@Snowknight26](https://github.com/Snowknight26) in [#28163](https://github.com/immich-app/immich/pull/28163)
- fix(server): selectively apply metadata bitstream filter for video thumbnails by [@pinhao](https://github.com/pinhao) in [#28162](https://github.com/immich-app/immich/pull/28162)
- fix(web): fix shared link /s/photos.\* navigation after password login by [@meesfrensel](https://github.com/meesfrensel) in [#27788](https://github.com/immich-app/immich/pull/27788)
- fix(ml): respect time zone for logs in cuda container by [@AyaanMAG](https://github.com/AyaanMAG) in [#28155](https://github.com/immich-app/immich/pull/28155)
- fix: librknnrt permissions in machine-learning by [@DavidTheFighter](https://github.com/DavidTheFighter) in [#28216](https://github.com/immich-app/immich/pull/28216)
- fix(server): validate duplicate group ownership before dismissal by [@timonrieger](https://github.com/timonrieger) in [#28221](https://github.com/immich-app/immich/pull/28221)
- fix(web): correct timeline yesterday label across month boundaries by [@michelheusschen](https://github.com/michelheusschen) in [#28183](https://github.com/immich-app/immich/pull/28183)
- fix(mobile): show lens info without lens name by [@benbeckford](https://github.com/benbeckford) in [#28234](https://github.com/immich-app/immich/pull/28234)
- fix: stale person name after merge by [@danieldietzler](https://github.com/danieldietzler) in [#28222](https://github.com/immich-app/immich/pull/28222)
- fix(web): shared album avatars opening modal by [@meesfrensel](https://github.com/meesfrensel) in [#26719](https://github.com/immich-app/immich/pull/26719)
- fix(mobile): prevent asset loading issues when changing page or when closing memories by [@LeLunZ](https://github.com/LeLunZ) in [#27596](https://github.com/immich-app/immich/pull/27596)
- fix(mobile): correct filter default and UI desync in similar photos search by [@TheBestX11](https://github.com/TheBestX11) in [#27516](https://github.com/immich-app/immich/pull/27516)
- fix(server): hide isFavorite from partner asset sync stream by [@timonrieger](https://github.com/timonrieger) in [#28035](https://github.com/immich-app/immich/pull/28035)
- fix(mobile): restore notification plugin init by [@santoshakil](https://github.com/santoshakil) in [#28284](https://github.com/immich-app/immich/pull/28284)
- fix(mobile): mounted check before setState in album sync action by [@santoshakil](https://github.com/santoshakil) in [#28300](https://github.com/immich-app/immich/pull/28300)
- fix(mobile): avoid duplicate assets in album view by [@stfn42](https://github.com/stfn42) in [#28152](https://github.com/immich-app/immich/pull/28152)
- fix(mobile): Deduplicate assets in person view timeline by [@thowdev](https://github.com/thowdev) in [#26723](https://github.com/immich-app/immich/pull/26723)
- fix(deployment): remove unneeded volume by [@mmomjian](https://github.com/mmomjian) in [#28307](https://github.com/immich-app/immich/pull/28307)
- fix: mobile upload duration type by [@alextran1502](https://github.com/alextran1502) in [#28362](https://github.com/immich-app/immich/pull/28362)
- fix: deep link for assets when asset viewer already open by [@bwees](https://github.com/bwees) in [#27971](https://github.com/immich-app/immich/pull/27971)
- fix: kekab icon colors in light mode by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#28366](https://github.com/immich-app/immich/pull/28366)
- fix: indexes on remote\_asset\_entity by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#28264](https://github.com/immich-app/immich/pull/28264)
- fix(mobile): clear linkedRemoteAlbumId in reset() so FK refs dont dangle by [@santoshakil](https://github.com/santoshakil) in [#28382](https://github.com/immich-app/immich/pull/28382)
- fix: ignore icc profile make and model by [@jrasm91](https://github.com/jrasm91) in [#28412](https://github.com/immich-app/immich/pull/28412)
- fix(mobile): don't block app open on slow validateAccessToken by [@santoshakil](https://github.com/santoshakil) in [#28405](https://github.com/immich-app/immich/pull/28405)
- fix(mobile): add restore option to trashed assets by [@inesiscosta](https://github.com/inesiscosta) in [#27442](https://github.com/immich-app/immich/pull/27442)
- fix(mobile): use correct delete action by [@ByteSizedMarius](https://github.com/ByteSizedMarius) in [#26575](https://github.com/immich-app/immich/pull/26575)
- fix(server): dedupe database backup jobs by [@rdeaton](https://github.com/rdeaton) in [#28341](https://github.com/immich-app/immich/pull/28341)
- fix(mobile): cronet buffer overflow on compressed thumbnails by [@santoshakil](https://github.com/santoshakil) in [#28439](https://github.com/immich-app/immich/pull/28439)
- fix(mobile): cronet thumbnail buffer overflow regression from [#28439](https://github.com/immich-app/immich/issues/28439) by [@santoshakil](https://github.com/santoshakil) in [#28450](https://github.com/immich-app/immich/pull/28450)
- fix(mobile): mounted check in ThumbnailTile hero flight listener by [@santoshakil](https://github.com/santoshakil) in [#28451](https://github.com/immich-app/immich/pull/28451)
- fix(mobile): don't force-unwrap nil localizedTitle in ios getAlbums by [@santoshakil](https://github.com/santoshakil) in [#28452](https://github.com/immich-app/immich/pull/28452)
- fix(web): work around Chrome HDR image seam lines during zoom by [@midzelis](https://github.com/midzelis) in [#27715](https://github.com/immich-app/immich/pull/27715)
- fix(ios): respect status bar scroll to top in timeline views by [@agg23](https://github.com/agg23) in [#28469](https://github.com/immich-app/immich/pull/28469)
- fix(mobile): asset viewer stuck on spinner after rotation by [@LeLunZ](https://github.com/LeLunZ) in [#28019](https://github.com/immich-app/immich/pull/28019)
- fix(web): timeline stuttering with many assets in 1 day by [@benbeckford](https://github.com/benbeckford) in [#28509](https://github.com/immich-app/immich/pull/28509)
- fix(mobile): preserve zoom level during image loading and live photo playback by [@LeLunZ](https://github.com/LeLunZ) in [#27960](https://github.com/immich-app/immich/pull/27960)
- fix(ml): stabilize MIGraphX inference by [@fabianwimberger](https://github.com/fabianwimberger) in [#28444](https://github.com/immich-app/immich/pull/28444)
- fix: await sync asset v2 by [@bwees](https://github.com/bwees) in [#28569](https://github.com/immich-app/immich/pull/28569)
- fix: strip metadata from timeline responses for shared links without exif sharing by [@danieldietzler](https://github.com/danieldietzler) in [#28644](https://github.com/immich-app/immich/pull/28644)
- fix: Refresh local album overview page after asset deletion by [@Lauritz-Tieste](https://github.com/Lauritz-Tieste) in [#28586](https://github.com/immich-app/immich/pull/28586)
- fix(server): prevent locked assets from leaking to partners by [@timonrieger](https://github.com/timonrieger) in [#28652](https://github.com/immich-app/immich/pull/28652)
- refactor(web): replace per-asset viewport proximity with day-tier active indices by [@midzelis](https://github.com/midzelis) in [#28597](https://github.com/immich-app/immich/pull/28597)
- fix: timeline scroll flicker by [@alextran1502](https://github.com/alextran1502) in [#28653](https://github.com/immich-app/immich/pull/28653)
- fix: api repositories using stale endpoint by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#28667](https://github.com/immich-app/immich/pull/28667)
- fix: disallow cross origin/non http protocols for continueUrl on login by [@bwees](https://github.com/bwees) in [#28706](https://github.com/immich-app/immich/pull/28706)
- fix(web): skip thumbhash fade for offscreen thumbnails by [@midzelis](https://github.com/midzelis) in [#27335](https://github.com/immich-app/immich/pull/27335)
- fix(web): prevent partner assets from being selected in geolocation utility by [@okxint](https://github.com/okxint) in [#28737](https://github.com/immich-app/immich/pull/28737)
- fix(mobile): invisible ink splashes in asset sheet by [@timonrieger](https://github.com/timonrieger) in [#28756](https://github.com/immich-app/immich/pull/28756)
- fix!: unauthorized face creation by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#28561](https://github.com/immich-app/immich/pull/28561)
- fix(mobile): proper background task cleanup by [@mertalev](https://github.com/mertalev) in [#28694](https://github.com/immich-app/immich/pull/28694)
- fix(cli): prevent out-of-memory on file upload due to undici storing the request body by [@moversity](https://github.com/moversity) in [#28723](https://github.com/immich-app/immich/pull/28723)
- fix: error log on aborted uploads by [@jrasm91](https://github.com/jrasm91) in [#28806](https://github.com/immich-app/immich/pull/28806)
- fix(server): respect timezone in iso date string encoding by [@timonrieger](https://github.com/timonrieger) in [#28810](https://github.com/immich-app/immich/pull/28810)
- test: fix tests when OpenVINO provider is available by [@nekowinston](https://github.com/nekowinston) in [#28802](https://github.com/immich-app/immich/pull/28802)
- fix(mobile): run iOS bg task phases in parallel by [@santoshakil](https://github.com/santoshakil) in [#28293](https://github.com/immich-app/immich/pull/28293)
- fix: error handling by [@jrasm91](https://github.com/jrasm91) in [#28843](https://github.com/immich-app/immich/pull/28843)
- fix: cross isolate drift watchers by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#28862](https://github.com/immich-app/immich/pull/28862)
- fix: reload timeline on group by setting change by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#28864](https://github.com/immich-app/immich/pull/28864)
- fix(web): use irot/imir tags for HEIF Orientation by [@joojoooo](https://github.com/joojoooo) in [#27820](https://github.com/immich-app/immich/pull/27820)
- fix: detail panel faces reactivity issues by [@danieldietzler](https://github.com/danieldietzler) in [#28910](https://github.com/immich-app/immich/pull/28910)
- fix(server): hide isFavorite from album asset sync stream by [@timonrieger](https://github.com/timonrieger) in [#28923](https://github.com/immich-app/immich/pull/28923)
- fix(mobile): show memory and folder dates in local time by [@santoshakil](https://github.com/santoshakil) in [#28941](https://github.com/immich-app/immich/pull/28941)
- fix(mobile): show error when creating an album fails by [@santoshakil](https://github.com/santoshakil) in [#28942](https://github.com/immich-app/immich/pull/28942)
- fix(mobile): add album picker to archive bottom sheet by [@santoshakil](https://github.com/santoshakil) in [#28953](https://github.com/immich-app/immich/pull/28953)
- fix: normalize diacritics in person name search in Web & Mobile by [@pedrovieira](https://github.com/pedrovieira) in [#28887](https://github.com/immich-app/immich/pull/28887)
- fix(web): Prevent face editor from closing when dismissing tag confirmation by [@pedrovieira](https://github.com/pedrovieira) in [#28900](https://github.com/immich-app/immich/pull/28900)
- fix(mobile): map timeline layout crash by [@YarosMallorca](https://github.com/YarosMallorca) in [#28878](https://github.com/immich-app/immich/pull/28878)
- fix(mobile): deduplicate people in asset details panel by [@santoshakil](https://github.com/santoshakil) in [#28972](https://github.com/immich-app/immich/pull/28972)
- fix(mobile): keep timezone when editing asset date time by [@santoshakil](https://github.com/santoshakil) in [#28978](https://github.com/immich-app/immich/pull/28978)
- fix(mobile): stale details after editing asset date by [@santoshakil](https://github.com/santoshakil) in [#28977](https://github.com/immich-app/immich/pull/28977)
- fix(mobile): show albums whose assets are all trashed by [@santoshakil](https://github.com/santoshakil) in [#28985](https://github.com/immich-app/immich/pull/28985)
- fix(mobile): give android notification channels proper names by [@santoshakil](https://github.com/santoshakil) in [#28986](https://github.com/immich-app/immich/pull/28986)
- fix: Improving scroll behavior on image stacks that overflow the screen by [@BlankCanvasStudio](https://github.com/BlankCanvasStudio) in [#28885](https://github.com/immich-app/immich/pull/28885)
- fix(web): focus on scrollable element on load by [@timonrieger](https://github.com/timonrieger) in [#29004](https://github.com/immich-app/immich/pull/29004)
- fix(mobile): show like and comment options on album photo deep links by [@santoshakil](https://github.com/santoshakil) in [#29020](https://github.com/immich-app/immich/pull/29020)
- fix(web): correctly handle person search with more than 100 results by [@maxinegardenas](https://github.com/maxinegardenas) in [#29002](https://github.com/immich-app/immich/pull/29002)
- fix(web): prevent upload status panel from overlapping album action bar by [@okxint](https://github.com/okxint) in [#29044](https://github.com/immich-app/immich/pull/29044)
- fix(web): error loading image state by [@bwees](https://github.com/bwees) in [#29058](https://github.com/immich-app/immich/pull/29058)
- fix(web): show asset arrows by [@timonrieger](https://github.com/timonrieger) in [#29010](https://github.com/immich-app/immich/pull/29010)
- fix(server): hide partner archived asset locations from map by [@timonrieger](https://github.com/timonrieger) in [#29028](https://github.com/immich-app/immich/pull/29028)
- fix: lock transcoding options by [@timonrieger](https://github.com/timonrieger) in [#29076](https://github.com/immich-app/immich/pull/29076)
- fix(server): do not merge metadata when multiple duplicates are kept by [@timonrieger](https://github.com/timonrieger) in [#29035](https://github.com/immich-app/immich/pull/29035)
- fix: integrity report checksum query by [@danieldietzler](https://github.com/danieldietzler) in [#29136](https://github.com/immich-app/immich/pull/29136)
- fix: map settings by [@danieldietzler](https://github.com/danieldietzler) in [#29134](https://github.com/immich-app/immich/pull/29134)
- fix: too strict cron expression validation by [@danieldietzler](https://github.com/danieldietzler) in [#29138](https://github.com/immich-app/immich/pull/29138)
- fix(web): respect local timezone when building date range for search by [@okxint](https://github.com/okxint) in [#29128](https://github.com/immich-app/immich/pull/29128)
- fix(web): language selector by [@meesfrensel](https://github.com/meesfrensel) in [#29065](https://github.com/immich-app/immich/pull/29065)
- fix: update datetimeRelative description to minutes instead of seconds by [@meesfrensel](https://github.com/meesfrensel) in [#29137](https://github.com/immich-app/immich/pull/29137)
- fix: video thumbnail quality sharing by [@bwees](https://github.com/bwees) in [#29104](https://github.com/immich-app/immich/pull/29104)
- fix(mobile): stop sync albums crashing on the main isolate by [@santoshakil](https://github.com/santoshakil) in [#29133](https://github.com/immich-app/immich/pull/29133)
- fix(mobile): show memories with no showAt/hideAt in the timeline lane by [@santoshakil](https://github.com/santoshakil) in [#29158](https://github.com/immich-app/immich/pull/29158)
- fix(mobile): keep toasts off the dynamic island when keyboard is open by [@santoshakil](https://github.com/santoshakil) in [#29159](https://github.com/immich-app/immich/pull/29159)
- fix(server): skip existing users when sharing albums by [@jeevan6996](https://github.com/jeevan6996) in [#28884](https://github.com/immich-app/immich/pull/28884)
- fix: web i18n by [@danieldietzler](https://github.com/danieldietzler) in [#29175](https://github.com/immich-app/immich/pull/29175)
- fix(web): shift+click on GPS asset extends range selection in geolocation utility by [@timonrieger](https://github.com/timonrieger) in [#29022](https://github.com/immich-app/immich/pull/29022)
- fix(server): allow non-utc datetime offsets by [@timonrieger](https://github.com/timonrieger) in [#29186](https://github.com/immich-app/immich/pull/29186)
- fix: remove local-only step ids from workflow json by [@danieldietzler](https://github.com/danieldietzler) in [#29188](https://github.com/immich-app/immich/pull/29188)
- fix: asset type filter by [@danieldietzler](https://github.com/danieldietzler) in [#29190](https://github.com/immich-app/immich/pull/29190)
- fix(mobile): prevent duplicate login pages for unauthenticated share intent warm start by [@olildu](https://github.com/olildu) in [#29054](https://github.com/immich-app/immich/pull/29054)
- fix(mobile): refresh memories on resume and day change by [@santoshakil](https://github.com/santoshakil) in [#28983](https://github.com/immich-app/immich/pull/28983)
- fix(mobile): re-lock locked folder when the app is backgrounded by [@santoshakil](https://github.com/santoshakil) in [#29089](https://github.com/immich-app/immich/pull/29089)
- fix(mobile): endless spinner on album selection when device has no albums by [@santoshakil](https://github.com/santoshakil) in [#28994](https://github.com/immich-app/immich/pull/28994)
- fix: rc version check by [@danieldietzler](https://github.com/danieldietzler) in [#29194](https://github.com/immich-app/immich/pull/29194)
- fix: detail panel people reactivity and iterator consumption by [@danieldietzler](https://github.com/danieldietzler) in [#29250](https://github.com/immich-app/immich/pull/29250)
- fix(server): use VBR for QSV so the max bitrate is respected by [@aclerici38](https://github.com/aclerici38) in [#29240](https://github.com/immich-app/immich/pull/29240)
- fix: ignore external libraries for integrity report checksum check by [@danieldietzler](https://github.com/danieldietzler) in [#29248](https://github.com/immich-app/immich/pull/29248)
- fix(web): remove map's fullscreen button by [@meesfrensel](https://github.com/meesfrensel) in [#29192](https://github.com/immich-app/immich/pull/29192)
- refactor: use SemVer classes for version compatability message by [@bwees](https://github.com/bwees) in [#29056](https://github.com/immich-app/immich/pull/29056)
- fix: sync backfill by [@jrasm91](https://github.com/jrasm91) in [#29267](https://github.com/immich-app/immich/pull/29267)
- fix(mobile): force AssetViewerPage recreation on repeated view intents by [@okxint](https://github.com/okxint) in [#29235](https://github.com/immich-app/immich/pull/29235)
- fix(mobile): blank notifications page after enabling notifications by [@santoshakil](https://github.com/santoshakil) in [#29232](https://github.com/immich-app/immich/pull/29232)
- fix(mobile): app doesn't exit full-screen mode by [@YarosMallorca](https://github.com/YarosMallorca) in [#29301](https://github.com/immich-app/immich/pull/29301)
- fix(mobile): only toggle backup from the switch, not the whole row by [@santoshakil](https://github.com/santoshakil) in [#29236](https://github.com/immich-app/immich/pull/29236)
- fix(mobile): hide video thumbnail when video is ready by [@santoshakil](https://github.com/santoshakil) in [#29012](https://github.com/immich-app/immich/pull/29012)
- fix(mobile): apply exif orientation to android raw photos by [@santoshakil](https://github.com/santoshakil) in [#29337](https://github.com/immich-app/immich/pull/29337)
- fix(server): face region coordinates parsing by [@djbravo06](https://github.com/djbravo06) in [#29333](https://github.com/immich-app/immich/pull/29333)
- feat: honor album access permissions in search endpoints by [@danieldietzler](https://github.com/danieldietzler) in [#29352](https://github.com/immich-app/immich/pull/29352)
- fix: version compatability check by [@bwees](https://github.com/bwees) in [#29405](https://github.com/immich-app/immich/pull/29405)

##### 📚 Documentation

- fix(docs): instructions on how to use local immich ui by [@YarosMallorca](https://github.com/YarosMallorca) in [#27813](https://github.com/immich-app/immich/pull/27813)
- fix(docs): helmet file affected containers  by [@mmomjian](https://github.com/mmomjian) in [#27939](https://github.com/immich-app/immich/pull/27939)
- fix(docs): Update Tailscale free tier user and device limits by [@Hakuin123](https://github.com/Hakuin123) in [#28151](https://github.com/immich-app/immich/pull/28151)
- docs: update rocm installation instructions by [@aigarius](https://github.com/aigarius) in [#25434](https://github.com/immich-app/immich/pull/25434)
- fix(docs): document `upgrade-insecure-requests` default by [@meesfrensel](https://github.com/meesfrensel) in [#28279](https://github.com/immich-app/immich/pull/28279)
- fix(docs): missing colon in config file doc by [@SuperSandro2000](https://github.com/SuperSandro2000) in [#28313](https://github.com/immich-app/immich/pull/28313)
- fix: update server-commands subcommand list by [@bo0tzz](https://github.com/bo0tzz) in [#28402](https://github.com/immich-app/immich/pull/28402)
- feat(docs): add fixed subnet guide for Synology to prevent firewall issues by [@racehd](https://github.com/racehd) in [#26554](https://github.com/immich-app/immich/pull/26554)
- chore(docs): update FAQ with profile picture change instructions by [@tvangemert](https://github.com/tvangemert) in [#28634](https://github.com/immich-app/immich/pull/28634)
- chore: update documentation to use mise commands by [@timonrieger](https://github.com/timonrieger) in [#28515](https://github.com/immich-app/immich/pull/28515)
- fix(docs): v3 bumps by [@mmomjian](https://github.com/mmomjian) in [#29007](https://github.com/immich-app/immich/pull/29007)
- docs(server): clarify AssetBulkUploadCheckItem.id is a correlation token by [@timonrieger](https://github.com/timonrieger) in [#29141](https://github.com/immich-app/immich/pull/29141)
- docs(mobile-app): add Play App Signing certificate hash by [@tlvince](https://github.com/tlvince) in [#29168](https://github.com/immich-app/immich/pull/29168)
- docs(mobile): point users towards shared setup docs by [@agg23](https://github.com/agg23) in [#29078](https://github.com/immich-app/immich/pull/29078)
- docs: clarify duplicate exif merging intent by [@timonrieger](https://github.com/timonrieger) in [#29203](https://github.com/immich-app/immich/pull/29203)
- fix(docsc): v3 bump by [@mmomjian](https://github.com/mmomjian) in [#29246](https://github.com/immich-app/immich/pull/29246)
- docs: MS smtp guide by [@jameskimmel](https://github.com/jameskimmel) in [#29289](https://github.com/immich-app/immich/pull/29289)

##### 🌐 Translations

- feat: latest language requests by [@danieldietzler](https://github.com/danieldietzler) in [#28858](https://github.com/immich-app/immich/pull/28858)
- chore: update translations by [@weblate](https://github.com/weblate) in [#27764](https://github.com/immich-app/immich/pull/27764)
- feat: languages by [@danieldietzler](https://github.com/danieldietzler) in [#29088](https://github.com/immich-app/immich/pull/29088)
- chore(web): update translations by [@weblate](https://github.com/weblate) in [#29036](https://github.com/immich-app/immich/pull/29036)
- chore(web): update translations by [@weblate](https://github.com/weblate) in [#29162](https://github.com/immich-app/immich/pull/29162)
- fix: turkish readme translation by [@MuySup](https://github.com/MuySup) in [#29234](https://github.com/immich-app/immich/pull/29234)
- chore(web): update translations by [@weblate](https://github.com/weblate) in [#29204](https://github.com/immich-app/immich/pull/29204)
- chore(web): update translations by [@weblate](https://github.com/weblate) in [#29290](https://github.com/immich-app/immich/pull/29290)
- chore(web): update translations by [@weblate](https://github.com/weblate) in [#29347](https://github.com/immich-app/immich/pull/29347)

##### New Contributors

- [@OdinOxin](https://github.com/OdinOxin) made their first contribution in [#27732](https://github.com/immich-app/immich/pull/27732)
- [@migpovrap](https://github.com/migpovrap) made their first contribution in [#26917](https://github.com/immich-app/immich/pull/26917)
- [@StevenMassaro](https://github.com/StevenMassaro) made their first contribution in [#27531](https://github.com/immich-app/immich/pull/27531)
- [@timdobras](https://github.com/timdobras) made their first contribution in [#26841](https://github.com/immich-app/immich/pull/26841)
- [@santanoce](https://github.com/santanoce) made their first contribution in [#26235](https://github.com/immich-app/immich/pull/26235)
- [@fredfloydd](https://github.com/fredfloydd) made their first contribution in [#27842](https://github.com/immich-app/immich/pull/27842)
- [@sparsh985](https://github.com/sparsh985) made their first contribution in [#26755](https://github.com/immich-app/immich/pull/26755)
- [@LJspice](https://github.com/LJspice) made their first contribution in [#27389](https://github.com/immich-app/immich/pull/27389)
- [@git-akihakune](https://github.com/git-akihakune) made their first contribution in [#27963](https://github.com/immich-app/immich/pull/27963)
- [@shaun0927](https://github.com/shaun0927) made their first contribution in [#27900](https://github.com/immich-app/immich/pull/27900)
- [@yosit](https://github.com/yosit) made their first contribution in [#27391](https://github.com/immich-app/immich/pull/27391)
- [@Hakuin123](https://github.com/Hakuin123) made their first contribution in [#28151](https://github.com/immich-app/immich/pull/28151)
- [@pinhao](https://github.com/pinhao) made their first contribution in [#28162](https://github.com/immich-app/immich/pull/28162)
- [@AyaanMAG](https://github.com/AyaanMAG) made their first contribution in [#28155](https://github.com/immich-app/immich/pull/28155)
- [@DavidTheFighter](https://github.com/DavidTheFighter) made their first contribution in [#28216](https://github.com/immich-app/immich/pull/28216)
- [@benbeckford](https://github.com/benbeckford) made their first contribution in [#28234](https://github.com/immich-app/immich/pull/28234)
- [@bhugh](https://github.com/bhugh) made their first contribution in [#27884](https://github.com/immich-app/immich/pull/27884)
- [@SkyDev125](https://github.com/SkyDev125) made their first contribution in [#26971](https://github.com/immich-app/immich/pull/26971)
- [@aigarius](https://github.com/aigarius) made their first contribution in [#25434](https://github.com/immich-app/immich/pull/25434)
- [@mws-weekend-projects](https://github.com/mws-weekend-projects) made their first contribution in [#26758](https://github.com/immich-app/immich/pull/26758)
- [@TheBestX11](https://github.com/TheBestX11) made their first contribution in [#27516](https://github.com/immich-app/immich/pull/27516)
- [@sakshamchawla](https://github.com/sakshamchawla) made their first contribution in [#20877](https://github.com/immich-app/immich/pull/20877)
- [@santoshakil](https://github.com/santoshakil) made their first contribution in [#28284](https://github.com/immich-app/immich/pull/28284)
- [@stfn42](https://github.com/stfn42) made their first contribution in [#28152](https://github.com/immich-app/immich/pull/28152)
- [@thowdev](https://github.com/thowdev) made their first contribution in [#26723](https://github.com/immich-app/immich/pull/26723)
- [@SuperSandro2000](https://github.com/SuperSandro2000) made their first contribution in [#28313](https://github.com/immich-app/immich/pull/28313)
- [@racehd](https://github.com/racehd) made their first contribution in [#26554](https://github.com/immich-app/immich/pull/26554)
- [@inesiscosta](https://github.com/inesiscosta) made their first contribution in [#27442](https://github.com/immich-app/immich/pull/27442)
- [@gnojus](https://github.com/gnojus) made their first contribution in [#28427](https://github.com/immich-app/immich/pull/28427)
- [@rdeaton](https://github.com/rdeaton) made their first contribution in [#28341](https://github.com/immich-app/immich/pull/28341)
- [@agg23](https://github.com/agg23) made their first contribution in [#28469](https://github.com/immich-app/immich/pull/28469)
- [@ollioddi](https://github.com/ollioddi) made their first contribution in [#26328](https://github.com/immich-app/immich/pull/26328)
- [@Caltsic](https://github.com/Caltsic) made their first contribution in [#28512](https://github.com/immich-app/immich/pull/28512)
- [@fabianwimberger](https://github.com/fabianwimberger) made their first contribution in [#28444](https://github.com/immich-app/immich/pull/28444)
- [@tvangemert](https://github.com/tvangemert) made their first contribution in [#28634](https://github.com/immich-app/immich/pull/28634)
- [@BlankCanvasStudio](https://github.com/BlankCanvasStudio) made their first contribution in [#28620](https://github.com/immich-app/immich/pull/28620)
- [@pneuly](https://github.com/pneuly) made their first contribution in [#28610](https://github.com/immich-app/immich/pull/28610)
- [@timjonez](https://github.com/timjonez) made their first contribution in [#27452](https://github.com/im…
renovate Bot added a commit to sdwilsh/ansible-playbooks that referenced this pull request Jul 9, 2026
##### [\`v3.0.2\`](https://github.com/immich-app/immich/releases/tag/v3.0.2)

### v3.0.2

This patch release addresses various bugs from v3 release and adds an additional filter to workflows

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

#### What's Changed

##### 🌟 Enhancements

- fix(web): add ARIA label to ServerStatisticsCard by [@tjhorner](https://github.com/tjhorner) in [#29497](https://github.com/immich-app/immich/pull/29497)
- feat(server): hls variant configuration by [@mertalev](https://github.com/mertalev) in [#29613](https://github.com/immich-app/immich/pull/29613)
- feat: user agnostic database restore by [@danieldietzler](https://github.com/danieldietzler) in [#29512](https://github.com/immich-app/immich/pull/29512)
- feat(server): date workflow filter by [@benbeckford](https://github.com/benbeckford) in [#29040](https://github.com/immich-app/immich/pull/29040)

##### 🐛 Bug fixes

- fix: re-add gCastEnabled negation by [@bo0tzz](https://github.com/bo0tzz) in [#29499](https://github.com/immich-app/immich/pull/29499)
- fix: downmix audio to stereo to fix broken channel layout by [@lukasdotcom](https://github.com/lukasdotcom) in [#29485](https://github.com/immich-app/immich/pull/29485)
- fix: live transcoding when viewing from a link share by [@lukasdotcom](https://github.com/lukasdotcom) in [#29471](https://github.com/immich-app/immich/pull/29471)
- fix: web search timeline visibility by [@danieldietzler](https://github.com/danieldietzler) in [#29518](https://github.com/immich-app/immich/pull/29518)
- fix(web): missing i18n strings by [@wonsukchoi](https://github.com/wonsukchoi) in [#29612](https://github.com/immich-app/immich/pull/29612)
- fix: chinese browser locales recognition by [@danieldietzler](https://github.com/danieldietzler) in [#29622](https://github.com/immich-app/immich/pull/29622)
- chore: improve added to album messages by [@danieldietzler](https://github.com/danieldietzler) in [#29641](https://github.com/immich-app/immich/pull/29641)
- fix(mobile): fix 10-bit heic and avif colors on android by [@santoshakil](https://github.com/santoshakil) in [#29631](https://github.com/immich-app/immich/pull/29631)
- fix(mobile): match iOS scroll to top and tabbar scroll ([#28469](https://github.com/immich-app/immich/issues/28469)) by [@agg23](https://github.com/agg23) in [#29705](https://github.com/immich-app/immich/pull/29705)
- fix: wrap migrations in transaction by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#29664](https://github.com/immich-app/immich/pull/29664)
- fix: oauth account linking by [@danieldietzler](https://github.com/danieldietzler) in [#29624](https://github.com/immich-app/immich/pull/29624)
- fix: incorrect grouping of recently added assets by [@benbeckford](https://github.com/benbeckford) in [#29666](https://github.com/immich-app/immich/pull/29666)
- fix: integrity checks checksum pagination by [@danieldietzler](https://github.com/danieldietzler) in [#29516](https://github.com/immich-app/immich/pull/29516)
- fix(mobile): missing crop options and rotation scaling by [@bwees](https://github.com/bwees) in [#29645](https://github.com/immich-app/immich/pull/29645)
- fix(mobile): properly handle live photos locally by [@agg23](https://github.com/agg23) in [#29462](https://github.com/immich-app/immich/pull/29462)
- fix: integrity checks dto validation by [@danieldietzler](https://github.com/danieldietzler) in [#29621](https://github.com/immich-app/immich/pull/29621)
- fix(mobile): http request handling after isolate death by [@mertalev](https://github.com/mertalev) in [#29714](https://github.com/immich-app/immich/pull/29714)
- fix: do not log out on automatic url switch by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#29715](https://github.com/immich-app/immich/pull/29715)
- fix(server): stream ffprobe packets by [@mertalev](https://github.com/mertalev) in [#29723](https://github.com/immich-app/immich/pull/29723)
- fix: search metadata for album shared links by [@danieldietzler](https://github.com/danieldietzler) in [#29742](https://github.com/immich-app/immich/pull/29742)
- fix(web): clear asset selection when search context changes by [@khanguyen74](https://github.com/khanguyen74) in [#29738](https://github.com/immich-app/immich/pull/29738)
- fix(mobile): update timeline args on layout constraint changes by [@santoshakil](https://github.com/santoshakil) in [#29653](https://github.com/immich-app/immich/pull/29653)
- fix: iso date parsing for three digit years by [@danieldietzler](https://github.com/danieldietzler) in [#29739](https://github.com/immich-app/immich/pull/29739)
- fix: missing files integrity checks by [@danieldietzler](https://github.com/danieldietzler) in [#29737](https://github.com/immich-app/immich/pull/29737)
- fix(mobile): play videos from search results and folder view by [@santoshakil](https://github.com/santoshakil) in [#29693](https://github.com/immich-app/immich/pull/29693)
- fix(web): recursively unnest class arrays by [@meesfrensel](https://github.com/meesfrensel) in [#29755](https://github.com/immich-app/immich/pull/29755)
- fix: emit album update event when uploading assets through shared link by [@danieldietzler](https://github.com/danieldietzler) in [#29757](https://github.com/immich-app/immich/pull/29757)
- fix(web): always initialize language manager to set lang and dir by [@meesfrensel](https://github.com/meesfrensel) in [#29696](https://github.com/immich-app/immich/pull/29696)

##### 📚 Documentation

- chore: update docs with v3 tags by [@alextran1502](https://github.com/alextran1502) in [#29312](https://github.com/immich-app/immich/pull/29312)
- fix(docs): use correct heading name for DB dump by [@track0x1](https://github.com/track0x1) in [#29483](https://github.com/immich-app/immich/pull/29483)
- feat(docs): add Malayalam language support in README files by [@jinskjoy](https://github.com/jinskjoy) in [#29593](https://github.com/immich-app/immich/pull/29593)
- fix(docs): clarify version policy by [@mmomjian](https://github.com/mmomjian) in [#29654](https://github.com/immich-app/immich/pull/29654)

##### 🌐 Translations

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

#### New Contributors

- [@tjhorner](https://github.com/tjhorner) made their first contribution in [#29497](https://github.com/immich-app/immich/pull/29497)
- [@wonsukchoi](https://github.com/wonsukchoi) made their first contribution in [#29612](https://github.com/immich-app/immich/pull/29612)
- [@track0x1](https://github.com/track0x1) made their first contribution in [#29483](https://github.com/immich-app/immich/pull/29483)
- [@jinskjoy](https://github.com/jinskjoy) made their first contribution in [#29593](https://github.com/immich-app/immich/pull/29593)
- [@khanguyen74](https://github.com/khanguyen74) made their first contribution in [#29738](https://github.com/immich-app/immich/pull/29738)

**Full Changelog**: <https://github.com/immich-app/immich/compare/v3.0.1...v3.0.2>

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

##### v3.0.1

- Fixes a bug that causes albums don't show up in the mobile app

##### What's Changed

##### 🚀 Features

- feat(web): recently added link in sidebar by [@benbeckford](https://github.com/benbeckford) in [#29039](https://github.com/immich-app/immich/pull/29039)

##### 🐛 Bug fixes

- fix: albums broken on v2 mobile clients by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#29446](https://github.com/immich-app/immich/pull/29446)
- fix: setting input field description spacing for description snippet by [@danieldietzler](https://github.com/danieldietzler) in [#29433](https://github.com/immich-app/immich/pull/29433)

##### 🌐 Translations

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

**Full Changelog**: <https://github.com/immich-app/immich/compare/v3.0.0...v3.0.1>

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

##### v3.0.0

Welcome to Immich `v3.0.0`!

After months of hard work from the team and our amazing contributors, we're thrilled to announce the next major version of Immich: `v3.0.0`!  🎉

##### Breaking changes

This release includes several breaking changes; read the full migration guide [here](https://immich.app/blog/v3-migration). *It's worth mentioning that many of the breaking changes are updates to API endpoints and affect only **third-party tools** that integrate with Immich's API*. For the vast majority of users, updating works exactly as it always has.

##### How to update

> \[!WARNING]
> `v3.0.0` drops support for pgvecto.rs. If you run Immich before `v1.133.0` and haven't done the migration step yet, see the migration guide here. <https://docs.immich.app/install/upgrading/#migrating-to-vectorchord>

First, update the `IMMICH_VERSION` in your `.env` file to `v3`:

```diff
- IMMICH_VERSION=v2
+ IMMICH_VERSION=v3
```

Then run the usual update commands:

```bash
docker compose pull && docker compose up -d
```

##### Release candidates

If you missed it, `v3.0.0` was the first time we used release candidates, also known as prereleases. Release candidates are tested but not yet official releases of Immich, and they allow us to find and fix any outstanding bugs before a final release. If you would like to be notified about release candidates directly through Immich, you can change the release channel from "Stable" to "Release candidate" in the `Admin settings > Version check` options ([here](https://my.immich.app/admin/system-settings?isOpen=version-check)).

<img alt="New release channel option in version check settings" src="https://github.com/user-attachments/assets/fc8f6008-d486-4915-ad1b-feaddb856315" />
##### New Merch

As part of this release, we're happy to announce we also have some new swag for you!

- Kids clothing: For those who are likely the reason for your Immich library's size
- Colored embroidery: We now have clothes with a full color embroidered Immich logo

<a href="https://immich.store/collections/immich-3-0">
<img width="1200" alt="immich-store (1)" src="https://github.com/user-attachments/assets/ce114e7b-1424-4eca-975d-b23debadb32b" />
</a>

Check it out now at [https://immich.store](https://immich.store/collections/immich-3-0)!

##### Highlights

Now, let's get right into all the new features in this release:

- Mobile non-destructive editing
- Workflows (preview)
- Background backup improvement
- Recently added page
- Integrity checks
- Slideshow on mobile app
- HLS and real-time video transcoding (preview)
- New video player for web
- Open photo in Immich as gallery on Android
- OCR on mobile app
- Upload asset directly to album on the mobile app
- Option to select image size when sharing on the mobile app
- Timeline performance improvement for browsing a large amount of assets in a single month

##### Mobile non-destructive editing

<p align="center">
<img width="300" alt="image" src="https://github.com/user-attachments/assets/e9ddf97c-a4f8-42c1-9910-49ef3c8d4b0a" />
</p>

This is a follow-up to Image Editing on the web, which was released in `v2.5.0`. This feature allows you to make non-destructive edits to your photos inside of Immich. Until now, the mobile editor used a completely different system that created new assets instead of editing the photo in place.

With this update, we bring a new, easier-to-use editor to mobile devices that has the same features as the web version. You can now edit photos directly in the mobile app, including cropping, rotating, and adjusting your images without ever touching the original file. Similar to the web, edits are non-destructive, so you can revisit or revert them at any time. You can even make edits on mobile and then adjust them on the web later!

Some features from the previous mobile editing implementation have been removed including:

- Recoloring photos
- Editing live photos
- Editing local assets

We have plans to bring some of these capabilities back in future releases.

##### Workflows (preview)

The first preview of Workflows is here! Workflows let you automate actions in your library by chaining triggers, filters, and actions together with a drag-and-drop builder. This is the foundation for many exciting automations to come, and we'd love your feedback as we continue building on it.

You can access the feature from [Utilities > Workflows](https://my.immich.app/workflows) on the web.

<img width="800"  alt="Workflows link on the utilities page" src="https://github.com/user-attachments/assets/db7e139e-89b0-481a-9a66-530a40dc175a" />

From there, you can either create a new blank workflow or browse the premade templates to get a basic understanding of how workflows can be used.

<p align="center">
<img width="400" alt="image" src="https://github.com/user-attachments/assets/23fdb017-e439-4221-9be8-a14bd690fa9b" />
</p>
##### Workflows editor

<img alt="Workflow editor with an example workflow" src="https://github.com/user-attachments/assets/c6a569de-d884-4bdb-8bb0-0ff2c805bfb9" />

In the workflows editor, you can switch between the Visual or JSON editor. The visual editor is nice for building out the workflow; the JSON editor is nice for sharing and receiving workflow content from others.

In each workflow, there is a ***trigger*** and a sequence of ***steps.***

- Trigger: this is the entry point of each workflow; when the trigger occurs, the steps are evaluated.
- Steps: they include Filters (conditions) and Actions (effects); they can be combined to produce the desired effect of the use case you aim for.

<p align="center">
<img width="400" alt="List of available workflow steps" src="https://github.com/user-attachments/assets/50e89454-2bf9-4d41-bfa6-fd54f8944ea3" />
</p>
##### Sharing a workflow

You can share the workflow you made with others in two ways: text and JSON. Text is nice for sharing on a forum or for show-and-tell content. JSON is nice for others to make an exact copy of your workflow's configuration.

You can copy the text in the workflows summary panel on the lower right of the screen

<p align="center">
<img width="400"  alt="workflow summary in text" src="https://github.com/user-attachments/assets/dda24c88-f403-4189-a57b-71f6da3816e7" />
</p>

You can share the JSON content from the copy workflows button in the app bar, switch to the JSON editor, or use the `Show schema` button in the context menu in the workflows list

<img  alt="JSON editor" src="https://github.com/user-attachments/assets/307297cc-36d6-477c-bd72-d52be1dec0c5" />

<img  alt="Show workflow schema" src="https://github.com/user-attachments/assets/b6efada4-44fc-4d35-9e24-0f143c003313" />

> \[!NOTE]
> Please use this [discussion thread](https://github.com/immich-app/immich/discussions/29167) to propose new ideas of triggers and actions. We are looking for extensive feedback and suggestions from you all.

##### Background backup improvements

Background backup on Android is now significantly more reliable. Previously, the background backup on Android was limited to newly taken photos. Now, the app uses a new periodic task scheduler, which allows you to upload your entire library in the background, and it plays nicer with Android's background execution limits, properly cleans up tasks, and warns you when battery optimization and notification settings might interfere with backups.

On iOS, the background refresh task now runs its sync and upload work in parallel, so uploads actually start within the short time window iOS allows.

<p align="center">
<img width="300"  alt="Enable backup option on mobile" src="https://github.com/user-attachments/assets/82be41f3-93b9-4231-9f91-53eb317bb3fe" />
</p>
##### Recently added page

A new "Recently Added" page on the web and mobile lets you browse your library sorted by when assets were added to Immich, rather than when they were taken. This makes it easier to find what's new when browsing a new batch of imports. You can find the new page in the "Explore" tab on the web and in the "Search" tab on mobile.

<img width="798" height="220" alt="Recently added" src="https://github.com/user-attachments/assets/d4729864-f736-4554-a672-91861aad5f7f" />
##### Integrity checks

The maintenance page has gotten a new addition: integrity reports! Immich will scan its directories on your file system, and compare it to what it has stored in its database. If there are deviations, they will be surfaced as

- untracked, if there is a file in Immich's directories that Immich does not know of
- missing, if Immich references a file in its database that does not exist in that place (anymore)
- a checksum mismatch, if the checksum of the file on disk does not match the checksum Immich has stored for that file. Typically, this would happen through file corruption but could also be the result of a bad rename.

<img alt="Integrity report on the maintenance page showing a count of untracked and missing files, as well as checksum mismatches." src="https://github.com/user-attachments/assets/0e59537e-89b7-4d06-b5e6-731bb1e453c0" />

You can configure when and how long the job runs each night.

<img width="800" alt="image" src="https://github.com/user-attachments/assets/13da49ac-5cfa-40a1-b852-b89b0ed7fff6" />
##### Slideshow (mobile)

The slideshow experience comes to mobile! You can now sit back and let your photos and videos play across the screen, just like on the web.

<p align="center">
<img width="300" alt="Slideshow view on mobile" src="https://github.com/user-attachments/assets/b3325f3c-0505-405f-9b79-322f738030f4" />
</p>
##### HLS and Real-Time Video transcoding (preview)

Immich can now transcode videos on-the-fly without needing to generate offline transcodes. This has been a long-requested feature with many benefits:

- Quality switching (both manual and automatic)
- Transcoding to the best codecs supported by the client
- Lower storage overhead when offline transcoding is disabled
- HDR for compatible clients (not implemented yet)
- Remuxing rather than transcoding the original when bandwidth allows it (not implemented yet)

Please note that this feature is still experimental and can change behavior from version to version. It's currently only implemented in the web app, with the mobile app implementation in progress.

To enable real-time transcoding, go to the [video transcoding settings](https://my.immich.app/admin/system-settings?isOpen=video-transcoding+realtime-transcoding) (scroll down). Offline transcoding isn't directly affected by enabling it, so if you'd like to disable offline transcoding, you should also adjust the transcode policy.

> \[!NOTE]
> For assets imported prior to v3, you will also need to re-run Metadata Extraction in the job panel for them to be re-processed.

<img alt="HLS Transcoding settings" src="https://github.com/user-attachments/assets/6313ea40-ae1a-4495-aaea-212ef67fd338" />

Keep in mind that your server needs to be powerful enough to transcode in real-time for this feature to work well. Hardware acceleration is recommended, but not required, when using this feature.

##### New video player for web

A new custom video player on the web app ensures all your devices share the same controls and layout, matching the Immich design. Some basic functions, like changing the playback rate, are available. This should also fix a lot of the problems on iOS, where the OS's controls are hidden behind the Immich navbar.

##### Open photos in Immich as a gallery on Android

Immich can now act as a gallery/image viewer app on Android. Tap a photo or video in another app, choose Immich, and it opens directly in the asset viewer with options to share the file or upload it to your library.

This is the first iteration of the feature, and refinements to how Immich recognizes files that are already in your library are on the way

<img width="350" alt="image" src="https://github.com/user-attachments/assets/f98c2a65-1b84-4580-a7af-ead54ab737d8" />
<img width="350" alt="image" src="https://github.com/user-attachments/assets/fb783bed-c6c4-4634-af71-c2e888274121" />
##### OCR on the mobile app

The asset viewer now has a toggle that highlights recognized text in a photo, and you can select and copy it directly from the image.

<p align="center">
<img width="350" alt="OCR in the mobile app" src="https://github.com/user-attachments/assets/5f870d38-53a5-4b05-9dba-5d8838b86934" />
</p>
##### Upload assets directly to an album on mobile

You can now upload local photos directly to an album in the mobile app, including from the asset bottom sheet, instead of uploading first and organizing later. A small change that removes a lot of friction from the backup-and-organize flow.

##### Select image size when sharing on mobile

When sharing photos from the mobile app, you can now choose the image size before sending; it is handy for keeping shared files small for messaging apps while preserving the option to share at full quality when needed.

You can change the default behavior in the `App Settings > Preferences`

<p align="center">
<img width="350"  alt="Share file's size settings" src="https://github.com/user-attachments/assets/fe1c95d7-39e4-4c25-8981-dea4d07fce5a" />
</p>

You can also pick the option when sharing on-the-fly by long pressing the `Share` button

<p align="center">
<img width="350"  alt="On-the-fly picker" src="https://github.com/user-attachments/assets/667b79a7-efac-462b-8736-9e674e083d6b" />
</p>
##### Timeline performance Improvements

Browsing months with a large number of assets is now dramatically smoother and prevents the browser tab from locking up when your instance encounters that scenario.

##### 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>

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

##### What's Changed

##### 🚨 Breaking Changes

- refactor!: migrate class-validator to zod by [@timonrieger](https://github.com/timonrieger) in [#26597](https://github.com/immich-app/immich/pull/26597)
- refactor!: remove replace asset by [@jrasm91](https://github.com/jrasm91) in [#27022](https://github.com/immich-app/immich/pull/27022)
- refactor!: remove my shared link dto by [@jrasm91](https://github.com/jrasm91) in [#27023](https://github.com/immich-app/immich/pull/27023)
- chore!: remove deprecated env variables by [@jrasm91](https://github.com/jrasm91) in [#27802](https://github.com/immich-app/immich/pull/27802)
- chore!: remove getRandom api endpoint by [@bwees](https://github.com/bwees) in [#27780](https://github.com/immich-app/immich/pull/27780)
- chore!: remove unused token response param by [@jrasm91](https://github.com/jrasm91) in [#27805](https://github.com/immich-app/immich/pull/27805)
- refactor: yeet old timeline by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#27666](https://github.com/immich-app/immich/pull/27666)
- chore!: remove old timeline sync endpoints by [@jrasm91](https://github.com/jrasm91) in [#27804](https://github.com/immich-app/immich/pull/27804)
- chore!: remove deviceId and deviceAssetId by [@danieldietzler](https://github.com/danieldietzler) in [#27818](https://github.com/immich-app/immich/pull/27818)
- chore!: rename API key schemas by [@jrasm91](https://github.com/jrasm91) in [#27828](https://github.com/immich-app/immich/pull/27828)
- chore!: remove without assets by [@jrasm91](https://github.com/jrasm91) in [#27835](https://github.com/immich-app/immich/pull/27835)
- fix: oauth issuerUrl validation by [@bo0tzz](https://github.com/bo0tzz) in [#27848](https://github.com/immich-app/immich/pull/27848)
- fix!: do not allow insecure oauth requests by default by [@bo0tzz](https://github.com/bo0tzz) in [#27844](https://github.com/immich-app/immich/pull/27844)
- fix!: set duration to null when not present by [@meesfrensel](https://github.com/meesfrensel) in [#26982](https://github.com/immich-app/immich/pull/26982)
- chore!: remove /api/server/theme endpoint by [@jrasm91](https://github.com/jrasm91) in [#27880](https://github.com/immich-app/immich/pull/27880)
- chore!: migrate album owner to album\_user by [@danieldietzler](https://github.com/danieldietzler) in [#27467](https://github.com/immich-app/immich/pull/27467)
- refactor!: change number to integer types by [@timonrieger](https://github.com/timonrieger) in [#27912](https://github.com/immich-app/immich/pull/27912)
- refactor(server)!: move correlationId to X-Correlation-ID response header by [@timonrieger](https://github.com/timonrieger) in [#28139](https://github.com/immich-app/immich/pull/28139)
- refactor(server)!: remove redundant error and statusCode fields from error responses by [@timonrieger](https://github.com/timonrieger) in [#28140](https://github.com/immich-app/immich/pull/28140)
- chore(server)!: drop pgvecto.rs support by [@mertalev](https://github.com/mertalev) in [#28159](https://github.com/immich-app/immich/pull/28159)
- chore!: duration in milliseconds by [@mertalev](https://github.com/mertalev) in [#28003](https://github.com/immich-app/immich/pull/28003)
- refactor(server)!: sanitize error messages to avoid leaking resource details by [@timonrieger](https://github.com/timonrieger) in [#28154](https://github.com/immich-app/immich/pull/28154)
- refactor(server)!: structured validation error responses by [@timonrieger](https://github.com/timonrieger) in [#28204](https://github.com/immich-app/immich/pull/28204)
- feat(server)!: add isOwned filter to albums API by [@timonrieger](https://github.com/timonrieger) in [#28213](https://github.com/immich-app/immich/pull/28213)
- chore(ml)!: require numpy 2.4 by [@mertalev](https://github.com/mertalev) in [#28158](https://github.com/immich-app/immich/pull/28158)
- fix(deps): update dependency nestjs-otel to v8 by [@renovate](https://github.com/renovate)\[bot] in [#27863](https://github.com/immich-app/immich/pull/27863)
- chore(ml)!: remove deprecated envs by [@mertalev](https://github.com/mertalev) in [#28326](https://github.com/immich-app/immich/pull/28326)
- chore(server)!: remove libopus enum by [@mertalev](https://github.com/mertalev) in [#28325](https://github.com/immich-app/immich/pull/28325)
- refactor!: remove asset faces from AssetResponseDto by [@bwees](https://github.com/bwees) in [#27779](https://github.com/immich-app/immich/pull/27779)
- refactor(server)!: drop empty string to null conversion by [@timonrieger](https://github.com/timonrieger) in [#28808](https://github.com/immich-app/immich/pull/28808)
- refactor(server)!: remove changeExpiryTime by [@timonrieger](https://github.com/timonrieger) in [#28816](https://github.com/immich-app/immich/pull/28816)
- refactor!: disallow star rating < 1 by [@meesfrensel](https://github.com/meesfrensel) in [#27896](https://github.com/immich-app/immich/pull/27896)
- fix!: search endpoints visibility can be omitted by [@danieldietzler](https://github.com/danieldietzler) in [#29385](https://github.com/immich-app/immich/pull/29385)

##### 🫥 Deprecated Changes

- refactor(server): deprecate PUT routes in favor of PATCH by [@timonrieger](https://github.com/timonrieger) in [#28859](https://github.com/immich-app/immich/pull/28859)

##### 🔒 Security

- fix: run profile picture through thumbnail pipeline by [@bo0tzz](https://github.com/bo0tzz) in [#27890](https://github.com/immich-app/immich/pull/27890)

##### 🚀 Features

- feat: mobile editing by [@bwees](https://github.com/bwees) in [#25397](https://github.com/immich-app/immich/pull/25397)
- feat: album map markers endpoint by [@jrasm91](https://github.com/jrasm91) in [#27830](https://github.com/immich-app/immich/pull/27830)
- feat(server): added backchannel logout api endpoint by [@santanoce](https://github.com/santanoce) in [#26235](https://github.com/immich-app/immich/pull/26235)
- feat(server): add OIDC logout URL override option by [@LJspice](https://github.com/LJspice) in [#27389](https://github.com/immich-app/immich/pull/27389)
- feat: android periodic work manager task by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#23563](https://github.com/immich-app/immich/pull/23563)
- feat(web): custom video player controls by [@meesfrensel](https://github.com/meesfrensel) in [#26183](https://github.com/immich-app/immich/pull/26183)
- feat(web): add full-path search mode to UI by [@mws-weekend-projects](https://github.com/mws-weekend-projects) in [#26758](https://github.com/immich-app/immich/pull/26758)
- feat: recently added assets page by [@benbeckford](https://github.com/benbeckford) in [#28272](https://github.com/immich-app/immich/pull/28272)
- feat(mobile): slideshow view by [@benbeckford](https://github.com/benbeckford) in [#28421](https://github.com/immich-app/immich/pull/28421)
- feat(mobile): "Add Tags" asset multiselect option by [@benjamonnguyen](https://github.com/benjamonnguyen) in [#26269](https://github.com/immich-app/immich/pull/26269)
- feat: workflows & plugins by [@jrasm91](https://github.com/jrasm91) in [#26727](https://github.com/immich-app/immich/pull/26727)
- feat(server): hls with real-time transcoding by [@mertalev](https://github.com/mertalev) in [#28230](https://github.com/immich-app/immich/pull/28230)
- feat(web): hls player by [@mertalev](https://github.com/mertalev) in [#28312](https://github.com/immich-app/immich/pull/28312)
- feat(mobile): Android. Immich as a gallery / image viewer app by [@PeterOmbodi](https://github.com/PeterOmbodi) in [#26109](https://github.com/immich-app/immich/pull/26109)
- feat: user upload heatmap by [@bondeabhijeet](https://github.com/bondeabhijeet) in [#28593](https://github.com/immich-app/immich/pull/28593)
- feat(mobile): ocr support by [@YarosMallorca](https://github.com/YarosMallorca) in [#26523](https://github.com/immich-app/immich/pull/26523)
- feat: geolocation workflow filter by [@benbeckford](https://github.com/benbeckford) in [#28961](https://github.com/immich-app/immich/pull/28961)
- feat: image quality option in sharing by [@alextran1502](https://github.com/alextran1502) in [#28918](https://github.com/immich-app/immich/pull/28918)
- feat: integrity check jobs (missing files, untracked files, checksums) by [@insertish](https://github.com/insertish) in [#24205](https://github.com/immich-app/immich/pull/24205)
- feat: new feature message by [@alextran1502](https://github.com/alextran1502) in [#29388](https://github.com/immich-app/immich/pull/29388)

##### 🌟 Enhancements

- feat(web): persist state of file path information in details panel by [@cratoo](https://github.com/cratoo) in [#27770](https://github.com/immich-app/immich/pull/27770)
- feat: commands by [@jrasm91](https://github.com/jrasm91) in [#27546](https://github.com/immich-app/immich/pull/27546)
- feat: upgrade immich/ui by [@jrasm91](https://github.com/jrasm91) in [#27792](https://github.com/immich-app/immich/pull/27792)
- feat: filter users on share by [@OdinOxin](https://github.com/OdinOxin) in [#27732](https://github.com/immich-app/immich/pull/27732)
- fix(server): render storage template date/time tokens in UTC ([#24350](https://github.com/immich-app/immich/issues/24350)) by [@migpovrap](https://github.com/migpovrap) in [#26917](https://github.com/immich-app/immich/pull/26917)
- feat(web): lazy load library and server statistics by [@etnoy](https://github.com/etnoy) in [#26406](https://github.com/immich-app/immich/pull/26406)
- feat: sort users alphabetically when adding to album by [@OdinOxin](https://github.com/OdinOxin) in [#27731](https://github.com/immich-app/immich/pull/27731)
- feat: auth logout page by [@jrasm91](https://github.com/jrasm91) in [#27831](https://github.com/immich-app/immich/pull/27831)
- chore: improve randomness of /search/random endpoint by [@StevenMassaro](https://github.com/StevenMassaro) in [#27531](https://github.com/immich-app/immich/pull/27531)
- feat: dynamic languages by [@jrasm91](https://github.com/jrasm91) in [#27869](https://github.com/immich-app/immich/pull/27869)
- feat: cache shared link by [@danieldietzler](https://github.com/danieldietzler) in [#27889](https://github.com/immich-app/immich/pull/27889)
- feat(server): add configurable OAuth prompt parameter by [@sparsh985](https://github.com/sparsh985) in [#26755](https://github.com/immich-app/immich/pull/26755)
- feat(server): add MPO file type support by [@git-akihakune](https://github.com/git-akihakune) in [#27963](https://github.com/immich-app/immich/pull/27963)
- feat(mobile): action bottom sheet on map timeline by [@YarosMallorca](https://github.com/YarosMallorca) in [#27515](https://github.com/immich-app/immich/pull/27515)
- feat(server): track video metadata by [@mertalev](https://github.com/mertalev) in [#28023](https://github.com/immich-app/immich/pull/28023)
- feat(enhancement): Navigate stack with up and down arrow keys by [@cratoo](https://github.com/cratoo) in [#27854](https://github.com/immich-app/immich/pull/27854)
- fix(web): migrate people management component to page, enabling tooltips by [@SkyDev125](https://github.com/SkyDev125) in [#26971](https://github.com/immich-app/immich/pull/26971)
- chore(mobile): add box shadow to asset details by [@uhthomas](https://github.com/uhthomas) in [#27510](https://github.com/immich-app/immich/pull/27510)
- feat: hide hidden person from memories by [@sakshamchawla](https://github.com/sakshamchawla) in [#20877](https://github.com/immich-app/immich/pull/20877)
- feat(mobile): increased tap area on video player overlay by [@YarosMallorca](https://github.com/YarosMallorca) in [#27269](https://github.com/immich-app/immich/pull/27269)
- feat(web): Add metadata overlay to slideshow by [@timonrieger](https://github.com/timonrieger) in [#24627](https://github.com/immich-app/immich/pull/24627)
- feat(web): add individual filter removal from search result chips by [@timonrieger](https://github.com/timonrieger) in [#28166](https://github.com/immich-app/immich/pull/28166)
- feat(mobile): trash/restore all by [@YarosMallorca](https://github.com/YarosMallorca) in [#28116](https://github.com/immich-app/immich/pull/28116)
- feat: display more info in asset viewer by [@alextran1502](https://github.com/alextran1502) in [#24630](https://github.com/immich-app/immich/pull/24630)
- feat(server): allow subpaths for machine learning URL by [@gnojus](https://github.com/gnojus) in [#28427](https://github.com/immich-app/immich/pull/28427)
- feat(ui): Shared URL input configuration by [@Lauritz-Tieste](https://github.com/Lauritz-Tieste) in [#27105](https://github.com/immich-app/immich/pull/27105)
- refactor: enhance shared link UI and functionality by [@Lauritz-Tieste](https://github.com/Lauritz-Tieste) in [#26464](https://github.com/immich-app/immich/pull/26464)
- feat: upload and add local asset directly to album by [@alextran1502](https://github.com/alextran1502) in [#28123](https://github.com/immich-app/immich/pull/28123)
- feat: Selectable metadata in duplicates utility with diffing by [@ollioddi](https://github.com/ollioddi) in [#26328](https://github.com/immich-app/immich/pull/26328)
- fix: improve form control focus visibility by [@Caltsic](https://github.com/Caltsic) in [#28512](https://github.com/immich-app/immich/pull/28512)
- feat: command for user pages by [@alextran1502](https://github.com/alextran1502) in [#28554](https://github.com/immich-app/immich/pull/28554)
- refactor: use ControlBar UI Library component by [@bwees](https://github.com/bwees) in [#28567](https://github.com/immich-app/immich/pull/28567)
- feat: workflow template by [@alextran1502](https://github.com/alextran1502) in [#28553](https://github.com/immich-app/immich/pull/28553)
- feat(mobile): improve downloading algorithm for sharing by [@YarosMallorca](https://github.com/YarosMallorca) in [#27312](https://github.com/immich-app/immich/pull/27312)
- feat: search by album name and id by [@jrasm91](https://github.com/jrasm91) in [#28672](https://github.com/immich-app/immich/pull/28672)
- feat: upload local assets to album from bottom sheet by [@alextran1502](https://github.com/alextran1502) in [#28531](https://github.com/immich-app/immich/pull/28531)
- feat: places in context search by [@timonrieger](https://github.com/timonrieger) in [#28768](https://github.com/immich-app/immich/pull/28768)
- feat: minimum face count per user by [@timjonez](https://github.com/timjonez) in [#27452](https://github.com/immich-app/immich/pull/27452)
- feat: show notification and battery optimization warning by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#26610](https://github.com/immich-app/immich/pull/26610)
- feat: workflows drag and drop enhancements by [@danieldietzler](https://github.com/danieldietzler) in [#28764](https://github.com/immich-app/immich/pull/28764)
- feat(mobile): min face count per-user by [@YarosMallorca](https://github.com/YarosMallorca) in [#28805](https://github.com/immich-app/immich/pull/28805)
- refactor(server): allow -1 rating again by [@timonrieger](https://github.com/timonrieger) in [#28886](https://github.com/immich-app/immich/pull/28886)
- feat(web): warn before overwriting existing locations in geolocation utility by [@yoshovski](https://github.com/yoshovski) in [#28840](https://github.com/immich-app/immich/pull/28840)
- feat: warn if microservices worker is missing by [@bo0tzz](https://github.com/bo0tzz) in [#28869](https://github.com/immich-app/immich/pull/28869)
- fix(web): show album names in duplicate review by [@meesfrensel](https://github.com/meesfrensel) in [#29080](https://github.com/immich-app/immich/pull/29080)
- feat: keyboard seeking for new video player by [@danieldietzler](https://github.com/danieldietzler) in [#29208](https://github.com/immich-app/immich/pull/29208)
- feat(web): Add text-white-shadow to elements and increase the shadows effect by [@Vogeluff](https://github.com/Vogeluff) in [#29165](https://github.com/immich-app/immich/pull/29165)
- feat: webhook workflow action by [@benbeckford](https://github.com/benbeckford) in [#29258](https://github.com/immich-app/immich/pull/29258)
- feat: integrity checks admin settings by [@danieldietzler](https://github.com/danieldietzler) in [#29406](https://github.com/immich-app/immich/pull/29406)

##### 🐛 Bug fixes

- fix(web): center images in RTL layouts ([#27678](https://github.com/immich-app/immich/issues/27678)) by [@Nicolas-micuda-becker](https://github.com/Nicolas-micuda-becker) in [#27753](https://github.com/immich-app/immich/pull/27753)
- fix(mobile): add keys for person tiles in search by [@YarosMallorca](https://github.com/YarosMallorca) in [#27689](https://github.com/immich-app/immich/pull/27689)
- fix(web): selection clearing on preview by [@YarosMallorca](https://github.com/YarosMallorca) in [#27702](https://github.com/immich-app/immich/pull/27702)
- fix: asset multi select download shortcut by [@danieldietzler](https://github.com/danieldietzler) in [#27784](https://github.com/immich-app/immich/pull/27784)
- fix(web): add partner photo to album from multiselect by [@YarosMallorca](https://github.com/YarosMallorca) in [#27767](https://github.com/immich-app/immich/pull/27767)
- fix: redirect original by [@danieldietzler](https://github.com/danieldietzler) in [#27759](https://github.com/immich-app/immich/pull/27759)
- fix: make web build stage deterministic by [@bo0tzz](https://github.com/bo0tzz) in [#27823](https://github.com/immich-app/immich/pull/27823)
- fix(web): svelte regression - cancel video preview fetch when bind:this is cleared early by [@midzelis](https://github.com/midzelis) in [#27713](https://github.com/immich-app/immich/pull/27713)
- fix(web): stale adaptive image when original overlays preview by [@midzelis](https://github.com/midzelis) in [#27621](https://github.com/immich-app/immich/pull/27621)
- fix(mobile): readonly redirect when not logged in by [@YarosMallorca](https://github.com/YarosMallorca) in [#27728](https://github.com/immich-app/immich/pull/27728)
- fix(web): close edit faces panel on Escape key press by [@midzelis](https://github.com/midzelis) in [#27519](https://github.com/immich-app/immich/pull/27519)
- fix(oauth): normalize email claim to lowercase and trim before account lookup and registration by [@timdobras](https://github.com/timdobras) in [#26841](https://github.com/immich-app/immich/pull/26841)
- fix(web): use event for zooming out after opening face editor by [@meesfrensel](https://github.com/meesfrensel) in [#27789](https://github.com/immich-app/immich/pull/27789)
- fix: sanitize filenames before adding to zip by [@bo0tzz](https://github.com/bo0tzz) in [#27893](https://github.com/immich-app/immich/pull/27893)
- fix(server): require at least one field to be set when updating memory by [@fredfloydd](https://github.com/fredfloydd) in [#27842](https://github.com/immich-app/immich/pull/27842)
- fix(web): compute hashes for uploads in chunks by [@fredfloydd](https://github.com/fredfloydd) in [#27878](https://github.com/immich-app/immich/pull/27878)
- fix(web): fix stale album page load by [@fredfloydd](https://github.com/fredfloydd) in [#27825](https://github.com/immich-app/immich/pull/27825)
- fix(web): prevent interaction with detail panel behind person side panel by [@midzelis](https://github.com/midzelis) in [#27309](https://github.com/immich-app/immich/pull/27309)
- fix: show neon light by [@alextran1502](https://github.com/alextran1502) in [#27994](https://github.com/immich-app/immich/pull/27994)
- fix(mobile): zero exposure by [@YarosMallorca](https://github.com/YarosMallorca) in [#28017](https://github.com/immich-app/immich/pull/28017)
- fix(mobile): clear local data on forced logout by [@LeLunZ](https://github.com/LeLunZ) in [#27957](https://github.com/immich-app/immich/pull/27957)
- fix(mobile): enable autoplay for motion photos in video viewer by [@LeLunZ](https://github.com/LeLunZ) in [#27961](https://github.com/immich-app/immich/pull/27961)
- fix(mobile): thumbnail transition to asset viewer by [@LeLunZ](https://github.com/LeLunZ) in [#27850](https://github.com/immich-app/immich/pull/27850)
- fix: jump to timeline on new auto\_router update by [@alextran1502](https://github.com/alextran1502) in [#28022](https://github.com/immich-app/immich/pull/28022)
- fix(mobile): delete assets on trash empty, Android by [@PeterOmbodi](https://github.com/PeterOmbodi) in [#26070](https://github.com/immich-app/immich/pull/26070)
- fix(ml): handle empty/corrupt images in face detection by [@yosit](https://github.com/yosit) in [#27391](https://github.com/immich-app/immich/pull/27391)
- fix(web): refresh memories hourly by [@meesfrensel](https://github.com/meesfrensel) in [#28114](https://github.com/immich-app/immich/pull/28114)
- fix(web): large files: better handling of asset deletions by [@meesfrensel](https://github.com/meesfrensel) in [#28117](https://github.com/immich-app/immich/pull/28117)
- fix(web): double video playback on map timeline by [@YarosMallorca](https://github.com/YarosMallorca) in [#28090](https://github.com/immich-app/immich/pull/28090)
- fix(mobile): suppress asset stack UI in trash timeline by [@PeterOmbodi](https://github.com/PeterOmbodi) in [#26536](https://github.com/immich-app/immich/pull/26536)
- fix(web): timeline scroll when pressing back from stacked asset by [@Snowknight26](https://github.com/Snowknight26) in [#28163](https://github.com/immich-app/immich/pull/28163)
- fix(server): selectively apply metadata bitstream filter for video thumbnails by [@pinhao](https://github.com/pinhao) in [#28162](https://github.com/immich-app/immich/pull/28162)
- fix(web): fix shared link /s/photos.\* navigation after password login by [@meesfrensel](https://github.com/meesfrensel) in [#27788](https://github.com/immich-app/immich/pull/27788)
- fix(ml): respect time zone for logs in cuda container by [@AyaanMAG](https://github.com/AyaanMAG) in [#28155](https://github.com/immich-app/immich/pull/28155)
- fix: librknnrt permissions in machine-learning by [@DavidTheFighter](https://github.com/DavidTheFighter) in [#28216](https://github.com/immich-app/immich/pull/28216)
- fix(server): validate duplicate group ownership before dismissal by [@timonrieger](https://github.com/timonrieger) in [#28221](https://github.com/immich-app/immich/pull/28221)
- fix(web): correct timeline yesterday label across month boundaries by [@michelheusschen](https://github.com/michelheusschen) in [#28183](https://github.com/immich-app/immich/pull/28183)
- fix(mobile): show lens info without lens name by [@benbeckford](https://github.com/benbeckford) in [#28234](https://github.com/immich-app/immich/pull/28234)
- fix: stale person name after merge by [@danieldietzler](https://github.com/danieldietzler) in [#28222](https://github.com/immich-app/immich/pull/28222)
- fix(web): shared album avatars opening modal by [@meesfrensel](https://github.com/meesfrensel) in [#26719](https://github.com/immich-app/immich/pull/26719)
- fix(mobile): prevent asset loading issues when changing page or when closing memories by [@LeLunZ](https://github.com/LeLunZ) in [#27596](https://github.com/immich-app/immich/pull/27596)
- fix(mobile): correct filter default and UI desync in similar photos search by [@TheBestX11](https://github.com/TheBestX11) in [#27516](https://github.com/immich-app/immich/pull/27516)
- fix(server): hide isFavorite from partner asset sync stream by [@timonrieger](https://github.com/timonrieger) in [#28035](https://github.com/immich-app/immich/pull/28035)
- fix(mobile): restore notification plugin init by [@santoshakil](https://github.com/santoshakil) in [#28284](https://github.com/immich-app/immich/pull/28284)
- fix(mobile): mounted check before setState in album sync action by [@santoshakil](https://github.com/santoshakil) in [#28300](https://github.com/immich-app/immich/pull/28300)
- fix(mobile): avoid duplicate assets in album view by [@stfn42](https://github.com/stfn42) in [#28152](https://github.com/immich-app/immich/pull/28152)
- fix(mobile): Deduplicate assets in person view timeline by [@thowdev](https://github.com/thowdev) in [#26723](https://github.com/immich-app/immich/pull/26723)
- fix(deployment): remove unneeded volume by [@mmomjian](https://github.com/mmomjian) in [#28307](https://github.com/immich-app/immich/pull/28307)
- fix: mobile upload duration type by [@alextran1502](https://github.com/alextran1502) in [#28362](https://github.com/immich-app/immich/pull/28362)
- fix: deep link for assets when asset viewer already open by [@bwees](https://github.com/bwees) in [#27971](https://github.com/immich-app/immich/pull/27971)
- fix: kekab icon colors in light mode by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#28366](https://github.com/immich-app/immich/pull/28366)
- fix: indexes on remote\_asset\_entity by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#28264](https://github.com/immich-app/immich/pull/28264)
- fix(mobile): clear linkedRemoteAlbumId in reset() so FK refs dont dangle by [@santoshakil](https://github.com/santoshakil) in [#28382](https://github.com/immich-app/immich/pull/28382)
- fix: ignore icc profile make and model by [@jrasm91](https://github.com/jrasm91) in [#28412](https://github.com/immich-app/immich/pull/28412)
- fix(mobile): don't block app open on slow validateAccessToken by [@santoshakil](https://github.com/santoshakil) in [#28405](https://github.com/immich-app/immich/pull/28405)
- fix(mobile): add restore option to trashed assets by [@inesiscosta](https://github.com/inesiscosta) in [#27442](https://github.com/immich-app/immich/pull/27442)
- fix(mobile): use correct delete action by [@ByteSizedMarius](https://github.com/ByteSizedMarius) in [#26575](https://github.com/immich-app/immich/pull/26575)
- fix(server): dedupe database backup jobs by [@rdeaton](https://github.com/rdeaton) in [#28341](https://github.com/immich-app/immich/pull/28341)
- fix(mobile): cronet buffer overflow on compressed thumbnails by [@santoshakil](https://github.com/santoshakil) in [#28439](https://github.com/immich-app/immich/pull/28439)
- fix(mobile): cronet thumbnail buffer overflow regression from [#28439](https://github.com/immich-app/immich/issues/28439) by [@santoshakil](https://github.com/santoshakil) in [#28450](https://github.com/immich-app/immich/pull/28450)
- fix(mobile): mounted check in ThumbnailTile hero flight listener by [@santoshakil](https://github.com/santoshakil) in [#28451](https://github.com/immich-app/immich/pull/28451)
- fix(mobile): don't force-unwrap nil localizedTitle in ios getAlbums by [@santoshakil](https://github.com/santoshakil) in [#28452](https://github.com/immich-app/immich/pull/28452)
- fix(web): work around Chrome HDR image seam lines during zoom by [@midzelis](https://github.com/midzelis) in [#27715](https://github.com/immich-app/immich/pull/27715)
- fix(ios): respect status bar scroll to top in timeline views by [@agg23](https://github.com/agg23) in [#28469](https://github.com/immich-app/immich/pull/28469)
- fix(mobile): asset viewer stuck on spinner after rotation by [@LeLunZ](https://github.com/LeLunZ) in [#28019](https://github.com/immich-app/immich/pull/28019)
- fix(web): timeline stuttering with many assets in 1 day by [@benbeckford](https://github.com/benbeckford) in [#28509](https://github.com/immich-app/immich/pull/28509)
- fix(mobile): preserve zoom level during image loading and live photo playback by [@LeLunZ](https://github.com/LeLunZ) in [#27960](https://github.com/immich-app/immich/pull/27960)
- fix(ml): stabilize MIGraphX inference by [@fabianwimberger](https://github.com/fabianwimberger) in [#28444](https://github.com/immich-app/immich/pull/28444)
- fix: await sync asset v2 by [@bwees](https://github.com/bwees) in [#28569](https://github.com/immich-app/immich/pull/28569)
- fix: strip metadata from timeline responses for shared links without exif sharing by [@danieldietzler](https://github.com/danieldietzler) in [#28644](https://github.com/immich-app/immich/pull/28644)
- fix: Refresh local album overview page after asset deletion by [@Lauritz-Tieste](https://github.com/Lauritz-Tieste) in [#28586](https://github.com/immich-app/immich/pull/28586)
- fix(server): prevent locked assets from leaking to partners by [@timonrieger](https://github.com/timonrieger) in [#28652](https://github.com/immich-app/immich/pull/28652)
- refactor(web): replace per-asset viewport proximity with day-tier active indices by [@midzelis](https://github.com/midzelis) in [#28597](https://github.com/immich-app/immich/pull/28597)
- fix: timeline scroll flicker by [@alextran1502](https://github.com/alextran1502) in [#28653](https://github.com/immich-app/immich/pull/28653)
- fix: api repositories using stale endpoint by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#28667](https://github.com/immich-app/immich/pull/28667)
- fix: disallow cross origin/non http protocols for continueUrl on login by [@bwees](https://github.com/bwees) in [#28706](https://github.com/immich-app/immich/pull/28706)
- fix(web): skip thumbhash fade for offscreen thumbnails by [@midzelis](https://github.com/midzelis) in [#27335](https://github.com/immich-app/immich/pull/27335)
- fix(web): prevent partner assets from being selected in geolocation utility by [@okxint](https://github.com/okxint) in [#28737](https://github.com/immich-app/immich/pull/28737)
- fix(mobile): invisible ink splashes in asset sheet by [@timonrieger](https://github.com/timonrieger) in [#28756](https://github.com/immich-app/immich/pull/28756)
- fix!: unauthorized face creation by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#28561](https://github.com/immich-app/immich/pull/28561)
- fix(mobile): proper background task cleanup by [@mertalev](https://github.com/mertalev) in [#28694](https://github.com/immich-app/immich/pull/28694)
- fix(cli): prevent out-of-memory on file upload due to undici storing the request body by [@moversity](https://github.com/moversity) in [#28723](https://github.com/immich-app/immich/pull/28723)
- fix: error log on aborted uploads by [@jrasm91](https://github.com/jrasm91) in [#28806](https://github.com/immich-app/immich/pull/28806)
- fix(server): respect timezone in iso date string encoding by [@timonrieger](https://github.com/timonrieger) in [#28810](https://github.com/immich-app/immich/pull/28810)
- test: fix tests when OpenVINO provider is available by [@nekowinston](https://github.com/nekowinston) in [#28802](https://github.com/immich-app/immich/pull/28802)
- fix(mobile): run iOS bg task phases in parallel by [@santoshakil](https://github.com/santoshakil) in [#28293](https://github.com/immich-app/immich/pull/28293)
- fix: error handling by [@jrasm91](https://github.com/jrasm91) in [#28843](https://github.com/immich-app/immich/pull/28843)
- fix: cross isolate drift watchers by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#28862](https://github.com/immich-app/immich/pull/28862)
- fix: reload timeline on group by setting change by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#28864](https://github.com/immich-app/immich/pull/28864)
- fix(web): use irot/imir tags for HEIF Orientation by [@joojoooo](https://github.com/joojoooo) in [#27820](https://github.com/immich-app/immich/pull/27820)
- fix: detail panel faces reactivity issues by [@danieldietzler](https://github.com/danieldietzler) in [#28910](https://github.com/immich-app/immich/pull/28910)
- fix(server): hide isFavorite from album asset sync stream by [@timonrieger](https://github.com/timonrieger) in [#28923](https://github.com/immich-app/immich/pull/28923)
- fix(mobile): show memory and folder dates in local time by [@santoshakil](https://github.com/santoshakil) in [#28941](https://github.com/immich-app/immich/pull/28941)
- fix(mobile): show error when creating an album fails by [@santoshakil](https://github.com/santoshakil) in [#28942](https://github.com/immich-app/immich/pull/28942)
- fix(mobile): add album picker to archive bottom sheet by [@santoshakil](https://github.com/santoshakil) in [#28953](https://github.com/immich-app/immich/pull/28953)
- fix: normalize diacritics in person name search in Web & Mobile by [@pedrovieira](https://github.com/pedrovieira) in [#28887](https://github.com/immich-app/immich/pull/28887)
- fix(web): Prevent face editor from closing when dismissing tag confirmation by [@pedrovieira](https://github.com/pedrovieira) in [#28900](https://github.com/immich-app/immich/pull/28900)
- fix(mobile): map timeline layout crash by [@YarosMallorca](https://github.com/YarosMallorca) in [#28878](https://github.com/immich-app/immich/pull/28878)
- fix(mobile): deduplicate people in asset details panel by [@santoshakil](https://github.com/santoshakil) in [#28972](https://github.com/immich-app/immich/pull/28972)
- fix(mobile): keep timezone when editing asset date time by [@santoshakil](https://github.com/santoshakil) in [#28978](https://github.com/immich-app/immich/pull/28978)
- fix(mobile): stale details after editing asset date by [@santoshakil](https://github.com/santoshakil) in [#28977](https://github.com/immich-app/immich/pull/28977)
- fix(mobile): show albums whose assets are all trashed by [@santoshakil](https://github.com/santoshakil) in [#28985](https://github.com/immich-app/immich/pull/28985)
- fix(mobile): give android notification channels proper names by [@santoshakil](https://github.com/santoshakil) in [#28986](https://github.com/immich-app/immich/pull/28986)
- fix: Improving scroll behavior on image stacks that overflow the screen by [@BlankCanvasStudio](https://github.com/BlankCanvasStudio) in [#28885](https://github.com/immich-app/immich/pull/28885)
- fix(web): focus on scrollable element on load by [@timonrieger](https://github.com/timonrieger) in [#29004](https://github.com/immich-app/immich/pull/29004)
- fix(mobile): show like and comment options on album photo deep links by [@santoshakil](https://github.com/santoshakil) in [#29020](https://github.com/immich-app/immich/pull/29020)
- fix(web): correctly handle person search with more than 100 results by [@maxinegardenas](https://github.com/maxinegardenas) in [#29002](https://github.com/immich-app/immich/pull/29002)
- fix(web): prevent upload status panel from overlapping album action bar by [@okxint](https://github.com/okxint) in [#29044](https://github.com/immich-app/immich/pull/29044)
- fix(web): error loading image state by [@bwees](https://github.com/bwees) in [#29058](https://github.com/immich-app/immich/pull/29058)
- fix(web): show asset arrows by [@timonrieger](https://github.com/timonrieger) in [#29010](https://github.com/immich-app/immich/pull/29010)
- fix(server): hide partner archived asset locations from map by [@timonrieger](https://github.com/timonrieger) in [#29028](https://github.com/immich-app/immich/pull/29028)
- fix: lock transcoding options by [@timonrieger](https://github.com/timonrieger) in [#29076](https://github.com/immich-app/immich/pull/29076)
- fix(server): do not merge metadata when multiple duplicates are kept by [@timonrieger](https://github.com/timonrieger) in [#29035](https://github.com/immich-app/immich/pull/29035)
- fix: integrity report checksum query by [@danieldietzler](https://github.com/danieldietzler) in [#29136](https://github.com/immich-app/immich/pull/29136)
- fix: map settings by [@danieldietzler](https://github.com/danieldietzler) in [#29134](https://github.com/immich-app/immich/pull/29134)
- fix: too strict cron expression validation by [@danieldietzler](https://github.com/danieldietzler) in [#29138](https://github.com/immich-app/immich/pull/29138)
- fix(web): respect local timezone when building date range for search by [@okxint](https://github.com/okxint) in [#29128](https://github.com/immich-app/immich/pull/29128)
- fix(web): language selector by [@meesfrensel](https://github.com/meesfrensel) in [#29065](https://github.com/immich-app/immich/pull/29065)
- fix: update datetimeRelative description to minutes instead of seconds by [@meesfrensel](https://github.com/meesfrensel) in [#29137](https://github.com/immich-app/immich/pull/29137)
- fix: video thumbnail quality sharing by [@bwees](https://github.com/bwees) in [#29104](https://github.com/immich-app/immich/pull/29104)
- fix(mobile): stop sync albums crashing on the main isolate by [@santoshakil](https://github.com/santoshakil) in [#29133](https://github.com/immich-app/immich/pull/29133)
- fix(mobile): show memories with no showAt/hideAt in the timeline lane by [@santoshakil](https://github.com/santoshakil) in [#29158](https://github.com/immich-app/immich/pull/29158)
- fix(mobile): keep toasts off the dynamic island when keyboard is open by [@santoshakil](https://github.com/santoshakil) in [#29159](https://github.com/immich-app/immich/pull/29159)
- fix(server): skip existing users when sharing albums by [@jeevan6996](https://github.com/jeevan6996) in [#28884](https://github.com/immich-app/immich/pull/28884)
- fix: web i18n by [@danieldietzler](https://github.com/danieldietzler) in [#29175](https://github.com/immich-app/immich/pull/29175)
- fix(web): shift+click on GPS asset extends range selection in geolocation utility by [@timonrieger](https://github.com/timonrieger) in [#29022](https://github.com/immich-app/immich/pull/29022)
- fix(server): allow non-utc datetime offsets by [@timonrieger](https://github.com/timonrieger) in [#29186](https://github.com/immich-app/immich/pull/29186)
- fix: remove local-only step ids from workflow json by [@danieldietzler](https://github.com/danieldietzler) in [#29188](https://github.com/immich-app/immich/pull/29188)
- fix: asset type filter by [@danieldietzler](https://github.com/danieldietzler) in [#29190](https://github.com/immich-app/immich/pull/29190)
- fix(mobile): prevent duplicate login pages for unauthenticated share intent warm start by [@olildu](https://github.com/olildu) in [#29054](https://github.com/immich-app/immich/pull/29054)
- fix(mobile): refresh memories on resume and day change by [@santoshakil](https://github.com/santoshakil) in [#28983](https://github.com/immich-app/immich/pull/28983)
- fix(mobile): re-lock locked folder when the app is backgrounded by [@santoshakil](https://github.com/santoshakil) in [#29089](https://github.com/immich-app/immich/pull/29089)
- fix(mobile): endless spinner on album selection when device has no albums by [@santoshakil](https://github.com/santoshakil) in [#28994](https://github.com/immich-app/immich/pull/28994)
- fix: rc version check by [@danieldietzler](https://github.com/danieldietzler) in [#29194](https://github.com/immich-app/immich/pull/29194)
- fix: detail panel people reactivity and iterator consumption by [@danieldietzler](https://github.com/danieldietzler) in [#29250](https://github.com/immich-app/immich/pull/29250)
- fix(server): use VBR for QSV so the max bitrate is respected by [@aclerici38](https://github.com/aclerici38) in [#29240](https://github.com/immich-app/immich/pull/29240)
- fix: ignore external libraries for integrity report checksum check by [@danieldietzler](https://github.com/danieldietzler) in [#29248](https://github.com/immich-app/immich/pull/29248)
- fix(web): remove map's fullscreen button by [@meesfrensel](https://github.com/meesfrensel) in [#29192](https://github.com/immich-app/immich/pull/29192)
- refactor: use SemVer classes for version compatability message by [@bwees](https://github.com/bwees) in [#29056](https://github.com/immich-app/immich/pull/29056)
- fix: sync backfill by [@jrasm91](https://github.com/jrasm91) in [#29267](https://github.com/immich-app/immich/pull/29267)
- fix(mobile): force AssetViewerPage recreation on repeated view intents by [@okxint](https://github.com/okxint) in [#29235](https://github.com/immich-app/immich/pull/29235)
- fix(mobile): blank notifications page after enabling notifications by [@santoshakil](https://github.com/santoshakil) in [#29232](https://github.com/immich-app/immich/pull/29232)
- fix(mobile): app doesn't exit full-screen mode by [@YarosMallorca](https://github.com/YarosMallorca) in [#29301](https://github.com/immich-app/immich/pull/29301)
- fix(mobile): only toggle backup from the switch, not the whole row by [@santoshakil](https://github.com/santoshakil) in [#29236](https://github.com/immich-app/immich/pull/29236)
- fix(mobile): hide video thumbnail when video is ready by [@santoshakil](https://github.com/santoshakil) in [#29012](https://github.com/immich-app/immich/pull/29012)
- fix(mobile): apply exif orientation to android raw photos by [@santoshakil](https://github.com/santoshakil) in [#29337](https://github.com/immich-app/immich/pull/29337)
- fix(server): face region coordinates parsing by [@djbravo06](https://github.com/djbravo06) in [#29333](https://github.com/immich-app/immich/pull/29333)
- feat: honor album access permissions in search endpoints by [@danieldietzler](https://github.com/danieldietzler) in [#29352](https://github.com/immich-app/immich/pull/29352)
- fix: version compatability check by [@bwees](https://github.com/bwees) in [#29405](https://github.com/immich-app/immich/pull/29405)

##### 📚 Documentation

- fix(docs): instructions on how to use local immich ui by [@YarosMallorca](https://github.com/YarosMallorca) in [#27813](https://github.com/immich-app/immich/pull/27813)
- fix(docs): helmet file affected containers  by [@mmomjian](https://github.com/mmomjian) in [#27939](https://github.com/immich-app/immich/pull/27939)
- fix(docs): Update Tailscale free tier user and device limits by [@Hakuin123](https://github.com/Hakuin123) in [#28151](https://github.com/immich-app/immich/pull/28151)
- docs: update rocm installation instructions by [@aigarius](https://github.com/aigarius) in [#25434](https://github.com/immich-app/immich/pull/25434)
- fix(docs): document `upgrade-insecure-requests` default by [@meesfrensel](https://github.com/meesfrensel) in [#28279](https://github.com/immich-app/immich/pull/28279)
- fix(docs): missing colon in config file doc by [@SuperSandro2000](https://github.com/SuperSandro2000) in [#28313](https://github.com/immich-app/immich/pull/28313)
- fix: update server-commands subcommand list by [@bo0tzz](https://github.com/bo0tzz) in [#28402](https://github.com/immich-app/immich/pull/28402)
- feat(docs): add fixed subnet guide for Synology to prevent firewall issues by [@racehd](https://github.com/racehd) in [#26554](https://github.com/immich-app/immich/pull/26554)
- chore(docs): update FAQ with profile picture change instructions by [@tvangemert](https://github.com/tvangemert) in [#28634](https://github.com/immich-app/immich/pull/28634)
- chore: update documentation to use mise commands by [@timonrieger](https://github.com/timonrieger) in [#28515](https://github.com/immich-app/immich/pull/28515)
- fix(docs): v3 bumps by [@mmomjian](https://github.com/mmomjian) in [#29007](https://github.com/immich-app/immich/pull/29007)
- docs(server): clarify AssetBulkUploadCheckItem.id is a correlation token by [@timonrieger](https://github.com/timonrieger) in [#29141](https://github.com/immich-app/immich/pull/29141)
- docs(mobile-app): add Play App Signing certificate hash by [@tlvince](https://github.…
renovate Bot added a commit to sdwilsh/ansible-playbooks that referenced this pull request Jul 15, 2026
##### [\`v3.0.3\`](https://github.com/immich-app/immich/releases/tag/v3.0.3)

### v3.0.3

- various bug fixes
- we push to our own F-Droid repo at <https://app.futo.org/fdroid/repo> now. If you're using F-Droid, please pull the application from there from now on
- fixes an issue where LivePhotos upload from the background isn't showing up.

> \[!Note]
> In some specific circumstances, newly uploaded Live Photos could have broken thumbnails. If you see any such cases, please run the "missing" job for thumbnails or wait for the respective nightly job to clear it up.

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

#### What's Changed

##### 🚀 Features

- feat: publish app releases to FUTO F-Droid repo by [@bo0tzz](https://github.com/bo0tzz) in [#29804](https://github.com/immich-app/immich/pull/29804)

##### 🐛 Bug fixes

- fix(web): closing plugin method picker selects "unknown" method by [@benbeckford](https://github.com/benbeckford) in [#29784](https://github.com/immich-app/immich/pull/29784)
- fix: unauthorized album owner update by [@danieldietzler](https://github.com/danieldietzler) in [#29883](https://github.com/immich-app/immich/pull/29883)
- fix: still part of live photo hidden on bg upload by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#29884](https://github.com/immich-app/immich/pull/29884)
- fix: system appbar icon color has incorrect color in asset viewer by [@alextran1502](https://github.com/alextran1502) in [#29885](https://github.com/immich-app/immich/pull/29885)
- fix: locked visibility in search random endpoint by [@danieldietzler](https://github.com/danieldietzler) in [#29887](https://github.com/immich-app/immich/pull/29887)
- fix(mobile): send a full datetime from the android memories widget by [@santoshakil](https://github.com/santoshakil) in [#29689](https://github.com/immich-app/immich/pull/29689)
- fix: memory search date validation by [@danieldietzler](https://github.com/danieldietzler) in [#29907](https://github.com/immich-app/immich/pull/29907)
- fix(server): set hvc1 tag when using hwa by [@mertalev](https://github.com/mertalev) in [#29908](https://github.com/immich-app/immich/pull/29908)
- fix(mobile): clear zoom state when swapping assets by [@agg23](https://github.com/agg23) in [#29909](https://github.com/immich-app/immich/pull/29909)
- fix: Ken Burns effect on sliver app bar jittery on Android by [@alextran1502](https://github.com/alextran1502) in [#29890](https://github.com/immich-app/immich/pull/29890)

##### 📚 Documentation

- fix(docs): update fdroid link  by [@mmomjian](https://github.com/mmomjian) in [#29797](https://github.com/immich-app/immich/pull/29797)
- feat: system integrity docs by [@danieldietzler](https://github.com/danieldietzler) in [#29911](https://github.com/immich-app/immich/pull/29911)

##### 🌐 Translations

- chore(web): update translations by [@weblate](https://github.com/weblate) in [#29774](https://github.com/immich-app/immich/pull/29774)
- fix(mobile): correct person age singular pluralization by [@tech00exploere](https://github.com/tech00exploere) in [#29868](https://github.com/immich-app/immich/pull/29868)

#### New Contributors

- [@tech00exploere](https://github.com/tech00exploere) made their first contribution in [#29868](https://github.com/immich-app/immich/pull/29868)

**Full Changelog**: <https://github.com/immich-app/immich/compare/v3.0.2...v3.0.3>

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

##### v3.0.2

This patch release addresses various bugs from v3 release and adds an additional filter to workflows

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

##### What's Changed

##### 🌟 Enhancements

- fix(web): add ARIA label to ServerStatisticsCard by [@tjhorner](https://github.com/tjhorner) in [#29497](https://github.com/immich-app/immich/pull/29497)
- feat(server): hls variant configuration by [@mertalev](https://github.com/mertalev) in [#29613](https://github.com/immich-app/immich/pull/29613)
- feat: user agnostic database restore by [@danieldietzler](https://github.com/danieldietzler) in [#29512](https://github.com/immich-app/immich/pull/29512)
- feat(server): date workflow filter by [@benbeckford](https://github.com/benbeckford) in [#29040](https://github.com/immich-app/immich/pull/29040)

##### 🐛 Bug fixes

- fix: re-add gCastEnabled negation by [@bo0tzz](https://github.com/bo0tzz) in [#29499](https://github.com/immich-app/immich/pull/29499)
- fix: downmix audio to stereo to fix broken channel layout by [@lukasdotcom](https://github.com/lukasdotcom) in [#29485](https://github.com/immich-app/immich/pull/29485)
- fix: live transcoding when viewing from a link share by [@lukasdotcom](https://github.com/lukasdotcom) in [#29471](https://github.com/immich-app/immich/pull/29471)
- fix: web search timeline visibility by [@danieldietzler](https://github.com/danieldietzler) in [#29518](https://github.com/immich-app/immich/pull/29518)
- fix(web): missing i18n strings by [@wonsukchoi](https://github.com/wonsukchoi) in [#29612](https://github.com/immich-app/immich/pull/29612)
- fix: chinese browser locales recognition by [@danieldietzler](https://github.com/danieldietzler) in [#29622](https://github.com/immich-app/immich/pull/29622)
- chore: improve added to album messages by [@danieldietzler](https://github.com/danieldietzler) in [#29641](https://github.com/immich-app/immich/pull/29641)
- fix(mobile): fix 10-bit heic and avif colors on android by [@santoshakil](https://github.com/santoshakil) in [#29631](https://github.com/immich-app/immich/pull/29631)
- fix(mobile): match iOS scroll to top and tabbar scroll ([#28469](https://github.com/immich-app/immich/issues/28469)) by [@agg23](https://github.com/agg23) in [#29705](https://github.com/immich-app/immich/pull/29705)
- fix: wrap migrations in transaction by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#29664](https://github.com/immich-app/immich/pull/29664)
- fix: oauth account linking by [@danieldietzler](https://github.com/danieldietzler) in [#29624](https://github.com/immich-app/immich/pull/29624)
- fix: incorrect grouping of recently added assets by [@benbeckford](https://github.com/benbeckford) in [#29666](https://github.com/immich-app/immich/pull/29666)
- fix: integrity checks checksum pagination by [@danieldietzler](https://github.com/danieldietzler) in [#29516](https://github.com/immich-app/immich/pull/29516)
- fix(mobile): missing crop options and rotation scaling by [@bwees](https://github.com/bwees) in [#29645](https://github.com/immich-app/immich/pull/29645)
- fix(mobile): properly handle live photos locally by [@agg23](https://github.com/agg23) in [#29462](https://github.com/immich-app/immich/pull/29462)
- fix: integrity checks dto validation by [@danieldietzler](https://github.com/danieldietzler) in [#29621](https://github.com/immich-app/immich/pull/29621)
- fix(mobile): http request handling after isolate death by [@mertalev](https://github.com/mertalev) in [#29714](https://github.com/immich-app/immich/pull/29714)
- fix: do not log out on automatic url switch by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#29715](https://github.com/immich-app/immich/pull/29715)
- fix(server): stream ffprobe packets by [@mertalev](https://github.com/mertalev) in [#29723](https://github.com/immich-app/immich/pull/29723)
- fix: search metadata for album shared links by [@danieldietzler](https://github.com/danieldietzler) in [#29742](https://github.com/immich-app/immich/pull/29742)
- fix(web): clear asset selection when search context changes by [@khanguyen74](https://github.com/khanguyen74) in [#29738](https://github.com/immich-app/immich/pull/29738)
- fix(mobile): update timeline args on layout constraint changes by [@santoshakil](https://github.com/santoshakil) in [#29653](https://github.com/immich-app/immich/pull/29653)
- fix: iso date parsing for three digit years by [@danieldietzler](https://github.com/danieldietzler) in [#29739](https://github.com/immich-app/immich/pull/29739)
- fix: missing files integrity checks by [@danieldietzler](https://github.com/danieldietzler) in [#29737](https://github.com/immich-app/immich/pull/29737)
- fix(mobile): play videos from search results and folder view by [@santoshakil](https://github.com/santoshakil) in [#29693](https://github.com/immich-app/immich/pull/29693)
- fix(web): recursively unnest class arrays by [@meesfrensel](https://github.com/meesfrensel) in [#29755](https://github.com/immich-app/immich/pull/29755)
- fix: emit album update event when uploading assets through shared link by [@danieldietzler](https://github.com/danieldietzler) in [#29757](https://github.com/immich-app/immich/pull/29757)
- fix(web): always initialize language manager to set lang and dir by [@meesfrensel](https://github.com/meesfrensel) in [#29696](https://github.com/immich-app/immich/pull/29696)

##### 📚 Documentation

- chore: update docs with v3 tags by [@alextran1502](https://github.com/alextran1502) in [#29312](https://github.com/immich-app/immich/pull/29312)
- fix(docs): use correct heading name for DB dump by [@track0x1](https://github.com/track0x1) in [#29483](https://github.com/immich-app/immich/pull/29483)
- feat(docs): add Malayalam language support in README files by [@jinskjoy](https://github.com/jinskjoy) in [#29593](https://github.com/immich-app/immich/pull/29593)
- fix(docs): clarify version policy by [@mmomjian](https://github.com/mmomjian) in [#29654](https://github.com/immich-app/immich/pull/29654)

##### 🌐 Translations

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

##### New Contributors

- [@tjhorner](https://github.com/tjhorner) made their first contribution in [#29497](https://github.com/immich-app/immich/pull/29497)
- [@wonsukchoi](https://github.com/wonsukchoi) made their first contribution in [#29612](https://github.com/immich-app/immich/pull/29612)
- [@track0x1](https://github.com/track0x1) made their first contribution in [#29483](https://github.com/immich-app/immich/pull/29483)
- [@jinskjoy](https://github.com/jinskjoy) made their first contribution in [#29593](https://github.com/immich-app/immich/pull/29593)
- [@khanguyen74](https://github.com/khanguyen74) made their first contribution in [#29738](https://github.com/immich-app/immich/pull/29738)

**Full Changelog**: <https://github.com/immich-app/immich/compare/v3.0.1...v3.0.2>

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

##### v3.0.1

- Fixes a bug that causes albums don't show up in the mobile app

##### What's Changed

##### 🚀 Features

- feat(web): recently added link in sidebar by [@benbeckford](https://github.com/benbeckford) in [#29039](https://github.com/immich-app/immich/pull/29039)

##### 🐛 Bug fixes

- fix: albums broken on v2 mobile clients by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#29446](https://github.com/immich-app/immich/pull/29446)
- fix: setting input field description spacing for description snippet by [@danieldietzler](https://github.com/danieldietzler) in [#29433](https://github.com/immich-app/immich/pull/29433)

##### 🌐 Translations

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

**Full Changelog**: <https://github.com/immich-app/immich/compare/v3.0.0...v3.0.1>

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

##### v3.0.0

Welcome to Immich `v3.0.0`!

After months of hard work from the team and our amazing contributors, we're thrilled to announce the next major version of Immich: `v3.0.0`!  🎉

##### Breaking changes

This release includes several breaking changes; read the full migration guide [here](https://immich.app/blog/v3-migration). *It's worth mentioning that many of the breaking changes are updates to API endpoints and affect only **third-party tools** that integrate with Immich's API*. For the vast majority of users, updating works exactly as it always has.

##### How to update

> \[!WARNING]
> `v3.0.0` drops support for pgvecto.rs. If you run Immich before `v1.133.0` and haven't done the migration step yet, see the migration guide here. <https://docs.immich.app/install/upgrading/#migrating-to-vectorchord>

First, update the `IMMICH_VERSION` in your `.env` file to `v3`:

```diff
- IMMICH_VERSION=v2
+ IMMICH_VERSION=v3
```

Then run the usual update commands:

```bash
docker compose pull && docker compose up -d
```

##### Release candidates

If you missed it, `v3.0.0` was the first time we used release candidates, also known as prereleases. Release candidates are tested but not yet official releases of Immich, and they allow us to find and fix any outstanding bugs before a final release. If you would like to be notified about release candidates directly through Immich, you can change the release channel from "Stable" to "Release candidate" in the `Admin settings > Version check` options ([here](https://my.immich.app/admin/system-settings?isOpen=version-check)).

<img alt="New release channel option in version check settings" src="https://github.com/user-attachments/assets/fc8f6008-d486-4915-ad1b-feaddb856315" />
##### New Merch

As part of this release, we're happy to announce we also have some new swag for you!

- Kids clothing: For those who are likely the reason for your Immich library's size
- Colored embroidery: We now have clothes with a full color embroidered Immich logo

<a href="https://immich.store/collections/immich-3-0">
<img width="1200" alt="immich-store (1)" src="https://github.com/user-attachments/assets/ce114e7b-1424-4eca-975d-b23debadb32b" />
</a>

Check it out now at [https://immich.store](https://immich.store/collections/immich-3-0)!

##### Highlights

Now, let's get right into all the new features in this release:

- Mobile non-destructive editing
- Workflows (preview)
- Background backup improvement
- Recently added page
- Integrity checks
- Slideshow on mobile app
- HLS and real-time video transcoding (preview)
- New video player for web
- Open photo in Immich as gallery on Android
- OCR on mobile app
- Upload asset directly to album on the mobile app
- Option to select image size when sharing on the mobile app
- Timeline performance improvement for browsing a large amount of assets in a single month

##### Mobile non-destructive editing

<p align="center">
<img width="300" alt="image" src="https://github.com/user-attachments/assets/e9ddf97c-a4f8-42c1-9910-49ef3c8d4b0a" />
</p>

This is a follow-up to Image Editing on the web, which was released in `v2.5.0`. This feature allows you to make non-destructive edits to your photos inside of Immich. Until now, the mobile editor used a completely different system that created new assets instead of editing the photo in place.

With this update, we bring a new, easier-to-use editor to mobile devices that has the same features as the web version. You can now edit photos directly in the mobile app, including cropping, rotating, and adjusting your images without ever touching the original file. Similar to the web, edits are non-destructive, so you can revisit or revert them at any time. You can even make edits on mobile and then adjust them on the web later!

Some features from the previous mobile editing implementation have been removed including:

- Recoloring photos
- Editing live photos
- Editing local assets

We have plans to bring some of these capabilities back in future releases.

##### Workflows (preview)

The first preview of Workflows is here! Workflows let you automate actions in your library by chaining triggers, filters, and actions together with a drag-and-drop builder. This is the foundation for many exciting automations to come, and we'd love your feedback as we continue building on it.

You can access the feature from [Utilities > Workflows](https://my.immich.app/workflows) on the web.

<img width="800"  alt="Workflows link on the utilities page" src="https://github.com/user-attachments/assets/db7e139e-89b0-481a-9a66-530a40dc175a" />

From there, you can either create a new blank workflow or browse the premade templates to get a basic understanding of how workflows can be used.

<p align="center">
<img width="400" alt="image" src="https://github.com/user-attachments/assets/23fdb017-e439-4221-9be8-a14bd690fa9b" />
</p>
##### Workflows editor

<img alt="Workflow editor with an example workflow" src="https://github.com/user-attachments/assets/c6a569de-d884-4bdb-8bb0-0ff2c805bfb9" />

In the workflows editor, you can switch between the Visual or JSON editor. The visual editor is nice for building out the workflow; the JSON editor is nice for sharing and receiving workflow content from others.

In each workflow, there is a ***trigger*** and a sequence of ***steps.***

- Trigger: this is the entry point of each workflow; when the trigger occurs, the steps are evaluated.
- Steps: they include Filters (conditions) and Actions (effects); they can be combined to produce the desired effect of the use case you aim for.

<p align="center">
<img width="400" alt="List of available workflow steps" src="https://github.com/user-attachments/assets/50e89454-2bf9-4d41-bfa6-fd54f8944ea3" />
</p>
##### Sharing a workflow

You can share the workflow you made with others in two ways: text and JSON. Text is nice for sharing on a forum or for show-and-tell content. JSON is nice for others to make an exact copy of your workflow's configuration.

You can copy the text in the workflows summary panel on the lower right of the screen

<p align="center">
<img width="400"  alt="workflow summary in text" src="https://github.com/user-attachments/assets/dda24c88-f403-4189-a57b-71f6da3816e7" />
</p>

You can share the JSON content from the copy workflows button in the app bar, switch to the JSON editor, or use the `Show schema` button in the context menu in the workflows list

<img  alt="JSON editor" src="https://github.com/user-attachments/assets/307297cc-36d6-477c-bd72-d52be1dec0c5" />

<img  alt="Show workflow schema" src="https://github.com/user-attachments/assets/b6efada4-44fc-4d35-9e24-0f143c003313" />

> \[!NOTE]
> Please use this [discussion thread](https://github.com/immich-app/immich/discussions/29167) to propose new ideas of triggers and actions. We are looking for extensive feedback and suggestions from you all.

##### Background backup improvements

Background backup on Android is now significantly more reliable. Previously, the background backup on Android was limited to newly taken photos. Now, the app uses a new periodic task scheduler, which allows you to upload your entire library in the background, and it plays nicer with Android's background execution limits, properly cleans up tasks, and warns you when battery optimization and notification settings might interfere with backups.

On iOS, the background refresh task now runs its sync and upload work in parallel, so uploads actually start within the short time window iOS allows.

<p align="center">
<img width="300"  alt="Enable backup option on mobile" src="https://github.com/user-attachments/assets/82be41f3-93b9-4231-9f91-53eb317bb3fe" />
</p>
##### Recently added page

A new "Recently Added" page on the web and mobile lets you browse your library sorted by when assets were added to Immich, rather than when they were taken. This makes it easier to find what's new when browsing a new batch of imports. You can find the new page in the "Explore" tab on the web and in the "Search" tab on mobile.

<img width="798" height="220" alt="Recently added" src="https://github.com/user-attachments/assets/d4729864-f736-4554-a672-91861aad5f7f" />
##### Integrity checks

The maintenance page has gotten a new addition: integrity reports! Immich will scan its directories on your file system, and compare it to what it has stored in its database. If there are deviations, they will be surfaced as

- untracked, if there is a file in Immich's directories that Immich does not know of
- missing, if Immich references a file in its database that does not exist in that place (anymore)
- a checksum mismatch, if the checksum of the file on disk does not match the checksum Immich has stored for that file. Typically, this would happen through file corruption but could also be the result of a bad rename.

<img alt="Integrity report on the maintenance page showing a count of untracked and missing files, as well as checksum mismatches." src="https://github.com/user-attachments/assets/0e59537e-89b7-4d06-b5e6-731bb1e453c0" />

You can configure when and how long the job runs each night.

<img width="800" alt="image" src="https://github.com/user-attachments/assets/13da49ac-5cfa-40a1-b852-b89b0ed7fff6" />
##### Slideshow (mobile)

The slideshow experience comes to mobile! You can now sit back and let your photos and videos play across the screen, just like on the web.

<p align="center">
<img width="300" alt="Slideshow view on mobile" src="https://github.com/user-attachments/assets/b3325f3c-0505-405f-9b79-322f738030f4" />
</p>
##### HLS and Real-Time Video transcoding (preview)

Immich can now transcode videos on-the-fly without needing to generate offline transcodes. This has been a long-requested feature with many benefits:

- Quality switching (both manual and automatic)
- Transcoding to the best codecs supported by the client
- Lower storage overhead when offline transcoding is disabled
- HDR for compatible clients (not implemented yet)
- Remuxing rather than transcoding the original when bandwidth allows it (not implemented yet)

Please note that this feature is still experimental and can change behavior from version to version. It's currently only implemented in the web app, with the mobile app implementation in progress.

To enable real-time transcoding, go to the [video transcoding settings](https://my.immich.app/admin/system-settings?isOpen=video-transcoding+realtime-transcoding) (scroll down). Offline transcoding isn't directly affected by enabling it, so if you'd like to disable offline transcoding, you should also adjust the transcode policy.

> \[!NOTE]
> For assets imported prior to v3, you will also need to re-run Metadata Extraction in the job panel for them to be re-processed.

<img alt="HLS Transcoding settings" src="https://github.com/user-attachments/assets/6313ea40-ae1a-4495-aaea-212ef67fd338" />

Keep in mind that your server needs to be powerful enough to transcode in real-time for this feature to work well. Hardware acceleration is recommended, but not required, when using this feature.

##### New video player for web

A new custom video player on the web app ensures all your devices share the same controls and layout, matching the Immich design. Some basic functions, like changing the playback rate, are available. This should also fix a lot of the problems on iOS, where the OS's controls are hidden behind the Immich navbar.

##### Open photos in Immich as a gallery on Android

Immich can now act as a gallery/image viewer app on Android. Tap a photo or video in another app, choose Immich, and it opens directly in the asset viewer with options to share the file or upload it to your library.

This is the first iteration of the feature, and refinements to how Immich recognizes files that are already in your library are on the way

<img width="350" alt="image" src="https://github.com/user-attachments/assets/f98c2a65-1b84-4580-a7af-ead54ab737d8" />
<img width="350" alt="image" src="https://github.com/user-attachments/assets/fb783bed-c6c4-4634-af71-c2e888274121" />
##### OCR on the mobile app

The asset viewer now has a toggle that highlights recognized text in a photo, and you can select and copy it directly from the image.

<p align="center">
<img width="350" alt="OCR in the mobile app" src="https://github.com/user-attachments/assets/5f870d38-53a5-4b05-9dba-5d8838b86934" />
</p>
##### Upload assets directly to an album on mobile

You can now upload local photos directly to an album in the mobile app, including from the asset bottom sheet, instead of uploading first and organizing later. A small change that removes a lot of friction from the backup-and-organize flow.

##### Select image size when sharing on mobile

When sharing photos from the mobile app, you can now choose the image size before sending; it is handy for keeping shared files small for messaging apps while preserving the option to share at full quality when needed.

You can change the default behavior in the `App Settings > Preferences`

<p align="center">
<img width="350"  alt="Share file's size settings" src="https://github.com/user-attachments/assets/fe1c95d7-39e4-4c25-8981-dea4d07fce5a" />
</p>

You can also pick the option when sharing on-the-fly by long pressing the `Share` button

<p align="center">
<img width="350"  alt="On-the-fly picker" src="https://github.com/user-attachments/assets/667b79a7-efac-462b-8736-9e674e083d6b" />
</p>
##### Timeline performance Improvements

Browsing months with a large number of assets is now dramatically smoother and prevents the browser tab from locking up when your instance encounters that scenario.

##### 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>

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

##### What's Changed

##### 🚨 Breaking Changes

- refactor!: migrate class-validator to zod by [@timonrieger](https://github.com/timonrieger) in [#26597](https://github.com/immich-app/immich/pull/26597)
- refactor!: remove replace asset by [@jrasm91](https://github.com/jrasm91) in [#27022](https://github.com/immich-app/immich/pull/27022)
- refactor!: remove my shared link dto by [@jrasm91](https://github.com/jrasm91) in [#27023](https://github.com/immich-app/immich/pull/27023)
- chore!: remove deprecated env variables by [@jrasm91](https://github.com/jrasm91) in [#27802](https://github.com/immich-app/immich/pull/27802)
- chore!: remove getRandom api endpoint by [@bwees](https://github.com/bwees) in [#27780](https://github.com/immich-app/immich/pull/27780)
- chore!: remove unused token response param by [@jrasm91](https://github.com/jrasm91) in [#27805](https://github.com/immich-app/immich/pull/27805)
- refactor: yeet old timeline by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#27666](https://github.com/immich-app/immich/pull/27666)
- chore!: remove old timeline sync endpoints by [@jrasm91](https://github.com/jrasm91) in [#27804](https://github.com/immich-app/immich/pull/27804)
- chore!: remove deviceId and deviceAssetId by [@danieldietzler](https://github.com/danieldietzler) in [#27818](https://github.com/immich-app/immich/pull/27818)
- chore!: rename API key schemas by [@jrasm91](https://github.com/jrasm91) in [#27828](https://github.com/immich-app/immich/pull/27828)
- chore!: remove without assets by [@jrasm91](https://github.com/jrasm91) in [#27835](https://github.com/immich-app/immich/pull/27835)
- fix: oauth issuerUrl validation by [@bo0tzz](https://github.com/bo0tzz) in [#27848](https://github.com/immich-app/immich/pull/27848)
- fix!: do not allow insecure oauth requests by default by [@bo0tzz](https://github.com/bo0tzz) in [#27844](https://github.com/immich-app/immich/pull/27844)
- fix!: set duration to null when not present by [@meesfrensel](https://github.com/meesfrensel) in [#26982](https://github.com/immich-app/immich/pull/26982)
- chore!: remove /api/server/theme endpoint by [@jrasm91](https://github.com/jrasm91) in [#27880](https://github.com/immich-app/immich/pull/27880)
- chore!: migrate album owner to album\_user by [@danieldietzler](https://github.com/danieldietzler) in [#27467](https://github.com/immich-app/immich/pull/27467)
- refactor!: change number to integer types by [@timonrieger](https://github.com/timonrieger) in [#27912](https://github.com/immich-app/immich/pull/27912)
- refactor(server)!: move correlationId to X-Correlation-ID response header by [@timonrieger](https://github.com/timonrieger) in [#28139](https://github.com/immich-app/immich/pull/28139)
- refactor(server)!: remove redundant error and statusCode fields from error responses by [@timonrieger](https://github.com/timonrieger) in [#28140](https://github.com/immich-app/immich/pull/28140)
- chore(server)!: drop pgvecto.rs support by [@mertalev](https://github.com/mertalev) in [#28159](https://github.com/immich-app/immich/pull/28159)
- chore!: duration in milliseconds by [@mertalev](https://github.com/mertalev) in [#28003](https://github.com/immich-app/immich/pull/28003)
- refactor(server)!: sanitize error messages to avoid leaking resource details by [@timonrieger](https://github.com/timonrieger) in [#28154](https://github.com/immich-app/immich/pull/28154)
- refactor(server)!: structured validation error responses by [@timonrieger](https://github.com/timonrieger) in [#28204](https://github.com/immich-app/immich/pull/28204)
- feat(server)!: add isOwned filter to albums API by [@timonrieger](https://github.com/timonrieger) in [#28213](https://github.com/immich-app/immich/pull/28213)
- chore(ml)!: require numpy 2.4 by [@mertalev](https://github.com/mertalev) in [#28158](https://github.com/immich-app/immich/pull/28158)
- fix(deps): update dependency nestjs-otel to v8 by [@renovate](https://github.com/renovate)\[bot] in [#27863](https://github.com/immich-app/immich/pull/27863)
- chore(ml)!: remove deprecated envs by [@mertalev](https://github.com/mertalev) in [#28326](https://github.com/immich-app/immich/pull/28326)
- chore(server)!: remove libopus enum by [@mertalev](https://github.com/mertalev) in [#28325](https://github.com/immich-app/immich/pull/28325)
- refactor!: remove asset faces from AssetResponseDto by [@bwees](https://github.com/bwees) in [#27779](https://github.com/immich-app/immich/pull/27779)
- refactor(server)!: drop empty string to null conversion by [@timonrieger](https://github.com/timonrieger) in [#28808](https://github.com/immich-app/immich/pull/28808)
- refactor(server)!: remove changeExpiryTime by [@timonrieger](https://github.com/timonrieger) in [#28816](https://github.com/immich-app/immich/pull/28816)
- refactor!: disallow star rating < 1 by [@meesfrensel](https://github.com/meesfrensel) in [#27896](https://github.com/immich-app/immich/pull/27896)
- fix!: search endpoints visibility can be omitted by [@danieldietzler](https://github.com/danieldietzler) in [#29385](https://github.com/immich-app/immich/pull/29385)

##### 🫥 Deprecated Changes

- refactor(server): deprecate PUT routes in favor of PATCH by [@timonrieger](https://github.com/timonrieger) in [#28859](https://github.com/immich-app/immich/pull/28859)

##### 🔒 Security

- fix: run profile picture through thumbnail pipeline by [@bo0tzz](https://github.com/bo0tzz) in [#27890](https://github.com/immich-app/immich/pull/27890)

##### 🚀 Features

- feat: mobile editing by [@bwees](https://github.com/bwees) in [#25397](https://github.com/immich-app/immich/pull/25397)
- feat: album map markers endpoint by [@jrasm91](https://github.com/jrasm91) in [#27830](https://github.com/immich-app/immich/pull/27830)
- feat(server): added backchannel logout api endpoint by [@santanoce](https://github.com/santanoce) in [#26235](https://github.com/immich-app/immich/pull/26235)
- feat(server): add OIDC logout URL override option by [@LJspice](https://github.com/LJspice) in [#27389](https://github.com/immich-app/immich/pull/27389)
- feat: android periodic work manager task by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#23563](https://github.com/immich-app/immich/pull/23563)
- feat(web): custom video player controls by [@meesfrensel](https://github.com/meesfrensel) in [#26183](https://github.com/immich-app/immich/pull/26183)
- feat(web): add full-path search mode to UI by [@mws-weekend-projects](https://github.com/mws-weekend-projects) in [#26758](https://github.com/immich-app/immich/pull/26758)
- feat: recently added assets page by [@benbeckford](https://github.com/benbeckford) in [#28272](https://github.com/immich-app/immich/pull/28272)
- feat(mobile): slideshow view by [@benbeckford](https://github.com/benbeckford) in [#28421](https://github.com/immich-app/immich/pull/28421)
- feat(mobile): "Add Tags" asset multiselect option by [@benjamonnguyen](https://github.com/benjamonnguyen) in [#26269](https://github.com/immich-app/immich/pull/26269)
- feat: workflows & plugins by [@jrasm91](https://github.com/jrasm91) in [#26727](https://github.com/immich-app/immich/pull/26727)
- feat(server): hls with real-time transcoding by [@mertalev](https://github.com/mertalev) in [#28230](https://github.com/immich-app/immich/pull/28230)
- feat(web): hls player by [@mertalev](https://github.com/mertalev) in [#28312](https://github.com/immich-app/immich/pull/28312)
- feat(mobile): Android. Immich as a gallery / image viewer app by [@PeterOmbodi](https://github.com/PeterOmbodi) in [#26109](https://github.com/immich-app/immich/pull/26109)
- feat: user upload heatmap by [@bondeabhijeet](https://github.com/bondeabhijeet) in [#28593](https://github.com/immich-app/immich/pull/28593)
- feat(mobile): ocr support by [@YarosMallorca](https://github.com/YarosMallorca) in [#26523](https://github.com/immich-app/immich/pull/26523)
- feat: geolocation workflow filter by [@benbeckford](https://github.com/benbeckford) in [#28961](https://github.com/immich-app/immich/pull/28961)
- feat: image quality option in sharing by [@alextran1502](https://github.com/alextran1502) in [#28918](https://github.com/immich-app/immich/pull/28918)
- feat: integrity check jobs (missing files, untracked files, checksums) by [@insertish](https://github.com/insertish) in [#24205](https://github.com/immich-app/immich/pull/24205)
- feat: new feature message by [@alextran1502](https://github.com/alextran1502) in [#29388](https://github.com/immich-app/immich/pull/29388)

##### 🌟 Enhancements

- feat(web): persist state of file path information in details panel by [@cratoo](https://github.com/cratoo) in [#27770](https://github.com/immich-app/immich/pull/27770)
- feat: commands by [@jrasm91](https://github.com/jrasm91) in [#27546](https://github.com/immich-app/immich/pull/27546)
- feat: upgrade immich/ui by [@jrasm91](https://github.com/jrasm91) in [#27792](https://github.com/immich-app/immich/pull/27792)
- feat: filter users on share by [@OdinOxin](https://github.com/OdinOxin) in [#27732](https://github.com/immich-app/immich/pull/27732)
- fix(server): render storage template date/time tokens in UTC ([#24350](https://github.com/immich-app/immich/issues/24350)) by [@migpovrap](https://github.com/migpovrap) in [#26917](https://github.com/immich-app/immich/pull/26917)
- feat(web): lazy load library and server statistics by [@etnoy](https://github.com/etnoy) in [#26406](https://github.com/immich-app/immich/pull/26406)
- feat: sort users alphabetically when adding to album by [@OdinOxin](https://github.com/OdinOxin) in [#27731](https://github.com/immich-app/immich/pull/27731)
- feat: auth logout page by [@jrasm91](https://github.com/jrasm91) in [#27831](https://github.com/immich-app/immich/pull/27831)
- chore: improve randomness of /search/random endpoint by [@StevenMassaro](https://github.com/StevenMassaro) in [#27531](https://github.com/immich-app/immich/pull/27531)
- feat: dynamic languages by [@jrasm91](https://github.com/jrasm91) in [#27869](https://github.com/immich-app/immich/pull/27869)
- feat: cache shared link by [@danieldietzler](https://github.com/danieldietzler) in [#27889](https://github.com/immich-app/immich/pull/27889)
- feat(server): add configurable OAuth prompt parameter by [@sparsh985](https://github.com/sparsh985) in [#26755](https://github.com/immich-app/immich/pull/26755)
- feat(server): add MPO file type support by [@git-akihakune](https://github.com/git-akihakune) in [#27963](https://github.com/immich-app/immich/pull/27963)
- feat(mobile): action bottom sheet on map timeline by [@YarosMallorca](https://github.com/YarosMallorca) in [#27515](https://github.com/immich-app/immich/pull/27515)
- feat(server): track video metadata by [@mertalev](https://github.com/mertalev) in [#28023](https://github.com/immich-app/immich/pull/28023)
- feat(enhancement): Navigate stack with up and down arrow keys by [@cratoo](https://github.com/cratoo) in [#27854](https://github.com/immich-app/immich/pull/27854)
- fix(web): migrate people management component to page, enabling tooltips by [@SkyDev125](https://github.com/SkyDev125) in [#26971](https://github.com/immich-app/immich/pull/26971)
- chore(mobile): add box shadow to asset details by [@uhthomas](https://github.com/uhthomas) in [#27510](https://github.com/immich-app/immich/pull/27510)
- feat: hide hidden person from memories by [@sakshamchawla](https://github.com/sakshamchawla) in [#20877](https://github.com/immich-app/immich/pull/20877)
- feat(mobile): increased tap area on video player overlay by [@YarosMallorca](https://github.com/YarosMallorca) in [#27269](https://github.com/immich-app/immich/pull/27269)
- feat(web): Add metadata overlay to slideshow by [@timonrieger](https://github.com/timonrieger) in [#24627](https://github.com/immich-app/immich/pull/24627)
- feat(web): add individual filter removal from search result chips by [@timonrieger](https://github.com/timonrieger) in [#28166](https://github.com/immich-app/immich/pull/28166)
- feat(mobile): trash/restore all by [@YarosMallorca](https://github.com/YarosMallorca) in [#28116](https://github.com/immich-app/immich/pull/28116)
- feat: display more info in asset viewer by [@alextran1502](https://github.com/alextran1502) in [#24630](https://github.com/immich-app/immich/pull/24630)
- feat(server): allow subpaths for machine learning URL by [@gnojus](https://github.com/gnojus) in [#28427](https://github.com/immich-app/immich/pull/28427)
- feat(ui): Shared URL input configuration by [@Lauritz-Tieste](https://github.com/Lauritz-Tieste) in [#27105](https://github.com/immich-app/immich/pull/27105)
- refactor: enhance shared link UI and functionality by [@Lauritz-Tieste](https://github.com/Lauritz-Tieste) in [#26464](https://github.com/immich-app/immich/pull/26464)
- feat: upload and add local asset directly to album by [@alextran1502](https://github.com/alextran1502) in [#28123](https://github.com/immich-app/immich/pull/28123)
- feat: Selectable metadata in duplicates utility with diffing by [@ollioddi](https://github.com/ollioddi) in [#26328](https://github.com/immich-app/immich/pull/26328)
- fix: improve form control focus visibility by [@Caltsic](https://github.com/Caltsic) in [#28512](https://github.com/immich-app/immich/pull/28512)
- feat: command for user pages by [@alextran1502](https://github.com/alextran1502) in [#28554](https://github.com/immich-app/immich/pull/28554)
- refactor: use ControlBar UI Library component by [@bwees](https://github.com/bwees) in [#28567](https://github.com/immich-app/immich/pull/28567)
- feat: workflow template by [@alextran1502](https://github.com/alextran1502) in [#28553](https://github.com/immich-app/immich/pull/28553)
- feat(mobile): improve downloading algorithm for sharing by [@YarosMallorca](https://github.com/YarosMallorca) in [#27312](https://github.com/immich-app/immich/pull/27312)
- feat: search by album name and id by [@jrasm91](https://github.com/jrasm91) in [#28672](https://github.com/immich-app/immich/pull/28672)
- feat: upload local assets to album from bottom sheet by [@alextran1502](https://github.com/alextran1502) in [#28531](https://github.com/immich-app/immich/pull/28531)
- feat: places in context search by [@timonrieger](https://github.com/timonrieger) in [#28768](https://github.com/immich-app/immich/pull/28768)
- feat: minimum face count per user by [@timjonez](https://github.com/timjonez) in [#27452](https://github.com/immich-app/immich/pull/27452)
- feat: show notification and battery optimization warning by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#26610](https://github.com/immich-app/immich/pull/26610)
- feat: workflows drag and drop enhancements by [@danieldietzler](https://github.com/danieldietzler) in [#28764](https://github.com/immich-app/immich/pull/28764)
- feat(mobile): min face count per-user by [@YarosMallorca](https://github.com/YarosMallorca) in [#28805](https://github.com/immich-app/immich/pull/28805)
- refactor(server): allow -1 rating again by [@timonrieger](https://github.com/timonrieger) in [#28886](https://github.com/immich-app/immich/pull/28886)
- feat(web): warn before overwriting existing locations in geolocation utility by [@yoshovski](https://github.com/yoshovski) in [#28840](https://github.com/immich-app/immich/pull/28840)
- feat: warn if microservices worker is missing by [@bo0tzz](https://github.com/bo0tzz) in [#28869](https://github.com/immich-app/immich/pull/28869)
- fix(web): show album names in duplicate review by [@meesfrensel](https://github.com/meesfrensel) in [#29080](https://github.com/immich-app/immich/pull/29080)
- feat: keyboard seeking for new video player by [@danieldietzler](https://github.com/danieldietzler) in [#29208](https://github.com/immich-app/immich/pull/29208)
- feat(web): Add text-white-shadow to elements and increase the shadows effect by [@Vogeluff](https://github.com/Vogeluff) in [#29165](https://github.com/immich-app/immich/pull/29165)
- feat: webhook workflow action by [@benbeckford](https://github.com/benbeckford) in [#29258](https://github.com/immich-app/immich/pull/29258)
- feat: integrity checks admin settings by [@danieldietzler](https://github.com/danieldietzler) in [#29406](https://github.com/immich-app/immich/pull/29406)

##### 🐛 Bug fixes

- fix(web): center images in RTL layouts ([#27678](https://github.com/immich-app/immich/issues/27678)) by [@Nicolas-micuda-becker](https://github.com/Nicolas-micuda-becker) in [#27753](https://github.com/immich-app/immich/pull/27753)
- fix(mobile): add keys for person tiles in search by [@YarosMallorca](https://github.com/YarosMallorca) in [#27689](https://github.com/immich-app/immich/pull/27689)
- fix(web): selection clearing on preview by [@YarosMallorca](https://github.com/YarosMallorca) in [#27702](https://github.com/immich-app/immich/pull/27702)
- fix: asset multi select download shortcut by [@danieldietzler](https://github.com/danieldietzler) in [#27784](https://github.com/immich-app/immich/pull/27784)
- fix(web): add partner photo to album from multiselect by [@YarosMallorca](https://github.com/YarosMallorca) in [#27767](https://github.com/immich-app/immich/pull/27767)
- fix: redirect original by [@danieldietzler](https://github.com/danieldietzler) in [#27759](https://github.com/immich-app/immich/pull/27759)
- fix: make web build stage deterministic by [@bo0tzz](https://github.com/bo0tzz) in [#27823](https://github.com/immich-app/immich/pull/27823)
- fix(web): svelte regression - cancel video preview fetch when bind:this is cleared early by [@midzelis](https://github.com/midzelis) in [#27713](https://github.com/immich-app/immich/pull/27713)
- fix(web): stale adaptive image when original overlays preview by [@midzelis](https://github.com/midzelis) in [#27621](https://github.com/immich-app/immich/pull/27621)
- fix(mobile): readonly redirect when not logged in by [@YarosMallorca](https://github.com/YarosMallorca) in [#27728](https://github.com/immich-app/immich/pull/27728)
- fix(web): close edit faces panel on Escape key press by [@midzelis](https://github.com/midzelis) in [#27519](https://github.com/immich-app/immich/pull/27519)
- fix(oauth): normalize email claim to lowercase and trim before account lookup and registration by [@timdobras](https://github.com/timdobras) in [#26841](https://github.com/immich-app/immich/pull/26841)
- fix(web): use event for zooming out after opening face editor by [@meesfrensel](https://github.com/meesfrensel) in [#27789](https://github.com/immich-app/immich/pull/27789)
- fix: sanitize filenames before adding to zip by [@bo0tzz](https://github.com/bo0tzz) in [#27893](https://github.com/immich-app/immich/pull/27893)
- fix(server): require at least one field to be set when updating memory by [@fredfloydd](https://github.com/fredfloydd) in [#27842](https://github.com/immich-app/immich/pull/27842)
- fix(web): compute hashes for uploads in chunks by [@fredfloydd](https://github.com/fredfloydd) in [#27878](https://github.com/immich-app/immich/pull/27878)
- fix(web): fix stale album page load by [@fredfloydd](https://github.com/fredfloydd) in [#27825](https://github.com/immich-app/immich/pull/27825)
- fix(web): prevent interaction with detail panel behind person side panel by [@midzelis](https://github.com/midzelis) in [#27309](https://github.com/immich-app/immich/pull/27309)
- fix: show neon light by [@alextran1502](https://github.com/alextran1502) in [#27994](https://github.com/immich-app/immich/pull/27994)
- fix(mobile): zero exposure by [@YarosMallorca](https://github.com/YarosMallorca) in [#28017](https://github.com/immich-app/immich/pull/28017)
- fix(mobile): clear local data on forced logout by [@LeLunZ](https://github.com/LeLunZ) in [#27957](https://github.com/immich-app/immich/pull/27957)
- fix(mobile): enable autoplay for motion photos in video viewer by [@LeLunZ](https://github.com/LeLunZ) in [#27961](https://github.com/immich-app/immich/pull/27961)
- fix(mobile): thumbnail transition to asset viewer by [@LeLunZ](https://github.com/LeLunZ) in [#27850](https://github.com/immich-app/immich/pull/27850)
- fix: jump to timeline on new auto\_router update by [@alextran1502](https://github.com/alextran1502) in [#28022](https://github.com/immich-app/immich/pull/28022)
- fix(mobile): delete assets on trash empty, Android by [@PeterOmbodi](https://github.com/PeterOmbodi) in [#26070](https://github.com/immich-app/immich/pull/26070)
- fix(ml): handle empty/corrupt images in face detection by [@yosit](https://github.com/yosit) in [#27391](https://github.com/immich-app/immich/pull/27391)
- fix(web): refresh memories hourly by [@meesfrensel](https://github.com/meesfrensel) in [#28114](https://github.com/immich-app/immich/pull/28114)
- fix(web): large files: better handling of asset deletions by [@meesfrensel](https://github.com/meesfrensel) in [#28117](https://github.com/immich-app/immich/pull/28117)
- fix(web): double video playback on map timeline by [@YarosMallorca](https://github.com/YarosMallorca) in [#28090](https://github.com/immich-app/immich/pull/28090)
- fix(mobile): suppress asset stack UI in trash timeline by [@PeterOmbodi](https://github.com/PeterOmbodi) in [#26536](https://github.com/immich-app/immich/pull/26536)
- fix(web): timeline scroll when pressing back from stacked asset by [@Snowknight26](https://github.com/Snowknight26) in [#28163](https://github.com/immich-app/immich/pull/28163)
- fix(server): selectively apply metadata bitstream filter for video thumbnails by [@pinhao](https://github.com/pinhao) in [#28162](https://github.com/immich-app/immich/pull/28162)
- fix(web): fix shared link /s/photos.\* navigation after password login by [@meesfrensel](https://github.com/meesfrensel) in [#27788](https://github.com/immich-app/immich/pull/27788)
- fix(ml): respect time zone for logs in cuda container by [@AyaanMAG](https://github.com/AyaanMAG) in [#28155](https://github.com/immich-app/immich/pull/28155)
- fix: librknnrt permissions in machine-learning by [@DavidTheFighter](https://github.com/DavidTheFighter) in [#28216](https://github.com/immich-app/immich/pull/28216)
- fix(server): validate duplicate group ownership before dismissal by [@timonrieger](https://github.com/timonrieger) in [#28221](https://github.com/immich-app/immich/pull/28221)
- fix(web): correct timeline yesterday label across month boundaries by [@michelheusschen](https://github.com/michelheusschen) in [#28183](https://github.com/immich-app/immich/pull/28183)
- fix(mobile): show lens info without lens name by [@benbeckford](https://github.com/benbeckford) in [#28234](https://github.com/immich-app/immich/pull/28234)
- fix: stale person name after merge by [@danieldietzler](https://github.com/danieldietzler) in [#28222](https://github.com/immich-app/immich/pull/28222)
- fix(web): shared album avatars opening modal by [@meesfrensel](https://github.com/meesfrensel) in [#26719](https://github.com/immich-app/immich/pull/26719)
- fix(mobile): prevent asset loading issues when changing page or when closing memories by [@LeLunZ](https://github.com/LeLunZ) in [#27596](https://github.com/immich-app/immich/pull/27596)
- fix(mobile): correct filter default and UI desync in similar photos search by [@TheBestX11](https://github.com/TheBestX11) in [#27516](https://github.com/immich-app/immich/pull/27516)
- fix(server): hide isFavorite from partner asset sync stream by [@timonrieger](https://github.com/timonrieger) in [#28035](https://github.com/immich-app/immich/pull/28035)
- fix(mobile): restore notification plugin init by [@santoshakil](https://github.com/santoshakil) in [#28284](https://github.com/immich-app/immich/pull/28284)
- fix(mobile): mounted check before setState in album sync action by [@santoshakil](https://github.com/santoshakil) in [#28300](https://github.com/immich-app/immich/pull/28300)
- fix(mobile): avoid duplicate assets in album view by [@stfn42](https://github.com/stfn42) in [#28152](https://github.com/immich-app/immich/pull/28152)
- fix(mobile): Deduplicate assets in person view timeline by [@thowdev](https://github.com/thowdev) in [#26723](https://github.com/immich-app/immich/pull/26723)
- fix(deployment): remove unneeded volume by [@mmomjian](https://github.com/mmomjian) in [#28307](https://github.com/immich-app/immich/pull/28307)
- fix: mobile upload duration type by [@alextran1502](https://github.com/alextran1502) in [#28362](https://github.com/immich-app/immich/pull/28362)
- fix: deep link for assets when asset viewer already open by [@bwees](https://github.com/bwees) in [#27971](https://github.com/immich-app/immich/pull/27971)
- fix: kekab icon colors in light mode by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#28366](https://github.com/immich-app/immich/pull/28366)
- fix: indexes on remote\_asset\_entity by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#28264](https://github.com/immich-app/immich/pull/28264)
- fix(mobile): clear linkedRemoteAlbumId in reset() so FK refs dont dangle by [@santoshakil](https://github.com/santoshakil) in [#28382](https://github.com/immich-app/immich/pull/28382)
- fix: ignore icc profile make and model by [@jrasm91](https://github.com/jrasm91) in [#28412](https://github.com/immich-app/immich/pull/28412)
- fix(mobile): don't block app open on slow validateAccessToken by [@santoshakil](https://github.com/santoshakil) in [#28405](https://github.com/immich-app/immich/pull/28405)
- fix(mobile): add restore option to trashed assets by [@inesiscosta](https://github.com/inesiscosta) in [#27442](https://github.com/immich-app/immich/pull/27442)
- fix(mobile): use correct delete action by [@ByteSizedMarius](https://github.com/ByteSizedMarius) in [#26575](https://github.com/immich-app/immich/pull/26575)
- fix(server): dedupe database backup jobs by [@rdeaton](https://github.com/rdeaton) in [#28341](https://github.com/immich-app/immich/pull/28341)
- fix(mobile): cronet buffer overflow on compressed thumbnails by [@santoshakil](https://github.com/santoshakil) in [#28439](https://github.com/immich-app/immich/pull/28439)
- fix(mobile): cronet thumbnail buffer overflow regression from [#28439](https://github.com/immich-app/immich/issues/28439) by [@santoshakil](https://github.com/santoshakil) in [#28450](https://github.com/immich-app/immich/pull/28450)
- fix(mobile): mounted check in ThumbnailTile hero flight listener by [@santoshakil](https://github.com/santoshakil) in [#28451](https://github.com/immich-app/immich/pull/28451)
- fix(mobile): don't force-unwrap nil localizedTitle in ios getAlbums by [@santoshakil](https://github.com/santoshakil) in [#28452](https://github.com/immich-app/immich/pull/28452)
- fix(web): work around Chrome HDR image seam lines during zoom by [@midzelis](https://github.com/midzelis) in [#27715](https://github.com/immich-app/immich/pull/27715)
- fix(ios): respect status bar scroll to top in timeline views by [@agg23](https://github.com/agg23) in [#28469](https://github.com/immich-app/immich/pull/28469)
- fix(mobile): asset viewer stuck on spinner after rotation by [@LeLunZ](https://github.com/LeLunZ) in [#28019](https://github.com/immich-app/immich/pull/28019)
- fix(web): timeline stuttering with many assets in 1 day by [@benbeckford](https://github.com/benbeckford) in [#28509](https://github.com/immich-app/immich/pull/28509)
- fix(mobile): preserve zoom level during image loading and live photo playback by [@LeLunZ](https://github.com/LeLunZ) in [#27960](https://github.com/immich-app/immich/pull/27960)
- fix(ml): stabilize MIGraphX inference by [@fabianwimberger](https://github.com/fabianwimberger) in [#28444](https://github.com/immich-app/immich/pull/28444)
- fix: await sync asset v2 by [@bwees](https://github.com/bwees) in [#28569](https://github.com/immich-app/immich/pull/28569)
- fix: strip metadata from timeline responses for shared links without exif sharing by [@danieldietzler](https://github.com/danieldietzler) in [#28644](https://github.com/immich-app/immich/pull/28644)
- fix: Refresh local album overview page after asset deletion by [@Lauritz-Tieste](https://github.com/Lauritz-Tieste) in [#28586](https://github.com/immich-app/immich/pull/28586)
- fix(server): prevent locked assets from leaking to partners by [@timonrieger](https://github.com/timonrieger) in [#28652](https://github.com/immich-app/immich/pull/28652)
- refactor(web): replace per-asset viewport proximity with day-tier active indices by [@midzelis](https://github.com/midzelis) in [#28597](https://github.com/immich-app/immich/pull/28597)
- fix: timeline scroll flicker by [@alextran1502](https://github.com/alextran1502) in [#28653](https://github.com/immich-app/immich/pull/28653)
- fix: api repositories using stale endpoint by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#28667](https://github.com/immich-app/immich/pull/28667)
- fix: disallow cross origin/non http protocols for continueUrl on login by [@bwees](https://github.com/bwees) in [#28706](https://github.com/immich-app/immich/pull/28706)
- fix(web): skip thumbhash fade for offscreen thumbnails by [@midzelis](https://github.com/midzelis) in [#27335](https://github.com/immich-app/immich/pull/27335)
- fix(web): prevent partner assets from being selected in geolocation utility by [@okxint](https://github.com/okxint) in [#28737](https://github.com/immich-app/immich/pull/28737)
- fix(mobile): invisible ink splashes in asset sheet by [@timonrieger](https://github.com/timonrieger) in [#28756](https://github.com/immich-app/immich/pull/28756)
- fix!: unauthorized face creation by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#28561](https://github.com/immich-app/immich/pull/28561)
- fix(mobile): proper background task cleanup by [@mertalev](https://github.com/mertalev) in [#28694](https://github.com/immich-app/immich/pull/28694)
- fix(cli): prevent out-of-memory on file upload due to undici storing the request body by [@moversity](https://github.com/moversity) in [#28723](https://github.com/immich-app/immich/pull/28723)
- fix: error log on aborted uploads by [@jrasm91](https://github.com/jrasm91) in [#28806](https://github.com/immich-app/immich/pull/28806)
- fix(server): respect timezone in iso date string encoding by [@timonrieger](https://github.com/timonrieger) in [#28810](https://github.com/immich-app/immich/pull/28810)
- test: fix tests when OpenVINO provider is available by [@nekowinston](https://github.com/nekowinston) in [#28802](https://github.com/immich-app/immich/pull/28802)
- fix(mobile): run iOS bg task phases in parallel by [@santoshakil](https://github.com/santoshakil) in [#28293](https://github.com/immich-app/immich/pull/28293)
- fix: error handling by [@jrasm91](https://github.com/jrasm91) in [#28843](https://github.com/immich-app/immich/pull/28843)
- fix: cross isolate drift watchers by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#28862](https://github.com/immich-app/immich/pull/28862)
- fix: reload timeline on group by setting change by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#28864](https://github.com/immich-app/immich/pull/28864)
- fix(web): use irot/imir tags for HEIF Orientation by [@joojoooo](https://github.com/joojoooo) in [#27820](https://github.com/immich-app/immich/pull/27820)
- fix: detail panel faces reactivity issues by [@danieldietzler](https://github.com/danieldietzler) in [#28910](https://github.com/immich-app/immich/pull/28910)
- fix(server): hide isFavorite from album asset sync stream by [@timonrieger](https://github.com/timonrieger) in [#28923](https://github.com/immich-app/immich/pull/28923)
- fix(mobile): show memory and folder dates in local time by [@santoshakil](https://github.com/santoshakil) in [#28941](https://github.com/immich-app/immich/pull/28941)
- fix(mobile): show error when creating an album fails by [@santoshakil](https://github.com/santoshakil) in [#28942](https://github.com/immich-app/immich/pull/28942)
- fix(mobile): add album picker to archive bottom sheet by [@santoshakil](https://github.com/santoshakil) in [#28953](https://github.com/immich-app/immich/pull/28953)
- fix: normalize diacritics in person name search in Web & Mobile by [@pedrovieira](https://github.com/pedrovieira) in [#28887](https://github.com/immich-app/immich/pull/28887)
- fix(web): Prevent face editor from closing when dismissing tag confirmation by [@pedrovieira](https://github.com/pedrovieira) in [#28900](https://github.com/immich-app/immich/pull/28900)
- fix(mobile): map timeline layout crash by [@YarosMallorca](https://github.com/YarosMallorca) in [#28878](https://github.com/immich-app/immich/pull/28878)
- fix(mobile): deduplicate people in asset details panel by [@santoshakil](https://github.com/santoshakil) in [#28972](https://github.com/immich-app/immich/pull/28972)
- fix(mobile): keep timezone when editing asset date time by [@santoshakil](https://github.com/santoshakil) in [#28978](https://github.com/immich-app/immich/pull/28978)
- fix(mobile): stale details after editing asset date by [@santoshakil](https://github.com/santoshakil) in [#28977](https://github.com/immich-app/immich/pull/28977)
- fix(mobile): show albums whose assets are all trashed by [@santoshakil](https://github.com/santoshakil) in [#28985](https://github.com/immich-app/immich/pull/28985)
- fix(mobile): give android notification channels proper names by [@santoshakil](https://github.com/santoshakil) in [#28986](https://github.com/immich-app/immich/pull/28986)
- fix: Improving scroll behavior on image stacks that overflow the screen by [@BlankCanvasStudio](https://github.com/BlankCanvasStudio) in [#28885](https://github.com/immich-app/immich/pull/28885)
- fix(web): focus on scrollable element on load by [@timonrieger](https://github.com/timonrieger) in [#29004](https://github.com/immich-app/immich/pull/29004)
- fix(mobile): show like and comment options on album photo deep links by [@santoshakil](https://github.com/santoshakil) in [#29020](https://github.com/immich-app/immich/pull/29020)
- fix(web): correctly handle person search with more than 100 results by [@maxinegardenas](https://github.com/maxinegardenas) in [#29002](https://github.com/immich-app/immich/pull/29002)
- fix(web): prevent upload status panel from overlapping album action bar by [@okxint](https://github.com/okxint) in [#29044](https://github.com/immich-app/immich/pull/29044)
- fix(web): error loading image state by [@bwees](https://github.com/bwees) in [#29058](https://github.com/immich-app/immich/pull/29058)
- fix(web): show asset arrows by [@timonrieger](https://github.com/timonrieger) in [#29010](https://github.com/immich-app/immich/pull/29010)
- fix(server): hide partner archived asset locations from map by [@timonrieger](https://github.com/timonrieger) in [#29028](https://github.com/immich-app/immich/pull/29028)
- fix: lock transcoding options by [@timonrieger](https://github.com/timonrieger) in [#29076](https://github.com/immich-app/immich/pull/29076)
- fix(server): do not merge metadata when multiple duplicates are kept by [@timonrieger](https://github.com/timonrieger) in [#29035](https://github.com/immich-app/immich/pull/29035)
- fix: integrity report checksum query by [@danieldietzler](https://github.com/danieldietzler) in [#29136](https://github.com/immich-app/immich/pull/29136)
- fix: map settings by [@danieldietzler](https://github.com/danieldietzler) in [#29134](https://github.com/immich-app/immich/pull/29134)
- fix: too strict cron expression validation by [@danieldietzler](https://github.com/danieldietzler) in [#29138](https://github.com/immich-app/immich/pull/29138)
- fix(web): respect local timezone when building date range for search by [@okxint](https://github.com/okxint) in [#29128](https://github.com/immich-app/immich/pull/29128)
- fix(web): language selector by [@meesfrensel](https://github.com/meesfrensel) in [#29065](https://github.com/immich-app/immich/pull/29065)
- fix: update datetimeRelative description to minutes instead of seconds by [@meesfrensel](https://github.com/meesfrensel) in [#29137](https://github.com/immich-app/immich/pull/29137)
- fix: video thumbnail quality sharing by [@bwees](https://github.com/bwees) in [#29104](https://github.com/immich-app/immich/pull/29104)
- fix(mobile): stop sync albums crashing on the main isolate by [@santoshakil](https://github.com/santoshakil) in [#29133](https://github.com/immich-app/immich/pull/29133)
- fix(mobile): show memories with no showAt/hideAt in the timeline lane by [@santoshakil](https://github.com/santoshakil) in [#29158](https://github.com/immich-app/immich/pull/29158)
- fix(mobile): keep toasts off the dynamic island when keyboard is open by [@santoshakil](https://github.com/santoshakil) in [#29159](https://github.com/immich-app/immich/pull/29159)
- fix(server): skip existing users when sharing albums by [@jeevan6996](https://github.com/jeevan6996) in [#28884](https://github.com/immich-app/immich/pull/28884)
- fix: web i18n by [@danieldietzler](https://github.com/danieldietzler) in [#29175](https://github.com/immich-app/immich/pull/29175)
- fix(web): shift+click on GPS asset extends range selection in geolocation utility by [@timonrieger](https://github.com/timonrieger) in [#29022](https://github.com/immich-app/immich/pull/29022)
- fix(server): allow non-utc datetime offsets by [@timonrieger](https://github.com/timonrieger) in [#29186](https://github.com/immich-app/immich/pull/29186)
- fix: remove local-only step ids from workflow json by [@danieldietzler](https://github.com/danieldietzler) in [#29188](https://github.com/immich-app/immich/pull/29188)
- fix: asset type filter by [@danieldietzler](https://github.com/danieldietzler) in [#29190](https://github.com/immich-app/immich/pull/29190)
- fix(mobile): prevent duplicate login pages for unauthenticated share intent warm start by [@olildu](https://github.com/olildu) in [#29054](https://github.com/immich-app/immich/pull/29054)
- fix(mobile): refresh memories on resume and day change by [@santoshakil](https://github.com/santoshakil) in [#28983](https://github.com/immich-app/immich/pull/28983)
- fix(mobile): re-lock locked folder when the app is backgrounded by [@santoshakil](https://github.com/santoshakil) in [#29089](https://github.com/immich-app/immich/pull/29089)
- fix(mobile): endless spinner on album selection when device has no albums by [@santoshakil](https://github.com/santoshakil) in [#28994](https://github.com/immich-app/immich/pull/28994)
- fix: rc version check by [@danieldietzler](https://github.com/danieldietzler) in [#29194](https://github.com/immich-app/immich/pull/29194)
- fix: detail panel people reactivity and iterator consumption by [@danieldietzler](https://github.com/danieldietzler) in [#29250](https://github.com/immich-app/immich/pull/29250)
- fix(server): use VBR for QSV so the max bitrate is respected by [@aclerici38](https://github.com/aclerici38) in [#29240](https://github.com/immich-app/immich/pull/29240)
- fix: ignore external libraries for integrity report checksum check by [@danieldietzler](https://github.com/danieldietzler) in [#29248](https://github.com/immich-app/immich/pull/29248)
- fix(web): remove map's fullscreen button by [@meesfrensel](https://github.com/meesfrensel) in [#29192](https://github.com/immich-app/immich/pull/29192)
- refactor: use SemVer classes for version compatability message by [@bwees](https://github.com/bwees) in [#29056](https://github.com/immich-app/immich/pull/29056)
- fix: sync backfill by [@jrasm91](https://github.com/jrasm91) in [#29267](https://github.com/immich-app/immich/pull/29267)
- fix(mobile): force AssetViewerPage recreation on repeated view intents by [@okxint](https://github.com/okxint) in [#2…
renovate Bot added a commit to sdwilsh/ansible-playbooks that referenced this pull request Jul 20, 2026
##### [\`v3.0.3\`](https://github.com/immich-app/immich/releases/tag/v3.0.3)

##### v3.0.3

- various bug fixes
- we push to our own F-Droid repo at <https://app.futo.org/fdroid/repo> now. If you're using F-Droid, please pull the application from there from now on
- fixes an issue where LivePhotos upload from the background isn't showing up.

> \[!Note]
> In some specific circumstances, newly uploaded Live Photos could have broken thumbnails. If you see any such cases, please run the "missing" job for thumbnails or wait for the respective nightly job to clear it up.

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

##### What's Changed

##### 🚀 Features

- feat: publish app releases to FUTO F-Droid repo by [@bo0tzz](https://github.com/bo0tzz) in [#29804](https://github.com/immich-app/immich/pull/29804)

##### 🐛 Bug fixes

- fix(web): closing plugin method picker selects "unknown" method by [@benbeckford](https://github.com/benbeckford) in [#29784](https://github.com/immich-app/immich/pull/29784)
- fix: unauthorized album owner update by [@danieldietzler](https://github.com/danieldietzler) in [#29883](https://github.com/immich-app/immich/pull/29883)
- fix: still part of live photo hidden on bg upload by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#29884](https://github.com/immich-app/immich/pull/29884)
- fix: system appbar icon color has incorrect color in asset viewer by [@alextran1502](https://github.com/alextran1502) in [#29885](https://github.com/immich-app/immich/pull/29885)
- fix: locked visibility in search random endpoint by [@danieldietzler](https://github.com/danieldietzler) in [#29887](https://github.com/immich-app/immich/pull/29887)
- fix(mobile): send a full datetime from the android memories widget by [@santoshakil](https://github.com/santoshakil) in [#29689](https://github.com/immich-app/immich/pull/29689)
- fix: memory search date validation by [@danieldietzler](https://github.com/danieldietzler) in [#29907](https://github.com/immich-app/immich/pull/29907)
- fix(server): set hvc1 tag when using hwa by [@mertalev](https://github.com/mertalev) in [#29908](https://github.com/immich-app/immich/pull/29908)
- fix(mobile): clear zoom state when swapping assets by [@agg23](https://github.com/agg23) in [#29909](https://github.com/immich-app/immich/pull/29909)
- fix: Ken Burns effect on sliver app bar jittery on Android by [@alextran1502](https://github.com/alextran1502) in [#29890](https://github.com/immich-app/immich/pull/29890)

##### 📚 Documentation

- fix(docs): update fdroid link  by [@mmomjian](https://github.com/mmomjian) in [#29797](https://github.com/immich-app/immich/pull/29797)
- feat: system integrity docs by [@danieldietzler](https://github.com/danieldietzler) in [#29911](https://github.com/immich-app/immich/pull/29911)

##### 🌐 Translations

- chore(web): update translations by [@weblate](https://github.com/weblate) in [#29774](https://github.com/immich-app/immich/pull/29774)
- fix(mobile): correct person age singular pluralization by [@tech00exploere](https://github.com/tech00exploere) in [#29868](https://github.com/immich-app/immich/pull/29868)

##### New Contributors

- [@tech00exploere](https://github.com/tech00exploere) made their first contribution in [#29868](https://github.com/immich-app/immich/pull/29868)

**Full Changelog**: <https://github.com/immich-app/immich/compare/v3.0.2...v3.0.3>

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

##### v3.0.2

This patch release addresses various bugs from v3 release and adds an additional filter to workflows

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

##### What's Changed

##### 🌟 Enhancements

- fix(web): add ARIA label to ServerStatisticsCard by [@tjhorner](https://github.com/tjhorner) in [#29497](https://github.com/immich-app/immich/pull/29497)
- feat(server): hls variant configuration by [@mertalev](https://github.com/mertalev) in [#29613](https://github.com/immich-app/immich/pull/29613)
- feat: user agnostic database restore by [@danieldietzler](https://github.com/danieldietzler) in [#29512](https://github.com/immich-app/immich/pull/29512)
- feat(server): date workflow filter by [@benbeckford](https://github.com/benbeckford) in [#29040](https://github.com/immich-app/immich/pull/29040)

##### 🐛 Bug fixes

- fix: re-add gCastEnabled negation by [@bo0tzz](https://github.com/bo0tzz) in [#29499](https://github.com/immich-app/immich/pull/29499)
- fix: downmix audio to stereo to fix broken channel layout by [@lukasdotcom](https://github.com/lukasdotcom) in [#29485](https://github.com/immich-app/immich/pull/29485)
- fix: live transcoding when viewing from a link share by [@lukasdotcom](https://github.com/lukasdotcom) in [#29471](https://github.com/immich-app/immich/pull/29471)
- fix: web search timeline visibility by [@danieldietzler](https://github.com/danieldietzler) in [#29518](https://github.com/immich-app/immich/pull/29518)
- fix(web): missing i18n strings by [@wonsukchoi](https://github.com/wonsukchoi) in [#29612](https://github.com/immich-app/immich/pull/29612)
- fix: chinese browser locales recognition by [@danieldietzler](https://github.com/danieldietzler) in [#29622](https://github.com/immich-app/immich/pull/29622)
- chore: improve added to album messages by [@danieldietzler](https://github.com/danieldietzler) in [#29641](https://github.com/immich-app/immich/pull/29641)
- fix(mobile): fix 10-bit heic and avif colors on android by [@santoshakil](https://github.com/santoshakil) in [#29631](https://github.com/immich-app/immich/pull/29631)
- fix(mobile): match iOS scroll to top and tabbar scroll ([#28469](https://github.com/immich-app/immich/issues/28469)) by [@agg23](https://github.com/agg23) in [#29705](https://github.com/immich-app/immich/pull/29705)
- fix: wrap migrations in transaction by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#29664](https://github.com/immich-app/immich/pull/29664)
- fix: oauth account linking by [@danieldietzler](https://github.com/danieldietzler) in [#29624](https://github.com/immich-app/immich/pull/29624)
- fix: incorrect grouping of recently added assets by [@benbeckford](https://github.com/benbeckford) in [#29666](https://github.com/immich-app/immich/pull/29666)
- fix: integrity checks checksum pagination by [@danieldietzler](https://github.com/danieldietzler) in [#29516](https://github.com/immich-app/immich/pull/29516)
- fix(mobile): missing crop options and rotation scaling by [@bwees](https://github.com/bwees) in [#29645](https://github.com/immich-app/immich/pull/29645)
- fix(mobile): properly handle live photos locally by [@agg23](https://github.com/agg23) in [#29462](https://github.com/immich-app/immich/pull/29462)
- fix: integrity checks dto validation by [@danieldietzler](https://github.com/danieldietzler) in [#29621](https://github.com/immich-app/immich/pull/29621)
- fix(mobile): http request handling after isolate death by [@mertalev](https://github.com/mertalev) in [#29714](https://github.com/immich-app/immich/pull/29714)
- fix: do not log out on automatic url switch by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#29715](https://github.com/immich-app/immich/pull/29715)
- fix(server): stream ffprobe packets by [@mertalev](https://github.com/mertalev) in [#29723](https://github.com/immich-app/immich/pull/29723)
- fix: search metadata for album shared links by [@danieldietzler](https://github.com/danieldietzler) in [#29742](https://github.com/immich-app/immich/pull/29742)
- fix(web): clear asset selection when search context changes by [@khanguyen74](https://github.com/khanguyen74) in [#29738](https://github.com/immich-app/immich/pull/29738)
- fix(mobile): update timeline args on layout constraint changes by [@santoshakil](https://github.com/santoshakil) in [#29653](https://github.com/immich-app/immich/pull/29653)
- fix: iso date parsing for three digit years by [@danieldietzler](https://github.com/danieldietzler) in [#29739](https://github.com/immich-app/immich/pull/29739)
- fix: missing files integrity checks by [@danieldietzler](https://github.com/danieldietzler) in [#29737](https://github.com/immich-app/immich/pull/29737)
- fix(mobile): play videos from search results and folder view by [@santoshakil](https://github.com/santoshakil) in [#29693](https://github.com/immich-app/immich/pull/29693)
- fix(web): recursively unnest class arrays by [@meesfrensel](https://github.com/meesfrensel) in [#29755](https://github.com/immich-app/immich/pull/29755)
- fix: emit album update event when uploading assets through shared link by [@danieldietzler](https://github.com/danieldietzler) in [#29757](https://github.com/immich-app/immich/pull/29757)
- fix(web): always initialize language manager to set lang and dir by [@meesfrensel](https://github.com/meesfrensel) in [#29696](https://github.com/immich-app/immich/pull/29696)

##### 📚 Documentation

- chore: update docs with v3 tags by [@alextran1502](https://github.com/alextran1502) in [#29312](https://github.com/immich-app/immich/pull/29312)
- fix(docs): use correct heading name for DB dump by [@track0x1](https://github.com/track0x1) in [#29483](https://github.com/immich-app/immich/pull/29483)
- feat(docs): add Malayalam language support in README files by [@jinskjoy](https://github.com/jinskjoy) in [#29593](https://github.com/immich-app/immich/pull/29593)
- fix(docs): clarify version policy by [@mmomjian](https://github.com/mmomjian) in [#29654](https://github.com/immich-app/immich/pull/29654)

##### 🌐 Translations

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

##### New Contributors

- [@tjhorner](https://github.com/tjhorner) made their first contribution in [#29497](https://github.com/immich-app/immich/pull/29497)
- [@wonsukchoi](https://github.com/wonsukchoi) made their first contribution in [#29612](https://github.com/immich-app/immich/pull/29612)
- [@track0x1](https://github.com/track0x1) made their first contribution in [#29483](https://github.com/immich-app/immich/pull/29483)
- [@jinskjoy](https://github.com/jinskjoy) made their first contribution in [#29593](https://github.com/immich-app/immich/pull/29593)
- [@khanguyen74](https://github.com/khanguyen74) made their first contribution in [#29738](https://github.com/immich-app/immich/pull/29738)

**Full Changelog**: <https://github.com/immich-app/immich/compare/v3.0.1...v3.0.2>

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

##### v3.0.1

- Fixes a bug that causes albums don't show up in the mobile app

##### What's Changed

##### 🚀 Features

- feat(web): recently added link in sidebar by [@benbeckford](https://github.com/benbeckford) in [#29039](https://github.com/immich-app/immich/pull/29039)

##### 🐛 Bug fixes

- fix: albums broken on v2 mobile clients by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#29446](https://github.com/immich-app/immich/pull/29446)
- fix: setting input field description spacing for description snippet by [@danieldietzler](https://github.com/danieldietzler) in [#29433](https://github.com/immich-app/immich/pull/29433)

##### 🌐 Translations

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

**Full Changelog**: <https://github.com/immich-app/immich/compare/v3.0.0...v3.0.1>

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

##### v3.0.0

Welcome to Immich `v3.0.0`!

After months of hard work from the team and our amazing contributors, we're thrilled to announce the next major version of Immich: `v3.0.0`!  🎉

##### Breaking changes

This release includes several breaking changes; read the full migration guide [here](https://immich.app/blog/v3-migration). *It's worth mentioning that many of the breaking changes are updates to API endpoints and affect only **third-party tools** that integrate with Immich's API*. For the vast majority of users, updating works exactly as it always has.

##### How to update

> \[!WARNING]
> `v3.0.0` drops support for pgvecto.rs. If you run Immich before `v1.133.0` and haven't done the migration step yet, see the migration guide here. <https://docs.immich.app/install/upgrading/#migrating-to-vectorchord>

First, update the `IMMICH_VERSION` in your `.env` file to `v3`:

```diff
- IMMICH_VERSION=v2
+ IMMICH_VERSION=v3
```

Then run the usual update commands:

```bash
docker compose pull && docker compose up -d
```

##### Release candidates

If you missed it, `v3.0.0` was the first time we used release candidates, also known as prereleases. Release candidates are tested but not yet official releases of Immich, and they allow us to find and fix any outstanding bugs before a final release. If you would like to be notified about release candidates directly through Immich, you can change the release channel from "Stable" to "Release candidate" in the `Admin settings > Version check` options ([here](https://my.immich.app/admin/system-settings?isOpen=version-check)).

<img alt="New release channel option in version check settings" src="https://github.com/user-attachments/assets/fc8f6008-d486-4915-ad1b-feaddb856315" />
##### New Merch

As part of this release, we're happy to announce we also have some new swag for you!

- Kids clothing: For those who are likely the reason for your Immich library's size
- Colored embroidery: We now have clothes with a full color embroidered Immich logo

<a href="https://immich.store/collections/immich-3-0">
<img width="1200" alt="immich-store (1)" src="https://github.com/user-attachments/assets/ce114e7b-1424-4eca-975d-b23debadb32b" />
</a>

Check it out now at [https://immich.store](https://immich.store/collections/immich-3-0)!

##### Highlights

Now, let's get right into all the new features in this release:

- Mobile non-destructive editing
- Workflows (preview)
- Background backup improvement
- Recently added page
- Integrity checks
- Slideshow on mobile app
- HLS and real-time video transcoding (preview)
- New video player for web
- Open photo in Immich as gallery on Android
- OCR on mobile app
- Upload asset directly to album on the mobile app
- Option to select image size when sharing on the mobile app
- Timeline performance improvement for browsing a large amount of assets in a single month

##### Mobile non-destructive editing

<p align="center">
<img width="300" alt="image" src="https://github.com/user-attachments/assets/e9ddf97c-a4f8-42c1-9910-49ef3c8d4b0a" />
</p>

This is a follow-up to Image Editing on the web, which was released in `v2.5.0`. This feature allows you to make non-destructive edits to your photos inside of Immich. Until now, the mobile editor used a completely different system that created new assets instead of editing the photo in place.

With this update, we bring a new, easier-to-use editor to mobile devices that has the same features as the web version. You can now edit photos directly in the mobile app, including cropping, rotating, and adjusting your images without ever touching the original file. Similar to the web, edits are non-destructive, so you can revisit or revert them at any time. You can even make edits on mobile and then adjust them on the web later!

Some features from the previous mobile editing implementation have been removed including:

- Recoloring photos
- Editing live photos
- Editing local assets

We have plans to bring some of these capabilities back in future releases.

##### Workflows (preview)

The first preview of Workflows is here! Workflows let you automate actions in your library by chaining triggers, filters, and actions together with a drag-and-drop builder. This is the foundation for many exciting automations to come, and we'd love your feedback as we continue building on it.

You can access the feature from [Utilities > Workflows](https://my.immich.app/workflows) on the web.

<img width="800"  alt="Workflows link on the utilities page" src="https://github.com/user-attachments/assets/db7e139e-89b0-481a-9a66-530a40dc175a" />

From there, you can either create a new blank workflow or browse the premade templates to get a basic understanding of how workflows can be used.

<p align="center">
<img width="400" alt="image" src="https://github.com/user-attachments/assets/23fdb017-e439-4221-9be8-a14bd690fa9b" />
</p>
##### Workflows editor

<img alt="Workflow editor with an example workflow" src="https://github.com/user-attachments/assets/c6a569de-d884-4bdb-8bb0-0ff2c805bfb9" />

In the workflows editor, you can switch between the Visual or JSON editor. The visual editor is nice for building out the workflow; the JSON editor is nice for sharing and receiving workflow content from others.

In each workflow, there is a ***trigger*** and a sequence of ***steps.***

- Trigger: this is the entry point of each workflow; when the trigger occurs, the steps are evaluated.
- Steps: they include Filters (conditions) and Actions (effects); they can be combined to produce the desired effect of the use case you aim for.

<p align="center">
<img width="400" alt="List of available workflow steps" src="https://github.com/user-attachments/assets/50e89454-2bf9-4d41-bfa6-fd54f8944ea3" />
</p>
##### Sharing a workflow

You can share the workflow you made with others in two ways: text and JSON. Text is nice for sharing on a forum or for show-and-tell content. JSON is nice for others to make an exact copy of your workflow's configuration.

You can copy the text in the workflows summary panel on the lower right of the screen

<p align="center">
<img width="400"  alt="workflow summary in text" src="https://github.com/user-attachments/assets/dda24c88-f403-4189-a57b-71f6da3816e7" />
</p>

You can share the JSON content from the copy workflows button in the app bar, switch to the JSON editor, or use the `Show schema` button in the context menu in the workflows list

<img  alt="JSON editor" src="https://github.com/user-attachments/assets/307297cc-36d6-477c-bd72-d52be1dec0c5" />

<img  alt="Show workflow schema" src="https://github.com/user-attachments/assets/b6efada4-44fc-4d35-9e24-0f143c003313" />

> \[!NOTE]
> Please use this [discussion thread](https://github.com/immich-app/immich/discussions/29167) to propose new ideas of triggers and actions. We are looking for extensive feedback and suggestions from you all.

##### Background backup improvements

Background backup on Android is now significantly more reliable. Previously, the background backup on Android was limited to newly taken photos. Now, the app uses a new periodic task scheduler, which allows you to upload your entire library in the background, and it plays nicer with Android's background execution limits, properly cleans up tasks, and warns you when battery optimization and notification settings might interfere with backups.

On iOS, the background refresh task now runs its sync and upload work in parallel, so uploads actually start within the short time window iOS allows.

<p align="center">
<img width="300"  alt="Enable backup option on mobile" src="https://github.com/user-attachments/assets/82be41f3-93b9-4231-9f91-53eb317bb3fe" />
</p>
##### Recently added page

A new "Recently Added" page on the web and mobile lets you browse your library sorted by when assets were added to Immich, rather than when they were taken. This makes it easier to find what's new when browsing a new batch of imports. You can find the new page in the "Explore" tab on the web and in the "Search" tab on mobile.

<img width="798" height="220" alt="Recently added" src="https://github.com/user-attachments/assets/d4729864-f736-4554-a672-91861aad5f7f" />
##### Integrity checks

The maintenance page has gotten a new addition: integrity reports! Immich will scan its directories on your file system, and compare it to what it has stored in its database. If there are deviations, they will be surfaced as

- untracked, if there is a file in Immich's directories that Immich does not know of
- missing, if Immich references a file in its database that does not exist in that place (anymore)
- a checksum mismatch, if the checksum of the file on disk does not match the checksum Immich has stored for that file. Typically, this would happen through file corruption but could also be the result of a bad rename.

<img alt="Integrity report on the maintenance page showing a count of untracked and missing files, as well as checksum mismatches." src="https://github.com/user-attachments/assets/0e59537e-89b7-4d06-b5e6-731bb1e453c0" />

You can configure when and how long the job runs each night.

<img width="800" alt="image" src="https://github.com/user-attachments/assets/13da49ac-5cfa-40a1-b852-b89b0ed7fff6" />
##### Slideshow (mobile)

The slideshow experience comes to mobile! You can now sit back and let your photos and videos play across the screen, just like on the web.

<p align="center">
<img width="300" alt="Slideshow view on mobile" src="https://github.com/user-attachments/assets/b3325f3c-0505-405f-9b79-322f738030f4" />
</p>
##### HLS and Real-Time Video transcoding (preview)

Immich can now transcode videos on-the-fly without needing to generate offline transcodes. This has been a long-requested feature with many benefits:

- Quality switching (both manual and automatic)
- Transcoding to the best codecs supported by the client
- Lower storage overhead when offline transcoding is disabled
- HDR for compatible clients (not implemented yet)
- Remuxing rather than transcoding the original when bandwidth allows it (not implemented yet)

Please note that this feature is still experimental and can change behavior from version to version. It's currently only implemented in the web app, with the mobile app implementation in progress.

To enable real-time transcoding, go to the [video transcoding settings](https://my.immich.app/admin/system-settings?isOpen=video-transcoding+realtime-transcoding) (scroll down). Offline transcoding isn't directly affected by enabling it, so if you'd like to disable offline transcoding, you should also adjust the transcode policy.

> \[!NOTE]
> For assets imported prior to v3, you will also need to re-run Metadata Extraction in the job panel for them to be re-processed.

<img alt="HLS Transcoding settings" src="https://github.com/user-attachments/assets/6313ea40-ae1a-4495-aaea-212ef67fd338" />

Keep in mind that your server needs to be powerful enough to transcode in real-time for this feature to work well. Hardware acceleration is recommended, but not required, when using this feature.

##### New video player for web

A new custom video player on the web app ensures all your devices share the same controls and layout, matching the Immich design. Some basic functions, like changing the playback rate, are available. This should also fix a lot of the problems on iOS, where the OS's controls are hidden behind the Immich navbar.

##### Open photos in Immich as a gallery on Android

Immich can now act as a gallery/image viewer app on Android. Tap a photo or video in another app, choose Immich, and it opens directly in the asset viewer with options to share the file or upload it to your library.

This is the first iteration of the feature, and refinements to how Immich recognizes files that are already in your library are on the way

<img width="350" alt="image" src="https://github.com/user-attachments/assets/f98c2a65-1b84-4580-a7af-ead54ab737d8" />
<img width="350" alt="image" src="https://github.com/user-attachments/assets/fb783bed-c6c4-4634-af71-c2e888274121" />
##### OCR on the mobile app

The asset viewer now has a toggle that highlights recognized text in a photo, and you can select and copy it directly from the image.

<p align="center">
<img width="350" alt="OCR in the mobile app" src="https://github.com/user-attachments/assets/5f870d38-53a5-4b05-9dba-5d8838b86934" />
</p>
##### Upload assets directly to an album on mobile

You can now upload local photos directly to an album in the mobile app, including from the asset bottom sheet, instead of uploading first and organizing later. A small change that removes a lot of friction from the backup-and-organize flow.

##### Select image size when sharing on mobile

When sharing photos from the mobile app, you can now choose the image size before sending; it is handy for keeping shared files small for messaging apps while preserving the option to share at full quality when needed.

You can change the default behavior in the `App Settings > Preferences`

<p align="center">
<img width="350"  alt="Share file's size settings" src="https://github.com/user-attachments/assets/fe1c95d7-39e4-4c25-8981-dea4d07fce5a" />
</p>

You can also pick the option when sharing on-the-fly by long pressing the `Share` button

<p align="center">
<img width="350"  alt="On-the-fly picker" src="https://github.com/user-attachments/assets/667b79a7-efac-462b-8736-9e674e083d6b" />
</p>
##### Timeline performance Improvements

Browsing months with a large number of assets is now dramatically smoother and prevents the browser tab from locking up when your instance encounters that scenario.

##### 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>

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

##### What's Changed

##### 🚨 Breaking Changes

- refactor!: migrate class-validator to zod by [@timonrieger](https://github.com/timonrieger) in [#26597](https://github.com/immich-app/immich/pull/26597)
- refactor!: remove replace asset by [@jrasm91](https://github.com/jrasm91) in [#27022](https://github.com/immich-app/immich/pull/27022)
- refactor!: remove my shared link dto by [@jrasm91](https://github.com/jrasm91) in [#27023](https://github.com/immich-app/immich/pull/27023)
- chore!: remove deprecated env variables by [@jrasm91](https://github.com/jrasm91) in [#27802](https://github.com/immich-app/immich/pull/27802)
- chore!: remove getRandom api endpoint by [@bwees](https://github.com/bwees) in [#27780](https://github.com/immich-app/immich/pull/27780)
- chore!: remove unused token response param by [@jrasm91](https://github.com/jrasm91) in [#27805](https://github.com/immich-app/immich/pull/27805)
- refactor: yeet old timeline by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#27666](https://github.com/immich-app/immich/pull/27666)
- chore!: remove old timeline sync endpoints by [@jrasm91](https://github.com/jrasm91) in [#27804](https://github.com/immich-app/immich/pull/27804)
- chore!: remove deviceId and deviceAssetId by [@danieldietzler](https://github.com/danieldietzler) in [#27818](https://github.com/immich-app/immich/pull/27818)
- chore!: rename API key schemas by [@jrasm91](https://github.com/jrasm91) in [#27828](https://github.com/immich-app/immich/pull/27828)
- chore!: remove without assets by [@jrasm91](https://github.com/jrasm91) in [#27835](https://github.com/immich-app/immich/pull/27835)
- fix: oauth issuerUrl validation by [@bo0tzz](https://github.com/bo0tzz) in [#27848](https://github.com/immich-app/immich/pull/27848)
- fix!: do not allow insecure oauth requests by default by [@bo0tzz](https://github.com/bo0tzz) in [#27844](https://github.com/immich-app/immich/pull/27844)
- fix!: set duration to null when not present by [@meesfrensel](https://github.com/meesfrensel) in [#26982](https://github.com/immich-app/immich/pull/26982)
- chore!: remove /api/server/theme endpoint by [@jrasm91](https://github.com/jrasm91) in [#27880](https://github.com/immich-app/immich/pull/27880)
- chore!: migrate album owner to album\_user by [@danieldietzler](https://github.com/danieldietzler) in [#27467](https://github.com/immich-app/immich/pull/27467)
- refactor!: change number to integer types by [@timonrieger](https://github.com/timonrieger) in [#27912](https://github.com/immich-app/immich/pull/27912)
- refactor(server)!: move correlationId to X-Correlation-ID response header by [@timonrieger](https://github.com/timonrieger) in [#28139](https://github.com/immich-app/immich/pull/28139)
- refactor(server)!: remove redundant error and statusCode fields from error responses by [@timonrieger](https://github.com/timonrieger) in [#28140](https://github.com/immich-app/immich/pull/28140)
- chore(server)!: drop pgvecto.rs support by [@mertalev](https://github.com/mertalev) in [#28159](https://github.com/immich-app/immich/pull/28159)
- chore!: duration in milliseconds by [@mertalev](https://github.com/mertalev) in [#28003](https://github.com/immich-app/immich/pull/28003)
- refactor(server)!: sanitize error messages to avoid leaking resource details by [@timonrieger](https://github.com/timonrieger) in [#28154](https://github.com/immich-app/immich/pull/28154)
- refactor(server)!: structured validation error responses by [@timonrieger](https://github.com/timonrieger) in [#28204](https://github.com/immich-app/immich/pull/28204)
- feat(server)!: add isOwned filter to albums API by [@timonrieger](https://github.com/timonrieger) in [#28213](https://github.com/immich-app/immich/pull/28213)
- chore(ml)!: require numpy 2.4 by [@mertalev](https://github.com/mertalev) in [#28158](https://github.com/immich-app/immich/pull/28158)
- fix(deps): update dependency nestjs-otel to v8 by [@renovate](https://github.com/renovate)\[bot] in [#27863](https://github.com/immich-app/immich/pull/27863)
- chore(ml)!: remove deprecated envs by [@mertalev](https://github.com/mertalev) in [#28326](https://github.com/immich-app/immich/pull/28326)
- chore(server)!: remove libopus enum by [@mertalev](https://github.com/mertalev) in [#28325](https://github.com/immich-app/immich/pull/28325)
- refactor!: remove asset faces from AssetResponseDto by [@bwees](https://github.com/bwees) in [#27779](https://github.com/immich-app/immich/pull/27779)
- refactor(server)!: drop empty string to null conversion by [@timonrieger](https://github.com/timonrieger) in [#28808](https://github.com/immich-app/immich/pull/28808)
- refactor(server)!: remove changeExpiryTime by [@timonrieger](https://github.com/timonrieger) in [#28816](https://github.com/immich-app/immich/pull/28816)
- refactor!: disallow star rating < 1 by [@meesfrensel](https://github.com/meesfrensel) in [#27896](https://github.com/immich-app/immich/pull/27896)
- fix!: search endpoints visibility can be omitted by [@danieldietzler](https://github.com/danieldietzler) in [#29385](https://github.com/immich-app/immich/pull/29385)

##### 🫥 Deprecated Changes

- refactor(server): deprecate PUT routes in favor of PATCH by [@timonrieger](https://github.com/timonrieger) in [#28859](https://github.com/immich-app/immich/pull/28859)

##### 🔒 Security

- fix: run profile picture through thumbnail pipeline by [@bo0tzz](https://github.com/bo0tzz) in [#27890](https://github.com/immich-app/immich/pull/27890)

##### 🚀 Features

- feat: mobile editing by [@bwees](https://github.com/bwees) in [#25397](https://github.com/immich-app/immich/pull/25397)
- feat: album map markers endpoint by [@jrasm91](https://github.com/jrasm91) in [#27830](https://github.com/immich-app/immich/pull/27830)
- feat(server): added backchannel logout api endpoint by [@santanoce](https://github.com/santanoce) in [#26235](https://github.com/immich-app/immich/pull/26235)
- feat(server): add OIDC logout URL override option by [@LJspice](https://github.com/LJspice) in [#27389](https://github.com/immich-app/immich/pull/27389)
- feat: android periodic work manager task by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#23563](https://github.com/immich-app/immich/pull/23563)
- feat(web): custom video player controls by [@meesfrensel](https://github.com/meesfrensel) in [#26183](https://github.com/immich-app/immich/pull/26183)
- feat(web): add full-path search mode to UI by [@mws-weekend-projects](https://github.com/mws-weekend-projects) in [#26758](https://github.com/immich-app/immich/pull/26758)
- feat: recently added assets page by [@benbeckford](https://github.com/benbeckford) in [#28272](https://github.com/immich-app/immich/pull/28272)
- feat(mobile): slideshow view by [@benbeckford](https://github.com/benbeckford) in [#28421](https://github.com/immich-app/immich/pull/28421)
- feat(mobile): "Add Tags" asset multiselect option by [@benjamonnguyen](https://github.com/benjamonnguyen) in [#26269](https://github.com/immich-app/immich/pull/26269)
- feat: workflows & plugins by [@jrasm91](https://github.com/jrasm91) in [#26727](https://github.com/immich-app/immich/pull/26727)
- feat(server): hls with real-time transcoding by [@mertalev](https://github.com/mertalev) in [#28230](https://github.com/immich-app/immich/pull/28230)
- feat(web): hls player by [@mertalev](https://github.com/mertalev) in [#28312](https://github.com/immich-app/immich/pull/28312)
- feat(mobile): Android. Immich as a gallery / image viewer app by [@PeterOmbodi](https://github.com/PeterOmbodi) in [#26109](https://github.com/immich-app/immich/pull/26109)
- feat: user upload heatmap by [@bondeabhijeet](https://github.com/bondeabhijeet) in [#28593](https://github.com/immich-app/immich/pull/28593)
- feat(mobile): ocr support by [@YarosMallorca](https://github.com/YarosMallorca) in [#26523](https://github.com/immich-app/immich/pull/26523)
- feat: geolocation workflow filter by [@benbeckford](https://github.com/benbeckford) in [#28961](https://github.com/immich-app/immich/pull/28961)
- feat: image quality option in sharing by [@alextran1502](https://github.com/alextran1502) in [#28918](https://github.com/immich-app/immich/pull/28918)
- feat: integrity check jobs (missing files, untracked files, checksums) by [@insertish](https://github.com/insertish) in [#24205](https://github.com/immich-app/immich/pull/24205)
- feat: new feature message by [@alextran1502](https://github.com/alextran1502) in [#29388](https://github.com/immich-app/immich/pull/29388)

##### 🌟 Enhancements

- feat(web): persist state of file path information in details panel by [@cratoo](https://github.com/cratoo) in [#27770](https://github.com/immich-app/immich/pull/27770)
- feat: commands by [@jrasm91](https://github.com/jrasm91) in [#27546](https://github.com/immich-app/immich/pull/27546)
- feat: upgrade immich/ui by [@jrasm91](https://github.com/jrasm91) in [#27792](https://github.com/immich-app/immich/pull/27792)
- feat: filter users on share by [@OdinOxin](https://github.com/OdinOxin) in [#27732](https://github.com/immich-app/immich/pull/27732)
- fix(server): render storage template date/time tokens in UTC ([#24350](https://github.com/immich-app/immich/issues/24350)) by [@migpovrap](https://github.com/migpovrap) in [#26917](https://github.com/immich-app/immich/pull/26917)
- feat(web): lazy load library and server statistics by [@etnoy](https://github.com/etnoy) in [#26406](https://github.com/immich-app/immich/pull/26406)
- feat: sort users alphabetically when adding to album by [@OdinOxin](https://github.com/OdinOxin) in [#27731](https://github.com/immich-app/immich/pull/27731)
- feat: auth logout page by [@jrasm91](https://github.com/jrasm91) in [#27831](https://github.com/immich-app/immich/pull/27831)
- chore: improve randomness of /search/random endpoint by [@StevenMassaro](https://github.com/StevenMassaro) in [#27531](https://github.com/immich-app/immich/pull/27531)
- feat: dynamic languages by [@jrasm91](https://github.com/jrasm91) in [#27869](https://github.com/immich-app/immich/pull/27869)
- feat: cache shared link by [@danieldietzler](https://github.com/danieldietzler) in [#27889](https://github.com/immich-app/immich/pull/27889)
- feat(server): add configurable OAuth prompt parameter by [@sparsh985](https://github.com/sparsh985) in [#26755](https://github.com/immich-app/immich/pull/26755)
- feat(server): add MPO file type support by [@git-akihakune](https://github.com/git-akihakune) in [#27963](https://github.com/immich-app/immich/pull/27963)
- feat(mobile): action bottom sheet on map timeline by [@YarosMallorca](https://github.com/YarosMallorca) in [#27515](https://github.com/immich-app/immich/pull/27515)
- feat(server): track video metadata by [@mertalev](https://github.com/mertalev) in [#28023](https://github.com/immich-app/immich/pull/28023)
- feat(enhancement): Navigate stack with up and down arrow keys by [@cratoo](https://github.com/cratoo) in [#27854](https://github.com/immich-app/immich/pull/27854)
- fix(web): migrate people management component to page, enabling tooltips by [@SkyDev125](https://github.com/SkyDev125) in [#26971](https://github.com/immich-app/immich/pull/26971)
- chore(mobile): add box shadow to asset details by [@uhthomas](https://github.com/uhthomas) in [#27510](https://github.com/immich-app/immich/pull/27510)
- feat: hide hidden person from memories by [@sakshamchawla](https://github.com/sakshamchawla) in [#20877](https://github.com/immich-app/immich/pull/20877)
- feat(mobile): increased tap area on video player overlay by [@YarosMallorca](https://github.com/YarosMallorca) in [#27269](https://github.com/immich-app/immich/pull/27269)
- feat(web): Add metadata overlay to slideshow by [@timonrieger](https://github.com/timonrieger) in [#24627](https://github.com/immich-app/immich/pull/24627)
- feat(web): add individual filter removal from search result chips by [@timonrieger](https://github.com/timonrieger) in [#28166](https://github.com/immich-app/immich/pull/28166)
- feat(mobile): trash/restore all by [@YarosMallorca](https://github.com/YarosMallorca) in [#28116](https://github.com/immich-app/immich/pull/28116)
- feat: display more info in asset viewer by [@alextran1502](https://github.com/alextran1502) in [#24630](https://github.com/immich-app/immich/pull/24630)
- feat(server): allow subpaths for machine learning URL by [@gnojus](https://github.com/gnojus) in [#28427](https://github.com/immich-app/immich/pull/28427)
- feat(ui): Shared URL input configuration by [@Lauritz-Tieste](https://github.com/Lauritz-Tieste) in [#27105](https://github.com/immich-app/immich/pull/27105)
- refactor: enhance shared link UI and functionality by [@Lauritz-Tieste](https://github.com/Lauritz-Tieste) in [#26464](https://github.com/immich-app/immich/pull/26464)
- feat: upload and add local asset directly to album by [@alextran1502](https://github.com/alextran1502) in [#28123](https://github.com/immich-app/immich/pull/28123)
- feat: Selectable metadata in duplicates utility with diffing by [@ollioddi](https://github.com/ollioddi) in [#26328](https://github.com/immich-app/immich/pull/26328)
- fix: improve form control focus visibility by [@Caltsic](https://github.com/Caltsic) in [#28512](https://github.com/immich-app/immich/pull/28512)
- feat: command for user pages by [@alextran1502](https://github.com/alextran1502) in [#28554](https://github.com/immich-app/immich/pull/28554)
- refactor: use ControlBar UI Library component by [@bwees](https://github.com/bwees) in [#28567](https://github.com/immich-app/immich/pull/28567)
- feat: workflow template by [@alextran1502](https://github.com/alextran1502) in [#28553](https://github.com/immich-app/immich/pull/28553)
- feat(mobile): improve downloading algorithm for sharing by [@YarosMallorca](https://github.com/YarosMallorca) in [#27312](https://github.com/immich-app/immich/pull/27312)
- feat: search by album name and id by [@jrasm91](https://github.com/jrasm91) in [#28672](https://github.com/immich-app/immich/pull/28672)
- feat: upload local assets to album from bottom sheet by [@alextran1502](https://github.com/alextran1502) in [#28531](https://github.com/immich-app/immich/pull/28531)
- feat: places in context search by [@timonrieger](https://github.com/timonrieger) in [#28768](https://github.com/immich-app/immich/pull/28768)
- feat: minimum face count per user by [@timjonez](https://github.com/timjonez) in [#27452](https://github.com/immich-app/immich/pull/27452)
- feat: show notification and battery optimization warning by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#26610](https://github.com/immich-app/immich/pull/26610)
- feat: workflows drag and drop enhancements by [@danieldietzler](https://github.com/danieldietzler) in [#28764](https://github.com/immich-app/immich/pull/28764)
- feat(mobile): min face count per-user by [@YarosMallorca](https://github.com/YarosMallorca) in [#28805](https://github.com/immich-app/immich/pull/28805)
- refactor(server): allow -1 rating again by [@timonrieger](https://github.com/timonrieger) in [#28886](https://github.com/immich-app/immich/pull/28886)
- feat(web): warn before overwriting existing locations in geolocation utility by [@yoshovski](https://github.com/yoshovski) in [#28840](https://github.com/immich-app/immich/pull/28840)
- feat: warn if microservices worker is missing by [@bo0tzz](https://github.com/bo0tzz) in [#28869](https://github.com/immich-app/immich/pull/28869)
- fix(web): show album names in duplicate review by [@meesfrensel](https://github.com/meesfrensel) in [#29080](https://github.com/immich-app/immich/pull/29080)
- feat: keyboard seeking for new video player by [@danieldietzler](https://github.com/danieldietzler) in [#29208](https://github.com/immich-app/immich/pull/29208)
- feat(web): Add text-white-shadow to elements and increase the shadows effect by [@Vogeluff](https://github.com/Vogeluff) in [#29165](https://github.com/immich-app/immich/pull/29165)
- feat: webhook workflow action by [@benbeckford](https://github.com/benbeckford) in [#29258](https://github.com/immich-app/immich/pull/29258)
- feat: integrity checks admin settings by [@danieldietzler](https://github.com/danieldietzler) in [#29406](https://github.com/immich-app/immich/pull/29406)

##### 🐛 Bug fixes

- fix(web): center images in RTL layouts ([#27678](https://github.com/immich-app/immich/issues/27678)) by [@Nicolas-micuda-becker](https://github.com/Nicolas-micuda-becker) in [#27753](https://github.com/immich-app/immich/pull/27753)
- fix(mobile): add keys for person tiles in search by [@YarosMallorca](https://github.com/YarosMallorca) in [#27689](https://github.com/immich-app/immich/pull/27689)
- fix(web): selection clearing on preview by [@YarosMallorca](https://github.com/YarosMallorca) in [#27702](https://github.com/immich-app/immich/pull/27702)
- fix: asset multi select download shortcut by [@danieldietzler](https://github.com/danieldietzler) in [#27784](https://github.com/immich-app/immich/pull/27784)
- fix(web): add partner photo to album from multiselect by [@YarosMallorca](https://github.com/YarosMallorca) in [#27767](https://github.com/immich-app/immich/pull/27767)
- fix: redirect original by [@danieldietzler](https://github.com/danieldietzler) in [#27759](https://github.com/immich-app/immich/pull/27759)
- fix: make web build stage deterministic by [@bo0tzz](https://github.com/bo0tzz) in [#27823](https://github.com/immich-app/immich/pull/27823)
- fix(web): svelte regression - cancel video preview fetch when bind:this is cleared early by [@midzelis](https://github.com/midzelis) in [#27713](https://github.com/immich-app/immich/pull/27713)
- fix(web): stale adaptive image when original overlays preview by [@midzelis](https://github.com/midzelis) in [#27621](https://github.com/immich-app/immich/pull/27621)
- fix(mobile): readonly redirect when not logged in by [@YarosMallorca](https://github.com/YarosMallorca) in [#27728](https://github.com/immich-app/immich/pull/27728)
- fix(web): close edit faces panel on Escape key press by [@midzelis](https://github.com/midzelis) in [#27519](https://github.com/immich-app/immich/pull/27519)
- fix(oauth): normalize email claim to lowercase and trim before account lookup and registration by [@timdobras](https://github.com/timdobras) in [#26841](https://github.com/immich-app/immich/pull/26841)
- fix(web): use event for zooming out after opening face editor by [@meesfrensel](https://github.com/meesfrensel) in [#27789](https://github.com/immich-app/immich/pull/27789)
- fix: sanitize filenames before adding to zip by [@bo0tzz](https://github.com/bo0tzz) in [#27893](https://github.com/immich-app/immich/pull/27893)
- fix(server): require at least one field to be set when updating memory by [@fredfloydd](https://github.com/fredfloydd) in [#27842](https://github.com/immich-app/immich/pull/27842)
- fix(web): compute hashes for uploads in chunks by [@fredfloydd](https://github.com/fredfloydd) in [#27878](https://github.com/immich-app/immich/pull/27878)
- fix(web): fix stale album page load by [@fredfloydd](https://github.com/fredfloydd) in [#27825](https://github.com/immich-app/immich/pull/27825)
- fix(web): prevent interaction with detail panel behind person side panel by [@midzelis](https://github.com/midzelis) in [#27309](https://github.com/immich-app/immich/pull/27309)
- fix: show neon light by [@alextran1502](https://github.com/alextran1502) in [#27994](https://github.com/immich-app/immich/pull/27994)
- fix(mobile): zero exposure by [@YarosMallorca](https://github.com/YarosMallorca) in [#28017](https://github.com/immich-app/immich/pull/28017)
- fix(mobile): clear local data on forced logout by [@LeLunZ](https://github.com/LeLunZ) in [#27957](https://github.com/immich-app/immich/pull/27957)
- fix(mobile): enable autoplay for motion photos in video viewer by [@LeLunZ](https://github.com/LeLunZ) in [#27961](https://github.com/immich-app/immich/pull/27961)
- fix(mobile): thumbnail transition to asset viewer by [@LeLunZ](https://github.com/LeLunZ) in [#27850](https://github.com/immich-app/immich/pull/27850)
- fix: jump to timeline on new auto\_router update by [@alextran1502](https://github.com/alextran1502) in [#28022](https://github.com/immich-app/immich/pull/28022)
- fix(mobile): delete assets on trash empty, Android by [@PeterOmbodi](https://github.com/PeterOmbodi) in [#26070](https://github.com/immich-app/immich/pull/26070)
- fix(ml): handle empty/corrupt images in face detection by [@yosit](https://github.com/yosit) in [#27391](https://github.com/immich-app/immich/pull/27391)
- fix(web): refresh memories hourly by [@meesfrensel](https://github.com/meesfrensel) in [#28114](https://github.com/immich-app/immich/pull/28114)
- fix(web): large files: better handling of asset deletions by [@meesfrensel](https://github.com/meesfrensel) in [#28117](https://github.com/immich-app/immich/pull/28117)
- fix(web): double video playback on map timeline by [@YarosMallorca](https://github.com/YarosMallorca) in [#28090](https://github.com/immich-app/immich/pull/28090)
- fix(mobile): suppress asset stack UI in trash timeline by [@PeterOmbodi](https://github.com/PeterOmbodi) in [#26536](https://github.com/immich-app/immich/pull/26536)
- fix(web): timeline scroll when pressing back from stacked asset by [@Snowknight26](https://github.com/Snowknight26) in [#28163](https://github.com/immich-app/immich/pull/28163)
- fix(server): selectively apply metadata bitstream filter for video thumbnails by [@pinhao](https://github.com/pinhao) in [#28162](https://github.com/immich-app/immich/pull/28162)
- fix(web): fix shared link /s/photos.\* navigation after password login by [@meesfrensel](https://github.com/meesfrensel) in [#27788](https://github.com/immich-app/immich/pull/27788)
- fix(ml): respect time zone for logs in cuda container by [@AyaanMAG](https://github.com/AyaanMAG) in [#28155](https://github.com/immich-app/immich/pull/28155)
- fix: librknnrt permissions in machine-learning by [@DavidTheFighter](https://github.com/DavidTheFighter) in [#28216](https://github.com/immich-app/immich/pull/28216)
- fix(server): validate duplicate group ownership before dismissal by [@timonrieger](https://github.com/timonrieger) in [#28221](https://github.com/immich-app/immich/pull/28221)
- fix(web): correct timeline yesterday label across month boundaries by [@michelheusschen](https://github.com/michelheusschen) in [#28183](https://github.com/immich-app/immich/pull/28183)
- fix(mobile): show lens info without lens name by [@benbeckford](https://github.com/benbeckford) in [#28234](https://github.com/immich-app/immich/pull/28234)
- fix: stale person name after merge by [@danieldietzler](https://github.com/danieldietzler) in [#28222](https://github.com/immich-app/immich/pull/28222)
- fix(web): shared album avatars opening modal by [@meesfrensel](https://github.com/meesfrensel) in [#26719](https://github.com/immich-app/immich/pull/26719)
- fix(mobile): prevent asset loading issues when changing page or when closing memories by [@LeLunZ](https://github.com/LeLunZ) in [#27596](https://github.com/immich-app/immich/pull/27596)
- fix(mobile): correct filter default and UI desync in similar photos search by [@TheBestX11](https://github.com/TheBestX11) in [#27516](https://github.com/immich-app/immich/pull/27516)
- fix(server): hide isFavorite from partner asset sync stream by [@timonrieger](https://github.com/timonrieger) in [#28035](https://github.com/immich-app/immich/pull/28035)
- fix(mobile): restore notification plugin init by [@santoshakil](https://github.com/santoshakil) in [#28284](https://github.com/immich-app/immich/pull/28284)
- fix(mobile): mounted check before setState in album sync action by [@santoshakil](https://github.com/santoshakil) in [#28300](https://github.com/immich-app/immich/pull/28300)
- fix(mobile): avoid duplicate assets in album view by [@stfn42](https://github.com/stfn42) in [#28152](https://github.com/immich-app/immich/pull/28152)
- fix(mobile): Deduplicate assets in person view timeline by [@thowdev](https://github.com/thowdev) in [#26723](https://github.com/immich-app/immich/pull/26723)
- fix(deployment): remove unneeded volume by [@mmomjian](https://github.com/mmomjian) in [#28307](https://github.com/immich-app/immich/pull/28307)
- fix: mobile upload duration type by [@alextran1502](https://github.com/alextran1502) in [#28362](https://github.com/immich-app/immich/pull/28362)
- fix: deep link for assets when asset viewer already open by [@bwees](https://github.com/bwees) in [#27971](https://github.com/immich-app/immich/pull/27971)
- fix: kekab icon colors in light mode by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#28366](https://github.com/immich-app/immich/pull/28366)
- fix: indexes on remote\_asset\_entity by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#28264](https://github.com/immich-app/immich/pull/28264)
- fix(mobile): clear linkedRemoteAlbumId in reset() so FK refs dont dangle by [@santoshakil](https://github.com/santoshakil) in [#28382](https://github.com/immich-app/immich/pull/28382)
- fix: ignore icc profile make and model by [@jrasm91](https://github.com/jrasm91) in [#28412](https://github.com/immich-app/immich/pull/28412)
- fix(mobile): don't block app open on slow validateAccessToken by [@santoshakil](https://github.com/santoshakil) in [#28405](https://github.com/immich-app/immich/pull/28405)
- fix(mobile): add restore option to trashed assets by [@inesiscosta](https://github.com/inesiscosta) in [#27442](https://github.com/immich-app/immich/pull/27442)
- fix(mobile): use correct delete action by [@ByteSizedMarius](https://github.com/ByteSizedMarius) in [#26575](https://github.com/immich-app/immich/pull/26575)
- fix(server): dedupe database backup jobs by [@rdeaton](https://github.com/rdeaton) in [#28341](https://github.com/immich-app/immich/pull/28341)
- fix(mobile): cronet buffer overflow on compressed thumbnails by [@santoshakil](https://github.com/santoshakil) in [#28439](https://github.com/immich-app/immich/pull/28439)
- fix(mobile): cronet thumbnail buffer overflow regression from [#28439](https://github.com/immich-app/immich/issues/28439) by [@santoshakil](https://github.com/santoshakil) in [#28450](https://github.com/immich-app/immich/pull/28450)
- fix(mobile): mounted check in ThumbnailTile hero flight listener by [@santoshakil](https://github.com/santoshakil) in [#28451](https://github.com/immich-app/immich/pull/28451)
- fix(mobile): don't force-unwrap nil localizedTitle in ios getAlbums by [@santoshakil](https://github.com/santoshakil) in [#28452](https://github.com/immich-app/immich/pull/28452)
- fix(web): work around Chrome HDR image seam lines during zoom by [@midzelis](https://github.com/midzelis) in [#27715](https://github.com/immich-app/immich/pull/27715)
- fix(ios): respect status bar scroll to top in timeline views by [@agg23](https://github.com/agg23) in [#28469](https://github.com/immich-app/immich/pull/28469)
- fix(mobile): asset viewer stuck on spinner after rotation by [@LeLunZ](https://github.com/LeLunZ) in [#28019](https://github.com/immich-app/immich/pull/28019)
- fix(web): timeline stuttering with many assets in 1 day by [@benbeckford](https://github.com/benbeckford) in [#28509](https://github.com/immich-app/immich/pull/28509)
- fix(mobile): preserve zoom level during image loading and live photo playback by [@LeLunZ](https://github.com/LeLunZ) in [#27960](https://github.com/immich-app/immich/pull/27960)
- fix(ml): stabilize MIGraphX inference by [@fabianwimberger](https://github.com/fabianwimberger) in [#28444](https://github.com/immich-app/immich/pull/28444)
- fix: await sync asset v2 by [@bwees](https://github.com/bwees) in [#28569](https://github.com/immich-app/immich/pull/28569)
- fix: strip metadata from timeline responses for shared links without exif sharing by [@danieldietzler](https://github.com/danieldietzler) in [#28644](https://github.com/immich-app/immich/pull/28644)
- fix: Refresh local album overview page after asset deletion by [@Lauritz-Tieste](https://github.com/Lauritz-Tieste) in [#28586](https://github.com/immich-app/immich/pull/28586)
- fix(server): prevent locked assets from leaking to partners by [@timonrieger](https://github.com/timonrieger) in [#28652](https://github.com/immich-app/immich/pull/28652)
- refactor(web): replace per-asset viewport proximity with day-tier active indices by [@midzelis](https://github.com/midzelis) in [#28597](https://github.com/immich-app/immich/pull/28597)
- fix: timeline scroll flicker by [@alextran1502](https://github.com/alextran1502) in [#28653](https://github.com/immich-app/immich/pull/28653)
- fix: api repositories using stale endpoint by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#28667](https://github.com/immich-app/immich/pull/28667)
- fix: disallow cross origin/non http protocols for continueUrl on login by [@bwees](https://github.com/bwees) in [#28706](https://github.com/immich-app/immich/pull/28706)
- fix(web): skip thumbhash fade for offscreen thumbnails by [@midzelis](https://github.com/midzelis) in [#27335](https://github.com/immich-app/immich/pull/27335)
- fix(web): prevent partner assets from being selected in geolocation utility by [@okxint](https://github.com/okxint) in [#28737](https://github.com/immich-app/immich/pull/28737)
- fix(mobile): invisible ink splashes in asset sheet by [@timonrieger](https://github.com/timonrieger) in [#28756](https://github.com/immich-app/immich/pull/28756)
- fix!: unauthorized face creation by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#28561](https://github.com/immich-app/immich/pull/28561)
- fix(mobile): proper background task cleanup by [@mertalev](https://github.com/mertalev) in [#28694](https://github.com/immich-app/immich/pull/28694)
- fix(cli): prevent out-of-memory on file upload due to undici storing the request body by [@moversity](https://github.com/moversity) in [#28723](https://github.com/immich-app/immich/pull/28723)
- fix: error log on aborted uploads by [@jrasm91](https://github.com/jrasm91) in [#28806](https://github.com/immich-app/immich/pull/28806)
- fix(server): respect timezone in iso date string encoding by [@timonrieger](https://github.com/timonrieger) in [#28810](https://github.com/immich-app/immich/pull/28810)
- test: fix tests when OpenVINO provider is available by [@nekowinston](https://github.com/nekowinston) in [#28802](https://github.com/immich-app/immich/pull/28802)
- fix(mobile): run iOS bg task phases in parallel by [@santoshakil](https://github.com/santoshakil) in [#28293](https://github.com/immich-app/immich/pull/28293)
- fix: error handling by [@jrasm91](https://github.com/jrasm91) in [#28843](https://github.com/immich-app/immich/pull/28843)
- fix: cross isolate drift watchers by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#28862](https://github.com/immich-app/immich/pull/28862)
- fix: reload timeline on group by setting change by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#28864](https://github.com/immich-app/immich/pull/28864)
- fix(web): use irot/imir tags for HEIF Orientation by [@joojoooo](https://github.com/joojoooo) in [#27820](https://github.com/immich-app/immich/pull/27820)
- fix: detail panel faces reactivity issues by [@danieldietzler](https://github.com/danieldietzler) in [#28910](https://github.com/immich-app/immich/pull/28910)
- fix(server): hide isFavorite from album asset sync stream by [@timonrieger](https://github.com/timonrieger) in [#28923](https://github.com/immich-app/immich/pull/28923)
- fix(mobile): show memory and folder dates in local time by [@santoshakil](https://github.com/santoshakil) in [#28941](https://github.com/immich-app/immich/pull/28941)
- fix(mobile): show error when creating an album fails by [@santoshakil](https://github.com/santoshakil) in [#28942](https://github.com/immich-app/immich/pull/28942)
- fix(mobile): add album picker to archive bottom sheet by [@santoshakil](https://github.com/santoshakil) in [#28953](https://github.com/immich-app/immich/pull/28953)
- fix: normalize diacritics in person name search in Web & Mobile by [@pedrovieira](https://github.com/pedrovieira) in [#28887](https://github.com/immich-app/immich/pull/28887)
- fix(web): Prevent face editor from closing when dismissing tag confirmation by [@pedrovieira](https://github.com/pedrovieira) in [#28900](https://github.com/immich-app/immich/pull/28900)
- fix(mobile): map timeline layout crash by [@YarosMallorca](https://github.com/YarosMallorca) in [#28878](https://github.com/immich-app/immich/pull/28878)
- fix(mobile): deduplicate people in asset details panel by [@santoshakil](https://github.com/santoshakil) in [#28972](https://github.com/immich-app/immich/pull/28972)
- fix(mobile): keep timezone when editing asset date time by [@santoshakil](https://github.com/santoshakil) in [#28978](https://github.com/immich-app/immich/pull/28978)
- fix(mobile): stale details after editing asset date by [@santoshakil](https://github.com/santoshakil) in [#28977](https://github.com/immich-app/immich/pull/28977)
- fix(mobile): show albums whose assets are all trashed by [@santoshakil](https://github.com/santoshakil) in [#28985](https://github.com/immich-app/immich/pull/28985)
- fix(mobile): give android notification channels proper names by [@santoshakil](https://github.com/santoshakil) in [#28986](https://github.com/immich-app/immich/pull/28986)
- fix: Improving scroll behavior on image stacks that overflow the screen by [@BlankCanvasStudio](https://github.com/BlankCanvasStudio) in [#28885](https://github.com/immich-app/immich/pull/28885)
- fix(web): focus on scrollable element on load by [@timonrieger](https://github.com/timonrieger) in [#29004](https://github.com/immich-app/immich/pull/29004)
- fix(mobile): show like and comment options on album photo deep links by [@santoshakil](https://github.com/santoshakil) in [#29020](https://github.com/immich-app/immich/pull/29020)
- fix(web): correctly handle person search with more than 100 results by [@maxinegardenas](https://github.com/maxinegardenas) in [#29002](https://github.com/immich-app/immich/pull/29002)
- fix(web): prevent upload status panel from overlapping album action bar by [@okxint](https://github.com/okxint) in [#29044](https://github.com/immich-app/immich/pull/29044)
- fix(web): error loading image state by [@bwees](https://github.com/bwees) in [#29058](https://github.com/immich-app/immich/pull/29058)
- fix(web): show asset arrows by [@timonrieger](https://github.com/timonrieger) in [#29010](https://github.com/immich-app/immich/pull/29010)
- fix(server): hide partner archived asset locations from map by [@timonrieger](https://github.com/timonrieger) in [#29028](https://github.com/immich-app/immich/pull/29028)
- fix: lock transcoding options by [@timonrieger](https://github.com/timonrieger) in [#29076](https://github.com/immich-app/immich/pull/29076)
- fix(server): do not merge metadata when multiple duplicates are kept by [@timonrieger](https://github.com/timonrieger) in [#29035](https://github.com/immich-app/immich/pull/29035)
- fix: integrity report checksum query by [@danieldietzler](https://github.com/danieldietzler) in [#29136](https://github.com/immich-app/immich/pull/29136)
- fix: map settings by [@danieldietzler](https://github.com/danieldietzler) in [#29134](https://github.com/immich-app/immich/pull/29134)
- fix: too strict cron expression validation by [@danieldietzler](https://github.com/danieldietzler) in [#29138](https://github.com/immich-app/immich/pull/29138)
- fix(web): respect local timezone when building date range for search by [@okxint](https://github.com/okxint) in [#29128](https://github.com/immich-app/immich/pull/29128)
- fix(web): language selector by [@meesfrensel](https://github.com/meesfrensel) in [#29065](https://github.com/immich-app/immich/pull/29065)
- fix: update datetimeRelative description to minutes instead of seconds by [@meesfrensel](https://github.com/meesfrensel) in [#29137](https://github.com/immich-app/immich/pull/29137)
- fix: video thumbnail quality sharing by [@bwees](https://github.com/bwees) in [#29104](https://github.com/immich-app/immich/pull/29104)
- fix(mobile): stop sync albums crashing on the main isolate by [@santoshakil](https://github.com/santoshakil) in [#29133](https://github.com/immich-app/immich/pull/29133)
- fix(mobile): show memories with no showAt/hideAt in the timeline lane by [@santoshakil](https://github.com/santoshakil) in [#29158](https://github.com/immich-app/immich/pull/29158)
- fix(mobile): keep toasts off the dynamic island when keyboard is open by [@santoshakil](https://github.com/santoshakil) in [#29159](https://github.com/immich-app/immich/pull/29159)
- fix(server): skip existing users when sharing albums by [@jeevan6996](https://github.com/jeevan6996) in [#28884](https://github.com/immich-app/immich/pull/28884)
- fix: web i18n by [@danieldietzler](https://github.com/danieldietzler) in [#29175](https://github.com/immich-app/immich/pull/29175)
- fix(web): shift+click on GPS asset extends range selection in geolocation utility by [@timonrieger](https://github.com/timonrieger) in [#29022](https://github.com/immich-app/immich/pull/29022)
- fix(server): allow non-utc datetime offsets by [@timonrieger](https://github.com/timonrieger) in [#29186](https://github.com/immich-app/immich/pull/29186)
- fix: remove local-only step ids from workflow json by [@danieldietzler](https://github.com/danieldietzler) in [#29188](https://github.com/immich-app/immich/pull/29188)
- fix: asset type filter by [@danieldietzler](https://github.com/danieldietzler) in [#29190](https://github.com/immich-app/immich/pull/29190)
- fix(mobile): prevent duplicate login pages for unauthenticated share intent warm start by [@olildu](https://github.com/olildu) in [#29054](https://github.com/immich-app/immich/pull/29054)
- fix(mobile): refresh memories on resume and day change by [@santoshakil](https://github.com/santoshakil) in [#28983](https://github.com/immich-app/immich/pull/28983)
- fix(mobile): re-lock locked folder when the app is backgrounded by [@santoshakil](https://github.com/santoshakil) in [#29089](https://github.com/immich-app/immich/pull/29089)
- fix(mobile): endless spinner on album selection when device has no albums by [@santoshakil](https://github.com/santoshakil) in [#28994](https://github.com/immich-app/immich/pull/28994)
- fix: rc version check by [@danieldietzler](https://github.com/danieldietzler) in [#29194](https://github.com/immich-app/immich/pull/29194)
- fix: detail panel people reactivity and iterator consumption by [@danieldietzler](https://github.com/danieldietzler) in [#29250](https://github.com/immich-app/immich/pull/29250)
- fix(server): use VBR for QSV so the max bitrate is respected by [@aclerici38](https://github.com/aclerici38) in [#29240](https://github.com/immich-app/immich/pull/29240)
- fix: ignore external libraries for integrity report checksum check by [@danieldietzler](https://github.com/danieldietzler) in [#29248](https://github.com/immich-app/immich/pull/29248)
- fix(web): remove map's fullscreen button by [@meesfrensel](https://github.com/meesfrensel) in [#29192](https://github.com/immich-app/immich/pull/29192)
- refactor: use SemVer classes for version compatability message by [@bwees](https://github.com/bwees) in [#29056](https://github.com/immich-app/immich/pull/29056)
- fix: sync backfill by [@jrasm91](https://github.com/jrasm91) in [#29267](https://github.com/immich-app/immich/pull/29267)
- fix(mobile): force AssetViewerPage recreation on repeated view intents by [@okxint](https://github.com/okxint) in…
renovate Bot added a commit to sdwilsh/ansible-playbooks that referenced this pull request Jul 21, 2026
##### [\`v3.0.3\`](https://github.com/immich-app/immich/releases/tag/v3.0.3)

##### v3.0.3

- various bug fixes
- we push to our own F-Droid repo at <https://app.futo.org/fdroid/repo> now. If you're using F-Droid, please pull the application from there from now on
- fixes an issue where LivePhotos upload from the background isn't showing up.

> \[!Note]
> In some specific circumstances, newly uploaded Live Photos could have broken thumbnails. If you see any such cases, please run the "missing" job for thumbnails or wait for the respective nightly job to clear it up.

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

##### What's Changed

##### 🚀 Features

- feat: publish app releases to FUTO F-Droid repo by [@bo0tzz](https://github.com/bo0tzz) in [#29804](https://github.com/immich-app/immich/pull/29804)

##### 🐛 Bug fixes

- fix(web): closing plugin method picker selects "unknown" method by [@benbeckford](https://github.com/benbeckford) in [#29784](https://github.com/immich-app/immich/pull/29784)
- fix: unauthorized album owner update by [@danieldietzler](https://github.com/danieldietzler) in [#29883](https://github.com/immich-app/immich/pull/29883)
- fix: still part of live photo hidden on bg upload by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#29884](https://github.com/immich-app/immich/pull/29884)
- fix: system appbar icon color has incorrect color in asset viewer by [@alextran1502](https://github.com/alextran1502) in [#29885](https://github.com/immich-app/immich/pull/29885)
- fix: locked visibility in search random endpoint by [@danieldietzler](https://github.com/danieldietzler) in [#29887](https://github.com/immich-app/immich/pull/29887)
- fix(mobile): send a full datetime from the android memories widget by [@santoshakil](https://github.com/santoshakil) in [#29689](https://github.com/immich-app/immich/pull/29689)
- fix: memory search date validation by [@danieldietzler](https://github.com/danieldietzler) in [#29907](https://github.com/immich-app/immich/pull/29907)
- fix(server): set hvc1 tag when using hwa by [@mertalev](https://github.com/mertalev) in [#29908](https://github.com/immich-app/immich/pull/29908)
- fix(mobile): clear zoom state when swapping assets by [@agg23](https://github.com/agg23) in [#29909](https://github.com/immich-app/immich/pull/29909)
- fix: Ken Burns effect on sliver app bar jittery on Android by [@alextran1502](https://github.com/alextran1502) in [#29890](https://github.com/immich-app/immich/pull/29890)

##### 📚 Documentation

- fix(docs): update fdroid link  by [@mmomjian](https://github.com/mmomjian) in [#29797](https://github.com/immich-app/immich/pull/29797)
- feat: system integrity docs by [@danieldietzler](https://github.com/danieldietzler) in [#29911](https://github.com/immich-app/immich/pull/29911)

##### 🌐 Translations

- chore(web): update translations by [@weblate](https://github.com/weblate) in [#29774](https://github.com/immich-app/immich/pull/29774)
- fix(mobile): correct person age singular pluralization by [@tech00exploere](https://github.com/tech00exploere) in [#29868](https://github.com/immich-app/immich/pull/29868)

##### New Contributors

- [@tech00exploere](https://github.com/tech00exploere) made their first contribution in [#29868](https://github.com/immich-app/immich/pull/29868)

**Full Changelog**: <https://github.com/immich-app/immich/compare/v3.0.2...v3.0.3>

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

##### v3.0.2

This patch release addresses various bugs from v3 release and adds an additional filter to workflows

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

##### What's Changed

##### 🌟 Enhancements

- fix(web): add ARIA label to ServerStatisticsCard by [@tjhorner](https://github.com/tjhorner) in [#29497](https://github.com/immich-app/immich/pull/29497)
- feat(server): hls variant configuration by [@mertalev](https://github.com/mertalev) in [#29613](https://github.com/immich-app/immich/pull/29613)
- feat: user agnostic database restore by [@danieldietzler](https://github.com/danieldietzler) in [#29512](https://github.com/immich-app/immich/pull/29512)
- feat(server): date workflow filter by [@benbeckford](https://github.com/benbeckford) in [#29040](https://github.com/immich-app/immich/pull/29040)

##### 🐛 Bug fixes

- fix: re-add gCastEnabled negation by [@bo0tzz](https://github.com/bo0tzz) in [#29499](https://github.com/immich-app/immich/pull/29499)
- fix: downmix audio to stereo to fix broken channel layout by [@lukasdotcom](https://github.com/lukasdotcom) in [#29485](https://github.com/immich-app/immich/pull/29485)
- fix: live transcoding when viewing from a link share by [@lukasdotcom](https://github.com/lukasdotcom) in [#29471](https://github.com/immich-app/immich/pull/29471)
- fix: web search timeline visibility by [@danieldietzler](https://github.com/danieldietzler) in [#29518](https://github.com/immich-app/immich/pull/29518)
- fix(web): missing i18n strings by [@wonsukchoi](https://github.com/wonsukchoi) in [#29612](https://github.com/immich-app/immich/pull/29612)
- fix: chinese browser locales recognition by [@danieldietzler](https://github.com/danieldietzler) in [#29622](https://github.com/immich-app/immich/pull/29622)
- chore: improve added to album messages by [@danieldietzler](https://github.com/danieldietzler) in [#29641](https://github.com/immich-app/immich/pull/29641)
- fix(mobile): fix 10-bit heic and avif colors on android by [@santoshakil](https://github.com/santoshakil) in [#29631](https://github.com/immich-app/immich/pull/29631)
- fix(mobile): match iOS scroll to top and tabbar scroll ([#28469](https://github.com/immich-app/immich/issues/28469)) by [@agg23](https://github.com/agg23) in [#29705](https://github.com/immich-app/immich/pull/29705)
- fix: wrap migrations in transaction by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#29664](https://github.com/immich-app/immich/pull/29664)
- fix: oauth account linking by [@danieldietzler](https://github.com/danieldietzler) in [#29624](https://github.com/immich-app/immich/pull/29624)
- fix: incorrect grouping of recently added assets by [@benbeckford](https://github.com/benbeckford) in [#29666](https://github.com/immich-app/immich/pull/29666)
- fix: integrity checks checksum pagination by [@danieldietzler](https://github.com/danieldietzler) in [#29516](https://github.com/immich-app/immich/pull/29516)
- fix(mobile): missing crop options and rotation scaling by [@bwees](https://github.com/bwees) in [#29645](https://github.com/immich-app/immich/pull/29645)
- fix(mobile): properly handle live photos locally by [@agg23](https://github.com/agg23) in [#29462](https://github.com/immich-app/immich/pull/29462)
- fix: integrity checks dto validation by [@danieldietzler](https://github.com/danieldietzler) in [#29621](https://github.com/immich-app/immich/pull/29621)
- fix(mobile): http request handling after isolate death by [@mertalev](https://github.com/mertalev) in [#29714](https://github.com/immich-app/immich/pull/29714)
- fix: do not log out on automatic url switch by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#29715](https://github.com/immich-app/immich/pull/29715)
- fix(server): stream ffprobe packets by [@mertalev](https://github.com/mertalev) in [#29723](https://github.com/immich-app/immich/pull/29723)
- fix: search metadata for album shared links by [@danieldietzler](https://github.com/danieldietzler) in [#29742](https://github.com/immich-app/immich/pull/29742)
- fix(web): clear asset selection when search context changes by [@khanguyen74](https://github.com/khanguyen74) in [#29738](https://github.com/immich-app/immich/pull/29738)
- fix(mobile): update timeline args on layout constraint changes by [@santoshakil](https://github.com/santoshakil) in [#29653](https://github.com/immich-app/immich/pull/29653)
- fix: iso date parsing for three digit years by [@danieldietzler](https://github.com/danieldietzler) in [#29739](https://github.com/immich-app/immich/pull/29739)
- fix: missing files integrity checks by [@danieldietzler](https://github.com/danieldietzler) in [#29737](https://github.com/immich-app/immich/pull/29737)
- fix(mobile): play videos from search results and folder view by [@santoshakil](https://github.com/santoshakil) in [#29693](https://github.com/immich-app/immich/pull/29693)
- fix(web): recursively unnest class arrays by [@meesfrensel](https://github.com/meesfrensel) in [#29755](https://github.com/immich-app/immich/pull/29755)
- fix: emit album update event when uploading assets through shared link by [@danieldietzler](https://github.com/danieldietzler) in [#29757](https://github.com/immich-app/immich/pull/29757)
- fix(web): always initialize language manager to set lang and dir by [@meesfrensel](https://github.com/meesfrensel) in [#29696](https://github.com/immich-app/immich/pull/29696)

##### 📚 Documentation

- chore: update docs with v3 tags by [@alextran1502](https://github.com/alextran1502) in [#29312](https://github.com/immich-app/immich/pull/29312)
- fix(docs): use correct heading name for DB dump by [@track0x1](https://github.com/track0x1) in [#29483](https://github.com/immich-app/immich/pull/29483)
- feat(docs): add Malayalam language support in README files by [@jinskjoy](https://github.com/jinskjoy) in [#29593](https://github.com/immich-app/immich/pull/29593)
- fix(docs): clarify version policy by [@mmomjian](https://github.com/mmomjian) in [#29654](https://github.com/immich-app/immich/pull/29654)

##### 🌐 Translations

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

##### New Contributors

- [@tjhorner](https://github.com/tjhorner) made their first contribution in [#29497](https://github.com/immich-app/immich/pull/29497)
- [@wonsukchoi](https://github.com/wonsukchoi) made their first contribution in [#29612](https://github.com/immich-app/immich/pull/29612)
- [@track0x1](https://github.com/track0x1) made their first contribution in [#29483](https://github.com/immich-app/immich/pull/29483)
- [@jinskjoy](https://github.com/jinskjoy) made their first contribution in [#29593](https://github.com/immich-app/immich/pull/29593)
- [@khanguyen74](https://github.com/khanguyen74) made their first contribution in [#29738](https://github.com/immich-app/immich/pull/29738)

**Full Changelog**: <https://github.com/immich-app/immich/compare/v3.0.1...v3.0.2>

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

##### v3.0.1

- Fixes a bug that causes albums don't show up in the mobile app

##### What's Changed

##### 🚀 Features

- feat(web): recently added link in sidebar by [@benbeckford](https://github.com/benbeckford) in [#29039](https://github.com/immich-app/immich/pull/29039)

##### 🐛 Bug fixes

- fix: albums broken on v2 mobile clients by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#29446](https://github.com/immich-app/immich/pull/29446)
- fix: setting input field description spacing for description snippet by [@danieldietzler](https://github.com/danieldietzler) in [#29433](https://github.com/immich-app/immich/pull/29433)

##### 🌐 Translations

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

**Full Changelog**: <https://github.com/immich-app/immich/compare/v3.0.0...v3.0.1>

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

##### v3.0.0

Welcome to Immich `v3.0.0`!

After months of hard work from the team and our amazing contributors, we're thrilled to announce the next major version of Immich: `v3.0.0`!  🎉

##### Breaking changes

This release includes several breaking changes; read the full migration guide [here](https://immich.app/blog/v3-migration). *It's worth mentioning that many of the breaking changes are updates to API endpoints and affect only **third-party tools** that integrate with Immich's API*. For the vast majority of users, updating works exactly as it always has.

##### How to update

> \[!WARNING]
> `v3.0.0` drops support for pgvecto.rs. If you run Immich before `v1.133.0` and haven't done the migration step yet, see the migration guide here. <https://docs.immich.app/install/upgrading/#migrating-to-vectorchord>

First, update the `IMMICH_VERSION` in your `.env` file to `v3`:

```diff
- IMMICH_VERSION=v2
+ IMMICH_VERSION=v3
```

Then run the usual update commands:

```bash
docker compose pull && docker compose up -d
```

##### Release candidates

If you missed it, `v3.0.0` was the first time we used release candidates, also known as prereleases. Release candidates are tested but not yet official releases of Immich, and they allow us to find and fix any outstanding bugs before a final release. If you would like to be notified about release candidates directly through Immich, you can change the release channel from "Stable" to "Release candidate" in the `Admin settings > Version check` options ([here](https://my.immich.app/admin/system-settings?isOpen=version-check)).

<img alt="New release channel option in version check settings" src="https://github.com/user-attachments/assets/fc8f6008-d486-4915-ad1b-feaddb856315" />
##### New Merch

As part of this release, we're happy to announce we also have some new swag for you!

- Kids clothing: For those who are likely the reason for your Immich library's size
- Colored embroidery: We now have clothes with a full color embroidered Immich logo

<a href="https://immich.store/collections/immich-3-0">
<img width="1200" alt="immich-store (1)" src="https://github.com/user-attachments/assets/ce114e7b-1424-4eca-975d-b23debadb32b" />
</a>

Check it out now at [https://immich.store](https://immich.store/collections/immich-3-0)!

##### Highlights

Now, let's get right into all the new features in this release:

- Mobile non-destructive editing
- Workflows (preview)
- Background backup improvement
- Recently added page
- Integrity checks
- Slideshow on mobile app
- HLS and real-time video transcoding (preview)
- New video player for web
- Open photo in Immich as gallery on Android
- OCR on mobile app
- Upload asset directly to album on the mobile app
- Option to select image size when sharing on the mobile app
- Timeline performance improvement for browsing a large amount of assets in a single month

##### Mobile non-destructive editing

<p align="center">
<img width="300" alt="image" src="https://github.com/user-attachments/assets/e9ddf97c-a4f8-42c1-9910-49ef3c8d4b0a" />
</p>

This is a follow-up to Image Editing on the web, which was released in `v2.5.0`. This feature allows you to make non-destructive edits to your photos inside of Immich. Until now, the mobile editor used a completely different system that created new assets instead of editing the photo in place.

With this update, we bring a new, easier-to-use editor to mobile devices that has the same features as the web version. You can now edit photos directly in the mobile app, including cropping, rotating, and adjusting your images without ever touching the original file. Similar to the web, edits are non-destructive, so you can revisit or revert them at any time. You can even make edits on mobile and then adjust them on the web later!

Some features from the previous mobile editing implementation have been removed including:

- Recoloring photos
- Editing live photos
- Editing local assets

We have plans to bring some of these capabilities back in future releases.

##### Workflows (preview)

The first preview of Workflows is here! Workflows let you automate actions in your library by chaining triggers, filters, and actions together with a drag-and-drop builder. This is the foundation for many exciting automations to come, and we'd love your feedback as we continue building on it.

You can access the feature from [Utilities > Workflows](https://my.immich.app/workflows) on the web.

<img width="800"  alt="Workflows link on the utilities page" src="https://github.com/user-attachments/assets/db7e139e-89b0-481a-9a66-530a40dc175a" />

From there, you can either create a new blank workflow or browse the premade templates to get a basic understanding of how workflows can be used.

<p align="center">
<img width="400" alt="image" src="https://github.com/user-attachments/assets/23fdb017-e439-4221-9be8-a14bd690fa9b" />
</p>
##### Workflows editor

<img alt="Workflow editor with an example workflow" src="https://github.com/user-attachments/assets/c6a569de-d884-4bdb-8bb0-0ff2c805bfb9" />

In the workflows editor, you can switch between the Visual or JSON editor. The visual editor is nice for building out the workflow; the JSON editor is nice for sharing and receiving workflow content from others.

In each workflow, there is a ***trigger*** and a sequence of ***steps.***

- Trigger: this is the entry point of each workflow; when the trigger occurs, the steps are evaluated.
- Steps: they include Filters (conditions) and Actions (effects); they can be combined to produce the desired effect of the use case you aim for.

<p align="center">
<img width="400" alt="List of available workflow steps" src="https://github.com/user-attachments/assets/50e89454-2bf9-4d41-bfa6-fd54f8944ea3" />
</p>
##### Sharing a workflow

You can share the workflow you made with others in two ways: text and JSON. Text is nice for sharing on a forum or for show-and-tell content. JSON is nice for others to make an exact copy of your workflow's configuration.

You can copy the text in the workflows summary panel on the lower right of the screen

<p align="center">
<img width="400"  alt="workflow summary in text" src="https://github.com/user-attachments/assets/dda24c88-f403-4189-a57b-71f6da3816e7" />
</p>

You can share the JSON content from the copy workflows button in the app bar, switch to the JSON editor, or use the `Show schema` button in the context menu in the workflows list

<img  alt="JSON editor" src="https://github.com/user-attachments/assets/307297cc-36d6-477c-bd72-d52be1dec0c5" />

<img  alt="Show workflow schema" src="https://github.com/user-attachments/assets/b6efada4-44fc-4d35-9e24-0f143c003313" />

> \[!NOTE]
> Please use this [discussion thread](https://github.com/immich-app/immich/discussions/29167) to propose new ideas of triggers and actions. We are looking for extensive feedback and suggestions from you all.

##### Background backup improvements

Background backup on Android is now significantly more reliable. Previously, the background backup on Android was limited to newly taken photos. Now, the app uses a new periodic task scheduler, which allows you to upload your entire library in the background, and it plays nicer with Android's background execution limits, properly cleans up tasks, and warns you when battery optimization and notification settings might interfere with backups.

On iOS, the background refresh task now runs its sync and upload work in parallel, so uploads actually start within the short time window iOS allows.

<p align="center">
<img width="300"  alt="Enable backup option on mobile" src="https://github.com/user-attachments/assets/82be41f3-93b9-4231-9f91-53eb317bb3fe" />
</p>
##### Recently added page

A new "Recently Added" page on the web and mobile lets you browse your library sorted by when assets were added to Immich, rather than when they were taken. This makes it easier to find what's new when browsing a new batch of imports. You can find the new page in the "Explore" tab on the web and in the "Search" tab on mobile.

<img width="798" height="220" alt="Recently added" src="https://github.com/user-attachments/assets/d4729864-f736-4554-a672-91861aad5f7f" />
##### Integrity checks

The maintenance page has gotten a new addition: integrity reports! Immich will scan its directories on your file system, and compare it to what it has stored in its database. If there are deviations, they will be surfaced as

- untracked, if there is a file in Immich's directories that Immich does not know of
- missing, if Immich references a file in its database that does not exist in that place (anymore)
- a checksum mismatch, if the checksum of the file on disk does not match the checksum Immich has stored for that file. Typically, this would happen through file corruption but could also be the result of a bad rename.

<img alt="Integrity report on the maintenance page showing a count of untracked and missing files, as well as checksum mismatches." src="https://github.com/user-attachments/assets/0e59537e-89b7-4d06-b5e6-731bb1e453c0" />

You can configure when and how long the job runs each night.

<img width="800" alt="image" src="https://github.com/user-attachments/assets/13da49ac-5cfa-40a1-b852-b89b0ed7fff6" />
##### Slideshow (mobile)

The slideshow experience comes to mobile! You can now sit back and let your photos and videos play across the screen, just like on the web.

<p align="center">
<img width="300" alt="Slideshow view on mobile" src="https://github.com/user-attachments/assets/b3325f3c-0505-405f-9b79-322f738030f4" />
</p>
##### HLS and Real-Time Video transcoding (preview)

Immich can now transcode videos on-the-fly without needing to generate offline transcodes. This has been a long-requested feature with many benefits:

- Quality switching (both manual and automatic)
- Transcoding to the best codecs supported by the client
- Lower storage overhead when offline transcoding is disabled
- HDR for compatible clients (not implemented yet)
- Remuxing rather than transcoding the original when bandwidth allows it (not implemented yet)

Please note that this feature is still experimental and can change behavior from version to version. It's currently only implemented in the web app, with the mobile app implementation in progress.

To enable real-time transcoding, go to the [video transcoding settings](https://my.immich.app/admin/system-settings?isOpen=video-transcoding+realtime-transcoding) (scroll down). Offline transcoding isn't directly affected by enabling it, so if you'd like to disable offline transcoding, you should also adjust the transcode policy.

> \[!NOTE]
> For assets imported prior to v3, you will also need to re-run Metadata Extraction in the job panel for them to be re-processed.

<img alt="HLS Transcoding settings" src="https://github.com/user-attachments/assets/6313ea40-ae1a-4495-aaea-212ef67fd338" />

Keep in mind that your server needs to be powerful enough to transcode in real-time for this feature to work well. Hardware acceleration is recommended, but not required, when using this feature.

##### New video player for web

A new custom video player on the web app ensures all your devices share the same controls and layout, matching the Immich design. Some basic functions, like changing the playback rate, are available. This should also fix a lot of the problems on iOS, where the OS's controls are hidden behind the Immich navbar.

##### Open photos in Immich as a gallery on Android

Immich can now act as a gallery/image viewer app on Android. Tap a photo or video in another app, choose Immich, and it opens directly in the asset viewer with options to share the file or upload it to your library.

This is the first iteration of the feature, and refinements to how Immich recognizes files that are already in your library are on the way

<img width="350" alt="image" src="https://github.com/user-attachments/assets/f98c2a65-1b84-4580-a7af-ead54ab737d8" />
<img width="350" alt="image" src="https://github.com/user-attachments/assets/fb783bed-c6c4-4634-af71-c2e888274121" />
##### OCR on the mobile app

The asset viewer now has a toggle that highlights recognized text in a photo, and you can select and copy it directly from the image.

<p align="center">
<img width="350" alt="OCR in the mobile app" src="https://github.com/user-attachments/assets/5f870d38-53a5-4b05-9dba-5d8838b86934" />
</p>
##### Upload assets directly to an album on mobile

You can now upload local photos directly to an album in the mobile app, including from the asset bottom sheet, instead of uploading first and organizing later. A small change that removes a lot of friction from the backup-and-organize flow.

##### Select image size when sharing on mobile

When sharing photos from the mobile app, you can now choose the image size before sending; it is handy for keeping shared files small for messaging apps while preserving the option to share at full quality when needed.

You can change the default behavior in the `App Settings > Preferences`

<p align="center">
<img width="350"  alt="Share file's size settings" src="https://github.com/user-attachments/assets/fe1c95d7-39e4-4c25-8981-dea4d07fce5a" />
</p>

You can also pick the option when sharing on-the-fly by long pressing the `Share` button

<p align="center">
<img width="350"  alt="On-the-fly picker" src="https://github.com/user-attachments/assets/667b79a7-efac-462b-8736-9e674e083d6b" />
</p>
##### Timeline performance Improvements

Browsing months with a large number of assets is now dramatically smoother and prevents the browser tab from locking up when your instance encounters that scenario.

##### 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>

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

##### What's Changed

##### 🚨 Breaking Changes

- refactor!: migrate class-validator to zod by [@timonrieger](https://github.com/timonrieger) in [#26597](https://github.com/immich-app/immich/pull/26597)
- refactor!: remove replace asset by [@jrasm91](https://github.com/jrasm91) in [#27022](https://github.com/immich-app/immich/pull/27022)
- refactor!: remove my shared link dto by [@jrasm91](https://github.com/jrasm91) in [#27023](https://github.com/immich-app/immich/pull/27023)
- chore!: remove deprecated env variables by [@jrasm91](https://github.com/jrasm91) in [#27802](https://github.com/immich-app/immich/pull/27802)
- chore!: remove getRandom api endpoint by [@bwees](https://github.com/bwees) in [#27780](https://github.com/immich-app/immich/pull/27780)
- chore!: remove unused token response param by [@jrasm91](https://github.com/jrasm91) in [#27805](https://github.com/immich-app/immich/pull/27805)
- refactor: yeet old timeline by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#27666](https://github.com/immich-app/immich/pull/27666)
- chore!: remove old timeline sync endpoints by [@jrasm91](https://github.com/jrasm91) in [#27804](https://github.com/immich-app/immich/pull/27804)
- chore!: remove deviceId and deviceAssetId by [@danieldietzler](https://github.com/danieldietzler) in [#27818](https://github.com/immich-app/immich/pull/27818)
- chore!: rename API key schemas by [@jrasm91](https://github.com/jrasm91) in [#27828](https://github.com/immich-app/immich/pull/27828)
- chore!: remove without assets by [@jrasm91](https://github.com/jrasm91) in [#27835](https://github.com/immich-app/immich/pull/27835)
- fix: oauth issuerUrl validation by [@bo0tzz](https://github.com/bo0tzz) in [#27848](https://github.com/immich-app/immich/pull/27848)
- fix!: do not allow insecure oauth requests by default by [@bo0tzz](https://github.com/bo0tzz) in [#27844](https://github.com/immich-app/immich/pull/27844)
- fix!: set duration to null when not present by [@meesfrensel](https://github.com/meesfrensel) in [#26982](https://github.com/immich-app/immich/pull/26982)
- chore!: remove /api/server/theme endpoint by [@jrasm91](https://github.com/jrasm91) in [#27880](https://github.com/immich-app/immich/pull/27880)
- chore!: migrate album owner to album\_user by [@danieldietzler](https://github.com/danieldietzler) in [#27467](https://github.com/immich-app/immich/pull/27467)
- refactor!: change number to integer types by [@timonrieger](https://github.com/timonrieger) in [#27912](https://github.com/immich-app/immich/pull/27912)
- refactor(server)!: move correlationId to X-Correlation-ID response header by [@timonrieger](https://github.com/timonrieger) in [#28139](https://github.com/immich-app/immich/pull/28139)
- refactor(server)!: remove redundant error and statusCode fields from error responses by [@timonrieger](https://github.com/timonrieger) in [#28140](https://github.com/immich-app/immich/pull/28140)
- chore(server)!: drop pgvecto.rs support by [@mertalev](https://github.com/mertalev) in [#28159](https://github.com/immich-app/immich/pull/28159)
- chore!: duration in milliseconds by [@mertalev](https://github.com/mertalev) in [#28003](https://github.com/immich-app/immich/pull/28003)
- refactor(server)!: sanitize error messages to avoid leaking resource details by [@timonrieger](https://github.com/timonrieger) in [#28154](https://github.com/immich-app/immich/pull/28154)
- refactor(server)!: structured validation error responses by [@timonrieger](https://github.com/timonrieger) in [#28204](https://github.com/immich-app/immich/pull/28204)
- feat(server)!: add isOwned filter to albums API by [@timonrieger](https://github.com/timonrieger) in [#28213](https://github.com/immich-app/immich/pull/28213)
- chore(ml)!: require numpy 2.4 by [@mertalev](https://github.com/mertalev) in [#28158](https://github.com/immich-app/immich/pull/28158)
- fix(deps): update dependency nestjs-otel to v8 by [@renovate](https://github.com/renovate)\[bot] in [#27863](https://github.com/immich-app/immich/pull/27863)
- chore(ml)!: remove deprecated envs by [@mertalev](https://github.com/mertalev) in [#28326](https://github.com/immich-app/immich/pull/28326)
- chore(server)!: remove libopus enum by [@mertalev](https://github.com/mertalev) in [#28325](https://github.com/immich-app/immich/pull/28325)
- refactor!: remove asset faces from AssetResponseDto by [@bwees](https://github.com/bwees) in [#27779](https://github.com/immich-app/immich/pull/27779)
- refactor(server)!: drop empty string to null conversion by [@timonrieger](https://github.com/timonrieger) in [#28808](https://github.com/immich-app/immich/pull/28808)
- refactor(server)!: remove changeExpiryTime by [@timonrieger](https://github.com/timonrieger) in [#28816](https://github.com/immich-app/immich/pull/28816)
- refactor!: disallow star rating < 1 by [@meesfrensel](https://github.com/meesfrensel) in [#27896](https://github.com/immich-app/immich/pull/27896)
- fix!: search endpoints visibility can be omitted by [@danieldietzler](https://github.com/danieldietzler) in [#29385](https://github.com/immich-app/immich/pull/29385)

##### 🫥 Deprecated Changes

- refactor(server): deprecate PUT routes in favor of PATCH by [@timonrieger](https://github.com/timonrieger) in [#28859](https://github.com/immich-app/immich/pull/28859)

##### 🔒 Security

- fix: run profile picture through thumbnail pipeline by [@bo0tzz](https://github.com/bo0tzz) in [#27890](https://github.com/immich-app/immich/pull/27890)

##### 🚀 Features

- feat: mobile editing by [@bwees](https://github.com/bwees) in [#25397](https://github.com/immich-app/immich/pull/25397)
- feat: album map markers endpoint by [@jrasm91](https://github.com/jrasm91) in [#27830](https://github.com/immich-app/immich/pull/27830)
- feat(server): added backchannel logout api endpoint by [@santanoce](https://github.com/santanoce) in [#26235](https://github.com/immich-app/immich/pull/26235)
- feat(server): add OIDC logout URL override option by [@LJspice](https://github.com/LJspice) in [#27389](https://github.com/immich-app/immich/pull/27389)
- feat: android periodic work manager task by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#23563](https://github.com/immich-app/immich/pull/23563)
- feat(web): custom video player controls by [@meesfrensel](https://github.com/meesfrensel) in [#26183](https://github.com/immich-app/immich/pull/26183)
- feat(web): add full-path search mode to UI by [@mws-weekend-projects](https://github.com/mws-weekend-projects) in [#26758](https://github.com/immich-app/immich/pull/26758)
- feat: recently added assets page by [@benbeckford](https://github.com/benbeckford) in [#28272](https://github.com/immich-app/immich/pull/28272)
- feat(mobile): slideshow view by [@benbeckford](https://github.com/benbeckford) in [#28421](https://github.com/immich-app/immich/pull/28421)
- feat(mobile): "Add Tags" asset multiselect option by [@benjamonnguyen](https://github.com/benjamonnguyen) in [#26269](https://github.com/immich-app/immich/pull/26269)
- feat: workflows & plugins by [@jrasm91](https://github.com/jrasm91) in [#26727](https://github.com/immich-app/immich/pull/26727)
- feat(server): hls with real-time transcoding by [@mertalev](https://github.com/mertalev) in [#28230](https://github.com/immich-app/immich/pull/28230)
- feat(web): hls player by [@mertalev](https://github.com/mertalev) in [#28312](https://github.com/immich-app/immich/pull/28312)
- feat(mobile): Android. Immich as a gallery / image viewer app by [@PeterOmbodi](https://github.com/PeterOmbodi) in [#26109](https://github.com/immich-app/immich/pull/26109)
- feat: user upload heatmap by [@bondeabhijeet](https://github.com/bondeabhijeet) in [#28593](https://github.com/immich-app/immich/pull/28593)
- feat(mobile): ocr support by [@YarosMallorca](https://github.com/YarosMallorca) in [#26523](https://github.com/immich-app/immich/pull/26523)
- feat: geolocation workflow filter by [@benbeckford](https://github.com/benbeckford) in [#28961](https://github.com/immich-app/immich/pull/28961)
- feat: image quality option in sharing by [@alextran1502](https://github.com/alextran1502) in [#28918](https://github.com/immich-app/immich/pull/28918)
- feat: integrity check jobs (missing files, untracked files, checksums) by [@insertish](https://github.com/insertish) in [#24205](https://github.com/immich-app/immich/pull/24205)
- feat: new feature message by [@alextran1502](https://github.com/alextran1502) in [#29388](https://github.com/immich-app/immich/pull/29388)

##### 🌟 Enhancements

- feat(web): persist state of file path information in details panel by [@cratoo](https://github.com/cratoo) in [#27770](https://github.com/immich-app/immich/pull/27770)
- feat: commands by [@jrasm91](https://github.com/jrasm91) in [#27546](https://github.com/immich-app/immich/pull/27546)
- feat: upgrade immich/ui by [@jrasm91](https://github.com/jrasm91) in [#27792](https://github.com/immich-app/immich/pull/27792)
- feat: filter users on share by [@OdinOxin](https://github.com/OdinOxin) in [#27732](https://github.com/immich-app/immich/pull/27732)
- fix(server): render storage template date/time tokens in UTC ([#24350](https://github.com/immich-app/immich/issues/24350)) by [@migpovrap](https://github.com/migpovrap) in [#26917](https://github.com/immich-app/immich/pull/26917)
- feat(web): lazy load library and server statistics by [@etnoy](https://github.com/etnoy) in [#26406](https://github.com/immich-app/immich/pull/26406)
- feat: sort users alphabetically when adding to album by [@OdinOxin](https://github.com/OdinOxin) in [#27731](https://github.com/immich-app/immich/pull/27731)
- feat: auth logout page by [@jrasm91](https://github.com/jrasm91) in [#27831](https://github.com/immich-app/immich/pull/27831)
- chore: improve randomness of /search/random endpoint by [@StevenMassaro](https://github.com/StevenMassaro) in [#27531](https://github.com/immich-app/immich/pull/27531)
- feat: dynamic languages by [@jrasm91](https://github.com/jrasm91) in [#27869](https://github.com/immich-app/immich/pull/27869)
- feat: cache shared link by [@danieldietzler](https://github.com/danieldietzler) in [#27889](https://github.com/immich-app/immich/pull/27889)
- feat(server): add configurable OAuth prompt parameter by [@sparsh985](https://github.com/sparsh985) in [#26755](https://github.com/immich-app/immich/pull/26755)
- feat(server): add MPO file type support by [@git-akihakune](https://github.com/git-akihakune) in [#27963](https://github.com/immich-app/immich/pull/27963)
- feat(mobile): action bottom sheet on map timeline by [@YarosMallorca](https://github.com/YarosMallorca) in [#27515](https://github.com/immich-app/immich/pull/27515)
- feat(server): track video metadata by [@mertalev](https://github.com/mertalev) in [#28023](https://github.com/immich-app/immich/pull/28023)
- feat(enhancement): Navigate stack with up and down arrow keys by [@cratoo](https://github.com/cratoo) in [#27854](https://github.com/immich-app/immich/pull/27854)
- fix(web): migrate people management component to page, enabling tooltips by [@SkyDev125](https://github.com/SkyDev125) in [#26971](https://github.com/immich-app/immich/pull/26971)
- chore(mobile): add box shadow to asset details by [@uhthomas](https://github.com/uhthomas) in [#27510](https://github.com/immich-app/immich/pull/27510)
- feat: hide hidden person from memories by [@sakshamchawla](https://github.com/sakshamchawla) in [#20877](https://github.com/immich-app/immich/pull/20877)
- feat(mobile): increased tap area on video player overlay by [@YarosMallorca](https://github.com/YarosMallorca) in [#27269](https://github.com/immich-app/immich/pull/27269)
- feat(web): Add metadata overlay to slideshow by [@timonrieger](https://github.com/timonrieger) in [#24627](https://github.com/immich-app/immich/pull/24627)
- feat(web): add individual filter removal from search result chips by [@timonrieger](https://github.com/timonrieger) in [#28166](https://github.com/immich-app/immich/pull/28166)
- feat(mobile): trash/restore all by [@YarosMallorca](https://github.com/YarosMallorca) in [#28116](https://github.com/immich-app/immich/pull/28116)
- feat: display more info in asset viewer by [@alextran1502](https://github.com/alextran1502) in [#24630](https://github.com/immich-app/immich/pull/24630)
- feat(server): allow subpaths for machine learning URL by [@gnojus](https://github.com/gnojus) in [#28427](https://github.com/immich-app/immich/pull/28427)
- feat(ui): Shared URL input configuration by [@Lauritz-Tieste](https://github.com/Lauritz-Tieste) in [#27105](https://github.com/immich-app/immich/pull/27105)
- refactor: enhance shared link UI and functionality by [@Lauritz-Tieste](https://github.com/Lauritz-Tieste) in [#26464](https://github.com/immich-app/immich/pull/26464)
- feat: upload and add local asset directly to album by [@alextran1502](https://github.com/alextran1502) in [#28123](https://github.com/immich-app/immich/pull/28123)
- feat: Selectable metadata in duplicates utility with diffing by [@ollioddi](https://github.com/ollioddi) in [#26328](https://github.com/immich-app/immich/pull/26328)
- fix: improve form control focus visibility by [@Caltsic](https://github.com/Caltsic) in [#28512](https://github.com/immich-app/immich/pull/28512)
- feat: command for user pages by [@alextran1502](https://github.com/alextran1502) in [#28554](https://github.com/immich-app/immich/pull/28554)
- refactor: use ControlBar UI Library component by [@bwees](https://github.com/bwees) in [#28567](https://github.com/immich-app/immich/pull/28567)
- feat: workflow template by [@alextran1502](https://github.com/alextran1502) in [#28553](https://github.com/immich-app/immich/pull/28553)
- feat(mobile): improve downloading algorithm for sharing by [@YarosMallorca](https://github.com/YarosMallorca) in [#27312](https://github.com/immich-app/immich/pull/27312)
- feat: search by album name and id by [@jrasm91](https://github.com/jrasm91) in [#28672](https://github.com/immich-app/immich/pull/28672)
- feat: upload local assets to album from bottom sheet by [@alextran1502](https://github.com/alextran1502) in [#28531](https://github.com/immich-app/immich/pull/28531)
- feat: places in context search by [@timonrieger](https://github.com/timonrieger) in [#28768](https://github.com/immich-app/immich/pull/28768)
- feat: minimum face count per user by [@timjonez](https://github.com/timjonez) in [#27452](https://github.com/immich-app/immich/pull/27452)
- feat: show notification and battery optimization warning by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#26610](https://github.com/immich-app/immich/pull/26610)
- feat: workflows drag and drop enhancements by [@danieldietzler](https://github.com/danieldietzler) in [#28764](https://github.com/immich-app/immich/pull/28764)
- feat(mobile): min face count per-user by [@YarosMallorca](https://github.com/YarosMallorca) in [#28805](https://github.com/immich-app/immich/pull/28805)
- refactor(server): allow -1 rating again by [@timonrieger](https://github.com/timonrieger) in [#28886](https://github.com/immich-app/immich/pull/28886)
- feat(web): warn before overwriting existing locations in geolocation utility by [@yoshovski](https://github.com/yoshovski) in [#28840](https://github.com/immich-app/immich/pull/28840)
- feat: warn if microservices worker is missing by [@bo0tzz](https://github.com/bo0tzz) in [#28869](https://github.com/immich-app/immich/pull/28869)
- fix(web): show album names in duplicate review by [@meesfrensel](https://github.com/meesfrensel) in [#29080](https://github.com/immich-app/immich/pull/29080)
- feat: keyboard seeking for new video player by [@danieldietzler](https://github.com/danieldietzler) in [#29208](https://github.com/immich-app/immich/pull/29208)
- feat(web): Add text-white-shadow to elements and increase the shadows effect by [@Vogeluff](https://github.com/Vogeluff) in [#29165](https://github.com/immich-app/immich/pull/29165)
- feat: webhook workflow action by [@benbeckford](https://github.com/benbeckford) in [#29258](https://github.com/immich-app/immich/pull/29258)
- feat: integrity checks admin settings by [@danieldietzler](https://github.com/danieldietzler) in [#29406](https://github.com/immich-app/immich/pull/29406)

##### 🐛 Bug fixes

- fix(web): center images in RTL layouts ([#27678](https://github.com/immich-app/immich/issues/27678)) by [@Nicolas-micuda-becker](https://github.com/Nicolas-micuda-becker) in [#27753](https://github.com/immich-app/immich/pull/27753)
- fix(mobile): add keys for person tiles in search by [@YarosMallorca](https://github.com/YarosMallorca) in [#27689](https://github.com/immich-app/immich/pull/27689)
- fix(web): selection clearing on preview by [@YarosMallorca](https://github.com/YarosMallorca) in [#27702](https://github.com/immich-app/immich/pull/27702)
- fix: asset multi select download shortcut by [@danieldietzler](https://github.com/danieldietzler) in [#27784](https://github.com/immich-app/immich/pull/27784)
- fix(web): add partner photo to album from multiselect by [@YarosMallorca](https://github.com/YarosMallorca) in [#27767](https://github.com/immich-app/immich/pull/27767)
- fix: redirect original by [@danieldietzler](https://github.com/danieldietzler) in [#27759](https://github.com/immich-app/immich/pull/27759)
- fix: make web build stage deterministic by [@bo0tzz](https://github.com/bo0tzz) in [#27823](https://github.com/immich-app/immich/pull/27823)
- fix(web): svelte regression - cancel video preview fetch when bind:this is cleared early by [@midzelis](https://github.com/midzelis) in [#27713](https://github.com/immich-app/immich/pull/27713)
- fix(web): stale adaptive image when original overlays preview by [@midzelis](https://github.com/midzelis) in [#27621](https://github.com/immich-app/immich/pull/27621)
- fix(mobile): readonly redirect when not logged in by [@YarosMallorca](https://github.com/YarosMallorca) in [#27728](https://github.com/immich-app/immich/pull/27728)
- fix(web): close edit faces panel on Escape key press by [@midzelis](https://github.com/midzelis) in [#27519](https://github.com/immich-app/immich/pull/27519)
- fix(oauth): normalize email claim to lowercase and trim before account lookup and registration by [@timdobras](https://github.com/timdobras) in [#26841](https://github.com/immich-app/immich/pull/26841)
- fix(web): use event for zooming out after opening face editor by [@meesfrensel](https://github.com/meesfrensel) in [#27789](https://github.com/immich-app/immich/pull/27789)
- fix: sanitize filenames before adding to zip by [@bo0tzz](https://github.com/bo0tzz) in [#27893](https://github.com/immich-app/immich/pull/27893)
- fix(server): require at least one field to be set when updating memory by [@fredfloydd](https://github.com/fredfloydd) in [#27842](https://github.com/immich-app/immich/pull/27842)
- fix(web): compute hashes for uploads in chunks by [@fredfloydd](https://github.com/fredfloydd) in [#27878](https://github.com/immich-app/immich/pull/27878)
- fix(web): fix stale album page load by [@fredfloydd](https://github.com/fredfloydd) in [#27825](https://github.com/immich-app/immich/pull/27825)
- fix(web): prevent interaction with detail panel behind person side panel by [@midzelis](https://github.com/midzelis) in [#27309](https://github.com/immich-app/immich/pull/27309)
- fix: show neon light by [@alextran1502](https://github.com/alextran1502) in [#27994](https://github.com/immich-app/immich/pull/27994)
- fix(mobile): zero exposure by [@YarosMallorca](https://github.com/YarosMallorca) in [#28017](https://github.com/immich-app/immich/pull/28017)
- fix(mobile): clear local data on forced logout by [@LeLunZ](https://github.com/LeLunZ) in [#27957](https://github.com/immich-app/immich/pull/27957)
- fix(mobile): enable autoplay for motion photos in video viewer by [@LeLunZ](https://github.com/LeLunZ) in [#27961](https://github.com/immich-app/immich/pull/27961)
- fix(mobile): thumbnail transition to asset viewer by [@LeLunZ](https://github.com/LeLunZ) in [#27850](https://github.com/immich-app/immich/pull/27850)
- fix: jump to timeline on new auto\_router update by [@alextran1502](https://github.com/alextran1502) in [#28022](https://github.com/immich-app/immich/pull/28022)
- fix(mobile): delete assets on trash empty, Android by [@PeterOmbodi](https://github.com/PeterOmbodi) in [#26070](https://github.com/immich-app/immich/pull/26070)
- fix(ml): handle empty/corrupt images in face detection by [@yosit](https://github.com/yosit) in [#27391](https://github.com/immich-app/immich/pull/27391)
- fix(web): refresh memories hourly by [@meesfrensel](https://github.com/meesfrensel) in [#28114](https://github.com/immich-app/immich/pull/28114)
- fix(web): large files: better handling of asset deletions by [@meesfrensel](https://github.com/meesfrensel) in [#28117](https://github.com/immich-app/immich/pull/28117)
- fix(web): double video playback on map timeline by [@YarosMallorca](https://github.com/YarosMallorca) in [#28090](https://github.com/immich-app/immich/pull/28090)
- fix(mobile): suppress asset stack UI in trash timeline by [@PeterOmbodi](https://github.com/PeterOmbodi) in [#26536](https://github.com/immich-app/immich/pull/26536)
- fix(web): timeline scroll when pressing back from stacked asset by [@Snowknight26](https://github.com/Snowknight26) in [#28163](https://github.com/immich-app/immich/pull/28163)
- fix(server): selectively apply metadata bitstream filter for video thumbnails by [@pinhao](https://github.com/pinhao) in [#28162](https://github.com/immich-app/immich/pull/28162)
- fix(web): fix shared link /s/photos.\* navigation after password login by [@meesfrensel](https://github.com/meesfrensel) in [#27788](https://github.com/immich-app/immich/pull/27788)
- fix(ml): respect time zone for logs in cuda container by [@AyaanMAG](https://github.com/AyaanMAG) in [#28155](https://github.com/immich-app/immich/pull/28155)
- fix: librknnrt permissions in machine-learning by [@DavidTheFighter](https://github.com/DavidTheFighter) in [#28216](https://github.com/immich-app/immich/pull/28216)
- fix(server): validate duplicate group ownership before dismissal by [@timonrieger](https://github.com/timonrieger) in [#28221](https://github.com/immich-app/immich/pull/28221)
- fix(web): correct timeline yesterday label across month boundaries by [@michelheusschen](https://github.com/michelheusschen) in [#28183](https://github.com/immich-app/immich/pull/28183)
- fix(mobile): show lens info without lens name by [@benbeckford](https://github.com/benbeckford) in [#28234](https://github.com/immich-app/immich/pull/28234)
- fix: stale person name after merge by [@danieldietzler](https://github.com/danieldietzler) in [#28222](https://github.com/immich-app/immich/pull/28222)
- fix(web): shared album avatars opening modal by [@meesfrensel](https://github.com/meesfrensel) in [#26719](https://github.com/immich-app/immich/pull/26719)
- fix(mobile): prevent asset loading issues when changing page or when closing memories by [@LeLunZ](https://github.com/LeLunZ) in [#27596](https://github.com/immich-app/immich/pull/27596)
- fix(mobile): correct filter default and UI desync in similar photos search by [@TheBestX11](https://github.com/TheBestX11) in [#27516](https://github.com/immich-app/immich/pull/27516)
- fix(server): hide isFavorite from partner asset sync stream by [@timonrieger](https://github.com/timonrieger) in [#28035](https://github.com/immich-app/immich/pull/28035)
- fix(mobile): restore notification plugin init by [@santoshakil](https://github.com/santoshakil) in [#28284](https://github.com/immich-app/immich/pull/28284)
- fix(mobile): mounted check before setState in album sync action by [@santoshakil](https://github.com/santoshakil) in [#28300](https://github.com/immich-app/immich/pull/28300)
- fix(mobile): avoid duplicate assets in album view by [@stfn42](https://github.com/stfn42) in [#28152](https://github.com/immich-app/immich/pull/28152)
- fix(mobile): Deduplicate assets in person view timeline by [@thowdev](https://github.com/thowdev) in [#26723](https://github.com/immich-app/immich/pull/26723)
- fix(deployment): remove unneeded volume by [@mmomjian](https://github.com/mmomjian) in [#28307](https://github.com/immich-app/immich/pull/28307)
- fix: mobile upload duration type by [@alextran1502](https://github.com/alextran1502) in [#28362](https://github.com/immich-app/immich/pull/28362)
- fix: deep link for assets when asset viewer already open by [@bwees](https://github.com/bwees) in [#27971](https://github.com/immich-app/immich/pull/27971)
- fix: kekab icon colors in light mode by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#28366](https://github.com/immich-app/immich/pull/28366)
- fix: indexes on remote\_asset\_entity by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#28264](https://github.com/immich-app/immich/pull/28264)
- fix(mobile): clear linkedRemoteAlbumId in reset() so FK refs dont dangle by [@santoshakil](https://github.com/santoshakil) in [#28382](https://github.com/immich-app/immich/pull/28382)
- fix: ignore icc profile make and model by [@jrasm91](https://github.com/jrasm91) in [#28412](https://github.com/immich-app/immich/pull/28412)
- fix(mobile): don't block app open on slow validateAccessToken by [@santoshakil](https://github.com/santoshakil) in [#28405](https://github.com/immich-app/immich/pull/28405)
- fix(mobile): add restore option to trashed assets by [@inesiscosta](https://github.com/inesiscosta) in [#27442](https://github.com/immich-app/immich/pull/27442)
- fix(mobile): use correct delete action by [@ByteSizedMarius](https://github.com/ByteSizedMarius) in [#26575](https://github.com/immich-app/immich/pull/26575)
- fix(server): dedupe database backup jobs by [@rdeaton](https://github.com/rdeaton) in [#28341](https://github.com/immich-app/immich/pull/28341)
- fix(mobile): cronet buffer overflow on compressed thumbnails by [@santoshakil](https://github.com/santoshakil) in [#28439](https://github.com/immich-app/immich/pull/28439)
- fix(mobile): cronet thumbnail buffer overflow regression from [#28439](https://github.com/immich-app/immich/issues/28439) by [@santoshakil](https://github.com/santoshakil) in [#28450](https://github.com/immich-app/immich/pull/28450)
- fix(mobile): mounted check in ThumbnailTile hero flight listener by [@santoshakil](https://github.com/santoshakil) in [#28451](https://github.com/immich-app/immich/pull/28451)
- fix(mobile): don't force-unwrap nil localizedTitle in ios getAlbums by [@santoshakil](https://github.com/santoshakil) in [#28452](https://github.com/immich-app/immich/pull/28452)
- fix(web): work around Chrome HDR image seam lines during zoom by [@midzelis](https://github.com/midzelis) in [#27715](https://github.com/immich-app/immich/pull/27715)
- fix(ios): respect status bar scroll to top in timeline views by [@agg23](https://github.com/agg23) in [#28469](https://github.com/immich-app/immich/pull/28469)
- fix(mobile): asset viewer stuck on spinner after rotation by [@LeLunZ](https://github.com/LeLunZ) in [#28019](https://github.com/immich-app/immich/pull/28019)
- fix(web): timeline stuttering with many assets in 1 day by [@benbeckford](https://github.com/benbeckford) in [#28509](https://github.com/immich-app/immich/pull/28509)
- fix(mobile): preserve zoom level during image loading and live photo playback by [@LeLunZ](https://github.com/LeLunZ) in [#27960](https://github.com/immich-app/immich/pull/27960)
- fix(ml): stabilize MIGraphX inference by [@fabianwimberger](https://github.com/fabianwimberger) in [#28444](https://github.com/immich-app/immich/pull/28444)
- fix: await sync asset v2 by [@bwees](https://github.com/bwees) in [#28569](https://github.com/immich-app/immich/pull/28569)
- fix: strip metadata from timeline responses for shared links without exif sharing by [@danieldietzler](https://github.com/danieldietzler) in [#28644](https://github.com/immich-app/immich/pull/28644)
- fix: Refresh local album overview page after asset deletion by [@Lauritz-Tieste](https://github.com/Lauritz-Tieste) in [#28586](https://github.com/immich-app/immich/pull/28586)
- fix(server): prevent locked assets from leaking to partners by [@timonrieger](https://github.com/timonrieger) in [#28652](https://github.com/immich-app/immich/pull/28652)
- refactor(web): replace per-asset viewport proximity with day-tier active indices by [@midzelis](https://github.com/midzelis) in [#28597](https://github.com/immich-app/immich/pull/28597)
- fix: timeline scroll flicker by [@alextran1502](https://github.com/alextran1502) in [#28653](https://github.com/immich-app/immich/pull/28653)
- fix: api repositories using stale endpoint by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#28667](https://github.com/immich-app/immich/pull/28667)
- fix: disallow cross origin/non http protocols for continueUrl on login by [@bwees](https://github.com/bwees) in [#28706](https://github.com/immich-app/immich/pull/28706)
- fix(web): skip thumbhash fade for offscreen thumbnails by [@midzelis](https://github.com/midzelis) in [#27335](https://github.com/immich-app/immich/pull/27335)
- fix(web): prevent partner assets from being selected in geolocation utility by [@okxint](https://github.com/okxint) in [#28737](https://github.com/immich-app/immich/pull/28737)
- fix(mobile): invisible ink splashes in asset sheet by [@timonrieger](https://github.com/timonrieger) in [#28756](https://github.com/immich-app/immich/pull/28756)
- fix!: unauthorized face creation by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#28561](https://github.com/immich-app/immich/pull/28561)
- fix(mobile): proper background task cleanup by [@mertalev](https://github.com/mertalev) in [#28694](https://github.com/immich-app/immich/pull/28694)
- fix(cli): prevent out-of-memory on file upload due to undici storing the request body by [@moversity](https://github.com/moversity) in [#28723](https://github.com/immich-app/immich/pull/28723)
- fix: error log on aborted uploads by [@jrasm91](https://github.com/jrasm91) in [#28806](https://github.com/immich-app/immich/pull/28806)
- fix(server): respect timezone in iso date string encoding by [@timonrieger](https://github.com/timonrieger) in [#28810](https://github.com/immich-app/immich/pull/28810)
- test: fix tests when OpenVINO provider is available by [@nekowinston](https://github.com/nekowinston) in [#28802](https://github.com/immich-app/immich/pull/28802)
- fix(mobile): run iOS bg task phases in parallel by [@santoshakil](https://github.com/santoshakil) in [#28293](https://github.com/immich-app/immich/pull/28293)
- fix: error handling by [@jrasm91](https://github.com/jrasm91) in [#28843](https://github.com/immich-app/immich/pull/28843)
- fix: cross isolate drift watchers by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#28862](https://github.com/immich-app/immich/pull/28862)
- fix: reload timeline on group by setting change by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#28864](https://github.com/immich-app/immich/pull/28864)
- fix(web): use irot/imir tags for HEIF Orientation by [@joojoooo](https://github.com/joojoooo) in [#27820](https://github.com/immich-app/immich/pull/27820)
- fix: detail panel faces reactivity issues by [@danieldietzler](https://github.com/danieldietzler) in [#28910](https://github.com/immich-app/immich/pull/28910)
- fix(server): hide isFavorite from album asset sync stream by [@timonrieger](https://github.com/timonrieger) in [#28923](https://github.com/immich-app/immich/pull/28923)
- fix(mobile): show memory and folder dates in local time by [@santoshakil](https://github.com/santoshakil) in [#28941](https://github.com/immich-app/immich/pull/28941)
- fix(mobile): show error when creating an album fails by [@santoshakil](https://github.com/santoshakil) in [#28942](https://github.com/immich-app/immich/pull/28942)
- fix(mobile): add album picker to archive bottom sheet by [@santoshakil](https://github.com/santoshakil) in [#28953](https://github.com/immich-app/immich/pull/28953)
- fix: normalize diacritics in person name search in Web & Mobile by [@pedrovieira](https://github.com/pedrovieira) in [#28887](https://github.com/immich-app/immich/pull/28887)
- fix(web): Prevent face editor from closing when dismissing tag confirmation by [@pedrovieira](https://github.com/pedrovieira) in [#28900](https://github.com/immich-app/immich/pull/28900)
- fix(mobile): map timeline layout crash by [@YarosMallorca](https://github.com/YarosMallorca) in [#28878](https://github.com/immich-app/immich/pull/28878)
- fix(mobile): deduplicate people in asset details panel by [@santoshakil](https://github.com/santoshakil) in [#28972](https://github.com/immich-app/immich/pull/28972)
- fix(mobile): keep timezone when editing asset date time by [@santoshakil](https://github.com/santoshakil) in [#28978](https://github.com/immich-app/immich/pull/28978)
- fix(mobile): stale details after editing asset date by [@santoshakil](https://github.com/santoshakil) in [#28977](https://github.com/immich-app/immich/pull/28977)
- fix(mobile): show albums whose assets are all trashed by [@santoshakil](https://github.com/santoshakil) in [#28985](https://github.com/immich-app/immich/pull/28985)
- fix(mobile): give android notification channels proper names by [@santoshakil](https://github.com/santoshakil) in [#28986](https://github.com/immich-app/immich/pull/28986)
- fix: Improving scroll behavior on image stacks that overflow the screen by [@BlankCanvasStudio](https://github.com/BlankCanvasStudio) in [#28885](https://github.com/immich-app/immich/pull/28885)
- fix(web): focus on scrollable element on load by [@timonrieger](https://github.com/timonrieger) in [#29004](https://github.com/immich-app/immich/pull/29004)
- fix(mobile): show like and comment options on album photo deep links by [@santoshakil](https://github.com/santoshakil) in [#29020](https://github.com/immich-app/immich/pull/29020)
- fix(web): correctly handle person search with more than 100 results by [@maxinegardenas](https://github.com/maxinegardenas) in [#29002](https://github.com/immich-app/immich/pull/29002)
- fix(web): prevent upload status panel from overlapping album action bar by [@okxint](https://github.com/okxint) in [#29044](https://github.com/immich-app/immich/pull/29044)
- fix(web): error loading image state by [@bwees](https://github.com/bwees) in [#29058](https://github.com/immich-app/immich/pull/29058)
- fix(web): show asset arrows by [@timonrieger](https://github.com/timonrieger) in [#29010](https://github.com/immich-app/immich/pull/29010)
- fix(server): hide partner archived asset locations from map by [@timonrieger](https://github.com/timonrieger) in [#29028](https://github.com/immich-app/immich/pull/29028)
- fix: lock transcoding options by [@timonrieger](https://github.com/timonrieger) in [#29076](https://github.com/immich-app/immich/pull/29076)
- fix(server): do not merge metadata when multiple duplicates are kept by [@timonrieger](https://github.com/timonrieger) in [#29035](https://github.com/immich-app/immich/pull/29035)
- fix: integrity report checksum query by [@danieldietzler](https://github.com/danieldietzler) in [#29136](https://github.com/immich-app/immich/pull/29136)
- fix: map settings by [@danieldietzler](https://github.com/danieldietzler) in [#29134](https://github.com/immich-app/immich/pull/29134)
- fix: too strict cron expression validation by [@danieldietzler](https://github.com/danieldietzler) in [#29138](https://github.com/immich-app/immich/pull/29138)
- fix(web): respect local timezone when building date range for search by [@okxint](https://github.com/okxint) in [#29128](https://github.com/immich-app/immich/pull/29128)
- fix(web): language selector by [@meesfrensel](https://github.com/meesfrensel) in [#29065](https://github.com/immich-app/immich/pull/29065)
- fix: update datetimeRelative description to minutes instead of seconds by [@meesfrensel](https://github.com/meesfrensel) in [#29137](https://github.com/immich-app/immich/pull/29137)
- fix: video thumbnail quality sharing by [@bwees](https://github.com/bwees) in [#29104](https://github.com/immich-app/immich/pull/29104)
- fix(mobile): stop sync albums crashing on the main isolate by [@santoshakil](https://github.com/santoshakil) in [#29133](https://github.com/immich-app/immich/pull/29133)
- fix(mobile): show memories with no showAt/hideAt in the timeline lane by [@santoshakil](https://github.com/santoshakil) in [#29158](https://github.com/immich-app/immich/pull/29158)
- fix(mobile): keep toasts off the dynamic island when keyboard is open by [@santoshakil](https://github.com/santoshakil) in [#29159](https://github.com/immich-app/immich/pull/29159)
- fix(server): skip existing users when sharing albums by [@jeevan6996](https://github.com/jeevan6996) in [#28884](https://github.com/immich-app/immich/pull/28884)
- fix: web i18n by [@danieldietzler](https://github.com/danieldietzler) in [#29175](https://github.com/immich-app/immich/pull/29175)
- fix(web): shift+click on GPS asset extends range selection in geolocation utility by [@timonrieger](https://github.com/timonrieger) in [#29022](https://github.com/immich-app/immich/pull/29022)
- fix(server): allow non-utc datetime offsets by [@timonrieger](https://github.com/timonrieger) in [#29186](https://github.com/immich-app/immich/pull/29186)
- fix: remove local-only step ids from workflow json by [@danieldietzler](https://github.com/danieldietzler) in [#29188](https://github.com/immich-app/immich/pull/29188)
- fix: asset type filter by [@danieldietzler](https://github.com/danieldietzler) in [#29190](https://github.com/immich-app/immich/pull/29190)
- fix(mobile): prevent duplicate login pages for unauthenticated share intent warm start by [@olildu](https://github.com/olildu) in [#29054](https://github.com/immich-app/immich/pull/29054)
- fix(mobile): refresh memories on resume and day change by [@santoshakil](https://github.com/santoshakil) in [#28983](https://github.com/immich-app/immich/pull/28983)
- fix(mobile): re-lock locked folder when the app is backgrounded by [@santoshakil](https://github.com/santoshakil) in [#29089](https://github.com/immich-app/immich/pull/29089)
- fix(mobile): endless spinner on album selection when device has no albums by [@santoshakil](https://github.com/santoshakil) in [#28994](https://github.com/immich-app/immich/pull/28994)
- fix: rc version check by [@danieldietzler](https://github.com/danieldietzler) in [#29194](https://github.com/immich-app/immich/pull/29194)
- fix: detail panel people reactivity and iterator consumption by [@danieldietzler](https://github.com/danieldietzler) in [#29250](https://github.com/immich-app/immich/pull/29250)
- fix(server): use VBR for QSV so the max bitrate is respected by [@aclerici38](https://github.com/aclerici38) in [#29240](https://github.com/immich-app/immich/pull/29240)
- fix: ignore external libraries for integrity report checksum check by [@danieldietzler](https://github.com/danieldietzler) in [#29248](https://github.com/immich-app/immich/pull/29248)
- fix(web): remove map's fullscreen button by [@meesfrensel](https://github.com/meesfrensel) in [#29192](https://github.com/immich-app/immich/pull/29192)
- refactor: use SemVer classes for version compatability message by [@bwees](https://github.com/bwees) in [#29056](https://github.com/immich-app/immich/pull/29056)
- fix: sync backfill by [@jrasm91](https://github.com/jrasm91) in [#29267](https://github.com/immich-app/immich/pull/29267)
- fix(mobile): force AssetViewerPage recreation on repeated view intents by [@okxint](https://github.com/okxint) in…
renovate Bot added a commit to sdwilsh/ansible-playbooks that referenced this pull request Jul 21, 2026
##### [\`v3.0.3\`](https://github.com/immich-app/immich/releases/tag/v3.0.3)

##### v3.0.3

- various bug fixes
- we push to our own F-Droid repo at <https://app.futo.org/fdroid/repo> now. If you're using F-Droid, please pull the application from there from now on
- fixes an issue where LivePhotos upload from the background isn't showing up.

> \[!Note]
> In some specific circumstances, newly uploaded Live Photos could have broken thumbnails. If you see any such cases, please run the "missing" job for thumbnails or wait for the respective nightly job to clear it up.

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

##### What's Changed

##### 🚀 Features

- feat: publish app releases to FUTO F-Droid repo by [@bo0tzz](https://github.com/bo0tzz) in [#29804](https://github.com/immich-app/immich/pull/29804)

##### 🐛 Bug fixes

- fix(web): closing plugin method picker selects "unknown" method by [@benbeckford](https://github.com/benbeckford) in [#29784](https://github.com/immich-app/immich/pull/29784)
- fix: unauthorized album owner update by [@danieldietzler](https://github.com/danieldietzler) in [#29883](https://github.com/immich-app/immich/pull/29883)
- fix: still part of live photo hidden on bg upload by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#29884](https://github.com/immich-app/immich/pull/29884)
- fix: system appbar icon color has incorrect color in asset viewer by [@alextran1502](https://github.com/alextran1502) in [#29885](https://github.com/immich-app/immich/pull/29885)
- fix: locked visibility in search random endpoint by [@danieldietzler](https://github.com/danieldietzler) in [#29887](https://github.com/immich-app/immich/pull/29887)
- fix(mobile): send a full datetime from the android memories widget by [@santoshakil](https://github.com/santoshakil) in [#29689](https://github.com/immich-app/immich/pull/29689)
- fix: memory search date validation by [@danieldietzler](https://github.com/danieldietzler) in [#29907](https://github.com/immich-app/immich/pull/29907)
- fix(server): set hvc1 tag when using hwa by [@mertalev](https://github.com/mertalev) in [#29908](https://github.com/immich-app/immich/pull/29908)
- fix(mobile): clear zoom state when swapping assets by [@agg23](https://github.com/agg23) in [#29909](https://github.com/immich-app/immich/pull/29909)
- fix: Ken Burns effect on sliver app bar jittery on Android by [@alextran1502](https://github.com/alextran1502) in [#29890](https://github.com/immich-app/immich/pull/29890)

##### 📚 Documentation

- fix(docs): update fdroid link  by [@mmomjian](https://github.com/mmomjian) in [#29797](https://github.com/immich-app/immich/pull/29797)
- feat: system integrity docs by [@danieldietzler](https://github.com/danieldietzler) in [#29911](https://github.com/immich-app/immich/pull/29911)

##### 🌐 Translations

- chore(web): update translations by [@weblate](https://github.com/weblate) in [#29774](https://github.com/immich-app/immich/pull/29774)
- fix(mobile): correct person age singular pluralization by [@tech00exploere](https://github.com/tech00exploere) in [#29868](https://github.com/immich-app/immich/pull/29868)

##### New Contributors

- [@tech00exploere](https://github.com/tech00exploere) made their first contribution in [#29868](https://github.com/immich-app/immich/pull/29868)

**Full Changelog**: <https://github.com/immich-app/immich/compare/v3.0.2...v3.0.3>

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

##### v3.0.2

This patch release addresses various bugs from v3 release and adds an additional filter to workflows

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

##### What's Changed

##### 🌟 Enhancements

- fix(web): add ARIA label to ServerStatisticsCard by [@tjhorner](https://github.com/tjhorner) in [#29497](https://github.com/immich-app/immich/pull/29497)
- feat(server): hls variant configuration by [@mertalev](https://github.com/mertalev) in [#29613](https://github.com/immich-app/immich/pull/29613)
- feat: user agnostic database restore by [@danieldietzler](https://github.com/danieldietzler) in [#29512](https://github.com/immich-app/immich/pull/29512)
- feat(server): date workflow filter by [@benbeckford](https://github.com/benbeckford) in [#29040](https://github.com/immich-app/immich/pull/29040)

##### 🐛 Bug fixes

- fix: re-add gCastEnabled negation by [@bo0tzz](https://github.com/bo0tzz) in [#29499](https://github.com/immich-app/immich/pull/29499)
- fix: downmix audio to stereo to fix broken channel layout by [@lukasdotcom](https://github.com/lukasdotcom) in [#29485](https://github.com/immich-app/immich/pull/29485)
- fix: live transcoding when viewing from a link share by [@lukasdotcom](https://github.com/lukasdotcom) in [#29471](https://github.com/immich-app/immich/pull/29471)
- fix: web search timeline visibility by [@danieldietzler](https://github.com/danieldietzler) in [#29518](https://github.com/immich-app/immich/pull/29518)
- fix(web): missing i18n strings by [@wonsukchoi](https://github.com/wonsukchoi) in [#29612](https://github.com/immich-app/immich/pull/29612)
- fix: chinese browser locales recognition by [@danieldietzler](https://github.com/danieldietzler) in [#29622](https://github.com/immich-app/immich/pull/29622)
- chore: improve added to album messages by [@danieldietzler](https://github.com/danieldietzler) in [#29641](https://github.com/immich-app/immich/pull/29641)
- fix(mobile): fix 10-bit heic and avif colors on android by [@santoshakil](https://github.com/santoshakil) in [#29631](https://github.com/immich-app/immich/pull/29631)
- fix(mobile): match iOS scroll to top and tabbar scroll ([#28469](https://github.com/immich-app/immich/issues/28469)) by [@agg23](https://github.com/agg23) in [#29705](https://github.com/immich-app/immich/pull/29705)
- fix: wrap migrations in transaction by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#29664](https://github.com/immich-app/immich/pull/29664)
- fix: oauth account linking by [@danieldietzler](https://github.com/danieldietzler) in [#29624](https://github.com/immich-app/immich/pull/29624)
- fix: incorrect grouping of recently added assets by [@benbeckford](https://github.com/benbeckford) in [#29666](https://github.com/immich-app/immich/pull/29666)
- fix: integrity checks checksum pagination by [@danieldietzler](https://github.com/danieldietzler) in [#29516](https://github.com/immich-app/immich/pull/29516)
- fix(mobile): missing crop options and rotation scaling by [@bwees](https://github.com/bwees) in [#29645](https://github.com/immich-app/immich/pull/29645)
- fix(mobile): properly handle live photos locally by [@agg23](https://github.com/agg23) in [#29462](https://github.com/immich-app/immich/pull/29462)
- fix: integrity checks dto validation by [@danieldietzler](https://github.com/danieldietzler) in [#29621](https://github.com/immich-app/immich/pull/29621)
- fix(mobile): http request handling after isolate death by [@mertalev](https://github.com/mertalev) in [#29714](https://github.com/immich-app/immich/pull/29714)
- fix: do not log out on automatic url switch by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#29715](https://github.com/immich-app/immich/pull/29715)
- fix(server): stream ffprobe packets by [@mertalev](https://github.com/mertalev) in [#29723](https://github.com/immich-app/immich/pull/29723)
- fix: search metadata for album shared links by [@danieldietzler](https://github.com/danieldietzler) in [#29742](https://github.com/immich-app/immich/pull/29742)
- fix(web): clear asset selection when search context changes by [@khanguyen74](https://github.com/khanguyen74) in [#29738](https://github.com/immich-app/immich/pull/29738)
- fix(mobile): update timeline args on layout constraint changes by [@santoshakil](https://github.com/santoshakil) in [#29653](https://github.com/immich-app/immich/pull/29653)
- fix: iso date parsing for three digit years by [@danieldietzler](https://github.com/danieldietzler) in [#29739](https://github.com/immich-app/immich/pull/29739)
- fix: missing files integrity checks by [@danieldietzler](https://github.com/danieldietzler) in [#29737](https://github.com/immich-app/immich/pull/29737)
- fix(mobile): play videos from search results and folder view by [@santoshakil](https://github.com/santoshakil) in [#29693](https://github.com/immich-app/immich/pull/29693)
- fix(web): recursively unnest class arrays by [@meesfrensel](https://github.com/meesfrensel) in [#29755](https://github.com/immich-app/immich/pull/29755)
- fix: emit album update event when uploading assets through shared link by [@danieldietzler](https://github.com/danieldietzler) in [#29757](https://github.com/immich-app/immich/pull/29757)
- fix(web): always initialize language manager to set lang and dir by [@meesfrensel](https://github.com/meesfrensel) in [#29696](https://github.com/immich-app/immich/pull/29696)

##### 📚 Documentation

- chore: update docs with v3 tags by [@alextran1502](https://github.com/alextran1502) in [#29312](https://github.com/immich-app/immich/pull/29312)
- fix(docs): use correct heading name for DB dump by [@track0x1](https://github.com/track0x1) in [#29483](https://github.com/immich-app/immich/pull/29483)
- feat(docs): add Malayalam language support in README files by [@jinskjoy](https://github.com/jinskjoy) in [#29593](https://github.com/immich-app/immich/pull/29593)
- fix(docs): clarify version policy by [@mmomjian](https://github.com/mmomjian) in [#29654](https://github.com/immich-app/immich/pull/29654)

##### 🌐 Translations

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

##### New Contributors

- [@tjhorner](https://github.com/tjhorner) made their first contribution in [#29497](https://github.com/immich-app/immich/pull/29497)
- [@wonsukchoi](https://github.com/wonsukchoi) made their first contribution in [#29612](https://github.com/immich-app/immich/pull/29612)
- [@track0x1](https://github.com/track0x1) made their first contribution in [#29483](https://github.com/immich-app/immich/pull/29483)
- [@jinskjoy](https://github.com/jinskjoy) made their first contribution in [#29593](https://github.com/immich-app/immich/pull/29593)
- [@khanguyen74](https://github.com/khanguyen74) made their first contribution in [#29738](https://github.com/immich-app/immich/pull/29738)

**Full Changelog**: <https://github.com/immich-app/immich/compare/v3.0.1...v3.0.2>

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

##### v3.0.1

- Fixes a bug that causes albums don't show up in the mobile app

##### What's Changed

##### 🚀 Features

- feat(web): recently added link in sidebar by [@benbeckford](https://github.com/benbeckford) in [#29039](https://github.com/immich-app/immich/pull/29039)

##### 🐛 Bug fixes

- fix: albums broken on v2 mobile clients by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#29446](https://github.com/immich-app/immich/pull/29446)
- fix: setting input field description spacing for description snippet by [@danieldietzler](https://github.com/danieldietzler) in [#29433](https://github.com/immich-app/immich/pull/29433)

##### 🌐 Translations

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

**Full Changelog**: <https://github.com/immich-app/immich/compare/v3.0.0...v3.0.1>

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

##### v3.0.0

Welcome to Immich `v3.0.0`!

After months of hard work from the team and our amazing contributors, we're thrilled to announce the next major version of Immich: `v3.0.0`!  🎉

##### Breaking changes

This release includes several breaking changes; read the full migration guide [here](https://immich.app/blog/v3-migration). *It's worth mentioning that many of the breaking changes are updates to API endpoints and affect only **third-party tools** that integrate with Immich's API*. For the vast majority of users, updating works exactly as it always has.

##### How to update

> \[!WARNING]
> `v3.0.0` drops support for pgvecto.rs. If you run Immich before `v1.133.0` and haven't done the migration step yet, see the migration guide here. <https://docs.immich.app/install/upgrading/#migrating-to-vectorchord>

First, update the `IMMICH_VERSION` in your `.env` file to `v3`:

```diff
- IMMICH_VERSION=v2
+ IMMICH_VERSION=v3
```

Then run the usual update commands:

```bash
docker compose pull && docker compose up -d
```

##### Release candidates

If you missed it, `v3.0.0` was the first time we used release candidates, also known as prereleases. Release candidates are tested but not yet official releases of Immich, and they allow us to find and fix any outstanding bugs before a final release. If you would like to be notified about release candidates directly through Immich, you can change the release channel from "Stable" to "Release candidate" in the `Admin settings > Version check` options ([here](https://my.immich.app/admin/system-settings?isOpen=version-check)).

<img alt="New release channel option in version check settings" src="https://github.com/user-attachments/assets/fc8f6008-d486-4915-ad1b-feaddb856315" />
##### New Merch

As part of this release, we're happy to announce we also have some new swag for you!

- Kids clothing: For those who are likely the reason for your Immich library's size
- Colored embroidery: We now have clothes with a full color embroidered Immich logo

<a href="https://immich.store/collections/immich-3-0">
<img width="1200" alt="immich-store (1)" src="https://github.com/user-attachments/assets/ce114e7b-1424-4eca-975d-b23debadb32b" />
</a>

Check it out now at [https://immich.store](https://immich.store/collections/immich-3-0)!

##### Highlights

Now, let's get right into all the new features in this release:

- Mobile non-destructive editing
- Workflows (preview)
- Background backup improvement
- Recently added page
- Integrity checks
- Slideshow on mobile app
- HLS and real-time video transcoding (preview)
- New video player for web
- Open photo in Immich as gallery on Android
- OCR on mobile app
- Upload asset directly to album on the mobile app
- Option to select image size when sharing on the mobile app
- Timeline performance improvement for browsing a large amount of assets in a single month

##### Mobile non-destructive editing

<p align="center">
<img width="300" alt="image" src="https://github.com/user-attachments/assets/e9ddf97c-a4f8-42c1-9910-49ef3c8d4b0a" />
</p>

This is a follow-up to Image Editing on the web, which was released in `v2.5.0`. This feature allows you to make non-destructive edits to your photos inside of Immich. Until now, the mobile editor used a completely different system that created new assets instead of editing the photo in place.

With this update, we bring a new, easier-to-use editor to mobile devices that has the same features as the web version. You can now edit photos directly in the mobile app, including cropping, rotating, and adjusting your images without ever touching the original file. Similar to the web, edits are non-destructive, so you can revisit or revert them at any time. You can even make edits on mobile and then adjust them on the web later!

Some features from the previous mobile editing implementation have been removed including:

- Recoloring photos
- Editing live photos
- Editing local assets

We have plans to bring some of these capabilities back in future releases.

##### Workflows (preview)

The first preview of Workflows is here! Workflows let you automate actions in your library by chaining triggers, filters, and actions together with a drag-and-drop builder. This is the foundation for many exciting automations to come, and we'd love your feedback as we continue building on it.

You can access the feature from [Utilities > Workflows](https://my.immich.app/workflows) on the web.

<img width="800"  alt="Workflows link on the utilities page" src="https://github.com/user-attachments/assets/db7e139e-89b0-481a-9a66-530a40dc175a" />

From there, you can either create a new blank workflow or browse the premade templates to get a basic understanding of how workflows can be used.

<p align="center">
<img width="400" alt="image" src="https://github.com/user-attachments/assets/23fdb017-e439-4221-9be8-a14bd690fa9b" />
</p>
##### Workflows editor

<img alt="Workflow editor with an example workflow" src="https://github.com/user-attachments/assets/c6a569de-d884-4bdb-8bb0-0ff2c805bfb9" />

In the workflows editor, you can switch between the Visual or JSON editor. The visual editor is nice for building out the workflow; the JSON editor is nice for sharing and receiving workflow content from others.

In each workflow, there is a ***trigger*** and a sequence of ***steps.***

- Trigger: this is the entry point of each workflow; when the trigger occurs, the steps are evaluated.
- Steps: they include Filters (conditions) and Actions (effects); they can be combined to produce the desired effect of the use case you aim for.

<p align="center">
<img width="400" alt="List of available workflow steps" src="https://github.com/user-attachments/assets/50e89454-2bf9-4d41-bfa6-fd54f8944ea3" />
</p>
##### Sharing a workflow

You can share the workflow you made with others in two ways: text and JSON. Text is nice for sharing on a forum or for show-and-tell content. JSON is nice for others to make an exact copy of your workflow's configuration.

You can copy the text in the workflows summary panel on the lower right of the screen

<p align="center">
<img width="400"  alt="workflow summary in text" src="https://github.com/user-attachments/assets/dda24c88-f403-4189-a57b-71f6da3816e7" />
</p>

You can share the JSON content from the copy workflows button in the app bar, switch to the JSON editor, or use the `Show schema` button in the context menu in the workflows list

<img  alt="JSON editor" src="https://github.com/user-attachments/assets/307297cc-36d6-477c-bd72-d52be1dec0c5" />

<img  alt="Show workflow schema" src="https://github.com/user-attachments/assets/b6efada4-44fc-4d35-9e24-0f143c003313" />

> \[!NOTE]
> Please use this [discussion thread](https://github.com/immich-app/immich/discussions/29167) to propose new ideas of triggers and actions. We are looking for extensive feedback and suggestions from you all.

##### Background backup improvements

Background backup on Android is now significantly more reliable. Previously, the background backup on Android was limited to newly taken photos. Now, the app uses a new periodic task scheduler, which allows you to upload your entire library in the background, and it plays nicer with Android's background execution limits, properly cleans up tasks, and warns you when battery optimization and notification settings might interfere with backups.

On iOS, the background refresh task now runs its sync and upload work in parallel, so uploads actually start within the short time window iOS allows.

<p align="center">
<img width="300"  alt="Enable backup option on mobile" src="https://github.com/user-attachments/assets/82be41f3-93b9-4231-9f91-53eb317bb3fe" />
</p>
##### Recently added page

A new "Recently Added" page on the web and mobile lets you browse your library sorted by when assets were added to Immich, rather than when they were taken. This makes it easier to find what's new when browsing a new batch of imports. You can find the new page in the "Explore" tab on the web and in the "Search" tab on mobile.

<img width="798" height="220" alt="Recently added" src="https://github.com/user-attachments/assets/d4729864-f736-4554-a672-91861aad5f7f" />
##### Integrity checks

The maintenance page has gotten a new addition: integrity reports! Immich will scan its directories on your file system, and compare it to what it has stored in its database. If there are deviations, they will be surfaced as

- untracked, if there is a file in Immich's directories that Immich does not know of
- missing, if Immich references a file in its database that does not exist in that place (anymore)
- a checksum mismatch, if the checksum of the file on disk does not match the checksum Immich has stored for that file. Typically, this would happen through file corruption but could also be the result of a bad rename.

<img alt="Integrity report on the maintenance page showing a count of untracked and missing files, as well as checksum mismatches." src="https://github.com/user-attachments/assets/0e59537e-89b7-4d06-b5e6-731bb1e453c0" />

You can configure when and how long the job runs each night.

<img width="800" alt="image" src="https://github.com/user-attachments/assets/13da49ac-5cfa-40a1-b852-b89b0ed7fff6" />
##### Slideshow (mobile)

The slideshow experience comes to mobile! You can now sit back and let your photos and videos play across the screen, just like on the web.

<p align="center">
<img width="300" alt="Slideshow view on mobile" src="https://github.com/user-attachments/assets/b3325f3c-0505-405f-9b79-322f738030f4" />
</p>
##### HLS and Real-Time Video transcoding (preview)

Immich can now transcode videos on-the-fly without needing to generate offline transcodes. This has been a long-requested feature with many benefits:

- Quality switching (both manual and automatic)
- Transcoding to the best codecs supported by the client
- Lower storage overhead when offline transcoding is disabled
- HDR for compatible clients (not implemented yet)
- Remuxing rather than transcoding the original when bandwidth allows it (not implemented yet)

Please note that this feature is still experimental and can change behavior from version to version. It's currently only implemented in the web app, with the mobile app implementation in progress.

To enable real-time transcoding, go to the [video transcoding settings](https://my.immich.app/admin/system-settings?isOpen=video-transcoding+realtime-transcoding) (scroll down). Offline transcoding isn't directly affected by enabling it, so if you'd like to disable offline transcoding, you should also adjust the transcode policy.

> \[!NOTE]
> For assets imported prior to v3, you will also need to re-run Metadata Extraction in the job panel for them to be re-processed.

<img alt="HLS Transcoding settings" src="https://github.com/user-attachments/assets/6313ea40-ae1a-4495-aaea-212ef67fd338" />

Keep in mind that your server needs to be powerful enough to transcode in real-time for this feature to work well. Hardware acceleration is recommended, but not required, when using this feature.

##### New video player for web

A new custom video player on the web app ensures all your devices share the same controls and layout, matching the Immich design. Some basic functions, like changing the playback rate, are available. This should also fix a lot of the problems on iOS, where the OS's controls are hidden behind the Immich navbar.

##### Open photos in Immich as a gallery on Android

Immich can now act as a gallery/image viewer app on Android. Tap a photo or video in another app, choose Immich, and it opens directly in the asset viewer with options to share the file or upload it to your library.

This is the first iteration of the feature, and refinements to how Immich recognizes files that are already in your library are on the way

<img width="350" alt="image" src="https://github.com/user-attachments/assets/f98c2a65-1b84-4580-a7af-ead54ab737d8" />
<img width="350" alt="image" src="https://github.com/user-attachments/assets/fb783bed-c6c4-4634-af71-c2e888274121" />
##### OCR on the mobile app

The asset viewer now has a toggle that highlights recognized text in a photo, and you can select and copy it directly from the image.

<p align="center">
<img width="350" alt="OCR in the mobile app" src="https://github.com/user-attachments/assets/5f870d38-53a5-4b05-9dba-5d8838b86934" />
</p>
##### Upload assets directly to an album on mobile

You can now upload local photos directly to an album in the mobile app, including from the asset bottom sheet, instead of uploading first and organizing later. A small change that removes a lot of friction from the backup-and-organize flow.

##### Select image size when sharing on mobile

When sharing photos from the mobile app, you can now choose the image size before sending; it is handy for keeping shared files small for messaging apps while preserving the option to share at full quality when needed.

You can change the default behavior in the `App Settings > Preferences`

<p align="center">
<img width="350"  alt="Share file's size settings" src="https://github.com/user-attachments/assets/fe1c95d7-39e4-4c25-8981-dea4d07fce5a" />
</p>

You can also pick the option when sharing on-the-fly by long pressing the `Share` button

<p align="center">
<img width="350"  alt="On-the-fly picker" src="https://github.com/user-attachments/assets/667b79a7-efac-462b-8736-9e674e083d6b" />
</p>
##### Timeline performance Improvements

Browsing months with a large number of assets is now dramatically smoother and prevents the browser tab from locking up when your instance encounters that scenario.

##### 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>

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

##### What's Changed

##### 🚨 Breaking Changes

- refactor!: migrate class-validator to zod by [@timonrieger](https://github.com/timonrieger) in [#26597](https://github.com/immich-app/immich/pull/26597)
- refactor!: remove replace asset by [@jrasm91](https://github.com/jrasm91) in [#27022](https://github.com/immich-app/immich/pull/27022)
- refactor!: remove my shared link dto by [@jrasm91](https://github.com/jrasm91) in [#27023](https://github.com/immich-app/immich/pull/27023)
- chore!: remove deprecated env variables by [@jrasm91](https://github.com/jrasm91) in [#27802](https://github.com/immich-app/immich/pull/27802)
- chore!: remove getRandom api endpoint by [@bwees](https://github.com/bwees) in [#27780](https://github.com/immich-app/immich/pull/27780)
- chore!: remove unused token response param by [@jrasm91](https://github.com/jrasm91) in [#27805](https://github.com/immich-app/immich/pull/27805)
- refactor: yeet old timeline by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#27666](https://github.com/immich-app/immich/pull/27666)
- chore!: remove old timeline sync endpoints by [@jrasm91](https://github.com/jrasm91) in [#27804](https://github.com/immich-app/immich/pull/27804)
- chore!: remove deviceId and deviceAssetId by [@danieldietzler](https://github.com/danieldietzler) in [#27818](https://github.com/immich-app/immich/pull/27818)
- chore!: rename API key schemas by [@jrasm91](https://github.com/jrasm91) in [#27828](https://github.com/immich-app/immich/pull/27828)
- chore!: remove without assets by [@jrasm91](https://github.com/jrasm91) in [#27835](https://github.com/immich-app/immich/pull/27835)
- fix: oauth issuerUrl validation by [@bo0tzz](https://github.com/bo0tzz) in [#27848](https://github.com/immich-app/immich/pull/27848)
- fix!: do not allow insecure oauth requests by default by [@bo0tzz](https://github.com/bo0tzz) in [#27844](https://github.com/immich-app/immich/pull/27844)
- fix!: set duration to null when not present by [@meesfrensel](https://github.com/meesfrensel) in [#26982](https://github.com/immich-app/immich/pull/26982)
- chore!: remove /api/server/theme endpoint by [@jrasm91](https://github.com/jrasm91) in [#27880](https://github.com/immich-app/immich/pull/27880)
- chore!: migrate album owner to album\_user by [@danieldietzler](https://github.com/danieldietzler) in [#27467](https://github.com/immich-app/immich/pull/27467)
- refactor!: change number to integer types by [@timonrieger](https://github.com/timonrieger) in [#27912](https://github.com/immich-app/immich/pull/27912)
- refactor(server)!: move correlationId to X-Correlation-ID response header by [@timonrieger](https://github.com/timonrieger) in [#28139](https://github.com/immich-app/immich/pull/28139)
- refactor(server)!: remove redundant error and statusCode fields from error responses by [@timonrieger](https://github.com/timonrieger) in [#28140](https://github.com/immich-app/immich/pull/28140)
- chore(server)!: drop pgvecto.rs support by [@mertalev](https://github.com/mertalev) in [#28159](https://github.com/immich-app/immich/pull/28159)
- chore!: duration in milliseconds by [@mertalev](https://github.com/mertalev) in [#28003](https://github.com/immich-app/immich/pull/28003)
- refactor(server)!: sanitize error messages to avoid leaking resource details by [@timonrieger](https://github.com/timonrieger) in [#28154](https://github.com/immich-app/immich/pull/28154)
- refactor(server)!: structured validation error responses by [@timonrieger](https://github.com/timonrieger) in [#28204](https://github.com/immich-app/immich/pull/28204)
- feat(server)!: add isOwned filter to albums API by [@timonrieger](https://github.com/timonrieger) in [#28213](https://github.com/immich-app/immich/pull/28213)
- chore(ml)!: require numpy 2.4 by [@mertalev](https://github.com/mertalev) in [#28158](https://github.com/immich-app/immich/pull/28158)
- fix(deps): update dependency nestjs-otel to v8 by [@renovate](https://github.com/renovate)\[bot] in [#27863](https://github.com/immich-app/immich/pull/27863)
- chore(ml)!: remove deprecated envs by [@mertalev](https://github.com/mertalev) in [#28326](https://github.com/immich-app/immich/pull/28326)
- chore(server)!: remove libopus enum by [@mertalev](https://github.com/mertalev) in [#28325](https://github.com/immich-app/immich/pull/28325)
- refactor!: remove asset faces from AssetResponseDto by [@bwees](https://github.com/bwees) in [#27779](https://github.com/immich-app/immich/pull/27779)
- refactor(server)!: drop empty string to null conversion by [@timonrieger](https://github.com/timonrieger) in [#28808](https://github.com/immich-app/immich/pull/28808)
- refactor(server)!: remove changeExpiryTime by [@timonrieger](https://github.com/timonrieger) in [#28816](https://github.com/immich-app/immich/pull/28816)
- refactor!: disallow star rating < 1 by [@meesfrensel](https://github.com/meesfrensel) in [#27896](https://github.com/immich-app/immich/pull/27896)
- fix!: search endpoints visibility can be omitted by [@danieldietzler](https://github.com/danieldietzler) in [#29385](https://github.com/immich-app/immich/pull/29385)

##### 🫥 Deprecated Changes

- refactor(server): deprecate PUT routes in favor of PATCH by [@timonrieger](https://github.com/timonrieger) in [#28859](https://github.com/immich-app/immich/pull/28859)

##### 🔒 Security

- fix: run profile picture through thumbnail pipeline by [@bo0tzz](https://github.com/bo0tzz) in [#27890](https://github.com/immich-app/immich/pull/27890)

##### 🚀 Features

- feat: mobile editing by [@bwees](https://github.com/bwees) in [#25397](https://github.com/immich-app/immich/pull/25397)
- feat: album map markers endpoint by [@jrasm91](https://github.com/jrasm91) in [#27830](https://github.com/immich-app/immich/pull/27830)
- feat(server): added backchannel logout api endpoint by [@santanoce](https://github.com/santanoce) in [#26235](https://github.com/immich-app/immich/pull/26235)
- feat(server): add OIDC logout URL override option by [@LJspice](https://github.com/LJspice) in [#27389](https://github.com/immich-app/immich/pull/27389)
- feat: android periodic work manager task by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#23563](https://github.com/immich-app/immich/pull/23563)
- feat(web): custom video player controls by [@meesfrensel](https://github.com/meesfrensel) in [#26183](https://github.com/immich-app/immich/pull/26183)
- feat(web): add full-path search mode to UI by [@mws-weekend-projects](https://github.com/mws-weekend-projects) in [#26758](https://github.com/immich-app/immich/pull/26758)
- feat: recently added assets page by [@benbeckford](https://github.com/benbeckford) in [#28272](https://github.com/immich-app/immich/pull/28272)
- feat(mobile): slideshow view by [@benbeckford](https://github.com/benbeckford) in [#28421](https://github.com/immich-app/immich/pull/28421)
- feat(mobile): "Add Tags" asset multiselect option by [@benjamonnguyen](https://github.com/benjamonnguyen) in [#26269](https://github.com/immich-app/immich/pull/26269)
- feat: workflows & plugins by [@jrasm91](https://github.com/jrasm91) in [#26727](https://github.com/immich-app/immich/pull/26727)
- feat(server): hls with real-time transcoding by [@mertalev](https://github.com/mertalev) in [#28230](https://github.com/immich-app/immich/pull/28230)
- feat(web): hls player by [@mertalev](https://github.com/mertalev) in [#28312](https://github.com/immich-app/immich/pull/28312)
- feat(mobile): Android. Immich as a gallery / image viewer app by [@PeterOmbodi](https://github.com/PeterOmbodi) in [#26109](https://github.com/immich-app/immich/pull/26109)
- feat: user upload heatmap by [@bondeabhijeet](https://github.com/bondeabhijeet) in [#28593](https://github.com/immich-app/immich/pull/28593)
- feat(mobile): ocr support by [@YarosMallorca](https://github.com/YarosMallorca) in [#26523](https://github.com/immich-app/immich/pull/26523)
- feat: geolocation workflow filter by [@benbeckford](https://github.com/benbeckford) in [#28961](https://github.com/immich-app/immich/pull/28961)
- feat: image quality option in sharing by [@alextran1502](https://github.com/alextran1502) in [#28918](https://github.com/immich-app/immich/pull/28918)
- feat: integrity check jobs (missing files, untracked files, checksums) by [@insertish](https://github.com/insertish) in [#24205](https://github.com/immich-app/immich/pull/24205)
- feat: new feature message by [@alextran1502](https://github.com/alextran1502) in [#29388](https://github.com/immich-app/immich/pull/29388)

##### 🌟 Enhancements

- feat(web): persist state of file path information in details panel by [@cratoo](https://github.com/cratoo) in [#27770](https://github.com/immich-app/immich/pull/27770)
- feat: commands by [@jrasm91](https://github.com/jrasm91) in [#27546](https://github.com/immich-app/immich/pull/27546)
- feat: upgrade immich/ui by [@jrasm91](https://github.com/jrasm91) in [#27792](https://github.com/immich-app/immich/pull/27792)
- feat: filter users on share by [@OdinOxin](https://github.com/OdinOxin) in [#27732](https://github.com/immich-app/immich/pull/27732)
- fix(server): render storage template date/time tokens in UTC ([#24350](https://github.com/immich-app/immich/issues/24350)) by [@migpovrap](https://github.com/migpovrap) in [#26917](https://github.com/immich-app/immich/pull/26917)
- feat(web): lazy load library and server statistics by [@etnoy](https://github.com/etnoy) in [#26406](https://github.com/immich-app/immich/pull/26406)
- feat: sort users alphabetically when adding to album by [@OdinOxin](https://github.com/OdinOxin) in [#27731](https://github.com/immich-app/immich/pull/27731)
- feat: auth logout page by [@jrasm91](https://github.com/jrasm91) in [#27831](https://github.com/immich-app/immich/pull/27831)
- chore: improve randomness of /search/random endpoint by [@StevenMassaro](https://github.com/StevenMassaro) in [#27531](https://github.com/immich-app/immich/pull/27531)
- feat: dynamic languages by [@jrasm91](https://github.com/jrasm91) in [#27869](https://github.com/immich-app/immich/pull/27869)
- feat: cache shared link by [@danieldietzler](https://github.com/danieldietzler) in [#27889](https://github.com/immich-app/immich/pull/27889)
- feat(server): add configurable OAuth prompt parameter by [@sparsh985](https://github.com/sparsh985) in [#26755](https://github.com/immich-app/immich/pull/26755)
- feat(server): add MPO file type support by [@git-akihakune](https://github.com/git-akihakune) in [#27963](https://github.com/immich-app/immich/pull/27963)
- feat(mobile): action bottom sheet on map timeline by [@YarosMallorca](https://github.com/YarosMallorca) in [#27515](https://github.com/immich-app/immich/pull/27515)
- feat(server): track video metadata by [@mertalev](https://github.com/mertalev) in [#28023](https://github.com/immich-app/immich/pull/28023)
- feat(enhancement): Navigate stack with up and down arrow keys by [@cratoo](https://github.com/cratoo) in [#27854](https://github.com/immich-app/immich/pull/27854)
- fix(web): migrate people management component to page, enabling tooltips by [@SkyDev125](https://github.com/SkyDev125) in [#26971](https://github.com/immich-app/immich/pull/26971)
- chore(mobile): add box shadow to asset details by [@uhthomas](https://github.com/uhthomas) in [#27510](https://github.com/immich-app/immich/pull/27510)
- feat: hide hidden person from memories by [@sakshamchawla](https://github.com/sakshamchawla) in [#20877](https://github.com/immich-app/immich/pull/20877)
- feat(mobile): increased tap area on video player overlay by [@YarosMallorca](https://github.com/YarosMallorca) in [#27269](https://github.com/immich-app/immich/pull/27269)
- feat(web): Add metadata overlay to slideshow by [@timonrieger](https://github.com/timonrieger) in [#24627](https://github.com/immich-app/immich/pull/24627)
- feat(web): add individual filter removal from search result chips by [@timonrieger](https://github.com/timonrieger) in [#28166](https://github.com/immich-app/immich/pull/28166)
- feat(mobile): trash/restore all by [@YarosMallorca](https://github.com/YarosMallorca) in [#28116](https://github.com/immich-app/immich/pull/28116)
- feat: display more info in asset viewer by [@alextran1502](https://github.com/alextran1502) in [#24630](https://github.com/immich-app/immich/pull/24630)
- feat(server): allow subpaths for machine learning URL by [@gnojus](https://github.com/gnojus) in [#28427](https://github.com/immich-app/immich/pull/28427)
- feat(ui): Shared URL input configuration by [@Lauritz-Tieste](https://github.com/Lauritz-Tieste) in [#27105](https://github.com/immich-app/immich/pull/27105)
- refactor: enhance shared link UI and functionality by [@Lauritz-Tieste](https://github.com/Lauritz-Tieste) in [#26464](https://github.com/immich-app/immich/pull/26464)
- feat: upload and add local asset directly to album by [@alextran1502](https://github.com/alextran1502) in [#28123](https://github.com/immich-app/immich/pull/28123)
- feat: Selectable metadata in duplicates utility with diffing by [@ollioddi](https://github.com/ollioddi) in [#26328](https://github.com/immich-app/immich/pull/26328)
- fix: improve form control focus visibility by [@Caltsic](https://github.com/Caltsic) in [#28512](https://github.com/immich-app/immich/pull/28512)
- feat: command for user pages by [@alextran1502](https://github.com/alextran1502) in [#28554](https://github.com/immich-app/immich/pull/28554)
- refactor: use ControlBar UI Library component by [@bwees](https://github.com/bwees) in [#28567](https://github.com/immich-app/immich/pull/28567)
- feat: workflow template by [@alextran1502](https://github.com/alextran1502) in [#28553](https://github.com/immich-app/immich/pull/28553)
- feat(mobile): improve downloading algorithm for sharing by [@YarosMallorca](https://github.com/YarosMallorca) in [#27312](https://github.com/immich-app/immich/pull/27312)
- feat: search by album name and id by [@jrasm91](https://github.com/jrasm91) in [#28672](https://github.com/immich-app/immich/pull/28672)
- feat: upload local assets to album from bottom sheet by [@alextran1502](https://github.com/alextran1502) in [#28531](https://github.com/immich-app/immich/pull/28531)
- feat: places in context search by [@timonrieger](https://github.com/timonrieger) in [#28768](https://github.com/immich-app/immich/pull/28768)
- feat: minimum face count per user by [@timjonez](https://github.com/timjonez) in [#27452](https://github.com/immich-app/immich/pull/27452)
- feat: show notification and battery optimization warning by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#26610](https://github.com/immich-app/immich/pull/26610)
- feat: workflows drag and drop enhancements by [@danieldietzler](https://github.com/danieldietzler) in [#28764](https://github.com/immich-app/immich/pull/28764)
- feat(mobile): min face count per-user by [@YarosMallorca](https://github.com/YarosMallorca) in [#28805](https://github.com/immich-app/immich/pull/28805)
- refactor(server): allow -1 rating again by [@timonrieger](https://github.com/timonrieger) in [#28886](https://github.com/immich-app/immich/pull/28886)
- feat(web): warn before overwriting existing locations in geolocation utility by [@yoshovski](https://github.com/yoshovski) in [#28840](https://github.com/immich-app/immich/pull/28840)
- feat: warn if microservices worker is missing by [@bo0tzz](https://github.com/bo0tzz) in [#28869](https://github.com/immich-app/immich/pull/28869)
- fix(web): show album names in duplicate review by [@meesfrensel](https://github.com/meesfrensel) in [#29080](https://github.com/immich-app/immich/pull/29080)
- feat: keyboard seeking for new video player by [@danieldietzler](https://github.com/danieldietzler) in [#29208](https://github.com/immich-app/immich/pull/29208)
- feat(web): Add text-white-shadow to elements and increase the shadows effect by [@Vogeluff](https://github.com/Vogeluff) in [#29165](https://github.com/immich-app/immich/pull/29165)
- feat: webhook workflow action by [@benbeckford](https://github.com/benbeckford) in [#29258](https://github.com/immich-app/immich/pull/29258)
- feat: integrity checks admin settings by [@danieldietzler](https://github.com/danieldietzler) in [#29406](https://github.com/immich-app/immich/pull/29406)

##### 🐛 Bug fixes

- fix(web): center images in RTL layouts ([#27678](https://github.com/immich-app/immich/issues/27678)) by [@Nicolas-micuda-becker](https://github.com/Nicolas-micuda-becker) in [#27753](https://github.com/immich-app/immich/pull/27753)
- fix(mobile): add keys for person tiles in search by [@YarosMallorca](https://github.com/YarosMallorca) in [#27689](https://github.com/immich-app/immich/pull/27689)
- fix(web): selection clearing on preview by [@YarosMallorca](https://github.com/YarosMallorca) in [#27702](https://github.com/immich-app/immich/pull/27702)
- fix: asset multi select download shortcut by [@danieldietzler](https://github.com/danieldietzler) in [#27784](https://github.com/immich-app/immich/pull/27784)
- fix(web): add partner photo to album from multiselect by [@YarosMallorca](https://github.com/YarosMallorca) in [#27767](https://github.com/immich-app/immich/pull/27767)
- fix: redirect original by [@danieldietzler](https://github.com/danieldietzler) in [#27759](https://github.com/immich-app/immich/pull/27759)
- fix: make web build stage deterministic by [@bo0tzz](https://github.com/bo0tzz) in [#27823](https://github.com/immich-app/immich/pull/27823)
- fix(web): svelte regression - cancel video preview fetch when bind:this is cleared early by [@midzelis](https://github.com/midzelis) in [#27713](https://github.com/immich-app/immich/pull/27713)
- fix(web): stale adaptive image when original overlays preview by [@midzelis](https://github.com/midzelis) in [#27621](https://github.com/immich-app/immich/pull/27621)
- fix(mobile): readonly redirect when not logged in by [@YarosMallorca](https://github.com/YarosMallorca) in [#27728](https://github.com/immich-app/immich/pull/27728)
- fix(web): close edit faces panel on Escape key press by [@midzelis](https://github.com/midzelis) in [#27519](https://github.com/immich-app/immich/pull/27519)
- fix(oauth): normalize email claim to lowercase and trim before account lookup and registration by [@timdobras](https://github.com/timdobras) in [#26841](https://github.com/immich-app/immich/pull/26841)
- fix(web): use event for zooming out after opening face editor by [@meesfrensel](https://github.com/meesfrensel) in [#27789](https://github.com/immich-app/immich/pull/27789)
- fix: sanitize filenames before adding to zip by [@bo0tzz](https://github.com/bo0tzz) in [#27893](https://github.com/immich-app/immich/pull/27893)
- fix(server): require at least one field to be set when updating memory by [@fredfloydd](https://github.com/fredfloydd) in [#27842](https://github.com/immich-app/immich/pull/27842)
- fix(web): compute hashes for uploads in chunks by [@fredfloydd](https://github.com/fredfloydd) in [#27878](https://github.com/immich-app/immich/pull/27878)
- fix(web): fix stale album page load by [@fredfloydd](https://github.com/fredfloydd) in [#27825](https://github.com/immich-app/immich/pull/27825)
- fix(web): prevent interaction with detail panel behind person side panel by [@midzelis](https://github.com/midzelis) in [#27309](https://github.com/immich-app/immich/pull/27309)
- fix: show neon light by [@alextran1502](https://github.com/alextran1502) in [#27994](https://github.com/immich-app/immich/pull/27994)
- fix(mobile): zero exposure by [@YarosMallorca](https://github.com/YarosMallorca) in [#28017](https://github.com/immich-app/immich/pull/28017)
- fix(mobile): clear local data on forced logout by [@LeLunZ](https://github.com/LeLunZ) in [#27957](https://github.com/immich-app/immich/pull/27957)
- fix(mobile): enable autoplay for motion photos in video viewer by [@LeLunZ](https://github.com/LeLunZ) in [#27961](https://github.com/immich-app/immich/pull/27961)
- fix(mobile): thumbnail transition to asset viewer by [@LeLunZ](https://github.com/LeLunZ) in [#27850](https://github.com/immich-app/immich/pull/27850)
- fix: jump to timeline on new auto\_router update by [@alextran1502](https://github.com/alextran1502) in [#28022](https://github.com/immich-app/immich/pull/28022)
- fix(mobile): delete assets on trash empty, Android by [@PeterOmbodi](https://github.com/PeterOmbodi) in [#26070](https://github.com/immich-app/immich/pull/26070)
- fix(ml): handle empty/corrupt images in face detection by [@yosit](https://github.com/yosit) in [#27391](https://github.com/immich-app/immich/pull/27391)
- fix(web): refresh memories hourly by [@meesfrensel](https://github.com/meesfrensel) in [#28114](https://github.com/immich-app/immich/pull/28114)
- fix(web): large files: better handling of asset deletions by [@meesfrensel](https://github.com/meesfrensel) in [#28117](https://github.com/immich-app/immich/pull/28117)
- fix(web): double video playback on map timeline by [@YarosMallorca](https://github.com/YarosMallorca) in [#28090](https://github.com/immich-app/immich/pull/28090)
- fix(mobile): suppress asset stack UI in trash timeline by [@PeterOmbodi](https://github.com/PeterOmbodi) in [#26536](https://github.com/immich-app/immich/pull/26536)
- fix(web): timeline scroll when pressing back from stacked asset by [@Snowknight26](https://github.com/Snowknight26) in [#28163](https://github.com/immich-app/immich/pull/28163)
- fix(server): selectively apply metadata bitstream filter for video thumbnails by [@pinhao](https://github.com/pinhao) in [#28162](https://github.com/immich-app/immich/pull/28162)
- fix(web): fix shared link /s/photos.\* navigation after password login by [@meesfrensel](https://github.com/meesfrensel) in [#27788](https://github.com/immich-app/immich/pull/27788)
- fix(ml): respect time zone for logs in cuda container by [@AyaanMAG](https://github.com/AyaanMAG) in [#28155](https://github.com/immich-app/immich/pull/28155)
- fix: librknnrt permissions in machine-learning by [@DavidTheFighter](https://github.com/DavidTheFighter) in [#28216](https://github.com/immich-app/immich/pull/28216)
- fix(server): validate duplicate group ownership before dismissal by [@timonrieger](https://github.com/timonrieger) in [#28221](https://github.com/immich-app/immich/pull/28221)
- fix(web): correct timeline yesterday label across month boundaries by [@michelheusschen](https://github.com/michelheusschen) in [#28183](https://github.com/immich-app/immich/pull/28183)
- fix(mobile): show lens info without lens name by [@benbeckford](https://github.com/benbeckford) in [#28234](https://github.com/immich-app/immich/pull/28234)
- fix: stale person name after merge by [@danieldietzler](https://github.com/danieldietzler) in [#28222](https://github.com/immich-app/immich/pull/28222)
- fix(web): shared album avatars opening modal by [@meesfrensel](https://github.com/meesfrensel) in [#26719](https://github.com/immich-app/immich/pull/26719)
- fix(mobile): prevent asset loading issues when changing page or when closing memories by [@LeLunZ](https://github.com/LeLunZ) in [#27596](https://github.com/immich-app/immich/pull/27596)
- fix(mobile): correct filter default and UI desync in similar photos search by [@TheBestX11](https://github.com/TheBestX11) in [#27516](https://github.com/immich-app/immich/pull/27516)
- fix(server): hide isFavorite from partner asset sync stream by [@timonrieger](https://github.com/timonrieger) in [#28035](https://github.com/immich-app/immich/pull/28035)
- fix(mobile): restore notification plugin init by [@santoshakil](https://github.com/santoshakil) in [#28284](https://github.com/immich-app/immich/pull/28284)
- fix(mobile): mounted check before setState in album sync action by [@santoshakil](https://github.com/santoshakil) in [#28300](https://github.com/immich-app/immich/pull/28300)
- fix(mobile): avoid duplicate assets in album view by [@stfn42](https://github.com/stfn42) in [#28152](https://github.com/immich-app/immich/pull/28152)
- fix(mobile): Deduplicate assets in person view timeline by [@thowdev](https://github.com/thowdev) in [#26723](https://github.com/immich-app/immich/pull/26723)
- fix(deployment): remove unneeded volume by [@mmomjian](https://github.com/mmomjian) in [#28307](https://github.com/immich-app/immich/pull/28307)
- fix: mobile upload duration type by [@alextran1502](https://github.com/alextran1502) in [#28362](https://github.com/immich-app/immich/pull/28362)
- fix: deep link for assets when asset viewer already open by [@bwees](https://github.com/bwees) in [#27971](https://github.com/immich-app/immich/pull/27971)
- fix: kekab icon colors in light mode by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#28366](https://github.com/immich-app/immich/pull/28366)
- fix: indexes on remote\_asset\_entity by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#28264](https://github.com/immich-app/immich/pull/28264)
- fix(mobile): clear linkedRemoteAlbumId in reset() so FK refs dont dangle by [@santoshakil](https://github.com/santoshakil) in [#28382](https://github.com/immich-app/immich/pull/28382)
- fix: ignore icc profile make and model by [@jrasm91](https://github.com/jrasm91) in [#28412](https://github.com/immich-app/immich/pull/28412)
- fix(mobile): don't block app open on slow validateAccessToken by [@santoshakil](https://github.com/santoshakil) in [#28405](https://github.com/immich-app/immich/pull/28405)
- fix(mobile): add restore option to trashed assets by [@inesiscosta](https://github.com/inesiscosta) in [#27442](https://github.com/immich-app/immich/pull/27442)
- fix(mobile): use correct delete action by [@ByteSizedMarius](https://github.com/ByteSizedMarius) in [#26575](https://github.com/immich-app/immich/pull/26575)
- fix(server): dedupe database backup jobs by [@rdeaton](https://github.com/rdeaton) in [#28341](https://github.com/immich-app/immich/pull/28341)
- fix(mobile): cronet buffer overflow on compressed thumbnails by [@santoshakil](https://github.com/santoshakil) in [#28439](https://github.com/immich-app/immich/pull/28439)
- fix(mobile): cronet thumbnail buffer overflow regression from [#28439](https://github.com/immich-app/immich/issues/28439) by [@santoshakil](https://github.com/santoshakil) in [#28450](https://github.com/immich-app/immich/pull/28450)
- fix(mobile): mounted check in ThumbnailTile hero flight listener by [@santoshakil](https://github.com/santoshakil) in [#28451](https://github.com/immich-app/immich/pull/28451)
- fix(mobile): don't force-unwrap nil localizedTitle in ios getAlbums by [@santoshakil](https://github.com/santoshakil) in [#28452](https://github.com/immich-app/immich/pull/28452)
- fix(web): work around Chrome HDR image seam lines during zoom by [@midzelis](https://github.com/midzelis) in [#27715](https://github.com/immich-app/immich/pull/27715)
- fix(ios): respect status bar scroll to top in timeline views by [@agg23](https://github.com/agg23) in [#28469](https://github.com/immich-app/immich/pull/28469)
- fix(mobile): asset viewer stuck on spinner after rotation by [@LeLunZ](https://github.com/LeLunZ) in [#28019](https://github.com/immich-app/immich/pull/28019)
- fix(web): timeline stuttering with many assets in 1 day by [@benbeckford](https://github.com/benbeckford) in [#28509](https://github.com/immich-app/immich/pull/28509)
- fix(mobile): preserve zoom level during image loading and live photo playback by [@LeLunZ](https://github.com/LeLunZ) in [#27960](https://github.com/immich-app/immich/pull/27960)
- fix(ml): stabilize MIGraphX inference by [@fabianwimberger](https://github.com/fabianwimberger) in [#28444](https://github.com/immich-app/immich/pull/28444)
- fix: await sync asset v2 by [@bwees](https://github.com/bwees) in [#28569](https://github.com/immich-app/immich/pull/28569)
- fix: strip metadata from timeline responses for shared links without exif sharing by [@danieldietzler](https://github.com/danieldietzler) in [#28644](https://github.com/immich-app/immich/pull/28644)
- fix: Refresh local album overview page after asset deletion by [@Lauritz-Tieste](https://github.com/Lauritz-Tieste) in [#28586](https://github.com/immich-app/immich/pull/28586)
- fix(server): prevent locked assets from leaking to partners by [@timonrieger](https://github.com/timonrieger) in [#28652](https://github.com/immich-app/immich/pull/28652)
- refactor(web): replace per-asset viewport proximity with day-tier active indices by [@midzelis](https://github.com/midzelis) in [#28597](https://github.com/immich-app/immich/pull/28597)
- fix: timeline scroll flicker by [@alextran1502](https://github.com/alextran1502) in [#28653](https://github.com/immich-app/immich/pull/28653)
- fix: api repositories using stale endpoint by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#28667](https://github.com/immich-app/immich/pull/28667)
- fix: disallow cross origin/non http protocols for continueUrl on login by [@bwees](https://github.com/bwees) in [#28706](https://github.com/immich-app/immich/pull/28706)
- fix(web): skip thumbhash fade for offscreen thumbnails by [@midzelis](https://github.com/midzelis) in [#27335](https://github.com/immich-app/immich/pull/27335)
- fix(web): prevent partner assets from being selected in geolocation utility by [@okxint](https://github.com/okxint) in [#28737](https://github.com/immich-app/immich/pull/28737)
- fix(mobile): invisible ink splashes in asset sheet by [@timonrieger](https://github.com/timonrieger) in [#28756](https://github.com/immich-app/immich/pull/28756)
- fix!: unauthorized face creation by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#28561](https://github.com/immich-app/immich/pull/28561)
- fix(mobile): proper background task cleanup by [@mertalev](https://github.com/mertalev) in [#28694](https://github.com/immich-app/immich/pull/28694)
- fix(cli): prevent out-of-memory on file upload due to undici storing the request body by [@moversity](https://github.com/moversity) in [#28723](https://github.com/immich-app/immich/pull/28723)
- fix: error log on aborted uploads by [@jrasm91](https://github.com/jrasm91) in [#28806](https://github.com/immich-app/immich/pull/28806)
- fix(server): respect timezone in iso date string encoding by [@timonrieger](https://github.com/timonrieger) in [#28810](https://github.com/immich-app/immich/pull/28810)
- test: fix tests when OpenVINO provider is available by [@nekowinston](https://github.com/nekowinston) in [#28802](https://github.com/immich-app/immich/pull/28802)
- fix(mobile): run iOS bg task phases in parallel by [@santoshakil](https://github.com/santoshakil) in [#28293](https://github.com/immich-app/immich/pull/28293)
- fix: error handling by [@jrasm91](https://github.com/jrasm91) in [#28843](https://github.com/immich-app/immich/pull/28843)
- fix: cross isolate drift watchers by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#28862](https://github.com/immich-app/immich/pull/28862)
- fix: reload timeline on group by setting change by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#28864](https://github.com/immich-app/immich/pull/28864)
- fix(web): use irot/imir tags for HEIF Orientation by [@joojoooo](https://github.com/joojoooo) in [#27820](https://github.com/immich-app/immich/pull/27820)
- fix: detail panel faces reactivity issues by [@danieldietzler](https://github.com/danieldietzler) in [#28910](https://github.com/immich-app/immich/pull/28910)
- fix(server): hide isFavorite from album asset sync stream by [@timonrieger](https://github.com/timonrieger) in [#28923](https://github.com/immich-app/immich/pull/28923)
- fix(mobile): show memory and folder dates in local time by [@santoshakil](https://github.com/santoshakil) in [#28941](https://github.com/immich-app/immich/pull/28941)
- fix(mobile): show error when creating an album fails by [@santoshakil](https://github.com/santoshakil) in [#28942](https://github.com/immich-app/immich/pull/28942)
- fix(mobile): add album picker to archive bottom sheet by [@santoshakil](https://github.com/santoshakil) in [#28953](https://github.com/immich-app/immich/pull/28953)
- fix: normalize diacritics in person name search in Web & Mobile by [@pedrovieira](https://github.com/pedrovieira) in [#28887](https://github.com/immich-app/immich/pull/28887)
- fix(web): Prevent face editor from closing when dismissing tag confirmation by [@pedrovieira](https://github.com/pedrovieira) in [#28900](https://github.com/immich-app/immich/pull/28900)
- fix(mobile): map timeline layout crash by [@YarosMallorca](https://github.com/YarosMallorca) in [#28878](https://github.com/immich-app/immich/pull/28878)
- fix(mobile): deduplicate people in asset details panel by [@santoshakil](https://github.com/santoshakil) in [#28972](https://github.com/immich-app/immich/pull/28972)
- fix(mobile): keep timezone when editing asset date time by [@santoshakil](https://github.com/santoshakil) in [#28978](https://github.com/immich-app/immich/pull/28978)
- fix(mobile): stale details after editing asset date by [@santoshakil](https://github.com/santoshakil) in [#28977](https://github.com/immich-app/immich/pull/28977)
- fix(mobile): show albums whose assets are all trashed by [@santoshakil](https://github.com/santoshakil) in [#28985](https://github.com/immich-app/immich/pull/28985)
- fix(mobile): give android notification channels proper names by [@santoshakil](https://github.com/santoshakil) in [#28986](https://github.com/immich-app/immich/pull/28986)
- fix: Improving scroll behavior on image stacks that overflow the screen by [@BlankCanvasStudio](https://github.com/BlankCanvasStudio) in [#28885](https://github.com/immich-app/immich/pull/28885)
- fix(web): focus on scrollable element on load by [@timonrieger](https://github.com/timonrieger) in [#29004](https://github.com/immich-app/immich/pull/29004)
- fix(mobile): show like and comment options on album photo deep links by [@santoshakil](https://github.com/santoshakil) in [#29020](https://github.com/immich-app/immich/pull/29020)
- fix(web): correctly handle person search with more than 100 results by [@maxinegardenas](https://github.com/maxinegardenas) in [#29002](https://github.com/immich-app/immich/pull/29002)
- fix(web): prevent upload status panel from overlapping album action bar by [@okxint](https://github.com/okxint) in [#29044](https://github.com/immich-app/immich/pull/29044)
- fix(web): error loading image state by [@bwees](https://github.com/bwees) in [#29058](https://github.com/immich-app/immich/pull/29058)
- fix(web): show asset arrows by [@timonrieger](https://github.com/timonrieger) in [#29010](https://github.com/immich-app/immich/pull/29010)
- fix(server): hide partner archived asset locations from map by [@timonrieger](https://github.com/timonrieger) in [#29028](https://github.com/immich-app/immich/pull/29028)
- fix: lock transcoding options by [@timonrieger](https://github.com/timonrieger) in [#29076](https://github.com/immich-app/immich/pull/29076)
- fix(server): do not merge metadata when multiple duplicates are kept by [@timonrieger](https://github.com/timonrieger) in [#29035](https://github.com/immich-app/immich/pull/29035)
- fix: integrity report checksum query by [@danieldietzler](https://github.com/danieldietzler) in [#29136](https://github.com/immich-app/immich/pull/29136)
- fix: map settings by [@danieldietzler](https://github.com/danieldietzler) in [#29134](https://github.com/immich-app/immich/pull/29134)
- fix: too strict cron expression validation by [@danieldietzler](https://github.com/danieldietzler) in [#29138](https://github.com/immich-app/immich/pull/29138)
- fix(web): respect local timezone when building date range for search by [@okxint](https://github.com/okxint) in [#29128](https://github.com/immich-app/immich/pull/29128)
- fix(web): language selector by [@meesfrensel](https://github.com/meesfrensel) in [#29065](https://github.com/immich-app/immich/pull/29065)
- fix: update datetimeRelative description to minutes instead of seconds by [@meesfrensel](https://github.com/meesfrensel) in [#29137](https://github.com/immich-app/immich/pull/29137)
- fix: video thumbnail quality sharing by [@bwees](https://github.com/bwees) in [#29104](https://github.com/immich-app/immich/pull/29104)
- fix(mobile): stop sync albums crashing on the main isolate by [@santoshakil](https://github.com/santoshakil) in [#29133](https://github.com/immich-app/immich/pull/29133)
- fix(mobile): show memories with no showAt/hideAt in the timeline lane by [@santoshakil](https://github.com/santoshakil) in [#29158](https://github.com/immich-app/immich/pull/29158)
- fix(mobile): keep toasts off the dynamic island when keyboard is open by [@santoshakil](https://github.com/santoshakil) in [#29159](https://github.com/immich-app/immich/pull/29159)
- fix(server): skip existing users when sharing albums by [@jeevan6996](https://github.com/jeevan6996) in [#28884](https://github.com/immich-app/immich/pull/28884)
- fix: web i18n by [@danieldietzler](https://github.com/danieldietzler) in [#29175](https://github.com/immich-app/immich/pull/29175)
- fix(web): shift+click on GPS asset extends range selection in geolocation utility by [@timonrieger](https://github.com/timonrieger) in [#29022](https://github.com/immich-app/immich/pull/29022)
- fix(server): allow non-utc datetime offsets by [@timonrieger](https://github.com/timonrieger) in [#29186](https://github.com/immich-app/immich/pull/29186)
- fix: remove local-only step ids from workflow json by [@danieldietzler](https://github.com/danieldietzler) in [#29188](https://github.com/immich-app/immich/pull/29188)
- fix: asset type filter by [@danieldietzler](https://github.com/danieldietzler) in [#29190](https://github.com/immich-app/immich/pull/29190)
- fix(mobile): prevent duplicate login pages for unauthenticated share intent warm start by [@olildu](https://github.com/olildu) in [#29054](https://github.com/immich-app/immich/pull/29054)
- fix(mobile): refresh memories on resume and day change by [@santoshakil](https://github.com/santoshakil) in [#28983](https://github.com/immich-app/immich/pull/28983)
- fix(mobile): re-lock locked folder when the app is backgrounded by [@santoshakil](https://github.com/santoshakil) in [#29089](https://github.com/immich-app/immich/pull/29089)
- fix(mobile): endless spinner on album selection when device has no albums by [@santoshakil](https://github.com/santoshakil) in [#28994](https://github.com/immich-app/immich/pull/28994)
- fix: rc version check by [@danieldietzler](https://github.com/danieldietzler) in [#29194](https://github.com/immich-app/immich/pull/29194)
- fix: detail panel people reactivity and iterator consumption by [@danieldietzler](https://github.com/danieldietzler) in [#29250](https://github.com/immich-app/immich/pull/29250)
- fix(server): use VBR for QSV so the max bitrate is respected by [@aclerici38](https://github.com/aclerici38) in [#29240](https://github.com/immich-app/immich/pull/29240)
- fix: ignore external libraries for integrity report checksum check by [@danieldietzler](https://github.com/danieldietzler) in [#29248](https://github.com/immich-app/immich/pull/29248)
- fix(web): remove map's fullscreen button by [@meesfrensel](https://github.com/meesfrensel) in [#29192](https://github.com/immich-app/immich/pull/29192)
- refactor: use SemVer classes for version compatability message by [@bwees](https://github.com/bwees) in [#29056](https://github.com/immich-app/immich/pull/29056)
- fix: sync backfill by [@jrasm91](https://github.com/jrasm91) in [#29267](https://github.com/immich-app/immich/pull/29267)
- fix(mobile): force AssetViewerPage recreation on repeated view intents by [@okxint](https://github.com/okxint) in…
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

changelog:bugfix documentation Improvements or additions to documentation 🧠machine-learning

Projects

None yet

Development

Successfully merging this pull request may close these issues.

ROCm ML image crashes (SIGSEGV) on AMD Phoenix iGPU (gfx1103) with MIGraphXExecutionProvider

7 participants