Based on Immich v3.1.0
Gallery changes
- feat(web): wrap long tag names in the Filter panel (#881) (#887)
- fix(web): touch-friendly search palette entry and
/shortcut (#885) - fix(web): include shared-space assets in palette filename/description/OCR search (#894) (#896)
- fix(web): apply search-palette tag picks as a filter, not a /search jump (#894) (#895)
- fix(web): animate the branded loading spinner (#900) (#907)
- fix(web): use the justified, selectable gallery for search results (#908) (#914)
- fix(server): apply locked-folder visibility to person search, thumbnails, and the face picker (#869) (#897)
- fix(web): stack the timeline top section above the month layers (#878) (#879)
- fix(mobile): cap the When filter's year list like every other section (#820) (#880)
- fix: reconcile fork-synced #715/#865/#870 with the rolling toolchain
- fix(mobile): reconcile fork-synced #863 with the rolling toolchain
- fix(web): unicorn-v72 conformance + bits-ui scroll-lock teardown race in fork-synced space specs
- fix(revert-to-immich): cover MinFacePreferenceMigration (upstream immich-app#30177)
- fix(web): use String#repeat for whitespace-only test fixtures
- fix(search): coexist with dormant upstream V3 (immich-app#28686)
- fix(mobile): propagate immich-app#28789 codec extraction to fork SettingsKey entries
- fix(web): satisfy unicorn/no-negated-array-predicate in cmdk-match (#826 on unicorn v72)
- fix(revert): cover the post-tag AddOAuthBearerTokenToSession migration
- fix(build): keep workspace deps symlinked in the lockfile (revert accidental injection)
- fix(ci): restore fork mise.lock entries and build the SDK before injection
- fix(openapi): reconcile fork codegen with openapi-generator v7.24.0
- fix(openapi): re-derive the fork civil-date codegen patch for generator v7.23.0
- fix(rebase): resolve batch 15/16 CI lint/format failures
- fix(rebase): re-create @immich/ui patch for 0.83.0 bump
- fix(rebase): adopt upstream Signing.xcconfig for iOS branding (immich-app#29077)
- fix(rebase): rebrand all security.txt GitHub URLs after upstream immich-app#29940
- fix(rebase): reconcile v3.0.3 rolling batch (1-14)
Other Gallery changes
- refactor(mobile): match upstream background backup implementation (#892)
- docs: correct the mobile Flutter pin in AGENTS.md (3.41.7 -> 3.44.8) (#875)
- docs: format the 2026-07-27 upstream sync report with prettier (#873)
- docs: record remote CI (9/10) and staging RC validation for the 2026-07-29 fork sync
- docs: upstream sync report 2026-07-29 (fork sync #715/#861/#870/#865)
- docs: record remote CI (9/10) and staging RC validation for the v3.1.0 rebase
- docs: upstream sync report 2026-07-27 (batches 52-54, Immich v3.1.0)
- chore(rebase): track upstream Immich v3.1.0 in branding config, README and the M8 gate
- docs: upstream sync report 2026-07-26 (batch 51)
- docs: record the same-day #772 fork sync and its CI validation
- chore(lint): satisfy eslint-unicorn v72 in the fork-synced video-trim e2e (#772 on rolling toolchain)
- docs: record the 2026-07-26 fork sync (#845-#857) and its toolchain-drift fixes
- chore(lint): satisfy eslint-unicorn v72 in fork-synced specs (#845-#857 on rolling toolchain)
- docs: record the fork-sync CI result and the mobile-smoke heap fix
- ci(mobile-smoke): give the debug APK build an 8g Gradle heap
- docs: record the #840/#842 fork sync in the 2026-07-25 upstream report
- docs: record the all-green CI result for batch 51
- docs: upstream sync report 2026-07-25 (batch 51)
- docs: record the all-green CI result for batches 48-50
- docs: upstream sync report 2026-07-24 (batches 48-50 + fork sync #837)
- docs: record the all-green CI result for batch 47
- docs: upstream sync report 2026-07-23 (batch 47 + fork sync)
- test(search): repoint fork legacy-builder specs to searchAssetBuilderLegacy (immich-app#28686)
- style(server): prettier import order in database.ts (V3 coexistence)
- chore(server): regenerate search SQL query docs after V3 coexistence rebase
- docs: search V3 coexistence design (immich-app#28686 dormant, fork stays on legacy)
- docs(fork): add RepairSharedSpaceAlbumGrantDrift (#827) to ownership manifest
- docs: record the fork sync, unicorn-v72 fix and staging validation for the cutover
- docs: record the final all-green CI result for batches 24-35
- test(medium): assert the immich-app#29008 AlbumUpdate payload in the shared-link upload spec
- docs: extend the sync report to batches 33-35 and the quarantine release
- test: adapt fork fixtures to the batch 33/35 upstream contract changes
- style: format pre-existing prettier debt in docs/ and the preflight tooling
- docs: correct the CI root cause — lockfile workspace-link flip, not pnpm or upstream
- docs: record the remote-CI round and its two root causes in the sync report
- docs: upstream sync report 2026-07-22 (batches 24-32)
- chore(lint): close out eslint-unicorn v70/v72 debt in fork-only e2e code
- chore(lint): apply autofixable eslint-unicorn fixes to fork-only e2e code
- style: format fork-touched server + web files with prettier 3.9.5
- chore(lint): propagate eslint-unicorn v72 to fork-only code
- chore(rebase): adopt TypeScript 7 toolchain for fork-only server code
- docs: upstream sync report 2026-07-21 (batches 18-23)
- chore(lint): propagate eslint-unicorn v70 to fork-only server + web code
- chore(lint): apply eslint-unicorn v70 autofixes to fork-only server code
- docs: finalize CI verification — 3 real fixes + 3 confirmed flakes
- docs: record remote CI verification and the three post-dispatch fixes
- test(mobile): stop pinning the incidental content-type header in demoLogin
- chore(mobile): regenerate shared_space_album_link drift output
- docs: upstream sync report 2026-07-20 (batches 16-18)
- chore(rebase): enumerate 14 fork migrations missing from the ownership manifest
- chore(rebase): reconcile fork ownership manifest for v3.0.3 packages/ restructure
- docs(rebase): record iOS app-group verification for immich-app#29077
- chore(rebase): regenerate fork Drift entities for Drift bump (immich-app#29113)
- docs: batch 15 (mobile cluster) integration design
Upstream commits
- chore: version v3.1.0
- chore(web): update translations (immich-app#29781)
- fix(mobile): prevent timeline scroll to top on unrelated pages (immich-app#30281)
- refactor: asset update method (immich-app#30201)
- fix(web): single grid row spacing (immich-app#30277)
- chore(mobile): harden mobile OpenAPI codegen and dependency install (immich-app#30202)
- chore: clarify MediaRepository extract logging (immich-app#30249)
- fix: shared by user detail panel (immich-app#30187)
- chore: medium tests system config helpers (immich-app#30174)
- chore: pump flutter to 3.44.8 (immich-app#30205)
- fix(mobile): align iOS widget text box with widget's corners (immich-app#30176)
- feat: button longpress handler (immich-app#30200)
- fix: don't skip person thumbnail generation if ML is disabled (immich-app#30194)
- fix(web): use RTL transform origin in AdaptiveImage (immich-app#30182)
- fix: min faces user preference (immich-app#30177)
- fix(mobile): properly align iOS widget loading state (immich-app#30173)
- chore(mobile): force swift-structured-queries lock to 0.34.0 (immich-app#30166)
- fix(web): mirror onboarding navigation icons in RTL (immich-app#30158)
- feat(mobile): custom date range for map (immich-app#26205)
- fix: run background tasks in root isolate (immich-app#30101)
- fix(mobile): allow URL validation to pass when scheme is not provided (immich-app#30142)
- fix: hypertext link to example docker-compose.rootless.yml (immich-app#30155)
- fix(web): mirror asset viewer navigation icons in RTL (immich-app#30151)
- fix(web): restore correct back route when opening person asset via direct URL (immich-app#30129)
- feat(server): new search schemas and query builders (immich-app#28686)
- fix(mobile): birthday picker date order follows locale (immich-app#29419)
- refactor: add asset update method (immich-app#29384)
- refactor: toast repository (immich-app#29386)
- chore(mobile): Adds Belarusian language option in settings on mobile (immich-app#29939)
- fix: wrong corner radius of recently added link (immich-app#30140)
- feat: password invalidate sessions (immich-app#30125)
- fix: locked view and asset view provider (immich-app#30136)
- fix: always set extension from provided file (immich-app#29839)
- chore(cli): remove -h shorthand for --skip-hash (immich-app#30119)
- fix(server): dissolve stack when its non-primary assets are deleted (immich-app#29354)
- chore: mise monorepo support is now stable (immich-app#30131)
- fix(web): use correct date field for shift-click range in Recently Added (immich-app#30071)
- chore(deps): update dependency opentofu to v1.12.4 (immich-app#28491)
- feat: exif metadata workflow filter (immich-app#29295)
- chore(deps): update dependency terragrunt to v1.1.1 (immich-app#29399)
- chore(deps): update grafana/grafana docker tag to v12.4.5-ubuntu (immich-app#29670)
- chore(deps): update terraform cloudflare to v4.52.8 (immich-app#29671)
- fix: backup delay translation key parsing (immich-app#30112)
- fix: admin user details responsive layout (immich-app#30114)
- chore(server): test assetDateFilter workflow method (immich-app#30110)
- fix(mobile): send date-only value for memories query param (immich-app#30049)
- chore(deps): update github-actions (immich-app#30089)
- fix(mobile): map unresponsive after viewing asset (immich-app#27036)
- fix: re-evaluate OIDC role claim on every login and support array values (immich-app#29991)
- fix: disable slideshow crossfade on reduced motion (immich-app#29826)
- refactor(mobile): extract CachedKeyValueRepository (immich-app#28789)
- fix: limit ocr overlay to images (immich-app#30116)
- fix(mobile): refresh asset stack after deleting viewer item (immich-app#28164)
- fix: album update event emitting (immich-app#30120)
- fix(server): send id_token_hint on OIDC logout (immich-app#29720)
- fix(mobile): treat wired ethernet as unmetered on ios (immich-app#29351)
- fix(web): improve slideshow controls visibility on bright backgrounds (immich-app#29950)
- fix(mobile): show real error when an asset can't be added to an album (immich-app#29754)
- feat: add album asset event handling (immich-app#29008)
- fix(mobile): properly group download tasks for Live Photos (immich-app#29952)
- chore(mobile): bump maplibre to 0.26.2 in SwiftPM lock (immich-app#30108)
- fix(mobile): prevent duplicate album creation during submission (immich-app#30003)
- chore: pin photo_manager to 3.9.0 (immich-app#30091)
- fix(mobile): add album picker to the partner view bottom sheet (immich-app#30099)
- chore(deps): update github-actions (major) (immich-app#30095)
- feat(web): add maintenance link to command palette (immich-app#30016)
- chore(deps): update ghcr.io/devcontainers/features/docker-in-docker docker tag to v4 (immich-app#30094)
- fix(web): lens model search (immich-app#30088)
- fix(mobile): back up files moved into a watched folder on android (immich-app#29872)
- fix(mobile): stop double close animation when dismissing an asset (immich-app#29413)
- refactor: gracefully stop during engine startup (immich-app#29179)
- chore(deps): update docker.io/valkey/valkey:9 docker digest to 8e8d64b (immich-app#30085)
- chore(deps): update dependency eslint-plugin-unicorn to v72 (immich-app#30092)
- chore(deps): update base-image to v202607211135 (immich-app#30090)
- fix(server): file uploads for files with extension only filenames (immich-app#30024)
- chore(deps): update dependency typescript to v7 (immich-app#29903)
- fix(web): space between device type and version (immich-app#30102)
- fix(deps): update typescript-projects (immich-app#30087)
- chore(deps): update ghcr.io/jdx/mise docker tag to v2026.7.11 (immich-app#30086)
- feat(docs): add bulgarian readme (immich-app#29427)
- chore(deps): update dependency eslint-plugin-unicorn to v70 - abandoned (immich-app#29684)
- fix(web): fix Country/State filters when set to Unknown (immich-app#30026)
- fix: search statistics locked folder permissions (immich-app#30063)
- fix: timebuckets locked permissions (immich-app#30066)
- chore: bump openapi-generator version to v7.24.0 (immich-app#30067)
- chore(mobile): enable Xcode displaying issues from Flutter inline (immich-app#30080)
- fix(web): attach file picker input to DOM so iOS Safari fires change … (immich-app#29660)
- fix(mobile): prevent crash on video widget dispose (immich-app#30078)
- fix: do not show the whats new page on fresh login (immich-app#30072)
- fix(web): refresh folder view after asset deletion (immich-app#29899)
- fix(web): align ContextMenu z-index with design-system token (immich-app#30015)
- chore: bump openapi-generator version to v7.23.0 (immich-app#28916)
- fix(docs): remove ref to synology channel (immich-app#30051)
- fix: long press share quality override preference settings (immich-app#30030)
- fix(mobile): update album creation to use user-defined name from dialog (immich-app#30002)
- feat: workflow filter assets by upload path (immich-app#30000)
- fix(server): return workflow steps in ascending order (immich-app#29999)
- fix: reset override for kebab buttons (immich-app#29380)
- refactor: owned action assets filter (immich-app#29382)
- chore(deps): update dependency @types/node to ^24.13.3 (immich-app#29892)
- fix(deps): update typescript-projects (immich-app#29633)
- chore: pump drift (immich-app#29113)
- chore: pump home_widget (immich-app#29981)
- feat(web): undo archive from toast (immich-app#27061)
- chore(mobile): update maplibre_gl to 0.26.2 (immich-app#29772)
- chore: pump flutter to 3.44.6 (immich-app#29886)
- chore(mobile): drop support for iOS 14 (immich-app#29780)
- chore(mobile): expose signing and bundle identities through envvars and config (immich-app#29077)
- chore(deps): update prom/prometheus docker digest to 3c42b89 (immich-app#29667)
- fix: zero byte image uploads (immich-app#29426)
- feat(web): add wake lock when uploading assets (immich-app#29820)
- chore: add GHSA as contact in security.txt (immich-app#29940)
- chore(seo): remove redundant twitter metadata tags (immich-app#29801)
- fix(server): disable heif security limit (immich-app#29954)
- feat(cli): Add --visibility flag to immich CLI upload subcommand (immich-app#29614)
- chore(deps): update ghcr.io/jdx/mise docker tag to v2026.7.7 (immich-app#29893)
- fix(web): clear birth date (immich-app#29959)
- chore: mobile code checks for i18n changes (immich-app#29958)
- refactor(server): album user route params (immich-app#29503)
- fix: mobile translations (immich-app#29955)
- fix(web): URI encode slug and reduce confusion for users (immich-app#29796)
- fix(server/workflow): add trigger for external libraries AssetCreate (immich-app#29597)
- chore: bump create-workflow-token action to v3 (immich-app#29571)
- feat(web): Keep show more open on duplicates (immich-app#29734)
- fix(server): workflow date filter, make end date inclusive (immich-app#29876)
- fix(server): updated default CSP config to support videos from V3 player (immich-app#29830)
- chore(security.txt): bump expired Expires field (RFC 9116) (immich-app#29932)
- fix(web): use Container component for responsive admin maintenance la… (immich-app#29917)
- fix(web): hide stack thumbnail tray in slideshow mode (immich-app#29918)
- fix(mobile): apply exif orientation to remote raw photos on android (immich-app#29906)