Immich v3.0.0 Released
摘要
文章宣布 Immich v3.0.0 正式发布,包含多个破坏性变更(主要为 API 端点更新,影响第三方集成),并提供迁移指南和更新步骤(需修改 .env 中的版本并运行更新命令)。亮点功能包括:移动端非破坏性编辑(支持裁剪、旋转等,与网页版一致)、Workflows 预览(拖拽式自动化构建器,支持视觉和 JSON 编辑)、Android 后台备份改进(支持全库上传并更好兼容系统限制)、新增 Recently Added 页面、完整性检查报告(检测未跟踪、缺失和校验和不匹配文件)、移动端幻灯片、HLS 实时视频转码预览(网页端支持质量切换等)、新网页视频播放器、Android 作为图库应用打开照片、移动端 OCR 支持、直接上传至相册、分享时可选图像尺寸、时间线性能优化(处理大量资产时更流畅)。另提及商品销售和支持方式。
荐读理由
v3.0.0 引入移动端非破坏性编辑、HLS 实时转码预览、图片完整性检查、最近添加页、后台备份改进和 OCR 等工具。这些变化直接提供 AI 工程中移动端编辑、视频流传输和数据完整性维护的具体实现,适合快速验证并迁移到项目。
原文
v3.0.0
Welcome to Immich v3.0.0!
After months of hard work from the team and our amazing contributors, we're thrilled to announce the next major version of Immich: v3.0.0! 🎉
Breaking changes
This release includes several breaking changes; read the full migration guide here. It's worth mentioning that many of the breaking changes are updates to API endpoints and affect only third-party tools that integrate with Immich's API. For the vast majority of users, updating works exactly as it always has.
How to update
Warning
v3.0.0 drops support for pgvecto.rs. If you run Immich before v1.133.0 and haven't done the migration step yet, see the migration guide here. https://docs.immich.app/install/upgrading/#migrating-to-vectorchord
First, update the IMMICH_VERSION in your .env file to v3:
- IMMICH_VERSION=v2
+ IMMICH_VERSION=v3
Then run the usual update commands:
docker compose pull && docker compose up -d
Release candidates
If you missed it, v3.0.0 was the first time we used release candidates, also known as prereleases. Release candidates are tested but not yet official releases of Immich, and they allow us to find and fix any outstanding bugs before a final release. If you would like to be notified about release candidates directly through Immich, you can change the release channel from "Stable" to "Release candidate" in the Admin settings > Version check options (here).
New Merch
As part of this release, we're happy to announce we also have some new swag for you!
Kids clothing: For those who are likely the reason for your Immich library's size
Colored embroidery: We now have clothes with a full color embroidered Immich logo
Check it out now at https://immich.store!
Highlights
Now, let's get right into all the new features in this release:
Mobile non-destructive editing
Workflows (preview)
Background backup improvement
Recently added page
Integrity checks
Slideshow on mobile app
HLS and real-time video transcoding (preview)
New video player for web
Open photo in Immich as gallery on Android
OCR on mobile app
Upload asset directly to album on the mobile app
Option to select image size when sharing on the mobile app
Timeline performance improvement for browsing a large amount of assets in a single month
Mobile non-destructive editing
This is a follow-up to Image Editing on the web, which was released in v2.5.0. This feature allows you to make non-destructive edits to your photos inside of Immich. Until now, the mobile editor used a completely different system that created new assets instead of editing the photo in place.
With this update, we bring a new, easier-to-use editor to mobile devices that has the same features as the web version. You can now edit photos directly in the mobile app, including cropping, rotating, and adjusting your images without ever touching the original file. Similar to the web, edits are non-destructive, so you can revisit or revert them at any time. You can even make edits on mobile and then adjust them on the web later!
Some features from the previous mobile editing implementation have been removed including:
Recoloring photos
Editing live photos
Editing local assets
We have plans to bring some of these capabilities back in future releases.
Workflows (preview)
The first preview of Workflows is here! Workflows let you automate actions in your library by chaining triggers, filters, and actions together with a drag-and-drop builder. This is the foundation for many exciting automations to come, and we'd love your feedback as we continue building on it.
You can access the feature from Utilities > Workflows on the web.
From there, you can either create a new blank workflow or browse the premade templates to get a basic understanding of how workflows can be used.
Workflows editor
In the workflows editor, you can switch between the Visual or JSON editor. The visual editor is nice for building out the workflow; the JSON editor is nice for sharing and receiving workflow content from others.
In each workflow, there is a trigger and a sequence of steps.
Trigger: this is the entry point of each workflow; when the trigger occurs, the steps are evaluated.
Steps: they include Filters (conditions) and Actions (effects); they can be combined to produce the desired effect of the use case you aim for.
Sharing a workflow
You can share the workflow you made with others in two ways: text and JSON. Text is nice for sharing on a forum or for show-and-tell content. JSON is nice for others to make an exact copy of your workflow's configuration.
You can copy the text in the workflows summary panel on the lower right of the screen
You can share the JSON content from the copy workflows button in the app bar, switch to the JSON editor, or use the Show schema button in the context menu in the workflows list
Note
Please use this discussion thread to propose new ideas of triggers and actions. We are looking for extensive feedback and suggestions from you all.
Background backup improvements
Background backup on Android is now significantly more reliable. Previously, the background backup on Android was limited to newly taken photos. Now, the app uses a new periodic task scheduler, which allows you to upload your entire library in the background, and it plays nicer with Android's background execution limits, properly cleans up tasks, and warns you when battery optimization and notification settings might interfere with backups.
On iOS, the background refresh task now runs its sync and upload work in parallel, so uploads actually start within the short time window iOS allows.
Recently added page
A new "Recently Added" page on the web and mobile lets you browse your library sorted by when assets were added to Immich, rather than when they were taken. This makes it easier to find what's new when browsing a new batch of imports. You can find the new page in the "Explore" tab on the web and in the "Search" tab on mobile.
Integrity checks
The maintenance page has gotten a new addition: integrity reports! Immich will scan its directories on your file system, and compare it to what it has stored in its database. If there are deviations, they will be surfaced as
untracked, if there is a file in Immich's directories that Immich does not know of
missing, if Immich references a file in its database that does not exist in that place (anymore)
a checksum mismatch, if the checksum of the file on disk does not match the checksum Immich has stored for that file. Typically, this would happen through file corruption but could also be the result of a bad rename.
You can configure when and how long the job runs each night.
Slideshow (mobile)
The slideshow experience comes to mobile! You can now sit back and let your photos and videos play across the screen, just like on the web.
HLS and Real-Time Video transcoding (preview)
Immich can now transcode videos on-the-fly without needing to generate offline transcodes. This has been a long-requested feature with many benefits:
Quality switching (both manual and automatic)
Transcoding to the best codecs supported by the client
Lower storage overhead when offline transcoding is disabled
HDR for compatible clients (not implemented yet)
Remuxing rather than transcoding the original when bandwidth allows it (not implemented yet)
Please note that this feature is still experimental and can change behavior from version to version. It's currently only implemented in the web app, with the mobile app implementation in progress.
To enable real-time transcoding, go to the video transcoding settings (scroll down). Offline transcoding isn't directly affected by enabling it, so if you'd like to disable offline transcoding, you should also adjust the transcode policy.
Note
For assets imported prior to v3, you will also need to re-run Metadata Extraction in the job panel for them to be re-processed.
Keep in mind that your server needs to be powerful enough to transcode in real-time for this feature to work well. Hardware acceleration is recommended, but not required, when using this feature.
New video player for web
A new custom video player on the web app ensures all your devices share the same controls and layout, matching the Immich design. Some basic functions, like changing the playback rate, are available. This should also fix a lot of the problems on iOS, where the OS's controls are hidden behind the Immich navbar.
Open photos in Immich as a gallery on Android
Immich can now act as a gallery/image viewer app on Android. Tap a photo or video in another app, choose Immich, and it opens directly in the asset viewer with options to share the file or upload it to your library.
This is the first iteration of the feature, and refinements to how Immich recognizes files that are already in your library are on the way
OCR on the mobile app
The asset viewer now has a toggle that highlights recognized text in a photo, and you can select and copy it directly from the image.
Upload assets directly to an album on mobile
You can now upload local photos directly to an album in the mobile app, including from the asset bottom sheet, instead of uploading first and organizing later. A small change that removes a lot of friction from the backup-and-organize flow.
Select image size when sharing on mobile
When sharing photos from the mobile app, you can now choose the image size before sending; it is handy for keeping shared files small for messaging apps while preserving the option to share at full quality when needed.
You can change the default behavior in the App Settings > Preferences
You can also pick the option when sharing on-the-fly by long pressing the Share button
Timeline performance Improvements
Browsing months with a large number of assets is now dramatically smoother and prevents the browser tab from locking up when your instance encounters that scenario.
Support Immich
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
🚨 Breaking Changes
refactor!: migrate class-validator to zod by @timonrieger in refactor!: migrate class-validator to zod #26597
refactor!: remove replace asset by @jrasm91 in refactor!: remove replace asset #27022
refactor!: remove my shared link dto by @jrasm91 in refactor!: remove my shared link dto #27023
chore!: remove deprecated env variables by @jrasm91 in chore!: remove deprecated env variables #27802
chore!: remove getRandom api endpoint by @bwees in chore!: remove getRandom api endpoint #27780
chore!: remove unused token response param by @jrasm91 in chore!: remove unused token response param #27805
refactor: yeet old timeline by @shenlong-tanwen in refactor: yeet old timeline #27666
chore!: remove old timeline sync endpoints by @jrasm91 in chore!: remove old timeline sync endpoints #27804
chore!: remove deviceId and deviceAssetId by @danieldietzler in chore!: remove deviceId and deviceAssetId #27818
chore!: rename API key schemas by @jrasm91 in chore!: rename API key schemas #27828
chore!: remove without assets by @jrasm91 in chore!: remove without assets #27835
fix: oauth issuerUrl validation by @bo0tzz in fix: oauth issuerUrl validation #27848
fix!: do not allow insecure oauth requests by default by @bo0tzz in fix!: do not allow insecure oauth requests by default #27844
fix!: set duration to null when not present by @meesfrensel in fix!: set duration to null when not present #26982
chore!: remove /api/server/theme endpoint by @jrasm91 in chore!: remove /api/server/theme endpoint #27880
chore!: migrate album owner to album_user by @danieldietzler in chore!: migrate album owner to album_user #27467
refactor!: change number to integer types by @timonrieger in refactor!: change number to integer types #27912
refactor(server)!: move correlationId to X-Correlation-ID response header by @timonrieger in refactor(server)!: move correlationId to X-Correlation-ID response header #28139
refactor(server)!: remove redundant error and statusCode fields from error responses by @timonrieger in refactor(server)!: remove redundant error and statusCode fields from error responses #28140
chore(server)!: drop pgvecto.rs support by @mertalev in chore(server)!: drop pgvecto.rs support #28159
chore!: duration in milliseconds by @mertalev in chore!: duration in milliseconds #28003
refactor(server)!: sanitize error messages to avoid leaking resource details by @timonrieger in refactor(server)!: sanitize error messages to avoid leaking resource details #28154
refactor(server)!: structured validation error responses by @timonrieger in refactor(server)!: structured validation error responses #28204
feat(server)!: add isOwned filter to albums API by @timonrieger in feat(server)!: add isOwned filter to albums API #28213
chore(ml)!: require numpy 2.4 by @mertalev in chore(ml)!: require numpy 2.4 #28158
fix(deps): update dependency nestjs-otel to v8 by @renovate[bot] in fix(deps): update dependency nestjs-otel to v8 #27863
chore(ml)!: remove deprecated envs by @mertalev in chore(ml)!: remove deprecated envs #28326
chore(server)!: remove libopus enum by @mertalev in chore(server)!: remove libopus enum #28325
refactor!: remove asset faces from AssetResponseDto by @bwees in refactor!: remove asset faces from AssetResponseDto #27779
refactor(server)!: drop empty string to null conversion by @timonrieger in refactor(server)!: drop empty string to null conversion #28808
refactor(server)!: remove changeExpiryTime by @timonrieger in refactor(server)!: remove changeExpiryTime #28816
refactor!: disallow star rating < 1 by @meesfrensel in refactor!: disallow star rating < 1 #27896
fix!: search endpoints visibility can be omitted by @danieldietzler in fix!: search endpoints visibility can be omitted #29385
🫥 Deprecated Changes
- refactor(server): deprecate PUT routes in favor of PATCH by @timonrieger in refactor(server): deprecate PUT routes in favor of PATCH #28859
🔒 Security
- fix: run profile picture through thumbnail pipeline by @bo0tzz in fix: run profile picture through thumbnail pipeline #27890
🚀 Features
feat: mobile editing by @bwees in feat: mobile editing #25397
feat: album map markers endpoint by @jrasm91 in feat: album map markers endpoint #27830
feat(server): added backchannel logout api endpoint by @santanoce in feat(server): added backchannel logout api endpoint #26235
feat(server): add OIDC logout URL override option by @LJspice in feat(server): add OIDC logout URL override option #27389
feat: android periodic work manager task by @shenlong-tanwen in feat: android periodic work manager task #23563
feat(web): custom video player controls by @meesfrensel in feat(web): custom video player controls #26183
feat(web): add full-path search mode to UI by @mws-weekend-projects in feat(web): add full-path search mode to UI #26758
feat: recently added assets page by @benbeckford in feat: recently added assets page #28272
feat(mobile): slideshow view by @benbeckford in feat(mobile): slideshow view #28421
feat(mobile): "Add Tags" asset multiselect option by @benjamonnguyen in feat(mobile): "Add Tags" asset multiselect option #26269
feat: workflows & plugins by @jrasm91 in feat: workflows & plugins #26727
feat(server): hls with real-time transcoding by @mertalev in feat(server): hls with real-time transcoding #28230
feat(web): hls player by @mertalev in feat(web): hls player #28312
feat(mobile): Android. Immich as a gallery / image viewer app by @PeterOmbodi in feat(mobile): Android. Immich as a gallery / image viewer app #26109
feat: user upload heatmap by @bondeabhijeet in feat: user upload heatmap #28593
feat(mobile): ocr support by @YarosMallorca in feat(mobile): ocr support #26523
feat: geolocation workflow filter by @benbeckford in feat: geolocation workflow filter #28961
feat: image quality option in sharing by @alextran1502 in feat: image quality option in sharing #28918
feat: integrity check jobs (missing files, untracked files, checksums) by @insertish in feat: integrity check jobs (missing files, untracked files, checksums) #24205
feat: new feature message by @alextran1502 in feat: new feature message #29388
🌟 Enhancements
feat(web): persist state of file path information in details panel by @cratoo in feat(web): persist state of file path information in details panel #27770
feat: commands by @jrasm91 in feat: commands #27546
feat: upgrade immich/ui by @jrasm91 in feat: upgrade immich/ui #27792
feat: filter users on share by @OdinOxin in feat: filter users on share #27732
fix(server): render storage template date/time tokens in UTC (Storage Template dates/times not adjusted for timezone #24350) by @migpovrap in fix(server): render storage template date/time tokens in UTC (#24350) #26917
feat(web): lazy load library and server statistics by @etnoy in feat(web): lazy load library and server statistics #26406
feat: sort users alphabetically when adding to album by @OdinOxin in feat: sort users alphabetically when adding to album #27731
feat: auth logout page by @jrasm91 in feat: auth logout page #27831
chore: improve randomness of /search/random endpoint by @StevenMassaro in chore: improve randomness of /search/random endpoint #27531
feat: dynamic languages by @jrasm91 in feat: dynamic languages #27869
feat: cache shared link by @danieldietzler in feat: cache shared link #27889
feat(server): add configurable OAuth prompt parameter by @sparsh985 in feat(server): add configurable OAuth prompt parameter #26755
feat(server): add MPO file type support by @git-akihakune in feat(server): add MPO file type support #27963
feat(mobile): action bottom sheet on map timeline by @YarosMallorca in feat(mobile): action bottom sheet on map timeline #27515
feat(server): track video metadata by @mertalev in feat(server): track video metadata #28023
feat(enhancement): Navigate stack with up and down arrow keys by @cratoo in feat(enhancement): Navigate stack with up and down arrow keys #27854
fix(web): migrate people management component to page, enabling tooltips by @SkyDev125 in fix(web): migrate people management component to page, enabling tooltips #26971
chore(mobile): add box shadow to asset details by @uhthomas in chore(mobile): add box shadow to asset details #27510
feat: hide hidden person from memories by @sakshamchawla in feat: hide hidden person from memories #20877
feat(mobile): increased tap area on video player overlay by @YarosMallorca in feat(mobile): increased tap area on video player overlay #27269
feat(web): Add metadata overlay to slideshow by @timonrieger in feat(web): Add metadata overlay to slideshow #24627
feat(web): add individual filter removal from search result chips by @timonrieger in feat(web): add individual filter removal from search result chips #28166
feat(mobile): trash/restore all by @YarosMallorca in feat(mobile): trash/restore all #28116
feat: display more info in asset viewer by @alextran1502 in feat: display more info in asset viewer #24630
feat(server): allow subpaths for machine learning URL by @gnojus in feat(server): allow subpaths for machine learning URL #28427
feat(ui): Shared URL input configuration by @Lauritz-Tieste in feat(ui): Shared URL input configuration #27105
refactor: enhance shared link UI and functionality by @Lauritz-Tieste in refactor: enhance shared link UI and functionality #26464
feat: upload and add local asset directly to album by @alextran1502 in feat: upload and add local asset directly to album #28123
feat: Selectable metadata in duplicates utility with diffing by @ollioddi in feat: Selectable metadata in duplicates utility with diffing #26328
fix: improve form control focus visibility by @Caltsic in fix: improve form control focus visibility #28512
feat: command for user pages by @alextran1502 in feat: command for user pages #28554
refactor: use ControlBar UI Library component by @bwees in refactor: use ControlBar UI Library component #28567
feat: workflow template by @alextran1502 in feat: workflow template #28553
feat(mobile): improve downloading algorithm for sharing by @YarosMallorca in feat(mobile): improve downloading algorithm for sharing #27312
feat: search by album name and id by @jrasm91 in feat: search by album name and id #28672
feat: upload local assets to album from bottom sheet by @alextran1502 in feat: upload local assets to album from bottom sheet #28531
feat: places in context search by @timonrieger in feat: places in context search #28768
feat: minimum face count per user by @timjonez in feat: minimum face count per user #27452
feat: show notification and battery optimization warning by @shenlong-tanwen in feat: show notification and battery optimization warning #26610
feat: workflows drag and drop enhancements by @danieldietzler in feat: workflows drag and drop enhancements #28764
feat(mobile): min face count per-user by @YarosMallorca in feat(mobile): min face count per-user #28805
refactor(server): allow -1 rating again by @timonrieger in refactor(server): allow -1 rating again #28886
feat(web): warn before overwriting existing locations in geolocation utility by @yoshovski in feat(web): warn before overwriting existing locations in geolocation utility #28840
feat: warn if microservices worker is missing by @bo0tzz in feat: warn if microservices worker is missing #28869
fix(web): show album names in duplicate review by @meesfrensel in fix(web): show album names in duplicate review #29080
feat: keyboard seeking for new video player by @danieldietzler in feat: keyboard seeking for new video player #29208
feat(web): Add text-white-shadow to elements and increase the shadows effect by @Vogeluff in feat(web): Add text-white-shadow to elements and increase the shadows effect #29165
feat: webhook workflow action by @benbeckford in feat: webhook workflow action #29258
feat: integrity checks admin settings by @danieldietzler in feat: integrity checks admin settings #29406
🐛 Bug fixes
fix(web): center images in RTL layouts (Bug: Image not centered in RTL layout (Hebrew) #27678) by @Nicolas-micuda-becker in fix(web): center images in RTL layouts (#27678) #27753
fix(mobile): add keys for person tiles in search by @YarosMallorca in fix(mobile): add keys for person tiles in search #27689
fix(web): selection clearing on preview by @YarosMallorca in fix(web): selection clearing on preview #27702
fix: asset multi select download shortcut by @danieldietzler in fix: asset multi select download shortcut #27784
fix(web): add partner photo to album from multiselect by @YarosMallorca in fix(web): add partner photo to album from multiselect #27767
fix: redirect original by @danieldietzler in fix: redirect original #27759
fix: make web build stage deterministic by @bo0tzz in fix: make web build stage deterministic #27823
fix(web): svelte regression - cancel video preview fetch when bind:this is cleared early by @midzelis in fix(web): svelte regression - cancel video preview fetch when bind:this is cleared early #27713
fix(web): stale adaptive image when original overlays preview by @midzelis in fix(web): stale adaptive image when original overlays preview #27621
fix(mobile): readonly redirect when not logged in by @YarosMallorca in fix(mobile): readonly redirect when not logged in #27728
fix(web): close edit faces panel on Escape key press by @midzelis in fix(web): close edit faces panel on Escape key press #27519
fix(oauth): normalize email claim to lowercase and trim before account lookup and registration by @timdobras in fix(oauth): normalize email claim to lowercase and trim before account lookup and registration #26841
fix(web): use event for zooming out after opening face editor by @meesfrensel in fix(web): use event for zooming out after opening face editor #27789
fix: sanitize filenames before adding to zip by @bo0tzz in fix: sanitize filenames before adding to zip #27893
fix(server): require at least one field to be set when updating memory by @fredfloydd in fix(server): require at least one field to be set when updating memory #27842
fix(web): compute hashes for uploads in chunks by @fredfloydd in fix(web): compute hashes for uploads in chunks #27878
fix(web): fix stale album page load by @fredfloydd in fix(web): fix stale album page load #27825
fix(web): prevent interaction with detail panel behind person side panel by @midzelis in fix(web): prevent interaction with detail panel behind person side panel #27309
fix: show neon light by @alextran1502 in fix: show neon light #27994
fix(mobile): zero exposure by @YarosMallorca in fix(mobile): zero exposure #28017
fix(mobile): clear local data on forced logout by @LeLunZ in fix(mobile): clear local data on forced logout #27957
fix(mobile): enable autoplay for motion photos in video viewer by @LeLunZ in fix(mobile): enable autoplay for motion photos in video viewer #27961
fix(mobile): thumbnail transition to asset viewer by @LeLunZ in fix(mobile): thumbnail transition to asset viewer #27850
fix: jump to timeline on new auto_router update by @alextran1502 in fix: jump to timeline on new auto_router update #28022
fix(mobile): delete assets on trash empty, Android by @PeterOmbodi in fix(mobile): delete assets on trash empty, Android #26070
fix(ml): handle empty/corrupt images in face detection by @yosit in fix(ml): handle empty/corrupt images in face detection #27391
fix(web): refresh memories hourly by @meesfrensel in fix(web): refresh memories hourly #28114
fix(web): large files: better handling of asset deletions by @meesfrensel in fix(web): large files: better handling of asset deletions #28117
fix(web): double video playback on map timeline by @YarosMallorca in fix(web): double video playback on map timeline #28090
fix(mobile): suppress asset stack UI in trash timeline by @PeterOmbodi in fix(mobile): suppress asset stack UI in trash timeline #26536
fix(web): timeline scroll when pressing back from stacked asset by @Snowknight26 in fix(web): timeline scroll when pressing back from stacked asset #28163
fix(server): selectively apply metadata bitstream filter for video thumbnails by @pinhao in fix(server): selectively apply metadata bitstream filter for video thumbnails #28162
fix(web): fix shared link /s/photos.* navigation after password login by @meesfrensel in fix(web): fix shared link /s/photos.* navigation after password login #27788
fix(ml): respect time zone for logs in cuda container by @AyaanMAG in fix(ml): respect time zone for logs in cuda container #28155
fix: librknnrt permissions in machine-learning by @DavidTheFighter in fix: librknnrt permissions in machine-learning #28216
fix(server): validate duplicate group ownership before dismissal by @timonrieger in fix(server): validate duplicate group ownership before dismissal #28221
fix(web): correct timeline yesterday label across month boundaries by @michelheusschen in fix(web): correct timeline yesterday label across month boundaries #28183
fix(mobile): show lens info without lens name by @benbeckford in fix(mobile): show lens info without lens name #28234
fix: stale person name after merge by @danieldietzler in fix: stale person name after merge #28222
fix(web): shared album avatars opening modal by @meesfrensel in fix(web): shared album avatars opening modal #26719
fix(mobile): prevent asset loading issues when changing page or when closing memories by @LeLunZ in fix(mobile): prevent asset loading issues when changing page or when closing memories #27596
fix(mobile): correct filter default and UI desync in similar photos search by @TheBestX11 in fix(mobile): correct filter default and UI desync in similar photos search #27516
fix(server): hide isFavorite from partner asset sync stream by @timonrieger in fix(server): hide isFavorite from partner asset sync stream #28035
fix(mobile): restore notification plugin init by @santoshakil in fix(mobile): restore notification plugin init #28284
fix(mobile): mounted check before setState in album sync action by @santoshakil in fix(mobile): mounted check before setState in album sync action #28300
fix(mobile): avoid duplicate assets in album view by @stfn42 in fix(mobile): avoid duplicate assets in album view #28152
fix(mobile): Deduplicate assets in person view timeline by @thowdev in fix(mobile): Deduplicate assets in person view timeline #26723
fix(deployment): remove unneeded volume by @mmomjian in fix(deployment): remove unneeded volume #28307
fix: mobile upload duration type by @alextran1502 in fix: mobile upload duration type #28362
fix: deep link for assets when asset viewer already open by @bwees in fix: deep link for assets when asset viewer already open #27971
fix: kekab icon colors in light mode by @shenlong-tanwen in fix: kekab icon colors in light mode #28366
fix: indexes on remote_asset_entity by @shenlong-tanwen in fix: indexes on remote_asset_entity #28264
fix(mobile): clear linkedRemoteAlbumId in reset() so FK refs dont dangle by @santoshakil in fix(mobile): clear linkedRemoteAlbumId in reset() so FK refs dont dangle #28382
fix: ignore icc profile make and model by @jrasm91 in fix: ignore icc profile make and model #28412
fix(mobile): don't block app open on slow validateAccessToken by @santoshakil in fix(mobile): don't block app open on slow validateAccessToken #28405
fix(mobile): add restore option to trashed assets by @inesiscosta in fix(mobile): add restore option to trashed assets #27442
fix(mobile): use correct delete action by @ByteSizedMarius in fix(mobile): use correct delete action #26575
fix(server): dedupe database backup jobs by @rdeaton in fix(server): dedupe database backup jobs #28341
fix(mobile): cronet buffer overflow on compressed thumbnails by @santoshakil in fix(mobile): cronet buffer overflow on compressed thumbnails #28439
fix(mobile): cronet thumbnail buffer overflow regression from fix(mobile): cronet buffer overflow on compressed thumbnails #28439 by @santoshakil in fix(mobile): cronet thumbnail buffer overflow regression from #28439 #28450
fix(mobile): mounted check in ThumbnailTile hero flight listener by @santoshakil in fix(mobile): mounted check in ThumbnailTile hero flight listener #28451
fix(mobile): don't force-unwrap nil localizedTitle in ios getAlbums by @santoshakil in fix(mobile): don't force-unwrap nil localizedTitle in ios getAlbums #28452
fix(web): work around Chrome HDR image seam lines during zoom by @midzelis in fix(web): work around Chrome HDR image seam lines during zoom #27715
fix(ios): respect status bar scroll to top in timeline views by @agg23 in fix(ios): respect status bar scroll to top in timeline views #28469
fix(mobile): asset viewer stuck on spinner after rotation by @LeLunZ in fix(mobile): asset viewer stuck on spinner after rotation #28019
fix(web): timeline stuttering with many assets in 1 day by @benbeckford in fix(web): timeline stuttering with many assets in 1 day #28509
fix(mobile): preserve zoom level during image loading and live photo playback by @LeLunZ in fix(mobile): preserve zoom level during image loading and live photo playback #27960
fix(ml): stabilize MIGraphX inference by @fabianwimberger in fix(ml): stabilize MIGraphX inference #28444
fix: await sync asset v2 by @bwees in fix: await sync asset v2 #28569
fix: strip metadata from timeline responses for shared links without exif sharing by @danieldietzler in fix: strip metadata from timeline responses for shared links without exif sharing #28644
fix: Refresh local album overview page after asset deletion by @Lauritz-Tieste in fix: Refresh local album overview page after asset deletion #28586
fix(server): prevent locked assets from leaking to partners by @timonrieger in fix(server): prevent locked assets from leaking to partners #28652
refactor(web): replace per-asset viewport proximity with day-tier active indices by @midzelis in refactor(web): replace per-asset viewport proximity with day-tier active indices #28597
fix: timeline scroll flicker by @alextran1502 in fix: timeline scroll flicker #28653
fix: api repositories using stale endpoint by @shenlong-tanwen in fix: api repositories using stale endpoint #28667
fix: disallow cross origin/non http protocols for continueUrl on login by @bwees in fix: disallow cross origin/non http protocols for continueUrl on login #28706
fix(web): skip thumbhash fade for offscreen thumbnails by @midzelis in fix(web): skip thumbhash fade for offscreen thumbnails #27335
fix(web): prevent partner assets from being selected in geolocation utility by @okxint in fix(web): prevent partner assets from being selected in geolocation utility #28737
fix(mobile): invisible ink splashes in asset sheet by @timonrieger in fix(mobile): invisible ink splashes in asset sheet #28756
fix!: unauthorized face creation by @shenlong-tanwen in fix!: unauthorized face creation #28561
fix(mobile): proper background task cleanup by @mertalev in fix(mobile): proper background task cleanup #28694
fix(cli): prevent out-of-memory on file upload due to undici storing the request body by @moversity in fix(cli): prevent out-of-memory on file upload due to undici storing the request body #28723
fix: error log on aborted uploads by @jrasm91 in fix: error log on aborted uploads #28806
fix(server): respect timezone in iso date string encoding by @timonrieger in fix(server): respect timezone in iso date string encoding #28810
test: fix tests when OpenVINO provider is available by @nekowinston in test: fix tests when OpenVINO provider is available #28802
fix(mobile): run iOS bg task phases in parallel by @santoshakil in fix(mobile): run iOS bg task phases in parallel #28293
fix: error handling by @jrasm91 in fix: error handling #28843
fix: cross isolate drift watchers by @shenlong-tanwen in fix: cross isolate drift watchers #28862
fix: reload timeline on group by setting change by @shenlong-tanwen in fix: reload timeline on group by setting change #28864
fix(web): use irot/imir tags for HEIF Orientation by @joojoooo in fix(web): use irot/imir tags for HEIF Orientation #27820
fix: detail panel faces reactivity issues by @danieldietzler in fix: detail panel faces reactivity issues #28910
fix(server): hide isFavorite from album asset sync stream by @timonrieger in fix(server): hide isFavorite from album asset sync stream #28923
fix(mobile): show memory and folder dates in local time by @santoshakil in fix(mobile): show memory and folder dates in local time #28941
fix(mobile): show error when creating an album fails by @santoshakil in fix(mobile): show error when creating an album fails #28942
fix(mobile): add album picker to archive bottom sheet by @santoshakil in fix(mobile): add album picker to archive bottom sheet #28953
fix: normalize diacritics in person name search in Web & Mobile by @pedrovieira in fix: normalize diacritics in person name search in Web & Mobile #28887
fix(web): Prevent face editor from closing when dismissing tag confirmation by @pedrovieira in fix(web): Prevent face editor from closing when dismissing tag confirmation #28900
fix(mobile): map timeline layout crash by @YarosMallorca in fix(mobile): map timeline layout crash #28878
fix(mobile): deduplicate people in asset details panel by @santoshakil in fix(mobile): deduplicate people in asset details panel #28972
fix(mobile): keep timezone when editing asset date time by @santoshakil in fix(mobile): keep timezone when editing asset date time #28978
fix(mobile): stale details after editing asset date by @santoshakil in fix(mobile): stale details after editing asset date #28977
fix(mobile): show albums whose assets are all trashed by @santoshakil in fix(mobile): show albums whose assets are all trashed #28985
fix(mobile): give android notification channels proper names by @santoshakil in fix(mobile): give android notification channels proper names #28986
fix: Improving scroll behavior on image stacks that overflow the screen by @BlankCanvasStudio in fix: Improving scroll behavior on image stacks that overflow the screen #28885
fix(web): focus on scrollable element on load by @timonrieger in fix(web): focus on scrollable element on load #29004
fix(mobile): show like and comment options on album photo deep links by @santoshakil in fix(mobile): show like and comment options on album photo deep links #29020
fix(web): correctly handle person search with more than 100 results by @maxinegardenas in fix(web): correctly handle person search with more than 100 results #29002
fix(web): prevent upload status panel from overlapping album action bar by @okxint in fix(web): prevent upload status panel from overlapping album action bar #29044
fix(web): error loading image state by @bwees in fix(web): error loading image state #29058
fix(web): show asset arrows by @timonrieger in fix(web): show asset arrows #29010
fix(server): hide partner archived asset locations from map by @timonrieger in fix(server): hide partner archived asset locations from map #29028
fix: lock transcoding options by @timonrieger in fix: lock transcoding options #29076
fix(server): do not merge metadata when multiple duplicates are kept by @timonrieger in fix(server): do not merge metadata when multiple duplicates are kept #29035
fix: integrity report checksum query by @danieldietzler in fix: integrity report checksum query #29136
fix: map settings by @danieldietzler in fix: map settings #29134
fix: too strict cron expression validation by @danieldietzler in fix: too strict cron expression validation #29138
fix(web): respect local timezone when building date range for search by @okxint in fix(web): respect local timezone when building date range for search #29128
fix(web): language selector by @meesfrensel in fix(web): language selector #29065
fix: update datetimeRelative description to minutes instead of seconds by @meesfrensel in fix: update datetimeRelative description to minutes instead of seconds #29137
fix: video thumbnail quality sharing by @bwees in fix: video thumbnail quality sharing #29104
fix(mobile): stop sync albums crashing on the main isolate by @santoshakil in fix(mobile): stop sync albums crashing on the main isolate #29133
fix(mobile): show memories with no showAt/hideAt in the timeline lane by @santoshakil in fix(mobile): show memories with no showAt/hideAt in the timeline lane #29158
fix(mobile): keep toasts off the dynamic island when keyboard is open by @santoshakil in fix(mobile): keep toasts off the dynamic island when keyboard is open #29159
fix(server): skip existing users when sharing albums by @jeevan6996 in fix(server): skip existing users when sharing albums #28884
fix: web i18n by @danieldietzler in fix: web i18n #29175
fix(web): shift+click on GPS asset extends range selection in geolocation utility by @timonrieger in fix(web): shift+click on GPS asset extends range selection in geolocation utility #29022
fix(server): allow non-utc datetime offsets by @timonrieger in fix(server): allow non-utc datetime offsets #29186
fix: remove local-only step ids from workflow json by @danieldietzler in fix: remove local-only step ids from workflow json #29188
fix: asset type filter by @danieldietzler in fix: asset type filter #29190
fix(mobile): prevent duplicate login pages for unauthenticated share intent warm start by @olildu in fix(mobile): prevent duplicate login pages for unauthenticated share intent warm start #29054
fix(mobile): refresh memories on resume and day change by @santoshakil in fix(mobile): refresh memories on resume and day change #28983
fix(mobile): re-lock locked folder when the app is backgrounded by @santoshakil in fix(mobile): re-lock locked folder when the app is backgrounded #29089
fix(mobile): endless spinner on album selection when device has no albums by @santoshakil in fix(mobile): endless spinner on album selection when device has no albums #28994
fix: rc version check by @danieldietzler in fix: rc version check #29194
fix: detail panel people reactivity and iterator consumption by @danieldietzler in fix: detail panel people reactivity and iterator consumption #29250
fix(server): use VBR for QSV so the max bitrate is respected by @aclerici38 in fix(server): use VBR for QSV so the max bitrate is respected #29240
fix: ignore external libraries for integrity report checksum check by @danieldietzler in fix: ignore external libraries for integrity report checksum check #29248
fix(web): remove map's fullscreen button by @meesfrensel in fix(web): remove map's fullscreen button #29192
refactor: use SemVer classes for version compatability message by @bwees in refactor: use SemVer classes for version compatability message #29056
fix: sync backfill by @jrasm91 in fix: sync backfill #29267
fix(mobile): force AssetViewerPage recreation on repeated view intents by @okxint in fix(mobile): force AssetViewerPage recreation on repeated view intents #29235
fix(mobile): blank notifications page after enabling notifications by @santoshakil in fix(mobile): blank notifications page after enabling notifications #29232
fix(mobile): app doesn't exit full-screen mode by @YarosMallorca in fix(mobile): app doesn't exit full-screen mode #29301
fix(mobile): only toggle backup from the switch, not the whole row by @santoshakil in fix(mobile): only toggle backup from the switch, not the whole row #29236
fix(mobile): hide video thumbnail when video is ready by @santoshakil in fix(mobile): hide video thumbnail when video is ready #29012
fix(mobile): apply exif orientation to android raw photos by @santoshakil in fix(mobile): apply exif orientation to android raw photos #29337
fix(server): face region coordinates parsing by @djbravo06 in fix(server): face region coordinates parsing #29333
feat: honor album access permissions in search endpoints by @danieldietzler in feat: honor album access permissions in search endpoints #29352
fix: version compatability check by @bwees in fix: version compatability check #29405
📚 Documentation
fix(docs): instructions on how to use local immich ui by @YarosMallorca in fix(docs): instructions on how to use local immich ui #27813
fix(docs): helmet file affected containers by @mmomjian in fix(docs): helmet file affected containers #27939
fix(docs): Update Tailscale free tier user and device limits by @Hakuin123 in fix(docs): Update Tailscale free tier user and device limits #28151
docs: update rocm installation instructions by @aigarius in docs: update rocm installation instructions #25434
fix(docs): document
upgrade-insecure-requestsdefault by @meesfrensel in fix(docs): documentupgrade-insecure-requestsdefault #28279fix(docs): missing colon in config file doc by @SuperSandro2000 in fix(docs): missing colon in config file doc #28313
fix: update server-commands subcommand list by @bo0tzz in fix: update server-commands subcommand list #28402
feat(docs): add fixed subnet guide for Synology to prevent firewall issues by @racehd in feat(docs): add fixed subnet guide for Synology to prevent firewall issues #26554
chore(docs): update FAQ with profile picture change instructions by @tvangemert in chore(docs): update FAQ with profile picture change instructions #28634
chore: update documentation to use mise commands by @timonrieger in chore: update documentation to use mise commands #28515
fix(docs): v3 bumps by @mmomjian in fix(docs): v3 bumps #29007
docs(server): clarify AssetBulkUploadCheckItem.id is a correlation token by @timonrieger in docs(server): clarify AssetBulkUploadCheckItem.id is a correlation token #29141
docs(mobile-app): add Play App Signing certificate hash by @tlvince in docs(mobile-app): add Play App Signing certificate hash #29168
docs(mobile): point users towards shared setup docs by @agg23 in docs(mobile): point users towards shared setup docs #29078
docs: clarify duplicate exif merging intent by @timonrieger in docs: clarify duplicate exif merging intent #29203
fix(docsc): v3 bump by @mmomjian in fix(docsc): v3 bump #29246
docs: MS smtp guide by @jameskimmel in docs: MS smtp guide #29289
🌐 Translations
feat: latest language requests by @danieldietzler in feat: latest language requests #28858
chore: update translations by @weblate in chore: update translations #27764
feat: languages by @danieldietzler in feat: languages #29088
chore(web): update translations by @weblate in chore(web): update translations #29036
chore(web): update translations by @weblate in chore(web): update translations #29162
fix: turkish readme translation by @MuySup in fix: turkish readme translation #29234
chore(web): update translations by @weblate in chore(web): update translations #29204
chore(web): update translations by @weblate in chore(web): update translations #29290
chore(web): update translations by @weblate in chore(web): update translations #29347
New Contributors
@OdinOxin made their first contribution in feat: filter users on share #27732
@migpovrap made their first contribution in fix(server): render storage template date/time tokens in UTC (#24350) #26917
@StevenMassaro made their first contribution in chore: improve randomness of /search/random endpoint #27531
@timdobras made their first contribution in fix(oauth): normalize email claim to lowercase and trim before account lookup and registration #26841
@santanoce made their first contribution in feat(server): added backchannel logout api endpoint #26235
@fredfloydd made their first contribution in fix(server): require at least one field to be set when updating memory #27842
@sparsh985 made their first contribution in feat(server): add configurable OAuth prompt parameter #26755
@LJspice made their first contribution in feat(server): add OIDC logout URL override option #27389
@git-akihakune made their first contribution in feat(server): add MPO file type support #27963
@shaun0927 made their first contribution in fix(web): normalize underscore locale codes in dynamic language selection #27900
@yosit made their first contribution in fix(ml): handle empty/corrupt images in face detection #27391
@Hakuin123 made their first contribution in fix(docs): Update Tailscale free tier user and device limits #28151
@pinhao made their first contribution in fix(server): selectively apply metadata bitstream filter for video thumbnails #28162
@AyaanMAG made their first contribution in fix(ml): respect time zone for logs in cuda container #28155
@DavidTheFighter made their first contribution in fix: librknnrt permissions in machine-learning #28216
@benbeckford made their first contribution in fix(mobile): show lens info without lens name #28234
@bhugh made their first contribution in chore: enhance documentation on wildcard and exclusion patterns #27884
@SkyDev125 made their first contribution in fix(web): migrate people management component to page, enabling tooltips #26971
@aigarius made their first contribution in docs: update rocm installation instructions #25434
@mws-weekend-projects made their first contribution in feat(web): add full-path search mode to UI #26758
@TheBestX11 made their first contribution in fix(mobile): correct filter default and UI desync in similar photos search #27516
@sakshamchawla made their first contribution in feat: hide hidden person from memories #20877
@santoshakil made their first contribution in fix(mobile): restore notification plugin init #28284
@stfn42 made their first contribution in fix(mobile): avoid duplicate assets in album view #28152
@thowdev made their first contribution in fix(mobile): Deduplicate assets in person view timeline #26723
@SuperSandro2000 made their first contribution in fix(docs): missing colon in config file doc #28313
@racehd made their first contribution in feat(docs): add fixed subnet guide for Synology to prevent firewall issues #26554
@inesiscosta made their first contribution in fix(mobile): add restore option to trashed assets #27442
@gnojus made their first contribution in feat(server): allow subpaths for machine learning URL #28427
@rdeaton made their first contribution in fix(server): dedupe database backup jobs #28341
@agg23 made their first contribution in fix(ios): respect status bar scroll to top in timeline views #28469
@ollioddi made their first contribution in feat: Selectable metadata in duplicates utility with diffing #26328
@Caltsic made their first contribution in fix: improve form control focus visibility #28512
@fabianwimberger made their first contribution in fix(ml): stabilize MIGraphX inference #28444
@tvangemert made their first contribution in chore(docs): update FAQ with profile picture change instructions #28634
@BlankCanvasStudio made their first contribution in fix: dev container properly builds @immich/plugin-sdk for import #28620
@pneuly made their first contribution in fix(ml): pass model_root_dir to OcrOptions for RapidOCR compatibility #28610
@timjonez made their first contribution in feat: minimum face count per user #27452
@moversity made their first contribution in fix(cli): prevent out-of-memory on file upload due to undici storing the request body #28723
@nekowinston made their first contribution in test: fix tests when OpenVINO provider is available #28802
@bondeabhijeet made their first contribution in feat: user upload heatmap #28593
@joojoooo made their first contribution in fix(web): use irot/imir tags for HEIF Orientation #27820
@pedrovieira made their first contribution in fix: normalize diacritics in person name search in Web & Mobile #28887
@yoshovski made their first contribution in feat(web): warn before overwriting existing locations in geolocation utility #28840
@maxinegardenas made their first contribution in fix(web): correctly handle person search with more than 100 results #29002
@jeevan6996 made their first contribution in fix(server): skip existing users when sharing albums #28884
@rizwanpatel-gif made their first contribution in fix(web): use deterministic version name in svelte config #29172
@olildu made their first contribution in fix(mobile): prevent duplicate login pages for unauthenticated share intent warm start #29054
@MuySup made their first contribution in fix: turkish readme translation #29234
@aclerici38 made their first contribution in fix(server): use VBR for QSV so the max bitrate is respected #29240
@jullanggit made their first contribution in fix: small typo in openapi-spec #29308
@jameskimmel made their first contribution in docs: MS smtp guide #29289
@djbravo06 made their first contribution in fix(server): face region coordinates parsing #29333
Full Changelog: v2.7.5...v3.0.0
This discussion was created from the release v3.0.0.
这条对你有帮助吗?




















