The Work

Seven systems, told honestly — every pattern transfers.

The life of a record

One record, nine systems. Follow the record:

Some of these I built, some I run, some my team owns — but the river is one system, and it has to add up end to end.

Case 01

The transaction backbone — from a legacy monolith to a contract-first service

The system that makes sure no transaction is ever processed twice.

monolith → microservices millions of transactions/day idempotent by construction 2-min self-serve SDK 200+ types · one base workflow

Every financial transaction passes one audited approval workflow — millions of transactions a day. I rebuilt it on Temporal with idempotency by construction (a retry can only return the existing record) and turned integration into a published SDK: adding a new request type is a two-minute self-service form.

Read the case study →

Case 02

Keeping a high-concurrency transaction platform standing 50k → 400k+ users

I drove the re-architectures that kept the platform up as daily users climbed to 400k+ — one live single-point at a time.

50k → 400k+, live collision-proof cutover sub-second pushes

The member management platform grew from 50k to 400k+ and the old mechanisms broke in production. I replaced them live — atomic ID generation cut over with a +1-billion offset, notification fan-out moved to pub/sub, blocking scans made incremental — inside a weekly release train.

Read the case study →

Case 03

The first production service on a brand-new stack — from zero to clean handoff

The pilot the whole stack migration was judged on — every pattern I set became the template later services copied.

first on the new stack buy the base, build the moat solo → team → clean handoff became the template others copied

AI-assisted support with human takeover, built solo on a stack nobody had shipped to production yet. I bought the messaging base and self-built only the differentiators — a routing queue encoding status, load and wait-time into one sorted-set score, AI-to-human handoff, a mini back-office — grew it to a two-person team, and handed it off clean. Being the pilot meant my patterns became the template every later service copied.

Read the case study →

Case 04

The exactly-once reliability layer for a cross-stack rewards pipeline

Four services, three languages, a reward path where a double-pay is real loss — I designed the layer that makes payout happen exactly once, zero legacy changes.

4 services · 3 languages exactly-once, layered 0 legacy changes pre-prod verified

A mission pipeline across four services in three languages, composing the platform's existing engines. My design: the exactly-once layer — an atomic claims ledger plus a human-readable idempotency key — correct under both workflow replays and message redeliveries.

Read the case study →

Roads not taken

Every architecture I run replaced one I personally operated. Here's what lost, and why.

Cron and scan, versus durable workflows

The old platform ran 22+ cron jobs, one of them re-scanning for stuck approvals every single minute. I maintained that for six years — so when durable workflows arrived, I didn't need a blog post to explain why retries belong in the engine, not in a scanner. What would change my mind: a workload where every task is truly fire-and-forget.

Tune the database harder, versus add a cache

Redis was not the first answer — months of index work, aggregation rewrites and dead-index deletion came first. The cache earned its place only after the database was already honest. What would change my mind: nothing; the order itself is the principle.

The benchmark that lost, then won

An analytics engine failed our JSON-path queries — 3 to 15 times slower. Instead of accepting the verdict, we flattened the schema and removed the weakness, and the verdict changed. Benchmarks are inputs to architecture, not judges of it.

Local models, versus a tiered router

At home I wanted local models for everything — free, private, mine. CPU-only inference lost to multi-round tool calling by an order of magnitude, so a tiered router took its place. Losing cleanly beats winning on paper.

Where this happened

Dec 2019 – present · Malaysia

Backend Team Lead

A high-concurrency transaction platform
Lead Software Engineer Dec 2025– · Senior Software Engineer 2024–2025 · Software Engineer 2019–2024

A five-person team owning six module domains across two generations of stack — legacy monolith and modern microservices — plus third-party service integrations. Architecture gatekeeper for cross-team requirements. I grow engineers through ownership — three juniors now run an entire production platform themselves. Weekly releases, CI/CD discipline, mentoring as the core of the job.

2,000+ merged pull requests, from full-stack on the legacy platform to pioneering the new stack. Highlights beyond the case studies: hardened withdrawal flows, peer-to-peer order matching (50+ pull requests in two months), session security, and third-party WebSocket integrations with heartbeat keep-alives. The SDK-per-domain pattern I pioneered for the workflow platform has since become the platform standard — a shared SDK layer of 14 packages, consumed by 8 services, built by the platform team on that model.

  • NestJS
  • Temporal
  • MongoDB
  • Redis
  • Flink
  • Rust
  • Node
  • WebSocket
  • Distributed Systems
  • CI/CD
2018 – 2019 · Malaysia

Mobile Engineer

Hitachi Ebworx

Insurance point-of-sale hybrid app; automated the daily QA deployment.

  • Cordova
  • Hybrid apps

Core (ships daily)

TypeScript · NestJS · gRPC / proto-first contracts · MongoDB (aggregation, indexing, Atlas Search) · Redis (data-structure design, cluster) · Temporal · Apache Pulsar · Jest + Testcontainers (real databases, not mocks)

Working

Java (Flink streaming jobs) · Rust (one full service — Temporal SDK, tonic/prost — pre-production) · Apache Flink (DataStream + SQL, managed) · ClickHouse · Hologres · PostgreSQL · HashiCorp Vault · OpenTelemetry · Grafana · Alibaba Cloud SLS (log forensics) · LangChain / LLM app development

Familiar

Kafka · Node/Express legacy patterns · Socket.io / self-hosted messaging backbones · AngularJS-era stack · Docker · GitHub Actions · Alibaba Cloud (application level)

Home lab

Python (pandas · FastAPI · Streamlit) · Telegram & WhatsApp bots · Tailscale · WSL2 · Ollama (local LLMs) · vector memory & embeddings · Zeabur