Their exporter writes the last day an all-day event occupies as DTEND, where RFC 5545 means the day after. Read literally every all-day event was a day short and single-day ones — birthdays, memorials, name days — came out zero length, which the provider expands into no instances at all, so they never appeared. IcsQuirks sniffs the producer and shifts the end; independently, an all-day event may no longer end at or before its start and an all-day DURATION is floored at P1D. Fossify also emits a bare ";BYDAY=" for weekly events with no weekday mask. EventRecurrence.parse throws on that, out of insert, and nothing caught it — one such row failed the entire file. sanitizeRrule now drops empty and malformed parts, and importEvents isolates each event, counting rejects into IcsImportSummary.failed instead of unwinding the batch. Rest of the dialect: VTODO imports as events (was dropped silently), CATEGORIES stands in for the X-WR-CALNAME they never write, bare EXDATE day codes resolve against a timed series' own time of day, and their positive VALARM trigger is read as "on the day" so all-day reminders fire at the hour the setting names rather than at UTC midnight. Colours come across too: X-FOSSIFY-EVENT-COLOR / COLOR / the category colour as fallback, plus the X-SMT-* legacy spellings, snapped in Oklab to the nearest key a palette account publishes since those reject a raw EVENT_COLOR. Closes #225
Documentation map
Where to look for what:
| Document | What it is |
|---|---|
../CONTRIBUTING.md |
How to contribute: issue-first workflow, which branch to target, translations, the rules a change is reviewed against |
BUILDING.md |
Building from source: submodule, JDK/SDK requirements, Gradle tasks, what CI runs |
ARCHITECTURE.md |
Orientation tour: principles, layers, navigation, recurring-write / conflict / reminder pipelines, testing |
RELEASING.md |
Release process: versioning, the merge-driven pipeline, the two-forge split, secrets, key custody |
../CHANGELOG.md |
Release history (Keep a Changelog, SemVer) |
| Issues + milestones | The roadmap. What's planned, in progress, and shipped — a milestone maps to its release/vX.Y.Z branch |
../.planning/PROJECT.md |
What the project is: core value, stack + version pins, constraints, naming, forge/release infrastructure |
design/ |
Per-feature design notes kept for features whose provider behaviour is worth recording |
../fastlane/metadata/android/ |
Store metadata (single source of truth): descriptions, title, icon, screenshots (DE + EN). Harvested directly by the official F-Droid repo; transformed into the self-hosted repo layout at release time by ../scripts/fastlane_to_fdroid_localized.sh |
../fdroid-metadata/ |
App-level F-Droid control file (*.yml: Categories, License, links) for the self-hosted repo's fdroid update |
fdroid-official/ |
Recipe + notes for publishing to the official F-Droid repo (reproducible build + developer-signed binary) |
Conventions: planning lives in the issue tracker, not in this repository. The
.planning/ files that predated it (a roadmap, a development-state snapshot, and
a per-milestone requirement checklist) are gone — issues and milestones say the
same thing without going stale. PROJECT.md is what remains, and it describes
the project rather than its plan.
ARCHITECTURE.md is the authoritative orientation tour: it is updated with the
code, and is the right place for a lesson learned about the calendar provider.