Releases: jayashankarvr/rlm
Releases · jayashankarvr/rlm
Release list
v0.2.5
Full Changelog: v0.2.4...v0.2.5
v0.2.4
Changed
rlm guard statusstates when the guard acts in the same words as the desktop app: it steps in when apps stall and available memory is below 20%, or at once below 400 MB.- Desktop app: the sidebar shows the name as rlm, the Limit Mode options are Whole app and Single process, and the About window is wider, shows "Version" before the number and links to the project website.
Fixed
- Desktop app: the selected Limit Mode could be cut off at the default window width.
v0.2.3
A pass over the GUI for people who are not cgroup experts.
Added
- Limit Running: select whole applications with a Select button on each row; the selection and the PID field always agree. Rows show process count and memory, largest first. Single-process apps are listed too.
- Limit Running and Launch New: the Apply Limits and Run Command button stays in a bar at the bottom of the window, Enter in a field submits, and the success message has an Open button that shows Managed Processes.
- Managed Processes: an empty page with buttons to get started, Undo after removing a limit (only for processes that are still the same ones, checked by start time), and Forget rule when a saved rule would bring the limit back.
- Profiles: the built-in presets are listed and marked Built-in, or Built-in, changed with a Restore button. New and Edit share one dialog that checks the values as you type.
- A menu with Keyboard Shortcuts and an About window, and a banner when resource limiting is unavailable (Apply and Run are then disabled).
Changed
- Limit Running starts in Whole app (shared limit) mode; the other mode is Single process. Typing PIDs moved under Enter PIDs manually.
- Units: memory in MB or GB, I/O in KB/s, MB/s or GB/s, CPU as a percentage of one core, with the core count and minimums shown.
- Guard page in plain words. The pressure wording follows the guard's own policy, so it never reads calmer than the guard acts; the raw numbers are in a tooltip.
- The About page is gone from the sidebar; pages are Ctrl+1 to Ctrl+5.
- rlmctl-core:
group_by_executableincludes single-process apps and sorts by memory;DesktopApp.execis a quoted command line that keepsenvwrappers; newguard::policy::rise_level,process::start_timeandparse_start_time.
Fixed
- Choosing a profile replaces every limit field, and values such as 1.5G or 4GiB are shown exactly. The Edit Profile dialog saves fields you did not touch exactly as they were stored.
- Limit Running reloads processes when shown and skips any that exited or whose PID now belongs to another process, instead of limiting the wrong one.
- Errors name the field and are shown instead of failing silently (removing a limit, saving a profile).
- Launch New runs commands and desktop entries with quoted arguments correctly, and holding Enter launches once.
- Managed Processes and Guard update rows in place, so keyboard focus and scrolling survive the refresh.
- Process grouping read the wrong parent and session for processes whose name contains spaces.
v0.2.2
Fixed
- GUI, Limit Running: selecting an application no longer merges its PIDs into one bogus PID (for example 2894 and 52896 became 289452896). The PID field keeps the comma-separated list, a long list is never cut inside a number, and a bad entry is reported instead of guessed.
- GUI: the Mode dropdown shows its value in full; switching modes clears the PID field; the space above Apply Limits and Run Command is back to normal; long text in search, command and profile name fields no longer crashes on non-ASCII characters.
- GUI, Guard page: the on/off switch is spaced from the status list, and the protected process list scrolls in its own box.
- GUI: "Also save as a rule for rlm-guard" says after saving whether to restart or turn on the guard, since rlm-guard loads rules when it starts.
Changed
- GUI: every page's section descriptions and messages were rewritten to match what the app does. The placeholder Credits section is gone, and the About license notice covers 2025-2026.
v0.2.1
Upgrading from 0.2.0
- cargo installs: rerun
rlm guard enableto refresh your user unit (it addsRestartPreventExitStatus=78 75), thensystemctl --user restart rlm-guard. Packaged installs get the new unit with the package. rlm limitnow refuses to run while the config file is invalid, instead of silently using defaults and dropping your protect list. Fix the file, or pass--force.- Guard config values now have upper bounds:
calm_hold_secsandfreeze_cooldown_secsat most 86400,mem_available_floor_mbandmin_rss_mbat most 16 TiB. A config above them makes rlm-guard exit with status 78 until it is fixed.
Fixed
- rlm-guard never keeps its lock, journal or history in a shared directory such as
/tmp. It uses the per-user state directory, then$XDG_RUNTIME_DIR/rlm; with neither, it does not freeze or cap. - A second rlm-guard exits with status 75 and systemd does not restart it every 2 seconds.
- The cold-start wait for growth data is bounded to 3 samples.
- Startup waits at most 2 seconds for the systemd bus, then restores through cgroupfs directly.
- Guard config arithmetic cannot overflow.
rlm guard enable:%in the binary path is escaped, paths systemd cannot run are refused with a clear error, relativePATHentries are ignored, the unit is written atomically, and a masked unit is reported with the unmask command.- GUI: the guard switch gives up after 30 seconds, the Run page removes a leftover cgroup once its processes exit (and stops retrying after a minute of failures), and the service state cache cannot deadlock.
- Packaging: the AUR package stops the guard on removal, the rpm keeps an edited
rlm-delegate.confon upgrade, and the deb has a short synopsis. - crates.io: README links and the hero image resolve, and rlmctl-core and rlmctl-common have readmes.
Changed
- Common terminal emulators and the tmux and screen multiplexers are on the built-in protect list.
- CI and release workflows use the Node 24 versions of their actions.
v0.2.0
Upgrading from 0.1
- rlm-guard 0.1 applied caps as runtime systemd unit properties. The drop-ins it left under
/run(a cap value, orinfinityafter a restore) can be re-applied by asystemctl --user daemon-reloadorset-propertyuntil the next reboot. Reboot once after upgrading to clear them. - cargo installs: 0.1 installed
rlmandrlm-guardfrom cargo packages of the same names; in 0.2 both binaries belong torlmctl, and cargo refuses to overwrite a binary owned by another package. Runcargo uninstall rlm rlm-guardfirst, thencargo install rlmctl(orcargo install --path cli). - After upgrading the binaries, restart the guard so the new version runs:
systemctl --user restart rlm-guard. - The 0.1 .deb installed
/etc/systemd/system/user@.service.d/delegate.conf; 0.2 installsrlm-delegate.confwith the same content. The old file may remain after the upgrade and is safe to delete (then runsudo systemctl daemon-reload). - Config files are now parsed strictly. A config that 0.1 accepted with unknown keys or out-of-range guard values is now an error;
rlm doctorandrlm guard statusname the problem.
Changed
- rlm-guard acts when apps under app.slice are stalling on memory and available memory is below 20% of RAM (new
guard.trigger.act_below_available_pct), or at once when available memory is below the 400 MB floor, with or without a stall. Stalls inside a cgroup rlm limited are ignored. - rlm-guard picks the app whose memory grows fastest, treats all cgroups of one app as one, holds at most 3 apps, and waits at least 3 seconds after a partial action.
- Soft caps never ask for more than 10% of an app's current memory, have a 256 MiB floor, and account for hosts without swap. Caps and restores no longer change systemd unit properties.
- Invalid config files are errors: unknown keys and out-of-range guard values are rejected, and rlm-guard exits with status 78 instead of running on defaults.
- rlm-guard scans only your own processes, and only under pressure, while available memory is scarce, or every 5 seconds while persistent rules exist. It rewrites rule limits only when needed.
- Sizes accept decimals and B/iB suffixes (1.5G, 512MB, 2GiB); memory limits below 8M and I/O limits below 64K/s are rejected; profile names are case-insensitive;
--profilevalues can be overridden by explicit flags. - Logs go to stderr, without color when not on a terminal. The default level is WARN for rlm and INFO for rlm-guard;
RUST_LOGoverrides it. rlm statusis read-only.- Packages: crates.io
rlmctl(binaries rlm and rlm-guard),rlmctl-core,rlmctl-common; the delegation drop-in isrlm-delegate.conf. - Building from source or from crates.io needs Rust 1.87 or newer (the zbus release in use requires it).
Added
rlm guard history, the GUI Guard page (with an on/off switch), and service state inrlm guard status.rlm guard enableinstalls a user unit pointing at your rlm-guard when no packaged unit exists.--yesfor batch operations;--forceto limit a process on the protect list.rlm runreports OOM kills and signal deaths and exits with 128+N for signal N.rlm doctorchecks controller delegation, config validity and the guard binary, unit and service.- AUR PKGBUILD, deb/rpm removal scripts, release workflow checks and checksums.
Fixed
rlm runno longer strips limits from processes a launcher leaves behind.- io.max is written one device at a time; a failing device is a warning.
- A failed limit write no longer empties a cgroup that already existed.
rlm unlimitreports when nothing was limited instead of claiming success, and released processes can be limited again.rlm limit --savewithout--applicationis rejected; other users' processes are refused.- Non-interactive batch commands fail instead of printing "cancelled" and exiting 0.
- doctor, profiles, export, import and guard status work on hosts without cgroup v2 delegation.
- GUI: launched children are reaped, profile and group order is stable, icons exist in stock Adwaita, the sidebar follows keyboard shortcuts.
Removed
OOMScoreAdjustandMemoryMinfrom the user unit (a user manager cannot apply them usefully).