Maya Workflow Kit
The whole Maya workflow in Blender, in one install. Free and open source, Blender 4.5 – 5.2.
A Hammerspoon Spoon that watches for processes that have gotten out of hand (sustained high CPU or memory usage), warns via an actionable macOS notification, and shows current status in the menu bar.
PluginsGitHub @hugohOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Repository information has not been collected yet.
No updates detected yet. GitHub releases will appear here.
Hammerspoon Spoon that flags and helps you kill runaway CPU/memory-hogging processes
Taken from the repository README
Loading the full README.
Read the full README ↗A Hammerspoon Spoon that watches for processes that have gotten out of hand — sustained high CPU or memory usage — warns you with an actionable notification, and shows current status in the menu bar.
Repository: https://github.com/hugoh/ProcessWatcher.spoon
bin/processwatcher), built on Hammerspoon's hs IPC tool, for querying status, killing a process, and inspecting config from the terminalEnsure you have Hammerspoon installed, then choose a method:
ProcessWatcher.spoon.zip from the latest releaseProcessWatcher.spoon folder~/.hammerspoon/Spoons/hs.reload() in the console)spoon.SpoonInstall:installSpoonFromZip(
"https://github.com/hugoh/ProcessWatcher.spoon/releases/latest/download/ProcessWatcher.spoon.zip"
)
cd ~/.hammerspoon/Spoons
git clone https://github.com/hugoh/ProcessWatcher.spoon.git
Add the following to your ~/.hammerspoon/init.lua:
hs.loadSpoon("ProcessWatcher"):start()
Settings live in ~/.config/ProcessWatcher/config.json, which you can edit by hand (the menu bar's Edit Config… opens it directly). You can also configure from Lua before start() — it's merged with config.json: Lua settings take priority, and allowlist/overrides combine entries from both. Either way, ProcessWatcher never writes to config.json itself, so your hand edits are always safe:
hs.loadSpoon("ProcessWatcher"):configure({
interval = 30, -- seconds between samples
cpuThreshold = 90, -- percent CPU (can exceed 100 for multi-threaded processes)
memThreshold = 25, -- percent of physical RAM
sustainSeconds = 600, -- how long a process must stay over threshold before alerting
snoozeHours = 2, -- how long the notification's "Ignore" action suppresses alerts
terminateGraceSeconds = 2, -- wait after SIGTERM before escalating to SIGKILL
wakeGraceSeconds = 60, -- after system wake, suppress new sustain ticks for this long (0 disables)
topCount = 5, -- how many processes to show in the "Top CPU"/"Top Memory" sections
notify = true, -- whether to send a notification when a process is flagged
allowlist = { "Xcode", "ffmpeg" },
overrides = { -- per-process threshold/sustain overrides
{ pattern = "Teams", cpuThreshold = 200, sustainSeconds = 600 },
},
}):start()
interval must be strictly less than sustainSeconds, and both must be positive — otherwise a process could flag on the very first over-threshold sample and clear on the very next low one, with none of the intended dip-tolerance. An invalid config (from Lua or a hand-edited config.json) raises an error and leaves your current settings and any running monitoring untouched.
After the Mac wakes from sleep, background daemons (Spotlight's mds_stores, backupd, cloudd, WindowServer, softwareupdated, etc.) commonly do legitimate catch-up work that pegs CPU for a while. wakeGraceSeconds suppresses new sustain-tick accumulation for that long after each wake (set to 0 to disable) so that burst doesn't itself trip an alert; it doesn't reset any progress already accumulated, and samples that fall back under threshold during the window still decay normally.
overrides is an ordered list of { pattern, cpuThreshold, memThreshold, sustainSeconds }. pattern is a Lua pattern (not full regex — similar spirit, different syntax: no alternation |, quantifiers are */+/-/?) matched against the process name with name:find(pattern). The first entry in the list whose pattern matches wins; any of cpuThreshold/memThreshold/sustainSeconds left unset on that entry fall back to the global config.
"Teams" matches "Teams", "Teams Helper (Renderer)", "Teams Helper (GPU)", etc. — handy for covering every helper process an Electron app spawns with one rule.^/$ for an exact match: "^Teams$" matches only a process literally named Teams.( ) . % + - * ? [ ] ^ $) in a literal name need escaping with %, e.g. "^Teams Helper %(Renderer%)$".Click the 🌡️ icon (shown as 🌡️! while something is flagged) to see:
topCount processes by each metric, shown even when nothing is flagged, for at-a-glance status.Note: on a crowded menu bar (many status items, or a notched MacBook Pro display), macOS can silently squeeze status items off-screen entirely. If the icon disappears, ProcessWatcher is still running and monitoring in the background — the CLI works regardless of whether the icon is visible.
configure(cfg) - Merge settings into the config (never written to config.json) and restart monitoring if already runningloadConfig() - Load config.json from disk and merge it with any settings passed to configure()reloadConfig() - Re-read config.json from disk (e.g. after hand-editing it) and restart monitoring if runningopenConfig() - Open the config file in your default JSON editorstart() - Begin periodic sampling and show the menu bar iconstop() - Stop sampling and remove the menu bar iconkill(nameOrPid) - Terminate a process by name (all PIDs currently aggregated under that name) or PID; sends SIGTERM, escalates to SIGKILL if the same program still holds the PID after terminateGraceSecondsignore(name) - Snooze alerts for a process name for snoozeHoursstatus() - Human-readable summary of currently-flagged processes (name, CPU/mem%, time flagged, PIDs), processes still accumulating sustain ticks toward a flag (closest-to-flagging first), and the current top CPU/memory processesconfigSummary() - Human-readable summary of current thresholds/sustain/interval/allowlist/overridesbin/processwatcher wraps Hammerspoon's hs IPC CLI. Install it once from the Hammerspoon console:
hs.ipc.cliInstall()
Then, with ProcessWatcher loaded and running:
processwatcher status # flagged processes, processes trending toward a flag, and top CPU/memory processes
processwatcher kill <name|pid> # terminate a process
processwatcher config # print current thresholds/sustain/interval/allowlist/overrides
processwatcher reload # re-read config.json from disk and restart monitoring if running
ProcessWatcher samples processes by shelling out to /bin/ps and terminates them via /bin/kill, both running as your user — it can only see and kill processes you already have permission to (not other users' or root-owned processes, without sudo, which ProcessWatcher never uses). Notifications go through macOS's standard notification system, so the first alert may prompt you to allow notifications for Hammerspoon if you haven't already.
Full API reference is available at https://processwatcher-spoon.larve.net/.