Skip to content

fix(server): sync files to disk#26881

Merged
alextran1502 merged 1 commit intomainfrom
uhthomas/fix-server-flush-files
Mar 17, 2026
Merged

fix(server): sync files to disk#26881
alextran1502 merged 1 commit intomainfrom
uhthomas/fix-server-flush-files

Conversation

@uhthomas
Copy link
Collaborator

Description

Ensure that all files are flushed after they've been written.

At current, files are not explicitly flushed to disk, which can cause data corruption. In extreme circumstances, it's possible that uploaded files may not ever be persisted at all.

The consequence of this is that it may reduce throughput, but Immich should prioritise data integrity over performance.

Refs: #26720, more?

@uhthomas uhthomas force-pushed the uhthomas/fix-server-flush-files branch 5 times, most recently from 9cc740a to 36607d3 Compare March 12, 2026 15:31
@uhthomas uhthomas changed the title fix(server): flush files after write fix(server): sync files to disk Mar 12, 2026
@mmomjian
Copy link
Collaborator

The consequence of this is that it may reduce throughput

is this something that should be benchmarked before we make this a non configurable change? Not all storage backends benefit from or need this syscall.

@uhthomas
Copy link
Collaborator Author

IMO, no. This is absolutely necessary. Every storage medium needs and benefits from this.

@mmomjian
Copy link
Collaborator

Perhaps there is backend discussion I’m not aware of. We’ve come a long way with minimal (?) issues from the current setup. Doing this without batching could cause massive overhead on simple operations like bulk asset tagging and XMP writes.

@uhthomas
Copy link
Collaborator Author

I would be more concerned if every single write was subject to sync, but syncing a whole file is fine. It does not make any sense to write dozens or hundreds of files and not have actually persisted them, especially when the current assumption is that they have been.

We have seen plenty of consistency issues, especially with unstable storage like SMB, NFS or USB. They are the most likely to benefit from this.

This is incredibly important. Immich shouldn't just yolo anything - people rely on Immich for backing up photos and videos and expect the backed up data the be durable.

@alextran1502
Copy link
Member

This PR should be benchmarked on the impact when ingesting large library so we can clearly see the pros and cons

@uhthomas
Copy link
Collaborator Author

Sure.

The impact should be minimal, but for uploads this is really non negotiable. It does not make any sense for Immich to persist asset data to the DB a tell clients an upload was successful without syncing the file to the filesystem.

@uhthomas
Copy link
Collaborator Author

I ran a quick bench on a 990 Pro and:

Size No sync flush: true Separate fdatasync
1KB 0.068ms 0.082ms (+19%) 0.119ms (+73%)
100KB 0.096ms 0.114ms (+19%) 0.142ms (+48%)
1MB 0.330ms 0.319ms (~0%) 0.420ms (+27%)
10MB 3.29ms 3.23ms (~0%) 3.15ms (~0%)

So, no impact for large files on reasonable storage. I imagine there will be more of an impact on slower storage, but what other option is there? Lose data?

@uhthomas
Copy link
Collaborator Author

uhthomas commented Mar 12, 2026

On really bad storage, like a cheap USB stick that I bought 10 years ago, it's got quite a big impact. Not really surprising though.

Size No sync flush: true Separate fdatasync
1KB 0.65ms 7.42ms (+1042%) 8.17ms (+1158%)
100KB 0.91ms 9.38ms (+930%) 9.10ms (+900%)
1MB 1.76ms 246.28ms (+13893%) 71.60ms (+3968%)
10MB 14.64ms 563.50ms (+3749%) 820.62ms (+5505%)

@alextran1502
Copy link
Member

I want to take a step back and consider whether enforcing this at the application level is the right approach, given the performance impact.

The failure mode in #26720 could have other root causes, NFS mounted with async, unstable USB storage, etc. In those cases, fdatasync per write is compensating for a broken storage configuration rather than fixing the actual problem.

Data integrity is important, but I think we should:

  • Scope the sync to the upload path only, that's where data loss is unrecoverable.
  • Thumbnails, transcodes, and XMP sidecars can all be regenerated.
  • Benchmark this on a bulk ingest over NFS, USB HDD, and local SSD before making it a non-configurable default.
  • Consider whether better documentation on recommended mount options (e.g., NFS sync, journaling filesystems for USB) is the more appropriate fix.

Can we get numbers on the benchmarking first?

@uhthomas uhthomas force-pushed the uhthomas/fix-server-flush-files branch from 36607d3 to f312e07 Compare March 12, 2026 18:26
@uhthomas
Copy link
Collaborator Author

@alextran1502 I considered allowing non sync writes for stuff like thumbnails and metadata, but we aren't doing any sort of integrity checking there at all. It is impossible to deterministically find and fix / regenerate thumbnails, etc which are corrupt because of this.

Some filesystems are slow, and will hold data in a cache for 30 seconds or minutes. As a user who has terabytes of photos and videos, not syncing to the filesystem properly makes me incredibly nervous and I hope that we can agree that data integrity and durability should be prioritised above everything else. If the performance is worse because we're actually handling data safely, then so be it. That's how it's supposed to be, and that's the philosophy that other systems (like Ceph) take.

We have to enforce this within Immich. It doesn't matter how great your storage medium is if the writes aren't being flushed to disk. Any number of things could prevent the write from actually being persisted and Immich would have no idea.

@uhthomas
Copy link
Collaborator Author

uhthomas commented Mar 12, 2026

If you want to try it on your own storage, use:

BENCH_DIR=/home/thomas/code/github.com/immich-app/immich/mnt/immich-datasync-bench npx vitest bench --config test/vitest.config.mjs src/benchmarks/datasync.bench.ts

server/src/benchmarks/datasync.bench.ts
 cat server/src/benchmarks/datasync.bench.ts
import fs from 'node:fs/promises';
import os from 'node:os';
import path from 'node:path';
import { bench, describe } from 'vitest';

const sizes = [
  { name: '1KB', bytes: 1024 },
  { name: '100KB', bytes: 100 * 1024 },
  { name: '1MB', bytes: 1024 * 1024 },
  { name: '10MB', bytes: 10 * 1024 * 1024 },
];

const tmpDir = process.env.BENCH_DIR || path.join(os.tmpdir(), 'immich-datasync-bench');

let counter = 0;
const nextPath = () => path.join(tmpDir, `bench-${counter++}`);

// pre-allocate buffers
const buffers = new Map<number, Buffer>();
for (const { bytes } of sizes) {
  buffers.set(bytes, Buffer.alloc(bytes, 0x42));
}

describe('writeFile', async () => {
  await fs.mkdir(tmpDir, { recursive: true });

  for (const { name, bytes } of sizes) {
    const buf = buffers.get(bytes)!;

    bench(`${name}`, async () => {
      const p = nextPath();
      await fs.writeFile(p, buf);
    });

    bench(`${name} + flush: true`, async () => {
      const p = nextPath();
      await fs.writeFile(p, buf, { flush: true });
    });

    bench(`${name} + fdatasync`, async () => {
      const p = nextPath();
      await fs.writeFile(p, buf);
      const handle = await fs.open(p, 'r');
      try {
        await handle.datasync();
      } finally {
        await handle.close();
      }
    });
  }
});

@uhthomas
Copy link
Collaborator Author

To add some context to the benchmark numbers, also consider that the majority of the time and work for uploads will be the network. A few milliseconds, or a few hundred at worst is negligible.

@alextran1502
Copy link
Member

Integrity check is in the works #24205, I will run some benchmarks on my own. Can you help by enforcing it only on the upload path?

@danieldietzler
Copy link
Member

FWIW I think we all agree on that we want to have certainty about not losing files. Proper integrity checks are already in the works though, which should also help with giving confidence. I think for Immich particularly the reality is that many people are running it on slower storage (especially not NVMes), in which case performance impacts are very significant. The truth is also that most people don't run CEPH in their homelab, and instead pick an FS with less performance impact at the expense of worse persistence guarantees.

As Alex mentioned, it's quite likely that most of the issues we have seen come from either bad network mounts, or FSs lying about persistence status. There's only so much an fsync will do if the FS doesn't play along, too.

So, regardless we would want to have higher integrity around files/file persistence and surface lost/failed writes to the user

@uhthomas
Copy link
Collaborator Author

I don't think integrity checks are a substitute for syncing files to disk correctly.

I strongly believe that we should be syncing all writes, so I'm keen to hear the results from your findings. I/O will be the most expensive part of these operations and syncing should be minimal overhead.

@uhthomas
Copy link
Collaborator Author

If filesytems are already lying about whether things have been persisted, then explicitly syncing won't make any difference in those cases (or maybe it will! and it will prevent corruption).

I really cannot see how non-durable data is desirable at all. Much like how Postgres gets really fast when writing without fsync, it's kind of pointless and dangerous. Postgres cares about data integrity for a reason.

@uhthomas
Copy link
Collaborator Author

There's also no reason Immich shouldn't work with network mounts or precarious setups if the only thing preventing it from doing so is syncing properly. If we try to sync the data and it fails, then users will get proper errors rather than silent corruption.

@alextran1502
Copy link
Member

alextran1502 commented Mar 12, 2026

I/O will be the most expensive part of these operations and syncing should be minimal overhead.

@uhthomas

Yeah. I will report back later this week. I am also very hopeful that the sync overhead is minimal in the grand scheme of things, but we will see. I have a very common setup for most use cases.

Can you help by just limiting the scope of sync to the upload path?

@uhthomas
Copy link
Collaborator Author

I tried this on an old WD Red 3TB, and the overhead for large writes is small, but the overhead for small writes is large. This is unsurprising given how few IOPS HDDs have.

Size No sync flush: true Separate fdatasync
1KB 0.068ms 48.66ms (+71,459%) 56.69ms (+83,268%)
100KB 1.38ms 61.22ms (+4,336%) 59.17ms (+4,187%)
1MB 10.17ms 71.21ms (+600%) 72.32ms (+611%)
10MB 75.77ms 162.45ms (+114%) 154.55ms (+104%)
100MB 824.20ms 879.15ms (+7%) 883.46ms (+7%)

@uhthomas
Copy link
Collaborator Author

I agree that uploads are the most important, though let's wait until you've tried it before we remove the other syncs. I really believe they are important too.

@uhthomas
Copy link
Collaborator Author

It's still not merged yet @platima - your input would be greatly appreciated.

@uhthomas uhthomas force-pushed the uhthomas/fix-server-flush-files branch from 606ae40 to 5cc0a6d Compare March 16, 2026 23:43
Ensure that all files are flushed after they've been written.

At current, files are not explicitly flushed to disk, which can cause
data corruption. In extreme circumstances, it's possible that uploaded
files may not ever be persisted at all.
@uhthomas uhthomas force-pushed the uhthomas/fix-server-flush-files branch from 5cc0a6d to b108f04 Compare March 16, 2026 23:43
@platima
Copy link

platima commented Mar 16, 2026

It's still not merged yet @platima - your input would be greatly appreciated.

Noted, will let it finish then!

Sorry, saw a dozen emails and what looked like an approval 😅

@uhthomas
Copy link
Collaborator Author

Tested the latest changes on the preview instance and seems to work as expected.

@platima
Copy link

platima commented Mar 17, 2026

TrueNAS Scale 24.04 with 3x 20TB WD Ultrastar DC HC560's in RAIDZ1
Left the SSD enabled as it's L2ARC, so read cache not write - will be useful for testing #26939 which I intend to do within 24 hours too

Fresh Immich 2.5.6 stack deployed directly on the NAS as the Docker host (Xeon E5-2620 v3 CPU - 6C/12T, 32GB ECC RAM)
Machine Learning disabled same as done above
2,500x JPGs ranging in size from 1.5MB to 13MB ea, total 7.6GB, over 1GbE
Upload source was my RAID1 WD Black SSDs so no latency on the source

I compared the oldest and newest 'birth' date of JPG files on the disk in library/uploads: the delta was 13m 55s average across three runs. I then wiped files and database from disk, re-deployed with #26881. The birth delta average was 17m 59s.

So that difference is +29%.

However

Most of that testing was yesterday. Today I have done two more tests with the more recent commits, as I'm testing via the PR tag not the commit sha256sum, and the deltas were 19m 36s and 19m23s, making it a 40% performance penalty it seems.

Realistically though, we're talking about 18-20 minutes instead of ~14 minutes. That is also only approximately 0.1338 seconds per file. For guaranteed data integrity, I am more than happy to forgo those extra few minutes.

-P

@uhthomas
Copy link
Collaborator Author

uhthomas commented Mar 17, 2026

Thank you for testing, it's hugely appreciated. Would you mind just clarifying which commit you used for those tests? I know you were doing it by tag, but I want to be clear on whether those results are from just syncing uploaded files or everything.

@platima
Copy link

platima commented Mar 17, 2026

No worries.

I cannot be 100% sorry, as I was testing using the PR tag not the commit tag, however, the most recent ~19 minute upload was less than 1 hour ago. The ~17 minute uploads were both about 16 and 4 hours ago.

I'm in and out of the office all day but can re-test with specific commits if you prefer.

Cheers

@uhthomas
Copy link
Collaborator Author

Thanks - that does surprise me. { flush: true } on the write stream should be better than opening a new file descriptor and flushing it.

Is your docker configured to always pull the image, even if it's unchanged? Were you restarting the server and getting new changes between tests?

@platima
Copy link

platima commented Mar 17, 2026

Yep the process was:

  1. Deploy stack
  2. Turn off ML
  3. Upload images
  4. Shutdown stack
  5. Delete 'library' and 'database' folders
  6. Update stack env from v2.5.6 to pr-26881
  7. Tick 'always pull the image' as deploying
  8. Turn off ML
  9. Upload images again

Want to give me two specific commits and I'll re-run with just those?

@uhthomas
Copy link
Collaborator Author

You've already done a lot, you don't have to.

If you are interested, these two would be good to compare.

@platima
Copy link

platima commented Mar 17, 2026

All good. I want to use Immich as a live platform for both myself, and my partner, instead of Google Drive or OneDrive, and we have 20+ years of photos and videos, so data integrity is hugely important.

Starting those tests now. Hoping to get them done within 3-4 hours, but that depends on phone calls and meetings.

Cheers

@mertalev
Copy link
Member

Those are very interesting results. I have to say a 30-40% penalty is unfortunate considering that a mobile client has limited time to upload, but I'm not sure if it can be improved.

@platima
Copy link

platima commented Mar 17, 2026

@mertalev I agree to a limited amount.

