* Make UI helpers no-op when no window exists The -Preset and -Config paths run Invoke-WinUtilAutoRun before the XAML form is created and before PresentationCore is loaded, so every call into Invoke-WPFUIThread failed with InvokeMethodOnNull and every call into Set-WinUtilTweaksProgressIndicator failed to resolve [Windows.Visibility]. The errors were non-terminating, so tweaks still applied, but each run filled the log with noise. Loading presentationframework earlier does not help: Visibility lives in PresentationCore, which only loads once a WPF object is instantiated, and the XAML-named progress controls do not exist in these paths either. Guarding the two helpers covers Invoke-WPFtweaksbutton, Invoke-WPFundoall and Invoke-WPFFeatureInstall, which the existing per-call-site $hasUI convention never reached. * Suppress stray console output from automation runs Invoke-WPFRunspace returns an IAsyncResult that no caller uses, and Set-WinUtilRegistry was the only New-PSDrive call site that did not suppress its output. A GUI click handler discards both, but the -Preset and -Config paths call the workflows directly, so an async handle dump and a PSDrive table landed in the user's log. The handle itself is kept because pester/runspace.Tests.ps1 asserts that Invoke-WPFRunspace returns a single IAsyncResult, so the suppression goes at the four call sites reachable from Invoke-WinUtilAutoRun. * Add project learning for window-free UI helpers
Chris Titus Tech's Windows Utility
A curated compilation of Windows system tasks streamline installs, debloat with tweaks, troubleshoot with config, and configure Windows updates. Run it fresh on every new Windows install.
Quick Start
WinUtil must be run as Administrator Because it performs system-wide changes.
Open PowerShell or Terminal as admin, then run:
Stable Branch (recommended)
irm https://christitus.com/win | iex
Development Branch
irm https://christitus.com/windev | iex
How to open an admin terminal
- Start menu: Right-click Start → Windows PowerShell (Admin) or Terminal (Admin)
- Search: Press the
Windows key, and typePowerShellorTerminal, thenCtrl + Shift + Enter
Automation / Presets
Apply a predefined configuration without manual selection:
& ([ScriptBlock]::Create((irm https://christitus.com/win))) -Preset Standard
| Preset | Description |
|---|---|
Standard |
Balanced defaults for most users |
Minimal |
Minimal changes to suit every user |
Advanced |
Deep tweaks for power users |
To view exactly what each preset does, see: https://github.com/ChrisTitusTech/winutil/blob/main/config/preset.json
Build & Develop
See https://github.com/ChrisTitusTech/winutil/blob/main/.github/CONTRIBUTING.md
Resources
Support
- Leave a ⭐ to show support!
- EXE Wrapper for $10 @ https://www.cttstore.com/windows-toolbox
Sponsors
These are the sponsors that help keep this project alive with monthly contributions.














Contributors
Thanks to everyone who has contributed time and effort to this project. Keep rocking 🍻
