mirror of
https://github.com/immich-app/immich.git
synced 2026-02-05 00:30:57 +03:00
[Feature]: Add option to optimize uploaded images automatically #523
Closed
opened 2026-02-04 21:04:32 +03:00 by OVERLORD
·
52 comments
No Branch/Tag Specified
main
feat/asset-file-apis
chore/translations
fix/web-switch-label-clickable
fix/web-people-hidden-state
renovate/typescript-projects
release/next
fix/timezones
fix/time-zone-upserts
midzelis/wip
push-zpwsovysllvn
push-nwxlpmyzkyrl
push-nvnkszuqwppm
renovate/github-actions
push-smstsuupsowp
refactor/adaptive_image
push-olwpzvrxnomt
push-lmxsupnmxspl
renovate/machine-learning
feat/web-chromecast-video-looping
feat/use-native-clients
renovate/flutter
fix/create-face-edited
fix/mobile-ios-mtls
docs/contributing
docs/mise-mobile
renovate/grafana-monorepo
feature/bottom-buttons-order
feat/immich-mobile-ui-showcase
refactor/consolidate-image-requests
renovate/connectivity_plus-7.x
renovate/major-vitest-monorepo
renovate/pypi-python-multipart-vulnerability
fix/mobile-people-query
sqlite_thumbs
feat/html-text
chore/no-macro-validation
refactor/purchase-store
uhthomas/mobile-fix-app-bar-fade
uhthomas/mobile-fix-asset-jump
feat/pano-ocr
feat/shared-link-login
fix/database-backup-db-names
fix-keep-correct-ios-shared-album-asset
fix-memory-generation-and-display
feat/verify-permissions
refactor/album-service-small-tests
fix/ml-rocm-build
fix/flipped-dimensions-mobile
push-vpxwmwwxwnvw
fix-migration-width-height
refactor/more-queries
revert/prettier-translations
refactor/asset-service-queries
fix/locale-settings-desc
chore/add-debug-log
feat/edit-filters
shared-deep-link-handler
feat/mobile-editing
feat/thumbnail-native-clients
feat/platform-clients
feat/integrity-checks-izzy
fix/foreground-cloud-sync
feat/dynamic-layout
filter-by-person
feat/csp
refactor/sidebar
fix/disable-editing
fix/view-timeline-deeplink
image-zoom-on-slow-connection
fix-consider-dar-for-video-dimension
fix/merged-edited-assets
perf/optimize-album-sort
open-api-fix
feat/create-job-with-dto
use-toast-primary
feat/vitest-4
feat/ios-fastlane-match
match-signing
fix-update-time-update-timeline
chore/translation-keys
feat/modal-routes
feat/panorama-tiles
feature/mobile-view-asset-owner
feat/system-settings
feature/show-activity-count
better-info-in-asset-viewer
fix/all-people-count
feat/location-favorites
feature/rearrange-buttons-2
fix/download-storage-template
feat/kb-shortcuts-mobile
fix/people-count
push-qolzzzzxrvvn
chore/originals-in-asset-files
feat/asset-size-columns
ben/tree-a11y
new-search-filter-ui
refactor/expectSelectedReadonly
refactor/mobile-grdb
push-qvuktpxmkknu
feat/mobile-native-local-sync
refactor/timeline_ops
fix/scrubber_end
feat/version.txt
feat/context-menus
feat/server-chunked-uploads
refactor/virtualsegment
refactor/rename_daymonth_groups
fix/restrict-android-bg-worker
feat/android-periodic-worker
fix-remote-sync-clean-up
refactor/timeline_move_ops
renovate/mapbox-mapbox-gl-rtl-text-0.x
fix/timeline_split_selectable
feat/keyboard_actions_help_modal
feat/static_frontend
feat/notification-warnign-android
feat/plugins2
feat/plugins
test/create-workflow-token-action
fix/docs-force
debug/search-result-similarity
debug/cf-chunked-uploads
feat/eslint_rule
feat/search-filter-album/web
refactor/timeline_photostream
refactor/timelineasset_asset
feat/session-permissions
feat/timeline_photostream_assetnav
feat/timeline_minor_optimize
feat/timeline_perf_nocomp
feat/timeline_search_results_actions
feat/timeline_search_results_page
fix/timeline_padding
fix/timeline_search_reactivity_warnings
feat/timeline_scrollbar
feat/timeline_stream_withviewer
fix/timeline_back_forth_nav
refactor/timeline_photostream_component
fix/generated-files-checks
fix/locate-button-local
chore/base-image-mimalloc
refactor/timeline_assetlayout
refactor/timeline_selectable
refactor/timeline_aware_actions
refactor/timeline_monthsegment
feat/remove-old-pages
chore/deps-gradle
tmp_photostream
tmp/lcms
feat/mobile-dynamic-thumbnails
fix/mobile-finer-thumbnail-concurrency
refactor/timeline1
refactor/extract_photostream
refactor/rename_load_api
refactor/timeline2
refactor/timeline3
feat/multi-select-asset-viewer
feat-no-thumbhash-cache
refactor/asset_grid
feat/faster-access-checks
fix/18991
fix/19543
chore/temp-remove
fix/21419
feat/mobile-hdr-images
chore/update-mise-lockfile
feat/mise-server-checks
feat/mise-ci
feat/windows-2025
feat/dev_cli
refactor/mobile-migrate-clients
fix/map-theme
fix/require-checkbox
chore/use_swc
feat/efficient-thumbnail-decoding
refactor/mobile-thumbhash
refactor/mobile-thumbhash-new
fix/mobile-uncached-zoom
feat/beta-background-upload
fix/beta-timeline-memories-setting
fix/failed-uploads-not-removed
feat/mobile-shared-album
feat/groups
drift-map-page
drift-auth-user-sync
fix/disable-memory
feat/add-to-album-action
edit-date-time-action
drift-people-page
sqlite-remove-isIn
feat/inline-storage-columns
chore/required-reviewers
refact/asset-manager
fix/folder-sort
pnpm
feat/widget-multiple-server-urls
chore/medium-tests-dbname
fix/web-no-iterator-find
fix/map-pan-interruption
track-livephotos
timeline_events
chore/oxlint-migration
feat/maintenance-worker
feat/dav
chore/demo-snapshot
refactor/server-side-dedupe
feat/integrity-checks
dev/recognition-eval
lighter_buckets_test
perf/postgres-queue
postgres-queue
focus_rings
refactor/web-stores-1
refactor/add-to-taken
feat/sort-places
feat/sidecar-asset-file
vet
tmp/demo-snapshot-preview
fix/server-migration-file-extension
refactor/mobile-v2
fix/asset-update-race-condition
rknn-toolkit-lite2
refactor/mobile-split-up-search-page
feature/Add-rocm-support-for-machine-learning
feat/rocm
chore/async-hash-file
feat/shared-link-view-count
feat/rotation
feat/graphql
feat/job-ids
feat/ignore-library-permission-error
feat/docker-compose-builder
feat/kysely-typeorm
mobile/onboarding
no-video-player
fix/server-qsv-output-format
chore/server-geodata-tweaks
mobile/native-video-player-no-hero
feat/xxhash
fix/docs-concurrency
feat/preload-ml-textual-model
feat/local-tileserver
refactor/exif-orientation
original-path-infix
refactor/mobile/login-form-1
feat/server-editor-endpoints
fix/server-qsv-vbr
fix-mobile-db-problems
feat/ml-armnn-conversion
feat/mobile/backup-with-album-info
feat/fast-initial-sync-1
chore/handle-output_dims
feat/server-more-robust-generation
feat/unassign-faces
feat/shortcuts-on-asset-grid
feat/background-upload
feat/capacitor-mobile-app-poc
feat/server-nvenc-hw-decoding
release/v1.105
fix/mobile-fetch-non-archive
feat/fine-grained-access-controls
web/automation-ui
feat/mobile-server-endpoint-save-dropdown
feat/blurhash-thumbnail
object-storage
feat/memories-animations
dev/metrics
ml/tflite
feat/ml-export-cli
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
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#523
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 @DVerdeV on GitHub (Dec 28, 2022).
Feature detail
The vast majority of home users don't notice if any compression is applied to the image.
I have tested this with the ImageMagick tool on Linux and by changing the quality. Personally, I've started to notice it when I lower it to 35%. I think it is a good idea to add an option to compress images when uploading, as this would allow storing many, many more in the same space using a negligible amount of server usage.
According to tests I have done, a 5.8 MB image can be reduced to 350 KB (35% quality).
Platform
Server
@alextran1502 commented on GitHub (Dec 28, 2022):
Then if you want to retrieve the original file to print, you cannot do it anymore
@DVerdeV commented on GitHub (Dec 28, 2022):
A small section could be added in the settings to adjust this compression and enable/disable it. Obviously, there are people who then print some stored photos, but for a user who takes a lot of photos, it might be better to be able to store a lot of them using less storage space.
Google Photos did this with their “high quality/storage saver” backup option. Find here what they have on their help page about that:

