Back to all projects

In closed testing on Google Play

Hayya حيّ

An offline prayer times, adhan and Qibla app for Android, in English and Arabic. No accounts, no ads, no analytics and no prayer-time API.

Hayya home screen with the next prayer and a countdown
Hayya Qibla compass
Hayya prayer tracker with a streak and heatmap
Automated tests
900+
NOAA reference values matched
100/100
Largest text size tested
2.0×
Internet permission in release
None

Engineering

Problems I solved

A Qibla compass that points to true north

Android compasses report magnetic north, but the Qibla bearing is measured from true north. The gap is about 4.8° in Cairo and 12.5° in New York, enough to point someone the wrong way.

I implemented the World Magnetic Model (WMM2025) in Dart to add the local declination, and tested it against all 100 of NOAA's official test values. iOS already reports true north, so every compass reading carries which north it uses and is never corrected twice.

Qibla compass showing Facing the Qibla, 136° from true north

An adhan that still plays when nobody opens the app

The adhan plays on Android's alarm stream, so it's heard even with notification volume low, and scheduled alarms are restored after a reboot or app update.

For people who rarely open the app, a daily WorkManager task tops up the schedule in a headless isolate. It reuses the app's own scheduler instead of a second copy, and never asks for location or the network in the background.

Hayya home screen in dark mode, with the next prayer and a countdown

Arabic and large text, enforced by tests

Every layout uses directional widgets and every string and number is localized, including Arabic-Indic numerals and Hijri dates.

A text-scale matrix of 320 tests renders every screen at 1.0× to 2.0× text, in both languages, on five screen sizes, and fails on overflow, clipped text or words broken mid-word.

Hayya home screen in Arabic, laid out right to left

How it's built

Feature-first clean architecture: each feature has its own data, domain and presentation layers. State lives in Cubits, dependencies are wired with get_it and routing uses go_router.

  • Flutter
  • Bloc (Cubit)
  • get_it
  • go_router
  • Hive
  • adhan
  • WorkManager
  • flutter_compass
  • geolocator
  • easy_localization
  • hijri
See all projects

Let's build something

I'm open to junior Flutter and mobile developer roles and internships. If you're hiring or want to talk about an app, my inbox is open.