| Channel | Updates | Signed with | Pick it if |
|---|---|---|---|
| Official F-Droid | A few days after a release | Mine | Most people. Nothing to set up. |
| Self-hosted F-Droid repo | Minutes after a release | Mine | You want it first, and will add a repo once. |
| Codeberg release | When you fetch it | Mine | You want the APK and its checksum, by hand. |
| Obtainium | Per release, automatic | Mine | You already run Obtainium for everything else. |
| Google Play | Per release | Google's | Play is how you install things. |
F-Droid, and why it is the recommendation
Calendula is in the official F-Droid repository. Search for it in any F-Droid client, or install it from the listing.
I recommend it because of how it gets built. Calendula is published under F-Droid's reproducible-build model: F-Droid compiles the tagged source on its own machines, fetches the APK I signed, and checks the two are identical byte for byte. Only then does it publish my binary, signed with my key and checked against a build somebody else did. If a version ever fails to match, F-Droid skips it rather than shipping it.
That is why "the app has no internet permission" and "the source says it has no internet permission" are the same statement for that build, and it is also why this channel carries my signature rather than F-Droid's. That is worth a few days of update lag.
The self-hosted repo, if you want it first
Every release is built, signed and published to a repository of my own as part of the release pipeline, so it lands there before F-Droid rebuilds it. Add it once and your client handles the rest.
- In your F-Droid client: Settings → Repositories → Add.
- Paste the URL below, or open it on the phone.
https://apps.dev.jeanlucmakiola.de/dev/fdroid/repo?fingerprint=C2C0640402BF458FC0ED957AF0B37AA4C14022E72F89CE90B5965B458CF73425 - Refresh, search for Calendula, install.
The fingerprint in that URL is the SHA-256 of the repository's signing key, and it is what makes adding the repo safe: your client will reject anything served from that address that is not signed with it.
Codeberg releases and Obtainium
If you would rather not use F-Droid at all, every release is published on Codeberg with a signed APK and a .sha256 checksum attached. Download, verify, install.
For updates from that channel without doing it by hand, use Obtainium: on the phone, open Calendula in Obtainium's Add App form with the source pre-filled, or paste the repository URL in yourself. Obtainium then watches the releases and prompts you when there is a new one.
Google Play, and the catch
Calendula is on Google Play, and the build there has no internet permission either. The store listing does not change what is in the manifest.
What it does change is the signature. Play builds are signed with Google's key rather than mine, and Android refuses to update an app with a package signed by a different key. So moving between Play and any other channel means uninstalling first. Your events survive that without effort, because they were never inside the app. They live in Android's calendar store, which is the entire architecture. The app's own settings do not survive it, and you will set them up again.
Building it yourself
A plain Gradle build with no proprietary dependencies. The one thing that catches people is the floret-kit submodule. The shared design system is wired in as a composite build rather than pulled from a Maven repository, so a clone without the submodule will not configure at all. docs/BUILDING.md in the repository has the details.
Frequently asked
Which install channel should I use?
Official F-Droid unless you have a reason to do otherwise. It builds from source, updates without you thinking about it, and needs no setup. The self-hosted repo is the same app a few days earlier.
Can I switch from Google Play to F-Droid without losing anything?
You have to uninstall first, because the Play build is signed with Google’s key and every other channel with mine. Android will not update one over the other. Your events are unaffected: they live in Android’s calendar store, not in the app. You will lose the app’s own settings and have to set them again.
Is the F-Droid build the same app as the Play build?
Same source, same features, and neither one has an internet permission. F-Droid rebuilds the app from source on its own machines and publishes my APK only once the two match byte for byte, so somebody other than me verifies the build. That makes it the stronger guarantee of the two.
Why does the self-hosted repo need a fingerprint?
It is what pins the repository to a signing key, so your F-Droid client refuses anything served from that URL that was not signed by me. Adding a repo without checking a fingerprint is the part worth being fussy about, on any repo, not just this one.
What Android version do I need?
Android 10 or newer. Below that it will not install. Etar goes back to Android 6 and is the sensible answer on an older phone.
Installed it? The widgets are worth two minutes, and a CalDAV account is set up here. If you haven't decided yet, the comparison with Etar and Fossify Calendar is the honest version.