Compare commits

..

24 Commits

Author SHA1 Message Date
Chris Titus
9769cafa7d change willshow ui (#4150) 2026-03-04 09:25:54 -06:00
Chris Titus
42dfc8c82b fix write failure on letter assignment from failed usb format 2026-03-04 09:21:39 -06:00
Gabi
d13295bdd8 Update start.ps1 (#4141) 2026-03-03 14:25:14 -06:00
Sean (ANGRYxScotsman)
5fc566b46f Winutil website edit (#4140)
* updated the iso creator docs

* added creator info to the arch docs
2026-03-03 09:17:19 -06:00
Chris Titus
b493737982 Win11 Creator USB and Log Fixes (#4139)
* initial usb fixes

* fix full button width

* Cleanup and Verbose output for copy

* expand ui and fix clean and reset

* Add minimal driver injection

* initial driver support

* fix verbage

* fix syntax error

* create log file on iso generation

* inject to boot.wim for install

* fix single driver install issues

* fix first run probs

* cleanup injection

* improve clean up

* Fix OSCDIMG output and cleanup comments

* Fix Scrollviewer in Status Log

* large drive support and change to Exfat

* Fix BOOT for older UEFI and Add error checks for small usb drives

* fix single usb drive error
2026-03-03 00:19:37 -06:00
Chris Titus
7ceb303f00 chore: Update generated dev docs (#4138) 2026-03-02 13:08:27 -06:00
Paweł Gwozdowski
30c9812d37 Fix typos and inconsistent punctuation in tweaks & apps descriptions (#4136)
* Update tweaks.json

* Update applications.json

* Update feature.json

* Update tweaks.json

* Update tweaks.json

* more typos

* Update applications.json
2026-03-02 13:07:54 -06:00
KamaleiZestri
ddc10b0935 Unite preferences (#4133)
* One preference file

* Set default before converting types
2026-03-02 13:05:43 -06:00
Chris Titus
a2e2395ce9 chore: Update generated dev docs (#4137) 2026-03-02 13:05:08 -06:00
Gabi
ce5e407a76 Add WPFToggleStandbyFix (#4132)
* Add WPFToggleStandbyFix

* Update config/tweaks.json

Co-authored-by: Paweł Gwozdowski <kernea.g@proton.me>

---------

Co-authored-by: Paweł Gwozdowski <kernea.g@proton.me>
2026-03-02 13:04:34 -06:00
Eren
3fb5c04693 Fix import/export functionality (#4131)
* fix: cast selections to string to prevent PSCustomObject type issues

* fix(presets): clear existing selections before importing to replace state instead of merging

* refactor(impex): warn user when exporting empty selections or importing empty config
2026-03-02 13:02:48 -06:00
Sean (ANGRYxScotsman)
58dacd5b0b New win 11 Creator page (#4115)
* made Win 11 Creator page

* update store to application
2026-02-25 13:50:36 -06:00
Chris Titus
14ad9f7fea Win11 iso (#4113)
* Tab creation

* scaffold outline for the iso tab

* autounattended creation

* inital modification success

* iso save success

* cleanup and iso improvements

* fix startmenu on new 26h2

* remove old first startup

* Fix run for use

* fix unapproved verb

* Keep step 4 output expanded

* update auto-merge

* Cleanup

* remove out-null and trailing whitespace

* explain modify and creator button

* fix scroll to end

* remove workflow change

* fix home updates
2026-02-24 15:50:41 -06:00
Gabi
52afab2252 Remove edge (#4112) 2026-02-24 15:40:41 -06:00
Chris Titus
2ba3a5d324 Win11 ISO Creator (#4110)
* Tab creation

* scaffold outline for the iso tab

* autounattended creation

* inital modification success

* iso save success

* cleanup and iso improvements

* fix startmenu on new 26h2

* remove old first startup

* Fix run for use

* fix unapproved verb

* Keep step 4 output expanded

* update auto-merge

* Cleanup

* remove out-null and trailing whitespace

* explain modify and creator button

* fix scroll to end

* remove workflow change
2026-02-24 15:28:49 -06:00
Chris Titus
f854d14117 chore: Update generated dev docs (#4105) 2026-02-23 18:28:56 -06:00
Chris Titus
19204534a2 Add --admin flag to auto-merge command 2026-02-23 18:28:25 -06:00
Chris Titus
a9d9b148db Change GH_TOKEN to use AUTO_MERGE secret 2026-02-23 18:26:20 -06:00
Chris Titus Tech
d5d0bf25f0 automerge docs 2026-02-23 14:53:46 -06:00
Chris Titus Tech
da3fd87f9a revise approval 2026-02-23 14:46:15 -06:00
Chris Titus Tech
9e8cefc973 fix automerge 2026-02-23 14:43:52 -06:00
Gabi
a532e9ec9d Remove WPFTweaksDisableExplorerAutoDiscovery From Minimal Preset (#4081)
* WPFTweaksDisableExplorerAutoDiscovery Shouldn't not be deafult

* Update preset.json

* Update tweaks.json

* Update config/tweaks.json

Co-authored-by: Paweł Gwozdowski <kernea.g@proton.me>

---------

Co-authored-by: Paweł Gwozdowski <kernea.g@proton.me>
2026-02-23 10:17:01 -06:00
dependabot[bot]
844979fee7 Bump peter-evans/create-pull-request from 6 to 8 (#4104)
Bumps [peter-evans/create-pull-request](https://github.com/peter-evans/create-pull-request) from 6 to 8.
- [Release notes](https://github.com/peter-evans/create-pull-request/releases)
- [Commits](https://github.com/peter-evans/create-pull-request/compare/v6...v8)

---
updated-dependencies:
- dependency-name: peter-evans/create-pull-request
  dependency-version: '8'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-02-23 09:23:33 -06:00
Sean (ANGRYxScotsman)
78302934ef updated workflows for automation (#4102)
* updated workflows for automation

* added back the debug logs

* Update docs.yaml

* Update pre-release.yaml
2026-02-22 21:25:59 -06:00
100 changed files with 1686 additions and 1231 deletions

View File

@@ -8,7 +8,7 @@ on:
jobs:
auto-merge:
if: github.event.pull_request.head.ref == 'docs-update' && github.event.pull_request.user.login == 'github-actions[bot]'
if: github.event.pull_request.head.ref == 'docs-update' && (github.event.pull_request.user.login == 'ChrisTitusTech' || github.event.pull_request.user.login == 'github-actions[bot]')
runs-on: ubuntu-latest
permissions:
pull-requests: write
@@ -18,13 +18,14 @@ jobs:
uses: actions/checkout@v6
- name: Auto-approve PR
if: github.event.pull_request.user.login == 'github-actions[bot]'
run: gh pr review "$PR_NUMBER" --approve
env:
PR_NUMBER: ${{ github.event.pull_request.number }}
GH_TOKEN: ${{ secrets.AUTO_MERGE }}
- name: Enable auto-merge
run: gh pr merge "$PR_NUMBER" --squash --auto --delete-branch
run: gh pr merge "$PR_NUMBER" --squash --delete-branch --admin
env:
PR_NUMBER: ${{ github.event.pull_request.number }}
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GH_TOKEN: ${{ secrets.AUTO_MERGE }}

View File

@@ -12,7 +12,7 @@ on:
workflow_dispatch:
permissions:
contents: write
contents: read
pages: write
id-token: write
pull-requests: write
@@ -47,22 +47,27 @@ jobs:
- name: Setup Pages
id: pages
uses: actions/configure-pages@v5
- name: Generate Dev Docs from JSON
shell: pwsh
run: |
Set-Location tools
./devdocs-generator.ps1
- name: Create Pull Request 🚀
- name: Create Pull Request
id: cpr
uses: peter-evans/create-pull-request@v6
uses: peter-evans/create-pull-request@v8
with:
token: ${{ secrets.GITHUB_TOKEN }}
commit-message: 'Update generated documentation'
token: ${{ secrets.AUTO_MERGE }}
commit-message: 'chore: Update generated dev docs'
title: 'chore: Update Generated Dev Docs'
body: 'Automated update of generated documentation from JSON sources'
branch: docs-update
delete-branch: true
add-paths: |
docs/content/dev/
config/tweaks.json
config/feature.json
labels: |
automated
documentation

View File

@@ -3,6 +3,7 @@ name: Pre-Release WinUtil
permissions:
contents: write
actions: read
pull-requests: write
on:
workflow_dispatch: # Manual trigger added
@@ -22,25 +23,35 @@ jobs:
Set-Location tools
./devdocs-generator.ps1
- name: Commit Updated JSON Links
shell: pwsh
run: |
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
git add config/tweaks.json config/feature.json
$changes = git diff --cached --quiet; if ($LASTEXITCODE -ne 0) {
git commit -m "Update documentation links in JSON configs"
git push
} else {
Write-Host "No JSON link changes to commit"
}
- name: Compile project
shell: pwsh
run: |
Set-ExecutionPolicy Bypass -Scope Process -Force; ./Compile.ps1
continue-on-error: false # Directly fail the job on error, removing the need for a separate check
- name: Create Pull Request for Updated JSON Links
id: cpr
uses: peter-evans/create-pull-request@v8
with:
token: ${{ secrets.AUTO_MERGE }}
commit-message: 'chore: Update documentation links in JSON configs'
title: 'chore: Update Generated Dev Docs'
body: 'Automated update of documentation links in JSON configs from pre-release build'
branch: docs-update
delete-branch: true
add-paths: |
config/tweaks.json
config/feature.json
labels: |
automated
documentation
- name: Check outputs
shell: bash
run: |
echo "Pull Request Number - ${{ steps.cpr.outputs.pull-request-number }}"
echo "Pull Request URL - ${{ steps.cpr.outputs.pull-request-url }}"
- name: Set Version to Todays Date
id: extract_version
run: |

View File

@@ -24,7 +24,7 @@ jobs:
- name: Create Pull Request 🚀
id: cpr
uses: peter-evans/create-pull-request@v6
uses: peter-evans/create-pull-request@v8
with:
token: ${{ secrets.GITHUB_TOKEN }}
commit-message: 'Update sponsors in README'

View File

@@ -36,7 +36,7 @@
"category": "Document",
"choco": "na",
"content": "AFFiNE",
"description": "AFFiNE is an open source alternative to Notion. Write, draw, plan all at once. Selfhost it to sync across devices.",
"description": "AFFiNE is an open-source alternative to Notion. Write, draw, plan all at once. Selfhost it to sync across devices.",
"link": "https://affine.pro/",
"winget": "ToEverything.AFFiNE",
"foss": true
@@ -105,7 +105,7 @@
"category": "Microsoft Tools",
"choco": "autoruns",
"content": "Autoruns",
"description": "This utility shows you what programs are configured to run during system bootup or login",
"description": "This utility shows you what programs are configured to run during system bootup or login.",
"link": "https://learn.microsoft.com/en-us/sysinternals/downloads/autoruns",
"winget": "Microsoft.Sysinternals.Autoruns"
},
@@ -156,7 +156,7 @@
"category": "Communications",
"choco": "na",
"content": "Beeper",
"description": "All your chats in one app",
"description": "All your chats in one app.",
"link": "https://www.beeper.com/",
"winget": "Beeper.Beeper"
},
@@ -173,7 +173,7 @@
"category": "Utilities",
"choco": "bleachbit",
"content": "BleachBit",
"description": "Clean Your System and Free Disk Space",
"description": "Clean Your System and Free Disk Space.",
"link": "https://www.bleachbit.org/",
"winget": "BleachBit.BleachBit",
"foss": true
@@ -593,7 +593,7 @@
"category": "Utilities",
"choco": "espanso",
"content": "Espanso",
"description": "Cross-platform and open-source Text Expander written in Rust",
"description": "Cross-platform and open-source Text Expander written in Rust.",
"link": "https://espanso.org/",
"winget": "Espanso.Espanso",
"foss": true
@@ -620,7 +620,7 @@
"category": "Utilities",
"choco": "na",
"content": "Fastfetch",
"description": "Fastfetch is a neofetch-like tool for fetching system information and displaying them in a pretty way",
"description": "Fastfetch is a neofetch-like tool for fetching system information and displaying them in a pretty way.",
"link": "https://github.com/fastfetch-cli/fastfetch/",
"winget": "Fastfetch-cli.Fastfetch",
"foss": true
@@ -646,7 +646,7 @@
"category": "Utilities",
"choco": "file-converter",
"content": "File-Converter",
"description": "File Converter is a very simple tool which allows you to convert and compress one or several file(s) using the context menu in windows explorer.",
"description": "File Converter is a very simple tool which allows you to convert and compress one or several file(s) using the context menu in Windows Explorer.",
"link": "https://file-converter.io/",
"winget": "AdrienAllard.FileConverter",
"foss": true
@@ -699,7 +699,7 @@
"category": "Multimedia Tools",
"choco": "lightshot",
"content": "Lightshot (Screenshots)",
"description": "Ligthshot is an Easy-to-use, light-weight screenshot software tool, where you can optionally edit your screenshots using different tools, share them via Internet and/or save to disk, and customize the available options.",
"description": "Ligthshot is an easy-to-use, light-weight screenshot software tool, where you can optionally edit your screenshots using different tools, share them via Internet and/or save to disk, and customize the available options.",
"link": "https://app.prntscr.com/",
"winget": "Skillbrains.Lightshot"
},
@@ -775,7 +775,7 @@
"category": "Utilities",
"choco": "fzf",
"content": "Fzf",
"description": "A command-line fuzzy finder",
"description": "A command-line fuzzy finder.",
"link": "https://github.com/junegunn/fzf/",
"winget": "junegunn.fzf",
"foss": true
@@ -895,7 +895,7 @@
"category": "Utilities",
"choco": "googledrive",
"content": "Google Drive",
"description": "File syncing across devices all tied to your google account",
"description": "File syncing across devices all tied to your Google account.",
"link": "https://www.google.com/drive/",
"winget": "Google.GoogleDrive"
},
@@ -955,7 +955,7 @@
"category": "Development",
"choco": "helix",
"content": "Helix",
"description": "Helix is a neovim alternative built in rust.",
"description": "Helix is a neovim alternative built in Rust.",
"link": "https://helix-editor.com/",
"winget": "Helix.Helix",
"foss": true
@@ -1147,7 +1147,7 @@
"category": "Utilities",
"choco": "jpegview",
"content": "JPEG View",
"description": "JPEGView is a lean, fast and highly configurable viewer/editor for JPEG, BMP, PNG, WEBP, TGA, GIF, JXL, HEIC, HEIF, AVIF and TIFF images with a minimal GUI",
"description": "JPEGView is a lean, fast and highly configurable viewer/editor for JPEG, BMP, PNG, WEBP, TGA, GIF, JXL, HEIC, HEIF, AVIF and TIFF images with a minimal GUI.",
"link": "https://github.com/sylikc/jpegview",
"winget": "sylikc.JPEGView",
"foss": true
@@ -1209,7 +1209,7 @@
"category": "Development",
"choco": "lazygit",
"content": "Lazygit",
"description": "Simple terminal UI for git commands",
"description": "Simple terminal UI for git commands.",
"link": "https://github.com/jesseduffield/lazygit/",
"winget": "JesseDuffield.lazygit",
"foss": true
@@ -1262,7 +1262,7 @@
"category": "Utilities",
"choco": "localsend.install",
"content": "LocalSend",
"description": "An open source cross-platform alternative to AirDrop.",
"description": "An open-source cross-platform alternative to AirDrop.",
"link": "https://localsend.org/",
"winget": "LocalSend.LocalSend",
"foss": true
@@ -1323,7 +1323,7 @@
"category": "Multimedia Tools",
"choco": "na",
"content": "Modern Flyouts",
"description": "An open source, modern, Fluent Design-based set of flyouts for Windows.",
"description": "An open-source, modern, Fluent Design-based set of flyouts for Windows.",
"link": "https://github.com/ModernFlyouts-Community/ModernFlyouts/",
"winget": "ModernFlyouts.ModernFlyouts",
"foss": true
@@ -1377,7 +1377,7 @@
"category": "Utilities",
"choco": "msedgeredirect",
"content": "MSEdgeRedirect",
"description": "A Tool to Redirect News, Search, Widgets, Weather, and More to Your Default Browser.",
"description": "A Tool to Redirect News, Search, Widgets, Weather, and More to your default browser.",
"link": "https://github.com/rcmaehl/MSEdgeRedirect",
"winget": "rcmaehl.MSEdgeRedirect",
"foss": true
@@ -1473,7 +1473,7 @@
"category": "Multimedia Tools",
"choco": "tagscanner",
"content": "TagScanner (Tag Scanner)",
"description": "TagScanner is a powerful tool for organizing and managing your music collection",
"description": "TagScanner is a powerful tool for organizing and managing your music collection.",
"link": "https://www.xdlab.ru/en/",
"winget": "SergeySerkov.TagScanner"
},
@@ -1490,7 +1490,7 @@
"category": "Pro Tools",
"choco": "netbird",
"content": "NetBird",
"description": "NetBird is a Open Source alternative comparable to TailScale that can be connected to a selfhosted Server.",
"description": "NetBird is a open-source alternative comparable to TailScale that can be connected to a selfhosted Server.",
"link": "https://netbird.io/",
"winget": "netbird",
"foss": true
@@ -1895,7 +1895,7 @@
"category": "Games",
"choco": "prismlauncher",
"content": "Prism Launcher",
"description": "Prism Launcher is an Open Source Minecraft launcher with the ability to manage multiple instances, accounts and mods.",
"description": "Prism Launcher is an open-source Minecraft launcher with the ability to manage multiple instances, accounts and mods.",
"link": "https://prismlauncher.org/",
"winget": "PrismLauncher.PrismLauncher",
"foss": true
@@ -1929,7 +1929,7 @@
"category": "Utilities",
"choco": "orcaslicer",
"content": "OrcaSlicer",
"description": "G-code generator for 3D printers (Bambu, Prusa, Voron, VzBot, RatRig, Creality, etc.)",
"description": "G-code generator for 3D printers (Bambu, Prusa, Voron, VzBot, RatRig, Creality, etc.).",
"link": "https://github.com/SoftFever/OrcaSlicer",
"winget": "SoftFever.OrcaSlicer",
"foss": true
@@ -1982,7 +1982,7 @@
"category": "Utilities",
"choco": "transmission",
"content": "Transmission",
"description": "Transmission is a cross-platform BitTorrent client that is open source, easy, powerful, and lean.",
"description": "Transmission is a cross-platform BitTorrent client that is open-source, easy, powerful, and lean.",
"link": "https://transmissionbt.com/",
"winget": "Transmission.Transmission",
"foss": true
@@ -2008,7 +2008,7 @@
"category": "Utilities",
"choco": "quicklook",
"content": "Quicklook",
"description": "Bring macOS \u201cQuick Look\u201d feature to Windows",
"description": "Bring macOS \u201cQuick Look\u201d feature to Windows.",
"link": "https://github.com/QL-Win/QuickLook",
"winget": "QL-Win.QuickLook",
"foss": true
@@ -2051,7 +2051,7 @@
"category": "Utilities",
"choco": "ripgrep",
"content": "Ripgrep",
"description": "Fast and powerful commandline search tool",
"description": "Fast and powerful commandline search tool.",
"link": "https://github.com/BurntSushi/ripgrep/",
"winget": "BurntSushi.ripgrep.MSVC",
"foss": true
@@ -2209,7 +2209,7 @@
"category": "Utilities",
"choco": "spacesniffer",
"content": "SpaceSniffer",
"description": "A tool application that lets you understand how folders and files are structured on your disks",
"description": "A tool application that lets you understand how folders and files are structured on your disks.",
"link": "http://www.uderzo.it/main_products/space_sniffer/",
"winget": "UderzoSoftware.SpaceSniffer"
},
@@ -2277,7 +2277,7 @@
"category": "Document",
"choco": "na",
"content": "PDFgear",
"description": "PDFgear is a piece of full-featured PDF management software for Windows, Mac, and mobile, and it's completely free to use.",
"description": "PDFgear is a piece of full-featured PDF management software for Windows, macOS, and mobile, and it's completely free to use.",
"link": "https://www.pdfgear.com/",
"winget": "PDFgear.PDFgear"
},
@@ -2312,7 +2312,7 @@
"category": "Utilities",
"choco": "synctrayzor",
"content": "SyncTrayzor",
"description": "Windows tray utility / filesystem watcher / launcher for Syncthing",
"description": "Windows tray utility / filesystem watcher / launcher for Syncthing.",
"link": "https://github.com/GermanCoding/SyncTrayzor",
"winget": "GermanCoding.SyncTrayzor",
"foss": true
@@ -2329,7 +2329,7 @@
"category": "Utilities",
"choco": "tabby",
"content": "Tabby.sh",
"description": "Tabby is a highly configurable terminal emulator, SSH and serial client for Windows, macOS and Linux",
"description": "Tabby is a highly configurable terminal emulator, SSH and serial client for Windows, macOS and Linux.",
"link": "https://tabby.sh/",
"winget": "Eugeny.Tabby",
"foss": true
@@ -2389,7 +2389,7 @@
"category": "Communications",
"choco": "na",
"content": "Unigram",
"description": "Unigram - Telegram for Windows",
"description": "Unigram - Telegram for Windows.",
"link": "https://unigramdev.github.io/",
"winget": "Telegram.Unigram",
"foss": true
@@ -2416,7 +2416,7 @@
"category": "Development",
"choco": "na",
"content": "Code With Mu (Mu Editor)",
"description": "Mu is a Python code editor for beginner programmers",
"description": "Mu is a Python code editor for beginner programmers.",
"link": "https://codewith.mu/",
"winget": "Mu.Mu",
"foss": true
@@ -2425,7 +2425,7 @@
"category": "Browsers",
"choco": "thorium",
"content": "Thorium Browser AVX2",
"description": "Browser built for speed over vanilla chromium. It is built with AVX2 optimizations and is the fastest browser on the market.",
"description": "Browser built for speed over vanilla Chromium. It is built with AVX2 optimizations and is the fastest browser on the market.",
"link": "https://thorium.rocks/",
"winget": "Alex313031.Thorium.AVX2",
"foss": true
@@ -2485,7 +2485,7 @@
"category": "Utilities",
"choco": "translucenttb",
"content": "TranslucentTB",
"description": "TranslucentTB is a tool that allows you to customize the transparency of the Windows taskbar.",
"description": "TranslucentTB is a tool that allows you to customize the transparency of the Windows Taskbar.",
"link": "https://github.com/TranslucentTB/TranslucentTB",
"winget": "9PF4KZ2VN4W9",
"foss": true
@@ -2673,7 +2673,7 @@
"category": "Development",
"choco": "wezterm",
"content": "Wezterm",
"description": "WezTerm is a powerful cross-platform terminal emulator and multiplexer",
"description": "WezTerm is a powerful cross-platform terminal emulator and multiplexer.",
"link": "https://wezfurlong.org/wezterm/index.html",
"winget": "wez.wezterm",
"foss": true
@@ -2768,7 +2768,7 @@
"category": "Utilities",
"choco": "TeraCopy",
"content": "TeraCopy",
"description": "Copy your files faster and more securely",
"description": "Copy your files faster and more securely.",
"link": "https://codesector.com/teracopy",
"winget": "CodeSector.TeraCopy"
},
@@ -2792,7 +2792,7 @@
"category": "Utilities",
"choco": "xdm",
"content": "Xtreme Download Manager",
"description": "Xtreme Download Manager is an advanced download manager with support for various protocols and browsers.*Browser integration deprecated by google store. No official release.*",
"description": "Xtreme Download Manager is an advanced download manager with support for various protocols and browsers. *Browser integration deprecated by google store. No official release.*",
"link": "https://xtremedownloadmanager.com/",
"winget": "subhra74.XtremeDownloadManager",
"foss": true
@@ -2896,7 +2896,7 @@
"category": "Utilities",
"choco": "na",
"content": "ZoomIt",
"description": "A screen zoom, annotation, and recording tool for technical presentations and demos",
"description": "A screen zoom, annotation, and recording tool for technical presentations and demos.",
"link": "https://learn.microsoft.com/en-us/sysinternals/downloads/zoomit",
"winget": "Microsoft.Sysinternals.ZoomIt"
},
@@ -2931,7 +2931,7 @@
"category": "Utilities",
"choco": "syncthingtray",
"content": "Syncthingtray",
"description": "Might be the alternative for Synctrayzor. Windows tray utility / filesystem watcher / launcher for Syncthing",
"description": "Might be the alternative for Synctrayzor. Windows tray utility / filesystem watcher / launcher for Syncthing.",
"link": "https://github.com/Martchus/syncthingtray",
"winget": "Martchus.syncthingtray",
"foss": true
@@ -2958,7 +2958,7 @@
"category": "Development",
"choco": "temurin",
"content": "Eclipse Temurin",
"description": "Eclipse Temurin is the open source Java SE build based upon OpenJDK.",
"description": "Eclipse Temurin is the open-source Java SE build based upon OpenJDK.",
"link": "https://adoptium.net/temurin/",
"winget": "EclipseAdoptium.Temurin.21.JDK",
"foss": true
@@ -2985,7 +2985,7 @@
"category": "Utilities",
"choco": "TightVNC",
"content": "TightVNC",
"description": "TightVNC is a free and Open Source remote desktop software that lets you access and control a computer over the network. With its intuitive interface, you can interact with the remote screen as if you were sitting in front of it. You can open files, launch applications, and perform other actions on the remote desktop almost as if you were physically there",
"description": "TightVNC is a free and open-source remote desktop software that lets you access and control a computer over the network. With its intuitive interface, you can interact with the remote screen as if you were sitting in front of it. You can open files, launch applications, and perform other actions on the remote desktop almost as if you were physically there.",
"link": "https://www.tightvnc.com/",
"winget": "GlavSoft.TightVNC",
"foss": true
@@ -3019,7 +3019,7 @@
"category": "Utilities",
"choco": "auto-dark-mode",
"content": "Windows Auto Dark Mode",
"description": "Automatically switches between the dark and light theme of Windows 10 and Windows 11",
"description": "Automatically switches between the dark and light theme of Windows 10 and Windows 11.",
"link": "https://github.com/AutoDarkMode/Windows-Auto-Night-Mode",
"winget": "Armin2208.WindowsAutoNightMode",
"foss": true
@@ -3037,7 +3037,7 @@
"category": "Utilities",
"choco": "magic-wormhole",
"content": "Magic Wormhole",
"description": "get things from one computer to another, safely",
"description": "get things from one computer to another, safely.",
"link": "https://github.com/magic-wormhole/magic-wormhole",
"winget": "magic-wormhole.magic-wormhole",
"foss": true
@@ -3055,7 +3055,7 @@
"category": "Multimedia Tools",
"choco": "qgis",
"content": "QGIS",
"description": "QGIS (Quantum GIS) is an open-source Geographic Information System (GIS) software that enables users to create, edit, visualize, analyze, and publish geospatial information on Windows, Mac, and Linux platforms.",
"description": "QGIS (Quantum GIS) is an open-source Geographic Information System (GIS) software that enables users to create, edit, visualize, analyze, and publish geospatial information on Windows, macOS, and Linux platforms.",
"link": "https://qgis.org/en/site/",
"winget": "OSGeo.QGIS",
"foss": true
@@ -3073,7 +3073,7 @@
"category": "Utilities",
"choco": "na",
"content": "GlazeWM",
"description": "GlazeWM is a tiling window manager for Windows inspired by i3 and Polybar",
"description": "GlazeWM is a tiling window manager for Windows inspired by i3 and Polybar.",
"link": "https://github.com/glzr-io/glazewm",
"winget": "glzr-io.glazewm",
"foss": true
@@ -3091,7 +3091,7 @@
"category": "Development",
"choco": "fnm",
"content": "Fast Node Manager",
"description": "Fast Node Manager (fnm) allows you to switch your Node version by using the Terminal",
"description": "Fast Node Manager (fnm) allows you to switch your Node version by using the terminal.",
"link": "https://github.com/Schniz/fnm",
"winget": "Schniz.fnm",
"foss": true
@@ -3100,7 +3100,7 @@
"category": "Utilities",
"choco": "windhawk",
"content": "Windhawk",
"description": "The customization marketplace for Windows programs",
"description": "The customization marketplace for Windows programs.",
"link": "https://windhawk.net",
"winget": "RamenSoftware.Windhawk"
},
@@ -3108,7 +3108,7 @@
"category": "Utilities",
"choco": "na",
"content": "ForceAutoHDR",
"description": "ForceAutoHDR simplifies the process of adding games to the AutoHDR list in the Windows Registry",
"description": "ForceAutoHDR simplifies the process of adding games to the AutoHDR list in the Windows Registry.",
"link": "https://github.com/7gxycn08/ForceAutoHDR",
"winget": "ForceAutoHDR.7gxycn08",
"foss": true
@@ -3117,7 +3117,7 @@
"category": "Utilities",
"choco": "joytokey",
"content": "JoyToKey",
"description": "enables PC game controllers to emulate the keyboard and mouse input",
"description": "Enables PC game controllers to emulate the keyboard and mouse input.",
"link": "https://joytokey.net/en/",
"winget": "JTKsoftware.JoyToKey"
},
@@ -3159,7 +3159,7 @@
"category": "Browsers",
"choco": "paleMoon",
"content": "PaleMoon",
"description": "Pale Moon is an Open Source, Goanna-based web browser available for Microsoft Windows and Linux (with other operating systems in development), focusing on efficiency and ease of use.",
"description": "Pale Moon is an open-source, Goanna-based web browser available for Microsoft Windows and Linux (with other operating systems in development), focusing on efficiency and ease of use.",
"link": "https://www.palemoon.org/download.shtml",
"winget": "MoonchildProductions.PaleMoon",
"foss": true
@@ -3168,7 +3168,7 @@
"category": "Multimedia Tools",
"choco": "na",
"content": "Shotcut",
"description": "Shotcut is a free, open source, cross-platform video editor.",
"description": "Shotcut is a free, open-source, cross-platform video editor.",
"link": "https://shotcut.org/",
"winget": "Meltytech.Shotcut",
"foss": true
@@ -3195,7 +3195,7 @@
"category": "Development",
"choco": "aegisub",
"content": "Aegisub",
"description": "Aegisub is a free, cross-platform open source tool for creating and modifying subtitles. Aegisub makes it quick and easy to time subtitles to audio, and features many powerful tools for styling them, including a built-in real-time video preview.",
"description": "Aegisub is a free, cross-platform open-source tool for creating and modifying subtitles. Aegisub makes it quick and easy to time subtitles to audio, and features many powerful tools for styling them, including a built-in real-time video preview.",
"link": "https://github.com/Aegisub/Aegisub",
"winget": "Aegisub.Aegisub",
"foss": true
@@ -3204,7 +3204,7 @@
"category": "Multimedia Tools",
"choco": "na",
"content": "Subtitle Edit",
"description": "Subtitle Edit is a free and open source editor for video subtitles.",
"description": "Subtitle Edit is a free and open-source editor for video subtitles.",
"link": "https://github.com/SubtitleEdit/subtitleedit",
"winget": "Nikse.SubtitleEdit",
"foss": true
@@ -3221,7 +3221,7 @@
"category": "Browsers",
"choco": "na",
"content": "Zen Browser",
"description": "The modern, privacy-focused, performance-driven browser built on Firefox",
"description": "The modern, privacy-focused, performance-driven browser built on Firefox.",
"link": "https://zen-browser.app/",
"winget": "Zen-Team.Zen-Browser",
"foss": true

View File

@@ -26,7 +26,7 @@
},
"WPFFeatureslegacymedia": {
"Content": "Legacy Media (WMP, DirectPlay)",
"Description": "Enables legacy programs from previous versions of windows",
"Description": "Enables legacy programs from previous versions of Windows.",
"category": "Features",
"panel": "1",
"feature": [

View File

@@ -16,7 +16,6 @@
],
"Minimal": [
"WPFTweaksConsumerFeatures",
"WPFTweaksDisableExplorerAutoDiscovery",
"WPFTweaksWPBT",
"WPFTweaksServices",
"WPFTweaksTelemetry"

View File

@@ -1,7 +1,7 @@
{
"WPFTweaksActivity": {
"Content": "Disable Activity History",
"Description": "This erases recent docs, clipboard, and run history.",
"Description": "Erases recent docs, clipboard, and run history.",
"category": "Essential Tweaks",
"panel": "1",
"registry": [
@@ -31,7 +31,7 @@
},
"WPFTweaksHiber": {
"Content": "Disable Hibernation",
"Description": "Hibernation is really meant for laptops as it saves what's in memory before turning the pc off. It really should never be used",
"Description": "Hibernation is really meant for laptops as it saves what's in memory before turning the PC off. It really should never be used.",
"category": "Essential Tweaks",
"panel": "1",
"registry": [
@@ -60,7 +60,7 @@
},
"WPFTweaksWidget": {
"Content": "Remove Widgets",
"Description": "Removes the annoying widgets in the bottom left of the taskbar",
"Description": "Removes the annoying widgets in the bottom left of the Taskbar.",
"category": "Essential Tweaks",
"panel": "1",
"InvokeScript": [
@@ -89,7 +89,7 @@
},
"WPFTweaksRevertStartMenu": {
"Content": "Revert the new start menu",
"Description": "Uses vivetool to revert the the original start menu from 24h2",
"Description": "Uses vivetool to revert to the original start menu from 24H2.",
"category": "z__Advanced Tweaks - CAUTION",
"panel": "1",
"InvokeScript": [
@@ -124,7 +124,7 @@
},
"WPFTweaksLocation": {
"Content": "Disable Location Tracking",
"Description": "Disables Location Tracking...DUH!",
"Description": "Disables Location Tracking.",
"category": "Essential Tweaks",
"panel": "1",
"registry": [
@@ -1125,7 +1125,7 @@
},
"WPFTweaksBraveDebloat": {
"Content": "Brave Debloat",
"Description": "Disables various annoyances like Brave Rewards,Leo AI,Crypto Wallet and VPN",
"Description": "Disables various annoyances like Brave Rewards, Leo AI, Crypto Wallet and VPN.",
"category": "z__Advanced Tweaks - CAUTION",
"panel": "1",
"registry": [
@@ -1290,7 +1290,7 @@
},
"WPFTweaksConsumerFeatures": {
"Content": "Disable ConsumerFeatures",
"Description": "Windows will not automatically install any games, third-party apps, or application links from the Windows Store for the signed-in user. Some default Apps will be inaccessible (eg. Phone Link)",
"Description": "Windows will not automatically install any games, third-party apps, or application links from the Windows Store for the signed-in user. Some default Apps will be inaccessible (eg. Phone Link).",
"category": "Essential Tweaks",
"panel": "1",
"registry": [
@@ -1306,7 +1306,7 @@
},
"WPFTweaksTelemetry": {
"Content": "Disable Telemetry",
"Description": "Disables Microsoft Telemetry...Duh",
"Description": "Disables Microsoft Telemetry.",
"category": "Essential Tweaks",
"panel": "1",
"registry": [
@@ -1428,7 +1428,7 @@
},
"WPFTweaksRemoveEdge": {
"Content": "Remove Microsoft Edge",
"Description": "Unblocks Microsoft Edge uninstaller restrictions than uses that uninstaller to remove Microsoft Edge",
"Description": "Unblocks Microsoft Edge uninstaller restrictions then uses that uninstaller to remove Microsoft Edge.",
"category": "z__Advanced Tweaks - CAUTION",
"panel": "1",
"InvokeScript": [
@@ -1460,7 +1460,7 @@
},
"WPFTweaksRemoveOneDrive": {
"Content": "Remove OneDrive",
"Description": "Denys permission to remove onedrive user files than uses its own uninstaller to remove it than brings back permissions",
"Description": "Denies permission to remove OneDrive user files, then uses its own uninstaller to remove it and restores the original permission afterward.",
"category": "z__Advanced Tweaks - CAUTION",
"panel": "1",
"InvokeScript": [
@@ -1497,7 +1497,7 @@
},
"WPFTweaksRemoveHome": {
"Content": "Remove Home from Explorer",
"Description": "Removes the Home from Explorer and sets This PC as default",
"Description": "Removes the Home from Explorer and sets This PC as default.",
"category": "z__Advanced Tweaks - CAUTION",
"panel": "1",
"InvokeScript": [
@@ -1516,7 +1516,7 @@
},
"WPFTweaksRemoveGallery": {
"Content": "Remove Gallery from explorer",
"Description": "Removes the Gallery from Explorer and sets This PC as default",
"Description": "Removes the Gallery from Explorer and sets This PC as default.",
"category": "z__Advanced Tweaks - CAUTION",
"panel": "1",
"InvokeScript": [
@@ -1646,7 +1646,7 @@
},
"WPFTweaksDeBloat": {
"Content": "Remove ALL MS Store Apps - NOT RECOMMENDED",
"Description": "USE WITH CAUTION!!! This will remove ALL Microsoft store apps.",
"Description": "USE WITH CAUTION!!! This will remove ALL Microsoft Store apps.",
"category": "z__Advanced Tweaks - CAUTION",
"panel": "1",
"appx": [
@@ -1735,7 +1735,7 @@
},
"WPFTweaksRestorePoint": {
"Content": "Create Restore Point",
"Description": "Creates a restore point at runtime in case a revert is needed from WinUtil modifications",
"Description": "Creates a restore point at runtime in case a revert is needed from WinUtil modifications.",
"category": "Essential Tweaks",
"panel": "1",
"Checked": "False",
@@ -1762,7 +1762,7 @@
},
"WPFTweaksEndTaskOnTaskbar": {
"Content": "Enable End Task With Right Click",
"Description": "Enables option to end task when right clicking a program in the taskbar",
"Description": "Enables option to end task when right clicking a program in the taskbar.",
"category": "Essential Tweaks",
"panel": "1",
"registry": [
@@ -1778,7 +1778,7 @@
},
"WPFTweaksPowershell7Tele": {
"Content": "Disable Powershell 7 Telemetry",
"Description": "This will create an Environment Variable called 'POWERSHELL_TELEMETRY_OPTOUT' with a value of '1' which will tell Powershell 7 to not send Telemetry Data.",
"Description": "Creates an Environment Variable called 'POWERSHELL_TELEMETRY_OPTOUT' with a value of '1' which will tell PowerShell 7 to not send Telemetry Data.",
"category": "Essential Tweaks",
"panel": "1",
"InvokeScript": [
@@ -1891,7 +1891,7 @@
},
"WPFTweaksWPBT": {
"Content": "Disable Windows Platform Binary Table (WPBT)",
"Description": "If enabled then allows your computer vendor to execute a program each time it boots. It enables computer vendors to force install anti-theft software, software drivers, or a software program conveniently. This could also be a security risk.",
"Description": "If enabled, WPBT allows your computer vendor to execute programs at boot time, such as anti-theft software, software drivers, as well as force install software without user consent. Poses potential security risk.",
"category": "Essential Tweaks",
"panel": "1",
"registry": [
@@ -1949,7 +1949,7 @@
},
"WPFTweaksDisableNotifications": {
"Content": "Disable Notification Tray/Calendar",
"Description": "Disables all Notifications INCLUDING Calendar",
"Description": "Disables all Notifications INCLUDING Calendar.",
"category": "z__Advanced Tweaks - CAUTION",
"panel": "1",
"registry": [
@@ -1972,7 +1972,7 @@
},
"WPFTweaksBlockAdobeNet": {
"Content": "Adobe Network Block",
"Description": "Reduce user interruptions by selectively blocking connections to Adobe's activation and telemetry servers. Credit: Ruddernation-Designs",
"Description": "Reduces user interruptions by selectively blocking connections to Adobe's activation and telemetry servers. Credit: Ruddernation-Designs",
"category": "z__Advanced Tweaks - CAUTION",
"panel": "1",
"InvokeScript": [
@@ -2001,8 +2001,8 @@
"link": "https://winutil.christitus.com/dev/tweaks/z--advanced-tweaks---caution/blockadobenet"
},
"WPFTweaksRightClickMenu": {
"Content": "Set Classic Right-Click Menu ",
"Description": "Great Windows 11 tweak to bring back good context menus when right clicking things in explorer.",
"Content": "Set Classic Right-Click Menu",
"Description": "Restores the classic context menu when right-clicking in File Explorer, replacing the simplified Windows 11 version.",
"category": "z__Advanced Tweaks - CAUTION",
"panel": "1",
"InvokeScript": [
@@ -2037,7 +2037,7 @@
},
"WPFTweaksDeleteTempFiles": {
"Content": "Delete Temporary Files",
"Description": "Erases TEMP Folders",
"Description": "Erases TEMP Folders.",
"category": "Essential Tweaks",
"panel": "1",
"InvokeScript": [
@@ -2050,7 +2050,7 @@
},
"WPFTweaksIPv46": {
"Content": "Prefer IPv4 over IPv6",
"Description": "To set the IPv4 preference can have latency and security benefits on private networks where IPv6 is not configured.",
"Description": "Setting the IPv4 preference can have latency and security benefits on private networks where IPv6 is not configured.",
"category": "z__Advanced Tweaks - CAUTION",
"panel": "1",
"registry": [
@@ -2066,7 +2066,7 @@
},
"WPFTweaksTeredo": {
"Content": "Disable Teredo",
"Description": "Teredo network tunneling is a ipv6 feature that can cause additional latency, but may cause problems with some games",
"Description": "Teredo network tunneling is a IPv6 feature that can cause additional latency, but may cause problems with some games.",
"category": "z__Advanced Tweaks - CAUTION",
"panel": "1",
"registry": [
@@ -2110,7 +2110,7 @@
},
"WPFTweaksDisableBGapps": {
"Content": "Disable Background Apps",
"Description": "Disables all Microsoft Store apps from running in the background, which has to be done individually since Win11",
"Description": "Disables all Microsoft Store apps from running in the background, which has to be done individually since Windows 11.",
"category": "z__Advanced Tweaks - CAUTION",
"panel": "1",
"registry": [
@@ -2126,7 +2126,7 @@
},
"WPFTweaksDisableFSO": {
"Content": "Disable Fullscreen Optimizations",
"Description": "Disables FSO in all applications. NOTE: This will disable Color Management in Exclusive Fullscreen",
"Description": "Disables FSO in all applications. NOTE: This will disable Color Management in Exclusive Fullscreen.",
"category": "z__Advanced Tweaks - CAUTION",
"panel": "1",
"registry": [
@@ -2184,7 +2184,7 @@
},
"WPFToggleBingSearch": {
"Content": "Bing Search in Start Menu",
"Description": "If enable then includes web search results from Bing in your Start Menu search.",
"Description": "If enabled, Bing web search results will be included in your Start Menu search.",
"category": "Customize Preferences",
"panel": "2",
"Type": "Toggle",
@@ -2200,8 +2200,26 @@
],
"link": "https://winutil.christitus.com/dev/tweaks/customize-preferences/bingsearch"
},
"WPFToggleStandbyFix": {
"Content": "Modern Standby fix",
"Description": "Disable network connection during S0 sleep. If network connectivity is turned on during S0 sleep it could cause overheating on modern laptops",
"category": "Customize Preferences",
"panel": "2",
"Type": "Toggle",
"registry": [
{
"Path": "HKCU:\\SOFTWARE\\Policies\\Microsoft\\Power\\PowerSettings\\f15576e8-98b7-4186-b944-eafa664402d9",
"Name": "ACSettingIndex",
"Value": "0",
"Type": "DWord",
"OriginalValue": "<RemoveEntry>",
"DefaultState": "true"
}
],
"link": "https://winutil.christitus.com/dev/tweaks/customize-preferences/standbyfix"
},
"WPFToggleNumLock": {
"Content": "NumLock on Startup",
"Content": "Num Lock on Startup",
"Description": "Toggle the Num Lock key state when your computer starts.",
"category": "Customize Preferences",
"panel": "2",
@@ -2246,7 +2264,7 @@
},
"WPFToggleStartMenuRecommendations": {
"Content": "Recommendations in Start Menu",
"Description": "If disabled then you will not see recommendations in the Start Menu. WARNING: This will also disable Windows Spotlight on your Lock Screen as a side effect.",
"Description": "If disabled, then you will not see recommendations in the Start Menu. WARNING: This will also disable Windows Spotlight on your Lock Screen as a side effect.",
"category": "Customize Preferences",
"panel": "2",
"Type": "Toggle",
@@ -2290,7 +2308,7 @@
},
"WPFToggleHideSettingsHome": {
"Content": "Remove Settings Home Page",
"Description": "Removes the Home page in the Windows Settings app.",
"Description": "Removes the Home Page in the Windows Settings app.",
"category": "Customize Preferences",
"panel": "2",
"Type": "Toggle",
@@ -2308,7 +2326,7 @@
},
"WPFToggleMouseAcceleration": {
"Content": "Mouse Acceleration",
"Description": "If Enabled then Cursor movement is affected by the speed of your physical mouse movements.",
"Description": "If enabled, the Cursor movement is affected by the speed of your physical mouse movements.",
"category": "Customize Preferences",
"panel": "2",
"Type": "Toggle",
@@ -2342,7 +2360,7 @@
},
"WPFToggleStickyKeys": {
"Content": "Sticky Keys",
"Description": "If Enabled then Sticky Keys is activated - Sticky keys is an accessibility feature of some graphical user interfaces which assists users who have physical disabilities or help users reduce repetitive strain injury.",
"Description": "If enabled, Sticky Keys is activated. Sticky keys is an accessibility feature of some graphical user interfaces which assists users who have physical disabilities or help users reduce repetitive strain injury.",
"category": "Customize Preferences",
"panel": "2",
"Type": "Toggle",
@@ -2360,7 +2378,7 @@
},
"WPFToggleNewOutlook": {
"Content": "New Outlook",
"Description": "If disabled it removes the toggle for new Outlook, disables the new Outlook migration and makes sure the Outlook Application actually uses the old Outlook.",
"Description": "If disabled, it removes the new Outlook toggle, disables the new Outlook migration, and ensures the classic Outlook application is used.",
"category": "Customize Preferences",
"panel": "2",
"Type": "Toggle",
@@ -2420,7 +2438,7 @@
},
"WPFToggleHiddenFiles": {
"Content": "Show Hidden Files",
"Description": "If Enabled then Hidden Files will be shown.",
"Description": "If enabled, Hidden Files will be shown.",
"category": "Customize Preferences",
"panel": "2",
"Type": "Toggle",
@@ -2448,7 +2466,7 @@
},
"WPFToggleShowExt": {
"Content": "Show File Extensions",
"Description": "If enabled then File extensions (e.g., .txt, .jpg) are visible.",
"Description": "If enabled, File extensions (e.g., .txt, .jpg) are visible.",
"category": "Customize Preferences",
"panel": "2",
"Type": "Toggle",
@@ -2476,7 +2494,7 @@
},
"WPFToggleTaskbarSearch": {
"Content": "Search Button in Taskbar",
"Description": "If Enabled Search Button will be on the taskbar.",
"Description": "If enabled, Search Button will be on the Taskbar.",
"category": "Customize Preferences",
"panel": "2",
"Type": "Toggle",
@@ -2494,7 +2512,7 @@
},
"WPFToggleTaskView": {
"Content": "Task View Button in Taskbar",
"Description": "If Enabled then Task View Button in Taskbar will be shown.",
"Description": "If enabled, Task View Button in Taskbar will be shown.",
"category": "Customize Preferences",
"panel": "2",
"Type": "Toggle",
@@ -2512,7 +2530,7 @@
},
"WPFToggleTaskbarAlignment": {
"Content": "Center Taskbar Items",
"Description": "[Windows 11] If Enabled then the Taskbar Items will be shown on the Center, otherwise the Taskbar Items will be shown on the Left.",
"Description": "[Windows 11] If enabled, the Taskbar Items will be shown on the Center, otherwise the Taskbar Items will be shown on the Left.",
"category": "Customize Preferences",
"panel": "2",
"Type": "Toggle",
@@ -2540,7 +2558,7 @@
},
"WPFToggleDetailedBSoD": {
"Content": "Detailed BSoD",
"Description": "If Enabled then you will see a detailed Blue Screen of Death (BSOD) with more information.",
"Description": "If enabled, you will see a detailed Blue Screen of Death (BSOD) with more information.",
"category": "Customize Preferences",
"panel": "2",
"Type": "Toggle",
@@ -2566,7 +2584,7 @@
},
"WPFToggleS3Sleep": {
"Content": "S3 Sleep",
"Description": "Toggles between Modern Standby and S3 sleep.",
"Description": "Toggles between Modern Standby and S3 Sleep.",
"category": "Customize Preferences",
"panel": "2",
"Type": "Toggle",
@@ -2615,7 +2633,7 @@
},
"WPFTweaksDisableExplorerAutoDiscovery": {
"Content": "Disable Explorer Automatic Folder Discovery",
"Description": "Windows Explorer automatically tries to guess the type of the folder based on its contents, slowing down the browsing experience.",
"Description": "Windows Explorer automatically tries to guess the type of the folder based on its contents, slowing down the browsing experience. WARNING! Will disable File Explorer grouping.",
"category": "Essential Tweaks",
"panel": "1",
"InvokeScript": [

View File

@@ -128,6 +128,154 @@ winutil/
- CheckBoxes for options
- ListBoxes for selections
## Win11 Creator Architecture
The **Win11 Creator** is a specialized subsystem within Winutil that creates customized Windows 11 ISOs. It operates independently from the main package installation and tweak system.
### Win11 Creator Components
**Core Functions** (`functions/private/`):
- `Invoke-WinUtilISO.ps1`: Main orchestrator containing all Win11 Creator functions
- `Invoke-WinUtilISOBrowse`: ISO file selection dialog
- `Invoke-WinUtilISOMountAndVerify`: Validates and mounts ISO, verifies it's official Windows 11
- `Invoke-WinUtilISOModify`: Launches modification in background runspace
- `Invoke-WinUtilISOExport`: Handles ISO and USB export
- `Invoke-WinUtilISOCheckExistingWork`: Recovers incomplete work sessions
- `Invoke-WinUtilISOCleanAndReset`: Cleans up temp directories and resets UI
- `Invoke-WinUtilISOScript.ps1`: Applies modifications to mounted install.wim
- Removes provisioned AppX packages (40+ bloatware apps)
- Injects drivers (optional) from current system
- Removes OneDrive setup files
- Applies offline registry tweaks (hardware bypass, privacy, telemetry, OOBE)
- Deletes telemetry scheduled task definitions
- Pre-stages setup scripts from autounattend.xml
- Removes unused Windows editions
- Cleans component store via DISM
### Win11 Creator Data Flow
```
User selects official Windows 11 ISO
Invoke-WinUtilISOBrowse → OpenFileDialog, validates file size
Invoke-WinUtilISOMountAndVerify
├─ Mount ISO via Mount-DiskImage
├─ Verify install.wim or install.esd exists
├─ Check for "Windows 11" in image metadata
├─ Extract available editions (Home, Pro, Enterprise, etc.)
└─ Store ISO path, drive letter, WIM path, image info in $sync
User optionally enables Driver Injection checkbox
Invoke-WinUtilISOModify (runs in background runspace)
├─ Create work directory: ~WinUtil_Win11ISO_[timestamp]
├─ Copy ISO contents to disk (~5-6 GB)
├─ Mount install.wim at selected edition/index
├─ Invoke-WinUtilISOScript:
│ ├─ Remove 40+ bloat AppX packages
│ ├─ Export and inject drivers (if enabled)
│ ├─ Remove OneDrive setup
│ ├─ Load offline registry hives
│ ├─ Apply 50+ registry tweaks (hardware bypass, privacy, telemetry, OOBE, etc.)
│ ├─ Delete telemetry scheduled task files
│ ├─ Pre-stage setup scripts from autounattend.xml to C:\Windows\Setup\Scripts\
│ └─ Unload registry hives
├─ DISM /Cleanup-Image /StartComponentCleanup /ResetBase (saves 300-800 MB)
├─ Dismount and save modified install.wim (~10+ minutes, slowest step)
├─ Export selected edition only (removes all other editions, saves 1-2 GB each)
├─ Dismount source ISO
└─ Report completion, enable export options
Invoke-WinUtilISOExport (user chooses output)
├─ Option 1: Save as ISO
│ ├─ Build bootable ISO via oscdimg.exe (BIOS/UEFI dual-boot)
│ └─ Output: Win11_Modified_[date].iso (2.5-3.5 GB)
└─ Option 2: Write to USB
├─ Format USB as GPT
├─ Create 512 MB EFI partition
├─ Copy modified ISO contents
└─ Output: Bootable USB (minimum 8 GB)
Invoke-WinUtilISOCleanAndReset (optional)
└─ Delete temp working directory (~10-15 GB)
└─ Reset UI to initial state
```
### Win11 Creator Validation & Safety
**ISO Validation**:
- Only accepts official Microsoft Windows 11 ISOs
- Validates presence of install.wim or install.esd
- Checks image metadata for "Windows 11" string
- Rejects custom, modified, or non-Windows 11 ISOs
**Work Session Recovery**:
- Auto-detects incomplete work from previous sessions
- Allows resuming Step 4 (export) without re-running Steps 1-3
- Prevents redundant modifications
**Modification Safety**:
- All registry changes are documented in script (reversible)
- Original ISO never modified; only working copy
- Logged to `WinUtil_Win11ISO.log` for debugging
- DISM handles image dismount with automatic cleanup on error
### Win11 Creator Registry Tweaks
The `Invoke-WinUtilISOScript` function applies **50+ offline registry tweaks**:
**Hardware Bypass**:
- TPM 2.0 check bypass
- Secure Boot requirement bypass
- CPU compatibility bypass
- RAM requirement bypass
- Storage check bypass
**Privacy & Telemetry**:
- Disable advertising ID
- Disable tailored experiences
- Disable input personalization
- Disable speech online privacy
- Disable cloud content suggestions
- Disable app suggestion subscriptions
- Remove CEIP, Appraiser, WaaSMedic, etc.
**OOBE & Setup**:
- Enable local account setup
- Skip Microsoft account requirement
- Dark mode by default
- Empty taskbar and Start Menu
**Post-Setup Installations**:
- Prevent DevHome auto-installation
- Prevent new Outlook Mail app installation
- Prevent Teams auto-installation
**System Features**:
- Disable BitLocker and device encryption
- Disable Chat icon from taskbar
- Disable OneDrive folder backup
- Disable Copilot
- Disable Windows Update during OOBE (re-enabled at first login)
### Driver Injection Feature
**Optional Enhancement**: When enabled, exports all drivers from the running system and injects them into both:
- `install.wim` (main OS image)
- `boot.wim` index 2 (Windows Setup PE environment)
**Use Case**: Enables offline installation on systems with missing drivers.
### Disk Space Requirements
- **Temporary working directory**: ~10-15 GB
- **Original ISO**: 4-6 GB
- **Modified ISO**: 2.5-3.5 GB
- **Total needed**: ~25 GB for safe operation
## Data Flow
### Application Installation Flow
@@ -514,6 +662,7 @@ Outputs `winutil.ps1` in the root directory.
- [Contributing Guide](../../contributing/) - How to contribute code
- [User Guide](../../userguide/) - End-user documentation
- [Win11 Creator Guide](../../userguide/win11Creator/) - Building customized Windows 11 ISOs
- [FAQ](../../faq/) - Common questions
## Additional Resources

View File

@@ -3,13 +3,12 @@ title: "Disable Legacy F8 Boot Recovery"
description: ""
---
```json {filename="config/feature.json",linenos=inline,linenostart=107}
```json {filename="config/feature.json",linenos=inline,linenostart=100}
"WPFFeatureDisableLegacyRecovery": {
"Content": "Disable Legacy F8 Boot Recovery",
"Description": "Disables Advanced Boot Options screen that lets you start Windows in advanced troubleshooting modes.",
"category": "Features",
"panel": "1",
"Order": "a019_",
"feature": [],
"InvokeScript": [
"bcdedit /set bootmenupolicy standard"

View File

@@ -3,13 +3,12 @@ title: "Enable Legacy F8 Boot Recovery"
description: ""
---
```json {filename="config/feature.json",linenos=inline,linenostart=95}
```json {filename="config/feature.json",linenos=inline,linenostart=89}
"WPFFeatureEnableLegacyRecovery": {
"Content": "Enable Legacy F8 Boot Recovery",
"Description": "Enables Advanced Boot Options screen that lets you start Windows in advanced troubleshooting modes.",
"category": "Features",
"panel": "1",
"Order": "a018_",
"feature": [],
"InvokeScript": [
"bcdedit /set bootmenupolicy legacy"

View File

@@ -3,13 +3,12 @@ title: "Enable Daily Registry Backup Task 12.30am"
description: ""
---
```json {filename="config/feature.json",linenos=inline,linenostart=77}
```json {filename="config/feature.json",linenos=inline,linenostart=72}
"WPFFeatureRegBackup": {
"Content": "Enable Daily Registry Backup Task 12.30am",
"Description": "Enables daily registry backup, previously disabled by Microsoft in Windows 10 1803.",
"category": "Features",
"panel": "1",
"Order": "a017_",
"feature": [],
"InvokeScript": [
"

View File

@@ -3,13 +3,12 @@ title: "Windows Sandbox"
description: ""
---
```json {filename="config/feature.json",linenos=inline,linenostart=119}
```json {filename="config/feature.json",linenos=inline,linenostart=111}
"WPFFeaturesSandbox": {
"Content": "Windows Sandbox",
"Description": "Windows Sandbox is a lightweight virtual machine that provides a temporary desktop environment to safely run applications and programs in isolation.",
"category": "Features",
"panel": "1",
"Order": "a021_",
"feature": [
"Containers-DisposableClientVM"
],

View File

@@ -9,7 +9,6 @@ description: ""
"Description": ".NET and .NET Framework is a developer platform made up of tools, programming languages, and libraries for building many different types of applications.",
"category": "Features",
"panel": "1",
"Order": "a010_",
"feature": [
"NetFx4-AdvSrvs",
"NetFx3"

View File

@@ -3,13 +3,12 @@ title: "HyperV Virtualization"
description: ""
---
```json {filename="config/feature.json",linenos=inline,linenostart=15}
```json {filename="config/feature.json",linenos=inline,linenostart=14}
"WPFFeatureshyperv": {
"Content": "HyperV Virtualization",
"Description": "Hyper-V is a hardware virtualization product developed by Microsoft that allows users to create and manage virtual machines.",
"category": "Features",
"panel": "1",
"Order": "a011_",
"feature": [
"Microsoft-Hyper-V-All"
],

View File

@@ -3,13 +3,12 @@ title: "Legacy Media (WMP, DirectPlay)"
description: ""
---
```json {filename="config/feature.json",linenos=inline,linenostart=29}
```json {filename="config/feature.json",linenos=inline,linenostart=27}
"WPFFeatureslegacymedia": {
"Content": "Legacy Media (WMP, DirectPlay)",
"Description": "Enables legacy programs from previous versions of windows",
"Description": "Enables legacy programs from previous versions of Windows.",
"category": "Features",
"panel": "1",
"Order": "a012_",
"feature": [
"WindowsMediaPlayer",
"MediaPlayback",

View File

@@ -3,13 +3,12 @@ title: "NFS - Network File System"
description: ""
---
```json {filename="config/feature.json",linenos=inline,linenostart=57}
```json {filename="config/feature.json",linenos=inline,linenostart=53}
"WPFFeaturenfs": {
"Content": "NFS - Network File System",
"Description": "Network File System (NFS) is a mechanism for storing files on a network.",
"category": "Features",
"panel": "1",
"Order": "a014_",
"feature": [
"ServicesForNFS-ClientOnly",
"ClientForNFS-Infrastructure",

View File

@@ -3,13 +3,12 @@ title: "Windows Subsystem for Linux"
description: ""
---
```json {filename="config/feature.json",linenos=inline,linenostart=44}
```json {filename="config/feature.json",linenos=inline,linenostart=41}
"WPFFeaturewsl": {
"Content": "Windows Subsystem for Linux",
"Description": "Windows Subsystem for Linux is an optional feature of Windows that allows Linux programs to run natively on Windows without the need for a separate virtual machine or dual booting.",
"category": "Features",
"panel": "1",
"Order": "a020_",
"feature": [
"VirtualMachinePlatform",
"Microsoft-Windows-Subsystem-Linux"

View File

@@ -8,13 +8,15 @@ function Invoke-WPFSystemRepair {
<#
.SYNOPSIS
Checks for system corruption using SFC, and DISM
Checks for disk failure using Chkdsk
.DESCRIPTION
1. SFC - Fixes system file corruption, and fixes DISM if it was corrupted
2. DISM - Fixes system image corruption, and fixes SFC's system image if it was corrupted
3. Chkdsk - Checks for disk errors, which can cause system file corruption and notifies of early disk failure
1. Chkdsk - Checks for disk errors, which can cause system file corruption and notifies of early disk failure
2. SFC - scans protected system files for corruption and fixes them
3. DISM - Repair a corrupted Windows operating system image
#>
Start-Process cmd.exe -ArgumentList "/c chkdsk.exe /scan /perf" -NoNewWindow -Wait
Start-Process cmd.exe -ArgumentList "/c chkdsk /scan /perf" -NoNewWindow -Wait
Start-Process cmd.exe -ArgumentList "/c sfc /scannow" -NoNewWindow -Wait
Start-Process cmd.exe -ArgumentList "/c dism /online /cleanup-image /restorehealth" -NoNewWindow -Wait

View File

@@ -3,31 +3,14 @@ title: "Computer Management"
description: ""
---
```powershell {filename="functions/public/Invoke-WPFControlPanel.ps1",linenos=inline,linenostart=1}
function Invoke-WPFControlPanel {
<#
.SYNOPSIS
Opens the requested legacy panel
.PARAMETER Panel
The panel to open
#>
param($Panel)
switch ($Panel) {
"WPFPanelControl" {control}
"WPFPanelComputer" {compmgmt.msc}
"WPFPanelNetwork" {ncpa.cpl}
"WPFPanelPower" {powercfg.cpl}
"WPFPanelPrinter" {Start-Process "shell:::{A8A91A66-3A7D-4424-8D24-04E180695C7A}"}
"WPFPanelRegion" {intl.cpl}
"WPFPanelRestore" {rstrui.exe}
"WPFPanelSound" {mmsys.cpl}
"WPFPanelSystem" {sysdm.cpl}
"WPFPanelTimedate" {timedate.cpl}
"WPFPanelUser" {control userpasswords2}
}
}
```json {filename="config/feature.json",linenos=inline,linenostart=186}
"WPFPanelComputer": {
"Content": "Computer Management",
"category": "Legacy Windows Panels",
"panel": "2",
"Type": "Button",
"ButtonWidth": "300",
"InvokeScript": [
"compmgmt.msc"
],
```

View File

@@ -3,31 +3,14 @@ title: "Control Panel"
description: ""
---
```powershell {filename="functions/public/Invoke-WPFControlPanel.ps1",linenos=inline,linenostart=1}
function Invoke-WPFControlPanel {
<#
.SYNOPSIS
Opens the requested legacy panel
.PARAMETER Panel
The panel to open
#>
param($Panel)
switch ($Panel) {
"WPFPanelControl" {control}
"WPFPanelComputer" {compmgmt.msc}
"WPFPanelNetwork" {ncpa.cpl}
"WPFPanelPower" {powercfg.cpl}
"WPFPanelPrinter" {Start-Process "shell:::{A8A91A66-3A7D-4424-8D24-04E180695C7A}"}
"WPFPanelRegion" {intl.cpl}
"WPFPanelRestore" {rstrui.exe}
"WPFPanelSound" {mmsys.cpl}
"WPFPanelSystem" {sysdm.cpl}
"WPFPanelTimedate" {timedate.cpl}
"WPFPanelUser" {control userpasswords2}
}
}
```json {filename="config/feature.json",linenos=inline,linenostart=175}
"WPFPanelControl": {
"Content": "Control Panel",
"category": "Legacy Windows Panels",
"panel": "2",
"Type": "Button",
"ButtonWidth": "300",
"InvokeScript": [
"control"
],
```

View File

@@ -3,31 +3,14 @@ title: "Network Connections"
description: ""
---
```powershell {filename="functions/public/Invoke-WPFControlPanel.ps1",linenos=inline,linenostart=1}
function Invoke-WPFControlPanel {
<#
.SYNOPSIS
Opens the requested legacy panel
.PARAMETER Panel
The panel to open
#>
param($Panel)
switch ($Panel) {
"WPFPanelControl" {control}
"WPFPanelComputer" {compmgmt.msc}
"WPFPanelNetwork" {ncpa.cpl}
"WPFPanelPower" {powercfg.cpl}
"WPFPanelPrinter" {Start-Process "shell:::{A8A91A66-3A7D-4424-8D24-04E180695C7A}"}
"WPFPanelRegion" {intl.cpl}
"WPFPanelRestore" {rstrui.exe}
"WPFPanelSound" {mmsys.cpl}
"WPFPanelSystem" {sysdm.cpl}
"WPFPanelTimedate" {timedate.cpl}
"WPFPanelUser" {control userpasswords2}
}
}
```json {filename="config/feature.json",linenos=inline,linenostart=197}
"WPFPanelNetwork": {
"Content": "Network Connections",
"category": "Legacy Windows Panels",
"panel": "2",
"Type": "Button",
"ButtonWidth": "300",
"InvokeScript": [
"ncpa.cpl"
],
```

View File

@@ -3,31 +3,14 @@ title: "Power Panel"
description: ""
---
```powershell {filename="functions/public/Invoke-WPFControlPanel.ps1",linenos=inline,linenostart=1}
function Invoke-WPFControlPanel {
<#
.SYNOPSIS
Opens the requested legacy panel
.PARAMETER Panel
The panel to open
#>
param($Panel)
switch ($Panel) {
"WPFPanelControl" {control}
"WPFPanelComputer" {compmgmt.msc}
"WPFPanelNetwork" {ncpa.cpl}
"WPFPanelPower" {powercfg.cpl}
"WPFPanelPrinter" {Start-Process "shell:::{A8A91A66-3A7D-4424-8D24-04E180695C7A}"}
"WPFPanelRegion" {intl.cpl}
"WPFPanelRestore" {rstrui.exe}
"WPFPanelSound" {mmsys.cpl}
"WPFPanelSystem" {sysdm.cpl}
"WPFPanelTimedate" {timedate.cpl}
"WPFPanelUser" {control userpasswords2}
}
}
```json {filename="config/feature.json",linenos=inline,linenostart=208}
"WPFPanelPower": {
"Content": "Power Panel",
"category": "Legacy Windows Panels",
"panel": "2",
"Type": "Button",
"ButtonWidth": "300",
"InvokeScript": [
"powercfg.cpl"
],
```

View File

@@ -3,31 +3,14 @@ title: "Printer Panel"
description: ""
---
```powershell {filename="functions/public/Invoke-WPFControlPanel.ps1",linenos=inline,linenostart=1}
function Invoke-WPFControlPanel {
<#
.SYNOPSIS
Opens the requested legacy panel
.PARAMETER Panel
The panel to open
#>
param($Panel)
switch ($Panel) {
"WPFPanelControl" {control}
"WPFPanelComputer" {compmgmt.msc}
"WPFPanelNetwork" {ncpa.cpl}
"WPFPanelPower" {powercfg.cpl}
"WPFPanelPrinter" {Start-Process "shell:::{A8A91A66-3A7D-4424-8D24-04E180695C7A}"}
"WPFPanelRegion" {intl.cpl}
"WPFPanelRestore" {rstrui.exe}
"WPFPanelSound" {mmsys.cpl}
"WPFPanelSystem" {sysdm.cpl}
"WPFPanelTimedate" {timedate.cpl}
"WPFPanelUser" {control userpasswords2}
}
}
```json {filename="config/feature.json",linenos=inline,linenostart=219}
"WPFPanelPrinter": {
"Content": "Printer Panel",
"category": "Legacy Windows Panels",
"panel": "2",
"Type": "Button",
"ButtonWidth": "300",
"InvokeScript": [
"Start-Process 'shell:::{A8A91A66-3A7D-4424-8D24-04E180695C7A}'"
],
```

View File

@@ -3,31 +3,14 @@ title: "Region"
description: ""
---
```powershell {filename="functions/public/Invoke-WPFControlPanel.ps1",linenos=inline,linenostart=1}
function Invoke-WPFControlPanel {
<#
.SYNOPSIS
Opens the requested legacy panel
.PARAMETER Panel
The panel to open
#>
param($Panel)
switch ($Panel) {
"WPFPanelControl" {control}
"WPFPanelComputer" {compmgmt.msc}
"WPFPanelNetwork" {ncpa.cpl}
"WPFPanelPower" {powercfg.cpl}
"WPFPanelPrinter" {Start-Process "shell:::{A8A91A66-3A7D-4424-8D24-04E180695C7A}"}
"WPFPanelRegion" {intl.cpl}
"WPFPanelRestore" {rstrui.exe}
"WPFPanelSound" {mmsys.cpl}
"WPFPanelSystem" {sysdm.cpl}
"WPFPanelTimedate" {timedate.cpl}
"WPFPanelUser" {control userpasswords2}
}
}
```json {filename="config/feature.json",linenos=inline,linenostart=230}
"WPFPanelRegion": {
"Content": "Region",
"category": "Legacy Windows Panels",
"panel": "2",
"Type": "Button",
"ButtonWidth": "300",
"InvokeScript": [
"intl.cpl"
],
```

View File

@@ -3,31 +3,14 @@ title: "Windows Restore"
description: ""
---
```powershell {filename="functions/public/Invoke-WPFControlPanel.ps1",linenos=inline,linenostart=1}
function Invoke-WPFControlPanel {
<#
.SYNOPSIS
Opens the requested legacy panel
.PARAMETER Panel
The panel to open
#>
param($Panel)
switch ($Panel) {
"WPFPanelControl" {control}
"WPFPanelComputer" {compmgmt.msc}
"WPFPanelNetwork" {ncpa.cpl}
"WPFPanelPower" {powercfg.cpl}
"WPFPanelPrinter" {Start-Process "shell:::{A8A91A66-3A7D-4424-8D24-04E180695C7A}"}
"WPFPanelRegion" {intl.cpl}
"WPFPanelRestore" {rstrui.exe}
"WPFPanelSound" {mmsys.cpl}
"WPFPanelSystem" {sysdm.cpl}
"WPFPanelTimedate" {timedate.cpl}
"WPFPanelUser" {control userpasswords2}
}
}
```json {filename="config/feature.json",linenos=inline,linenostart=241}
"WPFPanelRestore": {
"Content": "Windows Restore",
"category": "Legacy Windows Panels",
"panel": "2",
"Type": "Button",
"ButtonWidth": "300",
"InvokeScript": [
"rstrui.exe"
],
```

View File

@@ -3,31 +3,14 @@ title: "Sound Settings"
description: ""
---
```powershell {filename="functions/public/Invoke-WPFControlPanel.ps1",linenos=inline,linenostart=1}
function Invoke-WPFControlPanel {
<#
.SYNOPSIS
Opens the requested legacy panel
.PARAMETER Panel
The panel to open
#>
param($Panel)
switch ($Panel) {
"WPFPanelControl" {control}
"WPFPanelComputer" {compmgmt.msc}
"WPFPanelNetwork" {ncpa.cpl}
"WPFPanelPower" {powercfg.cpl}
"WPFPanelPrinter" {Start-Process "shell:::{A8A91A66-3A7D-4424-8D24-04E180695C7A}"}
"WPFPanelRegion" {intl.cpl}
"WPFPanelRestore" {rstrui.exe}
"WPFPanelSound" {mmsys.cpl}
"WPFPanelSystem" {sysdm.cpl}
"WPFPanelTimedate" {timedate.cpl}
"WPFPanelUser" {control userpasswords2}
}
}
```json {filename="config/feature.json",linenos=inline,linenostart=252}
"WPFPanelSound": {
"Content": "Sound Settings",
"category": "Legacy Windows Panels",
"panel": "2",
"Type": "Button",
"ButtonWidth": "300",
"InvokeScript": [
"mmsys.cpl"
],
```

View File

@@ -3,31 +3,14 @@ title: "System Properties"
description: ""
---
```powershell {filename="functions/public/Invoke-WPFControlPanel.ps1",linenos=inline,linenostart=1}
function Invoke-WPFControlPanel {
<#
.SYNOPSIS
Opens the requested legacy panel
.PARAMETER Panel
The panel to open
#>
param($Panel)
switch ($Panel) {
"WPFPanelControl" {control}
"WPFPanelComputer" {compmgmt.msc}
"WPFPanelNetwork" {ncpa.cpl}
"WPFPanelPower" {powercfg.cpl}
"WPFPanelPrinter" {Start-Process "shell:::{A8A91A66-3A7D-4424-8D24-04E180695C7A}"}
"WPFPanelRegion" {intl.cpl}
"WPFPanelRestore" {rstrui.exe}
"WPFPanelSound" {mmsys.cpl}
"WPFPanelSystem" {sysdm.cpl}
"WPFPanelTimedate" {timedate.cpl}
"WPFPanelUser" {control userpasswords2}
}
}
```json {filename="config/feature.json",linenos=inline,linenostart=263}
"WPFPanelSystem": {
"Content": "System Properties",
"category": "Legacy Windows Panels",
"panel": "2",
"Type": "Button",
"ButtonWidth": "300",
"InvokeScript": [
"sysdm.cpl"
],
```

View File

@@ -3,31 +3,14 @@ title: "Time and Date"
description: ""
---
```powershell {filename="functions/public/Invoke-WPFControlPanel.ps1",linenos=inline,linenostart=1}
function Invoke-WPFControlPanel {
<#
.SYNOPSIS
Opens the requested legacy panel
.PARAMETER Panel
The panel to open
#>
param($Panel)
switch ($Panel) {
"WPFPanelControl" {control}
"WPFPanelComputer" {compmgmt.msc}
"WPFPanelNetwork" {ncpa.cpl}
"WPFPanelPower" {powercfg.cpl}
"WPFPanelPrinter" {Start-Process "shell:::{A8A91A66-3A7D-4424-8D24-04E180695C7A}"}
"WPFPanelRegion" {intl.cpl}
"WPFPanelRestore" {rstrui.exe}
"WPFPanelSound" {mmsys.cpl}
"WPFPanelSystem" {sysdm.cpl}
"WPFPanelTimedate" {timedate.cpl}
"WPFPanelUser" {control userpasswords2}
}
}
```json {filename="config/feature.json",linenos=inline,linenostart=274}
"WPFPanelTimedate": {
"Content": "Time and Date",
"category": "Legacy Windows Panels",
"panel": "2",
"Type": "Button",
"ButtonWidth": "300",
"InvokeScript": [
"timedate.cpl"
],
```

View File

@@ -0,0 +1,15 @@
---
title: "Install CTT PowerShell Profile"
description: ""
---
```powershell {filename="functions/private/Invoke-WinUtilInstallPSProfile.ps1",linenos=inline,linenostart=1}
function Invoke-WinUtilInstallPSProfile {
if (Test-Path $Profile) {
Rename-Item $Profile -NewName ($Profile + '.bak')
}
Start-Process pwsh -ArgumentList '-Command "irm https://github.com/ChrisTitusTech/powershell-profile/raw/main/setup.ps1 | iex"'
}
```

View File

@@ -0,0 +1,18 @@
---
title: "Uninstall CTT PowerShell Profile"
description: ""
---
```powershell {filename="functions/private/Invoke-WinUtilUninstallPSProfile.ps1",linenos=inline,linenostart=1}
function Invoke-WinUtilUninstallPSProfile {
if (Test-Path ($Profile + '.bak')) {
Remove-Item $Profile
Rename-Item ($Profile + '.bak') -NewName $Profile
}
else {
Remove-Item $Profile
}
Write-Host "Successfully uninstalled CTT Powershell Profile" -ForegroundColor Green
}
```

View File

@@ -0,0 +1,24 @@
---
title: "Enable OpenSSH Server"
description: ""
---
```powershell {filename="functions/public/Invoke-WPFSSHServer.ps1",linenos=inline,linenostart=1}
function Invoke-WPFSSHServer {
<#
.SYNOPSIS
Invokes the OpenSSH Server install in a runspace
#>
Invoke-WPFRunspace -ScriptBlock {
Invoke-WinUtilSSHServer
Write-Host "======================================="
Write-Host "-- OpenSSH Server installed! ---"
Write-Host "======================================="
}
}
```

View File

@@ -6,7 +6,7 @@ description: ""
```json {filename="config/tweaks.json",linenos=inline,linenostart=2185}
"WPFToggleBingSearch": {
"Content": "Bing Search in Start Menu",
"Description": "If enable then includes web search results from Bing in your Start Menu search.",
"Description": "If enabled, Bing web search results will be included in your Start Menu search.",
"category": "Customize Preferences",
"panel": "2",
"Type": "Toggle",

View File

@@ -3,10 +3,10 @@ title: "Detailed BSoD"
description: ""
---
```json {filename="config/tweaks.json",linenos=inline,linenostart=2541}
```json {filename="config/tweaks.json",linenos=inline,linenostart=2559}
"WPFToggleDetailedBSoD": {
"Content": "Detailed BSoD",
"Description": "If Enabled then you will see a detailed Blue Screen of Death (BSOD) with more information.",
"Description": "If enabled, you will see a detailed Blue Screen of Death (BSOD) with more information.",
"category": "Customize Preferences",
"panel": "2",
"Type": "Toggle",

View File

@@ -3,7 +3,7 @@ title: "Cross-Device Resume"
description: ""
---
```json {filename="config/tweaks.json",linenos=inline,linenostart=2671}
```json {filename="config/tweaks.json",linenos=inline,linenostart=2689}
"WPFToggleDisableCrossDeviceResume": {
"Content": "Cross-Device Resume",
"Description": "This tweak controls the Resume function in Windows 11 24H2 and later, which allows you to resume an activity from a mobile device and vice-versa.",

View File

@@ -3,10 +3,10 @@ title: "Show Hidden Files"
description: ""
---
```json {filename="config/tweaks.json",linenos=inline,linenostart=2421}
```json {filename="config/tweaks.json",linenos=inline,linenostart=2439}
"WPFToggleHiddenFiles": {
"Content": "Show Hidden Files",
"Description": "If Enabled then Hidden Files will be shown.",
"Description": "If enabled, Hidden Files will be shown.",
"category": "Customize Preferences",
"panel": "2",
"Type": "Toggle",

View File

@@ -3,10 +3,10 @@ title: "Remove Settings Home Page"
description: ""
---
```json {filename="config/tweaks.json",linenos=inline,linenostart=2291}
```json {filename="config/tweaks.json",linenos=inline,linenostart=2309}
"WPFToggleHideSettingsHome": {
"Content": "Remove Settings Home Page",
"Description": "Removes the Home page in the Windows Settings app.",
"Description": "Removes the Home Page in the Windows Settings app.",
"category": "Customize Preferences",
"panel": "2",
"Type": "Toggle",

View File

@@ -3,10 +3,10 @@ title: "Mouse Acceleration"
description: ""
---
```json {filename="config/tweaks.json",linenos=inline,linenostart=2309}
```json {filename="config/tweaks.json",linenos=inline,linenostart=2327}
"WPFToggleMouseAcceleration": {
"Content": "Mouse Acceleration",
"Description": "If Enabled then Cursor movement is affected by the speed of your physical mouse movements.",
"Description": "If enabled, the Cursor movement is affected by the speed of your physical mouse movements.",
"category": "Customize Preferences",
"panel": "2",
"Type": "Toggle",

View File

@@ -3,7 +3,7 @@ title: "Disable Multiplane Overlay"
description: ""
---
```json {filename="config/tweaks.json",linenos=inline,linenostart=2403}
```json {filename="config/tweaks.json",linenos=inline,linenostart=2421}
"WPFToggleMultiplaneOverlay": {
"Content": "Disable Multiplane Overlay",
"Description": "Disable the Multiplane Overlay which can sometimes cause issues with Graphics Cards.",

View File

@@ -3,10 +3,10 @@ title: "New Outlook"
description: ""
---
```json {filename="config/tweaks.json",linenos=inline,linenostart=2361}
```json {filename="config/tweaks.json",linenos=inline,linenostart=2379}
"WPFToggleNewOutlook": {
"Content": "New Outlook",
"Description": "If disabled it removes the toggle for new Outlook, disables the new Outlook migration and makes sure the Outlook Application actually uses the old Outlook.",
"Description": "If disabled, it removes the new Outlook toggle, disables the new Outlook migration, and ensures the classic Outlook application is used.",
"category": "Customize Preferences",
"panel": "2",
"Type": "Toggle",

View File

@@ -1,11 +1,11 @@
---
title: "NumLock on Startup"
title: "Num Lock on Startup"
description: ""
---
```json {filename="config/tweaks.json",linenos=inline,linenostart=2203}
```json {filename="config/tweaks.json",linenos=inline,linenostart=2221}
"WPFToggleNumLock": {
"Content": "NumLock on Startup",
"Content": "Num Lock on Startup",
"Description": "Toggle the Num Lock key state when your computer starts.",
"category": "Customize Preferences",
"panel": "2",

View File

@@ -3,10 +3,10 @@ title: "S3 Sleep"
description: ""
---
```json {filename="config/tweaks.json",linenos=inline,linenostart=2567}
```json {filename="config/tweaks.json",linenos=inline,linenostart=2585}
"WPFToggleS3Sleep": {
"Content": "S3 Sleep",
"Description": "Toggles between Modern Standby and S3 sleep.",
"Description": "Toggles between Modern Standby and S3 Sleep.",
"category": "Customize Preferences",
"panel": "2",
"Type": "Toggle",

View File

@@ -3,10 +3,10 @@ title: "Show File Extensions"
description: ""
---
```json {filename="config/tweaks.json",linenos=inline,linenostart=2449}
```json {filename="config/tweaks.json",linenos=inline,linenostart=2467}
"WPFToggleShowExt": {
"Content": "Show File Extensions",
"Description": "If enabled then File extensions (e.g., .txt, .jpg) are visible.",
"Description": "If enabled, File extensions (e.g., .txt, .jpg) are visible.",
"category": "Customize Preferences",
"panel": "2",
"Type": "Toggle",

View File

@@ -0,0 +1,29 @@
---
title: "Modern Standby fix"
description: ""
---
```json {filename="config/tweaks.json",linenos=inline,linenostart=2203}
"WPFToggleStandbyFix": {
"Content": "Modern Standby fix",
"Description": "Disable network connection during S0 sleep. If network connectivity is turned on during S0 sleep it could cause overheating on modern laptops",
"category": "Customize Preferences",
"panel": "2",
"Type": "Toggle",
"registry": [
{
"Path": "HKCU:\\SOFTWARE\\Policies\\Microsoft\\Power\\PowerSettings\\f15576e8-98b7-4186-b944-eafa664402d9",
"Name": "ACSettingIndex",
"Value": "0",
"Type": "DWord",
"OriginalValue": "<RemoveEntry>",
"DefaultState": "true"
}
],
```
## Registry Changes
Applications and System Components store and retrieve configuration data to modify windows settings, so we can use the registry to change many settings in one place.
You can find information about the registry on [Wikipedia](https://www.wikiwand.com/en/Windows_Registry) and [Microsoft's Website](https://learn.microsoft.com/en-us/windows/win32/sysinfo/registry).

View File

@@ -3,10 +3,10 @@ title: "Recommendations in Start Menu"
description: ""
---
```json {filename="config/tweaks.json",linenos=inline,linenostart=2247}
```json {filename="config/tweaks.json",linenos=inline,linenostart=2265}
"WPFToggleStartMenuRecommendations": {
"Content": "Recommendations in Start Menu",
"Description": "If disabled then you will not see recommendations in the Start Menu. WARNING: This will also disable Windows Spotlight on your Lock Screen as a side effect.",
"Description": "If disabled, then you will not see recommendations in the Start Menu. WARNING: This will also disable Windows Spotlight on your Lock Screen as a side effect.",
"category": "Customize Preferences",
"panel": "2",
"Type": "Toggle",

View File

@@ -3,10 +3,10 @@ title: "Sticky Keys"
description: ""
---
```json {filename="config/tweaks.json",linenos=inline,linenostart=2343}
```json {filename="config/tweaks.json",linenos=inline,linenostart=2361}
"WPFToggleStickyKeys": {
"Content": "Sticky Keys",
"Description": "If Enabled then Sticky Keys is activated - Sticky keys is an accessibility feature of some graphical user interfaces which assists users who have physical disabilities or help users reduce repetitive strain injury.",
"Description": "If enabled, Sticky Keys is activated. Sticky keys is an accessibility feature of some graphical user interfaces which assists users who have physical disabilities or help users reduce repetitive strain injury.",
"category": "Customize Preferences",
"panel": "2",
"Type": "Toggle",

View File

@@ -3,10 +3,10 @@ title: "Task View Button in Taskbar"
description: ""
---
```json {filename="config/tweaks.json",linenos=inline,linenostart=2495}
```json {filename="config/tweaks.json",linenos=inline,linenostart=2513}
"WPFToggleTaskView": {
"Content": "Task View Button in Taskbar",
"Description": "If Enabled then Task View Button in Taskbar will be shown.",
"Description": "If enabled, Task View Button in Taskbar will be shown.",
"category": "Customize Preferences",
"panel": "2",
"Type": "Toggle",

View File

@@ -3,10 +3,10 @@ title: "Center Taskbar Items"
description: ""
---
```json {filename="config/tweaks.json",linenos=inline,linenostart=2513}
```json {filename="config/tweaks.json",linenos=inline,linenostart=2531}
"WPFToggleTaskbarAlignment": {
"Content": "Center Taskbar Items",
"Description": "[Windows 11] If Enabled then the Taskbar Items will be shown on the Center, otherwise the Taskbar Items will be shown on the Left.",
"Description": "[Windows 11] If enabled, the Taskbar Items will be shown on the Center, otherwise the Taskbar Items will be shown on the Left.",
"category": "Customize Preferences",
"panel": "2",
"Type": "Toggle",

View File

@@ -3,10 +3,10 @@ title: "Search Button in Taskbar"
description: ""
---
```json {filename="config/tweaks.json",linenos=inline,linenostart=2477}
```json {filename="config/tweaks.json",linenos=inline,linenostart=2495}
"WPFToggleTaskbarSearch": {
"Content": "Search Button in Taskbar",
"Description": "If Enabled Search Button will be on the taskbar.",
"Description": "If enabled, Search Button will be on the Taskbar.",
"category": "Customize Preferences",
"panel": "2",
"Type": "Toggle",

View File

@@ -3,7 +3,7 @@ title: "Verbose Messages During Logon"
description: ""
---
```json {filename="config/tweaks.json",linenos=inline,linenostart=2229}
```json {filename="config/tweaks.json",linenos=inline,linenostart=2247}
"WPFToggleVerboseLogon": {
"Content": "Verbose Messages During Logon",
"Description": "Show detailed messages during the login process for troubleshooting and diagnostics.",

View File

@@ -6,7 +6,7 @@ description: ""
```json {filename="config/tweaks.json",linenos=inline,linenostart=2}
"WPFTweaksActivity": {
"Content": "Disable Activity History",
"Description": "This erases recent docs, clipboard, and run history.",
"Description": "Erases recent docs, clipboard, and run history.",
"category": "Essential Tweaks",
"panel": "1",
"registry": [

View File

@@ -6,7 +6,7 @@ description: ""
```json {filename="config/tweaks.json",linenos=inline,linenostart=1291}
"WPFTweaksConsumerFeatures": {
"Content": "Disable ConsumerFeatures",
"Description": "Windows will not automatically install any games, third-party apps, or application links from the Windows Store for the signed-in user. Some default Apps will be inaccessible (eg. Phone Link)",
"Description": "Windows will not automatically install any games, third-party apps, or application links from the Windows Store for the signed-in user. Some default Apps will be inaccessible (eg. Phone Link).",
"category": "Essential Tweaks",
"panel": "1",
"registry": [

View File

@@ -6,7 +6,7 @@ description: ""
```json {filename="config/tweaks.json",linenos=inline,linenostart=2038}
"WPFTweaksDeleteTempFiles": {
"Content": "Delete Temporary Files",
"Description": "Erases TEMP Folders",
"Description": "Erases TEMP Folders.",
"category": "Essential Tweaks",
"panel": "1",
"InvokeScript": [

View File

@@ -3,10 +3,10 @@ title: "Disable Explorer Automatic Folder Discovery"
description: ""
---
```json {filename="config/tweaks.json",linenos=inline,linenostart=2616}
```json {filename="config/tweaks.json",linenos=inline,linenostart=2634}
"WPFTweaksDisableExplorerAutoDiscovery": {
"Content": "Disable Explorer Automatic Folder Discovery",
"Description": "Windows Explorer automatically tries to guess the type of the folder based on its contents, slowing down the browsing experience.",
"Description": "Windows Explorer automatically tries to guess the type of the folder based on its contents, slowing down the browsing experience. WARNING! Will disable File Explorer grouping.",
"category": "Essential Tweaks",
"panel": "1",
"InvokeScript": [

View File

@@ -6,7 +6,7 @@ description: ""
```json {filename="config/tweaks.json",linenos=inline,linenostart=1763}
"WPFTweaksEndTaskOnTaskbar": {
"Content": "Enable End Task With Right Click",
"Description": "Enables option to end task when right clicking a program in the taskbar",
"Description": "Enables option to end task when right clicking a program in the taskbar.",
"category": "Essential Tweaks",
"panel": "1",
"registry": [

View File

@@ -6,7 +6,7 @@ description: ""
```json {filename="config/tweaks.json",linenos=inline,linenostart=32}
"WPFTweaksHiber": {
"Content": "Disable Hibernation",
"Description": "Hibernation is really meant for laptops as it saves what's in memory before turning the pc off. It really should never be used",
"Description": "Hibernation is really meant for laptops as it saves what's in memory before turning the PC off. It really should never be used.",
"category": "Essential Tweaks",
"panel": "1",
"registry": [

View File

@@ -6,7 +6,7 @@ description: ""
```json {filename="config/tweaks.json",linenos=inline,linenostart=125}
"WPFTweaksLocation": {
"Content": "Disable Location Tracking",
"Description": "Disables Location Tracking...DUH!",
"Description": "Disables Location Tracking.",
"category": "Essential Tweaks",
"panel": "1",
"registry": [

View File

@@ -6,7 +6,7 @@ description: ""
```json {filename="config/tweaks.json",linenos=inline,linenostart=1779}
"WPFTweaksPowershell7Tele": {
"Content": "Disable Powershell 7 Telemetry",
"Description": "This will create an Environment Variable called 'POWERSHELL_TELEMETRY_OPTOUT' with a value of '1' which will tell Powershell 7 to not send Telemetry Data.",
"Description": "Creates an Environment Variable called 'POWERSHELL_TELEMETRY_OPTOUT' with a value of '1' which will tell PowerShell 7 to not send Telemetry Data.",
"category": "Essential Tweaks",
"panel": "1",
"InvokeScript": [

View File

@@ -6,7 +6,7 @@ description: ""
```json {filename="config/tweaks.json",linenos=inline,linenostart=1736}
"WPFTweaksRestorePoint": {
"Content": "Create Restore Point",
"Description": "Creates a restore point at runtime in case a revert is needed from WinUtil modifications",
"Description": "Creates a restore point at runtime in case a revert is needed from WinUtil modifications.",
"category": "Essential Tweaks",
"panel": "1",
"Checked": "False",

View File

@@ -967,46 +967,3 @@ description: ""
}
],
```
#Function
```powershell {filename="functions/private/Set-WinUtilService.ps1",linenos=inline,linenostart=1}
Function Set-WinUtilService {
<#
.SYNOPSIS
Changes the startup type of the given service
.PARAMETER Name
The name of the service to modify
.PARAMETER StartupType
The startup type to set the service to
.EXAMPLE
Set-WinUtilService -Name "HomeGroupListener" -StartupType "Manual"
#>
param (
$Name,
$StartupType
)
try {
Write-Host "Setting Service $Name to $StartupType"
# Check if the service exists
$service = Get-Service -Name $Name -ErrorAction Stop
# Service exists, proceed with changing properties -- while handling auto delayed start for PWSH 5
if (($PSVersionTable.PSVersion.Major -lt 7) -and ($StartupType -eq "AutomaticDelayedStart")) {
sc.exe config $Name start=delayed-auto
} else {
$service | Set-Service -StartupType $StartupType -ErrorAction Stop
}
} catch [System.ServiceProcess.ServiceNotFoundException] {
Write-Warning "Service $Name was not found"
} catch {
Write-Warning "Unable to set $Name due to unhandled exception"
Write-Warning $_.Exception.Message
}
}
```

View File

@@ -6,7 +6,7 @@ description: ""
```json {filename="config/tweaks.json",linenos=inline,linenostart=1307}
"WPFTweaksTelemetry": {
"Content": "Disable Telemetry",
"Description": "Disables Microsoft Telemetry...Duh",
"Description": "Disables Microsoft Telemetry.",
"category": "Essential Tweaks",
"panel": "1",
"registry": [

View File

@@ -6,7 +6,7 @@ description: ""
```json {filename="config/tweaks.json",linenos=inline,linenostart=1892}
"WPFTweaksWPBT": {
"Content": "Disable Windows Platform Binary Table (WPBT)",
"Description": "If enabled then allows your computer vendor to execute a program each time it boots. It enables computer vendors to force install anti-theft software, software drivers, or a software program conveniently. This could also be a security risk.",
"Description": "If enabled, WPBT allows your computer vendor to execute programs at boot time, such as anti-theft software, software drivers, as well as force install software without user consent. Poses potential security risk.",
"category": "Essential Tweaks",
"panel": "1",
"registry": [

View File

@@ -6,7 +6,7 @@ description: ""
```json {filename="config/tweaks.json",linenos=inline,linenostart=61}
"WPFTweaksWidget": {
"Content": "Remove Widgets",
"Description": "Removes the annoying widgets in the bottom left of the taskbar",
"Description": "Removes the annoying widgets in the bottom left of the Taskbar.",
"category": "Essential Tweaks",
"panel": "1",
"InvokeScript": [

View File

@@ -6,7 +6,7 @@ description: ""
```json {filename="config/tweaks.json",linenos=inline,linenostart=1973}
"WPFTweaksBlockAdobeNet": {
"Content": "Adobe Network Block",
"Description": "Reduce user interruptions by selectively blocking connections to Adobe's activation and telemetry servers. Credit: Ruddernation-Designs",
"Description": "Reduces user interruptions by selectively blocking connections to Adobe's activation and telemetry servers. Credit: Ruddernation-Designs",
"category": "z__Advanced Tweaks - CAUTION",
"panel": "1",
"InvokeScript": [

View File

@@ -6,7 +6,7 @@ description: ""
```json {filename="config/tweaks.json",linenos=inline,linenostart=1126}
"WPFTweaksBraveDebloat": {
"Content": "Brave Debloat",
"Description": "Disables various annoyances like Brave Rewards,Leo AI,Crypto Wallet and VPN",
"Description": "Disables various annoyances like Brave Rewards, Leo AI, Crypto Wallet and VPN.",
"category": "z__Advanced Tweaks - CAUTION",
"panel": "1",
"registry": [

View File

@@ -6,7 +6,7 @@ description: ""
```json {filename="config/tweaks.json",linenos=inline,linenostart=1647}
"WPFTweaksDeBloat": {
"Content": "Remove ALL MS Store Apps - NOT RECOMMENDED",
"Description": "USE WITH CAUTION!!! This will remove ALL Microsoft store apps.",
"Description": "USE WITH CAUTION!!! This will remove ALL Microsoft Store apps.",
"category": "z__Advanced Tweaks - CAUTION",
"panel": "1",
"appx": [

View File

@@ -6,7 +6,7 @@ description: ""
```json {filename="config/tweaks.json",linenos=inline,linenostart=2111}
"WPFTweaksDisableBGapps": {
"Content": "Disable Background Apps",
"Description": "Disables all Microsoft Store apps from running in the background, which has to be done individually since Win11",
"Description": "Disables all Microsoft Store apps from running in the background, which has to be done individually since Windows 11.",
"category": "z__Advanced Tweaks - CAUTION",
"panel": "1",
"registry": [

View File

@@ -6,7 +6,7 @@ description: ""
```json {filename="config/tweaks.json",linenos=inline,linenostart=2127}
"WPFTweaksDisableFSO": {
"Content": "Disable Fullscreen Optimizations",
"Description": "Disables FSO in all applications. NOTE: This will disable Color Management in Exclusive Fullscreen",
"Description": "Disables FSO in all applications. NOTE: This will disable Color Management in Exclusive Fullscreen.",
"category": "z__Advanced Tweaks - CAUTION",
"panel": "1",
"registry": [

View File

@@ -6,7 +6,7 @@ description: ""
```json {filename="config/tweaks.json",linenos=inline,linenostart=1950}
"WPFTweaksDisableNotifications": {
"Content": "Disable Notification Tray/Calendar",
"Description": "Disables all Notifications INCLUDING Calendar",
"Description": "Disables all Notifications INCLUDING Calendar.",
"category": "z__Advanced Tweaks - CAUTION",
"panel": "1",
"registry": [

View File

@@ -6,7 +6,7 @@ description: ""
```json {filename="config/tweaks.json",linenos=inline,linenostart=2051}
"WPFTweaksIPv46": {
"Content": "Prefer IPv4 over IPv6",
"Description": "To set the IPv4 preference can have latency and security benefits on private networks where IPv6 is not configured.",
"Description": "Setting the IPv4 preference can have latency and security benefits on private networks where IPv6 is not configured.",
"category": "z__Advanced Tweaks - CAUTION",
"panel": "1",
"registry": [

View File

@@ -6,7 +6,7 @@ description: ""
```json {filename="config/tweaks.json",linenos=inline,linenostart=1908}
"WPFTweaksRazerBlock": {
"Content": "Block Razer Software Installs",
"Description": "Blocks ALL Razer Software installations. The hardware works fine without any software. WARNING: this will also block all Windows third-party driver installations.",
"Description": "Blocks ALL Razer Software installations. The hardware works fine without any software.",
"category": "z__Advanced Tweaks - CAUTION",
"panel": "1",
"registry": [

View File

@@ -6,7 +6,7 @@ description: ""
```json {filename="config/tweaks.json",linenos=inline,linenostart=1429}
"WPFTweaksRemoveEdge": {
"Content": "Remove Microsoft Edge",
"Description": "Unblocks Microsoft Edge uninstaller restrictions than uses that uninstaller to remove Microsoft Edge",
"Description": "Unblocks Microsoft Edge uninstaller restrictions then uses that uninstaller to remove Microsoft Edge.",
"category": "z__Advanced Tweaks - CAUTION",
"panel": "1",
"InvokeScript": [

View File

@@ -6,7 +6,7 @@ description: ""
```json {filename="config/tweaks.json",linenos=inline,linenostart=1517}
"WPFTweaksRemoveGallery": {
"Content": "Remove Gallery from explorer",
"Description": "Removes the Gallery from Explorer and sets This PC as default",
"Description": "Removes the Gallery from Explorer and sets This PC as default.",
"category": "z__Advanced Tweaks - CAUTION",
"panel": "1",
"InvokeScript": [

View File

@@ -6,7 +6,7 @@ description: ""
```json {filename="config/tweaks.json",linenos=inline,linenostart=1498}
"WPFTweaksRemoveHome": {
"Content": "Remove Home from Explorer",
"Description": "Removes the Home from Explorer and sets This PC as default",
"Description": "Removes the Home from Explorer and sets This PC as default.",
"category": "z__Advanced Tweaks - CAUTION",
"panel": "1",
"InvokeScript": [

View File

@@ -6,7 +6,7 @@ description: ""
```json {filename="config/tweaks.json",linenos=inline,linenostart=1461}
"WPFTweaksRemoveOneDrive": {
"Content": "Remove OneDrive",
"Description": "Denys permission to remove onedrive user files than uses its own uninstaller to remove it than brings back permissions",
"Description": "Denies permission to remove OneDrive user files, then uses its own uninstaller to remove it and restores the original permission afterward.",
"category": "z__Advanced Tweaks - CAUTION",
"panel": "1",
"InvokeScript": [

View File

@@ -6,7 +6,7 @@ description: ""
```json {filename="config/tweaks.json",linenos=inline,linenostart=90}
"WPFTweaksRevertStartMenu": {
"Content": "Revert the new start menu",
"Description": "Uses vivetool to revert the the original start menu from 24h2",
"Description": "Uses vivetool to revert to the original start menu from 24H2.",
"category": "z__Advanced Tweaks - CAUTION",
"panel": "1",
"InvokeScript": [

View File

@@ -1,12 +1,12 @@
---
title: "Set Classic Right-Click Menu "
title: "Set Classic Right-Click Menu"
description: ""
---
```json {filename="config/tweaks.json",linenos=inline,linenostart=2003}
"WPFTweaksRightClickMenu": {
"Content": "Set Classic Right-Click Menu ",
"Description": "Great Windows 11 tweak to bring back good context menus when right clicking things in explorer.",
"Content": "Set Classic Right-Click Menu",
"Description": "Restores the classic context menu when right-clicking in File Explorer, replacing the simplified Windows 11 version.",
"category": "z__Advanced Tweaks - CAUTION",
"panel": "1",
"InvokeScript": [

View File

@@ -6,7 +6,7 @@ description: ""
```json {filename="config/tweaks.json",linenos=inline,linenostart=2067}
"WPFTweaksTeredo": {
"Content": "Disable Teredo",
"Description": "Teredo network tunneling is a ipv6 feature that can cause additional latency, but may cause problems with some games",
"Description": "Teredo network tunneling is a IPv6 feature that can cause additional latency, but may cause problems with some games.",
"category": "z__Advanced Tweaks - CAUTION",
"panel": "1",
"registry": [

View File

@@ -3,7 +3,7 @@ title: "DNS"
description: ""
---
```json {filename="config/tweaks.json",linenos=inline,linenostart=2592}
```json {filename="config/tweaks.json",linenos=inline,linenostart=2610}
"WPFchangedns": {
"Content": "DNS",
"category": "z__Advanced Tweaks - CAUTION",

View File

@@ -31,9 +31,10 @@ Winutil is designed for:
New to Winutil? Start here:
1. **[Getting Started Guide](getting-started/)** - Installation and first steps
2. **[Application Store](store/)** - Learn to install software easily
2. **[Application Store](application/)** - Learn to install software easily
3. **[Tweaks Guide](tweaks/)** - Optimize your system
4. **[Features & Fixes](features/)** - Troubleshoot common issues
5. **[Win11 Creator](win11Creator/)** - Build a custom debloated Windows 11 ISO
## Main Features
@@ -41,7 +42,7 @@ New to Winutil? Start here:
Browse and install hundreds of popular applications with a single click. No more hunting for download links or dealing with installer bloat.
**[Read the Store Guide →](store/)**
**[Read the Store Guide →](application/)**
### ⚙️ System Tweaks
@@ -79,16 +80,23 @@ Automate Winutil configurations for:
**[Read the Automation Guide →](automation/)**
### 💿 Windows 11 Creator
Build a custom Windows 11 ISO with bloatware removed, telemetry disabled, and hardware requirement checks bypassed — then export it as an ISO file or write it directly to a USB drive.
**[Read the Win11 Creator Guide →](win11Creator/)**
## Quick Links
| I want to... | Go to... |
|--------------|----------|
| Install Winutil for the first time | [Getting Started](getting-started/) |
| Install applications quickly | [Application Store](store/) |
| Install applications quickly | [Application Store](application/) |
| Speed up my computer | [Tweaks Guide](tweaks/) |
| Fix Windows Update problems | [Features - Fixes](features/) |
| Automate setup for multiple PCs | [Automation](automation/) |
| Understand what tweaks do | [Tweaks Guide](tweaks/) |
| Build a custom Windows 11 ISO | [Win11 Creator](win11Creator/) |
## Safety and Best Practices
@@ -143,9 +151,10 @@ Want to help improve Winutil?
This User Guide covers everything you need to know:
1. **[Getting Started](getting-started/)** - Installation, first run, basic usage
2. **[Application Store](store/)** - Installing software, using presets
2. **[Application Store](application/)** - Installing software, using presets
3. **[Tweaks](tweaks/)** - System optimizations and customizations
4. **[Features & Fixes](features/)** - Troubleshooting tools and utilities
5. **[Win11 Creator](win11Creator/)** - Build a custom debloated Windows 11 ISO
6. **[Updates](updates/)** - Managing Windows Update behavior
7. **[Automation](automation/)** - Scripting and batch deployments

View File

@@ -1,5 +1,5 @@
---
title: Store
title: Applications
weight: 2
---

View File

@@ -1,5 +1,5 @@
---
title: Getting Started with Winutil
title: Getting Started
weight: 1
---
@@ -258,7 +258,7 @@ If Winutil downloads but doesn't open:
Now that you're set up, explore these guides:
- [Application Installation Guide](../store/) - Learn about installing software
- [Application Installation Guide](../application/) - Learn about installing software
- [Tweaks Guide](../tweaks/) - Understand system optimizations
- [FAQ](../../faq/) - Common questions and answers

View File

@@ -0,0 +1,170 @@
---
title: Win 11 Creator
weight: 5
---
## Using Winutil's Win11 Creator
Winutil includes a built-in **Win11 Creator** tool that lets you take any official Windows 11 ISO and produce a customized, debloated version — with telemetry removed, hardware requirement checks bypassed, and local account setup enabled out of the box. You can export the result as a new ISO file or write it directly to a USB drive.
> [!IMPORTANT]
> You need an **official Windows 11 ISO** from [Microsoft's website](https://www.microsoft.com/en-us/software-download/windows11) before starting. Custom, modified, or non-official ISOs are not supported. The process uses ~1015 GB of temporary disk space, so make sure you have room.
---
### Step 1 — Select Your Official Windows 11 ISO
1. Open Winutil and go to the **Win11 Creator** tab.
2. Click **Browse** and select your **official Windows 11 ISO file** from Microsoft (must be 4 GB or larger). Custom or modified ISOs are not supported.
3. The file path and size will appear on screen once selected.
---
### Step 2 — Mount & Verify
1. Click **Mount & Verify ISO**.
2. Winutil mounts the ISO, checks for a valid `install.wim` or `install.esd`, and reads the available editions (Home, Pro, Enterprise, etc.).
3. Once verified, select your desired **edition** from the dropdown — Pro is selected by default if available.
> [!NOTE]
> This step takes around 1030 seconds depending on your drive speed.
---
### Step 3 — Run the Modification
Click **Run Windows ISO Modification and Creator** to start the customization process. Winutil will:
**App & Component Removal:**
- **Remove 40+ bloat apps** — Clipchamp, Teams, Copilot, Dev Home, new Outlook, Bing apps, Solitaire, and more
- **Delete OneDrive setup** from the image
**System Customization:**
- **Bypass hardware checks** — removes TPM, Secure Boot, CPU, and RAM requirement enforcement so the ISO installs on unsupported hardware
- **Enable local account setup** — injects an `autounattend.xml` that skips the Microsoft account screen during OOBE
- **Disable BitLocker and device encryption** — removes startup overhead
- **Disable Chat icon** — removes chat taskbar button
- **Strip unused editions** — keeps only your selected edition, saving 12 GB per removed edition
- **Clean the component store** — runs DISM cleanup to reclaim another 300800 MB
**Privacy & Telemetry Tweaks:**
- **Disable telemetry** — advertising ID, tailored experiences, input personalization, speech online privacy
- **Disable cloud content features** — app suggestions, Microsoft Store recommendations
- **Remove telemetry scheduled tasks** — CEIP, Appraiser, WaaSMedic, and others
- **Disable OneDrive folder backup** — prevents automatic backups to cloud
- **Prevent DevHome and Outlook post-setup installation**
- **Prevent Teams installation** — blocks auto-install after OOBE
- **Prevent new Outlook Mail app installation**
- **Disable Windows Update during OOBE** — re-enabled automatically on first login
- **Disable Copilot and search box suggestions**
**Optional: Driver Injection**
- If enabled, injects all drivers from your current system into the install.wim and boot.wim — useful for offline installations on machines with missing drivers. This is an optional checkbox in Step 3.
A live log shows progress as each step completes. This stage takes **1030 minutes** depending on your disk speed — the WIM dismount near the end is the slowest part, so don't close Winutil while it's running.
---
### Step 4 — Export Your Result
Once modification is complete, choose how to save your image:
{{< tabs items="Save as ISO,Write to USB" defaultIndex="0" >}}
{{< tab >}}
1. Click **Save as an ISO File**.
2. Choose a save location (defaults to your Desktop as `Win11_Modified_yyyyMMdd.iso`).
3. Winutil builds a dual BIOS/UEFI bootable ISO using `oscdimg.exe`.
> [!NOTE]
> `oscdimg.exe` (part of the Windows ADK) is required. If it's not found, Winutil will attempt to install it automatically via winget. If that fails, install it manually: `winget install -e --id Microsoft.OSCDIMG`
**Typical output size:** 2.53.5 GB (down from 56 GB original)
{{< /tab >}}
{{< tab >}}
1. Click **Write Directly to a USB Drive**.
2. Select your USB drive from the dropdown (click **Refresh** if it doesn't appear).
3. Click **Erase & Write to USB** and confirm the warning — **all data on the drive will be permanently erased**.
4. Winutil formats the drive as GPT with a 512 MB EFI partition and copies the modified Windows files.
> [!WARNING]
> Double-check you have selected the correct drive before confirming. This operation cannot be undone.
**Minimum USB size:** 8 GB recommended. Writing takes 1020 minutes.
{{< /tab >}}
{{< /tabs >}}
---
### Step 5 — Clean Up (Optional)
Click **Clean & Reset** to delete the temporary working directory (~1015 GB) and reset the tool back to its initial state, ready for a new ISO. You'll be asked to confirm before anything is deleted.
---
### What the Modified ISO Does Differently
When you install Windows 11 from your modified ISO:
- **No Microsoft account required** — create a local account directly during setup
- **No hardware checks** — installs on machines without TPM 2.0, Secure Boot, or supported CPUs
- **Dark mode enabled by default**
- **Empty taskbar and Start Menu** — no pinned apps, Chat icon removed
- **Windows Update disabled during OOBE** — automatically re-enabled on first login to prevent setup interruptions
- **BitLocker disabled** — removes startup overhead on first boot
---
### Troubleshooting
| Problem | Fix |
|---------|-----|
| "install.wim not found" | Not a valid Windows 11 ISO — download a fresh one from Microsoft |
| "oscdimg.exe not found" | Run `winget install -e --id Microsoft.OSCDIMG` then retry |
| USB drive not showing up | Plug it in, wait a few seconds, then click **Refresh** |
| Modification seems stuck | The WIM dismount step is slow — wait at least 10 minutes before assuming it's frozen |
| "Access Denied" error | Make sure Winutil is running as Administrator |
---
A list of the best free and open source tools for downloading, creating and flashing Windows ISOs.
## Download Windows ISOs
| Tool | Description | Website |
|------|-------------|---------|
| **[UUP Dump](https://uupdump.net/)** | Download Windows UUP files directly from Microsoft's servers and convert them into a clean ISO — great for getting the latest builds | [uupdump.net](https://uupdump.net/) |
| **[Microsoft Media Creation Tool](https://www.microsoft.com/en-us/software-download/windows11)** | Microsoft's official tool for downloading and creating Windows 10/11 installation media | [microsoft.com](https://www.microsoft.com/en-us/software-download/windows11) |
## Customize Windows ISOs
| Tool | Description | Website |
|------|-------------|---------|
| **[MicroWin](https://github.com/CodingWonders/microwin)** | A C# desktop app for building stripped-down, customized Windows ISOs — the original predecessor to Winutil's old MicroWin feature | [github.com](https://github.com/CodingWonders/microwin) |
| **[Tiny11 Builder](https://github.com/ntdevlabs/tiny11builder)** | PowerShell script that strips a Windows 11 ISO down to the bare minimum — removes bloatware and bypasses hardware requirements | [github.com](https://github.com/ntdevlabs/tiny11builder) |
| **[NTLite](https://www.ntlite.com/)** | Remove Windows components, integrate drivers and updates, and build a custom ISO before installation | [ntlite.com](https://www.ntlite.com/) |
## Flash ISOs to USB
| Tool | Description | Website |
|------|-------------|---------|
| **[Rufus](https://rufus.ie/)** | The go-to tool for creating bootable Windows USB drives. Supports bypassing Windows 11 TPM/Secure Boot requirements and downloading ISOs directly | [rufus.ie](https://rufus.ie/) |
| **[Ventoy](https://www.ventoy.net/)** | Install once, then just copy any ISO files onto the USB — supports booting multiple ISOs from a single drive without re-flashing | [ventoy.net](https://www.ventoy.net/) |
| **[balenaEtcher](https://etcher.balena.io/)** | Simple, beginner-friendly ISO flasher with a clean interface | [etcher.balena.io](https://etcher.balena.io/) |
---
> [!TIP]
> Already have a Windows 11 ISO? Skip the third-party tools and use Winutil's built-in **[Win11 Creator](#using-winutilss-win11-creator)** at the top of this page.
> [!NOTE]
> Always download Windows ISOs from official Microsoft sources or trusted tools like Rufus/UUP Dump to avoid tampered images.
> [!NOTE]
> Newer Windows 11 ISOs may not boot correctly on older versions of Ventoy — make sure Ventoy is up to date before use. If issues persist after updating, this is a Ventoy compatibility limitation outside of Winutil's control.

File diff suppressed because it is too large Load Diff

View File

@@ -4,52 +4,38 @@ function Invoke-WinUtilISOScript {
Applies WinUtil modifications to a mounted Windows 11 install.wim image.
.DESCRIPTION
Performs the following operations against an already-mounted WIM image:
Removes AppX bloatware and OneDrive, optionally injects all drivers exported from
the running system into install.wim and boot.wim (controlled by the
-InjectCurrentSystemDrivers switch), applies offline registry tweaks (hardware
bypass, privacy, OOBE, telemetry, update suppression), deletes CEIP/WU
scheduled-task definition files, and optionally writes autounattend.xml to the ISO
root and removes the support\ folder from the ISO contents directory.
1. Removes provisioned AppX bloatware packages via DISM.
2. Deletes Microsoft Edge program files.
3. Removes OneDriveSetup.exe from the system image.
4. Loads offline registry hives (COMPONENTS, DEFAULT, NTUSER, SOFTWARE, SYSTEM)
and applies the following tweaks:
- Bypasses hardware requirement checks (CPU, RAM, SecureBoot, Storage, TPM).
- Disables sponsored-app delivery and ContentDeliveryManager features.
- Enables local-account OOBE path (BypassNRO).
- Writes autounattend.xml to the Sysprep directory inside the WIM and,
optionally, to the ISO/USB root so Windows Setup picks it up at boot.
- Disables reserved storage.
- Disables BitLocker device encryption.
- Hides the Chat (Teams) taskbar icon.
- Removes Edge uninstall registry entries.
- Disables OneDrive folder backup (KFM).
- Disables telemetry, advertising ID, and input personalization.
- Blocks post-install delivery of DevHome, Outlook, and Teams.
- Disables Windows Copilot.
- Disables Windows Update during OOBE.
5. Deletes unwanted scheduled-task XML definition files (CEIP, Appraiser, etc.).
6. Removes the support\ folder from the ISO contents directory (if supplied).
All setup scripts embedded in the autounattend.xml <Extensions><File> nodes are
written directly into the WIM at their target paths under C:\Windows\Setup\Scripts\
to ensure they survive Windows Setup stripping unrecognised-namespace XML elements
from the Panther copy of the answer file.
Mounting and dismounting the WIM is the responsibility of the caller
(e.g. Invoke-WinUtilISO).
Mounting/dismounting the WIM is the caller's responsibility (e.g. Invoke-WinUtilISO).
.PARAMETER ScratchDir
Mandatory. Full path to the directory where the Windows image is currently mounted.
Example: C:\Users\USERNAME\AppData\Local\Temp\WinUtil_Win11ISO_20260222\wim_mount
.PARAMETER ISOContentsDir
Optional. Root directory of the extracted ISO contents.
When supplied, autounattend.xml is also written here so Windows Setup picks it
up automatically at boot, and the support\ folder is deleted from that location.
Optional. Root directory of the extracted ISO contents. When supplied,
autounattend.xml is written here and the support\ folder is removed.
.PARAMETER AutoUnattendXml
Optional. Full XML content for autounattend.xml.
In compiled winutil.ps1 this is the embedded $WinUtilAutounattendXml here-string;
in dev mode it is read from tools\autounattend.xml.
If empty, the OOBE bypass file is skipped and a warning is logged.
Optional. Full XML content for autounattend.xml. If empty, the OOBE bypass
file is skipped and a warning is logged.
.PARAMETER InjectCurrentSystemDrivers
Optional. When $true, exports all drivers from the running system and injects
them into install.wim and boot.wim index 2 (Windows Setup PE).
Defaults to $false.
.PARAMETER Log
Optional ScriptBlock used for progress/status logging.
Receives a single [string] message argument.
Defaults to { param($m) Write-Output $m } when not supplied.
Optional ScriptBlock for progress/status logging. Receives a single [string] argument.
.EXAMPLE
Invoke-WinUtilISOScript -ScratchDir "C:\Temp\wim_mount"
@@ -64,24 +50,19 @@ function Invoke-WinUtilISOScript {
.NOTES
Author : Chris Titus @christitustech
GitHub : https://github.com/ChrisTitusTech
Version : 26.02.22
Version : 26.03.02
#>
param (
[Parameter(Mandatory)][string]$ScratchDir,
# Root directory of the extracted ISO contents. When supplied, autounattend.xml
# is written here so Windows Setup picks it up automatically at boot.
[string]$ISOContentsDir = "",
# Autounattend XML content. In compiled winutil.ps1 this comes from the embedded
# $WinUtilAutounattendXml here-string; in dev mode it is read from tools\autounattend.xml.
[string]$AutoUnattendXml = "",
[bool]$InjectCurrentSystemDrivers = $false,
[scriptblock]$Log = { param($m) Write-Output $m }
)
# ── Resolve admin group name (for takeown / icacls) ──────────────────────
$adminSID = New-Object System.Security.Principal.SecurityIdentifier('S-1-5-32-544')
$adminGroup = $adminSID.Translate([System.Security.Principal.NTAccount])
# ── Local helpers ─────────────────────────────────────────────────────────
function Set-ISOScriptReg {
param ([string]$path, [string]$name, [string]$type, [string]$value)
try {
@@ -102,15 +83,37 @@ function Invoke-WinUtilISOScript {
}
}
# ═════════════════════════════════════════════════════════════════════════
# 1. Remove provisioned AppX packages
# ═════════════════════════════════════════════════════════════════════════
function Add-DriversToImage {
param ([string]$MountPath, [string]$DriverDir, [string]$Label = "image", [scriptblock]$Logger)
& dism /English "/image:$MountPath" /Add-Driver "/Driver:$DriverDir" /Recurse 2>&1 |
ForEach-Object { & $Logger " dism[$Label]: $_" }
}
function Invoke-BootWimInject {
param ([string]$BootWimPath, [string]$DriverDir, [scriptblock]$Logger)
Set-ItemProperty -Path $BootWimPath -Name IsReadOnly -Value $false -ErrorAction SilentlyContinue
$mountDir = Join-Path $env:TEMP "WinUtil_BootMount_$(Get-Random)"
New-Item -Path $mountDir -ItemType Directory -Force | Out-Null
try {
& $Logger "Mounting boot.wim (index 2) for driver injection..."
Mount-WindowsImage -ImagePath $BootWimPath -Index 2 -Path $mountDir -ErrorAction Stop | Out-Null
Add-DriversToImage -MountPath $mountDir -DriverDir $DriverDir -Label "boot" -Logger $Logger
& $Logger "Saving boot.wim..."
Dismount-WindowsImage -Path $mountDir -Save -ErrorAction Stop | Out-Null
& $Logger "boot.wim driver injection complete."
} catch {
& $Logger "Warning: boot.wim driver injection failed: $_"
try { Dismount-WindowsImage -Path $mountDir -Discard -ErrorAction SilentlyContinue | Out-Null } catch {}
} finally {
Remove-Item -Path $mountDir -Recurse -Force -ErrorAction SilentlyContinue
}
}
# ── 1. Remove provisioned AppX packages ──────────────────────────────────
& $Log "Removing provisioned AppX packages..."
$packages = & dism /English "/image:$ScratchDir" /Get-ProvisionedAppxPackages |
ForEach-Object {
if ($_ -match 'PackageName : (.*)') { $matches[1] }
}
ForEach-Object { if ($_ -match 'PackageName : (.*)') { $matches[1] } }
$packagePrefixes = @(
'AppUp.IntelManagementandSecurityStatus',
@@ -122,7 +125,6 @@ function Invoke-WinUtilISOScript {
'Microsoft.BingWeather',
'Microsoft.Copilot',
'Microsoft.Windows.CrossDevice',
'Microsoft.GamingApp',
'Microsoft.GetHelp',
'Microsoft.Getstarted',
'Microsoft.Microsoft3DViewer',
@@ -158,31 +160,46 @@ function Invoke-WinUtilISOScript {
'MicrosoftTeams'
)
$packagesToRemove = $packages | Where-Object {
$pkg = $_
$packagePrefixes | Where-Object { $pkg -like "*$_*" }
}
foreach ($package in $packagesToRemove) {
& dism /English "/image:$ScratchDir" /Remove-ProvisionedAppxPackage "/PackageName:$package"
$packages | Where-Object { $pkg = $_; $packagePrefixes | Where-Object { $pkg -like "*$_*" } } |
ForEach-Object { & dism /English "/image:$ScratchDir" /Remove-ProvisionedAppxPackage "/PackageName:$_" }
# ── 2. Inject current system drivers (optional) ───────────────────────────
if ($InjectCurrentSystemDrivers) {
& $Log "Exporting all drivers from running system..."
$driverExportRoot = Join-Path $env:TEMP "WinUtil_DriverExport_$(Get-Random)"
New-Item -Path $driverExportRoot -ItemType Directory -Force | Out-Null
try {
Export-WindowsDriver -Online -Destination $driverExportRoot | Out-Null
& $Log "Injecting current system drivers into install.wim..."
Add-DriversToImage -MountPath $ScratchDir -DriverDir $driverExportRoot -Label "install" -Logger $Log
& $Log "install.wim driver injection complete."
if ($ISOContentsDir -and (Test-Path $ISOContentsDir)) {
$bootWim = Join-Path $ISOContentsDir "sources\boot.wim"
if (Test-Path $bootWim) {
& $Log "Injecting current system drivers into boot.wim..."
Invoke-BootWimInject -BootWimPath $bootWim -DriverDir $driverExportRoot -Logger $Log
} else {
& $Log "Warning: boot.wim not found — skipping boot.wim driver injection."
}
}
} catch {
& $Log "Error during driver export/injection: $_"
} finally {
Remove-Item -Path $driverExportRoot -Recurse -Force -ErrorAction SilentlyContinue
}
} else {
& $Log "Driver injection skipped."
}
# ═════════════════════════════════════════════════════════════════════════
# 2. Remove Edge
# ═════════════════════════════════════════════════════════════════════════
& $Log "Removing Edge..."
Remove-Item -Path "$ScratchDir\Program Files (x86)\Microsoft\Edge" -Recurse -Force -ErrorAction SilentlyContinue
# ═════════════════════════════════════════════════════════════════════════
# 3. Remove OneDrive
# ═════════════════════════════════════════════════════════════════════════
# ── 3. Remove OneDrive ────────────────────────────────────────────────────
& $Log "Removing OneDrive..."
& takeown /f "$ScratchDir\Windows\System32\OneDriveSetup.exe" | Out-Null
& icacls "$ScratchDir\Windows\System32\OneDriveSetup.exe" /grant "$($adminGroup.Value):(F)" /T /C | Out-Null
Remove-Item -Path "$ScratchDir\Windows\System32\OneDriveSetup.exe" -Force -ErrorAction SilentlyContinue
# ═════════════════════════════════════════════════════════════════════════
# 4. Registry tweaks
# ═════════════════════════════════════════════════════════════════════════
# ── 4. Registry tweaks ────────────────────────────────────────────────────
& $Log "Loading offline registry hives..."
reg load HKLM\zCOMPONENTS "$ScratchDir\Windows\System32\config\COMPONENTS"
reg load HKLM\zDEFAULT "$ScratchDir\Windows\System32\config\default"
@@ -231,14 +248,37 @@ function Invoke-WinUtilISOScript {
Set-ISOScriptReg 'HKLM\zSOFTWARE\Microsoft\Windows\CurrentVersion\OOBE' 'BypassNRO' 'REG_DWORD' '1'
if ($AutoUnattendXml) {
# ── Place autounattend.xml inside the WIM (Sysprep) ──────────────────
$sysprepDest = "$ScratchDir\Windows\System32\Sysprep\autounattend.xml"
Set-Content -Path $sysprepDest -Value $AutoUnattendXml -Encoding UTF8 -Force
& $Log "Written autounattend.xml to Sysprep directory."
try {
$xmlDoc = [xml]::new()
$xmlDoc.LoadXml($AutoUnattendXml)
$nsMgr = New-Object System.Xml.XmlNamespaceManager($xmlDoc.NameTable)
$nsMgr.AddNamespace("sg", "https://schneegans.de/windows/unattend-generator/")
$fileNodes = $xmlDoc.SelectNodes("//sg:File", $nsMgr)
if ($fileNodes -and $fileNodes.Count -gt 0) {
foreach ($fileNode in $fileNodes) {
$absPath = $fileNode.GetAttribute("path")
$relPath = $absPath -replace '^[A-Za-z]:[/\\]', ''
$destPath = Join-Path $ScratchDir $relPath
New-Item -Path (Split-Path $destPath -Parent) -ItemType Directory -Force -ErrorAction SilentlyContinue | Out-Null
$ext = [IO.Path]::GetExtension($destPath).ToLower()
$encoding = switch ($ext) {
{ $_ -in '.ps1', '.xml' } { [System.Text.Encoding]::UTF8 }
{ $_ -in '.reg', '.vbs', '.js' } { [System.Text.UnicodeEncoding]::new($false, $true) }
default { [System.Text.Encoding]::Default }
}
[System.IO.File]::WriteAllBytes($destPath, ($encoding.GetPreamble() + $encoding.GetBytes($fileNode.InnerText.Trim())))
& $Log "Pre-staged setup script: $relPath"
}
} else {
& $Log "Warning: no <Extensions><File> nodes found in autounattend.xml — setup scripts not pre-staged."
}
} catch {
& $Log "Warning: could not pre-stage setup scripts from autounattend.xml: $_"
}
# ── Place autounattend.xml at the ISO / USB root ──────────────────────
# Windows Setup reads this file first (before booting into the OS),
# which is what drives the local-account / OOBE bypass at install time.
if ($ISOContentsDir -and (Test-Path $ISOContentsDir)) {
$isoDest = Join-Path $ISOContentsDir "autounattend.xml"
Set-Content -Path $isoDest -Value $AutoUnattendXml -Encoding UTF8 -Force
@@ -258,10 +298,6 @@ function Invoke-WinUtilISOScript {
Set-ISOScriptReg 'HKLM\zSOFTWARE\Policies\Microsoft\Windows\Windows Chat' 'ChatIcon' 'REG_DWORD' '3'
Set-ISOScriptReg 'HKLM\zNTUSER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced' 'TaskbarMn' 'REG_DWORD' '0'
& $Log "Removing Edge registry entries..."
Remove-ISOScriptReg 'HKLM\zSOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\Microsoft Edge'
Remove-ISOScriptReg 'HKLM\zSOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\Microsoft Edge Update'
& $Log "Disabling OneDrive folder backup..."
Set-ISOScriptReg 'HKLM\zSOFTWARE\Policies\Microsoft\Windows\OneDrive' 'DisableFileSyncNGSC' 'REG_DWORD' '1'
@@ -285,13 +321,24 @@ function Invoke-WinUtilISOScript {
Remove-ISOScriptReg 'HKLM\zSOFTWARE\Microsoft\WindowsUpdate\Orchestrator\UScheduler_Oobe\DevHomeUpdate'
& $Log "Disabling Copilot..."
Set-ISOScriptReg 'HKLM\zSOFTWARE\Policies\Microsoft\Windows\WindowsCopilot' 'TurnOffWindowsCopilot' 'REG_DWORD' '1'
Set-ISOScriptReg 'HKLM\zSOFTWARE\Policies\Microsoft\Edge' 'HubsSidebarEnabled' 'REG_DWORD' '0'
Set-ISOScriptReg 'HKLM\zSOFTWARE\Policies\Microsoft\Windows\WindowsCopilot' 'TurnOffWindowsCopilot' 'REG_DWORD' '1'
Set-ISOScriptReg 'HKLM\zSOFTWARE\Policies\Microsoft\Edge' 'HubsSidebarEnabled' 'REG_DWORD' '0'
Set-ISOScriptReg 'HKLM\zSOFTWARE\Policies\Microsoft\Windows\Explorer' 'DisableSearchBoxSuggestions' 'REG_DWORD' '1'
& $Log "Disabling Windows Update during OOBE (re-enabled on first logon via FirstLogon.ps1)..."
Set-ISOScriptReg 'HKLM\zSOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU' 'NoAutoUpdate' 'REG_DWORD' '1'
Set-ISOScriptReg 'HKLM\zSOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU' 'AUOptions' 'REG_DWORD' '1'
Set-ISOScriptReg 'HKLM\zSOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU' 'UseWUServer' 'REG_DWORD' '1'
Set-ISOScriptReg 'HKLM\zSOFTWARE\Policies\Microsoft\Windows\WindowsUpdate' 'DisableWindowsUpdateAccess' 'REG_DWORD' '1'
Set-ISOScriptReg 'HKLM\zSOFTWARE\Policies\Microsoft\Windows\WindowsUpdate' 'WUServer' 'REG_SZ' 'http://localhost:8080'
Set-ISOScriptReg 'HKLM\zSOFTWARE\Policies\Microsoft\Windows\WindowsUpdate' 'WUStatusServer' 'REG_SZ' 'http://localhost:8080'
Set-ISOScriptReg 'HKLM\zSOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Orchestrator\UScheduler_Oobe\WindowsUpdate' 'workCompleted' 'REG_DWORD' '1'
Remove-ISOScriptReg 'HKLM\zSOFTWARE\Microsoft\WindowsUpdate\Orchestrator\UScheduler_Oobe\WindowsUpdate'
Set-ISOScriptReg 'HKLM\zSOFTWARE\Microsoft\Windows\CurrentVersion\DeliveryOptimization\Config' 'DODownloadMode' 'REG_DWORD' '0'
Set-ISOScriptReg 'HKLM\zSYSTEM\ControlSet001\Services\BITS' 'Start' 'REG_DWORD' '4'
Set-ISOScriptReg 'HKLM\zSYSTEM\ControlSet001\Services\wuauserv' 'Start' 'REG_DWORD' '4'
Set-ISOScriptReg 'HKLM\zSYSTEM\ControlSet001\Services\UsoSvc' 'Start' 'REG_DWORD' '4'
Set-ISOScriptReg 'HKLM\zSYSTEM\ControlSet001\Services\WaaSMedicSvc' 'Start' 'REG_DWORD' '4'
& $Log "Preventing installation of Teams..."
Set-ISOScriptReg 'HKLM\zSOFTWARE\Policies\Microsoft\Teams' 'DisableInstallation' 'REG_DWORD' '1'
@@ -306,23 +353,23 @@ function Invoke-WinUtilISOScript {
reg unload HKLM\zSOFTWARE
reg unload HKLM\zSYSTEM
# ═════════════════════════════════════════════════════════════════════════
# 5. Delete scheduled task definition files
# ═════════════════════════════════════════════════════════════════════════
# ── 5. Delete scheduled task definition files ─────────────────────────────
& $Log "Deleting scheduled task definition files..."
$tasksPath = "$ScratchDir\Windows\System32\Tasks"
Remove-Item "$tasksPath\Microsoft\Windows\Application Experience\Microsoft Compatibility Appraiser" -Force -ErrorAction SilentlyContinue
Remove-Item "$tasksPath\Microsoft\Windows\Customer Experience Improvement Program" -Recurse -Force -ErrorAction SilentlyContinue
Remove-Item "$tasksPath\Microsoft\Windows\Application Experience\ProgramDataUpdater" -Force -ErrorAction SilentlyContinue
Remove-Item "$tasksPath\Microsoft\Windows\Chkdsk\Proxy" -Force -ErrorAction SilentlyContinue
Remove-Item "$tasksPath\Microsoft\Windows\Windows Error Reporting\QueueReporting" -Force -ErrorAction SilentlyContinue
Remove-Item "$tasksPath\Microsoft\Windows\InstallService" -Recurse -Force -ErrorAction SilentlyContinue
Remove-Item "$tasksPath\Microsoft\Windows\UpdateOrchestrator" -Recurse -Force -ErrorAction SilentlyContinue
Remove-Item "$tasksPath\Microsoft\Windows\UpdateAssistant" -Recurse -Force -ErrorAction SilentlyContinue
Remove-Item "$tasksPath\Microsoft\Windows\WaaSMedic" -Recurse -Force -ErrorAction SilentlyContinue
Remove-Item "$tasksPath\Microsoft\Windows\WindowsUpdate" -Recurse -Force -ErrorAction SilentlyContinue
Remove-Item "$tasksPath\Microsoft\WindowsUpdate" -Recurse -Force -ErrorAction SilentlyContinue
& $Log "Scheduled task files deleted."
# ═════════════════════════════════════════════════════════════════════════
# 6. Remove ISO support folder (fresh-install only; not needed)
# ═════════════════════════════════════════════════════════════════════════
# ── 6. Remove ISO support folder ─────────────────────────────────────────
if ($ISOContentsDir -and (Test-Path $ISOContentsDir)) {
& $Log "Removing ISO support\ folder..."
Remove-Item -Path (Join-Path $ISOContentsDir "support") -Recurse -Force -ErrorAction SilentlyContinue

View File

@@ -0,0 +1,241 @@
function Invoke-WinUtilISORefreshUSBDrives {
$combo = $sync["WPFWin11ISOUSBDriveComboBox"]
$removable = @(Get-Disk | Where-Object { $_.BusType -eq "USB" } | Sort-Object Number)
$combo.Items.Clear()
if ($removable.Count -eq 0) {
$combo.Items.Add("No USB drives detected")
$combo.SelectedIndex = 0
$sync["Win11ISOUSBDisks"] = @()
Write-Win11ISOLog "No USB drives detected."
return
}
foreach ($disk in $removable) {
$sizeGB = [math]::Round($disk.Size / 1GB, 1)
$combo.Items.Add("Disk $($disk.Number): $($disk.FriendlyName) [$sizeGB GB] - $($disk.PartitionStyle)")
}
$combo.SelectedIndex = 0
Write-Win11ISOLog "Found $($removable.Count) USB drive(s)."
$sync["Win11ISOUSBDisks"] = $removable
}
function Invoke-WinUtilISOWriteUSB {
$contentsDir = $sync["Win11ISOContentsDir"]
$usbDisks = $sync["Win11ISOUSBDisks"]
if (-not $contentsDir -or -not (Test-Path $contentsDir)) {
[System.Windows.MessageBox]::Show("No modified ISO content found. Please complete Steps 1-3 first.", "Not Ready", "OK", "Warning")
return
}
$combo = $sync["WPFWin11ISOUSBDriveComboBox"]
$selectedIndex = $combo.SelectedIndex
$selectedItemText = [string]$combo.SelectedItem
$usbDisks = @($usbDisks)
$targetDisk = $null
if ($selectedIndex -ge 0 -and $selectedIndex -lt $usbDisks.Count) {
$targetDisk = $usbDisks[$selectedIndex]
} elseif ($selectedItemText -match 'Disk\s+(\d+):') {
$selectedDiskNum = [int]$matches[1]
$targetDisk = $usbDisks | Where-Object { $_.Number -eq $selectedDiskNum } | Select-Object -First 1
}
if (-not $targetDisk) {
[System.Windows.MessageBox]::Show("Please select a USB drive from the dropdown.", "No Drive Selected", "OK", "Warning")
return
}
$diskNum = $targetDisk.Number
$sizeGB = [math]::Round($targetDisk.Size / 1GB, 1)
$confirm = [System.Windows.MessageBox]::Show(
"ALL data on Disk $diskNum ($($targetDisk.FriendlyName), $sizeGB GB) will be PERMANENTLY ERASED.`n`nAre you sure you want to continue?",
"Confirm USB Erase", "YesNo", "Warning")
if ($confirm -ne "Yes") {
Write-Win11ISOLog "USB write cancelled by user."
return
}
$sync["WPFWin11ISOWriteUSBButton"].IsEnabled = $false
Write-Win11ISOLog "Starting USB write to Disk $diskNum..."
$runspace = [Management.Automation.Runspaces.RunspaceFactory]::CreateRunspace()
$runspace.ApartmentState = "STA"
$runspace.ThreadOptions = "ReuseThread"
$runspace.Open()
$runspace.SessionStateProxy.SetVariable("sync", $sync)
$runspace.SessionStateProxy.SetVariable("diskNum", $diskNum)
$runspace.SessionStateProxy.SetVariable("contentsDir", $contentsDir)
$script = [Management.Automation.PowerShell]::Create()
$script.Runspace = $runspace
$script.AddScript({
function Log($msg) {
$ts = (Get-Date).ToString("HH:mm:ss")
$sync["WPFWin11ISOStatusLog"].Dispatcher.Invoke([action]{
$sync["WPFWin11ISOStatusLog"].Text += "`n[$ts] $msg"
$sync["WPFWin11ISOStatusLog"].CaretIndex = $sync["WPFWin11ISOStatusLog"].Text.Length
$sync["WPFWin11ISOStatusLog"].ScrollToEnd()
})
}
function SetProgress($label, $pct) {
$sync["WPFWin11ISOStatusLog"].Dispatcher.Invoke([action]{
$sync.progressBarTextBlock.Text = $label
$sync.progressBarTextBlock.ToolTip = $label
$sync.ProgressBar.Value = [Math]::Max($pct, 5)
})
}
function Get-FreeDriveLetter {
$used = (Get-PSDrive -PSProvider FileSystem -ErrorAction SilentlyContinue).Name
foreach ($c in [char[]](68..90)) {
if ($used -notcontains [string]$c) { return $c }
}
return $null
}
try {
SetProgress "Formatting USB drive..." 10
# Phase 1: Clean disk via diskpart
$dpFile1 = Join-Path $env:TEMP "winutil_diskpart_$(Get-Random).txt"
"select disk $diskNum`nclean`nexit" | Set-Content -Path $dpFile1 -Encoding ASCII
Log "Running diskpart clean on Disk $diskNum..."
diskpart /s $dpFile1 2>&1 | Where-Object { $_ -match '\S' } | ForEach-Object { Log " diskpart: $_" }
Remove-Item $dpFile1 -Force -ErrorAction SilentlyContinue
# Phase 2: Initialize as GPT
Start-Sleep -Seconds 2
Update-Disk -Number $diskNum -ErrorAction SilentlyContinue
$diskObj = Get-Disk -Number $diskNum -ErrorAction Stop
if ($diskObj.PartitionStyle -eq 'RAW') {
Initialize-Disk -Number $diskNum -PartitionStyle GPT -ErrorAction Stop
Log "Disk $diskNum initialized as GPT."
} else {
Set-Disk -Number $diskNum -PartitionStyle GPT -ErrorAction Stop
Log "Disk $diskNum converted to GPT (was $($diskObj.PartitionStyle))."
}
# Phase 3: Create FAT32 partition via diskpart
$volLabel = "W11-" + (Get-Date).ToString('yyMMdd')
$dpFile2 = Join-Path $env:TEMP "winutil_diskpart2_$(Get-Random).txt"
$maxFat32PartitionMB = 32768
$diskSizeMB = [int][Math]::Floor((Get-Disk -Number $diskNum -ErrorAction Stop).Size / 1MB)
$createPartitionCommand = "create partition primary"
if ($diskSizeMB -gt $maxFat32PartitionMB) {
$createPartitionCommand = "create partition primary size=$maxFat32PartitionMB"
Log "Disk $diskNum is $diskSizeMB MB; creating FAT32 partition capped at $maxFat32PartitionMB MB (32 GB)."
}
@(
"select disk $diskNum"
$createPartitionCommand
"select partition 1"
"format quick fs=fat32 label=`"$volLabel`""
"exit"
) | Set-Content -Path $dpFile2 -Encoding ASCII
Log "Creating partitions on Disk $diskNum..."
diskpart /s $dpFile2 2>&1 | Where-Object { $_ -match '\S' } | ForEach-Object { Log " diskpart: $_" }
Remove-Item $dpFile2 -Force -ErrorAction SilentlyContinue
SetProgress "Assigning drive letters..." 30
Start-Sleep -Seconds 3
Update-Disk -Number $diskNum -ErrorAction SilentlyContinue
$partitions = Get-Partition -DiskNumber $diskNum -ErrorAction Stop
Log "Partitions on Disk $diskNum after format: $($partitions.Count)"
foreach ($p in $partitions) {
Log " Partition $($p.PartitionNumber) Type=$($p.Type) Letter=$($p.DriveLetter) Size=$([math]::Round($p.Size/1MB))MB"
}
$winpePart = $partitions | Where-Object { $_.Type -eq "Basic" } | Select-Object -Last 1
if (-not $winpePart) {
throw "Could not find the WINPE (Basic) partition on Disk $diskNum after format."
}
try { Remove-PartitionAccessPath -DiskNumber $diskNum -PartitionNumber $winpePart.PartitionNumber -AccessPath "$($winpePart.DriveLetter):" -ErrorAction SilentlyContinue } catch {}
$usbLetter = Get-FreeDriveLetter
if (-not $usbLetter) { throw "No free drive letters (D-Z) available to assign to the USB data partition." }
Set-Partition -DiskNumber $diskNum -PartitionNumber $winpePart.PartitionNumber -NewDriveLetter $usbLetter
Log "Assigned drive letter $usbLetter to WINPE partition (Partition $($winpePart.PartitionNumber))."
Start-Sleep -Seconds 2
$usbDrive = "${usbLetter}:"
if (-not (Test-Path $usbDrive)) { throw "Drive $usbDrive is not accessible after letter assignment." }
Log "USB data partition: $usbDrive"
$contentSizeBytes = (Get-ChildItem -LiteralPath $contentsDir -File -Recurse -Force -ErrorAction Stop | Measure-Object -Property Length -Sum).Sum
if (-not $contentSizeBytes) { $contentSizeBytes = 0 }
$usbVolume = Get-Volume -DriveLetter $usbLetter -ErrorAction Stop
$partitionCapacityBytes = [int64]$usbVolume.Size
$partitionFreeBytes = [int64]$usbVolume.SizeRemaining
$contentSizeGB = [math]::Round($contentSizeBytes / 1GB, 2)
$partitionCapacityGB = [math]::Round($partitionCapacityBytes / 1GB, 2)
$partitionFreeGB = [math]::Round($partitionFreeBytes / 1GB, 2)
Log "Source content size: $contentSizeGB GB. USB partition capacity: $partitionCapacityGB GB, free: $partitionFreeGB GB."
if ($contentSizeBytes -gt $partitionCapacityBytes) {
throw "ISO content ($contentSizeGB GB) is larger than the USB partition capacity ($partitionCapacityGB GB). Use a larger USB drive or reduce image size."
}
if ($contentSizeBytes -gt $partitionFreeBytes) {
throw "Insufficient free space on USB partition. Required: $contentSizeGB GB, available: $partitionFreeGB GB."
}
SetProgress "Copying Windows 11 files to USB..." 45
# Copy files; split install.wim if > 4 GB (FAT32 limit)
$installWim = Join-Path $contentsDir "sources\install.wim"
if (Test-Path $installWim) {
$wimSizeMB = [math]::Round((Get-Item $installWim).Length / 1MB)
if ($wimSizeMB -gt 3800) {
Log "install.wim is $wimSizeMB MB - splitting for FAT32 compatibility... This will take several minutes."
$splitDest = Join-Path $usbDrive "sources\install.swm"
New-Item -ItemType Directory -Path (Split-Path $splitDest) -Force | Out-Null
Split-WindowsImage -ImagePath $installWim -SplitImagePath $splitDest -FileSize 3800 -CheckIntegrity
Log "install.wim split complete."
Log "Copying remaining files to USB..."
& robocopy $contentsDir $usbDrive /E /XF install.wim /NFL /NDL /NJH /NJS
} else {
& robocopy $contentsDir $usbDrive /E /NFL /NDL /NJH /NJS
}
} else {
& robocopy $contentsDir $usbDrive /E /NFL /NDL /NJH /NJS
}
SetProgress "Finalising USB drive..." 90
Log "Files copied to USB."
SetProgress "USB write complete" 100
Log "USB drive is ready for use."
$sync["WPFWin11ISOStatusLog"].Dispatcher.Invoke([action]{
[System.Windows.MessageBox]::Show(
"USB drive created successfully!`n`nYou can now boot from this drive to install Windows 11.",
"USB Ready", "OK", "Info")
})
} catch {
Log "ERROR during USB write: $_"
$sync["WPFWin11ISOStatusLog"].Dispatcher.Invoke([action]{
[System.Windows.MessageBox]::Show("USB write failed:`n`n$_", "USB Write Error", "OK", "Error")
})
} finally {
Start-Sleep -Milliseconds 800
$sync["WPFWin11ISOStatusLog"].Dispatcher.Invoke([action]{
$sync.progressBarTextBlock.Text = ""
$sync.progressBarTextBlock.ToolTip = ""
$sync.ProgressBar.Value = 0
$sync["WPFWin11ISOWriteUSBButton"].IsEnabled = $true
})
}
}) | Out-Null
$script.BeginInvoke() | Out-Null
}

View File

@@ -8,20 +8,14 @@ function Invoke-WinutilThemeChange {
modifying various UI elements such as colors, margins, corner radii, font families, etc.
If the '-init' switch is used, it initializes the theme based on the system's current dark mode setting.
.PARAMETER init
A switch parameter. If set to $true, the function initializes the theme based on the systems current dark mode setting.
.EXAMPLE
Invoke-WinutilThemeChange
# Toggles the theme between 'Light' and 'Dark'.
.EXAMPLE
Invoke-WinutilThemeChange -init
# Initializes the theme based on the system's dark mode and applies the shared theme.
#>
param (
[switch]$init = $false,
[string]$theme
[string]$theme = "Auto"
)
function Set-WinutilTheme {
@@ -129,48 +123,30 @@ function Invoke-WinutilThemeChange {
}
}
$LightPreferencePath = "$winutildir\LightTheme.ini"
$DarkPreferencePath = "$winutildir\DarkTheme.ini"
$sync.preferences.theme = $theme
Set-Preferences -save
Set-WinutilTheme -currentTheme "shared"
if ($init) {
Set-WinutilTheme -currentTheme "shared"
if (Test-Path $LightPreferencePath) {
$theme = "Light"
}
elseif (Test-Path $DarkPreferencePath) {
$theme = "Dark"
}
else {
$theme = "Auto"
}
}
switch ($theme) {
switch ($sync.preferences.theme) {
"Auto" {
$systemUsesDarkMode = Get-WinUtilToggleStatus WPFToggleDarkMode
if ($systemUsesDarkMode) {
Set-WinutilTheme -currentTheme "Dark"
$theme = "Dark"
}
else{
Set-WinutilTheme -currentTheme "Light"
$theme = "Light"
}
Set-WinutilTheme -currentTheme $theme
$themeButtonIcon = [char]0xF08C
Remove-Item $LightPreferencePath -Force -ErrorAction SilentlyContinue
Remove-Item $DarkPreferencePath -Force -ErrorAction SilentlyContinue
}
"Dark" {
Set-WinutilTheme -currentTheme $theme
Set-WinutilTheme -currentTheme $sync.preferences.theme
$themeButtonIcon = [char]0xE708
$null = New-Item $DarkPreferencePath -Force
Remove-Item $LightPreferencePath -Force -ErrorAction SilentlyContinue
}
"Light" {
Set-WinutilTheme -currentTheme $theme
Set-WinutilTheme -currentTheme $sync.preferences.theme
$themeButtonIcon = [char]0xE706
$null = New-Item $LightPreferencePath -Force
Remove-Item $DarkPreferencePath -Force -ErrorAction SilentlyContinue
}
}

View File

@@ -1,43 +0,0 @@
function Set-PackageManagerPreference {
<#
.SYNOPSIS
Sets the currently selected package manager to global "ManagerPreference" in sync.
Also persists preference across Winutil restarts via preference.ini.
Reads from preference.ini if no argument sent.
.PARAMETER preferredPackageManager
The PackageManager that was selected.
#>
param(
[Parameter(Position=0, Mandatory=$false)]
[PackageManagers]$preferredPackageManager
)
$preferencePath = "$winutildir\preferences.ini"
$oldChocoPath = "$winutildir\preferChocolatey.ini"
#Try loading from file if no argument given.
if ($null -eq $preferredPackageManager) {
# Backwards compat for preferChocolatey.ini
if (Test-Path -Path $oldChocoPath) {
$preferredPackageManager = [PackageManagers]::Choco
Remove-Item -Path $oldChocoPath
}
elseif (Test-Path -Path $preferencePath) {
$potential = Get-Content -Path $preferencePath -TotalCount 1
$preferredPackageManager = [PackageManagers]$potential
}
else {
Write-Debug "Creating new preference file, defaulting to winget."
$preferredPackageManager = [PackageManagers]::Winget
}
}
$sync["ManagerPreference"] = [PackageManagers]::$preferredPackageManager
Write-Debug "Manager Preference changed to '$($sync["ManagerPreference"])'"
# Write preference to file to persist across restarts.
Out-File -FilePath $preferencePath -InputObject $sync["ManagerPreference"]
}

View File

@@ -0,0 +1,83 @@
function Set-Preferences{
param(
[switch]$save=$false
)
# TODO delete this function sometime later
function Clean-OldPrefs{
if (Test-Path -Path "$winutildir\LightTheme.ini") {
$sync.preferences.theme = "Light"
Remove-Item -Path "$winutildir\LightTheme.ini"
}
if (Test-Path -Path "$winutildir\DarkTheme.ini") {
$sync.preferences.theme = "Dark"
Remove-Item -Path "$winutildir\DarkTheme.ini"
}
# check old prefs, if its first line has no =, then absorb it as pm
if (Test-Path -Path $iniPath) {
$oldPM = Get-Content $iniPath
if ($oldPM -notlike "*=*") {
$sync.preferences.packagemanager = $oldPM
}
}
if (Test-Path -Path "$winutildir\preferChocolatey.ini") {
$sync.preferences.packagemanager = "Choco"
Remove-Item -Path "$winutildir\preferChocolatey.ini"
}
}
function Save-Preferences{
$ini = ""
foreach($key in $sync.preferences.Keys) {
$pref = "$($key)=$($sync.preferences.$key)"
Write-Debug "Saving pref: $($pref)"
$ini = $ini + $pref + "`r`n"
}
$ini | Out-File $iniPath
}
function Load-Preferences{
Clean-OldPrefs
if (Test-Path -Path $iniPath) {
$iniData = Get-Content "$winutildir\preferences.ini"
foreach ($line in $iniData) {
if ($line -like "*=*") {
$arr = $line -split "=",-2
$key = $arr[0] -replace "\s",""
$value = $arr[1] -replace "\s",""
Write-Debug "Preference: Key = '$($key)' Value ='$($value)'"
$sync.preferences.$key = $value
}
}
}
# write defaults in case preferences dont exist
if ($null -eq $sync.preferences.theme) {
$sync.preferences.theme = "Auto"
}
if ($null -eq $sync.preferences.packagemanager) {
$sync.preferences.packagemanager = "Winget"
}
# convert packagemanager to enum
if ($sync.preferences.packagemanager -eq "Choco") {
$sync.preferences.packagemanager = [PackageManagers]::Choco
}
elseif ($sync.preferences.packagemanager -eq "Winget") {
$sync.preferences.packagemanager = [PackageManagers]::Winget
}
}
$iniPath = "$winutildir\preferences.ini"
if ($save) {
Save-Preferences
}
else {
Load-Preferences
}
}

View File

@@ -14,7 +14,9 @@ function Update-WinUtilSelections {
Write-Debug "JSON to import: $($flatJson)"
foreach ($cbkey in $flatJson) {
foreach ($item in $flatJson) {
# Ensure each item is treated as a string to handle PSCustomObject from JSON deserialization
$cbkey = [string]$item
$group = if ($cbkey.StartsWith("WPFInstall")) { "Install" }
elseif ($cbkey.StartsWith("WPFTweaks")) { "Tweaks" }
elseif ($cbkey.StartsWith("WPFToggle")) { "Toggle" }
@@ -26,7 +28,7 @@ function Update-WinUtilSelections {
if (!$sync.selectedApps.Contains($cbkey)) {
$sync.selectedApps.Add($cbkey)
# The List type needs to be specified again, because otherwise Sort-Object will convert the list to a string if there is only a single entry
[System.Collections.Generic.List[pscustomobject]]$sync.selectedApps = $sync.SelectedApps | Sort-Object
[System.Collections.Generic.List[string]]$sync.selectedApps = $sync.SelectedApps | Sort-Object
}
}
"Tweaks" {

View File

@@ -18,7 +18,7 @@ function Invoke-WPFGetInstalled {
if (($sync.ChocoRadioButton.IsChecked -eq $false) -and ((Test-WinUtilPackageManager -winget) -eq "not-installed") -and $checkbox -eq "winget") {
return
}
$managerPreference = $sync["ManagerPreference"]
$managerPreference = $sync.preferences.packagemanager
Invoke-WPFRunspace -ParameterList @(("managerPreference", $managerPreference),("checkbox", $checkbox)) -ScriptBlock {
param (

View File

@@ -44,7 +44,13 @@ function Invoke-WPFImpex {
try {
$Config = ConfigDialog
if ($Config) {
$allConfs = $sync.selectedApps + $sync.selectedTweaks + $sync.selectedToggles + $sync.selectedFeatures
$allConfs = ($sync.selectedApps + $sync.selectedTweaks + $sync.selectedToggles + $sync.selectedFeatures) | ForEach-Object { [string]$_ }
if (-not $allConfs) {
[System.Windows.MessageBox]::Show(
"No settings are selected to export. Please select at least one app, tweak, toggle, or feature before exporting.",
"Nothing to Export", "OK", "Warning")
return
}
$jsonFile = $allConfs | ConvertTo-Json
$jsonFile | Out-File $Config -Force
"iex ""& { `$(irm https://christitus.com/win) } -Config '$Config'""" | Set-Clipboard
@@ -70,6 +76,21 @@ function Invoke-WPFImpex {
# TODO how to handle old style? detected json type then flatten it in a func?
# $flattenedJson = $jsonFile.PSObject.Properties.Where({ $_.Name -ne "Install" }).ForEach({ $_.Value })
$flattenedJson = $jsonFile
if (-not $flattenedJson) {
[System.Windows.MessageBox]::Show(
"The selected file contains no settings to import. No changes have been made.",
"Empty Configuration", "OK", "Warning")
return
}
# Clear all existing selections before importing so the import replaces
# the current state rather than merging with it
$sync.selectedApps = [System.Collections.Generic.List[string]]::new()
$sync.selectedTweaks = [System.Collections.Generic.List[string]]::new()
$sync.selectedToggles = [System.Collections.Generic.List[string]]::new()
$sync.selectedFeatures = [System.Collections.Generic.List[string]]::new()
Update-WinUtilSelections -flatJson $flattenedJson
if (!$PARAM_NOUI) {

View File

@@ -19,7 +19,7 @@ function Invoke-WPFInstall {
return
}
$ManagerPreference = $sync["ManagerPreference"]
$ManagerPreference = $sync.preferences.packagemanager
$handle = Invoke-WPFRunspace -ParameterList @(("PackagesToInstall", $PackagesToInstall),("ManagerPreference", $ManagerPreference)) -ScriptBlock {
param($PackagesToInstall, $ManagerPreference)

View File

@@ -32,17 +32,17 @@ function Invoke-WPFPresets {
$CheckBoxesToCheck = $sync.configs.preset.$preset
}
# clear out the filtered pattern
if (!$preset) {
switch ($checkboxfilterpattern) {
"WPFTweak*" { $sync.selectedTweaks = [System.Collections.Generic.List[string]]::new() }
"WPFInstall*" { $sync.selectedApps = [System.Collections.Generic.List[string]]::new() }
"WPFeatures" { $sync.selectedFeatures = [System.Collections.Generic.List[string]]::new() }
"WPFToggle" { $sync.selectedToggles = [System.Collections.Generic.List[string]]::new() }
default {}
}
# clear out the filtered pattern so applying a preset replaces the current
# state rather than merging with it
switch ($checkboxfilterpattern) {
"WPFTweak*" { $sync.selectedTweaks = [System.Collections.Generic.List[string]]::new() }
"WPFInstall*" { $sync.selectedApps = [System.Collections.Generic.List[string]]::new() }
"WPFeatures" { $sync.selectedFeatures = [System.Collections.Generic.List[string]]::new() }
"WPFToggle" { $sync.selectedToggles = [System.Collections.Generic.List[string]]::new() }
default {}
}
else {
if ($preset) {
Update-WinUtilSelections -flatJson $CheckBoxesToCheck
}

View File

@@ -38,7 +38,7 @@ function Invoke-WPFSelectedCheckboxesUpdate{
if (!$sync.selectedApps.Contains($appKey)) {
$sync.selectedApps.Add($appKey)
# The List type needs to be specified again, because otherwise Sort-Object will convert the list to a string if there is only a single entry
[System.Collections.Generic.List[pscustomobject]]$sync.selectedApps = $sync.SelectedApps | Sort-Object
[System.Collections.Generic.List[string]]$sync.selectedApps = $sync.SelectedApps | Sort-Object
}
}
else{

View File

@@ -30,7 +30,7 @@ function Invoke-WPFUnInstall {
if($confirm -eq "No") {return}
$ManagerPreference = $sync["ManagerPreference"]
$ManagerPreference = $sync.preferences.packagemanager
Invoke-WPFRunspace -ParameterList @(("PackagesToUninstall", $PackagesToUninstall),("ManagerPreference", $ManagerPreference)) -ScriptBlock {
param($PackagesToUninstall, $ManagerPreference)

View File

@@ -66,7 +66,7 @@ $sync.configs.applications.PSObject.Properties | ForEach-Object {
$sync.configs.applicationsHashtable[$_.Name] = $_.Value
}
Set-PackageManagerPreference
Set-Preferences
if ($PARAM_NOUI) {
Show-CTTLogo
@@ -154,7 +154,7 @@ $sync.Form.Add_Loaded({
})
})
Invoke-WinutilThemeChange -init $true
Invoke-WinutilThemeChange -theme $sync.preferences.theme
# Now call the function with the final merged config
@@ -177,10 +177,16 @@ Invoke-WPFUIElements -configVariable $sync.configs.feature -targetGridName "feat
$xaml.SelectNodes("//*[@Name]") | ForEach-Object {$sync["$("$($psitem.Name)")"] = $sync["Form"].FindName($psitem.Name)}
#Persist Package Manager preference across winutil restarts
$sync.ChocoRadioButton.Add_Checked({Set-PackageManagerPreference Choco})
$sync.WingetRadioButton.Add_Checked({Set-PackageManagerPreference Winget})
$sync.ChocoRadioButton.Add_Checked({
$sync.preferences.packagemanager = [PackageManagers]::Choco
Set-Preferences -save
})
$sync.WingetRadioButton.Add_Checked({
$sync.preferences.packagemanager = [PackageManagers]::Winget
Set-Preferences -save
})
switch ($sync["ManagerPreference"]) {
switch ($sync.preferences.packagemanager) {
"Choco" {$sync.ChocoRadioButton.IsChecked = $true; break}
"Winget" {$sync.WingetRadioButton.IsChecked = $true; break}
}
@@ -534,6 +540,10 @@ $sync["FontScalingApplyButton"].Add_Click({
# ── Win11ISO Tab button handlers ──────────────────────────────────────────────
$sync["WPFTab5BT"].Add_Click({
$sync["Form"].Dispatcher.BeginInvoke([System.Windows.Threading.DispatcherPriority]::Background, [action]{ Invoke-WinUtilISOCheckExistingWork }) | Out-Null
})
$sync["WPFWin11ISOBrowseButton"].Add_Click({
Write-Debug "WPFWin11ISOBrowseButton clicked"
Invoke-WinUtilISOBrowse

View File

@@ -27,25 +27,6 @@ if ($Noui) {
$PARAM_NOUI = $true
}
# Load DLLs
Add-Type -AssemblyName PresentationFramework
Add-Type -AssemblyName System.Windows.Forms
# Variable to sync between runspaces
$sync = [Hashtable]::Synchronized(@{})
$sync.PSScriptRoot = $PSScriptRoot
$sync.version = "#{replaceme}"
$sync.configs = @{}
$sync.Buttons = [System.Collections.Generic.List[PSObject]]::new()
$sync.ProcessRunning = $false
$sync.selectedApps = [System.Collections.Generic.List[string]]::new()
$sync.selectedTweaks = [System.Collections.Generic.List[string]]::new()
$sync.selectedToggles = [System.Collections.Generic.List[string]]::new()
$sync.selectedFeatures = [System.Collections.Generic.List[string]]::new()
$sync.currentTab = "Install"
$sync.selectedAppsStackPanel
$sync.selectedAppsPopup
if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) {
Write-Output "Winutil needs to be run as Administrator. Attempting to relaunch."
@@ -79,6 +60,26 @@ if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]:
break
}
# Load DLLs
Add-Type -AssemblyName PresentationFramework
Add-Type -AssemblyName System.Windows.Forms
# Variable to sync between runspaces
$sync = [Hashtable]::Synchronized(@{})
$sync.PSScriptRoot = $PSScriptRoot
$sync.version = "#{replaceme}"
$sync.configs = @{}
$sync.Buttons = [System.Collections.Generic.List[PSObject]]::new()
$sync.preferences = @{}
$sync.ProcessRunning = $false
$sync.selectedApps = [System.Collections.Generic.List[string]]::new()
$sync.selectedTweaks = [System.Collections.Generic.List[string]]::new()
$sync.selectedToggles = [System.Collections.Generic.List[string]]::new()
$sync.selectedFeatures = [System.Collections.Generic.List[string]]::new()
$sync.currentTab = "Install"
$sync.selectedAppsStackPanel
$sync.selectedAppsPopup
$dateTime = Get-Date -Format "yyyy-MM-dd_HH-mm-ss"
# Set the path for the winutil directory

View File

@@ -7,7 +7,7 @@
<UserData>
<ProductKey>
<Key>00000-00000-00000-00000-00000</Key>
<WillShowUI>Always</WillShowUI>
<WillShowUI>Never</WillShowUI>
</ProductKey>
<AcceptEula>true</AcceptEula>
</UserData>
@@ -449,8 +449,17 @@ $scripts = @(
) -Force -ErrorAction 'SilentlyContinue' -Verbose;
};
{
reg.exe delete "HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU" /v NoAutoUpdate /f;
reg.exe delete "HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate" /v DisableWindowsUpdateAccess /f;
reg.exe delete "HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU" /v NoAutoUpdate /f;
reg.exe delete "HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU" /v AUOptions /f;
reg.exe delete "HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU" /v UseWUServer /f;
reg.exe delete "HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate" /v DisableWindowsUpdateAccess /f;
reg.exe delete "HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate" /v WUServer /f;
reg.exe delete "HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate" /v WUStatusServer /f;
reg.exe delete "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\DeliveryOptimization\Config" /v DODownloadMode /f;
reg.exe add "HKLM\SYSTEM\CurrentControlSet\Services\BITS" /v Start /t REG_DWORD /d 3 /f;
reg.exe add "HKLM\SYSTEM\CurrentControlSet\Services\wuauserv" /v Start /t REG_DWORD /d 3 /f;
reg.exe add "HKLM\SYSTEM\CurrentControlSet\Services\UsoSvc" /v Start /t REG_DWORD /d 2 /f;
reg.exe add "HKLM\SYSTEM\CurrentControlSet\Services\WaaSMedicSvc" /v Start /t REG_DWORD /d 3 /f;
};
{
$recallFeature = Get-WindowsOptionalFeature -Online -ErrorAction SilentlyContinue | Where-Object { $_.State -eq 'Enabled' -and $_.FeatureName -like 'Recall' };

View File

@@ -273,22 +273,43 @@
<Style TargetType="ComboBox">
<Setter Property="Foreground" Value="{DynamicResource ComboBoxForegroundColor}" />
<Setter Property="Background" Value="{DynamicResource ComboBoxBackgroundColor}" />
<Setter Property="MinWidth" Value="{DynamicResource ButtonWidth}" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ComboBox">
<Grid>
<ToggleButton x:Name="ToggleButton"
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding Background}"
BorderThickness="0"
IsChecked="{Binding IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}"
ClickMode="Press">
<TextBlock Text="{TemplateBinding SelectionBoxItem}"
Foreground="{TemplateBinding Foreground}"
Background="Transparent"
HorizontalAlignment="Center" VerticalAlignment="Center" Margin="2"
/>
</ToggleButton>
<Border x:Name="OuterBorder"
BorderBrush="{DynamicResource BorderColor}"
BorderThickness="1"
CornerRadius="{DynamicResource ButtonCornerRadius}"
Background="{TemplateBinding Background}">
<ToggleButton x:Name="ToggleButton"
Background="Transparent"
BorderThickness="0"
IsChecked="{Binding IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}"
ClickMode="Press">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0"
Text="{TemplateBinding SelectionBoxItem}"
Foreground="{TemplateBinding Foreground}"
Background="Transparent"
HorizontalAlignment="Left" VerticalAlignment="Center"
Margin="6,3,2,3"/>
<Path Grid.Column="1"
Data="M 0,0 L 8,0 L 4,5 Z"
Fill="{TemplateBinding Foreground}"
Width="8" Height="5"
VerticalAlignment="Center"
HorizontalAlignment="Center"
Stretch="Uniform"
Margin="4,0,6,0"/>
</Grid>
</ToggleButton>
</Border>
<Popup x:Name="Popup"
IsOpen="{TemplateBinding IsDropDownOpen}"
Placement="Bottom"
@@ -297,11 +318,11 @@
PopupAnimation="Slide">
<Border x:Name="DropDownBorder"
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding Foreground}"
BorderBrush="{DynamicResource BorderColor}"
BorderThickness="1"
CornerRadius="4">
<ScrollViewer>
<ItemsPresenter HorizontalAlignment="Center" VerticalAlignment="Center" Margin="2"/>
<ItemsPresenter HorizontalAlignment="Left" VerticalAlignment="Center" Margin="4,2"/>
</ScrollViewer>
</Border>
</Popup>
@@ -1340,21 +1361,17 @@
</ScrollViewer>
</TabItem>
<TabItem Header="Win11ISO" Visibility="Collapsed" Name="WPFTab5">
<ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Disabled" Margin="{DynamicResource TabContentMargin}">
<Grid Background="Transparent" Name="Win11ISOPanel">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/> <!-- Step 1: Select ISO -->
<RowDefinition Height="Auto"/> <!-- Step 2: Mount & Verify -->
<RowDefinition Height="Auto"/> <!-- Step 3: Modify install.wim -->
<RowDefinition Height="Auto"/> <!-- Step 4: Output Options -->
<RowDefinition Height="Auto"/> <!-- Log / Status -->
</Grid.RowDefinitions>
<Grid Name="Win11ISOPanel" Margin="{DynamicResource TabContentMargin}" Background="Transparent">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/> <!-- Steps 1-4 -->
<RowDefinition Height="*"/> <!-- Log / Status -->
</Grid.RowDefinitions>
<!-- ═══════════════════════════════════════════════════════════ -->
<!-- STEP 1 : Select Windows 11 ISO -->
<!-- ═══════════════════════════════════════════════════════════ -->
<Border Grid.Row="0" Name="WPFWin11ISOSelectSection" Style="{StaticResource BorderStyle}">
<Grid Margin="5">
<!-- Steps 1-4 -->
<StackPanel Grid.Row="0">
<!-- ─── STEP 1 : Select Windows 11 ISO ─────────────── -->
<Grid Name="WPFWin11ISOSelectSection" Margin="5" HorizontalAlignment="Left" MinWidth="{DynamicResource ButtonWidth}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
@@ -1441,16 +1458,12 @@
</StackPanel>
</Border>
</Grid>
</Border>
<!-- ═══════════════════════════════════════════════════════════ -->
<!-- STEP 2 : Mount & Verify ISO -->
<!-- ═══════════════════════════════════════════════════════════ -->
<Border Grid.Row="1"
Name="WPFWin11ISOMountSection"
Style="{StaticResource BorderStyle}"
Visibility="Collapsed">
<Grid Margin="5">
<!-- ─── STEP 2 : Mount & Verify ISO ──────────────────── -->
<Grid Name="WPFWin11ISOMountSection"
Margin="5"
Visibility="Collapsed"
HorizontalAlignment="Left" MinWidth="{DynamicResource ButtonWidth}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
@@ -1472,6 +1485,13 @@
HorizontalAlignment="Left"
Width="Auto" Padding="12,0"
Height="{DynamicResource ButtonHeight}"/>
<CheckBox Name="WPFWin11ISOInjectDrivers"
Content="Inject current system drivers"
FontSize="{DynamicResource FontSize}"
Foreground="{DynamicResource MainForegroundColor}"
IsChecked="False"
Margin="0,8,0,0"
ToolTip="Exports all drivers from this machine and injects them into install.wim and boot.wim. Recommended for systems with unsupported NVMe or network controllers."/>
</StackPanel>
<!-- Verification results panel -->
@@ -1500,22 +1520,17 @@
FontSize="{DynamicResource FontSize}"
Foreground="{DynamicResource MainForegroundColor}"
Background="{DynamicResource MainBackgroundColor}"
BorderBrush="{DynamicResource BorderColor}"
HorizontalAlignment="Stretch"
HorizontalAlignment="Left"
Margin="0,0,0,0"/>
</StackPanel>
</Border>
</Grid>
</Border>
<!-- ═══════════════════════════════════════════════════════════ -->
<!-- STEP 3 : Modify install.wim -->
<!-- ═══════════════════════════════════════════════════════════ -->
<Border Grid.Row="2"
Name="WPFWin11ISOModifySection"
Style="{StaticResource BorderStyle}"
Visibility="Collapsed">
<StackPanel Margin="5">
<!-- ─── STEP 3 : Modify install.wim ───────────────────── -->
<StackPanel Name="WPFWin11ISOModifySection"
Margin="5"
Visibility="Collapsed"
HorizontalAlignment="Left" MinWidth="{DynamicResource ButtonWidth}">
<TextBlock FontSize="{DynamicResource FontSize}" FontWeight="Bold"
Foreground="{DynamicResource MainForegroundColor}" Margin="0,0,0,8">
Step 3 - Modify install.wim
@@ -1534,15 +1549,12 @@
Width="Auto" Padding="12,0"
Height="{DynamicResource ButtonHeight}"/>
</StackPanel>
</Border>
<!-- ═══════════════════════════════════════════════════════════ -->
<!-- STEP 4 : Output Options -->
<!-- ═══════════════════════════════════════════════════════════ -->
<Border Grid.Row="3"
Name="WPFWin11ISOOutputSection"
Style="{StaticResource BorderStyle}">
<StackPanel Margin="5">
<!-- ─── STEP 4 : Output Options ───────────────────────── -->
<StackPanel Name="WPFWin11ISOOutputSection"
Margin="5"
Visibility="Collapsed"
HorizontalAlignment="Left" MinWidth="{DynamicResource ButtonWidth}">
<!-- Header row: title + Clean & Reset button -->
<Grid Margin="0,0,0,12">
<Grid.ColumnDefinitions>
@@ -1579,7 +1591,7 @@
Height="{DynamicResource ButtonHeight}"/>
<Button Grid.Column="2"
Name="WPFWin11ISOChooseUSBButton"
Content="Write Directly to a USB Drive (erases drive)"
Content="Write Directly to a USB Drive (ERASES DRIVE)"
Foreground="OrangeRed"
HorizontalAlignment="Stretch"
Width="Auto" Padding="12,0"
@@ -1613,7 +1625,7 @@
Margin="0,0,6,0"/>
<Button Grid.Column="1"
Name="WPFWin11ISORefreshUSBButton"
Content="Refresh"
Content="Refresh"
Width="Auto" Padding="8,0"
Height="{DynamicResource ButtonHeight}"/>
</Grid>
@@ -1626,34 +1638,37 @@
Margin="0,0,0,10"/>
</StackPanel>
</Border>
</StackPanel>
</Border>
<!-- ═══════════════════════════════════════════════════════════ -->
<!-- Status / Log Output -->
<!-- ═══════════════════════════════════════════════════════════ -->
<Border Grid.Row="4" Style="{StaticResource BorderStyle}">
<StackPanel>
<TextBlock FontSize="{DynamicResource FontSize}" FontWeight="Bold"
Foreground="{DynamicResource MainForegroundColor}" Margin="0,0,0,6">
Status Log
</TextBlock>
<TextBox Name="WPFWin11ISOStatusLog"
IsReadOnly="True"
TextWrapping="Wrap"
VerticalScrollBarVisibility="Auto"
Height="140" Padding="6"
Background="{DynamicResource MainBackgroundColor}"
Foreground="{DynamicResource MainForegroundColor}"
BorderBrush="{DynamicResource BorderColor}"
BorderThickness="1"
Text="Ready. Please select a Windows 11 ISO to begin."/>
</StackPanel>
</Border>
</StackPanel>
<!-- Status Log (fills remaining height) -->
<Grid Grid.Row="1" Margin="5">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<TextBlock Grid.Row="0"
FontSize="{DynamicResource FontSize}" FontWeight="Bold"
Foreground="{DynamicResource MainForegroundColor}"
Margin="0,0,0,4">
Status Log
</TextBlock>
<TextBox Grid.Row="1"
Name="WPFWin11ISOStatusLog"
IsReadOnly="True"
TextWrapping="Wrap"
VerticalScrollBarVisibility="Visible"
VerticalAlignment="Stretch"
Padding="6"
Background="{DynamicResource MainBackgroundColor}"
Foreground="{DynamicResource MainForegroundColor}"
BorderBrush="{DynamicResource BorderColor}"
BorderThickness="1"
Text="Ready. Please select a Windows 11 ISO to begin."/>
</Grid>
</ScrollViewer>
</Grid>
</TabItem>
</TabControl>
</Grid>