ClassPing: Offline Class Timetable & Reminder App for UMT MS/PhD Students, Built in Flutter

Duration
Design, build & App Store launch (October 2026)
Year
2026
My Role
Founder, designer and sole engineer: product design, the Flutter app, timetable import, the reminder scheduler, the product and legal pages, the App Store listing and launch
At a glance
- data collected
- 0
- rolling reminder window
- 60
- automated tests
- ~40
- live on the App Store
- Nov 2026
Technologies Used
The Challenge
The MS and PhD timetable at UMT's School of Systems and Technology is published as one Excel workbook covering every program, section, instructor and room. Students have to find their own sections in it, copy the dates into a calendar by hand and keep track of when each class meets. Readings and assignments end up in a different app again. I wanted one small app that shows only the classes you attend, reminds you before each one and holds your tasks, without asking for an account or sending anyone's schedule to a server.
The Solution
What's in the app
- Pick your sections. Browse the Fall 2026 MS and PhD timetable with room numbers and search by course name, code, section, instructor or room. Every section is listed separately, so students choose exactly the ones they attend.
- See what's next. A countdown to the next class, and My classes as a list or a month calendar, colour-coded by course.
- Class reminders. 15 minutes, 1 hour or 1 day before each class, scheduled on the phone so they arrive without internet.
- Tasks and readings. To-dos, readings and assignments with an optional description and their own reminder, with quick choices such as "In 1 hour", "This evening" or "Tomorrow, 9 AM". Task reminders work even when class reminders are off.
- New semester, no update needed. Import the department's timetable from an Excel (.xlsx) file once. It replaces the bundled timetable and stays on the phone until the next import. Tasks are kept.
Reminders under iOS's 64-notification limit
A student with four courses meeting twice a week has well over 64 classes in a semester, and iOS keeps only 64 pending local notifications per app, silently dropping the rest. ClassPing plans every upcoming reminder with a pure function, sorts them by time and schedules only the soonest 60. It rebuilds that window whenever the app opens or a setting changes. Each reminder's ID is an FNV-1a hash of the class and the date, so replacing the schedule never duplicates a class, and replacements run through a serial queue so a slow, stale run can't re-add a course that was just removed.
Android details that are easy to miss
- Inexact alarms. Exact-alarm permissions are denied by default on Android 14 and restricted on Google Play, and a reminder before class doesn't need to fire to the second.
inexactAllowWhileIdlestill fires in Doze with no special permission. - Reboots. Android clears scheduled alarms on restart, so the boot receiver is declared and reminders come back after a reboot.
- Permission in context. The notification permission is requested when a student turns reminders on, not at launch.
Time zones
Reminder times are scheduled in the device's time zone. Some devices report a zone name the timezone database doesn't know. In that case the app falls back to Asia/Karachi, since the timetable itself is in Pakistan time, rather than shifting every reminder by hours.
Private by design
There is no sign-in, no backend, no analytics, no ads and no crash reporting. Selected classes, tasks, reminder settings and any imported timetable live only on the phone. The only permissions are notifications, starting at boot on Android, and the single file a student picks to import. The App Store privacy label reads "Data Not Collected", and the privacy policy says exactly the same thing.
Launch work
- An honest unofficial-app disclaimer. The app, the listing and every page state that ClassPing is built independently by a student and is not affiliated with or endorsed by UMT, and that class dates should be confirmed with official announcements.
- Product, privacy, terms and support pages on this site, live before submission, with an FAQ for the questions students actually ask: reminders that don't arrive, loading a new semester and deleting data.
Decisions & Trade-offs
- No backend at all. The timetable ships inside the app and new semesters come from an Excel import, so there is nothing to host, secure or pay for, and no student data to protect.
- A rolling window instead of background fetch. Refilling the 60-reminder window each time the app opens is simple and reliable. The trade-off is that someone who never opens the app for weeks eventually runs out of reminders, which the support page says plainly.
- Data-derived notification IDs. Hashing the class and date means the same reminder always has the same ID, so "replace the schedule" really replaces it.
- Inexact alarms on Android. Fewer permissions and no Play policy risk, at the cost of a reminder sometimes arriving a few minutes late.
- Import replaces, tasks stay. Loading a new timetable clears class selections and their reminders, so students pick their sections again, but keeps every task they have written.
Results
- Live on the App Store as "ClassPing: Class Timetable" (Education, free, rated 4+, iOS 15.5+). The Android version is coming to Google Play.
- No account, no ads and no tracking, with a "Data Not Collected" privacy label.
- About 40 automated tests, most of them on the pure planning code that turns the timetable into reminders, kept separate from the notification plugin so it runs without a device.
Next Steps
Impact
I built ClassPing as a UMT student, for the students around me. It is deliberately small: no account, no server, nothing to keep running. The work went into the parts that don't show, like reminders that keep arriving all semester on a platform that only allows 64 at a time.
