{"id":1,"date":"2026-02-04T11:55:58","date_gmt":"2026-02-04T11:55:58","guid":{"rendered":"https:\/\/raphael-muesseler.de\/?p=1"},"modified":"2026-02-22T13:46:55","modified_gmt":"2026-02-22T13:46:55","slug":"financer","status":"publish","type":"post","link":"https:\/\/raphael-muesseler.de\/index.php\/2026\/02\/04\/financer\/","title":{"rendered":"Financer \u2014 Why I Built My Own Finance Tracker (And Rebuilt It. Twice. Okay, Three Times.)"},"content":{"rendered":"\n<p>Back in 2018, I had a simple problem: I wanted to track my income and expenses without handing my financial data over to some big tech company. Sounds reasonable, right? Every finance app I found either required a subscription, lived in someone else&#8217;s cloud, or wanted access to my bank account. No thanks.<\/p>\n\n\n\n<p>So I did what any reasonable software engineer would do \u2014 I built my own.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>The Early Days<\/strong><\/h3>\n\n\n\n<p>The first version of Financer was a desktop application built with JavaFX. It was simple, it was local, and it did the job. But I quickly realized I wanted something I could access from anywhere \u2014 not just from one machine. Time for a rewrite.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>The Rebuilds<\/strong><\/h3>\n\n\n\n<p>Version two became a proper web app: a Java Spring backend with a React frontend. It worked well, I learned a ton about Domain Driven Design and full-stack architecture, and it gave me exactly what I wanted. But as my skills and opinions about tech evolved, so did the project. The third and current iteration runs on Next.js with TypeScript and Blitz.js, backed by MySQL and Redis, all wrapped up in a neat Docker Compose setup. A far cry from that first JavaFX window.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>What It Does<\/strong><\/h3>\n\n\n\n<p>At its core, Financer lets you manage your personal finances \u2014 income, expenses, fixed and variable transactions \u2014 organized into custom categories and tags. You can manage multiple households, track counterparties, import and export data, and get visual insights through a dashboard. Everything runs on your own server, so your data stays yours.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Where It&#8217;s At<\/strong><\/h3>\n\n\n\n<p>The project is very much alive and actively being improved. It&#8217;s not &#8220;done&#8221; \u2014 is any side project ever really done? \u2014 but it&#8217;s functional, self-hostable, and getting better with every release. There are still features on my list that I want to build, and I keep chipping away at them whenever I find the time.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Why It Matters (To Me)<\/strong><\/h3>\n\n\n\n<p>Financer started as a weekend idea and turned into a multi-year learning playground. It pushed me through different tech stacks, forced me to think about architecture, deployment, and user experience, and it solved a real problem I had. That&#8217;s pretty much the dream for a side project.<\/p>\n\n\n\n<p>If you&#8217;re curious, you can check out the code on <a href=\"https:\/\/github.com\/financer-project\/financer\">GitHub<\/a> \u2014 it&#8217;s open source under the BSD-3-Clause license.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Back in 2018, I had a simple problem: I wanted to track my income and expenses without handing my financial data over to some big tech company. Sounds reasonable, right? Every finance app I found either required a subscription, lived in someone else&#8217;s cloud, or wanted access to my bank account. No thanks. So I [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":146,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[11],"tags":[8,10,9,7],"class_list":["post-1","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-software","tag-development","tag-open-source","tag-self-hosted","tag-software"],"_links":{"self":[{"href":"https:\/\/raphael-muesseler.de\/index.php\/wp-json\/wp\/v2\/posts\/1","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/raphael-muesseler.de\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/raphael-muesseler.de\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/raphael-muesseler.de\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/raphael-muesseler.de\/index.php\/wp-json\/wp\/v2\/comments?post=1"}],"version-history":[{"count":4,"href":"https:\/\/raphael-muesseler.de\/index.php\/wp-json\/wp\/v2\/posts\/1\/revisions"}],"predecessor-version":[{"id":230,"href":"https:\/\/raphael-muesseler.de\/index.php\/wp-json\/wp\/v2\/posts\/1\/revisions\/230"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/raphael-muesseler.de\/index.php\/wp-json\/wp\/v2\/media\/146"}],"wp:attachment":[{"href":"https:\/\/raphael-muesseler.de\/index.php\/wp-json\/wp\/v2\/media?parent=1"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/raphael-muesseler.de\/index.php\/wp-json\/wp\/v2\/categories?post=1"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/raphael-muesseler.de\/index.php\/wp-json\/wp\/v2\/tags?post=1"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}