Your APU timetable, in your phone calendar. Always up to date.
⬇ Download v1.0 · 📖 Project page on dkly.net
APLife is an unofficial Android companion for Asia Pacific University (APU) students. It pulls your weekly classes, exams, and APU holidays straight from APU's API endpoints and pushes them into your phone's native calendar — with smart reminders, weekend auto-sync, festive holiday notifications, and an in-app calendar UI that doubles as a personal planner.
No login. No account. No backend. Everything stays on your device.
- Quickstart
- Features
- Screenshots
- Tech stack
- Permissions
- Build
- Project layout
- Privacy
- FAQ
- Roadmap
- Contributing
- License
- Author
- Install — download
app-release.apkfrom the v1.0 release. - Allow Calendar when prompted. Notifications and Audio are optional.
- Search your intake (e.g.
UCDF2509IRS) — autocompletes from APU's full intake list. - Tick the groups you attend (G1, G2, …).
- Pick the calendars you want events in. Phone, Google and Outlook can all be selected at once.
- Choose a reminder offset (15 min is the recommended default).
- Tap Finish & sync. Your timetable lives in your phone calendar from this moment on.
Re-running this later? Open the app → Settings → Reset setup. Or just tweak any field individually from Settings.
- Pulls from APU's public timetable — no APSpace login needed.
- Multi-calendar fan-out: write to your Phone calendar, Google, Outlook, or all of them at once.
- Marker-based dedup: re-sync as many times as you like — events get updated, not duplicated. Room moved? Lecturer changed? It just updates the existing event.
- Weekend auto-sync (Sat/Sun) via WorkManager so next week's timetable is in your calendar before Monday.
- Sync success / failure notifications with a summary of what changed.
- Per-class reminder offsets (1 day → 30 min, configurable).
- Exam ramp: 3 weeks → 2 weeks → 1 week → 3 d → 2 d → 1 d → 3 h → 2 h → 1 h → 30 min by default.
- A personalised "Good luck for your Course Name exam at 10:00 AM!" notification fires 5 minutes before each exam.
- The night before any APU holiday: "Hahah, no class tomorrow! Tomorrow is Hari Raya — enjoy your day off! 🎉"
- On the morning of the holiday: a customised festive greeting:
- Chinese New Year → Gōngxǐ fācái! 🧧 Time to see family, eat tangerines and enjoy the day off. Have a prosperous one! 🐉🏮
- Hari Raya Aidilfitri → Selamat Hari Raya! 🌙 Maaf zahir dan batin — enjoy the open houses, ketupat and rendang! 🕌
- Christmas / Deepavali / Wesak / Thaipusam / Hari Kebangsaan / Hari Malaysia / Labour Day / Good Friday / Awal Muharram / Maulidur Rasul / Sultan's birthday / Agong's birthday — each with their own message.
- Day / Week / Month toggle.
- Week strip with coloured dots indicating which days have classes, exams, holidays, or your own events.
- Month grid showing the whole month with the same dot indicators.
- A Today chip that snaps you back when you've navigated away.
- A friendly "Timetable not published yet" card on dates beyond what APU has released, so you know to come back later.
- Tap any class card to open the inline editor.
- Override date, start/end time, room, lecturer locally — overrides survive re-syncs and propagate to your calendar.
- Tap the lecturer's name in a class card to open their full profile.
- Add Replacement Classes, Appointments with Lecturer, Presentations, Events, Study Groups, or Other items to any date.
- They render alongside your real classes and sync to your calendar with the same reminder system.
- 1,800+ APU staff bundled offline (no network needed).
- Search by name / code / department / account.
- Tap a lecturer for their full profile, contact info, and Lecturer Timetable (scheduled sessions grouped by day).
- One-tap Send Email (chooser opens Gmail/Outlook/etc.) and Chat in Teams (deep links into the Teams app, or web fallback).
- Tap their avatar for a full-size photo dialog.
- Pin Class Tests, Presentations, Assignment Discussions, Lectures, and Appointments to specific dates.
- Notes show up under the day's classes in the schedule view.
- Departments tab: live "Open / Closed" status for every APU department (Cashier, Library, Clinic, Admin, …) based on the official operating hours.
- Bus tab: the active APU shuttle schedule with the next departures and the full list of stops with their colour-coded markers.
- Change intake/groups, swap target calendars, tweak reminders any time.
- Remove all APLife events in one tap (clean slate).
- Reset setup to re-run onboarding.
- All data stored locally — no analytics, no telemetry, no account.
| Welcome | Permissions |
|---|---|
![]() |
![]() |
| Day view | New event | Event types |
|---|---|---|
![]() |
![]() |
![]() |
| Directory | Lecturer detail | Email chooser |
|---|---|---|
![]() |
![]() |
![]() |
| Departments | Shuttle |
|---|---|
![]() |
![]() |
| Sync | Reminders | About |
|---|---|---|
![]() |
![]() |
![]() |
| Concern | Choice |
|---|---|
| Language | Kotlin |
| UI | Jetpack Compose (Material 3, BOM 2026.04.01) |
| Async | Kotlin coroutines + StateFlow |
| Serialization | kotlinx.serialization |
| HTTP | HttpURLConnection (no third-party HTTP lib) |
| Image loading | Coil 2 |
| Background | WorkManager (weekend sync, exam-luck, holiday-eve) |
| Persistence | SharedPreferences + JSON (notes, overrides, prefs) |
| Calendar API | android.provider.CalendarContract |
| Min SDK | 24 (Android 7.0 Nougat) |
| Target SDK | 36 |
| Java target | 11 with core-library desugaring (for java.time on API 24+) |
No Room, no Hilt, no Retrofit — kept intentionally lean.
| Permission | Why |
|---|---|
INTERNET |
Fetch timetable, exams, shuttle, departments, lecturer schedules |
READ_CALENDAR / WRITE_CALENDAR |
Read your calendar list, write classes/exams/holidays/events |
POST_NOTIFICATIONS (Android 13+) |
Sync result, exam "Good luck", holiday-eve / day-of greetings |
RECORD_AUDIO |
Optional — reserved for upcoming voice-note feature |
You can revoke any of these any time in Android Settings → Apps → APLife.
- Android Studio Ladybug Feature Drop (or newer) with Compose support
- JDK 17 (bundled with Android Studio)
- Android Gradle Plugin 9.x
- Kotlin 2.3.x
git clone https://github.com/osscv/APLife.git
cd APLife
# Production / installable build:
./gradlew assembleRelease
# Or for day-to-day development (no signing config needed):
./gradlew assembleDebug
# (or open the folder in Android Studio and hit Run)The release APK lands in app/build/outputs/apk/release/. You'll need a signing config in app/build.gradle.kts (or pass keystore properties via -P) for the APK to install on a device — assembleDebug works out of the box.
The first launch walks you through onboarding (permissions → intake → groups → calendars → reminders) and writes your first batch of events to the calendar of your choice.
app/src/main/java/net/dkly/aplife/
├── MainActivity.kt # entry point + tab nav + dialogs
├── ui/
│ ├── AppViewModel.kt # single ViewModel for all tabs
│ ├── Onboarding.kt # 6-step onboarding wizard
│ ├── Screens.kt # Schedule, Notes, Lecturers, Depts, Bus, Settings
│ ├── Components.kt # reusable UI primitives + brand button colors
│ ├── Format.kt # date/time formatters
│ └── theme/ # M3 theme, brand palette
├── calendar/
│ └── CalendarSyncManager.kt # marker-based upsert into CalendarContract
├── data/
│ ├── ApiClient.kt # HttpURLConnection + kotlinx.serialization
│ ├── *Repository.kt # Timetable / Staff / Holiday / Department / Transport / Notes / Overrides / PersonalEvents
│ ├── UserPreferences.kt # all persisted settings
│ └── *.kt # data models
├── notes/ # NoteType + Note model
└── sync/
├── AutoSyncWorker.kt # daily WorkManager — only fires on Sat/Sun
├── SyncNotifier.kt # success/failure notifications
├── ExamLuckScheduler.kt # one-time WorkRequest 5 min before each exam
├── ExamLuckWorker.kt # personalised "Good luck" notification
├── HolidayReminderScheduler.kt # eve + day-of holiday notifications
└── HolidayReminderWorker.kt
- Everything is local. Your intake code, group selection, notes, class overrides, and personal events live in SharedPreferences on your device. Nothing is uploaded.
- No analytics, no telemetry, no crash reporting.
- Network requests go directly to APU's API endpoints — APLife is a thin client, not a man-in-the-middle.
Will it duplicate events if I sync twice?
No. Every event APLife writes carries a hidden [APLife:TYPE:KEY] marker in its description. On every sync the manager finds the existing event by marker and updates it in place — your room, time, and lecturer changes propagate instead of stacking duplicates.
What if APU hasn't published next week's timetable yet? Days beyond what APU has released show a friendly "Timetable not published yet" card. You can still add personal events; the published classes appear when you re-sync after APU publishes.
Can I sync to Outlook and my Google calendar at the same time? Yes. Tick all the calendars you want in onboarding (or via Settings → Calendars). Every event is written to every selected calendar, deduped per calendar.
Does it work without an internet connection? Reading your loaded schedule, browsing the bundled lecturer directory, and adding personal events / notes work fully offline. Refreshing the timetable, exams, shuttle and department hours needs network.
Does APLife send my data anywhere? No. Everything stays in SharedPreferences on your device. No analytics, no telemetry, no account.
How do I uninstall cleanly? Open Settings → Remove all APLife events to wipe APLife-tagged events from your calendars, then uninstall the app normally.
- Today widget for the home screen
- iCal
.icsexport for sharing your schedule outside Android - Per-module colour theming — pick a colour per course
- Voice notes (the
RECORD_AUDIOpermission is already plumbed) - More holiday greetings — open a PR with your favourite!
Issues and pull requests are welcome. A few places where contributions would be especially nice:
- More holiday greetings / additional Malaysian holidays
- A Today widget for the home screen
- iCal export
- Per-class colour theming
Please keep the no-account, local-first ethos.
MIT — see LICENSE (add one if you haven't).
This project is unofficial. APU and APSpace are trademarks of Asia Pacific University. APLife is not affiliated with, endorsed by, or sponsored by APU.
Lay Yang (DKLY) — www.dkly.net
Project page: https://www.dkly.net/projects/8 Latest release: https://github.com/osscv/APLife/releases/tag/V1.0
Built for fellow APU students because looking up your timetable shouldn't take three taps and a captcha.













