// SleepToggle — tiny menu bar toggle for `pmset -a disablesleep`. // MIT License — Copyright (c) 2026 sleep.138.dk. No warranty of any kind. // ☕ cup = sleep disabled (Mac stays awake, even lid-closed); ☾ moon = normal sleep. // Needs the passwordless sudoers rule from install.sh (sudo -n fails otherwise). import AppKit final class AppDelegate: NSObject, NSApplicationDelegate, NSMenuDelegate { var statusItem: NSStatusItem! let stateLine = NSMenuItem(title: "", action: nil, keyEquivalent: "") let toggleItem = NSMenuItem(title: "", action: nil, keyEquivalent: "") func applicationDidFinishLaunching(_ note: Notification) { NSApp.setActivationPolicy(.accessory) statusItem = NSStatusBar.system.statusItem(withLength: NSStatusItem.variableLength) let menu = NSMenu() menu.delegate = self menu.autoenablesItems = false stateLine.isEnabled = false toggleItem.target = self toggleItem.action = #selector(toggle) menu.addItem(stateLine) menu.addItem(NSMenuItem.separator()) menu.addItem(toggleItem) menu.addItem(NSMenuItem.separator()) menu.addItem(NSMenuItem(title: "Quit SleepToggle", action: #selector(NSApplication.terminate(_:)), keyEquivalent: "q")) statusItem.menu = menu refresh() // Track changes made outside the app (terminal pmset, another session). Timer.scheduledTimer(withTimeInterval: 60, repeats: true) { [weak self] _ in self?.refresh() } } func menuWillOpen(_ menu: NSMenu) { refresh() } @discardableResult func run(_ path: String, _ args: [String]) -> (Int32, String) { let p = Process() p.executableURL = URL(fileURLWithPath: path) p.arguments = args let pipe = Pipe() p.standardOutput = pipe p.standardError = pipe do { try p.run() } catch { return (-1, "\(error)") } p.waitUntilExit() let data = pipe.fileHandleForReading.readDataToEndOfFile() return (p.terminationStatus, String(data: data, encoding: .utf8) ?? "") } func sleepDisabled() -> Bool { let (_, out) = run("/usr/bin/pmset", ["-g"]) for line in out.split(separator: "\n") where line.contains("SleepDisabled") { return line.trimmingCharacters(in: .whitespaces).hasSuffix("1") } return false } func refresh() { let awake = sleepDisabled() if let button = statusItem.button { let symbol = awake ? "cup.and.saucer.fill" : "moon.zzz" if let img = NSImage(systemSymbolName: symbol, accessibilityDescription: "SleepToggle") { img.isTemplate = true button.image = img button.title = "" } else { button.image = nil button.title = awake ? "☕" : "☾" } button.toolTip = awake ? "Sleep is disabled — Mac stays awake" : "Normal sleep" } stateLine.title = awake ? "Sleep: disabled (staying awake)" : "Sleep: allowed" toggleItem.title = awake ? "Allow Sleep" : "Keep Mac Awake" } @objc func toggle() { let target = sleepDisabled() ? "0" : "1" let (status, out) = run("/usr/bin/sudo", ["-n", "/usr/bin/pmset", "-a", "disablesleep", target]) if status != 0 { let alert = NSAlert() alert.messageText = "Couldn't change the sleep setting" alert.informativeText = "sudo refused the command — the passwordless rule is missing. " + "Run install.sh once to set it up.\n\n\(out.trimmingCharacters(in: .whitespacesAndNewlines))" NSApp.activate(ignoringOtherApps: true) alert.runModal() } refresh() } } let app = NSApplication.shared let delegate = AppDelegate() app.delegate = delegate app.run()