Case Study
A solo-user, iOS-first personal finance app: manual transactions, subscriptions, budgets and savings goals, with offline entry and on-demand AI advice on whether a purchase actually fits your money.

The problem
Budgeting apps either want to link to your bank — which means handing over credentials to a third party for something as simple as tracking a coffee — or they're a spreadsheet, which nobody keeps updated past week two. What was missing was something in between: fast manual entry that respects the ritual of tracking your own spending, without the friction of a bank-sync flow or the abandonment rate of a spreadsheet.
The harder constraint was personal: build it solo, entirely from Windows with no Mac, targeting a physical iPhone, with no separate backend team or infrastructure to maintain later — the whole thing had to be one deployable unit.
Key decisions
No Open Banking integration, no shared credentials, no third-party data broker. Every transaction, subscription and budget is entered by hand — slower per entry, but the app owns nothing it doesn't need to, and the data model stays simple enough to reason about end to end.
The API lives as Expo Router's `+api.ts` route handlers, exported to Vercel through its (unofficial but working) adapter. There's no separate Express/Next.js server — the mobile app and its backend ship from the same codebase, the same commit.
A local SQLite mirror queues transactions with a client-generated ID; the UI updates instantly regardless of connectivity, and a sync manager flushes the queue on reconnect, deduping server-side on that same ID so a retried request can never double-post.
Subscription-renewal reminders, budget-threshold warnings and weekly savings-goal check-ins run as Inngest functions — cron-scheduled or event-triggered off a transaction being created — so notification logic never blocks or rides on the request/response cycle.
The 'should I buy this?' feature sends current balance, upcoming subscriptions and recent spending to Gemini with a JSON-schema-constrained response, and gets back a verdict, reasoning and a safe-to-spend number — validated server-side before it ever reaches the screen.
Stack
Expo Router (SDK 57) and TypeScript for the app and its API routes, Clerk for Google-only auth, Neon Postgres with Drizzle ORM, Inngest for scheduled/event-driven jobs, Google Gemini for on-demand advice, all deployed to Vercel with Sentry for error tracking.
The result
A working v1 running on my own iPhone: transactions, subscriptions, per-category budgets with an overall monthly cap, savings goals, push notifications for renewals/thresholds/check-ins, and on-demand AI buy advice — entered offline just as easily as online. One codebase carries the whole product, from the phone screen to the Postgres row.
Contact
Have a project in mind, or just want to say hi? My inbox is always open — I usually reply within a day.
Open to internships & freelance