Case Study

Saldo

2026 · iOS Finance App

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.

Saldo

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

01

Manual entry, not bank sync

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.

02

One repo, one deploy: Expo Router as the whole backend

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.

03

Offline-first with optimistic sync

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.

04

Background jobs decoupled from requests

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.

05

AI advice as a structured verdict, not a chatbot

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 RouterTypeScriptNeon PostgresGemini API

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.

14
Spending categories tracked
03
Automated background jobs
100%
Transaction entry works offline
Next projectSCBorbense Website

Contact

Let's build something together.

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