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. The page keeps two ledgers: the products I built because the problem wouldn’t leave me alone, and the builds somebody paid for because it wouldn’t leave them alone either.

05own products

04client builds

01on the shelf, with notes

Moreactive builds · see Workshop
01 · Own product

Advantage Sports.

Live · 1,500 families

My first multi-tenant product: a league-operations platform built from scratch for youth sports. Registrations, payments, scheduling, team formation, standings, and communications, now opening from a single flag-football league to more than one operator.

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. It started as League-OS running the Advantage Flag League, and the rebrand to Advantage Sports opens that same platform to more than one operator.

Why it existsMost of the platform 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
Advantage Sports screenshot
Spec · 01Rev. 08·26
Status
Live · shipping
Users
1,500 families
Stack
Next.js · Drizzle
DB
Neon Postgres
Pay
Stripe
Host
Vercel
02 · Own product

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. That API layer is now earning its keep a second time, because a native iOS client is being built against the same contracts the web app uses: onboarding, the campaign reading flow, the dashboard, and journal reflections, all reading from one source of truth instead of a second implementation of the rules.
Fig. 02 · UI preview
Biblical Battle Plans screenshot
Spec · 02Rev. 08·26
Status
Live · v2 + iOS
Users
100+ growing
Stack
Next.js · TS
DB
Neon · Drizzle
Host
Vercel
Story
Wall → rebuild
03 · Own product

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. 03 · UI preview
Christmas Story Card screenshot
Spec · 03Rev. 04·26
Status
Live · pivoting
Stack
Next.js · TS
DB
Firebase
AI
OpenAI + ElevenLabs
Pay
Stripe
Next
QR cards
05 · Own product

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. 05 · UI preview
F3 Queen screenshot
Spec · 05Rev. 05·26
Status
Live · daily driver
Cohort
Invite-only
Stack
Next.js · TS
DB
Neon · Drizzle
Slack
Auto-recaps
Result
BMI + fat down
06 · Client build

Stunt Dudes.

Live · touring

A tour-poster site and admin CMS for a professional BMX and skateboard stunt team that performs at school assemblies, festivals, and ministry events. Shows, a media gallery, a tour schedule, and a booking form that reaches the right person, all editable by the team without a developer.

The act is loud, physical, and genuinely impressive, and their Wix template made it look like a hobby. A stunt team gets booked because a promoter or a principal watched thirty seconds of footage and believed it, so the site's whole job is to carry the act and then get out of the way of the booking.

How it's builtThis is the ShirePath AWS pattern in its cleanest form: a Next.js container on Lambda behind CloudFront, Terraform in the repo, and OIDC deploys with no long-lived keys anywhere. Gallery photos upload straight to S3 through presigned PUTs and are served back through the CDN at a path the app owns, so the image optimizer never sits in front of a photo that is already the right size. The admin is one seeded account with no public signup, and it forces a password change on first sign-in, because a seeded credential nobody ever rotates is not a credential. Outbound mail is authenticated for the domain, so a booking inquiry lands in an inbox instead of a spam folder. The whole site also runs in containers locally: Postgres behind the Neon proxy, a mail catcher, an object store, and a Caddy front door, so nothing about developing it needs a real credential.
Fig. 06 · UI preview
Stunt Dudes screenshot
Spec · 06Rev. 08·26
Status
Live · shipping
Scope
Site + CMS
Stack
Next.js · TS
DB
Neon · Drizzle
Host
AWS Lambda
CDN
CloudFront
07 · Client build

TCL Auto Detail.

Live · taking quotes

A marketing site and admin CMS for a mobile auto detailing business in Tuscaloosa, Alabama. The detailer drives to the customer, so the site's only job is to price the work plainly and turn a search into a quote request.

A one-truck detailing operation does not need a platform. It needs to be found, to be trusted in about eight seconds, and to get a quote request into a phone that is currently under someone's dashboard. Everything else is overhead the owner pays for and never uses.

The interesting partSame Lambda and CloudFront pattern as the rest of the shop, and the interesting work was all about cost at the bottom of the traffic curve. Crawlers were waking a serverless database on every pass, so public HTML is cached at the edge and the origin stops being part of the read path for anonymous visitors. A Lambda frozen long enough loses its database socket, so reads retry rather than serving an error to whoever showed up first that morning. Reserved concurrency is capped, so a burst cannot fan out into a database bill the owner never agreed to. Quote requests go out over SendGrid to the detailer and back to the customer as a confirmation.
Fig. 07 · UI preview
TCL Auto Detail screenshot
Spec · 07Rev. 08·26
Status
Live · shipping
Scope
Site + CMS
Stack
Next.js · TS
DB
Neon · Drizzle
Host
AWS Lambda
Edge
HTML cached
08 · Client build

Journey to Jericho.

Live · launched

A mission site for a faith-based mentorship ministry in Columbia, Tennessee that fathers the fatherless through the work of a motor shop. One page carries the whole model: the mission, a seven-pillar formation track, a twelve-badge growth system, and mentor, mentee, and volunteer paths that route real applications to the team.

A local ministry a few minutes from my own shop needed a front door that could carry a heavy mission without feeling heavy: tell the story, explain the program, and let a mentor, a family, or a volunteer step in without friction. The whole point of the ministry is showing up for young men, so the site had to do the same the moment someone was ready.

How it's builtBuilt as a React and Vite single-page site, prerendered per route so every page ships real titles and Open Graph tags, then served as static files from AWS S3 behind CloudFront. There is no server to babysit and nothing to patch: the whole site sits a cache hop from every visitor, which is exactly what a small ministry budget wants. Mentor, mentee, and volunteer calls to action open intake forms, and a synced Instagram feed keeps the events section current without anyone touching code.
Fig. 08 · UI preview
Journey to Jericho screenshot
Spec · 08Rev. 07·26
Status
Live · launched
Scope
Mission site
Stack
React · Vite
Host
S3 · CloudFront
Render
Prerendered
Client
Maury County ministry
09 · Client build

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. 09 · UI preview
Real Zambia Safari screenshot
Spec · 09Rev. 06·26
Status
Phase 1 · live
Scope
Leads + blog
Stack
Next.js · TS
DB
Neon · Drizzle
CMS
Tiptap editor
10 · 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 →

11 · 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.