# FireTracker ## Was ist das? FIRE-Rechner mit ADHS-Twist: 3 Zahlen eingeben, sofort sehen wann du finanziell frei bist. Assets (Depots, Immobilien, Cash) als Module, Szenario-Slider, 30-Jahres-Projektion — alles lokal, kein Cloud-Account. ## Architektur & Tech-Stack ``` Browser (Tailwind + htmx + Chart.js) | FastAPI main.py | ├── fire_math.py ← reine FIRE-Berechnungen (pure functions) ├── models.py ← SQLAlchemy: UserProfile, Asset, Snapshot ├── schemas.py ← Pydantic: AssetCreate, AssetUpdate, SnapshotCreate └── database.py ← SQLite init + Session | firetracker.db ``` | Schicht | Tech | |---------|------| | Backend | FastAPI + SQLAlchemy + SQLite | | Frontend | htmx + Jinja2 + Tailwind CSS | | Charts | Chart.js (CDN) | | FIRE-Logik | fire_math.py (pure Python, kein Framework) | **Asset-Typen:** depot, immobilie, cash, crypto, pension, other **FIRE-Metriken (berechnet, nicht gespeichert):** - FI Number, Lean/Fat/Coast FIRE, FI%, Savings Rate, Years to FI, FI Date - Monatliche Compound-Growth-Iteration (12 Schritte/Jahr) fuer Genauigkeit ## Starten / Nutzen ```bash cd ~/Projekte/FireTracker source .venv/bin/activate # oder: python3 -m venv .venv && pip install -r requirements.txt uvicorn main:app --reload --port 8050 # → http://localhost:8050 ``` Erststart leitet automatisch auf `/setup` weiter (3 Felder: Einkommen, Ausgaben, Geburtsjahr). ## Was funktioniert - **Setup-Wizard** (`/setup`) — 3 Felder, dann sofort Dashboard - **Dashboard** — FI-%, FI-Datum, Savings Rate, 30J-Projektion, Asset-Uebersicht nach Typ gruppiert - **Assets CRUD** — erstellen, bearbeiten (htmx inline), loeschen; Snapshot wird automatisch angelegt - **Snapshot-Historie** — Wertaenderungen werden als Verlauf gespeichert - **Szenario-API** (`/api/scenario`) — "Was wenn ich X mehr spare?" mit diff_years-Berechnung - **CSV-Import** (`/api/import/csv`) — deutsche Bankformate (Semikolon, Komma als Dezimaltrenner) - **JSON-Export** (`/api/export`) — Profil + Assets + Snapshots als Backup - **Settings-Seite** — alle FIRE-Parameter aenderbar (SWR, Return, Inflation, Rentenalter) ## Was fehlt - ~~seed.py~~ — erledigt (103 LOC), erstellt Demo-Profil + 5 Assets (251.7k gesamt), idempotent - ~~fi_date Edge-Case~~ — gefixt: Overflow via extra_years-Berechnung (fire_math.py:53-57), 4 Tests gruen - **Historische Charts** pro Asset — Snapshots sind in DB, UI-Chart noch nicht implementiert - **Expense Categories** — "faellt bei FIRE weg"-Flag fuer bestimmte Ausgaben (V2 geplant) - **Tests** — 17 Math-Tests passing (test_fire_math.py, 267 LOC) + 3 Playwright E2E-Tests (tests/test_e2e.py, setup/dashboard/asset flow). E2E braucht `playwright install chromium`. Keine Route/API-Tests. ## Entscheidungen & Lessons Learned - **fire_math.py als pure functions** — keine DB-Referenzen, direkt testbar, einfach zu verstehen - **Monatliche Iteration statt Formel** — Compound-Growth-Projektion Monat fuer Monat statt geschlossener Formel: leichter lesbar, minimal langsamer (irrelevant bei 100-Jahres-Cap) - **Single UserProfile** — kein Multi-User, kein Auth; `get_or_create_profile()` erstellt Samuel-Profil beim ersten Request - **Snapshot bei Wertaenderung** — nur wenn `current_value != old_value`, kein Snapshot-Spam - **htmx fuer Asset-CRUD** — kein SPA-Overhead, Server rendert Partial (`partials/asset_list.html`) und tauscht DOM-Block - **Gleicher Stack wie StudyAgent** (FastAPI+SQLite+htmx) — schnelle Entwicklung durch bekannte Patterns ## Next Steps (priorisiert) 1. ~~fi_date Edge-Case fixen~~ — erledigt 2. **Route/API-Tests** — httpx TestClient fuer POST/PUT/DELETE Endpunkte 3. **Historische Chart** pro Asset aus Snapshot-Tabelle 4. **Bank-API** (GoCardless/Nordigen PSD2) fuer automatischen Import