Case Study
Guardian
Securing your financial growth.
Portfolio PrototypeThe Problem
Personal budgeting apps often bury the one question people actually want answered — "what's safe to spend today?" — under charts, categories, and account jargon. Guardian narrows the dashboard down to that single number, then backs it up with category budgets and monthly progress for anyone who wants more detail.
My Role
I designed and built Guardian's entire client: the Expo/React Native app that runs on iOS, Android, and web from one codebase, the typed API layer, the Firebase authentication flow, and the trusted-viewer sharing system.
Key Technical Decisions
- Strict TypeScript with shared Zod schemas. Every budget, transaction, categorization, and trusted-viewer payload is modeled with Zod and shared between the client and its typed API client, so a shape mismatch is caught by validation instead of surfacing as a runtime crash.
- One networking seam. All API calls run through a single
src/lib/api.tsfile that attaches a Firebase ID token as a bearer token to every request, so screens never callfetchdirectly and the auth logic exists in exactly one place. - One codebase, two layouts. Expo Router renders a five-tab layout on mobile and a sidebar above a 900px breakpoint, reusing the same screen components rather than maintaining separate mobile and web UIs.
- UI-enforced sharing, documented as UI-only. Trusted-viewer sharing (invite by email or code, two-step revoke, read-only dashboard) is built as a client-side boundary, and I documented in the README that a production version would need that same restriction enforced server-side, not just hidden in the UI.
Challenges & Solutions
Automatic merchant categorization needed to feel instant without hammering the API on every keystroke. I debounced the category-suggestion request by 800ms after the merchant field settles, and surfaced a source label (cache, LLM, or fallback) next to the suggested category so the UI stays transparent about where a suggestion came from — with a one-tap manual override always available.
Status & What's Next
Guardian is an explicitly-labeled portfolio prototype: authentication, the budgeting dashboard, transaction entry, category budgets, and trusted-viewer sharing all work end-to-end against a live API. Recent-transaction history, savings goals, bank-account sync, and most profile settings are roadmapped rather than implemented, and the app is upfront about that in its own UI instead of faking finished features.