6817d3e24aac4585ee0600e1553a099aef423c98
Recurring tasks only ever showed on their single dueDate. Add a recurrence engine that expands occurrences per-date with independent per-occurrence completion. - TaskItem: recurrenceEnd + completedOccurrences (optional, safe decode). - TaskViewModel: isOccurrence/occurrenceComplete/toggleOccurrence/ occurrenceCopy/nextOccurrence/occurrences(on:); Daily/Weekly/Monthly/ Yearly/Every-Weekday; respects recurrenceEnd; works across years. - toggle() routes recurring rows to per-occurrence completion. - Date filters re-inject per-date occurrence copies; recurring excluded from overdue. Calendar dots + day detail use occurrences(on:). Also log KC-11 (year display) + KC-12. Pending: "repeat until" date UI (engine already honors recurrenceEnd). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Description
Personal productivity and fitness companion — iOS SwiftUI app
Languages
Swift
99.3%
HTML
0.4%
Shell
0.3%