Home  /  Studio
Shipped work · Case studies · Live links

The studio.

What I’ve actually built and shipped. Real software with real users, real stakes, and real links you can click on. Each one solves a problem I had, or watched somebody I cared about have — and couldn’t let alone.

5shipped products

02featured builds · on the bench

1on the shelf, with notes

Moreactive builds · see Workshop
01 · Studio

League-OS / YLAFL Platform

Live · 1,500 families

A custom league management platform built from scratch for youth flag football — registrations, payments, scheduling, team management, standings, and communications.

The league was stuck on a dying platform (Sports Connect, EOL Fall 2026) and nothing off-the-shelf fit. So I built what should have existed.

Why it existsMost of League-OS is boring CRUD done carefully. Two pieces are genuinely interesting: check processing and team formation. Cash, check, and money order payments still dominate youth sports, so the app has to turn a photo of a check into a posted payment. It works as a pipeline that spans Vercel and Google Cloud: the browser requests a signed upload URL and writes the check PDF straight to Google Cloud Storage, then Vercel kicks a containerized Cloud Run service (authenticated with a Google Auth Library ID token) that renders the PDF to PNGs using pdf-to-img and @napi-rs/canvas and writes the images back to GCS. A job engine in Postgres orchestrates the multi-step work. Each job step runs inside a Vercel route and uses after() to self-chain to the next step, which keeps every invocation under the 60 second serverless cap. Lease-based serialization prevents two workers from processing the same job, and a cron recovery job picks up anything stale. Team formation is the other hard part. Sorting hundreds of kids into fair teams used to be a weekend of spreadsheets and hurt feelings, so I built a real solver: a greedy first pass seeds the teams, then simulated annealing refines them against weighted hard rules and soft preferences. It balances grade levels, quarterback counts, and how many kids come from each school, honors teammate-together and do-not-pair requests, keeps coaches near the players they already know, and makes sure every kid recognizes at least one familiar face on their roster. Formation runs as a background job and produces a few proposals an admin can compare side by side, with plain-English narration of the tradeoffs, and nothing goes live until a human accepts one. None of this is generic SaaS plumbing. It only exists because the league actually needed it.
Fig. 01 · UI preview
League-OS / YLAFL Platform screenshot
Spec · 01Rev. 04·26
Status
Live · shipping
Users
1,500 families
Stack
Next.js · Drizzle
DB
Neon Postgres
Pay
Stripe
Host
Vercel
02 · Studio

Biblical Battle Plans.

Live · rebuilt

An RPG-themed Bible reading tracker with guilds, XP, character progression, and community accountability. Built for men who want to take their faith seriously without it feeling like homework.

I wanted a Bible reading tool that felt like a game, not a chore. Nothing like it existed. So I built it.

The honest partHit architectural limits around 100 users — no test environments, business logic buried in database queries. Tore it down and rebuilt v2 with a proper API layer, branched testing, and error tracking. The rebuild was harder than the original build, and I learned more from it.
Fig. 02 · UI preview
Biblical Battle Plans screenshot
Spec · 02Rev. 04·26
Status
Live · v2
Users
100+ growing
Stack
Next.js · TS
DB
Neon · Drizzle
Host
Vercel
Story
Wall → rebuild
03 · On the bench

Jettison Air.

Building · invite-only

The command center for private aviation professionals. Charter brokers and operators manage the full lifecycle of a trip in one place: source operators, build quotes, pull live weather and airport data, and ship branded PDF documents to clients.

Charter brokers juggle a dozen disconnected tools: spreadsheets for trips, scattered databases for aircraft specs, PDFs for airport info, email for documents. An operator I work with needed one system that pulls it all together. Off the shelf tools either ignore this niche or try to serve everyone and serve no one well.

The hard partThe hardest part is data gravity. FAA Part 135 operator records, a 267+ aircraft catalog, 5,000+ airport records with runway specs and FBO details, and live weather feeds (METAR, TAF, SIGMET, PIREP) all have to stay clean, queryable, and fast under a broker workflow that has zero tolerance for a stale record. The app pairs Next.js on Vercel with Neon Postgres and Drizzle, better-auth for role-aware access, React PDF Renderer for auto-numbered branded quotes, itineraries, and invoices, and SendGrid for transactional delivery.
Fig. 03 · UI preview
Jettison Air screenshot
Spec · 03Rev. 05·26
Status
Building · invite-only
Scope
Charter ops
Stack
Next.js · TS
DB
Neon · Drizzle
Auth
better-auth
Docs
React PDF
04 · On the bench

