* basic refactor and styling
* removed batching
* module entrypoint
* removed unused imports
* model superclass, model cache now in app state
* fixed cache dir and enforced abstract method
---------
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* feat(blog): Add blog link to website header
* feat(blog): June 2023 update post
* chore(blog): Reorder folder structure
* chore(blog): Add discord link
* chore(blog): Formatting
* chore(blog): Use youtube embeds
* fix format
---------
Co-authored-by: alex <alex@pop-os.localdomain>
* Add API service
* Added service, provider
* merge main
* update pubspec
* styling
* dev: add person search result page
* dev: display person asset on page
* dev: add rename form
* style form
* dev: mechanism to add name to faces
* styling
* fix bad merge
* update api
* test
* revert
* Add header widget
* change name
* show all people page
* fix test
* pr feedback
* Add name to app bar
* feedback
* styling
* Added read-only flag for assets, endpoint to trigger file import vs upload
* updated fixtures with new property
* if upload is 'read-only', ensure there is no existing asset at the designated originalPath
* added test for file import as well as detecting existing image at read-only destination location
* Added storage service test for a case where it should not move read-only assets
* upload doesn't need the read-only flag available, just importing
* default isReadOnly on import endpoint to true
* formatting fixes
* create-asset dto needs isReadOnly, so set it to false by default on create, updated api generation
* updated code to reflect changes in MR
* fixed read stream promise return type
* new index for originalPath, check for existing path on import, reglardless of user, to prevent duplicates
* refactor: import asset
* chore: open api
* chore: tests
* Added externalPath support for individual users, updated UI to allow this to be set by admin
* added missing var for externalPath in ui
* chore: open api
* fix: compilation issues
* fix: server test
* built api, fixed user-response dto to include externalPath
* reverted accidental commit
* bad commit of duplicate externalPath in user response dto
* fixed tests to include externalPath on expected result
* fix: unit tests
* centralized supported filetypes, perform file type checking of asset and sidecar during file import process
* centralized supported filetype check method to keep regex DRY
* fixed typo
* combined migrations into one
* update api
* Removed externalPath from shared-link code, added column to admin user page whether external paths / import is enabled or not
* update mimetype
* Fixed detect correct mimetype
* revert asset-upload config
* reverted domain.constant
* refactor
* fix mime-type issue
* fix format
---------
Co-authored-by: Jason Rasmussen <jrasm91@gmail.com>
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
The NGINX gzip module does not compress responses with a status of 201, which is
a major issue specifically for the /api/asset/time-bucket endpoint where
responses can be upwards of 5Mi. The size of the response is dramatically
reduced with gzip to 500Ki in some cases.
https://trac.nginx.org/nginx/ticket/471https://trac.nginx.org/nginx/ticket/394
The signature of these endpoints should be GET rather than POST anyway, but that
is a bigger discussion.
* Allow upload of AVIF and x-canon-cr2 mime types
* Allow generic RAW file mime type image/x-dcraw
* Another place to uploading avif and cr2
* Determine mime type for .avif and .cr2 files correctly
* Update asset-upload.config.spec.ts for CR2 and AVIF files
* More changes for AVIF & CR2 files
Found some other places where avif and cr2 should be mentioned.
* Merge in upstream changes
* Allow uploading and using most of the formats that libraw supports
* Add raw files to allowable mobile uploads
* Update asset-upload.config.spec.ts
Fix errant commas.
* Update asset-utils.ts
Remove duplicate entry in hash table.
* Fix missing k25 mime type in server upload check.
Fix prettier formatting message in web file-uploader.
* fix test
---------
Co-authored-by: Elliot Lee <sopwith@gmail.com>
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* using pydantic BaseSetting
* ML API takes image file as input
* keeping image in memory
* reducing duplicate code
* using bytes instead of UploadFile & other small code improvements
* removed form-multipart, using HTTP body
* format code
---------
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* add thumbhash: server generation and web impl
* move logic to infra & use byta in db
* remove unnecesary logs
* update generated API and simplify thumbhash gen
* fix check errors
* removed unnecessary library and css tag
* style edits
* syntax mistake
* update server test, change thumbhash job name
* fix tests
* Update server/src/domain/asset/response-dto/asset-response.dto.ts
Co-authored-by: Thomas <9749173+uhthomas@users.noreply.github.com>
* add unit test, change migration date
* change to official thumbhash impl
* update call method to not use eval
* "generate missing" looks for thumbhash
* improve queue & improve syntax
* update syntax again
* update tests
* fix thumbhash generation
* consolidate queueing to avoid duplication
* cover all types of incorrect thumbnail cases
* split out jest tasks
* put back thumbnail duration loading for images without thumbhash
* Remove stray package.json
---------
Co-authored-by: Luke McCarthy <mail@lukehmcc.com>
Co-authored-by: Thomas <9749173+uhthomas@users.noreply.github.com>
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
The bars are 2 pixels tall, which can be tricky to click. Additional padding
increases the height to 16 pixels, without changing how it looks, and makes for
much easier clicking.
In addition, remove the onDestroy lifecycle for the tween as it's not
necessary. It was a relic from using animation frames.
* chore(deps): update web
* fixed svelte-check being a nuisance
---------
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
Manifest list digests can be found with:
```sh
docker buildx imagetools inspect python:3.11.4-bullseye
docker buildx imagetools inspect python:3.11.4-slim-bullseye
docker buildx imagetools inspect ghcr.io/nginxinc/nginx-unprivileged:1.25.0-alpine3.17
```
The node images are pinned in #2736Fixes#2751
Partially fixes#2752
It look like Svelte has a concept of 'tweening' for writing animations, which should reduce the complexity of the animation code.
Thanks to @probablykasper for finding this.
A lot of the logic has been rewritten for reactivity, which further reduces
complexity.
The current implementation mixes intervals and animation frames, which is a
little convoluted. The use of intervals means that the animation is not going
to be smooth and may have strange behaviour when the window is moved to the
background. It's possible that the current animation frames could pile up and
run all at once which would be undesirable.
Moving everything into animation frames means the code is simpler and easier to
reason about. It should also be more performant and less buggy.
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
Given #2668 introduced support for imagemagick and libraw, this should no
longer be necessary which allow for reduced code footprint and complexity.
Fixes: #2744
* use imagemagick and libraw for raw image support
imagemagick and libraw have generally good support for raw images, including
Sony's ARW format. These tools should also allow Immich to support many more
image formats in future without any major code changes.
https://www.libraw.org/supported-cameras
I've tested and verified this change with .ARW files and other standard formats.
Fixes: #2156
* Add additional type for awr
* pr feedback
---------
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* Add on this day
* add query for x year
* dev: add query
* dev: front end
* dev: styling
* styling
* more styling
* add new page
* navigating
* navigate back and forth
* styling
* show gallery
* fix test
* fix test
* show previous and next title
* fix test
* show up down scrolling button
* more styling
* styling
* fix app bar
* fix height of next/previous
* autoplay
* auto play
* refactor
* refactor
* refactor
* show date
* Navigate
* finish
* pr feedback
It's perfectly valid to have an email address without a TLD, for instance:
- test@localhost
- test@svc-in-same-k8s-namespace
- test@internal-corp
Fixes#2667
This is required to support raw images as Alpine 3.18 included fixes to imagemagick.
Related: #2156
In addtion, the images have stricter tags and are pinned with a digest. The
manifest list digest can be found using:
```sh
❯ docker buildx imagetools inspect node:18.16.0-alpine3.18
```
Insta360 "raw" formats `insv` and `insp` are actually
mp4 (video) and jpeg (picture) respectively.
However, we don't want user to rename the original files,
because they follow Insta360 convention, which is required
by Insta360 Studio.
* Add select all to photos
* Add selection of favorites
* Add select all button to albums
* Add select all to archive
* Add select all to search
* try to fix identation
* Revert "try to fix identation"
This reverts commit 40c727b74a.
* try to fix identation
* try to fix identation
* try to fix identation
* try to fix identation
* fix bucketposition
* Run prettier
---------
Co-authored-by: Yonggan <yonggan@obco.pro>
* compare different sha1 implementations
* remove openssl sha1
* sync via checksum
* hash assets in batches
* hash in background, show spinner in tab
* undo tmp changes
* migrate by clearing assets
* ignore duplicate assets
* error handling
* trigger sync/merge after download and update view
* review feedback improvements
* hash in background isolate on iOS
* rework linking assets with existing from DB
* fine-grained errors on unique index violation
* hash lenth validation
* revert compute in background on iOS
* ignore duplicate assets on device
* fix bug with batching based on accumulated size
---------
Co-authored-by: Fynn Petersen-Frey <zoodyy@users.noreply.github.com>
* Truncate date group title
* Precalculate justified layout width
* Add title to date group title to show when truncated
---------
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* Implement justified layout for timeline
* Add withoutThumbs field to GetTimelineLayotDto
* Back to rough estimation of initial buckets height
* Remove getTimelineLayout endpoint
* Estimate rough viewport height better
* Fix shift/jump issues while scrolling up
---------
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* updated dockerfile, added typing, packaging
apply env change
* added arm64 support
* added ml version pump, second try for arm64
* added linting config to pyproject.toml
* renamed ml input field
* fixed linter config
* fixed dev docker compose
* env variables for tags, faces and eager startup
* chore(server,ml): remove object detection job and endpoint (#2627)
* removed object detection job
* removed object detection endpoint
* env variables for tags, faces and eager startup
* download without caching models if not eager
* simplified `get_cached_model`
* re-added env for clip text model
* feat(server): dynamic job concurrency
* styling and add setting info to top of the job list
* regenerate api
* remove DETECT_OBJECT job
---------
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* refactor: tags
* chore: open api
* chore: unused import
* feat: add/remove/get tag assets
* chore: open api
* chore: finish tag tests for add/remove assets
* feat: return asset checksum
* chore: generate open api
* chore: coverage
* feat(server): support base64 hashes in bulk upload check:
* chore: generate open api
* feat(mobile): partner sharing
* getAllAssets for other users
* i18n
* fix tests
* try to fix web tests
* shared with/by confusion
* error logging
* guard against outdated server version
* initial commit for XMP sidecar support
* Added support for 'missing' metadata files to include those without sidecar files, now detects sidecar files in the filesystem for media already ingested but the sidecar was created afterwards
* didn't mean to commit default log level during testing
* new sidecar logic for video metadata as well
* Added xml mimetype for sidecars only
* don't need capture group for this regex
* wrong default value reverted
* simplified the move here - keep it in the same try catch since the outcome is to move the media back anyway
* simplified setter logic
Co-authored-by: Jason Rasmussen <jrasm91@gmail.com>
* simplified logic per suggestions
* sidecar is now its own queue with a discover and sync, updated UI for the new job queueing
* queue a sidecar job for every asset based on discovery or sync, though the logic is almost identical aside from linking the sidecar
* now queue sidecar jobs for each assset, though logic is mostly the same between discovery and sync
* simplified logic of filename extraction and asset instantiation
* not sure how that got deleted..
* updated code per suggestions and comments in the PR
* stat was not being used, removed the variable set
* better type checking, using in-scope variables for exif getter instead of passing in every time
* removed commented out test
* ran and resolved all lints, formats, checks, and tests
* resolved suggested change in PR
* made getExifProperty more dynamic with multiple possible args for fallbacks, fixed typo, used generic in function for better type checking
* better error handling and moving files back to positions on move or save failure
* regenerated api
* format fixes
* Added XMP documentation
* documentation typo
* Merged in main
* missed merge conflict
* more changes due to a merge
* Resolving conflicts
* added icon for sidecar jobs
---------
Co-authored-by: Jason Rasmussen <jrasm91@gmail.com>
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* Modify controller DTOs
* Can check duplicates on server side
* Remove deviceassetid and deviceid
* Remove device ids from file uploader
* Add db migration for removed device ids
* Don't sanitize checksum
* Convert asset checksum to string
* Make checksum not optional for asset
* Use enums when rejecting duplicates
* Cleanup
* Return of the device id, but optional
* Don't use deviceId for upload folder
* Use checksum in thumb path
* Only use asset id in thumb path
* Openapi generation
* Put deviceAssetId back in asset response dto
* Add missing checksum in test fixture
* Add another missing checksum in test fixture
* Cleanup asset repository
* Add back previous /exists endpoint
* Require checksum to not be null
* Correctly set deviceId in db
* Remove index
* Fix compilation errors
* Make device id nullabel in asset response dto
* Reduce PR scope
* Revert asset service
* Reorder imports
* Reorder imports
* Reduce PR scope
* Reduce PR scope
* Reduce PR scope
* Reduce PR scope
* Reduce PR scope
* Update openapi
* Reduce PR scope
* refactor: asset bulk upload check
* chore: regenreate open-api
* chore: fix tests
* chore: tests
* update migrations and regenerate api
* Feat: use checksum in web file uploader
* Change to wasm-crypto
* Use crypto api for checksumming in web uploader
* Minor cleanup of file upload
* feat(web): pause and resume jobs
* Make device asset id not nullable again
* Cleanup
* Device id not nullable in response dto
* Update API specs
* Bump api specs
* Remove old TODO comment
* Remove NOT NULL constraint on checksum index
* Fix requested pubspec changes
* Remove unneeded import
* Update server/apps/immich/src/api-v1/asset/asset.service.ts
Co-authored-by: Michel Heusschen <59014050+michelheusschen@users.noreply.github.com>
* Update server/apps/immich/src/api-v1/asset/asset-repository.ts
Co-authored-by: Michel Heusschen <59014050+michelheusschen@users.noreply.github.com>
* Remove unneeded check
* Update server/apps/immich/src/api-v1/asset/asset-repository.ts
Co-authored-by: Michel Heusschen <59014050+michelheusschen@users.noreply.github.com>
* Remove hashing in the web uploader
* Cleanup file uploader
* Remove varchar from asset entity fields
* Return 200 from bulk upload check
* Put device asset id back into asset repository
* Merge migrations
* Revert pubspec lock
* Update openapi specs
* Merge upstream changes
* Fix failing asset service tests
* Fix formatting issue
* Cleanup migrations
* Remove newline from pubspec
* Revert newline
* Checkout main version
* Revert again
* Only return AssetCheck
---------
Co-authored-by: Jason Rasmussen <jrasm91@gmail.com>
Co-authored-by: Michel Heusschen <59014050+michelheusschen@users.noreply.github.com>
A default entrypoint and command make it just a bit easier to use the images as
there is no longer a need for an explicit entrypoint. The exception is the
server image, which still requires the shell script to be specified.
* feat(server): pagination for asset queries in jobs
* default mock value for getAll
* remove live photo name correction
* order paginated results by createdAt
* change log level
* move usePagination to domain
* chore: add new features
* Add facial recognition to docs site
* Added partner sharing to the docs site
* update developer docs
---------
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* fix(web): unable to change person name
* name changed
* chore: strongly-typed dispatcher
---------
Co-authored-by: Jason Rasmussen <jrasm91@gmail.com>
* First crude implementation of the global asset map in web
* Use single DOM element for all markers
* Minor layout changes
* Refactor
* Add asset viewer
* Add API endpoint that returns only assets with location information (Thanks @EPP100)
* Remove sidebar icon flip
* Add dark theme support
* Center map to most recent asset
* Allow cluster viewing
* Fix linter errors
* Add newlines
* Fix ts errors
* Fix eslint error
* Run prettier
* Server code style
* Fix openapi mobile code generation issues
* Map markers test
* fix: Support video thumbnails
* Update API
* Review suggestions
* Review suggestions
* Linter error
* Chage mapMarker endpoint to map-marker
* Clean up leaflet imports
* chore(server): remove unused device info code
* chore: generate open api
* remove any DeviceTypeEnum usage from mobile
* chore: coverage
* fix: drop device info table
---------
Co-authored-by: Fynn Petersen-Frey <zody22@gmail.com>
* fix overlapping of asset-viewer-nav-bar
with details tab
* fix contextmenu not closing on button press
---------
Co-authored-by: faupau03 <paul.paffe@gmx.net>
* feat: manage authorized devices
* chore: open api
* get header from mobile app
* write header from mobile app
* styling
* fix unit test
* feat: use relative time
* feat: update access time
* fix: tests
* chore: confirm wording
* chore: bump test coverage thresholds
* feat: add some icons
* chore: icon tweaks
---------
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* add apple specific icons
so it can be added to homescreen
* remove jpg icons
* change background color to white
---------
Co-authored-by: faupau03 <paul.paffe@gmx.net>
* show asset count in sharing tab
* add asset count to album-viewer
* remove duplicate font size
* fix test
---------
Co-authored-by: faupau03 <paul.paffe@gmx.net>
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* fix(mobile): video player disposes early
* fixed show download button based on asset state
* style icon size
* disable screensleep on video player
* better position for video
* better scroll physics on iOS
* fix accountinfopanel not closing on button press
* remove overcomplicated logic
replace with simpler logic and only one outside listener
* remove keydown
---------
Co-authored-by: faupau03 <paul.paffe@gmx.net>
* make sidebar load more fluid
use css before js kicks in
added xs breakpoint in tailwind config
* fix sidebar hr still showing if opened
* make share tab not overflow on mobile
* make user management tab responsive
* make jobs panel responsive
* fix format in tailwind config
* fix full width on large screens
use md breakpoint for w-[800px]
* show accessible name for all screens
* replace grid with flex-col
* replace all xs with sm
* remove isCollapsed completly
using only tailwinds group feature and sm and md breakpoints
* remove leftovers of isCollapsed
and make the settings content less stretched
* remove isCollapsed in layout and side-bar
* fix code style
---------
Co-authored-by: faupau03 <paul.paffe@gmx.net>
Co-authored-by: Alex <alex.tran1502@gmail.com>
* update asset to include isArchive property
* Not display archived assets on timeline
* replace share button to archive button
* Added archive page
* Add bottom nav bar
* clean up homepage
* remove deadcode
* improve on sync is archive
* show archive asset correctly
* better merge condition
* Added back renderList to re-rendering don't jump around
* Better way to handle showing archive assets
* complete ArchiveSelectionNotifier
* toggle archive
* remove deadcode
* fix unit tests
* update assets in DB when changing assets
* update asset state to reflect archived status
* allow to archive assets via multi-select from timeline
* fixed logic
* Add options to bulk unarchive
* regenerate api
* Change position of toast message
---------
Co-authored-by: Fynn Petersen-Frey <zoodyy@users.noreply.github.com>
* Update .env example and clarify process
Update .env contents, and add a little clarification about commands being run. On Windows, for example, you might not have wget, but you'd need to be in the directory with the docker-compose.yml and .env files to run the docker-compose up -d command successfully. (Took me a while to figure out at first)
* Fix some formatting/wording
* Put log level back in and add typesense settings to address PR comments
* collapsable menu in web, more mobile friendly
* finished sidebar collapsing
* make navigation bar more responsive
* make search bar and admin button more responsive
* fix administration small button coloring
* fix upload button over opened search bar
* open search directly on small devices
* make admin sidebar more responsive
* add small edge to admin content
* server stats more responsive
* fix eslint errors
* server stats flex wrap
* Delete .env
* Revert change in hooks.server.ts
* Revert change in vite.config.js
* little clean up, replace {``} with ""
* remove package-lock.json in root folder
* revert upload button to linkbutton
* show extended sidebar also on focus
* combine changes in side-bar.svelte and
+layout.svelte to side-bar-section
* fix navigation-bar cog color in light theme
---------
Co-authored-by: Paul Paffe <paul.paffe@gmx.net>
* Refactor poxy_* directives
Move from location to server context, as they are identical
* Disable proxy_request_buffering
proxy_buffering is already off, no reason to have proxy_request_buffering on. In fact, leaving it on can cause nginx to (temporarily) use a lot of disk space during uploads
* Added dto, logic to insert description and web implementation
* create text field and update on remote database
* Update description and save changes
* styling
* fix web test
* fix server test
* preserve description on metadata extraction job run
* handle exif info is null situation
* pr feedback
* format openapi spec
* update createAssetDto
* refactor logic to service
* move files
* only owner can update description
* Render description correctly in shared album
* Render description correctly in shared link
* disable description edit for not owner of asset on mobile
* localization and clean up
* fix test
* Uses providers for description text (#2244)
* uses providers for description text
* comments
* fixes initial data setting
* fixes notifier
---------
Co-authored-by: martyfuhry <martyfuhry@gmail.com>
* fix(server): generate thumbnail job' using stale path
* add query for webp generation
* revert query for webp because it happens after files are moved
* Add log info
* Implemented justify layout
* Fixed issue with asset selection does not show style for selected assets
* pr feedback
* PR feedback
* fix test
* Added flip animation
* chore(server): commented out debug log line for codecs
* chore(server): removed debug log line for codecs as it's not needed
* Prettier run
* Make the log more useful and move it to verbose level
* Update Norwegian locale to ICU standard
Don't know if this is the only place this should be edited.
But the Norwegian locale is not working on the Android app (still in English), And it seems like it should be 'nb-NO' and not 'no-NO'.
https://www.localeplanet.com/icu/nb-NO/index.html
* fix norweigian locale in other places
* fix norweigian locale in other places
---------
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* test: rename some fixtures and add text for vertical video conversion
* feat: transcode video asset when audio or container don't match target
* chore: add niceness to the ffmpeg command to allow other processes to be prioritised
* chore: change video conversion queue to one concurrency
* feat: add transcode disabled preset to completely turn off transcoding
* linter
* Change log level and remove unused await
* opps forgot to save
* better logging
---------
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* feat: change target scaling to resolution in ffmpeg config
* feat(microservices): scale vertical video correctly, only scale if video is larger than target
The examples commands didn't work when the result of the subcommand $(pwd) contained spaces. This commit adds the proper escaping for them to work. This change also fixes the behavior of the alias allowing the correct current directory to be passed when it is placed inside the .bashrc file.
* feat(mobile): improve logging page
* Use new API for share file
* removed unused code
* Better safe area on the home screen
* Added preparing share dialog to home screen
* default NODE_ENV to production for server image
* update node image to use 3.17 alpine in server
* update web docker image to use alpine 3.17
* remove NODE_ENV from production docker-compose
* NODE_ENV is also needed default in machine-learning
* feat(server/web): jobs clear button + queue status
* adjust design and colors
* Adjust some styling
* show status next to buttons instead of on top
* Update rounded corner for badge
---------
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* fix(server): user update
* update dto
* generate api
* improve validation
* add e2e tests for updating user
---------
Co-authored-by: Michel Heusschen <59014050+michelheusschen@users.noreply.github.com>
* feat(web): pause and resume jobs
* add bg color to status instead of using badge
* styling
---------
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* 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
* feat(server): support providers without support for custom schemas
* chore: unit tests
* chore: test mobile override
* chore: add details to the docs
- Refactor user business logic from `user.service` into `user.domain`
Make user business logic reusable by using `user.domain` from other services than `user.service`
- Add `jest-when` lib to make testing easier and use it in `userService`
Using when helps from coupling tests to order of mock implementations execution
- Move all user business logic from user-repository to user.service
- Fix user.service tests not awaiting promises leaking state between tests
- Presentation logic for `getUserProfileImage` moved from UserService to UserController
- Fix `user.e2e` test logic. Pending fixing the configuration of the test itself
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.
<!--- Why is this change required? What problem does it solve? -->
<!--- If it fixes an open issue, please link to the issue here. -->
Fixes # (issue)
## How Has This Been Tested?
<!-- Please describe the tests that you ran to verify your changes. Provide instructions so we can reproduce. Please also list any relevant details for your test configuration -->
- [ ] Test A
- [ ] Test B
## Screenshots (if appropriate):
## Checklist:
- [ ] I have performed a self-review of my own code
- [ ] I have made corresponding changes to the documentation if applicable
# 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.
| Auto backup when the app is opened | Yes | N/A |
| Selective album(s) for backup | Yes | N/A |
| Download photos and videos to local device | Yes | Yes |
| Multi-user support | Yes | Yes |
| Album and Shared albums | Yes | Yes |
| Scrubbable/draggable scrollbar | Yes | Yes |
| Support RAW (HEIC, HEIF, DNG, Apple ProRaw) | Yes | Yes |
| Metadata view (EXIF, map) | Yes | Yes |
| Search by metadata, objects, faces, and CLIP | Yes | Yes |
| Administrative functions (user management) | No | Yes |
| Background backup | Yes | N/A |
| Virtual scroll | Yes | Yes |
| OAuth support | Yes | Yes |
| API Keys | N/A | Yes |
| LivePhoto backup and playback | iOS | Yes |
| User-defined storage structure | Yes | Yes |
| Public Sharing | No | Yes |
| Archive and Favorites | Yes | Yes |
| Global Map | No | Yes |
| Partner Sharing | Yes | Yes |
| Facial recognition and clustering | No | Yes |
| Offline support | Yes | No |
# Support the project
@@ -91,22 +98,7 @@ If you feel like this is the right cause and the app is something you are seeing
## Donation
- [Monthly donation](https://github.com/sponsors/alextran1502) via GitHub Sponsors
- [One-time donation](https://github.com/sponsors/alextran1502?frequency=one-time&sponsor=alextran1502) via Github Sponsors
# Known Issues
## TensorFlow Build Issue
_This is a known issue for incorrect Proxmox setup_
TensorFlow doesn't run with older CPU architecture, it requires a CPU with AVX and AVX2 instruction set. If you encounter the error `illegal instruction core dump` when running the docker-compose command above, check for your CPU flags with the command and make sure you see `AVX` and `AVX2`:
```bash
more /proc/cpuinfo | grep flags
```
If you are running virtualization in Proxmox, the VM doesn't have the flag enabled.
You need to change the CPU type from `kvm64` to `host` under VMs hardware tab.
| Kullanıcı tanımlı depolama yapısı | Evet | Evet |
| Herkese açık paylaşım | Hayır | Evet |
| Arşiv ve Favoriler | Evet | Evet |
| Dünya haritası | Hayır | Evet |
| Partner paylaşımı | Evet | Evet |
| Yüz tanıma ve kümeleme | Hayır | Evet |
| Çevrimdışı destek | Evet | Hayır|
# Projeyi Destekle
Bu projeye bağlı kaldım ve durmayacağım. Belgeleri güncellemeye, yeni özellikler eklemeye ve hataları düzeltmeye devam edeceğim. Ancak bunu tek başıma yapamam. Bu yüzden devam etme konusunda bana motivasyon sağlamanız için yardımınıza ihtiyacım var.
[selfhosted.show - In the episode 'The-organization-must-not-be-name is a Hostile Actor'](https://selfhosted.show/79?t=1418) bölümünde söylendiği üzere,bu projede takımımın ve benim projeye harcadağımız büyük bir çaba var. Bir gün bunu tam zamanlı olarak yapabilmeyi çok isterim. Bunu gerçekleştirebilmek için gerçekten sizlerin desteğine ihtiyacım var.
Eğer bu size doğru bir amaç gibi geliyorsa ve uygulamanın uzun bir süre boyunca kullanacağınız bir şey olduğunu düşünüyorsanız, aşağıdaki bağlantılardan birini kullanarak bana destek olabilirsiniz.
## Bağış
- [Aylık bağış](https://github.com/sponsors/alextran1502) via GitHub Sponsors
- [Bir seferlik bağış](https://github.com/sponsors/alextran1502?frequency=one-time&sponsor=alextran1502) via GitHub Sponsors
I am back with another update on Immich. It has been only a month since my last update (May 18th, 2023), but it seems forever. I think the rapid releases of Immich and the amount of work make the perspective of time change in Immich’s world. We have some exciting updates that I think you will like.
Before going into detail, on behalf of the core team, I would like to thank all of you for loving Immich and contributing to the project. Thank you for helping me make Immich an enjoyable alternative solution to Google Photos so that you have complete control of your data and privacy. I know we are still young and have a lot of work to do, but I am confident we will get there with help from the community. I appreciate all of you from the bottom of my heart!
<!--truncate-->
And now, to the exciting part, what is new in Immich’s world?
- Initial support for existing gallery.
- Memory feature.
- Support XMP sidecar.
- Support more raw formats.
- Justified layout for web timeline and blurred thumbnail hash.
- Mechanism to host machine learning on a completely different machine.
## Support for existing gallery
I know this is the most controversial feature when it comes to Immich’s way of ingesting photos and videos. For many users, having to upload photos and videos to Immich is simply not working. We listen, discuss, and digest this feature internally more than you imagine because it is not a simple feature to tackle while keeping the performance and the user experience at the top level, which is Immich’s primary goal.
Thankfully, we have many great contributors and developers that want to make this come true. So we came up with an initial implementation of this feature in the form of a supporting read-only gallery.
To be concise, Immich can now read in the gallery files, register the path into the database, and then generate necessary files and put them through Immich’s machine learning pipeline so you can use all the goodness of Immich without the need to upload them. Since this is the initial implementation, some actions/behavior are not yet supported, and we aim to build toward them in future releases, namely:
- Assets are not automatically synced and must instead be manually synced with the CLI tool.
- Only new files that are added to the gallery will be detected.
- Deleted and moved files will not be detected.
You can find more information on how to use the feature by reading the documentation [here](/docs/features/read-only-gallery).
## Memory feature
This is considered a fun feature that the team and I wanted to build for so long, but we had to put it off because of the refactoring of the code base. The code base is now in a good enough form to circle back and add more exciting features.
This memory feature is very much similar to GPhotos' implementation of “x years since…”. We are aiming to add more categories of memories in the future, such as “Spotlight of the day” or “Day of the Week highlights”
This feature is now available on the web and will be ported to the mobile app in the near future.
## Support XMP Sidecar
Immich can now import/upload XMP sidecars from the CLI and use the information as the metadata of assets.
## Support more raw formats.
With the recent updates on the dependencies of Immich, we are now extending and hardening support for multiple raw formats. So users with DSLR or mirrorless cameras can now upload their original files to Immich and have them displayed in high-quality thumbnails on the web and mobile view.
## Justified layout for web timeline and blurred thumbnail hash
This is an aesthetic improvement in user experience when browsing the timeline. Photos and videos are now displayed correctly with perspective orientation, making the browsing experience more pleasurable.
To further improve the browsing experience, we now added a blur hash to the thumbnail, so the transition is more natural with a dreamy fade in effect, similar to how our brain goes from faded to vivid memory
## Hosting machine learning container on a different machine
With more capabilities Immich is building toward, machine learning will get more powerful and therefore require more resources to run effectively. However, we understand that users might not have the best server resources where they host the Immich instance. Therefore, we changed how machine learning interacts and receives the photos and videos to run through its inference pipeline.
The machine learning container is now a headless system that can run on any machine. As long as your Immich instance can communicate with the system running the machine learning container, it can send the files and receive the required information to make Immich powerful in terms of searching and intelligence. This helps you to utilize a more powerful machine in your home/infrastructure to perform the CPU-intensive tasks while letting Immich only handle the I/O operations for a pleasant and smooth experience.
---
So, those are the highlights for the team and the community after a busy month. There are a lot more changes and improvements. I encourage you to read some release notes, starting from version [v1.57.0](https://github.com/immich-app/immich/releases/tag/v1.57.0) to now.
Thank you, and I am asking for your support for the project. I hope to be a full-time maintainer of Immich one day to dedicate myself to the project as my life works for the community and my family. You can find the support channels below:
- Monthly donation via [GitHub Sponsors](https://github.com/sponsors/alextran1502)
- One-time donation via [GitHub Sponsors](https://github.com/sponsors/alextran1502?frequency=one-time&sponsor=alextran1502)
### 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/usage/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.
### Why does my uploaded photo show up with the wrong date or time in Immich?
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.
### How to disable machine-learning and TypeSense?
:::warning
Disabling both will result in poor search experience and typesense utilizes CLIP embeddings which are generated by machine-learning.
:::
These features can be disabled by commenting out `immich-typesense` and `immich-machine-learning` sections of the docker-compose.yml and setting `IMMICH_MACHINE_LEARNING_URL=false` & `TYPESENSE_ENABLED=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?
The model we used for machine learning is a prebuilt model, so the accuracy is not very good. It will hopefully be replaced with a better solution in the future.
### How can I see Immich logs?
Most Immich components are typically deployed using docker. To see logs for deployed docker containers, you can use the [Docker CLI](https://docs.docker.com/engine/reference/commandline/cli/), specifically the `docker logs` command. For examples, see [Docker Help](/docs/guides/docker-help.md)
### How can I run Immich as a non-root user?
1. Set the `PUID`/`PGID` environment variables (in `.env`).
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 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/usage/server-commands) 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.
### How can I backup data from Immich?
See [backup and restore](/docs/administration/backup-and-restore.md).
### How can I **purge** data from Immich?
Data for Immich comes in two forms:
1.**Metadata** stored in a postgres database, persisted via the `pg_data` volume
2.**Files** (originals, thumbs, profile, etc.), stored in the `UPLOAD_LOCATION` folder.
To remove the **Metadata** you can stop Immich and delete the volume.
```bash title="Remove Immich (containers and volumes)"
docker-compose down -v
```
After removing the the containers and volumes, the **Files** can be cleaned up (if necessary) from the `UPLOAD_LOCATION` by simply deleting an unwanted files or folders.
### Why iOS app shows duplicate photos on the timeline while the web doesn't?
If you are using `My Photo Stream`, the Photos app temporarily creates duplicates of photos taken in the last 30 days. These photos are included in the `Recents` album and thus shown up twice. To fix this, you can disable `My Photo Stream` in the native Photos app or choose a different album in the backup screen in Immich.
Refer to the official [postgres documentation](https://www.postgresql.org/docs/current/backup.html) for details about backing up and restoring a postgres database.
:::
The recommended way to backup and restore the Immich database is to use the `pg_dumpall` command.
docker-compose up -d # Start remainder of Immich apps
```
Note that for the database restore to proceed properly, it requires a completely fresh install (i.e. the Immich server has never run since creating the Docker containers). If the Immich app has run, Postgres conflicts may be encountered upon database restoration (relation already exists, violated foreign key constraints, multiple primary keys, etc.).
The database dumps can also be automated (using [this image](https://github.com/prodrigestivill/docker-postgres-backup-local)) by editing the docker compose file to match the following:
```yaml
services:
...
backup:
container_name: immich_db_dumper
image: prodrigestivill/postgres-backup-local
env_file:
- .env
environment:
POSTGRES_HOST: database
POSTGRES_DB: ${DB_DATABASE_NAME}
POSTGRES_USER: ${DB_USERNAME}
POSTGRES_PASSWORD: ${DB_PASSWORD}
SCHEDULE: "@daily"
BACKUP_NUM_KEEP: 7
BACKUP_DIR: /db_dumps
volumes:
- ./db_dumps:/db_dumps
depends_on:
- database
```
Then you can restore with the same command but pointed at the latest dump.
Immich stores two types of content in the filesystem: (1) original, unmodified content, and (2) generated content. Only the original content needs to be backed-up, which includes the following folders:
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.
This page contains details about using OAuth in Immich.
:::tip
Unable to set `app.immich:/` as a valid redirect URI? See [Mobile Redirect URI](#mobile-redirect-uri) for an alternative solution.
:::
## Overview
Immich supports 3rd party authentication via [OpenID Connect][oidc] (OIDC), an identity layer built on top of OAuth2. OIDC is supported by most identity providers, including:
Before enabling OAuth in Immich, a new client application needs to be configured in the 3rd-party authentication server. While the specifics of this setup vary from provider to provider, the general approach should be the same.
1. Create a new (Client) Application
1. The **Provider** type should be `OpenID Connect` or `OAuth2`
2. The **Client type** should be `Confidential`
3. The **Application** type should be `Web`
4. The **Grant** type should be `Authorization Code`
2. Configure Redirect URIs/Origins
The **Sign-in redirect URIs** should include:
-`app.immich:/` - for logging in with OAuth from the [Mobile App](/docs/features/mobile-app.mdx)
-`http://DOMAIN:PORT/auth/login` - for logging in with OAuth from the Web Client
-`http://DOMAIN:PORT/user-settings` - for manually linking OAuth in the Web Client
Redirect URIs should contain all the domains you will be using to access Immich. Some examples include:
Mobile
-`app.immich:/` (You **MUST** include this for iOS and Android mobile apps to work properly)
Localhost
-`http://localhost:2283/auth/login`
-`http://localhost:2283/user-settings`
Local IP
-`http://192.168.0.200:2283/auth/login`
-`http://192.168.0.200:2283/user-settings`
Hostname
-`https://immich.example.com/auth/login`)
-`https://immich.example.com/user-settings`)
## Enable OAuth
Once you have a new OAuth client application configured, Immich can be configured using the Administration Settings page, available on the web (Administration -> Settings).
The `.well-known/openid-configuration` part of the url is optional and will be automatically added during discovery.
:::
## Auto Launch
When Auto Launch is enabled, the login page will automatically redirect the user to the OAuth authorization url, to login with OAuth. To access the login screen again, use the browser's back button, or navigate directly to `/auth/login?autoLaunch=0`.
## Mobile Redirect URI
The redirect URI for the mobile app is `app.immich:/`, which is a [Custom Scheme](https://developer.apple.com/documentation/xcode/defining-a-custom-url-scheme-for-your-app). If this custom scheme is an invalid redirect URI for your OAuth Provider, you can work around this by doing the following:
1. Configure an http(s) endpoint to forwards requests to `app.immich:/`
2. Whitelist the new endpoint as a valid redirect URI with your provider.
3. Specify the new endpoint as the `Mobile Redirect URI Override`, in the OAuth settings.
With these steps in place, you should be able to use OAuth from the [Mobile App](/docs/features/mobile-app.mdx) without a custom scheme redirect URI.
:::info
Immich has a route (`/api/oauth/mobile-redirect`) that is already configured to forward requests to `app.immich:/`, and can be used for step 1.
:::
## Example Configuration
Here's an example of OAuth configured for Authentik:
An overview of password login and related settings for Immich.
## Enable/Disable
Immich supports password login, which is enabled by default. The preferred way to disable it is via the [Administration Page](#administration-page), although it can also be changed via a [Server Command](#server-command) as well.
### Administration Page
To toggle the password login setting via the web, navigate to the "Administration", expand "Password Authentication", toggle the "Enabled" switch, and press "Save".
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/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/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/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>`.
import RegisterAdminUser from '../partials/_register-admin.md';
import UserCreate from '../partials/_user-create.md';
# User Management
Immich supports multiple users, each with their own library.
## Register the Admin User
<RegisterAdminUser />
## Create a New User
<UserCreate />
## Delete a User
If you need to remove a user from Immich, head to "Administration", where users can be scheduled for deletion. The user account will immediately become disabled and their library and all associated data will be removed after 7 days.
## Password Reset
To reset a user's password, click the pencil icon to edit a user, then click "Reset Password". The user's password will be reset to "password" and they have to change it next time the sign in.
After making any changes in the `server/src/infra/database/entities`, a database migration need to run in order to register the changes in the database. Follow the steps below to create a new migration.
1. Run the command
```bash
npm run typeorm:migrations:generate ./src/infra/<migration-name>
```
2. Check if the migration file makes sense.
3. Move the migration file to folder `./src/infra/database/migrations` in your code editor.
The server will automatically detect `*.ts` file changes and restart. Part of the server start-up process includes running any new migrations, so it will be applied immediately.
Immich uses the [Open API](https://swagger.io/specification/) standard to generate API documentation. To view the published docs see [here](/docs/api).
## Generator
OpenAPI is used to generate the client (Typescript, Dart) SDK. `openapi-generator-cli` can be installed [here](https://openapi-generator.tech/docs/installation/). When you add a new or modify an existing endpoint, you must run the command below to update the client SDK.
```bash
npm run api:generate # Run from the `server/` directory
```
You can find the generated client SDK in the `web/src/api` for Typescript SDK and `mobile/openapi` for Dart SDK.
:::tip
This can also be run via `make api` from the project root directory (not in the `server` folder)
When contributing code through a pull request, please check the following:
## Web Checks
- [ ]`npm run lint` (linting via ESLint)
- [ ]`npm run format` (formatting via Prettier)
- [ ]`npm run check` (Type checking via SvelteKit)
- [ ]`npm test` (Tests via Jest)
:::tip
Run all web checks with `npm run check:all`
:::
## Server Checks
- [ ]`npm run lint` (linting via ESLint)
- [ ]`npm run format` (formatting via Prettier)
- [ ]`npm run check` (Type checking via `tsc`)
- [ ]`npm test` (Tests via Jest)
:::tip
Run all server checks with `npm run check:all`
:::
## Open API
The Open API client libraries need to be regenerated whenever there are changes to the `immich-openapi-specs.json` file. See [Open API](/docs/developer/open-api.md) for more details.
## Database Migrations
A database migration needs to be generated whenever there are changes to `server/src/infra/src/entities`. See [Database Migration](/docs/developer/database-migrations.md) for more details.
- PostgreSQL development database with exposed port `5432` so you can use any database client to acess it
@@ -23,8 +23,8 @@ All the services are packaged to run as with single Docker Compose command.
### Instructions
1. Clone the project repo.
2. Run `cp docker/.env.example docker/.env`.
3. Edit `docker/.env` to provide values for the required variables`UPLOAD_LOCATION` and `JWT_SECRET`.
2. Run `cp docker/example.env docker/.env`.
3. Edit `docker/.env` to provide values for the required variable `UPLOAD_LOCATION`.
4. From the root directory, run:
```bash title="Start development server"
@@ -43,6 +43,18 @@ The mobile app `(/mobile)` will required Flutter toolchain to be installed on yo
Please refer to the [Flutter's official documentation](https://flutter.dev/docs/get-started/install) for more information on setting up the toolchain on your machine.
### Connect to a remote backend
If you only want to do web development connected to an existing, remote backend, follow these steps:
1. Enter the web directory - `cd web/`
2. Install web dependencies - `npm i`
3. Start the web development server
```
PUBLIC_IMMICH_SERVER_URL=https://demo.immich.app/api npm run dev
```
## IDE setup
### Lint / format extensions
@@ -80,24 +92,3 @@ in User `settings.json` (`cmd + shift + p` and search for `Open User Settings JS
}
}
```
## OpenAPI generator
OpenAPI is used to generate the client (Typescript, Dart) SDK. `openapi-generator-cli` can be installed [here](https://openapi-generator.tech/docs/installation/). When you add a new or modify an existing endpoint, you must run the command below to update the client SDK.
```bash
npm run api:generate # Run from the `server` directory
```
You can find the generated client SDK in the `web/src/api` for Typescript SDK and `mobile/openapi` for Dart SDK.
## Database migrations
After making any changes in the `server/libs/database/src/entities`, a database migration need to run in order to register the changes in the database. Follow the steps below to create a new migration.
1. Attached to the server container shell.
2. Run
```bash
npm run typeorm -- migration:generate ./libs/database/src/<migration-name> -d libs/database/src/config/database.config.ts
```
3. Check if the migration file makes sense.
4. Move the migration file to folder `server/libs/database/src/migrations` in your code editor.
On iOS, there is only one option for automatic backup
* [**Foreground backup**](#foreground-backup)
On Android, there are two options for 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.
- 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.
* 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.
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.
import MobileAppDownload from '../partials/_mobile-app-download.md';
import MobileAppLogin from '../partials/_mobile-app-login.md';
import MobileAppBackup from '../partials/_mobile-app-login.md';
# Mobile App
:::tip
To upload from other devices, try using the [Bulk Upload CLI](/docs/features/bulk-upload.md).
:::
## Download
<MobileAppDownload />
:::info Beta Program
The beta release channel allows users to test upcoming changes before they are officially released. To join the channel use the links below.
- Android: Invitation link from [web](https://play.google.com/store/apps/details?id=app.alextran.immich) or from [mobile](https://play.google.com/store/apps/details?id=app.alextran.immich)
Immich supports [Reverse Geocoding](https://en.wikipedia.org/wiki/Reverse_geocoding) using data from the [GeoNames](https://www.geonames.org/) geographical database.
## Extraction
During Exif Extraction, assets with latitudes and longitudes are reverse geocoded to determine their City, State, and Country.
## Usage
Data from a reverse geocode is displayed in the image details, and used in [Search](/docs/features/search.md).
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.