Mobile has limited time-frame, but I think mobile is more likely bound by upload capacity (in Australia it's common to only have ~10-40Mbps upload on home internet), and I doubt that the average user would be uploading 2,500 images at once.

The total impact average was only ~0.1338 seconds per file across a range of file sizes, so as an indented end-user, I would consider that worthwhile.

Re-testing two specific commits nearly finished.

@platima
Copy link

platima commented Mar 17, 2026

Same files and setup re-tested between 9:53am and 11:30am. The numbers are very much the same.

v2.5.6
13m 49s

flush commit b108f04
19m 17s
+5m 28s / 39.6%

fdatasync commit 0ab057f:
19m 45s
+5m 56s / 42.9% from v2.5.6
+28s / +2.4% from flush commit b108f04

@uhthomas
Copy link
Collaborator Author

Thank you so much @platima!!

@platima
Copy link

platima commented Mar 17, 2026

Thank you so much @platima!!

Any time @uhthomas - thank YOU for adding code that hardens up the data integrity. Fast ain't always better than slow you know.

Oh and thanks and your assist on the other one (bed time shortly here, so I'll get back to that one tomorrow).

@alextran1502 alextran1502 merged commit 16749ff into main Mar 17, 2026
53 checks passed
@alextran1502 alextran1502 deleted the uhthomas/fix-server-flush-files branch March 17, 2026 11:33
brucethomax pushed a commit to brucethomax/immich that referenced this pull request Mar 19, 2026
Ensure that all files are flushed after they've been written.

At current, files are not explicitly flushed to disk, which can cause
data corruption. In extreme circumstances, it's possible that uploaded
files may not ever be persisted at all.
alexlebens pushed a commit to alexlebens/infrastructure that referenced this pull request Mar 20, 2026
This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [immich-app/immich](https://github.com/immich-app/immich) | minor | `v2.5.6` → `v2.6.1` |

---

> ⚠️ **Warning**
>
> Some dependencies could not be looked up. Check the [Dependency Dashboard](issues/2) for more information.

---

### Release Notes

<details>
<summary>immich-app/immich (immich-app/immich)</summary>

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

[Compare Source](immich-app/immich@v2.6.0...v2.6.1)

### v2.6.1

#### Hot fixes

- Fixed a failed migration issue on the mobile app when the URL Switching feature is used

#### What's Changed

##### 🐛 Bug fixes

- fix(server): fallback to email when name is empty by [@&#8203;jrasm91](https://github.com/jrasm91) in [#&#8203;27016](immich-app/immich#27016)
- fix: ignore errors deleting untitled album by [@&#8203;jrasm91](https://github.com/jrasm91) in [#&#8203;27020](immich-app/immich#27020)
- fix(web): wrap long album title by [@&#8203;jrasm91](https://github.com/jrasm91) in [#&#8203;27012](immich-app/immich#27012)
- fix(web): stop in-progress uploads on logout by [@&#8203;jrasm91](https://github.com/jrasm91) in [#&#8203;27021](immich-app/immich#27021)
- fix: writing empty exif tags by [@&#8203;danieldietzler](https://github.com/danieldietzler) in [#&#8203;27025](immich-app/immich#27025)
- fix(web): disable send button by [@&#8203;jrasm91](https://github.com/jrasm91) in [#&#8203;27051](immich-app/immich#27051)
- fix(mobile): server url migration by [@&#8203;mertalev](https://github.com/mertalev) in [#&#8203;27050](immich-app/immich#27050)

**Full Changelog**: <immich-app/immich@v2.6.0...v2.6.1>

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

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

### v2.6.0

Welcome to Immich `v2.6.0`, This release is a collection of more than *350 commits over 6 weeks*. I know, it is an eternity between releases compared to our previous era. This version focuses on bug fixes and enhancements across the app to provide a more delightful and smoother experience to you. This release also prepares for the next major release in the coming month, which will remove the old timeline implementation. Let's dive into the highlights of the release:

> \[!WARNING]
> For those who are still using the old timeline, please switch to the new timeline to avoid interruption, as the old timeline will be removed in the next release.
>
> ps: The old timeline has an exclamation icon next to the logo. <img width="525" height="120" alt="image" src="https://github.com/user-attachments/assets/ed36ea22-b16e-472f-961c-c19501712ba5" />

### Highlights

- Map side panel (web)
- Pick album cover (mobile)
- Shared link slugs (mobile)
- Shared link presets (web)
- Native HTTP clients (mobile)
- Video player and asset viewer improvements (mobile)
- Improved search results (mobile)
- `schema-check`: a new `immich-admin` command
- Read profile claims from ID token (OAuth)
- Notable fix: cast videos now automatically loop
- Notable fix: correctly extract make and model from Sony XAVC video files
- Notable fix: escape key handling on web
- Notable fix: healthcheck endpoint in maintenance mode
- Notable fix: timeline rendering for RTL languages like Arabic and Hebrew
- Notable fix: prevent server crash when extracting invalid metadata

#### Map side panel (web)

The map view on the web now opens a mini-timeline component as a side panel when you click on a cluster of assets. This makes it easier to view the cluster at a glance and enables bulk actions, such as adding to favorites and adding to an album.

<img width="800" alt="image" src="https://github.com/user-attachments/assets/6f90b04d-4aa7-4f68-b59c-c2b912e638f7" />

#### Pick album cover (mobile)

Users can now pick a new album cover directly from the mobile app.

<https://github.com/user-attachments/assets/7f99dc80-21c6-4ce6-9f75-8e6b0163dcaa>

#### Shared link slugs (mobile)

The mobile app now also supports setting a shared link slug, a feature that's been available on the web for a while.

<https://github.com/user-attachments/assets/5420995a-cfd4-471d-a3ac-db4fa45de780>

#### Shared link presets (web)

The expiration form input on the web was always a bit confusing, but it's been updated to make it easier to see and understand when a shared link will expire.

<img width="400" alt="image" src="https://github.com/user-attachments/assets/9d6124a9-eec2-43e8-b228-e1ac6c0415e8" />

#### Native HTTP clients (mobile)

The mobile app now uses native HTTP clients across both Android and iOS, with support for mTLS, self-signed certificates, basic auth, and custom headers. These features should now be more reliable and extend to background tasks, video playback, and other parts of the app. This also improves the app's overall network request performance thanks to HTTP/2 and HTTP/3, multiplexing, and caching.

#### Video player and asset viewer improvements (mobile)

The asset viewer has undergone many improvements under the hood to make it simpler, faster and more reliable. We've also added playback support for GIFs, enabled video zooming, and made many more bug fixes and tweaks.

##### The asset viewer now uses a gradient for actions, and video controls have been restyled

<img width="300" alt="image" src="https://github.com/user-attachments/assets/9a4e0892-f178-45fc-812c-10a6cba3f48b" />

##### Inline asset details

This used to be a bottom sheet and had a lot of glue for alignment. The new version is much more responsive and less buggy.

##### Before

<https://github.com/user-attachments/assets/43b59b59-7d6a-48d0-94d7-84b8cae1c2a9>

##### After

<https://github.com/user-attachments/assets/9217b6f4-1c92-40b0-bd95-a0681307cf38>

#### Improved search results (mobile)

The search results page now loads more results without rebuilding the entire grid, and should now load much faster. There are also new screens for when there are no search results and when all results have been loaded.

<https://github.com/user-attachments/assets/42ce69d4-1618-48ee-9cb9-91ec22e12b27>

#### `schema-check`: a new `immich-admin` command

A new `immich-admin` command has been added in this release: `schema-check`. The command runs a report on the database to check if any indexes, constraints, tables, or columns are missing. This check also runs automatically on startup.

#### Read profile claims from `idToken` (OAuth)

Prior to `v2.6.0`, Immich resolved the `email` and other claims from the [userinfo](https://openid.net/specs/openid-connect-core-1_0.html#UserInfo) endpoint. Now, Immich also supports reading those claims directly from the `idToken`. This makes it possible to use providers such as Microsoft ADFS that do not support the userinfo endpoint.

***

As always, there are many more QoL improvements, bug fixes, and enhancements in this release. Please find the full release note below

#### 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 v2.6.0 -->

#### What's Changed

##### 🔒 Security

- fix(server): restrict individual shared link asset removal to owners by [@&#8203;michelheusschen](https://github.com/michelheusschen) in [#&#8203;26868](immich-app/immich#26868)
- fix: add to shared link by [@&#8203;jrasm91](https://github.com/jrasm91) in [#&#8203;26886](immich-app/immich#26886)

##### 🚀 Features

- feat: shared link login by [@&#8203;jrasm91](https://github.com/jrasm91) in [#&#8203;25678](immich-app/immich#25678)
- feat: schema-check by [@&#8203;jrasm91](https://github.com/jrasm91) in [#&#8203;25904](immich-app/immich#25904)
- feat: add people deeplink by [@&#8203;arne182](https://github.com/arne182) in [#&#8203;25686](immich-app/immich#25686)
- feat(mobile): inline asset details by [@&#8203;uhthomas](https://github.com/uhthomas) in [#&#8203;25952](immich-app/immich#25952)
- feat(mobile): filter by tags by [@&#8203;benjamonnguyen](https://github.com/benjamonnguyen) in [#&#8203;26196](immich-app/immich#26196)
- feat: add .mxf file support by [@&#8203;timonrieger](https://github.com/timonrieger) in [#&#8203;24644](immich-app/immich#24644)
- feat: tap to see next/previous image by [@&#8203;thezeroalpha](https://github.com/thezeroalpha) in [#&#8203;20286](immich-app/immich#20286)
- feat(mobile): Allow users to set album cover from mobile app by [@&#8203;timonrieger](https://github.com/timonrieger) in [#&#8203;25515](immich-app/immich#25515)
- feat(mobile): Allow users to set profile picture from asset viewer by [@&#8203;timonrieger](https://github.com/timonrieger) in [#&#8203;25517](immich-app/immich#25517)
- feat: ROCm 7.2 and MIGraphX support  by [@&#8203;kprinssu](https://github.com/kprinssu) in [#&#8203;26178](immich-app/immich#26178)
- feat(web): map timeline sidepanel by [@&#8203;michelheusschen](https://github.com/michelheusschen) in [#&#8203;26532](immich-app/immich#26532)
- feat: add responsive layout to broken asset by [@&#8203;midzelis](https://github.com/midzelis) in [#&#8203;26384](immich-app/immich#26384)
- feat(web): toggle zoom on double-click in photo viewer by [@&#8203;midzelis](https://github.com/midzelis) in [#&#8203;26732](immich-app/immich#26732)
- feat(mobile): show animated images in asset viewer by [@&#8203;LeLunZ](https://github.com/LeLunZ) in [#&#8203;26614](immich-app/immich#26614)
- feat(mobile): open in browser by [@&#8203;YarosMallorca](https://github.com/YarosMallorca) in [#&#8203;26369](immich-app/immich#26369)

##### 🌟 Enhancements

- feat: verify permissions by [@&#8203;jrasm91](https://github.com/jrasm91) in [#&#8203;25647](immich-app/immich#25647)
- feat(web): change link expiration logic & presets  by [@&#8203;YarosMallorca](https://github.com/YarosMallorca) in [#&#8203;26064](immich-app/immich#26064)
- feat(mobile): dynamic layout in new timeline by [@&#8203;shenlong-tanwen](https://github.com/shenlong-tanwen) in [#&#8203;23837](immich-app/immich#23837)
- feat(cli): change progress bar to display file size by [@&#8203;Nykri](https://github.com/Nykri) in [#&#8203;23328](immich-app/immich#23328)
- feat(mobile): dynamic multi-line album name by [@&#8203;uhthomas](https://github.com/uhthomas) in [#&#8203;26040](immich-app/immich#26040)
- feat(mobile): hide search by context/OCR if disabled on server ([#&#8203;25472](immich-app/immich#25472)) by [@&#8203;Nacolis](https://github.com/Nacolis) in [#&#8203;26063](immich-app/immich#26063)
- fix(release): add docker-compose.rootless.yml to released assets by [@&#8203;dnozay](https://github.com/dnozay) in [#&#8203;26261](immich-app/immich#26261)
- feat(web): show ocr text boxes in panoramas by [@&#8203;meesfrensel](https://github.com/meesfrensel) in [#&#8203;25727](immich-app/immich#25727)
- feat(web): loop chromecast video by [@&#8203;etnoy](https://github.com/etnoy) in [#&#8203;24410](immich-app/immich#24410)
- chore(web): merge "Add to album" and "Add to shared album" actions into a single action by [@&#8203;timonrieger](https://github.com/timonrieger) in [#&#8203;24669](immich-app/immich#24669)
- feat(mobile): timeline - add bottomWidgetBuilder  by [@&#8203;PeterOmbodi](https://github.com/PeterOmbodi) in [#&#8203;25634](immich-app/immich#25634)
- feat(mobile): video zooming in asset viewer by [@&#8203;goalie2002](https://github.com/goalie2002) in [#&#8203;22036](immich-app/immich#22036)
- feat(mobile): Add slug support for shared links by [@&#8203;Lauritz-Tieste](https://github.com/Lauritz-Tieste) in [#&#8203;26441](immich-app/immich#26441)
- feat: warn when losing transparency during thumbnail generation by [@&#8203;midzelis](https://github.com/midzelis) in [#&#8203;26243](immich-app/immich#26243)
- perf(mobile): optimized album sorting by [@&#8203;YarosMallorca](https://github.com/YarosMallorca) in [#&#8203;25179](immich-app/immich#25179)
- feat(mobile): prompt when deleting from trash by [@&#8203;YarosMallorca](https://github.com/YarosMallorca) in [#&#8203;26392](immich-app/immich#26392)
- feat: getAssetEdits respond with edit IDs by [@&#8203;bwees](https://github.com/bwees) in [#&#8203;26445](immich-app/immich#26445)
- fix(server): accept showAt and hideAt for creating memories by [@&#8203;meesfrensel](https://github.com/meesfrensel) in [#&#8203;26429](immich-app/immich#26429)
- feat(server): SyncAssetEditV1 by [@&#8203;bwees](https://github.com/bwees) in [#&#8203;26446](immich-app/immich#26446)
- feat: splash screen error page by [@&#8203;shenlong-tanwen](https://github.com/shenlong-tanwen) in [#&#8203;26460](immich-app/immich#26460)
- feat(mobile): add confirmation dialog to permanent delete action by [@&#8203;ByteSizedMarius](https://github.com/ByteSizedMarius) in [#&#8203;26442](immich-app/immich#26442)
- feat: enhance face-editor positioning by [@&#8203;midzelis](https://github.com/midzelis) in [#&#8203;26303](immich-app/immich#26303)
- feat: improve HEIC, HEIF and JPEG XL browser support detection by [@&#8203;nicosemp](https://github.com/nicosemp) in [#&#8203;26122](immich-app/immich#26122)
- refactor(web): remove replaceAsset action by [@&#8203;timonrieger](https://github.com/timonrieger) in [#&#8203;26444](immich-app/immich#26444)
- feat(web): bounding box for faces when hovering over the face in photo view by [@&#8203;cratoo](https://github.com/cratoo) in [#&#8203;26667](immich-app/immich#26667)
- feat(mobile): keep search results visible by [@&#8203;uhthomas](https://github.com/uhthomas) in [#&#8203;26498](immich-app/immich#26498)
- feat(mobile): use shared native client by [@&#8203;mertalev](https://github.com/mertalev) in [#&#8203;25942](immich-app/immich#25942)
- feat(mobile): SyncAssetEditV1 by [@&#8203;bwees](https://github.com/bwees) in [#&#8203;26518](immich-app/immich#26518)
- feat(ml): enable openvino for cpu by [@&#8203;apejcic](https://github.com/apejcic) in [#&#8203;22948](immich-app/immich#22948)
- feat: responsive video duration in thumbnail by [@&#8203;midzelis](https://github.com/midzelis) in [#&#8203;26770](immich-app/immich#26770)
- feat(web): animate zoom toggle with cubicOut easing by [@&#8203;midzelis](https://github.com/midzelis) in [#&#8203;26731](immich-app/immich#26731)
- feat(mobile): consolidate video controls by [@&#8203;uhthomas](https://github.com/uhthomas) in [#&#8203;26673](immich-app/immich#26673)
- feat(web): add shortcut "p" to open/close the face tag box by [@&#8203;cratoo](https://github.com/cratoo) in [#&#8203;26826](immich-app/immich#26826)
- feat(mobile): use material design 3 slider by [@&#8203;uhthomas](https://github.com/uhthomas) in [#&#8203;26829](immich-app/immich#26829)
- feat: adaptive progressive image loading for photo viewer by [@&#8203;midzelis](https://github.com/midzelis) in [#&#8203;26636](immich-app/immich#26636)
- fix(server): extract make/model from sony video files by [@&#8203;brendanngo](https://github.com/brendanngo) in [#&#8203;26833](immich-app/immich#26833)
- chore(mobile): remove background from asset viewer back button by [@&#8203;uhthomas](https://github.com/uhthomas) in [#&#8203;26851](immich-app/immich#26851)
- feat(server): support IDPs that only send the userinfo in the ID token by [@&#8203;Belnadifia](https://github.com/Belnadifia) in [#&#8203;26717](immich-app/immich#26717)
- feat(web): improve OCR overlay text fitting, reactivity, and accessibility by [@&#8203;midzelis](https://github.com/midzelis) in [#&#8203;26678](immich-app/immich#26678)
- fix(web): allow pasting PIN code from clipboard or password manager by [@&#8203;pressslav](https://github.com/pressslav) in [#&#8203;26944](immich-app/immich#26944)

##### 🐛 Bug fixes

- fix: ignore checksum constraint error when logging by [@&#8203;jrasm91](https://github.com/jrasm91) in [#&#8203;26113](immich-app/immich#26113)
- fix(web): use locale for date picker by [@&#8203;michelheusschen](https://github.com/michelheusschen) in [#&#8203;26125](immich-app/immich#26125)
- fix(web): escape shortcut handling by [@&#8203;michelheusschen](https://github.com/michelheusschen) in [#&#8203;26096](immich-app/immich#26096)
- fix(mobile): Login routing on Splash screen by [@&#8203;PeterOmbodi](https://github.com/PeterOmbodi) in [#&#8203;26128](immich-app/immich#26128)
- fix: null local date time in timeline queries by [@&#8203;shenlong-tanwen](https://github.com/shenlong-tanwen) in [#&#8203;26133](immich-app/immich#26133)
- fix(web): prevent event manager from throwing error by [@&#8203;michelheusschen](https://github.com/michelheusschen) in [#&#8203;26156](immich-app/immich#26156)
- fix(web): improve api key modal responsiveness by [@&#8203;klenner1](https://github.com/klenner1) in [#&#8203;26151](immich-app/immich#26151)
- fix(web): show correct assets in memory gallery by [@&#8203;michelheusschen](https://github.com/michelheusschen) in [#&#8203;26157](immich-app/immich#26157)
- fix(web): add missing [@&#8203;immich/ui](https://github.com/immich/ui) translations by [@&#8203;michelheusschen](https://github.com/michelheusschen) in [#&#8203;26143](immich-app/immich#26143)
- fix(mobile): timeline handling on foldable phones + ensuring that images are not cut off by [@&#8203;bkchr](https://github.com/bkchr) in [#&#8203;25088](immich-app/immich#25088)
- fix(mobile): prevent nav bar label text wrapping by [@&#8203;chrislongros](https://github.com/chrislongros) in [#&#8203;26011](immich-app/immich#26011)
- fix(mobile): hide latest version warnings by [@&#8203;uhthomas](https://github.com/uhthomas) in [#&#8203;26036](immich-app/immich#26036)
- fix(mobile): inconsistent query for people by [@&#8203;YarosMallorca](https://github.com/YarosMallorca) in [#&#8203;24437](immich-app/immich#24437)
- fix(web): timeline multi select group state by [@&#8203;michelheusschen](https://github.com/michelheusschen) in [#&#8203;26180](immich-app/immich#26180)
- fix(web): add checkerboard background for transparent images by [@&#8203;agent-steven](https://github.com/agent-steven) in [#&#8203;26091](immich-app/immich#26091)
- fix(mobile): inherit toolbar opacity by [@&#8203;uhthomas](https://github.com/uhthomas) in [#&#8203;25694](immich-app/immich#25694)
- fix(web): focus tag input when modal opens by [@&#8203;michelheusschen](https://github.com/michelheusschen) in [#&#8203;26256](immich-app/immich#26256)
- fix(web): clear face boxes when switching assets by [@&#8203;michelheusschen](https://github.com/michelheusschen) in [#&#8203;26249](immich-app/immich#26249)
- fix(web): clear unsaved asset description when changing asset by [@&#8203;michelheusschen](https://github.com/michelheusschen) in [#&#8203;26255](immich-app/immich#26255)
- fix(web): clear cache when asset changes by [@&#8203;michelheusschen](https://github.com/michelheusschen) in [#&#8203;26257](immich-app/immich#26257)
- fix: utc time zone upserts by [@&#8203;danieldietzler](https://github.com/danieldietzler) in [#&#8203;26258](immich-app/immich#26258)
- fix: metadata crash by [@&#8203;jrasm91](https://github.com/jrasm91) in [#&#8203;26327](immich-app/immich#26327)
- fix: prevent server crash when extraction of metadata fails if the assets are corrupted by [@&#8203;Devansh-Jani](https://github.com/Devansh-Jani) in [#&#8203;26042](immich-app/immich#26042)
- fix(server): db restore failure when `DB_URL` is set to unix-domain socket connection by [@&#8203;fabio-garavini](https://github.com/fabio-garavini) in [#&#8203;26252](immich-app/immich#26252)
- fix: Download the edited version when downloading multiple photos by [@&#8203;MontejoJorge](https://github.com/MontejoJorge) in [#&#8203;26259](immich-app/immich#26259)
- fix: include `DROP INDEX` in transaction to prevent missing index on rollback by [@&#8203;haoxi911](https://github.com/haoxi911) in [#&#8203;25399](immich-app/immich#25399)
- fix: safari address bar color by [@&#8203;jrasm91](https://github.com/jrasm91) in [#&#8203;26346](immich-app/immich#26346)
- fix(web): prevent panorama image reload during asset updates by [@&#8203;michelheusschen](https://github.com/michelheusschen) in [#&#8203;26349](immich-app/immich#26349)
- fix(web): favoriting assets opened via GalleryViewer by [@&#8203;michelheusschen](https://github.com/michelheusschen) in [#&#8203;26350](immich-app/immich#26350)
- fix(i18n): add translation key for partner's photos by [@&#8203;timonrieger](https://github.com/timonrieger) in [#&#8203;26348](immich-app/immich#26348)
- fix(web): single select scroll behavior by [@&#8203;timonrieger](https://github.com/timonrieger) in [#&#8203;26358](immich-app/immich#26358)
- perf: add indexes to improve People API response times by [@&#8203;bxtdvd](https://github.com/bxtdvd) in [#&#8203;26337](immich-app/immich#26337)
- fix: pin code reset modal by [@&#8203;jrasm91](https://github.com/jrasm91) in [#&#8203;26370](immich-app/immich#26370)
- fix(mobile): Reset "People" search filter chip if no selections are made by [@&#8203;benjamonnguyen](https://github.com/benjamonnguyen) in [#&#8203;26267](immich-app/immich#26267)
- fix(cli): delete sidecar files after upload if requested by [@&#8203;timonrieger](https://github.com/timonrieger) in [#&#8203;26353](immich-app/immich#26353)
- fix(web): album description auto height by [@&#8203;michelheusschen](https://github.com/michelheusschen) in [#&#8203;26420](immich-app/immich#26420)
- fix(web): prevent side panel overlap during transition by [@&#8203;michelheusschen](https://github.com/michelheusschen) in [#&#8203;26398](immich-app/immich#26398)
- fix(web): storage template example by [@&#8203;mmomjian](https://github.com/mmomjian) in [#&#8203;26424](immich-app/immich#26424)
- fix(web): prevent `state_unsafe_mutation` error on people page by [@&#8203;michelheusschen](https://github.com/michelheusschen) in [#&#8203;26438](immich-app/immich#26438)
- fix: missing deletedAt and isVisible columns on mobile by [@&#8203;bwees](https://github.com/bwees) in [#&#8203;26414](immich-app/immich#26414)
- fix(mobile): joinLocal on archived timeline by [@&#8203;YarosMallorca](https://github.com/YarosMallorca) in [#&#8203;26387](immich-app/immich#26387)
- fix: always show library scan button by [@&#8203;etnoy](https://github.com/etnoy) in [#&#8203;26428](immich-app/immich#26428)
- fix: retain asset when either asset is a favorite by [@&#8203;shenlong-tanwen](https://github.com/shenlong-tanwen) in [#&#8203;26473](immich-app/immich#26473)
- fix(web): prevent null folder tree on concurrent load by [@&#8203;michelheusschen](https://github.com/michelheusschen) in [#&#8203;26489](immich-app/immich#26489)
- fix(web): toast warning when trying to upload unsupported file type by [@&#8203;meesfrensel](https://github.com/meesfrensel) in [#&#8203;26492](immich-app/immich#26492)
- fix(mobile): birthday picker shows limited months when no date exists by [@&#8203;socksprox](https://github.com/socksprox) in [#&#8203;26407](immich-app/immich#26407)
- fix: consider DAR when extracting video dimension by [@&#8203;alextran1502](https://github.com/alextran1502) in [#&#8203;25293](immich-app/immich#25293)
- feat(mobile): Prevent premature image cache eviction when higher image loading is enabled by [@&#8203;LeLunZ](https://github.com/LeLunZ) in [#&#8203;26208](immich-app/immich#26208)
- refactor: star rating by [@&#8203;meesfrensel](https://github.com/meesfrensel) in [#&#8203;26357](immich-app/immich#26357)
- fix(mobile): set correct initial system-ui mode in asset viewer by [@&#8203;goalie2002](https://github.com/goalie2002) in [#&#8203;26500](immich-app/immich#26500)
- fix(server): Live Photo migration bug when album is in template by [@&#8203;NikhilAlapati](https://github.com/NikhilAlapati) in [#&#8203;25329](immich-app/immich#25329)
- fix(web): handle delete shortcut on shared link page as remove by [@&#8203;meesfrensel](https://github.com/meesfrensel) in [#&#8203;26552](immich-app/immich#26552)
- fix(mobile): prevent video player from being recreated unnecessarily by [@&#8203;uhthomas](https://github.com/uhthomas) in [#&#8203;26553](immich-app/immich#26553)
- fix(mobile): don't cut off top corners of app bar by [@&#8203;uhthomas](https://github.com/uhthomas) in [#&#8203;26550](immich-app/immich#26550)
- feat: update onnxruntime-openvino to 1.24.1 and intel drivers by [@&#8203;savely-krasovsky](https://github.com/savely-krasovsky) in [#&#8203;26565](immich-app/immich#26565)
- fix: hide download action for local/merged assets by [@&#8203;YarosMallorca](https://github.com/YarosMallorca) in [#&#8203;26461](immich-app/immich#26461)
- fix(web): top bar z index on search page by [@&#8203;YarosMallorca](https://github.com/YarosMallorca) in [#&#8203;26582](immich-app/immich#26582)
- fix(web): show shared link download button when logged in by [@&#8203;Snowknight26](https://github.com/Snowknight26) in [#&#8203;26629](immich-app/immich#26629)
- fix(mobile): asset viewer hero animation by [@&#8203;uhthomas](https://github.com/uhthomas) in [#&#8203;26545](immich-app/immich#26545)
- fix(web): timeline and asset viewer RTL support by [@&#8203;meesfrensel](https://github.com/meesfrensel) in [#&#8203;26513](immich-app/immich#26513)
- fix(server): clean up edited thumbnail when deleting asset by [@&#8203;michelheusschen](https://github.com/michelheusschen) in [#&#8203;26664](immich-app/immich#26664)
- fix: implement existing withStacked on searchAssetBuilder by [@&#8203;babbitt](https://github.com/babbitt) in [#&#8203;26607](immich-app/immich#26607)
- fix(mobile): video state by [@&#8203;uhthomas](https://github.com/uhthomas) in [#&#8203;26574](immich-app/immich#26574)
- fix(maintenance mode): wait for valid server config on restart by [@&#8203;insertish](https://github.com/insertish) in [#&#8203;26456](immich-app/immich#26456)
- fix(web): inconsistent asset nav bar state after visiting shared link by [@&#8203;Snowknight26](https://github.com/Snowknight26) in [#&#8203;26674](immich-app/immich#26674)
- fix(web): download toast showing wrong filename for motion assets by [@&#8203;Snowknight26](https://github.com/Snowknight26) in [#&#8203;26689](immich-app/immich#26689)
- fix(mobile): add safe area for asset details by [@&#8203;uhthomas](https://github.com/uhthomas) in [#&#8203;26675](immich-app/immich#26675)
- fix(web): combobox dropdown positioning in modals by [@&#8203;michelheusschen](https://github.com/michelheusschen) in [#&#8203;26707](immich-app/immich#26707)
- fix(web): video stealing focus when it plays again when looping by [@&#8203;Snowknight26](https://github.com/Snowknight26) in [#&#8203;26704](immich-app/immich#26704)
- fix(ml): batch size setting by [@&#8203;mertalev](https://github.com/mertalev) in [#&#8203;26524](immich-app/immich#26524)
- fix(server): clarify transcoding bitrate policy by [@&#8203;meesfrensel](https://github.com/meesfrensel) in [#&#8203;26711](immich-app/immich#26711)
- fix: playback style migration by [@&#8203;alextran1502](https://github.com/alextran1502) in [#&#8203;26718](immich-app/immich#26718)
- fix(web): asset viewer showing wrong viewer type when hovering on stack thumbnails by [@&#8203;Snowknight26](https://github.com/Snowknight26) in [#&#8203;26741](immich-app/immich#26741)
- fix(server): opus handling as accepted audio codec in transcode policy by [@&#8203;skatsubo](https://github.com/skatsubo) in [#&#8203;26736](immich-app/immich#26736)
- fix(web): refresh recent albums sidebar after album changes by [@&#8203;michelheusschen](https://github.com/michelheusschen) in [#&#8203;26757](immich-app/immich#26757)
- fix(web): show the correct cursor at crop bounds when editing an asset by [@&#8203;Snowknight26](https://github.com/Snowknight26) in [#&#8203;26748](immich-app/immich#26748)
- fix(web): recalculate face bounding boxes by [@&#8203;cratoo](https://github.com/cratoo) in [#&#8203;26737](immich-app/immich#26737)
- fix(web): context menu overflow by [@&#8203;SevereCloud](https://github.com/SevereCloud) in [#&#8203;26760](immich-app/immich#26760)
- fix(web): correct tag rounding in search options by [@&#8203;michelheusschen](https://github.com/michelheusschen) in [#&#8203;26814](immich-app/immich#26814)
- fix(web): prevent unrelated assets from appearing in tag view by [@&#8203;michelheusschen](https://github.com/michelheusschen) in [#&#8203;26816](immich-app/immich#26816)
- fix(mobile): use tabular figures in backup page by [@&#8203;uhthomas](https://github.com/uhthomas) in [#&#8203;26830](immich-app/immich#26830)
- fix(mobile): wrap backup error message text by [@&#8203;uhthomas](https://github.com/uhthomas) in [#&#8203;26834](immich-app/immich#26834)
- fix(server): use correct day ordering in timeline buckets by [@&#8203;michelheusschen](https://github.com/michelheusschen) in [#&#8203;26821](immich-app/immich#26821)
- fix(web): face selection box position resetting on browser resize by [@&#8203;Snowknight26](https://github.com/Snowknight26) in [#&#8203;26766](immich-app/immich#26766)
- fix: use correct original URL for 360 video panorama playback by [@&#8203;luis15pt](https://github.com/luis15pt) in [#&#8203;26831](immich-app/immich#26831)
- fix(web): disable drag and drop for internal items by [@&#8203;michelheusschen](https://github.com/michelheusschen) in [#&#8203;26897](immich-app/immich#26897)
- fix(web): keep header fixed on individual shared links by [@&#8203;michelheusschen](https://github.com/michelheusschen) in [#&#8203;26892](immich-app/immich#26892)
- fix: SMTP over TLS by [@&#8203;nathanielhourt](https://github.com/nathanielhourt) in [#&#8203;26893](immich-app/immich#26893)
- fix(web): copy yearMonth in MonthGroup to avoid shared object reference with asset in [#&#8203;26890](immich-app/immich#26890)
- fix(mobile): use shared auth for background\_downloader by [@&#8203;mertalev](https://github.com/mertalev) in [#&#8203;26911](immich-app/immich#26911)
- fix(web): prevent search page error on missing album filter by [@&#8203;michelheusschen](https://github.com/michelheusschen) in [#&#8203;26948](immich-app/immich#26948)
- fix(server): sync files to disk by [@&#8203;uhthomas](https://github.com/uhthomas) in [#&#8203;26881](immich-app/immich#26881)
- fix(web): jump to primary stacked asset from memory by [@&#8203;michelheusschen](https://github.com/michelheusschen) in [#&#8203;26978](immich-app/immich#26978)
- fix(mobile): reflect asset deletions instantly by [@&#8203;uhthomas](https://github.com/uhthomas) in [#&#8203;26835](immich-app/immich#26835)
- fix: healthcheck by [@&#8203;jrasm91](https://github.com/jrasm91) in [#&#8203;26989](immich-app/immich#26989)
- fix(web): escape handling for tagging and adding a face in asset viewer by [@&#8203;cratoo](https://github.com/cratoo) in [#&#8203;26870](immich-app/immich#26870)
- fix: filter after searching by asset id by [@&#8203;jrasm91](https://github.com/jrasm91) in [#&#8203;26994](immich-app/immich#26994)
- fix: bounding box return type by [@&#8203;jrasm91](https://github.com/jrasm91) in [#&#8203;27014](immich-app/immich#27014)
- fix: validate accept header before returning html by [@&#8203;jrasm91](https://github.com/jrasm91) in [#&#8203;27019](immich-app/immich#27019)

##### 📚 Documentation

- chore(docs): Update help channel for developers by [@&#8203;Mraedis](https://github.com/Mraedis) in [#&#8203;26284](immich-app/immich#26284)
- feat(docs): Explain configuration file location for Docker Compose by [@&#8203;keunes](https://github.com/keunes) in [#&#8203;24989](immich-app/immich#24989)
- chore(docs): add quick-start guide for DevPod with docker by [@&#8203;dhlavaty](https://github.com/dhlavaty) in [#&#8203;26213](immich-app/immich#26213)
- feat(docs): Adding information about parameter c= by [@&#8203;aviv926](https://github.com/aviv926) in [#&#8203;26430](https://github.com/immich-app/immich/pull/26430)
- feat: doc links by [@&#8203;jrasm91](https://github.com/jrasm91) in [#&#8203;26519](https://github.com/immich-app/immich/pull/26519)
- fix(docs): add ocr to job flow diagram by [@&#8203;niij](https://github.com/niij) in [#&#8203;26505](https://github.com/immich-app/immich/pull/26505)

##### 🌐 Translations

- chore(web): update translations by [@&#8203;weblate](https://github.com/weblate) in [#&#8203;26118](https://github.com/immich-app/immich/pull/26118)
- fix: clarify external domain setting is used for emails too by [@&#8203;chrislongros](https://github.com/chrislongros) in [#&#8203;26009](https://github.com/immich-app/immich/pull/26009)
- chore(web): update translations by [@&#8203;weblate](https://github.com/weblate) in [#&#8203;26167](https://github.com/immich-app/immich/pull/26167)
- fix(web): error page i18n by [@&#8203;meesfrensel](https://github.com/meesfrensel) in [#&#8203;26517](https://github.com/immich-app/immich/pull/26517)
- chore(web): clarify locale settings description by [@&#8203;meesfrensel](https://github.com/meesfrensel) in [#&#8203;25562](https://github.com/immich-app/immich/pull/25562)
- chore(web): update translations by [@&#8203;weblate](https://github.com/weblate) in [#&#8203;26192](https://github.com/immich-app/immich/pull/26192)

#### New Contributors

- [@&#8203;klenner1](https://github.com/klenner1) made their first contribution in [#&#8203;26151](immich-app/immich#26151)
- [@&#8203;bkchr](https://github.com/bkchr) made their first contribution in [#&#8203;25088](immich-app/immich#25088)
- [@&#8203;chrislongros](https://github.com/chrislongros) made their first contribution in [#&#8203;26011](immich-app/immich#26011)
- [@&#8203;agent-steven](https://github.com/agent-steven) made their first contribution in [#&#8203;26091](immich-app/immich#26091)
- [@&#8203;dhlavaty](https://github.com/dhlavaty) made their first contribution in [#&#8203;26238](https://github.com/immich-app/immich/pull/26238)
- [@&#8203;Nacolis](https://github.com/Nacolis) made their first contribution in [#&#8203;26063](immich-app/immich#26063)
- [@&#8203;ewinnd](https://github.com/ewinnd) made their first contribution in [#&#8203;26277](https://github.com/immich-app/immich/pull/26277)
- [@&#8203;dnozay](https://github.com/dnozay) made their first contribution in [#&#8203;26261](immich-app/immich#26261)
- [@&#8203;keunes](https://github.com/keunes) made their first contribution in [#&#8203;24989](immich-app/immich#24989)
- [@&#8203;Devansh-Jani](https://github.com/Devansh-Jani) made their first contribution in [#&#8203;26042](immich-app/immich#26042)
- [@&#8203;benjamonnguyen](https://github.com/benjamonnguyen) made their first contribution in [#&#8203;26196](immich-app/immich#26196)
- [@&#8203;fabio-garavini](https://github.com/fabio-garavini) made their first contribution in [#&#8203;26252](immich-app/immich#26252)
- [@&#8203;haoxi911](https://github.com/haoxi911) made their first contribution in [#&#8203;25399](immich-app/immich#25399)
- [@&#8203;thezeroalpha](https://github.com/thezeroalpha) made their first contribution in [#&#8203;20286](immich-app/immich#20286)
- [@&#8203;socksprox](https://github.com/socksprox) made their first contribution in [#&#8203;26407](immich-app/immich#26407)
- [@&#8203;kprinssu](https://github.com/kprinssu) made their first contribution in [#&#8203;26178](immich-app/immich#26178)
- [@&#8203;babbitt](https://github.com/babbitt) made their first contribution in [#&#8203;26607](immich-app/immich#26607)
- [@&#8203;niij](https://github.com/niij) made their first contribution in [#&#8203;26505](https://github.com/immich-app/immich/pull/26505)
- [@&#8203;cratoo](https://github.com/cratoo) made their first contribution in [#&#8203;26667](immich-app/immich#26667)
- [@&#8203;M123-dev](https://github.com/M123-dev) made their first contribution in [#&#8203;26630](https://github.com/immich-app/immich/pull/26630)
- [@&#8203;apejcic](https://github.com/apejcic) made their first contribution in [#&#8203;22948](immich-app/immich#22948)
- [@&#8203;SevereCloud](https://github.com/SevereCloud) made their first contribution in [#&#8203;26760](immich-app/immich#26760)
- [@&#8203;brendanngo](https://github.com/brendanngo) made their first contribution in [#&#8203;26833](immich-app/immich#26833)
- [@&#8203;luis15pt](https://github.com/luis15pt) made their first contribution in [#&#8203;26831](immich-app/immich#26831)
- [@&#8203;nathanielhourt](https://github.com/nathanielhourt) made their first contribution in [#&#8203;26893](immich-app/immich#26893)
- [@&#8203;Belnadifia](https://github.com/Belnadifia) made their first contribution in [#&#8203;26717](immich-app/immich#26717)
- [@&#8203;pressslav](https://github.com/pressslav) made their first contribution in [#&#8203;26944](immich-app/immich#26944)

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

</details>

---

### Configuration

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

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

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

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

---

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

---

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

Reviewed-on: https://gitea.alexlebens.dev/alexlebens/infrastructure/pulls/4886
Co-authored-by: Renovate Bot <renovate-bot@alexlebens.net>
Co-committed-by: Renovate Bot <renovate-bot@alexlebens.net>
alexlebens pushed a commit to alexlebens/infrastructure that referenced this pull request Mar 20, 2026
….6.1 (#4887)

This PR contains the following updates:

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

---

> ⚠️ **Warning**
>
> Some dependencies could not be looked up. Check the [Dependency Dashboard](issues/2) for more information.

---

### Release Notes

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

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

[Compare Source](immich-app/immich@v2.6.0...v2.6.1)

### v2.6.1

#### Hot fixes

- Fixed a failed migration issue on the mobile app when the URL Switching feature is used

#### What's Changed

##### 🐛 Bug fixes

- fix(server): fallback to email when name is empty by [@&#8203;jrasm91](https://github.com/jrasm91) in [#&#8203;27016](immich-app/immich#27016)
- fix: ignore errors deleting untitled album by [@&#8203;jrasm91](https://github.com/jrasm91) in [#&#8203;27020](immich-app/immich#27020)
- fix(web): wrap long album title by [@&#8203;jrasm91](https://github.com/jrasm91) in [#&#8203;27012](immich-app/immich#27012)
- fix(web): stop in-progress uploads on logout by [@&#8203;jrasm91](https://github.com/jrasm91) in [#&#8203;27021](immich-app/immich#27021)
- fix: writing empty exif tags by [@&#8203;danieldietzler](https://github.com/danieldietzler) in [#&#8203;27025](immich-app/immich#27025)
- fix(web): disable send button by [@&#8203;jrasm91](https://github.com/jrasm91) in [#&#8203;27051](immich-app/immich#27051)
- fix(mobile): server url migration by [@&#8203;mertalev](https://github.com/mertalev) in [#&#8203;27050](immich-app/immich#27050)

**Full Changelog**: <immich-app/immich@v2.6.0...v2.6.1>

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

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

### v2.6.0

Welcome to Immich `v2.6.0`, This release is a collection of more than *350 commits over 6 weeks*. I know, it is an eternity between releases compared to our previous era. This version focuses on bug fixes and enhancements across the app to provide a more delightful and smoother experience to you. This release also prepares for the next major release in the coming month, which will remove the old timeline implementation. Let's dive into the highlights of the release:

> \[!WARNING]
> For those who are still using the old timeline, please switch to the new timeline to avoid interruption, as the old timeline will be removed in the next release.
>
> ps: The old timeline has an exclamation icon next to the logo. <img width="525" height="120" alt="image" src="https://github.com/user-attachments/assets/ed36ea22-b16e-472f-961c-c19501712ba5" />

### Highlights

- Map side panel (web)
- Pick album cover (mobile)
- Shared link slugs (mobile)
- Shared link presets (web)
- Native HTTP clients (mobile)
- Video player and asset viewer improvements (mobile)
- Improved search results (mobile)
- `schema-check`: a new `immich-admin` command
- Read profile claims from ID token (OAuth)
- Notable fix: cast videos now automatically loop
- Notable fix: correctly extract make and model from Sony XAVC video files
- Notable fix: escape key handling on web
- Notable fix: healthcheck endpoint in maintenance mode
- Notable fix: timeline rendering for RTL languages like Arabic and Hebrew
- Notable fix: prevent server crash when extracting invalid metadata

#### Map side panel (web)

The map view on the web now opens a mini-timeline component as a side panel when you click on a cluster of assets. This makes it easier to view the cluster at a glance and enables bulk actions, such as adding to favorites and adding to an album.

<img width="800" alt="image" src="https://github.com/user-attachments/assets/6f90b04d-4aa7-4f68-b59c-c2b912e638f7" />

#### Pick album cover (mobile)

Users can now pick a new album cover directly from the mobile app.

<https://github.com/user-attachments/assets/7f99dc80-21c6-4ce6-9f75-8e6b0163dcaa>

#### Shared link slugs (mobile)

The mobile app now also supports setting a shared link slug, a feature that's been available on the web for a while.

<https://github.com/user-attachments/assets/5420995a-cfd4-471d-a3ac-db4fa45de780>

#### Shared link presets (web)

The expiration form input on the web was always a bit confusing, but it's been updated to make it easier to see and understand when a shared link will expire.

<img width="400" alt="image" src="https://github.com/user-attachments/assets/9d6124a9-eec2-43e8-b228-e1ac6c0415e8" />

#### Native HTTP clients (mobile)

The mobile app now uses native HTTP clients across both Android and iOS, with support for mTLS, self-signed certificates, basic auth, and custom headers. These features should now be more reliable and extend to background tasks, video playback, and other parts of the app. This also improves the app's overall network request performance thanks to HTTP/2 and HTTP/3, multiplexing, and caching.

#### Video player and asset viewer improvements (mobile)

The asset viewer has undergone many improvements under the hood to make it simpler, faster and more reliable. We've also added playback support for GIFs, enabled video zooming, and made many more bug fixes and tweaks.

##### The asset viewer now uses a gradient for actions, and video controls have been restyled

<img width="300" alt="image" src="https://github.com/user-attachments/assets/9a4e0892-f178-45fc-812c-10a6cba3f48b" />

##### Inline asset details

This used to be a bottom sheet and had a lot of glue for alignment. The new version is much more responsive and less buggy.

##### Before

<https://github.com/user-attachments/assets/43b59b59-7d6a-48d0-94d7-84b8cae1c2a9>

##### After

<https://github.com/user-attachments/assets/9217b6f4-1c92-40b0-bd95-a0681307cf38>

#### Improved search results (mobile)

The search results page now loads more results without rebuilding the entire grid, and should now load much faster. There are also new screens for when there are no search results and when all results have been loaded.

<https://github.com/user-attachments/assets/42ce69d4-1618-48ee-9cb9-91ec22e12b27>

#### `schema-check`: a new `immich-admin` command

A new `immich-admin` command has been added in this release: `schema-check`. The command runs a report on the database to check if any indexes, constraints, tables, or columns are missing. This check also runs automatically on startup.

#### Read profile claims from `idToken` (OAuth)

Prior to `v2.6.0`, Immich resolved the `email` and other claims from the [userinfo](https://openid.net/specs/openid-connect-core-1_0.html#UserInfo) endpoint. Now, Immich also supports reading those claims directly from the `idToken`. This makes it possible to use providers such as Microsoft ADFS that do not support the userinfo endpoint.

***

As always, there are many more QoL improvements, bug fixes, and enhancements in this release. Please find the full release note below

#### 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 v2.6.0 -->

#### What's Changed

##### 🔒 Security

- fix(server): restrict individual shared link asset removal to owners by [@&#8203;michelheusschen](https://github.com/michelheusschen) in [#&#8203;26868](immich-app/immich#26868)
- fix: add to shared link by [@&#8203;jrasm91](https://github.com/jrasm91) in [#&#8203;26886](immich-app/immich#26886)

##### 🚀 Features

- feat: shared link login by [@&#8203;jrasm91](https://github.com/jrasm91) in [#&#8203;25678](immich-app/immich#25678)
- feat: schema-check by [@&#8203;jrasm91](https://github.com/jrasm91) in [#&#8203;25904](immich-app/immich#25904)
- feat: add people deeplink by [@&#8203;arne182](https://github.com/arne182) in [#&#8203;25686](immich-app/immich#25686)
- feat(mobile): inline asset details by [@&#8203;uhthomas](https://github.com/uhthomas) in [#&#8203;25952](immich-app/immich#25952)
- feat(mobile): filter by tags by [@&#8203;benjamonnguyen](https://github.com/benjamonnguyen) in [#&#8203;26196](immich-app/immich#26196)
- feat: add .mxf file support by [@&#8203;timonrieger](https://github.com/timonrieger) in [#&#8203;24644](immich-app/immich#24644)
- feat: tap to see next/previous image by [@&#8203;thezeroalpha](https://github.com/thezeroalpha) in [#&#8203;20286](immich-app/immich#20286)
- feat(mobile): Allow users to set album cover from mobile app by [@&#8203;timonrieger](https://github.com/timonrieger) in [#&#8203;25515](immich-app/immich#25515)
- feat(mobile): Allow users to set profile picture from asset viewer by [@&#8203;timonrieger](https://github.com/timonrieger) in [#&#8203;25517](immich-app/immich#25517)
- feat: ROCm 7.2 and MIGraphX support  by [@&#8203;kprinssu](https://github.com/kprinssu) in [#&#8203;26178](immich-app/immich#26178)
- feat(web): map timeline sidepanel by [@&#8203;michelheusschen](https://github.com/michelheusschen) in [#&#8203;26532](immich-app/immich#26532)
- feat: add responsive layout to broken asset by [@&#8203;midzelis](https://github.com/midzelis) in [#&#8203;26384](immich-app/immich#26384)
- feat(web): toggle zoom on double-click in photo viewer by [@&#8203;midzelis](https://github.com/midzelis) in [#&#8203;26732](immich-app/immich#26732)
- feat(mobile): show animated images in asset viewer by [@&#8203;LeLunZ](https://github.com/LeLunZ) in [#&#8203;26614](immich-app/immich#26614)
- feat(mobile): open in browser by [@&#8203;YarosMallorca](https://github.com/YarosMallorca) in [#&#8203;26369](immich-app/immich#26369)

##### 🌟 Enhancements

- feat: verify permissions by [@&#8203;jrasm91](https://github.com/jrasm91) in [#&#8203;25647](immich-app/immich#25647)
- feat(web): change link expiration logic & presets  by [@&#8203;YarosMallorca](https://github.com/YarosMallorca) in [#&#8203;26064](immich-app/immich#26064)
- feat(mobile): dynamic layout in new timeline by [@&#8203;shenlong-tanwen](https://github.com/shenlong-tanwen) in [#&#8203;23837](immich-app/immich#23837)
- feat(cli): change progress bar to display file size by [@&#8203;Nykri](https://github.com/Nykri) in [#&#8203;23328](immich-app/immich#23328)
- feat(mobile): dynamic multi-line album name by [@&#8203;uhthomas](https://github.com/uhthomas) in [#&#8203;26040](immich-app/immich#26040)
- feat(mobile): hide search by context/OCR if disabled on server ([#&#8203;25472](immich-app/immich#25472)) by [@&#8203;Nacolis](https://github.com/Nacolis) in [#&#8203;26063](immich-app/immich#26063)
- fix(release): add docker-compose.rootless.yml to released assets by [@&#8203;dnozay](https://github.com/dnozay) in [#&#8203;26261](immich-app/immich#26261)
- feat(web): show ocr text boxes in panoramas by [@&#8203;meesfrensel](https://github.com/meesfrensel) in [#&#8203;25727](immich-app/immich#25727)
- feat(web): loop chromecast video by [@&#8203;etnoy](https://github.com/etnoy) in [#&#8203;24410](immich-app/immich#24410)
- chore(web): merge "Add to album" and "Add to shared album" actions into a single action by [@&#8203;timonrieger](https://github.com/timonrieger) in [#&#8203;24669](immich-app/immich#24669)
- feat(mobile): timeline - add bottomWidgetBuilder  by [@&#8203;PeterOmbodi](https://github.com/PeterOmbodi) in [#&#8203;25634](immich-app/immich#25634)
- feat(mobile): video zooming in asset viewer by [@&#8203;goalie2002](https://github.com/goalie2002) in [#&#8203;22036](immich-app/immich#22036)
- feat(mobile): Add slug support for shared links by [@&#8203;Lauritz-Tieste](https://github.com/Lauritz-Tieste) in [#&#8203;26441](immich-app/immich#26441)
- feat: warn when losing transparency during thumbnail generation by [@&#8203;midzelis](https://github.com/midzelis) in [#&#8203;26243](immich-app/immich#26243)
- perf(mobile): optimized album sorting by [@&#8203;YarosMallorca](https://github.com/YarosMallorca) in [#&#8203;25179](immich-app/immich#25179)
- feat(mobile): prompt when deleting from trash by [@&#8203;YarosMallorca](https://github.com/YarosMallorca) in [#&#8203;26392](immich-app/immich#26392)
- feat: getAssetEdits respond with edit IDs by [@&#8203;bwees](https://github.com/bwees) in [#&#8203;26445](immich-app/immich#26445)
- fix(server): accept showAt and hideAt for creating memories by [@&#8203;meesfrensel](https://github.com/meesfrensel) in [#&#8203;26429](immich-app/immich#26429)
- feat(server): SyncAssetEditV1 by [@&#8203;bwees](https://github.com/bwees) in [#&#8203;26446](immich-app/immich#26446)
- feat: splash screen error page by [@&#8203;shenlong-tanwen](https://github.com/shenlong-tanwen) in [#&#8203;26460](immich-app/immich#26460)
- feat(mobile): add confirmation dialog to permanent delete action by [@&#8203;ByteSizedMarius](https://github.com/ByteSizedMarius) in [#&#8203;26442](immich-app/immich#26442)
- feat: enhance face-editor positioning by [@&#8203;midzelis](https://github.com/midzelis) in [#&#8203;26303](immich-app/immich#26303)
- feat: improve HEIC, HEIF and JPEG XL browser support detection by [@&#8203;nicosemp](https://github.com/nicosemp) in [#&#8203;26122](immich-app/immich#26122)
- refactor(web): remove replaceAsset action by [@&#8203;timonrieger](https://github.com/timonrieger) in [#&#8203;26444](immich-app/immich#26444)
- feat(web): bounding box for faces when hovering over the face in photo view by [@&#8203;cratoo](https://github.com/cratoo) in [#&#8203;26667](immich-app/immich#26667)
- feat(mobile): keep search results visible by [@&#8203;uhthomas](https://github.com/uhthomas) in [#&#8203;26498](immich-app/immich#26498)
- feat(mobile): use shared native client by [@&#8203;mertalev](https://github.com/mertalev) in [#&#8203;25942](immich-app/immich#25942)
- feat(mobile): SyncAssetEditV1 by [@&#8203;bwees](https://github.com/bwees) in [#&#8203;26518](immich-app/immich#26518)
- feat(ml): enable openvino for cpu by [@&#8203;apejcic](https://github.com/apejcic) in [#&#8203;22948](immich-app/immich#22948)
- feat: responsive video duration in thumbnail by [@&#8203;midzelis](https://github.com/midzelis) in [#&#8203;26770](immich-app/immich#26770)
- feat(web): animate zoom toggle with cubicOut easing by [@&#8203;midzelis](https://github.com/midzelis) in [#&#8203;26731](immich-app/immich#26731)
- feat(mobile): consolidate video controls by [@&#8203;uhthomas](https://github.com/uhthomas) in [#&#8203;26673](immich-app/immich#26673)
- feat(web): add shortcut "p" to open/close the face tag box by [@&#8203;cratoo](https://github.com/cratoo) in [#&#8203;26826](immich-app/immich#26826)
- feat(mobile): use material design 3 slider by [@&#8203;uhthomas](https://github.com/uhthomas) in [#&#8203;26829](immich-app/immich#26829)
- feat: adaptive progressive image loading for photo viewer by [@&#8203;midzelis](https://github.com/midzelis) in [#&#8203;26636](immich-app/immich#26636)
- fix(server): extract make/model from sony video files by [@&#8203;brendanngo](https://github.com/brendanngo) in [#&#8203;26833](immich-app/immich#26833)
- chore(mobile): remove background from asset viewer back button by [@&#8203;uhthomas](https://github.com/uhthomas) in [#&#8203;26851](immich-app/immich#26851)
- feat(server): support IDPs that only send the userinfo in the ID token by [@&#8203;Belnadifia](https://github.com/Belnadifia) in [#&#8203;26717](immich-app/immich#26717)
- feat(web): improve OCR overlay text fitting, reactivity, and accessibility by [@&#8203;midzelis](https://github.com/midzelis) in [#&#8203;26678](immich-app/immich#26678)
- fix(web): allow pasting PIN code from clipboard or password manager by [@&#8203;pressslav](https://github.com/pressslav) in [#&#8203;26944](immich-app/immich#26944)

##### 🐛 Bug fixes

- fix: ignore checksum constraint error when logging by [@&#8203;jrasm91](https://github.com/jrasm91) in [#&#8203;26113](immich-app/immich#26113)
- fix(web): use locale for date picker by [@&#8203;michelheusschen](https://github.com/michelheusschen) in [#&#8203;26125](immich-app/immich#26125)
- fix(web): escape shortcut handling by [@&#8203;michelheusschen](https://github.com/michelheusschen) in [#&#8203;26096](immich-app/immich#26096)
- fix(mobile): Login routing on Splash screen by [@&#8203;PeterOmbodi](https://github.com/PeterOmbodi) in [#&#8203;26128](immich-app/immich#26128)
- fix: null local date time in timeline queries by [@&#8203;shenlong-tanwen](https://github.com/shenlong-tanwen) in [#&#8203;26133](immich-app/immich#26133)
- fix(web): prevent event manager from throwing error by [@&#8203;michelheusschen](https://github.com/michelheusschen) in [#&#8203;26156](immich-app/immich#26156)
- fix(web): improve api key modal responsiveness by [@&#8203;klenner1](https://github.com/klenner1) in [#&#8203;26151](immich-app/immich#26151)
- fix(web): show correct assets in memory gallery by [@&#8203;michelheusschen](https://github.com/michelheusschen) in [#&#8203;26157](immich-app/immich#26157)
- fix(web): add missing [@&#8203;immich/ui](https://github.com/immich/ui) translations by [@&#8203;michelheusschen](https://github.com/michelheusschen) in [#&#8203;26143](immich-app/immich#26143)
- fix(mobile): timeline handling on foldable phones + ensuring that images are not cut off by [@&#8203;bkchr](https://github.com/bkchr) in [#&#8203;25088](immich-app/immich#25088)
- fix(mobile): prevent nav bar label text wrapping by [@&#8203;chrislongros](https://github.com/chrislongros) in [#&#8203;26011](immich-app/immich#26011)
- fix(mobile): hide latest version warnings by [@&#8203;uhthomas](https://github.com/uhthomas) in [#&#8203;26036](immich-app/immich#26036)
- fix(mobile): inconsistent query for people by [@&#8203;YarosMallorca](https://github.com/YarosMallorca) in [#&#8203;24437](immich-app/immich#24437)
- fix(web): timeline multi select group state by [@&#8203;michelheusschen](https://github.com/michelheusschen) in [#&#8203;26180](immich-app/immich#26180)
- fix(web): add checkerboard background for transparent images by [@&#8203;agent-steven](https://github.com/agent-steven) in [#&#8203;26091](immich-app/immich#26091)
- fix(mobile): inherit toolbar opacity by [@&#8203;uhthomas](https://github.com/uhthomas) in [#&#8203;25694](immich-app/immich#25694)
- fix(web): focus tag input when modal opens by [@&#8203;michelheusschen](https://github.com/michelheusschen) in [#&#8203;26256](immich-app/immich#26256)
- fix(web): clear face boxes when switching assets by [@&#8203;michelheusschen](https://github.com/michelheusschen) in [#&#8203;26249](immich-app/immich#26249)
- fix(web): clear unsaved asset description when changing asset by [@&#8203;michelheusschen](https://github.com/michelheusschen) in [#&#8203;26255](immich-app/immich#26255)
- fix(web): clear cache when asset changes by [@&#8203;michelheusschen](https://github.com/michelheusschen) in [#&#8203;26257](immich-app/immich#26257)
- fix: utc time zone upserts by [@&#8203;danieldietzler](https://github.com/danieldietzler) in [#&#8203;26258](immich-app/immich#26258)
- fix: metadata crash by [@&#8203;jrasm91](https://github.com/jrasm91) in [#&#8203;26327](immich-app/immich#26327)
- fix: prevent server crash when extraction of metadata fails if the assets are corrupted by [@&#8203;Devansh-Jani](https://github.com/Devansh-Jani) in [#&#8203;26042](immich-app/immich#26042)
- fix(server): db restore failure when `DB_URL` is set to unix-domain socket connection by [@&#8203;fabio-garavini](https://github.com/fabio-garavini) in [#&#8203;26252](immich-app/immich#26252)
- fix: Download the edited version when downloading multiple photos by [@&#8203;MontejoJorge](https://github.com/MontejoJorge) in [#&#8203;26259](immich-app/immich#26259)
- fix: include `DROP INDEX` in transaction to prevent missing index on rollback by [@&#8203;haoxi911](https://github.com/haoxi911) in [#&#8203;25399](immich-app/immich#25399)
- fix: safari address bar color by [@&#8203;jrasm91](https://github.com/jrasm91) in [#&#8203;26346](immich-app/immich#26346)
- fix(web): prevent panorama image reload during asset updates by [@&#8203;michelheusschen](https://github.com/michelheusschen) in [#&#8203;26349](immich-app/immich#26349)
- fix(web): favoriting assets opened via GalleryViewer by [@&#8203;michelheusschen](https://github.com/michelheusschen) in [#&#8203;26350](immich-app/immich#26350)
- fix(i18n): add translation key for partner's photos by [@&#8203;timonrieger](https://github.com/timonrieger) in [#&#8203;26348](immich-app/immich#26348)
- fix(web): single select scroll behavior by [@&#8203;timonrieger](https://github.com/timonrieger) in [#&#8203;26358](immich-app/immich#26358)
- perf: add indexes to improve People API response times by [@&#8203;bxtdvd](https://github.com/bxtdvd) in [#&#8203;26337](immich-app/immich#26337)
- fix: pin code reset modal by [@&#8203;jrasm91](https://github.com/jrasm91) in [#&#8203;26370](immich-app/immich#26370)
- fix(mobile): Reset "People" search filter chip if no selections are made by [@&#8203;benjamonnguyen](https://github.com/benjamonnguyen) in [#&#8203;26267](immich-app/immich#26267)
- fix(cli): delete sidecar files after upload if requested by [@&#8203;timonrieger](https://github.com/timonrieger) in [#&#8203;26353](immich-app/immich#26353)
- fix(web): album description auto height by [@&#8203;michelheusschen](https://github.com/michelheusschen) in [#&#8203;26420](immich-app/immich#26420)
- fix(web): prevent side panel overlap during transition by [@&#8203;michelheusschen](https://github.com/michelheusschen) in [#&#8203;26398](immich-app/immich#26398)
- fix(web): storage template example by [@&#8203;mmomjian](https://github.com/mmomjian) in [#&#8203;26424](immich-app/immich#26424)
- fix(web): prevent `state_unsafe_mutation` error on people page by [@&#8203;michelheusschen](https://github.com/michelheusschen) in [#&#8203;26438](immich-app/immich#26438)
- fix: missing deletedAt and isVisible columns on mobile by [@&#8203;bwees](https://github.com/bwees) in [#&#8203;26414](immich-app/immich#26414)
- fix(mobile): joinLocal on archived timeline by [@&#8203;YarosMallorca](https://github.com/YarosMallorca) in [#&#8203;26387](immich-app/immich#26387)
- fix: always show library scan button by [@&#8203;etnoy](https://github.com/etnoy) in [#&#8203;26428](immich-app/immich#26428)
- fix: retain asset when either asset is a favorite by [@&#8203;shenlong-tanwen](https://github.com/shenlong-tanwen) in [#&#8203;26473](immich-app/immich#26473)
- fix(web): prevent null folder tree on concurrent load by [@&#8203;michelheusschen](https://github.com/michelheusschen) in [#&#8203;26489](immich-app/immich#26489)
- fix(web): toast warning when trying to upload unsupported file type by [@&#8203;meesfrensel](https://github.com/meesfrensel) in [#&#8203;26492](immich-app/immich#26492)
- fix(mobile): birthday picker shows limited months when no date exists by [@&#8203;socksprox](https://github.com/socksprox) in [#&#8203;26407](immich-app/immich#26407)
- fix: consider DAR when extracting video dimension by [@&#8203;alextran1502](https://github.com/alextran1502) in [#&#8203;25293](immich-app/immich#25293)
- feat(mobile): Prevent premature image cache eviction when higher image loading is enabled by [@&#8203;LeLunZ](https://github.com/LeLunZ) in [#&#8203;26208](immich-app/immich#26208)
- refactor: star rating by [@&#8203;meesfrensel](https://github.com/meesfrensel) in [#&#8203;26357](immich-app/immich#26357)
- fix(mobile): set correct initial system-ui mode in asset viewer by [@&#8203;goalie2002](https://github.com/goalie2002) in [#&#8203;26500](immich-app/immich#26500)
- fix(server): Live Photo migration bug when album is in template by [@&#8203;NikhilAlapati](https://github.com/NikhilAlapati) in [#&#8203;25329](immich-app/immich#25329)
- fix(web): handle delete shortcut on shared link page as remove by [@&#8203;meesfrensel](https://github.com/meesfrensel) in [#&#8203;26552](immich-app/immich#26552)
- fix(mobile): prevent video player from being recreated unnecessarily by [@&#8203;uhthomas](https://github.com/uhthomas) in [#&#8203;26553](immich-app/immich#26553)
- fix(mobile): don't cut off top corners of app bar by [@&#8203;uhthomas](https://github.com/uhthomas) in [#&#8203;26550](immich-app/immich#26550)
- feat: update onnxruntime-openvino to 1.24.1 and intel drivers by [@&#8203;savely-krasovsky](https://github.com/savely-krasovsky) in [#&#8203;26565](immich-app/immich#26565)
- fix: hide download action for local/merged assets by [@&#8203;YarosMallorca](https://github.com/YarosMallorca) in [#&#8203;26461](immich-app/immich#26461)
- fix(web): top bar z index on search page by [@&#8203;YarosMallorca](https://github.com/YarosMallorca) in [#&#8203;26582](immich-app/immich#26582)
- fix(web): show shared link download button when logged in by [@&#8203;Snowknight26](https://github.com/Snowknight26) in [#&#8203;26629](immich-app/immich#26629)
- fix(mobile): asset viewer hero animation by [@&#8203;uhthomas](https://github.com/uhthomas) in [#&#8203;26545](immich-app/immich#26545)
- fix(web): timeline and asset viewer RTL support by [@&#8203;meesfrensel](https://github.com/meesfrensel) in [#&#8203;26513](immich-app/immich#26513)
- fix(server): clean up edited thumbnail when deleting asset by [@&#8203;michelheusschen](https://github.com/michelheusschen) in [#&#8203;26664](immich-app/immich#26664)
- fix: implement existing withStacked on searchAssetBuilder by [@&#8203;babbitt](https://github.com/babbitt) in [#&#8203;26607](immich-app/immich#26607)
- fix(mobile): video state by [@&#8203;uhthomas](https://github.com/uhthomas) in [#&#8203;26574](immich-app/immich#26574)
- fix(maintenance mode): wait for valid server config on restart by [@&#8203;insertish](https://github.com/insertish) in [#&#8203;26456](immich-app/immich#26456)
- fix(web): inconsistent asset nav bar state after visiting shared link by [@&#8203;Snowknight26](https://github.com/Snowknight26) in [#&#8203;26674](immich-app/immich#26674)
- fix(web): download toast showing wrong filename for motion assets by [@&#8203;Snowknight26](https://github.com/Snowknight26) in [#&#8203;26689](immich-app/immich#26689)
- fix(mobile): add safe area for asset details by [@&#8203;uhthomas](https://github.com/uhthomas) in [#&#8203;26675](immich-app/immich#26675)
- fix(web): combobox dropdown positioning in modals by [@&#8203;michelheusschen](https://github.com/michelheusschen) in [#&#8203;26707](immich-app/immich#26707)
- fix(web): video stealing focus when it plays again when looping by [@&#8203;Snowknight26](https://github.com/Snowknight26) in [#&#8203;26704](immich-app/immich#26704)
- fix(ml): batch size setting by [@&#8203;mertalev](https://github.com/mertalev) in [#&#8203;26524](immich-app/immich#26524)
- fix(server): clarify transcoding bitrate policy by [@&#8203;meesfrensel](https://github.com/meesfrensel) in [#&#8203;26711](immich-app/immich#26711)
- fix: playback style migration by [@&#8203;alextran1502](https://github.com/alextran1502) in [#&#8203;26718](immich-app/immich#26718)
- fix(web): asset viewer showing wrong viewer type when hovering on stack thumbnails by [@&#8203;Snowknight26](https://github.com/Snowknight26) in [#&#8203;26741](immich-app/immich#26741)
- fix(server): opus handling as accepted audio codec in transcode policy by [@&#8203;skatsubo](https://github.com/skatsubo) in [#&#8203;26736](immich-app/immich#26736)
- fix(web): refresh recent albums sidebar after album changes by [@&#8203;michelheusschen](https://github.com/michelheusschen) in [#&#8203;26757](immich-app/immich#26757)
- fix(web): show the correct cursor at crop bounds when editing an asset by [@&#8203;Snowknight26](https://github.com/Snowknight26) in [#&#8203;26748](immich-app/immich#26748)
- fix(web): recalculate face bounding boxes by [@&#8203;cratoo](https://github.com/cratoo) in [#&#8203;26737](immich-app/immich#26737)
- fix(web): context menu overflow by [@&#8203;SevereCloud](https://github.com/SevereCloud) in [#&#8203;26760](immich-app/immich#26760)
- fix(web): correct tag rounding in search options by [@&#8203;michelheusschen](https://github.com/michelheusschen) in [#&#8203;26814](immich-app/immich#26814)
- fix(web): prevent unrelated assets from appearing in tag view by [@&#8203;michelheusschen](https://github.com/michelheusschen) in [#&#8203;26816](immich-app/immich#26816)
- fix(mobile): use tabular figures in backup page by [@&#8203;uhthomas](https://github.com/uhthomas) in [#&#8203;26830](immich-app/immich#26830)
- fix(mobile): wrap backup error message text by [@&#8203;uhthomas](https://github.com/uhthomas) in [#&#8203;26834](immich-app/immich#26834)
- fix(server): use correct day ordering in timeline buckets by [@&#8203;michelheusschen](https://github.com/michelheusschen) in [#&#8203;26821](immich-app/immich#26821)
- fix(web): face selection box position resetting on browser resize by [@&#8203;Snowknight26](https://github.com/Snowknight26) in [#&#8203;26766](immich-app/immich#26766)
- fix: use correct original URL for 360 video panorama playback by [@&#8203;luis15pt](https://github.com/luis15pt) in [#&#8203;26831](immich-app/immich#26831)
- fix(web): disable drag and drop for internal items by [@&#8203;michelheusschen](https://github.com/michelheusschen) in [#&#8203;26897](immich-app/immich#26897)
- fix(web): keep header fixed on individual shared links by [@&#8203;michelheusschen](https://github.com/michelheusschen) in [#&#8203;26892](immich-app/immich#26892)
- fix: SMTP over TLS by [@&#8203;nathanielhourt](https://github.com/nathanielhourt) in [#&#8203;26893](immich-app/immich#26893)
- fix(web): copy yearMonth in MonthGroup to avoid shared object reference with asset in [#&#8203;26890](immich-app/immich#26890)
- fix(mobile): use shared auth for background\_downloader by [@&#8203;mertalev](https://github.com/mertalev) in [#&#8203;26911](immich-app/immich#26911)
- fix(web): prevent search page error on missing album filter by [@&#8203;michelheusschen](https://github.com/michelheusschen) in [#&#8203;26948](immich-app/immich#26948)
- fix(server): sync files to disk by [@&#8203;uhthomas](https://github.com/uhthomas) in [#&#8203;26881](immich-app/immich#26881)
- fix(web): jump to primary stacked asset from memory by [@&#8203;michelheusschen](https://github.com/michelheusschen) in [#&#8203;26978](immich-app/immich#26978)
- fix(mobile): reflect asset deletions instantly by [@&#8203;uhthomas](https://github.com/uhthomas) in [#&#8203;26835](immich-app/immich#26835)
- fix: healthcheck by [@&#8203;jrasm91](https://github.com/jrasm91) in [#&#8203;26989](immich-app/immich#26989)
- fix(web): escape handling for tagging and adding a face in asset viewer by [@&#8203;cratoo](https://github.com/cratoo) in [#&#8203;26870](immich-app/immich#26870)
- fix: filter after searching by asset id by [@&#8203;jrasm91](https://github.com/jrasm91) in [#&#8203;26994](immich-app/immich#26994)
- fix: bounding box return type by [@&#8203;jrasm91](https://github.com/jrasm91) in [#&#8203;27014](immich-app/immich#27014)
- fix: validate accept header before returning html by [@&#8203;jrasm91](https://github.com/jrasm91) in [#&#8203;27019](immich-app/immich#27019)

##### 📚 Documentation

- chore(docs): Update help channel for developers by [@&#8203;Mraedis](https://github.com/Mraedis) in [#&#8203;26284](immich-app/immich#26284)
- feat(docs): Explain configuration file location for Docker Compose by [@&#8203;keunes](https://github.com/keunes) in [#&#8203;24989](immich-app/immich#24989)
- chore(docs): add quick-start guide for DevPod with docker by [@&#8203;dhlavaty](https://github.com/dhlavaty) in [#&#8203;26213](immich-app/immich#26213)
- feat(docs): Adding information about parameter c= by [@&#8203;aviv926](https://github.com/aviv926) in [#&#8203;26430](https://github.com/immich-app/immich/pull/26430)
- feat: doc links by [@&#8203;jrasm91](https://github.com/jrasm91) in [#&#8203;26519](https://github.com/immich-app/immich/pull/26519)
- fix(docs): add ocr to job flow diagram by [@&#8203;niij](https://github.com/niij) in [#&#8203;26505](https://github.com/immich-app/immich/pull/26505)

##### 🌐 Translations

- chore(web): update translations by [@&#8203;weblate](https://github.com/weblate) in [#&#8203;26118](https://github.com/immich-app/immich/pull/26118)
- fix: clarify external domain setting is used for emails too by [@&#8203;chrislongros](https://github.com/chrislongros) in [#&#8203;26009](https://github.com/immich-app/immich/pull/26009)
- chore(web): update translations by [@&#8203;weblate](https://github.com/weblate) in [#&#8203;26167](https://github.com/immich-app/immich/pull/26167)
- fix(web): error page i18n by [@&#8203;meesfrensel](https://github.com/meesfrensel) in [#&#8203;26517](https://github.com/immich-app/immich/pull/26517)
- chore(web): clarify locale settings description by [@&#8203;meesfrensel](https://github.com/meesfrensel) in [#&#8203;25562](https://github.com/immich-app/immich/pull/25562)
- chore(web): update translations by [@&#8203;weblate](https://github.com/weblate) in [#&#8203;26192](https://github.com/immich-app/immich/pull/26192)

#### New Contributors

- [@&#8203;klenner1](https://github.com/klenner1) made their first contribution in [#&#8203;26151](immich-app/immich#26151)
- [@&#8203;bkchr](https://github.com/bkchr) made their first contribution in [#&#8203;25088](immich-app/immich#25088)
- [@&#8203;chrislongros](https://github.com/chrislongros) made their first contribution in [#&#8203;26011](immich-app/immich#26011)
- [@&#8203;agent-steven](https://github.com/agent-steven) made their first contribution in [#&#8203;26091](immich-app/immich#26091)
- [@&#8203;dhlavaty](https://github.com/dhlavaty) made their first contribution in [#&#8203;26238](https://github.com/immich-app/immich/pull/26238)
- [@&#8203;Nacolis](https://github.com/Nacolis) made their first contribution in [#&#8203;26063](immich-app/immich#26063)
- [@&#8203;ewinnd](https://github.com/ewinnd) made their first contribution in [#&#8203;26277](https://github.com/immich-app/immich/pull/26277)
- [@&#8203;dnozay](https://github.com/dnozay) made their first contribution in [#&#8203;26261](immich-app/immich#26261)
- [@&#8203;keunes](https://github.com/keunes) made their first contribution in [#&#8203;24989](immich-app/immich#24989)
- [@&#8203;Devansh-Jani](https://github.com/Devansh-Jani) made their first contribution in [#&#8203;26042](immich-app/immich#26042)
- [@&#8203;benjamonnguyen](https://github.com/benjamonnguyen) made their first contribution in [#&#8203;26196](immich-app/immich#26196)
- [@&#8203;fabio-garavini](https://github.com/fabio-garavini) made their first contribution in [#&#8203;26252](immich-app/immich#26252)
- [@&#8203;haoxi911](https://github.com/haoxi911) made their first contribution in [#&#8203;25399](immich-app/immich#25399)
- [@&#8203;thezeroalpha](https://github.com/thezeroalpha) made their first contribution in [#&#8203;20286](immich-app/immich#20286)
- [@&#8203;socksprox](https://github.com/socksprox) made their first contribution in [#&#8203;26407](immich-app/immich#26407)
- [@&#8203;kprinssu](https://github.com/kprinssu) made their first contribution in [#&#8203;26178](immich-app/immich#26178)
- [@&#8203;babbitt](https://github.com/babbitt) made their first contribution in [#&#8203;26607](immich-app/immich#26607)
- [@&#8203;niij](https://github.com/niij) made their first contribution in [#&#8203;26505](https://github.com/immich-app/immich/pull/26505)
- [@&#8203;cratoo](https://github.com/cratoo) made their first contribution in [#&#8203;26667](immich-app/immich#26667)
- [@&#8203;M123-dev](https://github.com/M123-dev) made their first contribution in [#&#8203;26630](https://github.com/immich-app/immich/pull/26630)
- [@&#8203;apejcic](https://github.com/apejcic) made their first contribution in [#&#8203;22948](immich-app/immich#22948)
- [@&#8203;SevereCloud](https://github.com/SevereCloud) made their first contribution in [#&#8203;26760](immich-app/immich#26760)
- [@&#8203;brendanngo](https://github.com/brendanngo) made their first contribution in [#&#8203;26833](immich-app/immich#26833)
- [@&#8203;luis15pt](https://github.com/luis15pt) made their first contribution in [#&#8203;26831](immich-app/immich#26831)
- [@&#8203;nathanielhourt](https://github.com/nathanielhourt) made their first contribution in [#&#8203;26893](immich-app/immich#26893)
- [@&#8203;Belnadifia](https://github.com/Belnadifia) made their first contribution in [#&#8203;26717](immich-app/immich#26717)
- [@&#8203;pressslav](https://github.com/pressslav) made their first contribution in [#&#8203;26944](immich-app/immich#26944)

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

</details>

---

### Configuration

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

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

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

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

---

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

---

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

Reviewed-on: https://gitea.alexlebens.dev/alexlebens/infrastructure/pulls/4887
Co-authored-by: Renovate Bot <renovate-bot@alexlebens.net>
Co-committed-by: Renovate Bot <renovate-bot@alexlebens.net>
renovate bot added a commit to sdwilsh/ansible-playbooks that referenced this pull request Mar 21, 2026
##### [\`v2.6.1\`](https://github.com/immich-app/immich/releases/tag/v2.6.1)

##### v2.6.1

##### Hot fixes

- Fixed a failed migration issue on the mobile app when the URL Switching feature is used

##### What's Changed

##### 🐛 Bug fixes

- fix(server): fallback to email when name is empty by [@jrasm91](https://github.com/jrasm91) in [#27016](immich-app/immich#27016)
- fix: ignore errors deleting untitled album by [@jrasm91](https://github.com/jrasm91) in [#27020](immich-app/immich#27020)
- fix(web): wrap long album title by [@jrasm91](https://github.com/jrasm91) in [#27012](immich-app/immich#27012)
- fix(web): stop in-progress uploads on logout by [@jrasm91](https://github.com/jrasm91) in [#27021](immich-app/immich#27021)
- fix: writing empty exif tags by [@danieldietzler](https://github.com/danieldietzler) in [#27025](immich-app/immich#27025)
- fix(web): disable send button by [@jrasm91](https://github.com/jrasm91) in [#27051](immich-app/immich#27051)
- fix(mobile): server url migration by [@mertalev](https://github.com/mertalev) in [#27050](immich-app/immich#27050)

**Full Changelog**: <immich-app/immich@v2.6.0...v2.6.1>

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

##### v2.6.0

Welcome to Immich `v2.6.0`, This release is a collection of more than *350 commits over 6 weeks*. I know, it is an eternity between releases compared to our previous era. This version focuses on bug fixes and enhancements across the app to provide a more delightful and smoother experience to you. This release also prepares for the next major release in the coming month, which will remove the old timeline implementation. Let's dive into the highlights of the release:

> \[!WARNING]
> For those who are still using the old timeline, please switch to the new timeline to avoid interruption, as the old timeline will be removed in the next release.
>
> ps: The old timeline has an exclamation icon next to the logo. <img width="525" height="120" alt="image" src="https://github.com/user-attachments/assets/ed36ea22-b16e-472f-961c-c19501712ba5" />

##### Highlights

- Map side panel (web)
- Pick album cover (mobile)
- Shared link slugs (mobile)
- Shared link presets (web)
- Native HTTP clients (mobile)
- Video player and asset viewer improvements (mobile)
- Improved search results (mobile)
- `schema-check`: a new `immich-admin` command
- Read profile claims from ID token (OAuth)
- Notable fix: cast videos now automatically loop
- Notable fix: correctly extract make and model from Sony XAVC video files
- Notable fix: escape key handling on web
- Notable fix: healthcheck endpoint in maintenance mode
- Notable fix: timeline rendering for RTL languages like Arabic and Hebrew
- Notable fix: prevent server crash when extracting invalid metadata

##### Map side panel (web)

The map view on the web now opens a mini-timeline component as a side panel when you click on a cluster of assets. This makes it easier to view the cluster at a glance and enables bulk actions, such as adding to favorites and adding to an album.

<img width="800" alt="image" src="https://github.com/user-attachments/assets/6f90b04d-4aa7-4f68-b59c-c2b912e638f7" />
##### Pick album cover (mobile)

Users can now pick a new album cover directly from the mobile app.

<https://github.com/user-attachments/assets/7f99dc80-21c6-4ce6-9f75-8e6b0163dcaa>

##### Shared link slugs (mobile)

The mobile app now also supports setting a shared link slug, a feature that's been available on the web for a while.

<https://github.com/user-attachments/assets/5420995a-cfd4-471d-a3ac-db4fa45de780>

##### Shared link presets (web)

The expiration form input on the web was always a bit confusing, but it's been updated to make it easier to see and understand when a shared link will expire.

<img width="400" alt="image" src="https://github.com/user-attachments/assets/9d6124a9-eec2-43e8-b228-e1ac6c0415e8" />
##### Native HTTP clients (mobile)

The mobile app now uses native HTTP clients across both Android and iOS, with support for mTLS, self-signed certificates, basic auth, and custom headers. These features should now be more reliable and extend to background tasks, video playback, and other parts of the app. This also improves the app's overall network request performance thanks to HTTP/2 and HTTP/3, multiplexing, and caching.

##### Video player and asset viewer improvements (mobile)

The asset viewer has undergone many improvements under the hood to make it simpler, faster and more reliable. We've also added playback support for GIFs, enabled video zooming, and made many more bug fixes and tweaks.

##### The asset viewer now uses a gradient for actions, and video controls have been restyled

<img width="300" alt="image" src="https://github.com/user-attachments/assets/9a4e0892-f178-45fc-812c-10a6cba3f48b" />
##### Inline asset details

This used to be a bottom sheet and had a lot of glue for alignment. The new version is much more responsive and less buggy.

##### Before

<https://github.com/user-attachments/assets/43b59b59-7d6a-48d0-94d7-84b8cae1c2a9>

##### After

<https://github.com/user-attachments/assets/9217b6f4-1c92-40b0-bd95-a0681307cf38>

##### Improved search results (mobile)

The search results page now loads more results without rebuilding the entire grid, and should now load much faster. There are also new screens for when there are no search results and when all results have been loaded.

<https://github.com/user-attachments/assets/42ce69d4-1618-48ee-9cb9-91ec22e12b27>

##### `schema-check`: a new `immich-admin` command

A new `immich-admin` command has been added in this release: `schema-check`. The command runs a report on the database to check if any indexes, constraints, tables, or columns are missing. This check also runs automatically on startup.

##### Read profile claims from `idToken` (OAuth)

Prior to `v2.6.0`, Immich resolved the `email` and other claims from the [userinfo](https://openid.net/specs/openid-connect-core-1_0.html#UserInfo) endpoint. Now, Immich also supports reading those claims directly from the `idToken`. This makes it possible to use providers such as Microsoft ADFS that do not support the userinfo endpoint.

***

As always, there are many more QoL improvements, bug fixes, and enhancements in this release. Please find the full release note below

##### 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 v2.6.0 -->

##### What's Changed

##### 🔒 Security

- fix(server): restrict individual shared link asset removal to owners by [@michelheusschen](https://github.com/michelheusschen) in [#26868](immich-app/immich#26868)
- fix: add to shared link by [@jrasm91](https://github.com/jrasm91) in [#26886](immich-app/immich#26886)

##### 🚀 Features

- feat: shared link login by [@jrasm91](https://github.com/jrasm91) in [#25678](immich-app/immich#25678)
- feat: schema-check by [@jrasm91](https://github.com/jrasm91) in [#25904](immich-app/immich#25904)
- feat: add people deeplink by [@arne182](https://github.com/arne182) in [#25686](immich-app/immich#25686)
- feat(mobile): inline asset details by [@uhthomas](https://github.com/uhthomas) in [#25952](immich-app/immich#25952)
- feat(mobile): filter by tags by [@benjamonnguyen](https://github.com/benjamonnguyen) in [#26196](immich-app/immich#26196)
- feat: add .mxf file support by [@timonrieger](https://github.com/timonrieger) in [#24644](immich-app/immich#24644)
- feat: tap to see next/previous image by [@thezeroalpha](https://github.com/thezeroalpha) in [#20286](immich-app/immich#20286)
- feat(mobile): Allow users to set album cover from mobile app by [@timonrieger](https://github.com/timonrieger) in [#25515](immich-app/immich#25515)
- feat(mobile): Allow users to set profile picture from asset viewer by [@timonrieger](https://github.com/timonrieger) in [#25517](immich-app/immich#25517)
- feat: ROCm 7.2 and MIGraphX support  by [@kprinssu](https://github.com/kprinssu) in [#26178](immich-app/immich#26178)
- feat(web): map timeline sidepanel by [@michelheusschen](https://github.com/michelheusschen) in [#26532](immich-app/immich#26532)
- feat: add responsive layout to broken asset by [@midzelis](https://github.com/midzelis) in [#26384](immich-app/immich#26384)
- feat(web): toggle zoom on double-click in photo viewer by [@midzelis](https://github.com/midzelis) in [#26732](immich-app/immich#26732)
- feat(mobile): show animated images in asset viewer by [@LeLunZ](https://github.com/LeLunZ) in [#26614](immich-app/immich#26614)
- feat(mobile): open in browser by [@YarosMallorca](https://github.com/YarosMallorca) in [#26369](immich-app/immich#26369)

##### 🌟 Enhancements

- feat: verify permissions by [@jrasm91](https://github.com/jrasm91) in [#25647](immich-app/immich#25647)
- feat(web): change link expiration logic & presets  by [@YarosMallorca](https://github.com/YarosMallorca) in [#26064](immich-app/immich#26064)
- feat(mobile): dynamic layout in new timeline by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#23837](immich-app/immich#23837)
- feat(cli): change progress bar to display file size by [@Nykri](https://github.com/Nykri) in [#23328](immich-app/immich#23328)
- feat(mobile): dynamic multi-line album name by [@uhthomas](https://github.com/uhthomas) in [#26040](immich-app/immich#26040)
- feat(mobile): hide search by context/OCR if disabled on server ([#25472](immich-app/immich#25472)) by [@Nacolis](https://github.com/Nacolis) in [#26063](immich-app/immich#26063)
- fix(release): add docker-compose.rootless.yml to released assets by [@dnozay](https://github.com/dnozay) in [#26261](immich-app/immich#26261)
- feat(web): show ocr text boxes in panoramas by [@meesfrensel](https://github.com/meesfrensel) in [#25727](immich-app/immich#25727)
- feat(web): loop chromecast video by [@etnoy](https://github.com/etnoy) in [#24410](immich-app/immich#24410)
- chore(web): merge "Add to album" and "Add to shared album" actions into a single action by [@timonrieger](https://github.com/timonrieger) in [#24669](immich-app/immich#24669)
- feat(mobile): timeline - add bottomWidgetBuilder  by [@PeterOmbodi](https://github.com/PeterOmbodi) in [#25634](immich-app/immich#25634)
- feat(mobile): video zooming in asset viewer by [@goalie2002](https://github.com/goalie2002) in [#22036](immich-app/immich#22036)
- feat(mobile): Add slug support for shared links by [@Lauritz-Tieste](https://github.com/Lauritz-Tieste) in [#26441](immich-app/immich#26441)
- feat: warn when losing transparency during thumbnail generation by [@midzelis](https://github.com/midzelis) in [#26243](immich-app/immich#26243)
- perf(mobile): optimized album sorting by [@YarosMallorca](https://github.com/YarosMallorca) in [#25179](immich-app/immich#25179)
- feat(mobile): prompt when deleting from trash by [@YarosMallorca](https://github.com/YarosMallorca) in [#26392](immich-app/immich#26392)
- feat: getAssetEdits respond with edit IDs by [@bwees](https://github.com/bwees) in [#26445](immich-app/immich#26445)
- fix(server): accept showAt and hideAt for creating memories by [@meesfrensel](https://github.com/meesfrensel) in [#26429](immich-app/immich#26429)
- feat(server): SyncAssetEditV1 by [@bwees](https://github.com/bwees) in [#26446](immich-app/immich#26446)
- feat: splash screen error page by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#26460](immich-app/immich#26460)
- feat(mobile): add confirmation dialog to permanent delete action by [@ByteSizedMarius](https://github.com/ByteSizedMarius) in [#26442](immich-app/immich#26442)
- feat: enhance face-editor positioning by [@midzelis](https://github.com/midzelis) in [#26303](immich-app/immich#26303)
- feat: improve HEIC, HEIF and JPEG XL browser support detection by [@nicosemp](https://github.com/nicosemp) in [#26122](immich-app/immich#26122)
- refactor(web): remove replaceAsset action by [@timonrieger](https://github.com/timonrieger) in [#26444](immich-app/immich#26444)
- feat(web): bounding box for faces when hovering over the face in photo view by [@cratoo](https://github.com/cratoo) in [#26667](immich-app/immich#26667)
- feat(mobile): keep search results visible by [@uhthomas](https://github.com/uhthomas) in [#26498](immich-app/immich#26498)
- feat(mobile): use shared native client by [@mertalev](https://github.com/mertalev) in [#25942](immich-app/immich#25942)
- feat(mobile): SyncAssetEditV1 by [@bwees](https://github.com/bwees) in [#26518](immich-app/immich#26518)
- feat(ml): enable openvino for cpu by [@apejcic](https://github.com/apejcic) in [#22948](immich-app/immich#22948)
- feat: responsive video duration in thumbnail by [@midzelis](https://github.com/midzelis) in [#26770](immich-app/immich#26770)
- feat(web): animate zoom toggle with cubicOut easing by [@midzelis](https://github.com/midzelis) in [#26731](immich-app/immich#26731)
- feat(mobile): consolidate video controls by [@uhthomas](https://github.com/uhthomas) in [#26673](immich-app/immich#26673)
- feat(web): add shortcut "p" to open/close the face tag box by [@cratoo](https://github.com/cratoo) in [#26826](immich-app/immich#26826)
- feat(mobile): use material design 3 slider by [@uhthomas](https://github.com/uhthomas) in [#26829](immich-app/immich#26829)
- feat: adaptive progressive image loading for photo viewer by [@midzelis](https://github.com/midzelis) in [#26636](immich-app/immich#26636)
- fix(server): extract make/model from sony video files by [@brendanngo](https://github.com/brendanngo) in [#26833](immich-app/immich#26833)
- chore(mobile): remove background from asset viewer back button by [@uhthomas](https://github.com/uhthomas) in [#26851](immich-app/immich#26851)
- feat(server): support IDPs that only send the userinfo in the ID token by [@Belnadifia](https://github.com/Belnadifia) in [#26717](immich-app/immich#26717)
- feat(web): improve OCR overlay text fitting, reactivity, and accessibility by [@midzelis](https://github.com/midzelis) in [#26678](immich-app/immich#26678)
- fix(web): allow pasting PIN code from clipboard or password manager by [@pressslav](https://github.com/pressslav) in [#26944](immich-app/immich#26944)

##### 🐛 Bug fixes

- fix: ignore checksum constraint error when logging by [@jrasm91](https://github.com/jrasm91) in [#26113](immich-app/immich#26113)
- fix(web): use locale for date picker by [@michelheusschen](https://github.com/michelheusschen) in [#26125](immich-app/immich#26125)
- fix(web): escape shortcut handling by [@michelheusschen](https://github.com/michelheusschen) in [#26096](immich-app/immich#26096)
- fix(mobile): Login routing on Splash screen by [@PeterOmbodi](https://github.com/PeterOmbodi) in [#26128](immich-app/immich#26128)
- fix: null local date time in timeline queries by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#26133](immich-app/immich#26133)
- fix(web): prevent event manager from throwing error by [@michelheusschen](https://github.com/michelheusschen) in [#26156](immich-app/immich#26156)
- fix(web): improve api key modal responsiveness by [@klenner1](https://github.com/klenner1) in [#26151](immich-app/immich#26151)
- fix(web): show correct assets in memory gallery by [@michelheusschen](https://github.com/michelheusschen) in [#26157](immich-app/immich#26157)
- fix(web): add missing [@immich/ui](https://github.com/immich/ui) translations by [@michelheusschen](https://github.com/michelheusschen) in [#26143](immich-app/immich#26143)
- fix(mobile): timeline handling on foldable phones + ensuring that images are not cut off by [@bkchr](https://github.com/bkchr) in [#25088](immich-app/immich#25088)
- fix(mobile): prevent nav bar label text wrapping by [@chrislongros](https://github.com/chrislongros) in [#26011](immich-app/immich#26011)
- fix(mobile): hide latest version warnings by [@uhthomas](https://github.com/uhthomas) in [#26036](immich-app/immich#26036)
- fix(mobile): inconsistent query for people by [@YarosMallorca](https://github.com/YarosMallorca) in [#24437](immich-app/immich#24437)
- fix(web): timeline multi select group state by [@michelheusschen](https://github.com/michelheusschen) in [#26180](immich-app/immich#26180)
- fix(web): add checkerboard background for transparent images by [@agent-steven](https://github.com/agent-steven) in [#26091](immich-app/immich#26091)
- fix(mobile): inherit toolbar opacity by [@uhthomas](https://github.com/uhthomas) in [#25694](immich-app/immich#25694)
- fix(web): focus tag input when modal opens by [@michelheusschen](https://github.com/michelheusschen) in [#26256](immich-app/immich#26256)
- fix(web): clear face boxes when switching assets by [@michelheusschen](https://github.com/michelheusschen) in [#26249](immich-app/immich#26249)
- fix(web): clear unsaved asset description when changing asset by [@michelheusschen](https://github.com/michelheusschen) in [#26255](immich-app/immich#26255)
- fix(web): clear cache when asset changes by [@michelheusschen](https://github.com/michelheusschen) in [#26257](immich-app/immich#26257)
- fix: utc time zone upserts by [@danieldietzler](https://github.com/danieldietzler) in [#26258](immich-app/immich#26258)
- fix: metadata crash by [@jrasm91](https://github.com/jrasm91) in [#26327](immich-app/immich#26327)
- fix: prevent server crash when extraction of metadata fails if the assets are corrupted by [@Devansh-Jani](https://github.com/Devansh-Jani) in [#26042](immich-app/immich#26042)
- fix(server): db restore failure when `DB_URL` is set to unix-domain socket connection by [@fabio-garavini](https://github.com/fabio-garavini) in [#26252](immich-app/immich#26252)
- fix: Download the edited version when downloading multiple photos by [@MontejoJorge](https://github.com/MontejoJorge) in [#26259](immich-app/immich#26259)
- fix: include `DROP INDEX` in transaction to prevent missing index on rollback by [@haoxi911](https://github.com/haoxi911) in [#25399](immich-app/immich#25399)
- fix: safari address bar color by [@jrasm91](https://github.com/jrasm91) in [#26346](immich-app/immich#26346)
- fix(web): prevent panorama image reload during asset updates by [@michelheusschen](https://github.com/michelheusschen) in [#26349](immich-app/immich#26349)
- fix(web): favoriting assets opened via GalleryViewer by [@michelheusschen](https://github.com/michelheusschen) in [#26350](immich-app/immich#26350)
- fix(i18n): add translation key for partner's photos by [@timonrieger](https://github.com/timonrieger) in [#26348](immich-app/immich#26348)
- fix(web): single select scroll behavior by [@timonrieger](https://github.com/timonrieger) in [#26358](immich-app/immich#26358)
- perf: add indexes to improve People API response times by [@bxtdvd](https://github.com/bxtdvd) in [#26337](immich-app/immich#26337)
- fix: pin code reset modal by [@jrasm91](https://github.com/jrasm91) in [#26370](immich-app/immich#26370)
- fix(mobile): Reset "People" search filter chip if no selections are made by [@benjamonnguyen](https://github.com/benjamonnguyen) in [#26267](immich-app/immich#26267)
- fix(cli): delete sidecar files after upload if requested by [@timonrieger](https://github.com/timonrieger) in [#26353](immich-app/immich#26353)
- fix(web): album description auto height by [@michelheusschen](https://github.com/michelheusschen) in [#26420](immich-app/immich#26420)
- fix(web): prevent side panel overlap during transition by [@michelheusschen](https://github.com/michelheusschen) in [#26398](immich-app/immich#26398)
- fix(web): storage template example by [@mmomjian](https://github.com/mmomjian) in [#26424](immich-app/immich#26424)
- fix(web): prevent `state_unsafe_mutation` error on people page by [@michelheusschen](https://github.com/michelheusschen) in [#26438](immich-app/immich#26438)
- fix: missing deletedAt and isVisible columns on mobile by [@bwees](https://github.com/bwees) in [#26414](immich-app/immich#26414)
- fix(mobile): joinLocal on archived timeline by [@YarosMallorca](https://github.com/YarosMallorca) in [#26387](immich-app/immich#26387)
- fix: always show library scan button by [@etnoy](https://github.com/etnoy) in [#26428](immich-app/immich#26428)
- fix: retain asset when either asset is a favorite by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#26473](immich-app/immich#26473)
- fix(web): prevent null folder tree on concurrent load by [@michelheusschen](https://github.com/michelheusschen) in [#26489](immich-app/immich#26489)
- fix(web): toast warning when trying to upload unsupported file type by [@meesfrensel](https://github.com/meesfrensel) in [#26492](immich-app/immich#26492)
- fix(mobile): birthday picker shows limited months when no date exists by [@socksprox](https://github.com/socksprox) in [#26407](immich-app/immich#26407)
- fix: consider DAR when extracting video dimension by [@alextran1502](https://github.com/alextran1502) in [#25293](immich-app/immich#25293)
- feat(mobile): Prevent premature image cache eviction when higher image loading is enabled by [@LeLunZ](https://github.com/LeLunZ) in [#26208](immich-app/immich#26208)
- refactor: star rating by [@meesfrensel](https://github.com/meesfrensel) in [#26357](immich-app/immich#26357)
- fix(mobile): set correct initial system-ui mode in asset viewer by [@goalie2002](https://github.com/goalie2002) in [#26500](immich-app/immich#26500)
- fix(server): Live Photo migration bug when album is in template by [@NikhilAlapati](https://github.com/NikhilAlapati) in [#25329](immich-app/immich#25329)
- fix(web): handle delete shortcut on shared link page as remove by [@meesfrensel](https://github.com/meesfrensel) in [#26552](immich-app/immich#26552)
- fix(mobile): prevent video player from being recreated unnecessarily by [@uhthomas](https://github.com/uhthomas) in [#26553](immich-app/immich#26553)
- fix(mobile): don't cut off top corners of app bar by [@uhthomas](https://github.com/uhthomas) in [#26550](immich-app/immich#26550)
- feat: update onnxruntime-openvino to 1.24.1 and intel drivers by [@savely-krasovsky](https://github.com/savely-krasovsky) in [#26565](immich-app/immich#26565)
- fix: hide download action for local/merged assets by [@YarosMallorca](https://github.com/YarosMallorca) in [#26461](immich-app/immich#26461)
- fix(web): top bar z index on search page by [@YarosMallorca](https://github.com/YarosMallorca) in [#26582](immich-app/immich#26582)
- fix(web): show shared link download button when logged in by [@Snowknight26](https://github.com/Snowknight26) in [#26629](immich-app/immich#26629)
- fix(mobile): asset viewer hero animation by [@uhthomas](https://github.com/uhthomas) in [#26545](immich-app/immich#26545)
- fix(web): timeline and asset viewer RTL support by [@meesfrensel](https://github.com/meesfrensel) in [#26513](immich-app/immich#26513)
- fix(server): clean up edited thumbnail when deleting asset by [@michelheusschen](https://github.com/michelheusschen) in [#26664](immich-app/immich#26664)
- fix: implement existing withStacked on searchAssetBuilder by [@babbitt](https://github.com/babbitt) in [#26607](immich-app/immich#26607)
- fix(mobile): video state by [@uhthomas](https://github.com/uhthomas) in [#26574](immich-app/immich#26574)
- fix(maintenance mode): wait for valid server config on restart by [@insertish](https://github.com/insertish) in [#26456](immich-app/immich#26456)
- fix(web): inconsistent asset nav bar state after visiting shared link by [@Snowknight26](https://github.com/Snowknight26) in [#26674](immich-app/immich#26674)
- fix(web): download toast showing wrong filename for motion assets by [@Snowknight26](https://github.com/Snowknight26) in [#26689](immich-app/immich#26689)
- fix(mobile): add safe area for asset details by [@uhthomas](https://github.com/uhthomas) in [#26675](immich-app/immich#26675)
- fix(web): combobox dropdown positioning in modals by [@michelheusschen](https://github.com/michelheusschen) in [#26707](immich-app/immich#26707)
- fix(web): video stealing focus when it plays again when looping by [@Snowknight26](https://github.com/Snowknight26) in [#26704](immich-app/immich#26704)
- fix(ml): batch size setting by [@mertalev](https://github.com/mertalev) in [#26524](immich-app/immich#26524)
- fix(server): clarify transcoding bitrate policy by [@meesfrensel](https://github.com/meesfrensel) in [#26711](immich-app/immich#26711)
- fix: playback style migration by [@alextran1502](https://github.com/alextran1502) in [#26718](immich-app/immich#26718)
- fix(web): asset viewer showing wrong viewer type when hovering on stack thumbnails by [@Snowknight26](https://github.com/Snowknight26) in [#26741](immich-app/immich#26741)
- fix(server): opus handling as accepted audio codec in transcode policy by [@skatsubo](https://github.com/skatsubo) in [#26736](immich-app/immich#26736)
- fix(web): refresh recent albums sidebar after album changes by [@michelheusschen](https://github.com/michelheusschen) in [#26757](immich-app/immich#26757)
- fix(web): show the correct cursor at crop bounds when editing an asset by [@Snowknight26](https://github.com/Snowknight26) in [#26748](immich-app/immich#26748)
- fix(web): recalculate face bounding boxes by [@cratoo](https://github.com/cratoo) in [#26737](immich-app/immich#26737)
- fix(web): context menu overflow by [@SevereCloud](https://github.com/SevereCloud) in [#26760](immich-app/immich#26760)
- fix(web): correct tag rounding in search options by [@michelheusschen](https://github.com/michelheusschen) in [#26814](immich-app/immich#26814)
- fix(web): prevent unrelated assets from appearing in tag view by [@michelheusschen](https://github.com/michelheusschen) in [#26816](immich-app/immich#26816)
- fix(mobile): use tabular figures in backup page by [@uhthomas](https://github.com/uhthomas) in [#26830](immich-app/immich#26830)
- fix(mobile): wrap backup error message text by [@uhthomas](https://github.com/uhthomas) in [#26834](immich-app/immich#26834)
- fix(server): use correct day ordering in timeline buckets by [@michelheusschen](https://github.com/michelheusschen) in [#26821](immich-app/immich#26821)
- fix(web): face selection box position resetting on browser resize by [@Snowknight26](https://github.com/Snowknight26) in [#26766](immich-app/immich#26766)
- fix: use correct original URL for 360 video panorama playback by [@luis15pt](https://github.com/luis15pt) in [#26831](immich-app/immich#26831)
- fix(web): disable drag and drop for internal items by [@michelheusschen](https://github.com/michelheusschen) in [#26897](immich-app/immich#26897)
- fix(web): keep header fixed on individual shared links by [@michelheusschen](https://github.com/michelheusschen) in [#26892](immich-app/immich#26892)
- fix: SMTP over TLS by [@nathanielhourt](https://github.com/nathanielhourt) in [#26893](immich-app/immich#26893)
- fix(web): copy yearMonth in MonthGroup to avoid shared object reference with asset in [#26890](immich-app/immich#26890)
- fix(mobile): use shared auth for background\_downloader by [@mertalev](https://github.com/mertalev) in [#26911](immich-app/immich#26911)
- fix(web): prevent search page error on missing album filter by [@michelheusschen](https://github.com/michelheusschen) in [#26948](immich-app/immich#26948)
- fix(server): sync files to disk by [@uhthomas](https://github.com/uhthomas) in [#26881](immich-app/immich#26881)
- fix(web): jump to primary stacked asset from memory by [@michelheusschen](https://github.com/michelheusschen) in [#26978](immich-app/immich#26978)
- fix(mobile): reflect asset deletions instantly by [@uhthomas](https://github.com/uhthomas) in [#26835](immich-app/immich#26835)
- fix: healthcheck by [@jrasm91](https://github.com/jrasm91) in [#26989](immich-app/immich#26989)
- fix(web): escape handling for tagging and adding a face in asset viewer by [@cratoo](https://github.com/cratoo) in [#26870](immich-app/immich#26870)
- fix: filter after searching by asset id by [@jrasm91](https://github.com/jrasm91) in [#26994](immich-app/immich#26994)
- fix: bounding box return type by [@jrasm91](https://github.com/jrasm91) in [#27014](immich-app/immich#27014)
- fix: validate accept header before returning html by [@jrasm91](https://github.com/jrasm91) in [#27019](immich-app/immich#27019)

##### 📚 Documentation

- chore(docs): Update help channel for developers by [@Mraedis](https://github.com/Mraedis) in [#26284](immich-app/immich#26284)
- feat(docs): Explain configuration file location for Docker Compose by [@keunes](https://github.com/keunes) in [#24989](immich-app/immich#24989)
- chore(docs): add quick-start guide for DevPod with docker by [@dhlavaty](https://github.com/dhlavaty) in [#26213](immich-app/immich#26213)
- feat(docs): Adding information about parameter c= by [@aviv926](https://github.com/aviv926) in [#26430](immich-app/immich#26430)
- feat: doc links by [@jrasm91](https://github.com/jrasm91) in [#26519](immich-app/immich#26519)
- fix(docs): add ocr to job flow diagram by [@niij](https://github.com/niij) in [#26505](immich-app/immich#26505)

##### 🌐 Translations

- chore(web): update translations by [@weblate](https://github.com/weblate) in [#26118](immich-app/immich#26118)
- fix: clarify external domain setting is used for emails too by [@chrislongros](https://github.com/chrislongros) in [#26009](immich-app/immich#26009)
- chore(web): update translations by [@weblate](https://github.com/weblate) in [#26167](immich-app/immich#26167)
- fix(web): error page i18n by [@meesfrensel](https://github.com/meesfrensel) in [#26517](immich-app/immich#26517)
- chore(web): clarify locale settings description by [@meesfrensel](https://github.com/meesfrensel) in [#25562](immich-app/immich#25562)
- chore(web): update translations by [@weblate](https://github.com/weblate) in [#26192](immich-app/immich#26192)

##### New Contributors

- [@klenner1](https://github.com/klenner1) made their first contribution in [#26151](immich-app/immich#26151)
- [@bkchr](https://github.com/bkchr) made their first contribution in [#25088](immich-app/immich#25088)
- [@chrislongros](https://github.com/chrislongros) made their first contribution in [#26011](immich-app/immich#26011)
- [@agent-steven](https://github.com/agent-steven) made their first contribution in [#26091](immich-app/immich#26091)
- [@dhlavaty](https://github.com/dhlavaty) made their first contribution in [#26238](immich-app/immich#26238)
- [@Nacolis](https://github.com/Nacolis) made their first contribution in [#26063](immich-app/immich#26063)
- [@ewinnd](https://github.com/ewinnd) made their first contribution in [#26277](immich-app/immich#26277)
- [@dnozay](https://github.com/dnozay) made their first contribution in [#26261](immich-app/immich#26261)
- [@keunes](https://github.com/keunes) made their first contribution in [#24989](immich-app/immich#24989)
- [@Devansh-Jani](https://github.com/Devansh-Jani) made their first contribution in [#26042](immich-app/immich#26042)
- [@benjamonnguyen](https://github.com/benjamonnguyen) made their first contribution in [#26196](immich-app/immich#26196)
- [@fabio-garavini](https://github.com/fabio-garavini) made their first contribution in [#26252](immich-app/immich#26252)
- [@haoxi911](https://github.com/haoxi911) made their first contribution in [#25399](immich-app/immich#25399)
- [@thezeroalpha](https://github.com/thezeroalpha) made their first contribution in [#20286](immich-app/immich#20286)
- [@socksprox](https://github.com/socksprox) made their first contribution in [#26407](immich-app/immich#26407)
- [@kprinssu](https://github.com/kprinssu) made their first contribution in [#26178](immich-app/immich#26178)
- [@babbitt](https://github.com/babbitt) made their first contribution in [#26607](immich-app/immich#26607)
- [@niij](https://github.com/niij) made their first contribution in [#26505](immich-app/immich#26505)
- [@cratoo](https://github.com/cratoo) made their first contribution in [#26667](immich-app/immich#26667)
- [@M123-dev](https://github.com/M123-dev) made their first contribution in [#26630](immich-app/immich#26630)
- [@apejcic](https://github.com/apejcic) made their first contribution in [#22948](immich-app/immich#22948)
- [@SevereCloud](https://github.com/SevereCloud) made their first contribution in [#26760](immich-app/immich#26760)
- [@brendanngo](https://github.com/brendanngo) made their first contribution in [#26833](immich-app/immich#26833)
- [@luis15pt](https://github.com/luis15pt) made their first contribution in [#26831](immich-app/immich#26831)
- [@nathanielhourt](https://github.com/nathanielhourt) made their first contribution in [#26893](immich-app/immich#26893)
- [@Belnadifia](https://github.com/Belnadifia) made their first contribution in [#26717](immich-app/immich#26717)
- [@pressslav](https://github.com/pressslav) made their first contribution in [#26944](immich-app/immich#26944)

**Full Changelog**: <immich-app/immich@v2.5.6...v2.6.0>
sdwilsh pushed a commit to sdwilsh/ansible-playbooks that referenced this pull request Mar 21, 2026
##### [\`v2.6.1\`](https://github.com/immich-app/immich/releases/tag/v2.6.1)

##### v2.6.1

##### Hot fixes

- Fixed a failed migration issue on the mobile app when the URL Switching feature is used

##### What's Changed

##### 🐛 Bug fixes

- fix(server): fallback to email when name is empty by [@jrasm91](https://github.com/jrasm91) in [#27016](immich-app/immich#27016)
- fix: ignore errors deleting untitled album by [@jrasm91](https://github.com/jrasm91) in [#27020](immich-app/immich#27020)
- fix(web): wrap long album title by [@jrasm91](https://github.com/jrasm91) in [#27012](immich-app/immich#27012)
- fix(web): stop in-progress uploads on logout by [@jrasm91](https://github.com/jrasm91) in [#27021](immich-app/immich#27021)
- fix: writing empty exif tags by [@danieldietzler](https://github.com/danieldietzler) in [#27025](immich-app/immich#27025)
- fix(web): disable send button by [@jrasm91](https://github.com/jrasm91) in [#27051](immich-app/immich#27051)
- fix(mobile): server url migration by [@mertalev](https://github.com/mertalev) in [#27050](immich-app/immich#27050)

**Full Changelog**: <immich-app/immich@v2.6.0...v2.6.1>

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

##### v2.6.0

Welcome to Immich `v2.6.0`, This release is a collection of more than *350 commits over 6 weeks*. I know, it is an eternity between releases compared to our previous era. This version focuses on bug fixes and enhancements across the app to provide a more delightful and smoother experience to you. This release also prepares for the next major release in the coming month, which will remove the old timeline implementation. Let's dive into the highlights of the release:

> \[!WARNING]
> For those who are still using the old timeline, please switch to the new timeline to avoid interruption, as the old timeline will be removed in the next release.
>
> ps: The old timeline has an exclamation icon next to the logo. <img width="525" height="120" alt="image" src="https://github.com/user-attachments/assets/ed36ea22-b16e-472f-961c-c19501712ba5" />

##### Highlights

- Map side panel (web)
- Pick album cover (mobile)
- Shared link slugs (mobile)
- Shared link presets (web)
- Native HTTP clients (mobile)
- Video player and asset viewer improvements (mobile)
- Improved search results (mobile)
- `schema-check`: a new `immich-admin` command
- Read profile claims from ID token (OAuth)
- Notable fix: cast videos now automatically loop
- Notable fix: correctly extract make and model from Sony XAVC video files
- Notable fix: escape key handling on web
- Notable fix: healthcheck endpoint in maintenance mode
- Notable fix: timeline rendering for RTL languages like Arabic and Hebrew
- Notable fix: prevent server crash when extracting invalid metadata

##### Map side panel (web)

The map view on the web now opens a mini-timeline component as a side panel when you click on a cluster of assets. This makes it easier to view the cluster at a glance and enables bulk actions, such as adding to favorites and adding to an album.

<img width="800" alt="image" src="https://github.com/user-attachments/assets/6f90b04d-4aa7-4f68-b59c-c2b912e638f7" />
##### Pick album cover (mobile)

Users can now pick a new album cover directly from the mobile app.

<https://github.com/user-attachments/assets/7f99dc80-21c6-4ce6-9f75-8e6b0163dcaa>

##### Shared link slugs (mobile)

The mobile app now also supports setting a shared link slug, a feature that's been available on the web for a while.

<https://github.com/user-attachments/assets/5420995a-cfd4-471d-a3ac-db4fa45de780>

##### Shared link presets (web)

The expiration form input on the web was always a bit confusing, but it's been updated to make it easier to see and understand when a shared link will expire.

<img width="400" alt="image" src="https://github.com/user-attachments/assets/9d6124a9-eec2-43e8-b228-e1ac6c0415e8" />
##### Native HTTP clients (mobile)

The mobile app now uses native HTTP clients across both Android and iOS, with support for mTLS, self-signed certificates, basic auth, and custom headers. These features should now be more reliable and extend to background tasks, video playback, and other parts of the app. This also improves the app's overall network request performance thanks to HTTP/2 and HTTP/3, multiplexing, and caching.

##### Video player and asset viewer improvements (mobile)

The asset viewer has undergone many improvements under the hood to make it simpler, faster and more reliable. We've also added playback support for GIFs, enabled video zooming, and made many more bug fixes and tweaks.

##### The asset viewer now uses a gradient for actions, and video controls have been restyled

<img width="300" alt="image" src="https://github.com/user-attachments/assets/9a4e0892-f178-45fc-812c-10a6cba3f48b" />
##### Inline asset details

This used to be a bottom sheet and had a lot of glue for alignment. The new version is much more responsive and less buggy.

##### Before

<https://github.com/user-attachments/assets/43b59b59-7d6a-48d0-94d7-84b8cae1c2a9>

##### After

<https://github.com/user-attachments/assets/9217b6f4-1c92-40b0-bd95-a0681307cf38>

##### Improved search results (mobile)

The search results page now loads more results without rebuilding the entire grid, and should now load much faster. There are also new screens for when there are no search results and when all results have been loaded.

<https://github.com/user-attachments/assets/42ce69d4-1618-48ee-9cb9-91ec22e12b27>

##### `schema-check`: a new `immich-admin` command

A new `immich-admin` command has been added in this release: `schema-check`. The command runs a report on the database to check if any indexes, constraints, tables, or columns are missing. This check also runs automatically on startup.

##### Read profile claims from `idToken` (OAuth)

Prior to `v2.6.0`, Immich resolved the `email` and other claims from the [userinfo](https://openid.net/specs/openid-connect-core-1_0.html#UserInfo) endpoint. Now, Immich also supports reading those claims directly from the `idToken`. This makes it possible to use providers such as Microsoft ADFS that do not support the userinfo endpoint.

***

As always, there are many more QoL improvements, bug fixes, and enhancements in this release. Please find the full release note below

##### 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 v2.6.0 -->

##### What's Changed

##### 🔒 Security

- fix(server): restrict individual shared link asset removal to owners by [@michelheusschen](https://github.com/michelheusschen) in [#26868](immich-app/immich#26868)
- fix: add to shared link by [@jrasm91](https://github.com/jrasm91) in [#26886](immich-app/immich#26886)

##### 🚀 Features

- feat: shared link login by [@jrasm91](https://github.com/jrasm91) in [#25678](immich-app/immich#25678)
- feat: schema-check by [@jrasm91](https://github.com/jrasm91) in [#25904](immich-app/immich#25904)
- feat: add people deeplink by [@arne182](https://github.com/arne182) in [#25686](immich-app/immich#25686)
- feat(mobile): inline asset details by [@uhthomas](https://github.com/uhthomas) in [#25952](immich-app/immich#25952)
- feat(mobile): filter by tags by [@benjamonnguyen](https://github.com/benjamonnguyen) in [#26196](immich-app/immich#26196)
- feat: add .mxf file support by [@timonrieger](https://github.com/timonrieger) in [#24644](immich-app/immich#24644)
- feat: tap to see next/previous image by [@thezeroalpha](https://github.com/thezeroalpha) in [#20286](immich-app/immich#20286)
- feat(mobile): Allow users to set album cover from mobile app by [@timonrieger](https://github.com/timonrieger) in [#25515](immich-app/immich#25515)
- feat(mobile): Allow users to set profile picture from asset viewer by [@timonrieger](https://github.com/timonrieger) in [#25517](immich-app/immich#25517)
- feat: ROCm 7.2 and MIGraphX support  by [@kprinssu](https://github.com/kprinssu) in [#26178](immich-app/immich#26178)
- feat(web): map timeline sidepanel by [@michelheusschen](https://github.com/michelheusschen) in [#26532](immich-app/immich#26532)
- feat: add responsive layout to broken asset by [@midzelis](https://github.com/midzelis) in [#26384](immich-app/immich#26384)
- feat(web): toggle zoom on double-click in photo viewer by [@midzelis](https://github.com/midzelis) in [#26732](immich-app/immich#26732)
- feat(mobile): show animated images in asset viewer by [@LeLunZ](https://github.com/LeLunZ) in [#26614](immich-app/immich#26614)
- feat(mobile): open in browser by [@YarosMallorca](https://github.com/YarosMallorca) in [#26369](immich-app/immich#26369)

##### 🌟 Enhancements

- feat: verify permissions by [@jrasm91](https://github.com/jrasm91) in [#25647](immich-app/immich#25647)
- feat(web): change link expiration logic & presets  by [@YarosMallorca](https://github.com/YarosMallorca) in [#26064](immich-app/immich#26064)
- feat(mobile): dynamic layout in new timeline by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#23837](immich-app/immich#23837)
- feat(cli): change progress bar to display file size by [@Nykri](https://github.com/Nykri) in [#23328](immich-app/immich#23328)
- feat(mobile): dynamic multi-line album name by [@uhthomas](https://github.com/uhthomas) in [#26040](immich-app/immich#26040)
- feat(mobile): hide search by context/OCR if disabled on server ([#25472](immich-app/immich#25472)) by [@Nacolis](https://github.com/Nacolis) in [#26063](immich-app/immich#26063)
- fix(release): add docker-compose.rootless.yml to released assets by [@dnozay](https://github.com/dnozay) in [#26261](immich-app/immich#26261)
- feat(web): show ocr text boxes in panoramas by [@meesfrensel](https://github.com/meesfrensel) in [#25727](immich-app/immich#25727)
- feat(web): loop chromecast video by [@etnoy](https://github.com/etnoy) in [#24410](immich-app/immich#24410)
- chore(web): merge "Add to album" and "Add to shared album" actions into a single action by [@timonrieger](https://github.com/timonrieger) in [#24669](immich-app/immich#24669)
- feat(mobile): timeline - add bottomWidgetBuilder  by [@PeterOmbodi](https://github.com/PeterOmbodi) in [#25634](immich-app/immich#25634)
- feat(mobile): video zooming in asset viewer by [@goalie2002](https://github.com/goalie2002) in [#22036](immich-app/immich#22036)
- feat(mobile): Add slug support for shared links by [@Lauritz-Tieste](https://github.com/Lauritz-Tieste) in [#26441](immich-app/immich#26441)
- feat: warn when losing transparency during thumbnail generation by [@midzelis](https://github.com/midzelis) in [#26243](immich-app/immich#26243)
- perf(mobile): optimized album sorting by [@YarosMallorca](https://github.com/YarosMallorca) in [#25179](immich-app/immich#25179)
- feat(mobile): prompt when deleting from trash by [@YarosMallorca](https://github.com/YarosMallorca) in [#26392](immich-app/immich#26392)
- feat: getAssetEdits respond with edit IDs by [@bwees](https://github.com/bwees) in [#26445](immich-app/immich#26445)
- fix(server): accept showAt and hideAt for creating memories by [@meesfrensel](https://github.com/meesfrensel) in [#26429](immich-app/immich#26429)
- feat(server): SyncAssetEditV1 by [@bwees](https://github.com/bwees) in [#26446](immich-app/immich#26446)
- feat: splash screen error page by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#26460](immich-app/immich#26460)
- feat(mobile): add confirmation dialog to permanent delete action by [@ByteSizedMarius](https://github.com/ByteSizedMarius) in [#26442](immich-app/immich#26442)
- feat: enhance face-editor positioning by [@midzelis](https://github.com/midzelis) in [#26303](immich-app/immich#26303)
- feat: improve HEIC, HEIF and JPEG XL browser support detection by [@nicosemp](https://github.com/nicosemp) in [#26122](immich-app/immich#26122)
- refactor(web): remove replaceAsset action by [@timonrieger](https://github.com/timonrieger) in [#26444](immich-app/immich#26444)
- feat(web): bounding box for faces when hovering over the face in photo view by [@cratoo](https://github.com/cratoo) in [#26667](immich-app/immich#26667)
- feat(mobile): keep search results visible by [@uhthomas](https://github.com/uhthomas) in [#26498](immich-app/immich#26498)
- feat(mobile): use shared native client by [@mertalev](https://github.com/mertalev) in [#25942](immich-app/immich#25942)
- feat(mobile): SyncAssetEditV1 by [@bwees](https://github.com/bwees) in [#26518](immich-app/immich#26518)
- feat(ml): enable openvino for cpu by [@apejcic](https://github.com/apejcic) in [#22948](immich-app/immich#22948)
- feat: responsive video duration in thumbnail by [@midzelis](https://github.com/midzelis) in [#26770](immich-app/immich#26770)
- feat(web): animate zoom toggle with cubicOut easing by [@midzelis](https://github.com/midzelis) in [#26731](immich-app/immich#26731)
- feat(mobile): consolidate video controls by [@uhthomas](https://github.com/uhthomas) in [#26673](immich-app/immich#26673)
- feat(web): add shortcut "p" to open/close the face tag box by [@cratoo](https://github.com/cratoo) in [#26826](immich-app/immich#26826)
- feat(mobile): use material design 3 slider by [@uhthomas](https://github.com/uhthomas) in [#26829](immich-app/immich#26829)
- feat: adaptive progressive image loading for photo viewer by [@midzelis](https://github.com/midzelis) in [#26636](immich-app/immich#26636)
- fix(server): extract make/model from sony video files by [@brendanngo](https://github.com/brendanngo) in [#26833](immich-app/immich#26833)
- chore(mobile): remove background from asset viewer back button by [@uhthomas](https://github.com/uhthomas) in [#26851](immich-app/immich#26851)
- feat(server): support IDPs that only send the userinfo in the ID token by [@Belnadifia](https://github.com/Belnadifia) in [#26717](immich-app/immich#26717)
- feat(web): improve OCR overlay text fitting, reactivity, and accessibility by [@midzelis](https://github.com/midzelis) in [#26678](immich-app/immich#26678)
- fix(web): allow pasting PIN code from clipboard or password manager by [@pressslav](https://github.com/pressslav) in [#26944](immich-app/immich#26944)

##### 🐛 Bug fixes

- fix: ignore checksum constraint error when logging by [@jrasm91](https://github.com/jrasm91) in [#26113](immich-app/immich#26113)
- fix(web): use locale for date picker by [@michelheusschen](https://github.com/michelheusschen) in [#26125](immich-app/immich#26125)
- fix(web): escape shortcut handling by [@michelheusschen](https://github.com/michelheusschen) in [#26096](immich-app/immich#26096)
- fix(mobile): Login routing on Splash screen by [@PeterOmbodi](https://github.com/PeterOmbodi) in [#26128](immich-app/immich#26128)
- fix: null local date time in timeline queries by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#26133](immich-app/immich#26133)
- fix(web): prevent event manager from throwing error by [@michelheusschen](https://github.com/michelheusschen) in [#26156](immich-app/immich#26156)
- fix(web): improve api key modal responsiveness by [@klenner1](https://github.com/klenner1) in [#26151](immich-app/immich#26151)
- fix(web): show correct assets in memory gallery by [@michelheusschen](https://github.com/michelheusschen) in [#26157](immich-app/immich#26157)
- fix(web): add missing [@immich/ui](https://github.com/immich/ui) translations by [@michelheusschen](https://github.com/michelheusschen) in [#26143](immich-app/immich#26143)
- fix(mobile): timeline handling on foldable phones + ensuring that images are not cut off by [@bkchr](https://github.com/bkchr) in [#25088](immich-app/immich#25088)
- fix(mobile): prevent nav bar label text wrapping by [@chrislongros](https://github.com/chrislongros) in [#26011](immich-app/immich#26011)
- fix(mobile): hide latest version warnings by [@uhthomas](https://github.com/uhthomas) in [#26036](immich-app/immich#26036)
- fix(mobile): inconsistent query for people by [@YarosMallorca](https://github.com/YarosMallorca) in [#24437](immich-app/immich#24437)
- fix(web): timeline multi select group state by [@michelheusschen](https://github.com/michelheusschen) in [#26180](immich-app/immich#26180)
- fix(web): add checkerboard background for transparent images by [@agent-steven](https://github.com/agent-steven) in [#26091](immich-app/immich#26091)
- fix(mobile): inherit toolbar opacity by [@uhthomas](https://github.com/uhthomas) in [#25694](immich-app/immich#25694)
- fix(web): focus tag input when modal opens by [@michelheusschen](https://github.com/michelheusschen) in [#26256](immich-app/immich#26256)
- fix(web): clear face boxes when switching assets by [@michelheusschen](https://github.com/michelheusschen) in [#26249](immich-app/immich#26249)
- fix(web): clear unsaved asset description when changing asset by [@michelheusschen](https://github.com/michelheusschen) in [#26255](immich-app/immich#26255)
- fix(web): clear cache when asset changes by [@michelheusschen](https://github.com/michelheusschen) in [#26257](immich-app/immich#26257)
- fix: utc time zone upserts by [@danieldietzler](https://github.com/danieldietzler) in [#26258](immich-app/immich#26258)
- fix: metadata crash by [@jrasm91](https://github.com/jrasm91) in [#26327](immich-app/immich#26327)
- fix: prevent server crash when extraction of metadata fails if the assets are corrupted by [@Devansh-Jani](https://github.com/Devansh-Jani) in [#26042](immich-app/immich#26042)
- fix(server): db restore failure when `DB_URL` is set to unix-domain socket connection by [@fabio-garavini](https://github.com/fabio-garavini) in [#26252](immich-app/immich#26252)
- fix: Download the edited version when downloading multiple photos by [@MontejoJorge](https://github.com/MontejoJorge) in [#26259](immich-app/immich#26259)
- fix: include `DROP INDEX` in transaction to prevent missing index on rollback by [@haoxi911](https://github.com/haoxi911) in [#25399](immich-app/immich#25399)
- fix: safari address bar color by [@jrasm91](https://github.com/jrasm91) in [#26346](immich-app/immich#26346)
- fix(web): prevent panorama image reload during asset updates by [@michelheusschen](https://github.com/michelheusschen) in [#26349](immich-app/immich#26349)
- fix(web): favoriting assets opened via GalleryViewer by [@michelheusschen](https://github.com/michelheusschen) in [#26350](immich-app/immich#26350)
- fix(i18n): add translation key for partner's photos by [@timonrieger](https://github.com/timonrieger) in [#26348](immich-app/immich#26348)
- fix(web): single select scroll behavior by [@timonrieger](https://github.com/timonrieger) in [#26358](immich-app/immich#26358)
- perf: add indexes to improve People API response times by [@bxtdvd](https://github.com/bxtdvd) in [#26337](immich-app/immich#26337)
- fix: pin code reset modal by [@jrasm91](https://github.com/jrasm91) in [#26370](immich-app/immich#26370)
- fix(mobile): Reset "People" search filter chip if no selections are made by [@benjamonnguyen](https://github.com/benjamonnguyen) in [#26267](immich-app/immich#26267)
- fix(cli): delete sidecar files after upload if requested by [@timonrieger](https://github.com/timonrieger) in [#26353](immich-app/immich#26353)
- fix(web): album description auto height by [@michelheusschen](https://github.com/michelheusschen) in [#26420](immich-app/immich#26420)
- fix(web): prevent side panel overlap during transition by [@michelheusschen](https://github.com/michelheusschen) in [#26398](immich-app/immich#26398)
- fix(web): storage template example by [@mmomjian](https://github.com/mmomjian) in [#26424](immich-app/immich#26424)
- fix(web): prevent `state_unsafe_mutation` error on people page by [@michelheusschen](https://github.com/michelheusschen) in [#26438](immich-app/immich#26438)
- fix: missing deletedAt and isVisible columns on mobile by [@bwees](https://github.com/bwees) in [#26414](immich-app/immich#26414)
- fix(mobile): joinLocal on archived timeline by [@YarosMallorca](https://github.com/YarosMallorca) in [#26387](immich-app/immich#26387)
- fix: always show library scan button by [@etnoy](https://github.com/etnoy) in [#26428](immich-app/immich#26428)
- fix: retain asset when either asset is a favorite by [@shenlong-tanwen](https://github.com/shenlong-tanwen) in [#26473](immich-app/immich#26473)
- fix(web): prevent null folder tree on concurrent load by [@michelheusschen](https://github.com/michelheusschen) in [#26489](immich-app/immich#26489)
- fix(web): toast warning when trying to upload unsupported file type by [@meesfrensel](https://github.com/meesfrensel) in [#26492](immich-app/immich#26492)
- fix(mobile): birthday picker shows limited months when no date exists by [@socksprox](https://github.com/socksprox) in [#26407](immich-app/immich#26407)
- fix: consider DAR when extracting video dimension by [@alextran1502](https://github.com/alextran1502) in [#25293](immich-app/immich#25293)
- feat(mobile): Prevent premature image cache eviction when higher image loading is enabled by [@LeLunZ](https://github.com/LeLunZ) in [#26208](immich-app/immich#26208)
- refactor: star rating by [@meesfrensel](https://github.com/meesfrensel) in [#26357](immich-app/immich#26357)
- fix(mobile): set correct initial system-ui mode in asset viewer by [@goalie2002](https://github.com/goalie2002) in [#26500](immich-app/immich#26500)
- fix(server): Live Photo migration bug when album is in template by [@NikhilAlapati](https://github.com/NikhilAlapati) in [#25329](immich-app/immich#25329)
- fix(web): handle delete shortcut on shared link page as remove by [@meesfrensel](https://github.com/meesfrensel) in [#26552](immich-app/immich#26552)
- fix(mobile): prevent video player from being recreated unnecessarily by [@uhthomas](https://github.com/uhthomas) in [#26553](immich-app/immich#26553)
- fix(mobile): don't cut off top corners of app bar by [@uhthomas](https://github.com/uhthomas) in [#26550](immich-app/immich#26550)
- feat: update onnxruntime-openvino to 1.24.1 and intel drivers by [@savely-krasovsky](https://github.com/savely-krasovsky) in [#26565](immich-app/immich#26565)
- fix: hide download action for local/merged assets by [@YarosMallorca](https://github.com/YarosMallorca) in [#26461](immich-app/immich#26461)
- fix(web): top bar z index on search page by [@YarosMallorca](https://github.com/YarosMallorca) in [#26582](immich-app/immich#26582)
- fix(web): show shared link download button when logged in by [@Snowknight26](https://github.com/Snowknight26) in [#26629](immich-app/immich#26629)
- fix(mobile): asset viewer hero animation by [@uhthomas](https://github.com/uhthomas) in [#26545](immich-app/immich#26545)
- fix(web): timeline and asset viewer RTL support by [@meesfrensel](https://github.com/meesfrensel) in [#26513](immich-app/immich#26513)
- fix(server): clean up edited thumbnail when deleting asset by [@michelheusschen](https://github.com/michelheusschen) in [#26664](immich-app/immich#26664)
- fix: implement existing withStacked on searchAssetBuilder by [@babbitt](https://github.com/babbitt) in [#26607](immich-app/immich#26607)
- fix(mobile): video state by [@uhthomas](https://github.com/uhthomas) in [#26574](immich-app/immich#26574)
- fix(maintenance mode): wait for valid server config on restart by [@insertish](https://github.com/insertish) in [#26456](immich-app/immich#26456)
- fix(web): inconsistent asset nav bar state after visiting shared link by [@Snowknight26](https://github.com/Snowknight26) in [#26674](immich-app/immich#26674)
- fix(web): download toast showing wrong filename for motion assets by [@Snowknight26](https://github.com/Snowknight26) in [#26689](immich-app/immich#26689)
- fix(mobile): add safe area for asset details by [@uhthomas](https://github.com/uhthomas) in [#26675](immich-app/immich#26675)
- fix(web): combobox dropdown positioning in modals by [@michelheusschen](https://github.com/michelheusschen) in [#26707](immich-app/immich#26707)
- fix(web): video stealing focus when it plays again when looping by [@Snowknight26](https://github.com/Snowknight26) in [#26704](immich-app/immich#26704)
- fix(ml): batch size setting by [@mertalev](https://github.com/mertalev) in [#26524](immich-app/immich#26524)
- fix(server): clarify transcoding bitrate policy by [@meesfrensel](https://github.com/meesfrensel) in [#26711](immich-app/immich#26711)
- fix: playback style migration by [@alextran1502](https://github.com/alextran1502) in [#26718](immich-app/immich#26718)
- fix(web): asset viewer showing wrong viewer type when hovering on stack thumbnails by [@Snowknight26](https://github.com/Snowknight26) in [#26741](immich-app/immich#26741)
- fix(server): opus handling as accepted audio codec in transcode policy by [@skatsubo](https://github.com/skatsubo) in [#26736](immich-app/immich#26736)
- fix(web): refresh recent albums sidebar after album changes by [@michelheusschen](https://github.com/michelheusschen) in [#26757](immich-app/immich#26757)
- fix(web): show the correct cursor at crop bounds when editing an asset by [@Snowknight26](https://github.com/Snowknight26) in [#26748](immich-app/immich#26748)
- fix(web): recalculate face bounding boxes by [@cratoo](https://github.com/cratoo) in [#26737](immich-app/immich#26737)
- fix(web): context menu overflow by [@SevereCloud](https://github.com/SevereCloud) in [#26760](immich-app/immich#26760)
- fix(web): correct tag rounding in search options by [@michelheusschen](https://github.com/michelheusschen) in [#26814](immich-app/immich#26814)
- fix(web): prevent unrelated assets from appearing in tag view by [@michelheusschen](https://github.com/michelheusschen) in [#26816](immich-app/immich#26816)
- fix(mobile): use tabular figures in backup page by [@uhthomas](https://github.com/uhthomas) in [#26830](immich-app/immich#26830)
- fix(mobile): wrap backup error message text by [@uhthomas](https://github.com/uhthomas) in [#26834](immich-app/immich#26834)
- fix(server): use correct day ordering in timeline buckets by [@michelheusschen](https://github.com/michelheusschen) in [#26821](immich-app/immich#26821)
- fix(web): face selection box position resetting on browser resize by [@Snowknight26](https://github.com/Snowknight26) in [#26766](immich-app/immich#26766)
- fix: use correct original URL for 360 video panorama playback by [@luis15pt](https://github.com/luis15pt) in [#26831](immich-app/immich#26831)
- fix(web): disable drag and drop for internal items by [@michelheusschen](https://github.com/michelheusschen) in [#26897](immich-app/immich#26897)
- fix(web): keep header fixed on individual shared links by [@michelheusschen](https://github.com/michelheusschen) in [#26892](immich-app/immich#26892)
- fix: SMTP over TLS by [@nathanielhourt](https://github.com/nathanielhourt) in [#26893](immich-app/immich#26893)
- fix(web): copy yearMonth in MonthGroup to avoid shared object reference with asset in [#26890](immich-app/immich#26890)
- fix(mobile): use shared auth for background\_downloader by [@mertalev](https://github.com/mertalev) in [#26911](immich-app/immich#26911)
- fix(web): prevent search page error on missing album filter by [@michelheusschen](https://github.com/michelheusschen) in [#26948](immich-app/immich#26948)
- fix(server): sync files to disk by [@uhthomas](https://github.com/uhthomas) in [#26881](immich-app/immich#26881)
- fix(web): jump to primary stacked asset from memory by [@michelheusschen](https://github.com/michelheusschen) in [#26978](immich-app/immich#26978)
- fix(mobile): reflect asset deletions instantly by [@uhthomas](https://github.com/uhthomas) in [#26835](immich-app/immich#26835)
- fix: healthcheck by [@jrasm91](https://github.com/jrasm91) in [#26989](immich-app/immich#26989)
- fix(web): escape handling for tagging and adding a face in asset viewer by [@cratoo](https://github.com/cratoo) in [#26870](immich-app/immich#26870)
- fix: filter after searching by asset id by [@jrasm91](https://github.com/jrasm91) in [#26994](immich-app/immich#26994)
- fix: bounding box return type by [@jrasm91](https://github.com/jrasm91) in [#27014](immich-app/immich#27014)
- fix: validate accept header before returning html by [@jrasm91](https://github.com/jrasm91) in [#27019](immich-app/immich#27019)

##### 📚 Documentation

- chore(docs): Update help channel for developers by [@Mraedis](https://github.com/Mraedis) in [#26284](immich-app/immich#26284)
- feat(docs): Explain configuration file location for Docker Compose by [@keunes](https://github.com/keunes) in [#24989](immich-app/immich#24989)
- chore(docs): add quick-start guide for DevPod with docker by [@dhlavaty](https://github.com/dhlavaty) in [#26213](immich-app/immich#26213)
- feat(docs): Adding information about parameter c= by [@aviv926](https://github.com/aviv926) in [#26430](immich-app/immich#26430)
- feat: doc links by [@jrasm91](https://github.com/jrasm91) in [#26519](immich-app/immich#26519)
- fix(docs): add ocr to job flow diagram by [@niij](https://github.com/niij) in [#26505](immich-app/immich#26505)

##### 🌐 Translations

- chore(web): update translations by [@weblate](https://github.com/weblate) in [#26118](immich-app/immich#26118)
- fix: clarify external domain setting is used for emails too by [@chrislongros](https://github.com/chrislongros) in [#26009](immich-app/immich#26009)
- chore(web): update translations by [@weblate](https://github.com/weblate) in [#26167](immich-app/immich#26167)
- fix(web): error page i18n by [@meesfrensel](https://github.com/meesfrensel) in [#26517](immich-app/immich#26517)
- chore(web): clarify locale settings description by [@meesfrensel](https://github.com/meesfrensel) in [#25562](immich-app/immich#25562)
- chore(web): update translations by [@weblate](https://github.com/weblate) in [#26192](immich-app/immich#26192)

##### New Contributors

- [@klenner1](https://github.com/klenner1) made their first contribution in [#26151](immich-app/immich#26151)
- [@bkchr](https://github.com/bkchr) made their first contribution in [#25088](immich-app/immich#25088)
- [@chrislongros](https://github.com/chrislongros) made their first contribution in [#26011](immich-app/immich#26011)
- [@agent-steven](https://github.com/agent-steven) made their first contribution in [#26091](immich-app/immich#26091)
- [@dhlavaty](https://github.com/dhlavaty) made their first contribution in [#26238](immich-app/immich#26238)
- [@Nacolis](https://github.com/Nacolis) made their first contribution in [#26063](immich-app/immich#26063)
- [@ewinnd](https://github.com/ewinnd) made their first contribution in [#26277](immich-app/immich#26277)
- [@dnozay](https://github.com/dnozay) made their first contribution in [#26261](immich-app/immich#26261)
- [@keunes](https://github.com/keunes) made their first contribution in [#24989](immich-app/immich#24989)
- [@Devansh-Jani](https://github.com/Devansh-Jani) made their first contribution in [#26042](immich-app/immich#26042)
- [@benjamonnguyen](https://github.com/benjamonnguyen) made their first contribution in [#26196](immich-app/immich#26196)
- [@fabio-garavini](https://github.com/fabio-garavini) made their first contribution in [#26252](immich-app/immich#26252)
- [@haoxi911](https://github.com/haoxi911) made their first contribution in [#25399](immich-app/immich#25399)
- [@thezeroalpha](https://github.com/thezeroalpha) made their first contribution in [#20286](immich-app/immich#20286)
- [@socksprox](https://github.com/socksprox) made their first contribution in [#26407](immich-app/immich#26407)
- [@kprinssu](https://github.com/kprinssu) made their first contribution in [#26178](immich-app/immich#26178)
- [@babbitt](https://github.com/babbitt) made their first contribution in [#26607](immich-app/immich#26607)
- [@niij](https://github.com/niij) made their first contribution in [#26505](immich-app/immich#26505)
- [@cratoo](https://github.com/cratoo) made their first contribution in [#26667](immich-app/immich#26667)
- [@M123-dev](https://github.com/M123-dev) made their first contribution in [#26630](immich-app/immich#26630)
- [@apejcic](https://github.com/apejcic) made their first contribution in [#22948](immich-app/immich#22948)
- [@SevereCloud](https://github.com/SevereCloud) made their first contribution in [#26760](immich-app/immich#26760)
- [@brendanngo](https://github.com/brendanngo) made their first contribution in [#26833](immich-app/immich#26833)
- [@luis15pt](https://github.com/luis15pt) made their first contribution in [#26831](immich-app/immich#26831)
- [@nathanielhourt](https://github.com/nathanielhourt) made their first contribution in [#26893](immich-app/immich#26893)
- [@Belnadifia](https://github.com/Belnadifia) made their first contribution in [#26717](immich-app/immich#26717)
- [@pressslav](https://github.com/pressslav) made their first contribution in [#26944](immich-app/immich#26944)

**Full Changelog**: <immich-app/immich@v2.5.6...v2.6.0>
okxint pushed a commit to okxint/immich that referenced this pull request Mar 24, 2026
Ensure that all files are flushed after they've been written.

At current, files are not explicitly flushed to disk, which can cause
data corruption. In extreme circumstances, it's possible that uploaded
files may not ever be persisted at all.
@ReanimationXP
Copy link

I have to say, reading this thread and the back and forth is very concerning to me and is continuing to shake my already-shaken confidence in using Immich as a backup platform. The existence of the "clear up space" feature alone should completely nullify arguments that Immich has client-side originals to check against. Assuming such a thing is insane. I want to give a massive thank you to @uhthomas for continuing to reply and insisting that this be done correctly. I absolutely do not care if it took 300% the amount of backup time, data integrity is absolutely, positively, required full stop, or I will not be using the product. I can't believe there was even pushback on this over performance of all things. If anything, you should be focusing on integrity first and worrying about optimizations later. Users are trusting you with what is arguably their most important data - their precious memories, and when backing up a huge library we should NOT be having to spot check that the app did what it claims to do. For most people like me with massive libraries it's impossible or impractical to check that the app is doing backups correctly unless it reports a failure to me. All I have to say here is wow @ the project leaders, and a massive thank you to @uhthomas. You may not have intended for your arguments to come across as refusal or pushback, but I don't see how weighing performance against data integrity at all can be interpreted any other way.

@platima
Copy link

platima commented Mar 27, 2026

Well said @ReanimationXP - seconded, and kudos.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

9 participants