An Android app that turns a photo of a mosque prayer timetable into a live, organised prayer schedule with a real-time countdown to the next prayer.
Mosque prayer timetables are typically distributed as a printed image covering the entire month — a grid of rows and columns that can get tedious trying to locate a single prayer time. Different mosques also run different timings, so anyone tracking more than one has to juggle multiple sheets. SalahScan extracts every prayer time, stores it locally, and narrows the display down to just today's schedule with a live countdown to the next prayer. Import as many timetables as needed and switch between them seamlessly.
Extraction is handled by the SalahScan Backend — see repo for the AI extraction and structured output implementation.
This is currently a beta build shared for testing — not yet published to the Play Store. Enable "Install unknown apps" for your file manager/browser to install the APK directly.
- Import an image of your prayer timetable
- Today's prayer times displayed automatically, with the current prayer highlighted
- Live countdown to the next prayer, ticking every second
- Swipe between multiple imported timetables, with a position indicator
- Sunrise, Zawal, and Jumu'ah times shown alongside the five daily prayers
- Rename or delete an imported timetable at any time
- Accurate Hijri date (Umm al-Qura calendar) alongside the Gregorian date
- Outdated timetables are automatically cleared once their month has passed
| Layer | Technology |
|---|---|
| Language | Java |
| Local storage | Room (SQLite) |
| Networking | Retrofit + OkHttp |
| UI | ViewPager2, CardView, custom views |
| Backend | SalahScan Backend |
Offline-first after import. Once a timetable is imported, everything — display, countdown, prayer highlighting — runs entirely from the local Room database. No network calls happen outside the import flow itself.
No secrets on-device. The app authenticates to the backend with a shared secret baked in at build time, which only grants access to the extraction endpoint — the Gemini API key itself never leaves the backend.
Deterministic extraction. The backend uses schema-constrained AI output and deterministic generation settings rather than relying on prompt instructions alone — reducing (though not eliminating) the risk of inconsistent or malformed responses from a single photo.
salahscan-android/
├── app/src/main/java/com/saran/prayertimetable/
│ ├── data/
│ │ ├── local/
│ │ │ ├── AppDatabase.java # Room database + migrations
│ │ │ ├── TimetableEntity.java # one imported timetable
│ │ │ ├── PrayerDayEntity.java # one day's prayer times
│ │ │ └── TimetableDao.java # database queries
│ │ └── remote/
│ │ ├── ApiClient.java # Retrofit/OkHttp setup
│ │ ├── ApiService.java # backend API definition
│ │ └── PrayerDayResponse.java # backend response shape
│ ├── ui/
│ │ ├── MainActivity.java # countdown, swipeable timetables
│ │ ├── ImportActivity.java # add timetable screen
│ │ └── TimetableAdapter.java # swipeable page rendering
│ └── utils/
│ └── DateUtils.java
└── app/src/main/res/ # layouts, drawables, themes, fonts