Changelog

Every release spells out what changed — especially which “software told lies” bugs got fixed.

1.6 Current Oct 26, 2026

This release came out of one 6-hour trip. The home page said “6 real wakes” — the power log said the machine was awake 14 min 41 s, but the screen was actually lit for only 8 min 29 s.

  • FixedEnhanced Mode never fired, ever. Before acting it had to pass a “built-in display online means stand down” gate — and a lit display meant an open lid, meant the gate never opened. The gate is gone.
  • Changed“Power Mode” renamed “Enhanced Mode”, on by default, 10 minutes down to 5. A safety net users have to understand before daring to enable is no safety net at all.
  • AddedA “No built-in display” switch. On machines with the display physically removed, macOS still reports one, with perfectly normal dimensions, vendor, model and serial — undetectable from parameters. Without the switch, the phantom signal reads as “somebody's at the machine” and unplug-to-sleep never triggers. If your Mac's display has been removed, tick it.
  • FixedNotification said “stay near your computer”. When connected remotely you're by definition not near it — reading it told you nothing actionable.
1.5 Oct 25, 2026

This whole release came from a full day on real hardware. The core of it is one sentence: say “don't know” when you don't know, and never pretend you did.

  • FixedSlept through the night, reported “never slept”. The machine slept from midnight to morning, dropped just 4% battery — the app decided it hadn't slept and fired seven “failed to enter sleep” banners overnight. Now “couldn't read the power log” is its own verdict, distinct from “didn't sleep”; a wall-clock note is taken before and after each sleep request, and a 60-second jump means the process was suspended, which means it slept — the hardest evidence there is, no log reading required.
  • FixedThe verification window was shorter than falling asleep. After sleepnow the machine takes four or five seconds to actually sleep; the window was 4 seconds. It ruled “not asleep”, then went to read several MB of logs — got frozen mid-sleep — and woke up writing a stale verdict into the UI. Now the clock is re-checked after evidence is read, and the window is 10 seconds.
  • FixedScreen never sleeping after leaving meant the machine never slept. On AC power the system default is “display never sleeps” (displaysleep 0), and macOS system idle sleep can't precede display sleep — the written sleep 1 was dead on arrival. Now both are set together, and on restore, AC and battery profiles are written back separately.
  • FixedThree “unplugged” flashes in a row at the moment of unplugging. The system reports display topology changes several times; each one restarted the countdown. Now it returns early when a sleep is already requested or already happened.
  • FixedReal wakes went missing from the report. The parser dropped Wake from Deep Idle lines entirely (it only knew two other spellings) — and that's precisely a wake straight out of deep sleep. Meanwhile “any wake within 60 s of unplugging is our own” was too generous and swallowed the user's mid-trip keyboard touch. Now all three spellings count, the window is 15 s, and any wake attributed to keyboard/trackpad is always real.
  • FixedA docking station that never existed. macOS includes smc.70070000 in nearly every wake reason; the old build matched it as the signature of “dock power fluctuation” — so one key press got narrated as “there's a dock”.
  • FixedThe menu bar dot lingered after ending away mode. Report read, panel closed — the icon still reminded you about an already-handled thing.
  • Fixed“End away mode” did nothing. The culprit was the background retry lane: after restore, back on the home page, a late-arriving sleep verification woke up and dragged the UI back to “never slept” — every click undone once more. Every trip now carries a generation number; stale verifications stand down.
  • FixedThe unplug baseline included the built-in display. Clamshell with an external display reclaims the built-in — which got judged as “unplugged”: the user sitting right there got three sleep calls in a row. The baseline now records only real external displays, and recognizes virtual displays created by MacHead / UU remote (by vendor and model, never serial numbers — DIY portable displays often report serial 0x01010101).
  • ChangedRetired the “I've unplugged, let it sleep” button. If you truly unplugged, the panel's host display is gone — nobody can see the button. The page now speaks exactly two paths: unplug → auto sleep; don't unplug → press “Sleep now, without unplugging”.
  • ChangedPower Mode gained “lid open means don't act”, the same iron rule as “display plugged in”.
