# Recurring Task Expander

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.

## Run it

- **CLI:** `gizza tool recurring-task-expander "Pay rent due:2026-09-01 rec:+1m
Water plants rec:1w
Gym rec:mon,thu
Quarterly review due:2026-09-30 rec:+3m"`
- **Web:** https://gizza.ai/tools/recurring-task-expander/
- **Agents:** machine-readable descriptor (parameters JSON Schema) at https://gizza.ai/tools/recurring-task-expander/tool.json

## Inputs

- `tasks` — Tasks (one per line) _(field)_
- `start` — Start date (defaults to today) _(field)_
- `count` — Instances per task _(field)_
- `default_rec` — Recurrence for untagged lines (optional) _(field)_
- `skip_weekends` — Move weekend dates to Monday _(field)_
- `format` — Output format _(field)_

## Output

- Expanded tasks (text)

## Query parameters

Open the tool pre-filled and auto-run via URL:

- `tasks` — Tasks (one per line)
- `start` — Start date (defaults to today)
- `count` — Instances per task
- `default_rec` — Recurrence for untagged lines (optional)
- `skip_weekends` — Move weekend dates to Monday
- `format` — Output format

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`

---

## About this tool

`recurring-task-expander` turns lightweight recurrence tags into concrete dated task lines. Paste a todo-style list with tags such as `rec:1w`, `rec:+2m`, `rec:mon,thu` or `rec:weekdays`, choose a start date and count, and the tool emits the next real `due:YYYY-MM-DD` instances.

The syntax follows common todo.txt recurrence conventions. A plain recurrence such as `rec:1w` is completion-based: if the task is already overdue, the next series starts from the `start` date. A strict recurrence such as `rec:+1m` keeps the original due-date grid and skips past dates, which is what you usually want for rent, invoices and calendar-like obligations.

Lines without a `rec:` tag pass through unchanged unless you set `default_rec`. Priorities, projects and contexts stay in the task text; only `rec:` and the old `due:` tag are removed before the new due date is appended.

### Supported recurrence values

- `1d`, `3d`, `day`, `days` — calendar days.
- `1b`, `2b`, `businessdays` — business days, Monday through Friday.
- `1w`, `2w` — weeks.
- `1m`, `3m` — calendar months, clamped to the end of short months.
- `1y` — years, including leap-day clamping.
- `mon`, `mon,thu`, `weekdays`, `weekends`, `daily` — weekday patterns.
- Prefix interval values with `+` to keep the fixed due-date schedule, for example `rec:+1m`.

### Limits and edge cases

- Maximum 200 task lines per run.
- `count` is capped at 100 instances per recurring task.
- Dates are date-only UTC-style `YYYY-MM-DD`; times and time zones are intentionally out of scope.
- Month and year recurrences clamp to the target month's last day (`2026-01-31 rec:+1m` yields `2026-02-28`).
- Weekend shifting affects interval recurrences; explicit weekday patterns already choose exact weekdays and are not shifted.

## FAQ

<details>
<summary>What is the difference between `rec:1w` and `rec:+1w`?</summary>

`rec:1w` is completion-based. If the task is overdue, the next generated occurrence starts from the `start` date. `rec:+1w` is strict: it keeps the original `due:` date grid and skips occurrences before `start`. Use strict recurrence for bills and deadlines that should stay on a fixed calendar rhythm.

</details>

<details>
<summary>Can I generate Monday/Thursday tasks without writing dates myself?</summary>

Yes. Use a weekday pattern such as `rec:mon,thu`. From the chosen start date, the tool walks forward and emits each matching weekday. It also accepts aliases such as `weekdays`, `weekends` and `daily`.

</details>

<details>
<summary>Does this update my task manager automatically?</summary>

No. It is a deterministic expander and exporter. Copy the text or Markdown output back into your task list, or use JSON/CSV output in an automation. It does not store tasks, mark anything complete or send reminders.

</details>

<details>
<summary>What happens to projects, contexts and priorities?</summary>

They are preserved as ordinary text. For example `(A) Pay rent +home @bank due:2026-09-01 rec:+1m` becomes `(A) Pay rent +home @bank due:2026-09-01`, then the next due dates are appended for later instances.

</details>

## Related tools

- [Extract Action Items from Meeting Notes](https://gizza.ai/tools/action-item-extractor/): Extract action items, owners, and decisions from meeting notes or daily notes with deterministic rules. Markdown checklist or JSON, private in-browser.
- [Add Line Numbers](https://gizza.ai/tools/add-line-numbers/): Add line numbers to every line of text online, like nl or cat -n — custom start, step, separator, and alignment. Free and private, runs in your browser.
- [ANSI Log Renderer](https://gizza.ai/tools/ansi-log-renderer/): Paste ANSI-colored terminal output or CI logs and render them as HTML, or strip escape codes to plain text. Handles 16-color, 256-color, and truecolor SGR codes.
- [API response diff](https://gizza.ai/tools/api-response-diff/): Compare two JSON API responses and see only the meaningful changes: ignore request ids, timestamps and UUIDs, match arrays by key or as sets, export a JSON Patch.
- [Rust AST Diff](https://gizza.ai/tools/ast-diff/): Compare two Rust source snippets structurally. The tool parses both files, canonicalizes their ASTs, and ignores formatting, whitespace, and comments.
