This post is part of my entry for the Kiroween 2026 hackathon. #KiroweenHackathon26
The problem
Walk through any Malaysian pasar and you'll see it: the red-and-blue Buku 555 notebook. For decades, market traders have used it to track hutang, the credit they give regular customers. "Kak Ros, two kilos of kembung, pay Friday."
But paper has problems. It gets wet at the fish stall. Pages tear and get lost. And the hardest part isn't the bookkeeping, it's the awkward moment of asking a neighbour for money.
So for Kiroween's Resurrection category, I brought the Buku 555 back from the dead as Buku 555 Berhantu, the haunted debt book.
What it does
- The trader speaks or types an entry in Bahasa Melayu, like "Kak Ros ambil 2 kilo kembung RM18, bayar Jumaat"
- A Malay parser pulls out the customer, item, amount in RM and the due day, including honorifics, Malay number words and phrases like "hujung bulan"
- The book shows who owes what and the total outstanding
- Overdue customers get haunted by a friendly ghost 👻
- One tap prepares a polite reminder in WhatsApp. The trader always presses send, nothing goes out automatically
- Marking a debt paid exorcises the ghost
I designed it for a 60-year-old fish seller on a cheap Android phone at 5am: Malay first, big tap targets, no login, no server, and it works offline once installed.
How Kiro built it
I used the Kiro CLI for the whole build, and the biggest change for me was working spec first instead of vibe coding.
-
Steering first. Before any code, I wrote steering docs in
.kiro/steering: Malay-first copy, no server or tracking, big buttons for older traders. Kiro kept referring back to them, so it never drifted into adding a login screen or an English-only UI. -
Specs. Kiro turned my idea into three spec files:
requirements.mdwith EARS-style user stories (WHEN, THEN, SHALL),design.mdwith the data model, the parser grammar and correctness properties, andtasks.mdwith tasks T-1 to T-27. Kiro then worked through the tasks one by one. -
Agent hooks. Two hooks did a lot of quiet work.
run-tests-on-saverunsnpm testwhenever a.jsfile changes and fixes failures without weakening the tests.i18n-checkmakes sure every string ini18n.jshas both Malay and English. -
Property-based testing. The correctness properties in
design.mdbecame fast-check tests. For example: an amount is never negative, the total outstanding always equals the sum of unpaid entries, marking one entry paid reduces the total by exactly that amount, and export then import keeps every entry. These caught edge cases that a few hand-written unit tests would have missed.
What I learned
Spec-driven development felt slower for the first ten minutes and much faster after that. Because the requirements and properties were written down, Kiro could check its own work, and I spent my time on the parts that matter: how a trader actually talks, and how to make chasing a debt feel less awkward.
Try it
- Demo: https://apihpih96.github.io/buku-555-berhantu/?demo=1
- Code: https://github.com/Apihpih96/buku-555-berhantu
Open the demo, tap the reminder button on Kak Ros, and watch the ghost do the awkward part for you.
Hantu hutang paling menakutkan. The debt ghost is the scariest ghost of all.
Top comments (0)