Introducing Comicstash
The TLDR of this post is that I have release my application, Comicstash, as open source. I have been working on it for about a year now in various forms and have come to a point where the current version is something that is viable for the future.
A key concept has been “localfirst”. This means that there is no centralized server that maintains your data, but you, the user, are in control and responsible for your own data.

You can get development versions of the app from my forge: https://forge.arjenwiersma.nl/arjen/comicstash
Where it started
I started working on comicstash over a year ago. At first I worked on a Ruby on Rails web application. I modeled my database schema, and created several integrations with online resources such as Metron to pull in comic metadata. It looked great:

The thing however was that I was not very happy with the language and the framework. I would rather use something else, so I started implementing a new version in Clojure, a language I love.
Going native
During the development time I became more interested in the idea of building something that is local first, meaning that it should not rely on centralized servers to handle data.
I would love for others to use my app, but I do not want them to have to deal with setting up a webserver and installing containers and having the hassle of maintaining that.
But with a move to the desktop I would lose the ability to use my app on my mobile device when on the go.
So, I started experimenting. I wrote a version in Qt using C++ and QML. This worked somewhat good, but the development proces was quite a hassle. Porting it to mobile from a proof of concept turned out to be quite an undertaking as well, so I left that idea.
Going through the motions of cross platform frameworks and toolchains I finally ended up with Flutter and Dart. Both I did not really know beforehand, but since I have started to quite appreciate both.
The final form
So, the app is now a Flutter/Dart application that builds from a single source (ideal for someone with little time to develop).

The application compiles to native code for the desktop and an app for Android.
The user data is kept on a single device, but you can sync it using (currently) WebDav. So if you have something such as Nextcloud you can connect it to the app and all the apps on all devices will remain in sync.
I am very happy with the syncing mechanism, it has stood the test of time (for now), going through several multi-device schema upgrades without issue.
Using AI
In this time it is important to tell you how I use AI. I am not against AI, but I am against AI Slop, where you just blindly generate code and just take it at face value.
I use AI by working out features and mechanisms, I let it write boilerplate code and it helps me with the UI. It is great at writing testcases for my code and generating infrastructures, such as the sandbox I use for local testing. The AI is never allowed to commit or autonomously do things, everything is tested and reviewed by me when it creates code.
As someone who works on this in my free time, those tedious tasks take away a lot of valuable time, now I spend that time on adding value to the app.
Go give it a try if collecting comics is your thing.


