Skip to content

Releases: ersinkoc/RustWTM

v0.20.2

Choose a tag to compare

@github-actions github-actions released this 23 Oct 10:17

Fixed

  • wtm commands and Telegram's /kill, /info, /suspend and /wait match
    process names case-insensitively beyond ASCII (çizim is Çizim.exe), as
    /find already did.
  • wtm app-limit set and remove find an app's limit whatever the case of
    its name; a limit set under another case used to be added a second time,
    and its budget ignored.
  • Settings and the Overview's protection levels change a configuration that
    writes its tables inline (governor = { enabled = true }) or with dotted
    keys; before, the change was refused, and a level button did nothing.
  • Game mode no longer starts for an ordinary maximized window (a browser, an
    editor) on a monitor without a visible taskbar: with the taskbar hidden
    automatically, or on a second monitor, such a window covered the whole
    monitor and counted as full screen.

v0.20.1

Choose a tag to compare

@github-actions github-actions released this 22 Oct 19:47

Fixed

  • A rule or kill-list entry that ends or suspends *.exe, **, *.* or
    match.path = "*" is refused like *: such a rule ended every
    unprotected program as it started. A command line (or a narrower name or
    path) still picks programs out, e.g. *.exe with cmdline = "vitest".
    A configuration holding such an entry no longer loads; the service runs on
    its defaults in dry run and says why.
  • App limits on names that are not plain ASCII (Çizim.exe) are applied;
    before, they planned the processes but capped nothing, and the Limits tab
    and wtm app-limit list showed them without usage.
  • Turning game mode, or its power plan option, off while a game is in front
    puts the previous power plan back at once instead of when the service
    stops.
  • A program added to the rescue core's exemptions while it is engaged gets
    every core back at once, not when the load recovers.
  • Insights: a second finding with actions (memory growth after chronic CPU)
    reaches the instances already running, and a finding that clears takes its
    actions back while another one stands.
  • The stuck-swarm cleanup never ends copies of RustWTM's own programs.
  • Updating works from a user folder with a typographic apostrophe
    (C:\Users\O’Brien); such a quote could end the quoted path in the
    update scripts.
  • Telegram: when the bot cannot answer a button press in time, it still
    reports what the press ended or suspended.

v0.20.0

Choose a tag to compare

@github-actions github-actions released this 22 Oct 12:10
091cef9

Changed

  • Stopping, restarting or disabling a service and blocking a program's
    network access are asked first.
  • Snapshots and the service's recent points carry the time they were
    measured (IPC protocol 15). The data age and the out-of-date warning use
    it, so a snapshot received again from the service's cache ages instead of
    reading as new; the age now reads Data measured N s ago.
  • Network, Services and Ports searches clear with Escape or a ✖ button as
    the process search does; Network and Ports say when nothing matches and
    offer to clear the search; table toolbars wrap in a narrow window.
  • Performance and process graphs place each point at its measurement time:
    a slower sample_interval_ms or a delayed sample keeps its real place on
    the time axis, and a snapshot received twice is drawn once.
  • The block list refuses programs whose blocking would break signing in,
    elevation, services, consoles or installers (consent.exe,
    svchost.exe, msiexec.exe and others). A rule's cpu_cap_relative
    needs when.cpu_above, which is also the least it resolves against.
  • The MCP server offers create_time as text: JavaScript clients round it
    as a JSON number, which a rounded value still matches.

