Tholib Usman HanafiFullstack Engineer

Yogyakarta, Indonesia / open to Singapore

I build products from zero and lead the migrations that come after.

React Native / Next.js / NestJS / Laravel / IoT

Today I run a payment system doing around 2,000 transactions a day across 80+ laundry locations, on cheap branch internet, with nobody on site.

2,000+
transactions a day
80+
active locations
250+
employees served
2020
shipping since
Why me

More than what fits on a CV.

I shipped before AI wrote code

I wrote my first production code in 2020, four years before I graduated. Every system on this page was designed, fixed, and kept running by hand.

I led the migration, not just the tickets

I moved our stack from Laravel to React Native and NestJS, then was promoted from Fullstack Developer to Project Manager along the way, while still writing code.

I have worked across borders

Backend developer at a Singapore company, building a live platform for their client in Europe, on a team split across two countries.Zettabyte Pte Ltd / Singapore

01 / SCALE AND RELIABILITY

KRISPAY

Cashless payments for self-service laundry machines, running in 80+ locations on internet that drops.

Fullstack Engineer2022 to presentLaravelIoTMySQL
~2,000
tx / day
80+
locations
3 yrs
in production
The decision

A payment can succeed at the provider while the confirmation never reaches us. So every transaction carries a key the server recognizes on repeat, and the server asks the provider directly when no confirmation lands in time. Trade off: unfinished payments are held longer and reconciled by a job. I took it, because charging someone while the machine stays dead costs trust, not just money.

Read the full case study
smartkris.app/branches/jogja-04
Machine statuslive / 12 units
W-01
running
W-02
idle
W-03
running
W-04
error
D-01
running
D-02
idle
D-03
idle
D-04
running
TRANSACTIONS TODAY1,984
CustomerPembayaran QRISOur serviceidempotency keyretry queuereconcile jobPayment providerQRISDevice firmwareours, no vendorMachines80+ locationsconfirm, or ask directlyunlock commandmachine status: idle / running / error
Smartkris, the NestJS rebuild. Our own firmware, no outside IoT vendor in the path.

02 / DATA YOU CAN TRUST

Presein

HR and attendance for 250+ employees across branches. Clock ins that cannot be faked, then answers in plain language.

Fullstack Engineer2023 to presentReact Native ExpoLaravelOpenAI
250+
employees daily
3 to 5 days
paperwork removed / month
The decision

If clocking in is just a button, anyone can press it from anywhere. So the app checks location against the employee's own branch, asks for a photo, and handles fake GPS and changed phone clocks rather than believing the device. Trade off: people in weak indoor signal struggle to clock in. I took it, because attendance data you cannot trust makes every payroll decision built on it useless.

Read the full case study

Presein / clock in

Cabang Jogja 04

inside branch radius, 18 m
device clock matches server
no mock location detected
photo proof required
CLOCK IN at 07:58

03 / ZERO TO ONE, B2C

Londrin

On demand laundry pickup and delivery. One order status kept in sync between customer, courier, and branch.

Frontend Engineer + PM2026 to presentReact Native ExpoNext.jsREST API
3
parties, one status
2
apps + merchant dashboard
The decision

Recently launched, so scope is the honest measure, not scale. Each side can stall on its own: the courier arrives early, the branch weighs the load heavier than the estimate so the price changes, or the wash is done with no courier free. The order state machine has to survive all three.

Read the full case study
londrin.app/orders/4821
Order #4821in wash
picked upweighedwashingdeliverprice updated, 4.2 kg
COURIER: BUDI S.ETA 18 min
Also

Two more, kept short.

Smartkris, the rebuild

KRISPAY's replacement on NestJS with our own device firmware, so neither the server nor the machines depend on an outside company's plans.In development / NestJS / PostgreSQL / firmware

Zettabyte Pte Ltd, Singapore

Backend developer for a Singapore company, building a live platform for their client in Europe. Client work stays unnamed here.2024 / backend / cross border team

Timeline

Six years of production code, four of them before graduation.

2020First production code on Laravel, PHP
2021Joined PT Istana Mesin Laundry as Fullstack Developer
2022KRISPAY live. IoT payments in the first branchesLaravel
2023Presein, 250+ employees on React Native Expoto React Native
2024Backend Developer, Zettabyte Pte Ltd (Singapore)
2025Stack moved to NestJS, promoted to Project Managerto NestJS / promoted
2026Londrin launched, graduated with GPA 3.81
Photo
170 x 170

Looking for an engineer who has kept real systems running?

I am open to new roles and ready to move to Singapore.