Living × Building
If you’ve ever sat in the choir during Sunday mass, you know the person I’m talking about. They’re the one singing along, keeping pace with the congregation, mentally tracking which prayer comes next — and also managing a laptop connected to the projector, nudging slides forward at exactly the right moment. It’s a lot to ask of one person. And when something goes wrong — a font that looked perfect on screen turns invisible on the projector, a prayer that got added last minute that never made it into the deck, lyrics with a typo nobody caught until it was already up in front of the entire parish — there’s very little you can do about it in the moment.
I’ve been that person creating those PowerPoints more times than I can count. And I’ve felt that quiet frustration when a small, fixable thing becomes an unfixable thing because the mass is already underway.
So for week one of my Lenten building challenge, I built Worship Cast — a dynamic, real-time worship display system where the person managing slides doesn’t have to be chained to a laptop in the corner. Admins can push updates on the fly. Fonts, backgrounds, layout — all adjustable without stopping everything to edit a file. Lyrics get a last-minute tweak? It’s live. A song gets added to the order? Done, without pulling anyone aside.
The problem was clear to me. What I didn’t expect was just how interesting the build would turn out to be.
I started, as I often do, by thinking out loud with Claude — brainstorming the idea, working through a detailed spec, and refining it until it felt solid. Then came the curveball: I didn’t have my laptop. It was late, I had the spec, and I thought — fine, let’s see what I can do from my phone.
I tried Emergent first. Out of credits. That was quick. So I threw the same prompt at both Lovable and Vercel’s v0 simultaneously. Lovable gave me a genuinely impressive UI, clean and polished, but it leaned heavily on browser local storage and the feature set felt thin. Vercel actually attempted more of the core functionality but the UI was rough and not quite there. Neither was the complete picture, but between them I had something to work with.
Here’s where it got interesting. My usual move at this point would be to hand things over to Claude Code. But Claude Code has been having some issues in Termux on Android lately — a whole saga that deserves its own post — and on my phone right now, it’s Gemini CLI that runs reliably. So I downloaded the Vercel output as a zip, extracted it, and fired up Gemini CLI inside that folder.
I use the GSD plugin, which handles planning and phased execution. I started a new GSD project, fed it the spec, and it did something I appreciated: it looked at what was already built, figured out what was missing, and created an updated plan from there rather than starting over. We iterated through the phases and got to something that actually worked. Not glamorous, but effective.
Getting the dev instance running hit a snag with a missing pnpm package, so I committed the code and waited until I was back at my laptop. From there I worked through the app properly, got Supabase set up, and deployed it to App Engine.
At that point it was running, but the UX needed work. I put together some mocks in Google’s Stitch and wanted Gemini CLI to pick them up through MCP. I tried adding it, but the auth flow wasn’t cooperating. So I switched over to Antigravity and got MCP working there — asked it, running on Gemini 2.5 Pro, to align the implementation with the mocks. Parallely I was using Gemini CLI to chase down a deployment routing issue on App Engine. The theme work came together. Dark mode got added. Things were starting to feel right.
By this point it was four in the morning. I’d planned to include Google login — set up the OAuth client, enabled the right APIs, followed the documentation — but something was still off and it wasn’t behaving as expected. Rather than keep chasing it at 4am, I disabled it and flagged it for a follow-up.
Then I remembered Codex. I’d installed the app a while back and never seriously used it. Peter Steinberger’s recent writing about it had been sitting in the back of my mind, so I figured — why not now?
I don’t have a better word for it than magical. Codex ran a security audit, a tech audit, gave me clear and actionable feedback, and then just… fixed things. No fluff, no lengthy back-and-forth. It got what I was trying to do and helped me get there. I found myself genuinely enjoying it in a way I wasn’t expecting at that hour of the night, shipping more in less time, feeling more in control of the codebase.
By 6am I needed to stop. Sunday mass was a few hours away.
Worship Cast is live and running, and you can try it out at worship-cast.app.justi.in. It’s not perfect — Google auth is still on the list, and there are UX refinements I want to revisit — but it solves the real problem. A choir member can manage the display from their phone. A coordinator can push a last-minute lyric change without walking across the room to a laptop. The font that looked good on screen but disappeared on the projector can be fixed right now, not after mass.
That’s what week one looks like. One overnight hackathon, five different tools, a phone, a laptop, and a problem I’ve been quietly annoyed about for years finally solved.
Six weeks to go.
Worship Cast is part of my Lenten project — one app a week for faith communities across the 40 days. Follow along at blog.justi.in.