<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://www.zachgollwitzer.com/feed.xml" rel="self" type="application/atom+xml" /><link href="https://www.zachgollwitzer.com/" rel="alternate" type="text/html" /><updated>2025-10-01T13:36:31+00:00</updated><id>https://www.zachgollwitzer.com/feed.xml</id><title type="html">Zach Gollwitzer</title><subtitle>I‘m a software engineer living in Cincinnati, OH. I&apos;m the lead maintainer of Maybe, a COSS personal finance app. I also run several golf websites and apps that I created while playing college golf. </subtitle><entry><title type="html">Reflections on building a Viral OSS Personal Finance app (50k stars, 2M+ downloads in 1 year)</title><link href="https://www.zachgollwitzer.com/2025/07/24/reflections-on-building-a-viral-OSS-personal-finance-app/" rel="alternate" type="text/html" title="Reflections on building a Viral OSS Personal Finance app (50k stars, 2M+ downloads in 1 year)" /><published>2025-07-24T00:00:00+00:00</published><updated>2025-07-24T00:00:00+00:00</updated><id>https://www.zachgollwitzer.com/2025/07/24/reflections-on-building-a-viral-OSS-personal-finance-app</id><content type="html" xml:base="https://www.zachgollwitzer.com/2025/07/24/reflections-on-building-a-viral-OSS-personal-finance-app/"><![CDATA[<p>TL;DR - From late 2021 to mid 2025, I worked on “Maybe”, the personal finance app. Maybe has since pivoted, and we’re now working on a B2B financial planning and forecasting app to help business owners gain insights into their finances without complicated spreadsheets. This post is about the <em>prior</em> personal finance app.</p>

<h2 id="preface">Preface</h2>

<p>Here’s the (short) story of how we landed here.</p>

<p>I’ve been working at Maybe Finance Inc. since 2021. But as it sometimes happens at a startup, my path has not been linear. In short, I worked on a team of 3 engineers (I was the first hire) from 2021-2023 building a closed-source, personal finance app. We built an awesome product, but funding ran out, and the company effectively shut down in mid-2023. At this time, I decided it was my chance to finally put some serious work into growing my golf websites <a href="https://www.thediygolfer.com">The DIY Golfer</a> and <a href="https://www.localgolfspot.com">Local Golf Spot</a>, which I had been growing for several years in a part-time capacity. I wanted to prove out whether there was a business in either of these sites, so I worked hard on this for ~12 months until one day, Maybe’s founder decided to open-source all the code we had written for the V1 version of the personal finance Maybe app (with permission of course). Well… It went viral on Github, and the company raised another pre-seed round of funding. At this point, I was asked if I wanted to work on this again as a COSS (commercial open source) version of the prior app. I had to make the tough decision of whether to continue working on my own thing or make a second attempt at the app that had failed prior.</p>

<p>I <a href="https://x.com/zg_dev/status/1751988660646424979">decided to take the offer</a> and dive head-first into the world of open-source software. I was absolutely pumped.</p>

<p>Our first major decision for the V2 version of Maybe was tech stack. We had previously written the app in Next.js and had deployed everything to AWS primarily for compliance reasons. The prior version of our app had a financial advising component to it, which meant we had to be registered as an advisor with the SEC and were subject to a huge list of compliance requirements. In other words, our prior tech stack was relatively complex <em>by necessity</em>, and given we were pivoting to an OSS app that self-hosters would be running on their own machines, we felt that this complexity was going to weigh us down from the start.</p>

<p>While we knew it would require a lot of re-building, we decided to scrap the Next.js version of the app and start over with Ruby on Rails, which would provide our now very small team (1 engineer, 1 designer) a productive framework that was easy to self host.</p>

<p>We got to work, and over the course of the next year or so, we made a ton of progress and quickly surpassed our “V1” app in features. I got a crash course in maintaining a popular OSS repo, we started a successful code bounty program, we got 2M+ package downloads, amassed 50k+ stars on Github, and launched a commercial hosted offering. Fortunately for the OSS community, but unfortunately for our business, the self-hosted app became wildly popular, but the hosted offering failed to generate the revenue growth we needed. It was at this point our founders made the <a href="https://x.com/Shpigford/status/1947725345244709240">difficult decision to pivot</a> to what we’re now working on.</p>

<p>As the lead developer of both the V1 and V2 versions of this product, it was bittersweet to shut it all down for a second time. I gave it my all and still believe we built one of the simplest, highest quality personal finance apps on the market (I still use the self-hosted version for my family’s finances).</p>

