Muslims prayer times app https://nedaa.dev
  • TypeScript 77%
  • Kotlin 12.2%
  • Swift 10%
  • JavaScript 0.4%
  • Ruby 0.2%
  • Other 0.2%
Find a file
2026-08-28 19:47:34 +03:00
.github ci(hms): enforce dependency and artifact gates 2026-07-19 21:48:23 +03:00
.husky chore: make husky pre-commit hook executable 2026-06-17 20:56:13 +03:00
.vscode feat(ios): Setup ios widgets 2025-06-21 00:54:59 +03:00
android feat(widgets): show prayer times in the Android notification shade 2026-08-28 19:47:34 +03:00
assets fix(quran): refine hizb page marker 2026-08-14 20:55:00 +03:00
docs docs: the quran reader is public at 2.10.0 2026-08-26 16:07:44 +03:00
fastlane docs(fastlane): regenerate lane documentation 2026-08-28 02:01:41 +03:00
ios chore(release): bump the version to 2.10.1 2026-08-28 19:17:07 +03:00
modules feat(widgets): show prayer times in the Android notification shade 2026-08-28 19:47:34 +03:00
patches chore(deps): upgrade to expo 57.0.16 2026-08-27 01:18:15 +03:00
plugins feat(quran-audio): acknowledgements for Qur'an sources (in-app screen + iOS Settings.bundle) 2026-07-09 11:26:11 +03:00
scripts fix(screenshots): disambiguate the edition selectors in the setup flows 2026-08-26 22:29:14 +03:00
src feat(widgets): show prayer times in the Android notification shade 2026-08-28 19:47:34 +03:00
.actrc docs: Add Act configuration and update documentation for local CI testing 2025-06-25 17:47:21 +03:00
.bun-version ci: Add code quality checks workflow with linting and formatting steps 2025-06-25 17:47:21 +03:00
.easignore chore(eas): add .easignore to keep local-only dirs out of build archive 2026-07-24 17:36:08 +03:00
.env.example chore(sentry): remove native build phases, sentry.properties, env keys, and CI steps 2026-06-19 23:22:13 +03:00
.gitignore chore: update agent context and gitignore for qibla redesign 2026-07-22 14:05:37 +03:00
.prettierrc style: Format code 2025-02-01 19:05:31 +03:00
AGENTS.md docs: update AGENTS.md 2026-08-27 01:18:23 +03:00
app.config.js feat(screenshots): resolve screenshot flag via app.config + expo-constants 2026-05-19 00:05:31 +03:00
app.json chore(release): bump the version to 2.10.1 2026-08-28 19:17:07 +03:00
babel.config.js fix: invalidate babel cache on NODE_ENV change for correct Tamagui extraction 2026-02-13 23:12:57 +03:00
bun.lock chore(deps): upgrade expo to 57.0.17 and refresh dependencies 2026-08-28 02:01:39 +03:00
crowdin.yml Update Crowdin configuration file 2025-06-19 21:11:43 +08:00
eas.json chore(build): add the production-hms-apk profile 2026-08-27 01:01:09 +03:00
eslint.config.js feat(ui): add plain, grouped and pressable Card variants 2026-07-29 09:05:18 +03:00
index.js fix(android): register the background refresh task on a headless boot 2026-08-27 01:01:11 +03:00
LICENSE feat(license): add GPLv3 to the project 2025-06-19 17:21:45 +03:00
metro.config.js fix(metro): pass terser only the output option 2026-08-27 01:01:12 +03:00
package.json chore(deps): upgrade expo to 57.0.17 and refresh dependencies 2026-08-28 02:01:39 +03:00
README.md docs: the quran reader is public at 2.10.0 2026-08-26 16:07:44 +03:00
tamagui.build.ts chore: add tamagui config and dependencies 2026-02-13 18:36:42 +03:00
tamagui.config.ts revert(ui): restore the pre-redesign theme tokens and home screen 2026-07-29 21:15:12 +03:00
tsconfig.json chore(types): add @types/jest and enable via tsconfig types (TS 6) 2026-07-02 17:10:33 +03:00
yarnrc.yml Starting files 2025-01-17 16:47:17 +03:00

Crowdin Code Quality Checks Build Android

Nedaa | نداء


Nedaa

Prayer times, Athkar, Qibla, and reliable alarms for iOS and Android.
Free, no ads, no tracking, no accounts.

App Store  ·  Google Play  ·  AppGallery  ·  nedaa.dev

What it does

Nedaa tells you when to pray, wherever you are, and reminds you the way you want to be reminded. It's free, with no ads and no tracking, and there's no account to make.

Available for iOS and Android, including Huawei devices without Google services.

Features

  • Prayer times anywhere in the world, with 23 calculation methods so you can match your local mosque.
  • Notifications for each prayer, with your own Athan sound, pre-prayer warnings, and Iqama reminders. All of it is set per prayer.
  • A Fajr alarm that behaves like a real alarm instead of a notification, with an optional wake-up challenge.
  • Home screen and lock screen widgets, including Suhoor and Iftar widgets during Ramadan.
  • Morning and evening Athkar with audio, and you can add your own.
  • A Mushaf reader with recitation audio, in your choice of edition or as plain text, with search, bookmarks, highlights, and word-by-word read-along.
  • Qibla compass.
  • Hijri date, and a Hijri to Gregorian converter.
  • Qada tracker for missed Ramadan fasts.
  • A step-by-step Umrah guide.
  • Countdowns to Ramadan, both Eids, Arafah, Ashura, and the Hijri new year.
  • Arabic, English, Malay, and Urdu, with full RTL. Want to see the app in your language?
  • Works offline once your prayer times are synced.

