Inspiration
Forty-five million people in the US live paycheck to paycheck, and a disproportionate share are immigrants and first-generation families navigating an unfamiliar financial system. Every fintech app on the market assumes you already know what a credit score is, what a W-2 is, what a 401(k) is. We built FinPath to dismantle those cold, intimidating barriers and humanize the process of financial literacy and wellness — meeting people where they actually are.
What it does
FinPath is a full-stack financial wellness app that gives underserved communities a personal financial mentor powered by AI. Users complete a guided onboarding assessment and receive a Financial Health Score out of 100, calculated from their debt-to-income ratio, savings runway, and monthly obligations. A large language model then explains that score in plain language, tailored to their specific situation — not generic advice, but actionable guidance based on their actual income, debts, and employment type.
The health score is computed as a weighted sum:
$$S = S_{\text{DTI}} + S_{\text{savings}} + S_{\text{expense}} + S_{\text{emergency}} + S_{\text{base}}$$
where:
Debt-to-income (35 pts):
$$S_{\text{DTI}} = \left(1 - \min\left(\frac{\text{total_debt}}{12 \times \text{monthly_income}}, 1\right)\right) \times 35$$
Savings ratio (25 pts):
$$S_{\text{savings}} = \min\left(\frac{\text{total_savings}}{6 \times \text{monthly_income}}, 1\right) \times 25$$
Expense ratio (20 pts):
$$S_{\text{expense}} = \left(1 - \min\left(\frac{\text{monthly_expenses}}{\text{monthly_income}}, 1\right)\right) \times 20$$
Emergency fund (10 pts):
$$S_{\text{emergency}} = \min\left(\frac{\text{total_savings}}{\max(\text{monthly_expenses}, 1) \times 3}, 1\right) \times 10$$
Baseline (10 pts):
$$S_{\text{base}} = 10$$
Beyond the score, users get a conversational AI mentor that already knows their full financial context, a zero-based or envelope budget with real-time category tracking, a net worth tracker across assets and debts, live transaction simulation with automatic merchant category code tagging, and a learn section with plain-language lessons on topics the existing system takes for granted.
How we built it
- Frontend: Next.js 14 (App Router) with Server Components, deployed on Vercel
- Auth & Database: Supabase with row-level security — every query is scoped to the authenticated user's ID, not by policy but by enforcement boundary
- AI Backend: FastAPI streaming server using Claude (
claude-haiku-4-5-20251001) for cost-efficient real-time responses (~\$0.0005/message), deployed on Render - Design System: Custom Tailwind CSS theme with Material Design 3 tokens, Plus Jakarta Sans and Inter typography
- Real-time: Supabase Realtime subscriptions for live transaction feeds via Postgres change events
- Categorization: MCC (Merchant Category Code) mapping system with fallback chains to automatically classify spending into budget categories
Challenges we ran into
- Conversation memory without storage: We needed the AI mentor to remember context within a session without persisting chat history to a database. We solved this by maintaining the full message array in React state and sending it with each request to Claude's messages API.
- Budget-transaction sync: Transactions posted before a budget category existed wouldn't retroactively appear in the budget. We built a sync engine that replays all transaction history against current budget categories using a fallback chain, and triggers it automatically on budget creation.
- Real-time duplication: Optimistic UI updates from the API response combined with Supabase Realtime subscription events caused duplicate transactions in the feed. We implemented ID-based deduplication and proper state synchronization with server props.
- Cross-origin deployment: Vercel generates unique preview deployment URLs for every build, which broke CORS against our FastAPI backend. We added origin regex matching to handle dynamic subdomains.
- Health score design: Choosing appropriate weights for the financial health score required balancing clinical accuracy with actionability. We settled on DTI as the heaviest factor (35%) because it's the single strongest predictor of financial distress, while giving emergency savings a dedicated 10% component to reward even small safety nets.
Accomplishments that we're proud of
- Every feature — onboarding, health score, AI mentor, budgeting, transactions, net worth, and learn — was built in a single weekend
- The AI mentor contextually understands the difference between a W-2 employee and a 1099 contractor and adjusts its financial advice accordingly
- Sub-two-second interaction times across the entire app on a single developer's laptop
- Row-level security means user data isolation is an enforcement boundary, not just an application-level policy
What we learned
- Financial literacy is not a knowledge problem — it's an accessibility problem. The information exists; it's just locked behind jargon and assumptions about prior knowledge.
- Streaming LLM responses dramatically improve perceived performance and user trust compared to waiting for a complete response.
- MCC codes are surprisingly effective for automatic expense categorization — the card network infrastructure already classifies merchants, and exposing that to users removes the friction of manual entry.
- Designing a health score is as much a UX decision as a math one: the formula has to be legible enough that users trust it, and granular enough that small positive actions move the needle.
What's next for FinPath
- Group savings: Letting users pool money with family and friends across separate banks — a common pattern in immigrant communities that no major fintech supports well
- Spanish language support: Serving users in the language they think in, not just the language the system defaults to
- Real bank integration: Moving from simulated transactions to live bank feeds via Plaid, while keeping the same categorization and budget sync engine
- Tool-calling for the AI mentor: Letting users update their financial data conversationally ("I just got a raise to \$5,000/month") without navigating back through forms
Built With
- claude
- fast-api
- javascript
- next.js
- postgresql
- python
- radixui
- react
- render
- stitch
- supabase
- tailwindcss
- uvicorn
- vercel