Most of what I build is backend and platform work with no surface to show — that lives in Work, written up as decisions. These two are consumer products, so here they are.
A travel itinerary platform built advisor-first. An advisor builds a client's trip and publishes it; the client reads it on their phone, chooses between the options offered, and adds their own notes as they travel.
Domain model and permissions — membership rather than ownership decides who can do what, and a person on a trip needs no account.
Backend architecture: a Hono API over PostgreSQL with Drizzle, Redis and BullMQ for background work.
Separate traveller, advisor and admin applications over shared data-access, permissions and UI packages — plus the iOS app, a Capacitor shell with a one-command App Store release pipeline.
The booking import pipeline: forward a confirmation email or upload a PDF, Claude extracts the items, and nothing lands on a trip until someone approves it.
Trip messaging — planning, travel-party and per-item threads whose rosters derive from trip roles, live over server-sent events.
TypeScript · Vue 3 · Vite · Capacitor · Hono · PostgreSQL · Drizzle · Redis · BullMQ · Claude API
Consulting, via Solve Consulting LLC · 2022 – present
A consumer gifting product — buy a gift card to any place, send it, redeem it. I led the rebuild of the buyer experience, and have been brought back since for successive workstreams — the calendar, contacts, and gift recommendation systems built on top of it.
Led the consumer rebuild — checkout, redemption, and account moved off ERB and AngularJS onto Vue pages, one flow at a time behind experiments. I wrote the technical spec and was the largest single contributor to a frontend several engineers shared.
Built the recipient side end to end: the gift landing page, four ways to take the money out — bank transfer, PayPal, a mailed cheque, a virtual card — and the thank-you note back to the sender.
Took friction out of the buyer path: checkout state moved off the client and onto the backend, a multi-item cart shipped on top of it in staged rollouts, and the password removed entirely in favour of a magic link or a typed code.
Built the buyer's self-service tools — order status, resend, cancel even after a gift is opened, buy again — which took a whole class of request out of the support queue.
Built multi-place gifts: city-scoped place search and category chips in the customizer, composing several businesses into one card, and the product pages behind them.
Primary author of the calendar and contacts systems — recurring events, invitations and a reminder pipeline that materialises scheduled instances for email and SMS; contacts that hold interests and locations on the recipient's own profile, including people who never sign up.
Wrote the gift recommendation engine, effectively alone: interest and tag matching over embeddings, local place search, and a deterministic bucket ranking that replaced a blended score.
Built the internal fraud review tool — a decision surface with claiming, reviewer feedback, and signal grouping — and the pipeline that assembles chargeback evidence for Stripe.
Ruby on Rails · TypeScript · Vue 3 · Inertia · UnoCSS · PostgreSQL · Sidekiq · Stripe API · Twilio · Claude Code
Provider data models, ACH pipelines, dispute systems, a payments architecture inside somebody else's monolith — none of it screenshots, and most of it is behind an NDA. It's written up in Work instead.