Repository navigation
Releases
Yowl 1.3.2
On Windows? Get Yowl from the Microsoft Store. The download below is for Mac.
Keep screaming with the lid closed: if installing the helper fails, Yowl now says why, instead of only showing "Helper: not installed". Cancelling the password prompt still reads as not authorised; anything else shows the underlying error (#1).
The install now checks only Yowl's own sudoers file afterwards. Before, a broken rule left by another app in /etc/sudoers.d failed the install even though Yowl's was valid. A rule that fails the check is removed rather than left behind.
309 tests. Signed and notarised, universal.
Yowl 1.3.1
Clicking the word Settings now opens and closes the settings, not just the small triangle beside it. The panel is unchanged otherwise.
Also adds the button trait and an expand/collapse hint for VoiceOver, which the previous label did not carry.
305 tests. Signed and notarised, universal.
Yowl 1.3.0
You can now choose how long the siren keeps the Mac awake with the lid shut.
30 seconds, 1 minute, 2 minutes or 5 minutes, defaulting to a minute. The option
appears once Keep screaming with the lid closed is switched on.
The ceiling is fixed at five minutes and is not adjustable, because it is not
really a preference: every extra minute is another minute a laptop shut in a bag
cannot sleep, which is a thermal question. The value is clamped when written and
again when read, so a hand-edited preference cannot hold a machine awake for an
hour.
Everything else is unchanged — the hold is still taken once when the siren
starts, released the moment you disarm, and released by a detached watchdog even
if Yowl is force quit.
305 tests. Signed and notarised, universal.
Yowl 1.2.0
The siren now keeps going with the lid closed — and this time it actually works.
Closing the lid begins a sleep, and the speakers power down at the start of
that transition. Deferring the sleep doesn't help; the sleep has to not begin.
The only setting that prevents it is pmset disablesleep, which is root-only.
Keep screaming with the lid closed is off by default. Switching it on asks
once for your administrator password and installs one rule:
<you> ALL=(root) NOPASSWD: /usr/bin/pmset -a disablesleep 1, \
/usr/bin/pmset -a disablesleep 0
Two absolute paths, fixed arguments, scoped to your account, validated with
visudo -c before and after. Nothing else is granted. Delete
/etc/sudoers.d/yowl-disablesleep or untick the setting to revoke it.
It holds for about a minute, once. Deliberately not renewed — a minute makes
someone put a laptop down, while an alarm that kept a bagged machine awake
indefinitely would be the more dangerous failure. A detached watchdog releases it
even if Yowl is force quit, and disarming releases it immediately.
This replaces the launchd/XPC helper from 1.1.x, which registered cleanly,
reported enabled, and was never started by launchd — and whose failure path
crashed the app on arm. That design is gone entirely; no daemon ships any more.
301 tests. Signed and notarised, universal.
Yowl 1.1.3
Fixes a crash on Arm introduced in 1.1.0. Update if you are on 1.1.0 or 1.1.1.
If you had switched on "keep screaming with the lid closed", arming the alarm
crashed the app. The @objc XPC protocol and its callbacks were main-actor
isolated — XPC invokes those blocks on its own queues, and an Objective-C API
carries no isolation information to prevent it, so the runtime trapped as soon
as the error block ran. It ran on every arm.
Also fixed: the settings switch could not be turned off. uninstall() opened a
connection to the very helper it was removing, so the call never returned and the
unregister never happened. Unregister now comes first, and the switch follows
your click rather than a system query that can stall.
Known limitation, stated plainly: the closed-lid feature still does not work.
The helper registers and reports enabled, but launchd never starts it. It is
being rebuilt on a different mechanism. Everything else in the app is unaffected.
296 tests. Signed and notarised, universal.
Yowl 1.1.0
Superseded by 1.1.3 — this release crashes on arm if the closed-lid setting is enabled, and its settings switch cannot be turned off again. Please update.
The siren can now keep going with the lid closed — if you switch it on.
Closing the lid used to silence the alarm, and everything I tried first failed
for the same reason: the speakers are powered down as the Mac begins to sleep,
so deferring the sleep doesn't help. The only thing that works is stopping the
sleep from starting, and that setting is root-only.
So there's a new checkbox: Keep screaming with the lid closed.
- Off by default. Nothing privileged is installed unless you ask for it.
- Switching it on registers a helper that you then approve in System Settings, and can revoke there.
- The helper has no entitlements and exactly two commands: hold sleep off, let it go.
It lets go by itself. After 60 seconds without the alarm renewing it, when the
alarm stops, when it exits, and when it starts. A laptop that can't sleep, shut
in a bag with the camera running, is a fire risk — so holding sleep off has to be
continually re-earned, and releasing is what happens by default.
On Macs where this doesn't work, the helper reports failure and the app
behaves exactly as before rather than promising a siren a closed lid will
silence. pmset exits 0 for settings it ignores, so success means the flag was
read back and had actually changed.
It's about sixty lines — Sources/YowlHelper/main.swift — and worth reading
before you approve it. The privacy policy describes it in full.
295 tests. Signed and notarised, universal.
Yowl 1.0.4
Correction (see 1.0.5): this release claimed it fixed the siren being
silent with the lid shut. It did not. A MacBook produces no sound with the lid
down regardless of the engine, the device, the volume or the mute flag —
measured directly with a probe sampling the hardware four times a second.
The audio engine is no longer trusted blindly.
"Is the siren playing" was the app's own boolean rather than the engine's actual
state, so a stopped AVAudioEngine was reported as a sounding siren. The engine
is the authority now, and the volume hold that runs every second also restarts it
if it has died.
That is a real fix for a real bug — it just was not the reason a closed lid is
silent.
283 tests pass. Signed and notarised, universal.
Yowl 1.0.3
Correction (see 1.0.5): this release claimed the siren keeps screaming for
30 seconds after the lid is shut. That is wrong. The sleep deferral works — the
Mac genuinely stays awake — but a MacBook produces no sound with the lid down,
whatever the volume and mute flags say. Measured, not assumed.
Holds the Mac awake for 30 seconds after the lid closes.
An app registered with IORegisterForSystemPower is asked before the Mac sleeps,
and a caller that withholds its acknowledgement stalls the sleep for the system's
30-second timeout. While the alarm is firing, Yowl withholds it. Idle sleep,
which can be cancelled outright, is refused for as long as the alarm runs.
This is genuinely useful — it gives the photographs time to upload and the push
time to arrive — but it does not keep the siren audible. See the correction
above.
A Mac that is not firing sleeps exactly as it always did.
Yowl 1.0.2
It notices a theft about ten times faster.
Reported as taking a few seconds to register a grab. The detector was never the
slow part — measured at 320×240 it costs 10.3ms a frame, enough for ~97 fps. The
delay was policy:
- Frames arrived at 5 fps, and firing wanted three consecutive hits.
- Three frames at 5 fps is 600ms at best, and a real grab is jerky — one frame
dipping below the threshold reset the count to zero and the wait started over.
Now firing wants three hits within the last five frames, at 15 fps. A
single dip no longer throws the evidence away, while hits spread thinly still do
not fire — so a busy café cannot accumulate its way into an alarm.
Detection now lands around 200–330ms.
Costs about a seventh of one core while armed, which is less than holding the
camera open costs in the first place.
279 tests pass. Signed and notarised, universal.
Yowl 1.0.1
The alarm now sounds again when the Mac wakes.
Closing the lid all the way sleeps the Mac and the siren stops with it. No
application can prevent that — Apple's own documentation says the system sleeps
on lid close whatever you assert, and the override that used to force it does
not exist on Apple Silicon. Forcing it would be the wrong thing anyway: a laptop
that cannot sleep, shut in a bag with the camera running, is a thermal problem.
What was broken is that nothing restarted the alarm afterwards. Now:
- It sounds again on wake — which is exactly the moment someone opens the lid.
- A wake after a normal disarm stays silent, so opening your laptop the next morning does not scream at you.
- You get a last push before it sleeps, so you know the siren stopped because the Mac slept, not because someone disarmed it.
The lid trigger still fires around 80° before the lid shuts, so the siren, the
screen lock, the photographs and the push all happen before sleep.
Also fixed: both system-notification observers were capturing a main-actor
callback inside a @Sendable block — a data-race warning that 1.0.0 shipped
with. The release build is warning-free.
275 tests pass. Signed and notarised, universal, 1.2 MB.