6 min read

WinUtil: Chris Titus Tech's Windows Debloat and Setup Tool (GitHub, Scanned)

Install apps, turn off Windows telemetry and bloat, and fix updates from one admin PowerShell run.

WinUtil logo
✅
Scan: safe. Nothing malicious, and it does what it says. The notes: it is a download-and-run script that needs Administrator rights, and several tweaks make deep system changes that are not all easy to undo. Scanned Oct 26, 2026; the full report is below.

WinUtil is a PowerShell utility with a graphical window that gathers the jobs people do on a fresh Windows install. It bulk-installs apps through winget or Chocolatey, turns off telemetry, activity history and consumer features, can remove OneDrive or Edge if you ask, applies common fixes and sets how Windows Update behaves. You paste one line into an admin terminal and choose what you want from its tabs.

It earns its place by being open about what it does. Every tweak is defined in the repository's config files, and the three presets (Standard, Minimal and Advanced) are listed in config/preset.json, so you can read the exact changes before applying them. Standard and Advanced create a restore point first. It is MIT-licensed, maintained by Chris Titus with 186 contributors, and has about 65,000 stars, at release 26.10.07 when scanned.

The honest limit is the nature of the job: these are system-wide changes made as Administrator. Some tweaks, such as removing Edge or disabling services, can break things other software expects, and the Minimal preset does not make a restore point. A faster .NET version is sold separately; the PowerShell script on GitHub is the free one.

Who it is for

People setting up a new Windows PC who want it quieter and less cluttered, IT technicians repeating the same installs on many machines, and anyone who would otherwise work through a long debloat guide by hand.

Getting started

1. Open PowerShell or Terminal as Administrator and run the stable branch

irm https://christitus.com/win | iex

2. Or apply a preset (Standard, Minimal or Advanced) without clicking through the window

