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.
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 newimmich-admincommand- 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.
Pick album cover (mobile)
Users can now pick a new album cover directly from the mobile app.
540300751-58fc1937-aed8-40b8-869c-9cb47c1d40c2.mov
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.
shasre-slug.mp4
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.
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
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
ScreenRecording_03-19-2026_15-37-19_1.mov
After
ScreenRecording_03-19-2026.14-23-44_1.mp4
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.
screen-20260224-231550-1771974915747.2.mp4
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 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
If you find the project helpful, you can support Immich by purchasing a product key at https://buy.immich.app or our merchandise at https://immich.store
What's Changed
🔒 Security
- fix(server): restrict individual shared link asset removal to owners by @michelheusschen in #26868
- fix: add to shared link by @jrasm91 in #26886
🚀 Features
- feat: shared link login by @jrasm91 in #25678
- feat: schema-check by @jrasm91 in #25904
- feat: add people deeplink by @arne182 in #25686
- feat(mobile): inline asset details by @uhthomas in #25952
- feat(mobile): filter by tags by @benjamonnguyen in #26196
- feat: add .mxf file support by @timonrieger in #24644
- feat: tap to see next/previous image by @thezeroalpha in #20286
- feat(mobile): Allow users to set album cover from mobile app by @timonrieger in #25515
- feat(mobile): Allow users to set profile picture from asset viewer by @timonrieger in #25517
- feat: ROCm 7.2 and MIGraphX support by @kprinssu in #26178
- feat(web): map timeline sidepanel by @michelheusschen in #26532
- feat: add responsive layout to broken asset by @midzelis in #26384
- feat(web): toggle zoom on double-click in photo viewer by @midzelis in #26732
- feat(mobile): show animated images in asset viewer by @LeLunZ in #26614
- feat(mobile): open in browser by @YarosMallorca in #26369
🌟 Enhancements
- feat: verify permissions by @jrasm91 in #25647
- feat(web): change link expiration logic & presets by @YarosMallorca in #26064
- feat(mobile): dynamic layout in new timeline by @shenlong-tanwen in #23837
- feat(cli): change progress bar to display file size by @Nykri in #23328
- feat(mobile): dynamic multi-line album name by @uhthomas in #26040
- feat(mobile): hide search by context/OCR if disabled on server (#25472) by @Nacolis in #26063
- fix(release): add docker-compose.rootless.yml to released assets by @dnozay in #26261
- feat(web): show ocr text boxes in panoramas by @meesfrensel in #25727
- feat(web): loop chromecast video by @etnoy in #24410
- chore(web): merge "Add to album" and "Add to shared album" actions into a single action by @timonrieger in #24669
- feat(mobile): timeline - add bottomWidgetBuilder by @PeterOmbodi in #25634
- feat(mobile): video zooming in asset viewer by @goalie2002 in #22036
- feat(mobile): Add slug support for shared links by @Lauritz-Tieste in #26441
- feat: warn when losing transparency during thumbnail generation by @midzelis in #26243
- perf(mobile): optimized album sorting by @YarosMallorca in #25179
- feat(mobile): prompt when deleting from trash by @YarosMallorca in #26392
- feat: getAssetEdits respond with edit IDs by @bwees in #26445
- fix(server): accept showAt and hideAt for creating memories by @meesfrensel in #26429
- feat(server): SyncAssetEditV1 by @bwees in #26446
- feat: splash screen error page by @shenlong-tanwen in #26460
- feat(mobile): add confirmation dialog to permanent delete action by @ByteSizedMarius in #26442
- feat: enhance face-editor positioning by @midzelis in #26303
- feat: improve HEIC, HEIF and JPEG XL browser support detection by @nicosemp in #26122
- refactor(web): remove replaceAsset action by @timonrieger in #26444
- feat(web): bounding box for faces when hovering over the face in photo view by @cratoo in #26667
- feat(mobile): keep search results visible by @uhthomas in #26498
- feat(mobile): use shared native client by @mertalev in #25942
- feat(mobile): SyncAssetEditV1 by @bwees in #26518
- feat(ml): enable openvino for cpu by @apejcic in #22948
- feat: responsive video duration in thumbnail by @midzelis in #26770
- feat(web): animate zoom toggle with cubicOut easing by @midzelis in #26731
- feat(mobile): consolidate video controls by @uhthomas in #26673
- feat(web): add shortcut "p" to open/close the face tag box by @cratoo in #26826
- feat(mobile): use material design 3 slider by @uhthomas in #26829
- feat: adaptive progressive image loading for photo viewer by @midzelis in #26636
- fix(server): extract make/model from sony video files by @brendanngo in #26833
- chore(mobile): remove background from asset viewer back button by @uhthomas in #26851
- feat(server): support IDPs that only send the userinfo in the ID token by @Belnadifia in #26717
- feat(web): improve OCR overlay text fitting, reactivity, and accessibility by @midzelis in #26678
- fix(web): allow pasting PIN code from clipboard or password manager by @pressslav in #26944
🐛 Bug fixes
- fix: ignore checksum constraint error when logging by @jrasm91 in #26113
- fix(web): use locale for date picker by @michelheusschen in #26125
- fix(web): escape shortcut handling by @michelheusschen in #26096
- fix(mobile): Login routing on Splash screen by @PeterOmbodi in #26128
- fix: null local date time in timeline queries by @shenlong-tanwen in #26133
- fix(web): prevent event manager from throwing error by @michelheusschen in #26156
- fix(web): improve api key modal responsiveness by @klenner1 in #26151
- fix(web): show correct assets in memory gallery by @michelheusschen in #26157
- fix(web): add missing @immich/ui translations by @michelheusschen in #26143
- fix(mobile): timeline handling on foldable phones + ensuring that images are not cut off by @bkchr in #25088
- fix(mobile): prevent nav bar label text wrapping by @chrislongros in #26011
- fix(mobile): hide latest version warnings by @uhthomas in #26036
- fix(mobile): inconsistent query for people by @YarosMallorca in #24437
- fix(web): timeline multi select group state by @michelheusschen in #26180
- fix(web): add checkerboard background for transparent images by @agent-steven in #26091
- fix(mobile): inherit toolbar opacity by @uhthomas in #25694
- fix(web): focus tag input when modal opens by @michelheusschen in #26256
- fix(web): clear face boxes when switching assets by @michelheusschen in #26249
- fix(web): clear unsaved asset description when changing asset by @michelheusschen in #26255
- fix(web): clear cache when asset changes by @michelheusschen in #26257
- fix: utc time zone upserts by @danieldietzler in #26258
- fix: metadata crash by @jrasm91 in #26327
- fix: prevent server crash when extraction of metadata fails if the assets are corrupted by @Devansh-Jani in #26042
- fix(server): db restore failure when
DB_URLis set to unix-domain socket connection by @fabio-garavini in #26252 - fix: Download the edited version when downloading multiple photos by @MontejoJorge in #26259
- fix: include
DROP INDEXin transaction to prevent missing index on rollback by @haoxi911 in #25399 - fix: safari address bar color by @jrasm91 in #26346
- fix(web): prevent panorama image reload during asset updates by @michelheusschen in #26349
- fix(web): favoriting assets opened via GalleryViewer by @michelheusschen in #26350
- fix(i18n): add translation key for partner's photos by @timonrieger in #26348
- fix(web): single select scroll behavior by @timonrieger in #26358
- perf: add indexes to improve People API response times by @bxtdvd in #26337
- fix: pin code reset modal by @jrasm91 in #26370
- fix(mobile): Reset "People" search filter chip if no selections are made by @benjamonnguyen in #26267
- fix(cli): delete sidecar files after upload if requested by @timonrieger in #26353
- fix(web): album description auto height by @michelheusschen in #26420
- fix(web): prevent side panel overlap during transition by @michelheusschen in #26398
- fix(web): storage template example by @mmomjian in #26424
- fix(web): prevent
state_unsafe_mutationerror on people page by @michelheusschen in #26438 - fix: missing deletedAt and isVisible columns on mobile by @bwees in #26414
- fix(mobile): joinLocal on archived timeline by @YarosMallorca in #26387
- fix: always show library scan button by @etnoy in #26428
- fix: retain asset when either asset is a favorite by @shenlong-tanwen in #26473
- fix(web): prevent null folder tree on concurrent load by @michelheusschen in #26489
- fix(web): toast warning when trying to upload unsupported file type by @meesfrensel in #26492
- fix(mobile): birthday picker shows limited months when no date exists by @socksprox in #26407
- fix: consider DAR when extracting video dimension by @alextran1502 in #25293
- feat(mobile): Prevent premature image cache eviction when higher image loading is enabled by @LeLunZ in #26208
- refactor: star rating by @meesfrensel in #26357
- fix(mobile): set correct initial system-ui mode in asset viewer by @goalie2002 in #26500
- fix(server): Live Photo migration bug when album is in template by @NikhilAlapati in #25329
- fix(web): handle delete shortcut on shared link page as remove by @meesfrensel in #26552
- fix(mobile): prevent video player from being recreated unnecessarily by @uhthomas in #26553
- fix(mobile): don't cut off top corners of app bar by @uhthomas in #26550
- feat: update onnxruntime-openvino to 1.24.1 and intel drivers by @savely-krasovsky in #26565
- fix: hide download action for local/merged assets by @YarosMallorca in #26461
- fix(web): top bar z index on search page by @YarosMallorca in #26582
- fix(web): show shared link download button when logged in by @Snowknight26 in #26629
- fix(mobile): asset viewer hero animation by @uhthomas in #26545
- fix(web): timeline and asset viewer RTL support by @meesfrensel in #26513
- fix(server): clean up edited thumbnail when deleting asset by @michelheusschen in #26664
- fix: implement existing withStacked on searchAssetBuilder by @babbitt in #26607
- fix(mobile): video state by @uhthomas in #26574
- fix(maintenance mode): wait for valid server config on restart by @insertish in #26456
- fix(web): inconsistent asset nav bar state after visiting shared link by @Snowknight26 in #26674
- fix(web): download toast showing wrong filename for motion assets by @Snowknight26 in #26689
- fix(mobile): add safe area for asset details by @uhthomas in #26675
- fix(web): combobox dropdown positioning in modals by @michelheusschen in #26707
- fix(web): video stealing focus when it plays again when looping by @Snowknight26 in #26704
- fix(ml): batch size setting by @mertalev in #26524
- fix(server): clarify transcoding bitrate policy by @meesfrensel in #26711
- fix: playback style migration by @alextran1502 in #26718
- fix(web): asset viewer showing wrong viewer type when hovering on stack thumbnails by @Snowknight26 in #26741
- fix(server): opus handling as accepted audio codec in transcode policy by @skatsubo in #26736
- fix(web): refresh recent albums sidebar after album changes by @michelheusschen in #26757
- fix(web): show the correct cursor at crop bounds when editing an asset by @Snowknight26 in #26748
- fix(web): recalculate face bounding boxes by @cratoo in #26737
- fix(web): context menu overflow by @SevereCloud in #26760
- fix(web): correct tag rounding in search options by @michelheusschen in #26814
- fix(web): prevent unrelated assets from appearing in tag view by @michelheusschen in #26816
- fix(mobile): use tabular figures in backup page by @uhthomas in #26830
- fix(mobile): wrap backup error message text by @uhthomas in #26834
- fix(server): use correct day ordering in timeline buckets by @michelheusschen in #26821
- fix(web): face selection box position resetting on browser resize by @Snowknight26 in #26766
- fix: use correct original URL for 360 video panorama playback by @luis15pt in #26831
- fix(web): disable drag and drop for internal items by @michelheusschen in #26897
- fix(web): keep header fixed on individual shared links by @michelheusschen in #26892
- fix: SMTP over TLS by @nathanielhourt in #26893
- fix(web): copy yearMonth in MonthGroup to avoid shared object reference with asset in #26890
- fix(mobile): use shared auth for background_downloader by @mertalev in #26911
- fix(web): prevent search page error on missing album filter by @michelheusschen in #26948
- fix(server): sync files to disk by @uhthomas in #26881
- fix(web): jump to primary stacked asset from memory by @michelheusschen in #26978
- fix(mobile): reflect asset deletions instantly by @uhthomas in #26835
- fix: healthcheck by @jrasm91 in #26989
- fix(web): escape handling for tagging and adding a face in asset viewer by @cratoo in #26870
- fix: filter after searching by asset id by @jrasm91 in #26994
- fix: bounding box return type by @jrasm91 in #27014
- fix: validate accept header before returning html by @jrasm91 in #27019
📚 Documentation
- chore(docs): Update help channel for developers by @Mraedis in #26284
- feat(docs): Explain configuration file location for Docker Compose by @keunes in #24989
- chore(docs): add quick-start guide for DevPod with docker by @dhlavaty in #26213
- feat(docs): Adding information about parameter c= by @aviv926 in #26430
- feat: doc links by @jrasm91 in #26519
- fix(docs): add ocr to job flow diagram by @niij in #26505
🌐 Translations
- chore(web): update translations by @weblate in #26118
- fix: clarify external domain setting is used for emails too by @chrislongros in #26009
- chore(web): update translations by @weblate in #26167
- fix(web): error page i18n by @meesfrensel in #26517
- chore(web): clarify locale settings description by @meesfrensel in #25562
- chore(web): update translations by @weblate in #26192
New Contributors
- @klenner1 made their first contribution in #26151
- @bkchr made their first contribution in #25088
- @chrislongros made their first contribution in #26011
- @agent-steven made their first contribution in #26091
- @dhlavaty made their first contribution in #26238
- @Nacolis made their first contribution in #26063
- @ewinnd made their first contribution in #26277
- @dnozay made their first contribution in #26261
- @keunes made their first contribution in #24989
- @Devansh-Jani made their first contribution in #26042
- @benjamonnguyen made their first contribution in #26196
- @fabio-garavini made their first contribution in #26252
- @haoxi911 made their first contribution in #25399
- @thezeroalpha made their first contribution in #20286
- @socksprox made their first contribution in #26407
- @kprinssu made their first contribution in #26178
- @babbitt made their first contribution in #26607
- @niij made their first contribution in #26505
- @cratoo made their first contribution in #26667
- @M123-dev made their first contribution in #26630
- @apejcic made their first contribution in #22948
- @SevereCloud made their first contribution in #26760
- @brendanngo made their first contribution in #26833
- @luis15pt made their first contribution in #26831
- @nathanielhourt made their first contribution in #26893
- @Belnadifia made their first contribution in #26717
- @pressslav made their first contribution in #26944
Full Changelog: v2.5.6...v2.6.0