SysManager 1.18.3
Note: 1.18.3 re-tags the same build as 1.18.2 (identical commit). The notes below are repeated for completeness.
[1.18.3] - 2026-06-03
Fixed
- Pipe listener no longer fire-and-forgets via
async void.App.StartPipeListenerwas an async-void method, meaning any exception escaping the loop would crash the process via the AppDomain handler. Renamed toStartPipeListenerAsyncreturningTask;OnStartupcalls it as_ = StartPipeListenerAsync()so a stray exception flows throughTaskScheduler.UnobservedTaskException(logged) instead of terminating the app. - StartupService — removed sync wrapper over async.
SetEnabled(sync) was a thin wrapper aroundSetEnabledAsyncusing.GetAwaiter().GetResult(). The wrapper is gone; tests now callSetEnabledAsyncdirectly via xUnitTasktest methods. - Schtasks stderr read — replaced
stderrTask.Wait(timeout) ? .GetAwaiter().GetResult() : ""withawait 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.Keyshas 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.Resultaccess afterTask.WhenAllwith properawaitto 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 inExtractKbIdsandClassifyCategory. - 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 relaunch —
RelaunchAsAdminnow distinguishes the user's UAC decline (Win32 error 1223 → Information) from real Win32 failures (Warning) and logsInvalidOperationExceptioninstead of swallowing it silently. SHGetFileInfoP/Invoke — addedSetLastError = trueso 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 PowerShellAddParametercannot be used here. - App.xaml.cs unhandled-exception dialog — added inline note explaining why
MessageBox.Showis used instead ofDialogService(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.3.exe -Algorithm SHA256Expected SHA256: 99B34763C9096A56E5A977626596030F808B744707185BB5D1C777FFE7E4BCAC