Software engineer in Jakarta, working across the backend, the frontend and the LLM parts of a product. Most of my services are written in Go and Python, with Next.js on the frontend.
I work at Jobkred, a Singapore-based HR tech company, where I build an LLM workflow platform: a ReactFlow canvas where users chain AI agents into scheduled workflows, backed by FastAPI. Before that I spent four years at Offerland Technologies, first as a freelancer and then full time, building scraping infrastructure in Python and Django on GCP that collects over a million data points a day from more than 20 e-commerce platforms. While freelancing for Offerland, I also spent a few months at Tokopedia on a real-time seller analytics platform built with Go, Kafka and Redis.
I studied Informatics Engineering at Institut Teknologi Bandung. My day-to-day work lives in company repositories, so this profile holds side projects.
Tools I reach for most: Go, Python, TypeScript, React, PostgreSQL, Redis, Kafka, RabbitMQ, Docker, GCP, OpenAI API.
| Repository | What it does |
|---|---|
| go-llm-gateway | OpenAI-compatible LLM gateway in Go. When a provider drops in the middle of a streamed answer, the next one continues from the last word the client received. Also handles token quotas in Redis and per-provider circuit breakers. |
| go-rabbitmq-retry | RabbitMQ worker in Go. Failed messages come back after a delay that grows with each attempt, and the ones that keep failing are parked with the reason attached. CI runs the tests against a real broker. |
| web | The code behind my portfolio site, with a Payload CMS admin in the same Next.js app. |
| scraping_insight | Compares free-tier scraping APIs on success rate, latency and credit cost, with a dashboard for the results. |
| etl-pipeline | Small Python ETL pipeline configured in YAML that loads CSV data into SQLite. |
| tampered-image-detector | Flags edited photos using Error Level Analysis and a CNN, served through a Flask API. |

