LunarLog is an Android app for menstrual cycle and wellness tracking with a local-first privacy model.
What It Does
- Tracks cycle start and end dates
- Supports daily logs for symptoms, mood, flow, sleep, hydration, and notes
- Provides calendar and analysis views for trends and predictions
- Tracks daily, weekly, and as-needed medications with optional private reminders
- Includes period history and detail screens for edits and corrections
- Generates report-friendly exports and supports local backup/restore
- Offers app lock, reminders, app widget support, and in-app update checks
Core Principles
- Privacy first: no required account and no cloud dependency
- Offline ready: core usage does not depend on network
- Full feature set: advanced insights without paywalls
Cycle and fertile-day predictions are estimates. LunarLog is not a medical device and does not diagnose, treat, cure, or prevent any medical condition. Consult a healthcare professional for medical advice, diagnosis, or treatment; fertile-day estimates are not birth control.
Tech Stack
- Kotlin
- Jetpack Compose (Material 3)
- MVVM architecture
- Hilt for dependency injection
- Room (SQLite) for persistence
- Coroutines and Flow
- WorkManager for scheduled notifications
- Navigation Compose
Requirements
- Android Studio with Android SDK 37 (compile SDK); target SDK 35
- JDK 17
- Android device or emulator (API 26+)
Getting Started
- Clone the repository.
- Open the project in Android Studio.
- Let Gradle sync finish.
- Run the
appconfiguration on a device/emulator.
Command Line Build and Test
./gradlew :app:assembleGithubDebug ./gradlew :app:bundlePlayRelease ./gradlew :app:assembleGithubRelease ./gradlew test lintPlayDebug lintGithubDebug ./gradlew connectedGithubDebugAndroidTest # requires an emulator/device
Project Structure
app/src/main/java/com/lunarlog: application codeapp/src/main/java/com/lunarlog/ui: Compose screens and UI componentsapp/src/main/java/com/lunarlog/data: Room entities, DAOs, repositories, and data managementapp/src/main/java/com/lunarlog/logic: prediction, anomaly detection, and insight logicapp/src/main/java/com/lunarlog/update: GitHub release update check and APK install flowapp/src/test/java/com/lunarlog: unit testsscripts: release helper scripts.github/workflows/release.yml: signed APK release automationdocs/play-store-release.md: Play Store release checklist and signing setup
Versioning and Releases
- App version is defined in
app/build.gradle.kts(versionCode,versionName). CHANGELOG.mdis used for release notes when it has a matching section for the bumped version.playReleasebuilds the Play Store.aabbundle.githubReleasebuilds the signed sideload APK used by GitHub Releases.- Pushing to
mainautomatically starts a release whenversionNameincreases,versionCodealso increases, andCHANGELOG.mdcontains a matching section. The workflow tests and builds a signedgithubReleaseAPK, creates the matching SemVer tag and GitHub Release, and marks prereleases correctly. Manual SemVer tags on the currentmainHEAD remain supported; ordinary pushes without aversionNamebump do not publish a release.
Play Console Release Documentation
LunarLog has separate Play Store and GitHub release channels:
- Google Play:
playReleasecreates an Android App Bundle without internet or sideload-updater permissions. - GitHub Releases:
githubReleasecreates the direct-download APK with the GitHub updater flow enabled.
Play Console package and store listing details:
- Package name:
com.lunarlog - App category/positioning: privacy-first menstrual cycle and wellness tracking
- Privacy policy URL:
https://robertg761.github.io/LunarLog/ - Store logo source:
docs/assets/lunarlog-logo-512.png - Local Play Store asset source, when present:
local/play-store-assets/
Submission notes:
- Upload
app/build/outputs/bundle/playRelease/app-play-release.aabto Internal testing before wider rollout. - Complete the Health apps declaration with both
Period TrackingandMedication and Treatment Management. - Complete the Data safety form to match LunarLog's local-first behavior: no account requirement, no advertising SDKs, no third-party analytics/crash-reporting SDKs, and cycle/wellness data stored on-device unless the user exports or shares it.
- Keep store listing copy, screenshots, icon, feature graphic, notification text, and health-related claims aligned with the privacy policy and actual app behavior.
Testing
Automated checks cover cycle prediction, fertility-signal validation, reminders, narratives, correlations, reporting, backup/restore, repository aggregation, themes, selected ViewModels, and database migration. CI also runs Android lint, assembles both debug distributions, and performs CodeQL analysis.
Run all unit tests:
./gradlew test lintPlayDebug lintGithubDebug ./gradlew connectedGithubDebugAndroidTest # requires an emulator/device
Security and Privacy Notes
android:allowBackupis disabled in the manifest.- Android cloud/device-transfer extraction rules exclude app data.
- App screens use secure-window protection and private notification visibility.
- App lock and biometric flow are supported.
- Data backup/restore is handled locally by the app.
- Update checks query GitHub Releases and install from release APK assets.
Related Docs
PROJECT_DESC.md: short project summaryPROJECT_SPEC.md: verified product and technical specificationCHANGELOG.md: release historydocs/play-store-release.md: Play release build, signing, upload, and channel notesdocs/google-play-compliance-checklist.md: Play policy and data safety checklistdocs/privacy-policy.md: privacy policy for store listing and public publishing
License
LunarLog is available under the MIT License.
See current release QA and audit remediation for behavioral changes, migration details, and verification limits. Historical release checklists remain under docs/release/.