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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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
Primary, daily
Shipped to production
Working knowledge
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