Files
calendula/docs/BUILDING.md
Jean-Luc Makiola 048de67350 docs: correct stale build, forge and layer facts
BUILDING.md never mentioned the floret-kit submodule, so its instructions
could not produce a working build — a plain clone fails to configure. It
also understated the SDK requirement: compileSdk is 37, not the "36+" it
claimed. Both matter now that the Codeberg move is meant to make an
outside clone viable.

The docs map advertised superpowers/specs/ and superpowers/plans/, neither
of which exists any more, while omitting BUILDING.md and RELEASING.md.
Dropped the dead rows and listed what is actually there. Purged the
remaining superpowers references in .planning/ and ARCHITECTURE.md's
dangling "see plan 03" the same way — a pointer to a deleted file is worse
than no pointer.

ARCHITECTURE.md still called OptionCard "the app's only sanctioned
selection-dialog style", which the 2026-07-07 flip to full-screen pickers
reversed, and described no layer for floret-kit despite it being a
compiled-from-source composite build. Its CI note credited Gitea Actions;
contributor CI runs on Codeberg now.

PROJECT.md's Source section described the old world outright ("hosted on
self-hosted Gitea") and now records the split: Codeberg canonical, Gitea
build infrastructure.
2026-07-30 10:13:48 +02:00

2.7 KiB

Building from source

Calendula builds with the standard Android Gradle toolchain — no extra setup beyond the SDK, a JDK, and the submodule.

Clone

git clone --recurse-submodules https://codeberg.org/jlmakiola/calendula.git

Calendula depends on floret-kit, the shared Material 3 Expressive kit, as a git submodule wired in as a Gradle composite build (includeBuild("floret-kit") in settings.gradle.kts) — it is compiled from source, not resolved from a repository. A clone without the submodule fails to configure. For an existing clone:

git submodule update --init --recursive

Requirements

  • JDK 17 — not newer; the Android Gradle Plugin requires exactly 17. If your default JDK differs, set JAVA_HOME explicitly.
  • Android SDK — platform 37 (compileSdk) and build-tools 36.0.0. minSdk is 29, targetSdk 36.

The SDK is located via ANDROID_HOME (or ANDROID_SDK_ROOT), or via a gitignored local.properties with sdk.dir. If you use local.properties, note that the composite build needs its own copy at floret-kit/local.properties; setting ANDROID_HOME covers both builds at once and is the simpler route.

The Gradle wrapper is checked in, so you don't need a system Gradle.

Common tasks

./gradlew assembleDebug   # debug APK → app/build/outputs/apk/debug/
./gradlew test            # JVM unit tests (JUnit 5 + Truth + Turbine)
./gradlew lint            # Android lint

A single test class, or a pattern:

./gradlew testDebugUnitTest --tests "de.jeanlucmakiola.calendula.domain.SimpleRecurrenceTest"
./gradlew testDebugUnitTest --tests "*SimpleRecurrence*"

Translation-key invariants (stale and orphaned keys are fatal; missing ones are not) are checked outside Gradle:

python3 scripts/check_translations.py

What CI runs

.forgejo/workflows/ci.yaml reports a single CI check per pull request on Codeberg: the reproducible-release guard, then lintDebug, testDebugUnitTest, assembleDebug and a Trivy filesystem scan. Pull requests that touch only docs, F-Droid metadata or the licence skip the Android build and still report green.

Release builds

Release signing and the publishing pipeline are documented separately in RELEASING.md. To smoke-test a release candidate locally, the releaseTest build type is an R8-shrunk twin of release, debug-signed with its own applicationId suffix so it installs alongside the real app:

scripts/verify-release.sh

Contributing

See ../CONTRIBUTING.md for the issue-first workflow, which branch to target, and the architectural rules a change is reviewed against.