Sajda is a beautiful, unobtrusive menu bar/system tray application designed to keep you connected with your prayers. Built with the performance of Rust and the flexibility of React, it leverages the official JAKIM API for accurate Malaysian prayer times, optionally falling back to calculation methods for global support. Available on macOS and Windows.
- Accurate Prayer Times — Directly sourced from JAKIM (Malaysia) or calculated locally (Global).
- Multiple Calculation Methods — JAKIM, MUIS, MWL, ISNA, Umm Al-Qura, and more.
- Native GPS Location — Uses platform-native location services (macOS Core Location, Windows Geolocation API) for precise coordinates.
- Smart Fallback — Falls back to IP geolocation if native location is unavailable or denied.
- Location Toggle — Enable/disable location services in settings with permission guidance.
- Hijri Calendar — Integrated Islamic calendar display with date header.
- Menu Bar Integration — Discreetly lives in your menu bar with next prayer countdown.
- Jumaat-Aware Labels — Shows Malay prayer names with proper Friday labeling.
- Quick Mute — Click the menu bar icon to instantly stop a playing Adhan.
- Audio Adhan — Automated Adhan playback (Nasser, Ahmed) at prayer times.
- Per-Prayer Audio Control — Choose between Adhan, chime notification, or mute for each prayer.
- Non-Intrusive Alerts — Prayer notifications without stealing window focus.
- Daily Reminders — Hadith & Dua notifications with full-content modal.
- Random Mode — 3 reminders per day at randomized times (08:00–21:00).
- Custom Schedule — Configure your own reminder times.
- Jumu'ah Reminder — Surah Al-Kahf reading reminder every Friday at Zohor.
- Ramadhan Countdown — Countdown starting 30 days before Ramadhan.
- Eid al-Fitr Countdown — Countdown starting 15 days before Eid.
- Laylatul Qadr — Highlights odd nights of the last 10 days of Ramadhan.
- Key Date Alerts — On-date display for Israk & Mikraj, Eid al-Adha, Day of Arafah, Islamic New Year, and Mawlid Nabi.
- Prayer Habit Tracker — Daily checkbox tracker that resets at midnight.
- Current Prayer Highlight — Green highlight on the active prayer period.
- Rich Dashboard — Beautiful, glassmorphic UI with smooth animations.
- Instant Responsiveness — Skeleton loading for immediate app responsiveness on launch.
- Version Display — App version shown in footer, auto-synced from package.json.
- Native Performance — Built on Tauri v2 for an ultra-lightweight footprint (~5MB).
- First-Run Setup — Guided permission requests for notifications and location on first launch.
- Opt-Out Analytics — Anonymous usage analytics (PostHog EU) with easy toggle in settings.
- Error Tracking — Automatic crash reporting to help improve app stability.
Download the latest .dmg from Releases:
- Apple Silicon (M1/M2/M3/M4):
Sajda_X.Y.Z_aarch64.dmg - Intel:
Sajda_X.Y.Z_x64.dmg
Drag the .app to your Applications folder. The app is code-signed with a Developer ID certificate and supports automatic updates.
Download the latest .exe installer from Releases:
- Windows 10/11 (64-bit):
Sajda_X.Y.Z_x64-setup.exe
Run the installer and follow the prompts. The app supports automatic updates.
Windows SmartScreen Warning
Since the Windows build is not code-signed, SmartScreen may show a warning on first run:
- Click "More info"
- Click "Run anyway"
This is normal for unsigned applications. The app is safe to use.
Windows Location Services
For accurate prayer times based on GPS location:
- Open Windows Settings
- Go to Privacy & Security > Location
- Enable Location services
- Ensure Let apps access your location is enabled
If location services are unavailable, the app automatically uses IP-based geolocation.
- Frontend: React 19, TypeScript, Vite, TailwindCSS, Zustand
- Backend: Rust (Tauri v2), Tokio, Rodio (Audio)
- Platform Native:
- macOS: Swift FFI for Core Location (via swift-rs)
- Windows: WinRT Geolocation API (via windows crate)
- Data Source: WaktuSolat.app API (JAKIM), Salah library (Global calculations)
| Suite | Tests | Status |
|---|---|---|
| Frontend (Vitest) | 135 | ✅ |
| Backend (Cargo) | 30 | ✅ |
| Total | 165 | ✅ |
# Run frontend tests
npm test
# Run frontend tests in watch mode
npm run test:watch
# Run frontend tests with coverage
npm run test:coverage
# Run Rust backend tests
npm run test:rust
# Run all tests (frontend + backend)
npm run test:allDeveloped with ❤️ by Hafiz Hanif, PhD.
MIT