& ([ScriptBlock]::Create((irm https://christitus.com/win))) -Preset Standard

The one-liner downloads the script from christitus.com and runs it at once with admin rights. To see what a preset changes before you run it, read config/preset.json in the repository; each tweak is defined in config/tweaks.json. Have a backup or restore point before trying the Advanced tweaks.

Safety scan

We cloned ChrisTitusTech/winutil at commit 2f0bdc8 on Oct 26, 2026 and ran the checks described on the GitHub Tools page: credential patterns, decode-and-execute code, install-time scripts, committed binaries, risky CI workflows, every host the code talks to, known vulnerabilities in pinned dependencies, and project hygiene. A person read every hit. This is what we found.

  • No secrets, no committed binaries and no bare-IP URLs across about 27,000 lines of PowerShell.
  • The 3 pattern hits are PowerShell -EncodedCommand calls. Two, in scripts/start.ps1 at lines 201 and 217, relaunch WinUtil itself with admin rights; the encoded command is built from its own script path and your parameters by New-WinUtilElevationCommand, a normal way to carry arguments through a UAC prompt. The third is in a Pester test, pester/sanity.Tests.ps1.
  • The 16 installer-style files are the app's own install engine and its tests: functions that set up winget and Chocolatey (from community.chocolatey.org) and install the programs you tick. None uses sudo-style tricks, pipes a download into a shell or edits a shell profile.
  • 50 known advisories, none in the script you run. 41 are in tools/title-screen/uv.lock, a Python helper with an old Pillow that renders the README's title screenshot, and 9 in docs/package-lock.json, the documentation site. WinUtil itself has no package dependencies.
  • 12 workflows. One uses pull_request_target (label-pr.yaml), and it only reads the pull request's description to add labels; it never checks out the submitted code. None of the 8 third-party actions is pinned to a commit. Security policy, Dependabot, contributing guide and code of conduct present.

What the scanner counted

CheckResult
SecretsNone found.
Suspicious code3 pattern hits found and read; every one is listed under the raw findings.
Install-time code16 installer scripts
Committed binariesNone.
CI workflows12 workflows. 1 uses pull_request_target, none check out the pull request head. 8 of 8 third-party actions pinned to a tag rather than a commit.
Network hosts20 distinct hosts referenced from source; most often github.com, winutil.christitus.com, schneegans.de, christitus.com. No URLs to bare IP addresses.
Known vulnerabilities50 advisories across 483 pinned packages: 5 critical, 27 high, 17 moderate, 1 low. docs/package-lock.json: 480 packages, 9 advisories; tools/title-screen/uv.lock: 7 packages, 41 advisories.
Project hygieneHas security policy, automated dependency updates, licence file, contributing guide. Missing CodeQL.
OpenSSF ScorecardNot scored: the project is not in Scorecard's weekly index.

The raw findings

Every hit the scanner wrote out, with a link to the exact line at the scanned commit. Secrets candidates are redacted.

Pattern hits (3)
WhereRuleMatch
pester/sanity.Tests.ps1:57powershell-encoded$output = & $windowsPowerShell.Source -NoProfile -NonInteractive -ExecutionPolicy Bypass -EncodedCommand $encodedCommand 2>&1
scripts/start.ps1:201powershell-encoded$elevated = Start-Process $powershellCmd -ArgumentList @("-ExecutionPolicy", "Bypass", "-NoProfile", "-EncodedCommand", $elevationCommand) -Verb RunAs -Wait -Pa…
scripts/start.ps1:217powershell-encodedStart-Process $processCmd -ArgumentList "$powershellCmd -ExecutionPolicy Bypass -NoProfile -EncodedCommand $elevationCommand" -Verb RunAs
Installer scripts (16)
Worst known vulnerabilities (24 of 50)
AdvisorySeverityPackageSummary
GHSA-332p-7hrc-92wfcriticalpillow@12.3.0Pillow: Heap buffer overflow in _tiffWriteProc when saving TIFF to BytesIO
GHSA-5x8w-8jj5-q52hcriticalpillow@12.3.0Pillow: Heap buffer overflow in FlashPix (FPX) JPEG decoding leads to code execution
GHSA-8g5g-8vmr-9782criticalpillow@12.3.0Pillow: Heap buffer overflow in ImagingJpegDecode
GHSA-v9pv-5gc8-w2m6criticalpillow@12.3.0Pillow multi-frame loaders can reuse stale native image storage after mode transitions
GHSA-w889-685w-c8fhcriticalpillow@12.3.0Pillow: Argument Injection in Ghostscript call, potentially leading into RCE
GHSA-ch52-4w7c-c8xphighhttp-cache-semantics@4.2.0http-cache-semantics max-stale handling can disclose cross-user cached responses
GHSA-wq5f-xc86-pv6whighsharp@0.35.4sharp : Vulnerability in librsvg dependency CVE-2026-96889
GHSA-xjj6-f33q-929chighundici@8.10.2undici vulnerable to Denial of Service via unhandled error on excessive content-encodings
GHSA-mrhx-c7xc-m3w5highzod@4.6.1Zod can exhaust memory while validating oversized constrained collections
GHSA-22hg-r758-rrw9highpillow@12.3.0Pillow: Infinite loop in MIC n_frames when the embedded TIFF
GHSA-27h8-gf7j-v5hchighpillow@12.3.0Pillow: NULL dereference in ImagingExpand via rank filters on zero-size images
GHSA-3j72-p6qg-6xp7highpillow@12.3.0Pillow: TarIO negative size field causes infinite CPU-spin loop
GHSA-58r4-6rv3-gfh8highpillow@12.3.0Pillow: Out-of-bounds access in _imagingmorph on a zero-width image
GHSA-5xm2-6676-qcp9highpillow@12.3.0Pillow: APNG background disposal allocates full canvas before decompression bomb check
GHSA-65qm-jvmh-6pqghighpillow@12.3.0Pillow: GIF seek keeps rejected size after DecompressionBombError, allowing DoS
GHSA-78g4-xqwv-q3g8highpillow@12.3.0Pillow: Bundled libopenjp2 2.5.4 in all wheels since 11.1.0 carries OSV-2025-219 heap-buffer-overflow write reachable fr…
GHSA-7mwm-ghpf-9vrmhighpillow@12.3.0Pillow: Double free in ImagingScaleAffine on calloc failure via Image.transform
GHSA-9v9v-9qvf-h2hjhighpillow@12.3.0Pillow: Heap over-read in WMF/EMF rendering via 16-bit dimension truncation (Windows builds)
GHSA-c6hw-5grf-ff96highpillow@12.3.0Pillow: OOB read in TiffDecode.c tile and RGBA paths leaks heap memory into pixels
GHSA-cp9v-662q-vvx9highpillow@12.3.0Pillow: NULL pointer dereference in Image.merge via an unvalidated band 0
GHSA-f2g6-542v-9j58highpillow@12.3.0Pillow: Infinite loop in PdfParser.rewrite_pages on page tree Parent cycle
GHSA-g4qv-2jxx-769hhighpillow@12.3.0Pillow: PNG eXIf chunk makes EXIF parsing run in quadratic time
GHSA-g7cr-3p24-7wf7highpillow@12.3.0Pillow: Heap buffer overflow writing JPEG comment after ICC profile fills buffer
GHSA-g842-9rc4-69pwhighpillow@12.3.0Pillow: Decompression bomb check bypass in SpiderImagePlugin.seek() leads to unbounded allocation DoS
Workflows worth a look

By the numbers

Stars65K
Forks3,808
Contributors186
Commits1,749
Open issues22
Open pull requests15
Releases47
Latest release26.10.07
LicenceMIT
Main languagePowerShell
Project age4 years
Last pushOct 26, 2026
Tracked files389
Lines of code42.5K
Checkout size5 MB

Lines by language: PowerShell 26.8K, Markdown 7,582, JSON 5,137, Python 1,166, YAML 1,145, CSS 491.

Questions

Is WinUtil free?

Yes. The PowerShell script is MIT-licensed and free. A faster .NET version is sold on the author's store and offered to recurring sponsors; you do not need it to use WinUtil.

Is WinUtil safe to run?

The scan found nothing hidden: what it runs is in the repository, readable PowerShell. The risk is in the changes you choose. Start with the Standard preset, which makes a restore point, read a tweak's definition before applying anything from Advanced, and only use the official one-liner or the GitHub release, since copies elsewhere could be altered.

Can I undo WinUtil's changes?

The restore point that Standard and Advanced create is the dependable way back. Some tweaks, such as removing Edge or OneDrive, mean reinstalling that software to reverse them.

Why does WinUtil need Administrator rights?

Its tweaks change system-wide settings, services and installed software, which Windows only allows from an elevated session. If you start it without admin rights, it relaunches itself through a UAC prompt.


This post is part of GitHub Tools, where every repository is cloned and scanned before it is written up. The scan is a snapshot of one commit on one day; the repository has moved on since, so check it before you install.