Built with

Expo and React Native, TypeScript, Tamagui for the UI, Zustand for state, and SQLite for local storage. The alarms, compass, and widgets are native modules under modules/.

Setup instructions are in the Developer Guide.

Permissions

Android counts every permission an app declares, including the ones libraries merge in, so the number on the store page looks larger than it is. Here is what each one is actually for, and where in the code it is used.

Android

Permission Used for Where
ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION Two separate uses, both only while the app is open. Prayer times take a low-accuracy, city-level fix. The Qibla compass asks for one precise fix, and only after you pick Qibla mode — it is kept on your device, reused offline, and dropped after a day. Compass-only mode never requests location. src/utils/location.ts, src/hooks/useCompassLocation.ts
INTERNET Fetching prayer times, downloading Quran content, sending feedback you choose to send. src/services/api.ts
SCHEDULE_EXACT_ALARM, USE_EXACT_ALARM Firing the Athan and alarms at the exact minute. Android defers inexact alarms, which is no good for Fajr. modules/expo-alarm/android/.../AlarmScheduler.kt
RECEIVE_BOOT_COMPLETED Re-scheduling your alarms after the phone restarts. Without it they'd silently stop. modules/expo-alarm/android/.../BootReceiver.kt
SYSTEM_ALERT_WINDOW Showing the alarm screen over the lock screen when it goes off. android/.../MainActivity.kt
REQUEST_IGNORE_BATTERY_OPTIMIZATIONS Optional, and you're asked before it's used. It tells Android not to hold back your alarms while the phone is idle. modules/expo-alarm/android/.../ExpoAlarmModule.kt
READ_MEDIA_AUDIO, READ_EXTERNAL_STORAGE, WRITE_EXTERNAL_STORAGE Letting you use your own audio file as an Athan sound. Only the file you pick is read. src/utils/customSoundManager.ts
MODIFY_AUDIO_SETTINGS, FOREGROUND_SERVICE, FOREGROUND_SERVICE_MEDIA_PLAYBACK Playing Athkar and Quran recitation, and keeping the lock screen controls working while playback continues in the background. src/services/audio/nitroSession.ts
VIBRATE Haptics, and vibration on notifications and alarms. src/hooks/useHaptic.ts

Nedaa does not ask for the microphone, camera, contacts, or activity recognition. RECORD_AUDIO, ACTIVITY_RECOGNITION, and FOREGROUND_SERVICE_DATA_SYNC are pulled in by libraries and stripped from the build on purpose — see blockedPermissions in app.json.

iOS

Capability Used for Where
Location, while in use Prayer times at low accuracy, plus one precise fix for the Qibla compass if you opt into Qibla mode. The compass fix stays on device and is dropped after a day. There's no "always" prompt in normal use. src/utils/location.ts, src/hooks/useCompassLocation.ts
Notifications Athan, pre-prayer warnings, Iqama reminders, and reading reminders. src/utils/notifications.ts
Background audio Athkar and Quran recitation keep playing when you leave the app, with lock screen controls. src/services/audio/nitroSession.ts
Background refresh Topping up cached prayer times so they're there when you're offline. src/tasks/backgroundRefresh.ts
AlarmKit (iOS 26+) Real system alarms for Fajr and Jummah. On earlier iOS the alarm feature is turned off rather than faked. modules/expo-alarm

Checking for yourself

On Android, Exodus Privacy analyses the published APK and reports no trackers.

No equivalent exists for iOS — Apple encrypts app binaries, so nobody outside Apple can analyse them. What we can do instead is ship the declaration in the open: ios/nedaa/PrivacyInfo.xcprivacy lists no collected data types, no tracking domains, and NSPrivacyTracking set to false. Since the app is open source, you can read it, and the code behind it, rather than taking our word for it.

Acknowledgements

Nedaa is built on the generous work of others:

Qur'an

Fonts

Tools

  • Crowdin — free access to their localization platform through their open source program.

Feedback

If there is a feature you would like to see in the app, please let us know support@nedaa.dev. We are always looking for ways to improve the app. Also pull request are welcome.
If you find any issue please file an issue.

If you have any questions, feel free to reach us at support@nedaa.dev

Translation

If you would like to see the app in your language, you can contribute very easily by joining our crowdin project.

Select the language you want, and submit translations to the strings in the app.

If you don't see your language in the crowdin project, you can create a new "discussion" in the crowdin project, and we will add the language for you.

Maintaining translations

en.json is the source of truth and the only file developers edit by hand (Arabic, ar.json, is also hand-maintained by the team). The remaining locales are owned by Crowdin — never edit those files directly, they are overwritten on the next download.

The flow:

  • Once new English strings land on master, Crowdin picks them up for translation on its own.
  • Crowdin keeps a single PR open from its l10n_master branch. Merge it into master before each release (merge, don't delete the branch — Crowdin reuses it). Letting it sit lets the branch drift behind master.

A locale only becomes selectable when it's listed in AppLocale (src/enums/app.ts) — both the language picker and the device-default resolver derive from that enum. Keep a locale gated there until its Crowdin coverage is ship-ready.