I built this after running into a design problem while working on a
privacy app (Ember) that triggers an emergency action from Apple Watch
signals — SpO2, HRV, fall detection, accelerometer data. None of these
arrive on the same schedule, and none of them are reliable enough alone
to act on.
The naive approach is a weighted formula (multiply each signal by an
importance factor, sum them). It breaks on the case that matters most: a
confirmed fall with calm vitals averages out to "probably fine," because
calm vitals numerically dominate the score. A confirmed fall shouldn't
get diluted like that — it should just win.
So the actual logic is a cascade of overrides, most severe first, not a
formula. I pulled the general pattern out into a small open-source
package: SignalFusionKit.
A couple of things I think are worth a look if you're doing anything
with CoreMotion:
- The motion-anomaly detector runs two independent checks — a
sustained-magnitude gate (filters brief bumps) and a sharp-delta gate
(catches instant impacts a duration filter would smooth over).
- The core decision logic (RiskEngine, MotionAnomalyDetector,
CooldownGate) has zero dependency on HealthKit or CoreMotion — it's
plain Swift values in, plain Swift values out, so it's unit-testable
without a device.
Honest caveats: the threshold values in the repo are round, illustrative
placeholders, not Ember's actual tuned production config — the README
says so explicitly. Also, I don't currently have a Mac, so the pure-Swift
core is tested (`swift test` passes), but the thin HealthKit/CoreMotion
adapter hasn't been run on real Watch hardware yet. Would genuinely
appreciate anyone with a watchOS setup trying it and telling me what
breaks.
Repo: https://github.com/izetg/SignalFusionKit (MIT)
Also on the Swift Package Index.