Skip to content

Releases: muslimtify-org/muslimtify

v0.3.1

Choose a tag to compare

@rizukirr rizukirr released this 13 Jul 11:32
2fefcda

Summary

v0.3.1 makes show --date a first-class way to look up prayer times for any single day or an inclusive span of days, with full support across the table, JSON, and headless output modes. It also fixes a show --next rollover bug that could report a slightly wrong time after the last prayer of the day, alongside packaging and repository-hygiene improvements.

What changes

show --date now supports single dates and inclusive ranges

The --date option has been reworked from the ground up. Instead of a single lookup, you can now request prayer times for one day or an inclusive span of days, and every output mode understands ranges:

  • Table renders a range as one row per day, printing only the prayer columns you have enabled in your config.
  • JSON (--json) emits an array of per-day objects for ranges, and a single object for a single date.
  • Headless (--headless) emits one date= block per day, keeping the machine-readable key=value format.

New usage:

muslimtify show --date 2022-01-01                     # one day
muslimtify show --date 2022-01-01 --json              # one day as JSON
muslimtify show --date 2022-01-01 2022-01-07          # inclusive range
muslimtify show --date 2022-01-01 2022-01-07 --headless

--json and --headless may appear before or after the dates. Input dates are validated up front, so malformed or out-of-order ranges are rejected with a clear error instead of producing garbage output.

Fixes

  • show --next rollover after the last prayer of the day. When every enabled prayer for today has already passed, --next correctly rolls over to tomorrow's first prayer. Previously it reused today's clock time as a stand-in, which could be off by up to a minute due to day-to-day drift. The wrapped prayer's time is now recomputed for the next day's date, and the countdown is derived from that exact time. The fix is shared across the table, JSON, and headless --next renderers and is covered by new CLI tests.
  • show --date help text rewritten for clarity: the usage line, option descriptions, notes, and examples now accurately reflect single-date and range behavior.

