Based on Immich v3.2.2
Gallery changes
- fix(s3): release the proxy-read slot for every path a client can disappear on (#1106)
- fix(s3): destroy idle proxy streams so zombied sockets stop leaking limiter slots (#1104)
- fix(server): show contributed albums in the asset info panel (#1096)
- fix(web): dedupe folder cover asset ids in Space Albums preview (#1092)
- fix(server): keep expanded-year timeline buckets out of JS Date (#1094)
- fix(server): accept the midnight-UTC timeBucket form upstream clients send (#1093)
Other Gallery changes
Upstream commits
- chore: version v3.2.0 (immich-app#31441)
- fix: show partner assets on people page (immich-app#31435)
- fix: immich-dev (immich-app#31447)
- fix(server): vacuum after migrations, concurrent reindex (immich-app#31424)
- fix: only run version check in production env (immich-app#31443)
- fix(web): change "View asset owners" to "Hide asset owners" when enabled (immich-app#31393)
- chore(mobile): correctly rename person form state class (immich-app#31428)
- feat: NestJS 12 and ESM (immich-app#31237)
- chore(deps): update github-actions (immich-app#31328)
- refactor(mobile): convert
CropAspectRatioto an enhanced enum (immich-app#31119) - fix: backport PRs requested review team (immich-app#31377)
- fix(deps): update dependency maplibre-gl to v6 [security] (immich-app#31355)
- fix: memory page navigation (immich-app#31334)
- chore(mobile): split out Timeline dragging into new widget (immich-app#31255)
- fix(mobile): hide negative age (immich-app#31341)
- chore(mobile): split Timeline widget into smaller parts (immich-app#31223)
- chore(mobile): remove unused code (immich-app#31280)
- chore: pump flutter to 3.47.2 (immich-app#31285)
- fix(web): use RTL-friendly layout for people panel buttons (immich-app#31266)
- fix(docs): add needed mobile app developer setup step (immich-app#31263)
- fix(web): word-wrap long album names (immich-app#31265)
- fix(deps): update typescript-projects (immich-app#30842)
- chore(deps): update docker.io/valkey/valkey:9 docker digest to c123e37 (immich-app#31326)
- chore(deps): update ghcr.io/jdx/mise docker tag to v2026.9.2 (immich-app#31327)
- fix(server): live photo transcode visibility (immich-app#31319)
- chore(web): Change
xto typographically correct×(×in HTML) symbol (immich-app#31304) - chore(mobile): move settings components to UI package (immich-app#31272)
- fix(mobile): rewrite slideshow controller system (immich-app#30771)
- fix(mobile): make shared link download toggle depend on metadata toggle (immich-app#31264)
- fix(mobile): refresh the memory lane after resume (immich-app#31239)
- fix(ml): openvino config has unnecessary devices and volumes (immich-app#31253)
- feat: new FAQ entries (immich-app#31227)
- fix(mobile): use timeline scroll velocity to add placeholders (immich-app#29443)
- fix(web): partner sharing timeline (immich-app#31241)
- fix(mobile): prevent inner mutability on Freezed classes (immich-app#31229)
- chore(ci): run mobile jobs when OpenAPI defs change (immich-app#31245)
- fix(mobile): switch to new OpenAPI int in RotateParameters (immich-app#31246)
- fix: face detection of edited assets (immich-app#31240)
- fix(web): album date range formatting (immich-app#28564)
- fix(ml): race when submitting to rknn execution queue (immich-app#31143)
- fix: incorrect edit's openapi type (immich-app#31218)
- fix: don't force builds on release-base PRs (immich-app#31225)
- chore: require number format (immich-app#31222)
- fix: fdroid link (immich-app#31219)
- chore(mobile): log app resume and pause (immich-app#31207)
- chore: asset page zoom test overrides (immich-app#31201)
- chore: add backport label to backported prs (immich-app#31195)
- fix(server): never unlink an untracked-file path that an asset now references (immich-app#31074)
- fix: add discussions perm to release publish token (immich-app#31167)
- chore: remove stars chart from readme (immich-app#31175)
- fix: workflows write perm on backport job (immich-app#31191)
- chore(docs): deprecate outlook SMTP (immich-app#31139)
- chore(deps): update github-actions (immich-app#31182)
- chore(deps): update ghcr.io/jdx/mise docker tag to v2026.8.16 (immich-app#31177)
- chore(deps): update typescript-projects (immich-app#31183)
- fix: open an announcement discussion for each release line (immich-app#31101)
- fix(web): interaction with some filter elements closes the search panel (immich-app#31107)
- fix: Build SDK in dev container (immich-app#31096)
- fix(server): allow an empty assetIds array when creating an album shared link (immich-app#31098)
- fix: do not move faces of users other than the current owner (immich-app#31145)
- fix(mobile): refresh server info when the websocket connects (immich-app#31144)
- fix(mobile): keep the original filename when sharing downloaded assets (immich-app#30267)
- chore: tune map icon size (immich-app#31108)
- chore(deps): update base-image to v202608300913 (immich-app#31128)
- fix: generate release notes from the previous release on the line (immich-app#31080)
- fix(mobile): handle transient loading states for map timelines (immich-app#29735)
- fix(e2e): wait out the duplicate #asset-grid during navigation (immich-app#31088)
- fix(web): face editor coordinates on a not-yet-loaded video (immich-app#31083)
- fix(ml): read CLIP model configs as UTF-8 (immich-app#31075)
- chore: drop backport description header (immich-app#31067)
- chore: drop backport label description (immich-app#31062)
- fix: avoid a concurrency deadlock when drafting a release (immich-app#31069)
- fix: run codeql and weblate checks on release branches (immich-app#31065)
- fix: build release branch images instead of re-tagging main (immich-app#31063)
- chore: version v3.2.0-rc.0
- fix: check out the branch tip when preparing a release (immich-app#31061)
- chore(web): update translations (immich-app#30296)
- fix: ios map settings sheet (immich-app#31060)
- feat(server): new search API (immich-app#30179)
- feat(web): view assets in map viewport (immich-app#27492)
- feat: same-second photos now sub-sort by filename (immich-app#29528)
- fix: external library statistics for excluded assets (immich-app#28462)
- docs: update remote-machine-learning.md (immich-app#28728)
- fix(web): map (immich-app#31056)
- fix(web): misleading toast notification (immich-app#30976)
- fix(server): kill pg_dump when a backup fails so it stops holding table locks (immich-app#30851)
- fix: draggable Immich logo (immich-app#31055)
- chore(deps): update ghcr.io/immich-app/base-server-dev docker tag to v202608251107 (immich-app#31054)
- fix(web): preserve slideshow pause state when viewing video slides (immich-app#30278)
- fix: only run backport for labelled pull requests (immich-app#31052)
- feat: allow users to re-run facial recognition for their group (immich-app#30965)
- fix(web): do not play memory video if the
MemoryVideoViewerelement is not visible (immich-app#30947) - feat: backport pull requests to release branches (immich-app#31035)
- feat: cut releases from release branches (immich-app#31033)
- feat: gate release publishing behind an approval (immich-app#31025)
- feat: split release preparation from drafting (immich-app#31024)
- chore: bump openapi-generator version to v7.25 (immich-app#30995)
- fix(web): restore timeline scroll when the asset id cannot be resolved (immich-app#30916)
- chore(deps): update dependency opentofu to v1.12.6 (immich-app#30984)
- chore(deps): update prom/prometheus docker digest to 5ce7540 (immich-app#30981)
- chore(deps): update grafana/grafana docker tag to v12.4.9-ubuntu (immich-app#30986)
- chore(deps): update dependency github:extism/js-pdk to v1.7.0 (immich-app#30987)
- feat: only move floating docker tags for the newest release (immich-app#31030)
- chore(mobile): remove Drift* prefixes from classes and variables (immich-app#31038)
- chore(deps): update dependency pydantic-settings to v2.14.2 [security] (immich-app#29252)
- chore(deps): update dependency pillow to v12.3.0 [security] (immich-app#30084)
- feat: verify migration ORDER on every PR (immich-app#30998)
- feat(server): document and guard migration ORDER maintenance (immich-app#30997)
- fix(server): point the migrations mise task at sql-tools (immich-app#30996)
- chore: bump sql-tools (immich-app#31000)
- feat(mobile): map asset number (immich-app#28911)
- refactor(ml): direct ocr processing (immich-app#31016)
- fix: throw a typed error on malformed api responses (immich-app#31006)
- feat(mobile): show asset owner in asset details (immich-app#29302)
- fix(mobile): aspect ratio change (immich-app#30939)
- chore(deps): update docker.io/valkey/valkey:9 docker digest to 70739f8 (immich-app#30980)
- fix(deps): update typescript-projects (immich-app#30990)
- chore(deps): update ghcr.io/jdx/mise docker tag to v2026.8.12 (immich-app#30985)
- fix: thumbnail generation for specific SVGs (immich-app#30908)
- fix: don't swallow fetch errors (immich-app#30496)
- chore(deps): update github-actions (immich-app#30989)
- chore(deps): lock file maintenance (mise) (immich-app#30464)
- feat: memories view (immich-app#28675)
- chore(mobile): move Drift into mobile/data (immich-app#30966)
- chore(mobile): pump dcm (immich-app#30963)
- chore: pump flutter to 3.47.1 (immich-app#30962)
- perf(web): use hash-wasm SHA-1 with pure-JS fallback for upload hashing (immich-app#30107)
- fix(server): correct tag create operations (immich-app#30877)
- fix: remove partner assets from existing memories (immich-app#28950)
- chore: lint for unguarded redirect URL reading (immich-app#30950)
- chore(server): update zod to 4.4.3 and nestjs-zod to 5.5.0 (immich-app#30532)
- fix: maintentance return URL sanitization (immich-app#30948)
- fix(mobile): respect 24h system setting (immich-app#30792)
- fix: do not exit search screen on back during multiselect (immich-app#30689)
- fix(server): let a second metadata extraction replace stored AV metadata (immich-app#30900)
- fix(mobile): permanently delete local copies when moving to the locked folder (immich-app#29730)
- chore(mobile): remove commited db.repository.steps.dart (immich-app#30910)
- chore: search filter animation improvement and reactive search cue example (immich-app#30866)
- chore: align icon and font size of bottom bar actions (immich-app#30890)
- feat(web): tag renaming v2 (immich-app#27909)
- chore(mobile): migrate remaining simple classes to Freezed (immich-app#30907)
- refactor: memory e2e (immich-app#30906)
- feat: asset file apis (immich-app#25900)
- fix: quote database owner in restore (immich-app#30905)
- chore(deps): update grafana/grafana docker tag to v12.4.8-ubuntu (immich-app#30835)
- fix(server): correct asset dimensions from exif metadata (immich-app#29244)
- fix(mobile): dedupe stale remote_asset rows on sync (immich-app#28445)
- refactor: activity e2e (immich-app#30896)
- fix(server): library exclusion patterns can soft-delete assets outside their directory (immich-app#30850)
- fix(web): download archives via html POST forms (immich-app#30021)
- refactor: partner e2e (immich-app#30895)
- feat: add oauth account management url (immich-app#30873)
- fix(ci): docker caching (immich-app#30894)
- chore(mobile): update flutter-maplibre-gl to 0.27.0 (immich-app#30892)
- feat: cluster groups (immich-app#30739)
- chore(mobile): patch Flutter to allow building against iOS simulator (immich-app#30821)
- refactor: use public config (immich-app#30891)
- feat: new config endpoints (immich-app#30881)
- refactor: api key response dto (immich-app#30887)
- fix(mobile): order album/place/person timelines by local date (immich-app#29338)
- refactor: dockerfile caching (immich-app#30874)
- fix(server): unicode email validation (immich-app#30871)
- fix(deps): update sharp to ^0.35.3 (immich-app#29132)
- refactor: e2e tests (immich-app#30870)
- refactor: library e2e (immich-app#30867)
- refactor: library e2e (immich-app#30865)
- refactor: library controller tests (immich-app#30863)
- chore(server): migrate library e2e tests (immich-app#27277)
- feat(web): new search ui (immich-app#30279)
- docs: Update backup script to match manual/automatic backups (immich-app#26810)
- fix(web): gracefully handle map errors when WebGL is disabled (immich-app#26538)
- fix(server): Sort stacked assets by creation date (immich-app#24033)
- fix(server): do not throw on unparsable DB_URL when building backup arguments (immich-app#30759)
- docs: fix identity provider examples in oauth guide (immich-app#30828)
- fix: redis cli ping command (immich-app#30329)
- fix(cli): enforce node engine version on start (immich-app#30437)
- chore(deps): update github-actions (major) (immich-app#30845)
- feat: rotate an API key (immich-app#30801)
- chore(deps): update github-actions (immich-app#30838)
- fix(mobile): cannot deep link to memory lane (immich-app#30634) (immich-app#30787)
- feat: actions undo handling (immich-app#30481)
- fix(mobile): resend an upload once when the connection dies before a response (immich-app#30843)
- chore: single line block comments (immich-app#30852)
- fix(server): update ocr & faces after asset edit (immich-app#29303)
- feat: iOS dynamic background ids (immich-app#30574)
- fix(server): respect backpressure in the sync stream (immich-app#30764)
- fix(server): guard createAll against empty values list (immich-app#30837)
- fix: freeze on navigating back album description (immich-app#30781)
- chore(deps): update ghcr.io/jdx/mise docker tag to v2026.8.8 (immich-app#30834)
- fix(deps): update typescript-projects (immich-app#30839)
- chore(deps): update dependency eslint-plugin-unicorn to v73 (immich-app#30844)
- chore(mobile): use Drift @DriftAccessor() and collapse some providers (immich-app#30693)
- chore: speed up lint ~4x by enabling svelte-eslint-parser's ts.sys hook (immich-app#30782)
- chore: flutter pub upgrade (immich-app#29985)
- chore(deps): update base-image to v202608111116 (immich-app#30818)
- fix(mobile): mark finished downloads complete instead of leaving them stuck (immich-app#29023)
- chore: more dart lints (immich-app#30665)
- chore: pump flutter_lints to 6.0 (immich-app#30664)
- fix(server): migration order (immich-app#30774)
- refactor: duplicate e2e (immich-app#30773)
- chore(server): remove unused code (immich-app#30772)
- fix: shared link create validation (immich-app#30762)
- chore(web): remove unused code (immich-app#30768)
- fix(mobile): prevent snapping to center on pinch-to-zoom release (immich-app#29207) (immich-app#29343)
- fix(mobile): disable iOS smart quotes/dashes in email/password inputs (immich-app#30767)
- refactor: server capabilities (immich-app#30663)
- feat: workflow logging (immich-app#29878)
- fix: typos in debug log messages (immich-app#30742)
- feat: workflow asset tag trigger/filter/action (immich-app#29043)
- fix(mobile): prevent iOS status bar scroll to top during transitions (immich-app#30717)
- chore(mobile): add a single mise checkout command for reoccuring tasks (immich-app#30737)
- chore: immich_mobile path in openapi pubspec (immich-app#30643)
- chore: use import.meta.dirname instead of __dirname (immich-app#30738)
- chore: remove old people provider (immich-app#30662)
- refactor: reactive driftGetAllPeopleProvider (immich-app#30660)
- refactor: unify person model (immich-app#30659)
- chore: label local only delete as trash (immich-app#30726)
- fix: riverpod reactivity regression from lint fixes (immich-app#30734)
- chore(mobile): add Cocoapods to mise (immich-app#30722)
- feat: use version service for docs archive switcher (immich-app#30675)
- fix: owner cascade delete album (immich-app#30692)
- fix: pass secrets to build-mobile (immich-app#29031)
- chore: enforce strict equality checks (immich-app#30718)
- refactor: e2e user tests (immich-app#30716)
- refactor(server): migrate e2e auth/validation tests to controller specs (immich-app#30715)
- refactor: queue in batches (immich-app#30698)
- fix: face label clipping (immich-app#30712)
- refactor: find or fail (immich-app#30697)
- chore: use gh release create instead of softprops action (immich-app#30577)
- feat: derive mobile build number from semver (immich-app#30569)
- chore: rework docker build workflow (immich-app#30626)
- chore(deps): update github-actions (immich-app#30702)
- chore(deps): update grafana/grafana docker tag to v12.4.7-ubuntu (immich-app#30700)
- chore(deps): update node.js to v24.19.0 (immich-app#30703)
- chore(deps): update ghcr.io/jdx/mise docker tag to v2026.8.3 (immich-app#30699)
- fix(deps): update dependency @immich/ui to ^0.85.0 (immich-app#30705)
- fix(deps): update typescript-projects (immich-app#30539)
- chore: migrate mobile translations accessor (5) (immich-app#30672)
- chore: migrate mobile translations accessor (4) (immich-app#30671)
- chore: migrate mobile translations accessor (3) (immich-app#30670)
- chore: migrate mobile translations accessor (2) (immich-app#30668)
- chore: migrate mobile translations accessor (1) (immich-app#30667)
- chore(mobile): more complicated Freezed pass (immich-app#30452)
- fix(mobile): don't let a frozen sync block syncing on resume (immich-app#29870)
- fix(mobile): decode remote thumbnails at displayed size (immich-app#29965)
- chore: pump flutter to 3.44.9 (immich-app#30658)
- fix(mobile): video playback controls dead for backed up videos opened from search (immich-app#30587)
- fix: translation (immich-app#30549)
- fix(deployment): Add huggingface cache directory to Dockerfile (immich-app#30357)
- refactor: gallery permission notifier (immich-app#30477)
- refactor(ml): remove insightface dependency (immich-app#30631)
- chore: add good-first-issue llm rule to contributing.md (immich-app#30645)
- chore: add asset debug action to all bottom sheets (immich-app#30611)
- chore(deps): update grafana/grafana:12.4.6-ubuntu docker digest to 124ddf0 (immich-app#30534)
- chore(deps): update prom/prometheus docker digest to 508729e (immich-app#30535)
- fix: medium tests dependencies (immich-app#30612)
- chore: cleanup translation dependency on i18n (immich-app#30596)
- fix: asset stack stacked over asset details (immich-app#30598)
- fix: map not updating after viewing an asset (immich-app#30601)
- chore: clean up last mergify remnant (immich-app#30600)
- fix: wire secondary action for bottom bar actions (immich-app#30583)
- fix: asset viewer bottom bar action colors (immich-app#30582)
- chore(mobile): simple freezed implementation on some models (immich-app#30168)
- fix(mobile): stop disabling androidx.startup initializers (immich-app#30559)
- fix(mobile): handle asset websocket events (immich-app#30499)
- chore: add reason for stopForegroundBackup in tests (immich-app#30573)
- fix: _safeRun is finally safe (immich-app#30571)
- chore: log reason for foreground backup cancellation (immich-app#30570)
- fix(mobile): keep backup remainder from going negative (immich-app#29011)
- chore: more riverpod lints from dcm (immich-app#30447)
- chore: riverpod lints from dcm (immich-app#30446)
- fix(mobile): stop long images squishing on ios (immich-app#29367)
- chore(deps): update ghcr.io/jdx/mise docker tag to v2026.8.1 (immich-app#30542)
- fix(mobile): stop websocket reconnect loop draining battery when server is unreachable (immich-app#29901)
- fix(mobile): stale local renders after editing a photo on device (immich-app#30415)
- feat(widget): add toggle to match icon theme (immich-app#30428)
- fix: use setRequireOriginal on SDK 29 and above (immich-app#29072)
- fix(mobile): run one more sync round when a request arrives mid sync (immich-app#30478)
- chore(deps): update github-actions (immich-app#30543)
- chore(web): use FUTO F-Droid repo in utilities (immich-app#30527)
- fix: metadata extraction as LensModel can be a float (immich-app#30512)
- chore: delete mergify config (immich-app#30521)
- fix(mobile): sync stack changes from the websocket (immich-app#30479)
- fix: action provider overrides (immich-app#30480)
- feat: Display the number of selected items in AlbumPickerModal title (immich-app#30485)
- fix(mobile): correct mislabeled Bengali locale entry (immich-app#30519)
- fix(server): remove the asset row when an upload fails after creating it (immich-app#30349)
- chore: typescript 7 extension for vscode (immich-app#30516)
- fix(server): reject invalid or deleted user when creating a partner (immich-app#30431)
- feat(web): search album description in add-to-album modal (immich-app#30462)
- fix(web): Fix face thumbnail when swapping merge direction (immich-app#30466)
- chore(server): test assetFileFilter (immich-app#30430)
- chore(deps): update dependency @testing-library/jest-dom to v7 (immich-app#30308)
- feat: log hint about downgrades when migration is missing (immich-app#30493)
- refactor: cleanup actions & action tests (immich-app#30265)
- refactor: mobile upload action (immich-app#29949)
- refactor: mobile tag and download actions (immich-app#29948)
- feat: album action (immich-app#29770)
- refactor: mobile share actions (immich-app#29947)
- refactor: mobile edit asset actions (immich-app#30264)
- refactor: mobile cast and slideshow action (immich-app#29768)
- refactor: mobile open in browser, similar, set profile action (immich-app#29769)
- refactor: mobile delete action (immich-app#29771)
- refactor: mobile lock action (immich-app#29767)
- feat: archive action (immich-app#29362)
- feat: stack action (immich-app#29370)
- feat: restore action (immich-app#29374)
- fix(mobile): resolve owned assets when partner owns identical asset (immich-app#30137)
- chore: drop removed build_runner flag (immich-app#30427)
- chore(mobile): depend on OpenAPI generation in appropriate codegen tasks (immich-app#30425)
- chore(mobile): remove last committed generated files (immich-app#30426)
- chore(deps): update dependency js-yaml to v5.2.2 [security] (immich-app#30441)
- fix(deps): update dependency js-yaml to v5 [security] (immich-app#30440)
- fix(deps): update typescript-projects (immich-app#30305)
- refactor: base action (immich-app#29617)
- chore: enable use_build_context_synchronously lint (immich-app#30367)
- chore(deps): update dependency opentofu to v1.12.5 (immich-app#30299)
- fix: migration order (immich-app#30424)
- chore(deps): update grafana/grafana docker tag to v12.4.6-ubuntu (immich-app#30304)
- chore(deps): update github-actions (major) (immich-app#30309)
- feat: store null instead of empty string for album.description (immich-app#30123)
- chore(mobile): Apply stricter linting rules for correctness (immich-app#30372)
- fix(docs): Revise config file instructions and notes (immich-app#30418)
- fix(docs): remove listing unraid as an "official" deployment (immich-app#30323)
- fix(server): store null instead of empty string for user password (immich-app#30223)
- chore: skip e2e tests when the stack fails to start (immich-app#30414)
- chore(mobile): Apply stricter linting rules for Flutter and known issues (immich-app#30373)
- chore(mobile): remove Pigeon generated code (immich-app#30343)
- fix: use trixie-slim base image for cli and e2e-auth-server (immich-app#30411)
- chore: deflake album to asset backfill sync test (immich-app#30417)
- chore: install mise tools from the lockfile in the server image (immich-app#30416)
- chore: sequence pnpm installs in mise tasks (immich-app#30412)
- fix: shared check for server setup availability (immich-app#30311)
- chore: enable merge queue batching (immich-app#30410)
- fix: apply disabled styling to UI buttons (immich-app#30322)
- fix: assetFileFilter path matching (immich-app#30394)
- chore(mobile): Apply stricter linting rules for formatting (immich-app#30370)
- fix: minor typos (immich-app#30385)
- chore: update merge queue configuration (immich-app#30381)
- chore(mobile): remove OpenAPI generated code (immich-app#30287)
- chore(mobile): remove Drift generated code (immich-app#30297)
- fix(mobile): refresh person thumbnail when the featured photo changes (immich-app#29350)
- chore: skip release label validation on merge queue PRs (immich-app#30361)
- feat: add spam rule to CONTRIBUTING.md genAI section (immich-app#30355)
- fix: privacy policy link (immich-app#30344)
- chore: remove old makefiles (immich-app#30339)
- fix(deployment): matplotlib in rootless deployments (immich-app#30328)
- chore: clarify contributing guidelines (immich-app#30330)
- chore: add test for admin controller permissions (immich-app#30316)
- feat: add cantonese for mobile (immich-app#30318)
- chore(deps): update github-actions (immich-app#30302)
- chore(deps): update docker.io/valkey/valkey:9 docker digest to 3acc068 (immich-app#30298)
- fix: calendar heatmap api key permissions (immich-app#30314)
- chore(deps): update ghcr.io/jdx/mise docker tag to v2026.7.15 (immich-app#30301)
- fix: calendar heatmap permissions (immich-app#30310)
- fix: make sure iOS memory widget render (immich-app#30172)