Planning
The rule planner that always answers, the chain of optional AI providers in front of it, and how a ranked plan becomes a schedule around your calendar.
Tasker plans the day you have, not the list you wish you could finish. Planning is three layers: a deterministic planner that always answers, a router that can ask an AI provider first, and a time blocker that fits the result around your calendar.
What counts as available
Planning only considers tasks you can actually start. availableNow returns open tasks that are not deferred to a later date and not blocked by an unfinished dependency. Filters narrow it further by energy, kind, context or a maximum duration, which is how “I have 20 minutes, what can I do?” works. availableHere adds location: tasks pinned to a place near you.
The rule planner
DayPlanner is pure, deterministic and has no dependencies, so it is the floor everything else falls back to. It sorts the available tasks by:
- Overdue first.
- Higher priority.
- Earlier due date; tasks with no due date go last.
- A match with your preferred energy (quick, focused or deep work), if you set one.
- Then the order the tasks were created.
It then packs tasks greedily into your time budget using each task’s estimate (30 minutes when a task has none). Anything that does not fit is reported as overflow instead of being silently dropped, so the plan tells you when you are overcommitting.
Every slot carries a one-line reason that mirrors the signal that placed it: “Overdue”, “Critical priority”, “High priority”, “Due today”, “Due soon”, “Matches your focused energy” or “Fits your day”.
let plan = try await store.planDay(budgetMinutes: 180, preferredEnergy: .focused)
plan.scheduled // ordered slots with minutes and a reason
plan.overflowIDs // what didn't fit
plan.remainingMinutes // budget left over
When no budget is given, the planner uses the free minutes in a calendar interval if one is supplied, otherwise a default eight-hour day.
The provider chain
An AI model can rank tasks with more nuance than fixed rules, but it can also be missing, offline or wrong. PlanRouter handles that:
- It tries each
DayPlanProviderin order. The first one that returns a usable ranking wins. - If every provider is unavailable or fails, the rule planner answers. A plan is always produced.
- The router enforces the budget itself. Even if a model picks too much, the router packs the model’s order until the time runs out and overflows the rest, so a model cannot blow your day.
- Any available task the model did not mention lands in overflow, never in a black hole.
In the app, the chain is built from your Intelligence settings, in this order:
| Order | Provider | Where it runs |
|---|---|---|
| 1 | A paired device | Another of your devices on the same Wi-Fi, such as a Mac with Apple Intelligence |
| 2 | Apple Intelligence | On this device, through the Foundation Models framework |
| 3 | A local AI server | Ollama, LM Studio or llama.cpp on your network; no key |
| 4 | A cloud model with your key | OpenAI, OpenRouter, Groq, Together AI, Mistral, DeepSeek or any OpenAI-compatible endpoint |
| Floor | The built-in planner | Always available, fully offline |
A provider that cannot serve a request (no Apple Intelligence on this device, no paired device online, no key) steps aside, and the next one is asked.
What a provider sees
Providers never receive your tasks. They receive a PlanContext, a projection of each candidate down to what ranking needs:
{
"budgetMinutes": 180,
"preferredEnergy": "focused",
"candidates": [
{ "id": "…", "title": "Draft Q3 report", "estimateMinutes": 90,
"energy": "deep", "dueAt": "…", "priorityRank": 2, "isOverdue": false }
]
}
Notes, contexts, attachments and other free text are not part of the type, so they cannot leave the device even if a cloud provider is switched on. A paired device gets the same projection: a few kilobytes out, an ordering back.
Time blocking around your calendar
A ranked list is a shortlist. With calendar access, Tasker can turn it into a schedule:
- Read the busy events in the interval you want to plan, such as the rest of today.
- Compute the free windows between them, and use the total free minutes as the budget.
- Rank the available tasks with the planner.
TimeBlockerwalks the ranked slots in order and gives each one a start time in the first free window it fits.
A task that does not fit any remaining window keeps its place in the plan but gets no start time, so nothing disappears. PlanStyle.auto picks a schedule when calendar access is available and a shortlist when it is not.
Calendar sync is two-way. Dated tasks appear on your calendar, and moving an event moves the task.
Reviews and replanning
- Daily review: overdue tasks, what is due today, tasks whose defer date has just passed, and what is available now.
- Weekly review: stale tasks, projects with no next action, things you are waiting on, and projects that are behind.
- Bulk replanning: reschedule or defer a batch at once, or move everything overdue to today.