My calendar setup

Edit: No longer true, I now use vdirsyncer, khal and khard. Just read hund’s blog. The calcurse syncing was such a big pain, and I started to selfhost radicale and so everything was pretty easy.

The Problem

I love TUIs. Being able to use just keys to do a lot of things without touching your mouse is pretty awesome. But I can’t constantly be on my laptop. I mean sure, with the pandemic, that’s all I’ve done, but if when it gets over, I’ll be on the move. I can’t turn on my laptop for every damn thing. I need to have the things I am working with on my phone too, especially things like the calendar. Now you get to read about the things I’ve tried to set up a TUI calendar which also syncs to my phone.

On my laptop

Conclusion: Calcurse. Beautiful.

I first tried remind with wyrd, but it just seemed too… much. It’s pretty cool, but it seems to have a very condensed UI, and I prefer more open UIs

Then I tried calcurse. With a pretty light UI and sensible (read vim-like) key bindings, it’s super easy to get a hang of. Creating, editing and other stuff is pretty easy. Also, the notes feature is pretty awesome as it allows me to add pesky zoom links which have a tendency to get mixed up. Zoom should just give a random name to their meetings, like yellow-monkey-poop or something. It might even bring some joy into a dreary life of pointless Zoom meetings. Anywho, I pretty much stuck to calcurse.

But then I read about khal in hund’s blog and decided to try it. The interface is a bit different, with way too many months shown at once, and the key bindings are weird too. It seemed like there were 3 layers to the UI- the month layer, the day layer and the event layer. Calcurse on the other hand uses a single layer with 3 parallel sections, the to-do, appointments and the month. Calcurse just looked better, but khal isn’t far behind.

Syncing with other laptops

Now comes the real issue. Syncing. Sure I could set up a CalDav server, but I don’t have a static IP, and if I go back to my institute, I will not be able to access my laptop. Also, my laptop has to always be up, which is not the case. Plus, implementing my own set up would be a pretty painful task.

I could use some online server, but I couldn’t find any services which were not self-hosting. Also, I wouldn’t be able to store the calcurse format, instead store an ical which I convert on opening calcurse, which seems dumb.

My solution was git. Git is device and OS-agnostic, and I already know how to use it. Plus I get a change history for free, though I assume that at some point the history will get too large, and I’ll have to squash previous commits, but that’s like a once in a year thing. Putting it on a remote server also ensures that it is backed up, so even if my beauty of a laptop dies, I’d still have my calendar.

You can make the calcurse directory a git repo and add hooks to commit and push in post-save and pull in pre-load. I used GitHub as the remote repo, but you could use anything of your choice. Now in another device, all I had to do was clone the calcurse directory, and I’d be done. Since literally everything from settings to hooks was in the same place, it would work exactly the same in all devices.

Calcurse on Android

The final issue. Phone syncing.

My first attempt was to simply try to extend the same set up to android via termux. While that worked, calcurse was pretty hopeless on such a tiny screen with a soft keyboard. TUIs are not made for touch screens. I tried wyrd and khal too, but they weren’t easy to use either.

I knew I could get the calcurse data onto the phone, it was the UI that was a problem. I briefly thought about making an app which could parse and display calcurse data, but then remembered the painful thing that is Android development. Plus I would basically have to rewrite the calcurse parser which itself is in constant development, which would mean my thing would have to be in constant development. No, thanks.

I then dabbled with exporting an ical file from calcurse on exit, which worked fine, and I was able to import it into my calendar(Simple Calendar) too. At first, it would import the data multiple times, but then I found out that adding --export-uid while exporting from calcurse prevented that from happening, so that was fine. But the major issue was that I would have to run the git pull myself and then open the ics file with the calendar. Then too, events which were deleted from calcurse wouldn’t be deleted from the calendar, as events would be imported and merged to the default calendar.

I needed a calendar app which would basically only display the ics file, that’s all. Not knowing any apps, I just typed ics into Aurora Droid and I found ICSx⁵. This was perfect. I could sync a CalDav server, and it would work perfectly.

But this cycled back to the first issue. I don’t want to set up CalDav. Then I thought of just trying to “sync” a URL which was just the link to an ics file. I used the raw link of the exported ics in my calcurse repo, and it worked!

Now, any time I edit the calendar on my laptop, it exports the calendar to an ics, commits it the repo, pushes to GitHub. From there, ICSx⁵ syncs the changes to my calendar when I refresh in the app.


Still not the best

This set up is still not perfect. I cannot make changes on my calendar app which propagate to the laptop. I have to fall back to the calcurse CLI or TUI to add an event via termux. It’s not a dealbreaker, especially since I don’t have too many updates anyway, but a person can dream.

#mysetup, #tui, #sync, #git