As you may already know, I am a university student. One of the hardest parts of being a university student is managing our money. How much am I spending each day/month? How much do I owe my friends?
Both are excellent tools. I rely on them daily. However, using 2 separate apps to manage one financial reality turns out to be painful. It includes a lot of manual work and highly error-prone. Personally, I have been using a very complex workflow utilizing both of these apps.
Some of my colleagues use Splitwise alone, and they don’t care about their personal finances. Another set of colleagues use color-coded spreadsheets.
# What is F1?
The inconveniences pushed us, a group of 5, to build F1 - a personal+shared finance tracker app.
You can track incomes and expenses like a normal personal finance app. When an expense is shared, you flip a toggle and F1 takes care of the rest.
F1 automatically:
- splits the expense
- updates everyone’s shared balances
- reflects your share in your personal spending
If you are interested in F1, join the waitlist and be the first to try it out.
# Tech Stack
We picked a stack that helps us build quickly and reliably without sacrificing on correctness.
# PostgreSQL
For our database, we needed something that can handle complex financial calculations. PostgreSQL seemed like a good fit here. Its plugin ecosystem was also an advantage that we considered.
Data-intensive operations (which are the majority of F1) are handled by SQL functions that we defined. Most of our business logic lives inside the database.
# pgTAP
pgTAP is an extension for PostgreSQL for writing unit tests in SQL, for the database. We use pgTAP to verify that our database functions, constraints, and business logic behave as expected. Every schema or logic change runs against automated tests. If something breaks, we know immediately.
At the time of writing this, we have added more than 200 tests to ensure the reliability of our financial calculations and robustness of our business logic.
# Elysia
Our backend is built with Elysia. It’s fast, minimal, and type-safe end to end with little boilerplate. It has first class support for validation and integration testing. It stays out of the way and lets us focus on modeling the domain correctly.
# React Native
The mobile app is built with React Native with Expo and TypeScript. It allows us to move fast without fighting platform tooling. React Native offers good-enough performance and a rich ecosystem of libraries and tools. And it’s cross-platform.
# Docker
Our database and its tests are run inside Docker because reproducibility matters. This setup allows us to keep the development environment fully disposable.
# The progress
F1 is still in the works, but we’re excited about what’s ahead. An Android release is coming soon, and we want your ideas and feedback to help make it better. If you’re curious or want early access, join the waitlist by filling out the Google Form.