on software

Spense.app v0.1

This article is a translation and adaptation of my article in Russian.

I've rolled out version 0.1 of my app for tracking finances and decided to report on the progress. To be honest, it's not an actual mobile app, but a Progressive Web App - essentially a website that you can open on your phone, add to the Home Screen, and it will launch in full screen without browser panels. I don't yet know how to make real apps, but even in its current form, it works quite well.

By the way, there's even an icon already, which I created in ChatGPT/DALL-E:


As you've already guessed, I named it Spense. I came up with this name a long time ago by trimming the word "expense", and I bought the domain back then, which I'm only now starting to use more or less.

Currently, I'm the only user, there's no registration, and I think at least until version 1.0 everything will remain closed, but I'm happy to show you what's going on there now and what has changed.

Changes in 0.1

Currency display format

By default, all money was displayed as €12345.67. It annoyed me that the currency symbol was in front (especially when it's Russian rubles, it looks very odd), so I changed it to 12,345.67 €.


Actually, in different countries, the currency symbol is either in front or behind, and the decimal separators vary, so there's still a lot of work to be done there.

"Soft" deletion of wallets and transactions

Previously, wallets and transactions were truly deleted when you clicked the "cross" button. Now they just disappear from everywhere, but the record remains in the database for potential restoration later. In general, keeping deleted data is a good practice in development, but it takes some getting used to.

Date of the added transaction

Previously, the "Date" field was just an editable date, which by default was today's date:


This seemed logical and convenient until the next day, when I decided to record another expense, opened the page, and the date was still from yesterday, because the app hadn't restarted. I had to manually switch it to today's date, which was dumb.

I fixed it, so it says "now" instead of a date, and in this case the transaction is always created with the current date. Of course, you can still change it:


By the way, I saw a separate "Yesterday" button in one of the popular apps. I might add something like that too because it's the second most popular use case.

Transaction list

Surprisingly, there was no list of all transactions in the interface, only in the internal admin panel. I rarely need it, but for convenience I added this section, paginated and filtered by wallet and date:


On the "Add a transaction" screen the last few transactions are also displayed, but this list is mostly used to fix recent mistakes:


Populating the transaction database with historical data

In short, it was a slog. The last time I imported transactions into Spense from my spreadsheets was about two years ago, and now, when I returned to development, I needed to catch up with that data. Over these two years, a lot of interesting things happened, so I had to dig through a large number of statements from new accounts and synchronize data from my latest spreadsheets.

A generic tool for importing transaction history is a separate big project, so instead, I wrote a number of scripts for each data format. The biggest challenge there is to turn the payment purpose into a proper tag in Spense, and that took up most of the time. For example:

  • payment purpose BOLT.EU/O/123456... - is actually taxi;
  • BOLT.EU/R/56789... - scooter;
  • BOLT.EU/D/24679... - is Bolt Food, home delivery, which I equate to cafe.

Now imagine you have several thousand such transactions :-)

But overall, it turned out quite well. I'm not complaining. Although along the way, I lost about 20-30 non-critical transactions, and I completely forgot about transactions like "cash withdrawal" and "transfer between accounts", that's enough for now. I'll put these shortcomings into tasks for the future.

Speaking of tasks!

Project management

I remember, about a month ago, a bug popped up, and at that moment I realized that I needed to put all bugs, ideas, and other tasks somewhere, to ensure they wouldn't get lost and would be implemented eventually. And since the code repository is on GitHub, I decided not to go far and set up a project in GitHub Projects. Everything there is as usual: tasks and boards, and that's all I need.

"In Progress" is empty because I haven't started version 0.2 yet.

In general, with this self-project-management, I'm slowly learning to separate the important from the unimportant. For example, filling the database with transactions was necessary for me to get a more complete set of data for experiments (identifying trends, forecasting, etc.). So it's perfectly acceptable if a couple of dozen small payments are lost among those 9-10 years of history. But if I, a programmer, were given a similar task at my day job, I would labor for a long time to ensure that not a single transaction was lost, and I would spend a month.

In short, I'm learning to do "good enough", pushing perfectionism aside and keeping the context and plans for the next versions in mind.

Ideas for the next version

For version 0.2, I want to further improve the mobile interface because there's still a lot missing there. Initially, Spense was conceived as a platform with a spacious desktop interface, and only a couple of months ago did I realize that it needs to be adapted for mobile.

So far, I plan to:

  • add a page with a list of wallets and display of the current balance;
  • it would be good to also be able to add new wallets and edit existing ones on this page;
  • add income, not just expenses (yes, I'm adding payroll transactions in a very tricky way right now);
  • add the function of transferring money between accounts and cash withdrawals;
  • add a history of transaction changes (I'll tell you later why).

Of course, almost all these features are already present at the backend and database level, but they need to be brought to the mobile interface, and the most challenging task here is not to bloat this form to the level of an accounting application.

And I also want to finally add some decent automated tests and do something with the infrastructure, but that's more of an IT topic. By the way, I think I can write about various technical things in parallel, so the next post will be programmer-oriented, about "under the hood".

Stay tuned!