Note: See the parent document: Using the Terminal as a Daily Driver for more about terminal productivity applications.

As I look into terminal calendars, I remember the days when I had one of those desktop blotter calendars. When I worked for a big company, they specified the software we had to use for email and meetings. So, if you didn’t like their toolset, too bad. You had to live with it.

In my personal life, I can choose whatever I want. Now my wife and I each have a Google Calendar. We share these so we can see what is on each of our schedules. I have several other calendars that I can view as read-only. All of these are available in Thunderbird’s calendar view. I’ve got admit, it’s pretty nice.

In addition, I also carry a notebook with me where I can quickly jot down notes, To do items, and appointments. When I return home, I can then add them to my appointments to the calendar in Thunderbird, which adds them to the Google Calendar. I also have access to these calendars via my phone, but I rarely ever check them there. My days aren’t that complicated.

So here I am exploring command line calendar applications. A big part of evaluating these is to ask; what is the use case I’m trying to solve? What are required features? Can I simplify what I’m currently doing?

Here’s my initial thoughts and questions.

  • Need the ability to keep a personal calendar for my wife and me.
  • The personal calendar items must be editable.
  • Need the ability to synchronize the personal calendar between desktop, laptop, and phone.
  • If not separate calendars, use tags or some other method to know who’s appointment is whose.
  • The ability to display different calendars in different colors is preferred.
  • Can I toggle subscribed calendars on and off?
  • I don’t need subscribed calendars on all devices.
  • What about to do items in the calendar? Would that be useful? I’m already using [task warrior].
  • I want to abandon Google Calendar. However, I do subscribe to several other calendars and some of them are google calendars.
  • What about an android or iOS app where I could sync my data and then see at least a read-only version from my phone?
  • I already use Syncthing, so that could be used to sync the personal calendar.

Calcure

Calcure is a very nice looking calendar application. It supports reading additional calendars that have been synchronized with vdirsyncer.

If you add an event, it asks for the date and a title. So, if you want to have a time associated with the event, you have to put it at the beginning of the title.

Any events you add will be added to Calcure’s local calendar and not to any of the synced .ics files.

There is also a journal section which is a quick and dirty to-do list tool.

I have quite a few entries synchronize with vdirsyncer. When Calcure launches there is about a 1 second lag loading all of those.

Conclusion

Overall Calcure is a decent calendar. It supports multiple calendars and they can have different colors.

Calcurse

Almost the same name, but it’s a different app. Calcurse was available through my distribution’s software store. So, installing it was very easy. The version is v4.8.1 which is the most recent release according to the homepage. I also downloaded and compiled from source v4.8.2 which was released in June 2025.

I like it. It is taking me a little bit to learn how to navigate, add, edit within the interactive screen. There is one showstopper for me with Calcurse. It only supports its own calendar. So, that means I can not add in other calendars that are being downloaded via vsyncdir.

There is a utility named calcurse-caldav that may synchronize calendars. My running of it resulted in a unable to import httplib2 error. Unfortunately, httplib2 is installed as part of my system. But, this utility is not finding it. Probably because of all the python development things I have installed.

Details

The documentation indicates the configuration and data files will be stored in the $HOME/.calcurse folder. I prefer all of my configs to be stored under $HOME/.config/calcures. I don’t know what I did to get it to do that, but that is where my configuration information is stored. The actual data files are stored in $HOME/.local/share/calcurse.

Contents of ‘~/.local/share/calcurse’ data folder

 .
├──  apts `appointments data file`
├──  notes `folder for appointment notes`
└──  todo `todo list data`

The data files are stored in what the documentation refers to as po-files. In addition to being editable with a text editor, the documentation refers you to some additional tools that can be used to work with the files.

Contents of ~/.config/calcurse configuration folder

 .
├──  conf `configuration information`
├──  hooks `folder for scripts that trigger events`
└──  keys `keystroke mappings`

There is the ability to modify the configuration from within calcurse. So, haven’t had any need to edit these files manually.

apts file structure

In opening up the apts file, this is a sample line.

05/28/2025 @ 10:00 -> 05/28/2025 @ 11:00>b174b91c4de1e0e54a8e958d285f598b1e813841 |Steve: dentist

Breaking this down:

Start date ‘@’ Start time ‘->’ End date ‘@’ End time ‘>’ notes file name (40 character unique filename identifier) ‘| or, ! or, nothing’ Description

I am not yet sure what the | pipe or ! exclamation separator means. But, it does show up in the calendar view. I think the ! (which can be set by typing the exclamation point inside the interactive window) causes the application to notify you on the notification bar by blinking the text. Not sure if it does anything else.

Here is an example of a repeating event. Notice after the End Time there is the repeat information inside the curly braces. In this case {1M d30} means to repeat monthly on the 30th day of the month.

04/30/2024 @ 10:00 -> 04/30/2024 @ 11:00 {1M d30} >bbdf3a8b7680e85b1c1f31b34126835da4736cc0 |Check A/C Filter

Conclusion

I really like the look of Calcurse. It looks better that the others. But, being able to import CalDAV calendars that I subscribe to is a must have feature for me. I thought about copying the calcurse-caldav python file into my own dev environment and trying to get it to work that way, but that makes this more complex. Not sure that I want to go to that length.

For a simple, stand alone calendar, Calcurse is great. But, it doesn’t really work for me at this time.

Khal

An interesting thing about khal is that it uses .ics files for its data store. It also uses a SQLite database file (~/.local/share/khal/khal.db) to organize and manage the .ics file information. Within the interactive window, there is an option to edit the .ics file, but you are warned about editing the file directly unless you know what you’re doing.

If you have not created a configuration file, you can run an interactive helper tool to get you started.

khal configure

The configuration file is stored in ~/.config/khal/config.

Khal has two ways to interact with it. First is a command line only mode that prints out the desired information and then exits. The example show below will list out upcoming appointments and then exit.

Each calendar’s items can be displayed by setting a color in the config file. The color choices are:

  • black, white, brown, yellow,
  • dark gray, dark green, dark blue, light gray,
  • light green, light blue, dark magenta, dark cyan,
  • dark red, light magenta, light cyan, light red

I also changed the first day of the week to be Sunday by adding the following to the config.

[locale]
firstweekday = 6  # set first day of week to Sunday
# display upcoming events from the command line.
khal list

The second is an interactive mode that allows moving through the calendar, selecting dates and events, adding, and deleting the information. To use the interactive mode, use the following command:

khal --interactive
# or the alias:
ikhal

Really liked khal even though it’s interactive interface is not the prettiest. It proved to be very functional. It does allow you to edit events that were downloaded with vdirsyncer although it is in the .ics format. So, if you are careful, that is doable.

Selecting an event and hitting displays additional details about the event, so that is very nice.

Conclusion

Khal has a lot to offer. There is a command line mode and an interactive mode. So, I get the best of both worlds. Khal is the top choice three and I have made it my primary calendar.

Extras

In Linux Mint, there is a desklet named Note (notes@schorschii). I installed that on my desktop and configured it to read its info from a calendar.txt file.

Then I set up a nightly crontab job to list three days worth of calendar items to a text file.

khal list today 3d --day-format "--- {name}: {date} ---"> ~/calendar.txt

When the command runs, the Notes desklet picks up the change, so I always have a current calendar on my desktop. Sweet!