Skip to content

Small software,
built properly.

I keep a telecom app running by day, and build sharply scoped tools on my own hardware at night.

Kin Rai Dee, showing a single large button that draws one Thai dish
Kin Rai Dee, one button that answers what to eat. Open it.

Eight things I built and still use.

Five of these are running right now, on a single board computer under my desk or on a free tier. The other three are finished and unpublished.

Haan Gan

หารกันBuilt

Splits a Thai restaurant bill the way people actually eat, with dishes shared across the table by default.

Haan Gan start screen offering a quick even split or an itemised table

Service charge and VAT are applied in the order a real Thai bill applies them, prorated by consumption. Tests assert every share sums to the exact total.

  • Cloudflare Workers
  • Durable Objects
  • WebSockets

Yoo Nai

อยู่ไหนRunning

A household document vault. People are rows, document types are columns, and any document is two clicks away.

Nothing is ever deleted. A renewal supersedes the old copy, because a family archive that can lose things is not an archive.

  • Python
  • FastAPI
  • SQLite
  • Docker

Health Trainer

Running

A Telegram bot that logs Thai meals, weight and workouts, estimates macros, and sends a weekly chart.

The language model only parses input. Every value it returns is revalidated before storage, and the bot still works with the model switched off.

  • Python
  • aiogram
  • SQLite
  • matplotlib

Nihongo LMS

Built

A JLPT study system from N5 to N2. Set a target level and an exam date, and it paces the work backwards from there.

Nihongo LMS welcome screen asking for a target JLPT level and exam date

Nothing is tested before it is taught. An unseen item is introduced on a card that asks nothing first.

  • TypeScript
  • Go
  • Static

Hermes

Running

A Go command that pings my services, checks container health over SSH, and writes a daily summary of what changed.

It messages me only when something is wrong. A monitor that reports success every ten minutes trains you to ignore it.

  • Go
  • Ollama
  • cron

Thuk Mai

ถูกไหมBuilt

Checks Thai government lottery tickets against any draw going back to 2022, with no backend at all.

Neighbour prizes wrap, so first prize 999999 makes 000000 a winner. A naive plus or minus one silently denies a real payout.

  • JavaScript
  • GitHub Actions
  • Static

How these get built.

Words before code
Every project starts with a file that fixes its vocabulary, including the synonyms that are not allowed. The words in that file are the words in the code, so a rename is a decision rather than a refactor.
Decisions are written down
Numbered decision records sit next to the source. Most of them record what was deliberately left out: no delete, no OCR, no reminders, no cross-day tracking. Knowing why something is missing is worth more than knowing it is missing.
A pure core, an untidy shell
The domain logic is pure functions with all of the tests. Anything that touches a network, a clock or a disk lives in a thin layer around it. A bill split can be tested without a browser and a bot can be tested without a token.
Models are a convenience, not a dependency
Language models parse messy input and nothing more. Their output is revalidated before it reaches storage, and every one of these tools still runs with the model turned off, at no cost.

Purich Seenuallae, who builds them.

Computer Engineering at Chiang Mai University, production operations for a Thai telecom, and a competitive programming habit that peaked at first in the country.

Pooh