| |

How I Built a Smart Album Feature in Immich—Without Writing a Single Line of Code (Thanks to AI)

It started with curiosity. After spending a week immersed in Cognizant Vibe Coding — where I was dazzled by live AI pair programming, real-time refactoring, and code suggestions that felt almost psychic—I got hooked. Not just on the tooling… but on the possibility. What if I could use this to build something real? Something complex? Something that had eluded me for over a year?

My target: Immich, the open-source, self-hosted photo management platform I’ve been using as my Google Photos replacement since 2023. It’s beautiful, fast, and privacy-first — but one feature was missing: Smart Albums.

Something like

“Show me all photos taken in June 2023 with a 5-star rating.”
“Show me every photo from my trip to Berlin that includes person XYZ.”
Or just “Show me all photos in a given date range”

Manual album creation? Fine for a few. But smart albums — dynamically generated based on metadata, tags, ratings, date ranges, facial recognition results? That is something I was missing and which for example other photo management solutions like Synology Photo have. I never understood why the Immich team has not come up with this.

I had a few Cursor credits left from the Vibe Coding Week. So, I rolled my sleeves and just started – with no experience in Typescript and on a massive application with sophisticated architecture. What possibly could go wrong with this?

Cliffhanger ….: It worked! Without writing a single line of code myself, it implemented a working smart album functionality, including changes on service-layer, the database, and the UI. All done by Cursor using mostly Claude and for some parts GPT5. 

Some observations:

  • Cursor did exactly what was asked – at least most of the time, and not always on the first attempt but more importantly, not more than this. Example: it implemented album functionality in general but did not implement functionality to prevent the user from manually adding photos to that smart album, which contradicts the idea of a smart album. A human developer probably (hopefully!) would have asked about this. That means, prompting (or spec if you will) must also include the parts that might be obvious for a human developer.
  • For some topics it needed several attempts, in the end without success (e.g. complex database queries was a problem). It then helped to switch the model, from Claude to GPT5 and vice versa. 
  • Finally, it always claims to have fixed or implemented something – a bit overconfident here and there.

Bottom line: Very impressive overall, it only took a couple of hours – never ever possible if I would have done it myself starting from zero. However, to do so, still some experience in various fields was required (docker, scripting, environment setup, databases). So, while impressive it will not replace experienced people, but it can make them much faster. 

Next step is to check how local language model like GPT-OSS, GLM 4.5, Qwen Code in combination with Cline or Kilo Code can keep up with Cursor / Claude /GPT5 as alpha male.

Similar Posts

Leave a Reply

Your email address will not be published. Required fields are marked *