Maintenance and packaging

  • Bundled adhan.mp3 is now shipped inside the Fedora and Windows packages.
  • CI: action-gh-release bumped to v3.0.1 (Node 24).
  • AUR source checksums refreshed.
  • Repository hygiene: auto-assign workflow for new issues and pull requests (#36), a more detailed pull request template (#37), and an updated AI usage policy.

Changelog

  • feat(show): single-date and inclusive date-range support for --date across table, JSON, and headless output (#35)
  • fix(show): --next shows tomorrow's exact recomputed time after the day's last prayer (#35)
  • feat: auto-assign issues and PRs (#36)
  • chore: more detailed PR template (#37)
  • chore: bump version to v0.3.1 (#38)

Full Changelog: v0.3.0...v0.3.1

v0.3.0

Choose a tag to compare

@github-actions github-actions released this 09 Jul 07:50

Muslimtify 0.3.0 is the largest release so far. It ships a complete, breaking command-line redesign, per-prayer adhan audio, per-prayer time offsets, and a round of security hardening. All prayer-time calculations still run fully offline.

Breaking changes

Command-line redesign

The CLI has been reorganized into a small set of verbs (show, location, notification, method, madzhab) with consistent --json / --headless machine-readable output and --help on every command. Several top-level commands were folded into their owning verb or removed. Unknown input (an unknown prayer, method, or madzhab) now prints the list of valid values instead of a bare error.

Migration from 0.2.x:

Old (0.2.x) New (0.3.0)
next show --next
show --format json show --json
show --no-header default (the title/location banner was removed)
location show location
location refresh / location clear location set --auto
config auto location set --auto and method --auto
config show location, notification, method, madzhab (per-area views)
config validate runs automatically every time the config loads
config reset delete config.json (defaults are recreated on the next write)
method show method
method set <name> method <name>
method list method --list
method madhab <name> madzhab <name>
enable <prayer> / disable <prayer> notification enable <prayer> / notification disable <prayer>
list notification
reminder <prayer> <mins> notification --reminder <prayer> <mins>
reminder all <mins> notification --reminder --all <mins>
sound ... notification --sound and notification --adhan
check removed (the background daemon runs the cycle)

Configuration schema

config.json gained and changed several fields. Existing files are migrated on load, but note the new shape:

  • notification.sound changed from a boolean to a mode string: adhan, default, or off. New keys sound_alarm and sound_reminder were added.
  • Each prayer gained adhan (a sound-file path), adhan_enabled (bool), and offset (minutes). The old per-prayer reminder_sound key was removed.
  • The default notification.urgency is now critical.

New features

Per-prayer adhan audio

Each prayer can now play an adhan when its time arrives, using a bundled adhan by default. The notification is cancellable, and on Windows the toast has a working Stop button (wired through an AppUserModelId activator).

  • notification --adhan enable <prayer> / notification --adhan disable <prayer>
  • notification --adhan set <path> sets a custom adhan file. The path is validated: symlinks are rejected, it must be a regular file, and it is canonicalized before use.
  • notification --sound <adhan|default|off> selects the notification sound mode.

Per-prayer time offsets

Fine-tune individual prayer times to match your local timetable.

  • muslimtify offset <prayer> <minutes> adjusts a single prayer (range -60 to 60).
  • muslimtify offset all <minutes> adjusts every prayer. Adjusted times wrap and normalize to a valid 24-hour range.

Redesigned command surface

  • show, location, and notification all support --json and --headless for scripting.
  • method --auto selects the calculation method from your saved country, detecting your location first if no country is set.
  • location set prints a concise per-field confirmation and warns you to double-check the paired field: after changing coordinates it reminds you to verify the timezone, and after changing the timezone it reminds you to verify the coordinates.

Security hardening

  • Enforce TLS certificate verification and HTTPS-only for the IP-based location fetch, failing closed on any curl-hardening error.
  • Validate the timezone string before calling setenv(TZ) / tzset().
  • Fix undefined behavior from isspace() on signed characters in the JSON parser.
  • Cap config and cache file reads at 1 MiB.
  • Write config and cache files with 0600 permissions on POSIX.
  • Validate adhan sound paths (reject symlinks, require a regular file, canonicalize).

Internal

  • Established a strict platform-layer pattern: platform-specific code lives in the platform layer, never behind #ifdef in shared code. Documented in AGENTS.md.
  • Vendored miniaudio under vendor/.
  • Added docstrings to previously undocumented headers.

Downloads

Linux (dynamically linked; install libnotify and libcurl from your distro first):

  • x86_64: muslimtify-0.3.0-linux-x86_64.tar.gz
  • aarch64: muslimtify-0.3.0-linux-aarch64.tar.gz

Windows (run the installer for your architecture):

  • x64: muslimtify-0.3.0-setup-x64.exe
  • arm64: muslimtify-0.3.0-setup-arm64.exe

Verify downloads with sha256sum -c SHA256SUMS.

For distro-native installs (Arch AUR, Fedora COPR, Debian PPA, winget) see the README.

v0.2.5

Choose a tag to compare

@github-actions github-actions released this 27 Jun 23:25

Muslimtify v0.2.5

A maintenance release focused on fixing Windows installation under the official winget package manager. The Windows installer now completes fully unattended, clearing the validation failure that blocked the winget submission.

Bug fixes

Windows: silent install no longer hangs on a network call.
The Inno Setup installer ran muslimtify daemon install as a post-install step and waited for it to finish (waituntilterminated). That command synchronously contacted ipinfo.io to auto-detect your location (config_auto_detect). Inside winget's validation sandbox the request stalled, so the silent install never returned and winget flagged the 0.2.4 manifest as Validation-Unattended-Failed ("the installer was blocked on user input").

daemon install now only registers the scheduled task and returns immediately. No behavior changes for users — your location and calculation method are still auto-detected automatically, just lazily on the scheduled task's first run instead of during setup. This also makes installation faster and removes the network dependency from the install step entirely.

Maintenance

  • Normalize mixed-slash paths during Windows install-time runtime-dependency resolution (CMake policy CMP0207).
  • Remove the now-unused MUSLIMTIFY_CMD_DAEMON_WIN_TEST test guard and dead includes from the Windows daemon command.
  • Bump version to 0.2.5 across all packaging files (winget, AUR, Fedora, Debian).

Installation

Windows — download and run the installer for your architecture:

  • x64 — muslimtify-0.2.5-setup-x64.exe
  • arm64 — muslimtify-0.2.5-setup-arm64.exe

Or, once the updated manifest lands, via winget:

winget install rizukirr.Muslimtify

Linux — dynamically linked; install libnotify and libcurl from your distro first, then extract:

  • x86_64 — muslimtify-0.2.5-linux-x86_64.tar.gz
  • aarch64 — muslimtify-0.2.5-linux-aarch64.tar.gz

For distro-native installs (Fedora COPR, Debian .deb, AUR) see the README.

Verifying downloads

sha256sum -c SHA256SUMS

Full changelog: v0.2.4...v0.2.5

v0.2.4

Choose a tag to compare

@rizukirr rizukirr released this 27 Jun 14:21
675e7be

Muslimtify 0.2.4 replaces the systemd timer that woke the app once a minute with a single long-running, self-scheduling daemon. The prayer-time and notification logic is unchanged, what changed is how it is driven and supervised, making the daemon portable, free of a per-minute systemd timer, and lighter on process churn.

Highlights

  • New muslimtify daemon run: a long-running foreground loop that schedules itself and fires prayer notifications, replacing the timer + one-shot model.
  • The systemd user unit is now a long-running Type=simple service; the muslimtify.timer unit is removed entirely.
  • Upgrades from earlier (timer-based) versions are healed automatically — a leftover muslimtify.timer is disabled and removed during install/uninstall, with clean installs unaffected.
  • New unit tests plus a Windows-safe build; CI is green across gcc, clang, and MSVC.

Daemon: from a timer to a long-running loop

  • daemon run runs the existing check cycle once per wall-clock minute, sleeping in bounded, interruptible naps aligned to the top of each minute. Bounding each sleep means a laptop suspend/resume or a clock change cannot overshoot or skip a prayer.
  • Graceful shutdown on SIGTERM/SIGINT: the service stops immediately and cleanly instead of being killed mid-sleep.
  • Supervised by systemd as a Type=simple service with Restart=on-failure; it starts at login and is restarted if it ever crashes. Typical footprint is a few megabytes resident with near-zero idle CPU.
  • daemon install / uninstall / status now manage the long-running service instead of the timer. The systemd unit text is produced by a single, unit-tested builder.
  • muslimtify check (the one-shot cycle) is unchanged and still works for manual runs or custom scheduling.

Upgrading from 0.2.x (timer-based)

Existing installs may have left a muslimtify.timer enabled (it shows up as a TriggeredBy: line on the service). 0.2.4 cleans this up for you:

  • muslimtify daemon install disables and removes a leftover timer. The check is guarded, so a clean first-time install does nothing here. Because the Debian postinst and Fedora %post both call daemon install, PPA and COPR upgrades self-heal with no manual steps.
  • install.sh disables the stale timer and removes any previously shipped unit before enabling the service.
  • muslimtify daemon uninstall now fully disables the timer; previously it only deleted the file and left the enablement behind.

If you upgrade in place and still see a TriggeredBy: muslimtify.timer line, run:

muslimtify daemon install

or, for a source install:

sudo ./install.sh

Packaging

  • The systemd unit is now a single configure_file template (systemd/muslimtify.service.in) with the install prefix substituted at build time, so there is no hardcoded executable path.
  • muslimtify.timer is removed from the CMake install list, the Fedora spec %files, the Debian packaging, and install.sh.
  • install.sh renders the unit from the shared template instead of a duplicated heredoc.

Quality and CI

  • Added unit tests for the service-unit builder and for the next-minute sleep math.
  • The POSIX daemon loop is excluded from the Windows build; Windows continues to use its Task Scheduler path unchanged.
  • clang-format, the gcc/clang/MSVC build matrix, and the packaging version-consistency check all pass.

Platform support

Linux only for the loop daemon. Windows behavior is unchanged in this release (still Task Scheduler). Flatpak distribution remains on the roadmap.

Downloads

Prebuilt binaries are attached to this release.

Linux (dynamically linked — install libnotify and libcurl from your distro first):

  • x86_64 — muslimtify-0.2.4-linux-x86_64.tar.gz
  • aarch64 — muslimtify-0.2.4-linux-aarch64.tar.gz

Windows — run the installer for your architecture:

  • x64 — muslimtify-0.2.4-setup-x64.exe
  • arm64 — muslimtify-0.2.4-setup-arm64.exe

Verify downloads with sha256sum -c SHA256SUMS. For distro-native installs (Fedora COPR, Debian .deb, winget) see the README.

Full changelog

v0.2.3...v0.2.4

v0.2.3

Choose a tag to compare

@rizukirr rizukirr released this 26 May 02:38

Highlights

Muslimtify 0.2.3 introduces a single unified config auto command that detects your location and picks the right calculation method in one step, plus an explicit --country override for users who don't want IP-based detection.

Features

  • Unified config auto command — auto-detects both location and the appropriate prayer-time calculation method in a single command, replacing the two separate steps that existed before.
  • Method merged into the country master table — each country now maps directly to its conventional calculation method, with a shared config_auto_detect helper that also powers auto-detection during daemon install.
  • --country=<code> flag for location set — set your country explicitly using ISO 3166-1 alpha-2 codes, backed by a new validation module covering all 249 countries (country names are stored for future use).

Fixes

  • Disable optional curl dependencies to fix the Windows CI build.
  • Bump bundled curl to 8.20.0.
  • Silence remaining Windows build warnings.
  • Align CLI help text with actual subcommand behavior.
  • clang-format fix for the _WIN32_WINNT macro in timezone.c.

CI & Build

  • Linux build-and-test matrix is now Release-only across both GCC and Clang (the Debug/sanitizer matrix entry was dropped).
  • Windows job renamed to build-and-test (msvc) for naming consistency with the Linux jobs.

Tests

  • New config-auto test covering all 249 countries.
  • Assert the ISO country table is sorted so bsearch lookups stay correct.

Packaging

  • Debian, Fedora (.spec), and winget (.iss) bumped to 0.2.3 with full changelog entries.
  • Added FUNDING.yml; updated Debian scripts and the Ubuntu build target.

Removed / Breaking

  • The location auto and method auto subcommands were removed — use config auto instead.

Full changelog: v0.2.2...v0.2.3

v0.2.2

Choose a tag to compare

@rizukirr rizukirr released this 12 May 12:28

Muslimtify v0.2.2

Bugfix + UX release focused on the timezone and location pipeline.
Closes #11.


Highlights

Timezone overhaul (fixes #11)

  • System tzdb for offsets.
    Replaced the hardcoded ~20-entry IANA table (which silently returned UTC+0 for unknown zones and ignored DST entirely) with:

    • libc tzdb on Linux (setenv TZ + tzset + tm_gmtoff, with TZ save/restore)
    • Win32 implementation on Windows (42-entry CLDR-derived IANA → Windows table + EnumDynamicTimeZoneInformation + SystemTimeToTzSpecificLocalTimeEx for DST-aware offsets)

    (6d486bc, dd2f8b1)

  • get_system_timezone helper for both platforms:

    • Linux reads /etc/localtime (with /etc/timezone fallback, UTC last resort)
    • Windows reverse-resolves the active dynamic time-zone against the IANA table

    (01c53f0)

  • --timezone=<iana> override on location set

    • For users whose host OS timezone differs from their coordinates' real zone
    • Accepts both = and space-separated forms
    • Validates the zone is resolvable (rejects typos)
    • Tags zones as [override] or [from system OS] in success output
    • Includes inline hint pointing at the flag

    (bdb2650, 1133079)

  • SE Asia Standard Time → Asia/Jakarta
    Previously resolved to Asia/Bangkok by alphabetical accident.
    Indonesia-first default.

    (1455f0d)

  • Dropped Asia/Tehran from the Windows mapping — the project does not support Shia prayer-time calculations.

    (01c53f0)


Location command UX

  • location set no longer leaves stale state.
    Previously cached city, country, and timezone values from an earlier location auto could persist after a manual set.
    Now they are cleared properly and timezone is re-derived from the host OS.

    Closes the second half of #11.

    (925b40d)

  • location auto no longer auto-fills city
    IP-geolocated city values are often inaccurate (issue #11's reporter saw Damietta while living in Mansoura).

    country is still auto-populated since method auto-detection depends on it.

    (37e00cc)

  • New --city=<name> flag
    Available on both:

    • location set
    • location auto

    For users who want an explicit city label.

    (37e00cc)

  • User-facing examples (help output, error hints, README) now default to Asia/Jakarta instead of Africa/Cairo.

    (6949d3a)


New: sound command

Configurable notification sounds with three presets:

  • reminder
  • alarm
  • default

Linux routes presets to libnotify sound-name hints:

  • message-new-instant
  • alarm-clock-elapsed
  • none

Windows maps them to:

<audio src="ms-winsoundevent:..." />

The alarm preset loops for the toast duration.

Disabling sound emits:

  • XDG suppress-sound hint on Linux
  • <audio silent="true"/> on Windows

(0d02e7c)

New subcommands

muslimtify sound [status]
muslimtify sound on|off
muslimtify sound set <preset>            # it's-time notification
muslimtify sound reminder-set <preset>   # pre-prayer reminders

Refactor: source tree layout

  • Source files reorganized into:
src/
├── core/
├── cli/
└── platform/

(0f043fd)

  • muslimtify_lib split into:

    • muslimtify_core
    • muslimtify_cli

    OBJECT libraries.

    (b95acf0)

  • parse_timezone_offset moved into:

src/platform/{linux,windows}/timezone.c
  • src/core/location.c is back to pure curl + JSON with no time logic.

    (dd2f8b1)

  • GUI scaffolding removed from main:

    • ccompose
    • raylib
    • GTK4 launcher
    • muslimtify-gui target

    GUI development continues on the gui branch.

    (4601c1a, 0d02e7c)


CI / build fixes

  • Fixed silently-passing Windows CI.

    curl's FetchContent block leaked:

set(BUILD_TESTING OFF FORCE)

into the parent scope, causing ctest to report success with zero tests run.

Now explicitly using:

  • -DBUILD_TESTING=ON
  • --no-tests=error

on both platforms.

(e98be51, bc61426)

  • test_location is now cross-platform.

    Linked against:

    • ole32
    • runtimeobject

    on Windows because muslimtify_core pulls in notification_win.c.

    (e98be51, dd2f8b1)

  • Clang-format / clang-tidy globs updated to recurse into the new src/ subdirectories.

    (dd2b2e0)

  • MinGW cross-compile fixes:

    • case-sensitive <windows.h>
    • CURL_STATICLIB defined on Windows targets that include curl/curl.h

    (dd2f8b1)


Tests

New tests/test_location.c

83 assertions covering:

  • Northern hemisphere DST
  • No-DST fixed-offset zones
  • Fractional offsets (5:30, 5:45, etc.)
  • Southern hemisphere DST
  • Half-hour DST (Newfoundland)
  • UTC and Pacific edge cases
  • NULL input
  • Unknown zones
  • TZ env-var leak check (Linux only)

test_windows_zone_to_iana

36 cases covering every Windows zone in the mapping table.

test_get_system_timezone

New helper coverage.

CLI tests

7 new CLI cases in tests/test_cli.c covering:

  • --city
  • --timezone
  • equals and space-separated forms
  • no-flag-clears
  • missing-value rejection
  • combined flags

Verified

Linux

  • ctest: 10/10 suites pass
  • test_location: 83/83 assertions pass

Windows

  • MSVC Release build + tests via GitHub Actions
  • MinGW cross-compile to:
    • x86_64-w64-mingw32
    • working muslimtify.exe
    • working muslimtify-service.exe

Full changelog

v0.2.1...v0.2.2

v0.2.1

Choose a tag to compare

@rizukirr rizukirr released this 01 Apr 15:27

What's Changed

Features

  • feat: add country-to-method auto-detection lookup table (5ddf226)
  • feat: add 'method auto' subcommand for auto-detecting calculation method (f65c68f)
  • feat: auto-detect location and method on daemon install (Linux) (29c1fe3)
  • feat: auto-detect location and method on daemon install (Windows) (ed8bc88)

Fixes

  • fix: hardcoding version (b409306)
  • fix: link test_cmd_daemon_win against muslimtify_lib for auto-detect deps (a040d4c)
  • fix: guard auto-detect code in cmd_daemon_win for isolated test build (713ecef)
  • fix: remove rc.1 suffix and disable curl test/example builds (bf01032)
  • fix: suppress C11/C23 extension warnings on Clang (479f9c2)

Other

  • docs: update AGENTS knowledge (259956a)
  • chore: format cmd_method.c dispatch table (978377a)
  • test: add method CLI tests (show, set, list, madhab) (fcdf901)
  • chore: update REAMD.md (442342c)
  • update version (a970b80)

Full Changelog: v0.2.0...v0.2.1

v0.2.0

Choose a tag to compare

@rizukirr rizukirr released this 27 Mar 07:09

What's Changed

Windows Support

  • Add full Windows support for Muslimtify, including toast notifications with icon, Task Scheduler daemon, service helper, install/uninstall scripts, and Inno Setup installer for winget distribution

International Calculation Methods

  • Add 23 international prayer time calculation methods (MWL, Makkah, ISNA, Egypt, and more)
  • Add muslimtify method command for calculation method management
  • Add fajr_angle/isha_angle config fields for custom method parameters
  • Display full method name in config output

Platform & Architecture

  • Add platform abstraction layer (Linux/Windows)
  • Extract shared check cycle, decouple from CLI
  • Route display, persistence, and system calls through platform layer
  • Downgrade from C23 to C99 for MSVC compatibility

CI/CD

  • Add clang-format and clang-tidy CI checks
  • Add Windows build and test job

Testing

  • Add comprehensive multi-method validation (~108 data points)
  • Add unit tests for json.h, platform boundary, and Windows components

Bug Fixes

  • Fix -Wstringop-overread warning in copy_string when building with GCC and _FORTIFY_SOURCE
  • Fix MSVC C4996 (strncpy) and C4116 (unnamed type in parentheses) warnings

Cleanup

  • Remove Jafari (Shia Ithna-Ashari) and Tehran calculation methods
  • Cache prayer trigger times to avoid recalculating every minute

Full Changelog: v0.1.6...v0.2.0

v0.1.6

Choose a tag to compare

@rizukirr rizukirr released this 20 Mar 18:35

What's New

Fix the equation of time that was computed as (q / 15.0) - (RA / 15.0) without handling the 0°/360° wrap-around by Normalize the q - RA difference to [-180°, +180°] before converting to hours, so the wrap-around at the 0°/360° boundary is handled correctly.


Installation

Arch Linux (AUR)

yay -S muslimtify

Debian/Ubuntu (PPA)

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

Fedora (Copr)

sudo dnf copr enable rizukirr/muslimtify
sudo dnf install muslimtify

Build from Source

cmake -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build -j$(nproc)
sudo cmake --install build

Full Changelog: https://github.com/rizukirr/muslimtify/blob/main/CHANGELOG.md

v0.1.5

Choose a tag to compare

@rizukirr rizukirr released this 16 Mar 05:33

v0.1.5 Release Notes

Added

  • Fedora build infrastructure — with build.sh, create-copr.sh, and upload-copr.sh
  • Contributor infrastructure and documentation
  • location refresh command for one-shot location re-fetch
  • Comprehensive unit tests
  • Kemenag method documentation
  • MIT license file

Changed

  • Improved production readiness in CMake and codebase
  • Improved memory safety and security fixes
  • Updated README documentation

Fixed

  • Fixed Dhuha calculation
  • Fixed ceiling prayer checker
  • Default notification urgency to critical
  • Improved CLI defaults (show version/help by default)