Creating an Accumulating Batcher Service with Cadence
How we built a batching service using Cadence workflows to accumulate and process events in time-bounded windows without polling.
Engineering Manager
Engineering Manager @ StashAway Singapore.
Full-stack roots — from mobile apps to distributed backend systems.
I'm an Engineering Manager with 8+ years in software development and system design, passionate about building great solutions and growing the people who build them. I've led teams through challenging migrations, high-stakes production incidents, and full system rewrites - and I still love getting into the technical details when it counts.
I graduated in Mechanical Engineering from the National University of Singapore, then spent a year in Stockholm doing design engineering at a fast-paced startup before pivoting into software. That background gives me a different lens on problem-solving that I bring to every challenge.
I keep a close eye on AI tooling — applying what actually moves the needle and sharing those tools with my team.
Languages and frameworks I work with.
Evaluating and applying AI tools to improve team productivity.
Event-driven microservices and async messaging.
Frontend and Node.js tooling.
Web and cross-platform mobile UIs.
Backend services and CLI tooling.
Distributed workflows — migration, adoption, and ops at scale.
JVM microservices and REST APIs.
Full-stack web apps and REST APIs.
Data pipelines and scheduled workflows.
Where I've worked and what I've shipped.
Oct 2018 – Present · Singapore
Lead the Trading engineering team. Responsible for delivery, technical direction, and people growth.
Led trading system rewrite from legacy monolith to microservices (Micronaut + Kafka + Temporal). Delivered private investment feature coordinating cross-team stakeholders. Mentored engineers and ran incident management.
Led company-wide adoption of Temporal — infra setup (Kubernetes + Helm), boilerplates in Go and TypeScript, knowledge-sharing sessions and internal hackathon. Planned and executed Cadence → Temporal migration. Built internal admin UI (ReactJS + Go) for managing 100k+ workflows. Notable flows delivered: Fee Charging, KBank Integration, Direct Debit, SAGA Workflows. Contributed multiple posts to the StashAway Engineering Blog.
Built and maintained microservices in Python and Node.js. Implemented direct debit and Citibank withdrawal flows with Airflow. Researched and introduced Cadence as the company's first workflow orchestration engine. Led country launches in Thailand, UAE, and Hong Kong for microservices under my ownership.
Go, Temporal, Micronaut, Kafka, Kotlin, TypeScript, ReactJS, Python, Airflow, Kubernetes
Aug 2017 – Oct 2018 · Singapore
Maintained and extended GetAssured (Singapore's first life insurance employee benefits portal) — implemented multi-tenancy, migrated frontend to React, isolated crawler as a microservice, and deployed on AWS. Led AllAssured from prototype to launch — refactored Laravel backend, built React frontend, set up data redundancy.
React, Ruby on Rails, Laravel, MySQL, AWS EC2, S3, RDS
Asia's first social recipe app with receipt scanning. Built the product from prototype to launch — Rails API backend, RailsAdmin panel, and a React Native app for iOS and Android with Google Vision API for receipt scanning.
Ruby on Rails, Google Vision API, React Native, PostgreSQL, Capistrano
May 2017 – Jul 2017 · Singapore
Intensive 3-month bootcamp. Built 5 Rails apps from scratch to deployment including a mood journaling AI chatbot integrated with Api.ai. Completed 40+ coding challenges, practiced TDD and pair programming. Self-hosted multiple apps on a DigitalOcean VPS using Dokku.
Ruby on Rails, EmberJS, PostgreSQL, JavaScript, jQuery, Dokku
Thoughts on software, systems, and things I'm learning.
How we built a batching service using Cadence workflows to accumulate and process events in time-bounded windows without polling.
A hands-on introduction to Cadence — Uber's workflow orchestration engine — covering core concepts, local setup, and writing your first workflow.
Strategies for robust error handling in Airflow DAGs when calling external APIs — retries, alerting, and graceful degradation.