Revert 4aa65ed's approach. It read the Forgejo 500 as being caused by target_commitish, and pushed the tag to Codeberg first so the release could attach to an existing tag without one. That inverted the actual failure: Forgejo 500s on POST /releases precisely WHEN the tag already exists, so pre-pushing it guarantees the error it was meant to avoid. The second half then can't recover — a bare tag is not a release, so GET /releases/tags 404s and the upsert has no id, which is the "Could not resolve Codeberg release id" that ended the 0.3.1 run. 0.3.0 published fine because it POSTed while the tag was still unsynced and let the API mint tag + release together. Do that deliberately instead of by luck: if no release owns the tag, delete the mirrored tag, then POST with target_commitish. Branches mirror reliably (main was already at the release commit when 0.3.1 failed), so the commit is present and only the raced-in tag was in the way. Deleting it is safe exactly because no release owns it. An existing release still takes the PATCH path and skips the delete, so re-runs never disturb something already published. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Agendula
A modern Material 3 Expressive task app for Android.
Reads, writes, and reminds — on top of an existing tasks provider, with no own
sync stack.
Agendula is the task-list sibling to Calendula.
Where Calendula is a pure front-end over Android's CalendarContract, Agendula is
a pure front-end over the OpenTasks TaskContract provider — the store that
DAVx5 (and SmoothSync, DecSync, …) syncs your CalDAV VTODO tasks into. No own
database, no reinvented sync.
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.)
Status: data layer done, UI in progress. The full non-visual stack over the
TaskContractprovider — provider resolution, live-updating reads, writes, smart-list filtering, and a self-scheduled reminder engine — is built and unit-tested. The Material 3 Expressive screens are now being built on top, one at a time. Seedocs/ROADMAP.mdfor status,docs/ARCHITECTURE.mdfor how it's built, anddocs/PLAN.mdfor the A-now-B-later design rationale.
Sync sources (by design)
Agendula works with anything that writes to the tasks 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.
License
MIT — see LICENSE.