Files
calendula/.planning/PROJECT.md
Jean-Luc Makiola caa4d65a47 docs: retire the last planning file, fold its constraints into PROJECT.md
REQUIREMENTS.md was the same pre-tracker genre as the roadmap and state
snapshot, and had drifted into being wrong rather than merely stale: it
listed the home-screen widget and full-text search under "Out of Scope
(V3+)" when both have shipped.

Its one still-useful part was the Constraints list, so that moves into
PROJECT.md as a section of its own — platform, offline-first, privacy, i18n,
tests/CI, reproducible builds, licence. The tech-stack pins it carried were
already duplicated in PROJECT.md's Stack, which is also where the drift came
from: two files restating the same versions, only one getting updated.

While there: AGP was recorded as 9.1.1, actually 9.2.1, and the Stack
section described no submodule despite floret-kit being a
compiled-from-source composite build.

.planning/ is now just PROJECT.md, which describes the project rather than
its plan.
2026-07-30 10:36:55 +02:00

2.8 KiB
Raw Blame History

Calendula

What This Is

A modern Material 3 Expressive Android calendar app. Lives entirely on top of Android's CalendarContract — any calendar synced to the device (CalDAV via DAVx5, Google, local, WebCal, …) shows up automatically; creating, editing, and deleting writes straight back, and reminders are delivered by the app itself (Etar model). The differentiator is visual: real Material 3 Expressive design that no existing FOSS calendar app delivers.

Core Value

A calendar app that is genuinely pleasant to look at and use, without re-inventing the calendar sync stack — leave that to DAVx5 and the system.

Current Milestone

Milestones 1 (read, v1.0) and 2 (write support, v1.1v2.0.0 incl. reminder delivery) are complete — v2.0.0 shipped 2026-06-11. Everything since is tracked as issues and milestones on Codeberg: https://codeberg.org/jlmakiola/calendula/milestones. A milestone maps to its release/vX.Y.Z branch.

Stack

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.2.1, Gradle 9.5.1. JVM target 17 (exactly — AGP requires it).

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

"Calendula" — Latin kalendae ("first day of the month", root of "calendar") is also the etymological root of the marigold flower Calendula. The icon shows a stylized "1" on a slate squircle.

Source

Codeberg (jlmakiola/calendula) is canonical — git, issues, PRs, tags and releases, plus contributor CI. The self-hosted Gitea instance is build infrastructure only: it holds the signing key, runs the release pipeline, and publishes the self-hosted F-Droid repo on Hetzner. Codeberg push-mirrors main and tags to Gitea, where a bumped versionName triggers the release. Also published to the official F-Droid repo. See docs/RELEASING.md.