Finance should feel like a game you're winning, not a spreadsheet you're losing.
A self-hosted personal finance platform. The mission: make managing money genuinely enjoyable β through clarity, progress, and a sense of level-up. Not another budgeting tool that guilts you. A compass that shows where you stand, what to do next, and celebrates when you move forward.
AI-powered ingestion handles the messy part β getting data out of bank CSVs, PDFs, and screenshots automatically so you spend time on decisions, not data entry.
Cashflow tracking, assets management, investment portfolio, spending analysis, and financial journey gamification are all live. Everything else is being built out one level at a time.
Most people aren't financially illiterate β they're directionally lost. They know saving is good. They know investing matters. But nobody handed them a map for in what order and how much is enough at each step.
This app is built for that person. Not the finance nerd with five brokerage accounts. The person who earns a decent salary, vaguely saves, occasionally invests, and still feels like they're not making real progress β because they don't have a framework, not because they lack money.
The Financial Pyramid gives them the framework. The app turns it into a game they can actually win.
Most people don't have a money problem. They have a clarity and direction problem.
They earn, they spend, they occasionally invest β but without a coherent picture of where they stand or a framework for what to do next. Every financial tool they use answers a different slice of the question in isolation: a budgeting app here, a broker app there, a bank statement downloaded once a month that nobody reads. Plenty of data, no map.
The result is a financially active person who still feels stuck. Not because they're doing nothing β but because they don't know if what they're doing is the right thing at their level. Someone maxing out their investment portfolio while carrying high-interest debt. Someone diligently saving without knowing whether their emergency fund is adequate. Someone who opened a FIRE calculator before they've ever tracked a month of spending. Good intentions, wrong order.
That's the problem the Financial Pyramid is designed to fix. Financial health isn't a checklist β it's a hierarchy. Each level has prerequisites. You can't defend what you haven't yet built. You can't grow what you haven't defended. The pyramid makes the order explicit, so every decision has context: this is the level you're on, this is what matters here, this is what unlocks next.
This platform is built around that framework end-to-end. The data infrastructure (automatic ingestion from any Indonesian bank format, unified cashflow + assets + investments in one place) exists to feed the framework β so your pyramid scores reflect reality, not estimates. The gamification layer exists to make progress feel like progress, not just another month of tracking. The whole system points at one question: not "where did my money go?" but "how far up the pyramid am I, and what's my next move?"
Let's make finance fun!
Every feature in this app is anchored to a single framework β the financial pyramid hierarchy. Think of it as a compass for your financial life: it tells you where you are, where you're headed, and what to do right now at your level β not in ten years.
You can't invest well without a safety net. You can't build a safety net without understanding your cashflow. Skipping levels is how people end up with crypto portfolios and no emergency fund. The pyramid makes the correct order explicit, so every decision has context.
β²
ββββ L5 Β· Legacy
Estate Planning Β· Succession Β· Tax Planning
ββββββββ L4 Β· Freedom
FIRE Calculator Β· Passive Income
ββββββββββββ L3 Β· Growth
Investments Β· Savings Goals
ββββββββββββββββ L2 Β· Defense
Assets Β· Emergency Fund
ββββββββββββββββββββ L1 Β· Foundations
Cashflow Β· Budgeting Β· Recurring
Each level unlocks naturally from the one below. The app tracks your score across all five tiers and surfaces exactly where to focus next β no guessing, no overwhelm, no shame. Just: here's your level, here's your next quest.
| Feature | Status |
|---|---|
| Cashflow tracking (upload, categorize, review) | β Live |
| Spending analysis (Safe-to-Spend, variance) | β Live |
| RAG β semantic search over transactions | π In Progress |
| Budgeting (50/30/20, zero-based, envelope) | π Soon |
| Recurring (bills, subscriptions, due dates) | π Soon |
| Feature | Status |
|---|---|
| Assets & balance sheet (net worth, liabilities) | β Live |
| Emergency Fund tracker | π Soon |
| Feature | Status |
|---|---|
| Investment portfolio (IDX, funds, bonds, crypto, P2P) | β Live |
| Savings Goals | π Soon |
| Feature | Status |
|---|---|
| FIRE Calculator | π Soon |
| Passive Income tracker | π Soon |
| Feature | Status |
|---|---|
| Estate Planning (hibah, warisan, wills, trusts) | π Soon |
| Succession (business ownership transfer) | π Soon |
| Tax Planning (SPT, PTKP, deductibles) | π Soon |
Upload bank statements from BCA, Superbank, NeoBank, Wise, or Bank Jago β CSV, PDF, or screenshot β and get a unified transaction history across all accounts.
- Hybrid parser: CSV files parsed directly (fast, zero AI cost); PDFs and screenshots go through Gemini / Claude for structured extraction; Superbank PDF uses bank-specific LLM prompt
- IBankSignature registry (Chain of Responsibility) detects the bank from file content and dispatches to the correct parser β adding a new bank = adding one class
- 4-layer auto-categorization: rule-match (106 rules) β category presets β history cache β LLM fallback (Gemini). Cold-start safe β preset seed covers new users.
- Bulk AI categorization in upload preview β select uncategorized rows and hit β¦ Suggest for batch Gemini classification
- 4-step upload wizard β drag/drop, file picker, or clipboard paste; PDF password support; inline editing before save
- Cashflow workspace: Overview, Transactions table (server-paginated, filterable, CSV export), Cash Flow Statement (quarterly/monthly)
- Three-tier deduplication so nothing gets imported twice
β Engineering details: parser routing, bank detection (IBankSignature chain), validation pipeline, and master schema β docs/features/cashflow-ingestion.md
Track everything you own and owe in one place.
- Asset registry: property, vehicles, savings accounts, cash, valuables, and other assets with current valuations
- Liability tracking: loans, mortgages, BNPL, and other debts
- Live net worth calculation β total assets minus total liabilities, updated as you add or edit entries
- Balance sheet view with categorized breakdown
Track your full investment picture across Indonesian market instruments.
- Stocks (IDX), mutual funds, government bonds (SBN/ORI), crypto, P2P lending
- Portfolio overview with allocation breakdown and total valuation
- Return tracking per instrument
Understand where your money actually goes.
- Safe-to-Spend indicator β compares income vs committed expenses to show discretionary headroom
- Variance explainer β highlights categories that deviated from the prior period
- Monthly spending breakdown with category drilldown
The gamification layer that ties everything together. Progress through the five pyramid levels, earn scores, complete quests.
- Five tiers: Foundations β Defense β Growth β Freedom β Legacy β each with 2β3 scored indicators
- Living Garden Hero β 5 animated plants grow as your scores improve; each plant has 4 growth stages tied to your level progress
- No-decay rule β plants never shrink when scores dip (peak stage persisted in localStorage)
- Quest cards with actionable next steps per tier, activity streak heatmap
- The journey page is the home screen β it always shows where you are in the pyramid and what to do next
The platform doubles as the implementation vehicle for a 90-day AI Engineering learning path.
- Langfuse AI observability β cost/day, calls/day, p50/p95 latency, and token counts per LLM call; Gemini and Anthropic provider traces visible in Langfuse dashboard (PF-AI001)
- 20-fixture extraction eval harness β benchmarks Gemini 2.5 Flash vs Claude Sonnet 4.6 on real anonymized bank statement fixtures; row-level F1 + field-level accuracy; results auto-saved to
evals/results/YYYYMMDD.json(PF-AI002 β Gemini 2.5 Flash 100% row F1 confirmed) - RAG pipeline in progress β pgvector embeddings + semantic search (
POST /embed-transactions+POST /search); re-ranking +/askendpoint to follow (PF-AI003/AI004)
- Dark/light theme with zen-mode UX β focus mode toggle, clean minimal interface
- System health dashboard at
/statusβ polls all services every 30 seconds - LGTM observability stack β OpenTelemetry traces, metrics, and logs across .NET API and Python AI service, surfaced in Grafana
Prerequisites: Docker Desktop, Node.js 20+, .NET 10 SDK, Python 3.12+, Supabase CLI
# 1. Configure environment
cp .env.example .env
# Add GEMINI_API_KEY (or ANTHROPIC_API_KEY) and Supabase keys
cp services/ai-service/.env.example services/ai-service/.env
# Add AI_PROVIDER=gemini and GEMINI_API_KEY
# 2. Start everything
npm start| URL | What |
|---|---|
| http://localhost:8080 | The app |
| http://localhost:8080/journey | Your pyramid progress |
| http://localhost:8080/status | Service health |
| http://localhost:54323 | Supabase Studio |
| http://localhost:3000 | Grafana |
Go to Cashflow β Upload, drop in a BCA CSV or any PDF, review the preview, hit Submit.
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β React 18 Frontend β
β ββββββββββββββββββββ ββββββββββββββββββββββββββββββββββββββ β
β β @supabase/js β β REST calls via fetch() β β
β β - Auth (login) β β - CRUD, upload, dashboard, etc. β β
β β - Realtime sub β β - Bearer token from Supabase Auth β β
β ββββββββββ¬ββββββββββ βββββββββββββββββ¬βββββββββββββββββββββ β
βββββββββββββΌβββββββββββββββββββββββββββββββΌβββββββββββββββββββββββ
β direct β via .NET API
βΌ βΌ
βββββββββββββββββββββββββ ββββββββββββββββββββββββββββββββββββββββ
β Supabase Platform β β .NET 10 Web API (C#) β
β β β Controllers β MediatR (CQRS) β
β Auth (GoTrue/JWT) β β FluentValidation β
β Storage (buckets) βββΌββββ€ Infrastructure: β
β Realtime (WS) β β - supabase-csharp (PostgREST) β
β Database Webhooks ββββΌββ β - StorageService (Supabase Storage)β
β β β β - CSV Parsers (BCA, Wise, Default) β
β βββββββββββββββββββ β β β - Validation Pipeline β
β β PostgreSQL 17 β β β ββββββββββββββββββββββββββββββββββββββββ
β β + pgvector β β β
β β transactions β β β Webhook POST on INSERT
β β category_rules β β β
β β statement_ β β β ββββββββββββββββββββββββββββββββββββ
β β uploads β β ββββΊ Python AI Service (FastAPI) β
β β embeddings β β β 1. Download from Storage β
β β (RLS enforced) ββββΌβββββββ€ 2. PyMuPDF / Claude Vision β
β βββββββββββββββββββ β β 3. Claude tool_use extraction β
β β β 4. Write results via supabase-pyβ
βββββββββββββββββββββββββ ββββββββββββββββββββββββββββββββββ
Coming next: Supabase Auth (PF-S08), RAG Phase 1 embeddings + semantic search (PF-AI003), event-driven webhook pipeline replacing synchronous AI calls (PF-S11), Realtime status updates (PF-S12). Full target architecture: docs/architecture/architecture-diagram.md
| Layer | Technology |
|---|---|
| Frontend | React 18 Β· Vite Β· TypeScript Β· Tailwind CSS Β· shadcn/ui |
| Backend API | .NET 10 / C# 13 Β· ASP.NET Core Β· CQRS via MediatR Β· Clean Architecture |
| Persistence | Supabase (PostgreSQL 17 + pgvector) via supabase-csharp β no ORM |
| AI Service | Python 3.12 Β· FastAPI Β· Gemini 2.5 Flash (primary) Β· Claude Sonnet 4.6 (alternate) |
| Document parsing | PyMuPDF (pre-LLM PDF extraction) Β· LLM vision (images) |
| Observability | OpenTelemetry β Alloy β Prometheus + Loki + Tempo β Grafana |
| Containers | Docker Compose V2 |
apps/
frontend/ # React 18 + Vite β api/, components/, pages/, types/
api/ # .NET 10 Clean Architecture β Api, Application, Domain, Infrastructure
services/
ai-service/ # Python FastAPI β providers (Gemini, Anthropic), LlmParser, PdfExtractor
supabase/
migrations/ # SQL migrations
docs/ # Architecture, sprint plan, bank format reference
npm start # everything
cd apps/frontend && npm run dev # frontend only
cd apps/api && dotnet run --project src/PersonalFinance.Api # backend only
cd services/ai-service && uvicorn app.main:app --reload --port 8000 # AI service only
npm run e2e # Playwright E2E
cd apps/api && dotnet test # backend unit tests



