I finally did the thing I've been threatening to do for about two years: I moved my entire photo library off Google Photos and onto a self-hosted Immich instance running on the old Dell Optiplex under my desk. It took a Saturday, one panicked moment where I thought I'd nuked twelve years of pictures, and roughly 340GB of transfer time. Worth it. Mostly.
Backstory, for anyone who wasn't around for my NAS saga back in 2019 (still the most-commented post on this blog, somehow): I've got a little home server setup, nothing fancy, just enough to run Plex, a Pi-hole, and now apparently a photo library that thinks it's Google Photos but isn't secretly training anything on my kid's birthday party pics.
Why bother
Google's storage pricing crept up on me the way rent does. I was paying for the 2TB plan mostly because of photos, not because I needed 2TB of Drive space, and every year the "is this actually worth it" math got worse. Then a friend mentioned Immich had gotten genuinely good, not "good for self-hosted software" good but actually pleasant to use, with face recognition and a map view and a mobile app that auto-backs-up in the background without draining your battery in twenty minutes. That last part matters more than it sounds like it should.
The actual setup
If you've never touched Docker Compose before, this is a reasonable first project, though I wouldn't call it beginner-beginner. You pull the example docker-compose.yml and .env file from the Immich repo, fill in your database password and upload location, and run it. Three containers come up: the server, a Postgres database with the pgvector extension for the machine-learning search stuff, and Redis for caching. It listens on port 2283 by default, and once it's up you get a login screen that looks suspiciously like a real product.
The part nobody warns you about clearly enough is the initial machine learning pass. Once you dump your whole library in, Immich chews through every photo to build face clusters and generate the CLIP embeddings that make the smart search work (you can type "dog on a beach" and it'll actually find it, which still feels like a magic trick to me). On my hardware, a machine that is not fast, this took almost eleven hours for around 28,000 photos. I just let it run overnight and didn't think about it, which is the correct approach.
The scary moment: partway through the migration I used the wrong flag on the immich-go upload tool, the one that pulls a full Google Takeout export, and it looked for a solid two minutes like it was overwriting my library metadata instead of appending to it. It wasn't. I just hadn't waited long enough for the progress bar to catch up. But I did sit there with my heart in my throat googling error messages before I figured that out, so, lesson: don't run migration tools at 1am when you're too tired to read the docs properly.
What's actually better
The map view is nicer than Google's, honestly. Face grouping took some manual correction (it kept confusing my brother and me in old photos, which, fair, we did look more alike at 24). The mobile app backup is what sold me though. It runs quietly, doesn't nag, and I can point it at my own server over Tailscale so it works the same whether I'm on my home wifi or standing in a parking lot somewhere.
Is it as slick as Google's product in every corner? No. Shared albums are clunkier. There's no equivalent to that magic "memories from this day" thing that Google does really well, or at least the Immich version of it is less polished. And I'm now the person responsible for backups, updates, and uptime, which is a real cost even if it doesn't show up on a monthly bill. If my server dies and my backup drive dies at the same time, that's on me now, not a data center in Iowa.
But I own the data. There's something genuinely calming about that, in a way I didn't expect going in. I open the app, my photos are there, nobody's model is looking at them, and I'm not one pricing-tier email away from a decision I didn't make. If you've got a spare machine lying around and a free weekend, it's a good project. Just don't do the Takeout import at 1am.