Case study
OmniTrak
Your one-stop personal tracker for bills, cashflow, grocery cart, and more.
- Role
- Solo — product, design, and full-stack engineering
- Timeline
- Feb 2026 – present
Next.js
TypeScript
Tailwind CSS
TanStack QuerySupabase
Maya
PayMongo
Vercel

- releases shipped since February 2026
- 78
- database migrations, applied by CI
- 97
- payment methods: GCash, Maya, QR Ph, GrabPay, cards
- 5
The problem
Money in the Philippines lives in a lot of places at once: bank accounts, e-wallets like GCash and Maya, cash, and money lent to family. The bills that matter — Meralco, Maynilad, internet, Pag-IBIG — don't sync with any of them.
I wanted one place to see what's due, whether I can actually cover it, and where the money went, without handing a budgeting app my bank logins.
What I built
A Next.js and TypeScript web app on Supabase: Postgres with row-level security on every user's data, Supabase Auth (password, one-time link, and Google sign-in), and TanStack Query for client-side caching.
Accounts with their own ledgers and running balances; bills grouped by what's overdue, due this week, or settled; expenses; receivables, where the person who owes you confirms the amount by email; savings goals; vehicles and fuel; reminders; and public calculators, including a Philippine tax calculator.
Ask OmniTrak, an AI assistant that answers from the user's live data and from documents they upload. It's retrieval-augmented generation on pgvector (OpenAI embeddings, HNSW index) with streamed, cited answers, and users can switch between OpenAI, Claude, and Gemini through the Vercel AI Gateway.
The business side: PayMongo subscriptions, a 14-day Pro trial with no card required, a referral program that pays out free months, an admin portal for users, broadcasts and support, and daily cron jobs for reminder emails and auto-debits.
Shipped continuously, with every release logged in an in-app changelog and database migrations applied by a GitHub Action that dry-runs every pull request. An iOS and Android app built with Expo, on the same backend, is in progress.
Hard parts & tradeoffs
Only the payment provider can grant a plan. The PayMongo webhook checks an HMAC signature with a constant-time comparison, and a payment upgrades an account only if it actually succeeded and covers that plan's price — otherwise a ₱20 minimum payment could claim Premium. Repeat confirmations for the same payment can't stack extra months.
Reminders have to land at 8 AM Manila time, but the cron job fires at midnight UTC. The first version checked the UTC hour and silently skipped every run; the job now gates on the Asia/Manila clock.
Server rendering and client caching disagreed on first paint and threw hydration errors. I standardized on prefetching every query on the server and reading it with Suspense queries on the client, so both renders come from the same cache.
Not everyone wants full cashflow tracking, so Bills has two modes. Full cashflow warns you before a payment would overdraw an account and can auto-debit; Bills & reminders never blocks a payment on a tracked balance and never pays anything on its own.
Results
Live at omnitrak.cloud with free and paid plans, a 14-day Pro trial, and a referral program that grants its rewards automatically.
78 releases in about eight months, each one written up in the in-app changelog, running at 99.9% uptime.