Security

  • Policies acting on their own (kill list, rules, governor, game mode,
    insights) never end or suspend svchost.exe or RustWTM's own programs;
    the config refuses such kill-list entries and rules, and a * name with
    kill or suspend. Insights no longer touch service processes (session 0).
  • MCP control tools require create_time, so a process that took the PID
    since the listing is never changed; wtm panic and recent_events use
    only the installed service's pipe, not one a program took while the
    service is not running.
  • wtm-service install refuses a program folder that others than SYSTEM,
    Administrators and TrustedInstaller can change, or a folder above it they
    could rename or take: whoever can replace the program gets SYSTEM. Set
    RUSTWTM_ALLOW_ANY_INSTALL_DIR=1 on a development machine to install from
    a build folder. No folder on the way may be a link.
  • install.ps1 makes the install folder admin-only before copying, through
    handles and without following links (wtm-service prepare-install-dir
    sets aside what is not only administrators' and refuses a folder others
    could move, or one reached through a link), refuses stray DLLs, checks
    and copies the download from an admin-only folder, and uninstall.ps1
    continues from a fresh admin-only folder instead of a fixed name in the
    user's temp folder. Both delete folders without following links in them.
  • The updater checks the installer again after copying it to a folder only
    administrators can reach, and installs that copy: the download in the
    user's temp folder could be swapped after it was checked.
  • The hardware provider no longer unpacks native libraries to a temp folder
    (as SYSTEM possibly C:\Windows\Temp, where .NET would reuse files planted
    beforehand); they ship next to it.
  • Releases are built with read-only permissions, without a build cache and
    with third-party actions pinned to a commit; only a separate job that runs
    no project code may publish.
  • The service makes sure its data folder is its own before it reads it: a
    folder (or anything in it) owned by someone else, writable by others, a
    link or a file with a second name is set aside under an unguessable name
    and created anew, without following any link. If that cannot be done the
    service stops with a service-specific error instead of running on it.
  • Clients no longer trust the service pipe while the service is installed
    but not running, and the service keeps its pipe name even when a client
    vanishes before it is accepted.
  • Protection rules judge the image of the process actually opened, not the
    name a request gives (also for refusing to dump lsass.exe).

Fixed

  • Limits a failed lift left on a process are lifted again on the next tick
    and when the service stops, instead of staying for good.
  • An app limit whose launcher exited before its child was counted is lifted
    rather than dropped with the child still capped.
  • Changing the governor, memory guard, insight or game mode settings lets go
    at once of what they applied (as rules already did): a newly exempt app
    is no longer kept throttled.
  • A failed history query keeps the insight findings instead of lifting and
    re-announcing them all.
  • Setting the clock forward no longer makes every copy of a crowd old enough
    to end.
  • Why won't it end and the module list check the process's start time and
    hold it open while they look, so a PID taken by a later process is never
    described as the one asked about.
  • Downloads and Telegram answers are limited in size and total time: a
    server sending without end can no longer grow the service's memory or
    hold it.
  • Reading a command line retries when the process changes it meanwhile;
    restarting a service waits when its status cannot be read.
  • wtm kill --tree and free-port --tree no longer report failure for
    children that ended with their parent, and free-port lists every
    failure of a tree, not the first.
  • MCP: answers to the client and malformed messages are handled as JSON-RPC
    requires (-32600, unknown tools -32602), and why not responding
    says when its analysis is incomplete.
  • The Ports tab no longer ends a program missing from the process list (it
    could have been a later program with the same PID); it says to try again.
  • Without the service, "Calm them all down" spares the app in front as it
    does with the service.
  • The Network tab narrows to the selected process only while that process
    runs (not a later one with its PID), and offers Show all.
  • The Apps view adds up the network rates of an app's processes.
  • The Disks tab checks a typed folder off the window's thread: a sleeping
    network drive no longer freezes the window.
  • GPU engine load per type is its busiest engine, as in Task Manager: two
    video engines at 60% each read 60%, not 100%; a process shows its busiest
    engine instead of the sum of engines of one type.
  • Trace sessions no longer pile up (Windows allows 64): a window waits for
    its worker to stop its sessions when it closes, its own disk trace stops
    after 30 s unread or once the service answers, the service clears those
    closed windows left every 10 minutes, and session names carry the owner's
    start time so a reused PID no longer keeps an orphan alive.
  • A power plan game mode switched is put back after a crash too: it is
    remembered on disk while replaced and restored at the next start or on
    uninstall, instead of leaving the machine on High performance.
  • The service stopped accepting clients for good after 16 client threads
    failed to start (for example during a memory shortage); a failed start now
    gives its slot back.
  • A connection's announced frame length no longer reserves up to 32 MiB
    before any of the body has arrived.
  • Unblocking a program deleted a Debugger value another program had put
    in its place, and failed outright when RustWTM's own value was already
    gone.
  • App history lost the earlier part of a minute written twice (the service
    restarted within it, or the clock went back); the parts are now merged,
    weighted by sample count.
  • An update check started while an update was installing replaced the
    install's progress and offered the install again.
  • A priority or efficiency mode rolled back to the value from before an
    unrelated earlier limit instead of the one in place when RustWTM took it.
  • End process tree on a PID reused by a newer process ended that
    process's children.
  • A process whose exit code is 259 was reported as still running, and a
    window title longer than 63 characters could match a different window.
  • Panic, End all and Calm them all lost requests past the service's 16
    clients and showed only the last success; requests now go in order over
    one connection and failures are reported.
  • Removing or editing a rule left what it applied in place; switching from
    dry-run to enforcing never acted on processes already running.
  • A network adapter coming back up showed a burst of its whole traffic
    since boot; a failed sensor provider was never started again; lifting a
    CPU and memory limit stopped at the first failure and lost the job.
  • App history counted an app's CPU only over the samples it was seen in,
    so a short-lived helper looked like a chronic hog; fully throttled
    processes held the governor's slots.
  • Wait-chain requests behind a walk stuck in a frozen process each left a
    thread blocked; process icons were cropped on scaled displays.
  • The first local sample after losing the service averaged over all the
    time the service was used; limits set without the service could not be
    lifted once it connected; acting on a process that is not shown replaced
    the details of the one that is.
  • The kill list saved an edit over whichever entry had moved into its
    place; kill and limit forms emptied before the save was confirmed;
    Settings saved over changes made elsewhere meanwhile without a warning.
  • wtm kill <name> --tree failed on matches inside another match's tree;
    wtm free-port could end a process that got a port owner's PID.
  • MCP server: a process started since the service's last snapshot was
    reported as missing; a line that is not UTF-8 ended the server; batches
    and non-object messages got no answer; network_connections with a
    malformed pid listed every process's connections.

