case study / 01 / product / saas
A SaaS for tutoring studios. One Next.js app becomes four products at the subdomain: admin, studio, client, and marketing, sharing auth, scheduling, and Stripe billing.
The four surfaces all route through one edge middleware: it reads the Host header, classifies the request, and rewrites into the right App Router segment.
Bookings carry both UTC and the studio's local time, so "10am for me, 1pm for my student" survives DST. Stripe webhooks generate per-booking invoices with idempotency keys on every write.
next app routerpocketbase typed collectionsmulti-tenant routingstripe checkout + webhooksplaywright e2e
case study / 02 / saas / sms automation
An SMS sales assistant for ClubReady gyms. New leads get a real reply in under a minute — Companion checks live availability and books the intro before staff get back to the desk.
The bot lives between Twilio and the ClubReady API. Inbound SMS hit a Next.js route, a state machine resolves intent (book, reschedule, ask), and the API call is wrapped with idempotency so retries never double-book.
Conversation memory and gym configuration live in PocketBase. Each studio gets its own tone, hours, and pricing, and operator overrides are tracked so "the bot said the wrong thing" turns into a fix in minutes.
case study / 03 / data / analytics
An open research tool for the Book of Mormon's textual history. Eight published editions are diffed at the character level, classified, and surfaced as charts you can filter by change type.
The pipeline imports BYU's word-aligned TSVs, reconciles edition references against the modern 1879+ chapter/verse scheme, and writes 16,566 verse-level deltas with categorical labels.
The analytics surface is a small set of typed React components reading from Postgres views — stacked bars, treemaps, and a KJV vocabulary comparison — all linkable down to the underlying verse pair.
case study / 04 / systems / imaging
A Tauri + Rust app that opens an image and shows which bytes make which pixels. This React demo keeps the core interaction: select bytes, see the image region, inspect structure, and inject faults.
The desktop build does the real work with custom JPEG and PNG parsers in Rust, a virtualized hex view, and decoded canvas overlays for block grids, scanlines, channels, and bitplanes.
The repair pipeline grafts headers from a known-good donor onto a broken entropy stream and tries common Huffman-table swaps until something decodes.
tauri 2rust parsersrepair pipelinefault injectionreact diagnostics
case study / 05 / product / membership
A subscription site for piano studios. Members get film outlines with scene-by-scene musical cues, leveled sheet music, and instructional video — built around a working director catalog and a real Stripe membership.
The catalog and the checkout were the two hard parts. Films, outlines, and sheet music share a single content model so a new title gets indexed everywhere — search, store, and the member dashboard — without copy-paste.
Stripe powers tiered memberships and one-off purchases; webhooks rebuild the entitlements table so "I just paid, why can't I download?" never happens. Auth and download URLs are signed and expiring.
case study / 06 / product / ecommerce
A small-batch concrete games shop with a brutalist printed-catalog feel. Each piece is poured, photographed, listed singly, and shipped in a small wooden crate — the site is the front counter.
Inventory is one-of-one by default, so the catalog is item-keyed instead of SKU-keyed. When a piece sells, it disappears from the front counter and reappears in the "already shipped" archive.
Checkout sets parcel, crate, or oversized shipping based on the cart's pieces; Stripe webhooks fan out to Resend for the order confirmation and to a packing list the studio prints before it cures the next pour.
case study / 07 / wasm / client-only
A full chess client, engine and all. Stockfish compiled to WebAssembly runs in a Web Worker beside the board, with no backend in sight.
The UI sends position fen ... and go depth ... over postMessage; the worker streams info lines back as Stockfish thinks.
Because the engine is local, the product works offline. The PWA shell caches the wasm binary on first visit, so the second open is instant on a plane.
case study / 08 / 3d / pipeline
A 2010 Unity jeep game lifted out of its engine and rebuilt in the browser. Python extracts the original assets; Three.js draws them; Rapier handles physics.
The hard part is making Unity-era content addressable without Unity. Every asset gets a canonical URI keyed by source bundle and path, and cross-references become JSON pointers.
The browser build validates terrain heightfields, cubemap sky, skinned characters, and vehicle physics end to end as the port grows past the original viewer.
case study / 09 / 3d / data
2.5 million real stars in a browser, drawn from the AT-HYG catalog. Drag to orbit. Star colors come from B-V index values, not vibes.
Loading 2.5M points the obvious way kills your frame budget. The trick is packing positions into one Float32Array, colors into a Uint8Array, and feeding both to one draw call.
Catalog data lives on Codeberg with Git LFS. A prepare script resolves pointers, downloads gzipped parts, and writes a compact binary the client can stream.
case study / 10 / 3d / play
An older portfolio that put the about page inside a Three.js room. The desk, the window, the wall art, and the chair all link out — moving the mouse parallaxes the whole scene.
The original is hand-modeled in Blender and rendered with a small Three.js scene; the embed above is the live gh-pages build, frame for frame.
It is the closest thing here to a personal artifact: a small navigable space whose objects are themselves the navigation, instead of a list of links.