<p>All that said, business is hard, and business in the fintech industry is harder. While I was primarily working on the engineering side of things, there were a lot of technical and business lessons learned over the years of trying to make this app work. I’ve summarized many of them in the final release I shared with our OSS community below.</p>

<h2 id="final-release-repost">Final Release (repost)</h2>

<p><em>Below is the <a href="https://github.com/maybe-finance/maybe/releases/tag/v0.6.0">repost</a> of my final release notes, which I wrote up to reflect on some of the biggest challenges of building a personal finance app.</em></p>

<h3 id="thanks-to-our-contributors-and-beta-testers">Thanks to our contributors and beta testers!</h3>

<p>Before I talk too much about the engineering and product side of things, we want to extend our gratitude to our awesome contributors! We had hundreds of individuals contribute to the project and even more helping report bugs, suggest features, and raise new ideas.</p>

<p>This is a huge project and we couldn’t have gotten this far without our early supporters and OSS contributors.</p>

<h3 id="demo">Demo</h3>

<p>Below is a quick demo of what the Maybe app can do. You can learn how to deploy it following our <a href="https://github.com/maybe-finance/maybe/blob/main/docs/hosting/docker.md">Docker Setup guide</a>.</p>

<video controls="" width="100%">
  <source src="https://cdn.zachgollwitzer.com/maybe-demo.mp4" type="video/mp4" />
</video>

<p>Self hosted features include:</p>

<ul>
  <li>Dashboard to see your net worth trend over time and current personal balance sheet</li>
  <li>Rich transaction filtering, searching, bulk updating, and viewing</li>
  <li>Account views with the ability to see balance trends, reconciliations, and detailed breakdowns of your balance changes</li>
  <li>View your monthly budgets with category averages, income summary, and more</li>
  <li>Intelligent AI chat that knows your finances and can answer questions about them</li>
  <li>Multi-currency support</li>
  <li>API with key management to build automations on top of Maybe</li>
  <li>CSV imports for accounts, transactions, and trades</li>
  <li>Categories, Tags, Merchants</li>
  <li>Rules to auto-categorize your transactions, detect merchants, and more</li>
  <li>Invite members to your household</li>
  <li>2FA</li>
</ul>

<h3 id="recap-reflections">Recap, Reflections</h3>

<p>For many of you, this final release comes with a sense of disappointment, and that’s understandable. We’re not excited about this either, and wish we had unlimited time and money to fulfill our vision for this app (we have years worth of new feature designs in the backlog)! In the end, our obligation as a company is to our investors, and as outlined in <a href="https://x.com/Shpigford/status/1947725345244709240">Josh’s post here</a>, we’ve determined that continuing to build this app is not our best chance at paying back our investors and profiting as a company.</p>

<p>That said, over the last few years, our team has dedicated some serious amount of thought asking the question, “How can we build a better personal finance app?”. And in that light, I’d be remiss not to share some of our biggest successes, failures, and unexpected challenges along the way. We hope that some of these reflections propel the OSS community forward and one day lead to a truly great, OSS personal finance app.</p>

<h3 id="the-wins">The wins</h3>

<p>We’ve been thinking about personal finance for a lot of years. This isn’t our first attempt at creating this app, and along the way, we’ve learned some valuable lessons that have made it into the final release of this software.</p>

<h4 id="a-simple-beautiful-personal-finance-app">A simple, beautiful personal finance app</h4>

<p><img src="/assets/images/maybe-dashboard.png" alt="Maybe Dashboard" /></p>

<p>Let me give credit where it is due. Our lead designer @justinfar has done an incredible job crafting a <em>simple and clean</em> UI. Some of you may look at our app and think, “That’s it?”. But believe us when we say, this was intentional. We spent a lot of time asking the question, “What can we delete?”.</p>

<p>Our goal with this app was to <em>remove complexity</em> from personal finance. Many personal finance apps overwhelm the user with dashboards, complex UIs, and too much detail. We believe that many people <em>want</em> to track their finances but are simply too overwhelmed by the challenge of getting started. Most people need to know just a few important things about their finances:</p>

<ul>
  <li>How much money do I have?</li>
  <li>Am I spending less than I’m earning?</li>
  <li>How much did I spend last month?</li>
  <li>What am I spending my money on?</li>
</ul>

