Software Engineer · Sydney / Remote
Confirmed

I build interfaces
for software that’s
actually complicated.

Ten-plus years in frontend engineering, most recently owning the UI for a QA automation platform and its AI-assisted test-authoring tools. I like problems where the interface has to carry real complexity.

Shipping since2008
from idea to production
Last roleSenior FE Eng
product-focused startup
Stack todayTS · Next · Tailwind
production defaults

Shipped, then reconsidered.

Each project reached real users and left something I'd approach differently. Click any row to unfold the case study.

Event duration
15 days
Audience
EN + JA
TypeScript · Next.js · Chakra UI · Cloudflare R2 · Tiltify API
1Problem

Tiltify's campaign page shows a running total and a simple feed of recent donations. Support comes in surges, with certain moments driving far more activity than others. Nothing in the default view lets you see that shape, search the history, or understand what caused the spikes.

2Approach

Start with a real-time feed and searchable history, then grow the scope incrementally based on what viewers actually wanted. Layer in analytics to surface when support spiked and what drove it. Add a journey section with the story behind each day on the road.

3Decisions
Cloudflare R2 snapshots
Handles rate limits and traffic spikes during the event without relying on live API calls.
Webhooks + SSE
Tiltify events flow into SSE with polling as fallback, giving an instant feel on the live feed.
Custom i18n
Hook-based translation system with no external library, zero overhead for two locales.
Dual pipeline cadence
Frequent during event hours, slower off-peak, stays within API quota limits.
4Shape
Cyclethon dashboard screenshot
Exhibit A · Cyclethon donation dashboard
5Outcome

The journey section ended up carrying the most detail: day-by-day notes from the road, alongside the running total. A per-day donation trend chart would have made the rhythm of each day's support visible at a glance.

6What I'd change

The real-time layer uses an in-memory EventEmitter to broadcast webhook events to SSE clients. On Vercel's serverless runtime this breaks across function instances. A lightweight pub/sub layer like Upstash Redis would make live delivery reliable at scale.

Side projects, actually finished.

Each one started because I needed it myself. Fully deployed and open source, not left half-built in a repo.

Interval Coach screenshot
Ref. INT-COA

Interval Coach

A mobile-first tool for running coaches to manage live interval training sessions. Track intervals, capture split times, and review session summaries with no backend and full offline support.

Vue 3TypeScriptPiniaTailwind CSS
Todo App screenshot
Ref. TOD-APP

A privacy-focused task manager where your data stays yours. Uses the remoteStorage open protocol to sync across devices through your own storage account, not a third-party server.

React 19TypeScriptremoteStorageChakra UI
Pace Calculator screenshot
Ref. PAC-CAL

Pace Calculator

A mobile-first utility for runners and coaches to plan target paces for any race distance, calculate finish times, and convert between pace and speed. Runs fully offline with no backend.

Vue 3TypeScriptPiniaTailwind CSS

Get in touch.

Frontend engineering, from zero-to-one builds to interfaces that carry real complexity.

Confirmation ticketSettled
Location
Sydney · AEST
GitHub