Files
calendula/.planning/REQUIREMENTS.md
Jean-Luc Makiola 82c3e1d605
All checks were successful
CI / ci (push) Successful in 4m38s
docs: architecture tour, docs index, showcase README; ci: Gitea release per tag
Documentation pass after the 2.0 milestone:
- docs/ARCHITECTURE.md — principles (provider as single source of truth,
  observer-driven UI, JVM-first tests, no network), layer + reminder
  mermaid diagrams, navigation (overlay/held-key, no nav lib), and the
  provider lessons (recurring-write invariants, conflict snapshots)
- docs/README.md — map of what documentation lives where, incl. the
  convention that superpowers/ plans are historical artifacts while
  .planning/ stays current
- README.md — showcase layout (centered header, badges, screenshot
  gallery from the fastlane assets, grouped features, install/build/
  architecture/roadmap sections); renders on Gitea
- .planning/{PROJECT,REQUIREMENTS,STATE}.md unstaled: read-only-V1 talk
  removed, V1/V2 checklists marked shipped, state points at v3 + the
  Locations & People go/no-go

release.yaml gains a gitea-release job: on every tag push it extracts the
tag's CHANGELOG section and creates a Gitea release with it as the notes.
No APK assets — distribution stays with the F-Droid repo. Idempotent
(skips an existing release), gated on the test job only so notes appear
even when the F-Droid upload hiccups.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-11 22:35:03 +02:00

2.3 KiB

Calendula — Requirements

See full design spec: docs/superpowers/specs/2026-06-08-calendar-app-design.md

V1 Scope (Variant "B") — shipped in full (v1.0.0, 2026-06-11)

  • Foundation & CI infrastructure — v0.1.0 (2026-06-08)
  • Data Layer over CalendarContract
  • Permission flow (READ_CALENDAR)
  • Month view (S1)
  • Week view (S2)
  • Day view (S3)
  • Event Detail Sheet (S4) — became a full screen, plus full event read (v0.6)
  • Multi-Calendar Filter (M3)
  • Today button (M2) — shipped v0.5; Jump-to-Date cut from scope
  • View-Switcher (M1)
  • Settings screen (M4)
  • Empty / no-permission / no-calendars states
  • German + English localization
  • Loading/Failure/Success states per screen (architectural pattern)

V2 Scope — write support, shipped in full (v2.0.0, 2026-06-11)

  • Write foundation: WRITE_CALENDAR, read-only-calendar detection, delete (v1.1)
  • Create event: form, FAB, last-used calendar (v1.2; polish v1.2.1)
  • Edit event: shared form, scoped recurring writes, recurrence picker (v1.3)
  • 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
  • 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) — see ROADMAP.md idea backlog, 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