Adds tags, stored as the standard `CATEGORIES` property so they stay compatible with Nextcloud Tasks, tasks.org and DAVx⁵. ## What changed - **Storage and sync:** tags are a new `categories` column (database v2). The migration lifts `CATEGORIES` out of the stored unknown properties for tasks that were synced before, so existing tags show up without a re-download. A line Agendula can't write back exactly as it came (e.g. a duplicated value, or the property split across several lines) stays where it was and still syncs byte for byte. - **Provider mode (OpenTasks / tasks.org):** tags are read and written as the provider's category properties. Writes are a single batch, so a refused tag can't leave half the tags behind or create a task twice. - **Imports:** the copy from OpenTasks/tasks.org and the legacy one-shot import both bring tags across. - **Editor:** a new optional Tags field. Type a tag and press Done or type a comma; tags already in use are suggested while typing, and text left in the field is still saved. - **Display:** tags show as pills on the detail screen and in each row's info line in task lists. - **Using tags:** the home screen has a Tags section listing every tag on an open task with its count. Tapping one opens that tag's tasks across all lists, and "New task" there starts with the tag set. Every task list's sort button is now a "Sort and filter" picker, where you can tick one or more tags to narrow the list. ## Also in here - **Keyboard:** a focused input now scrolls fully above the keyboard, not just its text line. This uses floret-kit's new `revealOnFocus` (jlmakiola/floret-kit#12), and the pointer moves to floret-kit main. - **Edit screen:** once the title scrolls out of view, it shows in the top bar. - **main merged in:** the branch brings main's #40 and #44 (floret-kit on its shared main, Gradle 9.8), which `release/v1.1.0` doesn't have yet. ## Where this differs from the issue - **Filtering by several tags** shows tasks that carry *all* of them, since ticking more tags is meant to narrow the list. - **Tags are case-sensitive:** "Work" and "work" are two tags, matching how they are stored and synced. - **The overview** lists tags on open tasks only, the same set the editor suggests. - **Widgets** can't be set to a tag yet. Closes #35 Co-authored-by: Jean-Luc Makiola <business@jeanlucmakiola.de> Reviewed-on: https://codeberg.org/jlmakiola/agendula/pulls/46
Agendula
A modern Material 3 Expressive task app for Android.
Syncs over CalDAV, or keeps your tasks on the device. Open standards, no account
required.
Agendula is the task-list sibling to Calendula.
It keeps its own task store, designed around RFC 5545's VTODO, and syncs it
with any CalDAV server — Nextcloud, Radicale, Baïkal and the rest. No account is
needed to use it: without one, your tasks simply stay on the phone.
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.)
What it does
- Lists you create, colour, reorder and delete in the app, plus smart lists: Today, Upcoming, Overdue, No date, All and Completed.
- Tasks with due and start dates, all-day tasks, subtasks, priorities, progress, location and URL, and cancel/restore.
- Repeating tasks, expanded per RFC 5545. Edit or delete one occurrence, this and the following ones, or the whole series.
- Reminders that fire at the exact time: several per task, separate defaults for timed and all-day tasks (globally and per list), Done and Snooze right on the notification, and they survive reboots.
- iCalendar import and export — open an
.icsor a zip of them, or write any list out as standard.icsfiles. - A home-screen widget, launcher shortcuts, a Quick Settings tile, and "share to Agendula" to turn text from another app into a task.
- Material 3 Expressive throughout, with dynamic colour, expressive motion and shapes.
Sync
Add a CalDAV account under Settings → Accounts and choose which of its task lists to sync. Nextcloud signs in through its own login flow in the browser, so Agendula never sees your password; any other server takes an address, a user name and a password — ideally an app password, which you can revoke on its own.
Edits you make are sent within about half a minute. Changes from the server arrive on a background interval you choose (15 minutes to a day, or only when you tap sync), and every time you open the app. Several accounts can sync side by side, and lists can be created, renamed and deleted on the server from the app.
Sync uses sync-collection (RFC 6578) where the server supports it and falls
back to a full comparison where it does not. Everything the store does not model
is kept verbatim and sent back unchanged, so passing your tasks through Agendula
does not quietly lose fields another client wrote.
Where your tasks live
| Where | Sync | Needs | |
|---|---|---|---|
| In Agendula (default) | Agendula's own database | Agendula's own CalDAV sync, if you add an account | nothing — 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, so it coexists with OpenTasks rather than replacing it. If you already sync through a provider, Agendula can work on top of it exactly as before.
Switching between the two moves nothing — each store keeps its own tasks — so Settings → Storage asks before it switches, and offers to copy a provider's tasks into Agendula's own store when you want to move over. The copy is taken once and the originals stay where they are.
Google Tasks and Microsoft To Do are out of scope by design: they are proprietary, and open standards — CalDAV and iCalendar — are the lane.
Install
F-Droid repository
Every release is built, signed and published to a self-hosted F-Droid repository. Add it once and your F-Droid client handles updates from then on:
-
In your F-Droid client, open Settings → Repositories → Add (or open the link below on your phone):
https://apps.dev.jeanlucmakiola.de/dev/fdroid/repo?fingerprint=C2C0640402BF458FC0ED957AF0B37AA4C14022E72F89CE90B5965B458CF73425 -
Refresh, search for Agendula, install.
Codeberg release / Obtainium
Every release is also published on
Codeberg with the signed
APK and a .sha256 checksum attached — the same APK the F-Droid repository
serves. For automatic updates from there, use
Obtainium and
add Agendula in one tap.
Each release carries two APKs (see Offline version), so set
Filter APKs by regular expression to ^agendula_v to always get the regular
app.
Betas of upcoming versions are published there too, as pre-releases; to test
them, switch on Include prereleases for Agendula in Obtainium.
Offline version
Each Codeberg release also carries agendula-offline_v<version>.apk: Agendula
without CalDAV sync and without the network permission, so it cannot
connect to anything. It installs alongside the regular app rather than replacing
it; move tasks between the two with Settings → Storage → Export / Import. In
Obtainium, pick it with Filter APKs by regular expression set to
^agendula-offline_v.
Build from source
git clone --recurse-submodules https://codeberg.org/jlmakiola/agendula.git
cd agendula
./gradlew :app:assembleDebug
JDK 17 and the Android SDK are all it needs; see
CONTRIBUTING.md for tests and lint.
Translations
Translations are managed on a self-hosted Weblate, and partial ones are fine — an untranslated string simply falls back to English. Agendula ships in English, German and Brazilian Portuguese so far.
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.
Contributing
Issues and pull requests live on
Codeberg.
CONTRIBUTING.md covers the practical how.
Privacy
No analytics, no advertising, no tracking, no third-party SDK, and no server of the developer's. Your tasks stay on your device unless you add a CalDAV account yourself, and then they go only to the server you chose.
License
MIT — see LICENSE.






