Is it possible to have tiddlers behave as repeating reminders?

I wonder if it’s possible to create a tiddler to note someone’s birthday and to have this serve as a reminder that would repeat yearly. As I understand it the Projectify plugin shows upcoming tasks but doesn’t have a repeat function.

It does allow you to do this but you may need to make use of a plugin, design your own or get a solution from one of us.

Also it could just appear in a calendar see tiddlytools and search for “time”.

2 Likes

Even GitHub - tiddly-gittly/tiddlywiki-calendar: Widget and Page Layout displaying tiddlers on calendar and agenda, based on created, modified, startDate and endDate fields. uses TiddlyTools’s Time helpers for reminder, so just use it.

4 Likes

I have my journal TiddlyWiki do this.

My setup is likely not the smartest way to do it.

In the GettingStarted Default Tiddlers section I have this entry.

[contains:Anniversary<now 0MM0DD$>]

I have a tiddler for each day of the year with an Anniversary tag and field.
The field has the month, day and $ on it. (eg todays is Anniversary: 0824$)

From here you can either put your entry directly into the body of the tiddler or if it is getting information from other tidders you can set up a list filter.

My journal entries each have a dates field arranged in yyyymmdd format. They have otd tags for important events and an eventdetails field to summarise the event.

Each of my Anniversary tiddlers calls an a template in the main body.

{{||Anniversary-Template}}

That template contains the following filter.

<$list filter="[tag[otd]search:day:regexp{!!Anniversary}!sort[day]]"> <$link to={{!!title}}><$let dispyear={{{ [{!!day}split[]first[4]join[]] }}}><></$let></$link>
<$view field=“eventdetails”/>

</$list>

I couldn’t have done any of this without this forum and Grok

2 Likes

That’s a very interesting and ingenious solution.

Thank you for the link. Now tiddlytools is another website that I added to my ever-expanding list of bookmarks!

I suppose How to do this depends on how you want to see it. If you write a daily journal place it there, or on a home tiddler you see when the wiki is loaded. Or do you want alerts?, perhaps you want to list all anaversaries in the next two weeks or in this month?

This will determin what tools you ultimatly use.

For example you could stam any tiddler with an anaversary with a first anaversary date anaversary-date=YYYY0MM0DD0hh0mm0ss0XXX

Then on each day look for all tiddlers with an anaversarty-date field, sort and for those see if their day/month matches today. you could show the last 5 and next five to be safe.

I’m looking for this partly. Say, there’s a wedding anniversary on 30th August 2023. I would like to see that tiddler on that date (or better still a few days before that date!), that is be remined of it, but also be reminded on the next anniversary which will be in a year’s time without having to change the date every time. This may not be so critical for annual anniversaries, because I would only have to amend it once a year, but I’m looking to implement it for more frequent events too that could be monthly or fortnightly.

EDIT: Away from the keyboard for a few minutes and I had an idea for a semi-automatic solution. Maybe what I would need is a button that would update the relevant field by a year, month, fortnight, x number of days, as the case may be. However, I’m nowhere near knowing how to do that. :slight_smile:

I’ve just updated https://tiddlytools.com/#TiddlyTools%2FTime%2FAlarms to support definition of “yearly” alarms (i.e., specify a month and day, without a year). As with other alarm types (once, daily, monthly, day of the week), you can either specify a “trigger time” or leave the time inputs blank to define an alarm that triggers upon startup.

Note that to use TiddlyTools/Time/Alarms you will also need to install https://tiddlytools.com/#TiddlyTools%2FTime%2FTicker (a StartupAction tiddler), and https://tiddlytools.com/#TiddlyTools%2FTime%2Faction-timeout.js (a custom javascript widget).

I’ve also updated https://tiddlytools.com/#TiddlyTools%2FTime%2FCalendar so that yearly alarms will appear on the Calendar display (assuming you’ve left the “alarms” checkbox Calendar setting enabled).

See https://tiddlytools.com/#TiddlyTools%2FTime%2FInfo for full documentation of my entire set of time-related add-ons.

enjoy,
-e

6 Likes

A little different approach using a Daily reminder as an example. The technique lets you check items that are due after some interval is past. The checkbox will appear unchecked after the interval has past.

Using a viewtemplate, add a checkbox to tiddlers tagged Daily.

Clicking the checkbox updates a field named last-done, and uses the days filter operator to determine its state. The checkbox tiddler will be unchecked once the days count has advanced past the value used in the days filter.

Hope I made some sense. See https://amreus.tiddlyhost.com/ for basic example.

A long time ago, I wrote this tickler plugin. It is a bit primitive but it might suit your needs or give you more ideas.

It helps you track repeating tasks at the day-of-week, day-of-month and day-of-year level.

To do something similar I set the anniversary date once to the date of birth or wedding day etc… It is my lists that display them. If I want to, I can add a touch date now stamp that will indicate I noted or actioned it. If the last touch date was this year. By keeping the original anniversary date I can calculate which anniversary it is.

  • it will still appear next year if I dont touch it.

Its quite simple to take the original anniversary date and in a variable replace the YYYY with the year now, then you can use the days operator to test how many days in the past or future this years anniversary is.

The advantage of the days operator is the number of days are relative to the given date and handles month and year changes.

The above is about a detailed efficent algorithm however looking at a calendar view be can just as effective. Now with @EricShulman’s update that may be the easiest approach.

To be clear, TiddlyTools Calendar has always been able to display events just by creating a single tiddler, tagged with “events”, containing a list of items, one per line.

For one-time events, specify the full date, followed by descriptive text, separated by a semi-colon, like this:

YYYYMMDD;event text

For annual repeating events, use the same format, but replace the “YYYY” with dots, like this:

....MMDD;event text