<p>This app answers all of those questions and gives the user a simple interface to categorize, organize, and get to those answers quicker. While some users might look for a richer feature set, we believe most users are satisfied with less; not more.</p>

<h4 id="a-place-for-everything">A place for everything</h4>

<p>One of our greatest frustrations with other personal finance apps is not having a “place” or a “home” for common financial scenarios.</p>

<p>One common scenario in personal finance is a “transfer”. A transfer is a movement of funds from one account to another, and creates a transaction of opposite values on each of those accounts. Many personal finance apps treat these the same as the rest of your transactions and force you into this uncomfortable pattern of using a “Transfer” category or “Excluded” category to filter this noise out of your budgets and metrics. Furthermore, some transfers (like loan payments) should be included in your budgeting while others (like credit card payments) are a “double-count” that should be <em>excluded</em> from budgets. It forces users to create a “Junk drawer” for the things they don’t know what to do with.</p>

<p>The Maybe app treats transfers as first-class citizens. We auto-detect your transfers and <em>don’t even allow</em> you to categorize them because they <em>shouldn’t be categorized</em>. This way, transfers are automatically excluded from budget totals and other metrics.</p>

<video controls="" width="100%" autoplay="" loop="" muted="" playsinline="">
  <source src="https://cdn.zachgollwitzer.com/maybe-transfers.mp4" type="video/mp4" />
</video>

<p>Another common scenario is “one time expenses”. Similar to transfers, these expenses (e.g. “moving expenses”) don’t really belong in budgets either. The Maybe app allows you to mark these as “one time” and automatically excludes from your “average spending” and other budget totals.</p>

<video controls="" width="100%" autoplay="" loop="" muted="" playsinline="">
  <source src="https://cdn.zachgollwitzer.com/maybe-onetime.mp4" type="video/mp4" />
</video>

<p>Outside these common scenarios, the Maybe app also allows you to create various account types and even “reconcile” them to a new balance without creating that nasty “adjustment” transaction that nobody knows how to categorize or what to do with.</p>

<video controls="" width="100%" autoplay="" loop="" muted="" playsinline="">
  <source src="https://cdn.zachgollwitzer.com/maybe-reconcile.mp4" type="video/mp4" />
</video>

<p>We set out to create an app that has a place for all your financial scenarios, and while I think there is still work to be done on this front, we handled the most important ones (unlike many other apps). And we’re proud of that!</p>

<h4 id="a-simple-stack">A simple stack</h4>

<p>No self-hosted app is “easy” to deploy. But we did our best to make things simple. The Maybe app can be <a href="https://github.com/maybe-finance/maybe/blob/main/docs/hosting/docker.md">hosted all inside a single Docker container</a> with <em>optional</em> market data API dependencies.</p>

<p>For the demos of this write-up, I started a brand new self hosted app in less than 10 minutes!</p>

<h3 id="the-losses">The losses</h3>

<p>As we’re stopping active development on this project, there were clearly some losses. Aside from the fact that growing a B2C SaaS app is challenging in its own right from a business perspective, I’ll focus on some of the product/engineering losses that we feel could have been remediated with some more time and money to throw at this problem.</p>

<h4 id="data-providers-data-providers-data-providers">Data providers, data providers, data providers</h4>

<p>The single biggest challenge with a personal finance app in 2025 is bank providers.</p>

<p>Some companies have had enough time to <em>work around</em> this challenge with all sorts of clever UIs and mathematical shortcuts, but when push comes to shove, the state of “Open Banking” and bank provider data comes with endless frustration. While we believe we could have slowly but surely solved a <em>majority</em> of these problems, we simply needed <em>more time and more money to do so</em>. Below are just a <em>few</em> of the challenges we were still working through:</p>

<ul>
  <li>Unsupported banks (there are a TON, and most users churn if even <em>one</em> of their banks is unsupported)</li>
  <li>Banks that only support logins at certain times of day</li>
  <li>Bank provider documentation not matching the production data we received</li>
  <li>Bank provider data being plain <em>wrong</em> (there is a surprisingly large amount of this)</li>
  <li>Idiosyncracies of each financial institution (everyone reports their data a little differently)</li>
  <li>The vast number of financial securities (i.e. stocks, options, etfs, etc.), many of which have differing data across market providers, and many of which have <em>sparse to zero</em> data</li>
</ul>

