Calendar apps are so complicated and tightly integrated with other productivity apps now I'm not sure the benefit of simplicity here outweighs the cost of losing that.
My Google cal emails me notifications, works with desktop calendar apps, integrates with Maps, etc. It autofills addresses, adjusts for time zones, syncs across my 4000 devices, allows me to edits dates via text input or GUI/drag 'n drop, etc. (Not shilling, Apple cal is probably similar.)
Even my todo list went from org mode to Google Tasks because of the integrations with Android, Google Calendar, etc.
I think you have it slightly backwards (or should).
There's an open standard, icalendar (https://icalendar.org/) which represents calendar entries. Invitations you get in the mail come this format too. The easiest way for your map, address book, reminders etc to integrate is just to talk to your calendar server. The apps need not know about each other at all.
Google and microsoft of course may do some non-standard futzing around within their proprietary stacks: you can often see these problems when you try to connect to something outside their silos, though in my experience the standards integration in google calendaring is pretty good (especially when compared to their mail system). It's been a few years since I had to interface with Exchange calendaring but back then it...wasn't good.
So in any case there's no reason you couldn't write a small service that spoke ical over the network and this plain text calendar's format locally. Then it would appear normally in your partner's iphone, handle your kids' schools' calendars etc.
Whether it would be worth doing that is literally an exercise for the reader...but you'd get the same level of integration as you would with, say, Apple's icloud calendar services.
That's fine in theory but honestly I have bigger fish to fry than rolling my own networked calendar. Much as I'm a big advocate for open source and open specs (even being an author and contributor to a few open source projects too), I have to use these proprietory systems for authentication and email at work anyway. So the convenience of using them for my calendar too far outweighs the cost of rolling my own solution.
This is one of those situations were worse is better.
> There's an open standard, icalendar (https://icalendar.org/) which represents calendar entries. Invitations you get in the mail come this format too. The easiest way for your map, address book, reminders etc to integrate is just to talk to your calendar server. The apps need not know about each other at all.
> Google and microsoft of course may do some non-standard futzing around within their proprietary stacks: you can often see these problems when you try to connect to something outside their silos, though in my experience the standards integration in google calendaring is pretty good (especially when compared to their mail system).
Yes, crossing the two is often still a hot mess.
The first paragraph sounds great in theory. The second paragraph sounds more like what happens in practice...
> Calendar apps are so complicated and tightly integrated with other productivity apps now I'm not sure the benefit of simplicity here outweighs the cost of losing that.
I've been looking for something like this that will let me edit in plaintext but also sync both ways with gCal for the benefits of plaintext but also the caveats that you mentioned.
I actually built something exactly like this, using the google calendar API and FUSE. It wasn't very difficult at all, I think it took half a day. I'll try to find the code, it's been about a year since I used it since it was just a toy and I didn't want to maintain it.
If you work alone, your calendar and todo lists are what you put there with you as the only editor. So whether, you use pen & paper, a spreadsheet, a text file in Google Drive, or whatever, does not matter to anyone except you. So, whatever works for you. I'm a pen & paper guy. But as soon as you are not working alone, you need different tools. Mostly, my pen & paper work eventually ends up in a proper tool.
Any time slot that matters to me goes into a proper calendar so my time is marked as blocked and people know that I'm busy and don't dump meetings in it. I literally block time to code. Likewise, a lot of my work is coordinating work with others and we use Asana and Github issues for that sort of thing. Other tools are available. But the key feature usually is that you can use them with a team and assign stuff to each other, edit them concurrently, and have some non technical team members doing so as well.
Doing csv exports and imports is feasible for calendars and issue trackers but it doesn't solve a problem I have (except when migrating to different tools). As data input tool that seems not really great. It's actually why I like Asana; I can just type an issue, hit enter, type another one, etc. It feels like a spread sheet tool.
The problem is that Google Calendar (and most other widely used calendars) has poor portability. I too use it, because my work uses it, so I have no choice, if I don't want to end up with multiple calendar apps. I hate it for this reason.
I think I still prefer Remind's approach for now; it keeps the ability to have a plaintext viewable thing, but Remind also appears more scriptable and exportable; e.g. I make mine both give me reminders in my Terminal, and I can also make it print out a regular "human-ready" calendar.
I wish the website came with a (detailed) list of features (especially regarding interoperability) and more screenshots. A 51-minute video on YouTube doesn't really help. :|
Emacs users, you have the built-in diary which also integrates with org-agenda. It's perfect for recurring events like birthdays, bills and also provides reminder.
Maybe not what the article is exactly talking about, but `cal` will give you a calendar in terminal. `cal -3` will give you each surrounding month, and `cal 2022` will give you the full year
I have a shell function I use all the time to keep track of both calendar and timezones where our teams are located
now() {
cal -3
echo
echo -n "Local: "
date --rfc-3339=s
echo -n "UTC: "
date -u --rfc-3339=s
echo -n "New York "
TZ='America/New_York' date --rfc-3339=s
echo -n "London: "
TZ='Europe/London' date --rfc-3339=s
echo -n "New Zealand: "
TZ='Pacific/Auckland' date --rfc-3339=s
}
Often I use cal to find the previous or next month. I never understood why two parameters it assumes `cal mm yyyy` but when one parameter is provided assumes `cal yyyy` instead of `cal mm`.
ie, I just want to see April of this year: but `cal 4` returns Jan-Dec 0004 CE <!>
Which cal? It is a relatively simple program that has seen many implementations and extensions. The cal I had in mind was the version from the util-linux package, it is commonly found in Linux distributions and supports full or abbreviated month names as arguments.
One of my earliest computing-adjacent exposures was going into my dad's office as a kid. Besides getting to type random things on punch-cards, we'd typically bring home these line-printer calendars with a Snoopy (or whatever) ASCII-art pic at the top.
This is similar in spirit to my app, TaskTXT (https://www.tasktxt.com). It's a plain text task manager which allows you to time your tasks, helping you avoid distraction. The timer data is stored right in the document.
I used taskwarrior (https://taskwarrior.org/) for years and loved it but eventually stopped because of there was no way around having to manage a separate task manager on my phone. I follow GTD and it really demands that you be able to add tasks immediately so I would end up maintaining two lists. Not very effective so I went back to using Things.
This has been my only issue with using Taskwarrior. There are a few android apps (the quality of which I cannot speak to) but not having an iOS app means I end up missing lots of things. https://github.com/blampe/taskwarrior-reminders was probably the closest I got, but it had some issues with some of my tasks. I miss having a single good place to put all my tasks.
Hi, I signed up for a subscription for syncing and was charged but now I can't access the subscription page (which means I couldn't cancel it or update it if I wanted to do that). Also the "Contact" link is broken at the bottom of the page. I really love the app, hoping this can be resolved :)
I'm the creator of Calendar.txt. I'm very happy to see this on Hacker News.
I've used Calendar.txt as my calendar for over a year (and previous versions before that). Having previously marketed both digital and paper calendars, and tested the digital variety, I felt they were excessively complicated.
For me, the benefits of calendar.txt have been reliability, simplicity and integration with established Linux tooling (grep, git, scripts). The downside has been lack of automatic synchronization, a tradeoff for simplicity and reliability.
If you want to ask about using Calendar.txt, I'll check here during breaks from my Django intensive course.
I've decided to use your text file template the other way round: one line at the end of each day about what I did. Sort of a personal log. Thanks for nudging me into that direction.
My teacher voice says: concentrate on your Django course while you can bombard the facilitator and participants with questions.
Hi colleague, I'm teaching the course, so the students are asking the questions.
Happy to hear that you've found a new use, journaling, for calendar.txt. I'm using it similarly myself, even though it's not mentioned on the page. For some projects, I collect billable hours from old calendar.txt entries ('grep +theproject calendar.txt'). I also use it to record some results, e.g. Cooper x meters on this date.
Do you use calendar.txt for journaling and another program for calendar planning? If so, what are you using for a calendar?
Well now I wonder why I assumed that you were a participant? I've got some thinking to do about that one!
I plan to rename my copy of calendar.txt to yesterday.txt. Each morning my plan is to write something about what I did yesterday with a view to extracting themes - perhaps like not making assumptions about the roles people on forums might have. I'm thinking some code words might emerge like '$ScreenTime 3'. But I'll see.
Planning: I am actually a teacher in adult education so we operate on pre-determined timetables for each class. I have a document called a 'scheme of work' which I use to plan what happens each week in a given class with space for a bit of a note after each session about what actually happened. Schemes of work are 'working documents' - they change as the year unfolds. My life in general just lives on a (paper) calendar on the notice board in the kitchen.
And I am writing my dissertation, so technically, those stats & the guess are also correct.
2b3a51, interesting planning process. My system with calendar.txt and planning courses: I use week headings for marking the periods and period weeks (4p1). When reserving course days, I just put the tags there (+pw). Later, when I decide the main theme, I add it ("+pw deploy"). If there is a special channel, guests and other info, I add it as it arrives.
For past events, calendar forms a nice basis. At least for me, most of the stuff I plan, happens. I understand you add some insight there, maybe I should try that, too.
I wrote something similar ~5 years ago, as a reminder mechanism for myself (never shared it, it's very basic).
calendar.txt (lowercase for my filename) but only 'YYYYMMDD thing' for how the content line was - you've got more structure going on so that's cool, I like the week numbering - good idea.
calendar.sh was my little grep reminder tool running from cron.
I actually love plain text in general, and if this meets your needs, there’s no need to overcomplicate things.
The tradeoff is the greater feature set of ics comes with a necessarily more complicated format. We can see complexity creeping back in to this format as you scroll towards the bottom and tags are introduced, and there’s still a lot missing. With the way it is now, basic things we take for granted like recurring meetings are not handled. You’d need a separate program to insert/delete lines and do the date math if the format isn’t going to change, or more likely a special event type. If you add a recurring event, then you’d likely end up revisiting the one line per day idea.
or if I could just inject and print my own calendar events to and from the `cal` command and send that through an ical parser--item added via a plain text calendar, added to ical, and immediately updated event on my phone. It's been on my mind to just write something like this as a side project forever but...
From LAPTOP Sat Jan 3 01:05:34 1996
Subject: CAL EVENT: Call gas company
Account number: 12345678
From ANDROID
Date: Tuesday, May 31st, 2020 6pm EDT
Subject: CAL EVENT: Meet Chris after work for drinks at Bad Bar
A format like that could be edited in a text editor, or easily loaded into a simple app with an existing parser library. A single mbox could be a calendar with each e-mail a calendar item, which is easy to search/filter by an email client. As a bonus it supports MIME encoding to attach files. You can use one date format, or several, and have a script easily re-format the date lines if you want to grep/awk it.
Other existing formats (https://en.wikipedia.org/wiki/ICalendar) have features missing here, like date/time ranges, recurrence, status, allday, reminder time/method. While you might not want them yet, you may want to convert your calendar to/from another format in the future.
I am not sure ics invites will still function universally in a decade and our our attitude toward today's phones might resemble then how we regard a PalmPilot today, but I am sure this plain text file system will continue to work. Here is another tool to free us from the data collectors and analytics merchants that continue to invade our privacy and manipulate our society. Thanks for making something useful that will still be functional in a decade.
I'm surprised nobody here has mentioned the "when" utility yet, available on most linux repositories.
Package: when
Version: 1.1.38-2
Priority: optional
Section: universe/utils
Origin: Ubuntu
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Original-Maintainer: Salvatore Bonaccorso <carnil@debian.org>
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Installed-Size: 156 kB
Depends: perl:any
Recommends: m4
Homepage: http://www.lightandmatter.com/when/when.html
Download-Size: 49.7 kB
APT-Manual-Installed: yes
APT-Sources: http://archive.ubuntu.com/ubuntu focal/universe amd64 Packages
Description: tiny personal calendar
Minimalistic personal calendar. It runs from the command
line, and it uses a plain text file format, which you can edit
using your favorite editor.
I love the idea but this is poised to be limited only to my use. I can't get my wife and kids to do the same. Platform wins, if we're on iOS, the best calendar is the one that will sync across our events, period.
Additionally this is not a great format for recurrence, which has to be done manually, reminders(nil), notifications, change tracking (without git), location information and you're obviously at the mercy of typos.
For my use, lack synchronization with other organizations' or person's calendars is indeed a limitation with calendar.txt. Adding events manually is obviously slower than just clicking accept. Adding that feature would likely mean tradeoff for reliability, security and simplicity.
Synchronizing my own calendar.txt between my own devices has worked very well for me using git and synchthing. I also find it very easy to audit correctness of synch, thanks to plain text and version control.
For recurring events, I have found calendar.txt much easier for my use. Many recurring events have small number of events in any given year. Also, there are often exception or two, and some entries get more specific over time.
I have found adding recurring events much faster with a text editor than any of the calendar programs I've used. As the author of calendar.txt, I'm of course biased here.
I've been using a markdown-based calendar in Obsidian together with a regular Google Calendar, and so far, it's been working great for me. For markdown, I simply create interconnected notes for years, months, weeks, and days and note down goals, tasks, birthdays, and whatever happened that day (or needs to happen). For scheduling, I use regular Google Calendar events as you want to keep the benefits of invites and all.
I like the idea, but it seems to have a flaw (or I missed how one should handle this). Not all events happen on the same day, especially if you work third shift. I guess you would just split it into two events (not really a fan) or just do something like 23-3, but then it kind of breaks the "one day per line" rule.
Nice to see the emphasis on the advantages of "plain text". Nearly all my important computing is just "plain text", including the 100,000 lines of typing of .NET code, that appears to run as intended, for my startup's Web site.
For calendars, right, that's important data. Sooooo, I wrote some software that is correct back to Pope Gregory. E.g., can read Gone with the Wind, look up the date of the firing on Fort Sumter, and then know the day of the big BBQ!
But my plain text calendar program just prints out for any given year, for each month, a traditional calendar format, e.g.,
Right, there is a lot more we
want to do with calendars!
Sooo, I wrote code in Fortran, Rexx, and Kexx (macro language for "plain text" text editor KEDIT, by far my
most important computing tool) that, given one of either (a) month, day, year or (b) number of days since the start of the Gregorian calendar, will return the corresponding other. So, easy to calculate number of days between two dates, day of week, etc.
Then can easily write other little programs to do a wide range of applications of manipulations of calendar data!!
So, there's another theme: End users get some general purpose tools, e.g., subroutines that do the hard work, and with those tools write short programs that give them what they want, likely all in easy to work with plain text.
I've adapted todo.txt format to be a worse-is-better combined calendar/appointments and task list, for personal use (not a lot of meetings scheduled, nor videoconf&chat integration). It works well enough for now.
Basically, change the meaning of the date on a todo.txt item to be the soonest date that task/appointment can be done, have optional time of day (point or range), and sort the entries to an appropriate ordering (pending before completed, then by date, then by time of day). Every day, tasks you didn't do, search&replace the date to tomorrow.
I'm using todo.txt and calendar.txt together (but as two separate files). I've chosen some conventions for calendar.txt to work smoothly with todo.txt, such as @contexts and +tags.
They work nicely together. To check for all calendar events and todos for a project, I can 'grep +pw calendar.txt todo.txt'. This also shows the start and end date of the project (first and last event date)
I'm not really one for shilling my (decidedly unprofessional) coded projects, but submit that I have put together a shell script[1] that builds an agenda using date stamps from passed text files. The script is POSIX compliant if you pass a flag, but otherwise uses Fzf to filter and jump to entries. It's basically like a less extensible, but much shorter (in terms of lines of code) version of Org Agenda. I'm currently extending it to export an ICS file, which will allow automatic import into calendar services from Google, Fastmail, Apple, or whatever. Two-way calendar sync is beyond my will for faff, but if the spirit so moves someone I wouldn't stand in the way.
I've been using a variation of this for at least four years now (the first line from the first git commit starts with 2018-07-29, but I'd been already using it for a while).
I use a simpler syntax, such as "2022-06-01 Event description" or "2022-06-01 12-13 meeting" because I don't really care about week numbers and week days are handled separately (see screenshot).
Through the years I've added more features as it became more interwoven with the rest of my (plain-text) productivity system.
For example, I have reminders: 2022-06-01 2100! take out the trash. This notifies me at 21 on whatever device I'm using at the moment (computer or smartphone notification)
I have a vim syntax and ftplugin files that help in visualizing important things (eg. the date and time are highlighted; inactive events (starting later) are shaded a bit) with support for easy and ergonomic moving of things (keyboard shortcuts to postpone tasks by one day, one week, etc) and also handling of recurring events (every X days/weeks/months/etc).
Relevant data is integrated into dashboards (e.g. the number of remaining events/tasks for the day is shown in my desktop statusbar); each morning (or the evening before) I can get an email with the tasks for tomorrow, etc.
The only thing I'm missing, since lately I have begun attending several meetings and have started timeboxing my work time as well, is the ability to see those nice boxes one sees e.g. in google calendar in day or week view. However I think that this plaintext file could be parsed and a view like that could be generated with relatively little effort.
edited to add. I just noticed that OP's solution is one day per line. Mine is one event per line, which I find much more readable and versatile. You can change the date or time of an event and then simply `sort` the file and it's automagically in order
Nice work, chootisk. I can see our systems are quite similar, with some adaptations to preferences. For me, week numbers and weekdays are what I think about, and dates (2022-06-01) is what I need for communicating with others.
Your syntax highlight sounds like a nice addition.
For a slightly different take on this problem (a calendar in plain text), calendar.vim plugin by itchyny provides a wrapper for Google calendar in Vim.
The option of viewing your calendars and tasks on the phone or anything with Google calendar gives a very considerable advantage, IMHO.
Sometimes less and simpler is… just less. Can’t see this being useful for anything I actually use a calendar app for. Recurring events, inviting others, alerts.
I really like this. Maybe it's because I'm Finnish, but it just makes a lot of sense intuitively.
Some of the comments I do agree with (syncing with Apple, Google and Microsoft would be amazing) and hopefully someone is willing to extend the calendar to enable this. Heck, I might have a go myself.
Author of calendar.txt here. I found the lack of synchronization a downside of calendar.txt. Drop me a line or add a comment to calendar.txt page if you end up experimenting with synch.
A tradeoff with sync to external calendars will be reduced simplicity, reliability and security. Depending on your use case, it might be worth it.
Reverse engineering my intuition, perhaps it's the order of (mental) operations? Very few calendars treat week numbers as a first class citizen, and most emphasize the day of the week unnecessarily, while putting less emphasis on the information we consider important. Let me elaborate.
In Finland there is a heavy reliance on week numbers. When finding a shared free time slot for a meeting you pick a week first. Especially the public sector revolves around weeks and the default user interface is the official desktop paper(!) calendar.
What makes most US-based calendars confusing by default is the different Date/Time format. The Finnish written standard is DD.MM.YYYY with the week starting on Monday.
Localisation doesn't necessarily help. The British mental model clashes with the Finnish tradition in highlighting the "wrong" pieces of information. In spoken Finnish 'month DD' or 'DD' if you're already looking at the same week is the natural order. The British put a lot of emphasis on the day of the week and the order/formatting is also "wrong": 'DAY DD MONTH'.
In the grand mess of global localisation these are tiny details, but many smaller nations, and their citizens, get stubbornly attached to our local peculiarities.
Calendar.txt uses the ISO-8601 standard, where weeks start on Monday.
But you should use whatever works for you. If you want to use the US system, you can easily adapt to this. The short Go code for generating the template is on calendar.txt homepage.
Unless I'm missing something, lines are already sortable using YYYY-mm-dd, so the weeknumber is irrelevant in sorting (2021-02-21 comes before 2021-02-22 whatever week number and weekday they are)
My Google cal emails me notifications, works with desktop calendar apps, integrates with Maps, etc. It autofills addresses, adjusts for time zones, syncs across my 4000 devices, allows me to edits dates via text input or GUI/drag 'n drop, etc. (Not shilling, Apple cal is probably similar.)
Even my todo list went from org mode to Google Tasks because of the integrations with Android, Google Calendar, etc.