Repository navigation
SalahKit 0.4.0 adds shared missing rows, selectable countdown/count-up focus, civil-day widget entries and handled-alert exclusions. CalculatedPhone uses the missing-row API, MenuBar uses the focus and alert APIs, and PhoneWidgets/MenuBar use the day-boundary option alongside Salah.
PrayerRowConfiguration.event and time are now optional. Styles should use kind for every row, unwrap known events and handle gapReason for missing kinds. Known-only lists keep their order and appearance. The CHANGELOG and RFC 0004 describe the migration. Documentation and example clocks now use the locale's short time format, matching SalahUI in 24-hour locales.
On an explicit clock change, call engine.excludeHandledOccurrencesFromNotifications() before updating or resyncing. Every replan passes engine.notificationExclusions(at: now) to the planner's excluding: set. The engine retains the marked occurrences across later refreshes; ordinary wakes, activation and time-zone changes do not mark new ones. The alerts RFC documents the ordering and retention limits.
Proven
-
Swift Package Index, 2026-10-14. SalahKit is listed after PackageList PR #15688 was accepted. Its compatibility builds hadn't run yet (see Known limitations).
-
Documentation update, 2026-10-14. The 0.4.0 tag and package runtime are unchanged. Current main clarifies the retained consumer calculation policies, timetable source terms and fictional fixture, and the examples' existing semantic-color policy. The adoption guide covers entry points and integration evidence.
-
Final package tests, strict formatting, both default-isolation settings, supported Apple platform builds and strict DocC: 405 tests pass; all four generic simulator platforms build; both isolation configurations, strict formatting and DocC pass. Focus and missing-row tests render the public views/styles; known-only snapshots remain unchanged, including the UTC+14 check.
-
Clock-rollback regressions: without the retained-state fix, the MenuBar and Salah regression tests fail at their ordinary-refresh and wake replay assertions; with it, 96 alert tests, 49 local app-hosted MenuBar tests and 31 Salah alert tests pass. The regressions cover an early engine report, system delivery, rollback into the early window and later ordinary refreshes, while preserving early requests not yet delivered. The 74 alert and 60 reconciliation vectors include five stateful exclusion cases. Those vectors come from an independent Python model and cover retained marks, callback history, expiry, relaunch, capacity, coverage, reminders, namespaces and changed fire dates; all 120 original alert/reconciliation vectors remain unchanged.
-
Local MenuBar and PhoneWidgets app-hosted tests execute the real timeline constructors and verify civil-day/DST turnover, state lookup and entry limits. CalculatedPhone passes 46 unit tests and 10 simulator journeys, including missing polar-day/night rows, Arabic and invalid input.
-
Salah's 450 existing visual baselines pass unchanged using the candidate UI APIs; no image was re-recorded. Its release records final app and signed-app gates.
-
The RFC 0003 and RFC 0004 amendment entries name second consumers. Each amendment was posted to its RFC's discussion, with the maintainer's waiver of the one-week comment window for these pre-1.0 additions: RFC 0003 amendment and RFC 0004 amendment.
-
Final exact-commit CI: CI and Docs for
74c4b7992fe4406056ef47e51771d86774dcd301.
Pending
These checks need a person, a device or elapsed time. Most are carried forward from 0.3.0 and 0.2.0, and each issue gives the steps, the expected observations and what to record:
- A real tap on MenuBar's desktop-widget Stop button (#29). The process harness runs the intent's code in a sandboxed stand-in; a tap observes the extension WidgetKit launches.
- MenuBar across actual Mac sleep/wake and clock changes, including real banners, rollback and a subsequent ordinary refresh (#28).
- MosqueBoard on a physical Apple TV connected to a TV: overscan, screen saver and reading distance (#27).
- PhoneWidgets unopened on a physical iPhone for seven days (#23), and timeline cost on an iPhone XS/XR or the oldest supported available phone (#24).
- WatchComplication on a paired physical Apple Watch, including face/Smart Stack turnover and VoiceOver (#25).
- CalculatedPhone alert delivery with a physical iPhone's app closed, plus overnight reminders, changed times and the first-permission case (#22).
- In-process reminders across actual Mac sleep/wake: MenuBar runs the engine, so #28 covers them.
- Native-speaker review of the examples' marked Arabic translations and day-offset wording (#31, #32, #33, #34, #35).
- Outside API review of RFC 0003 and RFC 0004 (#43). The waived comment window does not establish outside adoption.
- Carried over from 0.1.0: MosqueBoard on a physical iPad (#26); VoiceOver and the largest text sizes on a physical iPhone or iPad (#30); native-speaker review of SalahCore's prayer names in Urdu, Persian, Bengali, Turkish, Indonesian and Malay (#36, #37, #38, #39, #40, #41); and whether Arabic in the Maghreb should default to Latin digits (#42).
Known limitations
-
Plain styles and examples retain platform semantic secondary text under RFC 0004 §8 #6. Recorded light-mode body-text contrast can fall below 4.5:1; applications needing that floor must restyle it. CalculatedPhone's orange warning outline is decorative, with meaning carried by its primary-colored warning symbol/text. These examples do not claim blanket WCAG AA compliance.
-
Hosted CI skips the PhoneWidgets Home Screen extension journey and two paired WatchComplication companion journeys. It passes PhoneWidgets’ 28 unit tests/four app journeys and WatchComplication’s 25 unit tests/one standalone companion journey; physical widget and paired-watch checks remain pending. CalculatedPhone passes 46 unit tests and all 11 journeys.
-
With “Play the app's tone” on, MenuBar's system requests carry no sound. A notification delivered while the app is quit is silent. With the option off, the system plays its sound and the app plays none.
-
A static countdown shows time remaining at its entry's date, rounded down, and can overstate current time remaining by up to one update step.
-
The macOS XCUITest runner cannot start the separate sandboxed Stop harness; the round trip uses a hostless test bundle. CI's MenuBar run is unsigned without the sandbox/App Group; the signed sandboxed path is local.
-
The iOS 27.0 simulator rejected requests immediately after first notification permission until restart. The same case remains to observe on a physical device.
-
Handled occurrences record engine reports rather than proven OS delivery and are not persisted. Relaunch or retention expiry ends replay protection. Handling a clock change during the early-report window can remove a pending request before system presentation.
-
Swift Package Index compatibility builds had not completed when this was checked on 14 and 15 October 2026 (zero builds; the index reported a build backlog). The listing is not compatibility evidence until they run; the CI runs above are.
-
Package 1.0 still requires the ecosystem's shipped-consumer, outside adoption, review, language and device evidence conditions.