diff --git a/.planning/PROJECT.md b/.planning/PROJECT.md index a8f2fd4..c9f5e5a 100644 --- a/.planning/PROJECT.md +++ b/.planning/PROJECT.md @@ -28,10 +28,26 @@ Kotlin 2.3.21 (paired with KSP 2.3.9 — Kotlin 2.4.0 has no KSP release yet, do not upgrade until one ships). Jetpack Compose + Material 3 Expressive 1.5.0-alpha21 (alpha is intentional — Expressive APIs only live in the 1.5 alpha line). Hilt 2.59.2, DataStore. Gradle Kotlin DSL -with Version Catalog. AGP 9.1.1, Gradle 9.5.1. JVM target 17. +with Version Catalog. AGP 9.2.1, Gradle 9.5.1. JVM target 17 (exactly — AGP +requires it). -Android-only (minSdk 29, targetSdk 36). No iOS. No `INTERNET` permission — -any feature that would need one is an explicit product decision first. +The shared Material 3 Expressive kit, **floret-kit**, is a git submodule wired +in as a Gradle composite build, so it compiles from source rather than resolving +as a dependency. + +## Constraints + +- **Platform:** Android-only, Android 10+ (minSdk 29), targetSdk 36. No iOS. +- **Offline-first:** all data lives in `CalendarContract` — no app database, no + sync stack. No `INTERNET` permission; any feature needing one is an explicit + product decision first. +- **Privacy:** zero telemetry, zero analytics. +- **i18n:** German + English from day one; further languages come from community + translators via the self-hosted Weblate, which owns every `values-*` file. +- **Tests + CI from day one**, JVM-first. +- **Reproducible release builds**, so the official F-Droid repo can verify the + published binary against a from-source rebuild. +- **Licence:** MIT. ## Naming diff --git a/.planning/REQUIREMENTS.md b/.planning/REQUIREMENTS.md deleted file mode 100644 index 6a72afe..0000000 --- a/.planning/REQUIREMENTS.md +++ /dev/null @@ -1,52 +0,0 @@ -# Calendula — Requirements - -Architecture reference: [`../docs/ARCHITECTURE.md`](../docs/ARCHITECTURE.md) - -## V1 Scope (Variant "B") — shipped in full (v1.0.0, 2026-06-11) - -- [x] Foundation & CI infrastructure — v0.1.0 (2026-06-08) -- [x] Data Layer over `CalendarContract` -- [x] Permission flow (`READ_CALENDAR`) -- [x] Month view (S1) -- [x] Week view (S2) -- [x] Day view (S3) -- [x] Event Detail Sheet (S4) — became a full screen, plus full event read (v0.6) -- [x] Multi-Calendar Filter (M3) -- [x] Today button (M2) — shipped v0.5; Jump-to-Date **cut from scope** -- [x] View-Switcher (M1) -- [x] Settings screen (M4) -- [x] Empty / no-permission / no-calendars states -- [x] German + English localization -- [x] Loading/Failure/Success states per screen (architectural pattern) - -## V2 Scope — write support, shipped in full (v2.0.0, 2026-06-11) - -- [x] Write foundation: `WRITE_CALENDAR`, read-only-calendar detection, delete (v1.1) -- [x] Create event: form, FAB, last-used calendar (v1.2; polish v1.2.1) -- [x] Edit event: shared form, scoped recurring writes, recurrence picker (v1.3) -- [x] Reminder notifications (v1.4) — **reversal of the original - "system handles reminders" assumption:** Calendula targets - sole-calendar-app users, so it posts reminder notifications itself - (Etar model), incl. `POST_NOTIFICATIONS` onboarding -- [x] Conflict dialog on save + store polish (v2.0) -- Quick-add — **cut from scope** (the prefilled form covers it) -- Calendar switching while editing — moved to v3 backlog - -### Out of Scope (V3+) - -- Home-screen widget -- Full-text search -- Tablet/foldable-specific layouts -- Locations & People ideas (contact picker, OSM autocomplete) — undecided -- iOS support (Android-only by design) - -## Constraints - -- **Tech stack:** Kotlin + Jetpack Compose + Material 3 Expressive, Hilt, DataStore -- **Tech stack pin:** Hilt 2.59.2 + KSP 2.3.9; Kotlin 2.3.21 (KSP for Kotlin 2.4.0 not released yet). Material 3 pinned to `1.5.0-alpha21` (Expressive APIs only exist in alpha). Re-evaluate when KSP/Material3 stable land. -- **Platform:** Android 10+ (API 29 minimum), Android 16 (API 36) target -- **Offline-first:** all data lives in `CalendarContract`; no app-side network -- **Privacy:** zero telemetry, no analytics -- **i18n:** German + English from day one -- **Tests + CI from day one** -- **License:** MIT diff --git a/docs/README.md b/docs/README.md index 54710a6..79d7394 100644 --- a/docs/README.md +++ b/docs/README.md @@ -10,15 +10,16 @@ Where to look for what: | [`RELEASING.md`](RELEASING.md) | Release process: versioning, the merge-driven pipeline, the two-forge split, secrets, key custody | | [`../CHANGELOG.md`](../CHANGELOG.md) | Release history (Keep a Changelog, SemVer) | | [Issues](https://codeberg.org/jlmakiola/calendula/issues) + [milestones](https://codeberg.org/jlmakiola/calendula/milestones) | **The roadmap.** What's planned, in progress, and shipped — a milestone maps to its `release/vX.Y.Z` branch | -| [`../.planning/PROJECT.md`](../.planning/PROJECT.md) | What the project is, stack, naming, infrastructure | -| [`../.planning/REQUIREMENTS.md`](../.planning/REQUIREMENTS.md) | Historical V1/V2 requirement checklist, plus the stack/platform constraints | +| [`../.planning/PROJECT.md`](../.planning/PROJECT.md) | What the project is: core value, stack + version pins, constraints, naming, forge/release infrastructure | | [`design/`](design/) | Per-feature design notes kept for features whose provider behaviour is worth recording | | [`../fastlane/metadata/android/`](../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`](../scripts/fastlane_to_fdroid_localized.sh) | | [`../fdroid-metadata/`](../fdroid-metadata/) | App-level F-Droid control file (`*.yml`: Categories, License, links) for the self-hosted repo's `fdroid update` | | [`fdroid-official/`](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 and a development-state snapshot) -are gone — issues and milestones say the same thing without going stale. +`.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.