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.