Detail proyek
Avatar muslimtify-org

muslimtify-org/

muslimtify

A daily prayer notification daemon for Muslims on Windows and Linux, supporting 21 global standard calculation methods, all madzhab, all country.

C★ 13⑂ 1Update 22 Jul 2026Rilis v0.4.0

muslimtify-org/

muslimtify

A daily prayer notification daemon for Muslims on Windows and Linux, supporting 21 global standard calculation methods, all madzhab, all country.

#c-language#cross-platform#daemon#linux
Lisensi MIT0 issue0 PR0 watcherHealth 75%Sejak 2026

★ 13⑂ 122 Jul 2026Situs ↗

README

GitHub ↗

Muslimtify

Muslimtify keeps you consistent with your daily prayers by delivering accurate prayer times and timely desktop notifications. Designed for Linux and Windows, it automatically calculates prayer schedules and reminds you 30, 15, and 5 minutes before the Adhan, or at your own custom intervals, and when it's time to pray. Every prayer time is calculated locally on your machine, with no accounts and no tracking. The only thing that touches the network is location detection via ipinfo.io, and even that is optional: set your coordinates manually, or read them from a GPS receiver with location gps on, and Muslimtify makes no network request at all.

Muslimtify supports 21 international calculation methods including MWL, ISNA, Umm al-Qura (Makkah), Egyptian General Authority, Kemenag (Indonesia), JAKIM (Malaysia), Diyanet (Turkey), and more. The default method is Kemenag. With persistent configuration and minimal setup, Muslimtify integrates seamlessly into your daily routine without interrupting your workflow.

[!Note] Prayer time calculations are powered by libmuslim, a portable library extracted from this project to enable a more flexible and reusable ecosystem for Muslim developers.

Linux Windows
2026-07-08-202423_hyprshot Cuplikan layar 2026-07-07 211731

Roadmap

  • Merge command location auto and method auto into (only) config auto and optimize auto detection per (249) country
  • Refactor from timer-driven into a portable long-running loop
  • Add custom adzan sound notifications
  • Re-design command-line (BREAKING CHANGES)
  • Add read lat/long from user GPS
  • Add GUI (see branch gui to see a progress)
  • Distribute to Flatpak
  • MacOS support (if devices is available)
  • Wearable Device support
  • Embedded Device Support

[!Important] This project is available for Linux and Windows users, but not yet for Mac users because we need a Mac device to make Muslimtify run on macOS. We are looking for brothers and sisters who have a Mac and experience in low-level C programming to contribute to the project and help bring Muslimtify to macOS. Alternatively, you can support us via GitHub Sponsors in the sponsor section.

Installation

Prebuilt Binaries (GitHub Releases)

Every release ships ready-to-run binaries for Linux and Windows on the Releases page.

Linux (x86_64 or aarch64): the binaries are dynamically linked, so install the runtime libraries first, then extract and install:

# Ubuntu/Debian
sudo apt install libnotify4 libcurl4
# Fedora/RHEL
sudo dnf install libnotify libcurl
# Arch
sudo pacman -S libnotify curl

tar xzf muslimtify-<version>-linux-<arch>.tar.gz
sudo cp -r muslimtify-<version>-linux-<arch>/{bin,lib,share} /usr/local/
muslimtify daemon install

Windows (x64 or arm64): download and run the matching installer:

muslimtify-<version>-setup-x64.exe      # Intel/AMD
muslimtify-<version>-setup-arm64.exe    # ARM

Verify any download against the published checksums:

sha256sum -c SHA256SUMS

Arch Linux (AUR)

yay -S muslimtify

Fedora (COPR)

sudo dnf copr enable rizukirr/muslimtify
sudo dnf install muslimtify

Debian/Ubuntu (PPA)

sudo add-apt-repository ppa:rizukirr/muslimtify
sudo apt update
sudo apt install muslimtify

Linux Source Install

Install dependencies:

# Ubuntu/Debian
sudo apt install git build-essential cmake pkg-config libnotify-dev libcurl4-openssl-dev

# Fedora/RHEL
sudo dnf install git gcc cmake pkgconfig libnotify-devel libcurl-devel

# Arch Linux
sudo pacman -S git base-devel cmake pkgconfig libnotify curl

GPS is optional and needs nothing at build time. Install gpsd only if you want Muslimtify to read coordinates from a local receiver:

# Ubuntu/Debian
sudo apt install gpsd
# Fedora/RHEL
sudo dnf install gpsd
# Arch Linux
sudo pacman -S gpsd

Clone, install, and enable background checks:

