An override could be moved out of its series' list. updateTask applied form.listId and form.parentId to any row, though updateInstance states the opposite rule ten lines below — and an overridden occurrence maps with isRecurring = false, so the repository routes it here and the edit screen offers its list picker. list_id = B with master_id in list A is invisible in both, since the task query skips a non-null master_id and the override query finds no master in B, while still uploading as part of A's resource. Both paths keep the master's list and parent now. DatabaseCheckpoint never ran its pragma. `query` hands back a lazy cursor and the statement is stepped on the first fill, so closing it unread made the whole class a no-op: the -wal sidecar kept growing and the .db stayed stale, which is exactly the restore case its KDoc says it narrows. And a truncated preferences_pb was a crash at every launch, in all three stores: DataStore.data throws on collection and the collectors are root coroutines in a scope with no handler. They replace a corrupt file with an empty one now — settings fall back to defaults, sync state to "never reconciled", credentials to an account asking to be signed in again, all states the app knows how to be in. StorageModeHolder needs its own guard either way, and specifically has to release the startup gate when it gives up: failing quietly without it parks every observing flow on awaitReady for ever, which is a blank app instead of a crashing one.
Agendula
A modern Material 3 Expressive task app for Android.
Keeps your tasks on your device, or on top of a tasks provider you already use.
Open standards, no account required.
Agendula is the task-list sibling to Calendula.
Where Calendula is a pure front-end over Android's CalendarContract, Agendula
keeps its own store, designed around RFC 5545's VTODO — the same tasks DAVx5
(and SmoothSync, DecSync, …) sync out of your CalDAV server. It can also read and
write a tasks provider you already have, for anyone already syncing that way.
The name rhymes with its sibling on purpose: Agendula is agenda — Latin for
“things to be done” — given Calendula's -ula ending. Calendula keeps your days;
Agendula keeps your to-dos. (A Calendula flower head is botanically a cluster of
many small florets — so the two apps are florets of one bloom.)
Where your tasks live — your choice
| Where | Sync | Needs | |
|---|---|---|---|
| On your device (default) | Agendula's own database | none yet — CalDAV sync of our own is planned | nothing. No account, no permissions, no other app |
| In a provider you already use | OpenTasks or tasks.org | whatever syncs it for you — DAVx5 and friends | that app installed, and its read/write permission |
Agendula's own store is an ordinary app database — nothing is published to other apps, so there is no authority to clash over and no permission to grant. It coexists with OpenTasks rather than replacing it: installing one never breaks the other, and if you already sync through a provider, that keeps working exactly as it did.
Recurring tasks are expanded per RFC 5545, and everything the schema does not model is round-tripped verbatim rather than dropped — so passing your tasks through Agendula does not quietly lose fields a server sent.
Your tasks are exportable as standard iCalendar .ics files at any time, because
data you can't take with you isn't really yours.
Status: backend complete, UI catching up. Storage, reads and writes, smart-list filtering, a self-scheduled reminder engine, and export are built and unit-tested. The Material 3 Expressive screens are being built on top, one at a time — the storage-mode picker and export screen are not there yet. See
docs/ROADMAP.mdfor status,docs/ARCHITECTURE.mdfor how it's built, anddocs/STORAGE-AND-SYNC.mdfor why storage works the way it does.
Sync sources (by design)
In external-provider mode Agendula works with anything that writes to that provider — DAVx5 (CalDAV), SmoothSync, CalDAV-Sync, DecSync CC, or any Android sync adapter — because it builds on the provider, not on any one sync app. Google Tasks / Microsoft To Do are out of scope by design (proprietary; they would mean owning a sync stack). Open standards — CalDAV / iCalendar / DecSync — are the lane.
Translations
Agendula ships in English so far, and would like not to. Translations are managed on a self-hosted Weblate, and partial ones are fine — an untranslated string simply falls back to English.
No coding needed: register on the Weblate server, pick (or request) a language, and translate the strings in your browser. You can also reach this link in the app from the top of Settings → App language.
License
MIT — see LICENSE.