Case study · Fintech
LedgerFlow: platforma finansów osobistych
Multi-tenantowa platforma do budżetowania i prognozowania z importem wyciągów bankowych i kategoryzacją transakcji przez AI.
- Branża
- Finanse osobiste
- Czas realizacji
- 5 tygodni do produkcji
- Rok
- 2026
- Usługi
- Inżynieria produktu, Integracja AI, DevOps
Problem
Aplikacje do budżetowania dzielą się na dwa obozy. Chmurowe serwisy, które chcą dostępu do twojego banku i handlują twoimi nawykami, albo arkusze kalkulacyjne, które umierają w trzecim tygodniu ręcznego wklepywania. Właściciel nie chciał żadnego z nich: pełna własność danych, prawdziwe prognozowanie i import z banku, którego eksporty CSV używają kodowania Windows-1250, czternastu słabo udokumentowanych kolumn i nie mają stabilnych identyfikatorów transakcji.
Co zbudowaliśmy
Self-hosted platformę finansów osobistych: transakcje, budżety, wykrywanie płatności cyklicznych, reguły kategoryzacji i prognozowanie cash flow. Multi-tenant od pierwszej migracji, więc obsłuży rodzinę albo mały zespół bez przepisywania od zera.
Najciekawsze problemy siedziały w pipelinie:
- Import bankowych CSV, który przeżywa zderzenie z rzeczywistością. Eksport z banku nie ma unikalnego ID transakcji, więc deduplikacja opiera się na hashu treści z polem referencji bankowej. Detekcja kodowania radzi sobie z plikami CP1250, które kłamią o własnym charsecie.
- Kategoryzacja AI z pętlą feedbacku. Nowe transakcje przechodzą przez LLM gateway do kategoryzacji. Każda ręczna poprawka staje się trwałą regułą, więc model ma z czasem coraz mniej roboty, zamiast powtarzać te same błędy.
- Prognozowanie. Transakcje cykliczne są wykrywane z historii i rzutowane w przód, dając kroczącą krzywą cash flow zamiast statycznej tabeli budżetu.
Architektura
Backend w FastAPI z row-level security w PostgreSQL dla izolacji tenantów, Redis i Celery do zadań importu i kategoryzacji, frontend jako SPA w React. Całość jedzie w kontenerach Dockera za reverse proxy Traefik z automatycznym TLS, a deployment to git pull i jedna komenda compose.
Wywołania LLM idą przez self-hosted gateway z failoverem między providerami, więc kategoryzacja działa dalej, gdy któryś provider dławi ruch, a koszty trzymają się blisko zera na darmowych tierach.
Bezpieczeństwo
Row-level security wymuszone w bazie, nie tylko w warstwie API. Sekrety żyją w gitignorowanych plikach env. Sesje są po stronie serwera. Publiczna powierzchnia to jeden endpoint TLS za reverse proxy z rate limitingiem i nagłówkami bezpieczeństwa.
Efekt
Miesięczne zamknięcie, które kiedyś zjadało cały wieczór w arkuszu, teraz sprowadza się do jednego uploadu CSV. Trafność kategoryzacji przekroczyła 95 procent w kilka tygodni dzięki pętli poprawka-reguła. Platforma działa na mini PC i od startu przetrwała każdy kaprys bankowego eksportu.