2026-08-13·3 min read

The wedding app, part 3: the gate opened itself

field-notesweddingside-projects

At six in the morning, before either of us was awake, the countdown on the front page hit zero and the gate opened itself. Nobody clicked anything. The code had been sitting there since June, waiting on a timestamp that had no idea whether we were ready.

That is the part I had not thought about while writing parts one and two. Everything else I build has a next deploy. This one had a date that could not move. People had committed calendar and airfare to it months out, and it was not going to slide for anyone’s sprint. Three decisions came out of that, and I now know what each one bought.

The first was refusing a build step or an application server. Plain HTML, vanilla JS, no bundler, no framework, no package.json. 16 pages and 27 hand-written JS modules, about 7,400 lines, sitting on Netlify as static files talking to Supabase. On the morning of a wedding, nobody is going to be watching a build log or restarting a crashed process. There was no process to restart. If a page loaded it worked, because nothing sat between the file and the browser that could fail on its own.

The second was the service worker. A castle has stone walls, thick enough that signal dropped in whole rooms, and I did not want “find your seat” to depend on a bar of reception in a room built centuries before reception existed. The seating chart and the schedule were precached the moment a guest’s phone loaded the site once, and they rendered with the network off. The room that killed everyone’s signal never touched the two pages people actually needed while standing in it.

The third was the gate. I did not want to be the person who has to remember to flip a switch while getting married, so the switch flipped itself, on a timer set weeks earlier. Guests joining from abroad got a pared-down version of the same site two days early, gated the same way, on its own timer. Nobody on our side touched a deploy button that morning. I found out it had worked the way everyone else did, by looking at my phone.

Find your seat got rebuilt late, off the final printed chart. Two-word names stacked onto a second line where my layout had assumed one, so I measured the label widths against the real chart instead of guessing at padding. The drag-and-drop editor behind it meant the arrangement could keep moving right up to the week of, which it did.

Once the gate opened, guests posted from their own phones with no app to install and no account to make. 130 photos landed in the album. We kept a physical guestbook out as well, and afterwards I typed those pages in by hand, so the handwriting and the typing sit in the same feed now.

The bingo cards ran on 65 facts guests had submitted about each other, and 22 cards came back finished. The photo challenges were taken 30 times. The phrasebook ran on 48 clips of Mandarin, Swedish and Singlish that I recorded at home, so a Swedish uncle could greet my family in their own language, which is not something a seating chart can do for you.

A screen in the room ran the wishes and photos as a slideshow while people were still posting them. Days later, once everyone was home and had slept, I built a recap page out of what they had uploaded: the venue, the arrival, ten photos, the figures, six wishes, a thank-you. A second pass on that page is waiting on the photographer’s gallery, so the recap can carry real photography instead of phone shots.

A few couples who were there have asked about their own version since. The product from part two stays parked for now.