Skip to content

SysManager 1.18.2

Choose a tag to compare

@github-actions github-actions released this 03 Jun 14:35
· 45 commits to main since this release

[1.18.2] - 2026-06-03

Fixed

  • Pipe listener no longer fire-and-forgets via async void. App.StartPipeListener was an async-void method, meaning any exception escaping the loop would crash the process via the AppDomain handler. Renamed to StartPipeListenerAsync returning Task; OnStartup calls it as _ = StartPipeListenerAsync() so a stray exception flows through TaskScheduler.UnobservedTaskException (logged) instead of terminating the app.
  • StartupService — removed sync wrapper over async. SetEnabled (sync) was a thin wrapper around SetEnabledAsync using .GetAwaiter().GetResult(). The wrapper is gone; tests now call SetEnabledAsync directly via xUnit Task test methods.
  • Schtasks stderr read — replaced stderrTask.Wait(timeout) ? .GetAwaiter().GetResult() : "" with await stderrTask.WaitAsync(timeout) so the read is fully async with a clean timeout fallback.

Fixed

  • Privacy Toggles no longer write to the registry on every click. Toggling a switch now updates local state only; the user must press Apply to write pending changes. A live counter shows how many changes are pending, and Discard reverts them without touching the registry. Prevents accidental system changes when scrolling through the toggle list.
  • Dashboard no longer freezes on first load. Static system info (CPU, OS, RAM modules) is now loaded asynchronously instead of blocking the UI thread on a synchronous WMI capture. The Dashboard tab is responsive immediately on startup.
  • DNS / Hosts tab loads asynchronously. Reading the hosts file is now async (File.ReadAllLinesAsync); Refresh no longer freezes the UI on slow disks.
  • Icon cache eviction is now true FIFO. The icon cache previously evicted random entries because ConcurrentDictionary.Keys has no insertion-order guarantee. Frequently-used icons could be dropped while stale ones survived. The cache now tracks insertion order via a queue and evicts the oldest entries first when the size limit is reached.
  • SpeedTest output read — replaced Task.Result access after Task.WhenAll with proper await to remove the deadlock-prone pattern (the awaited tasks were already complete, but the style is now safe under all call paths).
  • Silent exception swallowing — empty catch { } blocks now log at Debug level so failures are diagnosable: ThemePopup custom-color parser, TemperatureService LibreHardwareMonitor close, WindowsUpdateService COM/RuntimeBinder catches in ExtractKbIds and ClassifyCategory.
  • Deep Cleanup — file/directory cleanup errors are now logged in addition to being added to the per-run error list, so unexpected I/O issues surface in the SysManager log.
  • Admin relaunchRelaunchAsAdmin now distinguishes the user's UAC decline (Win32 error 1223 → Information) from real Win32 failures (Warning) and logs InvalidOperationException instead of swallowing it silently.
  • SHGetFileInfo P/Invoke — added SetLastError = true so callers can inspect the Win32 error code on failure.

Changed

  • PrivacyView toolbar — the Apply All button is replaced by Apply (writes only pending changes) and Discard (reverts to last-applied state). Both are disabled when no changes are pending. The Apply button uses the primary style to highlight the action.
  • PerformanceService.TakeSnapshotAsync XML doc now warns callers that the method must run before any state-modifying call; the recommended lazy-initialization pattern is documented inline.
  • PerformanceService.CreateRestorePointAsync comment reworded — the previous // BUG-003: marker was a design note, not an open bug; replaced with an explanation of why PowerShell AddParameter cannot be used here.
  • App.xaml.cs unhandled-exception dialog — added inline note explaining why MessageBox.Show is used instead of DialogService (the dispatcher exception may originate from DialogService itself).
  • .gitignore — added entries for local developer notes (.session-notes/, notes-local.md, scratch.md) so scratch files can never be tracked accidentally.

Verify the download

Get-FileHash .\SysManager-v1.18.2.exe -Algorithm SHA256

Expected SHA256: 880C6DFE5AFB9759DBDEAAFB863BB1F9B6C1620C1E7DA7EFFBBD4658E32313D4