==== Build Dianne Skoll's Remind ==== This software builds beautiful calendars, and it can do a lot more than that, things like send an e-mail two days before a full moon, or pop up a desktop alert to remind you about your meeting that happens on the fourth Saturday of the month except for November and December when it's on the third Saturday. ---- This is built on a fresh Debian/Ubuntu/Mint install, it's similar for Fedora/etc... sudo apt install -y etckeeper git tig sudo apt update && sudo apt upgrade sudo apt install -y build-essential checkinstall libjson-maybexs-perl libpango-perl libcairo-perl git clone https://git.skoll.ca/Skollsoft-Public/Remind.git cd Remind/ ./configure make make test sudo make install cd ~ vim .reminders # This should generate a 12 month calendar for 2024 remind -pp -ca12 ~/.reminders 2024/01/01 | rem2pdf -e -l -c3 -m Letter > Calendar.pdf Below is the content of the .reminders file; # Set your latitude and longitude correctly for Sunrise/Sunset/Equinox/Solstice # # The values below are for Eastgate, Ohio SET $LongDeg -84 SET $LongMin 44 SET $LongSec 53 SET $LatDeg 39 SET $LatMin 5 SET $LatSec 51 SET Sunday 0 SET Monday 1 SET Tuesday 2 SET Wednesday 3 SET Thursday 4 SET Friday 5 SET Saturday 6 SET Sun 0 SET Mon 1 SET Tue 2 SET Wed 3 SET Thu 4 SET Fri 5 SET Sat 6 SET Jan 1 SET Feb 2 SET Mar 3 SET Apr 4 SET May 5 SET Jun 6 SET Jul 7 SET Aug 8 SET Sep 9 SET Oct 10 SET Nov 11 SET Dec 12 SET January 1 SET February 2 SET March 3 SET April 4 SET May 5 SET June 6 SET July 7 SET August 8 SET September 9 SET October 10 SET November 11 SET December 12 SET Quote CHAR(34) SET Week_1 1 SET Week_2 8 SET Week_3 15 SET Week_4 22 FSET _last(mo) "1 " + MON((mo%12)+1)+" --7" FSET _trig() TRIGGER(TRIGDATE()) FSET _back(days) TRIGGER(TODAY()-days) FSET _am_pm(tm) IIF(tm<01:00, tm+12*60+"am", \ tm<12:00, tm+"am", \ tm<13:00, tm+"pm", \ tm-12*60+"pm") FSET _no_lz(s) IIF(SUBSTR(s, 1, 1)=="0", SUBSTR(s, 2), s) REM Thu MSG Garbage to curb # Important Meeting REM 22 Sat SATISFY [$Tm != 11 && $Tm != 12] MSG Important Meeting REM 15 Sat SATISFY [$Tm == 11 || $Tm == 12] MSG Important Meeting # Payday! REM 2022 Aug 19 *14 MSG Payday # Tiny sunrise, sunset, and day of year notification FSET _DayOfYear(x) x-(date(year(x),1,1) - 1) REM SPECIAL PANGO @4,-1 Rise [sunrise($U)] Set [sunset($U)] [_DayOfYear(today())] ([365+isleap(today())-_DayOfYear(today())]) # Show the phases of the moon [trigger(moondate(0))] SPECIAL MOON 0 [trigger(moondate(1))] SPECIAL MOON 1 [trigger(moondate(2))] SPECIAL MOON 2 [trigger(moondate(3))] SPECIAL MOON 3 IF $LatDeg >= 0 REM [soleq(0)] MSG Vernal Equinox REM [soleq(1)] MSG Summer Solstice REM [soleq(2)] MSG Autumnal Equinox REM [soleq(3)] MSG Winter Solstice ELSE REM [soleq(0)] MSG Autumnal Equinox REM [soleq(1)] MSG Winter Solstice REM [soleq(2)] MSG Vernal Equinox REM [soleq(3)] MSG Summer Solstice ENDIF # Regular holidays REM Sat Sun SPECIAL SHADE 245 245 245 SET SaveTrig $NumTrig SET easter EASTERDATE(YEAR(TODAY())) REM [TRIGGER(easter-46)] MSG Ash Wednesday REM [TRIGGER(easter-7)] MSG Palm Sunday REM [TRIGGER(easter-2)] MSG Good Friday REM [TRIGGER(easter)] MSG Easter Sunday REM [TRIGGER(easter+39)] MSG Ascension Day REM [TRIGGER(easter+49)] MSG Pentecost REM Jan 1 MSG New Year's Day REM Mon Jan [Week_3] MSG Martin Luther King Day REM Feb 2 MSG Ground Hog Day REM Feb 14 MSG Valentine's Day REM Mon Feb [Week_3] SCANFROM [_back(7)] SATISFY 1 OMIT [_trig()] MSG President's Day REM Mar 17 MSG St. Patrick's Day REM Sun Mar 8 MSG Daylight Saving Time REM Apr 1 MSG April Fool's Day FSET _ustax(x) (wkdaynum(x) == 1 && day(x) != 15) REM OMITFUNC _ustax Mon Tue Wed Thu 15 Apr AFTER MSG %"Income Tax Day%" REM May 5 MSG Cinco de Mayo REM Sat May [Week_1] MSG Kentucky Derby REM Sun May [Week_2] MSG Mother's Day REM Sat May [Week_3] MSG Armed Forces Day REM Mon [_last(May)] SCANFROM [_back(7)] SATISFY 1 OMIT [_trig()] MSG Memorial Day REM Jun 14 MSG Flag Day REM Jun 19 MSG Juneteenth REM Sun Jun [Week_3] MSG Father's Day REM 4 July SCANFROM [_back(7)] SATISFY 1 IF WKDAYNUM(TRIGDATE()) == Sat REM [TRIGGER(TRIGDATE())] MSG Independence day (actual) OMIT [TRIGGER(TRIGDATE()-1)] MSG Independence day (observed) ELSE IF WKDAYNUM(TRIGDATE()) == Sun REM [TRIGGER(TRIGDATE())] MSG Independence day (actual) OMIT [TRIGGER(TRIGDATE()+1)] MSG Independence day (observed) ELSE OMIT [TRIGGER(TRIGDATE())] MSG Independence day ENDIF ENDIF REM Aug Fri 1 --7 MSG Sysadmin's Day REM Sep 22 Emancipation Day REM Mon Sep [Week_1] SCANFROM [_back(7)] SATISFY 1 OMIT [_trig()] MSG Labor Day REM Mon Oct [Week_2] MSG Columbus Day REM Nov 11 MSG Veterans Day REM Sun Nov 1 MSG Daylight Saving Time ends REM Oct 30 MSG Mischief Night REM Oct 31 MSG Halloween REM Tue Nov 2 SCANFROM [_back(7)] \ SATISFY [(YEAR(TRIGDATE()) % 4) == 0] \ MSG Election Day REM Thu Nov [Week_4] SCANFROM [_back(7)] SATISFY 1 OMIT [_trig()] MSG Thanksgiving Day REM Fri Nov [Week_4+1] SCANFROM [_back(7)] SATISFY 1 OMIT [_trig()] MSG Black Friday REM Dec 24 MSG Christmas Eve REM Dec 25 MSG Christmas Day if $NumTrig > SaveTrig REM SPECIAL SHADE 240 240 220 endif # Vacation days from work; SET SaveTrig $NumTrig REM May, 29, 2023 MSG Memorial Day REM Jul, 04, 2023 MSG Independence Day REM Sep, 04, 2023 MSG Labor Day REM Nov, 23, 2023 MSG Thanksgiving REM Nov, 24, 2023 MSG Day After Thanksgiving REM Dec, 22, 2023 MSG Christmas Eve REM Dec, 25, 2023 MSG Christmas Day REM Dec, 29, 2023 MSG New Year's Eve REM Jan, 01, 2024 MSG New Year's Day REM May, 27, 2024 MSG Memorial Day REM Jul, 04, 2024 MSG Independence Day REM Sep, 02, 2024 MSG Labor Day REM Nov, 28, 2024 MSG Thanksgiving REM Nov, 29, 2024 MSG Day After Thanksgiving REM Dec, 24, 2024 MSG Christmas Eve REM Dec, 25, 2024 MSG Christmas Day REM Dec, 31, 2024 MSG New Year's Eve if $NumTrig > SaveTrig REM SPECIAL SHADE 240 240 200 endif # Family Holidays! SET SaveTrig $NumTrig REM 03 Jan MSG Amy's Birthday REM 27 Jan MSG Bob's Birthday REM 01 Feb MSG Chet's Birthday REM 07 Feb MSG Dee's Birthday REM 21 Mar MSG Earl's Anniversary REM 25 Apr MSG Fannie's Birthday REM 01 May MSG Gail's Birthday REM 23 May MSG Hugh's Birthday REM 01 Jun MSG Ingred's Birthday REM 18 Jul MSG John's Birthday REM 02 Aug MSG Kim's Birthday REM 03 Aug MSG Lou's Birthday REM 06 Sep MSG Marla's Birthday REM 14 Sep MSG Noel's Anniversary REM 03 Oct MSG Olivia's Anniversary REM 07 Oct MSG Paul's Birthday REM 14 Nov MSG Quinn's Birthday REM 01 Dec MSG Rod's Birthday REM 16 Dec MSG Scott's Birthday if $NumTrig > SaveTrig REM SPECIAL SHADE 200 240 240 endif Running this command in the home folder; remind -pp -ca12 ~/.reminders 2024/01/01 | rem2pdf -e -l -c3 -m Letter > calendar.pdf Generates this .pdf {{ :calendar.pdf |file}}. This is an awk script that creates an ics file from the output of the remind software; [[rem2ics]].