makiolaj b49a8af83d chore: clear out what the own-store branch left behind, and refresh deps
Dead weight, found by reading `lintDebug` rather than by anything breaking.

Gone with the deleted `:provider` module: its entire dependency block in the
version catalog — jems, rfc5545-datetime, Robolectric, JUnit 4, Hamcrest,
Mockito — plus the comments explaining a `provider/PROVENANCE.md` that is not
there any more. Only lib-recur survived the deletion and it is now documented
where it lives. That block was also the source of most of the catalog's
"newer version available" noise.

Gone outright: `glance-appwidget` and `glance-material3`, declared but not
referenced by a single line, so they were shipping in the APK for nothing. The
WorkManager `ListenableWorker` keep rule went with them, since Glance was what
dragged WorkManager in; the RoomDatabase keep rule stays and its comment now
says why it matters *more* than it did — Room used to arrive transitively
through that chain, and is now our own task store.

Also gone: thirteen unused resources (twelve strings and a colour), which
volunteers on Weblate were translating for nothing; a `SDK_INT < O` branch that
cannot be false at minSdk 29; and the `-v26` qualifier on the mipmap folder,
unnecessary at the same minSdk.

`DemoSeeder` is injected as a `Provider` now. Its call site is
`BuildConfig.DEBUG`-gated, i.e. compile-time dead in a release build, but
injecting the instance still constructed one on every launch of the shipped
app.

`ProviderChangeReceiver` gets one intent-filter per authority rather than two
`<data>` tags in one filter. Identical behaviour — Android takes the cross
product of every data attribute in a filter — but it no longer reads as if it
might not, which is what lint's IntentFilterUniqueDataAttributes warns about.

Dependency refresh, app-level only: KSP 2.3.11, Hilt 2.60.1, lifecycle 2.11.0,
material3 1.5.0-alpha26, JUnit 6.1.3, hilt-navigation-compose 1.4.0. That last
one moved `hiltViewModel` into `androidx.hilt.lifecycle.viewmodel.compose`, so
nine call sites follow it and the artifact it now lives in is declared rather
than inherited. The floret-kit coordinates move into the catalog, version-less,
since the composite build substitutes them.

Deliberately not touched: AGP, Gradle, Kotlin, the Compose BOM and
kotlinx-* — toolchain moves that want their own change and a
reproducible-build check, not a release cut. lib-recur stays pinned at 0.12.2
(0.16.0 removed `RecurrenceSet`).
2026-09-21 13:37:49 +02:00
2026-09-04 14:09:25 +02:00

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.

CI Android 10+ Kotlin + Compose Material 3 Expressive MIT License

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.md for status, docs/ARCHITECTURE.md for how it's built, and docs/STORAGE-AND-SYNC.md for 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.

→ Help translate Agendula

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.

S
Description
A modern Material 3 Expressive task app for Android — sibling to Calendula, over the OpenTasks provider.
Readme MIT
3.9 MiB
v1.0.0
Latest
2026-09-24 20:09:02 +00:00
Languages
Kotlin 98.3%
Python 1%
Shell 0.6%
Ruby 0.1%