Real Zambia Safari.

Live · Phase 1

A marketing and lead-capture site for a Zambian-led, US-registered safari company. Cinematic trip pages, an enquiry pipeline that routes serious leads straight to the team, and a self-serve blog the owners run without a developer.

A Zambian-led safari outfit based in Nashville needed a front door that made people want to go and made it effortless to reach out. Phase 1 is about capturing the right enquiries and giving the owners full control of their own story, so the site keeps working long after I hand it over.

How it worksThe enquiry form is the business, so it is validated with Zod, written to Neon through Drizzle, and pushed to the team over SendGrid the instant it is submitted. The blog is a real CMS: owners author posts in a Tiptap rich-text editor, the HTML is sanitized server-side before it is stored, and cover images upload to Vercel Blob. Motion handles the cinematic feel without dragging the page down.
Fig. 04 · UI preview
Real Zambia Safari screenshot
Spec · 04Rev. 06·26
Status
Phase 1 · live
Scope
Leads + blog
Stack
Next.js · TS
DB
Neon · Drizzle
Mail
SendGrid
CMS
Tiptap editor
05 · Studio

Christmas Story Card.

Live · evolving

An AI-powered app that transforms guided questions into personalized Christmas cards with custom stories and professional voice narration.

I wanted to send my family something more meaningful than a generic card. So I built a way to generate a personal story, narrate it with AI voice, and share it as a digital card.

Where it's goingExpanding beyond Christmas to general-purpose StoryCard — weddings, baby announcements, Father's Day, sympathy, etc. Exploring physical cards with QR codes that link to the digital story.

Workshop side of that work is tracked on the Workshop page.

Fig. 05 · UI preview
Christmas Story Card screenshot
Spec · 05Rev. 04·26
Status
Live · pivoting
Stack
Next.js · TS
DB
Firebase
AI
OpenAI + ElevenLabs
Pay
Stripe
Next
QR cards
07 · Studio

F3 Queen.

Live · daily driver

A closed-cohort fat-loss accountability app I built for myself and a small group. A sub-60-second daily check-in for weight, water, workouts, and macros feeds a private cohort feed, personal trend charts, and an automatic Slack recap.

This one is mine. I wanted real accountability for a cutting season without another bloated fitness app, so I built the tool I actually wanted to open every morning. I still use it daily, and it has worked: my BMI and body fat are down while I am eating well instead of starving myself. Sustainable, not miserable. That was always the point.

Why it sticksThe whole thing is built around a daily check-in that has to take under a minute or no one sticks with it. Onboarding runs BMR and TDEE math to set each person's targets, per-PAX feature flags let me turn pieces on for one person at a time, and the cohort feed redacts private numbers so accountability never becomes comparison. Each cohort connects its own Slack workspace through OAuth, and those tokens are encrypted at rest before the nightly recap posts itself.
Fig. 07 · UI preview
F3 Queen screenshot
Spec · 07Rev. 05·26
Status
Live · daily driver
Cohort
Invite-only
Stack
Next.js · TS
DB
Neon · Drizzle
Slack
Auto-recaps
Result
BMI + fat down
08 · The shelf

Didn’t ship.
Still taught me something.

Killed, not hiddenNotes keptNo ego
01 · ShelvedStill live

Summit Habit Tracker.

A goal-oriented habit tracking app with daily tracking, progress visualization, and gamification elements.

I wanted a habit tracker that made progress feel rewarding. Built it, used it, and explored gamification patterns that later became core to Biblical Battle Plans.

What it taught meSolving your own problem is necessary but not sufficient — you also need a reason why YOUR version should exist when 50 others already do. The gamification patterns I explored fed directly into Biblical Battle Plans, so the work wasn't wasted.
“Both outcomes are fine.”

Some builds become products. Some become lessons. Either one is a win if you learned the right thing from it.

The Shelf is here on purpose — it keeps me honest about what I actually finished vs. what I wanted to. Killing a project cleanly is its own skill, and it’s one I’d rather practice than hide from.

More shelf entries live on the Workshop page, where things get parked before they move here permanently →

09 · What’s next

See what’s on the bench right now.

Studio is the shipped work. Workshop is what’s currently being made — active builds, a running field log, and the shelf of parked ideas. Or, if you’ve got something broken, let’s talk directly.