03Client work, 2026
Dodo Dots Masterclass
An entire box office, built from zero.
- What it is
- Full-stack, Events & ticketing
- Built with
- Next.js, TypeScript, SQLite, Stripe / HitPay / Billplz, QR check-in
- Where it lives
- Built for a live event — runs locally with a mock payment provider
The best parts
- Read, buy, pay, register, get a QR ticket, get scanned at the door: one system, end to end
- Swap between Stripe, HitPay and Billplz without touching the checkout
- A staff dashboard that runs check-in on the day
- About ninety design tokens re-theme the whole site from one file
How it came together
The event site and ticketing system for a two-day social media masterclass. Not just a landing page — read, buy, pay, register, get a QR ticket and get scanned at the door, plus the staff dashboard that runs the room on the day.
The problem
An event needs more than a page that looks good. Someone has to buy a seat, get a ticket and be let in at the door — and on the day, the staff need to know who has actually turned up.
The approach
Build the whole journey as one system instead of stitching a landing page onto a third-party ticketing tool. One site owns the pitch, the payment, the registration, the ticket and the door.
How it’s built
Next.js App Router with SQLite behind it. Ticket tiers and seat counts drive a live order summary; the payment layer is provider-agnostic — mock, HitPay, Stripe or Billplz — so it can be built offline and switched over for real money. After payment each attendee registers and is issued a QR ticket, and a staff dashboard scans those at check-in.
What shipped
A complete read → buy → pay → register → ticket → scan flow, with an admin side for orders, attendees and check-in. The design system is about ninety custom properties, so the whole site re-themes from one file.
What I took from it
The unglamorous parts are the product. The landing page took a day; making sure a paid seat reliably becomes a scannable ticket is where the real work was.



