* fix(deps): update dependency @nestjs/swagger to v8
* chore: generate open api
---------
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Daniel Dietzler <mail@ddietzler.dev>
* Allows for toggling of sorting in the merge face selector
* Adds toggle to the side panel for faces
* Improve layout and fix toggle
* chore: ui cleanup
---------
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
Add more documentation for video transcoding settings.
This adds documentation on many of the video transcoding settings `ffmpeg.*`. I focused the documentation on values that aren't just passthough to ffmpeg settings but that are custom to Immich.
* feat(mobile): album view sort order
* feat: add error message
* refactor(mobile): album page (#14659)
* refactor album page
* update lint rule
* const record
* fix: updating sort order when pull to refresh
---------
Co-authored-by: Alex <alex.tran1502@gmail.com>
* Move sort toggle button to bottom sheet menu
* chore: revert multiselectgrid loading status
* chore: revert multiselectgrid loading status
---------
Co-authored-by: Mert <101130780+mertalev@users.noreply.github.com>
* Merge Faces sorted by Similarity
* Adds face sorting to the side panel face merger
* run make open-api
* Make it one query
* Only have the single order by when sorting by closest face
* add native player library
* splitup the player
* stateful widget
* refactor: native_video_player
* fix: handle buffering
* turn on volume when video plays
* fix: aspect ratio
* fix: handle remote asset orientation
* refinements and fixes
fix orientation for remote assets
wip separate widget
separate video loader widget
fixed memory leak
optimized seeking, cleanup
debug context pop
use global key
back to one widget
fixed rebuild
wait for swipe animation to finish
smooth hero animation for remote videos
faster scroll animation
* clean up logging
* refactor aspect ratio calculation
* removed unnecessary import
* transitive dependencies
* fixed referencing uninitialized orientation
* use correct ref to build android
* higher res placeholder for local videos
* slightly lower delay
* await things
* fix controls when swiping between image and video
* linting
* extra smooth seeking, add comments
* chore: generate router page
* use current asset provider and loadAsset
* fix stack handling
* improved motion photo handling
* use visibility for motion videos
* error handling for async calls
* fix duplicate key error
* maybe fix duplicate key error
* increase delay for hero animation
* faster initialization for remote videos
* ensure dimensions for memory cards
* make aspect ratio logic reusable, optimizations
* refactor: move exif search from aspect ratio to orientation
* local orientation on ios is unreliable; prefer remote
* fix no audio in silent mode on ios
* increase bottom bar opacity to account for hdr
* remove unused import
* fix live photo play button not updating
* fix map marker -> galleryviewer
* remove video_player
* fix hdr playback on android
* fix looping
* remove unused dependencies
* update to latest player commit
* fix player controls hiding when video is not playing
* fix restart video
* stop showing motion video after ending when looping is disabled
* delay video initialization to avoid placeholder flicker
* faster animation
* shorter delay
* small delay for image -> video on android
* fix: lint
* hide stacked children when controls are hidden, avoid bottom bar dropping
---------
Co-authored-by: Alex <alex.tran1502@gmail.com>
Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
Co-authored-by: mertalev <101130780+mertalev@users.noreply.github.com>
* feat(server): Add publicUsers toggle for user search
* tests
* docs: add check:typescript for web PR checklist
* return auth.user when publicUsers is false - app testing
---------
Co-authored-by: Alex <alex.tran1502@gmail.com>
* Set hardware decoding options for rkmpp when hardware decoding is enabled with no OpenCL on non-HDR file
* Use hw decoding, sw tone-mapping on HDR files using RKMPP w/o OpenCL
* fallback to software decoding if is hdr video
* if hw decoding failed with hw dec config enabled, try sw dec+hw enc first, then full sw dec+enc
* fix unit test
* fix format, adjust log message
* formatting
---------
Co-authored-by: mertalev <101130780+mertalev@users.noreply.github.com>
* feat(server): clean up interrupted upload files
* pr feedback
* remove console.log
* handle all errors
* remove return in callback function
* programming in bed is a bad idea
feat: Added shortcuts, shift-multi select and missing menu options to GalleryViewer (Search, Share, Memories)
Co-authored-by: Alex <alex.tran1502@gmail.com>
* fix(mobile): make widgets rebuild on locale changes
This will make the make the pages to instantly refresh the correct
translated string, without the need to pop and push the settings page.
* fix(mobile): set the default intl locale
This is needed because across the app, you don't pass the context.locale
to DateFormat, so by default it uses the system's locale. This will fix
the issue without the need to refactor a lot of code.
* feat(mobile): create localeProvider
This provider can be used to refresh providers that provide UI elements
and get cached.
* fix(mobile): refresh asset providers on locale change
This is necessary to update the locale on the already evaluated
DateFormat.
---------
Co-authored-by: Alex <alex.tran1502@gmail.com>
* feat(mobile): create localeProvider
This provider can be used to refresh providers that provide UI elements
and get cached.
* feat(mobile): use default font for locales not supported by Overpass
* chore(mobile): fix test
* refactor(mobile): use Locale instead of String
* chore(mobile): make all search filters dismissible
* chore(mobile): make ImmichAppBarDialog dismissible
---------
Co-authored-by: Alex <alex.tran1502@gmail.com>
* use sets in album sync, concurrent futures
* batch excluded asset IDs
* update test
* take advantage of sets in Recents check
* move log statement
* smaller diff
* expose detailed user storage stats + display them in the storage per user table
* chore: openapi & sql
* fix: fix test stubs
* fix: formatting errors, e2e test and server test
* fix: upper lower case typo in spec file
---------
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* fix: go back to last page from shared links page. Handle albums page from shared links page routing
* add default route for sharing
* chore: remove redundant import
* remove unnecessary comment
---------
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
gzip --rsyncable has a slightly worse compression ratio, but allows for
efficient deduplication and, as the name implies, faster rsync
operations.
Signed-off-by: Sefa Eyeoglu <contact@scrumplex.net>
* fix(server): allow starting backup through API
* fix(server): fix pg_dumpall args when using database URLs
The database has to be specified using `-d`, unlike for pg_dump.
* Improve wording to make it easier to read custom-locations.md
It's only grammatical change
* Update docs/docs/guides/custom-locations.md
Co-authored-by: bo0tzz <git@bo0tzz.me>
* Update custom-locations.md
Revert to 'because of' and remove 'hard drive'
---------
Co-authored-by: bo0tzz <git@bo0tzz.me>
* fixed the local ids selecting issue
* code: updated impl inside deleteLocalOnlyAssets
* fix: used png instead of jpg to maintain picture quality
* Revert "fix: used png instead of jpg to maintain picture quality"
This reverts commit 04f2ed54e4.
* fix: update logic from code-review perspective
* refractor (mobile) : Dart fix applied
* fix (mobile) : Updated multi grid as per requirement
---------
Co-authored-by: Alex <alex.tran1502@gmail.com>
Disable opening image and library sub-items by default
Disable both the Image Settings and the External Library sub-items by default. This aligns with auth other settings sub-items showing as collapsed by default.
* chore(web): setup tests for ChangeDate component
* chore(web): add tests for callback funcs with the right value
* chore(web): add tests for daylight saving time
* rename file properly
---------
Co-authored-by: bo0tzz <git@bo0tzz.me>
* Update hardware-transcoding.md
Add niche instruction to get QSV working with Jasper Lake CPUs, based on conclusion from #3595
* Relocate note to setup step, under the Admin page changes
* Add Elkhart Lake
* chore: cleanup
---------
Co-authored-by: Jason Rasmussen <jason@rasm.me>
* factor out cancel multiselect state logic to utils
* use cancel multiselct helper in album page
* use cancel multiselct helper in album-viewer component
* use cancel multiselct helper in asset-grid component
* remove unused to fix lint
* fix(server): encodes iPhone 16 Pro video with unknown audio codec
* remove white space
* pr feedback + unit test
* remove public method keyword
* test the service
* correcting unit test
Album update jobs will now wait five minutes to send. If a new image is added while that job is pending, the old job will be cancelled, and a new one will be enqueued for a minute.
This is to prevent a flood of notifications by dragging in images directly to the album, which adds them to the album one at a time.
Album updates now include a list of users to email, which is generally everybody except the updater. If somebody else updates the album within that minute, both people will get an album update email in a minute, as they both added images and the other should be notified.
The relink person icon is currently a minus symbol. This can be confusing as it looks like a "remove person" button. Changing it to a pencil makes it clear it is an editing operation, not a removing operation.
I don't know how to write Dart code, so I cannot help with the Mobile app.
* fix(deps): update dependency exiftool-vendored to v28.6.0
* fix: incorrect day light savings date time
---------
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Jason Rasmussen <jason@rasm.me>
* bug fix
* added few more type hint
* onMount removed, removed current user to user
* user check removed and conflict in view mode resolved between option and share info modal
* format fix
---------
Co-authored-by: Alex <alex.tran1502@gmail.com>
* Update backup-and-restore.md
changelog:
Add database name to the restore command and document it in the notes
* docs: remove added database flag and change warn wording
* docs: fix forgotten warning change
Co-authored-by: Matthew Momjian <50788000+mmomjian@users.noreply.github.com>
---------
Co-authored-by: Matthew Momjian <50788000+mmomjian@users.noreply.github.com>
* fix(deps): update dependency exiftool-vendored to v28.3.0
* feat(server): parse offset from "Image_UTC_Data" (Samsung)
A Samsung phone might provide the local time (e.g. 09:00) without any timezone or
offset information. If the file also includes the non-standard trailer tag
"TimeStamp" in "Image_UTC_Data", we can use the unix timestamp contained within to
deduce the offset.
As an example, if the local date/time is "2024-09-15T09:00" and the unix timestamp is
1726408800 (which is 2024-09-15T16:00 UTC), we know that the offset is -07:00.
The actual computation/fix is done in exiftool-vendored.
Also see
0f63a78090/lib/Image/ExifTool/Samsung.pm (L996-L1001)https://github.com/photostructure/exiftool-vendored.js/issues/209
---------
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
* refactor(mobile): DB repository for asset, backup, sync service
* review feedback
* fix bug found by Alex
---------
Co-authored-by: Alex <alex.tran1502@gmail.com>
* add packages
* create download task
* show progress
* save video and image
* show progress info
* live photo wip
* download and link live photos
* Update list of assets
* wip
* correct progress
* add state to download
* revert unncessary change
* repository pattern
* translation
* remove unused code
* update method call from repository
* remove unused variable
* handle multiple livephotos download
* remove logging statement
* lint
* not removing all records
* fix(web): modal sticky bottom scrolling
* chore: minor styling tweaks
* wip: add portal so modals show on Safari in detail panel
* feat: fixed position dropdown menu
* chore: refactoring and cleanup
* feat: zooming and virtual keyboard working for iPadOS/Safari
* Revert "feat: zooming and virtual keyboard working for iPadOS/Safari"
This reverts commit cac29bac0d.
* wip: minor code cleanup
* wip: recover from visual viewport changes
* wip: ease in a little more visualviewport magic
* wip: code cleanup
* fix: only show dropdown above when viewport is zoomed out
* fix: code review suggestions for code style
Co-authored-by: Daniel Dietzler <36593685+danieldietzler@users.noreply.github.com>
* fix: better variable naming
* chore: better documentation for the bottom breakpoint
---------
Co-authored-by: Daniel Dietzler <36593685+danieldietzler@users.noreply.github.com>
* added a section for the Traefik Proxy
* minimized the configs
* replaced config with a comment.
* Update docs/docs/administration/reverse-proxy.md
changed timeout values
Co-authored-by: dvbthien <89862334+dvbthien@users.noreply.github.com>
* changed timeouts back to 10 minutes
* fixed typo and set default writeTimeout 600s
Leaving it at 0 may be also bad practice
* removed whitespace
* run `npm run format -- --check -w`
---------
Co-authored-by: dvbthien <89862334+dvbthien@users.noreply.github.com>
* fix(web): local date time for buckets
* feat(web): improve UI/UX for setting pages
* search admin settings and icon
* clean up
* fix translation file
* Update web/src/routes/admin/system-settings/+page.svelte
Co-authored-by: Ben <45583362+ben-basten@users.noreply.github.com>
* Update web/src/lib/components/shared-components/settings/setting-accordion.svelte
Co-authored-by: Ben <45583362+ben-basten@users.noreply.github.com>
* better search bar on smaller screen
* lint
* template syntax
---------
Co-authored-by: Jason Rasmussen <jason@rasm.me>
Co-authored-by: Ben <45583362+ben-basten@users.noreply.github.com>
* fix: load original panorama if specified in user settings
* fixes after merge
* chore: cleanup
---------
Co-authored-by: Saschl <noreply@saschl.com>
Co-authored-by: Jason Rasmussen <jason@rasm.me>
* feat(web): move search options into a modal
* chore: revert adding focus ring
* minor styling
---------
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* Fixing example docker compose
Change needed so the following statement included in the docs a bit below makes sense:
NOTE: We have to use the `/mnt/media/christmas-trip` path and not the `/mnt/nas/christmas-trip` path since all paths have to be what the Docker containers see.
* another fix
* feat(web): load original panorama image when zoomed in to 75% or above
* add checks that original 360 image is web compatible and better error handling
* fix web compatability check typing
* fix asset type
* feat: metadata in UserPreference
* feat: web metadata settings
* feat: web metadata settings
* fix: typo
* patch openapi
* fix: missing translation key
* new organization of preference strucutre
* feature settings on web
* localization
* added and used feature settings
* add default value to response dto
* patch openapi
* format en.json file
* implement helper method
* use tags preference logic
* Fix logic bug and add tests
* fix preference can be null in detail panel
* feat: tags
* fix: folder tree icons
* navigate to tag from detail panel
* delete tag
* Tag position and add tag button
* Tag asset in detail panel
* refactor form
* feat: navigate to tag page from clicking on a tag
* feat: delete tags from the tag page
* refactor: moving tag section in detail panel and add + tag button
* feat: tag asset action in detail panel
* refactor add tag form
* fdisable add tag button when there is no selection
* feat: tag bulk endpoint
* feat: tag colors
* chore: clean up
* chore: unit tests
* feat: write tags to sidecar
* Remove tag and auto focus on tag creation form opened
* chore: regenerate migration
* chore: linting
* add color picker to tag edit form
* fix: force render tags timeline on navigating back from asset viewer
* feat: read tags from keywords
* chore: clean up
---------
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* Add proper colors to create album button
Allow creation of empty albums with names, or non-empty albums without names
* Add proper colors to create album button
Allow creation of empty albums with names, or non-empty albums without names
* Small changes
* Revert change
* Simplify logic
* lint
---------
Co-authored-by: Alex <alex.tran1502@gmail.com>
* add root resource path '/' to mobile oauth scheme
* chore: add oauth-callback path
* add root resource path '/' to mobile oauth scheme
* chore: add oauth-callback path
* fix: make sure there are three forward slash in callback URL
---------
Co-authored-by: Jason Rasmussen <jason@rasm.me>
Co-authored-by: Alex <alex.tran1502@gmail.com>
* curating assets with albums to upload
* sorting for background backup
* background upload works
* transform fields string array to javascript array
* send json array
* generate sql
* refactor upload callback
* remove albums info from upload payload
* mechanism to create album on album selection
* album creation
* Sync to upload album
* Remove unused service
* unify name changes
* Add mechanism to sync uploaded assets to albums
* Put add to album operation after updating the UI state
* clean up
* background album sync
* add to album in background context
* remove add to album in callback
* refactor
* refactor
* refactor
* fix: make sure all selected albums are selected for building upload candidate
* clean up
* add manual sync button
* lint
* revert server changes
* pr feedback
* revert time filtering
* const
* sync album on manual upload
* linting
* pr feedback and proper time filtering
* wording
* feat: loading screen, initSDK on bootstrap, fix FOUC for theme
* pulsate immich logo, don't set localstorage
* Make it spin
* Rework error handling a bit
* Cleanup
* fix test
* rename, memoize
---------
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* fix(web): align search filter behavior to show all camera models
* fix(mobile): align search filter behavior to clear camera model when make is set
* (mobile) correctly clear the model controller
* fix(mobile) re-add text controller to dropdown
---------
Co-authored-by: Alex <alex.tran1502@gmail.com>
* Fix null name
* Fix null name and Fix button
* Remove extension correctly
* Refactoring the code and formatting
* formatting
* Fix for the extension name
* Squashed
* Change strategy - now pre-measure buckets offscreen, so don't need to worry about sub-bucket scroll preservation
* Reduce jank on scroll, delay DOM updates until after scroll
* css opt, log measure time
* Trickle out queue while scrolling, flush when stopped
* yay
* Cleanup cleanup...
* everybody...
* everywhere...
* Clean up cleanup!
* Everybody do their share
* CLEANUP!
* package-lock ?
* dynamic measure, todo
* Fix web test
* type lint
* fix e2e
* e2e test
* Better scrollbar
* Tuning, and more tunables
* Tunable tweaks, more tunables
* Scrollbar dots and viewport events
* lint
* Tweaked tunnables, use requestIdleCallback for garbage tasks, bug fixes
* New tunables, and don't update url by default
* Bug fixes
* Bug fix, with debug
* Fix flickr, fix graybox bug, reduced debug
* Refactor/cleanup
* Fix
* naming
* Final cleanup
* review comment
* Forgot to update this after naming change
* scrubber works, with debug
* cleanup
* Rename scrollbar to scrubber
* rename to
* left over rename and change to previous album bar
* bugfix addassets, comments
* missing destroy(), cleanup
---------
Co-authored-by: Alex <alex.tran1502@gmail.com>
* feat: folder view poc
* fix(folder-view): ui modifications
* fix(folder-view): improves utility return types
* fix(folder-view): update getAssetsByOriginalPath
Endpoint now only returns direct children of the path instead of all images in all subfolders. Functions renamed and scoped to "folder", endpoints renamed
* fix(folder-view): improve typing
* fix(folder-view): replaces css with tailwind
* fix(folder-view): includes folders in main panel
* feat(folder-view): folder cache implementation
* fix(folder-view): can now search for absolute paths
* fix(folder-view): sets default sort to alphabetical by filename
* refactor/styling the browser view
* double click to navigate
* folder tree
* use correct side bar icon
* styling when selected
* correct open icon
* folder layout
* return assetReponseDto
* it's alive
* update new api
* more styling for folder tree
* use query params and path viewer
* use arrow up left for parent folder backward navigation
* use arrow up left for parent folder backward navigation
* encode URL
* handle long folder name
* refactor to the view controller
* remove unused code
* clear cache when logout
* cleaning up
* cleaning up web
* clean as new
* clean as new
* pr feedback + show asset name
* add tests
* add tests
* remove generated file
* lint
* revert docker-compose.dev file
* Update server/src/services/view.service.ts
Co-authored-by: Jason Rasmussen <jason@rasm.me>
* Update server/src/services/view.service.ts
Co-authored-by: Jason Rasmussen <jason@rasm.me>
---------
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
Co-authored-by: Jason Rasmussen <jason@rasm.me>
* refactor: stacks
* mobile: get it built
* chore: feedback
* fix: sync and duplicates
* mobile: remove old stack reference
* chore: add primary asset id
* revert change to asset entity
* mobile: refactor mobile api
* mobile: sync stack info after creating stack
* mobile: update timeline after deleting stack
* server: update asset updatedAt when stack is deleted
* mobile: simplify action
* mobile: rename to match dto property
* fix: web test
---------
Co-authored-by: Alex <alex.tran1502@gmail.com>
* cropping, panel
* fix presets
* types
* prettier
* fix lint
* fix aspect ratio, performance optimization
* improved tool selection, removed placeholder
* fix the mouse's exit from canvas
* fix error
* the "save" button and change tracking
* lint, format
* the mini functionality of the save button
* fix aspect ratio
* hide editor button on mobiles
* strict equality
Co-authored-by: Michel Heusschen <59014050+michelheusschen@users.noreply.github.com>
* Use the dollar sign syntax for stores inside components
* unobtrusive grid lines, circles at the corners
* more correct image load, handleError
* more strict equality
* fix styles. unused and tailwind
Co-Authored-By: Michel Heusschen <59014050+michelheusschen@users.noreply.github.com>
* dont store isShowEditor
* if showEditor - hide navbar & shortcuts
* crop-canvas decomposition (danger)
I could have accidentally broken something.. but I checked the work and it seems ok.
* fix lint
* fix ts
* callback function as props
* correctly disabling shortcuts
* convenient canvas borders
• you can use the mouse to go beyond the boundaries and freely change the crop.
• the circles on the corners of the canvas are not cut off.
* -the editor button for video files, -save button
* hide editor btn if panoramic || gif || live
* corners instead of circles (preview), fix lint&format
* confirm close editor without save
* vertical aspect ratios
* recovery after merge. editor's closing shortcut
* fix format
* move from canvas to html elements
* fix changes detections
* rotation
* hide detail panel if showing editor
* fix aspect ratios near min size
* fix crop area when changing image size when rotate
* fix of fix
* better layout - grouping
https://github.com/user-attachments/assets/48f15172-9666-4588-acb6-3cb5eda873a8
* hide the button
* fix i18n, format
* hide button
* hide button v2
---------
Co-authored-by: Michel Heusschen <59014050+michelheusschen@users.noreply.github.com>
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* feat: add privacy step in the onboarding
* fix: remove console.log
* feat:Details the implications of enabling the map on the settings page
Added a link to the guide on customizing map styles as well
* feat: add map implication
* refactor: onboarding style
* fix: tile provider
* fix: remove long explanations
* chore: cleanup
---------
Co-authored-by: pcouy <contact@pierre-couy.dev>
Co-authored-by: Jason Rasmussen <jason@rasm.me>
* docs:Reword "Custom Map Style" guide
- Split setting a style.json in Immich and creating a style with
Maptiler
- Make it clearer that this is the way to change tile provider
---------
Co-authored-by: Jason Rasmussen <jason@rasm.me>
* Add Exif-Rating
* Integrate star rating as own component
* Add e2e tests for rating and validation
* Rename component and async handleChangeRating
* Display rating can be enabled in app settings
* Correct i18n reference
Co-authored-by: Michel Heusschen <59014050+michelheusschen@users.noreply.github.com>
* Star rating: change from slider to buttons
* Star rating for clarity
* Design updates.
* Renaming and code optimization
* chore: clean up
* chore: e2e formatting
* light mode border and default value
---------
Co-authored-by: Christoph Suter <christoph@suter-burri.ch>
Co-authored-by: Michel Heusschen <59014050+michelheusschen@users.noreply.github.com>
Co-authored-by: Mert <101130780+mertalev@users.noreply.github.com>
Co-authored-by: Jason Rasmussen <jrasm91@gmail.com>
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* feat: keep screen active on backup
* show dialog
* improve dialog and use shared timer
* get rid of confirmation dialog
* fix timer logic
* fix: set timeout to 60 seconds
* fix: revert unwanted change
* fix: properly hide status bar
* remove unwanted change
* fix: properly restore status bar when waking up
* clean up
---------
Co-authored-by: Alex <alex.tran1502@gmail.com>
* date time component
* rename to info_sheet
* simplify map info
* Edit datetime sheet
* fix janking when scroll on info sheet
* Location refactor
* refactor name
* Update date time after editing
* localize rebuild to smaller component
* restore advanced bottom sheet
* reassign EXIF back to local database
* remove print statements
* feat(web): Add stacking option to deduplication utilities
* Update web/src/lib/components/utilities-page/duplicates/duplicates-compare-control.svelte
Co-authored-by: Alex <alex.tran1502@gmail.com>
* Fix prettier
* Draft for server side modifications. Endpoint for stacks (PUT,DELETE)
* Fix error
* Disable stakc button if less or more than one asset selected
* Remove unnecesarry log
* Revert to first commit
* Further Revert
* Actually Revert to Origin
* Only one stack button
* Update +page.svelte
* Fix optional arguments
* Fix Prettier
* Fix Linting
* Add stack information to asset view
* clean up
---------
Co-authored-by: Alex <alex.tran1502@gmail.com>
* chore(server): remover get person asset limit
* sql
* remove getPersonAsset endpoint
* remove getPersonAsset endpoint
* use search endpoint to get people
* fix: server test
* mobile linter
* fix: server test
* remove debuglog
* deprecated endpoint
* change page size on mobile
* revert max size
* fix test
* feat(mobile): add support for material themes
Added support for custom theming and updated all elements accordingly.
* fix(mobile): Restored immich brand colors to default theme
* fix(mobile): make ListTile titles bold in settings main page
* feat(mobile): update bottom nav and appbar colors
* small tweaks
---------
Co-authored-by: Alex <alex.tran1502@gmail.com>
* Allow submission of null country
* Update searchAssetBuilder to handle nulls
andWhere({country:null}) produces `"exifInfo"."country" = NULL`. We want
`"exifInfo"."country" IS NULL`, so we have to treat NULL as a special
case
* Allow null country in frontend
* Make the query code a bit more straightforward
* Remove unused brackets import
* Remove log message
* Don't change whitespace for no reason
* Fix prettier style issue
* Update search.dto.ts validators per @jrasm91's recommendation
* Update api types
* Combine null country and state into one guard clause
* chore: clean up
* chore: add e2e for null/empty city, state, country search
* refactor: server returns suggestion for null values
* chore: clean up
---------
Co-authored-by: Jason Rasmussen <jrasm91@gmail.com>
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
Co-authored-by: Jason Rasmussen <jason@rasm.me>
* update export code
* add uuid glob, sort model names
* add new models to ml, sort names
* add new models to server, sort by dims and name
* typo in name
* update export dependencies
* onnx save function
* format
* fix(mobile): refactor splash screen to not require online connection
* chore: bump flutter sdk path for vscode
* refactor: authentication provider always try network calls and only fail if 401 or no local user
* lint
* fix: revert change to lookup serverendpoint from store the isar store implementation is very broken
* fix: clear serverUrl and serverEndpoint on logout, and await logout call
* refactor: remove unneeded extra conditions in splash screen useEffect
* revert change to remove serverEndpoint on logging out
* pr feedback
---------
Co-authored-by: Zack Pollard <zackpollard@ymail.com>
* attempt to use fqdn for og:image
opengraph image specifies that the url contains http or https, thus
implying a fqdn.
this change uses the external domain from the server config to attempt
to make the og:image have both the existing path to the thumbnail along
with the desired domain
if the server setting is empty, the old behavior will persist
please note, some og implementations do work with relative paths, so not
all og image checkers may still pass, but not all implementations have
this fallback and thus will not find the image otherwise
* tests and ssr for og:image value as fqdn
* formatting
* fix test
* formatting
* formatting
* fix tests
getConfig was requiring authentication. using already initiated global stores instead
* load config in shared link service itself
* join host and pathname/params safely
* use origin instead of host for full domain string
also fixes lint and address the imageURL type which is optional
* chore: clean up
---------
Co-authored-by: eleith <eleith@lemon.localdomain>
Co-authored-by: eleith <online-github@eleith.com>
Co-authored-by: Jason Rasmussen <jason@rasm.me>
* Added Crop Feature
* Using LayoutBuilder Fix
* Using Immich Colors
* Using Immich Text Theme
* Chnaging dynamic datatype to nullable
* Fix for the retrivel of the image from the cropscreen
* Using Hooks State
* Small edits
* Finals edits
* Saving to the mobile
* Commented final code
* Commented final code
* Comments and AutoRoute
* Fix AutoRoute Final
* Naming tools and Action when made no edits
* Updating timeline after edit
* chore: lint
* format
* Light Mode Compatible
* fix duplicate page name
* Fix Routing
* Hiding the Button
* lint
* remove unused code
---------
Co-authored-by: Alex <alex.tran1502@gmail.com>
* duplicate page assign other shortcut keys, add 'open image' shortcut
* add shortcut info page to duplicates with own list of keys
* edit translations, add translationkeys
* format fix
* remove typo
---------
Co-authored-by: Zack Pollard <zackpollard@ymail.com>
Co-authored-by: Alex <alex.tran1502@gmail.com>
* feat(web): search bar keyboard accessibility
* fix: adjust aria attributes
* fix: safari announcing the correct option count
* minor adjustments
- CircleIconButton disabled cursor
- more generic selection handler
* fix: more subtle border color in dark mode
---------
Co-authored-by: Alex <alex.tran1502@gmail.com>
With this commit I wanted to complete the react-mail
structure by properly define the templates styles by
including tailwind css framework.
The framework is extended by both react-mail and
tailwindcss-preset-email. Those packages help the rendering
for various email clients.
If in future there is the necessity to target specific mail
clients the package `tailwindcss-email-variants` and
`tailwindcss-mso` can help too. The latter has some
workarounds for the Ms Outlook that is still lacking
a lot of the CSS3 funcitonality.
to target
Signed-off-by: hitech95 <nicveronese@gmail.com>
* fix(web): alt text translation for non-English languages
* fix: refactor to use full translation key names
* fix: calling the translation function directly
* feat(server): allow server license to activate a user
* feat(web): send server+client licenses to user activation when non-admin
* chore(server): update test to allow server license to activate user
* fix(web): correctly load user to determine where to save license
* feat: people infinite scroll
* add infinite scroll to show & hide modal
* update unit tests
* show total people count instead of currently loaded
* update personsearchdto
* Rename the Menu Entry "admin.map_settings" to "admin.map_gps_settings"
Explanation:
The main menu item is called Map & GPS-Settings. The sub-item below it is also called.
It would be correct:
Main item:
Map & GPS-Settings
Sub-item 1:
Map settings
* Update en.json
* chore: formatting
---------
Co-authored-by: Jason Rasmussen <jrasm91@gmail.com>
* feat(cli): use a queue for duplicate and upload
Using a queue to process the files makes the file duplicate detection and asset upload more stable and tolerant of network errors. If an error occurs, the whole command will not stop; the task will be retried (3 times) before logging the error and moving to the next step.
The new queue abstraction is using [fastq](https://www.npmjs.com/package/fastq) internally.
* chore(cli): queue.push return promise which resolve with task
* test(cli): add spec for uploadFiles and checkForDuplicates
* chore(web): translate image alt text
* fix: capitalize translations, improve unit test
* fix: unit testing against the actual en.json file
* fix: use derived store to generate alt text
* turn it off and back on
* handle missing smart search embedding column
* handle missing face embedding column
* simplify
* Revert "simplify"
This reverts commit 8322af0baf.
* fix migration
* remove black bezels + better integrate activity status
* remove justify-self-end + mr-4 → mr-3 (closer to desired spacing)
* clean up
* clean up some more
---------
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* fix(server): live photo relation
* handle deletion and unit test
* lint
* chore: clean up and e2e tests
* fix test
* sql
---------
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* chore: add node version pinning with .nvmrc and volta for the typescript sdk
* ci: add missing setup-node actions and use .nvmrc for setup-node node-version
* chore: use full semver docker tag for node images
* Update server/Dockerfile
Co-authored-by: bo0tzz <git@bo0tzz.me>
---------
Co-authored-by: bo0tzz <git@bo0tzz.me>
Modify the handling of patterns in the `crawl` function to correctly
convert the current path to a pattern when it contains backslash on
Windows, in according to fast-glob's docs.
- ability to add custom hover colors
- migrate activity menu to ButtonContextMenu component
- onClick callbacks rather than events for menu options
- remove slots
- configurable menu option colors
- improve menu option layout
* feat(web,a11y): context menu keyboard navigation
* wip: all context menus visible
* wip: more migrations to the ButtonContextMenu, usability improvements
* wip: migrate Administration, PeopleCard
* wip: refocus the button on click, docs
* fix: more intuitive RightClickContextMenu
- configurable title
- focus management: tab keys, clicks, closing the menu
- automatically closing when an option is selected
* fix: refining the little details
- adjust the aria attributes
- intuitive escape key propagation
- extract context into its own file
* fix: dropdown options not clickable in a <Portal>
* wip: small fixes
- export selectedColor to prevent unexpected styling
- better context function naming
* chore: revert changes to list navigation, to reduce scope of the PR
* fix: remove topBorder prop
* feat: automatically select the first option on enter or space keypress
* fix: use Svelte store instead to handle selecting menu options
- better prop naming for ButtonContextMenu
* feat: hovering the mouse can change the active element
* fix: remove Portal, more predictable open/close behavior
* feat: make selected item visible using a scroll
- also: minor cleanup of the context-menu-navigation Svelte action
* feat: maintain context menu position on resize
* fix: use the whole padding class as better tailwind convention
* fix: options not announcing with screen reader for ButtonContextMenu
* fix: screen reader announcing right click context menu options
* fix: handle focus out scenario
---------
Co-authored-by: Alex <alex.tran1502@gmail.com>
* fix(mobile): upgrade maplibre_gl package to fix issue with crash in ios7.4 above simulator
* chore: switch from deprecated widget and controller name to new name in latest sdk
* remove todo
---------
Co-authored-by: Alex <alex.tran1502@gmail.com>
You can find the main documentation, including installation guides, at https://immich.app/.
## Demo
## Demo
You can access the web demo at https://demo.immich.app
Access the demo [here](https://demo.immich.app). The demo is running on a Free-tier Oracle VM in Amsterdam with a 2.4Ghz quad-core ARM64 CPU and 24GB RAM.
For the mobile app, you can use `https://demo.immich.app/api` for the `Server Endpoint URL`
For the mobile app, you can use `https://demo.immich.app/api` for the `Server Endpoint URL`
title: Licensing announcement - Purchase a license to support Immich
authors: [alextran]
tags: [update, announcement, FUTO]
date: 2024-07-18T00:00
---
Hello everybody,
Firstly, on behalf of the Immich team, I'd like to thank everybody for your continuous support of Immich since the very first day! Your contributions, encouragement, and community engagement have helped bring Immich to its current state. The team and I are forever grateful for that.
Since our [last announcement of the core team joining FUTO to work on Immich full-time](https://immich.app/blog/2024/immich-core-team-goes-fulltime), one of the goals of our new position is to foster a healthy relationship between the developers and the users. We believe that this enables us to create great software, establish transparent policies and build trust.
We want to build a great software application that brings value to you and your loved ones' lives. We are not using you as a product, i.e., selling or tracking your data. We are not putting annoying ads into our software. We respect your privacy. We want to be compensated for the hard work we put in to build Immich for you.
With those notes, we have enabled a way for you to financially support the continued development of Immich, ensuring the software can move forward and will be maintained, by offering a lifetime license of the software. We think if you like and use software, you should pay for it, but _we're never going to force anyone to pay or try to limit Immich for those who don't._
There are two types of license that you can choose to purchase: **Server License** and **Individual License**.
### Server License
This is a lifetime license costing **$99.99**. The license is applied to the whole server. You and all users that use your server are licensed.
### Individual License
This is a lifetime license costing **$24.99**. The license is applied to a single user, and can be used on any server they choose to connect to.
Thank you again for your support, this will help create a strong foundation and stability for the Immich team to continue developing and maintaining the project that you love to use.
Hello everybody! Alex from Immich here and I am back with another development progress update for the project.
Summer has returned once again, and the night sky is filled with stars, thank you for **38_000 shining stars** you have sent to our [GitHub repo](https://github.com/immich-app/immich)! Since the last announcement several core contributors have started full time. Everything is going great with development, PRs get merged with _brrrrrrr_ rate, conversation exchange between team members is on a new high, we met and are working with the great engineers at FUTO. The spirit is high and we have a lot of things brewing that we think you will like.
Let's go over some of the updates we had since the last post.
### Container consolidation
Reduced the number of total containers from 5 to 4 by making the microservices thread get spawned directly in the server container. Woohoo, remember when Immich had 7 containers?
With more machine learning and CLIP magic, we now have similarity deduplication built into the application where it will search for closely similar images and let you decide what to do with them; i.e keep or trash.
The detail view for an asset now has a permanent URL so you can easily share them with your loved ones.
### Web app translations
We now have a public Weblate project which the community can use to translate the webapp to their native languages. We are planning to port the mobile app translation to this platform as well. If you would like to contribute, you can take a look [here](https://hosted.weblate.org/projects/immich/immich/). We're already close to 50% translations -- we really appreciate everyone contributing to that!
Immich now tries to find a descriptive video thumbnail instead of simply using the first frame. No more black images for thumbnails!
### Public Roadmap
We now have a [public roadmap](https://immich.app/roadmap), giving you a high-level overview of things the team is working on. The first goal of this roadmap is to bring Immich to a stable release, which is expected sometime later this year. Some of the highlights include
- Auto stacking - Auto stacking of burst photos
- Basic editor - Basic photo editing capabilities
- Workflows - Automate tasks with workflows
- Fine grained access controls - Granular access controls for users and api keys
- Better background backups - Rework background backups to be more reliable
- Private/locked photos - Private assets with extra protections
Beyond the items in the roadmap, we have _many many_ more ideas for Immich. The team and I hope that you are enjoying the application, find it helpful in your life and we have nothing but the intention of building out great software for you all!
Have an amazing Summer or Winter for those in the southern hemisphere! :D
@@ -52,14 +52,26 @@ On iOS (iPhone and iPad), the operating system determines if a particular app ca
- 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.
- 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.
- Use the Immich app more often.
### Why are features not working with a self-signed cert or mTLS?
Due to limitations in the upstream app/video library, using a self-signed TLS certificate or mutual TLS may break video playback or asset upload (both foreground and/or background).
We recommend using a real SSL certificate from a free provider, for example [Let's Encrypt](https://letsencrypt.org/).
---
---
## Assets
## Assets
### Does Immich change the file?
### Does Immich change the file?
No, Immich does not touch the original file under any circumstances,
No, Immich does not modify the original files.
all edited metadata are saved in the companion sidecar file and the database.
All edited metadata is saved in companion `.xmp` sidecar files and the database.
However, Immich will delete original files that have been trashed when the trash is emptied in the Immich UI.
### Why do my file names appear as a random string in the file manager?
When Storage Template is off (default) Immich saves the file names in a random string (also known as random UUIDs) to prevent duplicate file names.
To retrieve the original file names, you must enable the Storage Template and then run the STORAGE TEMPLATE MIGRATION job.
It is recommended to read about [Storage Template](https://immich.app/docs/administration/storage-template) before activation.
### Can I add my existing photo library?
### Can I add my existing photo library?
@@ -71,11 +83,20 @@ Template changes will only apply to _new_ assets. To retroactively apply the tem
### Why are only photos and not videos being uploaded to Immich?
### 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 in front of Immich.
Make sure to [set your reverse proxy](/docs/administration/reverse-proxy/) to allow large requests.
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.
If you are using Cloudflare Tunnel, please know that they set a maxiumum filesize of 100 MB that cannot be changed.
At times, files larger than this may work, potentially up to 1 GB. However, the official limit is 100 MB.
If you are having issues, we recommend switching to a different network deployment.
### Why are some photos stored in the file system with the wrong date?
### 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 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.
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?
### How can I hide photos from the timeline?
@@ -105,7 +126,8 @@ Also, there are additional jobs for person (face) thumbnails.
### Why do files from WhatsApp not appear with the correct date?
### 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).
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 #9116](https://github.com/immich-app/immich/discussions/9116).
### What happens if an asset exists in more than one account?
### What happens if an asset exists in more than one account?
@@ -157,17 +179,30 @@ We haven't implemented an official mechanism for creating albums from external l
Duplicate checking only exists for upload libraries, using the file hash. Furthermore, duplicate checking is not global, but _per library_. Therefore, a situation where the same file appears twice in the timeline is possible, especially for external libraries.
Duplicate checking only exists for upload libraries, using the file hash. Furthermore, duplicate checking is not global, but _per library_. Therefore, a situation where the same file appears twice in the timeline is possible, especially for external libraries.
### Why are my edits to files not being saved in read-only external libraries?
Images in read-write external libraries (the default) can be edited as normal.
In read-only libraries (`:ro` in the `docker-compose.yml`), Immich is unable to create the `.xmp` sidecar files to store edited file metadata.
For this reason, the metadata (timestamp, location, description, star rating, etc.) cannot be edited for files in read-only external libraries.
### How are deletions of files handled in external libraries?
Immich will attempt to delete original files that have been trashed when the trash is emptied.
In read-write external libraries (the default), Immich will delete the original file.
In read-only libraries (`:ro` in the `docker-compose.yml`), files can still be trashed in the UI.
However, when the trash is emptied, the files will re-appear in the main timeline since Immich is unable to delete the original file.
---
---
## Machine Learning
## Machine Learning
### How does smart search work?
### 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. An ML model converts each image to an "embedding", which is essentially a string of numbers that semantically encodes what is in the image. The same is done for the text that you enter when you do a search, and that text embedding is then compared with those of the images to find similar ones. As such, there are no "tags", "labels", or "descriptions" generated that you can look at. For more information about CLIP and its capabilities, read about it [here](https://openai.com/research/clip).
### How does facial recognition work?
### How does facial recognition work?
For face detection and recognition, Immich uses [InsightFace models](https://github.com/deepinsight/insightface/tree/master/model_zoo).
See [How Facial Recognition Works](/docs/features/facial-recognition#How-Facial-Recognition-Works) for details.
### How can I disable machine learning?
### How can I disable machine learning?
@@ -181,19 +216,15 @@ 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?
### I'm getting errors about models being corrupt or failing to download. What do I do?
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.
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 [Hugging Face][huggingface] and place them in the cache folder.
### Can I use a custom CLIP model?
### Can I use a custom CLIP model?
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.
No, this is not supported. Only models listed in the [Hugging Face][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?
### 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.
You can change to a multilingual CLIP model. See [here](/docs/features/smart-search#CLIP-model) for instructions.
:::note
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?
@@ -234,7 +265,7 @@ ls clip/ facial-recognition/
### Why is Immich slow on low-memory systems like the Raspberry Pi?
### Why is Immich slow on low-memory systems like the Raspberry Pi?
Immich optionally uses machine learning for several features. However, it can be too heavy to run on a Raspberry Pi. You can [mitigate](/docs/FAQ#can-i-lower-cpu-and-ram-usage) this or host Immich's machine-learning container on a [more powerful system](/docs/guides/remote-machine-learning), or [disable](/docs/FAQ#how-can-i-disable-machine-learning) machine learning entirely.
Immich optionally uses transcoding and machine learning for several features. However, it can be too heavy to run on a Raspberry Pi. You can [mitigate](/docs/FAQ#can-i-lower-cpu-and-ram-usage) this or host Immich's machine-learning container on a [more powerful system](/docs/guides/remote-machine-learning), or [disable](/docs/FAQ#how-can-i-disable-machine-learning) machine learning entirely.
### Can I lower CPU and RAM usage?
### Can I lower CPU and RAM usage?
@@ -243,10 +274,12 @@ The initial backup is the most intensive due to the number of jobs running. The
- Lower the job concurrency for these jobs to 1.
- 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 > 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.
- 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.
- For facial recognition on new images to work properly, You must re-run the Face Detection job for all images after this.
- For facial recognition on new images to work properly, You must re-run the Face Detection job for all images after this.
- At the container level, you can [set resource constraints](/docs/FAQ#can-i-limit-cpu-and-ram-usage) to lower usage further.
- It's recommended to only apply these constraints _after_ taking some of the measures here for best performance.
- If these changes are not enough, see [below](/docs/FAQ#how-can-i-disable-machine-learning) for instructions on how to disable machine learning.
- 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?
### Can I limit 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. To limit this, you can add the following to the `docker-compose.yml` block of any containers that you want to have limited resources.
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.
@@ -266,6 +299,8 @@ deploy:
</details>
</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).
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).
Note that memory constraints work by terminating the container, so this can introduce instability if set too low.
### How can I boost machine learning speed?
### How can I boost machine learning speed?
:::note
:::note
@@ -275,21 +310,16 @@ This advice improves throughput, not latency. This is to say that it will make S
You can increase throughput by increasing the job concurrency for machine learning jobs (Smart Search, Face Detection). With higher concurrency, the host will work on more assets in parallel. You can do this by navigating to Administration > Settings > Job Settings and increasing concurrency as needed.
You can increase throughput by increasing the job concurrency for machine learning jobs (Smart Search, Face Detection). With higher concurrency, the host will work on more assets in parallel. You can do this by navigating to Administration > Settings > Job Settings and increasing concurrency as needed.
:::danger
:::danger
On a normal machine, 2 or 3 concurrent jobs can probably max the CPU. Beyond this, note that storage speed and latency may quickly become the limiting factor; particularly when using HDDs.
On a normal machine, 2 or 3 concurrent jobs can probably max the CPU. Storage speed and latency can quickly become the limiting factor beyond this, particularly when using HDDs.
Do not exaggerate with the amount of jobs because you're probably thoroughly overloading the server.
The concurrency can be increased more comfortably with a GPU, but should still not be above 16 in most cases.
More details can be found [here](https://discord.com/channels/979116623879368755/994044917355663450/1174711719994605708)
Do not exaggerate with the job concurrency because you're probably thoroughly overloading the server.
:::
:::
### Why is Immich using so much of my CPU?
### My server shows Server Status Offline | Version Unknown. What can I do?
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.
You need to [enable WebSockets](/docs/administration/reverse-proxy/) on your reverse proxy.
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.
---
---
@@ -299,6 +329,12 @@ You need to enable Websocket on your reverse proxy.
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).
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 reduce the log verbosity of Redis?
To decrease Redis logs, you can add the following line to the `redis:` section of the `docker-compose.yml`:
` command: redis-server --loglevel warning`
### How can I run Immich as a non-root user?
### 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 can change the user in the container by setting the `user` argument in `docker-compose.yml` for each service.
@@ -308,9 +344,13 @@ You may need to add mount points or docker volumes for the following internal co
- `immich-machine-learning:/.cache`
- `immich-machine-learning:/.cache`
- `redis:/data`
- `redis:/data`
The non-root user/group needs read/write access to the volume mounts, including `UPLOAD_LOCATION`.
The non-root user/group needs read/write access to the volume mounts, including `UPLOAD_LOCATION` and `/cache` for machine-learning.
For a further hardened system, you can add the following block to every container except for `immich_postgres`.
:::note Docker Compose Volumes
The Docker Compose top level volume element does not support non-root access, all of the above volumes must be local volume mounts.
:::
For a further hardened system, you can add the following block to every container.
<details>
<details>
<summary>docker-compose.yml</summary>
<summary>docker-compose.yml</summary>
@@ -359,22 +399,21 @@ If the error says the worker is exiting, then this is normal. This is a feature
There are a few reasons why this can happen.
There are a few reasons why this can happen.
If the error mentions SIGKILL or error code 137, it most likely means the service is running out of memory. Consider either increasing the server's RAM or moving the service to a server with more RAM.
If the error mentions SIGKILL or error code 137, it most likely means the service is running out of memory.
Consider either increasing the server's RAM or moving the service to a server with more RAM.
If it mentions SIGILL (note the lack of a K) or error code 132, it most likely means your server's CPU is incompatible. This is unlikely to occur on version 1.92.0 or later. Consider upgrading if your version of Immich is below that.
If it mentions SIGILL (note the lack of a K) or error code 132, it most likely means your server's CPU is incompatible with Immich.
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.
## Database
## Database
### Why am I getting database ownership errors?
### 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.
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.
NTFS and ex/FAT/32 filesystems are not supported. See [here](/docs/install/requirements#special-requirements-for-windows-users) for more details.
### How can I verify the integrity of my database?
### 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.
Database checksums are enabled by default for new installations since v1.104.0. You can check if they are enabled by running the following command.
A result of `on` means that checksums are enabled.
A result of `on` means that checksums are enabled.
@@ -15,12 +15,23 @@ 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.
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. When restoring, you need to delete the `DB_DATA_LOCATION` folder (if it exists) to reset the database.
:::caution
:::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.
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.
:::
:::
### Automatic Database Backups
Immich will automatically create database backups by default. The backups are stored in `UPLOAD_LOCATION/backups`.
You can adjust the schedule and amount of kept backups in the [admin settings](http://my.immich.app/admin/system-settings?isOpen=backup).
By default, Immich will keep the last 14 backups and create a new backup every day at 2:00 AM.
#### Restoring
We hope to make restoring simpler in future versions, for now you can find the backups in the `UPLOAD_LOCATION/backups` folder on your host.
Then please follow the steps in the following section for restoring the database.
docker compose down -v # CAUTION! Deletes all Immich data to start from scratch.
docker compose down -v # CAUTION! Deletes all Immich data to start from scratch
# Remove-Item -Recurse -Force DB_DATA_LOCATION # CAUTION! Deletes all Immich data to start from scratch.
## Uncomment the next line and replace DB_DATA_LOCATION with your Postgres path to permanently reset the Postgres database
docker compose pull # Update to latest version of Immich (if desired)
# Remove-Item -Recurse -Force DB_DATA_LOCATION # CAUTION! Deletes all Immich data to start from scratch
docker compose create # Create Docker containers for Immich apps without running them.
## You should mount the backup (as a volume, example: - 'C:\path\to\backup\dump.sql':/dump.sql) into the immich_postgres container using the docker-compose.yml
docker compose pull # Update to latest version of Immich (if desired)
docker compose create # Create Docker containers for Immich apps without running them
docker start immich_postgres # Start Postgres server
docker start immich_postgres # Start Postgres server
docker compose up -d # Start remainder of Immich apps
```
```
</TabItem>
</TabItem>
</Tabs>
</Tabs>
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.).
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.), in which case you need to delete the `DB_DATA_LOCATION` folder to reset the database.
:::tip
:::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.
Some deployment methods make it difficult to start the database without also starting the server. In these cases, you may set the environment variable `DB_SKIP_MIGRATIONS=true` before starting the services. This will prevent the server from running migrations that interfere with the restore process. 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
services:
...
backup:
container_name: immich_db_dumper
image: prodrigestivill/postgres-backup-local:14
env_file:
- .env
environment:
POSTGRES_HOST: database
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
depends_on:
- database
```
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.
@@ -148,9 +129,21 @@ for more info read the [release notes](https://github.com/immich-app/immich/rele
- Preview images (small thumbnails and large previews) for each asset and thumbnails for recognized faces.
- Preview images (small thumbnails and large previews) for each asset and thumbnails for recognized faces.
- Stored in `UPLOAD_LOCATION/thumbs/<userID>`.
- Stored in `UPLOAD_LOCATION/thumbs/<userID>`.
- **Encoded Assets:**
- **Encoded Assets:**
- Videos that have been re-encoded from the original for wider compatibility. The original is not removed.
- Videos that have been re-encoded from the original for wider compatibility. The original is not removed.
- Stored in `UPLOAD_LOCATION/encoded-video/<userID>`.
- Stored in `UPLOAD_LOCATION/encoded-video/<userID>`.
- **Postgres**
- The Immich database containing all the information to allow the system to function properly.
**Note:** This folder will only appear to users who have made the changes mentioned in [v1.102.0](https://github.com/immich-app/immich/discussions/8930) (an optional, non-mandatory change) or who started with this version.
- Stored in `DB_DATA_LOCATION`.
:::danger
A backup of this folder does not constitute a backup of your database!
Follow the instructions listed [here](/docs/administration/backup-and-restore#database) to learn how to perform a proper backup.
@@ -178,7 +171,7 @@ When you turn off the storage template engine, it will leave the assets in `UPLO
- Stored in `UPLOAD_LOCATION/profile/<userID>`.
- Stored in `UPLOAD_LOCATION/profile/<userID>`.
- **Thumbs Images:**
- **Thumbs Images:**
- Preview images (blurred, small, large) for each asset and thumbnails for recognized faces.
- Preview images (blurred, small, large) for each asset and thumbnails for recognized faces.
- Stored in `UPLOCAD_LOCATION/thumbs/<userID>`.
- Stored in `UPLOAD_LOCATION/thumbs/<userID>`.
- **Encoded Assets:**
- **Encoded Assets:**
- Videos that have been re-encoded from the original for wider compatibility. The original is not removed.
- Videos that have been re-encoded from the original for wider compatibility. The original is not removed.
- Stored in `UPLOAD_LOCATION/encoded-video/<userID>`.
- Stored in `UPLOAD_LOCATION/encoded-video/<userID>`.
@@ -186,11 +179,22 @@ When you turn off the storage template engine, it will leave the assets in `UPLO
- Files uploaded through mobile apps.
- Files uploaded through mobile apps.
- Temporarily located in `UPLOAD_LOCATION/upload/<userID>`.
- Temporarily located in `UPLOAD_LOCATION/upload/<userID>`.
- Transferred to `UPLOAD_LOCATION/library/<userID>` upon successful upload.
- Transferred to `UPLOAD_LOCATION/library/<userID>` upon successful upload.
- **Postgres**
- The Immich database containing all the information to allow the system to function properly.
**Note:** This folder will only appear to users who have made the changes mentioned in [v1.102.0](https://github.com/immich-app/immich/discussions/8930) (an optional, non-mandatory change) or who started with this version.
- Stored in `DB_DATA_LOCATION`.
:::danger
A backup of this folder does not constitute a backup of your database!
Follow the instructions listed [here](/docs/administration/backup-and-restore#database) to learn how to perform a proper backup.
:::
</TabItem>
</TabItem>
</Tabs>
</Tabs>
:::danger
:::danger
Do not touch the files inside these folders under any circumstances except taking a backup, changing or removing an asset can cause untracked and missing files.
Do not touch the files inside these folders under any circumstances except taking a backup. Changing or removing an asset can cause untracked and missing files.
You can think of it as App-Which-Must-Not-Be-Named, the only access to viewing, changing and deleting assets is only through the mobile or browser interface.
You can think of it as App-Which-Must-Not-Be-Named, the only access to viewing, changing and deleting assets is only through the mobile or browser interface.
Users can manage their email notification settings from their account settings page on the web. They can choose to turn email notifications on or off for the following events:
Users can manage their email notification settings from their account settings page on the web. They can choose to turn email notifications on or off for the following events:
@@ -22,7 +22,7 @@ Copy the entire `immich-server` block as a new service and make the following ch
- container_name: immich_server
- container_name: immich_server
...
...
- ports:
- ports:
- - 2283:3001
- - 2283:2283
+ immich-microservices:
+ immich-microservices:
+ container_name: immich_microservices
+ container_name: immich_microservices
```
```
@@ -52,4 +52,4 @@ Additionally, some jobs run on a schedule, which is every night at midnight. Thi
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.
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.
This page contains details about using OAuth in Immich.
:::tip
:::tip
Unable to set `app.immich:/` as a valid redirect URI? See [Mobile Redirect URI](#mobile-redirect-uri) for an alternative solution.
Unable to set `app.immich:///oauth-callback` as a valid redirect URI? See [Mobile Redirect URI](#mobile-redirect-uri) for an alternative solution.
:::
:::
## Overview
## Overview
@@ -11,7 +11,7 @@ Unable to set `app.immich:/` as a valid redirect URI? See [Mobile Redirect URI](
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:
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:
@@ -30,7 +30,7 @@ Before enabling OAuth in Immich, a new client application needs to be configured
The **Sign-in redirect URIs** should include:
The **Sign-in redirect URIs** should include:
-`app.immich:/` - for logging in with OAuth from the [Mobile App](/docs/features/mobile-app.mdx)
-`app.immich:///oauth-callback` - 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/auth/login` - for logging in with OAuth from the Web Client
-`http://DOMAIN:PORT/user-settings` - for manually linking OAuth in the Web Client
-`http://DOMAIN:PORT/user-settings` - for manually linking OAuth in the Web Client
@@ -38,7 +38,7 @@ Before enabling OAuth in Immich, a new client application needs to be configured
Mobile
Mobile
-`app.immich:/` (You **MUST** include this for iOS and Android mobile apps to work properly)
-`app.immich:///oauth-callback` (You **MUST** include this for iOS and Android mobile apps to work properly)
Localhost
Localhost
@@ -96,16 +96,16 @@ When Auto Launch is enabled, the login page will automatically redirect the user
## Mobile Redirect URI
## 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:
The redirect URI for the mobile app is `app.immich:///oauth-callback`, 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:/`
1. Configure an http(s) endpoint to forwards requests to `app.immich:///oauth-callback`
2. Whitelist the new endpoint as a valid redirect URI with your provider.
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.
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.
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
:::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.
Immich has a route (`/api/oauth/mobile-redirect`) that is already configured to forward requests to `app.immich:///oauth-callback`, and can be used for step 1.
@@ -13,9 +13,9 @@ Running with a pre-existing Postgres server can unlock powerful administrative f
You must install pgvecto.rs into your instance of Postgres using their [instructions][vectors-install]. After installation, add `shared_preload_libraries = 'vectors.so'` to your `postgresql.conf`. If you already have some `shared_preload_libraries` set, you can separate each extension with a comma. For example, `shared_preload_libraries = 'pg_stat_statements, vectors.so'`.
You must install pgvecto.rs into your instance of Postgres using their [instructions][vectors-install]. After installation, add `shared_preload_libraries = 'vectors.so'` to your `postgresql.conf`. If you already have some `shared_preload_libraries` set, you can separate each extension with a comma. For example, `shared_preload_libraries = 'pg_stat_statements, vectors.so'`.
:::note
:::note
Immich is known to work with Postgres versions 14, 15, and 16. Earlier versions are unsupported.
Immich is known to work with Postgres versions 14, 15, and 16. Earlier versions are unsupported. Postgres 17 is nominally compatible, but pgvecto.rs does not have prebuilt images or packages for it as of writing.
Make sure the installed version of pgvecto.rs is compatible with your version of Immich. For example, if your Immich version uses the dedicated database image `tensorchord/pgvecto-rs:pg14-v0.2.1`, you must install pgvecto.rs `>= 0.2.1, < 0.3.0`.
Make sure the installed version of pgvecto.rs is compatible with your version of Immich. The current accepted range for pgvecto.rs is `>= 0.2.0, < 0.4.0`.
In the event that your nginx configuration includes a section for Let's Encrypt, it's likely that you have a segment similar to the following:
```nginx
location~/.well-known{
...
}
```
This particular `location` directive can inadvertently prevent mobile clients from reaching the `/.well-known/immich` path, which is crucial for discovery. Usual error message for this case is: "Your app major version is not compatible with the server". To remedy this, you should introduce an additional location block specifically for this path, ensuring that requests are correctly proxied to the Immich server:
```nginx
location=/.well-known/immich{
proxy_passhttp://<backend_url>:2283;
}
```
By doing so, you'll maintain the functionality of Let's Encrypt while allowing mobile clients to access the necessary Immich path without obstruction.
### Caddy example config
### Caddy example config
As an alternative to nginx, you can also use [Caddy](https://caddyserver.com/) as a reverse proxy (with automatic HTTPS configuration). Below is an example config.
As an alternative to nginx, you can also use [Caddy](https://caddyserver.com/) as a reverse proxy (with automatic HTTPS configuration). Below is an example config.
@@ -64,3 +84,43 @@ Below is an example config for Apache2 site configuration.
ProxyPreserveHostOn
ProxyPreserveHostOn
</VirtualHost>
</VirtualHost>
```
```
### Traefik Proxy example config
The example below is for Traefik version 3.
The most important is to increase the `respondingTimeouts` of the entrypoint used by immich. In this example of entrypoint `websecure` for port `443`. Per default it's set to 60s which leeds to videos stop uploading after 1 minute (Error Code 499). With this config it will fail after 10 minutes which is in most cases enough. Increase it if needed.
`traefik.yaml`
```yaml
[...]
entryPoints:
websecure:
address::443
# this section needs to be added
transport:
respondingTimeouts:
readTimeout:600s
idleTimeout:600s
writeTimeout:600s
```
The second part is in the `docker-compose.yml` file where immich is in. Add the Traefik specific labels like in the example.
`docker-compose.yml`
```yaml
services:
immich-server:
[...]
labels:
traefik.enable:true
# increase readingTimeouts for the entrypoint used here
The folders considered for these checks include: `upload/`, `library/`, `thumbs/`, `encoded-video/`, `profile/`, `backups/`
:::
When Immich starts, it performs a series of checks in order to validate that it can read and write files to the volume mounts used by the storage system. If it cannot perform all the required operations, it will fail to start. The checks include:
- Creating an initial hidden file (`.immich`) in each folder
- Reading a hidden file (`.immich`) in each folder
- Overwriting a hidden file (`.immich`) in each folder
The checks are designed to catch the following situations:
- Incorrect permissions (cannot read/write files)
- Missing volume mount (`.immich` files should exist, but are missing)
### Common issues
:::note
`.immich` files serve as markers and help keep track of volume mounts being used by Immich. Except for the situations listed below, they should never be manually created or deleted.
:::
#### Missing `.immich` files
```
Verifying system mount folder checks (enabled=true)
...
ENOENT: no such file or directory, open 'upload/encoded-video/.immich'
```
The above error messages show that the server has previously (successfully) written `.immich` files to each folder, but now does not detect them. This could be because any of the following:
- Permission error - unable to read the file, but it exists
- File does not exist - volume mount has changed and should be corrected
- File does not exist - user manually deleted it and should be manually re-created (`touch .immich`)
- File does not exist - user restored from a backup, but did not restore each folder (user should restore all folders or manually create `.immich` in any missing folders)
### Ignoring the checks
:::warning
The checks are designed to catch common problems that we have seen users have in the past, and often indicate there's something wrong that you should solve. If you know what you're doing and you want to disable them you can set the following environment variable:
@@ -104,7 +104,7 @@ You can choose to disable a certain type of machine learning, for example smart
### Smart Search
### Smart Search
The smart search settings are designed to allow the search tool to be used using [CLIP](https://openai.com/research/clip) models that [can be changed](/docs/FAQ#can-i-use-a-custom-clip-model), different models will necessarily give better results but may consume more processing power, when changing a model it is mandatory to re-run the
The [smart search](/docs/features/smart-search) settings are designed to allow the search tool to be used using [CLIP](https://openai.com/research/clip) models that [can be changed](/docs/FAQ#can-i-use-a-custom-clip-model), different models will necessarily give better results but may consume more processing power, when changing a model it is mandatory to re-run the
Smart Search job on all images to fully apply the change.
Smart Search job on all images to fully apply the change.
:::info Internet connection
:::info Internet connection
@@ -113,15 +113,23 @@ After downloading, there is no need for Immich to connect to the network
Unless version checking has been enabled in the settings.
Unless version checking has been enabled in the settings.
:::
:::
### Duplicate Detection
Use CLIP embeddings to find likely duplicates. The maximum detection distance can be configured in order to improve / reduce the level of accuracy.
- **Maximum detection distance -** Maximum distance between two images to consider them duplicates, ranging from 0.001-0.1. Higher values will detect more duplicates, but may result in false positives.
### Facial Recognition
### Facial Recognition
Under these settings, you can change the facial recognition settings
Under these settings, you can change the facial recognition settings
Editable settings:
Editable settings:
- **Facial Recognition Model -** Models are listed in descending order of size. Larger models are slower and use more memory, but produce better results. Note that you must re-run the Face Detection job for all images upon changing a model.
- **Facial Recognition Model**
- **Min Detection Score -** Minimum confidence score for a face to be detected from 0-1. Lower values will detect more faces but may result in false positives.
- **Min Detection Score**
- **Max Recognition Distance -** Maximum distance between two faces to be considered the same person, ranging from 0-2. Lowering this can prevent labeling two people as the same person, while raising it can prevent labeling the same person as two different people. Note that it is easier to merge two people than to split one person in two, so err on the side of a lower threshold when possible.
- **Max Recognition Distance**
- **Min Recognized Faces -** The minimum number of recognized faces for a person to be created (AKA: Core face). Increasing this makes Facial Recognition more precise at the cost of increasing the chance that a face is not assigned to a person.
- **Min Recognized Faces**
You can learn more about these options on the [Facial Recognition page](/docs/features/facial-recognition#how-face-detection-works)
:::info
:::info
When changing the values in Min Detection Score, Max Recognition Distance, and Min Recognized Faces.
When changing the values in Min Detection Score, Max Recognition Distance, and Min Recognized Faces.
@@ -149,11 +157,15 @@ Immich supports [Reverse Geocoding](/docs/features/reverse-geocoding) using data
SMTP server setup, for user creation notifications, new albums, etc. More information can be found [here](/docs/administration/email-notification)
SMTP server setup, for user creation notifications, new albums, etc. More information can be found [here](/docs/administration/email-notification)
## Notification Templates
Override the default notifications text with notification templates. More information can be found [here](/docs/administration/email-notification)
## Server Settings
## Server Settings
### External Domain
### External Domain
When set, will override the domain name used when viewing and copying a shared link.
Overrides the domain name in shared links and email notifications. The URL should not include a trailing slash.
### Welcome Message
### Welcome Message
@@ -197,4 +209,68 @@ When this option is enabled the `immich-server` will periodically make requests
## Video Transcoding Settings
## Video Transcoding Settings
The system administrator can define parameters according to which video files will be converted to different formats (depending on the settings). The settings can be changed in depth, to learn more about the terminology used here, refer to FFmpeg documentation for [H.264](https://trac.ffmpeg.org/wiki/Encode/H.264) codec, [HEVC](https://trac.ffmpeg.org/wiki/Encode/H.265) codec and [VP9](https://trac.ffmpeg.org/wiki/Encode/VP9) codec.
The system administrator can configure which video files will be converted to different formats. The settings can be changed in depth, to learn more about the terminology used here, refer to FFmpeg documentation for [H.264](https://trac.ffmpeg.org/wiki/Encode/H.264) codec, [HEVC](https://trac.ffmpeg.org/wiki/Encode/H.265) codec and [VP9](https://trac.ffmpeg.org/wiki/Encode/VP9) codec.
Which streams of a video file will be transcoded is determined by the [Transcode Policy](#ffmpeg.transcode). Streams that are transcoded use the following settings (config file name in brackets). Streams that are not transcoded are untouched and preserve their original settings.
If the video asset's container format is not in this list, it will be remuxed to MP4 even if no streams need to be transcoded.
The default set of accepted container formats is `mov`, `ogg` and `webm`.
### Preset (`ffmpeg.preset`) {#ffmpeg.preset}
The amount of "compute effort" to put into transcoding. These use [the preset names from h264](https://trac.ffmpeg.org/wiki/Encode/H.264#Preset) and will be converted to appropriate values for encoders that configure effort in different ways.
The transcoding policy configures which streams of a video asset will be transcoded. The transcoding decision is made independently for video streams and audio streams. This means that if a video stream needs to be transcoded, but an audio stream does not, then the video stream will be transcoded while the audio stream will be copied. If the transcoding policy does not require any stream to be transcoded and does not require the video to be remuxed, then no separate video file will be created.
The default policy is `required`.
#### All videos (`all`) {#ffmpeg.transcode-all}
Videos are always transcoded. This ensures consistency during video playback.
#### Don't transcode any videos (`disabled`) {#ffmpeg.transcode-disabled}
Videos are never transcoded. This saves space and resources on the server, but may prevent playback on devices that don't support the source format (especially web browsers) or result in high bandwidth usage when playing high-bitrate files.
#### Only videos not in an accepted format (`required`) {#ffmpeg.transcode-required}
Video streams are transcoded when any of the following conditions are met:
- The video is HDR.
- The video is not in the yuv420p pixel format.
- The video codec is not in `acceptedVideoCodecs`.
Audio is transcoded if the audio codec is not in `acceptedAudioCodecs`.
#### Videos higher than max bitrate or not in an accepted format (`bitrate`) {#ffmpeg.transcode-bitrate}
In addition to the conditions in `required`, video streams are also transcoded if their bitrate is over `maxBitrate`.
#### Videos higher than target resolution or not in an accepted format (`optimal`) {#ffmpeg.transcode-optimal}
In addition to the conditions in `required`, video streams are also transcoded if the horizontal **and** vertical dimensions are higher than [`targetResolution`](#ffmpeg.targetResolution).
import AppArchitecture from './img/app-architecture.png';
import AppArchitecture from './img/app-architecture.png';
import MobileArchitecture from './img/immich_mobile_architecture.svg';
# Architecture
# Architecture
@@ -28,7 +29,14 @@ All three clients use [OpenAPI](./open-api.md) to auto-generate rest clients for
### Mobile App
### Mobile App
The mobile app is written in [Flutter](https://flutter.dev/). It uses [Isar Database](https://isar.dev/) for a local database and [Riverpod](https://riverpod.dev/) for state management.
The mobile app is written in [Dart](https://dart.dev/) using [Flutter](https://flutter.dev/). Below is an architecture overview:
The diagrams shows the target architecture, the current state of the code-base is not always following the architecture yet. New code and contributions should follow this architecture.
Currently, it uses [Isar Database](https://isar.dev/) for a local database and [Riverpod](https://riverpod.dev/) for state management (providers).
Entities and Models are the two types of data classes used. While entities are stored in the on-device database, models are ephemeral and only kept in memory.
The Repositories should be the only place where other data classes are used internally (such as OpenAPI DTOs). However, their interfaces must not use foreign data classes!
A minimal devcontainer is supplied with this repository. All commands can be executed directly inside this container to avoid tedious installation of the environment.
:::warning
The provided devcontainer isn't complete at the moment. At least all dockerized steps in the Makefile won't work (`make dev`, ....). Feel free to contribute!
:::
When contributing code through a pull request, please check the following:
When contributing code through a pull request, please check the following:
## Web Checks
## Web Checks
@@ -7,6 +11,7 @@ When contributing code through a pull request, please check the following:
- [ ]`npm run lint` (linting via ESLint)
- [ ]`npm run lint` (linting via ESLint)
- [ ]`npm run format` (formatting via Prettier)
- [ ]`npm run format` (formatting via Prettier)
- [ ]`npm run check:svelte` (Type checking via SvelteKit)
- [ ]`npm run check:svelte` (Type checking via SvelteKit)
- [ ]`npm run check:typescript` (check typescript)
- [ ]`npm test` (unit tests)
- [ ]`npm test` (unit tests)
## Documentation
## Documentation
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.