CP Reminder 2.0 is an Android app that does two things for competitive programmers: it rings a real alarm, not a quiet notification, 30 minutes before every upcoming Codeforces contest, and every night at 10:30 PM it checks your Codeforces account and wakes you up if you have not submitted a single problem that day. Ganesh Karthik, a competitive programmer at IIIT Jabalpur, built it for personal use, and the part that took the real work was not the Codeforces API but getting Android to fire an alarm reliably while the app is closed.
- Enter your Codeforces handle once and the app shows your live rating, max rating and rank, with the rank coloured the way Codeforces colours it.
- A background job fetches upcoming contests and schedules an exact alarm 30 minutes before each start time.
- A nightly "streak guardian" checks your submissions at 10:30 PM and rings if the count for today is zero.
- The hardest part was Android background execution, solved with WorkManager, exact alarms and a foreground service.
What does CP Reminder 2.0 do?
"CP Reminder 2.0 is an Android app that reminds me 30 minutes before Codeforces contests and checks at 10:30 PM whether I've solved a problem that day, with an alarm if I haven't," Ganesh told us. The home screen is deliberately small: type your Codeforces handle, and a card shows your handle, current rating, max rating and rank, with the rank text changing colour the way it does on Codeforces itself, green for Pupil, blue for Expert, red for Grandmaster. Below it sit two switches, "Contest Alarms (30m before)" and "Daily Streak Check", and that is the whole interface.
RelatedThis Student Built a Media Server That Never Touches Your Data Plan
Why build an alarm instead of using a calendar?
"I built it because I wanted a simple way to stay consistent with competitive programming and not miss Codeforces contests," Ganesh said. Anyone who has tried to climb a Codeforces rating knows the two ways it goes wrong. Contests are announced with start times that shift around, often late in the evening in Asian time zones, and it is easy to remember one ten minutes after registration closes. And consistency, the thing that actually moves a rating, dies quietly: you skip one day, then three. A calendar reminder is a polite notification you swipe away. Ganesh wanted something you cannot sleep through.
So the contest alarm uses the phone's actual alarm sound, played with Android's alarm audio usage so it is loud even when the ringer is low, and the streak check is framed as a guard rather than a nudge. If you have already submitted something that day, the app stays silent and lets you sleep. If not, it rings with a message addressed to your handle telling you that you have not solved anything today.
What was the hardest part to build?
"The hardest part was working with Android background tasks and notifications/alarms reliably while making sure the app could run without me having to keep it open," Ganesh said. That is the right thing to have found hard, because modern Android is designed to stop exactly this kind of app. Battery optimisations defer background work, Doze mode delays timers while the phone is idle, and recent versions restrict which apps may schedule exact alarms or start foreground services at all.
The app answers each restriction with the matching tool. A WorkManager periodic job syncs the contest list in the background, filters it down to contests still in Codeforces' "BEFORE" phase, and schedules each alarm with setExactAndAllowWhileIdle, using the contest ID as the request code so the same contest is never scheduled twice. It declares the SCHEDULE_EXACT_ALARM permission so the alarm lands on the right minute. When an alarm fires, a foreground service of the media-playback type plays the sound, which is what keeps it ringing on Android 14, and a high-priority heads-up notification carries a STOP ALARM button. The README also mentions a "zombie check", logic that stops a stale alarm from going off by mistake after the phone or the app restarts.
| Trait | CP Reminder 2.0 | Calendar reminder |
|---|---|---|
| Contest times | Pulled from the Codeforces API automatically | Typed in by hand |
| How it alerts you | Full alarm sound until you stop it | A notification you can swipe away |
| Knows your activity | Yes, checks today's submissions | No |
| Works with the app closed | Yes, WorkManager + exact alarms | Yes |
How is it built?
The app is written in Kotlin with Jetpack Compose and Material 3 for the interface. Retrofit and Gson talk to the public Codeforces API, coroutines and Flow handle the asynchronous work, DataStore Preferences stores your handle and the two toggles, and BroadcastReceivers plus the foreground service handle alarms and the stop action. It asks for four permissions and explains each one in the README: internet access for contest data, notifications for the alarm pop-up, the foreground service to keep the sound playing, and exact alarms so it rings on the right minute. The repository was started in January 2026 and last updated in August.
RelatedThis Uruguayan Student Built an App to Find Your Study Group
One detail worth knowing if you use it: the nightly check counts any submission made since midnight on your phone's clock, accepted or not. For a streak habit, that is arguably the right rule, because the point is to sit down and attempt a problem, not to guarantee it passes.
Our take
CP Reminder 2.0 is a small app, and that is its strength. It solves one annoying, specific problem for a specific community, and it does it by understanding the platform it runs on: WorkManager for sync, exact alarms for timing, a foreground service so Android 14 does not kill the sound, and de-duplication by contest ID. Plenty of developers far more senior than a student still ship reminder apps that silently stop working after a phone reboot. This one was built by someone who clearly got bitten by a missed contest and decided it would not happen twice.
CP Reminder 2.0 was built by Ganesh Karthik, a student at IIIT Jabalpur. The code is open: GitHub.
- Built something? Doesn't need to be finished or fancy: a side project, a hackathon build, or a class project you're proud of counts.
- Email hello@genztech.blog with what you built, why you built it, a link, and your name plus college.
- See every spotlight so far at genztech.blog/campus-radar.
- InterviewGanesh Karthik email answers to GenZTech, September 2026
- Officialganeshkarthik016/CPReminder2.0 README, screenshots and Kotlin source (ContestWorker, SubmissionWorker)
- ReferenceCodeforces API contest.list and user.status methods
Reporting based on a direct interview with Ganesh Karthik and the public CP Reminder repository. Hero screenshot from the CP Reminder 2.0 repository.
