CleanCode
Contact
WorkServicesBlogAbout
CASE 02 · F&B / Loyalty & game · 2026–present

Mona.

A leaderboard and a game for Medan’s first moon café: regulars see where they rank, and every coffee grows their creature.

CLIENT
Mona Coffee Co.
SERVICES
Web · Backend · Hosting
TIMELINE
Aug 2026 – ongoing
STACK
Laravel Blade, Tailwind CSS, Laravel, Node.js, Docker
Mona hero
AT A GLANCE
Every 5 minutes
Rankings and best-sellers refresh from the till
12 Moonies
One creature for each zodiac sign
Rp1,000 = 1 coin
Every purchase at Mona earns Moon Coins
QR duels
Two phones, one fight, nothing to install

THE PROBLEM

Mona is a moon-themed café in Medan with two outlets, open from morning coffee until late. Its regulars earn loyalty points and climb tiers named after the moon’s phases.

But the points lived in the till, where only staff could see them. A regular couldn’t tell how close the next phase was, or who else came back as often.

WHAT WE BUILT

A website that reads the till.

storyofmona.com ranks the regulars by points and shows the house favourites and moon-phase tiers, straight from the café’s sales. Regulars appear as a first name and an initial. Phone numbers and emails never leave the till.

A game paid for in coffee.

In Moonies, each customer hatches a zodiac creature. Every Rp1,000 spent at Mona pays a Moon Coin to the player who linked that phone number. Coins buy experience, duel energy and boosts. A refund takes them back.

Quests that bring them back.

Quests renew daily and weekly. The ones marked with a cup can only be done at the café, like one bill of Rp100,000 or more today.

Duels across the table.

One player shows a QR code, the other scans it, and both phones play out the same fight.

Nobody can cheat the arena.

Every fight and every coin is settled on the server, never on a player’s phone.

THE RESULT

Both are live at storyofmona.com and moonies.storyofmona.com. The Hall of Fame and the Moonies arena update themselves. Nobody at Mona edits a page.

Both read their numbers from Rubicon, the point of sale Mona runs on.

STACK

Everything that shipped.

FRONTEND
Laravel BladeTailwind CSSJavaScript (ES modules)
BACKEND
LaravelNode.jsMySQLRedisRubicon Partner API
REALTIME
Server-sent events
INFRASTRUCTURE
DockerGitLab CI/CDVPS
(Let's talk)

Need something like this?

Tell us what's broken or what you want to build. We'll reply with what we'd make and what it would take.

Start a project

Tell us what you need.

Pick what fits and add a line or two. It becomes an email you send from your own mail app.

What do you need?
When would you like to start?

Nothing leaves this page until you press send in your mail app. Nothing opened? and send it to .