Leading the Vibes: How I Built my BRRRR Underwriting Web App

Recently, I’ve spent a considerable amount of time working on a new side project. Taking Marc Lou’s advice, I’m building something for myself and putting a paywall on it for everyone else (is that how it’s supposed to work?). Last year, I bought my first rental property and hated the Excel experience of underwriting, managing the renovation, and making sure it was all going to work out financially. I wanted something easier. Some of you reading this may disagree that my way is easier and may laud the endless grid of an Excel spreadsheet, but I’ve never been that guy. I much prefer a UI controlled by sequences of code and calculations that I can understand on the backend.

So, I made BrrrrFect.

Road to Production

Looking back at the commit history, I started this project on September 1, 2025. In reality, I went through a few iterations before I even started the repo. There was a Rust desktop app (mostly to try Rust) and a full-blown Next.js app that I thought I might put into production, but alas, I got annoyed with the overuse of AI it took to get a Next.js app off the ground, considering I knew nothing about Next.js (Vercel’s marketing be damned).

I started thinking hard about “software enshitification” and how I would build this web app if I wanted it to be robust, extensible, and resistant to the seemingly endless Node/React/Next CVEs. Eventually, I landed back on Django, Jinja 2 templates, and some HTMX thrown in where it makes sense. I went this route because it’s what I know and Django is battle-tested.

The Vibing

I don’t think many people would argue anymore that LLM code generation is now the fastest way to take a project from 0 to MVP. Leaving it there, though, will never get anyone very far. To truly build a product that works—even a simple one—it is imperative that you understand what your code-generation tool of choice is writing and force it into an architecture you understand.

LLMs (GPT-5.3-codex and GPT-5.4 in this case) are phenomenal tools for banging out Jinja 2 templates. This is where I spent the bulk of my tokens while building the app. I’ve always been a backend guy and have never had a great taste for UI development. I knew that I wanted Tailwind CSS and DaisyUI for the basic styles, so I made sure to set both of those up in the project and added an AGENTS.md file that gave every new context window an understanding of the technologies I wanted to use for styling. This kept the model from trying to invent CSS styles by itself and helped make the project more cohesive.

Leading the Design

Over the course of developing this app, I was impressed with how well newer models are able to follow existing patterns in the code. Explicit instructions such as “add a new field using the same pattern as template X” or “field Y” worked extremely well and sped up my ability to implement the core feature set. I generally had good success writing out the first iteration of something and then getting Codex to replicate the pattern for the rest of a form or feature.

I think “leading the design” is how a lot of engineering will happen in the near future. Reviewing LLM-generated code as though it belongs to a different or more junior engineer is clearly the right approach. I’ve heard and read many loudly worded grievances about how some engineers simply aren’t able to get Codex, Claude Code, or OpenCode to generate code exactly as they would write it by hand. My question is: why are you trying? That’s not how anyone treats other engineers on their teams, as long as there is adherence to some general set of coding standards. I don’t personally have a problem with reviewing LLM code as “something I didn’t write.” In the end, function is what matters, and wrong code should receive a blocking comment on a PR regardless of how it was written or generated.

The Path Forward

I’m really not sure how long-lived BrrrrFect will be. We’ll see if it gains any users or picks up any traction. Realistically, I don’t care. I wrote it for myself, and it serves me pretty well. There’s more I want it to do, and I’ll probably add those features, but I’ve really enjoyed how fast I was able to bring the initial web app together. It has made minor iterations far less of a headache, and I am now more likely than ever to make a small tweak to something that bugs me about the UI or functionality and simply push it out to the public version. If you use the tool, I hope you like it! If not, on to the next one!