Only proactive notification was the once-a-day 6-7AM digest. Wires up
the previously-unused User.default_reminder_minutes profile setting
and ScheduledReminder model (Gitea #8) to send timely per-task alerts:
- Task.reschedule_reminders(), hooked into Task.save() via a dirty-check
against due_date/due_time/reminder_at/status/is_deleted, (re)creates up
to 3 ScheduledReminder rows per active due task: a "before due" reminder
(from reminder_at if set, else default_reminder_minutes before due), a
"due now" notification, and an "overdue" notification (mirroring
is_overdue's day-after rule for date-only due tasks). Hooking into
save() means every call site - web views, the API, and sync - picks
this up automatically.
- New Celery task send_scheduled_reminders (beat schedule: every 5 min)
sends due reminders via whichever of email/push the user has enabled,
reusing the existing per-user channel toggles, and logs them to the
Notification table.
- 14 new tests covering the scheduling math, due-date-change/completion/
deletion cleanup, and the sending task's channel and timing behavior.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Features:
- Django-based REST API with web interface
- Task management with tags, priorities, and due dates
- Time tracking with start/stop timers
- Subtasks support
- Task filtering (all, today, upcoming, overdue, completed)
- Tag-based organization with color coding
- Sorting by due date and priority
- Auto-assign tags when filtering
- Responsive 3-pane layout (sidebar, task list, detail panel)
- Task sharing between users
- Mobile-responsive design with dark mode support
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>