Skip to content

I take products that have outgrown their code and rebuild them so a small team can ship again.

Senior full-stack engineer with 7+ years shipping production software, most of it in TypeScript, across fintech, Web3, AI products and iOS. Most recently I rebuilt Black Jet's backend.

monolithMongoDBBeforeAfter · 4 NestJS services (Nx)pub-apichat-apisec-apiadmin-api17 shared librariesauthrbacdatabaseloggingqueuesstoragepaymentsnotifications+ 9 moreDataPostgreSQLDrizzle ORMRedisBullMQ jobsS3files, invoicesBeforemonolith · MongoDBpub-apichat-apisec-apiadmin-api17 shared librariesauthrbacdatabaseloggingqueuesstoragepaymentsnotifications+ 9 moreDataPostgreSQLDrizzle ORMRedisBullMQ jobsS3files, invoices
Black Jet backend rebuild: monolith → 4 services2025–2026
4production services
17internal libraries
3–5 minper deploy, with Docker
Mongo → PGdata layer migrated
Case studies

Four systems, and the calls I made on each

01 · Black Jet · Full Stack DeveloperMay 2025 – Jun 2026

Rebuilding a legacy monolith into four services without stopping product work

A single MongoDB monolith was slowing every release: features collided, and payments and subscriptions lived next to CMS code. I started the rebuild and set up its scaffolding and architecture, working directly with the CEO and a small product team.

monolithMongoDBpub-apichat-apisec-apiadmin-apiNx · pnpm · Clean Architectureauthrbacdatabaseloggingqueuesstoragepaymentsnotifications+ 9 more · 17 totalPostgreSQLDrizzle ORMRedisBullMQ jobsS3files, invoicesGitHub Actions · Docker · AWS1,000+ tests1,000+ testsdevelopmentstagingproduction
BeforemonolithMongoDBpub-apichat-apisec-apiadmin-api17 shared librariesauthrbacdatabaseloggingqueuesstoragepaymentsnotifications+ 9 morePostgreSQLDrizzle ORMRedisBullMQ jobsS3files, invoicesGitHub Actions · Docker · AWS1,000+ tests1,000+ testsdevelopmentstagingproduction
  1. 01

    Split the monolith into four services

    Four NestJS services in one Nx monorepo with pnpm and Clean Architecture boundaries, so engineers could work on separate domains in parallel.

  2. 02

    Pull shared concerns into 17 libraries

    Auth, RBAC, database access, logging, queues, storage, payments and notifications became internal libraries, so every service handles them the same way.

  3. 03

    Move the data layer from MongoDB to PostgreSQL

    Drizzle ORM for typed queries and relational integrity across payments and subscriptions. Background work moved to Redis and BullMQ; files and PDF invoices to S3.

  4. 04

    Gate every release on 1,000+ tests

    CI/CD with GitHub Actions, Docker and AWS across development, staging and production, with unit and integration tests between each environment.

Also shipped

  • Payments and recurring subscriptions
  • Customer support chat and notifications
  • CMS, S3 storage, PDF invoices

Why four services

pub-api serves public content with no sign-in, so it stays apart from the signed-in core. chat-api holds a WebSocket connection per user and scales on its own. sec-api and admin-api serve members and staff, with different roles and access rules. Each service deploys on its own in 3–5 minutes, on an EC2 instance sized from its own load.

ProofThe backend is private; the product is live.Ask for an architecture walkthrough

Black JetWebsite ↗App Store ↗Google Play ↗

02 · Xendit · Tech LeadSep 2021 – Jan 2022

Connecting merchants to Xendit from the platforms they already use

Existing merchants had no simple way to plug Xendit products into WooCommerce, Shopify and internal services. As tech lead of five engineers, I owned the integration workflows from scratch to release.

Xendit side · my team of 5Platform side · owned by each platform's teamXendit Dashboardmerchant connectsXendit productspayments APIsintegrationworkflowsbuilt from scratchcontractWooCommerce pluginShopify appinternal services

My role

Owned delivery, architecture, release and coordination. Set technical scope and priorities with Product Managers and the teams that owned each platform. Promoted to tech lead from senior engineer.

Working across teams

The integrations depended on other Xendit products, so I worked with those product teams to make sure our requirements matched the data and APIs their products already exposed.

ProofThe integrations page sits inside the Xendit Dashboard.Ask about the integrations

XenditWebsite ↗

03 · Airfoil Studio · Product Engineer & Project LeadFeb 2022 – Apr 2025

Taking client products from design file to launch, as engineer and project lead

At Airfoil I built products for global startups: landing pages, web apps and user dashboards, Web3 integrations, and a React Native trading app. On many projects I also led the work for Airfoil, as the one person between our designers, our engineers and the client.

AirfoilClientdesignersUI and flowsengineersthe team I ledmeproduct engineer: build + integrateproject lead: tickets, task split,client meetings and feedbackdesignsticketsbackend APIsblockchainfoundersfeedback,reviewsdirect line to the clientintegrated builduser testinglive for users
20+ client projects

What I shipped

  • Landing pages, web apps and user dashboards, including Magna's
  • Web3 features on Ethereum, Solana, NEAR and Eclipse (Tap Game)
  • Moongate's trading platform, as its React Native mobile developer
  • Internal Airfoil tools: an estimation app and a client dashboard integrated with Gemini AI

How I led

Represented Airfoil on client projects: wrote the tickets, split work across the team, ran development meetings, and was the client's contact for feedback and decisions. Nothing went live until it passed user testing.

Along the way

Raised Lighthouse from below 80 to 95+ with loads under 3 s, and built shared frontend packages that six engineers used.

04 · Xendit · Senior Software EngineerAug 2020 – Sep 2021

