Files
floret-kit/docs/ROADMAP.md
T
Jean-Luc Makiolaandmakiolaj 8b33635a85 Converge sibling branches into main (0.7.0) (#11)
Brings the branches the sibling apps actually ship from back onto main, so floret-kit stops forking per project.

Merged in:
- `vouch/settings` (what vouch pins), which already contains `feat/clockula` (what clockula pins) and `chore/deps-2026-10`: core-prefs, core-di, CollapsingScaffold FAB/no-back slots, the glance module, LocaleManager on API 33+, and the dependency bump
- `feat/glance-module`: the three glance commits clockula's branch didn't have yet (progress ring/tile/check button, expressive shapes + header pill, WidgetDoneState)

Both merged without conflicts. Version ends up at 0.7.0 (untagged).

Heads-up for consumers: the deps bump moves the toolchain to Gradle 9.8.0 / AGP 9.4.1 / Kotlin 2.4.20. Since floret-kit is a composite build, a consumer must be on Gradle >= 9.6 to pin anything from here on. Calendula builds, tests and lints against this branch with just that toolchain bump, no source changes.

Co-authored-by: Jean-Luc Makiola <business@jeanlucmakiola.de>
Reviewed-on: https://codeberg.org/jlmakiola/floret-kit/pulls/11
2026-10-07 09:36:15 +02:00

84 lines
3.8 KiB
Markdown

# 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-locale` | Android | Agendula, Calendula |
| `core-crash` | Android | Agendula |
| `core-prefs` | Android | Clockula |
| `core-di` | JVM | Clockula |
| `identity` | Android | Agendula |
| `components` | Android | Agendula |
| `glance` | Android | Agendula (Calendula pending — its own M3 Expressive widget pass) |
See [`../CHANGELOG.md`](../CHANGELOG.md) for the contents of each.
### Follow-ups on what's extracted
- **Migrate Calendula and Agendula onto `core-prefs` + `core-di`** — Clockula
triggered the extraction (the third app that made the duplication hurt) and is
its only consumer today. Both siblings still carry their own `ThemeMode`,
`toEnum()` and `@IoDispatcher`. The stored key names are identical
(`theme_mode`, `dynamic_color`), so each migration is a code change with **no
data migration** — deliberately out of scope for the extraction, and done by
each sibling when it next re-pins the kit.
---
## Deferred / not yet worth it
- **`ReminderFormatting`** (`ReminderUnit` + `reminderLeadTimeLabel` +
`decomposeReminder`) — the labels are `@Composable` over app-specific
`R.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' `ColumnReader`s 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 `SettingsScaffold` to stay readable. The win is
captured instead at the **component** level (shared `GroupedRow`/section
primitives + `CollapsingScaffold` + `OptionPicker`); each app composes its own
settings from those.
- **The reminder *scheduler*** — the shared `core-reminders` module 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 tiny `core-notification` (idempotent channel
setup, `POST_NOTIFICATIONS` checks) *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).
- **Clockula** consumes the kit on `main` (active development); the first
consumer of `core-prefs` and `core-di`.
- **Calendula** (ships via official F-Droid reproducible builds) has a pending
adoption branch. Bringing it onto the kit is where the canonical-`GroupedSurface`
convergence becomes visible, and where the F-Droid reproducibility checklist
(`submodules: true` in the recipe; the repro guard scanning the submodule)
applies — see [`ARCHITECTURE.md`](ARCHITECTURE.md) §2 and §5.