{
  "slug": "recurring-task-expander",
  "name": "gizza-ai/recurring-task-expander",
  "version": "0.1.0",
  "title": "Recurring Task Expander — Turn rec:1w Rules into Dated Tasks — gizza.ai",
  "description": "Expand recurring task rules (rec:1w, rec:+2m, mon,thu, weekdays) into the next dated instances. Paste a todo list, get real due dates. Free and in-browser.",
  "tags": [
    "recurring task expander",
    "rec tag todo.txt",
    "recurrence rule generator",
    "repeating tasks",
    "next due dates",
    "todo.txt recurrence",
    "weekly monthly task schedule",
    "task scheduler",
    "expand repeating todo"
  ],
  "category": "text",
  "urls": {
    "page": "https://gizza.ai/tools/recurring-task-expander/",
    "markdown": "https://gizza.ai/tools/recurring-task-expander/index.md",
    "descriptor": "https://gizza.ai/tools/recurring-task-expander/tool.json",
    "deep_link_example": "https://gizza.ai/tools/recurring-task-expander/?tasks=Pay%20rent%20due%3A2026-09-01%20rec%3A%2B1m%0AWater%20plants%20rec%3A1w%0AGym%20rec%3Amon%2Cthu%0AQuarterly%20review%20due%3A2026-09-30%20rec%3A%2B3m&start=2026-08-08&count=5&default_rec=1w&skip_weekends=true&format=text"
  },
  "cli": "gizza tool recurring-task-expander \"Pay rent due:2026-09-01 rec:+1m\nWater plants rec:1w\nGym rec:mon,thu\nQuarterly review due:2026-09-30 rec:+3m\"",
  "tool": {
    "description": "Expand recurrence rules on a task list into the next N concrete dated instances. Pass the list as 'tasks', one task per line: a task repeats when it carries a 'rec:<value>' tag and can anchor its schedule with 'due:YYYY-MM-DD' (todo.txt style). Recurrence values are a number plus d (days), b (business days), w (weeks), m (months) or y (years) — 1d, 3w, +2m — or weekday patterns such as mon, mon,thu, weekdays, weekends. A leading '+' means strict/due-date recurrence: the original grid is kept and past occurrences are simply skipped. A plain value is completion-based: an overdue task restarts from the start date. Month and year steps clamp to the end of short months (Jan 31 + 1m = Feb 28). Set 'start' (YYYY-MM-DD, default today) to expand from another date, 'count' for how many instances per task (1-100, default 5), 'default_rec' to apply a recurrence to untagged lines, and 'skip_weekends' to push Saturday/Sunday instances to the Monday. Output 'format' is text (pasteable todo.txt lines), markdown, json or csv. Use this to turn 'Pay rent rec:+1m' into a real dated schedule, plan a quarter of chores, or check when a repeating task actually lands.",
    "parameters": {
      "additionalProperties": false,
      "properties": {
        "count": {
          "description": "How many dated instances to generate per recurring task (1-100, default 5).",
          "maximum": 100,
          "minimum": 1,
          "type": "integer"
        },
        "default_rec": {
          "description": "Recurrence applied to task lines that have no 'rec:' tag, using the same syntax as the tag (e.g. '1w', '+2m', 'mon,thu'). Leave blank to pass untagged lines through unchanged.",
          "type": "string"
        },
        "format": {
          "default": "text",
          "description": "Output format. 'text' (default) is one plain task line per instance ('<task> due:YYYY-MM-DD'), ready to paste back into a todo.txt file. 'markdown' is a '- [ ] <task> — due YYYY-MM-DD (Tue)' checklist. 'json' is an object with the start date and one entry per task ({ line, description, recurrence, strict, due, instances[{ date, weekday, line }] }). 'csv' has the header task,recurrence,instance,date,weekday.",
          "enum": [
            "text",
            "markdown",
            "json",
            "csv"
          ],
          "type": "string"
        },
        "skip_weekends": {
          "default": false,
          "description": "When true, an instance that lands on a Saturday or Sunday moves to the following Monday (two shifted occurrences that collapse onto the same Monday are emitted once). Default false. Explicit weekday patterns (rec:mon,thu) are never shifted.",
          "type": "boolean"
        },
        "start": {
          "description": "The base date the expansion starts from, as YYYY-MM-DD (e.g. 2026-08-08). No instance before this date is emitted. Defaults to today (UTC).",
          "type": "string"
        },
        "tasks": {
          "description": "The task list to expand, one task per line. A task repeats when it carries a 'rec:<value>' tag and may set its anchor with 'due:YYYY-MM-DD' (todo.txt style), e.g. 'Pay rent due:2026-09-01 rec:+1m'. Recurrence values are a number plus a unit — d (days), b (business days, Mon-Fri), w (weeks), m (months), y (years) — such as 1d, 3w, 2m; a leading '+' (rec:+1m) keeps the fixed due-date schedule, while a plain value is completion-based and restarts from the start date when the task is overdue. Weekday patterns are also accepted: rec:mon, rec:mon,thu, rec:weekdays, rec:weekends. Leading list markers ('- ', '- [ ] ', '1. ') are stripped; priorities, +projects and @contexts are preserved; blank lines and lines starting with '#' are ignored. Lines without a recurrence pass through unchanged. Maximum 200 lines.",
          "type": "string"
        }
      },
      "required": [
        "tasks"
      ],
      "type": "object"
    }
  }
}