Projects

Things I built for myself and the people around me, most of them still running.

Household finance suite

2026 · Active · private
  • Build
  • Guard
  • Measure
  • Operate
The problem
Our household's money sits across several accounts and currencies, and answering a simple question meant opening a spreadsheet or building another chart.
What I built
A private app that tracks net worth daily, reads bank alert emails with a small language model, and gives Claude narrow read and write tools over MCP, with permissions enforced in the database.
What I learned
Measuring the classifier showed our own correction history was right 90% of the time and the model 58%, so the app stopped interrupting us about the first group.
  • Next.js
  • Postgres RLS
  • MCP
  • Claude

Have Haze Not

2026 · Active · public TRMNL recipe
  • Build
  • Measure
The problem
During haze season the first thing we check each morning is the air, and I wanted that on the e-ink display on the shelf instead of in an app.
What I built
A TRMNL recipe with no server: the display polls public APIs, and Liquid templates draw a halftone map of Singapore's five regions, the current reading and a 24-hour forecast.
What I learned
Most of the work was choosing which number to show. The hourly reading answers whether to open the window now, and the daily average does not.
  • Liquid
  • Python
  • SVG
  • pytest

Home Assistant add-ons

Ongoing · Active

Custom add-ons that run our home: InventoryBot (barcode-scanner stock tracking), BabyBot (feed and care log), FlightBot (ADS-B receiver on an RTL-SDR stick) and ChoreBot (tablet chore tracker that alerts Home Assistant when something is overdue). Images are published to GitHub Container Registry.

  • Home Assistant
  • Docker
  • GHCR

WeDo

2022 · Maintained

Invitations, RSVPs and door check-in for our wedding. Rewritten in 2026 on Next.js 16 and Prisma 7, with Slack RSVP notifications.

  • Next.js
  • Prisma
  • Auth0

SpendBot

2024 · Retired · precursor to the finance suite

Our first expense tracker: a Telegram bot that read receipt photos with GPT models and a web dashboard. What we learned from it became the household finance suite.

  • Next.js
  • Telegram
  • LLM extraction

SG Vaccine Tracker

2021 · Archived

Showed how many Singaporeans were fully vaccinated before official percentages existed. Lambda scraper, DynamoDB, and a Twitter bot that drew progress in Mahjong tiles.

  • AWS Lambda
  • DynamoDB
  • React