_    _    _           _      
 | |_ (_)__| |_ ___ _ _(_)__ _ 
 | ' \| (_-<  _/ _ \ '_| / _` |
 |_||_|_/__/\__\___/_| |_\__,_|
                    historia.vg

Soon: A Plain Text CLI Calendar

A couple years ago I made myself a little calendar app that I really love. I’m a plain text guy: notes, documents, emails, todos. It annoyed me that my calendar was a slow web app.

This led me to When, which I adore for its simplicity but has some nerdy syntax. There’s of course Org Mode and the juggernaut Remind, which are both incredible plain text calendaring tools, but their features and complexity remove them a bit from the simplicity I like about text files.

So I made my own: Soon.

calendar and cli demo of soon

The syntax is similar to When and Remind but simplified. Each line of your calendar is a list of conditions, a comma, then your event. Each condition of a different type (year, month, day, weekday, etc.) must be met.

Jul 1 2026, This means month=July AND day=1 AND year=2026
July 1,     This means month=July AND day=1, so it happens July 1 every year
1,          This just means day=1, so the first of every month!

You can add multiple conditions of the same type to a single event, in which case either of those conditions must be met.

1 15,         day=1 OR day=15 so the 1st and 15th of every month
July Sat Sun, month=July AND (weekday=Saturday or weekday=Sunday)

You can use ranges with a dash. If you group an entire date (day, month, optionally year) in parentheses, you can use that date as a range too.

July 1-7 2026,                I'm on vacation!
(June 30 2026)-(July 7 2026), I'm on vacation!
(Dec 25)-(Jan 2),             I'm on vacation (every year)!

You can set up more complex recurrence than any GUI calendar supports with the not operator ! and Rounded Modified Julian Date Modulus. Wow, that sounds fancy! Really, it’s a variable J that counts the days since November 17, 1858. You can use the modulo operator % and +/- to create a condition that returns true when the result is 0. Normal people will never need this, but if you have a wacky recurring event this can likely describe it.

Oct Fri !13,     Every Friday in October except the 13th.
J%3,             Every third day
Sat J%2,         Every other Saturday
J%14-5,          Every other Saturday expressed in a less readable way

There’s more! It supports adding multiline details without ugly trailing \, todos (and todos with deadlines) in the same calendar file, comments, and times. It has a TUI that lets you mark future events as completed or keep past events on your calendar until you mark them as completed.

I like it a lot!

Since you probably haven’t used When or Remind, here’s a comparison of the same calendar for all three programs:

Soon:

1,               Pay rent
Dec 25-31,       Christmas break
July 1 2026 7pm, Dinner with Albert
  + Meet at Gorbino's

Remind:

REM 1                     MSG Pay rent
REM Dec 25 THROUGH Dec 31 MSG Christmas break
REM Jul 1 2026 AT 19:00   MSG Dinner with Albert \
  Meet at Gorbino's

When:

d=1 ,                   Pay rent
m=dec & d>=25 & d<=31 , Christmas break
2026 jul 1 ,            7:00p Dinner with Albert \
  Meet at Gorbino's

Does anyone need another freaking calendar/todo app? No. But real plain text file calendars (not just CLI/TUI ones) are niche so I didn’t reinvent the wheel for no reason. Anyway, you could probably vibe code this in 10 minutes flat these days, so there’s no one to share tiny dumb projects with anymore.