Docs

Power (monitor & save blocker)

Two small always-on modules, grouped together since both are tiny and both expose only flat, top-level window.Electron methods (no namespace). No config needed.

Power monitor (src/main/power-monitor.ts, channel prefix powerMonitor:*)

Method Returns Notes
getPowerMonitorIdleState(idleThreshold: number) Promise<'active' | 'idle' | 'locked' | 'unknown'> idleThreshold in seconds.
getPowerMonitorIdleTime() Promise<number> Seconds since the last user input.
onPowerMonitorEvent(callback: (data: { type: PowerMonitorEventName }) => void) () => void (unsubscribe) Broadcast to every open window. Not part of .safe (event subscription, never throws).

PowerMonitorEventName: 'suspend' | 'resume' | 'lock-screen' | 'unlock-screen' | 'on-battery' | 'on-ac' | 'shutdown'.

const unsubscribe = window.Electron.onPowerMonitorEvent(({ type }) => {
  if (type === 'suspend') pauseSync();
  if (type === 'resume') resumeSync();
});

const idleState = await window.Electron.getPowerMonitorIdleState(60); // idle after 60s

Power save blocker (src/main/power-save-blocker.ts, channel prefix powerSaveBlocker:*)

Prevents the app or display from entering a lower-power mode — e.g. during a long export or an active screen-share.

Method Returns Notes
startPowerSaveBlocker(type: 'prevent-app-suspension' | 'prevent-display-sleep') Promise<number> Returns the blocker id. Throws VALIDATION for any other type.
stopPowerSaveBlocker(id: number) Promise<boolean> false when id isn't active. Throws VALIDATION for a non-integer/negative id.
isPowerSaveBlockerStarted(id: number) Promise<boolean>
const id = await window.Electron.startPowerSaveBlocker('prevent-display-sleep');
// ... long-running work ...
await window.Electron.stopPowerSaveBlocker(id);

.safe

getPowerMonitorIdleState, getPowerMonitorIdleTime, startPowerSaveBlocker, stopPowerSaveBlocker, isPowerSaveBlockerStarted are all fully mirrored at window.Electron.safe.* (flat, same shape as the default surface). onPowerMonitorEvent has no .safe counterpart — it's a pure event subscription.

Last updated on July 18, 2026