The README leads with the thing that is actually different about this app rather than burying it: Calendula and Agendula front standards someone else maintains, and Clockula cannot, because there is no open provider behind a clock. Saying so plainly is better than implying a thesis the app does not meet — and the three things that replace it (the AlarmClock contract, IANA zones, an exportable format) are real commitments, not consolation. CONTRIBUTING's scope section now names the trade this project will not make: nothing ships that buys a feature by making an alarm less certain to ring. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01L94fydiJC37LtxVusNQBDy
79 lines
3.6 KiB
Markdown
79 lines
3.6 KiB
Markdown
<div align="center">
|
|
|
|
<h1>Clockula</h1>
|
|
|
|
<p><strong>A modern Material 3 Expressive clock app for Android.</strong><br>
|
|
Alarms, timers, stopwatch and world clock. Open standards, no account required.</p>
|
|
|
|
<a href="https://codeberg.org/jlmakiola/clockula/actions"><img src="https://codeberg.org/jlmakiola/clockula/actions/workflows/ci.yaml/badge.svg?branch=main" alt="CI"></a>
|
|
<img src="https://img.shields.io/badge/Android-10%2B-3DDC84?logo=android&logoColor=white" alt="Android 10+">
|
|
<img src="https://img.shields.io/badge/Kotlin-Compose-7F52FF?logo=kotlin&logoColor=white" alt="Kotlin + Compose">
|
|
<img src="https://img.shields.io/badge/Material%203-Expressive-4285F4" alt="Material 3 Expressive">
|
|
<a href="LICENSE"><img src="https://img.shields.io/badge/License-MIT-green" alt="MIT License"></a>
|
|
|
|
</div>
|
|
|
|
Clockula is the clock sibling to [Calendula](https://codeberg.org/jlmakiola/calendula)
|
|
(calendar) and [Agendula](https://codeberg.org/jlmakiola/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](https://codeberg.org/jlmakiola/floret-kit).
|
|
|
|
> 🚧 **Early development.** The spec is locked; the app is being built. See
|
|
> [`docs/ROADMAP.md`](docs/ROADMAP.md) for 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`](docs/PLAN.md), and it comes down to three
|
|
things:
|
|
|
|
- **Clockula speaks Android's standard alarm contract.** It implements
|
|
`android.provider.AlarmClock` in 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/`](docs/): [`PLAN.md`](docs/PLAN.md) is the spec and the
|
|
reasoning, [`ROADMAP.md`](docs/ROADMAP.md) is the status,
|
|
[`ARCHITECTURE.md`](docs/ARCHITECTURE.md) is how the code is put together, and
|
|
[`RELEASING.md`](docs/RELEASING.md) is the release runbook.
|
|
|
|
## Building
|
|
|
|
```sh
|
|
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`](LICENSE).
|