v0.19.0

Choose a tag to compare

@github-actions github-actions released this 21 Oct 20:34

Added

  • wtm-service cleanup removes RustWTM's blocked-program entries and its
    firewall rules; the MSI runs it on a full uninstall and
    wtm-service uninstall (used by uninstall.ps1) runs it too.
  • The MSI asks a running RustWTM window to close before it removes or
    replaces files.
  • wtm list, wtm info and wtm ports take --json.
  • Snapshots say whether a process is suspended and whether per-process
    network traffic was measured; the service status carries the error of a
    configuration file it could not load (IPC protocol 14).

Fixed

  • Uninstalling left blocked programs pointing at a deleted rustwtm.exe and
    RustWTM's firewall rules in place.
  • Remove limits reported success for a process RustWTM had not limited; it
    now says so.
  • Resuming a process suspended several times left it frozen; resume now
    undoes every suspension.
  • A client could suspend itself through the service and freeze.
  • An invalid configuration at service start was only logged to file; it is
    now an event and part of the status.
  • A priority or efficiency mode set by hand was undone when the governor
    later rolled back its own change.
  • The hardware sensor helper kept running after the Sensors tab was closed;
    it now stops after 30 s without requests unless a fan profile is active.
  • wtm list/top and the MCP server no longer present unmeasured
    per-process network traffic as 0 B/s. The MCP server measures CPU, disk
    and network over a fresh window instead of since the previous call (or
    uses the service's sample), and its control tools accept the
    create_time from list_processes to refuse a reused PID.
  • The stale 0.13.0 review is no longer installed by the MSI.
  • An Explorer window on a folder named RustWTM stopped RustWTM from
    starting; the single-instance check now uses a per-session lock and finds
    the running window by its program.
  • Restart as administrator could end with no RustWTM running; the new copy
    waits for the old one to exit.
  • With a newer service the window advised installing an older version; the
    advice and the status badge now name the actual problem.
  • Events were listed twice after reconnecting to the same service.
  • Ending processes or testing Telegram no longer holds up monitoring
    updates while the request runs.
  • A RustWTM hidden in the tray now quits when Windows or an installer asks
    it to.
  • Raw error codes on a service restart and command-line wording in the
    window's error messages are replaced by plain messages.

Changed

  • The window draws with OpenGL instead of wgpu: about 250 MB less memory
    and a 30% smaller program.
  • Visual pass: readable status colours and visible bar tracks and text
    fields in the light theme; full column headers in every language with
    right-aligned numbers; one card title and sortable-header style; loading
    and empty states with text; a stale-data banner that dims the page; the
    data age on the subtitle line; a gear icon for Settings; labels before
    controls in the power and cooling forms; translated priority, startup and
    finding names; level filter and sorting in Events; a ⋯ menu for the
    busiest apps' actions.
  • Processes marks suspended processes and shows "—" for network traffic
    that is not measured; Settings and the Overview show why the service
    could not load config.toml.
  • Ctrl+Tab and Ctrl+Shift+Tab switch pages, Ctrl+F searches Services,
    Network and Ports, and Esc closes the process details.
  • The More below hint also shows on Performance, About and the process
    details.

v0.18.1

Choose a tag to compare

@github-actions github-actions released this 21 Oct 18:37

Changed

  • Settings: split into pages chosen at the top (This window, Service
    settings
    , config.toml, Telegram) instead of one long scrolling page;
    the config.toml editor fills the window.
  • Pages and lists that continue below the visible area (the Disks tab, the
    space analysis tables, the config editor and other long pages) fade at the
    bottom and show a More below button that scrolls further.

v0.18.0

Choose a tag to compare

@github-actions github-actions released this 21 Oct 17:32

Changed

  • Performance pass across every crate, measured with new ignored timing tests
    (2000 synthetic processes):
    • Policies: one tick of rules, limits, kill watch, insights and the other
      policies costs about 2 ms instead of 55–70 ms. Wildcard matching no longer
      allocates, and per-rule state is kept only for processes a rule matches.
    • Window: the process table is filtered, grouped and sorted only when the
      data, search, filters or sort change, not on every frame; a frame of the
      Processes tab takes about 1 ms instead of 2–3.5 ms.
    • Service: snapshot, status and recent-event replies are encoded straight
      from shared state instead of copied first; history samples and queries
      allocate far less (History tab query 3–4 times faster); the start watcher
      runs only when a rule needs it.
    • System queries: GPU and disk counters, process snapshots, connection
      tables and the disk and network traces reuse their buffers and make fewer
      calls; per-event maps use a faster hasher.
    • Space analysis: workers share folders at every depth, so one huge folder
      no longer runs on a single thread (about twice as fast there).
    • Process tree lookups and sorting by name are 6–10 times faster.

v0.17.0

Choose a tag to compare

@github-actions github-actions released this 21 Oct 14:27

Added

  • Processes: Started in the last N min lists only recently started processes
    (presets from 1 minute to 4 hours, or any number of minutes) and shows the
    Running for column. More filters adds disk-active (1 MiB/s+), GPU-active
    (5%+) and session (user apps, or services and system in session 0) filters;
    active filters show as removable chips and combine with the quick filters
    and search.
  • Disks tab: drives with label, file system and free space; live activity per
    physical disk and the processes with the most disk I/O; and a space analysis
    of any drive or folder with a folder tree (sizes, share of parent, file
    counts), the largest files and space per file type, with Show in Explorer.
    Scans run on background-priority worker threads, can be stopped, report
    unreadable folders and never follow junctions or symbolic links.
  • Disks tab: Files being read and written per program, from a kernel ETW
    trace that runs only while the tab is open (service or administrator).
    Without administrator rights the service shows only your session's programs.
  • Not responding programs: marked in Processes (with a quick filter) and on
    the Overview; Analyze wait chain in the details panel shows what their
    blocked threads wait for and flags deadlocks.
  • Why won't it end?: protection, drivers that withhold the right to end it,
    critical processes and the programs still holding it open.
  • Modules: loaded DLLs with their Authenticode or catalog signer, unsigned
    and invalid ones first.
  • Network bytes per process (ETW in the service, or in the window when run as
    administrator): a Network column, details rows and the busiest programs in
    the Network tab. Close resets an IPv4 TCP connection.
  • Block network access: two Windows Firewall rules per program, grouped as
    RustWTM; listed with Unblock in the Network tab.
  • Game mode ([game_mode]): while a full-screen app is in front, busy
    background apps get below-normal priority and efficiency mode, optionally the
    High performance power plan; rolled back when it ends or the service stops.
    Only apps in the game's own session are calmed, never services or other
    users' apps.
    Shown on the Overview and in the status bar, configurable in Settings.
  • Handle and thread leak findings in the app history (report only).
  • wtm mcp [--allow-control]: a Model Context Protocol server on stdio for AI
    assistants, read-only unless --allow-control.

Changed

  • Memory dumps are written from a process snapshot (the process is frozen for
    milliseconds), falling back to a live dump; lsass and LsaIso are refused.
  • IPC protocol version 13: foreground reports carry full screen, status
    carries game mode, and connection closing, firewall and disk activity
    requests were added. Install the service of the same version.
  • Usage history stores average handles and threads per app; older databases
    are upgraded in place.

v0.15.0

Choose a tag to compare

@github-actions github-actions released this 21 Oct 08:50

Added

  • A monitoring-data receipt age on every GUI page, with a stale-data warning
    after a sampling failure or a delayed update. The last received values remain
    visible. The timeout allows slower sampling intervals; successful updates
    clear the warning. All five interface languages are supported.
  • Resources reserved for RustWTM ([reserve]): while the CPU is overloaded a
    rescue core is kept free for RustWTM and Windows by moving other programs off
    it with CPU Sets, and handed back when the load recovers. The service keeps
    working_set_mb resident and opts out of EcoQoS; the window runs above
    normal priority with 64 MB resident. Shown on the Overview and in the status
    bar, configurable in Settings.
  • Window drawing times on the About page, and RUSTWTM_FRAME_REPORT=<file>
    to benchmark every page and write per-page frame timings.

Changed

  • The window reads command lines and image paths of new processes without
    holding the data lock it needs for every frame, so a burst of new processes
    no longer stalls drawing. The About logo is uploaded once instead of every
    frame, and the Overview cards line up at equal height.
  • IPC protocol version 12 (status carries the rescue core).

v0.14.0

Choose a tag to compare

@github-actions github-actions released this 20 Oct 22:41

Added

  • GUI and desktop notifications in English, Turkish, German, French and Spanish.
    The language selector applies immediately and persists per Windows user;
    the default follows the Windows UI language. Missing translations fall back
    to English, while unknown/native diagnostic details retain their source text.
  • Translation coverage and placeholder checks in the regular test suite,
    five-language page/navigation tests and optional visual reviews in both themes
    at wide and compact sizes.
  • 96 and 128 px sizes in the embedded product icon, alongside the existing
    16, 20, 24, 32, 48, 64 and 256 px sizes; executable resource verification.

Changed

  • IPC remains protocol 11.
  • Navigation width follows translated labels; saved actions, process identities
    and service configuration keys remain language-independent.

v0.13.1

Choose a tag to compare

@github-actions github-actions released this 20 Oct 21:34

Added

  • Hybrid CPU topology from Windows CPU Sets: wtm cores [--json], processor
    group/core identifiers and relative P/E/LP-E tiers without hard-coded class values.
  • wtm affinity <target> --pcores|--ecores|--lp-ecores|--all-cores and a CPU core
    type menu in Processes. PID identity/protection checks remain enforced;
    processes spanning multiple groups are rejected rather than truncated.
  • Performance graphs label hybrid tiers; uniform CPUs omit the hybrid controls.
  • Explicit shared Windows frequency limits in Sensors & cooling and
    wtm power show|limit|restore. Administrator access and confirmation are
    required for writes. Original values are saved before mutation, partial
    failures attempt rollback, and detected external changes are preserved.
    These are power-plan settings, not per-PID MHz caps; class 1 is not assumed
    to mean E-cores.

Changed

  • IPC protocol 11 adds core-tier requests.
    Update the GUI and service together.