<p>Needless to say, this is a <em>massive</em> challenge for anyone building a personal finance app and is the primary reason why “bootstrapping” a personal finance app with automated bank syncing is an uphill battle. You need a lot of money and time to get this right.</p>

<h4 id="data-consistency-and-cache-invalidation">Data consistency and cache invalidation</h4>

<p>While a dashboard with a net worth graph doesn’t look all that complicated, it’s one of those “iceberg” problems. The more you dig, the more complexity you find.</p>

<p>A personal finance app needs to show a user’s total net worth trend over time. A personal finance app needs to show average spending. A personal finance needs to show correct balance sheet values.</p>

<p>Every view of the app touches nearly <em>all</em> the user’s data. If <em>any</em> piece of data is <em>wrong</em>, every view in the app is wrong. There is nowhere to hide in a personal finance app, and even the slightest change to the <em>date</em> of a historical transaction propagates upstream and affects the net worth graph, account sidebar trends, metrics, budgets, and pretty much every other view of the app!</p>

<p>The UI required by users demands a high degree of focus on both performance + accuracy. But in a finance app (or… any app!), these two things are at odds with each other. Achieving full accuracy can be done by writing “facts” to the database (event-sourcing) and <em>deriving</em> results through queries and materialized views. Keep the data in its “raw” form and delegate the complexity to the <em>read</em> side of things. Using this approach, you’re <em>guaranteed</em> updated data everywhere in the app.</p>

<p>Unfortunately, taking this approach with no answer for the performance side of things will result in an app that is 100% accurate and takes 3 minutes to load each page.</p>

<p>Having learned some lessons from our V1 approach to building this app, we opted for a “hybrid event-sourced” approach. We wrote “facts” (i.e. transactions, trades, valuations) to the database, “synced” them in background jobs, and wrote them to “cache tables” (i.e. <code class="language-plaintext highlighter-rouge">balances</code>, <code class="language-plaintext highlighter-rouge">holdings</code>). This made the <em>query side</em> of things a lot simpler (still not simple though) and improved performance, but at the <em>cost</em> of data consistency.</p>

<p>While I believe the final version of this app comes <em>close</em> to full accuracy / consistency of data, there are still inevitable challenges here and something we wish we could have spent some more time on.</p>

<h3 id="the-unexpected-challenges">The unexpected challenges</h3>

<p>And finally, let’s talk about a few of the challenges we didn’t know we’d be facing.</p>

<h4 id="oss-financial-privacy-and-project-management">OSS, financial privacy, and project management</h4>

<p>As an open source project, we constantly received bug reports. Unfortunately (but understandably), many users are not comfortable sharing their personal financial situation.</p>

<p>This created an odd dynamic. We are open source, but in order to fix data bugs, we need to look at the data. If the user can’t share all the required information, we can’t reproduce the issue.</p>

<p>I’m not sure there’s a great solution to this. It made the project management and bug fixing side of things extremely challenging. We wanted to manage all issues on the public repo, but by the nature of the app, we ended up having to track some issues internally and privately and others publicly.</p>

<p>It made things hard to see it all in one spot, and we didn’t realize how much of a roadblock this would become for us.</p>

<h4 id="multi-currency--investments-data">Multi-currency + Investments Data</h4>

<p>Building a multi-currency app is tough to begin with. We took on this challenge in the spirit of OSS and I believe we built a fairly comprehensive and solid solution.</p>

<p>That said, having global users exposed us to the global markets.</p>

<p>To say this is challenging is an understatement and then some. Let’s start with some basic numbers (don’t fact check me, this is largely coming from a quick ChatGPT session, but should be in the ballpark):</p>

<ul>
  <li>There are ~180 currencies globally</li>
  <li>There are ~46k global exchanges, all of which have different securities and different prices</li>
  <li>There are ~55k publicly traded companies globally</li>
  <li>There are 120k+ mutual funds, ~10k ETFs</li>
  <li>Crypto… (we won’t go there)</li>
</ul>

<p>In order to show an <em>accurate</em> investment portfolio graph, we need historical prices for <em>all</em> the user’s securities in their portfolio. Given the fact that there is no single data provider that supplies all these prices, many providers treat exchange codes differently, and market data is <em>extremely expensive</em>, this become one of our foremost challenges.</p>

<p>We ended up allowing users to create “manual” tickers which has worked fairly well. But the scope of this problem is huge and there’s a reason entire applications are built to solely handle investment data (often US-based only).</p>

