Back to projects
Web App

Project Prism

Role: Designer, DeveloperYear: 2026
TypeScriptNuxtDokployTailwindPiniaADK (AI)

Overview

Prism is a project spawned out of the need to have comprehensive insight into my personal finances. At first I used my credit union's web app, but it wasn't doing quite what I wanted, so I moved to Monarch. I used Monarch for a bit, but again, it didn't quite have the features I wanted. With the advent of AI, it's a lot easier to build these kinds of personalized solutions, and thus, Project Prism was born!

Challenges

One of the first challenges I ran into was that copying Monarch or CU web app was not going work. It's easy to just take screenshots and tell AI "go build this", but since neither of those apps did what I wanted, I had to first figure out what it is that I actually wanted. Yes, some product design! Turns out I'm not a budget person, so I didn't bother implementing that at all. I'm not a product manager, so I had to take a bit of time with /grill-me to figure things out.

Another challenge was ensuring that the app could handle a variety of financial data sources and formats. I had to design a flexible data ingestion pipeline that could accommodate different types of transactions and accounts. I researched about different ways to accomplish this (ie Plaid), but honestly, for a home-spun non-commercial app, that kind of ingestion was not in the cards. I ended up using my CU's Plaid integration to merge in all the transactions, then export 1 transaction CSV out of there. I built an importer tailored to that CSV format.

Another challenge was classification of transactions. Usually, these don't come out very well classified in the CSV. For example something from Home Depot can just be "Shopping" and something out of Costco can be "Groceries". Theoretically that's not wrong, but I wanted it to be more granular. I knew this would take a bit of work up front, so I created a Rules engine for both categorizing the transaction into a spending bucket as well as the attaching a specific retailer to the transaction.

Choices & Tradeoffs

I built the entire application in Nuxt using basic-auth for authentication. Data is stored in Postgres which is also hosted in my homelab. The choice of hosting data locally made the most sense. I don't want my financial data out in the cloud. Even though I'm encrypting it at rest, I'm still not comfortable having it be out there. The tradeoff is obviously that I have to maintain the database, its backups, uptime, etc. Fortuantely, I'm really into homelabbing so this is not a problem at all!

Transactions and spending were just one part of the financial picture. I also wanted to have insight into my assets, both real estate and the market. Again, integrating with these platforms was not in the cards, so I'd have to do the input manually. I did integrate with yahoo-finance2 so I can get latest ticker values, but the amount of stock is something I need to manually update every now and then. Since I rebalance just once a year, this is not a big deal, but it is a tradeoff nonetheless.

Lastly, I wanted to integrate an AI advisor into the application. This was going to be the main differentiating factor between my app and Monarch or the CU's app. I tested out Mastra first and it was pretty good, but I wanted to see what Google's ADK was all about. It was lighter than Mastra, so I opted to go with that. Maybe a mistake though, since they already came out with ADK 2.0. That's the tradeoff when going with a Google product.... you do an integration, then it gets deprecated within weeks.

I also chose to go with OpenRouter for my AI provider. While I have experience with Azure AI Foundry, OpenAI and Google Gemini APIs, OpenRouter is model agnostic and super lightweight (AI Foundry is not). It's also easy to see spending there. I also use OpenRouter for my OpenCode / Copilot. There's no tradeoff when using the API, and I'm using relatively cheap models so the overall cost is fractions of pennies.

Considerations

When building this app, I wanted it to be a comprehensive "House Management Control Panel". I quickly learned that as the codebase grew, things started to get out of control. That is, as AI was writing most of the code, I started to be like "hmm where is the code for this", which made me feel anxious a bit, given that this app deals with my money! I scaled it down to just focus on personal finance and wealth management and trimmed some features I didn't need or use.

I also learned that I like the graph-like 'node/edge' approach to AI workflows better than Mastra's more object oriented approach. I don't really know if that's the correct way to describe it... but hey, it's one thing to read the docs, and another to actually use the library. Some things become apparent only when you're deep in the weeds.

Back to projects