Tasx a Todo app in Rust
2025-07-26
Tasx is a CalDav to do application written in Rust, supporting offline use, and targeting Linux as it's primary platform. The intention is to be a standalone application good for desktops, laptops, tablets and smartphones. I wrote it and am releasing it to "public beta". This means it should be fully functional, but being only person who's tested it I'm too nervous to call it "stable" yet. The UI looks really simple which is good! It is really simple! But it's fully featured supporting nested tasks, hiding subtasks, moving tasks into and out of parent tasks, manual ordering via drag-n-drop, stacked orderings, hiding and showing completed tasks, notes, edits to not require pressing enter (creating new stuff does). We have keyboard shortcuts, a notes section, etc. (I probably should grab a screenshot of the window that pops up when you hit "more"). The goal is to be obvious and simple, but correct and support everything.

If you're interested, check out the project on codeberg: https://codeberg.org/multilinear/tasx . I've written some fairly simple instructions for installing, but you do need GTK4 and Cargo/rustc.
Now, I thought I'd tell a bit of the story of how and why I wrote this.
I've mentioned previously on this blog that I have a Pinephone. I got it running Gentoo, and that was cool, but it turned out I don't need a palmtop anymore. It was exactly what I wanted for decades, but my life is different now. But, I'm ged up with corporate crud and Google Android is now developed closed-source and only released open after the fact going even farther from FOSS. My wife and I make heavy use of the FOSS Tasks.org app on Android for things like shopping lists. Tasks.org syncs via the CalDav protocol through my self-hosted NextCloud server. After digging around a while I didn't see any suitable replacements for a Linux phone I came up empty. Gnome Tasks was missing several features I wanted, and syncs through the enlightenment backend which together is both under and over engineered for my use-case. Thunderbird is similarly a huge application and missing features for Task management. So, I decided to write what I wanted to exist.
I've done most of my professional work in C++, but have a programming language theory background from college. Anyone who's done a lot of C/C++ knows the downfalls and how hard it can be to get a project stable. To explain: consider how python make it super easy to get over the hump of getting *something* that sort-of works. But C/C++ is far easier to get from there to something relatively stable. Rust is like this difference but in the exponent. It makes it much easier than any other language I've used to get a stable, trustworthy, and secure application. I'm not promising Tasx won't have bugs, but I am saying it has far fewer than it would had I spent the same effort in C or C++ with none of the performance downsides of languages like Java. On top of that, as a network application Tasx sits on a security boundary. While I didn't write any network code myself, I have more faith in the libraries I'm using in Rust than I would on most C++ libs for the same reasons. Specifically, CalDav is XML, and XML is a minefield of exactly the sorts of problems C/C++ is known for.
Having selected Rust to code this application, the next step is picking a GUI toolkit. My goal was native, lightweight, and relatively shallow and straightfoward dependencies. Given this I was skeptical of a lot of the Rust GUI libraries that advertise being able to run as a webpage or similar. They might be good, but didn't seem like where I should start. Looking around GTK4 seemed the best fit. GTK4 has wide usage already so most users will already have it installed, so I'm not generally adding more libs to the system. The GTK4 Rust crate is also one of the only toolkits that's officially stable. So, I decided that was the way to go. After some digging I learned that with the combination of GTK and Rust's data models the best approach is to use channels to get the data "out" of GTKs concept of a view to where you could process it. This makes for a lot of boilerplate. Relm4 is a Rust crate that wraps up most of that boilerplate, but still allows direct access to all the GTK APIs, so that seemed like a good bet.
Then what about the networking and CalDav side? The last thing I want to do is write an XML library, or even a CalDav library if I can avoid it. Digging through Rust crates online I eventully found Kitchen-Fridge, which is a caching caldav client library that allows you to access and modify the cache offline as well, making it perfect for my needs. It took me a bit to realize the stable version was broken, but the unstable version did what I needed. A To Do app is a demo example for both GTK-rs and Relm4. Between those, this should be a trivial app to write... right?
Of course not. There's a huge gap between a demo and a product. I wrote down a list of features I wanted and just started adding them. As an experienced developer anything algorithmic I find quick and fun, the difficult part is figuring out APIs. Drag and drop for reordering took me a particularly long time. It works well in practice, but a GTK expert could no doubt make it cleaner. I wanted the app to feel snappy, so synchronization needed to run in another thread and most of the app is asynchronous. I went through several internal data models trying to work out the best way to synchronize data across threads before settling on the "change" model I'm using now (which minimizes data copies while centralizing mutations to keep bugs obvious).
This app is (currently) entirely single author, so I'm the only one to yell at if you hate it.
I tried it on my Pinephone running Phosh Mobian Trixie and it works and feels pretty nice at various scalings. I also tested the install process on that platform. I did try it on my wife's Debian Bookwork laptop running Cinnamon as well, but it has too old a version of Rustc/Cargo, but it works fine if you build the binary elsewhere and copy it over.
I don't use my Pinephone regularly, and I probably still won't, but this is a step in that direction for me and hopefully for the wider Linux on Smartphone ecosystem. In the meantime I use do it daily on my laptop and it's been excellent there. I hope you use it too.
Now that I've learned some GTK and such I want to write a standalone Calendar app for Linux as well so I can ditch thunderbird on desktop, but that's going to be a little while.