A conversational AI financial decision companion for in-between-income earning Indians (Tier 1/2 cities, ₹40K–1.2L/month). Built as a PM portfolio piece — a rebuild of a HelloPM cohort group project.
Live demo: savio-financial-app.netlify.app
This is a PM portfolio demo, not a real financial product. Priya Sharma's financial state — income, commitments, goals, transactions, reflections — is synthetic seed data, not a real person. Savio is not a financial advisor; see the in-app disclaimer (Profile → Disclaimer) for the full statement. Don't use anything here to make real money decisions.
Most personal-finance apps intervene at the moment of decision — pop a warning when you're about to overspend, block a transaction, nudge you mid-checkout. Savio's thesis is that these moments are the worst time to ask someone to think.
Savio intervenes at book-ending moments instead: the monthly ritual when income lands, the windfall the moment it hits, the post-purchase reflection a few days later. Each one is a quieter, slower moment where the user can actually weigh a decision against their stated rules and goals — and where an AI co-pilot can be useful without being annoying.
The product translates raw financial data into felt consequence, not financial-advisor abstractions. Verdicts cite the user's own rules by name ("over your impulse-wait threshold of ₹3,000"). Close-out shows a deficit alongside a constructive path tied to the user's own safety-net and impulse-wait values. Chat returns structured cards with green/yellow/red signal + tradeoffs + best-next-step.
- 🔗 Live demo — click "Continue as Priya," no registration needed
- 📖 PM_DECISIONS.md — every product decision documented (~100KB; the case-study source of truth)
- 📋 docs/v2-inventory.md — what's deferred to V2, what's a known limitation, what was rejected (the three-tier discipline)
- 🛠️ CLAUDE.md — the engineering context document for the AI agent collaborating on this build
Open the live URL above and click "Continue as Priya" on the Welcome screen — you'll land in Priya Sharma's seeded financial state: ₹98,000 net income, 13 fixed commitments (rent / EMIs / SIPs / utilities), 3 active goals (Phone fund / Emergency fund / Goa trip), ~600 transactions across 6 months, two pending windfalls (Diwali bonus + tax refund).
Five-minute walkthrough:
- Home — Safe to spend daily this month + fixed commitments on track + windfall card + goals tracker
- Chat — Send "Can I afford a ₹3,500 watch?" → verdict card with rule-citation badges, body explaining the math + the impulse-wait rule by name
- Reflect — Label any unlabeled transactions, tap "Show my reflections" → 4s loading with rotating copy → emotion line chart + tap-to-expand per-merchant trend cards behind "Know more"
- Profile → Reviewer tools → Preview [two-months-back] close-out (deficit demo) — see the "Where we can help next" guidance card with a four-paragraph constructive analysis (names driver merchants, cites the impulse-wait rule by value, suggests a tighter threshold, points to Reflect labeling). The month name on the button updates dynamically — the seed always places the big-ticket one-offs in M-2 so the deficit narrative survives calendar rollovers.
- Monthly ritual — 7-screen close-out + setup flow for the M-1 pending ritual (whatever month just ended), with the math-reveal recap card showing income → commitments → goals → variable category net → one-off spending = net leftover
If the cold-start AI calls feel slow on the first chat or first "Show my reflections," that's Vertex JWT mint latency (~6-15s on cold isolates); warm calls are 2-4s.
- Frontend: React 19 + TypeScript + Vite 8 + Tailwind
- Backend: Supabase (Postgres with RLS + Auth + Edge Functions on Deno)
- AI: Vertex AI Gemini 2.5 Flash, accessed via service-account JWT → OAuth Bearer pattern (
supabase/functions/_shared/gemini.ts) - Deploy: Netlify (frontend) + Supabase (everything else)
- Discipline: ESLint with custom rule banning
new Date()outsidesrc/lib/dates.ts(Phase 1DEMO_TODAYpinning),tscclean as a verification gate, 50+ PM_DECISIONS amendments tracking every product call with rationale
Phase 3 complete (tag phase-3-complete, 2026-05-28). Post-tag streams 0.5o through 0.5v shipped — adding rule citation in verdicts, chart-based Reflect surface, math-reveal close-out recap, "Where we can help next" constructive deficit guidance, and the user-rules schema. 50+ commits since the tag.
Phase 3 functionally done; case study writeup (per PM_DECISIONS C.24) is the only remaining work.
src/
├── pages/ # Top-level routes (HomePage, ChatPage, ReflectPage, GoalsPage, ProfilePage, OnboardingPage)
├── components/ # Per-feature components (home, chat, reflect, ritual, windfall, layout, profile)
├── lib/ # Shared business logic (dates, safeToSpend, user-rules, reflect-patterns, guidance, supabase)
└── App.tsx # Routes
supabase/
├── functions/ # Edge Functions (chat-respond, ritual-close-out, onboarding-synthesize, ...)
├── migrations/ # Schema + seed (0001–0019)
└── _shared/ # Code shared across Edge Functions (gemini.ts, user-rules.ts)
scripts/
├── apply-migrations.js # Reset DB + reseed
├── test-chat-7cases.mjs # 9-case chat audit (eyeball-verified)
└── doc1.1-verify.mjs # Seed sanity check
docs/
├── v2-inventory.md # Tier 1/2/3 inventory
├── savio_preview.jsx # Canonical visual reference
└── savio_onboarding.jsx # Onboarding walkthrough reference
PM_DECISIONS.md # The case-study source of truth (~100KB, 130+ entries)
CLAUDE.md # Engineering context document for the AI agent collaborator
# Prerequisites: Node 22 (.nvmrc pinned)
nvm use # or install Node 22 manually
npm install
npm run dev # → http://localhost:5173You'll also need a .env.local with Supabase + Vertex credentials — see .env.example for the shape. The DEMO_PRIYA_PASSWORD and AI integrations need server-side keys; without them, the bundle still builds but auth / chat / Reflect AI won't function.
For deploying to your own Netlify + Supabase project, see the deploy steps documented in PM_DECISIONS.md (search for "Netlify").
Ritika Das — PM in transition, building a portfolio that demonstrates how AI agents and a single PM can ship a multi-stream financial product with traceable decision discipline. [LinkedIn / personal site — add link here]
Built in collaboration with Claude Code (Anthropic) as the agent partner. Every product decision banked in PM_DECISIONS.md carries the rationale a hiring manager could audit.
MIT — see LICENSE.