I think those are good dimensions for a print of a photograph and enough for albums, gifts, etc…
@alextran1502 commented on GitHub (Jan 15, 2023):
Closing this issue as it is not in scope of the project
@lpryszcz commented on GitHub (Oct 18, 2023):
Hi, I find this feature useful as well. But this can be done manually directly on the library.
Does immich store file size/md5 in the database? If image is compressed, this would change its size and hash, possibly breaking things.
Thank you!
btw, immich is amazing!
@alextran1502 commented on GitHub (Oct 18, 2023):
@lpryszcz Immich stores file size and md5 in the database and use md5 to check for duplication.
@WinnerOK commented on GitHub (Oct 21, 2023):
@lpryszcz would you be interested to collaborate and find a way to compressed already stored images at least manually server-side ?
I see the following possible options:
I suggest for us to try hacky ways to optimize a file storage and only after to try and create more or less stable PR to immich
Useful links: DB queries
@lpryszcz commented on GitHub (Oct 21, 2023):
I like the idea @WinnerOK .
This is also my favourite (at least for now).
The problem I see it that if we compress and update the db, it'll cause mobile client to upload the same photos again if they are not removed already.
The main question is, how stable is DB design? It makes little sense to develop something that will be broken with future releases (this is why #165 is on hold as far as I understand, right?).
@WinnerOK commented on GitHub (Oct 21, 2023):
If we do client-side compression and use hash of compressed file for dedup, then client will have to repeat compression to properly check for duplicates. This seems like a lot of work for client.
The original image in high-quality should still be available on user's device. Therefore, we should check for duplicates based on the original hash. (Keep in mind that current hashing is server sided, but it could become client sided at one time: https://github.com/immich-app/immich/issues/2567)
If we have to consider original file hash, then we have to make sure that hash in the DB is only used for deduplication and does not actually get verified afterwards (otherwise we have to store 2 hashes in the DB) then we could just store the original hash. @alextran1502 could you tell us if immich uses file hash anywhere except deduplication during upload?
If we would dive into server, we could also somewhat address the issue mentioned above (https://github.com/immich-app/immich/issues/1202#issuecomment-1366894485 ) by adding 2 configurations:
1. Upload quality:
compressedororiginal. This speaks for itself.2. If upload quality is
originalwe can show a slidercompress photos older than X days/years/neverand also add a checkmarknever compress favourite mediaThis way people who have limited storage can give up on quality, but still preserve their favourite moments as is
@aviv926 commented on GitHub (Oct 23, 2023):
I see someone started something about it here #1242
also someone made something that already work with immich
https://gist.github.com/JamesCullum/6604e504318dd326a507108f59ca7dcd
@athornfam2 commented on GitHub (Nov 8, 2023):
I'm interested in an on/off switch as well. My family and I don't particularly see the point in anything larger than 8MP or 12MP anyways. I
@aviv926 commented on GitHub (Nov 14, 2023):
Unfortunately according to the developer of the project this is not a feature that will be added in the near future or at all
In my reply above, I showed how it is possible to still apply compression to details, but it seems that this is something that affects the entire library and cannot be selected per user
@athornfam2 commented on GitHub (Nov 14, 2023):
it's unfortunate as it could save a tremendous amount of space for those of us that don't need original quality on a remote server especially if the photo is cached locally. I guess I'll have to look into a solution for that. Do you know of any that have been created by other users?
@AngelaDMerkel commented on GitHub (Sep 16, 2024):
My issue #8907 was recently closed as a duplicate of this unfortunately (also) closed issue. I think this makes it pretty clear that the team won't work on this issue. It would be a great solution to be able to toggle with users even if only for video. Images occupy a miniscule amount of space relatively speaking, but a lot of my users are uploading giant 4K videos don't really benefit from their inflated bitrates and my machine is already doing the work to convert to proxies for viewing. I understand it's a against the spirit of Immich as the developers see it, but it would go a very long way to making this a much more versatile solution
@Chuckame commented on GitHub (Nov 13, 2024):
@alextran1502 finally, does the incoming new feature of workflows could fit this need, as we could be able to apply a pipeline over the imported photos?
@alextran1502 commented on GitHub (Nov 13, 2024):
Potentially, I think it will fir with custom plug in
@bverkron commented on GitHub (Dec 2, 2024):
I think this feature is very viable for certain use-cases and workflows, but it may not be a good fit for the core of what Immich is. This is said as someone who really wants this feature!
Immich has grown immensely in popularity and functionality (and for good reason!) and with that comes more and more use-cases and workflows. Personally I would love this feature since currently I'm trying to use Immich as a photo / video sharing platform for close family members. I have 80,000 photos / videos in my Lighroom catalog and need a good way to share those with the family, but I am not expecting Immich to take over all that content as the main storage / organization system. Rather it's a glorified web gallery so my family can gain access to our family photos and they're not "locked" into my LR catalog and I don't have to eat up all my cloud storage and rely on Adobe.
Thus, I don't want / need Immich to hold the original files, backup, etc just "web copies" that family can easily access. Some of my original video files are massive as well as they are shot in 4K 60 on a Canon mirrorless. So 15 second clip can be around 0.5 of a GB.
Would love to see a workflow that would allow for this kind of thing and I think workflows would open up a huge amount of possibility for all kinds of cases without bugging down or diluting the core development and making the whole product a spaghetti mess trying to accommodate everyones specific use cases.
@lpryszcz commented on GitHub (Dec 2, 2024):
I'd second to that! In addition, my phone camera saves "lowly" compressed photos in jpeg (~8 MB each) which could be easily compressed to reduce their size 10x. So for me, having option to "reduce" file size before sending it to the server would be a great benefit.
@rdymade commented on GitHub (Dec 10, 2024):
If i undetstand this correctly you could just link your originals to immich via an external library. This way it is not the main storage but still does the video/image transcoding. Basically exactly what you want it to do really.
@bverkron commented on GitHub (Dec 11, 2024):
That could work for some workflows but mine is to publish from Lightroom to Immich using a plugin. The main reason for this is that I have thousands of videos in my collection and don't want all of them in Immich and cannot use the current file structure to filter them out on disk. I have smart collections in Lightroom that filter down to just specific videos automatically (say 2 star and above only with specific people or other keywords) and only publishes those to Immich.
Lightroom can technically do conversions first before sending to Immich (instead of sending the full size original) but it can only do a max of 1080p (I want 1440p) and only h.264 non-HDR (I want HDR video in Immich). So I'm forced to send the full size video file which can sometimes be massive.
@happyTonakai commented on GitHub (Jan 20, 2025):
I need that feature because my iPhone gives me a 10MB file for a screenshot!
@miguelangel-nubla commented on GitHub (Jan 20, 2025):
Made this to solve the problem:
https://github.com/miguelangel-nubla/immich-upload-optimizer.
@rodrigoGA commented on GitHub (Feb 5, 2025):
I am very interested in this feature. I haven't fully familiarized myself with Immich, but I believe that every version generated of an image should be stored along with additional metadata (hash, dimensions, size, etc.). If not, it would require a change in the backend without needing modifications to the clients. This approach is flexible, even for an architecture that handles different sizes for various devices.
I’ve been reviewing the issues and noticed that this feature is requested multiple times—possibly the most requested one. Moreover, in most cases this application is used on a home server shared by several family members, where managing storage space is a crucial aspect of any image storage software.
In my view, this functionality should be a core part of the system rather than an add-on like AI features. Although I haven't contributed to Immich yet, I'd be happy to collaborate on developing this feature.
Considering that, as @alextran1502 mentioned, this idea was closed because it was deemed out of scope for the project, I’d like to ask if it might be reconsidered or if you believe it could be useful, especially given that some progress has already been made (@miguelangel-nubla ). Also, I noticed that Workflows are on your roadmap; is that the planned solution for this case?
@bo0tzz commented on GitHub (Feb 5, 2025):
We have a fundamental 'rule' to not change the original file ever, in order to significantly minimize the chance of data corruption bugs. The workflows feature will eventually also involve plugin support, and then this can be implemented with a third party plugin, but we won't be adding support for it to the Immich core.
@aviv926 commented on GitHub (Feb 5, 2025):
You can check out this project, it's not official by the immich developers but it does the job. I'm sure the developer would be happy to get help with the development from other people.
https://github.com/miguelangel-nubla/immich-upload-optimizer
@djbel63 commented on GitHub (Feb 18, 2025):
I just taked it as base for me.
`tasks:
command: convert {{.folder}}/{{.name}}.{{.extension}} -resize 1920x1920> -quality 50 {{.folder}}/{{.name}}-new.jpg && mv {{.folder}}/{{.name}}-new.jpg {{.folder}}/{{.name}}.{{.extension}}
extensions:
`
With that, i can compress from 10mb jpeg (DSLR) to 200kb foto.
@jorgeEF commented on GitHub (Mar 24, 2025):
I wish immich implements this, 90%+ users don't need original size (50mp) photos at all.
@nijahplays commented on GitHub (Mar 29, 2025):
Even lossless compression would be nice. I like full quality images and having a bit of extra space as well.
@AngelaDMerkel commented on GitHub (Mar 29, 2025):
@nijahplays I requested lossless JXL in a previous FR. It's against developer ethos but will be possible in a plugin down the line, which seems like a fair decision.
@evanpacini commented on GitHub (Apr 26, 2025):
@nijahplays
This. I have tons of PNGs that weren't compressed as much as they could. Would be handy if PNGs were losslessly compressed upon upload.
@mcpeixoto commented on GitHub (May 26, 2025):
This totally makes sense to have as an option. 90% of users don’t need full-res originals on a home server, especially when most photos are never printed. Just having a toggle like “Storage Saver” with adjustable compression (or max resolution) would let people store way more without touching the original on the device.
@szszl0 commented on GitHub (Jun 20, 2025):
@alextran1502 Most people dont print photos.. Why not let people decide if they want their photos compressed or not?
@athornfam2 commented on GitHub (Jun 20, 2025):
It's interesting this topic is still being discussed 3 years later! Thankfully someone in the thread created an optimizer for our photos. I wish it would go back to existing ones though.
@jorgeEF commented on GitHub (Jun 20, 2025):
I just use an external album in immich and compress the photos/videos in the folder with a bash script using ffmpeg. I sync the photos to that folder with smbsync and that's it.. Still waiting till immich implements image resizing.
@szszl0 commented on GitHub (Jun 20, 2025):
Yeah, I have seen it, didnt use it yet. But it doest work for photos that are already in our library right? Also using third party software for that increases number of places where something could break. I need the user experience to be as smooth as possible becouse my wife is my main customer..
Yeah, I guess it would be doable for me but I'd prefer something simpler for my wife
@jorgeEF commented on GitHub (Jun 20, 2025):
It's simple and she doesn't have to do anything:
Automate the sync from her phone to the folder and that's it.. set the bash script to run every hour or so and you won't miss immich integrated sync at all.
@rodrigoGA commented on GitHub (Jun 20, 2025):
These doubts arise if the script runs directly in the Immich folder:
@jorgeEF commented on GitHub (Jun 20, 2025):
Immich handles external albums in a different way than its internal albums. It scans new files in the external album periodically and adds the new files to the database, you can set read-only for immich in that external album so it works just as a read only gallery.
This is useful if you want to access your photos from any other app or just a file browser as immich isn't the one managing your album. Everything else you should handle it manually.
Immich won't sync new photos to the external album, it only sync photos to its internal albums so if you choose to use an external album you shouldn't sync photos within immich or you'll end up with you album splitted in different locations.
Resumed: I only use immich as a photo gallery viewer and that's all I need from it. I keep managing my photos/videos through other apps.
@AngelaDMerkel commented on GitHub (Jun 23, 2025):
immich is so much more than that and already does a massive amount of background work to make it possible to view, manage and store images. The smaller versions being transcoded for actually serving to devices are effectively what this FR is about. I would love everything to be transcoded losslessly into an easier storage format, but in lieu of that I'd love to transcode a copy of my family's 100s of gigabytes of videos and photos they never see again into something smaller. I am easily storing over 1TB of images for them which could be 100GB without them noticing a difference.
@jorgeEF commented on GitHub (Jun 23, 2025):
That's fine if that's your salsa, but I don't think anybody here is asking to transcode/optimize every immich user galleries without being asked to do so, this should be clearly an optional feature that we're sure most people will use.
For me the thing goes this way: If I can't secure backups of a pretty large photos/videos gallery it's like having no gallery at all, so I prioritize something that I can handle knowing that I will always have those valuable photos/videos even if they aren't the best quality possible.
Cheers.
@zolakt commented on GitHub (Jul 2, 2025):
Personally, I'd like all my images to be compressed, since I never print them. But I get that some people don't want that.
So why not make this a one-time job, instead of intercepting all uploads? You select the pictures you want, click a compress button, and that is it. It overwrites existing images, recalculates the hash and updates the db. Yes, you would possibly need to store both hashes in the db, but why is that a big deal? I don't get why is this shot down by the devs, when clearly a huge section of user base asks for this feature.
The plugin approach mentioned here, and Miguel's proxy are fine, but they don't offer granularity. It's all or nothing. And you will find people on both ends on the spectrum that have a problem with this.
99% of users storing family photos need maybe 10% of them to be printable, at most. Others are either poor photos, poor cameras, gazillion almost the same pictures of the cat... No one needs all of those to be printable. On the other end of the spectrum you have the pros, with an inverse ratio, but even they have at least 10% of cat pictures they never mean to print. A one-time job would offer granularity and solve all use cases.
Btw. for the "storage is cheap" argument: Yeah it is, but if you want to do a proper 3-2-1 backup strategy (and you definetly should since you are going the self-hosting route), that is two disks and a cloud bucket subscription... it adds up. On the other hand you could be using 10x less space without any visual difference.
And don't get me wrong, I'm not trying to vent here or belittle the effort. This is a fantastic project, one of the best self-hosted ones out there. I just think you are being too opinionated about this particual feature, that would solve a lot of things for a lot of users.
On another note: does anyone have a suggestion on how to deal with photos that have already been imported? How to manually compress them without breaking anything? I really can't spare the amount of time it would take me to reupload and retag everything.
Btw. I won't be switching back to it, but just for reference, Google Photos has this as a one-shot action, for each photo. You have that option in the context menu. And that is clearly the project you are trying to compete with. So I don't really get this strongly oppinionated NO. Your users are asking for it, your competitors already have it...
@Red007Master commented on GitHub (Aug 16, 2025):
Look, I can "kinda" understand photos argument (while it is still wrong).
But it makes absolutely no sense when we talk abut video.
I have 4min 600mb full-HD video in shitty quality, I can easily drop it to 50mbs, without any (perceivable) quality loss, and believe me or not - I will nor anybody else will be printing video.
Disappointing decision driven not by inability, hardness or lack of resourced but by inflated ego and "I know better".
Unfortunately I will need to come-up with some hacky solution for this problem.
Edit: If somebody will need it:
Here FFmpeg command that I use on my videos,
-map_metadata 0lets you transfer metadata from original video to it's compressed version.ffmpeg -i INPUT_FILE -c:v libx264 -crf 32 -preset medium -map_metadata 0 -c:a aac -b:a 128k -movflags +faststart -profile:v baseline -level 3.0 OUTPUT_FILE@szszl0 commented on GitHub (Aug 20, 2025):
@alextran1502 do you have any valid reason to ignore this crucial feature request?
@alextran1502 commented on GitHub (Aug 20, 2025):
@szszl0 Yes I do, the design philosophy of Immich is to not touch and alter the original files.
@rodrigoGA commented on GitHub (Aug 26, 2025):
Totally with you @alextran1502 . A photo manager whose philosophy is “never touch photos” is so pure that, taken to the extreme, we should probably not store them at all....problem solved 😅.
Also, by that logic, Immich already does touch things, there’s an image editor on the roadmap (and today we already allow basic edits like crop/rotate), plus derivatives and metadata....etc.
What’s being asked is opt-in, a per-user, album ...Storage Saver, with exclusions (e.g., favorites), dedupe by the original file hash (also store the optimized hash), and run it as a one-off job, not an upload interceptor.
I respect code cleanliness, but when a request repeats for years with lots of +1s, it’s not noise, it’s a signal. Being open to that signal isn’t weakness, it’s good engineering.
@bo0tzz commented on GitHub (Aug 26, 2025):
No, Immich doesn't touch the original file like Alex mentioned. Any edits are done through EXIF metadata in an XMP sidecar file.
@alextran1502 commented on GitHub (Aug 26, 2025):
Thanks for the comment, for image editing, we are not planning to touch the original file either.
Besides the design philosophy. There are more technical nuisance of supporting such system, especially for detecting which files have been uploaded, or not. Or matching duplicate when ingesting from different source.
I think that more people regretted using the optimized storage option when upload to services like Gphotos than being happy about it. As the cost of hard-drive will only reduce in the future. I hope that not implementing this feature will make you one day say "thanks gosh, Immich doesn't give me the option to mess with my original files, because I need that for x,y,z reasons."
I think the cons outweigh the pros for this feature. We often say yes to most thing, but for this specific feature it is in a no-list in the foreseeable future
@jorgeEF commented on GitHub (Aug 26, 2025):
I don't think anybody here is asking for a mandatory optimization to all the media of every immich user, It's clearly an optional feature to be used by those that want to use it and that's it. As I see it, immich currently takes control of users media and forbids users to do whatever they want with their own photos/videos. This is why I just stoped using it: it was too much hustle to do whatever I want with my own media on immich...
@Red007Master commented on GitHub (Aug 27, 2025):
This is first time EVER I have heard something like this.
Having your opinion and vision of the project is absolutely ok.
You have every right, and it's OUR problem, not yours.
But gaslighting people (yourself included) that your position/opinion/decision/vision is objectively right is wrong on many levels.
@Red007Master commented on GitHub (Aug 27, 2025):
If you want to use something like "people regretted using the optimized storage option when upload to services like Gphotos than being happy about it" as justification of something - do actual PULL an ask people what they actually think and not "what you believe people thinking".
But we perfectly know what result of pull like this will be, ain't we?
@rodrigoGA commented on GitHub (Aug 27, 2025):
It still reads more like a (valid) preference than a pros-cons balance for common cases.
Still, on the points @alextran1502:
Please don’t take this negatively, quite the opposite. We’re very satisfied with Immich and genuinely grateful for the amazing work. This suggestion comes from that appreciation and from wanting to make an already great project even more flexible.
I hope you’ll reconsider this as an advanced optional feature those who don’t use it keep the philosophy intact
@alextran1502 commented on GitHub (Aug 27, 2025):
No negative feelings taken 😄 I know you guys have good intentions. I think it is okay to disagree on the direction, and that is perfectly okay. From both viewpoints, we have reasons to believe what is best for the use case, and it is normal when they are not aligned.
I stand my point of not going to implement this feature. My suggested workaround is to optimize the library before importing it into Immich if the use case really needs to save space on the hard drive.
@alextran1502 commented on GitHub (Aug 27, 2025):
I will yield the BDFL stick this time and lock this discussion. Thank you for participating in discussing this feature request 😃