s3onghyun/bulchimbeon is a macOS menu bar app that keeps the Mac from locking only while an AI agent is working. The 2026-11-06 commit f58eedd (PR #69) changed the menu bar sprite animation so that it stops entirely when it is not visible. When the screen is locked, the display is in sleep, or the status item window is completely covered, frame scheduling drops from 2 times per second to 0 times, and in low power mode it falls to 0.67 frames per second.
The implementation does not periodically ask about the state and instead listens only to system notifications. It uses NSWorkspace's screen sleep and wake notifications, the distributed notification center's com.apple.screenIsLocked and com.apple.screenIsUnlocked, and NSWindow's occlusion state change notification to compute the visibility of the status item window and switch state accordingly. The timer has a tolerance, and poses with only a single frame do not schedule a timer at all. The decision logic went into the newly added Sources/BulchimbeonCore/MenuBarAnimationPolicy.swift, and the tests grew along with it. The change covers 8 files, combining code and documentation, with 189 lines added and 12 lines deleted.
There is a caveat, however: macOS duplicates a single NSStatusItem and draws it on each screen, and AppKit does not report the status item per clone or the active display information. If the standard menu bar item is not discarded, it can behave differently from screen to screen, and so the visible animation is identical on all active displays. The measurements also need to be read carefully. On 2026-11-06 with an M5 Pro, on AC power, with the built-in panel and two LG 4K monitors, taking five 2-second samples of top (patrol mode on) gave CPU 2.04% and 167 context switches per second before the change, and CPU 1.58% and 186 per second after the change. Since this macOS's top has no per-process wakeup counts, context switch was used as a proxy indicator, and the README does not claim an improvement in the speed of the visible animation. This change remains only in the next-version entry of the CHANGELOG, and the confirmed release below it is 0.12.0 — 2026-11-02.