ReKnock Recurring Tasks: Research

Short comparison of how five popular task apps handle repeating tasks, and what ReKnock should copy. Written from product knowledge, not re-verified against live apps today. Details change, so treat each cell as "what I believe", not gospel.

The three questions that matter

  1. Fixed vs after-completion. Does the next one come from the calendar ("every 28th") or from when you actually did it ("30 days after I last did it")?
  2. How do you enter it? Pickers only, or plain English ("every last Friday")?
  3. Can you skip one? Or stop the series cleanly?

Comparison

Fixed scheduleAfter completionPlain-English inputSkip oneEnd conditionLead time
TodoistYes: every 28thYes: every! 30 daysExcellent, the benchmarkNo dedicated skip; workaround is complete or rescheduleuntil, for N weeksNo
TickTickYes (default)Yes: "repeat from completion date"Good, parses it from the titleHas a skip actionEnd date or countReminder offsets only
Things 3Yes: "repeat on a schedule"Yes: "repeat after completion"Little or noneNo skip. You can delete one or stop repeatingOptional endYes: "add N days before deadline"
Google TasksYesNoNoNoDate or countNo
Apple RemindersYes, with custom N units and "last Friday" style monthlyNoVia SiriNo ("delete this and future" only)End dateNo

What they do on completion

Lessons

Recommendation

  1. One live task row per series. On completion, log a done-history snapshot and push start_date (and due_date) to the next occurrence. Same id, text, contexts, nag times, quadrant. Reuses ReKnock's existing "quiet until start_date" mechanism, so almost no new nagging logic.
  2. Store the rule as an RFC 5545 RRULE subset (FREQ, INTERVAL, BYDAY incl. ordinals like -1FR, BYMONTHDAY, BYMONTH, UNTIL, COUNT), plus ReKnock fields for mode and lead_days. Interoperable and well specified. Deviate in one place: clamp short months instead of skipping.
  3. Two modes: fixed (default) and after_completion.
  4. Always jump to the next future occurrence. Never create a backlog.
  5. Skip + stop as first-class actions (skip_occurrence tool, stop_series on done, repeat: none on update).
  6. Input: structured repeat object (canonical) and a repeat_text plain-English helper, parsed by a small deterministic grammar that echoes back its interpretation so a voice user can confirm.
  7. Lead time as lead_days, mapped to start_date = occurrence - lead_days.
  8. Do not use an LLM to parse repeat text server-side. The calling assistant already is one. Keep the server deterministic and testable.