Software Engineer · Sydney / Remote

Builds software
worth shipping
and standing behind.

Product-grade software across interfaces, systems, and the infrastructure between. Recent work spans consumer apps, developer tooling, and fast-moving product teams.

Shipping since
2008
from idea to production
Last role
Senior FE Eng
product-focused startup
Stack today
TS · Next · Tailwind
production defaults
§ Selected Work

Built with intention.

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. Build a journey section that goes beyond the numbers to capture the stories 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
5Outcome

What started as a simple donation feed evolved into a full event companion over the 15 days. The journey section became a highlight, going beyond donation numbers to capture the story of each day on the road. 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.

§ Engineering Playground

Built for the love of building.

Side projects that grew from a genuine problem or curiosity. Fully deployed and open source.

Interval Coach screenshot

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

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
§ Contact

Get in touch.

Zero-to-one product UI, design systems, and interfaces that reward real attention.

Location
Sydney · AEST
Elsewhere