A single-purpose Android app that gently reminds you to seek forgiveness (استغفار) with a small heads-up notification every 30 minutes.
أستغفر الله — I seek forgiveness from Allah.
Reminders can be easy to ignore. This app does exactly one thing: it sends a small pop-up notification saying Astaghfirullah — أستغفر الله every 30 minutes, and nothing else. No counters, no goals, no history, no navigation. You open it, tap Start, and quietly remember Allah throughout your day.
- 30-minute reminders — a heads-up notification with Astaghfirullah / أستغفر الله (high-importance channel, respects Do Not Disturb).
- Start / Stop toggle — one big button. A pulsing gold ring indicates reminders are active.
- Next reminder time — the status card shows the scheduled time (e.g.
11:30 PM), so you know it's working. - Test Notification — preview the popup immediately instead of waiting 30 minutes.
- Persistent state — reminders stay on after you close the app or restart your phone (WorkManager + DataStore).
- Battery help — an expandable note explaining what to do if a manufacturer's battery optimization delays reminders.
- Light / dark theme — follows the system, using the app's emerald-and-gold Material 3 palette.
- Accessible — every interactive element has a content description for TalkBack.
Single-activity Jetpack Compose app with a clean separation between UI, reminders, and data.
MainActivity ──► ui/MainScreen (Compose UI)
│ │
▼ ▼
MainViewModel ◄── data/Prefs (DataStore: running state, next reminder time)
│
▼
reminders/ReminderScheduler ──► WorkManager (PeriodicWorkRequest, 30 min)
│
▼
reminders/ReminderWorker ──► reminders/NotificationHelper (heads-up notification)
│
▼
receiver/BootReceiver ──► reschedules after device reboot
- WorkManager schedules the periodic work. It is battery-friendly and does not bypass Do Not Disturb. It is intentionally not an exact alarm — a reminder arriving at 30–35 minutes is acceptable and keeps the app Play-Store friendly.
- DataStore Preferences persists the ON/OFF state and the next-reminder display target, so reopening the app shows the real status instead of resetting.
- The Worker updates the next-reminder time after each successful run, so the UI never drifts from what Android actually scheduled.
Astaghfirullah/
├── README.md
├── LICENSE
├── PRIVACY_POLICY.md
├── settings.gradle.kts
├── build.gradle.kts
├── gradle.properties
├── gradlew / gradlew.bat
└── gradle/wrapper/
└── app/
├── build.gradle.kts
├── proguard-rules.pro
└── src/main/
├── AndroidManifest.xml
├── java/com/astaghfirullah/reminder/
│ ├── MainActivity.kt # Activity + permission flow
│ ├── AppConfig.kt # single source of truth for config/constants
│ ├── ui/
│ │ ├── MainScreen.kt # the single screen
│ │ ├── components/ # reusable UI pieces
│ │ └── theme/ # Material 3 colors/typography/theme
│ ├── viewmodel/
│ │ └── MainViewModel.kt # state + scheduler wiring
│ ├── reminders/
│ │ ├── ReminderInterval.kt # configurable interval enum
│ │ ├── ReminderScheduler.kt # schedule/cancel periodic work
│ │ ├── ReminderWorker.kt # triggers the reminder
│ │ └── NotificationHelper.kt # channel + notification builder
│ ├── data/
│ │ └── Prefs.kt # DataStore persistence
│ └── receiver/
│ └── BootReceiver.kt # reschedule after reboot
└── res/ # fonts, icons, adaptive launcher icon
- Android Studio (Ladybug or newer) with the Android SDK
- JDK 17 (bundled with Android Studio — JBR — is fine)
- SDK:
compileSdk 36,minSdk 26,targetSdk 36 - Gradle 8.11.1 (via the included wrapper)
- Android Gradle Plugin 8.9.1, Kotlin 2.0.21
No Android Studio on the machine? Install it from https://developer.android.com/studio.
- Open Android Studio → Open → select the
Astaghfirullahfolder. - Let Gradle sync finish (it downloads dependencies on first run).
- Connect your phone with USB debugging enabled (or start an emulator).
- Press Run ▶ (Shift+F10) and pick your device.
- Tap Start Reminders and grant the notification permission when prompted.
- Tap Test Notification to confirm the popup appears.
./gradlew assembleReleaseThe APK is written to app/build/outputs/apk/release/app-release.apk. Release builds are minified (R8) with resource shrinking. Sign it with your own keystore before publishing.
v1.0 (current) — 30-minute reminder, start/stop, test notification, light/dark theme, persisted state.
- v1.1 — Choose interval (15, 30, 60, 90, 120 minutes).
- v1.2 — Multiple remembrance phrases (Astaghfirullah, SubhanAllah, Alhamdulillah, Allahu Akbar, La ilaha illa Allah).
- v1.3 — Quiet hours (e.g. no reminders between 11 PM and 6 AM).
- v1.4 — Optional tasbeeh counter.
- v2.0 — Widgets, Wear OS, custom schedules, backup/sync, dynamic (Material You) colors.
MIT — see LICENSE.