<h3 id="closing-thoughts">Closing thoughts</h3>

<p>Given our tiny team and short time horizon, we’re proud of what we’ve built here and the contributions we’ve made to OSS in the process. We’ve built the “engine” and we hope the OSS community can take this core engine and build some interesting use-cases on top of it.</p>

<p>With that, farewell! Maybe…</p>]]></content><author><name></name></author><summary type="html"><![CDATA[TL;DR - From late 2021 to mid 2025, I worked on “Maybe”, the personal finance app. Maybe has since pivoted, and we’re now working on a B2B financial planning and forecasting app to help business owners gain insights into their finances without complicated spreadsheets. This post is about the prior personal finance app.]]></summary></entry><entry><title type="html">I Moved My Tech Blog To Fullstack Foundations</title><link href="https://www.zachgollwitzer.com/2024/04/01/i-moved-my-tech-blog-to-fullstack-foundations/" rel="alternate" type="text/html" title="I Moved My Tech Blog To Fullstack Foundations" /><published>2024-04-01T00:00:00+00:00</published><updated>2024-04-01T00:00:00+00:00</updated><id>https://www.zachgollwitzer.com/2024/04/01/i-moved-my-tech-blog-to-fullstack-foundations</id><content type="html" xml:base="https://www.zachgollwitzer.com/2024/04/01/i-moved-my-tech-blog-to-fullstack-foundations/"><![CDATA[<h2 id="tldr">TL;DR</h2>

<p>I moved all of my tech-related blog posts from this site (that you’re on right now) to <a href="https://fullstackfoundations.com">Full Stack Foundations</a>.</p>

<p>I wrote a <a href="https://x.com/zg_dev/status/1734933321707082179?s=20">Twitter thread explaining why I did this</a>.</p>

<h2 id="why-go-to-the-trouble">Why go to the trouble?</h2>

<p>As I thought about the future of this site, I realized that I needed to make a decision whether to move forward with a “personal brand” that talks primarily about tech or offload that to another domain.</p>

<p>Since I have content websites in both the golf niche (The DIY Golfer) and the tech niche (Full Stack Foundations), things were getting confusing.</p>

<p>Ultimately, I decided on the following organization:</p>

<ul>
  <li><strong>This site (aka “Zach Gollwitzer”):</strong> yeah, I know it’s weird to refer to myself in 3rd person, but ultimately, that’s what you, the reader has to decide—”who does this guy represent to me?”. I’ve poured a lot of effort into both my golf sites and my tech tutorials brand. I feared that if I kept all the tech stuff here on this site, all the golf stuff I’ve worked on would get lost in the fray. So instead, I decided this site will represent the “home base” for all my projects and ideas.</li>
  <li><strong>The DIY Golfer:</strong> a website where I post all my golf content</li>
  <li><strong>Full Stack Foundations:</strong> a website where I post all my web development content</li>
</ul>

<p>This made things a lot easier to think about and provided a few benefits:</p>

<ul>
  <li><strong>Clear separation:</strong> it’s now easier for me to know exactly where to post various types of content. While it may sound odd to say, I was asking myself the question, “What does Zach Gollwitzer represent” to people? Since I have both a golf blog and tech blog, it was really hard to answer that.</li>
  <li><strong>Future-proofing:</strong> if I ever decided to accept guest posts on Full Stack Foundations (or even sell it), that would be incredibly hard to do if it all existed on this personal site. After seeing what AI can do for web development education, I became very uncertain what the future of would look like. Do I want my name associated with “web dev tutorials” for the next 10 years? Probably not. By breaking it off on a separate domain, I didn’t have to ask that question.</li>
  <li><strong>Simplicity:</strong> I can now keep this site nice and simple without any marketing or analytics, which makes me happy.</li>
</ul>

<p>So yeah, it may sound like a trivial matter, but considering I’ll be working on all of these projects for a multi-year period, I thought it was worth the 40-60 hours of work it would take to migrate everything.</p>

<h2 id="what-next">What next?</h2>

<p>Now that I have dedicated places to talk about my two favorite things (golf and web dev), this site will be mostly a “home base” for personal updates and ideas that seem worth writing about.</p>

<p>If you’ve come here for tech-related content, thanks for supporting the journey and I’ll see you over at <a href="https://fullstackfoundations.com">Full Stack Foundations</a>!</p>]]></content><author><name></name></author><summary type="html"><![CDATA[TL;DR]]></summary></entry></feed>