BullMQ vs Temporal for Node.js Production Workflows
BullMQ handles fire-and-forget jobs. Temporal handles crash-safe, stateful workflows. I picked the wrong one and it cost me a weekend. Here is how I choose.

Solutions Architect
I design systems where failure is expensive: payment rails, product platforms, and the teams that keep them running.
“There are no right answers in architecture — only tradeoffs.” — Mark Richards
$ cat about.md
Architecture is the set of decisions that are expensive to change. My job is to make that cost visible, then choose deliberately.
I am a solutions architect. For more than a decade I have worked where money moves and downtime is not abstract: payment integrations under PCI-DSS discipline, brokerage platforms and trading operations, ERP rollouts, and AI systems that run in production.
Architecture is not a diagram or a stack. It is the set of decisions that are expensive to reverse: where the boundaries sit, which contracts the parts speak, how data flows, and what happens when something fails. My job is to make those decisions explicit, choose the set that fits the business, and write down why.
I stay hands-on, because a design the team cannot build is not a design. React, Next.js, Astro, Node, Python, SQL, Docker, CI/CD. And I measure architecture the only way that matters: by how cheaply the team can change it.
Model boundaries, data flows, and failure modes before code. Features are easy to add; bad seams are expensive to remove.
Every choice has a cost. I make the cost explicit and pick what fits the business, not what is trending.
Invest where the business differentiates, buy or borrow the rest. Architecture follows the win condition.
Reversible decisions, recorded rationale, boring technology where it counts. The system should get cheaper to evolve, not more expensive.
Perfection is achieved not when there is nothing more to add, but when there is nothing left to take away.
$ cat /var/log/impact.log
Srabutan.com
Jan 2026 — Present | Indonesia
CITT Services
Jan 2014 — Dec 2025 | Dallas, USA
Wirecard (PT. Aprisma Indonesia)
Aug 2011 — Dec 2013 | Jakarta, Indonesia
$ ls -la ~/projects/
A selection of projects spanning fintech, e-commerce, and AI.
Agentic commerce & operations OS: multi-tenant storefront and admin, one API gateway, agent access through MCP/UCP/ACP/REST, deterministic tool policy with approval inbox and change sets, tenant config and runtime themes, plus rental booking and evidence modules. First deployment: Toko Vavelle.
Mall operations ERP on Odoo 19 Community built end-to-end: leasing contracts with state machine, automated monthly billing (rent + service charge + IoT meter readings), staged payment reminders, DOKU VA/QRIS payments with signed idempotent webhooks, 18-endpoint REST API hub with scoped API keys and rate limiting, Astro tenant portal with per-tenant login tokens, Telegram ops bot, procurement-to-PO flow, and DJP-format e-Faktur XML export. 60+ tests green on fresh databases; documented engineering log of 27 real debugging lessons.
Odoo 19 leasing engine for malls and office towers: unit and tenant registry, contract state machine with overlap guards, automated monthly invoicing (rent, service charge, metered utilities) with prorata, yearly rent escalation and rent-free windows, staged reminders with auto penalties, and contract, aging and occupancy PDF reports.
REST API hub exposing 18 endpoints over the ERP: scoped API keys, per-key rate limiting, full request logging, maintenance ticket workflows, IoT meter push, and a tenant-scoped portal API where cross-tenant access returns 404 by design.
DOKU payment integration for Indonesian VA and QRIS: transaction state machine, signed idempotent webhooks, automatic invoice reconciliation, mock mode for offline demos and a sandbox mode verified against the real DOKU API.
Tenant self-service portal on Astro 5 SSR with React islands and skeleton loading: per-tenant login tokens, invoice list with payment initiation, maintenance ticket creation, and a server-side proxy that keeps API keys and tokens out of the browser. Cookie sessions are httpOnly with SameSite protection.
IoT meter gateway for tenant utilities: push API for sub-meter readings, an ESP32 firmware sketch (Modbus RS485 and pulse input) and a Python simulator. Readings flow into monthly billing automatically, with a guard that rejects backward meter pushes.
Telegram operations bot for mall staff: occupancy, revenue, overdue invoices and expiring contracts on demand, with chat allowlisting and a dry-run mode for offline demonstration.
Procurement and Indonesian tax compliance for the ERP: purchase requests with tiered approval that generate per-vendor PO drafts automatically, plus a DJP-shape e-Faktur export with 16-digit NSFP uniqueness, selling and buying NPWP validation, and per-line details.
Indonesian parking operations system (Secure-Parking-style) on Odoo 19: progressive tariff engine with grace windows and daily caps, gate flow with idempotent exit confirmation, five entry modes (paper ticket, QR, member smartcard, bank e-money tap like Flazz, ticketless LPR), QRIS and auto-debit payments with minimum-balance guards, tenant validation vouchers with monthly quota and chargeback reporting, monthly members with automated invoicing, cashier shifts with variance detection, and a real-time SISA availability board fed by per-slot bay sensors or loop counters. ESP32 firmware sketches and an API simulator reproduce the production device path.
Vietnam Coffee E-Commerce platform built with AstroJS, Tailwind, and SEO-optimized architecture. Features automated AI image generation pipeline for commercial product photography.
E-commerce storefront for premium crispy pork belly products, featuring an automated AI image generation pipeline (fal.ai, Nano Banana) for commercial-quality product photography at scale.
Bali tourism site (traveltobaliparadise.com) with curated tour packages, vehicle rentals, destination pages and a blog. Package pricing is published in USD and IDR, and every booking path funnels into a tracked WhatsApp handoff instead of an abandoned form. Astro 5 static output with Tailwind.
Forex trade synchronization SaaS platform with real-time WebSocket communication, ZeroMQ messaging, and Kubernetes orchestration.
Financial services platform delivering trading infrastructure with WordPress, Laravel, React, and Vue for a seamless client experience.
Multi-tenant commerce platform for Indonesian UMKM: an Astro SSR storefront and a React 19 seller studio with a block-based page builder covering 100+ block types, drag-and-drop composition, inline editing, variants, and per-block color slots. The Hono API runs on Cloudflare Workers over Supabase Postgres with row-level security, joined by DOKU payments, Everpro shipping, custom domains, transactional email, and a two-tier subscription model (free at 5% platform fee, Pro at Rp49K and 3%).
Indonesia's next freelance marketplace: full-stack platform with AI-powered matching, real-time collaboration, and secure payments.
Community commerce platform for a parish micro-business ecosystem (umkm.servatius.id): business directory with multi-role verification workflow, tender and bazar management with a 3-layer contribution guard (UI, consent checkbox, database RLS), and paper SOP forms digitized into auto-numbered PDF permits with digital signatures. 68 static pages hardened with Row-Level Security across 25 SQL migrations.
Personal coaching brand site (healerpath.id) for a counselor and healer: service catalogue, blog, and testimonials with editorial typography. Built on Jekyll static output with a git-based CMS so the non-technical owner edits all content through a friendly admin UI, deployed to the edge on Cloudflare Pages.
Religious digital platform for community engagement and content distribution, built with Jekyll and vanilla JavaScript.
AI-powered chat application with real-time streaming responses using React, Tailwind, and Groq API integration.
AI-powered analytics dashboard with FastAPI backend, Next.js frontend, and Gemini AI for intelligent sales insights.
$ open ~/work/live
Screenshots from systems running in production and pilot. Desktop and mobile share the same design system.
See all works →$ which $(compgen -c)
A few things I’ve worked with…
$ cat ~/colleagues/feedback.log
Feedback from colleagues and leaders I've worked with.
“Bio consistently delivers exceptional technical solutions that drive real business value. His ability to architect complex systems while maintaining clean, maintainable code is rare. Over the years, he has been instrumental in delivering projects for our most demanding fintech clients.”
Nash Wadud
CEO, CITT Services
$ cat ~/thoughts/*.md | tail -6
Writing about fintech, architecture, and the craft of software.
BullMQ handles fire-and-forget jobs. Temporal handles crash-safe, stateful workflows. I picked the wrong one and it cost me a weekend. Here is how I choose.
Three index patterns dominate production query optimization: composite for multi-column filters, covering for index-only scans, partial for small subsets.
Uptime and error rate reveal nothing about agent health. Four metrics that matter, how to trace an agent's reasoning chain, and when to halt a run.
How circuit breaker patterns prevent payment provider outages from cascading into system-wide failures, with per-provider configuration strategies and fallback patterns for fintech systems.
Beyond console.log: the console.table, console.time, console.group, console.trace, and console.count methods that cut debugging time in the browser.
Message brokers cannot guarantee exactly-once delivery. The correct response is idempotent processing with deduplication tables and conditional writes.
$ echo $CONTACT
Have a project in mind? Let's talk about how we can build it.
The best way to get a project done faster is to start sooner.