* First version of video looping for the web
* Use prop for slideshow state
* refactor asset settings and add autoloop video setting
* rename variables and adjust description
* loop videos based on user settings in gallery viewer
* make asset viewer setting a stateless widget
* do not update video playback value if looping is enabled
* add some translations
* adjust description
* add missing id
* WIP
* chore: clean up
---------
Co-authored-by: Alex <alex.tran1502@gmail.com>
Co-authored-by: Jason Rasmussen <jrasm91@gmail.com>
* feat(mobile): use efficient sync
review feedback
* adapt to changed server endpoints
* formatting
* fix memory lane bug
* fix: bad merge
* fix call not returning correct number of asset
---------
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* Update external-library.md
I believe that displaying the code for both sections, even if it seems a bit repetitive, can help prevent fast readers from overlooking it
* Apply suggestions from code review
Co-authored-by: Matthew Momjian <50788000+mmomjian@users.noreply.github.com>
---------
Co-authored-by: Matthew Momjian <50788000+mmomjian@users.noreply.github.com>
* feat(server, web): include pictures of shared albums on map
* run prettier
* re-create api clients
* implement suggestions from code review
* shared from partner -> shared from partners
* rename to 'include shared partner assets'
* chore: fix tsc error in server and prettier in web
* fix: include assets shared via owner albums
---------
Co-authored-by: Zack Pollard <zackpollard@ymail.com>
Co-authored-by: Jason Rasmussen <jrasm91@gmail.com>
* Add change from outline to regular icon in sidebar when page selected to more icons. Also change Favorites to single heart consistent with mobile app.
* Forgot to remove a few unused lines. Fixed.
* do crop and resize together
* redundant `pipelineColorspace` call
* formatting
* fix rebase
* handle orientation
* remove unused import
* formatting
* use oriented dimensions for half size calculation
* default case for orientation
* simplify orientation code
---------
Co-authored-by: Alex <alex.tran1502@gmail.com>
* fix(web): allow deselecting all assets from select bar
* Change deselect logo
* select remove
---------
Co-authored-by: Alex <alex.tran1502@gmail.com>
* refactor: remove isReadOnly and isExternal usages
* chore: open api
* fix: linting
* remove mobile isReadOnly dependency
---------
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* feat(server): add `react-mail` as mail template engine and `nodemailer`
* feat(server): add `smtp` related configs to `SystemConfig`
* feat(web): add page for SMTP settings
* feat(server): add `react-email.adapter`
This adapter render the React-Email into HTML and plain/text email.
The output is set as the body of the email.
* feat(server): add `MailRepository` and `MailService`
Allow to use the NestJS-modules-mailer module to send SMTP emails.
This is the base transport for the `NotificationRepository`
* feat(server): register the job dispatcher and Job for async email
This allows to queue email sending jobs for the `EmailService`.
* feat(server): add `NotificationRepository` and `NotificationService`
This act as a middleware to properly route the notification to the right transport.
As POC I've only implemented a simple SMTP transport.
* feat(server): add `welcome` email template
* feat(server): add the first notification on `createUser` in `UserService`
This trigger an event for the `NotificationRepository` that once processes
by using the global config and per-user config will carry the payload to the right notification transport.
* chore: clean up
* chore: clean up web
* fix: type errors"
* fix package lock
* fix mail sending, option to ignore certs
* chore: open api
* chore: clean up
* remove unused import
* feat: email feature flag
* chore: remove unused interface
* small styling
---------
Co-authored-by: Jason Rasmussen <jrasm91@gmail.com>
Co-authored-by: Daniel Dietzler <mail@ddietzler.dev>
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* refactor: search people
* fix: test
* fix: timeout
* fix: callbacks
* fix: simplify
* remove unused var
* refactor: rename file
* fix: focus when deleting last character
---------
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
Co-authored-by: Jason Rasmussen <jrasm91@gmail.com>
* fix(server): stacked assets for full sync, userIds as array for delta sync
* refactor(server): sync
* fix getDeltaSync after partner removal
---------
Co-authored-by: Jason Rasmussen <jrasm91@gmail.com>
* fix: improve reverse geocoding
* fix: update tests referencing states
* fix: expect state suggestion in any order
---------
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* feat(web,a11y): search filter accessibility
- visible focus rings
- labels for text search
- responsive buttons / radio buttons / checkboxes
- buttons to lowercase
- add fieldsets to radio buttons and checkboxes, so the screen reader
announces the label for the group
* feat: extract inputs into reusable components, replace all checkboxes
* chore: revert changes to responsive buttons
---------
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
Add Toast for download started
Add Toast notification for mobile download started.
Added new placeholder in each language file - populated with best estimate translations.
* fix:(mobile): spell error in top_control_app_bar.dart in function buildAddToAlbumButtom
* fix(mobile): add restore button to individual image view of trashed assets
* formatting
* Fixes equality operator for immich local image provider
* Changes image cache manager to no longer be image cache managers
* Updates large image cache to 12 images
format
* Try 5 Image cache
---------
Co-authored-by: Alex <alex.tran1502@gmail.com>
* rename albums_shared_users_users to album_permissions and add readonly column
* disable synchronize on the original join table
* remove unnecessary FK names
* set readonly=true as default for new album shares
* separate and implement album READ and WRITE permission
* expose albumPermissions on the API, deprecate sharedUsers
* generate openapi
* create readonly view on frontend
* ??? move slideshow button out from ellipsis menu so that non-owners can have access too
* correct sharedUsers joins
* add album permission repository
* remove a log
* fix assetCount getting reset when adding users
* fix lint
* add set permission endpoint and UI
* sort users
* remove log
* Revert "??? move slideshow button out from ellipsis menu so that non-owners can have access too"
This reverts commit 1343bfa311.
* rename stuff
* fix db schema annotations
* sql generate
* change readonly default to follow migration
* fix deprecation notice
* change readonly boolean to role enum
* fix joincolumn as primary key
* rename albumUserRepository in album service
* clean up userId and albumId
* add write access to shared link
* fix existing tests
* switch to vitest
* format and fix tests on web
* add new test
* fix one e2e test
* rename new API field to albumUsers
* capitalize serverside enum
* remove unused ReadWrite type
* missed rename from previous commit
* rename to albumUsers in album entity as well
* remove outdated Equals calls
* unnecessary relation
* rename to updateUser in album service
* minor renamery
* move sorting to backend
* rename and separate ALBUM_WRITE as ADD_ASSET and REMOVE_ASSET
* fix tests
* fix "should migrate single moving picture" test failing on European system timezone
* generated changes after merge
* lint fix
* fix correct page to open after removing user from album
* fix e2e tests and some bugs
* rename updateAlbumUser rest endpoint
* add new e2e tests for updateAlbumUser endpoint
* small optimizations
* refactor album e2e test, add new album shared with viewer
* add new test to check if viewer can see the album
* add new e2e tests for readonly share
* failing test: User delete doesn't cascade to UserAlbum entity
* fix: handle deleted users
* use lodash for sort
* add role to addUsersToAlbum endpoint
* add UI for adding editors
* lint fixes
* change role back to editor as DB default
* fix server tests
* redesign user selection modal editor selector
* style tweaks
* fix type error
* Revert "style tweaks"
This reverts commit ab604f4c8f.
* Revert "redesign user selection modal editor selector"
This reverts commit e6f344856c.
* chore: cleanup and improve add user modal
* chore: open api
* small styling
---------
Co-authored-by: mgabor <>
Co-authored-by: Jason Rasmussen <jrasm91@gmail.com>
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* implemented jump to date from memory
* Changed implementation to a ValueNotifier & fixes
* remove debug code
* feat(mobile):
- Added index bound checks
- Handled edge cases when scrolling to the very bottom of the grid-view
- removing the listener on dispose
* feat(mobile): fixed debug index offset & added debug toast for scroll errors
* feat(mobile): added more debug toasts...
* feat(mobile): scroll to month, if timeline is not grouped by days
---------
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* Button added, config is uploaded
* Refactored to pass "npm run lint" (also verified other PR checklist Web checks)
* Auto-save on config upload
* Static input element
---------
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* Remove asest redirect pages
* Rename route paths to handle optional assetId
* Update old references to new routes
* Load and display asset from all routes that can show assetId
* Add <main> in base layout, update portals to target it
* Wire up updating navigation in response to open/close/prev/next
* Replace events with navigation functions
* Add types to param matcher
* misc cleanup
* Fix reload on /search pages
* Avoid loading bar between photos nav. Delay loading bar by 200ms for all navigations
* Update url for maps routes. Note: on page reload, next/prev is not available
* Dynamically load asset-viewer on map page
* When reloading a url with assetUrl, hide background page to prevent flash during load
* Mostly style, review comments
* Load buckets for assets on demand
* Forgot this update call
* typo
* fix test
* Fix carelessness
* Review comment
* merge main
* remove assets
* fix submodule
---------
Co-authored-by: Alex <alex.tran1502@gmail.com>
Co-authored-by: Daniel Dietzler <mail@ddietzler.dev>
* Create zh-TW.json for Traditional Chinese Language Support
zh-TW for Traditional Chinese (Used in Taiwan and Hong Kong)
* Update zh-TW.json for missed translation.
Update missed translation at line 25.
* add zh-TW to localizely
---------
Co-authored-by: Alex <alex.tran1502@gmail.com>
* Update community-projects.tsx
I have made a repo for the remove offline assets python script that was linked as one of my gists. This repo has much more explanation as the the usage and troubleshooting and allows for the contribution from other community members.
* Update docs/src/components/community-projects.tsx
Co-authored-by: bo0tzz <git@bo0tzz.me>
---------
Co-authored-by: Alex <alex.tran1502@gmail.com>
Co-authored-by: bo0tzz <git@bo0tzz.me>
* Check that server is reachable before starting backup work
* Fix iOS not starting background service
---------
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* fix(web): restore button added to trashed asset-view to restore single item
* fixed the asset-viewer menu to update upon restoration
* prettier formatting complete, testing passed
* chore: clean up
---------
Co-authored-by: Jason Rasmussen <jrasm91@gmail.com>
* fix: Removes old IMMICH text from the mobile settings modal
Removed old Snowburst One font from the pubspec
Removes SnowburstOne.ttf file
* Uses immich text now
* fix(web,a11y): remove autofocus from input field
The autofocus attribute can cause the keyboard to unexpectedly appear
for mobile users, and override any other focus management that the
application is doing programatically.
* fix: always include people filter
* ignore non external assets in external libraries during syncUsage
* only update storage usage if asset is from internal libraries
* update storage usage on motion photo video asset creation
* updated metadata service tests
* added a test
* simplified syncUsage condition
* check for library type upload instead of not external
* fixed broken sql
---------
Co-authored-by: Jason Rasmussen <jrasm91@gmail.com>
* Allow setting the host address for the server & microservices
Default to listen on all interfaces as per the current behavior.
* (Docs) format: fix lint
* added "isExternal" to the getLibraryAssetPaths query
* handleQueueAssetRefresh skip "non external" video asset, closes#8562
* correctly implements live photo deletion for external library
* use "external asset" for external library tests
* minor: external library asset checksum is "path hash" not file hash
* renamed to getExternalLibraryAssetPaths and added isExternal where clause
* generated sql
* reverted leftover change
* remove height limit from user list for better scrolling
* move slideshow button out from menu so that non-owners can see it #8383
* fix activity covering up video player controls #6191
* prettier
---------
Co-authored-by: mgabor <>
* added logs field to bug_report.yaml
lots of issues are missing logs, people are not submitting them proactively, so a new field is added
* placement suggestion from @bo0tzz
* Add AV1 transcoding support
- AV1 encoding on CPU via SVT-AV1 (libsvtav1 in ffmpeg)
- Supports CRF and optionally capped CRF (max bitrate)
- Tested playback successfully in Chrome Win+Android, Firefox Win+Linux, Android app
* AV1: Add support for encoding threads option
* Revert previous commit; specifying params multiple times is bad
We need to specify all svtav1-params at once, so putting the thread option into getThreadOptions is not possible.
* AV1: Override VAAPI getSupportedCodecs as it does not yet support AV1 unlike nvenc, qsv, amf
* Change BaseHWConfig supported codecs to only H264/HEVC
Configs that support VP9 and/or AV1 need to override getSupportedCodecs()
* Set SVT-AV1 threads with svtav1-params, remove duplicate block in NVENCConfig
* AV1Config: Fix empty svtav1-params array being added to options
* add tests
* update api
* allow crf-based two-pass mode
* formatting
* suggest 35
---------
Co-authored-by: mertalev <101130780+mertalev@users.noreply.github.com>
* add longer expirity for share link
* add longer expirity for web UI, add months and year option, add translation
* dart format
---------
Co-authored-by: NAGY Akos (external) <akos.nagy@frequentis.com>
Co-authored-by: Alex <alex.tran1502@gmail.com>
This is the standard behaviour and also more intuitive. As we don't require scrolling when displaying photo spheres this should not impede usability.
Also remove `mousewheelCtrlKey: false`, which is the default.
Co-authored-by: hrdl <7808331-hrdl@users.noreply.gitlab.com>
* Up-to-date information on the Smart Search feature
* npm run format:fix
* fix
* chore: refinement
---------
Co-authored-by: Jason Rasmussen <jrasm91@gmail.com>
* delete thumbnail and other generated files even for readonly asset
* updated test
* don't delete sidecar file for readonly file
* fixed test
* improved external detection
* feat(web): paste photo from clipboard
* listen on svelte:window instead of a div
* refactor: move logic to drag overlay
---------
Co-authored-by: Jason Rasmussen <jrasm91@gmail.com>
* feat(mobile): select locale in the mobile app
* add additional locale
* use the same locale variable across the app
* using different data structure
* drop down with button
* update pull locales
* open app ios
* remove dependency
* format fix
* feat(web,a11y): slider accessibility improvements
* add perceivable focus outline
* label all sliders for screen readers
* chore: add IDs to all settings sliders
* chore: add comment to id prop
* fix: switch to using CSS to add outlines
* fix: reactive sliderId
* fix: bring back the slot
* fix: add aria-describedby for the subtitle
* fix: cleanup css because disabled slider cannot be focused
* fix: add border to the slider when focus is visible
---------
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
Selecting one asset and pressing 's' would show 'Stacked 1 assets'
and result in a noop. This change prevents the notification and
exiting the select mode.
* feat(web): enhance ux/ui of the album list page
* fix unit tests
* feat(web): enhance ux/ui of the album list page
* fix unit tests
* small styling
* better dot
* lint
---------
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* fix(web): show download button correctly based on shared link permission
* remove console log
* Define initial value
* simpler implementation
* refactor: show download in asset viewer for shared link
* chore: hook timeout
---------
Co-authored-by: Jason Rasmussen <jrasm91@gmail.com>
* Fix isImmichPath
* prettier write
* Fis isImmichPath code comment
* Refactor isImmichPath function based on team suggestions
* Test isImmichPath
* fix: clean comments
* Refactor isImmichPath test based on team suggestions
* Clean code with lintern suggestions
* feat(web): ask user before going to newly created album
* feat(web): add button option to notification cards
* feat(web): allow html messages in notification cards
* show album -> view album
* remove 'link' action from notifications
* remove unused type
* Use new logo for Android monochrome adaptive icon
* Use new logo for Android adaptive icon
* Add Android monochrome adaptive icon
* Remove ic_launch_foreground.png from drawable res
- The mipmap res directories have an ic_launcher.png file that will be used on versions lower than 26
- The adaptive icon will be used over versions 26 and above
* Bump to Flutter 3.19.0
* Ran pub upgrade --major-versions and removed isar_version alias
Wrong http version
* Updated share_plus to fix android build
* Updates github actions to 3.19.0
* upgrade to 3.19.3
* upgrade to 3.19.3
---------
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* feat(web): keyboard access for search dropdown
Also: fixing cosmetic issue with combobox component.
* fix: revert changing required field
* fix: create new focusChange action
* fix: combobox usability improvements
* handle escape key on the clear button
* move focus to input when clear button is clicked
* leave the dropdown closed if the user has already closed the dropdown and tabs over to the clear button
* activate the combobox if a user tabs backwards onto the clear button
* rename focusChange to focusOutside
* small fixes
* do not activate combobox on backwards tabbing
* simplify classes in "No results" option
* prevent dropdown option from being preselected when clear button is
clicked
* fix: remove unused event dispatcher interface
* feat(web): use ctrl+a / ctrl+d to select / deselect all assets
* fix(web): use shortcutList for ctrl+a / ctrl+d
* fix(web): remove useless get()
* feat(web): asset interaction store can now select many assets at once
* feat(mobile): include album with 0 assets as album option for backup
* Show icon instead of thumbnail
* Handle backupProgress state transition correctly to always load the backup info
* remove todo comment
* add cache_dir option to OpenVINO EP
* update provider options test to include cache_dir
* use forward slash instead of string concatenation
* fix cache_dir placement in provider options assertion
* Added SVG Support
* Removed comment
* Server Test fixes
* Sorted the mimetypes
* Reverted mimetypes.assettype
* Lint
* fix test
---------
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* fix(web): keyboard shortcut handling
* drop executeShortcuts in favor of action
* fix merge
---------
Co-authored-by: Jason Rasmussen <jrasm91@gmail.com>
* Fixes remote full / thumbnail provider
* Adds image cache manager to both remote image providers
format
format
Fix typo in equals
remove unused import
renames image loader
* Adds height and width to the image cache for thumbs
format
* Uses a separate remote and thumbnail cache
format
* Fixes key name
* Changes uri to string, fixes comment
* Chunk events are optional and remote thumbnails don't report chunk events
* better exception handling
---------
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* feat(mobile): Adds file upload progress stats: current upload file size uploaded, current file size and formatted bytes per second upload speed. Closes#7379
* chore(mobile): Fix stan issues
* chore(mobile): Remove non-'en-US' translations, as I saw on another PR review (just looking around) that localisation is done via Localizely and this was the instruction (to only provide the en-US localisation).
* fix(mobile): Provide boundary checks to ensure overflow issues are accounted for on erroneous upload speed calculation, sometimes the numbers received back from the upload handler can be a bit wild.
* fix(mobile): Some heuristic bug fixing. Whilst thinking what could trigger overflow issues or 'zero' readouts, left over values from the previous file may do that. So adding the last upload sent bytes to the values to be reset may help! The time isn't necessary, as the period/cycle is inconsequential in this circumstance, well it should be anyway.
* fix(mobile): Actually, in combination to the last commit, some more heuristic bug fixing. I was thinking it would be advantageous not to reset the update time, as it would trigger a quicker first upload speed calculation. However, I realised that could also cause the calculation to be incorrect on the first cycle as the period wouldn't align. Not really sure if it would be a big deal, but I'm taking wild guesses in the dark here. Again, some purely heuristic debugging as I can't re-produce the underlying issue. This is mainly just ensuring that the state is fully reset and is a known state at the beginning of each file as a common strategy to reduce issues.
* refactor(mobile): Move the UI for the file progress to underneath the progress bar, it makes more sense there than in the file information table which contains only static information pertaining to the file itself. Switching to a monospace font to keep the UI from jumping around as the numbers change.
* refactor(mobile): In order to have the UI always present an 'active' upload speed (as per the discussion on PR #7760), this stores the 'upload speeds' (capped at the latest 10) in a list and calculates the current upload speed as the average over them. This way the UI can always display a 'constant' upload speed during uploading, instead of starting a fresh when each file starts uploading. Limiting it to the 10 latest keeps the average somewhat recent and ensures some level of sensible memory allocation.
* clean up usage
* i'm not updating all these tests
* update tests
* add indices
* add indices to entities
remove index from person entity
add to face entity
fix
* simplify query
* update sql
* missing await
* remove synchronize false
* Removes analysis options for openapi directory
* Updates the generate open api script to remove the analysis_options.yaml file from the mobile/openapi directory
* feat(web): dark color-scheme css for dark mode
* use dark classes instead of adding data property
* fix code format
* fix typo
---------
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* Implemented last seen date and time with user locale support
* Run Prettier
* Prettier and Linter
* Updated last seen to be in line with suggestions
* Reworked datestamp
* test(server): Load config from yaml
* docs: YAML config support
* feat(server): YAML config file support
* fix format
---------
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* fix: Hide play bar when there's only one image in memory
This commit introduces a fixto hide the play bar at the top of the memory viewer when there's only one image in the memory. Previously, the play bar was displayed regardless of the number of images, leading to unnecessary UI elements for single-image memories.
* Update web/src/lib/components/memory-page/memory-viewer.svelte
Co-authored-by: Michel Heusschen <59014050+michelheusschen@users.noreply.github.com>
---------
Co-authored-by: Michel Heusschen <59014050+michelheusschen@users.noreply.github.com>
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
Although it is written clearly directly below, showing an example of what to change for both containers makes it very clear for people who just skim the code sections.
* feat(web): add preference for thumbnail playback on hover
* pr feedback, add user settings behavior setting
* user settings consistency
* rename appearance to app settings
* collapse single trash setting into app settings
I've committed to this project, and I will not stop. I will keep updating the docs, adding new features, and fixing bugs. But I can't do it alone. So I need your help to give me additional motivation to keep going.
As our hosts in the [selfhosted.show - In the episode 'The-organization-must-not-be-name is a Hostile Actor'](https://selfhosted.show/79?t=1418) said, this is a massive undertaking of what the team and I are doing. And I would love to someday be able to do this full-time, and I am asking for your help to make that happen.
If you feel like this is the right cause and the app is something you are seeing yourself using for a long time, please consider supporting the project with the option below.
### Donation
- [Monthly donation](https://github.com/sponsors/immich-app) via GitHub Sponsors
- [One-time donation](https://github.com/sponsors/immich-app?frequency=one-time&sponsor=alextran1502) via GitHub Sponsors
Since the beginning of this adventure, my goal has always been to create a better world for my children. Memories are priceless, and privacy should not be a luxury. However, building quality open source has its challenges. Over the past two years, it has taken significant dedication, time, and effort.
Recently, a company in Austin, Texas, called FUTO contacted the team. FUTO strives to develop quality and sustainable open software. They build software alternatives that focus on giving control to users. From their mission statement:
“Computers should belong to you, the people. We develop and fund technology to give them back.”
FUTO loved Immich and wanted to see if we’d consider working with them to take the project to the next level. In short, FUTO offered to:
- Pay the core team to work on Immich full-time
- Let us keep full autonomy about the project’s direction and leadership
- Continue to license Immich under AGPL
- Keep Immich’s development direction with no paywalled features
- Keep Immich “built for the people” (no ads, data mining/selling, or alternative motives)
- Provide us with financial, technical, legal, and administrative support
After careful deliberation, the team decided that FUTO’s vision closely aligns with our own: to build a better future by providing a polished, performant, and privacy-preserving open-source software solution for photo and video management delivered in a sustainable way.
Immich’s future has never looked brighter, and we look forward to realizing our vision for Immich as part of FUTO.
If you have more questions, we’ll host a Q&A live stream on May 9th at 3PM UTC (10AM CST). [You can ask questions here](https://www.live-ask.com/event/01HWP2SB99A1K8EXFBDKZ5Z9CF), and the stream will be live [here on our YouTube channel](https://youtube.com/live/cwz2iZwYpgg).
No. Immich will continue to be licensed under AGPL without a CLA.
### Will Immich continue to be free?
Yes. The Immich source code will remain freely available under the AGPL license.
### Is Immich getting VC funding?
No. Venture capital implies investment in a business, often with the expectation of a future payout (exit plan). Immich is neither a business that can be acquired nor comes with a money-making exit plan.
### I am currently supporting Immich through GitHub sponsors. What will happen to my donation?
Effective immediately, all donations to the Immich organization will be canceled. In the future, we will offer an optional, modest payment option instead. Thank you to everyone who donated to help us get this far!
### How is funding sustainable?
Immich and FUTO believe a sustainable future requires a model that does not rely on users-as-a-product. To this end, FUTO advocates that users pay for good, open software. In keeping with this model, we will adopt a purchase price. This means we no longer accept donations, but — _without limiting features for those who do not pay_ — we will soon allow you to purchase Immich through a modest payment. We encourage you to pay for the high-quality software you use to foster a healthy software culture where developers build great applications without hidden motives for their users.
### When does this change take effect?
This change takes effect immediately.
### What will change?
The following things will change as Immich joins FUTO:
- The brand, logo, and other Immich trademarks will be transferred to FUTO.
- We will stop all donations to the project.
- The core team can now dedicate our full attention to Immich
- Before the end of the year, we plan to have a roadmap for what it will take to get Immich to a stable release.
- Bugs will be squashed, and features will be delivered faster.
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 see list of all users in Immich?
### How can I see a list of all users in Immich?
You can see the list of all users by running [list-users](/docs/administration/server-commands.md) Command on the Immich-server.
@@ -24,22 +24,43 @@ You can see the list of all users by running [list-users](/docs/administration/s
### I cannot log into the application after an update. What can I do?
First, verify that the mobile app and server are both running the same version (major and minor).
Verify that the mobile app and server are both running the same version (major and minor).
:::note
App store updates sometimes take longer because the stores (Google play store and Apple app store)
need to approve the update first which may take some time.
App store updates sometimes take longer because the stores (Google Play Store and Apple App Store)
need to approve the update first, and it can take some time.
:::
If you still cannot login to the app, try the following:
If you still cannot login to the app, try the following:
- Check the mobile logs
- Make sure login credentials are correct by logging in on the web app
### Why does foreground backup stop when I navigate away from the app? Shouldn't it transfer the job to background backup?
Foreground backup and background backup are two separate mechanisms. They don't communicate or interact with each other.
Foreground backup is controlled by the user's action, while background backup is controlled by your device's operating system. When the app is put in the background, the invocation of background tasks is delegated to the device's operating system scheduler. It decides when the background task can run and how long it can run.
The behaviors differ based on your device manufacturer and operating system, but most are related to battery-saving policies.
### Why is background backup on iOS not working?
On iOS (iPhone and iPad), the operating system determines if a particular app can invoke background tasks based on multiple factors, most of which the Immich app has no control over. To increase the likelihood that the background backup task is run, follow the steps below:
- Enable Background App Refresh for Immich in the iOS settings at `Settings > General > Background App Refresh`.
- Disable Background App Refresh for apps that don't need background tasks to run. This will reduce the competition for background task invocation for Immich.
- Use the Immich app more often.
---
## Assets
### Does Immich change the file?
No, Immich does not touch the original file under any circumstances,
all edited metadata are saved in the companion sidecar file and the database.
### Can I add my existing photo library?
Yes, with an [External Library](/docs/features/libraries.md).
@@ -50,11 +71,11 @@ Template changes will only apply to _new_ assets. To retroactively apply the tem
### Why are only photos and not videos being uploaded to Immich?
This often happens when using a reverse proxy (such as nginx 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. Also check the disk space of your reverse proxy, in some cases proxies cache requests to disk before passing them on, and if disk space runs out the request fails.
This often happens when using a reverse proxy (such as Nginx 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. Also, check the disk space of your reverse proxy. In some cases, proxies cache requests to disk before passing them on, and if disk space runs out, the request fails.
### Why are some photos stored in the file system with the wrong date?
There are a few different scenarios that can lead to this situation. The solution is to run the storage migration job again. The job is only _automatically_ run once per asset, after upload. If metadata extraction originally failed, the jobs were cleared/cancelled, etc. the job may not have run automatically the first time.
There are a few different scenarios that can lead to this situation. The solution is to rerun the storage migration job. The job is only automatically run once per asset after upload. If metadata extraction originally failed, the jobs were cleared/canceled, etc., the job may not have run automatically the first time.
### How can I hide photos from the timeline?
@@ -68,23 +89,27 @@ See [Backup and Restore](/docs/administration/backup-and-restore.md).
No, it currently does not. There is an [open feature request on GitHub](https://github.com/immich-app/immich/discussions/4348).
### Does Immich support filtering of NSFW images?
### Does Immich support the filtering of NSFW images?
No, it currently does not. There is an [open feature request on Github](https://github.com/immich-app/immich/discussions/2451).
### Why are there so many thumbnail generation jobs?
There are three thubmanil jobs for each asset:
There are three thumbnail jobs for each asset:
- Blurred (thumbhash)
- Small (webp)
- Large (jpeg)
- Preview (Webp)
- Thumbnail (Jpeg)
Also, there are additional jobs for person (face) thumbnails.
### Why do files from WhatsApp not appear with the correct date?
Files sent on WhatsApp are saved without metadata on the file. Therefore, Immich has no way of knowing the original date of the file when files are uploaded from WhatsApp, not the order of arrival on the device. [See #3527](https://github.com/immich-app/immich/issues/3527).
### What happens if an asset exists in more than one account?
There are no requirements for assets to be unique across users. If multiple users upload the same image they are processed as if they were distinct assets and jobs run and thumbnails are generated accordingly.
There are no requirements for assets to be unique across users. If multiple users upload the same image, it is processed as if it were a distinct asset, and jobs run and thumbnails are generated accordingly.
### Why do HDR videos appear pale in Immich player but look normal after download?
@@ -96,45 +121,46 @@ Immich always keeps your original files. Alongside that, it generates a transcod
### How can I delete transcoded videos without deleting the original?
The transcoded version of an asset can be deleted by setting a transcode policy that makes it unnecessary, then running a transcoding job for that asset. This can be done on a per-asset basis by starting a transcoding job for a single asset with the _Refresh encoded videos_ button in the asset viewer options, or for all assets by running transcoding jobs for all assets from the administration page.
The transcoded version of an asset can be deleted by setting a transcode policy that makes it unnecessary and then running a transcoding job for that asset. This can be done on a per-asset basis by starting a transcoding job for a single asset with the _Refresh encoded videos_ button in the asset viewer options or for all assets by running transcoding jobs for all assets from the administration page.
To update the transcode policy, navigate to Administration > Video Transcoding Settings > Transcoding Policy and select a policy from the drop-down. This policy will determine whether an existing transcode will be deleted or overwritten in the transcoding job. If a video should be transcoded according to this policy, an existing transcode is overwritten. If not, then it is deleted.
:::note
For example, say you have existing transcodes with the policy "Videos higher than normal resolution or not in the desired format" and switch to a narrower policy: "Videos not in the desired format". If an asset was only transcoded due to its resolution, then running a transcoding job for it will now delete the existing transcode. This is because resolution is no longer part of the transcode policy and the transcode is unnecessary as a result. Likewise, if you set the policy to "Don't transcode any videos" and run transcoding jobs for all assets, this will delete all existing transcodes as they are all unnecessary.
For example, say you have existing transcodes with the policy "Videos higher than normal resolution or not in the desired format" and switch to a narrower policy: "Videos not in the desired format." If an asset was only transcoded due to its resolution, running a transcoding job for it will delete the existing transcode. This is because resolution is no longer part of the transcode policy and the transcode is unnecessary. Likewise, if you set the policy to "Don't transcode any videos" and run transcoding jobs for all assets, this will delete all existing transcodes as they are unnecessary.
:::
### Is it possible to compress images during backup?
No. Our golden rule is that the original assets should always be untouched, so we don't think this feature is a good fit for Immich.
No. Our design principle is that the original assets should always be untouched.
### How can I move all data (photos, persons, albums) from one user to another?
### How can I move all data (photos, persons, albums, libraries) from one user to another?
This is not officially supported, but can be accomplished with some database updates. You can do this on the command line (in the PostgreSQL container using the psql command), or you can add for example an [Adminer](https://www.adminer.org/) container to the `docker-compose.yml` file, so that you can use a web-interface.
:::warning
This is an advanced operation. If you can't do it with the steps described here, this is not for you.
:::
This is not officially supported but can be accomplished with some database updates. You can do this on the command line (in the PostgreSQL container using the `psql` command), or you can add, for example, an [Adminer](https://www.adminer.org/) container to the `docker-compose.yml` file so that you can use a webinterface.
<details>
<summary>Steps</summary>
1. **MAKE A BACKUP** - See [backup and restore](/docs/administration/backup-and-restore.md).
2. Find the id of both the 'source' and the 'destination' user (it's the id column in the users table)
2. Find the ID of both the 'source' and the 'destination' user (it's the id column in the `users` table)
3. Three tables need to be updated:
3. Four tables need to be updated:
```sql
// reassign albums
BEGIN;
-- reassign albums
UPDATE albums SET "ownerId" = '<destinationId>' WHERE "ownerId" = '<sourceId>';
// reassign people
-- reassign people
UPDATE person SET "ownerId" = '<destinationId>' WHERE "ownerId" = '<sourceId>';
// reassign assets
-- reassign assets
UPDATE assets SET "ownerId" = '<destinationId>' WHERE "ownerId" = '<sourceId>'
AND CHECKSUM NOT IN (SELECT CHECKSUM FROM assets WHERE "ownerId" = '<destinationId>');
-- reassign external libraries
UPDATE libraries SET "ownerId" = '<destinationId>' WHERE "ownerId" = '<sourceId>';
COMMIT;
```
4. There might be left-over assets in the 'source' user's library if they are skipped by the last query because of duplicate checksums. These are probably duplicates anyway, and can probably be removed.
@@ -159,7 +185,7 @@ No, not yet. For updates on this planned feature, follow the [GitHub discussion]
### Can I add an external library while keeping the existing album structure?
We haven't put in an official mechanism to create albums from external libraries at the moment, but there are some [workarounds from the community](https://github.com/immich-app/immich/discussions/4279) to help you achieve that.
We haven't implemented an official mechanism for creating albums from external libraries, but there are some [workarounds from the community](https://github.com/immich-app/immich/discussions/4279) to help you achieve that.
### What happens to duplicates in external libraries?
@@ -171,7 +197,7 @@ Duplicate checking only exists for upload libraries, using the file hash. Furthe
### How does smart search work?
Immich uses CLIP models, for more information about CLIP and its capabilities read about it [here](https://openai.com/research/clip).
Immich uses CLIP models. For more information about CLIP and its capabilities, read about it [here](https://openai.com/research/clip).
### How does facial recognition work?
@@ -189,33 +215,31 @@ However, disabling all jobs will not disable the machine learning service itself
### I'm getting errors about models being corrupt or failing to download. What do I do?
You can delete the model cache volume, which is where models are downloaded to. This will give the service a clean environment to download the model again. If models are failing to download entirely, you can manually download them from [Huggingface](https://huggingface.co/immich-app) and place them in the cache folder.
### Why did Immich decide to remove object detection?
The feature added keywords to images for metadata search, but wasn't used for smart search. Smart search made it unnecessary as it isn't limited to exact keywords. Combined with it causing crashes on some devices, using many dependencies and causing user confusion as to how search worked, it was better to remove the job altogether.
For more info see [here](https://github.com/immich-app/immich/pull/5903)
You can delete the model cache volume, where models are downloaded. This will give the service a clean environment to download the model again. If models are failing to download entirely, you can manually download them from [Huggingface][huggingface] and place them in the cache folder.
### Can I use a custom CLIP model?
No, this is not supported. Only models listed in the [Huggingface](https://huggingface.co/immich-app) page are compatible. Feel free to make a feature request if there's a model not listed here that you think should be added.
No, this is not supported. Only models listed in the [Huggingface][huggingface] page are compatible. Feel free to make a feature request if there's a model not listed here that you think should be added.
### I want to be able to search in other languages besides English. How can I do that?
You can change to a multilingual model listed [here](https://huggingface.co/collections/immich-app/multilingual-clip-654eb08c2382f591eeb8c2a7) by going to Administration > Machine Learning Settings > Smart Search and replacing the name of the model. Be sure to re-run Smart Search on all assets after this change. You can then search in over 100 languages.
:::note
Feel free to make a feature request if there's a model you want to use that isn't in [Immich Huggingface list](https://huggingface.co/immich-app).
Feel free to make a feature request if there's a model you want to use that isn't in [Immich Huggingface list][huggingface].
:::
### Does Immich support Facial Recognition for videos?
### Does Immich support Facial Recognition for videos?
Immich's machine learning feature operate on the generated thumbnail. If a face is visible in the video's thumbnail it will be picked up by facial recognition.
Immich's machine learning feature operates on the generated thumbnail. If a face is visible in the video's thumbnail it will be picked up by facial recognition.
Scanning the entire video for faces may be implemented in the future.
### Does Immich have animal recognition?
No.
:::tip
You can use [Smart Search](/docs/features/smart-search.md) for this to some extent. For example, if you have a Golden Retriever and a Chihuahua, type these words in the smart search and watch the results.
:::
### I'm getting a lot of "faces" that aren't faces, what can I do?
@@ -224,14 +248,19 @@ to increase the bar for what the algorithm considers a "core face" for that pers
### The immich_model-cache volume takes up a lot of space, what could be the problem?
If you installed several models and chose not to use some of them, it might be worth deleting the old models that are in immich_model-cache.
If you installed several models and chose not to use some of them, it might be worth deleting the old models that are in immich_model-cache. To do this you can mount the model cache and remove the undesired models.
To do this you can run:
<details>
<summary>Steps</summary>
- `docker run -it --rm -v immich_model-cache:/mnt ubuntu bash`
- `cd mnt`
- `ls`
- and delete unused models with `rm -r <model_name>`.
```bash
docker run -it --rm -v immich_model-cache:/mnt-models alpine sh
@@ -248,13 +277,28 @@ The initial backup is the most intensive due to the number of jobs running. The
- Lower the job concurrency for these jobs to 1.
- Under Settings > Transcoding Settings > Threads, set the number of threads to a low number like 1 or 2.
- Under Settings > Machine Learning Settings > Facial Recognition > Model Name, you can change the facial recognition model to `buffalo_s` instead of `buffalo_l`. The former is a smaller and faster model, albeit not as good.
- You _must_ re-run the Face Detection job for all images after this for facial recognition on new images to work properly.
- If these changes are not enough, see [below](/docs/FAQ#how-can-i-disable-machine-learning) for how you can disable machine learning.
- For facial recognition on new images to work properly, You must re-run the Face Detection job for all images after this.
- If these changes are not enough, see [below](/docs/FAQ#how-can-i-disable-machine-learning) for instructions on how to disable machine learning.
### Can I limit the amount of CPU and RAM usage?
By default, a container has no resource constraints and can use as much of a given resource as the host's kernel scheduler allows.
You can look at the [original docker docs](https://docs.docker.com/config/containers/resource_constraints/) or use this [guide](https://www.baeldung.com/ops/docker-memory-limit) to learn how to limit this.
By default, a container has no resource constraints and can use as much of a given resource as the host's kernel scheduler allows. To limit this, you can add the following to the `docker-compose.yml` block of any containers that you want to have limited resources.
<details>
<summary>docker-compose.yml</summary>
```yaml
deploy:
resources:
limits:
# Number of CPU threads
cpus: '1.00'
# Gigabytes of memory
memory: '1G'
```
</details>
For more details, you can look at the [original docker docs](https://docs.docker.com/config/containers/resource_constraints/) or use this [guide](https://www.baeldung.com/ops/docker-memory-limit).
### How can I boost machine learning speed?
@@ -269,13 +313,17 @@ On a normal machine, 2 or 3 concurrent jobs can probably max the CPU. Beyond thi
Do not exaggerate with the amount of jobs because you're probably thoroughly overloading the server.
More detail can be found [here](https://discord.com/channels/979116623879368755/994044917355663450/1174711719994605708)
More details can be found [here](https://discord.com/channels/979116623879368755/994044917355663450/1174711719994605708)
:::
### Why is Immich using so much of my CPU?
When a large amount of assets are uploaded to Immich it makes sense that the CPU and RAM will be heavily used due to machine learning work and creating image thumbnails.
Once this process completes, the percentage of CPU usage will drop to around 3-5% usage
When a large number of assets are uploaded to Immich, it makes sense that the CPU and RAM will be heavily used for machine learning work and creating image thumbnails.
Once this process is completed, the percentage of CPU usage will drop to around 3-5% usage
### My server shows Server Status Offline | Version Unknown what can I do?
You need to enable Websocket on your reverse proxy.
---
@@ -288,19 +336,37 @@ Immich components are typically deployed using docker. To see logs for deployed
### How can I run Immich as a non-root user?
You can change the user in the container by setting the `user` argument in `docker-compose.yml` for each service.
You may need to add an additional volume to `immich-microservices` that mounts internally to `/usr/src/app/.reverse-geocoding-dump`.
You may need to add mount points or docker volumes for the following internal container paths:
- `immich-machine-learning:/.config`
- `immich-machine-learning:/.cache`
- `redis:/data`
The non-root user/group needs read/write access to the volume mounts, including `UPLOAD_LOCATION`.
### How can I **purge** data from Immich?
For a further hardened system, you can add the following block to every container except for `immich_postgres`.
<details>
<summary>docker-compose.yml</summary>
```yaml
security_opt:
# Prevent escalation of privileges after the container is started
- no-new-privileges:true
cap_drop:
# Prevent access to raw network traffic
- NET_RAW
```
</details>
### 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
1. **Metadata** stored in a Postgres database, stored in the `DB_DATA_LOCATION` folder (previously `pg_data` Docker volume).
2. **Files** (originals, thumbs, profile, etc.), stored in the `UPLOAD_LOCATION` folder, more [info](/docs/administration/backup-and-restore#asset-types-and-storage-locations).
To remove the **Metadata** you can stop Immich and delete the volume.
:::warning
This will destroy your database and reset your instance, meaning that you start from scratch.
:::
@@ -309,13 +375,16 @@ This will destroy your database and reset your instance, meaning that you start
docker compose down -v
```
After removing the containers and volumes, there are a few directories that need to be deleted to reset Immich to a new installation. Once they are deleted, Immich can be started back up and will be a fresh installation.
- `DB_DATA_LOCATION` contains the database, media info, and settings.
- `UPLOAD_LOCATION` contains all the media uploaded to Immich.
:::note Portainer
If you use portainer, bring down the stack in portainer. Go into the volumes section
and remove all the volumes related to immcih then restart the stack.
and remove all the volumes related to immich then restart the stack.
:::
After removing the containers and volumes, the **Files** should be removed from the `UPLOAD_LOCATION` to provide a clean start.
### Why does the machine learning service report workers crashing?
:::note
@@ -330,6 +399,47 @@ If it mentions SIGILL (note the lack of a K) or error code 132, it most likely m
If your version of Immich is below 1.92.0 and the crash occurs after logs about tracing or exporting a model, consider either upgrading or disabling the Tag Objects job.
### Why does Immich log migration errors on startup?
## Database
Sometimes Immich logs errors such as "duplicate key value violates unique constraint" or "column (...) of relation (...) already exists". Because of Immich's container structure, this error can be seen when both immich and immich-microservices start at the same time and attempt to migrate or create the database structure. Since the database migration is run sequentially and inside of transactions, this error message does not cause harm to your installation of Immich and can safely be ignored. If needed, you can manually restart Immich by running `docker restart immich immich-microservices`.
### Why am I getting database ownership errors?
If you get database errors such as `FATAL: data directory "/var/lib/postgresql/data" has wrong ownership` upon database startup, this is likely due to an issue with your filesystem.
NTFS and ex/FAT/32 filesystems are not supported. See [here](/docs/install/environment-variables#supported-filesystems) for more details.
### How can I verify the integrity of my database?
If you installed Immich using v1.104.0 or later, you likely have database checksums enabled by default. You can check this by running the following command.
A result of `on` means that checksums are enabled.
If checksums are enabled, you can check the status of the database with the following command. A normal result is all zeroes.
<details>
<summary>Check for database corruption</summary>
```bash
docker exec -it immich_postgres psql --dbname=immich --username=<DB_USERNAME> --command="SELECT datname, checksum_failures, checksum_last_failure FROM pg_stat_database WHERE datname IS NOT NULL"
@@ -15,39 +15,47 @@ Immich saves [file paths in the database](https://github.com/immich-app/immich/d
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.
The recommended way to backup and restore the Immich database is to use the `pg_dumpall` command. When restoring, you need to delete the `DB_DATA_LOCATION` folder (if it exists) to reset the database.
:::caution
It is not recommended to directly backup the `DB_DATA_LOCATION` folder. Doing so while the database is running can lead to a corrupted backup that cannot be restored.
:::
<Tabs>
<TabItem value="Linux system based Backup" label="Linux system based Backup" default>
docker compose up -d # Start remainder of Immich apps
```
@@ -56,6 +64,10 @@ 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.).
:::tip
Some deployment methods make it difficult to start the database without also starting the server or microservices. In these cases, you may set the environmental variable `DB_SKIP_MIGRATIONS=true` before starting the services. This will prevent the server from running migrations that interfere with the restore process. Note that both the server and microservices must have this variable set to prevent the migrations from running. Be sure to remove this variable and restart the services after the database is restored.
:::
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
@@ -63,15 +75,17 @@ services:
...
backup:
container_name: immich_db_dumper
image: prodrigestivill/postgres-backup-local
image: prodrigestivill/postgres-backup-local:14
env_file:
- .env
environment:
POSTGRES_HOST: database
POSTGRES_DB: ${DB_DATABASE_NAME}
POSTGRES_CLUSTER: 'TRUE'
POSTGRES_USER: ${DB_USERNAME}
POSTGRES_PASSWORD: ${DB_PASSWORD}
POSTGRES_DB: ${DB_DATABASE_NAME}
SCHEDULE: "@daily"
POSTGRES_EXTRA_OPTS: '--clean --if-exists'
BACKUP_DIR: /db_dumps
volumes:
- ./db_dumps:/db_dumps
@@ -82,17 +96,29 @@ services:
Then you can restore with the same command but pointed at the latest dump.
If you see the error `ERROR: type "earth" does not exist`, or you have problems with Reverse Geocoding after a restore, add the following `sed` fragment to your restore command.
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:
Immich stores two types of content in the filesystem: (1) original, unmodified assets (photos and videos), and (2) generated content. Only the original content needs to be backed-up, which is stored in the following folders:
1. `UPLOAD_LOCATION/library`
2. `UPLOAD_LOCATION/upload`
3. `UPLOAD_LOCATION/profile`
:::caution
If you moved some of these folders onto a different storage device, such as `profile/`, make sure to adjust the backup path to match your setup
:::
### Asset Types and Storage Locations
Some storage locations are impacted by the Storage Template. See below for more details.
@@ -101,7 +127,8 @@ Some storage locations are impacted by the Storage Template. See below for more
<TabItem value="Storage Template Off (Default)." label="Storage Template Off (Default)." default>
:::note
`UPLOAD_LOCATION/library` folder is not used by default on new machines running version 1.92.0. These are if the system administrator activated the storage template engine, for [more info](https://github.com/immich-app/immich/releases#:~:text=the%20partner%E2%80%99s%20assets.-,Hardening%20storage%20template,-We%20have%20further).
The `UPLOAD_LOCATION/library` folder is not used by default on new machines running version 1.92.0. It is used only if the system administrator activated the storage template engine,
for more info read the [release notes](https://github.com/immich-app/immich/releases/tag/v1.92.0#:~:text=the%20partner%E2%80%99s%20assets.-,Hardening%20storage%20template).
:::
**1. User-Specific Folders:**
@@ -113,16 +140,16 @@ Some storage locations are impacted by the Storage Template. See below for more
- **Source Assets:**
- Original assets uploaded through the browser interface & mobile & CLI.
- Stored in `/library/upload/<userID>`.
- Stored in `UPLOAD_LOCATION/upload/<userID>`.
- **Avatar Images:**
- User profile images.
- Stored in `/library/profile/<userID>`.
- Stored in `UPLOAD_LOCATION/profile/<userID>`.
- **Thumbs Images:**
- Preview images (blurred, small, large) for each asset and thumbnails for recognized faces.
- Stored in `/library/thumbs/<userID>`.
- Preview images (small thumbnails and large previews) for each asset and thumbnails for recognized faces.
- Stored in `UPLOAD_LOCATION/thumbs/<userID>`.
- **Encoded Assets:**
- By default, unless otherwise specified re-encoded video assets for wider compatibility.
- Stored in `/library/encoded-video/<userID>`.
- Videos that have been re-encoded from the original for wider compatibility. The original is not removed.
- Stored in `UPLOAD_LOCATION/encoded-video/<userID>`.
@@ -130,34 +157,34 @@ Some storage locations are impacted by the Storage Template. See below for more
:::note
If you choose to activate the storage template engine, it will move all assets to `UPLOAD_LOCATION/library/<userID>`.
When you turn off the storage template engine, it will leave the assets in `UPLOAD_LOCATION/library/<userID>` and will not return them to `/library/upload`.
**New assets** will be saved to `/library/upload`.
When you turn off the storage template engine, it will leave the assets in `UPLOAD_LOCATION/library/<userID>` and will not return them to `UPLOAD_LOCATION/upload`.
**New assets** will be saved to `UPLOAD_LOCATION/upload`.
:::
**1. User-Specific Folders:**
- Each user has a unique string representing them.
- The main user is "Admin" (but only for `UPLOAD_LOCATION/library`)
- Other users have different string identifiers.
- You can find your user ID in Account Account Settings -> Account -> User ID.
- The administrator can set a Storage Label for a user, which will be used instead of `<userID>` for the `library/` folder.
- The Admin has a default storage label of `admin`.
- You can find your user ID and Storage Label in Account Account Settings -> Account -> User ID.
**2. Asset Types and Storage Locations:**
- **Source Assets:**
- Original assets uploaded through the browser interface & mobile & CLI.
- Original assets uploaded through the browser interface, mobile, and CLI.
- Stored in `UPLOAD_LOCATION/library/<userID>`.
- **Avatar Images:**
- User profile images.
- Stored in `/library/profile/<userID>`.
- Stored in `UPLOAD_LOCATION/profile/<userID>`.
- **Thumbs Images:**
- Preview images (blurred, small, large) for each asset and thumbnails for recognized faces.
- Stored in `/library/thumbs/<userID>`.
- Stored in `UPLOCAD_LOCATION/thumbs/<userID>`.
- **Encoded Assets:**
- By default, unless otherwise specified re-encoded video assets for wider compatibility .
- Stored in `/library/encoded-video/<userID>`.
- Videos that have been re-encoded from the original for wider compatibility. The original is not removed.
- Stored in `UPLOAD_LOCATION/encoded-video/<userID>`.
- **Files in Upload Queue (Mobile):**
- Files uploaded through mobile apps.
- Temporarily located in `/library/upload/<userID>`.
- Temporarily located in `UPLOAD_LOCATION/upload/<userID>`.
- Transferred to `UPLOAD_LOCATION/library/<userID>` upon successful upload.
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.
The `immich-server` responds to API requests for data and files for the web and mobile app. To do this quickly and reliably, it offloads most other work to `immich-microservices` in the form of _jobs_. Simply put, a job is a request to process data in the background. Jobs are picked up automatically by microservices containers.

When a new asset is uploaded it kicks off a series of jobs, which include metadata extraction, thumbnail generation, machine learning tasks, and storage template migration, if enabled. To view the status of a job navigate to the Administration -> Jobs page.
Additionally, some jobs run on a schedule, which is every night at midnight. This schedule, with the exception of [External Libraries](/docs/features/libraries) scanning, cannot be changed.
:::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.
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.