Every book in Cambodia's primary school curriculum, on a screen that never closes. Students read, or listen along to the narration. Hours on the page earn points, trophies, and a place on the class leaderboard. Every minute adds up into a national picture of a country learning to read.
A whole class reading at the same time.
full-stack developer
live
Built for the Primary Education Department at the Ministry of Education, Youth and Sport.
Books come with an audio track beside the text, so a student still building fluency can listen and follow the words at the same time.
02
Every minute counted
Time on the page is tracked per student and per book, which is what turns a library from a shelf into a habit somebody can measure.
03
Leaderboards and trophies
Reading time and scores become rankings, achievements, and trophies. Finishing a book stops being homework and starts being something to win.
04
Reports up the chain
Activity rolls up from school to district to province to country, so education officers see the picture without collecting forms.
QUIZMEDIX
“Sit the exam before you sit the exam.”
Exam preparation for Cambodian university students in medicine and health science. Question banks are organised by university, faculty, year, and semester, and every session ends with a rationale for each answer, peer benchmarking, and a map of the topics still to work on.
Built for medicine, health science, and biomedical study paths.
full-stack developer
live
Built for university students across Cambodia's medical, health science, and biomedical programmes.
Questions are organised by university, faculty, year, and semester, so a student practises what their own programme actually sets.
02
Three ways to sit it
One question at a time, full scroll, or a timed simulation that holds the same pressure as the real paper.
03
Explanations, not scores
Every choice carries a rationale and a peer benchmark, so a wrong answer teaches something instead of just costing a mark.
04
Mastery tracking
A consistency heatmap and per-subject mastery surface the weakest topic well before the exam does.
SCHNEITEC
“Every megawatt accounted for.”
The operations platform for SchneiTec's solar farms. Each day a plant reports its meter reading, yield, irradiation and losses. The system scores performance against target, traces faults down to a single inverter input, and turns every alarm into a ticket somebody owns. Six hundred megawatts, watched one day at a time.
Solar, wind, and the grid they feed.
full-stack developer
live
Built for SchneiTec, Cambodia's largest renewable energy developer — over 600 MW of solar built and operated in-house since 2015.
Meter reading, yield, irradiation, loss and weather logged per plant per day, so a bad week has an explanation instead of just a number.
02
Performance against target
Performance ratio is scored against the 80% target daily, so a plant drifting below it surfaces that morning rather than at month end.
03
Down to one inverter
Diagnosis reaches individual units and DC inputs. A single string isolated on one inverter stays visible instead of being averaged away.
04
Alarms become tickets
Every fault opens a ticket with readings due and an owner, so nothing quietly stays broken between site visits.
~ $ cat stack.txt
The stack, top to bottom
Read down and you are following a request through the system. The tools are the easy part — what follows each one is why it is there.
01
interface
Server-rendered by default. Client state only where it has to live, because every hook I ship is weight somebody downloads.
02
api
Modules before microservices. One deployable until traffic argues otherwise — a distributed system you did not need is just latency you chose.
03
services
Node is where I am fastest, not where I stop. Picking the runtime a problem already has an ecosystem for beats bending the one I know.
04
data
Postgres holds the truth. Redis holds what is hot. ClickHouse answers the questions Postgres should never be asked.
05
events
Anything a user should not wait for leaves the request and comes back later. Reports, mail, exports — none of it belongs in a response.
06
runtime
The same image in development and in production, or the environment is the bug. K3s on my own hardware is where I learned what the managed platforms hide.
07
cloud
Managed until managed stops paying. Knowing what a platform does for you is the only way to know what it costs you.
08
delivery
Shipping is a pipeline, not an event. And if it is not graphed, it is not running — it is only assumed to be.
workbench
Still learning: how to make a cluster boring enough to ignore.