Operations tooling for Nex, a digital bank with 100K+ downloads

Nex could not open to the public yet, so new users joined with referral codes from Xendit employees. When a new license allowed more users, I built a waitlist for everyone else who wanted in. I also built the internal dashboard operations teams used to run Nex (users, transactions, KYC, waitlist onboarding), a customer-facing credit card onboarding dashboard, and the APIs behind both.

signupreferral or waitlistKYC approvedwaitlist checkreads the waitlist flagdashed · after a later change, approved users skipped the waitlist checkaccount activelet inwaitlistwaits for access
The waitlist I built, and the check I restoredNex onboarding

My role

Built user management, transactions, KYC and waitlist onboarding for operations, and the APIs for Nex. Automated deploys with Buddy.works, Helm and Terraform.

The waitlist bug

After the waitlist went live, a later change elsewhere in the codebase stopped the waitlist flag from being checked, so some users went straight from KYC approval to an active account. I traced the cause to that change and restored the check.

What I took from it

A rule that decides who gets in needs a test that fails when the rule is skipped, and an alert when an account turns active while it is still waitlisted. Then a later change can't switch it off quietly.

ProofThe ops dashboard is internal.Ask about the ops tooling

NexApp Store ↗Google Play ↗

About

Product first, then the code that keeps it shippable

I own things end to end: the schema, the API, the UI states and the release pipeline. I've done that across fintech, Web3, AI products and native iOS, for teams in the US, EU and APAC.

I care about boring, well-tested foundations so product work stays fast. Shared libraries, typed data access and CI that people trust are what let a small team keep shipping.

Local time in Surabaya

--:--

UTC+7
Overlaps EU morningsOverlaps US eveningsSame day as APAC
7+ yearsshipping production software
Web to iOSshipped on web, React Native and native iOS
Since 2026Apple Developer Academy apprentice, iOS
Skills

Where I go deep, and where I'm productive

Languages

  • TypeScript, primary, daily
  • JavaScript, primary, daily
  • SQL, shipped to production
  • Swift, working knowledge

Frontend

  • React, primary, daily
  • Next.js, primary, daily
  • React Native, shipped to production
  • Tailwind CSS, shipped to production
  • SwiftUI, working knowledge

Backend

  • Node.js, primary, daily
  • NestJS, primary, daily
  • Express, shipped to production
  • WebSocket, shipped to production
  • Microservices, shipped to production

Data

  • PostgreSQL, primary, daily
  • Drizzle ORM, shipped to production
  • Redis, shipped to production
  • MongoDB, shipped to production

Cloud & DevOps

  • GitHub Actions, primary, daily
  • Docker, shipped to production
  • AWS, shipped to production
  • GitLab CI/CD, shipped to production

Architecture

  • Monorepos (Nx, pnpm), primary, daily
  • Clean Architecture, primary, daily
  • Design systems, shipped to production

Specialties: legacy modernization, web performance, payments and subscriptions, Web3 integrations, real-time and AI chat.

Experience

Every role since 2019

Mar 2026 – now

Apple Developer Academy · iOS Product Development · Apprenticeship

  • Prototyping iOS products in Swift and SwiftUI, with user research and usability testing.

Nov 2025 – Sep 2026

Airfoil Studio · Contract Product Engineer · Freelance

  • Rejoined for recurring client work across web, React Native and iOS.
  • Built text and voice AI chat for a client's iOS health assistant app.
  • Refactored and sped up existing iOS and React Native codebases.

May 2025 – Jun 2026

Black Jet · Full Stack Developer

  • Started the monolith-to-services rebuild in case study 01 and set up its architecture.
  • Built payments, subscriptions, support chat, notifications and PDF invoices.

Feb 2022 – Apr 2025

Airfoil Studio · Product Engineer

  • Delivered 20+ client projects, often as project lead for Airfoil; see case study 03.
  • Built Moongate's trading app in React Native and Web3 dashboards across four chains.
  • Took designs from Airfoil's designers to production, through user testing.

Sep 2021 – Jan 2022

Xendit · Tech Lead

  • Led 5 engineers on Dashboard integrations with WooCommerce and Shopify.
  • Interviewed 10+ candidates and helped hire 3 engineers.

Aug 2020 – Sep 2021

↑ promoted

Xendit · Senior Software Engineer

  • Shipped the Nex operations dashboard and the customer-facing credit card onboarding dashboard.
  • Automated deployments across 4 environments with Helm and Terraform.

Jun 2019 – Jul 2020

SEVIMA · Full Stack Developer

  • Built accreditation and audit systems for universities including Universitas Airlangga.
  • Sole full-stack developer for maukuliah.id; moved deploys to GitLab CI/CD.
Leadership

How I raise the level of the team around me

I help build the team, not just the code.

At Xendit I interviewed more than ten candidates and helped hire three engineers, one frontend and two backend, for the team I then led.

I build what other engineers build on.

Component libraries and internal packages at Airfoil, and seventeen backend libraries at Black Jet, so teammates start from working parts.

I ran client projects end to end for Airfoil.

As project lead for Airfoil I wrote tickets, split work across the team, ran client meetings and reviewed code, so the client had one person to talk to.

I work with the people who set direction.

Aligned technical decisions with a CEO at Black Jet, Product Managers at Xendit, and founders on client projects.

Open source

Small tools I maintain

$ gh repo list ayungavis --source

railway-preview-deployGitHub Action that spins up a Railway preview deployment for every pull request.action
cengluZero-dependency TypeScript logger for Node.js that redacts secrets like passwords, API keys and card numbers, with Express and Fastify middleware.npm
Contact

Hiring a senior full-stack engineer? Let's talk.

Open to full-time senior roles and contract work, remote across US, EU and APAC time zones. I usually reply within a day.