Keepresso
Keepresso

Changelog

Every release, newest first

What's new, changed, and fixed in each version of Keepresso.

v1.20.22 new · 2 changed · 2 fixed
Added
  • LM Studio Bionic is detected while it works. The AI-agent condition recognises the Bionic app (and its project windows) and treats fresh writes to each project's session store as evidence of work, so a coding or document turn keeps the Mac awake without treating the idle Electron UI as busy.
  • Support Keepresso… in the icon menu and panel, opening the donate page.
Changed
  • Lid shut and prevent display sleep. With no external monitor, drop the display assertion (and dim) while the lid is closed. In clamshell, keep the assertion for the external and force the built-in panel and keyboard dark under the lid, then restore the open-lid levels when the lid opens again. Contributed by @marco-scheffler (#10, #11, #13).
  • Welcome lid-closed setup offers an optional tip to enable Only while brewing so closed-display can follow your sessions.
Fixed
  • App triggers can pin one install when bundle IDs collide. Xcode and Xcode Beta (and similar side-by-side apps) no longer share one rule: a rule added for a bundle ID that is running from more than one place is locked to that install (path and bundle ID together). Every other app rule still matches by bundle ID, so a moved or re-downloaded app keeps working. Contributed by @alvst (#9).
  • Welcome keeps its place when a password dialog appears or the window is covered, and comes back to the front after the prompt.
v1.20.11 new · 1 fixed
Added
  • About names the author. The About window now shows a photo, credit line, and Contact / gyorgy.sh / GitHub links under the tagline, so it is clear who made Keepresso and how to reach them.
Fixed
  • Pause on low battery now switches off closed-display mode. Stopping the session alone could not let a lid-closed Mac sleep while sticky pmset disablesleep was still on, so charge could keep draining past the cutoff (#7). The pause now turns closed-display off (and puts it back when you plug in), the same way a heat pause already did. "Only while brewing" still handles this on its own by following the session. Needs the administrator helper for a silent flip; without it, a notification explains why closed-display was left on. The off is re-asserted if a write fails or another safety net turns the setting back on mid-pause, and a heat recovery will not restore closed-display underneath a live battery pause.
v1.20.01 new · 3 changed · 9 fixed
Added
  • Antigravity is detected, and can be connected. The AI-agent condition now recognises Antigravity's built-in agent, not just its agy command-line tool, so work you start inside the editor keeps the Mac awake. Connect Antigravity under the AI agent condition in Preferences ▸ Triggers and its sessions report exactly when they start and finish, the way Claude Code, Cursor and Codex already do. Each connected chat is tracked on its own (several conversations share one editor process). Keepresso only observes: it adds hooks that cannot allow, deny, or block anything Antigravity does, and never touches the step where a tool call is approved.
Changed
  • The two Automation access switches explain themselves. Each one now carries a line saying what it actually does, so it is clear that one lets agents and scripts hold the Mac awake while work runs, and the other only sets the time the Mac wakes up. Contributed by @ivoidcat in #6.
  • Chinese now says 智能体 for an AI agent. Simplified and Traditional Chinese used 代理 throughout, which also reads as "proxy". Every agent-sense mention in both is now 智能体 (智能體). Suggested by @ivoidcat in #6.
  • The menu stays snappy while Keepresso is working. Process matching and agent detection share one ps snapshot, open-panel assertion and closed- display reads reuse a short cache, and automation lease files reload when they change on disk so CLI heartbeats stay visible without a full rescan every second. Activity history loads after the menu bar is up, the open panel ticks from the session clock instead of a second timer, and agent transcript work stays off when no AI-agent rule is enabled.
Fixed
  • Closed menu and Preferences no longer burn CPU. MenuBarExtra and Preferences kept their SwiftUI trees alive while ordered out, so steam timelines and Observation kept running and memory climbed. Heavy content is torn down when hidden and remounted on open, so reopen is not a blank frame. Preferences may still use a bit more memory after the first open.
  • No more password prompt after a session ends. With "Only while brewing" on and no administrator helper installed, closed-display mode could ask for your password once a session finished, to switch off something that was already off. It now decides from a fresh reading of the setting rather than a remembered one, and notices the setting being changed by another tool instead of waiting until you open the menu.
  • The agent connection rows appear on their own. Claude Code, Cursor and Codex could only be connected from Preferences after the welcome window had been opened at least once; otherwise their rows were simply missing.
  • Lid-closed and helper holds recover cleanly after a failure. A failed restore after a crash or reboot is retried on the next helper launch instead of being given up on. A failed release no longer records the still-held setting as the value to restore to (which could leave sleep disabled forever), and a hold the app meant to drop is kept wanting until the release actually lands so a reconnect can finish the job.
  • Automation leases and wake requests no longer race themselves. A heartbeat cannot bring back a lease that was released or expired underneath it. A wake request is claimed by id before it is applied, so a timed-out client cannot still fire later, and cannot wipe a newer request that replaced it.
  • A keep-awake that never took hold is noticed. If the system refuses the power assertion, the session no longer looks successfully held while the Mac can still sleep. A failed idle-time reading is treated as unknown rather than "just used", so keep-active, dimming and screen-saver yield do not act on a fake zero.
  • Stale Cursor and IDE chats age out. Hook-only conversations that live under the editor Helper (no agent process of their own) used to stay "working" for as long as that Helper was up, so a missed Stop left phantom rows in the list and held the Mac awake. Past the usual stale window those records are dropped; CLI sessions with a live agent process still keep the long-turn trust they need.
  • Working agent sessions show first. The brewing menu truncates the agent list, so idle rows above could hide the ones that are actually holding the Mac awake. Working sessions now sort to the top.
  • Agent status labels are shorter. Detail tokens are short enough to fit beside the session name (run, write, read, search, browse, permission, wait, tool, subagent) instead of truncating mid-phrase.
v1.19.11 changed
Changed
  • "Only while brewing" now has the final say. With it on, closed-display mode turns itself on and off with the session, even if you had switched it on by hand and forgotten. Before, a manual override was left alone, so the Mac could stay awake with nothing running and a MacBook could run itself flat. While the option is on, the switch shows what the automation is doing and says so underneath, and clicking it shakes that line instead of doing nothing.
v1.19.05 new · 3 changed · 3 fixed
Added
  • Cursor connection. The AI-agent condition can now connect to Cursor the way it already connects to Claude Code, so a session reports exactly when it is working instead of being guessed at from CPU use. This also covers the agent built into the Cursor app, which runs inside the editor and has no process of its own, so nothing could see it before. Connect it under the AI agent condition in Preferences ▸ Triggers. Keepresso only observes: it adds hooks that cannot allow, deny, or block anything Cursor does, and never touches the steps where Cursor asks you to approve a command.
  • Codex connection. Codex can be connected the same way, so its sessions report working and waiting exactly. Codex asks you to review new hooks before it runs them, so approve them there once after connecting. Keepresso will not approve them on your behalf: that decision is yours to make.
  • pi is detected. The AI-agent condition now recognises pi sessions and judges them the way it judges any agent without a deeper connection, from what its process is actually doing.
  • Agent tools are offered during setup. Choosing "Agentic coding" in the welcome window now offers to connect the coding tools on your Mac right there, the way choosing cloud gaming offers its own setup. Connecting happens in place: no password, no permission prompt, and a second click undoes it.
  • Lid-closed mode and the safety nets are offered during setup. On a laptop, the last step of the welcome window now offers the two things most people came for: keeping the Mac awake with the lid shut, and the battery and heat safety nets that let it sleep anyway if the charge runs low or it stays hot behind a closed lid. Both sit under the administrator helper, so approving that first is what makes the lid switch prompt-free. The thresholds stay in Preferences, where there is room to explain them.
Changed
  • Each tool wears its own session mark. A working session now spins the mark its own tool spins: Claude's sunburst in its terracotta, Cursor's dot grid in its olive, and Grok's braille cell, Antigravity's orbiting gap, and Codex's slow breathing dot in the menu's own black or white. They are drawn rather than typed, so they match each console's spinner and look the same on every Mac, where the old glyphs relied on characters no system font actually has and came out as whatever face macOS substituted. Idle sessions all show the same small dot, so a quiet list stays quiet and motion means one thing: that session is working right now. Any tool without a mark of its own wears the plain breathing dot.
  • Connections are checked and kept working. A connection is reported as working only when every one of its hooks is present, current, and there exactly once, rather than as soon as any trace of one is found. If some go missing, get doubled up, or still point at where Keepresso lived before you moved it, they are quietly put right, so moving the app no longer leaves a connection that looks fine and does nothing. Only connections you already made are maintained: a tool is never connected for you. If a repair cannot be written, the row says so and offers to retry.
  • Only tools you have are offered. The connect row appears only for agent tools that are actually on this Mac. Going through with it writes that tool's config file, so a Mac that had never seen the tool could end up with a config for it containing nothing but Keepresso's entries. A tool that is already connected still shows its row, so it can always be disconnected.
Fixed
  • Cursor's command-line agent went undetected. Cursor installs it under two names, cursor-agent and a plain agent, and a session started with the short one was never recognised as an agent at all.
  • Connecting could remove hooks you had configured yourself. If an agent's settings held anything Keepresso could not read (an empty value left by an editor, a shape written by a newer version of the tool), connecting could drop every hook you had set up for that event, or leave a second copy of Keepresso's own hook that fired twice and could not be removed again. Anything unrecognised is now left exactly as it was.
  • Connecting loosened the settings file's permissions. Writing the hooks reset the file to the default permissions, so one deliberately restricted to your account became readable by anyone on the Mac. Its permissions are now put back as they were.
v1.18.03 new · 3 changed · 7 fixed
Added
  • Wake for scheduled AI runs. Keepresso can now sync the recurring tasks your local AI tools schedule (Claude Desktop local routines, Codex automations), wake the Mac a few minutes before each run, and hold it awake for a short window so the run isn't skipped, even with the lid shut. It reads only the schedule and name, never the task's prompt, and ignores cloud routines (those run on the vendor's servers whether the Mac is awake or not). For a run longer than the window, an agent can hold a Keepresso lease to keep the Mac awake until it finishes. Turn it on in Preferences ▸ Automation ▸ Scheduled AI runs, then switch on each tool you want woken for (Claude Desktop, Codex), each off until you opt in so nothing you don't use is ever woken for. See docs/AUTOMATION_SYNC.md. Inspired by @quasar2333's power-orchestration work in #3, reworked into an extensible framework that syncs several schedulers.
  • Keep awake for calls in a specific app. A new trigger holds the Mac awake only while a chosen app is using the microphone, that is, while it is on a call (Slack, Discord, Zoom, and the like). A foreground app or an always-connected external microphone no longer counts on its own. Add it in Preferences ▸ Triggers under "Microphone in use by app", choosing the app that is on the mic right now, a common call app, or any app you pick. No extra permission needed. Suggested by @joshuas99 (#5).
  • Dim the display instead of leaving it lit. When a session is holding the display awake, Keepresso can drop the built-in screen to its dimmest a few minutes after you step away, keeping it awake but dark, then restore your brightness the moment you return or the session ends. Kinder to the panel and the battery on overnight sessions than a screen left fully lit. Turn on "Dim the display when idle" under Prevent display sleep.
Changed
  • Ending automation leases is now a menu action. While leases are live, the menu offers "End Automation Leases" in place of "Pause Triggers", so stopping agent work and pausing triggers are two deliberate steps. Pausing or turning off triggers no longer stops a session that live leases are sustaining: the leases keep it, and ending them is the explicit gesture.
  • A clearer first-run welcome. The welcome window is now a short three-step flow that explains how Keepresso works as you go (the cup, triggers, and the built-in battery and heat safety), instead of one long page. You can reopen it any time from the menu under "Welcome to Keepresso…".
  • Cloud Gaming preset holds through downloads. The built-in Cloud Gaming preset now also stays awake while Steam is downloading, matching the local Gaming preset.
Fixed
  • "Until a time" keeps the Mac awake instead of sleeping it. Choosing a stop time while triggers were on, but no trigger was currently met, could start and then immediately end the session, running your end-of-session action (sleep or lock) moments later. It now takes manual control first, like the menu's Keep Awake, so the Mac stays awake until the time you picked.
  • Your settings survive an unrecognized trigger. Opening settings written by a newer version (after a downgrade, or importing an exported file) no longer resets everything to defaults when they contain a trigger this version doesn't know. The unknown trigger is skipped and the rest of your configuration is kept.
  • Automation commands no longer pop the Setup window. A keepresso:// URL arriving with no window to claim it (the lease doorbell, a Shortcuts command) could make macOS present the Setup checklist out of nowhere.
  • The menu tells leases "held" from "waiting" apart. During a battery or thermal pause the lease rows now say the leases are waiting for the pause to lift instead of claiming the Mac is held awake. keepresso lease heartbeat also reports whether the Mac is actually being held right now.
  • Waking no longer triggers a stale end action. A lease that expired while the Mac slept used to run your end-of-session action (sleep, lock) moments after you woke the Mac. A lease end noticed late now skips the action, matching timed sessions.
  • Lease expiry survives clock changes. Setting the clock backwards no longer extends live leases by the size of the jump; their horizons stay anchored to the present.
  • The MCP server accepts null request ids. Requests with a JSON-RPC null id are answered, and notifications carrying one are ignored instead of being answered with an error.
v1.17.09 new · 1 changed · 1 fixed · 2 security
Added
  • Automation leases. Scripts and AI agents can now hold the Mac awake through bounded leases: keepresso lease acquire with a time limit the owner must keep renewing, heartbeat, release, and list. Live leases show in the menu with their countdowns, Stop ends them all, and the Mac can sleep again (running your end-of-session action) after the last one finishes. A crashed tool's lease simply expires. Governed by a new Preferences ▸ Automation switch, on by default. The lease concept was inspired by a proposal from @quasar2333 in PR #3.
  • MCP server for agents. The app bundle now ships keepresso-mcp (Contents/Helpers), a Model Context Protocol server any MCP-capable agent can use to manage leases, read Keepresso's status, and read the system wake schedule.
  • Bundled agent skill. A ready-to-install skill folder (Contents/Resources/AgentSkill/keep-awake) teaches an agent the whole protocol, both the keepresso command line and the MCP server.
  • Wake schedule for automation, opt-in. keepresso wake status reads the system's scheduled wakes for anyone. keepresso wake set / clear (and the matching MCP tools) can change the schedule, but only while the new "Allow automation to change the wake schedule" switch is on. It is off by default because a scheduled wake is a system-wide change applied by the administrator helper.
  • Teach your agent in one click. Preferences ▸ Automation reveals the bundled skill so you can install it straight from disk. For agents without a skills folder it copies the full skill as paste-ready instructions, and MCP setup snippets are ready for Claude Code, Gemini CLI, Grok, and Codex.
  • Game controller trigger and display comfort. A new "Game controller connected" trigger counts any connected gamepad, including the Steam Controller, which macOS itself never reports as one (detected permission-free at the hardware level, and only while the controller is actually on, not just its receiver plugged in). An opt-in switch reports user activity during controller play, so gamepad-only sessions stop dimming the display mid-game.
  • Steam download trigger. A new "Steam is downloading" condition keeps the Mac awake while a game actually downloads or updates, in any Steam library, and lets it sleep once it finishes or you pause it. Reads Steam's own bookkeeping plus live download activity, with no permission needed.
  • Gaming preset. A new built-in preset covers a gaming session end to end: playing (or a cloud client), a controller in hand, a Steam download running, or sustained traffic above 1 MB/s (launcher patches). Cloud Gaming gains the controller condition too.
  • High CPU priority for the game, opt-in. The Gaming & Streaming Setup can raise the active game or streaming client's CPU priority through the administrator helper while you play, so background work cannot steal frames. Normal priority comes back when you stop playing, and always when the game quits.
Changed
  • A tidier menu panel and Setup window. The panel's live statuses (automation leases, fan boost, AWDL pause) now share one card instead of trailing as loose captions. The AWDL watchdog introduces itself as the stutter fix it is, with a plain-words explainer and a live animation while pausing, and helper-only controls show a lock with an inline install instead of a dead switch.
Fixed
  • Closed-display mode restores your exact sleep setting. Releasing a sleep hold (or recovering after a crash) now puts pmset disablesleep back to the value it had before the hold, instead of always 0. If you keep the setting enabled yourself, Keepresso no longer switches it off behind your back.
Security
  • Imported settings can't run commands unseen. Importing a settings file now brings in any shell-command event hooks switched off. Review and re-enable the ones you trust under Preferences ▸ Automation, so a shared or downloaded settings file can't run a command behind your back.
  • Safer updates and tighter internals. The auto-updater is pinned to an exact Sparkle version with its signing tools verified by checksum, and the agent-hook and administrator-helper commands are hardened against untrusted input. No change to how the app behaves day to day.
v1.16.11 fixed
Fixed
  • Improved performance and reduced CPU usage. Animations and status refreshes now pause whenever their window is closed or hidden.
v1.16.04 new · 2 changed
Added
  • Outbound event hooks. Preferences ▸ Automation can run a Shortcut, POST a webhook, or run a shell command when something happens: session started or ended, a trigger fired or released, the battery or thermal pause hit, the thermal stage changed, or an AI agent went idle. Useful for a push to your phone (ntfy, or a Shortcut) when an overnight agent finishes.
  • Count waiting as working. The AI agent rule can optionally treat a hook waiting state as still working, for unattended overnight runs that sit on a prompt. Off by default, and a pending approval still always counts as working.
  • Scheduled wake. Preferences ▸ Automation can install a one-shot or repeating system wake through the administrator helper, then optionally start a keep-awake session (or leave triggers in charge) when the Mac actually wakes, so overnight jobs do not lose the race to idle sleep. Reliable on AC power. On battery the firmware may skip the wake.
  • Activity that survives a relaunch. Preferences ▸ Activity keeps the decision log on disk and shows a simple seven-day summary of how long Keepresso held the Mac awake (and battery drop when both ends of a session had a reading).
Changed
  • The thermal safety net now guards the closed lid. "Pause when running hot" is a protection for a Mac that cannot help itself: one held awake with the lid shut (closed-display mode) and then forgotten, maybe slid into a bag. The net now acts only in that trapped state, lid closed with the sleep override on. When sustained heat reaches the pause stage it always switches the override off as well, so the Mac can truly sleep and cool (the separate "Also switch off closed-display mode" toggle is gone, that lift is the point of the pause). Opening the lid ends the emergency on the spot: fans return to the system and the session resumes. With the lid open, macOS's own thermal management is in charge, as it should be, and desktops (no lid to trap heat behind) no longer show the Thermal section.
  • Richer end-of-session actions. When a session ends on its own, Keepresso can now also lock the screen or sleep the Mac (alongside sleep the display and start the screen saver). Battery and thermal pauses no longer fire the action, a brief restart cancels it, and waking after the Mac slept past a timer no longer re-locks or re-sleeps the display. The picker lives under Preferences ▸ Automation with the new event hooks.
v1.15.08 new
Added
  • Right-click the cup. The menu-bar icon now has a native context menu (right-click or control-click) with the app entries: Preferences, Headless Setup, Gaming & Streaming, About, Check for Updates, and Quit. Left click keeps opening the panel as always. Thanks to @ruzickap for the suggestion (#1).
  • Show less. A slim disclosure row at the bottom of the menu panel folds the option toggles and app entries away, leaving just the status and the keep-awake controls. The choice sticks across launches, and everything hidden stays one right-click away.
  • The battery pause explains itself when poked. Turning Keep awake on while the low-battery pause is holding can't start a session (it would only die again on the next battery reading), so the switch snaps back. The status card now shakes on each attempt, pointing at the line that explains the pause, instead of appearing to ignore the click.
  • A thermal safety net. Keepresso can hold a Mac awake through heavy load, with the lid closed, even on battery. Now it can also watch the heat. Preferences ▸ General ▸ Thermal watches either macOS's own thermal pressure (works on every Mac) or temperature sensors you pick from a live list, and once the reading stays over your threshold for a sustained time it escalates: first, optionally, it boosts the fans to a chosen strength (never below what the system already chose, silent through the administrator helper), and if the Mac stays hot, it pauses the session, refuses restarts with the same explanatory shake as the battery pause, can switch off closed-display mode, and tells you why in a notification. Everything restores itself once temperatures recover, with hysteresis so a reading hovering at the threshold never flaps. Fans are forced through a new helper verb that fails safe: the boost dies with the app connection, and a crash marker restores auto control at the next daemon start.
  • Prove the fans before you need them. Next to the boost strength slider, a "Test Fans" check steps the fans through 50, 70, and 90 percent for about 12 seconds, reading every fan's speed at each level and the hottest sensor along the way, then hands control back and answers plainly whether the whole path (helper, firmware, readings) can be trusted: "All good. Fan 1: 0 → 4800 rpm (max 5348)." A real heat emergency always outranks the test: the safety net cancels it and takes the fans for itself.
  • The privileged thermal controls know their place. Watching temperatures and pausing the session never need the administrator helper. Boosting fans and lifting closed-display mode do (fan writes are root-only, and an unattended safety action must never ask for a password). Those two now sit behind a single lock row while the helper isn't installed, with Install one click away right there and the approval step walked through in place, instead of live-looking toggles warning underneath.
  • Glass, your way. Preferences ▸ General ▸ Appearance adds a see-through slider for the menu-bar dropdown. At 0% its glass is fully frosty, backed by blur and a wash that guard readability on any wallpaper. Sliding toward 100% thins that backing away until the panel is the system's bare Liquid Glass and the desktop shines through. The default is halfway, 50%. Changes apply live, only the dropdown is affected (windows keep their standard look), and the system's Reduce Transparency accessibility setting always wins.
  • Helper updates take care of themselves. The helper service ships inside the app, so an app update replaces it on disk automatically. The only leftover is the pre-update service still running in memory, which Keepresso now recognizes by version, retires in the background, and reports in Preferences while it lasts (usually under a minute). No reinstall, no password, no new approval, and no more risk of the updater mistaking the old-but-healthy service for a broken one.
v1.14.07 new · 3 fixed · 1 updates

Keepresso learns when your AI agent is actually working.

Added
  • Stop in 15, one click. While a session runs, the menu shows a row of quick "Stop in" buttons (15 min, 30 min, 1 h out of the box) that convert the running session to end that much later, so the Mac goes back to sleeping on its own and you don't have to remember to toggle it off. The countdown continues the session rather than restarting it, clicking another button simply replaces the countdown, and the durations are editable (up to four) in Preferences ▸ General. An optional heads-up in Preferences ▸ Reminder warns you a few minutes before any timed session ends.
  • A trigger that knows when your AI agent is actually working. The new "AI agent is working" condition (Preferences ▸ Triggers ▸ Add ▸ Apps & Activity) detects coding-agent sessions (claude, codex, gemini, grok, agy, aider, goose, and friends) in your terminals and keeps the Mac awake only while one is actually working. Where an agent streams a session transcript to disk (claude, grok, codex), a fresh write counts as direct proof of work, even through long zero-CPU network waits; everywhere else the decision uses the CPU of the agent's processes and tool calls, measured against each session's own learned idle level, so a TUI that animates while idle and a near-silent one are both judged fairly. Once every session goes idle, the Mac may sleep after a configurable grace (instantly, 1, 3, 5, or 10 minutes, three by default) with a gaming-style countdown in the menu. The menu lists each detected session with a live working / idle state, and the built-in "AI Agent" preset now applies this rule instead of its old process-name rules, so an agent left open no longer pins the Mac awake around the clock. If you applied the old AI Agent preset, apply it once more to move your live rules to the new condition.
  • Claude Code can tell Keepresso exactly what it's doing. An opt-in integration (Preferences ▸ Triggers ▸ the AI agent rule) installs Claude Code hooks that report each session's real state, so there's no guessing from CPU at all: a session is working when Claude says it is, and at rest when it says that. A pending permission prompt counts as working, so the Mac stays awake while it waits for your answer, but an abandoned prompt settles back to rest instead of pinning the Mac awake forever. Sessions are listed by where they run ("claude (Claude app)", "claude (IDE)", or the terminal), and background subagents count as work even when the main turn has ended.
  • The menu panel does more, in less space. The low-battery pause moved out of Preferences and into the menu, as a switch with an inline 10-90% slider that shows the level you're picking (it only commits when you let go, so dragging past the current charge can't stop your session). "Only while brewing" joins it, the battery rows appear only on machines with a battery, and small (i) buttons explain what each one does. Every switch in the app now lines up flush right at one size, in the menu, the Gaming & Streaming window, and the welcome screen. Working sessions pulse with Claude Code's console spinner, in Claude's terracotta for Claude rows and green for other agents.
  • Every setting explains itself. Small (i) buttons now sit beside each Preferences section, the trigger conditions, and the any/all rule: a click explains what the setting actually does, when it doesn't apply, and what it costs (a password prompt, a permission, battery). The explanations that used to sprawl under a section as fine print are in there now, so each section keeps one plain line of caption and the tabs stay scannable. New ground gets covered too: what a trigger is and when it overrides the manual switch, what a preset is and what renaming a built-in does, what "any" and "all" mean, what each condition category watches and which ones ask for a permission, what the reminder is for (and that it never stops a session itself), and why a drive needs keeping awake at all.
  • Preferences reads as one window. The Triggers tab is now a grouped form like every other tab, with its own Triggers and Presets sections. Every tab leads with a section header (Reminder, Disk, Presence, Menu bar, Battery, Welcome), and General is ordered by what you reach for most: Startup, the global shortcut, and Language right under Keep awake, hardware-specific settings further down, maintenance last. The battery threshold is the same slider as the menu's, so the two always agree.
  • Desktops get the sleep override under an honest name. On a Mac with no battery (mini, Studio, Pro) the closed-display switch used to talk about lids. It's now called "Disable system sleep" in the menu and Preferences, with wording to match: the same pmset switch, presented as what it is on a desktop, a hard never-sleep override you turn off when you're done.
Fixed
  • Built-in presets keep up with updates. An improved built-in preset (the AI Agent preset gaining the new working rule) never reached you if an older version had already seeded it, so the welcome screen and the presets menu offered two different rule sets under one name. Un-renamed built-ins now refresh to their current definitions on launch. Renamed ones are yours and stay untouched, deleted ones stay deleted.
  • Windows opened from the menu are properly in front. A window opened from the menu bar could come up half active, drawn in the inactive gray style with clicks inside it doing nothing until you switched away and back. Keepresso now detects that state and repairs it, and only that state: clicking into another app right after a window opens no longer pulls focus back.
  • "Only while brewing" says what it means in Chinese and Korean. The label read as a bare "only while running", which could mean the app or anything else. It now names the keep-awake session in Simplified Chinese, Traditional Chinese, and Korean, in the switch and everywhere the text quotes it. Thanks to @ivoidcat for the report and first fix (#2).
Notes
  • Downgrading resets settings. Settings saved by 1.14 include the new agent-activity rule, which older versions can't read: launching 1.13 or older afterwards starts Keepresso from defaults.
v1.13.03 new · 3 fixed

Keepresso now speaks fifteen languages.

Added
  • Keepresso speaks fifteen languages. English, German, Spanish, French, Hungarian, Italian, Japanese, Korean, Russian, Brazilian Portuguese, Turkish, Polish, Ukrainian, Simplified Chinese, and Traditional Chinese. A Language picker in Preferences and on the Welcome screen switches between them, or follow the system language (the default). Everything is translated: the menu, the Setup and Gaming & Streaming screens, notifications, VoiceOver labels, and the desktop widgets.
  • The battery pause explains itself. When Keepresso pauses a session because the battery ran low, it now says so in a notification (the charge level, and that plugging in resumes it) instead of just going quiet. The menu-bar cup shows the pause as a last sip of coffee in the system's low-power yellow, and the dropdown's cup matches. Desktops with no battery hide the battery controls entirely.
  • Readiness rows lead with their subject. Each row on the Setup and Gaming & Streaming screens now opens with its own icon (Wi-Fi, Ethernet, game controller, lock, bell) tinted by its status, with a small corner badge so ok, tip, and warning still read by shape.
Fixed
  • Clicking a notification no longer opens a second Keepresso. A click on one of Keepresso's notifications could make macOS launch a duplicate copy that ran alongside the first, each holding its own power assertions. A launch that finds an older copy of itself already running now hands back to it and quits.
  • The welcome window comes back until you press Get Started. Switching your language on the Welcome screen (which relaunches the app) no longer counts as finishing onboarding, so the welcome returns on each launch until you confirm in the language you settled on.
  • Old copies stuck in the Trash are handled properly. When an update leaves a previous copy in the Trash and macOS blocks Keepresso from removing it, Keepresso now posts a notification you can click to open the Trash and delete it yourself, instead of letting the leftover copy quietly disable the background helper.
v1.12.05 new · 4 fixed

a livelier cup, and updates that clean up after themselves.

Added
  • The cup now pours. Starting a session fills the menu panel's cup with a short pour animation, the steam rising once the pour lands, and stopping drains it. The welcome window leads with the same brewing cup and pours it the moment you pick how you use your Mac.
  • The menu panel moves like it means it. Countdowns roll their digits like a timer, trigger checkmarks swap in place, and the panel morphs smoothly between its states instead of jump-cutting. Everything respects the system's Reduce Motion setting.
  • Liquid Glass, where it belongs. On macOS Tahoe the primary buttons and the accented cards use the real glass material with the same warm copper tint everywhere; earlier systems keep the familiar frosted look.
  • Readable on ultra-dense screens. On native 4K/5K resolutions and laptop More Space modes, where a point is physically tiny, the menu panel and the welcome window scale their text and layout up based on the screen's actual density. Normal configurations are untouched.
  • Windows open where you expect. Preferences, Setup, Gaming & Streaming, About, and the welcome open centered and in front now, instead of wherever macOS last left them (or behind the app you were using), and they don't stay on top of anything afterwards.
Fixed
  • Updates remove the old app copy properly. The previous version that an update pushes into the Trash is now deleted before Keepresso first talks to macOS's background-task records, closing the last gap that could get the helper disabled after an update (previously that could take a manual Trash empty).
  • The helper hands off cleanly across updates. The app no longer keeps the old helper process serving after an update: the freshly installed binary takes over within moments, and anything the helper was holding carries over without a password prompt.
  • The welcome window fits every screen. On low resolutions it scrolls inside the visible screen, with a clear "more below" cue and the Get Started button always in view, instead of running off under the Dock; it also adapts when the resolution changes while Keepresso is running.
  • The Triggers tab sits left like every other tab instead of floating centered while the trigger switch is off.
v1.11.24 fixed

the helper stays on.

Fixed
  • The helper's background switch no longer keeps turning itself off. Old copies of Keepresso left in the Trash by an update (Homebrew upgrades and manual reinstalls both put one there) made macOS re-disable the helper minutes after every repair or reinstall, over and over. Keepresso now finds those stale copies, by remembering where it last ran from and by reading macOS's own background-item records, and deletes them by itself before repairing, so the fix finally sticks.
  • The repair window tells the truth now. Before offering a reinstall, Keepresso checks the system's records: if the real problem is that the background switch is off, the window says exactly that (System Settings, Login Items & Extensions, App Background Activity) and flips to "All set" by itself the moment you turn it on, even when macOS's status API never notices the change.
  • Removing the helper explains what you'll see. After a removal, System Settings can keep showing a leftover Keepresso row under App Background Activity until macOS refreshes its list (a restart clears it). The status in Keepresso now says so instead of looking like the removal failed.
  • Development builds keep their hands off. A copy of Keepresso running from outside the Applications folder no longer touches the helper's registration at all; even a status check from one could hand the registration to the wrong copy and get the helper disabled.
v1.11.11 new · 2 fixed

the helper heals itself.

Fixed
  • The helper survives updates and reboots for real now. macOS could lose the helper's launch registration after an app update followed by a restart (the system record kept pointing at the old app copy), leaving the helper installed but unreachable: closed-display mode and AWDL pausing then failed with a confusing flag-file error. Keepresso now checks the helper at launch and whenever a privileged switch fails, and repairs the registration by itself, silently and without a password, in the common case. Errors from the helper path now say what actually happened ("the helper isn't responding") instead of blaming a flag file.
  • When the repair does need you, it's unmissable. If macOS insists on a fresh approval, or the helper stays unresponsive after a repair, a small window opens front and center and walks through the single step (approve in Login Items, or reinstall), updating live and confirming success on its own. The menu also shows a warning row with a Fix button until it's resolved, and a failed engage retries in the same session once the helper is back.
Added
  • Pick the AWDL resume delay. Gaming & Streaming now has a "Resume AWDL after leaving the game" picker (10 seconds to 5 minutes, 1 minute as before), so quick alt-tabs don't flap the radios but AirDrop and Handoff can come back as fast as you like. Changes apply immediately, even to a countdown already running.
v1.11.02 new · 1 fixed

one password, ever.

Added
  • The administrator helper: one password, ever. A small privileged helper service (Preferences > General > Administrator helper) now handles closed-display mode and AWDL pausing. Install it once, approve it under System Settings > Login Items (macOS asks for your administrator password that one time), and every privileged switch after that is instant and silent: no more password prompt on each app launch for "Only while brewing" or the AWDL watchdog. The helper survives restarts and app updates, can only flip those specific switches, restores everything if the app quits or crashes, and can be removed again from the same place. Without it, everything keeps working the old way, with the per-run prompt. The helper sits at the top of Preferences > General, and the welcome screen offers it as a one-time setup step on first launch.
  • The CLI on PATH for DMG installs. The helper also creates the /usr/local/bin/keepresso link (and re-heals it after the app moves or updates), so the command-line tool just works on a drag-installed copy, not only via Homebrew. It never touches a file it didn't create.
Fixed
  • When the old-style password prompt is triggered in the background (a trigger-started session engaging "Only while brewing"), Keepresso now also posts a notification saying the password is needed and why, instead of leaving an unexplained dialog behind other windows. That notification was previously dropped by macOS whenever Keepresso was the active app; it now shows reliably. The in-app notes point at the helper as the way to stop the prompts for good, and no longer flash under a toggle during quick, prompt-free operations.
v1.10.01 new · 1 changed

closed-display mode that follows the session, and the website's copper inside the app.

Added
  • Closed-display mode, only while brewing. A new "Only while brewing" option (Preferences > General > Closed-display mode) ties the lid-closed keep-awake to the session: it switches on when a keep-awake session starts and back off when the session ends or the app quits (even after a crash), instead of staying on globally until you remember to turn it off. Your administrator password is asked once per app run, not at every flip; enabling the option authorizes right away so a trigger-started session never pops a surprise password dialog. The manual toggle still works and still wins mid-session.
Changed
  • The app's accent now matches the website's burnt-copper palette (copper in light mode, soft copper in dark), across the menu, Preferences, the setup windows, and the widgets.
v1.9.02 new · 5 fixed

a command-line tool, and reliability fixes from a full-history review.

Added
  • The keepresso command-line tool. A caffeinate-style CLI, shipped inside the app bundle and linked onto PATH by the Homebrew cask. keepresso start / stop / toggle / status drive the app; keepresso -t <seconds>, -w <pid>, -i, -d, and -u hold a power assertion directly, so scripts and pipelines can block on it even when the app is not running. keepresso help lists everything.
  • The app now mirrors its session state to ~/Library/Application Support/Keepresso/status.json (JSON, ISO 8601 dates) for the CLI and other tooling to read.
Fixed
  • Battery auto-pause no longer fights a manual start. Starting a session (menu, hotkey, widget, or URL) while paused on low battery used to activate for one second and then stop again, firing the session-end notification or action; the pause now holds, the menu explains it, and plugging in lifts it.
  • The desktop widget buttons and the Control Center toggle now launch Keepresso when it isn't running, instead of silently doing nothing.
  • The widgets no longer show "Brewing" after a crash or force quit: they check that the app is actually running, and a timed session whose end already passed renders as off.
  • Idle widget text is readable in light mode (it could blend into the dark tile before).
  • On a first launch from the DMG, the welcome window now appears after the app moves itself to Applications, not in the copy that is about to quit (which lost it forever).
v1.8.05 new · 2 fixed

onboarding, portability, and two new triggers.

Fixed
  • App-based trigger conditions now show the app's name instead of its raw bundle identifier. The menu's condition list and the rules editor read "NVIDIA GeForce NOW is running" rather than "App com.nvidia.gfnpc.mall is running"; the Cloud Gaming and Remote Control presets and any rule added from the running-apps menu carry a friendly name.
  • The global keep-awake shortcut no longer springs back when triggers are active. Pressing it now pauses trigger gating (the same in-memory pause as the menu's Pause Triggers), so the toggle sticks and the menu shows "Resume Triggers", instead of the gate turning the session back on a second later.
Added
  • Export and import settings. Back up your settings, triggers, and presets to a JSON file, or move them to another Mac, from Preferences > General. The file is version-stamped and validated on import.
  • Keep awake until a download finishes. A new trigger that watches a folder you pick (Downloads by default) and holds the Mac awake while an in-progress download file (.crdownload, .download, .part, and the like) is present, then lets it sleep once the transfer completes. Holds for 30 seconds between files in a batch. Add it from Triggers > Apps & Activity > Downloads.
  • Network-activity trigger. Keep awake while a large transfer is running, even when no single app or process rule fits. Fires while smoothed throughput stays above a threshold you choose, with the same moving-average and hysteresis the CPU-load trigger uses so a brief burst doesn't start a session. Add it from Triggers > Network & Devices > Network activity.
  • Welcome window. A short first-run window points out that Keepresso lives in the menu bar (no Dock icon) and offers one-click setup: pick how you use your Mac (agentic coding, gaming and streaming, meetings and calls, remote access) to apply the matching triggers, plus launch-at-login and notifications. Shown once on a new Mac; reopen it any time from Preferences > General. Existing users aren't shown it on upgrade.
  • Liquid Glass app icon. A new macOS 26 app icon built with Icon Composer, with light, dark, and tinted appearances and the Liquid Glass material.
v1.7.05 new · 5 fixed · 7 updates

remote-work presence and everyday control.

Added
  • Keep me active (defeat idle detectors). A plain power assertion keeps the Mac awake but doesn't reset app-level or enterprise idle detection, so remote-desktop and VDI sessions, meeting presence (Teams, Slack), and corporate idle-logout still mark you away. An opt-in "Keep me active" mode reports activity to macOS too, on the supported prompt-free path. It only steps in once you've been idle a few seconds, so it never nudges the pointer while you're using the Mac or gaming.
  • Global hotkey. A system-wide keyboard shortcut to toggle keep-awake from any app, recorded in Preferences. Carbon-based, so it needs no Input Monitoring or Accessibility permission.
  • Start on launch. Optionally begin a keep-awake session the moment Keepresso launches, for an always-on Mac that shouldn't need a rule.
  • "Held by " in the menu. When Keepresso is idle but the Mac still won't sleep, the dropdown names the app holding it awake (Chrome, coreaudiod).
  • Session-end notification and action. Optionally get notified when a session ends on its own (a timer expiring, triggers dropping), and run an action: sleep the display or start the screen saver. Off by default.
Gaming & Streaming
  • Auto AWDL pause just works. Automatic mode now watches for a game (or a cloud-gaming app) on its own, with no "Playing a game" trigger to set up.
  • One password, up front. Enabling auto mode authorizes the AWDL helper once, right then, so it never pops a password dialog over a running game. The prompt now explains what it's for (and that the "osascript" dialog is Keepresso).
  • Live status. The Gaming & Streaming window and the menu show whether AWDL is paused for a game, paused manually, or counting down a grace after a game closes; a manual "Pause AWDL now" off cancels the countdown instead of letting it re-engage.
  • Optional notifications when auto mode pauses and resumes, plus an always-on notice when your password is needed (even behind a fullscreen game).
  • Clearer Wi-Fi channel advice. The 5 GHz suggestion now names the right social channel by region: 44 in the EU, 149 in the US, Canada, and elsewhere UNII-3 is allowed. The 2.4 GHz warning points at the 5 GHz channel to move to.
  • A trigger condition in its grace window now shows amber with a countdown in the menu, so a lingering "Playing a game" reads as timed rather than stuck.
Fixed
  • The menu dropdown no longer stays open behind the windows it opens (Preferences, Setup, Gaming & Streaming, About).
  • Battery auto-pause now only kicks in while actually running on battery: a low charge on AC (even while charging up) no longer pauses the session, and a gate-held session no longer flaps right at the cutoff. The menu explains a battery pause instead of just looking idle.
  • The 5-minute gaming grace (and other grace windows) is no longer silently lost when combined with other conditions under "any"/"all".
  • URL, Shortcuts, and widget stops are logged accurately instead of as "Stopped manually".
  • Assorted correctness and accessibility fixes, and a house-rule copy pass.
Under the hood
  • Fewer per-second system reads on the common configuration, and a leaner internal structure (no behavior change).

Full history and source on GitHub.