Skip to content

Instantly share code, notes, and snippets.

@tamsky
Last active December 15, 2025 20:41
Show Gist options
  • Select an option

  • Save tamsky/329410a76d54164f33b0a9c816fb0c52 to your computer and use it in GitHub Desktop.

Select an option

Save tamsky/329410a76d54164f33b0a9c816fb0c52 to your computer and use it in GitHub Desktop.
-- Define a logger for debugging (optional)
local log = hs.logger.new("caffeinate-watcher", "info")
-- Create the function that will be called when a power event happens
local function handleCaffeinateEvent(event)
-- Get the string name of the event for logging
local eventName = hs.caffeinate.watcher[event]
log.f("Got caffeinate event: %s (id: %d)", eventName, event)
if event == hs.caffeinate.watcher.screensDidLock then
-- Code to run when the screen is locked
hs.alert.show("Screen Locked!")
-- Example: Execute a shell command/script
-- hs.execute("${HOME}/.lock_script.sh")
elseif event == hs.caffeinate.watcher.screensDidUnlock then
-- Code to run when the screen is unlocked
hs.alert.show("Screen Unlocked!")
-- Example: Execute a shell command/script
-- hs.execute("${HOME}/.unlock_script.sh")
else
-- Ignore other events like system sleep, screensaver, etc.
log.f("Ignored event: %s", eventName)
end
end
-- Create the watcher object and start it
local caffeinateWatcher = hs.caffeinate.watcher.new(handleCaffeinateEvent)
caffeinateWatcher:start()
log.i("Caffeinate watcher started.")
-- hammerspoon script
-- run key security scripts when the screen is locked and unlocked
-- NOTE this requires a patched Hammerspoon for the
-- session, screen saver, and screen lock hooks.
local pow = hs.caffeinate.watcher
local log = hs.logger.new("ssh-lock")
local function ok2str(ok)
if ok then return "ok" else return "fail" end
end
local function on_pow(event)
local name = "?"
for key,val in pairs(pow) do
if event == val then name = key end
end
log.f("caffeinate event %d => %s", event, name)
if event == pow.screensDidWake
or event == pow.sessionDidBecomeActive
or event == pow.screensaverDidStop
then
log.i("awake!")
local ok, st, n = os.execute("${HOME}/bin/unlock_keys")
log.f("unlock_keys => %s %s %d", ok2str(ok), st, n)
return
end
if event == pow.screensDidSleep
or event == pow.systemWillSleep
or event == pow.systemWillPowerOff
or event == pow.sessionDidResignActive
or event == pow.screensDidLock
then
log.i("sleeping...")
local ok, st, n = os.execute("${HOME}/bin/lock_keys")
log.f("lock_keys => %s %s %d", ok2str(ok), st, n)
return
end
end
pow.new(on_pow):start()
log.i("started")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment