Projects

Five open-source projects you can use right now, followed by products I built or led for employers and clients. Client code stays private, so those are shown with screenshots and a description of my part.

Demos run on free hosting and sleep when idle. The first load can take about 30 seconds.

Onsale

A ticket onsale engine for when thousands of people want the same seats

A virtual waiting room, all-or-nothing seat holds and idempotent checkout, rebuilt in the open from the problems I worked on in production ticketing.

  • Redis + Lua waiting room admits buyers in arrival order at a fixed rate, so the seat map and payments only see as many shoppers as they can serve.
  • Picking four seats holds all four or none in one atomic step; holds expire on their own.
  • Checkout is idempotent: a double-click or dropped connection replays the first result instead of charging twice. A Postgres constraint makes selling a seat twice impossible.
696/696
seats sold in ~20 s to 2,000 simulated buyers
0
seats sold twice, audited in Postgres after every run
0
unexpected errors in 24,251 requests

TypeScript, Fastify, Redis + Lua, PostgreSQL, React, k6, Prometheus, Grafana

Onsale seat map with four seats held and a five-minute hold timer

VoiceBrief

Meeting notes you can check, with every item linked to where it was said

Record a meeting and get decisions, action items and open questions. Ask questions across all your meetings and get answers with a citation for every claim.

  • Every note carries evidence: the model cites transcript lines, and a grounding pass drops anything that cites lines that don't exist or names an owner who never spoke.
  • Hybrid retrieval (keyword + vector, fused by rank) answers questions only from cited excerpts, or says plainly that something wasn't discussed.
  • Transcripts are treated as data, not instructions, and an evaluation harness scores the pipeline against hand-labelled meetings.

Next.js 16, TypeScript, Whisper, LLM structured output, Embeddings / RAG, pgvector

VoiceBrief meeting notes beside a ruled transcript with the cited line highlighted

MediaVault

A shared media library for creative teams, built as a real multi-tenant SaaS

Teams upload pictures, video and PDFs straight to storage, find them by title or tag, collect selects and send clients expiring links.

  • Each team's data is isolated by Postgres row-level security, so a careless query returns nothing rather than another team's files.
  • Uploads go straight from the browser to object storage with signed policies; a background worker checks each file really is what it claims and renders thumbnails.
  • One role and permission table is shared by the API and the UI, and a test spells out every role and action pair.

TypeScript, Node.js, PostgreSQL RLS, S3 / MinIO, Background jobs, React

MediaVault library showing a justified gallery of a studio's pictures

Groundwork

Survey and CAD data in the browser, measured to the millimetre

Open LandXML terrain and DXF site plans, then measure distances, areas, long sections, stockpile volumes and cut/fill against a design. Everything runs on the visitor's machine.

  • Coordinates stay in float64 and only move to a local origin at the GPU, so readings at E 411 020.373 are exact instead of snapping to 6 cm.
  • Volumes against a plane are exact (triangles are clipped where they cross it), and cut/fill between two surfaces is checked against the exact result in tests.
  • A grid index answers a million elevation lookups in 0.2 s; parsing and volumes run in a Web Worker so the 3D view never stalls.
40
tests checked against answers known in advance
0.12 s
cut/fill between 29,000 triangles of ground and design
0
bytes uploaded: files never leave the browser

TypeScript, three.js, Web Workers, React, LandXML, DXF, Vitest

Groundwork showing a cut and fill heat map on terrain with a long section through ground and design

ShelfSync

A point of sale that keeps selling offline and never loses or doubles a sale

Two tills and a back office. Switch a till's network off, sell, switch it back on, or watch both tills sell the last mug while offline and see how the conflict is resolved.

  • Tills save every sale to an outbox in IndexedDB first and sync what happened ("sold 1"), not stock levels, so sales from several tills never overwrite each other.
  • Sync is idempotent and ordered: replays get the server's first answer, and a per-store advisory lock keeps sequence numbers gap-free so no till misses a change.
  • A sale that already happened is never refused. If it takes stock below zero it is kept and flagged for a recount, and a recount keeps other tills' sales instead of erasing them.
