All you Buckets users are very patient! The mobile app has been in development for a long, long time. And it’s fair for you to ask: “what’s taking so long?” Hopefully the post will shed some light on the process.

Picture of a clock -- Photo by Ralph Hutter

Life

Buckets is a part-time project. I also have a full-time job, a family, SimpleFIN, a pandemic, etc… I really enjoy the time I get to spend working on making Buckets. And every time my wife and I sit down to use it, I’m reminded how much I like Buckets as a tool for doing our budget. I don’t get as much time as I’d like, though thankfully I do get quite a bit of time, considering all of life’s demands.

When I do spend time on Buckets, the mobile app is at the top of my list. Literally. Here’s the list that’s been on my desk for a while:

A todo list with the second item being Mobile App

I’m learning

I’ve never made a mobile app before, and I’m walking up the app-making learning curve as I work on Buckets mobile. So then…

Why not let someone else make the mobile app?

Several generous developers have offered to make or help make a mobile app. I don’t have money to pay another developer, so that leaves two other options:

  1. An open source, community-built mobile app
  2. Make the app myself

I’m not opposed to the community-built app, and I’m not opposed to people making tools to interface with Buckets or budget files. It makes me happy to see programmers writing scripts to import transactions or automatically categorize them. But right now it would difficult for an open source app to work with the desktop app in an always-backward-compatible way because, other than the budget file, there’s no shared code to be used as a basis for a mobile app and desktop app.

This lack of desktop-mobile shared code is the biggest reason why progress is slow and where I spend most of my time.

Growing a Shared Basis

Buckets was originally written for the desktop in JavaScript with an SQLite database. It looked like this:

SQLiteJavaScriptBuckets Desktop

The JavaScript code is responsible for everything that happens in Buckets; things such as:

  • Computing your budget’s Rain amount
  • Matching imported transactions to existing transactions
  • Determining self-debt
  • etc…

It’s important that the desktop and mobile app match exactly. It’s not acceptable for one version of the application to say you have $1000 Rain and the other to say $999. While I’ve explored [some methods]({{ relref “../2018-12-13-making-an-app-2018/index.md” }}) for sharing JavaScript code between desktop apps and mobile apps, after trying to make the mobile app with only JavaScript, it quickly became apparent that the code wasn’t as portable as I hoped.

So I’ve been extracting segments of the JavaScript into the Nim language. Nim can emit both C (which is highly portable) and JavaScript. Some logic is also being pushed into SQLite.

The process looks a bit like this now:

SQLiteJavaScriptBuckets DesktopNimBuckets Mobile

The end result is cross-platform, cross-language code that can be used as a solid basis for Buckets Desktop and Buckets Mobile. (And Buckets Command Line, but that’s a secret). Beyond portability, this porting from JavaScript to Nim also makes for a smaller application size and some increased speed.

It’s slow, but the mobile app is coming!

— Matt