Request a quote
Qindil

Spiritual · Everything on device

Qindil

Prayer times, Quran and dhikr, written in French first. No account, no advertising, no server: your data stays on your phone. Qindil (قنديل) means lantern.

In preparation for the stores

Why this app exists

In this category, trust is the product.

Read the reviews of the existing apps and the same complaints keep coming back: full-screen advertising in a religious context, a location-data resale scandal still cited years later, prayer times that do not match the local mosque, sacred content put behind a paywall, and the call to prayer that simply does not sound.

Qindil answers each one: no advertising, no account, no server, seven calculation methods with per-prayer fine adjustment, nothing locked, and local notifications treated as the main feature rather than a detail.

The promise holds because it is literal in the code: exactly one network stream exists, the recitation audio. We cannot sell your data, because we do not have it.

How it works

Four tabs, and nothing that asks permission to exist.

  • Prayers: times computed on the device, a day timeline coloured like the sky, logging and a countdown. The call sounds on time even with the app closed, backed by a widget and a live activity on the lock screen.
  • Quran: the full text, the French translation and three ways to read, verse by verse, page by page, or one verse full-screen. The recitation follows the reading word by word, everything can be downloaded for offline listening, and reading resumes exactly where you left it.
  • Dhikr: morning and evening routines drawn from the Fortress of the Muslim, every invocation carrying its reference, plus the tasbih and the 99 names.
  • Daily markers: the hijri calendar with recommended fasts, the qibla, a Ramadan mode, and a discreetly designed exemption mode that protects the streak instead of breaking it.
  • A calming screen: guided breathing and invocations, for the moments when the app is there to settle you rather than to tick something off.
  • Across your Apple screens: widgets, a live activity and a bilingual Apple Watch companion app.

The engineering challenges

Sixty-four notifications, and a system that drops the rest without a word.

The notification budget, the worst failure of all. Four independent schedulers together requested far more triggers than iOS allows. The system keeps the nearest ones and silently discards the surplus without returning any error: in practice the prayers furthest out were the ones being dropped, which is the product's number one promise, while the internal counter recorded them as scheduled successfully. A purpose-built allocator now shares the budget by priority, prayers first, and reads the real state of the queue instead of guessing it, including triggers placed by code that is not its own.

The permanent black screen. There was no error boundary anywhere in the app. In a release build, an exception during render does not produce a native crash: the tree unmounts, the screen stays black for good, and nothing surfaces in Apple's tooling. Two levels were added, one at the root and one around navigation, with colours hard-coded, because the fallback screen has to render even when the theme is precisely what just fell over.

Real streaming, obtained by patching native code. The audio library downloaded the entire file before playing the first second. A patch applied to the dependency switches remote playback to true streaming. In the same pass the player's races were closed: the re-entrance guard landed after two awaits, so two quick taps would announce one surah while another was playing. A phone call now becomes a resumable pause instead of a jump to the next track.

A phantom microphone and phantom photos in the binary. The audio library shipped a complete recorder, and another dependency referenced the Photos framework. Those symbols alone are enough for Apple's static analysis to conclude the app touches the microphone and to refuse the upload, for want of a purpose string we could not have written honestly since nothing records. Both were neutralised by patching the dependencies: a release build validated on a real iPhone would never have revealed the problem.

Failure paths that lie. A denied notification permission resolves normally instead of throwing, so the schedulers quietly gave up while the settings screen showed switches turned on that triggered nothing. A download intercepted by a captive portal answers with a success code, and a web page ended up renamed as an audio file, green tick and all. Beyond the polar circle the calculation engine returns non-numeric values for several weeks a year. The happy path was sound: it was the failure paths that had to be rewritten.

The one thing that cannot be fixed at the keyboard. The translation, the recitation and the calligraphic typeface originally considered are all under licences restricted to non-commercial use. The real risk is not litigation, it is Apple's review, which can ask for written authorisation. That finding is what moved the whole model to being entirely free with nothing locked and an optional way to support the work: non-commercial use becomes defensible again, and Apple's privacy questionnaire can answer "data not collected" without lying.

The stack

Local-first in the literal sense.

Prayer times are computed on the device. The Quran is a SQLite database embedded in the app, built and then verified by in-house tools that recount surahs and verses before every release. Location is used for the calculation and never transmitted, and an embedded place database gives an exact place name without calling anything.

There is no Firebase, no analytics, no crash reporter and no third-party purchase SDK. The optional support screen is a native StoreKit 2 module written for the app. Errors go into a local log that the user chooses to send, or not.

The art direction is settled: a golden arch lit from within by a warm light, on a deep navy night. The dark blues carry almost the entire surface, gold is reserved for outlines and details. The religious content was cross-checked reference by reference, no benefit is invented, and no reward is ever tallied anywhere.

React Native · TypeScript · adhan · SQLite embarquée · MMKV · Zustand · React Query · Notifee · NativeWind · Reanimated · WidgetKit · Live Activity · StoreKit 2 · Apple Watch

Download

Not on the stores yet.

Qindil is in preparation for the App Store. The buttons below will go live on release day, not before.

Coming soon to the App Store Coming soon to Google Play

Got an app idea?

We design, build, test and prepare these apps for the stores ourselves. It is exactly the work we do for the agency's clients.