v1.95.0
Warning
⚠️ Breaking Changes ⚠️
1. Upgrade pgvecto.rs
to stable version 0.2.0
for enhanced search
Step 1: Change the docker-compose.yml
database image from 0.1.11
to 0.2.0
[...]
database:
container_name: immich_postgres
- image: tensorchord/pgvecto-rs:pg14-v0.1.11@sha256:0335a1a22f8c5dd1b697f14f079934f5152eaaa216c09b61e293be285491f8ee
+ image: tensorchord/pgvecto-rs:pg14-v0.2.0@sha256:90724186f0a3517cf6914295b5ab410db9ce23190a2d9d0b9dd6463e3fa298f0
environment:
POSTGRES_PASSWORD: ${DB_PASSWORD}
POSTGRES_USER: ${DB_USERNAME}
POSTGRES_DB: ${DB_DATABASE_NAME}
volumes:
- pgdata:/var/lib/postgresql/data
restart: always
[...]
Step 2: Perform docker compose pull
Step 3:
a) If Immich is a Postgres superuser (default)
Bring the stack up with docker compose up
When the server starts up, it will log a message like this:
WARN [DatabaseService] Could not run vector reindexing checks. If the extension was updated, please restart the Postgres instance.
This is normal. Continue to Step 4.
b) If Immich is not a Postgres superuser
If Immich doesn't have superuser permissions, you'll need to bring up the database and run a few commands manually:
BEGIN;
CREATE SCHEMA IF NOT EXISTS vectors;
ALTER DATABASE immich SET search_path TO "$user", public, vectors;
SET search_path TO "$user", public, vectors;
UPDATE pg_catalog.pg_extension SET extversion = '0.1.11' WHERE extname = 'vectors';
UPDATE pg_catalog.pg_extension SET extrelocatable = true WHERE extname = 'vectors';
ALTER EXTENSION vectors SET SCHEMA vectors;
UPDATE pg_catalog.pg_extension SET extrelocatable = false WHERE extname = 'vectors';
ALTER EXTENSION vectors UPDATE TO '0.2.0';
SELECT pgvectors_upgrade();
COMMIT;
Step 4: Terminate and restart the stack
Bring the stack down (or terminate with ctrl + c
) with:
docker compose down
Then bring it back up:
docker compose up
You'll run into a message saying:
[DatabaseRepository] Could not reindex index face_index. Attempting to auto-fix.
This is normal. The server will do some magic and start to work.
Step 5: Enjoy the new ✨search enhancements✨
2. OAuth encryption algorithm setting changes
OAuth setups using HS256
(mainly Authentik) will need to either (1) update the signing algorithm in Immich or (2) specify a signing key in the provider settings (so that it uses RS256
instead).
Specify a signing key in Authentik:
Screencast.from.02-02-2024.12.05.04.AM.webm
New Immich OAuth Setting
Background
RS256
is generally better than HS256
. RS256
is pretty much the most commonly used algorithm. The client library we use for open-id defaults to RS256
. It's very easy to setup Authentik without specifying a signing key, which will default to use HS256
. The original implementation added a hack/fallback to HS256
in some conditions to try to handle that situation. The current code removes the fallback, and adds a specific Signing Algortithm
setting which can be explicitly set. Alternatively, the issue could be fixed by specifying a signing key in Authentik.
References:
Highlights
Welcome to version v1.95.0
of Immich. This is one of the longest stretches since the last release of Immich for the past year, we only had 150+ PRs merged since the last release. There are many new improvements and features in this release that we are very excited to introduce to you.
- (Web) Search enhancement - Introduced filter to incorporate advanced search.
- (Web) Improve user experience in search view - Infinite scrolling and justified layout in search result view.
- (Web) Show partner's photos and videos on the map - Option to show shared partners assets on the map
- (Mobile) Playing video in Memory view - Videos now auto play while viewing memories on the mobile app.
- (Mobile) Gradient placeholder - A much more pleasant placeholder while scrolling through your timeline.
- (Mobile) iOS background backup on WIFI option - The iOS mobile app can restrict your backups to only work while on WIFI.
- Notable fix: Issue with unresponsive swiping in gallery view fixed on iOS.
Enhanced search feature
This feature is available on the Web only as of this release
This release adds a highly anticipated feature - advanced search with filters by date, location and more. What's more is that these filters are also compatible with smart search, so you can add text to sort by relevance at the same time.
Results are also no longer capped at 100 - scrolling down will fetch more and more assets.
pgvector
compatibility
As part of the upgrade to pgvecto.rs 0.2, we've also added pgvector support for environments where pgvecto.rs can't be used. Adding DB_VECTOR_EXTENSION=pgvector
to the .env
file will use pgvector instead (assuming your Postgres instance has pgvector installed). We'd like to give a special shoutout to the pgvecto.rs team for adding a compatibility mode that makes it easier for us to support both extensions.
Please note that the extension cannot be changed after a successful startup (i.e., migrations have run). This means you can't switch to pgvector from an existing instance with pgvecto.rs. It must be a new instance or an instance coming from 1.90.2 or older. Additionally, some features may not work quite as well with pgvector.
If you're upgrading from an old version of Immich, the migrations will take some time - don't worry if the server doesn't start up immediately.
Show partner's photos and videos on the map
This feature is available on the Web only as of this release
You can now toggle the option to include partners' assets on the map view.
Gradient placeholder on the mobile app
iOS background backup on WIFI option
You can now toggle this option only to allow background backup while the device is connected to the WIFI network.
External library import path validation
Several users struggle with getting import paths correct with external libraries. This version adds several checks and validations so that the user gets feedback on what went wrong.
CLI release
New CLI version 2.0.8. This version supports running inside Docker without needing Node.js installed, which helps on some platforms. Under the hood, it has been migrated to the new API version, uses vitest
instead of jest
, and has seen several improvements and bug fixes.
And as always, bugs are fixed, and many other improvements also come with this release.
Please consider supporting the project.
Support
If you find the project helpful, you can support Immich via the following channels.
- Monthly donation via GitHub Sponsors
- One-time donation via GitHub Sponsors
- Librepay
- buymeacoffee
- Bitcoin: 3QVAb9dCHutquVejeNXitPqZX26Yg5kxb7
It is a great way to let me know that you want me to continue developing and working on this project for years to come.
What's Changed
⚠️ Breaking Changes
- feat(server)!: oauth encryption algorithm setting by @danieldietzler in #6818
- feat(server)!: pgvecto.rs 0.2 and pgvector compatibility by @mertalev in #6785
🗄️ Server
- fix(server): extract duration from video as ISO time by @alextran1502 in #6863
- chore(server): Use ChunkedSet in Access repository by @adamantike in #6943
- feat(server): optimize face re-queueing by @mertalev in #6961
- fix(server): check if sidecarPath exists by @JW-CH in #6293
- fix(server): use luxon for deleted date calculation by @manasadepu in #6958
- feat(server): server-side checking of duplicate import paths and exclusion patterns by @etnoy in #6993
- feat(server): restore modified at timestamp after upload, preserve when copying by @jextrevor in #7010
- feat(server, web): smart search filtering and pagination by @mertalev in #6525
- refactor: library watching by @jrasm91 in #7071
- feat: Search filtering logic by @alextran1502 in #6968
- feat(server, web): Include partner's photos on map by @ttyridal in #7065
- feat(server): only transcode streams that require it by @mertalev in #7106
- fix(server): recognize faces when min. faces is set to 1 by @michelheusschen in #7144
- feat: enhance search by @alextran1502 in #7127
- fix(server): empty/restore trash by @michelheusschen in #7161
- fix(server): not in album filter show motion part of LivePhotos by @alextran1502 in #7175
- feat(server): optimize get asset query by @mertalev in #7176
- fix(server): on_asset_update event sends varying data types by @michelheusschen in #7179
- fix(server):
getAllAssets
endpoint includes motion part of LivePhotos by @alextran1502 in #7194
📱 Mobile
- fix(mobile): video player shows black screen by @alextran1502 in #6819
- feat(mobile): Add support for Basic Authentication by @rovo89 in #6840
- feat(mobile): Add haptic feedback to asset grid by @l0nax in #5344
- fix(mobile): debounce map layer update by @shenlong-tanwen in #6861
- feat(mobile): Adds show password field to login by @martyfuhry in #6918
- feat(mobile): Memories activity is now full screen, better image fit, adds progress indicator by @martyfuhry in #6793
- refactor(mobile): map heatmap color and location picker by @shenlong-tanwen in #6553
- feat(mobile): Adds WiFi only backup option to iOS by @martyfuhry in #6724
- feat(mobile): Videos play in memories now by @martyfuhry in #6940
- fix(mobile): Stop advancing to next memory on video ended by @martyfuhry in #7007
- fix(mobile): stack entity handling by @shenlong-tanwen in #6980
- refactor(mobile): Immich image provider by @martyfuhry in #7016
- chore(mobile): Put the real delete button before other delete variants by @lukaszwawrzyk in #6895
- fix(mobile): Fixed exclude analyzer options by @martyfuhry in #7125
- fix(mobile): bottom app bar icons by @waclaw66 in #7147
- refactor(mobile): Use widgets in Immich asset grid by @martyfuhry in #7140
- fix(mobile): Fixes bottom exif info sheet modal drag controls by @martyfuhry in #7165
- chore(mobile): Adds dart format to static analysis by @martyfuhry in #7193
- fix(mobile): Fixes memory lane progress indicator color in dark mode by @martyfuhry in #7199
- fix(mobile): Prefer sharing local assets to remote by @martyfuhry in #7245
🖥️ Web
- fix(web): Admin Settings banner/scrolling issue by @azroberts8 in #6839
- feat(web): improved album view UI & album card UI by @azroberts8 in #6822
- feat(web): search filter form by @alextran1502 in #6651
- fix: set default thumbnail aspect ratio to square by @lukashass in #6970
- fix(web): Handle duplicate library settings gracefully by @etnoy in #6950
- fix (web): panorama / 360 view - partial panorama: use photo-sphere-viewer by @dmitry-brazhenko in #6992
- feat(web): store accordion state in search params by @danieldietzler in #6435
- fix(web): update profile picture by @martabal in #7034
- refactor: authentication on public routes by @martabal in #6765
- feat(web): add a setting to load the original file by @martabal in #6753
- feat(web): navigate with keyboard on person page by @martabal in #5486
- chore(web,mobile): Fix reoccurring typo by @ItsJustRuby in #7111
- fix(web): always show asset owner when viewing an asset from a shared album by @martabal in #7104
- chore: suppress abort errors by @jrasm91 in #7120
- fix(web): search params by @alextran1502 in #7123
- fix(web): update unauthorized share link handling by @benmccann in #7126
- chore(web): upgrade to maplibre 4 by @danieldietzler in #7132
- refactor(web): websocket events by @michelheusschen in #7152
- fix(web) display wrong apikey-name on edit by @JW-CH in #7131
- chore: remove svelte-preprocess by @benmccann in #7159
- fix(web): validation when editing asset date & time by @michelheusschen in #7160
- feat(web): add skip link to top navigation by @ben-basten in #7091
- chore(web): remove createEventDispatcher from LoginForm by @benmccann in #7177
- perf(web): optimize images and modules by @martabal in #7088
- fix: only show scrollbars if needed by @uhthomas in #7191
- fix(web): memory view broken by enhanced:img import by @michelheusschen in #7206
- fix(web): broken links to places search by @michelheusschen in #7208
- fix(web): don't show motion part in search result by @alextran1502 in #7210
- chore(web): show people list on a single line in filter form when not expanded by @alextran1502 in #7216
- fix(web): download from shared album link by @jrasm91 in #7227
- fix(web): websocket reconnect by @michelheusschen in #7234
- feat(web): improve feedback for favorite and archive actions by @michelheusschen in #7232
🧠 Machine Learning
- fix(ml): openvino not working with dynamic axes by @mertalev in #6871
- chore(ml): make execution provider log info-level by @mertalev in #7024
- feat(ml): improve test coverage by @mertalev in #7041
- fix(ml): re-enable ARMNN integration by @fyfrey in #7053
⚡ CLI
- fix(cli): auth file should be chmod 600 by @etnoy in #6925
- chore(cli): use upload api and update documentation by @etnoy in #6927
- feat(cli): dockerize by @etnoy in #6858
- chore(cli): publish docker image on ghcr by @etnoy in #6964
- fix(cli): broken fetch client by @jrasm91 in #7020
- feat(cli): concurrent upload by @mertalev in #7192
📓 Documentation
- docs(ml): hardware acceleration by @mertalev in #6821
- Documentation: provide details on storage engine album naming by @mmomjian in #6812
- docs(ml,server): updated hwaccel docs by @mertalev in #6878
- chore(docs): Small FAQ tweaks and nits by @bo0tzz in #6880
- Update command-line-interface.md by @jsixface in #6944
- fix(docs): add cuda tag to ml hwaccel example by @mertalev in #6972
- docs: fix web development setup instructions by @lukashass in #6969
- chore: add repo activity to readme by @alextran1502 in #6982
- fix: remove dead link from docs by @melvinsh in #7027
- Change license to AGPLv3 by @alextran1502 in #7046
- fix(docs): document vector extension env variable by @mertalev in #7220
🔨 Maintenance
- chore: simplify API build by @benmccann in #6841
- chore(server,cli,web): housekeeping and stricter code style by @etnoy in #6751
- fix(deps): update server by @renovate in #6769
- chore(deps): update redis:6.2-alpine docker digest to 51d6c56 by @renovate in #6782
- chore: remove
form-data
dependency by @benmccann in #6876 - fix: bundle CLI with Vite by @benmccann in #6893
- chore: remove axios dependency from CLI by @benmccann in #6888
- chore(deps): update @immich/cli by @renovate in #6928
- fix(deps): update dependency fastapi to v0.109.1 [security] by @renovate in #6923
- chore(deps): update dependency @types/node to v20.11.15 by @renovate in #6929
- chore: build API with esnext target by @benmccann in #6926
- chore(deps): update dependency @types/node to v20.11.16 by @renovate in #6946
- chore(deps): update dependency @types/node to v20.11.16 by @renovate in #6947
- chore(web): remove maplibre dependency by @danieldietzler in #6948
- chore(deps): update base-image to v20240206 (major) by @renovate in #6942
- chore(deps): update web by @renovate in #6933
- chore(deps): update server by @renovate in #6930
- chore(deps): update dependency eslint-plugin-unicorn to v51 by @renovate in #6952
- chore(deps): update @immich/cli by @renovate in #6951
- chore(deps): pin tensorchord/pgvecto-rs docker tag to 9072418 by @renovate in #6960
- chore(deps): bump stumpylog/image-cleaner-action from 0.4.0 to 0.5.0 by @dependabot in #6965
- chore(dep): add intl to ignoreDeps and remove unused packages by @shenlong-tanwen in #6967
- chore: setup
rollup-plugin-visualizer
and removelodash
by @benmccann in #6974 - refactor(server): asset core by @jrasm91 in #6985
- chore(server): remove deprecated endpoints by @jrasm91 in #6984
- fix: update lodash calls by @benmccann in #6996
- chore: cleanup layout setup by @benmccann in #6995
- chore: tree shake unused API methods from CLI by @benmccann in #6973
- fix: unnecessary .env file usage by @jrasm91 in #7005
- chore: remove unneccessary async/awaits by @benmccann in #7009
- refactor(web): removed panorama-viewer.css by @dmitry-brazhenko in #7012
- feat(server): replace axios dependency by fetch by @martabal in #7018
- chore: upgrade to Vite 5.1.1 by @benmccann in #7040
- fix(cli): Run npm ci in sdk folder before deploying to npm by @etnoy in #6986
- fix(deps): update dependency python-multipart to v0.0.7 [security] by @renovate in #7054
- feat(web): lazy load photo sphere viewer by @benmccann in #7057
- chore: update lockfiles by @benmccann in #7062
- fix(web): remove warnings during the build by @martabal in #7035
- chore(deps): pin tensorchord/pgvecto-rs docker tag to 9072418 by @renovate in #7066
- chore(deps): update web by @renovate in #7067
- chore(deps): update machine-learning by @renovate in #6931
- chore(deps): update machine-learning (major) by @renovate in #6934
- fix(deps): update dependency picomatch to v4 by @renovate in #7073
- chore: suppress diff for generated clients by @jrasm91 in #7072
- chore(deps): update dependency vite to v5.1.0 by @renovate in #7080
- chore(deps): update dependency oazapfts to v5.1.5 by @renovate in #7079
- chore(deps): update base-image to v20240213 (major) by @renovate in #7081
- chore(deps): update machine-learning by @renovate in #7074
- fix(deps): update server by @renovate in #7069
- fix(deps): update docs by @renovate in #7068
- chore(deps): update machine-learning by @renovate in #7084
- chore(deps): update web by @renovate in #7086
- web: e2e by @jrasm91 in #7063
- fix(deps): bump oazapfts to v6 by @jrasm91 in #7093
- refactor(web): use new open api client by @jrasm91 in #7097
- chore(deps): update dependency @types/node to v20.11.17 by @renovate in #7098
- chore(deps): update dependency @types/node to v20.11.17 by @renovate in #7099
- chore(deps): update dependency @types/node to v20.11.17 by @renovate in #7102
- refactor(web) open api client by @jrasm91 in #7103
- chore: enum support for new API by @benmccann in #7110
- chore(cli): auto-sort imports by @jrasm91 in #7116
- chore: web shutdown signal by @jrasm91 in #7114
- fix: update error handling to match new API by @benmccann in #7117
- chore(web): auto sort imports by @jrasm91 in #7118
- chore(deps): upgrade tj-actions/verify-changed-files to v18 by @benmccann in #7121
- chore: web e2e improvements by @jrasm91 in #7155
- chore(deps): update typescript-eslint monorepo to v7 (major) by @renovate in #7171
- fix: shell scripts by @martabal in #7186
- fix: shell scripts by @martabal in #7189
- chore: cleanup old jest references by @jrasm91 in #7198
- refactor: server auth e2e by @jrasm91 in #7203
- chore: remove unused file by @jrasm91 in #7205
- refactor: cli e2e by @jrasm91 in #7211
- chore(deps): update dependency vite to v5.1.2 by @renovate in #7218
- chore(deps): pin dependencies by @renovate in #7217
- chore(deps): update web by @renovate in #7221
- fix(deps): update dependency @mdx-js/react to v3.0.1 by @renovate in #7222
- refactor(server): e2e by @jrasm91 in #7223
- fix(deps): update server by @renovate in #7224
Other changes
New Contributors
- @azroberts8 made their first contribution in #6839
- @rovo89 made their first contribution in #6840
- @jsixface made their first contribution in #6944
- @lukashass made their first contribution in #6969
- @manasadepu made their first contribution in #6958
- @melvinsh made their first contribution in #7027
- @jextrevor made their first contribution in #7010
- @ItsJustRuby made their first contribution in #7111
- @ttyridal made their first contribution in #7065
- @ben-basten made their first contribution in #7091
Full Changelog: v1.94.1...v1.95.0