1.3 Oct 24, 2026

This one fixed “ended but not really ended”.

  • FixedSettings now restore the instant you end away mode. The old build hung “restore settings” on the report page's button: click End, and the machine sat there with Bluetooth off and pmset dirty; glance at the report, close the panel, and it stayed like that forever while you believed it was over. Now pressing “End away mode” = the trip is over: stats, restore, report, one motion. Only a failed restore needs you — failures land in the report, the state file stays, and the home page offers “Retry restore”.
  • ChangedReport page's “Got it” became “Done”. You ended the trip; it's finished — no second confirmation needed. “Done” closes the panel like any Mac results window; clicking elsewhere auto-dismisses to the same effect. Next time you open it: a clean home page, not a stale report.
  • ChangedThe stats page now says “Counting wake records and restoring your settings” so you can see it wrapping up; also dropped the duplicate “undisturbed the whole time” line from the report.
1.2 Oct 24, 2026

This one came from four pieces of real-hardware feedback. No new features — it fixed “scary to use” and “the UI vanishing at the exact moment it matters”.

  • FixedNo more counting 20 seconds on its own. The old detection page was a 20-second countdown that auto-quit your listed apps after it expired — an interface that closes your apps by itself is scary no matter how long you wait, and you had to decide before reading it through. The countdown is gone; one action remains: Close all, and nothing happens until you press it.
  • FixedNo more cursor freezes during auto-close. Root cause: synchronous subprocesses on the main thread — system_profiler took 0.5–2.5 s for Bluetooth, pmset -g assertions plus one ps per process took hundreds of ms, and the helper socket round-trip could hit 8 s. Main thread stalls, the whole UI freezes with it. Everything moved to a background queue, with a regression test: a heartbeat every 20 ms on the main thread asserting no gap over 400 ms.
  • FixedThe panel no longer disappears at the crucial moment. The old build used NSPopover — “dismiss on focus loss” — so “click Close-all → panel gone → cursor hitches → click the icon again to see the unplug prompt”. Replaced with a floating panel that doesn't hide on focus loss; the scan / detect / auto-close / blocked / ready-to-unplug / away pages are marked must stay visible: no hiding, and they reposition themselves if moved off.
  • FixedThe detection page no longer asks you to report back. The old flow, after “I'll close them myself”, required returning to press “I've closed them, continue”. Whether they're closed is something the machine can check by itself — now it rescans every 1.5 s, the list shrinks live, and it moves on automatically when clean. Zero buttons.
  • AddedAn “Auto-closing” page. Items check off one by one, the current one spinning. Those few seconds used to be a frozen window where you could only guess if it died.
  • AddedStatus labels. The color dot with no text in the top-left is now a labeled pill: “At Home”, “Preparing”, “Working”, “Ready to Unplug”, “Away”, “Needs You”, “Counting”, “Back”.
  • ChangedCopy. Detection page cut from four lines of 10pt gray to two, bumped to 11–12pt — small text piled up is the same as unwritten. Dropped sentence-final periods from UI copy; added one plain line above the buttons: “Close them yourself, or press below to close all”.
  • Fixed“Make it sleep” flashing the screen on and off. Root cause wasn't sleep logic — it was retry count. With a display attached, pmset sleepnow actually does: “screen blanks → WindowServer grabs a PreventSystemSleep assertion and yanks the system back → screen relights”. The old build retried 3 times: three flashes. Retries happen only when the cable is really gone; plugged in, it tries exactly once, and the failure reason now speaks plainly: “display still attached — system was pulled back right after falling asleep”.
  • FixedRunning tests no longer floods the real log with fake entries. One swift test wrote dozens of “requested system sleep ✓” lines into app.log — which derailed the screen-flash investigation.
