# Floret โ€” roadmap Where the project is and where it's going. This is the **status** view; the design rationale behind each milestone lives in [`PLAN.md`](PLAN.md), and how the pieces fit together is in [`ARCHITECTURE.md`](ARCHITECTURE.md). Status legend: โœ… done ยท ๐Ÿšง in progress ยท โฌœ not started --- ## Current state (one line) The full non-visual stack ("backoffice") over the OpenTasks `TaskContract` provider is **done and unit-tested**; the Material 3 Expressive UI is being built screen by screen on top of it. App builds, gates on provider/permission, and renders the lists overview. --- ## Milestones ### โœ… M0 โ€” Skeleton Project scaffolding copied from Calendula (Gradle, version catalog, Hilt, Material 3 Expressive theme, Gitea CI/release workflows, F-Droid metadata), reseeded to a warm-mauve fallback palette. Builds, shows a themed placeholder. ### โœ… M1 โ€” Read path + logic (the "backoffice") The complete non-visual stack: - Vendored `TaskContract` subset, `ProviderResolver` (runtime authority detection), `ColumnReader`, mappers, `AndroidTasksDataSource` (Instances query + `ContentObserver`), and `TasksRepository` exposing live Flows of lists / tasks / detail. - Domain models, smart-list filtering (Today / Upcoming / Overdue / No-date / All / Completed), sorting, form validation, subtasks via `parentId`. - Self-scheduled due-reminder engine (AlarmManager + boot / provider-change re-sync), notifications, DataStore prefs. - Render-only ViewModels + UiState for **every** screen, so the UI is build-only from here. - JVM unit tests across mappers, filtering, sorting, form, value mapping, and day windows. ### ๐Ÿšง M2 โ€” Screens: lists, task list, complete & CRUD Replace the functional scaffold with the real Material 3 Expressive UI, screen by screen, against the already-built ViewModels. - โœ… Provider/permission onboarding gate (`RootScreen`). - โœ… Lists overview (`ListsScreen`) โ€” smart lists + user lists grouped by account. - ๐Ÿšง Navigation host wiring (the `onOpenFilter` / `onNewTask` callbacks in `RootScreen` are currently stubs). - โฌœ Task list screen โ€” checkbox rows, swipe-to-complete / swipe-to-delete, inline add field, section headers for smart lists, FAB. - โฌœ Toggle complete (swipe + checkbox), create / edit / delete, local-list creation wired to the UI. ### โฌœ M3 โ€” Detail / edit polish Task detail and edit screens: due/start date-time pickers, priority, percent-complete, conflict-safe saves (re-check before overwrite), smart-list section presentation. ### โฌœ M4 โ€” Subtasks (UI) `RELATED-TO` hierarchy in the UI: indentation, create subtask, reparent. The data layer already reads `parentId`; this is the trickiest UI piece. ### โฌœ M5 โ€” Reminders onboarding & polish The engine exists (M1). Remaining: the `POST_NOTIFICATIONS` + exact-alarm onboarding flow, per-task / default reminder-offset settings UI, and end-to-end verification on device. ### โฌœ M6 โ€” Settings, widget, i18n, release Settings screen (theme / dynamic-color / language, default list, default reminder), Glance task-list widget, translations, finalize F-Droid metadata, confirm CI release flow. ### โฌœ Posture B (separate track, later) Add a `:provider` module bundling the Apache-2.0 `opentasks-provider`; `ProviderResolver` defaults to our own `org.dmfs.tasks`; add sync-adapter permissions; ship self-contained. UI / repository / domain untouched โ€” see [`ARCHITECTURE.md`](ARCHITECTURE.md) ยง7. --- ## Open decisions / to verify These carry over from [`PLAN.md`](PLAN.md) ยง9; resolved ones are struck through. 1. ~~**Name** โ€” `Floret`~~ confirmed (appId `de.jeanlucmakiola.floret`). 2. ~~**tasks.org provider authority**~~ verified on device: `org.tasks.opentasks` + `org.tasks.permission.*`. 3. **jtx Board** โ€” support its richer contract later, or stay OpenTasks-only? (Not in the candidate list today.) 4. **Posture B authority choice** โ€” bundling `org.dmfs.tasks` makes Floret a *replacement* for OpenTasks (one authority owner per device). Intended, but a conscious choice. 5. **Recurring tasks** โ€” read as occurrences today (`isRecurring` flag exists); recurrence-aware editing is out of scope for v1. --- ## How to contribute / verify - Build: `./gradlew :app:assembleDebug` - Unit tests: `./gradlew :app:testDebugUnitTest` - Run on a device/emulator that has **OpenTasks** or **tasks.org** installed (and ideally DAVx5 syncing a CalDAV task list) so the read/write paths have real data. Debug builds use `DemoSeeder` for sample data when no provider data is present.