The short version. Selecting 200 wedding photos from 2,000 defeated a product leader for a year, so he vibe-coded a Tinder-style voting app in a weekend: Google Drive as a free CDN, a shared password instead of auth, and an admin override for marital harmony. A small lesson in scope — build only what the moment needs.

There is a distinct brand of terror reserved for a man facing his own wedding leftovers.

By day, my trade involves steering massive software deployments for millions of souls across Southeast Asia. I am paid to be undaunted by scale. Yet, when confronted in April 2025 with a 2TB hard drive containing 2,000+ RAW images of my own nuptials, my nervous system collapsed.

Our photographer, a gentleman who clearly believed that quantity trumps quality all day, had dumped this digital continent on my lap with a simple brief: cull it down to 200 for editing, and then to fifty for a physical wedding album.

For over a year, I did precisely nothing. It wasn't a failure of intellect (no pun intended, though Intellect did keep me busy), but a failure of format. Human beings are not built to scroll through thousands of high-resolution images on a desktop folder; by photo forty, the mind turns to porridge. Meanwhile, the familial and parental units kept inquiring via WhatsApp as to when they might expect the physical album. To involve them in the raw data was unthinkable; it would have triggered a domestic maelstrom of conflicting opinions and emojis from which no man could emerge intact.

Soon, and by that I mean one whole year later, I decided something needed to be done about this. I had a single weekend, a budget of zero dollars, and an audience of five tech-allergic relatives.

Hacking the nuptial stack

When you are working under these constraints, you do not build software the way they teach you at work. You do not think about infrastructure, scalability, or clean code architecture. Instead, you look for structural inefficiencies in the tech ecosystem and ruthlessly exploit them.

The conventional engineering approach would involve AWS S3 buckets, a Node.js backend, a Postgres database, and some bloated authentication library. That path leads to a weekend spent reading API documentation and a marriage on the rocks. I chose the path of the elegant hack.

The first obstacle was the raw data. The photographer's RAW files were digital behemoths, completely unsuited for casual smartphone scrolling. However, every RAW file carries a compressed JPEG preview nestled inside it like a prize in a box of cereal. I (Claude) whipped up a quick script to strip these out, reducing a terrifying continent of data into a manageable handful of gigabytes.

Next came the problem of hosting. If you want to host thousands of images on standard cloud infrastructure, Amazon will gladly charge you for the privilege. Google, however, offers fifteen gigabytes of storage to any fresh soul willing to create an account. I minted a throwaway Gmail address — a digital phantom existing solely for this weekend — and flung the JPEGs into Google Drive.

To bridge the gap between Google Drive and a web application, architectural purists would insist on building a proper Content Delivery Network. But purists do not have an impending deadline with family. I spun up a Google Cloud Console free trial, grabbed an API key, and forced Google's own global network to act as my personal, entirely cost-free media server.

Vibe-coding the interface

In the ancient days of software development — by which I mean 2023 — building the actual user interface required hours of writing boilerplate React, managing state variables, and wrestling with CSS layout rules. I bypassed this entirely by "vibe-coding" with v0.

Vibe-coding is the art of refusing to write code yourself, choosing instead to argue with a large language model until it yields to your worldview. I did not care how the machine achieved the result, so long as it compiled. I described the ideal state to the AI:

"Give me a Tinder-style interface for wedding photos. Swipe right to keep, swipe left to incinerate. Every swipe must record a vote against a user's name, and everything must feed into a live leaderboard. Make it look elegant enough that my family won't realize it was built by a machine on a Sunday afternoon."

The AI spat out hundreds of lines of complex React code. I did not read any of it. If it compiled and didn't crash my browser, it was production-ready.

The crowning achievement of the weekend, however, was the complete omission of a security system. Conventional product management dictates that users must create accounts, verify their emails, and select secure passwords. Had I presented my family with a "Sign Up with GitHub" button, the entire enterprise would have foundered on the rocks before the first photo was viewed.

Instead, I protected the entire application behind a single, universally shared password. Security experts would shudder at the vulnerability. But in the context of a micro-product with an audience of five relatives, it was a perfect design decision. It eliminated 100% of user onboarding friction. It took twenty seconds to implement. It was secure enough to keep out random internet bots, and my family could access it instantly while sitting on the sofa.

The admin override

This brings us to the aspect of the project where ethics took a back seat to marital harmony: the admin override.

While the family believed they were participating in a pure democracy, I retained a master key to the database. If my father voted with unbridled enthusiasm for a photo where he looked magnificent but the composition resembled a low-budget horror film, I quietly docked his tally. If my wife favoured a shot that the leaderboard was unfairly burying, I gave it a hefty, invisible shove.

One of the fundamental truths you learn in software — and, indeed, in marriage — is that pure democracy is a terrible way to build anything. A committee will always average out the quirks that make a thing beautiful. The real value of the tool wasn't the voting algorithm at all; it was simply a mechanism to trick people into doing tedious work in small, dopamine-hit batches on their phones.

The family used it. They swiped through a few hundred photos each over a couple of evenings. My wife went through all of them. The leaderboard surfaced a consensus top 200 within a week — which was more progress than we'd made in the previous twelve months.

I spend my day job thinking about personalisation at scale, AI triage systems, and multi-market deployment infrastructure. This was the opposite of that. One weekend, zero budget, five to ten users, no auth system, and an admin override that was basically me rigging the vote for my wife.

But the product instincts were identical: understand the real constraint (the format, not the indecision), design for the actual users (family, not engineers), scope ruthlessly, and know whose opinion actually matters when the leaderboard disagrees.

The photographer received his selections. The album is being printed, probably. My parents have ceased their interrogation. And the man who is paid to think about personalisation at scale has confirmed, empirically, that the same instincts work at a table for five — provided you have the good sense to rig the vote for your wife.

← All posts