A Celtic Tree Calendar app (Beth-Luis-Nion, 13-month system) for Android and iOS, built with Flutter.
The calendar maps the ancient Celtic lunar month system onto the Gregorian calendar, with optional Google Calendar sync. All events are stored locally on your device — no server, no account required.
# 1. Clone
git clone https://github.com/Blu8print/Celtic-calendar.git
cd Celtic-calendar
# 2. Install dependencies
flutter pub get
# 3. Generate Drift database code
dart run build_runner build --delete-conflicting-outputs
# 4. Run on a connected device or emulator
flutter run
Google Calendar sync will not work until you add
android/app/google-services.jsonandios/Runner/GoogleService-Info.plist. See GOOGLE_SETUP.md.
flutter test
Set the following environment variables before building:
| Variable | Description |
|---|---|
KEYSTORE_PATH |
Absolute path to your .jks keystore file |
KEYSTORE_PASSWORD |
Keystore store password |
KEY_ALIAS |
Key alias inside the keystore |
KEY_PASSWORD |
Key password |
Generate a keystore once:
keytool -genkey -v -keystore roots-calendar.jks \
-keyalg RSA -keysize 2048 -validity 10000 \
-alias roots-calendar
Then build:
export KEYSTORE_PATH=/path/to/roots-calendar.jks
export KEYSTORE_PASSWORD=...
export KEY_ALIAS=roots-calendar
export KEY_PASSWORD=...
flutter build apk --release # APK for sideloading
flutter build appbundle --release # AAB for Play Store
GitHub Actions runs automatically on every push to master/main:
flutter analyzeflutter testOn every v*.*.* tag push, it also builds and signs the APK and AAB, then attaches them to a GitHub Release.
Required GitHub secrets for release builds:
| Secret | Description |
|---|---|
KEYSTORE_BASE64 |
base64 roots-calendar.jks output |
KEYSTORE_PASSWORD |
Keystore store password |
KEY_ALIAS |
Key alias |
KEY_PASSWORD |
Key password |
GOOGLE_SERVICES_JSON |
Contents of google-services.json |
See GOOGLE_SETUP.md for step-by-step instructions to create a Google Cloud project, enable the Calendar API, and configure OAuth credentials.
Important: The OAuth consent screen must be moved from Testing to Production before real users can sign in. See GOOGLE_SETUP.md §8.
The app uses Firebase Crashlytics. To enable it:
nl.blu8print.rootscalendar) and download google-services.json → place in android/app/nl.blu8print.rootscalendar) and download GoogleService-Info.plist → place in ios/Runner/The app runs normally without these files — crash reports simply won’t be sent.
MIT