200
random chaos runs (offline tills, lost and duplicated requests) that all converge
0
sales lost or counted twice across 24 concurrent syncs
22
tests against a real Postgres, run in CI

React, TypeScript, IndexedDB, Express, PostgreSQL, Netlify Functions, Vitest

ShelfSync with two tills and a back office asking for a recount after both tills sold the last mug

Production and client work

Hover or tab onto a screenshot to scroll through the page.

Paciolan home page: integrated ticketing, fundraising and marketing for college athletics, performing arts and arenas

Enterprise ticketing

Paciolan

Full-stack engineer, FullStack Labs, 2022–2026

Checkout, payments and onsale features for a ticketing platform behind the box offices of US college athletics and live events.

  • Built payment schedules for season-ticket donations across cart, order, checkout and confirmation; launched to seven Division I athletic programs behind a feature flag I rolled out.
  • Shipped all-included ticket, donation and fee pricing across event pages, seat maps and mini-cart, used in onsales of ~3,000 tickets in 15 minutes with 4,000+ people queued and no reported issues.
  • Moved order confirmation from REST to GraphQL, added Prometheus metrics and Grafana alerts, upgraded Node.js 20 to 24, and closed an SSRF/input-injection hole.

React, Next.js, TypeScript, Node.js, GraphQL, AWS, Nightwatch, Prometheus, Grafana

Visit paciolan.com
Vonza marketing site: the easiest way for creators to monetize their business

All-in-one creator platform

Vonza

Senior engineer and team lead, Innovation Insight, 2019–2021

Website builder, funnels, scheduling, online courses and e-commerce in one platform for creators and small businesses.

  • Designed the architecture from scratch and wrote roughly 80% of the first production platform.
  • Led up to 10 engineers and worked with the CEO and CTO on subdomain routing, payments and scaling.
  • Added payment logging and recovery, reCAPTCHA and security middleware.

React, Next.js, Node.js, MongoDB, AWS, Stripe

Visit vonza.com
YayMaker home page: simple and stress-free event planning

Events marketplace

YayMaker

Senior engineer, Innovation Insight

Corporate, private and public event booking from the team behind Paint Nite.

  • Built real-time chat and Google Maps features and the services behind them.
  • Contributed to an online fitness streaming product with music during video calls.

React, Node.js, Real-time chat, Google Maps

Visit yaymaker.com
Alisa Schenk Photography home page with a carousel of family photos

Photography and doula business

Alisa Schenk Photography

Freelance, end to end

Portfolio, online booking, contact workflows and a blog for a birth photographer and doula.

  • Designed, built, deployed and supported the site, including the booking and content tools the owner uses herself.

React, CMS, Booking, Netlify

Visit alisaschenkbirth.com
H&S Electric and Solar home page with a residential solar installation

Electrical and solar contractor

H&S Electric & Solar

Freelance, end to end

Marketing site plus the internal tools the company runs on: employees, hiring, training courses and content.

  • Built employee, hiring, course and content management behind a staff login.

React, Node.js, CMS

Tiffany Hinkson Photography home page

Family photography

Tiffany Hinkson Photography

Freelance, end to end

Portfolio, pricing and booking for a family photographer.

  • Built the portfolio, pricing and booking pages and handed over content editing to the owner.

React, CMS

Photobank home page: find photos that match your face, with galleries from recent events

Face search for event photos

Photobank

Senior engineer, Renesis Tech, 2021

Runners and riders upload a selfie and find every photo of themselves across an event's galleries.

  • Delivered the product end to end in two months.
  • AWS Rekognition face search across S3 galleries; Lambda thumbnails with per-photographer watermarks.
  • Designed a reusable Stripe payments microservice used across company projects.

Next.js, Node.js, AWS Rekognition, S3, Lambda, Stripe