Prayer times and Azkar, in Arabic first.
Zakkir shows the five daily prayer times with a countdown to the next one, and a library of 138 Azkar you can read and count: morning, evening, after-prayer, sleep, tasbih, and Quranic and prophetic supplications. It runs as a Windows and Linux desktop app, an Android app and a Firefox extension.
The interface is Arabic-first: right-to-left layout, ten bundled Arabic fonts and Arabic notification texts. There is no account and no backend. Prayer times come from the Aladhan API, and settings stay on the device.
I built it alone, from the prayer-time fetching to the Android build.
One renderer, wrapped by each platform.
The screens are one web renderer: popup.html, popup.css, popup.js and the Azkar data. Each platform wraps it.
- Desktop. Electron opens the renderer in a frameless, always-on-top window. A 15-line preload bridge handles settings storage and window controls.
- Android. A build script inlines the CSS, JavaScript, Azkar JSON, ten fonts and the sounds into one generated TypeScript file. An Expo app loads it in a WebView and replaces the Electron calls with messages to React Native, which owns notifications, storage and haptics.
- Firefox. The extension started from the same popup files. It lives on its own branch with a background script for alarms, and has since diverged from the desktop renderer. So "one renderer" is exact for desktop and Android, and only a shared starting point for Firefox.
The cost is that every platform feature is a message across a bridge, and the Android bundle is one generated file of about 4 MB. The gain is that a fix to the reading screen reaches desktop and Android with one change.
Reminders that work without a connection.
Prayer times move every day, so a repeating daily alarm drifts. Zakkir fetches times from the Aladhan API a month at a time and keeps the next 60 days, and the last 2, in a local cache keyed by location and calculation method. After one successful fetch, times and reminders keep working offline. The very first launch still needs the network, because the app does not calculate prayer times itself.
A shared scheduler module turns each day's times into events: a reminder before the prayer, one at the adhan and one at the iqama, each with its own minute offset per prayer. It is a pure function, so I could test the awkward cases: settings from older versions, per-prayer overrides, late timers, and an iqama that falls after midnight.
Delivery differs by platform, because the platforms allow different things.
- Desktop checks every 15 seconds for events that are due, and remembers the keys of sent events for seven days so a delayed tick never repeats a notification.
- Android cancels all pending notifications and recreates one-shot ones for the next 28 days. Five prayers, three event types and 28 days make at most 420, under Android's limit of 500 pending alarms.
Arabic reading and themes.
Arabic text is the main content, so the reading screen has ten bundled fonts, a size setting, and separate rendering for the opening basmala and istiadhah. Switching to Arabic flips the layout to right-to-left, translates the interface, and uses Arabic plural forms for the countdown, such as "ساعتان" and "دقيقتان".
The app has a large set of visual themes and about 40 accent colors that recolor any theme. The two screens below are the same desktop home in a light and a dark theme.


Tests and releases.
The desktop app has a Playwright suite that launches the real Electron app with a clean profile. It covers navigation, settings, theme switching, notification toggles, the Azkar controls and a full right-to-left check. The scheduler has its own unit tests in node:test, but that file is not matched by npm test, so continuous integration does not run it.
A GitHub Actions workflow on the main branch runs the Playwright suite, then builds a Windows installer, a Debian package and an AppImage with electron-builder and publishes them. The repository has ten tagged releases, from v1.1.0 on 3 June 2026 to v1.5.0 on 4 August 2026.
The Android app and the Firefox extension have no automated UI tests. The Android build has a GitHub Actions workflow that I have not committed yet, so I do not call the APK CI-built.
Running on a phone and in Firefox.
Two screen recordings: the Android app (1 minute 33 seconds) and the Firefox extension popup (1 minute 1 second). The add-on is published on Mozilla's add-ons site.
Limits, and what I would change.
- The first launch needs the network. Bundling an offline calculation would remove that.
- Firefox forked from the desktop renderer. I would merge it back so one fix covers all three.
- Only desktop is tested end to end. Android and Firefox have no UI tests.
- Prayer times depend on the Aladhan API and the calculation method it offers.
- Version numbers drift between
package.json, the manifests and the tags.
Read the code.
The source is MIT licensed.