git clone https://github.com/rizukirr/muslimtify.git
cd muslimtify
sudo ./install.sh
muslimtify daemon install

install.sh compiles as the user who invoked sudo rather than as root, and refuses to build from a source tree that is group- or world-writable, since anything planted there would otherwise run with root privileges. If it reports unsafe permissions, fix the listed paths so each is owned by root or by you and is not writable by others, then re-run.

Windows (winget)

winget install muslimtify

Windows Source Install

Building on Windows requires MSVC. The build stops with an explicit message if another compiler is used.

git clone https://github.com/rizukirr/muslimtify.git
cd muslimtify
.\install.ps1
muslimtify daemon install

To remove the Windows install later, run .\uninstall.ps1.

If you prefer building manually first:

cmake -S . -B build
cmake --build build --config Release
cmake --install build --config Release
muslimtify daemon install

Post Installation

Run muslimtify daemon status to check if Muslimtify is registered with systemd. If no status is found, run muslimtify daemon install to register the service and ensure it runs as expected.

Muslimtify automatically selects the standard prayer time calculation method based on your country and location. Run muslimtify to verify that your configuration is correct. If the automatic selection does not meet your needs, you can set it manually using muslimtify method <key-method>. A full list of available methods is documented here.

Configuration

Muslimtify can be configured with CLI commands or by editing config.json manually.

Config paths:

  • Linux config: ~/.config/muslimtify/config.json
  • Linux cache: ~/.cache/muslimtify
  • Windows config: %APPDATA%\muslimtify\config.json
  • Windows cache: %LOCALAPPDATA%\muslimtify

Common setup commands:

muslimtify location set --auto                  # detect location from IP
muslimtify location set --auto --city=Mansoura  # auto-detect but use your own city label
muslimtify method --auto                        # select method from the detected country
muslimtify location set --lat=-6.175 --long=106.82  # set location manually (uses system timezone)
muslimtify location set --timezone=Asia/Jakarta     # override timezone
muslimtify location set --city=Jakarta              # add a city label
muslimtify location set --refresh-interval=21600    # re-check location every 6h (0=off, min 3600)
muslimtify location gps on        # read coordinates from a local GPS receiver
muslimtify location gps off       # go back to ipinfo network geolocation
muslimtify location gps           # show whether GPS is enabled
muslimtify method --list          # list all available calculation methods
muslimtify method mwl             # set calculation method
muslimtify madzhab hanafi         # set madzhab (shafi/hanafi)
muslimtify notification --reminder --all 30 15 5    # set every prayer's reminders (minutes before adhan)
muslimtify notification --reminder fajr 30 15 5     # set reminders for a single prayer
muslimtify notification           # show current notification settings
muslimtify location               # show current location

GPS is off by default and maps to a single use_gps key in the location block of config.json. On Linux the coordinates come from a running gpsd, read over a local socket on 127.0.0.1:2947, with no libgps build dependency. On Windows they come from the WinRT Geolocator, which needs location access enabled in Settings. location gps on probes the receiver first and refuses to enable if none is reachable, so a missing daemon fails immediately rather than degrading silently later. Whenever GPS has no fix, ipinfo.io is used instead. GPS supplies coordinates only, so the timezone is still taken from the host system.

The timezone itself is validated when you set it. A name the system cannot resolve is rejected outright rather than saved and silently treated as UTC, and the offset used to compute prayer times is derived from the IANA name for the date being calculated, so daylight saving is handled automatically.

Resetting the configuration is done by deleting config.json. Muslimtify falls back to built-in defaults when the file is missing, and rewrites it the next time you change a setting. Validation runs automatically every time the config is loaded.

Calculation Methods

Muslimtify supports the following calculation methods:

Key Method Region
mwl Muslim World League Europe, Far East
makkah Umm al-Qura, Makkah Arabian Peninsula
isna ISNA North America
egypt Egyptian General Authority Africa, Middle East
karachi Univ. Islamic Sciences, Karachi Pakistan, India, Bangladesh
turkey Diyanet, Turkey Turkey
singapore MUIS, Singapore Singapore
jakim JAKIM, Malaysia Malaysia
kemenag KEMENAG, Indonesia Indonesia (default)
france UOIF, France France
russia Spiritual Admin., Russia Russia
dubai GAIAE, Dubai UAE
qatar Min. of Awqaf, Qatar Qatar
kuwait Min. of Awqaf, Kuwait Kuwait
jordan Min. of Awqaf, Jordan Jordan
gulf Gulf Region Gulf states
tunisia Min. of Religious Affairs Tunisia
algeria Min. of Religious Affairs Algeria
morocco Min. of Habous, Morocco Morocco
portugal Comunidade Islamica de Lisboa Portugal
moonsighting Moonsighting Committee Worldwide

