Build1 distinct publisher3 min readPublished
A sizing guide for a 20,000 item Immich import puts the floor at four cores and 6 GB of RAM, but the disk figure moves with how much unplayable video you own, and three first-hour settings decide whether you pay for the processing twice.
The Engineer · Build desk

Compiled by The EngineerSomething wrong?How this is made
Add up the component table in the dev.to guide for a library with no video and it comes to 1.15x to 1.25x: originals at 100 percent of what you handed over, because nothing is recompressed [4], thumbnails and previews at 15 to 25 percent [5], and a Postgres volume in the hundreds of megabytes at this scale [7] [1]. The stated floor is 1.35x [1]. That difference is headroom rather than a fifth directory, which matters when your own measurements come in under the band.
The top of the band is video, and it lives in one directory. `encoded-video/` costs 50 to 100 percent of your video bytes again, and only for clips the browser cannot play natively [6]. Run the guide's own figures forward. A 12 MP HEIC frame lands near 2 MB [11], so 20,000 stills is about 40 GB [2], while the same 20,000 item phone library is put at 60 to 120 GB of originals [10]. That leaves 20 to 80 GB of video [3], which at 400 MB for a 4K clip [11] is between 50 and 200 clips [4]. Transcode those and you add 10 to 80 GB [5]. So the multiplier is a claim about codec mix, and for it to transfer your clips have to be the same kind of unplayable as the author's.
The 200 GB provision for a 90 GB Takeout [8] survives checking, and it is the 80 percent rule doing the work rather than the multiplier. Worst case footprint is 1.6 x 90, or 144 GB [1]. Holding that under 80 percent needs a volume of at least 180 GB, and 200 GB lands at 72 percent [6]. The stronger instruction in the same guide is to run `du -sh` on each subdirectory after the first 1,000 assets and derive your own multiplier [9]. That is the right shape for the problem: sample your library instead of trusting anyone's band, this one included.
Which leaves the sequencing. The three settings that force a full re-run are the storage template, the machine learning model and the transcoding policy, and all three are set in the first hour [3]. The measurement that would inform them arrives 1,000 assets later [9]. Import a thousand files, read the directories, then commit, and treat the first 72 hours as unattended processing rather than evidence of a broken install [17].
For the RAW case the arithmetic closes the question before policy comes up. 20,000 files at 25 MB is 500 GB, and 1.35x to 1.6x of that is 675 to 800 GB [14] [7]. The guide points that profile at an external library in read-only mode so Immich never becomes the only copy of the originals [14], which is right for a reason beyond disk: a read-only external library has no storage template to get wrong.
In my context I would take the low-power path, facial recognition on and the smart search model off, as the Pi 5 and N100 advice has it [15]. The honest cost of that choice is that the model is one of the settings which rewrites finished work when you change it [16], so adding smart search in month three means paying the queue you avoided in week one.
Ranked by verification strength, evidence, and original report placement.
Three settings decided in the first hour, the storage template, the machine learning model and the transcoding policy, force a full re-run of every job if changed in month two.
The upload/ and library/ directories hold the originals at 100 percent of Takeout size, byte for byte, because Immich never recompresses the file you gave it.
The thumbs/ directory is typically 15 to 25 percent of original size on a photo heavy library, since every asset gets a small thumbnail plus a larger preview used by the timeline and detail view.
encoded-video/ is zero with no video but easily 50 to 100 percent of video bytes again when the default policy re-encodes clips the browser cannot play natively.
The Postgres volume holding metadata and machine learning vectors is usually a few hundred megabytes at this scale, and grows with embeddings and faces rather than with file size.
Practical floor given in the guide: if the Takeout unzips to 90 GB, provision 200 GB and do not let the filesystem cross 80 percent during import.
Distinct publishers with included, body-backed reporting in this cluster.
dev.to
1 article · August 29, 2026
Follow any of these and your For You feed starts watching them — no settings page required.
build
canvas.toBlob hands you a PNG and calls it WebP: check blob.type, not the user agent1 distinct publisher
build
Notion's agent stack is live, not slideware, and it only changes one of your decisions1 distinct publisher
build
The 680 MB database that was really a 17 GB disk: self-hosted support platforms fail at month six1 distinct publisher
build
Your "Index Only Scan" Did 2,847 Heap Fetches: Covering Indexes Are a Vacuum Problem1 distinct publisher
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
One author's rules of thumb, unmeasured
Every load figure in this story — 1.35x to 1.6x disk, 6 GB, 4 cores, a weekend of jobs — traces to a single self-published guide on dev.to with no run output behind it: no library it actually imported, no job timings, no du -sh numbers of its own despite telling readers to collect exactly those. The figures are internally checkable, which is worth something, and two of the checks fail: the directory percentages fall short of the printed multiplier for a photo-free-of-video library, and the 6 GB headline is an average of the guide's own two profiles. What survives scrutiny is the qualitative claim, that video bytes and re-runnable settings dominate the cost, not the specific numbers.
No usage or deployment data
This reporting says nothing about how many people run Immich, which releases they run, or how any real import performed. It is advice about a migration, not a record of one, so there is no adoption to measure here.
Padded headline over careful body
The body of dev.to's guide is more honest than its opening line. Below the fold you get the caveats that matter — motion photos stored twice, previews larger than the thumbnails people expect, trash holding disk for 30 days, measure your own multiplier — while the top of the page rounds a range up into a floor. The overstatement is small and directional: readers who provision to the headline will over-buy modestly, which is the safe way to be wrong about disk.
Search-shaped, nothing being sold
Nobody is monetising this: Immich is free software, the author does not ship it, and no product, sponsor or affiliate appears anywhere in the piece. What does shape it is discoverability — six reader personas and a twelve-question FAQ block are the anatomy of a page built to be found by people typing 'how much disk does Immich need', and that format rewards a confident single multiplier over the correct answer, which is 'measure it'. Mild distortion, no conflict of interest.
Single voice, checkable but unconfirmed
We are reading one publisher with no second account to corroborate or contradict it, on a subject where the true answer varies by library composition — which the guide itself concedes. Confidence is higher than a lone unverified post would normally earn, because the reasoning is transparent enough to audit and most of the arithmetic holds; it stays well below the midpoint because the two numbers a reader is most likely to act on, disk multiplier and RAM, are the two that do not survive that audit.