Skip to content

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.