A lightweight offline Android app for Vietnamese lunar calendar.
- Monthly calendar with solar and lunar dates
- Highlight today, full moon (15th), and first lunar day (1st)
- Can Chi (干支) day/month/year calculation
- Good/bad day assessment with scoring
- Hoàng Đạo (good) and Hắc Đạo (bad) hours
- Old Vietnamese quotes and proverbs
- No internet, no ads, no tracking
Open the project in Android Studio and run, or build from command line:
# Generate Gradle wrapper (one-time setup)
gradle wrapper --gradle-version 8.5
# Build debug APK
./gradlew clean assembleDebug
# Build release APK
./gradlew clean assembleRelease -PversionCode=1 -PversionName=1.1The project includes two CI workflows:
Android CI— builds debug APK on push, or signed release APK manuallyGenerate Android Keystore— generates signing keystore (run once only)
Follow these steps exactly once to enable signed release builds.
- Go to your GitHub repository → Actions tab.
- Select Generate Android Keystore workflow.
- Click Run workflow → Run workflow.
- Wait for the workflow to finish.
- Download the
release-keystoreartifact. - Extract
release.keystorefrom the downloaded zip.
On Linux/macOS:
base64 -w0 /path/to/release.keystore > keystore_base64.txtOn Windows (PowerShell):
[Convert]::ToBase64String([IO.File]::ReadAllBytes("release.keystore")) > keystore_base64.txtGo to Settings → Secrets and variables → Actions and add:
| Secret | Value |
|---|---|
ANDROID_KEYSTORE_BASE64 |
Content of keystore_base64.txt |
ANDROID_KEYSTORE_PASSWORD |
android |
ANDROID_KEY_ALIAS |
lunarcalendar |
ANDROID_KEY_PASSWORD |
android |
- Go to Actions → Android CI → Run workflow.
- Select branch
main, build typerelease. - Click Run workflow.
- Download the signed APK from artifacts.
IMPORTANT:
- Run the keystore generation workflow ONLY ONCE.
- Keep the
release.keystorefile in a safe place (backup it).- If the keystore is lost or a different keystore is used, existing users cannot update the app.
- The
com.vietnamese.lunarcalendarapplicationId must never change after the first signed release.
- Language: Kotlin
- UI: Jetpack Compose (Material3)
- minSdk: 23
- targetSdk: 34
- Architecture: Minimal, no-viewmodel, simple state-based navigation
- Storage: JSON files in assets
MIT