Releases: muslimtify-org/muslimtify
Release list
v0.3.1
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 onedate=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 --nextrollover after the last prayer of the day. When every enabled prayer for today has already passed,--nextcorrectly 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--nextrenderers and is covered by new CLI tests.show --datehelp 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.mp3is now shipped inside the Fedora and Windows packages. - CI:
action-gh-releasebumped 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
--dateacross table, JSON, and headless output (#35) - fix(show):
--nextshows 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
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.soundchanged from a boolean to a mode string:adhan,default, oroff. New keyssound_alarmandsound_reminderwere added.- Each prayer gained
adhan(a sound-file path),adhan_enabled(bool), andoffset(minutes). The old per-prayerreminder_soundkey was removed. - The default
notification.urgencyis nowcritical.
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, andnotificationall support--jsonand--headlessfor scripting.method --autoselects the calculation method from your saved country, detecting your location first if no country is set.location setprints 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
0600permissions 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
#ifdefin 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
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_TESTtest 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
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=simpleservice; themuslimtify.timerunit is removed entirely. - Upgrades from earlier (timer-based) versions are healed automatically — a leftover
muslimtify.timeris 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 runruns 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=simpleservice withRestart=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/statusnow 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 installdisables and removes a leftover timer. The check is guarded, so a clean first-time install does nothing here. Because the Debianpostinstand Fedora%postboth calldaemon install, PPA and COPR upgrades self-heal with no manual steps.install.shdisables the stale timer and removes any previously shipped unit before enabling the service.muslimtify daemon uninstallnow 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_filetemplate (systemd/muslimtify.service.in) with the install prefix substituted at build time, so there is no hardcoded executable path. muslimtify.timeris removed from the CMake install list, the Fedora spec%files, the Debian packaging, andinstall.sh.install.shrenders 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
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 autocommand — 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_detecthelper that also powers auto-detection during daemon install. --country=<code>flag forlocation 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-formatfix for the_WIN32_WINNTmacro intimezone.c.
CI & Build
- Linux
build-and-testmatrix 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
bsearchlookups 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 autoandmethod autosubcommands were removed — useconfig autoinstead.
Full changelog: v0.2.2...v0.2.3
v0.2.2
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
tzdbon Linux (setenv TZ+tzset+tm_gmtoff, with TZ save/restore) - Win32 implementation on Windows (42-entry CLDR-derived IANA → Windows table +
EnumDynamicTimeZoneInformation+SystemTimeToTzSpecificLocalTimeExfor DST-aware offsets)
- libc
-
get_system_timezonehelper for both platforms:- Linux reads
/etc/localtime(with/etc/timezonefallback, UTC last resort) - Windows reverse-resolves the active dynamic time-zone against the IANA table
(01c53f0)
- Linux reads
-
--timezone=<iana>override onlocation 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
-
SE Asia Standard Time → Asia/Jakarta
Previously resolved toAsia/Bangkokby alphabetical accident.
Indonesia-first default.(1455f0d)
-
Dropped
Asia/Tehranfrom the Windows mapping — the project does not support Shia prayer-time calculations.(01c53f0)
Location command UX
-
location setno longer leaves stale state.
Previously cachedcity,country, andtimezonevalues from an earlierlocation autocould persist after a manualset.
Now they are cleared properly and timezone is re-derived from the host OS.Closes the second half of #11.
(925b40d)
-
location autono longer auto-fillscity
IP-geolocated city values are often inaccurate (issue #11's reporter sawDamiettawhile living inMansoura).countryis still auto-populated since method auto-detection depends on it.(37e00cc)
-
New
--city=<name>flag
Available on both:location setlocation auto
For users who want an explicit city label.
(37e00cc)
-
User-facing examples (help output, error hints, README) now default to
Asia/Jakartainstead ofAfrica/Cairo.(6949d3a)
New: sound command
Configurable notification sounds with three presets:
reminderalarmdefault
Linux routes presets to libnotify sound-name hints:
message-new-instantalarm-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 remindersRefactor: source tree layout
- Source files reorganized into:
src/
├── core/
├── cli/
└── platform/
(0f043fd)
-
muslimtify_libsplit into:muslimtify_coremuslimtify_cli
OBJECT libraries.
(b95acf0)
-
parse_timezone_offsetmoved into:
src/platform/{linux,windows}/timezone.c
-
src/core/location.cis back to pure curl + JSON with no time logic.(dd2f8b1)
-
GUI scaffolding removed from
main:- ccompose
- raylib
- GTK4 launcher
muslimtify-guitarget
GUI development continues on the
guibranch.
CI / build fixes
-
Fixed silently-passing Windows CI.
curl's
FetchContentblock 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.
-
test_locationis now cross-platform.Linked against:
ole32runtimeobject
on Windows because
muslimtify_corepulls innotification_win.c. -
Clang-format / clang-tidy globs updated to recurse into the new
src/subdirectories.(dd2b2e0)
-
MinGW cross-compile fixes:
- case-sensitive
<windows.h> CURL_STATICLIBdefined on Windows targets that includecurl/curl.h
(dd2f8b1)
- case-sensitive
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 passtest_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
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
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 methodcommand for calculation method management - Add
fajr_angle/isha_angleconfig 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-overreadwarning incopy_stringwhen 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
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 muslimtifyDebian/Ubuntu (PPA)
sudo add-apt-repository ppa:rizukirr/muslimtify
sudo apt update && sudo apt install muslimtifyFedora (Copr)
sudo dnf copr enable rizukirr/muslimtify
sudo dnf install muslimtifyBuild from Source
cmake -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build -j$(nproc)
sudo cmake --install buildFull Changelog: https://github.com/rizukirr/muslimtify/blob/main/CHANGELOG.md
v0.1.5
v0.1.5 Release Notes
Added
- Fedora build infrastructure — with
build.sh,create-copr.sh, andupload-copr.sh - Contributor infrastructure and documentation
location refreshcommand 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)