Development has moved to Argus-Lasso.
This Python/PyQt6 repository is no longer maintained and is retained as a historical archive. There will be no further fixes, releases or pull-request reviews here.
Read the retirement announcement and notice to fork maintainers.
Argus-Lasso is the official successor and the version I recommend. It is the more capable version of this project, built in Rust with egui, and it is where I will continue all development.
Argus-Lasso carries forward process management, CPU affinity rules, ProBalance and Gaming Mode, with hardware monitoring, a Vulkan overlay and game performance recording in the current source tree. See its README for the distinction between published releases and features available from source.
- Argus-Lasso repository and current status
- Installation instructions
- User guide
- Report issues or request features in Argus-Lasso
If you maintain a fork of this repository, you are welcome to continue it independently. For future upstream work and contributions, please use Argus-Lasso. This is a separate Rust implementation; do not assume that Python patches or configuration files can be applied unchanged.
Thank you to everyone who tried, reported issues with or forked Process Lasso for Linux.
The material below describes the discontinued Python version. For new installations, use the Argus-Lasso instructions linked above.
A KDE/Linux process manager inspired by Windows Process Lasso. Built with Python + PyQt6.
| Processes | Gaming Mode |
|---|---|
![]() |
![]() |
| Rules | ProBalance |
|---|---|
![]() |
![]() |
| Settings | Log |
|---|---|
![]() |
![]() |
Windows Process Lasso uses SetThreadAffinityMask to restrict existing threads to a subset of cores. The problem is that threads are already scheduled and thread-pool sizes are already fixed — forcing them onto fewer cores creates scheduling contention and frametime jitter that shows up as stutters in CPU-bound games.
Process Lasso for Linux uses sysfs CPU parking (/sys/devices/system/cpu/cpuN/online). Writing 0 physically removes non-preferred CPUs from the kernel scheduler before your game ever launches. Every process — including the game, its thread pools, and the OS itself — sees only the preferred cores from the start. Thread-pool sizing is correct, there is no competition for runqueues, and frametime variance drops measurably. This is the same technique used by gamemoderun on AMD X3D and Intel Hybrid platforms.
- Live process table — sortable by CPU%, memory, PID, nice, affinity, I/O
- Per-CPU utilization bars — htop-style with colour ramp (green → yellow → orange → red by load)
- CPU frequency display — each bar shows current GHz (e.g.
4.43G) alongside utilization % - Temperature tint — bars shift orange as core temps rise (reads from hwmon/k10temp/zenpower)
- Rolling CPU history chart — 4-minute area graph above the bars, colour-coded by load
- Filter bar (Ctrl+F) — live search by process name or PID
- Right-click context menu: Set affinity, Set nice priority, Set I/O priority, Add rule, Kill / Force Kill
- Multi-select with Shift/Ctrl+click; Delete key to kill selected processes
- Column visibility toggle; cmdline tooltip on process name
- Pin any process to specific CPU cores, permanently enforced across reboots
- Match by name contains, exact name, or regular expression
- Visual CPU affinity picker — topology-aware checkbox grid, no manual range typing required
- Quick-select buttons: All, None, CCD0 (V-Cache), CCD1, CCD0 (no SMT)
- Pre-fills from a running process via "Select from running processes…"
- Per-rule nice priority (−20 to 19) and I/O priority (class + level)
- Enable/disable individual rules without deleting them
- Export rules to JSON / Import from JSON
- 14 built-in rule presets (Steam, Wine/Proton, OBS, Discord, browsers, compilers, etc.)
- Automatically throttles CPU-hogging background processes when system load spikes
- Configurable CPU threshold, throttle nice value, and cooldown period
- Live count of currently throttled processes shown as a badge on the tab label
- Restore original priority the moment load drops back to normal
- One-click CPU parking for AMD X3D and Intel Hybrid (P-core/E-core) CPUs
- Auto-detects topology: AMD X3D parks non-V-Cache CCD; Intel Hybrid parks E-cores
- Granular preferred CCD core selector — uncheck individual CPUs or use "No SMT" to run on physical cores only
- Elevate game priority (nice −1) for all matched processes
- Steam — browse your installed library, auto-fills game name + launch command
- Lutris — reads
~/.local/share/lutris/pga.db, auto-fills game name + command - Any game — type or paste any shell command (Heroic, Bottles, native exe, etc.)
- Auto-disable Gaming Mode when the game exits — watches
/procfor the game process using fuzzy name matching (handles Proton/Wine wrappers where the process name differs from the game title) - Kill Game button — sends SIGTERM and restores CPUs immediately
- Save the complete game configuration as a named profile: game name, launch command, CPU parking selection, and nice preference
- Selecting a profile instantly restores all settings — no Load button needed
- Profile name defaults to the game name on save
- Delete profiles you no longer need
- Default CPU affinity applied to all new processes
- Monitor polling interval (0.5 s – 10 s)
- Window opacity slider (20 % – 100 %)
- Toggle between custom dark theme and system Breeze Dark theme
- Start minimized to tray on launch
- Systemd user service autostart toggle (no root required)
- Minimize to tray on window close
- Tray tooltip shows live average CPU %
- Quick Gaming Mode toggle from tray menu
- Python 3.8+
psutil >= 5.9PyQt6 >= 6.4- Linux kernel ≥ 4.1 (sysfs CPU hotplug)
sudowith a NOPASSWD rule for the sysfs helper (set up via the Gaming Mode tab)
git clone https://github.com/FranzJeger/process-lasso-linux.git
cd process-lasso-linux
bash install.shThe installer detects your package manager and prints the correct install command for any missing dependency.
| Distro | Package manager | psutil | PyQt6 |
|---|---|---|---|
| Arch / Manjaro | pacman | python-psutil |
python-pyqt6 |
| Ubuntu / Debian | apt | python3-psutil |
python3-pyqt6 |
| Fedora / RHEL | dnf | python3-psutil |
python3-PyQt6 |
| openSUSE | zypper | python3-psutil |
python3-pyqt6 |
| Any | pip | psutil |
PyQt6 |
Only applies to CPUs with two CCDs where one has 3D V-Cache and the other does not:
| CPU | Cores | 3D V-Cache CCD |
|---|---|---|
| Ryzen 9 7900X3D | 12 | CCD0 (6 cores, large L3) |
| Ryzen 9 7950X3D | 16 | CCD0 (8 cores, large L3) |
| Ryzen 9 9900X3D | 12 | CCD0 (6 cores, large L3) |
| Ryzen 9 9950X3D | 16 | CCD0 (8 cores, large L3) |
Single-CCD X3D chips (5800X3D, 7800X3D, 9800X3D) have all cores on the same die — there is nothing to park and no asymmetry to exploit.
The detector finds the CCD with the larger L3 cache and marks those cores as preferred. The plain CCD is parked.
- Open Process Lasso → Gaming Mode tab
- Click Enable Gaming Mode
- Launch your game — it runs exclusively on the 3D V-Cache CCD
- Click Disable Gaming Mode when done (cores come back online immediately)
The detector identifies P-cores (higher max frequency) as preferred and parks E-cores.
- Open Process Lasso → Gaming Mode tab
- Click Enable Gaming Mode
- Launch your game — it runs on P-cores only, E-cores handle background tasks
- Click Disable Gaming Mode when done
- Go to Gaming Mode → Game Launcher
- Click Steam… or Lutris… to pick your game, or type a command directly
- Click Save — a profile is created with your game name
- Next session: select the profile from the dropdown — everything is restored instantly
- Click ▶ Launch — Gaming Mode enables automatically and the game starts
- When the game exits, Gaming Mode disables automatically and all parked CPUs come back online
This project was built entirely with Claude (Anthropic). Every line of Python, the GUI, the sysfs integration, the helper binary — all of it was written through a conversation with an AI assistant. No apologies. It works, it's fast, and the dark theme slaps.
If that bothers you, the unpark button is right there.
MIT — see LICENSE.





