Repository navigation
SalahKit 0.2.0
SalahKit 0.2.0 adds widgets that build their own timelines, SwiftUI building blocks you restyle, and prayer alerts within the system's notification limit, each with working examples. The contracts are RFC 0003 (SalahAlerts) and RFC 0004 (SalahWidgets and SalahUI); the changes are in the CHANGELOG. Documentation: https://salah-kit.github.io/SalahKit/.
Proven
- SalahWidgets (44 tests): reload gating in
SharedValue(an unchanged save writes and reloads nothing; a process's registered defaults don't count); seven days of successive 48-hour timelines with a fixed clock, checked every five minutes and around every entry and event, including a provider call 30 hours late (the expired entry shows exactly until it comes), static-text steps, high latitudes, a timetable's partial row, missing day and end, and initial missing data;DarwinSignalacross processes, with a helper process posting and observing, and no delivery after cancel or release even for a signal already in flight. - SalahUI (39 tests): the color math equals Salah's own on a grid of colors and its palette; snapshots of the default styles at every SalahFixtures moment, in English (left to right) and Arabic (right to left), on macOS 26 and 27, rendered again in a process at UTC+14 to show times never follow the device's zone; narrow rows keep the next prayer's name and never break a time; no countdown or time is shown where the state doesn't know the next prayer.
- PhoneWidgets, on an iPhone 17 simulator with iOS 27: the widget added to the Home Screen by XCUITest; the real extension reads the app's settings through the App Group, looks the names up in Arabic chosen in the app while the simulator runs in English, and builds a timeline only after a changed save; every widget family names the next prayer for VoiceOver; 26 unit tests, including seven days of timelines with a late provider call. Inside the extension, a 48-hour timeline took 4.7 to 356 ms (356 ms for the first call after the extension started cold; the median was under 8 ms) at a 7 to 19 MiB footprint.
- WatchComplication, on a paired iPhone 17 and Apple Watch Series 11 simulator pair (iOS and watchOS 27): the missing-settings view, a settings change sent over WatchConnectivity, the watch working from its stored inputs with the iPhone app closed, the ended-timetable and expired views, and the complication extension's own log of timelines built from the Smart Stack; 25 unit tests.
- SalahAlerts (84 tests, 120 vectors): the planner, scheduler and engine against 60 alert-planning and 60 reconciliation vectors on macOS (vectors and planner tests on Linux too); CalculatedPhone's alert journey on an iOS 27.0 simulator and on CI's iOS 26.2 simulator: permission through Springboard, alerts delivered with the app closed, the pending requests read back after a time change and an injected failure, 64 of 70 probe requests kept.
- CI on the tagged commit (run 38515965882): macOS with Xcode 26.6 (368 tests, builds for iOS, watchOS, tvOS and visionOS simulators, a MainActor-isolation build, the snapshots at UTC+14), Linux with Swift 6.2 and the latest Swift, both default-isolation builds, lint, and the MosqueBoard, CalculatedPhone, PhoneWidgets and WatchComplication jobs. The documentation of all six modules builds with warnings as errors and is published (run 38515965883).
Pending
These need a person, a device or elapsed time. Nothing here is claimed by this release. Each issue has the steps.
- PhoneWidgets on a real iPhone for seven days without opening the app or attaching a debugger, recording each timeline the extension built (#23).
- The timeline's cost on the oldest supported iPhone, an iPhone XS or XR with iOS 17 (#24).
- WatchComplication on a real Apple Watch: the complication on a face and in the Smart Stack, a settings change, the iPhone app closed, the ended timetable, and VoiceOver on the corner complication (#25).
- The widget-to-running-app stop round trip moves to 0.3.0 with the MenuBar example, which covers it; a real tap on the widget is #29.
- SalahAlerts on devices: closed-app delivery on a real iPhone (#22), and in-process reminders across a real Mac's sleep and wake (#28).
- Native-speaker review of the examples' Arabic strings (PhoneWidgets, WatchComplication, and CalculatedPhone's 25 alert strings), all marked as needing review (#33, #34, #32).
- Outside review of RFC 0003 and RFC 0004 by developers who aren't building Salah (#43).
Known limitations
- On the iOS 27.0 simulator, notification requests added after the first permission were rejected ("Source is not authorized") until the simulator restarted; whether devices do the same is pending.
- A
.stateChangestimeline has no entry at midnight, so a widget that lists the day's times adds one at each midnight; PhoneWidgets shows how (RFC 0004 §9). - On an iOS 27 simulator, WidgetKit ran a foreground app's first reload request at once and held later ones until the app went to the background or about 90 seconds passed.
- SalahUI's plain styles draw passed rows and the next prayer's time in the system's secondary color: 3.3 to 3.4:1 in light mode, above
ContrastCheck's 3:1 default but below WCAG's 4.5:1 for body text. - The watch journeys and PhoneWidgets' Home Screen journey don't run on hosted CI runners (the watch simulator timed out launching the app; adding a widget needs Springboard); they run locally.
- Snapshot references exist for macOS 26 and 27; a new macOS version needs its own.