Files
calendarender/README.md
2025-08-12 12:06:33 -04:00

4.6 KiB

calendarender

These are 2 scripts I use for calendaring in plain text files. The calendar consists of 2 files:

  • calendar_archive.txt contains all the days before current day.
  • calendar.txt shows the current day at the top and continues down as far as the number of months that have been rendered. My calendar contains events and tasks for the current day. A typical day might look like:
⇃☾ tue dec 20

8 weekly meeting

9 website meeting

lunch with james



reply to susan
laundry
groceries
locate receipts

Events are at the top with a space inbetween them and the tasks for the day are below without spaces. As tasks and events are completed I move them to just below the day title, sometimes with little notes. At the end of the day any uncompleted tasks will either get copied to the next day or migrated into my kanban task list in Obsidian. Then after midnight or next morning I run calendarchive.sh and start again for the next day.

I've been calendaring this way since fall of 2019.

I sync the notes between computers with SyncThing and edit them via Notational Velocity, TextEdit or Gedit, depending on what computer I'm on. In the future I think I might merge this plain text notes folder with my markdown project notes in Obsidian.

the scripts

calendarender.sh

calendarender takes one argument and that's the number of months in the future you'd like to render. So say it's currently some day in November and I want to add the days in January to my calendar.txt, I would run calendarender 2. It then prints to the terminal as well as to the file.

Each day is rendered with a title containing the moon phase, day of the week, month, and day of the month. Moon phases that are printed are: new, full, crescents and halfs. On any day that isn't one of those phases a sun is printed. If it's waxing an up-arrow will be printed, waning, down-arrow. It's not the most accurate moon-phase algorithm but close enough for me :)

calendarchive.sh

if you run calendarchive without any arguments it will remove all days from calendar.txt that are before the current day and append them to the bottom of calendar_archive.txt. If it's late at night but before midnight you can run calendarchive 1 and it'll also archive today as well (this doesn't work on linux though because of differences in how the date program works. Oh well.).

installation + configuration

calendarender.sh

Open calendarender.sh in your texteditor of choice and find the line:

calendarFile="/Users/YOU/WHEREYOURNOTESARE/calendar.txt"

This must be the absolute path to your calendar file. If you don't have one just make an empty txt file to start.

To configure recurring events find where it says ############# render weekly things. This section is broken down by day. There are a number of examples for Sundays that you can look at and modify for different days of the week/month. Anything in quotes after echo will be added to the calendar.

  #every sunday
  if [ "$dayOfWeek" = "Sun" ]; then echo "water plants">> $calendarFile; sunday=$(($sunday+1)); fi

Make sure not to get rid of the section sunday=$(($sunday+1)) because that is how the program keeps track of which sunday/monday/tuesday/(etc) we're on.

 #second sunday
 if [ "$dayOfWeek" = "Sun" ] && [ "$sunday" -eq 2 ]; then echo "example potluck">> $calendarFile; fi

copy this to another day and change Sun, sunday, and sunday to another day. The 2 indicates this will be on the second sunday

  #last sunday
  if [ "$(date -v1d -v+"$tooFarNum"m -v-1d -v-sun +%a-%b-%d)" = "$(date -v1d -v+"$1"m -v+"$PLACEINMONTH"d +%a-%b-%d)" ] && [ "$dayOfWeek" = "Sun" ]; then echo "last sunday of the month potluck">> $calendarFile; fi

this one is a liiiitle more complicated but you can copy and paste this one to create events on the last monday/tuesday/etc of the month. Just change "Sun" to a different day of the week

calendarchive.sh

Within calendarchive.sh, find the lines:

calendarFile="/Users/YOU/YOURNOTESFOLDER/calendar.txt"

calendarchive="/Users/YOU/YOURNOTESFOLDER/calendar_archive.txt"

and modify them to point to the absolute path of your calendar files. Make sure both those exist at least as blank files.

that's basically it

You might need to chmod +x each of the scripts to make sure they're executable. You can now just run them with sh calendarchive.sh or sh calendarender.sh. I've added the following lines to .bashrc so that I can just run arch when I'm ready for the next day:

function arch() {
   cd ~/notes
   sh calendarchive.sh
}