{"id":51313003,"url":"https://github.com/gyorgysh/keepresso","last_synced_at":"2026-07-01T06:00:43.091Z","repository":{"id":368498685,"uuid":"1284688466","full_name":"gyorgysh/keepresso","owner":"gyorgysh","description":"Keep your Mac awake on your terms. A native macOS menu-bar app with condition-based triggers, closed-display mode, and a headless-Mac toolkit. Built for AI agents, servers, and always-on Macs.","archived":false,"fork":false,"pushed_at":"2026-07-01T05:53:18.000Z","size":1279,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-07-01T06:00:13.469Z","etag":null,"topics":["ai-agents","automation","caffeinate","caffeine","developer-tools","headless","keep-awake","mac-mini","macos","menu-bar","power-management","productivity","sparkle","swift","swiftui"],"latest_commit_sha":null,"homepage":"https://gyorgy.sh","language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/gyorgysh.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":"gyorgysh","patreon":null,"open_collective":null,"ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"lfx_crowdfunding":null,"polar":null,"buy_me_a_coffee":null,"thanks_dev":null,"custom":"https://gyorgy.sh/donate"}},"created_at":"2026-06-30T05:30:28.000Z","updated_at":"2026-07-01T05:53:22.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/gyorgysh/keepresso","commit_stats":null,"previous_names":["gyorgysh/keepresso"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/gyorgysh/keepresso","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gyorgysh%2Fkeepresso","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gyorgysh%2Fkeepresso/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gyorgysh%2Fkeepresso/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gyorgysh%2Fkeepresso/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gyorgysh","download_url":"https://codeload.github.com/gyorgysh/keepresso/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gyorgysh%2Fkeepresso/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34994877,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-01T02:00:05.325Z","response_time":130,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai-agents","automation","caffeinate","caffeine","developer-tools","headless","keep-awake","mac-mini","macos","menu-bar","power-management","productivity","sparkle","swift","swiftui"],"created_at":"2026-07-01T06:00:18.492Z","updated_at":"2026-07-01T06:00:43.079Z","avatar_url":"https://github.com/gyorgysh.png","language":"Swift","funding_links":["https://github.com/sponsors/gyorgysh","https://gyorgy.sh/donate"],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/assets/icon.png\" width=\"128\" height=\"128\" alt=\"Keepresso app icon\"\u003e\n\u003c/p\u003e\n\n\u003ch1 align=\"center\"\u003eKeepresso\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n  Keep your Mac awake, on your terms, with smart triggers, presets, timed\n  sessions, and closed-display mode in a clean, native menu-bar app, built on a\n  modern foundation for the next decade of computing.\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/gyorgysh/keepresso/actions/workflows/ci.yml\"\u003e\u003cimg src=\"https://github.com/gyorgysh/keepresso/actions/workflows/ci.yml/badge.svg\" alt=\"CI\"\u003e\u003c/a\u003e\n  \u003cimg src=\"https://img.shields.io/badge/macOS-14%2B-blue\" alt=\"macOS 14+\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Swift-SwiftUI-orange\" alt=\"Swift + SwiftUI\"\u003e\n  \u003ca href=\"LICENSE\"\u003e\u003cimg src=\"https://img.shields.io/badge/license-MIT-green\" alt=\"MIT License\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n---\n\nKeepresso is a native **Swift + SwiftUI** menu-bar app. It uses macOS power\nassertions (`IOPMAssertion`) to prevent system and display sleep, and layers on\ncondition-based **triggers** so your Mac only stays awake when it actually should.\nIt lives quietly in the menu bar, no Dock icon, no clutter.\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/assets/default.webp\" width=\"300\" alt=\"Keepresso menu while keeping the Mac awake\"\u003e\n  \u0026nbsp;\u0026nbsp;\n  \u003cimg src=\"docs/assets/trigger.webp\" width=\"300\" alt=\"Keepresso menu showing live trigger conditions\"\u003e\n\u003c/p\u003e\n\n## Features\n\n- ☕ **Keep awake, your way.** Prevent system sleep and/or display sleep as\n  independent toggles, indefinitely or for a timed session (15 min / 1 hr / 4 hr).\n- 🌙 **Yield the screen saver.** Let the screen saver or display sleep kick in\n  after _N_ minutes idle while the system itself stays awake.\n- ⚡ **Trigger engine.** Stay awake only while charging or on battery, an external\n  display is connected, you're on a chosen Wi-Fi network, or a specific app is\n  running. Combine conditions with **any** (OR) or **all** (AND).\n- 🎛️ **Presets.** Apply a named trigger bundle in one click, built-in (AI Agent,\n  On AC Power, External Display Connected) or your own saved rule sets.\n- 🪪 **Auto app detection.** Caffeinate while listed apps run or are frontmost,\n  with an optional grace period before it lets go.\n- 🔋 **Battery-aware auto-pause.** Let the Mac sleep once charge drops below a\n  threshold you choose, even mid-session, so it never runs the battery flat.\n- ⏱️ **Menu-bar countdown.** An optional live countdown next to the cup icon for\n  timed sessions.\n- 🔗 **URL scheme.** Drive a session from Shortcuts, Raycast, Alfred, or a shell\n  script with `keepresso://start?duration=60`, `stop`, or `toggle`.\n- 💻 **Closed-display mode.** Keep running with the **lid shut** and no external\n  display, on power or battery, for an always-on Mac or one you carry mid-task.\n- 🔔 **Reminders.** A \"still brewing\" notification (with an optional sound) after\n  _N_ minutes, one-time or recurring, so a forgotten session can't quietly drain\n  the battery.\n- 💽 **Disk keep-alive.** Periodic no-op disk I/O to stop an external drive or NAS\n  from spinning down.\n- 🖥️ **Headless Setup checklist.** Probes the system settings an always-on,\n  headless Mac needs (sleep, auto-restart, auto-login, FileVault, remote access)\n  and guides you to fix each one.\n- 🖼️ **Headless virtual display (experimental).** On a Mac with no monitor,\n  create a higher-resolution HiDPI virtual display so Screen Sharing and VNC look\n  crisp instead of a fuzzy 1920×1080. Off by default; uses a private macOS API,\n  so it's a no-dummy-plug software alternative you should treat as experimental.\n- ✨ **Native and quiet.** A menu-bar agent with an animated cup while brewing, a\n  live summary of what's holding the session on, and Liquid Glass styling on\n  macOS 26+.\n- ⬆️ **Self-updating.** Built-in auto-updates via [Sparkle](https://sparkle-project.org),\n  with an EdDSA-signed appcast on GitHub Releases.\n\n## Screenshots\n\n\u003ctable\u003e\n\u003ctr\u003e\n\u003ctd align=\"center\" width=\"50%\"\u003e\n  \u003cimg src=\"docs/assets/menu_settings.webp\" width=\"320\" alt=\"Preferences: General tab with closed-display mode\"\u003e\u003cbr\u003e\n  \u003csub\u003eGeneral: keep-awake toggles, menu-bar countdown, battery auto-pause, closed-display mode, launch at login\u003c/sub\u003e\n\u003c/td\u003e\n\u003ctd align=\"center\" width=\"50%\"\u003e\n  \u003cimg src=\"docs/assets/menu_triggers.webp\" width=\"320\" alt=\"Preferences: building a trigger rule set\"\u003e\u003cbr\u003e\n  \u003csub\u003eTrigger engine: combine AC power, Wi-Fi, displays, and app conditions, or apply a preset\u003c/sub\u003e\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"center\" width=\"50%\"\u003e\n  \u003cimg src=\"docs/assets/menu_reminder.webp\" width=\"320\" alt=\"Preferences: still-brewing reminder settings\"\u003e\u003cbr\u003e\n  \u003csub\u003eReminders: a \"still brewing\" alert so a forgotten session can't drain the battery\u003c/sub\u003e\n\u003c/td\u003e\n\u003ctd align=\"center\" width=\"50%\"\u003e\n  \u003cimg src=\"docs/assets/menu_display.webp\" width=\"320\" alt=\"Preferences: experimental headless virtual display\"\u003e\u003cbr\u003e\n  \u003csub\u003eHeadless virtual display: crisp Screen Sharing on a Mac with no monitor\u003c/sub\u003e\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/table\u003e\n\n## Built for the agentic era\n\n**The only app you'll ever need for a headless Mac setup**, whether it's running\nAI agents, a server, a render farm, or anything reachable over HTTP or SSH.\nKeepresso fits the way Macs are used now, and where they're headed:\n\n- 🤖 **AI agents.** Keep a Mac awake and reachable so agents can operate it around\n  the clock without it dozing off mid-task.\n- 💻 **MacBooks on the go.** Closed-display mode keeps work running on power or\n  battery while you pack up and move.\n- 🧑‍💻 **Builders and vibe coders.** Long builds, training runs, and overnight jobs\n  finish instead of getting cut short by sleep.\n- 🏢 **Business and enterprise, no charge.** Headless Mac minis and Mac Studios\n  powering local LLMs, agent fleets, CI, or a render farm stay up without a\n  license fee.\n- 🎬 **Studios.** Long renders and exports run to completion, untended.\n\nThe use cases are effectively limitless. Modern UI, a solid and well-tested\nfoundation, and a quiet must-have for the next decade of computing.\n\n## Install\n\n**Homebrew:**\n\n```sh\nbrew install --cask gyorgysh/keepresso/keepresso\n```\n\n**Manual:** download the latest signed, notarized DMG from\n[Releases](https://github.com/gyorgysh/keepresso/releases), drag **Keepresso** to\nApplications, and launch it.\n\nEither way, Keepresso keeps itself up to date from there.\n\n## Using Keepresso\n\nClick the cup in the menu bar to open Keepresso.\n\n- **Quick toggle.** Flip **Keep awake** on or off and pick a duration\n  (indefinitely, 15 minutes, 1 hour, 4 hours). The cup fills and animates while\n  brewing.\n- **Keep awake with lid closed.** Toggle it right from the menu before you shut\n  the lid or unplug. It asks for your administrator password once, because it\n  flips a system setting (`pmset disablesleep`), and works on power or battery.\n  Turn it off when you're done; on battery in a bag it can drain and heat up.\n- **Preferences** (⌘,) holds the set-and-forget configuration, in tabs:\n  - **General**: what to keep awake, menu-bar countdown, battery auto-pause,\n    closed-display mode, launch at login.\n  - **Triggers**: turn on rule-based activation, apply a preset, and build your\n    rule set.\n  - **Reminder**: a one-time or recurring \"still brewing\" alert, with a sound.\n  - **Disk**: choose a volume to keep spun up and how often to touch it.\n  - **Display**: create an experimental high-resolution headless virtual display.\n- **Headless Setup** checks that an always-on Mac (say a Mac mini with no display)\n  is configured to stay reachable, and links you straight to the right settings.\n\nKeepresso has no Dock icon by design. Everything lives in the menu bar.\n\n### Driving it from a script\n\nKeepresso registers a `keepresso://` URL scheme so Shortcuts, Raycast, Alfred,\nor a shell script can start or stop a session without opening the menu:\n\n```\nopen \"keepresso://start\"              # indefinite session\nopen \"keepresso://start?duration=60\"  # timed session, in minutes\nopen \"keepresso://stop\"\nopen \"keepresso://toggle\"\n```\n\n## Why not the Mac App Store?\n\nThe App Sandbox blocks the `IOPMAssertion` power APIs Keepresso depends on, so\nit's distributed **outside** the store, as a direct, notarized DMG download.\n\n## Building from source\n\nKeepresso uses **[XcodeGen](https://github.com/yonaskolb/XcodeGen)** to generate\nthe Xcode project from [`project.yml`](project.yml) (the `.xcodeproj` is **not**\nchecked in), and **Swift Package Manager** for the testable core\n([`KeepressoCore`](Sources/KeepressoCore)).\n\n**Requirements:** macOS 14+, Xcode 16+, `xcodegen` (`brew install xcodegen`).\n\n```sh\ngit clone https://github.com/gyorgysh/keepresso.git\ncd keepresso\n\n./scripts/run.sh            # generate the project and open it in Xcode (⌘R to run)\n```\n\n### Working on the core logic\n\nThe sleep-control state machine lives in `KeepressoCore` and is fully unit\ntested, independent of any UI:\n\n```sh\nswift build      # build the core library\nswift test       # run the test suite (requires the full Xcode toolchain)\n```\n\n### How it works\n\nTwo layers, by design:\n\n- **`KeepressoCore`** is a SwiftUI-free SwiftPM library: the `SessionController`\n  state machine plus protocol seams over every system touchpoint (power\n  assertions, power source, displays, network, workspace, disk, notifications).\n  This is where behavior lives and where the tests are.\n- **`Keepresso`** is the thin SwiftUI `MenuBarExtra` app: views and lifecycle\n  glue wired to the real system backends.\n\nThe controller doesn't run its own timer; the app ticks it once a second. Tests\nadvance a fake clock and inject fakes for the system seams, so the logic is\nverified without touching real hardware.\n\n### Scripts\n\n- `scripts/run.sh` — generate the project and open it in Xcode.\n- `scripts/make-icon.swift` — regenerate the app icon asset catalog.\n\nSee [docs/BUILDING.md](docs/BUILDING.md) for a full build walkthrough and\n[CLAUDE.md](CLAUDE.md) for the architecture and contributor workflow.\n\n## Contributing\n\nIssues and pull requests are welcome. New behavior goes in `KeepressoCore` behind\na protocol seam with tests, then a thin SwiftUI layer in the app.\n\n## License\n\n[MIT](LICENSE) © 2026 Keepresso contributors.\n\nIf Keepresso is useful to you, you can [support its development](https://gyorgy.sh/donate).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgyorgysh%2Fkeepresso","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgyorgysh%2Fkeepresso","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgyorgysh%2Fkeepresso/lists"}