Projects

Rafiq — Islamic Companion App

2026·14 min read

React Native
Expo
TypeScript
NativeWind
Zustand
App Store (opens in a new tab)Google Play (opens in a new tab)

Rafiq (رفيق, "companion") is a private, offline-first Islamic companion app: prayer times, a prayer tracker, an offline Qur'an with 42 reciters, a khatma planner, a 16-collection audio library plus live Qur'an radio, adhkar, tasbih, du'as, a zakat calculator, shareable image and greeting cards, a Hijri calendar, qibla, and home-screen widgets on Android and iPhone. It has no ads, no accounts, and…

Rafiq — Islamic Companion App preview
On this page6 sections
  • Download
  • Screens
  • Why Rafiq
  • Features
  • Tech stack
  • Non-negotiables

Rafiq (رفيق, "companion") is a private, offline-first Islamic companion app: prayer times, a prayer tracker, an offline Qur'an with 42 reciters, a khatma planner, a 16-collection audio library plus live Qur'an radio, adhkar, tasbih, du'as, a zakat calculator, shareable image and greeting cards, a Hijri calendar, qibla, and home-screen widgets on Android and iPhone. It has 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 (iPhone, iPad and Mac, with wide-window layouts). Arabic and English, free, no ads, no accounts, no third-party tracking. Current release: 1.90.0.

One link that sends each phone to its own store: the install page, or تحميل تطبيق رفيق بالعربي in Arabic. It is what the QR code on every share card opens.

In Arabic, a page for each reciter and each feature: القرآن الكريم بصوت ٤٢ قارئًا · مشاري العفاسي · عبد الباسط عبد الصمد · مواقيت الصلاة والأذان · اتجاه القبلة · أذكار الصباح والمساء · كل مزايا رفيق.

Screens#

A tour of Rafiq as it ships on the App Store and Google Play. Ten screens, each with the one card that matters lifted out.

Every prayer, right on time
Prayer times
The whole mushaf, even offline
Qur'an
Reciters and lectures, right where you left off
Listen
Face the qibla, by compass or sun
Qibla
Morning and evening adhkar, every day
Adhkar
A tasbih that counts with you
Tasbih
The Hijri calendar, every blessed day
Hijri calendar
The lives of the Companions
Companions
Umrah and Hajj, step by step
Umrah & Hajj
The 99 Names, and what they mean
The 99 Names

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 adhan library) 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, the streamed audio-library collections and the Qur'an radio stations.
  • 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. 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 the app keeps shipping 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 adhan library, fully offline. The Aladhan API refines and 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; Western digits for times and counts, Arabic-Indic inside the mushaf and the adhkar
  • 9 calculation methods and an Asr school toggle (Shafiʿi / Hanafi); the method and school are picked automatically from each country's own authority
  • Offline-resilient: TanStack Query cache persisted to MMKV (30-day window)
  • A verse of the day on Home, and a More tools sheet that holds every tool, searchable in either language, with the ones you opened last; the zakat calculator lives there, works offline, and no amount ever reaches analytics

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
  • Make-up prayers (qaḍāʾ) and a streak share card; finished adhkar sessions and pages read tick the tracker by themselves
  • A separate day streak that any completed act can light, kept by one reminder at 9 pm and marked at a week, a month and a hundred days
  • 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 and per-prayer reminders, Fajr as an alarm, a Fajr adhan, the du'a after the adhan, and your own adhan file (imported on iPhone too); an optional pre-adhan reminder (5 / 10 / 15 / 20 min before)
  • «صلّيت» from the notification logs the prayer without opening the app; a Test the adhan button; silence the phone during prayer (Android)
  • iPhone adhan: the whole call plays, and Wake me rings the prayer as a system alarm through AlarmKit
  • Opt-in Ḍuḥā, last third of the night and sleep adhkār reminders, each timed from that day's Aladhan timings
  • 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, and a duplicate-delivery gate suppresses the same occasion arriving twice
  • Diff-based scheduler over a 14-day horizon (60-item iOS cap, 480 on Android); a reminder delivered early is never armed a second time; 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, with the tashkīl tinted red over the unchanged page
  • 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-audio with 42 reciters (default: al-Husary), gapless across verses and surahs; two reciters (Saʿūd Āl Jumʿa, Aḥmad bin Ṭālib bin Ḥumayd) play whole-surah files with ayah timings derived from the recording by a script
  • Repeat each ayah; search by verse reference, page or juz
  • 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

