Previously, when SetPriorityClass failed for a process (e.g. anti-cheat), it was added to 'blocked' and completely skipped in future scans — including RSS measurement. This meant a game that started below game-mem threshold and got blocked before reaching it would never trigger game mode. Now pass 1 measures RSS for ALL processes (including blocked ones) and adds them to gameProcs if they exceed game-mem. Pass 2 skips priority changes for blocked processes but still tracks them as game processes. In game mode, blocked game procs log 'tracked as game (blocked)' instead of trying SetPriorityClass again.
autoPriority
Monitors process memory usage on Windows and automatically adjusts CPU priority: promotes memory-heavy processes to HIGH and demotes everything else to NORMAL. Optionally enters Game Mode when a process exceeds a higher threshold, boosting it to HIGH and setting all other processes to IDLE.
Windows only.
How it works
Normal mode
Every scan interval the program iterates over all running processes:
RSS vs -mem |
Current priority | Action |
|---|---|---|
| ≥ threshold | anything except HIGH | → HIGH (logged as PROMOTE) |
| ≥ threshold | already HIGH | skip |
| < threshold | ABOVE_NORMAL, HIGH, or REALTIME | → NORMAL (logged as DEMOTE) |
| < threshold | NORMAL, BELOW_NORMAL, or IDLE | skip |
Game mode (-game-mem)
When any process reaches or exceeds the -game-mem threshold:
- That process → HIGH (logged as
GAME) - All other processes → IDLE
- Log:
GAME MODE ON
When all such processes close:
- All processes that were demoted during game mode are restored to their original priority (logged as
RESTORE) GAME MODE OFFlogged- Normal mode resumes — priorities recalculated by
-memrules
If SetPriorityClass or OpenProcess fails for a process (e.g., anti-cheat protection, system processes), the process is added to an in-memory exclusion list and never touched again (logged as BLOCK). When the process exits, it is automatically removed from the list.
On shutdown, all processes are restored: game-mode demoted processes to their saved original priority, promoted and game processes to NORMAL.
Build
Requires Go 1.26+.
# Standard build (with console window)
go build -o autopriority.exe .
# Background build (no console, minimal size)
go build -ldflags="-H windowsgui -s -w" -o autopriority.exe .
Usage
autopriority [flags]
| Flag | Default | Description |
|---|---|---|
-mem |
512M | Memory threshold (e.g. 512M, 1G, 2048M) |
-game-mem |
4G | Game threshold (e.g. 3G, 4G). Must be > -mem. 0 = disabled |
-interval |
1 minute | Scan interval (min 10s) |
-dry-run |
false | Log only, don't change priority |
Examples:
# Run with 1 GB threshold, scanning every 30 seconds
autopriority -mem=1G -interval=30s
# Run with defaults (512M threshold, 4G game threshold)
autopriority
# Game mode: normal threshold 512M, game threshold 4G
autopriority -mem=512M -game-mem=4G
# Dry run — log decisions without changing anything
autopriority -dry-run
Log
Log is always written to %TEMP%\autopriority.log. A new log file is created on each run (previous log is deleted).
Log entries:
| Prefix | Meaning |
|---|---|
PROMOTE |
Priority raised to HIGH (normal mode) |
DEMOTE |
Priority lowered to NORMAL (normal mode) |
GAME |
Process set to HIGH or IDLE (game mode) |
GAME MODE ON |
Game mode activated |
GAME MODE OFF |
Game mode deactivated — processes restored |
BLOCK |
OpenProcess or SetPriorityClass failed; process added to exclusion list |
RESTORE |
Process restored to original/saved priority (game mode exit or shutdown) |
SKIP RESTORE |
PID reused by a different process; restore skipped |
[DRY-RUN] |
Would change priority (dry-run mode) |
Auto-start
Open Win+R, type shell:startup, and press Enter. Then place a shortcut to autopriority.exe in the folder that opens.
Dependencies
None. Uses only Windows API (kernel32, psapi) via raw syscall.