You can also use a custom method by setting "method": "custom" in config.json with your own fajr_angle and isha_angle values.

Manual JSON editing is useful when you want precise control over enabled prayers, reminder offsets, notification settings, or location data.

Default config.json
{
  "location": {
    "latitude": 0.0,
    "longitude": 0.0,
    "timezone": "UTC",
    "timezone_offset": 0.0,
    "auto_detect": true,
    "city": "",
    "country": ""
  },
  "prayers": {
    "fajr": {
      "enabled": true,
      "adhan": "",
      "adhan_enabled": true,
      "reminders": [30, 15, 5],
      "offset": 0
    },
    "sunrise": {
      "enabled": false,
      "adhan": "",
      "adhan_enabled": false,
      "reminders": [],
      "offset": 0
    },
    "dhuha": {
      "enabled": false,
      "adhan": "",
      "adhan_enabled": false,
      "reminders": [],
      "offset": 0
    },
    "dhuhr": {
      "enabled": true,
      "adhan": "",
      "adhan_enabled": true,
      "reminders": [30, 15, 5],
      "offset": 0
    },
    "asr": {
      "enabled": true,
      "adhan": "",
      "adhan_enabled": true,
      "reminders": [30, 15, 5],
      "offset": 0
    },
    "maghrib": {
      "enabled": true,
      "adhan": "",
      "adhan_enabled": true,
      "reminders": [30, 15, 5],
      "offset": 0
    },
    "isha": {
      "enabled": true,
      "adhan": "",
      "adhan_enabled": true,
      "reminders": [30, 15, 5],
      "offset": 0
    }
  },
  "notification": {
    "timeout": 5000,
    "urgency": "critical",
    "sound": "adhan",
    "sound_alarm": "alarm",
    "sound_reminder": "reminder",
    "icon": "muslimtify"
  },
  "calculation": {
    "method": "kemenag",
    "madhab": "shafi"
  }
}

Troubleshooting

Notifications are not appearing

  • Run muslimtify daemon status to confirm the background service is running.
  • On Linux, verify desktop notifications work with notify-send "Test" "Hello".
  • On Windows, local system settings can block toast delivery. Check notification settings, Focus Assist / Do Not Disturb, and whether the command is running in an interactive desktop session.

Location detection is not working

  • Run muslimtify location set --auto again.
  • Set coordinates manually with muslimtify location set --lat=<latitude> --long=<longitude>. If the host machine is in a different region than the coordinates, override the timezone with --timezone=<iana>, e.g. muslimtify location set --lat=-6.21 --long=106.84 --timezone=Asia/Jakarta.
  • Check network access to ipinfo.io if auto detection keeps failing.

GPS will not turn on

muslimtify location gps on probes the receiver before saving, so it refuses rather than enabling something that cannot work. The message names the missing piece:

  • cannot reach gpsd: install and start gpsd. Muslimtify reads it over a local socket on 127.0.0.1:2947.
  • no GPS device detected: gpsd is running but sees no hardware. Connect the receiver and confirm gpsd picked it up.
  • location access is turned off: on Windows, enable Settings > Privacy & security > Location, then try again.

Being told GPS is enabled with no fix yet is not an error. The setting is saved and ipinfo.io is used until the receiver locks on. If the daemon or device later disappears, Muslimtify warns once and turns GPS off so it stops retrying on every cycle. A denied permission does not turn it off, because granting access in Settings is enough for the next attempt to succeed.

Muslimtify rejects my timezone

The name must resolve on this system, so check the spelling against the IANA database, for example Asia/Jakarta or Europe/London. Zones that legitimately sit at UTC+0, such as Africa/Abidjan, are accepted.

Prayer times are off by an hour

This is almost always daylight saving, which is handled automatically only when a valid IANA zone is saved. Run muslimtify location and check the timezone field. The gmt field shows the offset in effect today rather than the one recorded when you last set your location. If the zone is wrong or empty, set it with muslimtify location set --timezone=<iana>.

A notification did not fire while the machine was asleep

Triggers missed within the previous 15 minutes still fire when the daemon catches up. Anything older is dropped without firing, so resuming from a long suspend does not replay a stack of stale Adhans.

Contributing

Contributions are welcome. See CONTRIBUTING.md for workflow, style, and testing guidance.

License

Muslimtify is released under the MIT License. See the repository license files for details.

Support