v3.1.0
Bug Fixes
GameMode integration corrected. Previous versions incorrectly called gamemoded -r, which attempted to start a second daemon instance. The fix uses a proper D-Bus call (gdbus) to com.feralinteractive.GameMode.RegisterGame, which is the correct way to request GameMode as a client.
Config merging fixed. User config files are now deep-merged with defaults instead of shallow-merged. This means new config sections added in future updates (like gaming: and appify_exempt) are no longer silently dropped when an older config file is present.
CPU percentage calculation corrected. CPU usage is now computed from raw cpu_times deltas rather than relying on psutil's cpu_percent(), giving accurate per-process readings across varying poll intervals instead of inflated or stale values.
PID reuse detection added. The process class cache is now invalidated when a PID is reused by a different process (detected by name change), preventing a new process from inheriting the wrong throttle classification.
Habit decay is now time-scaled. Decay was previously applied at a flat rate regardless of how much time had elapsed since the last decay pass. It now scales by elapsed seconds, so the effective decay rate stays consistent even when the daemon is busy or the poll interval varies.
IO delta guards against negative values. A kernel rounding edge case could produce a tiny negative IO byte delta. This is now clamped to zero to prevent negative IO rates from corrupting throttle decisions.
cgroup CPU quota formula fixed. The quota now correctly accounts for the number of CPU cores (quota_us = pct/100 * period_us * cpu_count), so a 70% quota on a 16-core machine no longer starves throttled processes to a fraction of one core.
Mode detection rate-limited. Battery and handheld checks are now performed at most once per minute rather than on every poll loop, reducing unnecessary syscall overhead on busy systems.
GameMode debounce added. GameMode is no longer released after a single game-free scan. A two-scan debounce prevents rapid toggling if a game briefly disappears from the process list.
Temp file naming fixed for habit saves. The temporary file used during atomic habit saves is now named habits.yaml.tmp rather than habits.tmp, avoiding potential collisions with other files in the same directory.
New Features
gaming config section. A new gaming block controls how ProcessSentry behaves while a game is running: throttle_pause_seconds (default: 30) suppresses new throttle decisions for a window after game detection, and cpu_threshold_multiplier (default: 1.5) raises the CPU threshold during play to give background work more headroom.
appify_exempt option. Processes launched by Appify as PWA desktop apps are now automatically exempt from throttling. They are identified by their browser command line containing ~/.pwa_manager/profiles/, which distinguishes them from regular browser windows without any manual configuration. Set appify_exempt: false to disable.
memory_high_percent cgroup option. A new cgroup: memory_high_percent setting applies a soft memory ceiling (memory.high) to the throttled cgroup slice. Disabled by default (0). Only applied to throttled processes, not to normal-priority ones.
Threshold multiplier syntax. Per-mode threshold overrides now support a multiplier suffix (e.g., io_mbps: "1.3x") in addition to absolute values, making it easier to express relative adjustments without knowing the base value.
Secondary predictive trigger. In addition to the habit-score threshold, a process is now pre-emptively throttled if its recent CPU history average exceeds 80% of the current threshold, catching processes that are clearly trending toward a spike before their habit score has had time to build up.
memory.high floor. When memory_high_percent is set, the computed byte value is floored at 256 MiB to prevent the throttled slice from being made so small that normal processes inside it thrash constantly.
Expanded default exclusion list. The built-in never_touch_prefixes list now covers a much broader range of common applications out of the box, including IDEs, creative tools, communication apps, browsers, terminals, and system monitors, so fewer users need to manually add exclusions.