You can also have as many “event” tiddlers as you like, so you can easily separate lists for selective inclusion in the Calendar display.

For examples, see
https://tiddlytools.com/#TiddlyTools%2FTime%2FEvents
and
https://tiddlytools.com/#PersonalEvents

2 Likes

Thank you. I like the concept, but I’m afraid I don’t understand how it actually works. It’s not your fault, it’s because of my inadequate current level of knowledge.

I think that TiddlyTools is closest to what I’m looking for as an answer. The only minor limitation for me is that the repetition cycles are specific (daily, monthly, yearly). I was looking at the possibility of using it for different odd repeating dates, for example every six weeks, fortnightly, or even weekly. If it had an option to repeat something every x number of days where x would be input by the user, then it would be even more flexible.

As a workaround I could create these “odd” dates in the right format using a spreadsheet and copy paste them in the Events tiddler. On the downside I would have to update the Events tiddler regularly in order to input future dates.

You could use a filter that check if the number of days since the day the reminder tiddler was created is a multiple of the time span you want, and if it is, display a checkbox in a tiddler called “repeating reminders” or anywhere else.

Something like this:

\define days_ago() [{!!created}format:date[TIMESTAMP]subtract<now TIMESTAMP>divide[86400000]floor[]add[1]multiply[-1]]


* task name: <$edit field="task-name"/>
* starting date: <$edit type="date" field="task-date"/>
* repeat each <$edit type="number" field="task-repeat"/> day(s)

<$button>
<$action-createtiddler $basetitle={{!!task-name}} created={{{ [{!!task-date}split[-]] 000000000 +[join[]] }}} remind_after_days={{!!task-repeat}}/>
<$action-setmultiplefields $fields="[{!!title}fields[]prefix[task-]]"/>
create repeating task
</$button>

;All repeating tasks

<ul>
<$list filter="[has[remind_after_days]]">
<li>
{{||$:/core/ui/Buttons/delete}} Started <$text text={{{ [subfilter<days_ago>] }}}/> days ago: <$link/>, repeat every <$edit-text type="number" field="remind_after_days"/> day(s)
</li>
</$list>
</ul>

;Tasks for today

;Todo
<ul>
<$list filter="
[has[remind_after_days]]
:filter[subfilter<days_ago>remainder{!!remind_after_days}match[0]]
:filter[getindex<now YYYY0MM0DD>else[]!match[done]]
">
<li><$checkbox index=<<now YYYY0MM0DD>> checked="done"/> <$link/></li>
</$list>
</ul>

;Done
<ul>
<$list filter="
[has[remind_after_days]]
:filter[subfilter<days_ago>remainder{!!remind_after_days}match[0]]
:filter[getindex<now YYYY0MM0DD>else[]match[done]]
">
<li><$checkbox index=<<now YYYY0MM0DD>> checked="done"/> <$link/></li>
</$list>
</ul>

Demo: repeating tasks

But this will get complex if you want to take into account the length of the month…

1 Like

One special feature of TiddlyTools Calendar “events” tiddlers is that they can contain wikitext scripting that will be automatically “wikified” to generate a list of events!

This means that you won’t need to “create these “odd” dates in the right format using a spreadsheet and copy paste them in the Events tiddler”

For example, if you want to define a whole bunch of event dates that will occur every 42 days (i.e., 6 weeks) starting on Sept 1, 2023 and going through December 31, 2024, you could create a tiddler (e.g., “MyEvents”), tagged with events, containing the following wikitext scripting:

\define first() 20230901
\define last()  20241231
\define days()  42
\define fmt()   [UTC]YYYY0MM0DD
<$let start={{{ [<first>format:date[TIMESTAMP]] }}}
        end={{{ [<last>format:date[TIMESTAMP]] }}}
       step={{{ [<days>multiply[86400000]] }}}>
<$list filter="[range<start>,<end>,<step>]" counter="item" variable="thisdate">
   {{{ [<thisdate>format:timestamp<fmt>] }}};repeating event #<<item>><br>
</$list>

Notes:

  • For convenience, we can use \define pragmas to set the first and last dates as well as the number of days between events. We also define a date formatting template, “[UTC]YYYY0MM0DD” to use when formatting the event date output. Note that the [UTC] prefix in needed in the format to avoid timezone shifting in the results.

  • Next, we convert the first, last and days values to “unix epoch” timestamps (number of milliseconds since Jan 1, 1970) so we can use a $list widget with the range<start>,<end>,<step> filter operator to generate successive timestamps. Note that by using unix epoch timestamps, we can avoid having to account for days-per-month or leap years. The conversion to/from unix epoch timestamps automatically factors in the days-per-month and leap year issues for us!

  • Then, within the $list widget content, we convert the generated timestamps into YYYY0MM0DD formatted date strings and output the individual event entries. Note also how the counter="item" parameter is used to automatically number the event entry descriptions.

The result of this wikitext script is output like this:

20230901;repeating event #1
20231013;repeating event #2
20231124;repeating event #3
20240105;repeating event #4
20240216;repeating event #5
20240329;repeating event #6
20240510;repeating event #7
20240621;repeating event #8
20240802;repeating event #9
20240913;repeating event #10
20241025;repeating event #11
20241206;repeating event #12

which the TiddlyTools Calendar code can then process to show the generated events in the Calendar display.

enjoy,
-e

Thank you. What a fantastic solution! At first I had a problem in that I didn’t see the entries in the Calendar. I then realized that I had to enable it in Calendar settings.

By default, newly created event list tiddlers are not automatically activated. To select your new event list, open the Calendar Settings (the gear icon) and click the checkbox next to your event list in the “Events and Timelines” section.

-e

Sorry, I edited my posting, but you already replied. :blush: