Rafiq (رفيق, "companion") is a private, offline-first Islamic companion app — prayer times, a prayer tracker, an offline Qur'an, a 16-collection audio library, adhkar, tasbih, du'as, shareable image and greeting cards, a Hijri calendar, qibla, and Android home-screen widgets — with no ads, no accounts, and no third-party tracking. Built with Expo SDK 57, React Native 0.86, and TypeScript.
Rafiq (رفيق) means companion — the kind that walks with you quietly, asks for nothing, and is there when you need it. That's the goal of this app.
Download#
Rafiq is live on Google Play and on the App Store — Arabic & English, free, no ads, no accounts, no third-party tracking.
One link that sends each phone to its own store: the install page. It is what the QR code on every share card opens.
Screens#
Sixteen real device captures — every part of the app, in the default dark "night" theme (a warm cream mushaf paper light theme ships alongside it).
















Why Rafiq#
Most Islamic apps ship with banner ads, request notification permission on launch, and ping analytics for every tap. Rafiq doesn't. No ads, no accounts, no personal or location data ever leaves the device — the only data on it is your own settings.
- Works without a connection — prayer times are computed on-device (the
adhanlibrary) with the Aladhan API as an optional refinement, the full Qur'an Arabic text is bundled in SQLite, and adhkar / du'as / greetings are vetted local JSON copies. The only network calls are the optional Qur'an translation, tafsir and per-ayah audio, and the streamed audio-library collections. - Private by default — your coordinates stay on the device to compute prayer times; nothing identifying ever leaves it. Raw GPS coordinates are never even shown on screen.
- Arabic-first, RTL-correct — Arabic is the default language with full RTL layout and Arabic-Indic digits. English is a first-class second.
- Beautiful by intent — a dark "night" theme by default and a warm cream mushaf paper light theme. Real Arabic typography (QCF Madani fonts + Amiri for scripture, Cairo for UI), not system fallbacks. A custom center-hub bottom bar with a live next-prayer dial.
Features#
Every planned phase is shipped and live on both the App Store and the Google Play production track. The app is a 7-tab center-hub experience: prayers · audio · adhkar · Qur'an · calendar · qibla · settings.
Prayer times
- Five daily prayers with a next-prayer highlight and live per-second countdown
- On-device computation via the
adhanlibrary — fully offline; the Aladhan API refines/confirms when online - Current-prayer pulse on the most recently passed prayer; status badges + reminder bells per row
- Location-based (GPS + reverse-geocode) or validated city search; raw coordinates never shown
- Hijri date; Arabic-Indic digits throughout
armode - 9 calculation methods (default: Egyptian) + Asr school toggle (Shafiʿi / Hanafi)
- Offline-resilient: TanStack Query cache persisted to MMKV (30-day window)
Prayer tracker
- Log every prayer with three states — on time / late / missed — by tapping the same row again
- Day streak + best streak, a "kept today" tally, and a perfect-day state
- Monthly record grid with swipeable months, so a whole month reads at a glance
- Extra deeds per day — qiyām, witr, duḥā, fasting, morning/evening adhkar, a Qur'an portion
- A free-text note per day; everything persisted locally to MMKV
Hijri calendar
- Dual Hijri / Gregorian month grid with swipeable navigation and an upcoming-events strip
- Per-day detail screen with the day's prayer times and any Islamic events (20 occasion types)
- System toggle for the primary calendar + per-user Hijri offset for moon-sighting differences
- Fasting reminders — opt into individual fast days, each with its own pre-dawn notification
Notifications
- Local adhan notifications scheduled from a cached monthly Aladhan calendar (14-day horizon)
- Per-prayer toggle (5 prayers) + optional pre-adhan reminder (5 / 10 / 15 / 20 min before)
- Salawat reminders — gentle, random-feeling but deterministic reminders to send prayers on the Prophet ﷺ, with a configurable daily window
- Daily du'a + fasting reminders; exact alarms (
USE_EXACT_ALARM) so they fire on the minute - Android 16-safe grouping — a stale unread notification can no longer mute the next one
- Diff-based scheduler (60-item iOS cap, 150 on Android); tap a notification → Home
- Permission flow with an "open system settings" fallback; uses the default OS sound
Qur'an reader
- 114-surah landing with live search → reader
- Bundled offline — the full Uthmani Arabic text ships in SQLite (
assets/quran.db), so surahs open instantly with no network - Mushaf mode (default) — authentic Madani page layout using QCF V1 per-page fonts, a cross-surah 604-page swipeable pager
- Verse-by-verse reader as the alternative mode (Amiri scripture, never truncated)
- Translation toggle, 5 editions (Itani's Clear Quran, Sahih International, Asad, Pickthall, Yusuf Ali), plus tafsir on demand — the only network-fetched parts
- Per-ayah audio via
expo-audiowith 40 reciters (default: al-Banna) - Global mini-player, lock-screen / background playback, auto-advance, auto-scroll, word-tap audio with a moving highlight
- Long-press a verse for the ayah actions sheet; last-read auto-resume + a bookmarks strip on the Qur'an tab
Audio library
- A dedicated Audio tab with 16 curated collections of lectures, khutbahs, and tilāwa — Mostafa Mahmoud, Sha'rawy, Kishk, Al-Nabulsi, Omar Abdel-Kafi, Ahmed Al-Shugairi, Yasir Al-Huzaimi, Mustafa Ismail, Sayed Al-Naqshbandi, and more
- Hundreds of streamed episodes + audiobooks (sourced from archive.org and podcast RSS), each with its own entry types (episodes / books)
- Search across speakers and titles (diacritic-folded, both scripts), a load-on-scroll list, and per-collection rights disclaimers
- A dedicated audio provider with its own mini-player, background / lock-screen playback, listen history, per-item progress and completed-state tracking
- Players are created lazily — no media session is opened until something actually plays
- Bookmarks + history surfaced together in a unified Saved hub alongside Qur'an bookmarks
Adhkar, du'as & tasbih
- 19 categories from Hisn al-Muslim (morning, evening, sleep, waking, after-prayer, wudu, mosque, food, travel, distress, istighfar, du'as, and more situational sets)
- Tap-to-count counter with haptics, a progress ring, and auto-advance
- Per-dhikr recited audio with autoplay through a session, plus explanations and humanized references (ar + en), inline reveal
- Du'as deck — a swipeable deck of 101 thematic du'ās with daily rotation, favorites, and shareable image cards
- Tasbih — guided programs (after-prayer, morning, evening, sleep) that auto-advance step by step, plus free counting; a 10-dhikr library each with a short virtue, a build-your-own program builder, and session + all-time stats
- Asma' al-Husna — the 99 names of Allah, each with its meaning
- Daily reset, per-category progress persisted to MMKV — fully offline
Share cards & greetings
- Turn any verse, dhikr, du'ā, name of Allah, or calendar day into a branded image card — or share it as text
- Three formats per card: portrait (4:5), story (9:16), square (1:1); an embedded QR to the install link survives re-forwarding
- Greeting cards for Jumuʿah, the two Eids, Ramadan, the last ten nights, ʿAshura, Arafah, the Hijri new year, Hajj, condolences, and more — curated authentic greeting + hadith text per occasion (ar + en) with a matching mood palette
- A live composer: pick an occasion, choose a themed background (or a custom hue via a hand-rolled slider), toggle a geometric motif, sign it with a name, and export a high-resolution image
- Share history — everything shared, newest-first, each re-shareable; an image record re-composes the exact card off-screen
Qibla, widgets & polish
- Magnetometer compass dial, great-circle bearing to Mecca, and distance in km; lay-flat / calibrate hints, smooth spring animation
- Four home-screen widgets via
react-native-android-widget— Salawat, Next Prayer (live countdown), daily Counter, and a switchable Combo — all running offline from MMKV - Center-hub bottom bar — 3 tabs ∣ a live next-prayer SVG dial ∣ 3 tabs, native-RTL aware
- A written how-to — one screen listing every invisible gesture (long-press a verse, swipe a month, tap to count), reachable forever from Settings
- Home-screen quick actions — long-press the app icon for shortcuts into Tasbih, Du'ās, and the audio collections (
expo-quick-actions) - Keep-screen-awake while reading Qur'an, counting tasbih, or finding the qibla (
expo-keep-awake) - In-app review prompt — a silent, self-throttled store review ask at a natural moment (
expo-store-review) prefers-reduced-motionrespected across every animation (drift, pulse, completion ring, compass spring, ayah fade-in, mini-player slide)- Accessibility labels for screen readers; an app-wide typography & design-consistency pass
- Islamic geometric ornaments, breathing hero glows, one unified ambient drifting background
- Fast, quiet launch — analytics init deferred off the launch frame + a friendlier in-app error screen
- In-app force-update prompt (Android) + EAS Update OTA that applies behind the splash on launch (never mid-session)
- Privacy-safe analytics — PostHog + EAS Observe fan-out with error tracking; never any personal or location data
Tech stack#
| Layer | Choice |
|---|---|
| Framework | Expo SDK 57 (managed) + Expo Router (file-based routing) |
| Runtime | React Native 0.86 / React 19.2, React Compiler enabled |
| Language | TypeScript, strict mode |
| UI | NativeWind 4 + react-native-reusables (shadcn philosophy for RN) |
| Animation | react-native-reanimated 4 (with prefers-reduced-motion respected) |
| Server state | TanStack Query + persistence to MMKV (offline cache) |
| Client state | Zustand + react-native-mmkv v4 (Nitro module) |
| Bundled Qur'an | expo-sqlite (full Uthmani text in assets/quran.db) |
| Prayer math | adhan (on-device computation, offline) |
| Audio | expo-audio (background + lock-screen, lazy players) |
| Location | expo-location (with reverse-geocoding) |
| Sensors | expo-sensors (magnetometer for qibla) |
| Notifications | expo-notifications (USE_EXACT_ALARM, built from source) |
| Widgets | react-native-android-widget (home-screen widgets) |
| Capture | react-native-view-shot + expo-sharing + react-native-qrcode-svg |
| Updates | expo-updates (OTA, applied behind splash) + expo-in-app-updates (Play force-update) |
| Native polish | expo-quick-actions · expo-keep-awake · expo-store-review |
| Analytics | PostHog + EAS Observe fan-out (privacy-safe, error tracking) |
| Fonts | QCF V1 Madani + Amiri (scripture) + Cairo (UI) via @expo-google-fonts |
| Icons | lucide-react-native |
Data sources (no API key, no auth): the Qur'an Arabic text is bundled offline (assets/quran.db); prayer times are computed on-device (adhan) with Aladhan refining + supplying the monthly calendar; alquran.cloud supplies Qur'an translations, tafsir + per-ayah audio; the audio-library collections stream from archive.org + podcast RSS feeds. Adhkar, du'as, and greetings are vetted local JSON bundles (Hisn al-Muslim and curated occasion text) — never fetched.
Non-negotiables#
These are load-bearing — every change must respect them:
- No ads, no accounts, no third-party tracking. Network is limited to Aladhan, alquran.cloud (translations, tafsir + audio), and the audio-library sources (archive.org + podcast RSS). Analytics carry no personal or location data.
- Offline-first. Prayer times compute on-device; Qur'an Arabic text + adhkar + du'as + greetings are bundled and fully offline.
- Arabic-first, RTL-correct. Arabic-Indic digits in
armode — never raw API numbers. - Never truncate ayahs or adhkar. Qur'an ayah-by-ayah, full text. Adhkar dataset is a vetted local copy.
- Raw GPS coordinates never shown. A location label guard keeps coordinates off-screen and never stores them as labels.
- Every screen scrolls. Content is never truncated by a small viewport.

