Record core-reminders (multi-value) and the new components in CHANGELOG, README module table and the ROADMAP extracted list; clarify that only the reminder *scheduler* stays app-local. Also removes a leftover '>>>>>>> origin/main' merge-conflict marker committed in README by an earlier merge. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
3.3 KiB
3.3 KiB
floret-kit — roadmap
What's extracted, what's deferred, and what's deliberately not shared. The defer/skip calls come from a cross-app survey of both Calendula and Agendula — the guiding rule is to share only what is genuinely common, and to keep divergent or app-specific code where it lives.
Extracted (done)
| Module | Type | Consumers |
|---|---|---|
core-time |
JVM | Agendula (and Calendula's pending branch) |
core-reminders |
JVM | Agendula (and Calendula's pending branch) |
core-crash |
Android | Agendula |
identity |
Android | Agendula |
components |
Android | Agendula |
See ../CHANGELOG.md for the contents of each.
Deferred / not yet worth it
core-prefs(DataStore base:ThemeMode,dynamicColor, the typed wrapper,toEnum()) andcore-di(@IoDispatcher+ provider) — genuinely shared but low value: pure relocation, no new capability, the shared surface is tiny once the store name and bindings stay app-local. Sensible to defer until a third app makes the duplication hurt.ReminderFormatting(ReminderUnit+reminderLeadTimeLabel+decomposeReminder) — the labels are@Composableover app-specificR.plurals, and the presets differ per app. Extract later behind a label/preset callback API, not before.
Deferred — needs migration first
core-provider(the ContentProvider seam:ColumnReader, failures, observer→Flow) — the two apps'ColumnReaders diverged (Calendula index-based, Agendula name-based + null-safe). True sharing means migrating Calendula to the better name-based design first (~a few hundred LOC), so it waits until Calendula is actively on the kit.
Not shared (by design)
- A generic Settings scaffold — the two apps' settings domains are too
divergent for a config-driven
SettingsScaffoldto stay readable. The win is captured instead at the component level (sharedGroupedRow/section primitives +CollapsingScaffold+OptionPicker); each app composes its own settings from those. - The reminder scheduler — the shared
core-remindersmodule is the app-agnostic override model only (ReminderOverride+ codec + unit model, now multi-value). The delivery stays app-local: Agendula self-schedules alarms (pull), Calendula is provider-event-driven (push) — opposite architectures over incompatible data models, so forcing a shared scheduler abstraction would be leaky. A tinycore-notification(idempotent channel setup,POST_NOTIFICATIONSchecks) might land later; schedulers stay app-local. - Domain-specific UI (date/time fields tied to a domain, calendar/timeline widgets, recurrence text, domain pickers) and all string wording — these encode each app's model and resist parameterization.
Consumers & cadence
- Agendula consumes the kit on
main(active development). - Calendula (ships via official F-Droid reproducible builds) has a pending
adoption branch. Bringing it onto the kit is where the canonical-
GroupedSurfaceconvergence becomes visible, and where the F-Droid reproducibility checklist (submodules: truein the recipe; the repro guard scanning the submodule) applies — seeARCHITECTURE.md§2 and §5.