Portfolio

Things you can actually look at.

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.

TravelCanvas

Co-founder · 2026 – present

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

Visit TravelCanvas · Read the case study

  • The advisor builds, day by day
  • Bookings arrive by email
  • Publishing a draft
  • Where travellers actually read it
  • The client decides
  • Advisor and client, one thread
  • Native where it matters

Giftly

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

Visit Giftly · Read the case study · 4 more from this engagement

  • Checkout, delivery step
  • Two gifts, one order
  • The other half of the product
  • Building a multi-place gift
  • An invitation to someone else's occasion
  • Recommendations, and what they were built from

The rest of it

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.