1.1 Oct 24, 2026

This one was a hardware rematch. Version 1 “never succeeded once on real hardware” — the user unplugged the display, unplugged power, waited, and the keyboard backlight stayed lit. The post-mortem found five problems, all rooted in the software lying. This release fixed them one by one.

  • FixedBluetooth state no longer fools itself. The old build wrote the preference file and read its own value back — “success” forever, Bluetooth still on. On macOS 15 that old trick is fully dead. Now it reads real state via system_profiler, and only calls the private API when Bluetooth permission is actually granted (without it, the call gets the process killed outright).
  • FixedRequested sleep ≠ slept. pmset sleepnow blocked by an assertion returns no error — it just does nothing. The old build switched to “Away” as long as nothing threw, with a hardcoded “system has entered sleep” line. Now it re-reads the log after requesting to confirm a real Entering Sleep, retries up to three times; after three failures it stops in place and tells you who's holding the assertion — never fakes the departure.
  • FixedUnplug detection now reads IDs, not counts. The real reason the light never went off. After unplugging, CGGetActiveDisplayList still returned 1 — a ghost display holding the slot; the count never reached 0, the countdown never started. Now it judges by baseline display IDs, plus EDID vendor/model comparison against a ghost reusing the original ID.
  • FixedFailed restores no longer eat the snapshot. The old build cleared the state file even on failure — the next “original settings” snapshot captured the dirtied values, and from then on restore was permanently impossible: a self-hardening bug. Failures now keep the snapshot; the home page shows “last restore failed” with a retry.
  • FixedSharing services judged by port. Not just the launchctl switch — it checks whether anyone is still listening on 445 / 5900 / 548. That's “actually off”.
  • AddedPower Mode. If the machine stays continuously awake for 10 minutes during away mode, force sleep, 30 s cancelable. Never acts while a display is attached or someone is remote-logged-in. Off by default, enable in Settings.
  • AddedThe --diagnose checkup command. One command prints who's blocking sleep on your machine, current pmset settings, Bluetooth state, scheduled wake tasks. Read-only, changes nothing.
  • AddedAn escape-hatch button on the unplug page. If some machine's display stack is stranger than imagined, you can still put it to sleep right there — no getting stuck on that page.
  • ChangedWake stats gained an exclusion rule: the wake from plugging the display back in doesn't count — you're standing right there. One false alarm and you'd never trust it again.
  • ChangedIn the wake breakdown, dark and notification wakes collapse into “background wakes ×N”; only real wakes get red marks. Stops every trip from nagging you about trivia.
  • ChangedReport suggestions only cover what software can still control; hardware and human factors just get stated as facts — “the external keyboard is still connected, unplug it before you go”, not a list of things you can't do anyway.
  • ChangedProduct name shortened from HeadlessKnightMaster to Knight. Finder, Activity Monitor and crash reports all display it — nobody can pronounce the long one.
1.0 Oct 23, 2026

First runnable version. The feature skeleton was complete, but due to the five problems above, it never actually succeeded on real hardware. Kept here as a record.

  • AddedMenu bar app, 12 screens, one 300pt window, never a second one.
  • AddedAway mode as a transaction: snapshot on entry → apply changes → on leave, read state, audit the log, report, restore the snapshot.
  • AddedNine automatic actions: close sleep-blocking apps, lock sleep settings, Bluetooth off, network wake off, Power Nap off, TCP Keepalive off, clear scheduled wakes, pause Time Machine, disable sharing services.
  • AddedThree-tier wake classification: dark / notification / real.
  • AddedRoot background daemon over a Unix socket, peer uid checked via getpeereid() instead of XPC — ad-hoc signing has no team ID, so XPC signature checks would fail.
  • Added198 test cases in 14 groups — one of them named “honesty tests”, guarding the “never say false things” line.

Want the current version?

Download 1.6