A premium personal-finance terminal that doesn't just show you where your money went — it actively helps you spend less. Dense, dark, keyboard-first. Built with Next.js 16, TypeScript, Tailwind v4, Framer Motion, and Recharts.
Your data is your own. VAULT ships with no sample data — every account, transaction, budget, and goal is entered by you, and it's all remembered so you can track spending over time.
- Dashboard — net position, spend-vs-budget ring, spend velocity, category breakdown, insights
- Transactions — fast keyboard entry (
n), CSV import with column-mapping + auto-categorization - Budgets — threshold-aware progress, days-left pacing, rollover, 80% / 100% alerts (email-capable)
- Insights — explainable, rule-based findings (spikes, anomalies, budget risk) with one-tap actions
- Goals — savings & debt-payoff with progress rings and monthly-needed pacing
- Subscriptions — auto-detected recurring charges + a kill-list
- Reports — monthly summary with a real PDF export
- ⌘K command palette, light/dark, fully keyboard-navigable, reduced-motion aware
npm install
npm run dev
# http://localhost:3000That's it — no environment variables required. VAULT runs in local mode: sign up with any email/password and your data is saved privately in your browser (localStorage). Each person who visits gets their own private vault.
- Push this repo to GitHub.
- Import it at vercel.com/new — Vercel auto-detects Next.js.
- Deploy. No env vars needed for local mode.
Anyone who opens your deployment can sign up and start tracking — their data lives in their own browser.
VAULT works fully without any of these. Add them when you want more.
| Capability | Env vars | Notes |
|---|---|---|
| Cloud sync (multi-device, real auth) | NEXT_PUBLIC_SUPABASE_URL, NEXT_PUBLIC_SUPABASE_ANON_KEY |
Create a Supabase project, then run the SQL in supabase/migrations (schema + Row Level Security + aggregation RPCs). Enable Google OAuth in the Supabase dashboard for the Google button. |
| Budget alert emails | RESEND_API_KEY, RESEND_FROM |
Resend. Without a key, alerts are simulated in-app. |
| Account Aggregator (RBI) bank linking | NEXT_PUBLIC_ENABLE_AA=true |
Stretch stub only — real linking needs a licensed AA provider (Setu/Finvu/OneMoney). Off by default. |
Copy .env.example to .env.local and fill in what you need. With Supabase configured, VAULT
automatically switches from local mode to cloud mode — no code changes.
Insights are deterministic and rule-based — no LLM / Claude API is used or required.
npm run dev # local dev
npm run build # production build
npm run start # serve the production build
npm run lint # eslint
npm run typecheck # tsc --noEmitNext.js 16 (App Router) · TypeScript (strict) · Tailwind CSS v4 · Framer Motion · Recharts · TanStack Query · Zustand · React Hook Form + Zod · Supabase (optional) · Resend (optional) · @react-pdf/renderer.
src/
app/ routes — (auth), (app) shell, onboarding, api/
components/ ui primitives, charts, feature views, shell
lib/
data/ repository (Supabase or local), aggregates, hooks, default categories
auth/ session, server actions, local session
insights/ rule-based insight generator
budgets/ goals/ subscriptions/ reports/ feature logic
supabase/ clients + config
store/ Zustand UI state (sidebar, theme, toasts, …)
supabase/migrations/ schema + RLS + aggregation RPCs