The Timers tab gets a full rewrite of how a timer is created, after Google Clock as the interaction reference (PLAN.md §11): - A dedicated TimerSetupScreen replaces the bottom-sheet/inline setup panel: a per-unit "00h 00m 00s" readout, a "00" key, and a big centred play button that never shifts position when Clear fades in beside it. - The keypad grows into the thumb zone on its own screen (92dp keys, pushed toward the bottom), and both it and the readout read bold. - Presets are dropped from the flow; TimerDurationEntry gains the matching domain support (hoursSegment/minutesSegment/secondsSegment, plusDoubleZero()). - An empty timer list shows the same readout/keypad/Start inline, in place of a "tap + to add" card — the keypad is still the empty state, just the redesigned one. - Timer cards are disconnected like the Alarms tab's own list, each with an instant, unconfirmed delete via a small corner button (re-creating a timer is faster than reading a confirmation dialog would be). - Hero readouts go bold app-wide to match: stopwatch, alarm rows, world clock, the ring screen, and both editors' length/time displays (ClockulaReadoutDefaults.Hero and matching call sites). Alongside: Android 16 Live Update support for the running-timer notification (POST_PROMOTED_NOTIFICATIONS, ProgressStyle), the live pill restyled to a plain tonal circle, the alarm dismiss-chooser dialog moved onto Floret's OptionCard, and small fixes to addTime's zero/negative-result handling, repeat-day selection and alarm routes. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Clockula
A modern Material 3 Expressive clock app for Android.
Alarms, timers, stopwatch and world clock. Open standards, no account required.
Clockula is the clock sibling to Calendula
(calendar) and Agendula (tasks). The
name follows theirs: clock, given Calendula's -ula ending. A Calendula flower
head is botanically a cluster of many small florets, so the three apps are
florets of one bloom — and they share one, floret-kit.
🚧 Early development. The spec is locked; the app is being built. See
docs/ROADMAP.mdfor where it actually is.
The honest difference from its siblings
Calendula is a pure front-end over Android's CalendarContract. Agendula speaks
the dmfs TaskContract. Both put a good interface on a standard someone else
already maintains.
There is no open provider behind a clock. Alarms, timers and laps are
Clockula's own data, so Clockula is the first app in the family to own its
storage — by design, not as a fallback. What that commitment is replaced with is
the first section of docs/PLAN.md, and it comes down to three
things:
- Clockula speaks Android's standard alarm contract. It implements
android.provider.AlarmClockin full, so your assistant and your automation apps can set alarms and timers in it exactly as they would in any stock clock, and the system status bar and lock screen show its next alarm. - World clocks are IANA time zones, not a bespoke city list that goes stale.
- Your data exports to a documented, versioned JSON file whenever you want it, because data you can't take with you isn't really yours.
Alarms that actually ring
An alarm app is only worth having if you can trust it, so Clockula treats that as the feature rather than the plumbing. Alarms are scheduled as real alarm clocks — doze-exempt, visible to the system — and re-resolved against your current time zone whenever anything moves underneath them, so DST and travel don't silently shift them.
When something on your device would stop an alarm ringing, Clockula tells you which setting it is and takes you there, instead of failing quietly at 7am.
Documentation
Start with docs/: PLAN.md is the spec and the
reasoning, ROADMAP.md is the status,
ARCHITECTURE.md is how the code is put together, and
RELEASING.md is the release runbook.
Building
git clone --recurse-submodules https://codeberg.org/jlmakiola/clockula.git
cd clockula
./gradlew assembleDebug
floret-kit is a submodule built from source as a Gradle composite build, so
--recurse-submodules is not optional. The included build needs to find the
Android SDK on its own: either export ANDROID_HOME, or drop a sdk.dir=… line
in a (gitignored) floret-kit/local.properties.
Licence
MIT — see LICENSE.