I build software end to end.
I have built production software since 2016, from the database to the screens people use. My work includes multi-tenant SaaS, data pipelines, native mobile apps, and an election results site followed across the Philippines.
Selected work
Systems I led from development to production. Open any project to read more. Some of my work is private and not listed here.
2022 to now
Multi-Tenant Membership Benefits Platform
2022 to now
A benefits platform shared by several organizations. I led its rebuild from seven microservices into one modular monolith.
- Next.js
- TypeScript
- MySQL
- Drizzle
- AWS
- Problem
- Every organization on the platform wanted its own storefront, domain, catalogue, prices, branding, and access rules. Benefits still had to be issued and redeemed in one shared system.
- Solution
- The brief called for microservices, so the first version had seven of them, connected through Kafka with a DynamoDB event store. After launch, we spent a lot of time on order sagas, outbox pollers, and authentication between services, and the traffic never needed that kind of scaling. I led a rebuild as a modular monolith on Next.js and MySQL. Each old service became a module, background jobs run in their own process, and the request hostname decides which tenant to load.
- Outcome
- The platform now runs its production workload from a single deployment, and every organization keeps its own domain and storefront. A small team can run it and keep shipping. The client code is private, so the public demo recreates the tenant routing, catalogues, and theming.
2025
Election Night Results Platform
2025
A national election results site for a news network. It stayed up through the election night traffic spike.
- Go
- ClickHouse
- Redis
- MySQL
- Next.js
- Problem
- A news network had to publish national and local results all through election night. COMELEC released compressed result files in batches, and viewers across the country would request the same numbers at the same moment. Once counting began, the site could not go down.
- Solution
- A Go pipeline unpacked each COMELEC release and loaded it into ClickHouse, which computed the national and local tallies. The site read each new set of results from ClickHouse once and served every other request from a Redis cache, so the database never saw the audience.
- Outcome
- The network used it as its public quick count on election night. Tallies updated with each COMELEC release, and the site is still online.
2025 to now
Simply Finance
2025 to now
An expense tracker for iOS and Android where logging a purchase takes a few taps and the monthly view shows where the money went.
- Swift
- Kotlin
- SQLite
- Problem
- I wanted an expense tracker that is quick enough to use after every purchase. Logging has to take a few taps, and the month has to show where the money went at a glance.
- Solution
- The first version was React Native. The current apps are native, Swift on iOS and Kotlin on Android. Each device keeps its data in SQLite, and SimplySync keeps a person’s devices in sync.
- Outcome
- Both apps are on the App Store and Google Play. Sync between devices is end-to-end encrypted, so the server never sees anyone’s spending.
2026 to now
SimplySync
2026 to now
Open source, end-to-end encrypted sync for local-first apps. It powers sync in Simply Finance.
- TypeScript
- Swift
- Kotlin
- SQLite
- Cloudflare Workers
- Problem
- Simply Finance keeps its data in SQLite on each device. Syncing it through an ordinary backend would mean a server that can read every user’s finances.
- Solution
- Each device encrypts its changes before they leave it. A relay that cannot read them passes the changes between devices, and each device applies them to its own SQLite database.
- Outcome
- It powers sync in Simply Finance. The code is open source, and a paid hosted relay runs on Cloudflare.
2019 to 2021
Golf Club Booking & Membership System
2019 to 2021
Booking and membership software that moved a golf club off paper and spreadsheets.
- Node.js
- Vue
- React
- MongoDB
- Problem
- The club tracked tee times, members, and events on paper and in spreadsheets. Staff and members needed to work with the same schedule in different ways.
- Solution
- We built one Node.js and MongoDB backend with two frontends: a console where staff managed schedules, memberships, and events, and a booking app for members.
- Outcome
- The club used it every day for bookings and member records. The client system is private, so the public demo recreates the member booking flow.
Earlier client work
Property Listing Portal
2019
Buyers filtered listings by the details they cared about, browsed photos, and contacted agents. Agents managed their own listings.
- Laravel
- Vue
Incident Response Platform
2018 to 2019
Used during a national election to log incidents, assign an owner to each one, and track it until it was resolved. Every status change was kept in the history. The demo lists sign-in details on its landing page.
Satellite Imagery Request Portal
2018 to 2019
Clients drew the area they needed on a map instead of describing it over email. The shape stayed attached to the order until it was delivered.
- Laravel
- Vue
Personal projects
Goalist
2024
Breaks a long-term goal into steps you can check off, and keeps a history of your progress.
- React
- TypeScript
Pusoy Dos
2021 to 2022
A four-player online card game. The server holds the table state, checks every turn, and ranks the hands.
- React
- WebSockets
Game of the Generals
2019
A turn-based strategy game where piece ranks are hidden. The server settles every challenge, so neither player can see the other side of the board.
- Node.js
- React
eCampus
2016 to 2017
A school portal where teachers posted grades and students checked their standing and class rank.
- Laravel
- Vue
What I build
The parts of a product I usually own. Each one links to the projects that show it.
Web applications
Products that customers use, and the internal tools behind them.
Backend APIs & data models
APIs and database schemas that match how the business works.
Data pipelines & high traffic
Imports, background jobs, reporting, and caching for sites that get sudden traffic.
Multi-tenant SaaS & commerce
Catalogues, checkout, and fulfilment, with a separate storefront and domain for each tenant.
Native mobile apps
Swift and Kotlin apps, or React Native when one codebase makes more sense.
Auth, identity & integrations
Sign-in, permissions, tenant separation, and connections to couriers, CRMs, and other APIs.
Cloud infrastructure
AWS, containers, autoscaling, Infrastructure as Code, and deployment pipelines.
Payments & AI features
Billing, webhooks, and reconciliation. AI features ship with evaluations and cost limits.
Technologies
The tools I use most in production.
- Backend
- TypeScript
- Node.js
- Bun
- Hono
- Go
- Laravel
- Frontend
- React
- Next.js
- Vue
- Tailwind CSS
- Data
- PostgreSQL
- MySQL
- MongoDB
- ClickHouse
- Redis
- D1
- Infrastructure
- AWS
- Kubernetes
- Terraform
- AWS CDK
- Cloudflare Workers
- Docker
- GitHub Actions
- Commerce
- Shopify Plus
- Hydrogen
- Storefront API
- Shopify Functions
- Mobile
- Swift
- Kotlin
- React Native
How I build
How I make technical decisions and keep projects moving.
Pick proven tools
I add a new tool only when it solves a real problem, because someone has to maintain it for years.
Ship small
I put a small working version in production early and improve it from what I learn there.
Size the architecture to the need
I design for the traffic a system will likely see and the team that will run it.
Stay on after launch
I handle the deployment, the edge cases, and the things the ticket left out.
Use AI and review the output
I use Claude Code and Codex every day, and I read every change before it ships.
Write it down
I record decisions, keep modules separate, and write code the next person can follow.