Insomnia AI Agent
A macOS menu bar app that safely keeps your MacBook awake with the lid closed, for timed agent sessions.
Insomnia is an open-source ai agent by krishhgg, written mainly in Swift, with 1,866 GitHub stars and the MIT license. Its code was last updated Oct 27, 2026.
<p align="center"> <img src="docs/assets/session-flow.svg" alt="Illustrated menu-bar controls: enter Days, Hours, and Minutes, watch the countdown, and hold the end control to finish early. Click the eye or countdown to add time. Closing the lid is optional, and incomplete recovery needs attention." width="880"> </p>Use a stable, well-ventilated surface, not a closed bag. Insomnia is experimental. Recovery can fail, and a running timer is not a safety guarantee. Validation status · Apple's ventilation guidance
Install
Requires macOS 26 or later on an Apple Silicon Mac.
Paste this into your coding agent:
Install the latest stable Insomnia release by following https://github.com/krishhgg/Insomnia/blob/main/skills/install-insomnia/SKILL.md. If a step needs my password, give me the command to run in Terminal.
For the newest nightly, write "the newest Insomnia nightly prerelease" in
place of "the latest stable Insomnia release". Nightlies are built from main
on each day it has new commits. They have the newest code and may be broken.
To install a release yourself, follow docs/install.md. It
covers both channels, how to check the download, and v0.1.0, which installs
differently. Settings > General shows the installed version, and "Check for
updates" there tells you whether a newer release exists without installing
anything.
Build from source
Needs Xcode with Swift 6.2 or later. Replace v<version> with the latest
stable tag, or a nightly tag for the newest code:
git clone --branch v<version> --depth 1 https://github.com/krishhgg/Insomnia.git
cd Insomnia
./scripts/install.sh
open "$HOME/Applications/Insomnia.app"
<details>
<summary><strong>What the installer changes on your Mac</strong></summary>
The installer needs your password, because the sudoers rule is a system file. It installs:
- The app, at
~/Applications/Insomnia.app. - A recovery agent, a
launchdjob that runs every minute. If the app is gone when a session should have ended, the agent tries to undo the session's changes. - A sudoers rule at
/etc/sudoers.d/insomnia. A sudoers rule decides who can run what withsudo. This one lets your user account, not just Insomnia, run these four commands without a password:
/usr/bin/pmset -a disablesleep 1
/usr/bin/pmset -a disablesleep 0
/usr/bin/pmset -b lowpowermode 1
/usr/bin/pmset -b lowpowermode 0
Any program running as you can use that rule too, so review it before you install. docs/install.md lists every file and explains how upgrades replace them.
</details>Using it
-
Start. Click the eye in the menu bar, enter days, hours and minutes, and press Enter.
-
Add time. Click the eye or the countdown during a session.
-
End early. Press and hold the end control next to the countdown, or right-click the menu bar item and choose End session. To show only the eye, turn off "Show the countdown in the menu bar" in Settings. The eye opens while a session runs and closes when it ends, and the right-click menu also shows the time left.
-
Settings and status. Right-click the eye. Quit asks Insomnia to undo the session first, and it refuses while a change is still waiting to be undone. Saved audio for an output that isn't connected doesn't hold it up. Insomnia restores that output if it reconnects while the app runs, or at the next launch.
-
Menu bar style. The Menu bar picker in Settings > General has four styles. Pills, the default, works as described above. Compact keeps only the eye in the bar, and a click opens the same pills, countdown and end ring in a small panel. Minimal is the eye with a ring for the time left: a click adds the default session length, and a 0.6 s hold ends the session. Popover shows the eye and, during a session, the time left to the minute (or the end time). Any click on it, left or right, opens a popover with time buttons, Custom fields for days, hours and minutes, the status, Settings and Quit. While a session runs it also has the ring you hold to end it. Popover style has no right-click menu, since the popover shows the same things.
-
One click. Turn on "Start a session with one click" in Settings > General, under the Menu bar picker. Then, in Pills, Compact and Popover, a click on the eye with no session running starts the default session length. Option-click opens the usual controls to pick another length, and in Popover a right-click or Control-click does too. A click during a session works as it does with the switch off, and never ends the session. If the start is refused, the pills, the panel or the popover opens with the reason. Minimal already adds the default length on every click, so Settings greys the switch out there. It is off by default.
-
Sounds. "Play a sound when you start or end a session" in Settings > General plays a short tone when you start or end a session from the menu bar. It is off by default, and while it is off Insomnia makes no sound and loads none. A session that ends without you asking (the timer, the recovery agent, Quit, a battery or heat rule, recovery after a crash) makes no sound. Nothing plays while the displays sleep or the lid is closed, and
--sessioncommands make no sound. -
From a script or an agent. The app's binary drives the running app:
INSOMNIA=~/Applications/Insomnia.app/Contents/MacOS/Insomnia "$INSOMNIA" --session start 7200 # two hours "$INSOMNIA" --session extend 1800 "$INSOMNIA" --session status "$INSOMNIA" --session endIt starts, extends and ends the same session the menu bar counts down, with the same battery and heat rules, and prints one line. It changes nothing itself, so when the app isn't running it says so and exits 1. A build without this mode opens the menu bar app instead, so a script that may meet one checks
InsomniaSessionCommandVersionin the bundle'sInfo.plistfirst.
You don't have to close the lid, and opening it doesn't end the session. When the timer or a battery or heat rule ends a session with the lid closed, Insomnia puts the Mac to sleep.
Insomnia stops system sleep, not display sleep, so the display still turns off
when idle. If your Mac then asks for a password, agents that drive the screen
stop at the lock screen. Keep the screen on and unlocked in Settings >
General holds the display awake during a session, like caffeinate -d, so the
screen saver never starts and the screen never locks while idle. With the lid
closed, the display goes to brightness 0 instead of sleeping. Lock the
screen under When the lid closes still locks the screen when you close the
lid. When the session ends or Insomnia quits or crashes, macOS drops the hold,
and the display sleeps and locks as before. Insomnia never changes the lock
setting. The switch is off by default because anyone who opens the Mac during a
session finds it unlocked, unless a lid close locked it.
On battery power, Insomnia turns on Low Power Mode below 40% and ends the session below 10%. Those are the defaults. You can change both in Settings, and an end floor of 0 turns the battery end off. The heat rules turn on Low Power Mode when the Mac gets seriously hot and end the session at critical heat. They are on by default, and Settings can turn them off. All of these rules only work while the app runs.
Before your first session, check Settings. Then run a short session you can
watch, and read ~/Library/Logs/Insomnia/insomnia.log afterward.
What happens when the lid closes
<p align="center"> <img src="docs/assets/lid-actions.svg" alt="Illustrated Settings defaults: Slack, WhatsApp, and Discord on the freeze list, Docker's idle rule off, mute on. During a session, lid close applies configured actions; reopening attempts to resume verified owned freezes and restore saved audio. The session continues. Without an active session, lid changes do nothing." width="880"> </p>During a session, closing the lid does each of these, and opening it tries to undo them. The timer keeps counting down while the lid is closed.
- Display and keyboard light go off. Insomnia saves their brightness first. With sleep turned off, macOS no longer does this by itself.
- Apps on the freeze list are frozen. Freezing sends an app's processes
SIGSTOP, which pauses them untilSIGCONTon lid open. The list starts with Slack, WhatsApp and Discord. Edit Apps in Settings sets each app to keep running or to freeze, and "All other apps" keeps running by default. Set to freeze, it still skips meeting, recording and dictation apps: Zoom, Teams, Webex, FaceTime, Wispr Flow, Granola, Otter, OBS and Loom. - The screen can lock. Off by default. With "Lock the screen" on in Settings, closing the lid locks the screen and opening it asks for your login password. Apps, command-line agents and browser automation keep running, but agents that work through the screen, such as computer use, wait until you sign in. Off, the Mac stays signed in with the lid closed. A lid closed on an external display locks only once the display is unplugged. It uses a private macOS call, so the menu shows a line if it fails.
- Audio is muted. Lid open unmutes each output Insomnia muted, even if you switched to another one.
- Low Power Mode turns on. It turns off when the lid opens, unless a battery or heat rule still needs it.
- Docker Desktop is frozen when no container runs. This one is off by default.
On Mac laptops with Apple silicon or a T2 chip, closing the lid disconnects the built-in microphone in hardware. Recording a meeting with the lid closed needs AirPods or an external mic.
docs/lid-close.md has the details: how Docker is checked, how brightness is restored, the one-time settings change when you upgrade, and how to test lid actions without closing the lid.
How recovery works
<p align="center"> <img src="docs/assets/recovery-flow.svg" alt="The app and a launchd backstop coordinate through a shared lock and recovery journal. The app handles normal cleanup. The backstop checks every minute and attempts due recovery, leaving valid active sessions alone. Failed or unreadable recovery evidence stays on disk; saved audio needs the app and unconfirmed stopped processes need inspection." width="880"> </p>Insomnia writes each change to a recovery journal, a file on disk, before it makes the change. Ending the session tries to undo what the journal lists. If the app crashes or quits, the recovery agent tries the same once the session's end time has passed.
Some things need you:
- The recovery agent can't restore audio. Open Insomnia again for that.
- The recovery agent doesn't watch the battery or the temperature.
- Insomnia only unfreezes a process it can prove it froze. A frozen process it can't prove stays frozen until you check it.
If the menu shows a recovery warning, deal with it before you leave the Mac alone. docs/recovery.md explains each case.
Optional extras
<details> <summary><strong>iPhone hotspot handoff and tmux</strong></summary>If the Wi-Fi drops during a session, Insomnia can join your iPhone's hotspot. Set System Settings > Wi-Fi > Ask to join hotspots to Automatically, then enter the hotspot's name and password in Insomnia's Settings. The password stays in your login Keychain. Insomnia asks for Location Services access, because macOS requires it to read Wi-Fi network names. It never reads your location. After you reinstall Insomnia, enter the password again.
After 90 seconds without a network, Insomnia can also type continue into a
tmux pane running a coding agent. It only types into panes you list in
Settings and mark yourself:
tmux set-option -p -t <session:window.pane> @insomnia-nudge on
It doesn't press Enter unless you turn that on. Mark a pane you don't type in. docs/extras.md has the details.
</details> <details> <summary><strong>Chrome, Chromium, Arc and Comet throttling</strong></summary>These browsers slow down windows that macOS reports as hidden, which includes
every window while the lid is closed. If a running browser lacks
--disable-backgrounding-occluded-windows or
--disable-renderer-backgrounding, the right-click menu (the popover in
Popover style) offers "Relaunch [browser] unthrottled". It asks first,
because relaunching quits the browser, and tabs come back only if the
browser reopens them on startup. Some web apps may still stop with the lid
closed.
docs/extras.md has the
details.
Settings live in ~/Library/Application Support/Insomnia/config.json and logs
in ~/Library/Logs/Insomnia/. Insomnia sets both folders and their files to
owner-only permissions. It leaves symlinks and access control lists (ACLs,
extra per-account permission entries) as they are, so another account can
still have access through one. Logs can contain Wi-Fi names, process details
and tmux targets, so check them before you share one.
docs/extras.md has the details.
Uninstall
From your checkout:
./scripts/uninstall.sh # removes the app, the agent and the sudoers rule
./scripts/uninstall.sh --purge # also removes settings and logs
From an unpacked release zip, run ./uninstall.sh in its folder instead. The
uninstaller undoes any open session first and stops if it can't.
docs/install.md has the details.
Development
swift build
swift test
The tests use fakes and temporary folders, so they never change your power settings. See Contributing, Security reporting, Release validation and Design notes.
Star history
<a href="https://www.star-history.com/?repos=krishhgg%2FInsomnia&type=date&legend=top-left"> <picture> <source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=krishhgg/insomnia&type=date&theme=dark&legend=top-left" /> <source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=krishhgg/insomnia&type=date&legend=top-left" /> <img alt="Star history for krishhgg/Insomnia" src="https://api.star-history.com/svg?repos=krishhgg/insomnia&type=date&legend=top-left" /> </picture> </a>License
Insomnia alternatives
View more →Similar ai agents in Other, ranked by GitHub stars. Compare licence, recent activity and scan status before you choose.
| Name | Stars | Licence | Last updated | Scan |
|---|---|---|---|---|
| Insomnia (this page) krishhgg | 1.9k | MIT | Oct 27, 2026 | Scanned, no flagged issues |
| Hermes Desktop fathah | 15k | MIT | Oct 13, 2026 | Scanned, no flagged issues |
| CubeSandbox TencentCloud | 13k | None found | Nov 1, 2026 | Not scanned yet |
| Openchamber openchamber | 12k | MIT | Nov 1, 2026 | Scanned, no flagged issues |
| Open Swe langchain-ai | 11k | MIT | Nov 1, 2026 | Scanned, no flagged issues |
| Moltworker cloudflare | 9.9k | Apache-2.0 | May 9, 2026 | Scanned, no flagged issues |