{"id":41,"date":"2025-10-31T15:52:39","date_gmt":"2025-10-31T14:52:39","guid":{"rendered":"https:\/\/content.doppel-t.com\/?p=41"},"modified":"2025-10-31T17:29:16","modified_gmt":"2025-10-31T16:29:16","slug":"kontoheld","status":"publish","type":"post","link":"https:\/\/content.doppel-t.com\/index.php\/2025\/10\/31\/kontoheld\/","title":{"rendered":"Mein pers\u00f6nliche Finanz-Dashboard: Warum ich meine Bankdaten lieber selbst verwalte"},"content":{"rendered":"\n<p><\/p>\n\n\n\n<p>Du \u00f6ffnest deine Banking-App, willst schnell sehen, wo dein Geld landet \u2013 und landest in drei verschiedenen Men\u00fcs, ohne echte \u00dcbersicht zu haben. Apps wie Finanzguru versprechen Rettung, aber daf\u00fcr sollen deine Finanzdaten irgendwohin hochgeladen werden, wo du nicht siehst, was damit passiert. Das war f\u00fcr mich der Moment, eine Entscheidung zu treffen: Entweder ich akzeptiere diese Kompromisse, oder ich baue mir das selbst.<\/p>\n\n\n\n<p>Also habe ich angefangen zubauen. Ein Dashboard mit vollst\u00e4ndiger Datenhoheit, automatischer Kategorisierung und einem Desktop-First-Ansatz, der nicht auf Mobile-Kompromisse setzt. Was als Projekt f\u00fcr mein erstes gr\u00f6\u00dferes Laravel-System anfing, wurde zur Auseinandersetzung mit echten FinTech-Problemen: chaotische Bankdaten, Datensicherheit und Automatisierung ohne externe APIs.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"dasproblemmitfremdenlsungen\">Das Problem mit fremden L\u00f6sungen<\/h2>\n\n\n\n<p>Jede Banking-App zeigt Ums\u00e4tze, aber keine von ihnen bietet das, was ich brauchte: eine Gesamt\u00fcbersicht \u00fcber mehrere Konten (Giro, Kreditkarte, Sparkonten) an einer Stelle. Und das mit dem Detail-Level, den nur ein gr\u00f6\u00dferer Bildschirm erm\u00f6glicht. Desktop-Analysen zu Finanzzielen sind einfach anders als auf 5 Zoll zu schwenken und zu scrollen.<\/p>\n\n\n\n<p>Hinzu kam der Datenschutz-Aspekt. Wer meine Transaktionen bekommt, was damit gemacht wird, welche Analysen laufen \u2013 keine dieser Apps macht das transparent. Also habe ich die radikalere Frage gestellt: Was brauche ich technisch, um das selbst zu kontrollieren?<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"diearchitekturentscheidungen\">Die Architektur-Entscheidungen<\/h2>\n\n\n\n<p><strong>Tech-Stack:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Laravel (Backend, Gesch\u00e4ftslogik, Verschl\u00fcsselung)<\/li>\n\n\n\n<li>React (Frontend, interaktive Analysen)<\/li>\n\n\n\n<li>SQL-Datenbank (strukturierte Transaktionsdaten)<\/li>\n<\/ul>\n\n\n\n<p>Die Kombination war bewusst gew\u00e4hlt: Laravel bringt built-in Sicherheitsfeatures mit (Verschl\u00fcsselung, Validierung, Middleware), React erm\u00f6glicht die komplexen Visualisierungen ohne Seitenneuladen. Externe Tools wie n8n f\u00fcr Workflow-Automatisierung habe ich bewusst nicht gew\u00e4hlt \u2013 nicht aus Purismus, sondern aus praktischem Grund: Sobald sensible Finanzdaten die App verlassen, wird Datenschutz zum Problem. Eine API daf\u00fcr zu bauen w\u00e4re ein zus\u00e4tzliches Sicherheitsrisiko gewesen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"diecsvimporthlle\">Die CSV-Import-H\u00f6lle<\/h2>\n\n\n\n<p>Der erste echte Problemfall: Die Daten. Jede Bank exportiert ihr CSV-Format selbst. Sparkasse nutzt anderes Format als Tomorrow Bank. Dezimaltrennzeichen: manchmal Komma, manchmal Punkt. Datumsformat: DD.MM.YYYY oder YYYY-MM-DD? Und wie wird eine Ausgabe gekennzeichnet \u2013 mit Minuszeichen oder in einer separaten &#8222;Soll&#8220;-Spalte?<\/p>\n\n\n\n<p>Manuell jede Bank mappen w\u00e4re m\u00f6glich, aber nicht skalierbar. Also entstand eine intelligente Importstrecke.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"automatischeschemaerkennungstattmanuelleschaos\">Automatische Schema-Erkennung statt manuelles Chaos<\/h3>\n\n\n\n<p>Das System analysiert die hochgeladene CSV und vergleicht sie mit hinterlegten Bank-Schemata. F\u00fcr Sparkasse und Tomorrow sind Templates definiert \u2013 erkennt das System eines davon, l\u00e4dt es die richtige Konfiguration.<\/p>\n\n\n\n<p>Falls keine \u00dcbereinstimmung existiert, greift der manuelle Modus: Nutzer mappen Spalten zu Datenfeldern (Datum, Empf\u00e4nger, Betrag, Beschreibung). Eine Vorschau zeigt, wie die Daten sp\u00e4ter aussehen. Erst dann werden sie in die Datenbank geschrieben. Das bedeutet: Nach dem ersten Import einer neuen Bank speichert das System deren Schema, k\u00fcnftige Importe laufen vollautomatisch.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"datensicherheitalsfundamentalesfeature\">Datensicherheit als fundamentales Feature<\/h2>\n\n\n\n<p>Wir sprechen hier \u00fcber Kontost\u00e4nde, IBAN, Transaktionspartner \u2013 Informationen, die extremen Schutz ben\u00f6tigen. Meine L\u00f6sung: AES-256-CBC Verschl\u00fcsselung f\u00fcr alle sensiblen Felder.<\/p>\n\n\n\n<p>Das ist nicht optional und nicht nur auf die Datenbank angewendet \u2013 die Verschl\u00fcsselung l\u00e4uft transparent \u00fcber Laravels Encryption Facade. Der Vorteil: Entwickler m\u00fcssen nicht selbst Kryptographie implementieren (Fehlerquelle!), stattdessen wird Verschl\u00fcsselung und Fehlerbehandlung vom Framework \u00fcbernommen.<\/p>\n\n\n\n<p><strong>Verschl\u00fcsselte Felder:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>IBANs und Kontoinformationen<\/li>\n\n\n\n<li>Betr\u00e4ge (ja, auch die)<\/li>\n\n\n\n<li>Empf\u00e4nger und Absender<\/li>\n\n\n\n<li>Transaktionsbeschreibungen<\/li>\n<\/ul>\n\n\n\n<p>Ein direkter Datenbankzugriff zeigt nur Cipher-Text. Entschl\u00fcsselt werden Daten erst in der App, unmittelbar vor der Anzeige. Das bedeutet: Selbst wenn jemand die Datenbank kopiert, hat er nur verschl\u00fcsselte Strings.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"automatischekategorisierungoderwarumich250transaktionennichtmanuellmappenwollte\">Automatische Kategorisierung \u2013 oder: Warum ich 250 Transaktionen nicht manuell mappen wollte<\/h2>\n\n\n\n<p>Nach dem Import liegt eine gro\u00dfe Tabelle vor: Transaktionen, aber ohne Kategorien. W\u00e4re jede der 250 Transaktionen manuell zuzuordnen (Lebensmittel, Wohnen, Shopping, Medien, Transport), w\u00e4re das zeitlich nicht skalierbar.<\/p>\n\n\n\n<p>Also n\u00e4chste Baustelle aufmachen.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"dieautomationsengine\">Die Automations-Engine<\/h3>\n\n\n\n<p>Die Engine basiert auf einfachen, aber effektiven Regeln. Eine Regel: Wenn &#8222;Empf\u00e4nger&#8220; enth\u00e4lt &#8222;Edeka&#8220;, &#8222;Lidl&#8220;, &#8222;Aldi&#8220; oder &#8222;Kaufland&#8220;, dann Kategorie &#8222;Lebensmittel&#8220;. Oder: Wenn Empf\u00e4nger ist &#8222;Netflix&#8220;, &#8222;Spotify&#8220;, &#8222;Disney+&#8220;, dann &#8222;Medien&#8220;.<\/p>\n\n\n\n<p><strong>Unterst\u00fctzte Operatoren:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>&#8222;ist gleich&#8220;<\/li>\n\n\n\n<li>&#8222;enth\u00e4lt&#8220;<\/li>\n\n\n\n<li>&#8222;beginnt mit&#8220;<\/li>\n\n\n\n<li>&#8222;endet mit&#8220;<\/li>\n<\/ul>\n\n\n\n<p>Mehrere Bedingungen lassen sich kombinieren. Regeln k\u00f6nnen entweder bei jedem Import automatisch laufen oder manuell auf Knopfdruck. Der entscheidende Vorteil: Diese Integration bleibt innerhalb der App. Keine externe API, keine Daten\u00fcbertragung \u2013 die Automation l\u00e4uft direkt in Laravel als Background Job nach jedem Import.<\/p>\n\n\n\n<p>Das System kommt mit Default-Regeln f\u00fcr h\u00e4ufige Transaktionspartner. Aber Nutzende k\u00f6nnen eigene Regeln definieren. Ein neuer Lieblingsladen? Neue Regel. Nach kurzer Zeit haben sich die meisten Transaktionen selbst kategorisiert, nur noch Edge Cases brauchen Nachbearbeitung.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"analysendaseigentlicheziel\">Analysen: Das eigentliche Ziel<\/h2>\n\n\n\n<p>Saubere Daten sind nur Mittel zum Zweck. Das Ziel: Verstehen, wohin das Geld wirklich flie\u00dft.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"zeitlicheflexibilitt\">Zeitliche Flexibilit\u00e4t<\/h3>\n\n\n\n<p>Ein zentraler Datumsselektor mit Quick-Select-Optionen:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Gesamter verf\u00fcgbarer Zeitraum<\/li>\n\n\n\n<li>Letzter Monat, dieser Monat<\/li>\n\n\n\n<li>Letzte 3, 6 oder 12 Monate<\/li>\n\n\n\n<li>Dieses Jahr, letztes Jahr<\/li>\n\n\n\n<li>Spezifisches einzelnes Datum<\/li>\n<\/ul>\n\n\n\n<p>Diese Flexibilit\u00e4t erm\u00f6glicht sowohl gro\u00dfe Trends als auch Details zu sehen.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"visualisierungenstatttabellen\">Visualisierungen statt Tabellen<\/h3>\n\n\n\n<p>Ein Donut-Diagramm zeigt die \u00dcbersicht: Gesamtausgaben, Ersparnisse, verbleibendes Budget auf einen Blick. Ein Breakdown nach Kategorien wird prozentual dargestellt \u2013 Wohnen 25,1%, Sparen und Investieren 16,8%, Shopping 12,6%, Lebensmittel 17%.<\/p>\n\n\n\n<p>Das Spannendste: Monatliche Vergleiche nebeneinander. Januar vs. Februar als gestapelte Balkendiagramme. Wo wurde mehr ausgegeben? Welche Kategorien sind gestiegen?<\/p>\n\n\n\n<p>War Shopping im Januar noch wild, im Februar aber deutlich reduziert? Sind Lebensmittelkosten konstant oder volatil? Diese visuellen Vergleiche erm\u00f6glichen datenbasierte Finanzentscheidungen \u2013 nicht Bauchgef\u00fchl.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"wasliefnichtoptimalundwasichdarausgelernthabe\">Was lief nicht optimal \u2013 und was ich daraus gelernt habe<\/h2>\n\n\n\n<p><strong>Die gr\u00f6\u00dften Herausforderungen waren nicht technisch, sondern konzeptionell.<\/strong><\/p>\n\n\n\n<p>Zuerst dachte ich, dass die Datenbankstruktur das komplexeste Element ist. Tats\u00e4chlich war es die Datenharmonisierung. Jede Bank hat ihre eigenen Konventionen \u2013 das ist nicht zu untersch\u00e4tzen. Der Import-Flow musste iterativ \u00fcberarbeitet werden, nachdem erste Tests mit echten CSVs zeigten, dass die automatische Erkennung Edge Cases nicht abdeckte.<\/p>\n\n\n\n<p>Die Rule-Engine war auch nicht beim ersten Mal perfekt. Manche Transaktionen erf\u00fcllen mehrere Regeln gleichzeitig \u2013 hier musste ich eine Priorisierungslogik einbauen. Sp\u00e4ter kam die Erkenntnis, dass &#8222;Smart Defaults&#8220; hilfreicher sind als zu viele Optionen f\u00fcr Nutzer.<\/p>\n\n\n\n<p>Bei der Verschl\u00fcsselung h\u00e4tte ich fr\u00fcher merken sollen, dass ich zwar Laravels built-in Features nutze, aber noch nicht eingehend genug die Performance-Implikationen \u00fcberpr\u00fcft habe. Gro\u00dfe Datasets mit AES-256 zu verarbeiten ist nicht instant, sondern braucht Optimierung (z.B. Selective Encryption statt alles zu verschl\u00fcsseln).<\/p>\n\n\n\n<p><strong>Das Lernen aus diesen Punkten:<\/strong><\/p>\n\n\n\n<p><p><strong>Datenquellen sind chaotischer als Businesslogik.<\/strong> Das untersch\u00e4tzen viele Entwickler. Jede externe Datenquelle hat ihre eigenen Quirks.<\/p><\/p>\n\n\n\n<p><p><strong>Integration schl\u00e4gt Orchestrierung.<\/strong> Externe Workflow-Tools h\u00e4tten die L\u00f6sung vereinfacht, aber verschl\u00fcsselte Daten aus der App zu bringen ist die echte Komplexit\u00e4t. Integriert zu sein bedeutet: Die Automation l\u00e4uft sicherer.<\/p><\/p>\n\n\n\n<p><p><strong>Defaults sind m\u00e4chtiger als Flexibilit\u00e4t.<\/strong> 80% der Nutzer wollen wahrscheinlich nur, dass das System automatisch funktioniert. Die restlichen 20% brauchen Custom-Rules \u2013 aber nicht alle Nutzer.<\/p><\/p>\n\n\n\n<p><p><strong>Performance fr\u00fch testen.<\/strong> Mit 250 Transaktionen merkt man Verschl\u00fcsselungs-Overhead nicht. Bei 5000 wird es relevant.<\/p><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"ausblickwasnochfehlt\">Ausblick: Was noch fehlt<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Beta Tester<\/h3>\n\n\n\n<p>Noch hat die App genau einen Nutzer: mich. Ein Deployment und anschlie\u00dfendes Einladen von Family &amp; Friends w\u00e4re eine gute Gelegenheit, die UX und das UI noch weiter zu testen und zu iterieren. <\/p>\n\n\n\n<p><strong>Automatische Bankanbindung<\/strong><\/p>\n\n\n\n<p>Die FinAPI w\u00fcrde den n\u00e4chsten Schritt bedeuten: echte API-Verbindung zu Banken, Echtzeit-Synchronisation, kein manueller CSV-Import mehr. Die Herausforderung: Das erfordert noch intensivere Auseinandersetzung mit Datensicherheit bei externen Verbindungen. Aber es w\u00e4re der logische n\u00e4chste Schritt f\u00fcr weniger Reibung.<\/p>\n\n\n\n<p><strong>KI f\u00fcr strukturierte Insights<\/strong><\/p>\n\n\n\n<p>Mit den strukturierten Daten k\u00f6nnten konkrete KI-Analysen arbeiten. Nicht vage Vorschl\u00e4ge, sondern: &#8222;Du gibst im Durchschnitt 47\u20ac pro Lebensmitteleinkauf aus. In Kategorie X k\u00f6nntest du 12% sparen.&#8220; Kombiniert mit Kassenzettel-Scans w\u00e4re sogar granulares Produkt-Level-Tracking m\u00f6glich.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Haushaltskonten<\/h3>\n\n\n\n<p>Verbinden von zwei Accounts zu einem gemeinsamen Haushaltskonto (entweder vollst\u00e4ndig oder Granulat ausgew\u00e4hlt) k\u00f6nnte die \u00dcbersicht \u00fcber mehrere Konten von mehreren Personen erm\u00f6glichen. <\/p>\n\n\n\n<p><strong>Budgetplanung und Prognosen<\/strong><\/p>\n\n\n\n<p>Auf Basis historischer Daten: Warnungen bei Budget-\u00dcberschreitungen, Prognosen f\u00fcr kommende Monate, vielleicht sogar Vergleiche mit anonymisierten Durchschnittswerten \u00e4hnlicher Personen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"fazit\">Fazit<\/h2>\n\n\n\n<p>Das Projekt ist nicht einfach &#8222;ein Finanz-Dashboard&#8220;. Es ist ein Projekt mit steiler Lernlkurve in der Technologie und wie sich UX im Laufe der Zeit selbstst\u00e4ndig weiterentwickeln kann. Und pl\u00f6tzlich baut man ein kleines FinTech-Systems mit intelligenter Datenspeicherung, Automatisierung und Analysen \u2013 alles unter vollst\u00e4ndiger Kontrolle.<\/p>\n\n\n\n<p>Die gr\u00f6\u00dften Erkenntnisse liegen nicht in der Technologie selbst, sondern darin, wie man chaotische externe Daten in ein sauberes, internes System transformiert. Und dass Datensicherheit nicht sp\u00e4ter gel\u00f6st wird, sondern von Anfang an Teil der Architektur sein muss.<\/p>\n\n\n\n<p>F\u00fcr mich ist es gleichzeitig ein Portfolio-Projekt geworden \u2013 ein Beweis, dass ich nicht nur code schreibe, sondern Systeme baue, die ein echtes Problem l\u00f6sen.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Vollst\u00e4ndig selbst entwickeltes und self-hosted Finanzdashboard mit automatischer Kategorisierung, Verschl\u00fcsselung und granularen Analysen \u00fcber Kategorien und Zeitr\u00e4ume<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[3,4,23,24,25,26,27,28],"class_list":["post-41","post","type-post","status-publish","format-standard","hentry","category-allgemein","tag-authentication","tag-automation","tag-csv-import","tag-data-encryption","tag-laravel","tag-mysql","tag-react","tag-tailwind"],"_links":{"self":[{"href":"https:\/\/content.doppel-t.com\/index.php\/wp-json\/wp\/v2\/posts\/41","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/content.doppel-t.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/content.doppel-t.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/content.doppel-t.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/content.doppel-t.com\/index.php\/wp-json\/wp\/v2\/comments?post=41"}],"version-history":[{"count":3,"href":"https:\/\/content.doppel-t.com\/index.php\/wp-json\/wp\/v2\/posts\/41\/revisions"}],"predecessor-version":[{"id":75,"href":"https:\/\/content.doppel-t.com\/index.php\/wp-json\/wp\/v2\/posts\/41\/revisions\/75"}],"wp:attachment":[{"href":"https:\/\/content.doppel-t.com\/index.php\/wp-json\/wp\/v2\/media?parent=41"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/content.doppel-t.com\/index.php\/wp-json\/wp\/v2\/categories?post=41"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/content.doppel-t.com\/index.php\/wp-json\/wp\/v2\/tags?post=41"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}