Since I cannot keep everything I have to remember in my head, I need a reminder system. While I would prefer an analog system (ideally one that integrates with my system for keeping track of tasks), I have not found a satisfying analog solution so far.
I am not looking for a full-fledged calendar system. If I were, I would be
using Remind or
calendar. But they
offer way more features than I need.
I basically have two requirements for my reminder system:
It has to remind me reliably by e-mail about things a certain time in advance.
It has to be simple and have as few external dependencies as possible.
The solution I have come up with is almost too trivial to share: It employs
at to schedule reminders, which are sent
as e-mails via a remote SMTP server when they are due.
The system depends on the following ingredients:
smtpd – for relaying e-mails
to a remote SMTP server.
cron – for scheduling recurring reminders (like
at – for scheduling nonrecurring reminders (like
one-time events, or events which recur in irregular intervals).
On OpenBSD, all the required software is part of the base system; see smtpd(8), cron(8), at(1), mail(1).
at basically take two kinds of data
as input: A timestamp which specifies when something is to be done,
and an action which specifies what is to be done at the specified
Regardless of whether a reminder is recurring or nonrecurring, I want an
e-mail to be sent to me at the specified time. Therefore, the action in
both cases is sending an e-mail to me reminding me of the given event.
Since the e-mail needs to be sent non-interactively when the given time is
In order not to have to specify the non-changing details (like the e-mail
address) for sending the mail each time, I employ a small script called mailrem which is basically a wrapper around
Finally, in order for
smtpd needs to be configured such that it relays outgoing mail to a
E-mail reminders are sent by calling
mailrem with the specific
reminder text as its argument, e.g.
$ mailrem "Prepare tax statement"
In order to schedule reminders for a specific time,
not invoked directly as above, but either by
cron or by
at, depending on whether the reminder is to be sent on a
regular basis or just once.
Recurring reminders are scheduled by
cron via corresponding crontab entries.
Start editing the crontab file:
$ crontab -e
Then add an entry for each recurring reminder like this:
0 0 3 18 * $HOME/bin/mailrem "[Reminder] Paul's $(( $(/bin/date +\%Y) - 1976 )). birthday (1976)"
This entry would send an e-mail each year at midnight on March 18 with
subject “[Reminder] Paul's n. birthday (1976)”, where
n is calculated each time the cron entry is triggered by subtracting
Paul's year of birth, 1976, from the current year obtained by the
Nonrecurring reminders are scheduled by
at via corresponding
atjobs. For instance, to schedule an atjob for midnight in three days:
$ at midnight + 3 days
When prompted, enter the action to be executed at the specified time like this:
> mailrem "[Reminder] Doctor's appointment at 9 am"
Then, press Ctrl+D to queue the atjob.
That's it. A very simple system which does its job and is easy to setup and maintain.
crontab -lcould be used. Similarly,
atqdisplays the queue of atjobs. However, the output of
atqis pretty much unparseable (at least in the version which ships with OpenBSD).
crondaemon is not running at the time a reminder is due, it will not be sent and will subsequently be lost forever.
Man page of the OpenBSD version: calendar(1).
In principle, of course, it is also possible to run the system on a laptop. The severe drawback would be that reminders were lost if the laptop were not running at the scheduled time of a reminder. One could use tools like anacron instead of cron. This would mitigate the risk of losing reminders, but the time they are sent would then depend on when the laptop is running (which may differ greatly from the intended time of sending).
Man page of the OpenBSD version: date(1).