Iqra
LiveA Qur'an companion on three platforms, from one codebase
The complete Qur'an with nine reciters, memorisation tools, offline prayer times, Qibla, and 116 adhkar — fully bilingual, with no accounts, no ads and no tracking. iOS, Android and web ship from the same React Native codebase.
- 3
- platforms from one codebase, web included
- 0
- accounts, analytics or trackers
- 114
- surahs, with 9 reciters and offline audio
- Role
- Sole engineer — iOS, Android and web, from one React Native codebase
- Stack
- React NativeExpoReact Native WebTypeScriptArabic / RTLOffline audioLocal notifications




The constraint that shaped everything
The app collects nothing. There are no accounts, no analytics and no tracking, and bookmarks, notes, reading history and location never leave the device. It reaches the network for two things only: streaming recitation audio, and updates.
That is a product promise, but it is really an architectural decision, and it is load-bearing. Without a server there is no user table, no session handling, no consent banner, no data-retention policy and no breach surface — but also nowhere to put anything. Every feature has to work locally, which rules out the shortcut most apps in this category take: compute it on a backend and send down JSON.
Arabic first, not Arabic added
Most bilingual apps are an English app with a translation file. This one carries the full Uthmani text, so the Arabic is the content rather than a localisation of it, and the interface mirrors completely in Arabic — layout, navigation, gestures and Arabic-Indic numerals, not just the direction text runs.
Qur'anic typography is unforgiving in a way ordinary Arabic is not. Ayah markers, diacritics that must not collide, and script that has to stay faithful at every size — while a reader is pinching to zoom — is a different problem from setting a paragraph, and it is the reason mushaf page mode exists as a separate reading mode rather than a stylesheet.
Mushaf mode reproduces the printed page: the same page breaks a reader knows, Juz labels, pinch to zoom, and long-press on any ayah to play it, bookmark it, share it or open its tafsir. Reflowing the text would have been easier and would have broken the thing that lets someone who has memorised a page find it by position.
One codebase, three platforms — including the web
iOS, Android and the web build from the same React Native codebase. Shipping the web through React Native Web rather than writing a separate site is the unusual decision here, and it was made for maintenance: a Qur'an app is mostly content, gestures and audio, and keeping one implementation of verse selection, playback and RTL layout means a fix lands everywhere at once.
The cost is real. Web-specific behaviour — document scrolling, deep links, text selection — has to be handled inside a component model that was designed for native, and the web bundle carries React Native Web with it. That trade was worth taking for an app whose web surface is a companion rather than the main event.
Audio, and the timing problem underneath it
Nine reciters, verse-by-verse or continuous playback, with highlighting that follows the recitation live. Highlighting is the part that looks trivial and is not: it needs per-verse timing for every reciter, playback that survives backgrounding, and a queue that keeps position when a surah is played end to end.
Any surah can be downloaded for fully offline listening, which means managing a real audio cache — what is downloaded, for which reciter, and what happens when storage runs short — rather than assuming the network is there.
Memorisation mode is built on the same machinery: repeat a verse between one and five times or endlessly, loop a verse range from A to B, insert a pause between repetitions, and hide the text so the reader can test themselves and tap to reveal. Those are the actual mechanics of hifz, and they only work if the audio engine can be driven precisely.
Prayer times without a server
Prayer times are calculated on the device from the user's location — astronomy rather than an API call. That brings in every calculation method people actually follow (Umm al-Qura, Muslim World League, Egyptian, Karachi, ISNA and others), madhab selection for Asr, high-latitude rules for places where the sun does not behave, and manual adjustment for a local mosque that differs by a minute.
Adhan notifications are scheduled locally with per-prayer control, and the Qibla compass reads the device heading and shows live bearing and distance to Makkah. None of it asks permission to know where someone is beyond the device itself.
The rest of the daily habit
116 authentic adhkar across 17 collections — morning, evening, after prayer, sleep, travel — with source references, full Arabic, transliteration and translation, and nothing truncated to fit a card. A tap counter with auto-advance, a digital tasbih, and the 99 Names with meanings and search.
Habit tracking is deliberately gentle: reading streaks, an activity heatmap, khatmah progress, a verse of the day, and a single daily reminder at a time the reader chooses. There is no streak-shaming, because the point is a practice rather than engagement metrics — which, given there are no analytics, nobody is measuring anyway.
What having no accounts costs
Everything lives on the device, so nothing follows the reader to a second one. Change phones and the bookmarks, notes, khatmah progress and reading history stay behind. That is the direct price of the privacy promise, and it is the most common thing a user would ask for.
The honest fix is not a login. It is encrypted export and import, or sync through the user's own iCloud or Drive account, where the data stays theirs and the app still holds nothing. Adding a server to solve it would trade the app's one distinguishing property for a convenience.