- Kotlin 97.2%
- PowerShell 2.1%
- Python 0.7%
| app | ||
| gradle | ||
| tools | ||
| .gitignore | ||
| build.gradle.kts | ||
| gradle.properties | ||
| gradlew | ||
| gradlew.bat | ||
| plan.md | ||
| README.md | ||
| settings.gradle.kts | ||
YuiNote
A personal organizer app for Android 8+. Fully offline, with a Ukrainian-language UI.
The Android package is com.yui.note. The design (palette, fonts, shapes, settings) is shared with the sibling app YuiPeachy.
Features
- Home screen with the current weekday, date and a live clock; only the hours that have events are shown
- Events with a date, time, description and a reminder (at the event time, or 5 min – 1 day before)
- Repeating events: daily, weekly, monthly or yearly, with a custom interval (e.g. every 2 weeks); each occurrence can be marked done separately
- Custom categories with a short name and a color; the color shows next to the event and on the calendar dates
- Month calendar with colored date marks, a year overview (tap the month name) and swipe left / right to change months
- Tap a category on the calendar to see all of its events for the year
- Lists and checklists with unlimited items, notes with autosave, pinned notes
- Long press on a list or a note: edit, move up / down, delete (notes can also be pinned)
- System notifications through
AlarmManager, restored after reboot, time change and timezone change; any system notification sound - Backup / restore as a JSON file (merge or replace)
- Light / dark theme; swipe between the four tabs
- Auto-update: on every launch the app checks git.whiledo.xyz and offers a newer version; when possible it downloads only a binary patch against the installed APK and rebuilds the new APK on the device (SHA-256 verified)
Stack
Kotlin, Jetpack Compose (Material 3), Room (KSP, auto-migrations), DataStore, Navigation Compose, graphics-shapes, Gradle 9.8 / AGP 9.5 with a version catalog. minSdk 26.
Build
$env:JAVA_HOME = 'C:\Program Files\Android\Android Studio\jbr'
.\gradlew.bat assembleDebug
.\gradlew.bat assembleRelease
A release build is signed only if YUIPEACHY_KEYSTORE and YUIPEACHY_KEYSTORE_PASSWORD environment variables are set (alias YuiPeachy). Without them the release APK is unsigned. The keystore and password are not part of this repository.
Output: app/build/outputs/apk/release/app-release.apk.
Updates
Update files live in the public updates branch (update.json, the latest APK and patches from the last versions), read through the Forgejo API because release downloads are behind a Cloudflare challenge.
# raise versionCode / versionName in app/build.gradle.kts, edit tools/release-notes.txt, then:
.\tools\publish-update.ps1 -Push
The script builds the signed release, keeps every version in releases/ (patch bases), creates patches with tools/make_patch.py (needs Python, bsdiff4 is installed into tools/.venv) and pushes the branch.
Documentation
See plan.md for the original technical specification (in Ukrainian).