Files
clockula/CHANGELOG.md
T
2026-09-11 13:52:33 +02:00

3.1 KiB

Changelog

All notable changes to Clockula are documented here.

The format is based on Keep a Changelog, and this project adheres to Semantic Versioning. Tag sections feed the release notes — see docs/RELEASING.md.

[Unreleased]

Added

  • Project skeleton: Gradle build, version catalog, Hilt, Compose and the Material 3 Expressive theme over floret-kit's identity module, seeded #6B7A5C — the third 120° hue rotation of Calendula's slate, completing the family's palette.
  • floret-kit as a git submodule wired in as a Gradle composite build.
  • Crash capture and the report surface via floret-kit's core-crash; per-app language support via core-locale.
  • Launcher and notification icons: a line-art clock face carrying the family's Calendula bloom badge.
  • Full release pipeline, Codeberg-canonical from the first commit — CI, translations, release (F-Droid repo + Codeberg release + Google Play) and Renovate, with the F-Droid reproducibility rules intact.
  • The locked specification: docs/PLAN.md and docs/ROADMAP.md.
  • Preferences over floret-kit's new core-prefs: SettingsPrefs holds the appearance slice (theme mode, dynamic colour) in a DataStore of Clockula's own, under the family's key names. The theme now follows the stored preference — light/dark override and dynamic colour persist across launches instead of always following the system — and an unrelated preference write no longer re-emits it.
  • floret-kit's core-di supplies the @IoDispatcher the preference store runs on, so Clockula no longer declares its own dispatcher qualifier.
  • Clockula's own storage, headless: a Room database with alarms, timers, world_clocks and stopwatch_laps, its version-1 schema exported and committed so every future migration is reviewable and testable.
  • Plain-Kotlin alarms, timers, world clocks and stopwatch runs behind four repository interfaces exposing Flows — nothing above the data layer knows Room exists, and a test fails the build if anyone reaches through. A corrupt row degrades on read (a clamped time, an unknown ringtone, a rotted zone id) rather than crashing the list it appears in.
  • Alarm and timer settings are inherited, not copied: a per-alarm ringtone, snooze, vibrate, volume ramp or dismiss challenge is an override, so changing an app default later reaches every alarm the user never customised.
  • The clock defaults and the stopwatch's running state now live in DataStore alongside the appearance preferences, clamped on read as well as on write, so a hand-edited or restored file cannot produce a setting the user could never have chosen.
  • The wall-clock / elapsed-realtime split, made explicit: alarm records follow the system clock, while running timers and the stopwatch are anchored to time since boot. Changing the device's time — forwards or backwards — cannot warp either, and a timer that survives a reboot falls back to its wall-clock estimate and says so instead of vanishing.