Add a CalDAV tasks integration and an optional Radicale service #9

Merged
jacensekai merged 1 commit from caldav-tasks into master 2026-10-14 18:56:10 -04:00
Owner

Tasks.org on Android has no server API; its data leaves the phone only
through a sync backend, and CalDAV is the one that keeps subtasks, tags,
priorities, recurrence and reminders. This adds a bundled tasks
integration that talks CalDAV, and an optional Radicale service (compose
profile tasks) for the phone and Lumina to sync with.

The integration finds, adds, edits, completes and deletes tasks and
creates lists, and puts overdue and due-today tasks in the prompt.
Edits round-trip the iCalendar object, so properties it doesn't touch
(Tasks.org's sort order, collapsed state, snoozes) survive. Writes use
ETags; if the phone saved in between, it rereads and reapplies the
change instead of overwriting it.

Tasks.org only rolls a repeating task forward for completions made on
the phone; a completion synced from another client just completes it.
tasks_complete therefore moves DUE, DTSTART and absolute alarms to the
next occurrence itself (rrule.ts), in the task's wall-clock zone so
times hold across DST, and counts COUNT down as the app does.

Radicale is built from pip with a baked config, runs read-only without
capabilities, refuses to start without RADICALE_PASSWORD and keeps only
a hash of it on tmpfs. It checks that hash on every request, so login
caching is on (the tool tests went from 27s to 1.4s). The integration
reads RADICALE_PASSWORD at call time rather than as a config default,
since defaults are sent to the UI unmasked.

Tests cover iCalendar round-trips, recurrence and multistatus parsing,
and run the tools against a real CalDAV server when LUMINA_TEST_CALDAV
is set; CI starts Radicale for them and builds the image, and the
compose smoke test reads a created task back from Radicale's published
port. The docs example integration is renamed from tasks to tracker
so copying it can't shadow the bundled one.

Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com

Tasks.org on Android has no server API; its data leaves the phone only through a sync backend, and CalDAV is the one that keeps subtasks, tags, priorities, recurrence and reminders. This adds a bundled `tasks` integration that talks CalDAV, and an optional Radicale service (compose profile `tasks`) for the phone and Lumina to sync with. The integration finds, adds, edits, completes and deletes tasks and creates lists, and puts overdue and due-today tasks in the prompt. Edits round-trip the iCalendar object, so properties it doesn't touch (Tasks.org's sort order, collapsed state, snoozes) survive. Writes use ETags; if the phone saved in between, it rereads and reapplies the change instead of overwriting it. Tasks.org only rolls a repeating task forward for completions made on the phone; a completion synced from another client just completes it. tasks_complete therefore moves DUE, DTSTART and absolute alarms to the next occurrence itself (rrule.ts), in the task's wall-clock zone so times hold across DST, and counts COUNT down as the app does. Radicale is built from pip with a baked config, runs read-only without capabilities, refuses to start without RADICALE_PASSWORD and keeps only a hash of it on tmpfs. It checks that hash on every request, so login caching is on (the tool tests went from 27s to 1.4s). The integration reads RADICALE_PASSWORD at call time rather than as a config default, since defaults are sent to the UI unmasked. Tests cover iCalendar round-trips, recurrence and multistatus parsing, and run the tools against a real CalDAV server when LUMINA_TEST_CALDAV is set; CI starts Radicale for them and builds the image, and the compose smoke test reads a created task back from Radicale's published port. The docs example integration is renamed from `tasks` to `tracker` so copying it can't shadow the bundled one. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Add a CalDAV tasks integration and an optional Radicale service
Some checks failed
CI / Typecheck, build and test (pull_request) Failing after 12s
CI / End-to-end (Playwright) (pull_request) Successful in 1m0s
CI / Docker images and sandbox (pull_request) Failing after 11s
CI / Compose stack smoke test (pull_request) Failing after 6s
6d59005b58
Tasks.org on Android has no server API; its data leaves the phone only
through a sync backend, and CalDAV is the one that keeps subtasks, tags,
priorities, recurrence and reminders. This adds a bundled `tasks`
integration that talks CalDAV, and an optional Radicale service (compose
profile `tasks`) for the phone and Lumina to sync with.

The integration finds, adds, edits, completes and deletes tasks and
creates lists, and puts overdue and due-today tasks in the prompt.
Edits round-trip the iCalendar object, so properties it doesn't touch
(Tasks.org's sort order, collapsed state, snoozes) survive. Writes use
ETags; if the phone saved in between, it rereads and reapplies the
change instead of overwriting it.

Tasks.org only rolls a repeating task forward for completions made on
the phone; a completion synced from another client just completes it.
tasks_complete therefore moves DUE, DTSTART and absolute alarms to the
next occurrence itself (rrule.ts), in the task's wall-clock zone so
times hold across DST, and counts COUNT down as the app does.

Radicale is built from pip with a baked config, runs read-only without
capabilities, refuses to start without RADICALE_PASSWORD and keeps only
a hash of it on tmpfs. It checks that hash on every request, so login
caching is on (the tool tests went from 27s to 1.4s). The integration
reads RADICALE_PASSWORD at call time rather than as a config default,
since defaults are sent to the UI unmasked.

Tests cover iCalendar round-trips, recurrence and multistatus parsing,
and run the tools against a real CalDAV server when LUMINA_TEST_CALDAV
is set; CI starts Radicale for them and builds the image, and the
compose smoke test reads a created task back from Radicale's published
port. The docs example integration is renamed from `tasks` to `tracker`
so copying it can't shadow the bundled one.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
jacensekai/lumina!9
No description provided.