Announcing Solvent
Solvent is a straight forward to-do list application that I've been using for the past four years and now I finally came around to add a proper user account system so anyone can use it.
The code is available on Github and a hosted instance is running at solvent.eldelto.net.
First Implementation
I wrote the initial implementation back in 2020 after I continuously had problems with Google Tasks and Keep as they used to sync all the local data in a background task and if you are too quick to leave the page or turn off your computer, you are left stranded with half-synced data on your phone.
I'm sure there are already other to-do list applications out there that handle this scenario more gracefully but building stuff is fun so I went ahead.
The frontend was implemented with React and the backend with Go using some fancy CRDT-based data structure to handle the state merging. The data was synchronized via polling a REST API which of course didn't fully solve my initial problem but at least made the sync time somewhat more predictable.
There was no user management and I used it for the next couple of years behind a reverse proxy secured by HTTP basic auth.
The Big Rewrite
It worked fine like that in the beginning but I soon got swamped with dependabot security alerts from one of my Javascript dependencies. To be clear, I just used the recommended create-react-app
CLI to create a scaffold project and added dependencies for drag & drop and resizable textareas and this left me with a whopping 1.4k transitive dependencies:
awk '/resolved/ {FS="npmjs.org/"; print $2}' package-lock.json | sort | uniq | wc -l 1425
I stopped upgrading all the libraries already after the first year as some released new major versions and would require additional effort to adapt my code before upgrading. That's time very few people would like to invest into a project, even more so when it is "just" for fun.
This year there was a lot of hype about HTMX and how it made server-side rendering cool again, so I thought I might as well give it a try with an existing project and Solvent did fit perfectly.
Long story short, I simplified the whole thing quite a bit - got rid of React (now HTMX), PostgreSQL (replaced by BBolt) and removed the text-book CRDT data structures in favour of an ad-hoc implementation.
This reduced the overall project size quite a bit and I'm pretty pleased how it turned out.
Features
It is a bog-standard to-do list application where every action is immediately synced with the server so every device always has access to the latest state. This comes with the drawback of requiring an active internet connection to use it but as long as you have an at least flaky connection is works pretty fine.
There is a bulk-edit mode to copy plain-text lists into Solvent to-do lists. The first line is treated as the headline, all subsequent lines will be the to-do items.
Lists can also be shared via links and every person with access to that share link is able to view and edit the list as if it were their own, even if they don't have a Solvent account. Always comes in handy for grocery shopping.
There is some rudimentary support for keyboard shortcuts to trigger some frequently used actions. The complete list can be found in the documentation.
Last but not least, Solvent is pretty easy to self-host as it is only a single binary. The whole database is also a single file so backups are trivial to configure.
With everything said, I hope that someone can also find this little application as useful as I do and that it makes their daily life just a tad easier.