* feat(server): require auth for more endpoints
* dev: add authorization header to profile image on mobile
---------
Co-authored-by: Alex <alex.tran1502@gmail.com>
* fix(mobile): allow syncing duplicate local IDs
* enable to run isar unit tests on CI
* serialize sync operations, add pull to refresh on timeline
---------
Co-authored-by: Fynn Petersen-Frey <zoodyy@users.noreply.github.com>
* Added placeholder for search explore
* refactor immich asset grid to use ref and provider
* all videos page
* got favorites, recently added, videos, and motion videos all using the immich grid
* Fixed issue with hero animations
* theming
* localization
* delete empty file
* style text
* Styling icons
* more styling
---------
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* Use new search API and GridView for Places / Locations
* Fixes search service by adding clip: true
* Rebased from master, uses view all explore grid now
* localized view all button
* adds empty
* style text
* Fix issue with horizontal Things not render due to missing height info
---------
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* fix(server): Return the original path for gifs.
Usually browser is able to play them directly.
* fix(server): Better place for the condition.
* fix(server): gif viewing works properly.
* refactor: job to domain
* chore: regenerate open api
* chore: tests
* fix: missing breaks
* fix: get asset with missing exif data
---------
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* shows the owner name of shared albums
* responsive and better names
* rich text
* localization and overflow
* unused import
* adds on tap
* suppress owner name for regular album view
* aspect ratio
* Add some styling to text
* More styling
* Style album thumbnail name
---------
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* feature(mobile): no longer wait for background backup in settings
migrate all Hive boxes required for the backup process to Isar
* add final modifier
* feat(web): improve /auth pages
* invalidate load functions after login
* handle login server errors more graceful
* add loading state to oauth button
* add check for encoded video file to be deleted with asset
* remove unnecessary code and adjust test
* complete test
* fix unit test
* fix unit test properly this time
* fix formatting
---------
Co-authored-by: Sebastian Schöttl <sebastian.schoettl@cybertechnologies.com>
* fix: sorted shared album
* Added TODO comment for tomorrow work
* update album shared property after adding user
---------
Co-authored-by: Fynn Petersen-Frey <zoodyy@users.noreply.github.com>
* improves login form
* login form improvements
* correctly trim server endpoint controller text when logging in
* don't show loading while fetching server info
* fixes get server login credentials
* fixes up sign in form
* error handling
* fixed layout
* removed placeholder text
* feat: explore
* chore: generate open api
* styling explore page
* styling no result page
* style overlay
* style: bluring text on thumbnail card for readability
* explore page tweaks
* fix(web): search urls
* feat(web): use objects for things
* feat(server): filter by motion, sort by createdAt
* More styling
* better navigation
---------
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
Co-authored-by: Michel Heusschen <59014050+michelheusschen@users.noreply.github.com>
* feat(server): improve thumbnail relation and updating
* improve query + update tests and migration
* make sure uuids are valid in migration
* fix unit test
* Use multi stage build to slim down ML image size
* Use gunicorn as WSGI server in ML image
* Configure gunicorn server for ML use case
* Use requirements.txt file to install python dependencies in ML image
* Make ML listen IP configurable
* Revert "Use requirements.txt file to install python dependencies in ML image"
This reverts commit 32e706c7f3.
* Separate out pip installs in ML builder image
* feature(mobile): sync assets, albums & users to local database on device
* try to fix tests
* move DB sync operations to new SyncService
* clear db on user logout
* fix reason for endless loading timeline
* fix error when deleting album
* fix thumbnail of device albums
* add a few comments
* fix Hive box not open in album service when loading local assets
* adjust tests to int IDs
* fix bug: show all albums when Recent is selected
* update generated api
* reworked Recents album isAll handling
* guard against wrongly interleaved sync operations
* fix: timeline asset ordering (sort asset state by created at)
* fix: sort assets in albums by created at
* build: add typesense to docker
* feat(server): typesense search
* feat(web): search
* fix(web): show api error response message
* chore: search tests
* chore: regenerate open api
* fix: disable typesense on e2e
* fix: number properties for open api (dart)
* fix: e2e test
* fix: change lat/lng from floats to typesense geopoint
* dev: Add smartInfo relation to findAssetById to be able to query against it
---------
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* Use multi stage build to slim down ML image size
* Use gunicorn as WSGI server in ML image
* Configure gunicorn server for ML use case
* Use requirements.txt file to install python dependencies in ML image
* Make ML listen IP configurable
* rebuilding gridview
* adds listview, gridview and responsive display to backup album selection
* aligned selection info title and chips to the left
* fixed search
* style: album tile
---------
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* adds onboarding
* fixed error where login was taking you to permission page
* fixed a bad rebase and added more checks to not start backup service on login if no gallery permission
* forgot the permission handler import in AppDelegate
* reverts album selection page
* change to ref watch
* added device_info_plus to podspec
* removed unused import
---------
Co-authored-by: Marty Fuhry <marty@fuhry.farm>
* chore: update package-lock.json version
* rfix(server) long album load time
* remove all eagerness
* generate index
* remove console.log
* remove deadcode
* fix: shared link album owner
* Install nightly release of pytorch to enable ML support for arm CPUs
* Remove linux/arm/v7 from ML docker builds
* Add --no-cache-dir to torch installation command in ML image build
* Use PIP_NO_CACHE_DIR option in ML build to further decrease image size
* fix(machine-learning): Add the command to execute at startup
Previously it wasn't set in the Docker container but it should be.
* fix(docker): remove machine-learning command arg
* fix(docker): machine-learning CMD argument
* fix(ci): Mobile build should not run on PRs
It doesn't have the necessary secrets exposed for it succeed in PR context.
* ci(mobile): Run only on internal PRs
* fix(mobile): no album thumbnail lead to no album selection shown
* add more log info
* added global error handling
* better place to init logger
* get more log
* fix(server): Object detection query has incorrect value
* fix: get stats for user using the wrong property id from response
* chore: update openapi version
* fixed regression where i accidentally removed load translations from the background sync
* only for android
---------
Co-authored-by: Marty Fuhry <marty@fuhry.farm>
* fix(mobile): user get logged out upon clicking on any thing after logging in
* wip: fixing still
* fix: the actual issue
* Fix: avaialble album not updating UI
* first run of getting background sync working in iOS
* got background sync calling into flutter
* added background task
* added necessary sync files
* fixed some names and added more implementations
* got as far as Hive.initFlutter
* brute force got to await Hive.initFlutter
* lots of print statements to figure out where execution is failing, and its failing at the root asset bundle in the localization.dart service
* first time working, got plugins registered
* removed broken cleanup code
* refactored
* linters
* now can pass user settings
* background service plugin uses app background processing instead of fetch
* renamed backgroundFetch to backgroundProcessing to make it clearer
* don't use max delay
* adds fetch back in
* fixes require charging default values and backup controller page
* fixes background fetch
* fixes ios not importing photos
* guarded path provider ios
* lint
* adds max tries for heartbeat to work in iOS
* fail after seconds
* timeout instead of fail after seconds
* removes release lock from system stop
* restores checkLockReleasedWithHeartbeat to Future<void>
* removes max tries from acquire lock
* fixes lock timeout with iOS
* restored for loop
* adds comments, made the AppRefresh task only run while not requiring network or charge
* fixed compile issue
* now both are registered and added better comments. also added ability for task to cancel itself
* added the podfile and pubspec
* added backup diagnostics to IOS and removed iOS ignored backup options and fixed network connectivity always required
* Added Alex's dev team
* styled debug list item, fixed refresh task not set bug, fixed enable / disable background service on platform channel
---------
Co-authored-by: Marty Fuhry <marty@fuhry.farm>
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* stlye: forms
* style: navigation bar
* style: user profile popup
* style: context menu
* fix: prettier
* style: manage account dark theme color
* style: user profile image border; fix: profile panel z-index
* style: border for profile image on hover and scrolling in administration page
* style: font size
* style: gap between day in a row
* chore(server): tidy up exif typeorm entity definition
* chore(server): tidy up shared link typeorm entity definition
* chore(server): tidy up smart info typeorm entity definition
* chore(server): tidy up tag typeorm entity definition
* ci: add job that checks typeorm migrations are correct and up-to-date
* fix: add correct relations to asset typeorm entity
* fix: add missing createdAt column to asset entity
* ci: run check to make sure generated API is up-to-date
* ci: cancel workflows that aren't for the latest commit in a branch
* chore: add fvm config for flutter
* infra: make api-key primary key column a UUID
* infra: move ManyToMany relations in album entity, make ownerId ManyToOne
---------
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
BREAKING CHANGES
* Users have to update the docker-compose file, machine-learning portion.
* Temporary dropping machine-learning support for Arm64 and Armv7
* fix(web/server): Uploaded asset to shared link does not get added to the shared link/album
* remove unused code
* Add endpoints for each remove and add assets to shared link
* Update api
* Added deletion logic
* Convert callback to async/await
* Fix linter
* Fix test
* Fix server test
* added test
* Test coverage
* modify DTO
* Add notification
* fix test
* feat(server/web): Initial support for RAF and SRW RAW formats.
* It should return the promise.
* Better comment
* feat(server/web): file-uploader needed changes.
* Remove un-used imports
* The failing test.. is no longer failing.
* Run prettier
* Original implementation with just a catch block added.
* feat(server): Some tests and specific handling for the two raw formats
* feat(web): Helper for raw image type.
* Handling of mimetype on server
* Handling of mimetypes on web with a map
* Bring back the acceptedfile filter
* Fix the asset-upload tests after changes
* acceptedFile is not usable due to type being empty from browser.
* Switch needs to use lowercase variants.
* Address Discord comments
* feat(mobile): Library page rework (album sorting, favorites) (#1501)
* Add album sorting
* Change AppBar to match photos page behaviour
* Add buttons
* First crude implementation of the favorites page
* Clean up
* Add favorite button
* i18n
* Add star indicator to thumbnail
* Add favorite logic to separate provider and fix favorite behavior in album
* Review feedback (Add isFavorite variable)
* dev: style buttons
* dev: styled drop down button
---------
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* feat(mobile): Tap to enter immersive mode on gallery viewer (#1546)
* feat(mobile): Removed stay logged in checkbox and made it enabled by default (#1550)
* removed stay logged in checkbox and made it enabled by default
* adds padding to login button
* removed all isSaveLogin
* fix: logout would re-login with previous credential upon app restart
---------
Co-authored-by: Alex <alex.tran1502@gmail.com>
* chore(server): remove token when logged out (#1560)
* chore(mobile): invoke logout() on mobile app
* feat: add mechanism to delete token from logging out endpoint
* fix: set state after login sequence success
* fix: not removing token when logging out from OAuth
* fix: prettier
* refactor: using accessTokenId to delete
* chore: pr comments
* fix: test
* fix: test threshold
* feat(deployment): support docker secrets (#1254)
* Support secrets
* Rewrite to support sh
* Remove JWT_SECRET
* fix(mobile): Added flutter native splash and splash screens (#1520)
* rebasing
* added launch background image to repository
---------
Co-authored-by: Marty Fuhry <marty@fuhry.farm>
* refactor(mobile): introduce Album & User classes (#1561)
replace usages of AlbumResponseDto with Album
replace usages of UserResponseDto with User
* feat(mobile): Multiselect add to favorite from the timeline (#1558)
* multiselect add to favorites
* feat(server): add updatedAt to Asset, Album and User (#1566)
* feat: add updatedAt info to DTO and generate api
* chore: remove unsued file
* chore: Add update statement to add/remove asset/user to album
* fix: test
* chore(server): update package-lock.json to match package.json (#1573)
* chore(server) Add user FK to album entity (#1569)
* chore(deps): bump docker/setup-buildx-action from 2.4.0 to 2.4.1 (#1575)
Bumps [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action) from 2.4.0 to 2.4.1.
- [Release notes](https://github.com/docker/setup-buildx-action/releases)
- [Commits](https://github.com/docker/setup-buildx-action/compare/v2.4.0...v2.4.1)
---
updated-dependencies:
- dependency-name: docker/setup-buildx-action
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* chore(server): make owner as required response for AlbumResponseDto (#1579)
* feat(GitHub): update bug and feature request template (#1584)
* dev: Reusing template from Home Assistant
* dev: add bug report template
* fix: template
* dev: change type
* dev:
* dev: add default labels
* dev: Add default title
* dev: add feature request template
* remove feature request from markdown
* dev: frontmatter
* fix(GitHub): feature request template
* fix(GitHub): feature request form has wrong type for textarea
* feat(mobile): Responsive layout improvements with a navigation rail and album grid (#1583)
* feat(proxy): Initial IPv6 support (#1577)
* fix(server): Create album response doesn't have owner property as required (#1704)
* feat(web): allow uploading more file types (#1570)
* feat(web): allow uploading more file types
* fix(web): make filename extension lowercase
* refactor(mobile): add Isar DB & Store class (#1574)
* refactor(mobile): add Isar DB & Store class
new Store: globally accessible key-value store like Hive (but based on Isar)
replace first few places of Hive usage with the new Store
* reduce max. DB size to prevent errors on older iOS devices
---------
Co-authored-by: Alex <alex.tran1502@gmail.com>
* feat(mobile): Home screen customization options (#1563)
* Try staggered layout for home page
* Introduce setting for dynamic layout
* Fix some provider related bugs
* Make asset grouping configurable
* Add translation keys, refactor group title
* Rename enum values
* Fix enum names
* Reformat long if statement
* Fix timezone related bug
* Minor clean up
* Fix unit test
* Add second assets check back to home screen
* [Localizely] Translations update (#1707)
* fix(server): get shared link album info doesn't contain owner property (#1708)
* Version v1.46.0
* feat(server/web): file-uploader needed changes.
* Add raf and srw to the file names.
* Remember to add the extensions to fileSelector.
* Removed the getMimeType function on server as shouldn't be needed anymore.
* Revert "Removed the getMimeType function on server as shouldn't be needed anymore."
It is required still.
This reverts commit fc766dd0be.
* Should use proper mimetypes.
* fix linter
---------
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: Matthias Rupp <matthias.rupp@posteo.de>
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
Co-authored-by: martyfuhry <martyfuhry@gmail.com>
Co-authored-by: James <jdm12989@gmail.com>
Co-authored-by: Marty Fuhry <marty@fuhry.farm>
Co-authored-by: Fynn Petersen-Frey <zoodyy@users.noreply.github.com>
Co-authored-by: Zack Pollard <zackpollard@ymail.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Michel Heusschen <59014050+michelheusschen@users.noreply.github.com>
Co-authored-by: Immich Release Bot <bot@immich.app>
* uses profile photo for user avatar drawer
* Added some styling to the profile picture
* made the whole profile photo a gesture detector
* fixed image updating
* invalidates cachednetworkimage when new profile photo is uploaded
* Revert "invalidates cachednetworkimage when new profile photo is uploaded"
This reverts commit 17c83be556.
* Add fadeInImage to loading user profile
---------
Co-authored-by: Alex <alex.tran1502@gmail.com>
* Group by date objects instead of strings
* Change OpenAPI code generation to wrap json decoding in
Change OpenAPI code generation to wrap decodeJson in compute
* Remove orig file
* Fix linter error
* Change drag handle date format
* Order timeline explictly from new to old
---------
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* Try staggered layout for home page
* Introduce setting for dynamic layout
* Fix some provider related bugs
* Make asset grouping configurable
* Add translation keys, refactor group title
* Rename enum values
* Fix enum names
* Reformat long if statement
* Fix timezone related bug
* Minor clean up
* Fix unit test
* Add second assets check back to home screen
* refactor(mobile): add Isar DB & Store class
new Store: globally accessible key-value store like Hive (but based on Isar)
replace first few places of Hive usage with the new Store
* reduce max. DB size to prevent errors on older iOS devices
---------
Co-authored-by: Alex <alex.tran1502@gmail.com>
* feat: add updatedAt info to DTO and generate api
* chore: remove unsued file
* chore: Add update statement to add/remove asset/user to album
* fix: test
* chore(mobile): invoke logout() on mobile app
* feat: add mechanism to delete token from logging out endpoint
* fix: set state after login sequence success
* fix: not removing token when logging out from OAuth
* fix: prettier
* refactor: using accessTokenId to delete
* chore: pr comments
* fix: test
* fix: test threshold
* removed stay logged in checkbox and made it enabled by default
* adds padding to login button
* removed all isSaveLogin
* fix: logout would re-login with previous credential upon app restart
---------
Co-authored-by: Alex <alex.tran1502@gmail.com>
* Add album sorting
* Change AppBar to match photos page behaviour
* Add buttons
* First crude implementation of the favorites page
* Clean up
* Add favorite button
* i18n
* Add star indicator to thumbnail
* Add favorite logic to separate provider and fix favorite behavior in album
* Review feedback (Add isFavorite variable)
* dev: style buttons
* dev: styled drop down button
---------
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* fix(ci): Run release version bump before mobile build
* feat(ci): Add ref input to build-mobile
* feat(ci): Pass new tag ref to build_mobile flow in prepare-release
* chore(ci): Naming
* fullscreen image effects
* toggles app bar instead of hides on tap
* edgeToEdge mode to render beneath navbar on android
* fixed appbar size
* fixed safearea for video and added opacity to appbar in gallery
* wrapped in black container to fix artifact on iOS
* changed to black
* added scaffold back woops
* chore: remove @tensorflow/tfjs-node-gpu as it is unused
* chore: remove ffmpeg from machine-learning docker image
* chore: remove unneeded dependencies + move dev dependencies in server
* chore: reduce server image size
* chore: machine-learning remove extraneous dependencies
* chore: web remove extraneous dependencies
* chore: web Dockerfile reduce production image size
* chore: add exiftool-vendored.pl as a dependency
* photoviewgallery
* stiffer scrolling to react more like google photos
* adds a dx threshhold for the swipe/up down from the original dropped point
* stopped wrapping imageview in gallery viewer to avoid the double photoview issue. breaks imageview page pinch-to-zoom, so i need to fix that for other callers
* refactors gallery view to use remoteimage directly and breaks imageviewpage
* removed image_viewer_page
* adds minscale
* adds photo_view to repository
* double tap to zoom out with hacked commit
* double tapping!
* got up and down swipe gestures working
* fixed wrong cache and headers in image providers
* fixed image quality and added videos back in
* local loading asset image fix
* precaches images
* fixes lint errors
* deleted remote_photo_view and more linters
* fixes scale
* load preview and load original
* precache does original / preview as well
* refactored image providers to nice functions and added JPEG thumbnail format to remote image thumbnail lookup
* moved photo_view to shared/ui/
* three stage loading with webp and fixes some thumbnail fits
* fixed local thumbnail
* fixed paging in iOS
* fixes back button multiselection on android in main timeline
* back button on multiselect in album clears selection
* fixed homepage back and refactor future
* not a futureOr
* File size localisation
* Localisation for sidebar tooltips
* Localisation for active/waiting jobs
* Localisation for selected item counts
* Prettier
* Ignore Jest coverage directory for Prettier
* chore: add typeorm commands to npm and set default database config values
* feat: move to server side authentication tokens
* fix: websocket should emit error and disconnect on error thrown by the server
* refactor: rename cookie-auth-strategy to user-auth-strategy
* feat: user tokens and API keys now use SHA256 hash for performance improvements
* test: album e2e test remove unneeded module import
* infra: truncate api key table as old keys will no longer work with new hash algorithm
* fix(server): e2e tests (#1435)
* fix: root module paths
* chore: linting
* chore: rename user-auth to strategy.ts and make validate return AuthUserDto
* fix: we should always send HttpOnly for our auth cookies
* chore: remove now unused crypto functions and jwt dependencies
* fix: return the extra fields for AuthUserDto in auth service validate
---------
Co-authored-by: Jason Rasmussen <jrasm91@gmail.com>
* Duplicate photos page and rename to favorites
* Implement basic functionality to page
* Sort imports
* Add missing sharing code
* Remove unused import
* Fix formatting
* Use GalleryViewer and new api endpoint
* Merge useFavorites into page
* Run prettier
* Move favorites in side-bar
* Remove favorites when unfavorited
* Fix close shared link model
* Add favorite count to side-bar
* Add add to favorites option
* Fix formatting
* Add favorite icon to image thumbnails
* Change var to let
* add to album from asset detail view
* layout and design
* added shared albums
* fixed remote, asset update, and hit test
* made static size
* fixed create album
* suppress shared expansion tile if there are no shared albums
* updates album
* padding on tile
* Add integration tests for the login process
* Reorganize tests
* Test wrong instance URL
* Run mobile unit tests in CI
* Fix CI
* Pin Flutter Version to 3.3.10
* Push something stupid to re-trigger CI
* docs(cli): Clarify CLI-in-docker instructions
* docs(cli): Add more example commands
* docs(cli): Add port to example command
* docs(cli): Really fix the server port this time
* Added migration files
* Added logic for shared album level
* Added permission for EXIF
* Update shared link response dto
* Added condition to show download button
* Create and edit link with new parameter:
* Remove deadcode
* PR feedback
* More refactor
* Move logic of allow original file to service
* Simplify
* Wording
* feat: support isEdited flag for SettingSwitch
* feat: add transcodeAll ffmpeg settings for extra transcoding control
* refactor: tidy up and rename current video transcoding code + transcode everything
* feat: better video transcoding with ffprobe
analyses video files to see if they are already in the desired format
allows admin to choose to transcode all videos regardless of the current format
* fix: always serve encoded video if it exists
* feat: change video codec option to a select box, limit options
removed previous video codec config option as it's incompatible with new options
removed mapping for encoder to codec as we now store the codec in the config
* feat: add video conversion job for transcoding previously missed videos
* chore: fix spelling of job messages to pluralise assets
* chore: fix prettier/eslint warnings
* feat: force switch targetAudioCodec default to aac to avoid iOS incompatibility
* chore: lint issues after rebase
* feat(server): Support webm without transcoding.
Transcoding result doesn't appear to be used by anything expect for quicktime.
* feat(server): Fix the asset uploader for .avi
It needs to be transcoded.
* feat(server): Most browsers doesn't support avi so use mp4.
* feat(server): Address PR comments
* Addressed the PR comments
I moved the function that checks the mimetype to a central location in asset-utils and made tests for it.
* Rollbacked to the way transcoder was decising things to transcode.
* fix(server/cookies): Making the cookie better
Cookie should have SameSite=Stict and Secure if served via https, otherwise just SameSite=Strict set.
* feat(server): forgot to add secure to the other cookie.
* Fixed the cookies and tests for them.
* Consolidate docker build into single workflow
* ci: Only push to altran1502 on release
* ci: Tweaks
* feat(ci): Remove metadata key from permissions
* feat(ci): workaround for buildx regression
* Drop buildkit version to workaround regression
* Revert "Drop buildkit version to workaround regression"
This reverts commit 79adadb2d3.
* Use repo owner name for ghcr login
* feat(ci): Skip docker push on PRs from fork
* feat(ci): Remove explicit permissions config
* temp: Skip docker hub login
* Revert "temp: Skip docker hub login"
This reverts commit e92864d1a3.
* Remove fetch-depth from checkout action
* Allow the use of SSL connections to the postgres database.
* Add default SSL false when no env set
* Add commented out example of DB_SSL env
* Refactor add SSL option into PostgresConnectionOptions
* Refactor the database connection to optionally use a URL string instead of the env variables
* Refactor the database connection based on feedback
* Add dynamic validation around the DB envs
* Remove DB_URL from example
* Fix rebase
* Add back the optional database port in the example
* Formatted file correctly
* change types to a const to fix tests
* feat(.well-known): add .well-known/immich to reference API endpoint
* feat(.well-known): make schema optional (defaults to https)
* adjust method comment to be a little less confusing
* fix casting issue with resovled url
* include when checking Well-known, update server hint
* add validation for login form's server url
* consolidate common process into resolveAndSetEndpoint
* fix missed prettier formatting
* revert translation changes
* update environment variable description, hopefully a bit clearer
* rename environment variable to IMMICH_API_URL_EXTERNAL
* comment out optional env variables
* fix(web): browser-side api client to include authorization token
* Revert "fix(web): browser-side api client to include authorization token"
This reverts commit 60e338938f.
* remove multi-domain related changes
* Improve scroll performance by introducing repaint boundaries and moving more calculations to providers.
* Add error handing for malformed dates.
* Remove unused method
* Use compute in different places to improve app performance during heavy tasks
* Fix test
* Refactor `List<RenderAssetGridElement>` to separate `RenderList` class and make `fromAssetGroups` a static method of this class.
* Fix loading indicator bug
* Use provider directly
* `RenderList` refactoring
* `AssetNotifier` refactoring
* Move `combine` to static private method
* Extract compute methods in cache services to static private methods.
* Use `tryParse` instead of `parse` with try/catch for dates.
* Fix bug in caching mechanism.
* Fixed state not being used to trigger conditional rendering
* styling
* Corrected state
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* Trying to get exifdata working with different lib.
* Got the new library working.
* Addressing PR comments.
* Removed not used vars and proper place for the eslint disable.
* Fix time-utils to use the exiftool-vendored lib.
Fixed also one test, as that would be valid.
* Using filename for timestamp as well if possible.
* Add new tests for time-utils.
* Remember to gracefully terminate the exiftool instance when not needed.
* eslint ignore...
* Apperantly Dockerfile changes were not pushed.
* feat(dockerfile): Tweak the Server Dockerfile
* feat(server): getTimestampFromFilename should return string or undefined.
* feat(server): If we don't have exifData or timestamp from filename, raise an error.
* Apparently test was already right, but my local system disagrees.
* More utilities for parsing and fix the timestampFromFilename.
It was returning an incorrect date as the regex doesn't seem to be the best for this as files named `IMG_0115.HEIC` will want to get parsed incorrectly due to it.
* feat(server/docker): Install perl as it seems to be required.
* feat(server): remember to include exposureTime and focalLength in new exif data.
* feat(server): Remove the parsing from filename as requested.
* feat(server): Import exiftool differently in time-utils.
* feat(server): Error handling when there is no exifData.
* feat(server): Fixes for the error handling when there is no exifData.
* feat(server): Remember to include modifyDate despite no exif.
* feat(server): Remember to include model of Camera.
* feat(server): Fixing up Exiftool usage.
Including proper logging for it, which had to be done in wrapped fashion due to it expecting all the logging levels which NextJS logger doesn't implement.
* feat(server): Do not use a wrapper for ExifTool logging.
* fix merge conflicts in metadata-extractor
* Create shared link modal for individual asset
* Added API to create asset shared link
* Added viewer for individual shared link
* Added multiselection app bar
* Refactor gallery viewer to its own component
* Refactor
* Refactor
* Add and remove asset from shared link
* Fixed test
* Fixed notification card doesn't wrap
* Add check asset access when created asset shared link
* pr feedback
* chore(web,server): run code coverage reports
* chore(tests): fail test check if coverage drops
* chore: disable e2e until they are fixed
* chore(web): coverage threshold
* refactor: user repository
* refactor: user module
* refactor: move database into infra
* refactor(cli): use user core
* chore: import path
* chore: tests
Note: Please search to see if an issue already exists for the bug you encountered.
-->
**Describe the bug**
A clear and concise description of what the bug is.
**Task List**
*Please complete the task list below. We need this information to help us reproduce the bug or point out problems in your setup. You are not providing enough info may delay our effort to help you.*
- [ ] I have read thoroughly the README setup and installation instructions.
- [ ] I have included my `docker-compose` file.
- [ ] I have included my redacted `.env` file.
- [ ] I have included information on my machine, and environment.
**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
# If you wish to specify custom queries, you can do so here or in a config file.
# By default, queries listed here will override any specified in a config file.
# Prefix the list here with "+" to use these queries and those in the config file.
# Details on CodeQL's query packs refer to : https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs
# queries: security-extended,security-and-quality
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
# If this step fails, then you should remove it and run the build manually (see below)
- name:Autobuild
@@ -61,7 +65,7 @@ jobs:
# ℹ️ Command-line programs to run using the OS shell.
# 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun
# If the Autobuild fails above, remove it and uncomment the following three lines.
# If the Autobuild fails above, remove it and uncomment the following three lines.
# modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance.
### How can I sync an existing directory with Immich's server?
Immich doesn't have the mechanism to sync an existing directory with the server. There is however, a helper CLI tool to help you bulk upload the existing photos and videos to the server. You can find the guide to use the CLI tool [here](/docs/features/bulk-upload.md).
Immich doesn't have two-way synchronization ([yet](https://github.com/immich-app/immich/discussions/1006)), but the [command line tool](/docs/features/bulk-upload.md) can bulk upload items from a directory to Immich.
### Why doesn't Immich watch an existing photo gallery directory?
The initial approach of Immich is to become a backup tool, primarily for mobile device usage. Thus, all the assets must be uploaded from the mobile client. The app was architectured to perform that job well.
### What happens to existing files after I choose a new [Storage Template](/docs/features/storage-template.mdx)?
### Why does my uploaded photo show up with the wrong date or time in Immich?
Template changes will only apply to new assets. To retroactively apply the template to previously uploaded assets, run the Storage Migration Job, available on the [Jobs](/docs/features/jobs.md) page.
When a photo is initially uploaded Immich uses the create date of the file to determine where it belongs in the timeline. After that, background jobs will run that extract [exif metadata](https://en.wikipedia.org/wiki/Exif), including the CreateDate, to provide a more accurate date for the photo. If that is not available it will fallback to the modified date. If you want to ensure your photo has the right date, check the exif metadata before uploading.
If the timezone is incorrect in an uploaded photo, check the ``DateTimeOriginal`` exif field of the uploaded file. Immich uses the very competent library [exiftool-vendored.js](https://github.com/photostructure/exiftool-vendored.js#dates) to handle timezone parsing, but in some cases (like photos taken with DSLR cameras) it has to fallback on the local timezone. If you are using docker, this fallback will be UTC. (Note that even the photo backup app that can't be named [has the same bug!](https://photo.stackexchange.com/a/126978)) In Immich, it is possible to change this assumed fallback timezone system-wide by setting the timezone in the microservices docker container. You might need to run the "Extract Metadata" job after to effect the change.
As an example, the following modification of ```docker-compose.yml``` will set the timezone of the microservices container to be ``Europe/Stockholm``
```
environment:
- TZ=Europe/Stockholm # <---- Add this line in the microservices config
```
### Why are only photos and not videos being uploaded to Immich?
This often happens when using a reverse proxy or cloudflare tunnel in front of Immich. Make sure to set your reverse proxy to allow large POST requests. In `nginx`, set `client_max_body_size 50000M;` or similar. Cloudflare tunnels are limited to 100 mb file sizes.
### Why is Immich slow on low-memory systems like the Raspberry Pi?
Immich uses optional machine-learning features to enhance search results. This feature, however, can be too heavy to run on a Raspberry Pi. To disable machine learning, comment out the `immich-machine-learning` section of your docker-compose.yml and set `IMMICH_MACHINE_LEARNING_URL=false` in your .env file.
### What happens to existing files after I choose a new [Storage Template](/docs/administration/storage-template.mdx)?
Template changes will only apply to new assets. To retroactively apply the template to previously uploaded assets, run the Storage Migration Job, available on the [Jobs](/docs/administration/jobs.md) page.
### In the uploads folder, why are photos stored in the wrong date?
This is fixed by running the storage migration job.
### Why is object detection not very good?
@@ -38,11 +60,11 @@ Most Immich components are typically deployed using docker. To see logs for depl
2. Set the corresponding `user` argument in `docker-compose` for each service.
3. Add an additional volume to `immich-microservices` that mounts internally to `/usr/src/app/.reverse-geocoding-dump`.
The non-root user/group needs will need read/write access to the volume mounts, including `UPLOAD_LOCATION`.
The non-root user/group needs read/write access to the volume mounts, including `UPLOAD_LOCATION`.
### How can I reset the admin password?
The admin password can be reset by running the [reset-admin-password](/docs/features/server-commands.md) command on the immich-server.
The admin password can be reset by running the [reset-admin-password](/docs/administration/server-commands.md) command on the immich-server.
Several Immich functionalities are implemented as jobs, which run in the background. To view the status of a job navigate to the Administration Screen, and then the `Jobs` page.

:::info
Storage Migration job can be run after changing the [Storage Template](/docs/administration/storage-template.mdx), in order to apply the change to the existing library.
@@ -14,19 +14,19 @@ To toggle the password login setting via the web, navigate to the "Administratio
### Server Command
There are two [Server Commands](/docs/features/server-commands.md) for password login:
There are two [Server Commands](/docs/administration/server-commands.md) for password login:
1. `enable-password-login`
2. `disable-password-login`
See [Server Commands](/docs/features/server-commands.md) for more details about how to run them.
See [Server Commands](/docs/administration/server-commands.md) for more details about how to run them.
## Password Reset
### Admin
To reset the administrator password, use the `reset-admin-password` [Server Command](/docs/features/server-commands.md).
To reset the administrator password, use the `reset-admin-password` [Server Command](/docs/administration/server-commands.md).
### User
Immich does not currently support self-service password reset. However, the administration can reset passwords for other users. See [User Management: Password Reset](/docs/features/user-management.mdx#password-reset) for more information about how to do this.
Immich does not currently support self-service password reset. However, the administration can reset passwords for other users. See [User Management: Password Reset](/docs/administration/user-management.mdx#password-reset) for more information about how to do this.
When deploying Immich it is important to understand that a reverse proxy is required in front of the server and web container. The reverse proxy acts as an intermediary between the user and container, forwarding requests to the correct container based on the URL path.
## Default Reverse Proxy
Immich provides a default nginx reverse proxy preconfigured to perform the correct routing and set the necessary headers for the server and web container to use. These headers are crucial to redirect to the correct URL and determine the client's IP address.
## Using a Different Reverse Proxy
While the reverse proxy provided by Immich works well for basic deployments, some users may want to use a different reverse proxy. Fortunately, Immich is flexible enough to accommodate different reverse proxies. Users can either:
1. Add another reverse proxy on top of Immich's reverse proxy
2. Completely replace the default reverse proxy
## Adding a Custom Reverse Proxy
Users can deploy a custom reverse proxy that forwards requests to Immich's reverse proxy. This way, the new reverse proxy can handle TLS termination, load balancing, or other advanced features, while still delegating routing decisions to Immich's reverse proxy. All reverse proxies between Immich and the user must forward all headers and set the `Host`, `X-Forwarded-Host`, `X-Forwarded-Proto` and `X-Forwarded-For` headers to their appropriate values. By following these practices, you ensure that all custom reverse proxies are fully compatible with Immich.
## Replacing the Default Reverse Proxy
Replacing Immich's default reverse proxy is an advanced deployment and support may be limited. When replacing Immich's default proxy it is important to ensure that requests to `/api/*` are routed to the server container and all other requests to the web container. Additionally, the previously mentioned headers should be configured accordingly. You may find our [nginx configuration file](https://github.com/immich-app/immich/blob/main/nginx/templates/default.conf.template) a helpful reference.
To run a command, [connect](/docs/guides/docker-help.md#attach-to-a-container) to the `immich_server` container and then execute the command via `immich <command>`.
On iOS, there is only one option for automatic backup
- [Automatic Backup](#automatic-backup)
- [Foreground backup](#foreground-backup)
On Android, there are two options for automatic backup
- [Automatic Backup](#automatic-backup)
- [Foreground backup](#foreground-backup)
- [Background backup](#background-backup)
## Foreground backup
If foreground backup is enabled: whenever the app is opened or resumed, it will check if any photos or videos in the selected album(s) have yet to be uploaded to the cloud (the remainder count). If there are any, they will be uploaded.
## Background backup
Background backup is only available on Android thanks to the contribution effort of [@zoodyy](https://github.com/zoodyy).
Background backup is available thanks to the contribution effort of [@zoodyy](https://github.com/zoodyy) and [@martyfuhry](https://github.com/martyfuhry).
If background backup is enabled. The app will periodically check if there are any new photos or videos in the selected album(s) to be uploaded to the cloud. If there are, it will upload them to the cloud in the background.
A native Android notification shows up when the background upload is in progress. You can further customize the notification by going to the app's settings.
:::info Note
#### General
- The app must be in the background for the backup worker to start running.
- It is a well-known problem that some Android models are very strict with battery optimization settings, which can cause a problem with the background worker. Please visit [Don't kill my app](https://dontkillmyapp.com/) for a guide on disabling this setting on your phone.
- If you reopen the app and the first page you see is the backup page, the counts will not reflect the background uploaded result. You have to navigate out of the page and come back to see the updated counts.
#### Android
- It is a well-known problem that some Android models are very strict with battery optimization settings, which can cause a problem with the background worker. Please visit [Don't kill my app](https://dontkillmyapp.com/) for a guide on disabling this setting on your phone.
#### iOS
- You must enable **Background App Refresh** for the app to work in the background. You can enable it in the Settings app under General > Background App Refresh.
| --yes / -y | Assume yes on all interactive prompts |
| --recursive / -r | Include subfolders |
| --delete / -da | Delete local assets after upload |
| --key / -k | User's API key |
| --server / -s | Immich's server address |
| --directory / -d | Directory to upload from |
| --threads / -t | Number of threads to use (Default 5) |
| --album/ -al | Create albums for assets based on the parent folder or a given name |
@@ -46,19 +52,37 @@ The API key can be obtained in the user setting panel on the web interface.
### Run via Docker
Be aware that as this runs inside a container it mounts your current directory as avolume, and for the -d flag you need to use the path inside the container.
You can run the CLI inside of a docker container to avoid needing to install anything.
If you are running the CLI container on the same machine as your Immich server, you may not be able to reach the external address. In that case, try the following steps:
1. Find the internal Docker network used by Immich via `docker network ls`.
2. Adapt the above command to pass the `--network <immich_network>` argument to `docker run`, substituting `<immich_network>` with the result from step 1.
3. Use `--server http://immich-server:3001/` for the upload command instead of the external address.
Several Immich functionalities are implemented as jobs, which run in the background. To view the status of a job navigate to the Administration Screen, and then the `Jobs` page.
Immich is currently under heavy development, which means you can expect breaking changes and bugs. Therefore, we recommend reading the release notes prior to updating and to take special care when using automated tools like [Watchtower][watchtower].
You can deploy Immich on Kubernetes using [the official Helm chart](https://github.com/immich-app/immich-charts/tree/main/charts/apps/immich).
If you want examples of how other people run Immich on Kubernetes, using the official chart or otherwise, you can find them at https://nanne.dev/k8s-at-home-search/#/immich.
:::caution DNS in Alpine containers
Immich makes use of Alpine container images. These can encounter [a DNS resolution bug](https://stackoverflow.com/a/65593511) on Kubernetes clusters if the host
nodes have a search domain set, like:
```
$ cat /etc/resolv.conf
search home.lan
nameserver 192.168.1.1
```
When you encounter this bug, it will cause the immich-microservices to crash on startup because it cannot download
the geocoder data. This can be solved in one of two ways: Either reconfigure your nodes to remove the searchdomain from
`resolv.conf`, or set the `DISABLE_REVERSE_GEOCODING` environment variable for Immich to `true` to disable the geocoder.
@@ -9,7 +9,7 @@ Install Immich using Portainer's Stack feature.
1. Go to "**Stacks**" in the left sidebar.
2. Click on "**Add stack**".
3. Give the stack a name (i.e. Immich), and select "**Web Editor**" as the build method.
4. Copy the content of the `docker-compose.yml` file from the [GitHub repository](https://raw.githubusercontent.com/immich-app/immich/main/docker/docker-compose.yml).
4. Copy the content of the `docker-compose.yml` file from the [GitHub repository](https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml).
5. Replace `.env` with `stack.env` for all containers that need to use environment variables in the web editor.
<img
@@ -28,7 +28,7 @@ Install Immich using Portainer's Stack feature.
alt="Dot Env Example"
/>
9. Copy the content of the `.env.example` file from the [GitHub repository](https://raw.githubusercontent.com/immich-app/immich/main/docker/.env.example) and paste into the editor.
9. Copy the content of the `example.env` file from the [GitHub repository](https://github.com/immich-app/immich/releases/latest/download/example.env) and paste into the editor.
10. Switch back to "**Simple Mode**".
<img
@@ -40,11 +40,6 @@ Install Immich using Portainer's Stack feature.
* Populate custom database information if necessary.
* Populate `UPLOAD_LOCATION` with your preferred location for storing backup assets.
* Populate a secret value for `JWT_SECRET`. You can use the command below to generate a secure key:
@@ -20,28 +20,3 @@ You can also use Podman to run the application. However, additional configuratio
- **OS**: Preferred unix-based operating system (Ubuntu, Debian, MacOS, etc). Windows works too, with [Docker Desktop on Windows](https://docs.docker.com/desktop/install/windows-install/)
- **RAM**: At least 2GB, preferred 4GB.
- **CPU**: At least 2 cores, preferred 4 cores.
:::info Machine Learning on older CPU
The TensorFlow version used by Immich doesn't run on older CPU architectures. It requires a CPU with AVX and AVX2 instruction sets. If you encounter the error `illegal instruction core dump` check your CPU flags with the command below and make sure you see `avx` and `avx2`:
```bash
grep -E 'avx2?' /proc/cpuinfo
```
#### Promox
If you are running virtualization in Proxmox, the CPU type of the VM is probably configured incorrectly.
You need to change the CPU type from `kvm64` to `host` under VMs hardware tab.
Otherwise, you can safely remove the `immich-machine-learning` service if you do not intend to use Immich's object detection features. Simply remove or comment out the declaration of the service in your compose file.
@@ -16,7 +16,7 @@ curl -o- https://raw.githubusercontent.com/immich-app/immich/main/install.sh | b
The script will perform the following actions:
1. Download [docker-compose.yml](https://github.com/immich-app/immich/blob/main/docker/docker-compose.yml), and the [.env](https://github.com/immich-app/immich/blob/main/docker/.env.example) file from the main branch of the [repository](https://github.com/immich-app/immich).
1. Download [docker-compose.yml](https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml), and the [.env](https://github.com/immich-app/immich/releases/latest/download/example.env) file from the main branch of the [repository](https://github.com/immich-app/immich).
2. Populate the `.env` file with necessary information based on the current directory path.
Immich can easily be installed and updated on Unraid using the [Docker Compose Manager](https://forums.unraid.net/topic/114415-plugin-docker-compose-manager/) plugin from the Unraid Community Apps.
Immich can easily be installed and updated on Unraid via:
1. [Docker Compose Manager](https://forums.unraid.net/topic/114415-plugin-docker-compose-manager/) plugin from the Unraid Community Apps
2. Community made template on the Unraid Community Apps
## Community Applications Template
:::info
- The Unraid template uses a community made image and is not officially supported by Immich
:::
In order to install Immich from the Unraid CA, you will need an existing Redis and PostgreSQL 14 container, If you do not already have Redis or PostgreSQL you can install them from the Unraid CA, just make sure you choose PostgreSQL **14**.
Once you have Redis and PostgreSQL running, search for Immich on the Unraid CA, choose either of the templates listed and fill out the example variables.
For more information about setting up the community image see [here](https://github.com/imagegenius/docker-immich#application-setup)
## Docker-Compose Method (Official)
:::info
@@ -27,7 +45,7 @@ alt="Select Plugins > Compose.Manager > Add New Stack > Label it Immich"
/>
3. Select the cog ⚙️ next to Immich then click "**Edit Stack**"
4. Click "**Compose File**" and then paste the entire contents of the [Immich Docker Compose](https://raw.githubusercontent.com/immich-app/immich/main/docker/docker-compose.yml) file into the Unraid editor
4. Click "**Compose File**" and then paste the entire contents of the [Immich Docker Compose](https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml) file into the Unraid editor
<details >
<summary>Using an existing Postgres container? Click me! Otherwise proceed to step 5.</summary>
<ul>
@@ -53,9 +71,8 @@ alt="Select Plugins > Compose.Manager > Add New Stack > Label it Immich"
</details>
5. Click "**Save Changes**", you will be promoted to edit stack UI labels, just leave this blank and click "**Ok**"
6. Select the cog ⚙️ next to Immich, click "**Edit Stack**", then click "**Env File**"
7. Past the entire contents of the [Immich .env.example](https://raw.githubusercontent.com/immich-app/immich/main/docker/.env.example) file into the Unraid editor, then **before saving** edit the following:
7. Paste the entire contents of the [Immich example.env](https://github.com/immich-app/immich/releases/latest/download/example.env) file into the Unraid editor, then **before saving** edit the following:
-`JWT_SECRET`: Generate a unique secret and paste the value here > Can be generated by either typing `openssl rand -base64 128` in your terminal or copying from [uuidgenerator](https://www.uuidgenerator.net/version1)
-`UPLOAD_LOCATION`: Create a folder in your Images Unraid share and place the **absolute** location here > For example my _"images"_ share has a folder within it called _"immich"_. If I browse to this directory in the terminal and type `pwd` the output is `/mnt/user/images/immich`. This is the exact value I need to enter as my `UPLOAD_LOCATION`
Some files were not shown because too many files have changed in this diff
Show More
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.