Khatma, wird & personal features

  • Khatma planner: pick a pace from a week to a year; see pages a day and the end date up front, and a missed day is spread over the days left. A portion after each prayer, a Ramadan pace, and a khatma widget
  • Daily wird built from adhkar, surahs, tasbih and du'as (or a template); finishing an item ticks it, and a streak counts the days the list was finished
  • Reflections on any ayah, grouped by theme, and ḥifẓ revision: recite from memory, rate it, and the next review date follows from the rating
  • My du'as: write your own, or start from the built-in collection (137 du'ās), and attach the names you want to remember
  • Everything stays on the device; the single-file backup can be passphrase-protected and restored on another phone
  • Search over verses, surahs, tools and screens by name

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, so no media session is opened until something actually plays
  • Bookmarks + history surfaced together in a unified Saved hub alongside Qur'an bookmarks
  • The tab opens on a resume card for the last thing played, then a grid of speaker portraits; each speaker's page opens on a full-bleed portrait
  • Qur'an radio: a manifest of 175 live stations (173 https, 2 cleartext behind a domain-scoped Android exemption), searchable, with pinned favourites; pnpm radio:check walks every redirect hop so a dead station can't hide

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 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
  • Learning: الصحابة (40 Companions, every virtue a verified hadith), the prophets' stories with hadith chapters, a ʿUmrah and Ḥajj guide, فضائل الأعمال as a reading list, and short learning journeys with a source for every claim

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), plus card shapes, metals and a one-tap design; an embedded QR to the install link survives re-forwarding. The verse of the day shares straight from Home
  • Greeting cards for Jumuʿah, the two Eids, Ramadan, the last ten nights, ʿAshura, Arafah, the Hijri new year, Hajj, condolences, and more, with 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; the needle settles at 3, 8 and 20 seconds and then holds while the phone is still, with a Kaaba socket and facing ring
  • An interference warning (field strength and spread at rest), a sun check against the published "sun over the Kaaba" moments, and a map where the qibla is a straight line from you
  • Seven Android home-screen widgets via react-native-android-widget: Salawat, Next Prayer (live countdown), daily Counter, a switchable Combo, du'a of the day, verse of the day and the khatma, running offline from MMKV, with one screen listing each and how to add it
  • iPhone widgets (SwiftUI WidgetKit targets): next prayer, counter, salawat, du'a, verse of the day and khatma
  • Center-hub bottom bar: 3 tabs ∣ a live next-prayer SVG dial ∣ 3 tabs, native-RTL aware, with glyphs that say what the tab is (a Kaaba, a crescent, beads on a thread); on wide windows a docked tab bar and two-column screens
  • 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)
  • Pages slide in the reading direction or fade natively, and card switches share the daily du'ā's dissolve
  • prefers-reduced-motion respected 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), a once-only nudge on iPhone when a newer App Store version exists, + EAS Update OTA that applies behind the splash on launch (never mid-session)
  • Privacy-safe analytics: PostHog + EAS Observe fan-out with error tracking and native-crash symbolication (NDK and MetricKit frames); 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 7, 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 (Android) · SwiftUI WidgetKit via @bacons/apple-targets (iPhone)
Native modules local adhan-player, exact-alarm, media-saver
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; the radio stations stream from their own hosts. 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, so every change must respect them:

  • No ads, no accounts, no third-party tracking. Network is limited to Aladhan, alquran.cloud (translations, tafsir + audio), the audio-library sources (archive.org + podcast RSS) and the radio stations. 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 ar mode, 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.

Writing about this project

  • HSTS preload on Vercel: why the apex redirect ignored my header
  • Why a CSS rotate with will-change: transform makes images and text blurry

More projects

  • Masareef — Personal Spending Tracker2026 · React Native
  • Khazna — Pocket Vault: Links, Notes & Lists2026 · React Native
  • Nafis — Multi-Asset Price & Portfolio2026 · React Native
All projects
  • Download
  • Screens
  • Why Rafiq
  • Features
  • Tech stack
  • Non-negotiables