mirror of
https://github.com/immich-app/immich.git
synced 2026-07-16 05:34:30 +03:00
Support user defined storage location/structure #16
Closed
opened 2026-02-04 16:32:24 +03:00 by OVERLORD
·
27 comments
No Branch/Tag Specified
main
chore/translations
renovate/typescript-projects
fix/29853-thumbnail-decode-size
custom-app-logo
fix/server-heif-security-limit
fix/live-photo-library-task-joining
renovate/machine-learning
chore/security-txt-ghsa
renovate/mobile
refactor/auto-trash-sync
fix/failed-sync-blocks-resume
renovate/pigeon-27.x
fix/slideshow-motion
renovate/typescript-7.x
renovate/eslint-plugin-unicorn-71.x
fix/ws-reconnect-battery
renovate/node
chore/pump-flutter
feat/ml-hwaccel-testing
chore/face-cluster-abstraction
feat/workflow-logs
fix/moved-files-not-backed-up
renovate/java-25.x
renovate/@immichui
renovate/node-24.x
renovate/terragrunt-1.x
renovate/opentofu-1.x
renovate/cloudflare-4.x
renovate/java-21.x
renovate/prom-prometheus
fix/ios-extension
feat/server-chunked-uploads
feat/native-core
feat/upload-action
fix-29727
feat/download-tag-action
feat/share-action
refactor/action-secondary-handler
feat/edit-button-action
feat/delete-action
feat/album-actions
chore/deprecate-ios-14
fix/android-cr3-save
fix/library-map-live-bounds-updates
fix/mobile-add-to-album-error
feat/browser-profile-action
feat/cast-slideshow-action
chore/update-maplibre-0.26.2
feat/locked-folder-action
fix/unauthorized-memory-creation
feat/workflow-exif-filter
renovate/eslint-plugin-unicorn-70.x
fix/android-locked-folder-delete
fix/library-map-loading-flash
feat/context-actions
renovate/grafana-monorepo
fix/mobile-scroll-velocity-placeholders
renovate/sharp
refactor/action-class
feat/memories-view
refactor/asset-action-filter
feat/undo-archive
feat/archive-action
feat/stack-action
feat/more-favorite-action
feat/restore-action
refactor/feedback-repository
refactor/asset-service-update
refactor/owned-iterator
fix/birthday-picker-locale-order
fix/viewer-double-close-anim
feat/mobile-hls-player
refactor/stack-actions
renovate/permission_handler-12.x
fix/kebab-action-color
feat/workflow-asset-tags
fix/viewer-long-image-aspect
fix/ios-memory-widget-local-date
fix/timeline-drag-select-stops
fix/ios-ethernet-unmetered
fix/featured-photo-thumbnail-cache
feat/yucca-integration
fix/album-timeline-date-ordering
chore/cancel-native-op-on-lifecycle
chore/album-remove-assets
feat/partner-table-permissions
fix/ocr-after-edit
fix/re-enable-pruning
refactor/delete-restore-actions
apk-build-deployment
renovate/pypi-pydantic-settings-vulnerability
edit-photo-stacking
fix/mise-lockfile
fix/android-local-album-date
feat/web-hls-hover
chore/pump-drift
refactor/android-background-worker
refactor/store-cleanup
fix/hash-mismatch
debug/throttle-timeline
refactor/app-metadata
refactor/advanced-settings
refactor/current-user
fix/dedupe-integrity-missing-paths
chore/albums-select
feat/album-assets-event
fix/fdroid-meta
refactor/per-asset-backup-flag
fix/av1-threads
fix/pass-secrets
fix/download-progress-stuck
fix/negative-backup-remainder
feat/map-asset-number
feat/custom-date-range
renovate/pep621-lock-file-maintenance-machine-learning
refactor/session-repository
test-bump-prerelease
fix/handle-unlinking-motion-photos
refactor/cached-key-value-repo
fix/date-range-formatting
fix/map-unresponsive
fix/mobile-album-action-msg
refactor/search-v3/pr-1
chore/v7.23.0-openapi-generator
asset-add-to-album-trigger
refactor/face-editor-decoupling
feat/zoom-aware-face-editing
refactor/adaptive-image-dimensions
fix-face-editor-video-preview
fix-stack-face-tag-selection
fix/face-boxes-edit-panel
workflow-webhook-step
feat/hero_view_transitions
fix/map-sidepanel-queries
feat/dart-openapi-generator
claude/share-quality-5d7Gn
drag-drop-ghost-target
refactor/workflow-page
refactor/mobile-upload
fix-scroll-flicker-2
test/2.7.5-new-sign
update-mise-lock-file
feat/kysely-0.29
feature/load-previews
release-candidate-flow-1
fix/mobile-22522-sqlite-2067
fix/job-lock
release-candidate-flow-3
release-candidate-flow-2
show-in-timeline-toggle
fix/mise-windows
fix/mobile-album-sync-stale-cache
plan-local-image-display
fix/remote-thumbnail-fallback
bugfix/live-photo-stuck
chore/riverpod-update
album-order-per-user
fix/web-timeline-dom-node-retention
chore/svelte-enable-state-referenced-locally
feat/favorite-albums
feat/patch-release-from-branch
fix/oauth-linking
feat/timeline_scroll_buffer
panorama-face-overlay
push-txxyuusptoru
push-zpwsovysllvn
chore/queue-endpoint-migration
fix/remove-from-album
chore/thumbnail-histogram
fix/video-thumbnail-bindthis-regression
fix/scrubber-drag-edge-cases
fix/timeline_layout_row_height
refactor-cancellable-task
uhthomas/fix-mobile-use-timer
uhthomas/fix-mobile-video-controls-key
uhthomas/chore-mobile-search-declarative
owner-role-album-user
feat/livephoto-editing
favorite-albums
uhthomas/fix-mobile-isolate-auth
fix/library-watcher-excludes
chore/library-e2e-to-medium
push-ynllunsvrpxy
fix/dont-delete-offline-library-files
push-zvwwxmvkrspv
push-kywsnvvkwzts
push-xxnxokokzrou
push-voozlrlkxsnu
view-in-timeline-transition
push-uymvmlknxpmx
push-qslzsplnusoz
fix/mobile-video-stall
uhthomas/draft-mobile-image-cache-cancel
push-yquostpqnkxp
feat/vitest-4
claude/offload-icloud-hashing-bI3GZ
midzelis/wip
uhthomas/fix-server-fsync-all
feat/mobile-widget-shared-client
push-lnyuzsutzkqq
push-vqqqxxvkunru
push-wvnmqoswptww
push-nwxlpmyzkyrl
fix/map-webgl-error
fix/mobile-player-fit
feat/panorama-tiles
csp-policy
push-rsywxvptwxuv
refactor/restores-file-interceptor
postgres-socketio
claude/auto-screenshot-web-changes-Y7efI
visual-review/pr-26535
push-lvyturrtwkrq
feat/library-offline-count
fix/mobile-video-aspect-ratio
uhthomas/fix-mobile-search-results
uhthomas/feat-sort-smart-search
uhthomas/chore-mobile-maplibre
uhthomas/mobile-fix-asset-details-album-pop
feat/crawl-wrapper
push-skvzqoozqkpl
feat/edit-filters
feat/pg-queue
refactor/asset-upload
better-project-structure
uhthomas/mobile-feat-asset-viewer-details
fix/ml-rocm-build
feat/asset-file-apis
feature/bottom-buttons-order
sqlite_thumbs
fix-keep-correct-ios-shared-album-asset
push-vpxwmwwxwnvw
fix-migration-width-height
shared-deep-link-handler
feat/thumbnail-native-clients
feat/platform-clients
fix/foreground-cloud-sync
filter-by-person
refactor/sidebar
fix/merged-edited-assets
feat/create-job-with-dto
feat/ios-fastlane-match
match-signing
fix-update-time-update-timeline
feat/modal-routes
feature/mobile-view-asset-owner
feat/system-settings
feature/show-activity-count
feat/location-favorites
feature/rearrange-buttons-2
fix/download-storage-template
chore/originals-in-asset-files
ben/tree-a11y
new-search-filter-ui
refactor/expectSelectedReadonly
refactor/mobile-grdb
feat/mobile-native-local-sync
refactor/timeline_ops
fix/scrubber_end
refactor/virtualsegment
refactor/rename_daymonth_groups
fix-remote-sync-clean-up
debug/cf-chunked-uploads
feat/search-filter-album/web
feat/session-permissions
feat/mobile-dynamic-thumbnails
refactor/extract_photostream
refactor/rename_load_api
refactor/timeline2
refactor/timeline3
feat-no-thumbhash-cache
feat/mobile-hdr-images
feat/beta-background-upload
fix/beta-timeline-memories-setting
fix/failed-uploads-not-removed
feat/groups
drift-map-page
feat/add-to-album-action
track-livephotos
feat/maintenance-worker
refactor/server-side-dedupe
feat/integrity-checks
dev/recognition-eval
lighter_buckets_test
perf/postgres-queue
tmp/demo-snapshot-preview
fix/server-migration-file-extension
rknn-toolkit-lite2
feature/Add-rocm-support-for-machine-learning
chore/async-hash-file
feat/shared-link-view-count
feat/graphql
no-video-player
fix/server-qsv-output-format
chore/server-geodata-tweaks
mobile/native-video-player-no-hero
feat/local-tileserver
feat/ml-armnn-conversion
chore/handle-output_dims
feat/capacitor-mobile-app-poc
feat/server-nvenc-hw-decoding
web/automation-ui
object-storage
ml/tflite
feat/ml-export-cli
v3.0.3
v3.0.2
v3.0.1
v3.0.0
v3.0.0-rc.4
v3.0.0-rc.3
v3.0.0-rc.2
v3.0.0-rc.1
v3.0.0-rc.0
v2.7.5
v2.7.4
v2.7.3
v2.7.2
v2.7.1
v2.7.0
v2.6.3
v2.6.2
v2.6.1
v2.6.0
v2.5.6
v2.5.5
v2.5.4
v2.5.3
v2.5.2
v2.5.1
v2.5.0
v2.4.1
v2.4.0
v2.3.1
v2.3.0
v2.2.3
v2.2.2
v2.2.1
v2.2.0
v2.1.0
v2.0.1
v2.0.0
v1.144.1
v1.144.0
v1.143.1
v1.143.0
v1.142.1
v1.142.0
v1.141.1
v1.141.0
v1.140.1
v1.140.0
v1.139.4
v1.139.3
v1.139.2
v1.139.1
v1.139.0
v1.138.1
v1.138.0
v1.137.3
v1.137.2
v1.137.1
v1.137.0
v1.136.0
v1.135.3
v1.135.2
v1.135.1
v1.135.0
v1.134.0
v1.133.1
v1.133.0
v1.132.3
v1.132.2
v1.132.1
v1.132.0
v1.131.3
v1.131.2
v1.131.1
v1.131.0
v1.130.3
v1.130.2
v1.130.1
v1.130.0
v1.129.0
v1.128.0
v1.127.0
v1.126.1
v1.126.0
v1.125.7
v1.125.6
v1.125.5
v1.125.4
v1.125.3
v1.125.2
v1.125.1
v1.125.0
v1.124.2
v1.124.1
v1.124.0
v1.123.0
v1.122.3
v1.122.2
v1.122.1
v1.122.0
v1.121.0
v1.120.2
v1.120.1
v1.120.0
v1.119.1
v1.119.0
v1.118.2
v1.118.1
v1.118.0
v1.117.0
v1.116.2
v1.116.1
v1.116.0
v1.115.0
v1.114.0
v1.113.1
v1.113.0
v1.112.1
v1.112.0
v1.111.0
v1.110.0
v1.109.2
v1.109.1
v1.109.0
v1.108.0
v1.107.2
v1.107.1
v1.107.0
v1.106.4
v1.106.3
v1.106.2
v1.106.1
v1.106.0
v1.105.1
v1.105.0
v1.104.0
v1.103.1
v1.103.0
v1.102.3
v1.102.2
v1.102.1
v1.102.0
v1.101.0
v1.100.0
v1.99.0
v1.98.2
v1.98.1
v1.98.0
v1.97.0
v1.96.0
v1.95.1
v1.95.0
v1.94.1
v1.94.0
v1.93.3
v1.93.2
v1.93.1
v1.93.0
v1.92.1
v1.92.0
v1.91.4
v1.91.3
v1.91.2
v1.91.1
v1.91.0
v1.90.2
v1.90.1
v1.90.0
v1.89.0
v1.88.2
v1.88.1
v1.88.0
v1.87.0
v1.86.0
v1.85.0
v1.84.0
v1.83.0
v1.82.1
v1.82.0
v1.81.1
v1.81.0
v1.80.0
v1.79.1
v1.79.0
v1.78.1
v1.78.0
v1.77.0
v1.76.1
v1.76.0
v1.75.2
v1.75.1
v1.75.0
v1.74.0
v1.73.0
v1.72.2
v1.72.1
v1.72.0
v1.71.0
v1.70.0
v1.69.0
v1.68.0
v1.67.2
v1.67.1
v1.67.0
v1.66.1
v1.66.0
v1.65.0
v1.64.0
v1.63.2
v1.63.1
v1.63.0
v1.62.1
v1.62.0
v1.61.0
v1.60.0
v1.59.1
v1.59.0
v1.58.0
v1.57.1
v1.57.0
v1.56.2
v1.56.1
v1.56.0
v1.55.1
v1.55.0
v1.54.1
v1.54.0
v1.53.0
v1.52.1
v1.52.0
v1.51.2
v1.51.1
v1.51.0
v1.50.1
v1.50.0
v1.49.0
v1.48.1
v1.48.0
v1.47.3
v1.47.2
v1.47.1
v1.47.0
v1.46.1
v1.46.0
v1.45.0
v1.44.0
v1.43.1
v1.43.0
v1.42.0_65-dev
v1.41.1_64-dev
v1.41.0_64-dev
v1.40.1_63-dev
v1.40.0_63-dev
v1.39.0_61-dev
v1.38.2_60-dev
v1.38.1_60-dev
v1.38.0_60-dev
v1.37.0_58-dev
v1.36.2_56-dev
v1.36.1_55-dev
v1.36.0_55-dev
v1.35.0_54-dev
v1.34.0_53-dev
v1.33.1_52-dev
v1.33.0_52-dev
v1.32.1_51-dev
v1.32.0_50-dev
v1.31.1_49-dev
v1.31.0_49-dev
v1.30.2_48-dev
v1.30.0_46-dev
v1.29.6_45-dev
v1.29.6_44-dev
v1.29.5_44-dev
v1.29.4_44-dev
v1.29.3_43-dev
v1.29.2_43-dev
v1.29.1_43-dev
v1.29.0_42-dev
v1.28.4_41-dev
v1.28.4_42-dev
v1.28.3_41-dev
v1.28.2_40-dev
v1.28.1_39-dev
v1.28.0_38-dev
v1.27.0_37-dev
v1.26.0_36-dev
v1.25.0_35-dev
v1.24.0_34-dev
v1.23.0_33-dev
v1.22.0_32-dev
v1.21.1_31-dev
v1.21.0_31-dev
v1.20.3_30-dev
v1.20.2_30-dev
v1.20.1_30-dev
v1.20.0_30-dev
v1.19.1_29-dev
v1.19.0_29-dev
v1.18.0_27-dev
v1.17.0_25-dev
v1.16.0_23-dev
v1.15.1_21-dev
v1.15.0_21-dev
v1.14.0_21-dev
v1.13.0_20-dev
v1.12.0_18-dev
v1.11.0_17-dev
v1.10.0_15-dev
v1.9.1_14-dev
v1.9.0_13-dev
v1.8.0_12-dev
v1.7.0_11-dev
v1.6.0_10-dev
v1.5.1+9-dev
v1.5.0+8-dev
v1.4.0+7-dev
v1.4.0+6-dev
v1.4.0-dev
v1.3.0-dev
v1.3.1-dev
v0.6-dev
v0.5-dev
v0.4-dev
v0.3-dev
v0.2-dev
first-android-release
Labels
Clear labels
accessibility
changelog:enhancement
changelog:security
changelog:skip
changelog:translation
cli
date-time
dependencies
documentation
external-library
format
good first issue
mobile-beta
mobile-beta
mobile-beta
needs-answer
nice to have
pull-request
sharing
tech-debt
📱mobile
🖥️web
🗄️server
🧠machine-learning
Mirrored from GitHub Pull Request
No Label
Milestone
No items
No Milestone
Projects
Clear projects
No project
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: immich-app/immich#16
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.
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Originally created by @wjbeckett on GitHub (Feb 26, 2022).
Originally assigned to: @alextran1502 on GitHub.
I mentioned this on Reddit, but the user should be able to define how images are stored on the file system. This will not only allow for the user to choose how the images are named, but should allow Immich to index existing images.
Let's say I have an existing photos library where the photos are structured like this:
Photos |
|-> 2022
|-> 01
|-> filename.ext
Immich should respect the existing file structure and index the existing images.
While importing new photos, it should ask the user how the photos should be stored allowing the user to define the file structure above so that newly imported photos are placed in the correct place on the existing file system in the users defined folder structure.
Ideally, we should be able to define the filename pattern as well. Mine is currently date_timestamp_number.ext. for example, 2022-02-23-203109-001.jpeg
@alextran1502 commented on GitHub (Feb 26, 2022):
Thank you for your suggestion. I will consider this when the mobile app is stable and all the basic features are ironed out
@wjbeckett commented on GitHub (Mar 3, 2022):
So, I am the one who made the request for the external importer but you may be misinterpreting what I have said.
What I mean is this - most people in this sub will already have a bunch of photos on their servers/NAS stored in a way they prefer on the file system, for me, it’s a directory called photos and then sub folders as years (2022, 2021, 2020, etc) and then sub folders within them as months, and then the image files within that.
This is how I want my photos to be arranged and I don’t want another app changing that. What I would like is the app to accept my input as to how I want the images stored on the server/NAS and then move them there for me.
So, what Immich should be doing, is collecting the photos and videos off my device, grab the metadata along with that and pushing them to my server to sit in an “import” directory (or something similar). Then, the server app should scan that directory for any files, tag them based on the metadata, perform facial recognition, etc and then move the photos to their final testing place in my photo library that already exists on my file system and in the naming convention I expect them to be in.
This way Immich won’t just be an uploading too, it will be an image management app as well as a backup tool for my device images and a way to view my images on my server.
This is sort of the way Photoprism and similar app/servers work.
@ippocratis commented on GitHub (Mar 4, 2022):
I agree with the year/month/day folder structure but I don't want to push the dev
Its his app after all
I see that immich is crazy fast in loading and displaying immages appar to how fast google photos loads cloud images. That crazy fast
So I really want this app to grow so I can use it.
The truth is that if the feature to add to immich server photos already on the server machine is not somehow imlemented it is not going to be any usable
@nijhawank commented on GitHub (Mar 22, 2022):
+1. I also have my existing photos in year/month/photo.ext structure that I want to be able to access via Immich. It would be a good idea if Immich simply indexes them in-place without requiring them to be imported/duplicated into another location.
@JamesTeague commented on GitHub (Mar 30, 2022):
Adding to the request, this would be great. It's something that I think a lot of people want, being autonomy over their server file structure. This will allow other things to play nice with the files too, I believe. This is something I'd personally love to see in here and I think many others would to.
@Akruidenberg commented on GitHub (Apr 6, 2022):
+1 for me.
@alextran1502 commented on GitHub (Apr 6, 2022):
Noted, this is a different scope of the project though. I will let you know when I implement a CLI tool for this.
@mokahless commented on GitHub (Aug 8, 2022):
Ah I was just starting to investigate the best way to expose my smb share to immich in its container and came across this thread. I actually don't care about adding photos through immich and just want it to add photos I've put on my smb share automatically, without duplicating them or renaming them or moving them.
Since it hasn't been mentioned yet, I'll mention that photoprism refers to this as "indexing" for original directories.
@wiseindy commented on GitHub (Aug 10, 2022):
+1 Would love to be able to use my existing photo library with Immich
@reejosamuel commented on GitHub (Aug 22, 2022):
+1 to this.
@Ewalda commented on GitHub (Aug 22, 2022):
+1
SynologyPhotos (NAS) use following similar file structure for standard backup mobile devices:
MobileBackup///month
The device name is e.g. iphone name which the user give to his phone e.g. "Toms Iphone". In Immich is currently a cryptic Id a name would be better.
Parallel to that the user can create free defined other folders, which are also included in the photo database. And inside this folders also free defined sub folders are possible. This structure is necessary for sorting a lot of images to several events.
Additional the original date and time of the image and the movies is set to the modified date and time of the file system. Immich uses the upload time in the file system.
Additional it either uses the original name of the mobile device or it can be selected to rename the filename to IMG_yyyyMMdd_HHmmss (If there is already a file with this name it will be renames by adding _1 ...) <= This naming is often used by mobile phones and cameras for photos and videos. Immich uses a random UUID (asset-upload.config.ts fileNameUUID = randomUUID()).
It would be very good if Immich can do it similar. Immich mobile backup is much faster than synology photos. (I believe also other things are faster! Very Good! But I have not yet so much photos in Immich.)
All that things are very essential if the database crashes (what happens to me on the synology database). It is possible to rebuild the database by this file system structure! Also for files (videos) with no Exif Data! Also the sorted directory structure is still there, albums are only stored in the database.
We have above 1 000 000 photos currently sorted by this way.
Additional information to albums:
Only a flat album structure is not enough to sort so many photos at least sub albums should be supported (Synology photos also don't support sub albums, therefore and because of database problems I sort it in the directories. But because of avoiding duplicates, albums would be better! )
@fivestones commented on GitHub (Aug 26, 2022):
I'd like to have this feature too
@eckebusch commented on GitHub (Aug 27, 2022):
+1 to this
@Txxicer commented on GitHub (Aug 28, 2022):
+1
@zkhan93 commented on GitHub (Sep 11, 2022):
+1 to this feature as it also makes the app more "safe".
love the app thank you so much!
@ggantn commented on GitHub (Oct 1, 2022):
+1 for me.
@Spectre5 commented on GitHub (Oct 3, 2022):
I'd also love the ability to just index an existing directory tree. I have my photos already organized in a meticulous way within various subdirectories that are meaningful for me. I'd like to load this share/directory as read-only in Immich to be sure nothing in it changes.
@DawidPietrykowski commented on GitHub (Oct 6, 2022):
I also agree that such feature would be a great addition to the app. For me it's the only thing holding me back from ditching Plex, the loading/viewing speed of Immich could make it a great photo gallery/browser for a NAS.
@kenzot11 commented on GitHub (Nov 2, 2022):
+1 for me
@nijhawank commented on GitHub (Dec 18, 2022):
I assume this only stores photos uploaded via Immich to be stored in the specified folder/file structure. But this does not indexes photos in existing folder (not uploaded via Immich) and makes them available via Immich, is the understanding correct?
@alextran1502 commented on GitHub (Dec 18, 2022):
@nijhawank that is correct, the scanning feature is not yet implemented. You can find a more detailed discussion here #1006
@arnoudius commented on GitHub (Feb 19, 2023):
+1, would be nice if this could be supported
@amokster88 commented on GitHub (Apr 2, 2023):
+1, i would love this and I just deployed this and I am loving this. Can't thank you enough Devs. Keep it up, I hope more people start supporting this project.
@poisonborz commented on GitHub (Jun 9, 2023):
+1, even though I'm in awe of what Immich became , for now this is a dealbreaker for me.
I already have an established photo structure which I expose through multiple services. I'd only share this folder as read only with any container, as I wouldn't risk them corrupting or modifying them in a way I don't expect. Metadata/thumbnails should be stored separately. Good (even though different scope) examples for this behaviour would be PiGallery 2 or Nextcloud.
@charles-997 commented on GitHub (Jun 25, 2023):
As an update, this feature has been added. See docs here
https://immich.app/docs/features/read-only-gallery
@zilexa commented on GitHub (Jul 2, 2023):
Perhaps allow to set a global default of the "External Path", relative to the user path.
Like %userfiles%/%username%/Pictures
Each user would have their photos in a subfolder inside their userfolder called Pictures (or Photos or Albums or whatever).
@jrasm91 commented on GitHub (Jul 2, 2023):
You can already do this by prefixing the storage template with Pictures and by setting up your volume mounts for the external path relative to the upload location.