The FIP Journal #14: 87.8% coverage & zero subscriptions

Marc & Patrik
5 min read

Patrik

Wise words of the week

Out of clutter, find simplicity. — Albert Einstein

Feedback is the breakfast of champions. — Ken Blanchard

Journal

Back after the summer break. It was nice spending a few weeks in the mountains where the temperatures were lower. I mixed some work with hiking, following the weather forecast and my mood.

I made good progress on the product. We have set two targets for the public launch. One is process automation to reduce our manual work. The second is a set of features we consider “must have” for the public launch. So I just did a release on Tuesday to add 4 new cantons and bring our population coverage to 87.8%. These cantons were added quickly, most of the code was already in place. It was mostly configuration work to select various parameters, such as rounding intermediate results and handling single vs. married status (i.e., using different tax tables or splitting the income for table lookups).

I’m quite happy that I’ve managed to generalize the computation for most of the cantons, leaving only GE, VD, and VS requiring specific code. Those were among the first cantons I implemented, so my initial impression was that they had many special rules and implementing each took me two weeks. Subsequent cantons were simpler, taking mostly 2 days instead.

It remains that the system is incredibly fragmented. As an example, the rules for child deductions differ. Confederation and half of the cantons have a single amount per child. The other half of the cantons have age-dependent rates. Neuchatel has rates for ages 0-3, 4-13, and 14-25, while Wallis uses ages 0-6, 7-16, 17, and 18-25. Some cantons also distinguish whether the child is living at home or externally, mostly the mountain cantons where the next professional or high school may be so far that commuting daily is not reasonable.

Child deduction rules per Swiss canton in code
26 cantons, 26 ways to deduct a child. Welcome to Switzerland!

Anyway. I have one more release to go for automating our integration with Stripe and Kit, and it’s already code complete and I need to test it.

After that we will start preparing for the public launch. First we will do a dark launch: the product will be open to the public but we won’t advertise it to avoid a rush. We will monitor resource utilization as the number of users grows to avoid a success disaster and prevent support demand peaks during one of our upcoming vacations. Once comfortable, we will start talking publicly about it. In practice, I will update my LinkedIn profile to mention FI Planner.

How did I use AI this week?

I already mentioned that I shifted from agent to plan mode for day-to-day development. Another practice that has emerged in the last few months is asking AI to review one file once it’s code complete. The prompt is usually “review @XYZ.go for correctness, readability, code duplication, dead code, and ensure adherence to idiomatic Go style.”

I usually get 3-4 pages of comments about all the terrible things I’ve coded. It includes race conditions, serious errors, typos, and many good suggestions to make the code tight and production ready. It also catches all the development code left in the file, mostly TODOs for features I forgot to complete and panic statements that really need to be replaced with errors. The idiomatic part is also useful for ensuring consistent variable naming or learning about specific idioms I was not aware of.

I make it a point to implement the changes myself so that I can absorb them.

I like this process so much that I started retroactively reviewing all files in the project whenever I touch them.

And before I forget

This FI Planner work starts to pay off.

As I’m going to be nomadic in the next few weeks, it was time to upgrade my laptop.

Goodbye recycled MS Surface from my son (frugal!), welcome MacBook Air M5 paid with the first revenue from FI Planner.

The machine is so fast that my tests now run five times faster, it’s impressive.

I was also expecting some time travel: open the laptop box on Friday and suddenly it’s already Monday. However, installing most of the software took just 2 hours.

I’ve been using Macs since 1996. After a 16-month hiatus, it’s good to be back!


Marc

The build

I’m humbled by how Patrik manages to add a new canton, with all its tax complexities. So fast.

I mean, he just released not one, not two, not three, but four (!) cantons in one release. All details are here by the way.

I’m so thankful to have such a skilled cofounder.

Aside from that, it was AFK times over the past week. I liked it a lot, as we had plenty of family time. And I like it even more to come back to the keyboard, energized like never before to keep developing FI Planner.

The edge

The uncomfortable thing this week was: 23 invitations sent, and no subscription.

My bet: people are in “back-to-school” mode or leaving for holidays (“no kids” life anyone?!), and no time to think about FI in this time of the year.

But, as any good entrepreneur knows, no hypothesis beats reality. So I can’t wait this weekend to see if some people subscribe, and else, can’t wait for next week to ask the non-subscribers if there are any issues. Because only them know, not my guesses ;)

Note to a friend

Talk to your customers. Non-converted and converted. It’s hard. It’s time-consuming, but darn you learn so much each time.

I may copy-paste this section to myself several more times this year, as it’s so not comfortable to face the reality. But well, that’s how you get “lucky” with your startup!

Tool of the week

Linear MCP!

I’m using it now with Walter as a new capability when sorting email exchanges with customers. If my Chief of Staff spots a feature request or such, it checks if a ticket already exists for it in Linear. If the ticket exists, it adds a comment with a link to the email (and the date) of the feedback giver.

If it doesn’t exist, it asks me if I wanna create the ticket automatically.

We live in the future. I love it! 🧑‍🚀

View full size