Accurate prayer times for Muslims, every device, every method, free forever.
Live: praycalc.com | Docs: praycalc.org
Billing status (2026-07): Stripe is not yet provisioned for this account. /upgrade shows a "launching soon" state instead of checkout — no live charges. Accounts, sign-in, and the free calculator work today on every surface. See Changelog.
Before contributing, read .github/wiki/ENGINEERING-CHARTER.md. It is the single source of truth for code standards across every Ummeco repo. The most-read sections:
PrayCalc is a free, GPS-accurate Islamic prayer time calculator for web, mobile, desktop, and TV. Its flagship method is DPC (Dynamic Prayer Calculation), alongside fixed presets (MWL, ISNA, Egypt, Umm al-Qura, Karachi, UOIF) and Custom — Tehran and Jafari are intentionally excluded (D-P3-19). It also supports Qibla direction, adhan reminders, and offline mode, and powers prayer times across the Ummat app ecosystem.
- DPC (Dynamic Prayer Calculation, default) plus fixed presets — MWL, ISNA, Egypt, Umm al-Qura, Karachi, UOIF — and Custom (Tehran/Jafari intentionally excluded, D-P3-19)
- GPS-based location with city search
- Qibla compass direction
- Adhan audio notifications (web: Mishari, Makkah; mobile: Makkah, Mishari, Madina)
- Monthly/yearly prayer calendars with PDF export
- PWA with full offline support (service worker + IndexedDB caching, installable to home screen)
- Web: 12 languages (EN, AR, UR, FA, ID, TR, MS, BN, FR, ES, DE, RU) with RTL for Arabic/Urdu. Mobile: 21 languages.
- Countdown to next prayer
- Dark mode (WCAG 2.2 AA, system-preference-aware)
- Accessible (WCAG 2.2 AA — axe audited, Playwright viewport matrix)
- Ummat account sign-in on web, mobile, and desktop — one login across the ecosystem
- Ummat+ ($9.99/yr): unlocks the TV app and Smart Home integrations (Google Home, Alexa)
- Desktop menu bar / tray app for macOS, Windows, Linux with live countdown and seamless auto-update
| Layer | Tech |
|---|---|
| Web | Astro, TypeScript, Tailwind CSS |
| Mobile (Active) | React Native + Expo SDK 53 (iOS + Android) + react-native-tvos (TV platforms) |
| Mobile (Archive) | Flutter 1.2.3 — archived branch (D-P2-PRAYCALC-RN) |
| Desktop | Tauri 2 + Vite + React 19 (macOS, Windows, Linux) |
| Backend platform | nSelf (100% — self-hosted PaaS on Hetzner) |
| API | Hasura GraphQL Engine (all data access via GraphQL, no direct SQL) |
| Auth | Hasura Auth — shared SSO at auth.ummat.dev |
| Docs site | Astro + MDX |
| i18n | Astro built-in i18n routing (12 locales) |
| PWA | Serwist (service worker, offline caching) |
| Testing | Vitest (unit), Playwright (E2E, 3-viewport matrix) |
| Deploy | Vercel (projects: ummat-praycalc, ummat-praycalc-org) |
praycalc/
├── web/ praycalc.com — Astro web app
├── org/ praycalc.org — documentation site
├── desktop/ menu bar / tray app — Tauri 2 + Vite + React 19 (macOS, Windows, Linux)
├── mobile/ iOS + Android phone/tablet — React Native + Expo SDK 53
├── tv/ Apple TV + Android TV + Fire TV — react-native-tvos
├── watchos/ watchOS companion — Swift + SwiftUI (scaffold)
├── wearos/ Wear OS companion — Kotlin + Jetpack Compose (scaffold)
├── smart/ Smart Home backend (Google Home + Alexa fulfillment)
└── flutter/ ARCHIVED reference only — do not add features here (see Tech Stack)
Start the shared Ummat backend first:
cd ~/Sites/ummeco/ummat/backend && nself startWeb app:
cd web
cp .env.example .env.local # fill in local Hasura + auth URLs
pnpm install
pnpm dev # https://www.praycalc.local.nself.org:8543Docs site:
cd org
pnpm install
pnpm dev # http://localhost:3003Desktop app:
cd desktop
pnpm install
pnpm tauri devMobile app:
cd mobile
pnpm install
pnpm startTV app:
cd tv
pnpm install
pnpm startflutter/ is an archived reference only (superseded by mobile/ + tv/ per D-P2-PRAYCALC-RN) — do not run or extend it.
Current version: v1.2.4. Latest release: ummeco/praycalc releases (filter to desktop-v* tags — the repo also cuts mobile/TV/whole-platform releases, so /releases/latest is not reliable for desktop specifically).
The app ships with seamless auto-update (signed installers + in-app updater) since desktop-v1.2.3 — install once and future versions download in the background and prompt "Restart to update" when ready.
| Platform | Installers |
|---|---|
| macOS (arm64) | .dmg, .app.tar.gz |
| macOS (Intel/x64) | .dmg, .app.tar.gz |
| Windows (x64) | .msi, .exe |
| Linux (x64) | .deb, .AppImage |
Every mobile-v* tag also publishes a signed APK to GitHub Releases for direct sideload install — no Play Store account needed. Download the .apk asset, enable "install unknown apps" for your browser/file manager, and open it. This is a separate path from the Play Store listing (which ships from the same version via a manual EAS Submit dispatch) — the two can be a build or two apart in practice.
All data access goes through Hasura GraphQL. Never use direct SQL or install pg / drizzle-orm at runtime. See .github/docs/settings-architecture.md for the GraphQL client pattern and env var reference.
Local API: https://api.praycalc.local.nself.org:8543/v1/graphql (port 8543)
Production API: https://api.praycalc.com/v1/graphql
See .github/wiki/Contributing.md for architecture docs, contribution guidelines, and feature status.