makiolaj 94f09e9e5a feat(alarms): choose what the volume buttons do while ringing
A new setting in Settings > Alarms: while the ring screen shows, the
volume buttons change the volume (the default, and what they did
before), snooze, dismiss, or do nothing. It is app-wide, stored next to
the clock defaults, and included in the backup; a backup without it
restores "change the volume".

A press is made without looking, so VolumeButtonPolicy keeps it from
ending an alarm more finally than the ring screen would. Dismiss with a
dismiss challenge set snoozes instead, so the challenge still stands.
With no snoozes left, Snooze (and Dismiss behind a challenge) falls
back to changing the volume, never to the engine's refused-snooze path,
which dismisses. The key's snooze also asks the engine to keep ringing
if the limit turns out to be reached after all (AlarmEngine.snooze's new
dismissIfRefused). The ring screen decides whether a press is its own
on key down and keeps that for the release, leaves the keys alone once
another alarm has taken over the ring, and ignores a second snooze or
dismiss while the first is still running.

Only the ring screen handles the keys. While the ring is a heads-up over
another app, a background app gets no key events, and the one way
around that does not hold up: a remote-playback MediaSession whose
VolumeProvider takes the keys. On Android 13 and later
MediaSessionRecord.canHandleVolumeKey refuses such a session from an app
without a MediaRouter2 routing session, which Clockula's would be, so on
current Pixels the keys never reach it. Where it does work, it loses to
whatever app is in front or played last, shows a cast-volume slider and
a phantom media player, and takes media buttons while the alarm rings.
AOSP DeskClock and BlackyHawky's Clock also handle the keys in their
alarm activity only. ARCHITECTURE.md records the limitation.

Fixes #18
2026-10-22 11:04:39 +02:00
2026-10-06 19:14:11 +02:00

Clockula icon

Clockula

A Material 3 Expressive clock app for Android.
Alarms, timers, stopwatch and world clock. No account and no network access.

CI Android 10+ Kotlin + Compose Material 3 Expressive MIT License

Get it on Obtainium   Support me on Ko-fi

Clockula is the clock sibling to Calendula (calendar) and Agendula (tasks). The name follows theirs: clock with 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. They share one library, floret-kit.

1.0.0 is in its last betas before the stable release.

Features

Alarms

  • Repeat schedules, snooze, your own ringtones and per-alarm settings
  • Scheduled as real alarm clocks: exempt from Doze, and shown on the lock screen and in the status bar
  • Re-resolved against your current time zone whenever it changes, so DST and travel don't shift them
  • A self-check screen that reads your device's actual settings. If one of them would stop an alarm ringing, Clockula names it and opens that settings page, instead of failing quietly at 7am.

Timers, stopwatch and world clock

  • Several timers at once, controllable from the notification shade
  • A stopwatch with laps
  • World clocks from the IANA time-zone database built into Android, so the city list doesn't go stale
  • A running timer or stopwatch stays reachable from every tab

Widgets

  • Three home-screen widgets: next alarm, timer and clock
  • Each widget picks its own theme, or takes its colours from your wallpaper

Works with other apps

  • Clockula implements Android's standard AlarmClock intents in full. Your voice assistant and automation apps can set alarms and timers in it the same way they would in the stock clock.
  • Alarms, timers, world clocks and settings export to a JSON file whose format is documented in docs/BACKUP.md, and import back from it.

Design and privacy

  • Material 3 Expressive throughout, with dynamic colour on Android 12+, light and dark themes, and expressive motion and shapes
  • A per-app language setting. Clockula ships in English for now; help translate.
  • No telemetry, no analytics and no internet permission

Where your data lives

Calendula works on top of Android's CalendarContract, and Agendula can work on top of the dmfs TaskContract. Both put an interface on a standard someone else maintains. Clocks have no such provider, so Clockula keeps alarms, timers and laps in its own database, the first app in the family to do so. The first section of docs/PLAN.md explains how it makes up for the missing standard: the AlarmClock intents, IANA time zones and the documented backup format listed above.

Install

Channel Available Notes
Codeberg release / Obtainium Now, as betas Plain APK download, or automatic with Obtainium
Self-hosted F-Droid repo From 1.0.0 Add the repo once
Build from source Now Full control

Codeberg release / Obtainium

Every release is on Codeberg with the signed APK and a .sha256 checksum. Betas are published as pre-releases. Download the APK and install it directly.

For automatic updates, use Obtainium. On your phone, add Clockula in one tap, or add it by hand: Add App, paste https://codeberg.org/jlmakiola/clockula, then Add. While Clockula is in beta, switch on Include prereleases for it, or Obtainium won't find anything. A beta updates in place to later betas and to the stable release.

Self-hosted F-Droid repo

From the stable 1.0.0 on, every release is also published to the self-hosted F-Droid repository that serves Calendula and Agendula. If you already have it, Clockula will show up there. Otherwise add it once:

  1. In your F-Droid client, open Settings → Repositories → Add (or open the link below on your phone):

    https://apps.dev.jeanlucmakiola.de/dev/fdroid/repo?fingerprint=C2C0640402BF458FC0ED957AF0B37AA4C14022E72F89CE90B5965B458CF73425
    

    Repo: https://apps.dev.jeanlucmakiola.de/dev/fdroid/repo · fingerprint (SHA-256): C2C0 6404 02BF 458F C0ED 957A F0B3 7AA4 C140 22E7 2F89 CE90 B596 5B45 8CF7 3425

  2. Refresh, search for Clockula and install it.

Build from source

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 required. The included build has to find the Android SDK on its own: either export ANDROID_HOME, or put a sdk.dir=… line in a (gitignored) floret-kit/local.properties. CONTRIBUTING.md covers tests and lint.

The F-Droid repo and the Codeberg releases share the same signing key, so you can switch between them without reinstalling.

Documentation

Contributing

Bug reports, ideas and patches are welcome on Codeberg. Translations go through Weblate, not pull requests. Read CONTRIBUTING.md before writing code.

Translations

Clockula is written in English. Translations are managed on a self-hosted Weblate, and partial ones are fine: untranslated strings fall back to English.

Help translate Clockula

You don't need to code. Register on the Weblate server, pick a language (or request one) and translate in your browser. The app links here too, from Settings → About → Help translate.

Translation status

Privacy

Clockula has no analytics, tracking, ads, crash-reporting SDK or third-party services. It doesn't have the internet permission, so it can't send anything anywhere. Your alarms, timers and world clocks stay in the app's private storage on your device.

Privacy policy, written in docs/PRIVACY.md, which is what that page renders.

Licence

MIT, Jean-Luc Makiola, 2026

S
Description
A modern Material 3 Expressive clock app for Android — sibling to Calendula and Agendula. Alarms, timers, stopwatch, world clock.
Readme MIT
2.9 MiB
0 Stars 1 Watchers 0 Forks
Languages
Kotlin 99.1%
Shell 0.5%
Ruby 0.2%
Python 0.2%