Compare commits

...
757 Commits
Author SHA1 Message Date
Omar 48885d7c1e docs(win11creator): correct architecture and guide (#5106)
* docs(win11creator): correct architecture and guide

Update documentation to match actual Win11 Creator implementation:

- Clarify customizations run at first logon via autounattend.xml rather
  than offline WIM modification
- Correct removed bloat AppX count from 40+ to 19 packages
- Update USB partition layout to single FAT32 partition with WIM split
- Clarify OneDrive uninstall timing during first logon
- Document missing helpers including USB functions and oscdimg helpers
- Document edition pinning, $OEM$ fallback scripts, and WIM metadata validation
- Update logging location and remove offline registry tweak wording

* docs(win11creator): clarify timing and media limits
2026-09-28 13:08:11 -05:00
Omar abcbc23144 fix: inject Setup storage into boot.wim (#5102)
$WinpeDriver$ matched INF names, so RST companions reached Setup. Add SCSIAdapter and HDC packages to boot.wim index 2 with DISM.
2026-09-28 12:35:50 -05:00
dependabot[bot] 311fde6f31 chore(deps): bump astral-sh/setup-uv from 10.1.0 to 10.2.0 (#5120)
Bumps [astral-sh/setup-uv](https://github.com/astral-sh/setup-uv) from 10.1.0 to 10.2.0.
- [Release notes](https://github.com/astral-sh/setup-uv/releases)
- [Commits](https://github.com/astral-sh/setup-uv/compare/v10.1.0...v10.2.0)

---
updated-dependencies:
- dependency-name: astral-sh/setup-uv
  dependency-version: 10.2.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-09-28 12:31:43 -05:00
Chris Titus ad81e0a7af Update sponsors in README (#5116) 2026-09-26 10:32:30 -05:00
KEERTHIVASAN KandChris Titus 8e3998d9fd feat(dns): Add real-time DNS speed benchmark and 'Fastest' auto-selection option (#4935)
* feat(dns): Add real-time DNS speed benchmark and 'Fastest' auto-selection option

* fix(dns): Address CodeRabbit & Codex PR review feedback

* fix(ci): Remove .biomeignore to keep repository root clean

* Fix Fastest DNS eligibility and failed probe handling

---------

Co-authored-by: Chris Titus <contact@christitus.com>
2026-09-19 18:16:16 -05:00
brxndon f65d2631a0 Fix CurseForge entry naming in applications.json (#5072)
* Fix CurseForge entry naming in applications.json

* Remove stray null file

* Remove choco fallback for CurseForge, use WinGet only
2026-09-19 17:27:43 -05:00
Omar 5f39d3b42d fix(tweaks): rename lock screen key to WPFToggle prefix (#5061)
Toggles are identified by name prefix, not by the Type field, so the
WPFTweaks-prefixed key made Reset-WPFCheckBoxes treat this entry as an
ordinary checkbox and force it off on every tab build, deleting the
NoLockScreen value it had just set.

Closes #5060
2026-09-19 17:23:20 -05:00
Omar 448543870a fix(win11creator): drop extension-class driver filter (#5058) 2026-09-19 17:22:39 -05:00
Omar 91a4f62068 chore(dns): remove Mullvad DNS providers (#5057)
* chore(dns): remove Mullvad DNS providers

Mullvad is shutting down its public encrypted DNS servers and sponsoring
Quad9 instead, so the six Mullvad profiles would resolve nothing once the
servers go dark.

Drops the Mullvad entries from config/dns.json, trims them out of the
WPFchangedns ComboItems, and removes the matching bullets and the
DoH-fallback note from the tweaks guide. Quad9 already ships as a provider,
so users have a documented destination.

The generated code-reference page for this tweak is left alone; the
pre-release workflow regenerates it from config/tweaks.json.

* test(dns): use generic fixtures for DoH-only providers

The DoH-only and SecondaryDohTemplate paths in Set-WinUtilDNS were covered
by fixtures named after Mullvad and carrying its real resolver addresses.
Those code paths still exist, so the coverage stays; only the naming was
tied to a provider WinUtil no longer ships.

Renames the fixtures to DohOnlyProvider and DohOnlyNoSecondary and swaps in
RFC 5737 / RFC 3849 documentation addresses and example.com templates, so
the tests no longer read as if they exercise a shipped provider.
2026-09-19 17:21:27 -05:00
dependabot[bot]andtitus 2a73455872 chore(deps): bump sharp from 0.35.3 to 0.35.4 in /docs (#5077)
* chore(deps): bump sharp from 0.35.3 to 0.35.4 in /docs

Bumps [sharp](https://github.com/lovell/sharp) from 0.35.3 to 0.35.4.
- [Release notes](https://github.com/lovell/sharp/releases)
- [Commits](https://github.com/lovell/sharp/compare/v0.35.3...v0.35.4)

---
updated-dependencies:
- dependency-name: sharp
  dependency-version: 0.35.4
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>

* Normalize package manifest line endings

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: titus <contact@christitus.com>
2026-09-19 17:18:57 -05:00
dependabot[bot]andtitus 52ebc931fd chore(deps): bump astro from 7.1.6 to 7.3.2 in /docs (#5075)
* chore(deps): bump astro from 7.1.6 to 7.3.2 in /docs

Bumps [astro](https://github.com/withastro/astro/tree/HEAD/packages/astro) from 7.1.6 to 7.3.2.
- [Release notes](https://github.com/withastro/astro/releases)
- [Changelog](https://github.com/withastro/astro/blob/main/packages/astro/CHANGELOG.md)
- [Commits](https://github.com/withastro/astro/commits/astro@7.3.2/packages/astro)

---
updated-dependencies:
- dependency-name: astro
  dependency-version: 7.3.2
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>

* Normalize package manifest line endings

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: titus <contact@christitus.com>
2026-09-19 17:14:04 -05:00
KarimandChris Titus 7aff652d4c Add SyncTrayzor (#5065)
* Add SyncTrayzor

* Fix SyncTrayzor application JSON syntax

---------

Co-authored-by: Chris Titus <contact@christitus.com>
2026-09-19 17:09:27 -05:00
Karim be394d2ce0 Add AB Download Manager (#5066) 2026-09-19 17:00:26 -05:00
dependabot[bot] b4181bd008 chore(deps): bump nanoid from 3.3.16 to 3.3.19 in /docs (#5103)
Bumps [nanoid](https://github.com/ai/nanoid) from 3.3.16 to 3.3.19.
- [Release notes](https://github.com/ai/nanoid/releases)
- [Changelog](https://github.com/ai/nanoid/blob/main/CHANGELOG.md)
- [Commits](https://github.com/ai/nanoid/compare/3.3.16...3.3.19)

---
updated-dependencies:
- dependency-name: nanoid
  dependency-version: 3.3.19
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-09-19 16:57:56 -05:00
dependabot[bot] da7354bfc0 chore(deps): bump svgo from 4.0.2 to 4.1.0 in /docs (#5074)
Bumps [svgo](https://github.com/svg/svgo) from 4.0.2 to 4.1.0.
- [Release notes](https://github.com/svg/svgo/releases)
- [Commits](https://github.com/svg/svgo/compare/v4.0.2...v4.1.0)

---
updated-dependencies:
- dependency-name: svgo
  dependency-version: 4.1.0
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-09-19 16:56:13 -05:00
dependabot[bot] 9de91c3999 chore(deps): bump devalue from 5.9.0 to 5.9.2 in /docs (#5099)
Bumps [devalue](https://github.com/sveltejs/devalue) from 5.9.0 to 5.9.2.
- [Release notes](https://github.com/sveltejs/devalue/releases)
- [Changelog](https://github.com/sveltejs/devalue/blob/main/CHANGELOG.md)
- [Commits](https://github.com/sveltejs/devalue/compare/v5.9.0...v5.9.2)

---
updated-dependencies:
- dependency-name: devalue
  dependency-version: 5.9.2
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-09-19 16:55:57 -05:00
Karim c2d65b6f99 Add Syncthing (#5064) 2026-09-19 16:55:52 -05:00
dependabot[bot] 700725a878 chore(deps): bump astral-sh/setup-uv from 9.0.0 to 10.1.0 (#5085)
Bumps [astral-sh/setup-uv](https://github.com/astral-sh/setup-uv) from 9.0.0 to 10.1.0.
- [Release notes](https://github.com/astral-sh/setup-uv/releases)
- [Commits](https://github.com/astral-sh/setup-uv/compare/v9.0.0...v10.1.0)

---
updated-dependencies:
- dependency-name: astral-sh/setup-uv
  dependency-version: 10.1.0
  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-09-19 16:54:18 -05:00
MyDrift f9139c75ff Rework the Win11 Creator tab into a three step wizard (#4925)
* Rework the Win11 Creator tab into a three step wizard

- Turn the stacked sections into pages you can navigate between
- Move the edition picker and driver option to the modify step
- Show a working page while mounting and modifying run
- Show what the run changes and a finished panel with the output path
- Put the status log in its own card next to the steps
- Rename Clean & Reset to Start Over and move it below the actions

* Follow the existing colours on the Win11 Creator tab

- Take button text and icon colour from the button they sit in
- Stop the implicit TextBlock style painting a label background on buttons
- Colour step headers from the tab item state
- Use the label accent for headings and field labels like the other tabs

* Cut repeated markup on the Win11 Creator tab

- Render button icon and label from a ContentTemplate, glyph goes in Tag
- Render the step header from a HeaderTemplate the same way
- Move the page scroll wrapper into the tab control template
- Derive the text styles from one another instead of repeating setters

* fix: tidy the dropdown and stop the spinner stuttering

- combo box items painted their own background while the popup painted
  another, so the list read as loose labels on a mismatched sheet; items are
  transparent now and the popup carries the colour
- stretch the item presenter so a highlight spans the popup instead of just
  the text, and bind the popup width to the closed box
- cache the working page's spinner: it animates a rotation on a TextBlock,
  which re-rasterises the glyph every frame on the interface thread
- run that animation only while the page is visible; it was started on Loaded
  and never stopped, so it kept spinning after the step was done

* Stop the Win11 Creator status log rendering justified

The shared TextBox style sets HorizontalContentAlignment to Stretch, which
WPF reads as TextAlignment.Justify. Every other box in WinUtil is single
line, so the status log is the only place it shows, and there it stretched
each wrapped line to the full width with gaps between the words.

Left-aligns it, and while the log is being read as a log rather than as
prose: monospace from a new Win11LogFontFamily theme key so the timestamps
form a column and a wrapped line is visibly not a new entry, and no effect,
since the shared style's drop shadow has neither border nor background to
sit under on this control and smeared the glyphs instead.

* Show the working page for export, USB write and Start Over

Only mount and modify moved to the working page. Saving an ISO, writing a
USB drive and Start Over all ran with the finished output page still on
screen, so the three longest operations in the tab were the ones that looked
like nothing was happening.

All three now open the working page for their duration and return to the
page they belong on: the output step for the two that produce media, the ISO
picker for Start Over, which has just deleted the working directory. Failures
leave the working page before their message box rather than putting a modal
over a spinner, and a finally guard covers cancellation, which skips catch.

Start Over spins the icon backwards. Its work undoes rather than produces,
and reading that off the animation is quicker than reading the label.

* cut comments

Leaves the four that answer a "why is it written this way" a reader cannot
get from the code: the shared TextBox style's justify and drop shadow, the
spinner tag being set before the page is shown, going back to Select rather
than Modify after a failed modification, and the finally guards existing for
cancellation rather than for failure.

* cut changes that only reword

Reverts three edits that changed wording without changing meaning, and drops
the comment on the failed-modification branch.

* cut comments that narrate the code

* address coderabbit review

Hyphenate three-step, and let the chevrons grow past their minimum instead of
pinning a size the glyph could outgrow.

* dismount a replaced ISO and name the USB disk when done

Picking a second ISO after verifying one left the first attached: the mount job
clears Win11ISOImagePath, which is the only handle cleanup has to it. Dismount
it in the job, off the interface thread, before that reset.

The done panel now names the disk it wrote, the way the ISO branch names its file.

* keep the wizard inside the card at the minimum window width

The step column and the chevron grid's middle column were both pinned at 620,
while the left card is about 485px at the 800px minimum. The pages do not
scroll sideways, so controls past the card edge were unreachable.

Both are now capped rather than fixed, and the removed WPFWin11ISOArchLabel was
never assigned by anything.

* stop a replacement mount when the old ISO will not dismount

The warn-and-continue path cleared Win11ISOImagePath anyway, which strands the
old mount for the rest of the session - the leak the dismount was added to
close. It now reports and throws instead, from inside the try so the finally
still re-enables the browse and mount buttons.

* cut comments that narrate the code

* drop the OneDrive sync claim from the modify step list

The post-install script sets DisableFileSyncNGSC=1, but it is prepended to
FirstLogon.ps1, whose own body then sets the same value back to 0. The policy
never survives, so the bullet was promising something the run does not do.
Replaced with search box suggestions, which it does do.
2026-09-19 16:50:51 -05:00
Chris Titus 9ac45d6c31 Update sponsors in README (#5097) 2026-09-17 10:32:50 -05:00
Chris Titus 2260df6365 Update sponsors in README (#5092) 2026-09-15 10:32:29 -05:00
dependabot[bot] fc60cbde09 chore(deps): bump js-yaml from 4.3.1 to 4.3.2 in /docs (#5083)
Bumps [js-yaml](https://github.com/nodeca/js-yaml) from 4.3.1 to 4.3.2.
- [Changelog](https://github.com/nodeca/js-yaml/blob/4.3.2/CHANGELOG.md)
- [Commits](https://github.com/nodeca/js-yaml/compare/4.3.1...4.3.2)

---
updated-dependencies:
- dependency-name: js-yaml
  dependency-version: 4.3.2
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-09-13 21:59:32 -05:00
Chris Titus dbe1c365f5 Update sponsors in README (#5076) 2026-09-10 10:32:50 -05:00
Chris Titus a0d3c719a6 Improve UI startup after runspace overhaul (#5056)
* perf: keep UI startup responsive

* test: make favicon checks runner-safe

* fix: qualify favicon visibility state

* test: isolate favicon visibility fixture

* fix: enforce total favicon deadline

* fix: address favicon review feedback

* fix: recognize disabled SSH firewall rule

* perf: restore favicon download throughput

* docs: allow public PR review uploads

* perf: restore overlapping favicon loading
2026-09-07 11:33:39 -05:00
MyDriftandChris Titus 283b9954f1 Consolidate background work into one job layer (#5002)
* Add a job layer for long running work

- Start-WinUtilJob owns busy state, progress, taskbar, logging and errors
- Write-WinUtilJobProgress reports from a job without UI checks in the body
- Post UI updates instead of waiting on the dispatcher for each one
- Move Invoke-WPFInstall onto it as the first workflow

* Move the remaining app and feature workflows onto the job layer

- Uninstall, AppX install, Features, OOSU and installed detection
- Drop the per workflow busy flag, progress, taskbar and error handling
- Rework their tests to check the job and its body instead of runspace internals

* Run the WinUtil interface on its own thread

main.ps1 now only manages the run: it creates a dedicated STA runspace for
the window, waits for it, and reports whatever the interface thread failed
with. The interface itself moved into Start-WinUtilUserInterface, so the
thread that owns the window does nothing but paint and dispatch.

- New-WinUtilSessionState builds one starting point for both the interface
  runspace and the worker pool, carrying $sync, the compiled script globals
  and every WinUtil function. The pool previously copied only functions
  matching winutil|WPF, which is not enough for a runspace that has to build
  a tab.
- Invoke-WPFUIThread hands work to the interface runspace as body text plus
  parameters instead of marshalling a scriptblock. A scriptblock keeps the
  session state it was written in; running one across runspaces loses the
  caller's variables on an async post and costs roughly twenty times as much
  per command, which turned a checkbox refresh into a multi-minute freeze.
- Both helpers stop at a shut-down dispatcher, so a job that outlives the
  window finishes quietly.

* Move every long workflow onto the job layer

Tweaks, undo, AppX removal and the five Win11 Creator workflows now go
through Start-WinUtilJob like the install workflows already did. That
removes the five hand-built STA runspaces and the function-definition
injection the ISO code needed to reach its own helpers.

- One busy flag: $sync.ActiveJob replaces ProcessRunning and
  Win11ISOProcessRunning, and only the job layer writes it.
- Write-WinUtilJobProgress -Hide absorbs the last use of
  Set-WinUtilTweaksProgressIndicator, so the progress bar and taskbar item
  have a single owner. The helper is gone.
- Show-WinUtilMessage marshals onto the interface thread and logs the
  prompt, so a job body can ask a question without knowing which thread it
  is on. The raw MessageBox calls in the ISO workflows are gone.
- Win11 Creator status-log lines also go to the session log, and the
  per-workflow Log/SetProgress helpers are gone.
- Get-WinUtilOscdimgPath and Get-WinUtilFreeDriveLetter are now real
  functions rather than nested ones, so the pool can resolve them.

* Log from every WinUtil thread into one session file

Start-Transcript only records the runspace it was started on, so every line
a worker or the interface logged was being dropped. Write-WinUtilLog now
appends to the session log directly, serialized with a named mutex, and the
console transcript gets its own file in the same logs directory.

* Document the threading model and the job layer

* Stop Invoke-WPFUIThread leaking the body's output to its caller

The helper returned whatever the body produced, including a bare $null. Callers written
against the old void signature then returned an array instead of their own value:
Get-WinUtilSelectedPackages handed back @($null, $split), both package lists read as empty,
and Install and Uninstall reported success without installing or removing anything.

Output is now suppressed unless -PassThru is asked for, which only Show-WinUtilMessage needs.
Covered by tests on both the helper and the package split.

* Put every button that changes the system on the job layer

Invoke-WPFButton now classifies the press instead of running it. Anything that changes the
system gets a job; tab switches, selection helpers, window chrome and the WPFPanel* applet
launchers stay on the interface thread. Updates, the Ultimate Performance plan, the Fixes
buttons, OpenSSH Server, the system repair scan and the AppX query previously ran inline,
which froze the window, produced no progress and interleaved their output with a running job.

The job layer also owns the console banner now. Write-WinUtilJobBanner draws it once, so the
eleven hand-drawn === boxes are gone and every operation announces its start, not only its end.

- The job is named after what the button says, read from the config or the control itself,
  so there is no second list of labels to keep in step.
- Show-WinUtilMessage replaces the last raw MessageBox calls, which could not have worked
  from a worker thread.
- Write-WinUtilJobProgress replaces the last direct Set-WinUtilTaskbaritem calls.

* Document button routing and the job banner

* Read function bodies from the FunctionInfo instead of the function provider

Building the session state is on the path to first paint, and going through
function:\ for every function cost about as much as the whole interface
runspace saved. Time to first window is back level with upstream.

* Render the taskbar overlays after first paint

The logo overlay render costs about 55ms and nothing can see it until the window
is up, so it no longer sits between the interface being built and being shown.
Both the logo and the status overlays are now rendered from the same deferred
call once the window has painted.

* Make a failed package fail the job

Both package helpers ran the manager and moved on regardless of its exit code, so
a run in which nothing installed still reported success with a green checkmark.

They now emit a result per package, classified from the exit code: succeeded,
skipped for WinGet telling us there was nothing to do, or failed. The workflow
collects them and Complete-WinUtilPackageRun prints the summary and throws when
anything failed, which is what puts the job into its failed state.

* Time every pipeline step and report the slowest ones

Measure-WinUtilStep wraps a step, passes its output through untouched, logs how
long it took and keeps the record. Every job and the interface build end with a
summary ranking the slowest steps and their share of the total, so "which tweak
is taking forever" and "what is holding up startup" are answerable from the log
instead of by guessing.

Wired into the interface build, each tweak, each undo, each feature, and each
package. Jobs also log their own wall-clock duration, and the interface logs the
moment it can first service input.

* Render the taskbar overlays on the main thread's runspace

The overlays need an STA thread, which the worker pool is not, so they get one of
their own. Starting it from the interface thread cost more than it saved: opening
the runspace took 154-221ms there against 88ms of rendering. Starting it from the
main thread instead is free, because that thread does nothing but wait for the
window, and the render then overlaps the interface build.

Measured over three runs each, time from start to the interface accepting input:
2071/2105ms before, 2105/2131/2193ms started from the interface thread,
2026/2044/2050ms started from the main thread.

Also caches the session state, which two runspaces now share, and moves the
runspace cleanup registration into its own function for the second caller.

* Cut startup to first interaction roughly in half

- wire button clicks by type name against a HashSet, not a pipeline per $sync key: 335ms to 81ms
- build no tab content before first paint; Invoke-WPFTab already builds the tab it activates
- group apps by category into Lists, not by appending to arrays
- interface built ~1460ms to ~465ms, ready for input ~2090ms to ~858ms

* Warm the unopened tabs while the interface is idle

- queue each remaining tab at ApplicationIdle priority after first paint
- one tab per queued operation so input is serviced in between
- first click on a tab no longer pays for its build

* Report failures with the context needed to act on them

- Write-WinUtilErrorRecord logs message, exception type, command, line and script stack
- used by the job layer, the button funnel, the interface dispatcher and the main thread
- route buttons to the job layer by whitelist, so chrome and popup toggles stop starting empty jobs

* Wire the Install tab controls where they are created

- ChocoRadioButton, WingetRadioButton and the install action buttons come from
  appnavigation.json, so they do not exist until the Install tab is built
- the interface build wired them anyway, which is the three null-reference errors
  reported on close since tab content moved behind first paint
- Initialize-WinUtilInstallTabControls now does it from the tab build, guarded
- offline mode disables the install buttons from there too, for the same reason
- new test fails if the interface build touches any config-generated control

* Stop losing warnings and non-terminating errors from job bodies

- a worker buffers its warning and error streams on an object nobody reads:
  Write-Warning never reached the log, Write-Error reached nothing at all
- the job layer merges both into the log, so all 30+ Write-Warning and 4
  Write-Error sites in the helpers are visible without touching each one
- the interface runspace warning stream is drained on exit too
- $sync.LoggedErrors counts error events, detail lines excluded
- a job that logged errors without throwing now finishes as "N error(s)"
  with a warning overlay instead of a green checkmark

* Drive winget through Microsoft.WinGet.Client for real progress

The winget CLI hides its progress bar as soon as its output is redirected, so a
package could only ever be reported as started and finished. The module reports
progress and returns a structured result.

- Install-WinUtilWinGetClient installs and imports the module, cached per session
- Invoke-WinUtilWinGetCommand runs a cmdlet on a nested PowerShell and polls its
  progress stream, which cannot be redirected like output or errors
- percentages map into the package's slice of the job bar: "7zip.7zip - 1.9 MB / 1.9 MB"
- outcome comes from Status and InstallerErrorCode, not an exit code
- a package already present is upgraded, not reinstalled: Install-WinGetPackage
  re-downloads and re-runs the installer even without -Force
- detection uses Get-WinGetPackage and matches on name as well as id, so apps
  installed outside winget are recognised (Brave, and every other ARP entry)
- falls back to the command line unchanged when the module cannot be installed

Verified against real winget in the eval VM, 12 checks; 545 unit tests pass.

* Show the install phase as running instead of finished

Measured what the module actually emits: 7 progress records whether the package
is 1.9 MB or 57.8 MB, only two of them download samples, and the install phase
reports 0 then 100 with nothing between. On VLC the install is 4.3s of the 9.7s.

- the download gets the first half of the package's slice, so reaching 100%
  download no longer fills the bar
- the install phase pulses the bar and counts elapsed seconds in the label,
  because neither winget nor the module exposes installer progress
- scan the whole progress collection, not just its last record: a byte sample
  can be superseded within milliseconds
- RoundedProgressBarStyle gained an indeterminate trigger; it had none

Fixes uninstall reporting a package that is not installed as a failure, which is
what UninstallError after 354ms was, and adds ExtendedErrorCode to the detail.

* Say what a winget failure actually was

The command line prints a sentence for a failure; the client module returns only
an HRESULT, so the same failure read as "COMException (0x8A15007D)". Both report
the same number, so one table serves both paths.

- Get-WinUtilWinGetErrorMessage explains the codes WinUtil hits, and gives the
  hex plus the return-code reference for anything else
- 0x8A15007D now reads: installed for a single user, cannot be removed while
  running as administrator, remove it from Settings > Apps
- unsigned HRESULTs are wrapped rather than cast, which overflowed Int32
- a shared failure reason is repeated in the thrown message
- the banner wraps at 76 columns instead of drawing a box wider than the console

* Keep the run position in the progress text during a package

- the bar itself was already whole-workflow: 0-12, 25-37, 50-62, 75-87, 100
- but the status read "A.A - 50% downloaded", dropping the (n/total) the old
  per-package messages carried
- callers pass a label, so it now reads "A.A (1/4) - 50% downloaded"

* Pulse the progress bar in place instead of filling it

- IsIndeterminate makes WPF discard Value and stretch the indicator across the
  whole track: measured 398px of a 400px track at value 40, against 159px correct
- the pulse is driven by Tag instead, so the bar keeps the progress it reached
- RemoveStoryboard on exit, because Stop left the indicator at whatever opacity
  the pulse happened to be on

* perf: cut Install tab build and keep the interface answering during warmup

- look apps up by hashtable index, not dynamic member: Install tab app area 361ms -> 91ms
- cap a render pass at 25 apps so a large category cannot stall the interface
- yield between batches when building speculative tab content
- claim a tab as initialized before building it, so a click during a yield cannot double build
- time each step of a tab switch

* xaml: drop layout elements and styles that do nothing

- remove 8 single child wrappers from control templates, one per instance of every button, toggle and tweak switch
- delete unreferenced labelfortweaks and ScrollVisibilityRectangle styles
- verified pixel identical across all five tabs

* fix: bring the last workflows into the job layer

- upgrade all runs package by package on the worker instead of spawning a console
- PS profile setup runs pwsh with output captured, not a Windows Terminal tab
- resolve the PS7 profile path from pwsh, so remove targets the file install wrote
- treat winget exit 3010 and 1641 as success; a reboot requirement is not a failure
- drop the power plan success popups, the job layer already reports the result
- load PresentationFramework before a message box on a worker, and log if it cannot show
- probe optional commands with -ErrorAction so a missing choco does not throw
- refresh PATH after installing chocolatey

* fix: keep the runspace handle out of the console and the pipeline

- suppress the IAsyncResult Start-WinUtilJob got back, which printed a table on every button press
- test fails if any caller leaves Invoke-WPFRunspace unassigned

* fix: choco parity with winget, and prompts that cannot hang or assume consent

- choco runs one package per call, so progress moves and a failure names the package
- add an Upgrade action; upgrade all was building "choco install all", which is not a package
- explain a choco failure from its own output instead of reporting a bare exit code
- pass a progress slice to choco from install and uninstall, as winget already gets
- never show a message box without a window: a modal there never returns
- an unanswerable prompt answers No, so it can never stand in for consent
- uninstall requires an explicit Yes rather than the absence of a No

* feat: headless runs report and finish on their own

- progress goes to the console when there is no window, throttled so downloads do not bury it
- one entry point for preset and config; a preset can now be a baseline a config adds to
- apply selected toggles, which only ever applied themselves from the window
- exit code carries the outcome: 0 clean, 1 problems, 2 nothing selected
- elevation waits for the elevated run and hands its code back
- per step timeout, so an installer that never returns cannot hang the run for good
- a step that throws no longer abandons the remaining steps
- name an unrecognised config entry instead of failing on a null list, and ignore duplicates
- import with no window logs instead of throwing on a message box type it cannot load
- temp file cleanup skips files in use rather than reporting each as an error

* perf: stop the interface stalling while the app list loads

Measured with a new input-priority heartbeat: 2669 ms unresponsive across 18
stalls, worst 399 ms. Now 502 ms across 5, worst 151 ms, and nothing after the
first three seconds.

- cache app icons on disk and fetch the missing ones on a worker; assigning a
  remote address to an Image made WPF fetch and decode it, landing back on the
  interface thread whenever the network answered, for a minute after startup
- share the six app entry event handlers instead of building them per entry:
  3.18 ms to 1.36 ms per entry, measured
- slice rendering and tab building by a deadline rather than an entry count, so
  a slower machine cannot turn a batch into a stall
- yield while building the tab opened at startup, as the warmup already did
- reject a ParameterList that is a flattened pair; it silently ran the worker
  with two characters of the parameter name and did nothing
- add Start-WinUtilUIHeartbeat behind WINUTIL_TRACE_UI to measure any of this

* fix: build the other tabs before finishing the app list

Tab warmup was queued at idle priority while app rendering was queued at
background priority, so no tab was warmed until every render pass had run.
For the first few seconds every tab except the open one was empty, and
clicking one paid for its whole build: Tweaks measures 400-530 ms.

Verified from the log: all tabs were ready after 32 of 32 background steps
before, and after 5 of 32 now.

- warm tabs at background priority so they are not starved by the app list
- hold app rendering while any tab is still unbuilt
- stand aside for 400 ms after input, and skip drawing entries for a tab that
  is not on screen, resuming when it is
- report the whole latency distribution rather than only gaps over 60 ms; a
  thread kept busy by short pieces of work showed no stall while every
  interaction still waited behind the piece in flight

* fix: ask before closing over running work, and shut down in order

Closing while a job ran tore the worker pool down underneath it. A queued
instance then started on a runspace already in Closing, threw on a thread
pool thread where nothing catches, and ended the process with an unhandled
InvalidRunspaceStateException instead of exiting.

- ask whether to wait for the running job or stop it, and keep the window
  open if the close is cancelled
- track what is running so it can be stopped, and stop it before closing the
  pool rather than pulling the runspaces away from it
- refuse to queue new work once shutdown has begun
- close the window by itself once an awaited job finishes
- bound the wait, so a worker that cannot be stopped does not keep the window
  open for ever
- phrase the question so the buttons answer it in any language; Windows labels
  them itself and text naming them Yes and No does not match Ja and Nein
- treat a missing collection as empty; @($null) is a one element array, which
  read as one running item when nothing was running

* fix: let a running job finish in the console after the window is closed

Waiting kept the window open until the job ended, which is not what closing
it means. The window now goes at once and the run continues where it can
still be seen, ending the process when it is done.

- close the window immediately and leave the job on the worker pool
- skip the pool shutdown on that path; it would stop the work just kept
- wait for the job on the main thread, then close the pool and exit
- treat a shut down dispatcher as no window, so progress reaches the console
  instead of being posted to a dispatcher that drops it
- bound that wait, so a job that never returns cannot hold the process open
- guard the close post against a window that has already gone

* feat: pause button, and progress that rewrites its line

- add a pause button beside the progress bar; a run holds at the point every
  loop reports progress, since a command already started cannot be suspended
- hold only inside a job worker: whoever presses pause reports it through the
  same progress call and would otherwise wait on itself
- clear the pause once the body returns, or the finish reporting pauses too and
  the job stays marked running for ever
- release it when the window is closed over the job, since there is then no
  button left to resume with
- rewrite the console progress line in place rather than adding one line per
  update; a single install scrolled a screenful
- keep one line per update when output is redirected, where there is no cursor
  to move, and throttle harder there
- say goodbye where the process actually ends; closing can be declined or leave
  a job running

* feat: stop button for the running action

- add a stop button beside pause; it asks first, since stopping an install
  halfway is not undoable
- end the run at the same safe point a pause holds at, so anything already
  started finishes and nothing is cut in half
- report it as stopped rather than failed, through its own cancellation
- clear the stop before reporting it, or the report throws it again from inside
  the handler doing the reporting
- release a pause when stopping, or the run would never reach the point where
  it notices
- cut the worker off after a grace period, since a single long step reaches no
  safe point until it returns
- reset both flags per job, so a late stop cannot end the next run

* fix: use a stop glyph that does not look like a missing one

U+E71A is a hollow square at button size and reads as the empty box a font
shows for a code point it lacks. U+E73B is the filled square.

- add a test that every private use code point in the markup and the scripts
  exists in Segoe MDL2 Assets

* fix: icon buttons render in the icon font, not a fallback

A char assigned to Content is not laid out with the control's own font. It
falls back to whatever font claims the code point and is drawn in that font's
colour and metrics, which is why the pause icon came out teal and a different
size from the cross beside it. Add-SelectedAppsMenuItem already cast to string
for the same reason.

- cast every icon assignment to string: pause, play, the app entry popup and
  the theme button
- use the cancel cross for stop; a square is a blank block at button size
  whether it is filled or hollow
- test that no icon reaches Content as a char

* fix: the font scaling slider goes where it is clicked

WPF leaves IsMoveToPointEnabled off, so a click on the track pages by
LargeChange instead of moving the thumb to the pointer. LargeChange defaults
to 1.0, which over a range of 0.75 to 2.0 is most of the track, so clicking
anywhere toggled between 100% and 200%.

- follow the click, and page by one tick rather than a full unit
- test that every slider does both

* fix: draw the logo at the size it is asked for, and give the window its own icon

The rasteriser built the bitmap from the canvas rather than the requested
size, so every render came out 100 by 100 whatever was asked for: a 32px icon
was that downscaled, and anything larger was an upscale. The canvas was also
smaller than the artwork, whose paths run to about 108 by 110, so the right
and bottom edges were cut off. Between the two, the logo covered about a third
of the icon it was drawn into.

- rasterise from the geometry's real bounds into a bitmap of the requested
  size, centred and filling the frame
- keep the shapes in one place, so the control and the bitmap draw the same art
- set the window icon at the sizes the system reports for this display, small
  and large, instead of leaving Windows to scale one bitmap
- hold the icon handles for the life of the window and free the ones replaced

* fix: give the nav logo its square box back

Fitting the box to the artwork left no room around it. The logo is taller than
it is wide, so a square control filled by it edge to edge sat against the tab
buttons next to it.

- centre the artwork in a square box with a small margin, so the control fills
  the size it was given rather than the artwork's own proportions
- the bitmap form is unchanged and still fills the frame, which is what an icon
  wants

* refactor: one background queue, one UI-alive check, drop the stall tracer

- move the DPI window icon work out to feat/dpi-window-icon and revert it here
- drop Start-WinUtilUIHeartbeat: it found the startup stalls, it is not
  something a normal run should carry
- add Start-WinUtilBackgroundQueue and put tab warmup and app-entry rendering
  on it; they were the same pump written twice
- add Test-WinUtilUIAlive, replacing the same dispatcher guard hand-written
  eleven times in three spellings
- carry the queue name as the dispatcher's own argument, not a captured
  variable, so the posted step still resolves where it was written
- give Invoke-WinUtilWhenIdle an -Argument for the same reason
- load the WPF assemblies in preferences-theme tests instead of relying on
  logo-render having loaded them first

* docs: bring the agent rules in line with the job layer

Section 13 still pointed at Set-WinUtilTweaksProgressIndicator, which the job
layer removed, and said nothing about the pieces that replaced it.

- point the UI-helper rule at Write-WinUtilJobProgress and Test-WinUtilUIAlive
  instead of the deleted progress indicator
- say that long operations go through Start-WinUtilJob, and that a job body
  owns neither the busy flag, the banner, nor its own interface handling
- send deferred interface work through Start-WinUtilBackgroundQueue rather
  than a fourth hand-rolled pump
- record how values reach a posted scriptblock, and why a closure is the wrong
  answer: it carries the value but binds command lookup to a copied scope
- state that diagnostic scaffolding is measured with and then deleted
- require each Pester file to load what it needs; several passed only because
  an earlier file in alphabetical order had loaded it

* refactor: trim the package work back to what the pipeline needs

The winget client module earns its place: winget.exe hides its progress bar
once its output is redirected, so the CLI can never say how far along an
install is and the progress bar has nothing to show. What rode in behind it
did not.

- keep the module, the per-package progress and the result objects both
  managers now return; those are what the job layer reports from
- take the action from the caller instead of probing the machine first:
  Install, Uninstall and Upgrade each pick their own cmdlet and verb, matching
  the set Install-WinUtilProgramChoco already takes
- drop the Get-WinGetPackage probe with it, which cost a nested call per
  package and made the module path mean "install or upgrade" while the command
  line path still meant "install"
- send the upgrade workflow through -Action Upgrade, which is what it was
  always asking for
- revert Invoke-WinUtilCurrentSystem to the command line; reading which apps
  are installed has nothing to do with reporting progress
- cut the winget and choco error tables: the hex code and Microsoft's own list
  say the same thing without a copy to keep in step, and choco's reason is
  already in the output that gets logged

* test: drop the tests that assert on source text

Sixty-six tests read a function file and regex-matched its contents, so they
failed on edits that changed no behaviour: ten of them broke during a refactor
that only moved code between files. A test that pins how something is spelled
is an edit detector, not a test.

- remove the It blocks that Get-Content a .ps1 and match against it, and the
  Describe blocks left with nothing in them
- keep the ones that read source to check a set rather than a spelling, such as
  every WPF handler resolving to a defined function and every $sync member
  being declared; those catch a real mistake
- drop Get-WinUtilFunctionFile, which had no callers left

* fix: make the active job slot safe to claim and release

Three defects in the job layer's shared state, all of them races that the
dispatcher happened to hide.

- claim $sync.ActiveJob under the collection's own lock. Interface events are
  serialised by the dispatcher, but a headless run, a scheduled caller and a
  job body starting another job are not, and a test-then-assign there let two
  jobs both believe they owned the slot
- identify a run by token rather than by name. A worker the stop watchdog cut
  off can still be unwinding when the next job starts, and its finally block
  released the slot unconditionally, wiping the claim the next job had just
  made. Both the worker and the watchdog now release only what they still own
- rename Write-WinUtilJobProgress to Step-WinUtilJob. Write- in PowerShell
  means adds to a stream, and this blocks while paused and throws
  OperationCanceledException on stop. The trap was already live: the job layer
  has to clear both flags before its own finish reporting or that reporting
  re-raises the stop it is reporting

Also corrects the cross-runspace cost noted in the tests. Marshalling a
scriptblock is not "roughly twenty times" dearer; measured over 400 command
invocations it is 5354 ms against 3 ms rebuilt from text, because every command
the body invokes is resolved back through the originating runspace.

* refactor: drop the WinGet client module from this branch

The module is the one thing here that adds a runtime dependency: 53 MB from
PSGallery on first use, fetched at elevated privilege. It buys progress
movement inside a single package and nothing else. That is a different kind of
change from the rest of this branch, which only moves work between threads, and
it deserves to be judged on its own.

- remove Install-WinUtilWinGetClient and Invoke-WinUtilWinGetCommand
- collapse Install-WinUtilProgramWinget onto the command line path it already
  had underneath, keeping the per-package result objects, so a failed package
  still fails the job
- drop ProgressBase, ProgressSpan and Label from the winget path, which only
  existed to slice the bar inside one package. Chocolatey keeps its own: it
  reports per package from its own loop and never needed the module
- read upgradable packages from the winget command line output again

Kept on feat/winget-client-module, which branches from here.

* docs: follow the Write-WinUtilJobProgress rename in the architecture page

* fix: address the review findings on the job layer

Ten findings held up on inspection. The first two were breakage this branch
introduced.

- run a nested Start-WinUtilJob inline instead of refusing it. Install Features
  reaches the job layer twice, once through its feature.json entry and again
  from Invoke-WPFFeatureInstall, so the inner call was refused and features
  never installed
- read the package manager preference rather than ChocoRadioButton.IsChecked in
  Invoke-WPFInstallUpgrade, which runs on a worker where touching a control
  throws
- pass parameters and return values through the Invoke-WPFUIThread fallback.
  [action] carries neither, so Show-WinUtilMessage lost both its arguments and
  its answer whenever the dispatch delegate was not yet built
- register a shell after BeginInvoke, not before: a NotStarted instance looks
  finished to the pruning pass and could be dropped before shutdown saw it
- clear $sync.ActiveJobToken wherever the slot is released, through one
  Clear-WinUtilActiveJob helper. Clearing only the name left a token that could
  match a later run
- clear $global:WinUtilIsJobWorker when a worker finishes. Pool runspaces are
  reused, so the flag outlived the job that set it
- set the pause and stop button state through the dispatcher
- take a locked snapshot of $sync.ActiveShells before enumerating it, and create
  the collection under the lock
- stop the watchdog waiting on the interface thread. It issues the stop and
  watches later ticks instead of sleeping for up to ten seconds
- throw rather than return on the ISO failure paths, which the job layer was
  reporting as finished, and check exit codes in Invoke-WPFSystemRepair and
  Invoke-WPFUltimatePerformance so a failed step fails the job
- give the pause and stop buttons AutomationProperties.Name; their content is a
  private-use glyph

* fix: address the remaining review findings

Seven more held up. The first is the one that mattered most and this branch
introduced it.

- separate recycling a runspace pool from shutting down. Initialize-WinUtilRunspacePool
  replaces a pool that is no longer open by calling Close-WinUtilRunspacePool,
  which set $sync.ShuttingDown. Nothing resets it, so a single recycle made the
  job layer refuse every later action for the rest of the session
- bound the ISO mount wait at 60 seconds. The loop had no exit but success, and
  one job runs at a time, so a damaged or already-mounted image blocked every
  other action and the shutdown wait
- check robocopy exit codes in both ISO and USB workflows through one
  Invoke-WinUtilRobocopy. Codes of 8 and above mean files were not copied, which
  produced media that reported complete and did not boot
- read oscdimg stderr as it arrives. Draining stdout first and stderr afterwards
  deadlocks once the stderr pipe fills
- look for oscdimg on PATH, in both ADK roots and in the per-user WinGet package
  root, using the same search before and after the install attempt
- set the child error preference to Stop for the profile setup, and fail on
  captured error records. A non-terminating failure exited zero and was reported
  as installed
- confirm each id parsed out of the winget upgrade table against winget before
  upgrading it, and keep stderr out of the parse. The table is localised and
  truncated, so a wrapped version or a translated header matched the same shape

* fix: address the minor and nitpick review findings

The review body carried 38 findings beyond the 20 inline ones, in collapsed
sections. These are the ones that held up.

Real defects:
- the theme hook assigned to $handled instead of $handled.Value, so a
  WM_SETTINGCHANGE was never marked handled
- a declined UAC prompt left $elevated null and exited 0, which a headless
  caller reads as a successful run
- Start-Transcript ran before the log directory existed, so the first run failed
  before logging started
- Write-WinUtilLog appended even when the mutex wait timed out, which is the
  case with the most contention and the one that interleaves lines
- Wait-WinUtilRemainingWork took [int] minutes, so any fractional timeout
  truncated to zero and the bound meant "do not wait"
- the console progress throttle only applied when the text was unchanged, so a
  job reporting per package wrote on every call
- an undecodable icon response stayed in the cache and was skipped on every
  later run
- Start-WinUtilAssetRendering leaked its dedicated STA runspace; the cleanup
  callback now disposes a runspace it was given
- Invoke-WPFFixesWinget could not repair a broken WinGet, because
  Install-WinUtilWinget returns early when winget is detected. Added -Force
- winget's own reboot-required and reboot-initiated codes counted as failures

Smaller:
- set TLS 1.2 and a timeout before fetching the Chocolatey bootstrap
- let the headless queue drain survive one failing item, as the dispatcher path
  already does
- bind the idle timer to the interface dispatcher explicitly
- route the export message through Show-WinUtilMessage like the import branch
- suppress New-Item output that was reaching the job's output stream

Tests that could not fail:
- the bounded-wait test passed a fractional timeout that truncated to zero, so
  the wait never ran
- the slider tests cast possibly-absent attributes to [double], and compared two
  empty strings for the regression they exist to catch

* fix: startup crash and icons that only appeared once the list was drawn

Both were mine, and both were introduced while addressing review findings.

The crash. Register-WinUtilRunspaceCleanup compiles its helper type once and
guards that with a type-exists check, so a session already holding the old
shape keeps it. Adding a Runspace property to that type therefore failed on
every later run with "The property 'Runspace' cannot be found". The type is
back to exactly what it was, and the asset rendering runspace lives until the
process exits: one STA runspace for the lifetime of the app is the cheaper
trade against a helper type that cannot be changed safely in a session.

The icons. Start-WinUtilIconFetch ran from Complete-WinUtilInstallAppRendering,
so nothing was fetched until every entry had been drawn and no icon appeared
for the first several seconds. Upstream assigned a remote address per Image and
let WPF fetch them all at once, which is what made them appear promptly.

- fetch after each render batch instead, gated so one fetch runs at a time and
  whatever queues up meanwhile is taken when that fetch ends
- clear the gate when the runspace refuses the work, or no fetch would ever run
  again for the rest of the session
- request each wave together rather than one icon after another

Measured on a cold cache in a VM: first icons at 1.35s and all of them by 4.0s,
against nothing before roughly 7s previously.

* fix: address the second review pass

All three are in code this branch added.

- accept DISM exit code 3010 as success. It is ERROR_SUCCESS_REBOOT_REQUIRED,
  meaning the image was repaired and the change lands on restart, so the exit
  code check added in the last pass turned a successful repair into a failed
  job. Carried per step, since the same number from chkdsk or sfc does not mean
  that, and logged as a warning so the restart is not silent
- say what is happening on the WinGet repair path. Install-WinUtilWinget -Force
  runs while WinGet is installed, and printed "WinGet is not installed"
- append to PATH after installing Chocolatey rather than replacing it.
  Overwriting with the machine and user values drops whatever this process
  added earlier in the session

* fix: treat chkdsk's own exit codes as the outcomes they are

- chkdsk /scan reports 1 and 2 as ordinary results, so aborting the whole
  repair on them skipped sfc and dism for no reason
- 3 stays a failure: the disk could not be checked, and the later steps are
  not worth running on a disk in that state
- drive the decision off each step's SuccessCodes instead of a branch
  hard-coded to DISM's 3010, so the same number means what that step means
- cover chkdsk 0, 1, 2 and 3, and 3010 from the wrong step

* fix: address the Codex review findings on the job layer

- send WPFPanel buttons that carry a function through the job layer: the
  system corruption scan waited on chkdsk, sfc and dism on the interface
  thread, with nothing to pause, stop or report it
- stop a timed out headless step before starting the next one, and abandon
  the run if it will not stop, rather than changing the machine from two
  runs at once
- keep the stop watchdog's slot claimed until the worker has actually gone
- skip the install summary reset when the Install tab has not been built,
  which offline startup does by opening Tweaks first
- keep Win11ISO out of the tab warmup: building it runs the existing work
  check, which reports or prompts while the user is on another tab
- pass --include-unknown when upgrading, since the scan that found the
  packages used it

* fix: stop the tab warmup dying on a sync that is still growing

- Reset-WPFCheckBoxes enumerated $sync live while setting IsChecked, whose
  handlers add to $sync, and while the warmup was building controls into it;
  either one invalidated the enumerator and the warmup reported "Collection
  was modified"
- snapshot both loops
- cover it with a checkbox that grows $sync from its own handler, which
  reproduces the failure without the fix

* fix: shrink the pause and stop buttons and take them away when idle

- they were sized like the title bar icons, next to a 6px progress bar
- give them a size of their own and the smaller icon font, which font
  scaling still applies to
- collapsed unless a job is running: they were only ever disabled, so a
  finished or failed run left two dead buttons on screen
- the progress bar still stays to report how the run ended

* fix: colour the progress bar by how the run ended

- only the taskbar item carried the state, so a run that finished with
  errors left a full bar in the normal colour, reading as a clean finish
- the fill now follows the bar's Foreground, which the job layer points at
  an error or warning colour and back again
- by resource reference, so switching theme repaints it
- add error and warning colours to both themes

* fix: stop rendering the app navigation twice, which left Install dead

- upstream moved the app navigation render into Initialize-WPFUI, and this
  branch still rendered it beforehand, so it was built twice
- the second pass clears the target grid, and the "already wired" guard goes
  by name, so the replacement buttons counted as wired and never got a click
  handler: Install and Uninstall did nothing, with no error anywhere
- leave that render to Initialize-WPFUI

* fix: uninstall apps that belong to the signed in user

- WinGet answers APPINSTALLER_CLI_ERROR_ADMIN_CONTEXT_ACTION_PROHIBITED for
  anything installed in user scope while it is running elevated, and WinUtil
  is always elevated, so those uninstalls did nothing
- a process cannot drop its own elevation, so hand that one command to a
  scheduled task running as the interactive user at limited run level
- retry only on that code, so everything else is untouched

* style: keep the ISO variable names the file already used

- new scriptblock parameters were named in PascalCase, which put 20 lines
  into the diff that are otherwise identical to main
- nothing about the behaviour changes

* refactor: take the icon cache out of the job layer change

It is its own feature, not something consolidating background work needs.
Entries go back to assigning the favicon address to the image, as main does.

The work is kept on feat/install-icon-cache and follows once this lands.

* refactor: take pause and stop out of the job layer change

They are a new feature of their own, not part of consolidating background
work, and main has nothing like them today.

- drop the two buttons, their routing and the checkpoints that served them
- keep Stop-WinUtilActiveWork: closing the pool and the headless step
  timeout both need to end work, and neither is the user pressing a button

The work is kept on feat/job-pause-stop and follows once this lands.

* refactor: drop changes the job layer does not need

- the icon glyph strings are a rendering fix of their own: main renders a
  char, and whether that is right has nothing to do with background work.
  Reverted here, kept on fix/ui-glyph-strings
- trim the temp cleanup tweak to the part this change forces: errors have to
  be suppressed because the job layer counts a logged error as a failed
  step, but counting what was removed is unrelated polish

* refactor: cut comments and wrappers that were not earning their place

- the Recycle switch explained itself over four lines; two say what a reader
  needs to know
- drop a .PARAMETER that only restated the parameter name
- Unregister-WinUtilActiveShell had one caller and cost twenty lines, so it
  is inlined
- the running check was the same try/catch three times over, now one helper

* refactor: comments describe the code, not how it got here

- remove five comments left pointing at code the icon and pause splits took
  away, two of them sitting above unrelated lines
- cut the ones that recounted a bug rather than describing behaviour: the
  double rendered navigation, the dropped [action] parameters, the shell
  registered too early, the Add-Type shape
- shorten the rest to what a reader needs

* refactor: inline the winget error message at its only call site

- Get-WinUtilWinGetErrorMessage was 26 lines for a one line format string
- Its zero guard was dead: exit code 0 is handled by an earlier branch
- Drop the file and the two test dot-sources of it

* refactor: drop the user scope uninstall fix, it has its own branch

- Invoke-WinUtilUnelevated and the elevation retry are self contained
- They ship on fix/winget-user-scope-uninstall, which does not need the job layer
- Removes a file and 3 tests from a PR that is already large

* docs: tighten function help and comments

- Cut narrative framing from the job layer, queue and shutdown doc blocks
- Kept the technical reasons, dropped the restatements around them

* docs: drop comments that restate the code

- Consent check, powercfg exit codes, shortcut guard, rethrow, single reason
- Compact the UI thread helper's help

* fix: address async job layer review findings

* fix: harden job startup and dependency discovery

* fix: close remaining async review gaps

* fix: finalize shutdown and ISO recovery paths

* fix: guarantee job cleanup and error attribution

* fix: preserve job outcomes during cancellation

* fix: close async rendering and logging races

* fix: bound shutdown and surface UI startup failures

* fix: skip blocked user-scope install updates

* fix: address final PR review findings

* fix: warn on blocked user-scope package actions

* fix: propagate file-backed headless exit codes

* Address final async job review findings

* Resolve latest automated review findings

* Preserve clipboard history in activity tweak

---------

Co-authored-by: Chris Titus <contact@christitus.com>
2026-09-04 09:55:39 -05:00
eduardodepaiva 69ff04b632 feat(appx): add Movies & TV to appx.json (#5055)
That makes sense, since Media Player is on the list. Since it comes from the Microsoft Store, reinstalling it isn't a problem.
2026-09-03 13:18:26 -05:00
OmarandChris Titus 7ee5be3d2f feat: add automated environment report export (#5025)
* feat: add automated environment report export

* refactor: address code review comments

* fix: refresh toggle state in environment report

* fix: surface environment report read failures

* test: make registry failure explicit

---------

Co-authored-by: Chris Titus <contact@christitus.com>
2026-09-02 17:03:22 -05:00
Chris Titus 4a1db91e3f docs: update WinUtil title screen (#5052) 2026-09-02 16:14:47 -05:00
Omar 41e4f35897 Automate WinUtil title screen generation (#4965)
* feat: add title screen generation tooling

Add local automation for capturing WinUtil in Light and Dark themes
and generating the composite title-screen image.

* ci: automate title screen updates

Add a manual Windows workflow that compiles WinUtil, generates the
Light and Dark composite, and opens an image-only pull request.

* docs: update AGENTS.md and SPEC.md with title-screen generation details

* fix: address review comments

Tested image is correct, SHA-256 hash is identical to the previously verified output.

* fix: deselect bitmap before reading capture pixels
2026-09-02 16:10:44 -05:00
OmarandChris Titus d1a61790a1 Preserve clipboard history when disabling activity history (#5035)
* chore(tweaks): clarify Activity History tweak description

* fix(tweaks): preserve clipboard history

---------

Co-authored-by: Chris Titus <contact@christitus.com>
2026-09-02 16:05:02 -05:00
owenn 87dd643176 Use well-known SIDs for icacls tweak principals (#5045) 2026-09-02 15:14:56 -05:00
Malin Fossum 8f7b12bc0d Add tweak to block Logitech Download Assistant auto-install (#5034)
* Add tweak to block Logitech Download Assistant auto-install

Mirrors the WPFTweaksRazerBlock folder-deny approach: clear
C:\Program Files\LogiDownloadAssistant, recreate it empty, and deny
Everyone write access so the Windows Update software-component package
cannot re-deliver the payload. UndoScript removes the deny ACE.

Unlike the Razer tweak, no global SearchOrderConfig/DisableCoInstallers
registry changes: those alter driver search system-wide and do not stop
software-component packages.

Fixes #5029

* Harden Logi block tweak per review: SID, 64-bit path, exit codes

- Use the locale-independent *S-1-1-0 SID instead of the English
  "Everyone" name, which fails to resolve on non-English Windows.
- Resolve the 64-bit Program Files directory via ProgramW6432 with a
  ProgramFiles fallback, so a 32-bit host cannot target the x86 folder.
- Throw when icacls exits non-zero so Invoke-WinUtilScript logs the
  failure instead of reporting the tweak as completed.
- Skip the undo icacls call when the folder no longer exists.
2026-09-02 15:01:13 -05:00
catsmoker 88071f2849 Add File Converter application to multimedia tools (#5036) 2026-09-02 14:59:29 -05:00
OmarandChris Titus df858c4cd7 Inject Win11 Creator drivers per package instead of one batch (#5048)
* fix(iso): inject drivers per package

Add each root package folder separately so one bad driver cannot fail the rest. The batch form is roughly four times faster. That cost is accepted for one deterministic code path

* Preserve retained nested driver packages

* Discard partial driver injection attempts

* Remove excluded nested driver INFs

---------

Co-authored-by: Chris Titus <contact@christitus.com>
2026-09-02 12:09:18 -05:00
Chris Titus cc5e31460b Update sponsors in README (#5051) 2026-09-02 10:35:44 -05:00
Noah Webber d0f7689504 Kitchen sink changes (#5040)
* docs: fix typo in contributing image asset and markdown references

* docs: fix typos and grammatical phrasing in documentation

* fix(config): correct typographical errors in tweak and app descriptions

* fix(scripts): resolve typos and grammatical errors in PowerShell sources

* fix: address review feedback on Outlook description, WinUtil capitalization, and grammar
2026-09-02 10:14:51 -05:00
Omar 22e1dc9b09 Filter unserviceable and stale drivers before Win11 Creator injection (#5016)
* fix(win11-creator): filter unserviceable and stale drivers before injection

Add-Driver aborts the whole batch when one exported package is bad,
which broke ISO creation for anyone with an Extension-class or stale
duplicate driver in their store (#4971, #4982). Exclude both before
the single Add-Driver call instead of guessing per-vendor.

* fix(win11-creator): address driver filtering review feedback

Accept date-only DriverVer entries instead of treating them as
unknown. Use the full folder path as the dedup fallback key so two
unrelated packages can't collide on a shared leaf name. Discard the
logger's own output inside the selector so an emitting -Log callback
can't inflate the survivor count. Skip driver injection instead of
failing the whole ISO build when nothing is left to inject.

Also extracts the repeated DISM mock setup in the driver tests into
one shared harness, and asserts that excluded packages are actually
deleted from the export root before Add-Driver runs, not just logged.

* fix: address remaining code review comments
2026-09-02 10:11:20 -05:00
Ivan Lepekha c00f1eb7b3 feat(github): Prettify bug report template (#5050)
* feat(github): Prettify bug report template

* Let the people know that if they include anything private and share it, that makes them stupid, because AI told me to do that and that's NOT THAT OBVIOUS(sarcasm sign)
2026-09-02 10:10:01 -05:00
f54b22da2c feat(github): let people know about dotnet for sponsors (#5044)
* Money goes brrrrr

Added note about sponsors with recurring subscriptions.

* Update README.md

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

---------

Co-authored-by: Chris Titus <contact@christitus.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
2026-08-31 16:00:42 -05:00
Chris Titus e15e2be1c4 Update sponsors in README (#5042) 2026-08-31 10:32:33 -05:00
Chris Titus 34f7ce5a0e Update sponsors in README (#5032) 2026-08-24 10:42:42 -05:00
Chris Titus 086aecf4b7 chore: Update generated dev docs and JSON links (#5014) 2026-08-19 17:24:59 -05:00
NikhilandChris Titus 436773df73 Fix legacy json import compatibility, UI sidebar refactor, and improved test coverage (#4911)
* Fix backward compatibility for old-style JSON config imports

* Refactor sidebar UI generation and add tests for Get-WinUtilVariables

* Fix appnavigation config test following UI generation refactor

* Restore global sync state in variables tests

* fix(impex): migrate supported legacy selections

Keep modern imports strict while allowing legacy backups to skip retired entries with clear logging and user feedback. Add fixtures covering partial and all-retired imports.

* test: strengthen UI and global state coverage

Exercise app category rendering through Initialize-WPFUI and restore global sync without leaking test state.

* fix(impex): ignore legacy metadata fields

Limit legacy selection migration to supported WPF key families so unrelated string metadata does not produce false retired-setting warnings.

* docs: clarify legacy config imports

Distinguish strict modern flat imports from partial legacy object migration, including single-setting export shape and historical groups.

---------

Co-authored-by: Chris Titus <contact@christitus.com>
2026-08-19 17:13:14 -05:00
4b2fe55a7a fix(system): correct service, update repair, and legacy imports (#4966)
* fix(system): correct sc.exe argument syntax, reg deletion, and ipv6 dns guard

* fix(impex): exclude legacy Install metadata from flattened import

* fix(service): throw on non-zero LASTEXITCODE from sc.exe config

* refactor(dns): revert unnecessary ipv6 guard per review feedback

* test(impex): cover legacy config imports

---------

Co-authored-by: WinUtil Contributor <contributor@winutil.local>
Co-authored-by: Chris Titus <contact@christitus.com>
2026-08-19 16:54:24 -05:00
Malin FossumandChris Titus b8b81edcdb Show preset JSON key in app, tweak, and feature tooltips (#4995)
* Add Get-WinUtilEntryToolTip helper for preset-key tooltips

* Show preset JSON key in app and tweak tooltips

* Match apps search against preset key for consistency with tweaks

* Limit preset-key tooltips to preset-representable controls

Comboboxes and package-manager radio buttons cannot appear in a preset
file. Update-WinUtilSelections routes a flat list of keys by the
WPFInstall/WPFTweaks/WPFToggle/WPFFeature/WPFAppx prefixes, so a preset
can carry neither a combobox selected value nor a radio group choice;
WingetRadioButton and ChocoRadioButton do not even carry a WPF prefix.
Advertising those control names as preset keys invited users to add keys
that fall through the switch and abort the whole import.

Revert the combobox label and radio button tooltips to the plain
description, and add tests that fail if the key is reattached to a
control the preset importer cannot accept.

* fix: address preset key review feedback

* docs: clarify preset key search scope

---------

Co-authored-by: Chris Titus <contact@christitus.com>
2026-08-19 16:26:11 -05:00
Ivan LepekhaandChris Titus a7074963a6 fix(apps): warp prettify (#5013)
* fix(apps): WARP prettify

Updated Cloudflare WARP entry with new key and modified description and link.

* Fine, Chris, let's leave property name as full

* Rename 'cloudflare-warp' to 'CloudflareWARP'

---------

Co-authored-by: Chris Titus <contact@christitus.com>
2026-08-19 16:11:04 -05:00
Ivan LepekhaandChris Titus 032ce8ead0 feat(github): revival of triage tools (#5007)
* feat(github): revival of triage tools

* fix(github): workflow doc fix

* fix(github): PR detection

* fix(gh): wontfix preserve bug label

Removed state_reason from issue update when adding wontfix label.

* fix(gh): doc cleaning

* one more thing

* fix(gh): prevent Gabi moment

That's the only thing I will agree with this piece of hardware

* Fix syntax error in triage-tools.yaml

* fix(github): restrict triage commands to issues

---------

Co-authored-by: Chris Titus <contact@christitus.com>
2026-08-19 16:03:06 -05:00
792122e998 fix: preserve selections when config import is invalid (#4994)
* fix: validate imports before replacing selections

* test: cover atomic config imports

* docs: explain stale config imports

---------

Co-authored-by: Guilherme de Oliveira Rocha <contatoguilhermeoliveira@protonmail.com>
Co-authored-by: Chris Titus <contact@christitus.com>
2026-08-19 15:30:46 -05:00
2d0fd43bd3 Add EmulationStation and Tailscale entries to applications.json (#4973)
* Add EmulationStation and Tailscale entries to applications.json

* Update config/applications.json

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

* Update config/applications.json

I'm so sorry I'm late I've had to take a break from this for a bit of health related stuff.

Co-authored-by: Ivan Lepekha <57459428+FluffyPunk@users.noreply.github.com>

---------

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Co-authored-by: Ivan Lepekha <57459428+FluffyPunk@users.noreply.github.com>
2026-08-19 14:04:14 -05:00
Manreet Singh 219b2fe137 Added Cloudflare WARP to pro tools (#5011) 2026-08-19 14:03:22 -05:00
Ivan Lepekha 527eefb114 feat(apps): Added Battle.net (#4996)
* feat(apps): Added Battle.net

Just Blizzard. Well, we can hate them, but their launcher is unique

* You know, being smart is a hard work...

* titusTypo
2026-08-19 14:02:30 -05:00
MyDrift d1b8470af2 Link apps to their own site instead of a repo or store page (#5010)
* fix: link apps to their own site instead of a repo or store page

- the icon comes from the link's domain, so every GitHub hosted app showed
  the same octocat and the two store apps showed the Microsoft Store tile
- point 16 apps at the project's own site, and LibreWolf at librewolf.net
  rather than its old gitlab.io address
- left on GitHub where the site turned out to redirect back to the repo
  (fnm, MSEdgeRedirect, Deskflow) or has no icon to serve (gsudo,
  simplewall, ungoogled-chromium, DISMTools)

* fix: point Teams at teams.live.com so it shows the Teams logo

- the marketing page on microsoft.com serves the generic Microsoft favicon,
  which Edge already uses

* fix: keep GlazeWM and Lua on the pages that match what is installed

- glazewm.com is not the project's own site: the repo declares no homepage,
  glzr.io never references it, and it runs on unrelated hosting
- lua.org is the language, while the package is Lua for Windows

* fix: keep Teams on the Microsoft product page

- the package is Microsoft.Teams, the work product, while teams.live.com is
  the consumer edition
2026-08-19 14:00:57 -05:00
Malin Fossum 6066675f93 Add accessible name to font scaling slider (#4993)
FontScalingSlider had no AutomationProperties.Name, so screen readers
announce it as an unnamed slider with only a raw numeric value.
Completes the accessible-name coverage of the font scaling popup.
2026-08-19 14:00:12 -05:00
Malin Fossum b21d416161 Add accessible names to remaining top-bar controls (#4992)
ThemeButton, FontScalingButton, SearchBar, and SearchBarClearButton had
no AutomationProperties.Name, so screen readers (Narrator, NVDA)
announce them as raw glyph text ("N/A", Unicode E8D3), an unnamed edit
field, and a button called "X". Completes the top-bar naming pass
started for SettingsButton and the window controls.
2026-08-19 13:59:45 -05:00
Abdullah Mansour 87a0eb8637 Fix location service startup type (#4972)
* fix(tweaks): use canonical location service startup type

* test(tweaks): pin location service startup type
2026-08-19 13:50:34 -05:00
Omar 8500ed116f Fix OSCDIMG detection (#4983)
* fix: detect machine-wide OSCDIMG installations

* fix: repeat OSCDIMG discovery after installation
2026-08-19 13:49:38 -05:00
Omar d16ee0e9f1 chore: remove fullscreen optimizations tweak (#5000) 2026-08-19 13:46:34 -05:00
Chris Titus 5ba8686dd7 Update sponsors in README (#5003) 2026-08-18 10:40:06 -05:00
Chris Titus 3f1850f623 Update sponsors in README (#4988) 2026-08-16 10:35:29 -05:00
Chris Titus 0dbe39bc7d Update sponsors in README (#4985) 2026-08-15 10:35:25 -05:00
Chris Titus 91972b0853 Update support section with new product information 2026-08-14 08:44:10 -05:00
dependabot[bot] aee3e7a1f4 chore(deps): bump js-yaml from 4.3.0 to 4.3.1 in /docs (#4970)
Bumps [js-yaml](https://github.com/nodeca/js-yaml) from 4.3.0 to 4.3.1.
- [Changelog](https://github.com/nodeca/js-yaml/blob/4.3.1/CHANGELOG.md)
- [Commits](https://github.com/nodeca/js-yaml/compare/4.3.0...4.3.1)

---
updated-dependencies:
- dependency-name: js-yaml
  dependency-version: 4.3.1
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-11 17:55:18 -05:00
Sean (ANGRYxScotsman) ea5de27b6c Update issue templates with prefilled titles (#4960)
* Prefill title on bug report issue template

* Prefill title on feature request issue template

* Trim trailing space from issue template titles
2026-08-10 09:48:43 -05:00
Sean (ANGRYxScotsman) 2752fe2e03 updated title-screen pic (#4959) 2026-08-10 09:44:30 -05:00
Sean (ANGRYxScotsman) 1458327638 Containerize docs site tooling for security and update documentation (#4942)
* Containerize the docs site's npm tooling

Run Astro/Starlight dev, build, and preview commands through Docker
(docs/Dockerfile, docker-compose.yml, service winutil-astro) instead
of bare npm on the host, and document the required commands and
rationale in docs/README.md.

* Document Docker-only npm policy for agents

Add a Dependency Installs, Builds, And Dev Servers section to
AGENTS.md requiring docs/ tooling to run through Docker rather than
directly on the host, point SPEC.md's Docs Site section at the new
Dockerfile/docker-compose.yml, and renumber the remaining AGENTS.md
sections to stay sequential.

* Harden docs Docker dev environment

Tightened docs-container safety and clarified contributor workflow. The docs Docker image now switches to the non-root `node` user after setting ownership, and compose now binds Astro to `127.0.0.1` instead of all interfaces. Updated AGENTS and docs README instructions to explain the security boundary of the bind mount and to require rebuilding plus `docker compose down -v` after dependency changes so `node_modules` is reseeded correctly.

* Clarify docs secret handling in AGENTS

Updates AGENTS.md to tighten docs security guidance: secrets must not be stored anywhere under `docs/`, because `docs/.dockerignore` only affects image build context and does not protect files from the Docker Compose bind mount used for docs dev/build commands.

* Fix preview command to expose port in Docker

The previous preview command didn't expose the port outside the container. Adding --service-ports and binding to 0.0.0.0 makes the preview server accessible from the host.
2026-08-09 20:11:35 -05:00
Kai Davids Schell ea7fcf9d2b Per anthropic docs include agents.md with a direct import rather than instruction (#4958) 2026-08-09 20:06:01 -05:00
Graham DavidandChris Titus 0aa4ab3a40 Adding Mullvad to DNS (#4927)
* Update dns.json

* Fix Mullvad DNS review issues

* Add Mullvad secondary resolvers

* Register DoH before changing adapter DNS

* Report DNS failures to tweak workflow

* Handle non-terminating DNS assignment failures

* Preserve DNS fallback and document Mullvad options

---------

Co-authored-by: Chris Titus <contact@christitus.com>
2026-08-09 19:43:19 -05:00
makhlwf afc3e1eec2 Fix screen reader button accessibility and category navigation (#4944)
* Fix UI automation peer wrapping and category focusability

* Add accessibility name to SettingsButton

* Avoid nesting ScrollViewer in generated panels with outer viewers

Inspect targetGrid and its parent hierarchy in Invoke-WPFUIElements to avoid adding an inner ScrollViewer when an outer ScrollViewer already exists.
2026-08-09 18:02:53 -05:00
Chris Titus 53fc260cc0 Fix WinOneShot ComboItems compatibility (#4957)
* Fix WinOneShot ComboItems compatibility

* Align ComboItems validation with renderer
2026-08-09 16:47:45 -05:00
Omar bc607b6c91 Make MPO tweak a three-state control (#4897)
* refactor: make MPO tweak a three-state control

* docs: explain MPO tweak states

* docs: address code review comments

* refactor: make Multiplane Overlay config-driven
2026-08-09 14:02:42 -05:00
Vale_ThandFallenGME 7f18b4fd60 Add Roblox entry to applications.json (#4931)
Added The Game Roblox to the Application list.

Co-authored-by: FallenGME <125669256+FallenGME@users.noreply.github.com>
2026-08-09 13:19:23 -05:00
MyDrift 32ab9f0ab0 Turn the Install category filters into toggle chips (#4926)
* Turn the Install category filters into toggle chips

- Replace the filter buttons with toggles that show which ones are active
- Add ctrl click to select more than one category
- Keep the search box and the category filter independent of each other
- Expand matching categories while a filter is active

* Fix the filter interactions the category chips missed

- Pass the selected categories to the lazy rendering batches, the old call
  used a parameter that no longer exists and threw while typing
- Keep the category filter when switching tabs, the chips stayed checked
  while the filter itself was dropped
- Put a category back to collapsed once the filter that expanded it is gone

* Document the Install category filters

- Add a guide section for the chips, ctrl click and clearing the filter
- Note that search and the category chips apply together

* Correct the category filter guide wording

- Clearing by clicking the chip only applies when it is the only one selected
- Only categories with matches expand, and only auto expanded ones re-collapse
2026-08-09 13:13:21 -05:00
Ashvin 9fdadd1c8f Point OpenSSH key setup at the file sshd actually reads (#4936)
* Point OpenSSH key setup at the file sshd actually reads

The Remote Access feature created %USERPROFILE%\.ssh\authorized_keys and
told the user to put their public keys there. sshd does not read that
file for a member of the administrators group; the "Match Group
administrators" block in sshd_config sends those logons to
C:\ProgramData\ssh\administrators_authorized_keys instead. WinUtil always
relaunches itself elevated, so the account it was setting up is always an
administrator, and key auth for it never worked.

The function tried to work around that by commenting the block out, but
those regexes anchor on $, and .NET puts $ before the \n of a CRLF pair.
The sshd_config Windows ships is CRLF throughout, so the replace was a
silent no-op on a stock install. On an sshd_config with LF endings it did
apply, and that is worse than not working: sshd gives an administrator
logon a full token with no UAC prompt, which is why Windows keeps those
keys in ProgramData behind an ACL that requires elevation to write.
Moving the lookup into the profile lets anything running as the user at
medium integrity append a key and get an elevated shell unprompted.

Use administrators_authorized_keys and give it the ACL sshd requires
(inheritance off, Administrators and SYSTEM only, by SID so localized
installs work). Where the sshd_config edit did land, undo it and copy any
keys out of the profile file first so key auth is not cut off mid-session.
Keys are only copied when the block needs restoring, so a default config
never grants access sshd was not already granting.

Also stop creating the profile .ssh directory: under elevation it was the
elevating administrator's profile, not necessarily the caller's.

* Document where to put SSH keys for the OpenSSH server feature
2026-08-09 13:08:33 -05:00
Phuc To 6de45a38b9 Fix UI helper errors during headless -Preset and -Config runs (#4941)
* Make UI helpers no-op when no window exists

The -Preset and -Config paths run Invoke-WinUtilAutoRun before the XAML
form is created and before PresentationCore is loaded, so every call into
Invoke-WPFUIThread failed with InvokeMethodOnNull and every call into
Set-WinUtilTweaksProgressIndicator failed to resolve [Windows.Visibility].
The errors were non-terminating, so tweaks still applied, but each run
filled the log with noise.

Loading presentationframework earlier does not help: Visibility lives in
PresentationCore, which only loads once a WPF object is instantiated, and
the XAML-named progress controls do not exist in these paths either.
Guarding the two helpers covers Invoke-WPFtweaksbutton, Invoke-WPFundoall
and Invoke-WPFFeatureInstall, which the existing per-call-site $hasUI
convention never reached.

* Suppress stray console output from automation runs

Invoke-WPFRunspace returns an IAsyncResult that no caller uses, and
Set-WinUtilRegistry was the only New-PSDrive call site that did not
suppress its output. A GUI click handler discards both, but the -Preset
and -Config paths call the workflows directly, so an async handle dump
and a PSDrive table landed in the user's log.

The handle itself is kept because pester/runspace.Tests.ps1 asserts that
Invoke-WPFRunspace returns a single IAsyncResult, so the suppression goes
at the four call sites reachable from Invoke-WinUtilAutoRun.

* Add project learning for window-free UI helpers
2026-08-09 13:06:17 -05:00
Vinicius Costa Amorim 8860caf357 fix: apply imported config selections to lazily-built tabs (#4938)
Tabs other than Install build their checkboxes lazily on first visit.
Import populates $sync.selected* and calls Reset-WPFCheckBoxes, but
that only touches checkboxes that already exist in $sync, so any tab
not yet visited gets its controls built later with default (unchecked)
state and never reflects the import. Re-apply Reset-WPFCheckBoxes right
after a tab's controls are built so it picks up existing selections.
2026-08-09 12:59:13 -05:00
PChaicotandChris Titus 8fb078da4c Add foobar2000 back into applications.json (#4932)
* Add foobar2000 back

* Add Fast Node Manager entry to applications.json

---------

Co-authored-by: Chris Titus <contact@christitus.com>
2026-08-09 12:57:25 -05:00
Vinicius Costa Amorim 95e3a54405 feat: add mpv to Multimedia Tools app list (#4940)
mpv has no official Windows installer; winget id shinchiro.mpv is the
de facto standard Windows build. Choco mpv/mpv.install are flagged
"Possibly broken" upstream, so winget is the sole install source.
2026-08-09 12:53:11 -05:00
Sean (ANGRYxScotsman) c817d3329a Enhance SEO and social metadata for documentation homepage (#4923)
* Add SEO metadata to docs home

Add a robots.txt sitemap directive and JSON-LD SoftwareApplication metadata to the docs homepage to improve search engine discovery and rich results.

* Add social preview metadata

Add Open Graph and Twitter image metadata for the docs site and include a new shared social preview image. Also set the homepage title metadata to match the documentation branding.
2026-08-09 12:48:15 -05:00
Omar 19f938e876 feat: restore useful development applications (#4930) 2026-08-09 12:45:53 -05:00
Vyas Devgna d64bb18717 docs: correct Win11 Creator behavior after the ISO workflow refactor (#4920)
* docs: correct Win11 Creator behavior after the ISO workflow refactor

The creator stopped stripping unused editions, loading offline registry
hives, and running component store cleanup in #4862. It now copies the
ISO contents and applies the selected edition through sources\ei.cfg and
autounattend.xml, leaving install.wim alone unless drivers are injected.

Update the guide and the architecture reference to match, and note that
the output ISO is close to the size of the source.

* docs: align disk space, driver injection, and stuck-run guidance

The disk space block still carried the pre-refactor 10-15 GB workspace,
2.5-3.5 GB output, and ~25 GB total, which contradicted the copy-based
numbers in the data flow. Restate them against the source ISO size.

Driver injection never touches boot.wim. It adds every exported driver
to the selected install.wim index and stages only the storage packages
in $WinpeDriver$ for WinPE, so correct both the guide and the reference.

The stuck-run troubleshooting entry pointed at a WIM dismount that only
happens when driver injection is enabled.

* docs: narrow this PR back to the edition and output size claims

The earlier commits rewrote the surrounding Win11 Creator sections,
which went well beyond what #4918 was about and presented the rest of
the section as reviewed when it had not been.

Restore the untouched text and keep only the claims that promised a
size reduction or edition removal: the strip-editions and component
store bullets, the two data flow lines, and the modified ISO size.
2026-08-09 12:45:14 -05:00
Chris Titus 5ad168e0c4 Create winoneshot-compat.Tests.ps1 2026-08-09 12:27:07 -05:00
8d3adb599f Replace the FOSS dot with a corner badge on app entries (#4924)
* Replace FOSS dot with a corner badge on app entries

- Add New-WinUtilFossBadge, the open source keyhole on a green backdrop
- Mark FOSS apps with a corner triangle instead of a dot after the name
- Give the FOSS legend a circle badge and move it below the buttons
- Sort Note entries last, they shared a rank with checkboxes before

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Update functions/private/Initialize-InstallAppEntry.ps1

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
2026-08-06 12:51:58 -05:00
Omar f7c072341d Fix USB creation when install.wim is read-only (#4910)
* fix: allow USB WIM splitting

* test: guard USB WIM splitting fix
2026-08-04 16:01:12 -05:00
FallenGME 32cc623959 Teamspeak6 Added (#4915)
TS 6 is obv. better than TS3
2026-08-04 16:00:19 -05:00
Sean (ANGRYxScotsman) b096aaa5e5 Centralize agent instructions in SPEC (#4912)
* Centralize agent instructions in SPEC

Move the full coding-agent contract and repository guidance from `AGENTS.md` into `SPEC.md`, and reduce `AGENTS.md` to a simple pointer to the canonical instructions. Add lightweight `CLAUDE.md`, `GEMINI.md`, and `.github/copilot-instructions.md` files so different assistants consistently bootstrap through the same repo-specific guidance.

* Clarify auto-generated docs path scope in SPEC

Narrowed rule #3 to specify exact auto-generated subdirectories (tweaks/ and features/) rather than the entire code-reference/ directory, and clarified that other hand-written pages (e.g. architecture.mdx) may be edited directly.

* Remove archived docs from gitignore

Drop the old `docs-old` Hugo ignore rules from `.gitignore`, reflecting that the archived docs build artifacts no longer need special handling there.

* Add local env files to docs .gitignore

Add .env.local and .env.*.local patterns to prevent local environment files from being committed.

* Clarify test and git hygiene guidance

Update `SPEC.md` to run Pester in CI mode and tighten repository hygiene instructions around ignored files. The git guidance now points contributors to the actual `.gitignore` files and clarifies that `docs/public/` contains tracked static assets rather than generated output.

* Split agent workflow from project spec

Move repository working instructions into `AGENTS.md` and refocus `SPEC.md` on the stable WinUtil project contract. This separates agent-specific guidance from architecture, build, runtime, docs, testing, and release details so both documents have clearer ownership.

* docs: clarify Pester, ScriptAnalyzer, and source-of-truth rules

Expand AGENTS.md with context on why -SkipPublisherCheck is needed for Pester installation, why winutil.ps1 should be deleted before running ScriptAnalyzer, and clarify that the source-of-truth rule applies only to compiled-script behavior — repository metadata files are edited directly.

* Clarify Pester install command and -SkipPublisherCheck reason

Expands the explanation for why -SkipPublisherCheck is needed (catalog-signed vs Authenticode-signed), clarifies it does not skip download integrity, and adds -Repository PSGallery to pin the trusted source explicitly.
2026-08-04 15:29:49 -05:00
Chris Titus a0142ace72 chore: Update generated dev docs and JSON links (#4909) 2026-08-03 19:12:47 -05:00
Omar 97f2ad6e98 Fix windev prerelease version during elevation (#4908)
* Fix prerelease elevation cleanup

* Support restricted PowerShell in windev

* Use current PowerShell engine in windev
2026-08-03 19:10:49 -05:00
Omar 97e0711034 Restore Document category and applications (#4902)
* feat: restore document category

Moves existing document-focused apps into the Document category and adds its filter chip.

* feat: restore document applications

Restores reviewed document-focused apps removed in PR #4451.

* chore: update apps list as per code review comments

This also updates the link for PDF24 Creator

* test: verify document category filter wiring

Covers the Document filter handler and config category presence.

* fix: categorize Calibre as multimedia

Keeps the e-book reader in Multimedia Tools.
2026-08-03 19:07:56 -05:00
Omar b832da622f Restore native window animations and custom caption hit testing (#4888)
* feat: restore native window animations

* fix: disable native caption button hit testing

* test: remove fake window state assertions
2026-08-03 18:54:06 -05:00
Mohammad Faiz f7361fdb72 fix: repair popup install binding, dialog titles, presets switch, radio groups, JSON, tests (#4893)
* fix: repair popup install binding, dialog titles, presets switch, radio groups, JSON, tests

- Invoke-WPFInstall: add param block so the right-click app popup binds
  -PackagesToInstall. It previously dropped the argument into $args and
  installed the whole selected list instead of the clicked app (or warned
  that nothing was selected).
- Replace undefined $AppTitle with "WinUtil" in Install/UnInstall warning
  boxes, matching the XAML window title and sibling dialogs.
- tweaks.json: remove stray nested "link" inside the WPFToggleScrollbars
  registry entry (dead property; registry entries expose only the six
  consumed fields).
- Invoke-WPFPresets: fix dead switch cases to the wildcard-pattern
  convention so selectedFeatures/selectedToggles clear correctly.
- Invoke-WPFUIElements: store the group StackPanel in radioButtonGroups so
  grouped radio buttons share one container (else branch was unreachable).
- sanity.Tests.ps1: pass the Windows PowerShell parser script via
  -EncodedCommand; -Command string marshaling corrupted backticks/quotes and
  produced false parse failures.
- install-workflow.Tests.ps1: remove the AppTitle workaround and update
  title assertions to "WinUtil"; drop orphaned cleanup lines.
- Add CHANGES.md with technical and plain-language explanations.

Verified: each bug reproduced against HEAD, fixes demonstrated to change
behavior, full Pester suite 471/471.

* Delete

* test: cover the explicit popup install parameter path

Add a regression test invoking Invoke-WPFInstall -PackagesToInstall with a
package different from the default sync.selectedApps selection and assert
the runspace receives the explicit object, mirroring the Initialize-WPFUI
popup call shape. Existing default-path coverage is unchanged.
2026-08-03 12:03:03 -05:00
Sean (ANGRYxScotsman) f3cf1587e0 Import YouTubeEmbed in tweaks guide (#4907)
Add the `YouTubeEmbed` component import to `docs/src/content/docs/guides/tweaks.mdx` so the guide can use embedded YouTube content without missing-component build issues.
2026-08-03 11:57:01 -05:00
Vyas Devgnaandvyas-devgna 91ffd3af30 Refactor UI checkbox and toggle state synchronization (#4885)
Co-authored-by: vyas-devgna <vyas-devgna@users.noreply.github.com>
2026-08-03 11:38:26 -05:00
Sean (ANGRYxScotsman) 1ef581026f Fix image paths in GitHub markdown docs (#4905)
Update image links in `.github/CONTRIBUTING.md` and `.github/READMEITALIAN.md` from `../docs/...` to `/docs/...` so screenshots resolve correctly when viewed from the `.github` directory context on GitHub.
2026-08-03 11:37:32 -05:00
Sean (ANGRYxScotsman) 89fd09fc0e fix(docs): add mobile navigation to the splash homepage (#4904)
The homepage uses Starlight's splash template, which has no sidebar and
therefore never gets Starlight's own mobile menu toggle - on narrow
viewports there was no way to reach any nav link at all. Add a small
toggle + panel in the header (only rendered on pages without a sidebar)
exposing the same links as the desktop nav, and group it with the
search icon so mobile actions sit together instead of spread across
the header.

Also add the Store and Forums links to the real sidebar config so
they're reachable on mobile on every other page too (previously only
in the desktop-only top nav), and pull both URLs from a shared
site-links.ts so the sidebar config and header can't drift apart.
2026-08-03 11:36:46 -05:00
Sean (ANGRYxScotsman)andChris Titus 056a819470 Refresh Applications tab screenshots and reorder docs to match the app (#4903)
* Update Applications tab screenshots

Replace outdated install/uninstall/show-installed screenshots and add
new ones for upgrade-all, clear-selection, selected-apps counter, and
collapse/expand categories.

* Update Applications guide with new screenshots and sections

Point each tab at its refreshed screenshot, reorder tabs to match the
sidebar button order in the app, and document the Upgrade All,
Selected Apps counter, and Collapse/Expand Categories controls.

* Add missing Updates tab screenshot

The image was referenced by the Updates guide but was never checked
into the repo.

* Reorder screenshots to follow their intro paragraph

Move the tab screenshot below the introductory text on the Tweaks and
Updates guide pages, matching the paragraph-then-screenshot layout
used elsewhere in the docs.

---------

Co-authored-by: Chris Titus <contact@christitus.com>
2026-08-03 11:36:03 -05:00
Sean (ANGRYxScotsman) e96f990c60 Fix alignment issues, update links, and enhance documentation (#4898)
* Fix the same arrow-icon alignment issue on the "Read the Docs" button

Same root cause as the hero/final-CTA buttons: the label was plain
markdown text, which MDX wrapped in a <p>, and the icon was missing
the size/nudge applied elsewhere. Match it to the other two buttons.

* Rename known-issues page slug to knownissues

Update the sidebar config, nav dropdown, and every internal link that
pointed at /known-issues/ to match.

* Fix image paths in root-level markdown to match the new docs site

The Hugo docs site (docs/assets/images/...) has been replaced by the
Astro site (docs/src/assets/...); update CONTRIBUTING.md,
READMEITALIAN.md, and README.md to point at the new asset locations.

* Remove unused houston.webp asset

Leftover Starlight default-theme asset with no references anywhere
in the docs site.

* Fix docs site reference in generator docs

Updates `tools/devdocs-generator.md` to describe link generation correctly: links now point to the Astro/Starlight documentation site instead of the old Hugo site.

* Point docs homepage CTAs to guides hub

Updates the docs landing page CTA links to use `/guides/` instead of `/guides/getting-started/` in the hero action and both “Get Started”/“Read the Docs” buttons, routing users to the guides index.

* Add reusable YouTube embeds to docs guides

Introduces a new `YouTubeEmbed.astro` component for responsive 16:9 video embeds using the privacy-enhanced `youtube-nocookie.com` domain. The User Guide index and Tweaks guide now import and use this component instead of plain YouTube links, and the component includes styling that overrides Starlight’s iframe reset so embedded videos render at the correct size.

* Fix YouTube embed iframe height via not-content

Add the `not-content` class to the embed wrapper so Starlight's markdown reset no longer overrides `iframe { height: auto }`. Drop the `@layer starlight.core` wrapper and `!important` overrides that were compensating for the same issue.

* Clarify docs comments across Astro components

Adds and refines inline comments in the docs site config, custom Starlight components, and theme styles to better explain layout structure, navigation dropdown behavior, hero composition, and theme initialization. Also normalizes a few multi-line comments into single-line form for readability without changing functionality.

* Set secondary docs button background color

Update `.wu-btn-secondary` in the docs theme to use `var(--sl-color-gray-6)` instead of a transparent background, improving button visibility and contrast while keeping existing border and hover behavior.

* Move User Guides into docs dropdown

Updates the docs header navigation so the “User Guides” link is grouped under the existing “Documentation” dropdown instead of appearing as a separate top-level nav item. This keeps related documentation links together and simplifies the top navigation.

* Fix hero margin and center trust section

Remove the automatic 1.5rem top margin Starlight adds between the hero and the content column. Also flex-center the trust section so its content is properly aligned.

* Disable edit links in generated dev docs

Update `tools/devdocs-generator.ps1` to include `editUrl: false` in the frontmatter for generated tweak and feature docs pages. This prevents Starlight from showing edit links on these auto-generated pages.

* Move docs update PRs to pre-release flow

The docs Pages workflow is simplified to only build and deploy the docs site: it now triggers only on docs changes, drops extra permissions/default shell settings, and removes the dev-docs generation + auto-PR steps. The pre-release workflow now owns that automation by expanding its PR step to include generated code-reference docs alongside JSON link updates, with updated commit/title/body text and a documentation label.

* Shorten generated docs source note

Simplify the autogenerated DevDocs notice so generated pages only warn against direct edits while still linking back to the source file.

* Improve docs header dropdown behavior

Reworked the header nav dropdown triggers to use native `<details>/<summary>` instead of buttons, then updated menu visibility logic to use `details[open]` for no-JS support on touch and keyboard while preserving hover behavior. Also renamed the “Developer Docs” link to “Code Reference” and tightened related CSS comments.

* Refresh contribution and docs workflow docs

Updated contributor-facing docs to use consistent Markdown admonition blocks, cleaned Mermaid fence formatting, and fixed minor wording/capitalization in contribution steps. Clarified `devdocs-generator` behavior so workflow ownership is explicit: generation now documented as part of `pre-release.yaml` (via docs-update PR), while `docs.yaml` is documented as build/deploy only.

* Fix contributing guide grammar

Correct the "it's" to "its" typo in both contributing guides so the pull request guidance is consistent across the GitHub and docs versions.
2026-08-03 10:23:31 -05:00
Chris Titus e591161dac Update sponsors in README (#4900) 2026-08-01 10:46:40 -05:00
Chris Titus d98f8a9916 Update README.md 2026-07-31 15:32:15 -05:00
Chris Titus 144d516751 chore: Update generated dev docs (#4895) 2026-07-31 15:29:34 -05:00
Sean (ANGRYxScotsman) 6f0629207a Gave the docs steroids. sorry for the big pr. (#4892)
* Scaffold Astro + Starlight docs site

Bootstraps a new docs-astro project to replace the Hugo-based docs,
using Astro's Starlight framework with the content collection schema
and sidebar navigation configured for WinUtil's docs structure.

* Add WinUtil-branded Starlight theme

Restyles Starlight's default look with a dark-by-default grayscale
palette and WinUtil's brand blue (#0567ff, from the app logo) as the
single accent, Geist for UI text, and JetBrains Mono for code. Also
overrides the default theme provider so first-time visitors land on
dark mode instead of following OS preference.

* Add custom Hero and CornerCard components

Hero overrides Starlight's default hero with a full-bleed grid/glow
background, a browser-chrome-framed screenshot, and a badge row driven
by frontmatter data. CornerCard is a bordered feature card with corner
brackets, used for the landing page's feature grid.

* Migrate docs content from Hugo to Astro/Starlight

Ports the landing page, user guide sections, FAQ, known issues,
contributing guide, and a sample generated tweak reference page from
the Hugo site, converting Hugo shortcodes and GFM alert syntax to
their Starlight/MDX equivalents.

* Use Windows-style caption buttons in hero window chrome

Swap the macOS traffic-light dots for a minimize/maximize/close
button group, since WinUtil is a Windows tool.

* Use Windows-style caption glyph for terminal code blocks

Replace Expressive Code's default macOS dots on terminal-framed code
blocks with a right-aligned Windows minimize/maximize/close icon,
matching the hero window chrome.

* Archive the Hugo docs site as docs-old

* Promote Astro/Starlight docs from docs-astro to docs

* Show the launch command as a copyable code block on the docs homepage

* Add docs codeowner for seanh1995

* Register custom Header component for Starlight docs site

* Add custom navbar links to Astro docs, matching the old Hugo site's top nav

* Point dev docs generator at the Astro/Starlight docs site

Output moves from docs/content/dev (Hugo) to
docs/src/content/docs/code-reference (Astro/Starlight): .mdx instead
of .md, Starlight-style title="..." code fence labels instead of
Hugo's filename/linenos shortcode, and a ":::note" aside linking back
to each entry's source file. Frontmatter description is now pulled
from the JSON Description field. Also fixes a pre-existing bug where
the embedded JSON snippets were always missing their own closing
brace.

* Add seanh1995 as codeowner for the dev docs generator

* Wire up Code Reference section in docs sidebar

Adds an Architecture & Design page plus autogenerated Tweaks/Features
Reference groups pointing at docs/src/content/docs/code-reference, and
fixes the editLink base URL to the promoted docs/ path.

* Port architecture doc to code-reference and drop stale hyperv sample

Moves the Hugo-era architecture doc into
docs/src/content/docs/code-reference/architecture.mdx: drops the
Hugo-only weight/toc frontmatter, converts the embedded code fences to
Starlight's title="..." syntax, and repoints the "Related
Documentation" links at this site's actual slugs. Also removes the
hand-written reference/tweaks/hyperv.mdx placeholder now that the
generator produces the real page under code-reference/features.

* Keep pre-conversion backup of devdocs-generator.ps1

Snapshot of the script before it was pointed at the Astro/Starlight
docs site, for reference.

* updated workflow

* Update CODEOWNERS

* Hide edit-page link on the docs landing page

The splash-template landing page isn't a source doc meant to be edited
via GitHub like the rest of the guides, so skip showing the link.

* Add site footer with copyright line, matching the old Hugo docs

The Hugo site rendered "© {year} Chris Titus Tech. All rights
reserved." in its footer; Starlight's default footer had no
equivalent. Override it to append the same copyright line below the
existing edit-link/pagination row, and collapse that row entirely
when it has nothing in it (e.g. pages with editUrl disabled and no
prev/next) instead of leaving an empty gap.

* Fix vertical alignment and size of the arrow icon in hero/CTA buttons

The right-arrow icon read as floating above the button label's
baseline. Root cause was partly a genuine optical mismatch (fixed with
a small position nudge scoped to just the arrow icon, so it doesn't
also shift the unaffected GitHub icon) and partly the final CTA's copy
getting wrapped in a <p> by MDX's markdown parser, which behaved
slightly differently under the flex layout than the Hero component's
plain text node. Switching the CTA button's label to a JS string
expression avoids the wrapper and keeps both buttons' markup, and
rendering, identical.

* Use the dark fork-button screenshot in the contributing guide

Drop the unused light-mode variant and point the guide at
Fork-Button-Dark.png instead.

* Remove old Hugo docs site and pre-conversion backup files

The docs have moved to the Astro/Starlight site; the Hugo site
(docs-old/), its workflow backup, and the devdocs-generator.ps1
pre-conversion snapshot are no longer needed.

* keeping ai happy

* Bump sharp to 0.35.3 in docs site
2026-07-31 15:29:00 -05:00
Kobi Hikri 5f37ef4a80 ci: read the PR body from env instead of interpolating it into the shell (#4880) 2026-07-28 14:11:17 -05:00
Omar d790118546 Add DNS-over-HTTPS (DoH) support (#4856)
* feat: Add DoH templates for DNS providers in configuration

* feat: Implement DoH support for DNS configuration and management

* feat(pester): enhance DNS tests to include DoH server address handling and template application

* fix: address codex feedback

* fix: update existing DoH server entries

* fix: enable DoH auto-upgrade

* fix: handle DNS setup failures

* fix: remove DoH state on DHCP reset
2026-07-28 14:09:44 -05:00
5ebb24b107 Refactor Win11 Creator ISO workflow (#4862)
* refactor: simplify Win11 Creator ISO workflow

Keep no-driver ISO generation on the fast copy-only path.

Inject exported drivers with one selected-index WIM mount, one Add-Driver pass, and one commit.

Limit WinPE staging to boot-storage drivers and improve workflow validation coverage.

* refactor: stage Win11 setup script fallback

Copy the prepared setup script payloads into sources/$//Setup/Scripts so setup media does not depend solely on answer-file extension extraction.

Keep the existing autounattend execution path unchanged and cover the fallback files in the Win11 Creator tests.

* refactor: address codex feedback

* refactor: run ISO verification in runspace

Rename the ISO logger to Write-WinUtilISOLog so the shared runspace pool imports it automatically. Run Mount & Verify off the WPF thread with dispatcher-safe UI updates, and add Pester coverage for the runspace and logger contract.

* refactor: address ISO review feedback

Keep the selected ISO stable during background verification. Apply ContentDeliveryManager settings to both the first account and the default profile. Block FAT32 USB creation when install.esd exceeds the supported file size.

* refactor: address ISO setup edge cases

Set BypassNRO before OOBE so local account setup is available during Windows Setup.

Detect registered DISM mounts during driver-injection cleanup so partial mount failures are discarded.

* refactor: address ISO review edge cases

Use the actual FAT32 file limit for install.esd USB checks.

Disable ISO modification while mount verification is running.

Apply unsupported-hardware notice suppression to the first user profile.

* refactor: stage ISO setup safeguards earlier

Set device encryption and reserved-storage registry guards before OOBE.

Enable the OEM configuration-set fallback when setup scripts are staged there.

* Update functions/private/Invoke-WinUtilISOUSB.ps1

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

---------

Co-authored-by: Chris Titus <contact@christitus.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
2026-07-28 14:08:56 -05:00
Chris Titus fae58d73c4 Update sponsors in README (#4881) 2026-07-28 11:10:13 -05:00
Chris Titus 9e2989964e Update sponsors in README (#4878) 2026-07-27 11:14:18 -05:00
Omar 50be7390e5 fix: restore WindowStyle to SingleBorderWindow for proper window framing (#4868) 2026-07-22 12:42:25 -05:00
Chris Titus 8ab02ae756 chore: Update generated dev docs (#4873) 2026-07-22 12:42:13 -05:00
Omar 7d1a03dcc9 bugfix(tweaks): fix OneDrive uninstall path (#4864)
* bugfix(tweaks): fix OneDrive uninstall path

* bugfix(tweaks): use SystemRoot for OneDrive path
2026-07-22 12:41:48 -05:00
Paweł Gwozdowski 5a4c9c883d Revert "Rework contributing.md (#4567)" (#4855) 2026-07-22 12:34:14 -05:00
Chris Titus 5c104d02e2 Update automated update PR workflows and filter release notes 2026-07-16 13:39:33 -05:00
Chris Titus 06f33e88ba Fix Show Installed Apps reliability and selection (#4850)
* Fix Windows PowerShell runspace cleanup callback

* Fix installed app package ID matching

* Synchronize installed app selection UI

* Streamline installed app detection

* Avoid installed app UI runspace deadlock
2026-07-16 13:30:12 -05:00
b9dee86694 refactor: style and align Install tab filter chips (#4848)
* refactor: implement FilterChipStyle for Install tab category filters

- Created a dedicated FilterChipStyle style block with custom padding, cursor, and height definitions

- Applied FilterChipStyle to all category filter buttons

- Added a new 'Filters' TextBlock section title aligned with the sidebar actions

* Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Chris Titus <contact@christitus.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
2026-07-16 10:37:25 -05:00
Omar 3d1904ebbe fix: wrap Tweaks header buttons to prevent layout clipping (#4847) 2026-07-16 10:29:16 -05:00
Chris Titus 70f1c50bdd chore: Update generated dev docs (#4846) 2026-07-15 23:37:16 -05:00
github-actions[bot]andChrisTitusTech 2e5df82979 Update sponsors in README (#4820)
Co-authored-by: ChrisTitusTech <7896101+ChrisTitusTech@users.noreply.github.com>
2026-07-15 23:37:06 -05:00
Chris Titus 29595f90e2 Fix progress, update profiles, and documentation links (#4845)
* Improve O&O ShutUp10++ download flow

* Refine Windows Update profile behavior and docs

* Fix documentation link regressions

* Restore updates when applying recommended profile
2026-07-15 23:36:46 -05:00
Chris Titus 9ed06e793a Replace install progress overlay with shared indicator (#4844)
* Use shared progress for app workflows

* Remove legacy install progress overlay

* Document shared app progress indicator

* Address progress review feedback

* Track all Win11 ISO progress

* Restore Win11 Creator work on relaunch
2026-07-15 22:35:58 -05:00
FourSevenandChris Titus 51cb3811dd Add category search chips to Install tab for improved filtering (#4826)
* Add Quick Category Search Chips to Install tab

Add category shortcut chips on the Install tab that insert the category
name into the existing search box. Append each app's category as a
description tag so the existing description search filters by category.
Reuses the standard button style and existing search; no search, install,
or preset logic is changed.

* Fix install category chip filtering

* Fix category filter refresh behavior

---------

Co-authored-by: Chris Titus <contact@christitus.com>
2026-07-15 20:54:22 -05:00
Yayo RazoandChris Titus 975616b58f Fix search bar overflowing behind icon buttons at narrow window sizes (#4831)
* fix(search): make search bar stretch instead of overflowing at narrow window sizes

* fix(ui): sync runtime MinWidth override with XAML value

Add_Loaded was hardcoding $sync.Form.MinWidth back to 1000 after
load, overriding the 1150 set in inputXML.xaml and letting the
window shrink below the space the search bar/toolbar layout needs.

* fix(ui): address responsive search review feedback

* fix(ui): enforce usable toolbar width

---------

Co-authored-by: Chris Titus <contact@christitus.com>
2026-07-15 20:41:41 -05:00
Yayo RazoandChris Titus 11783c75a8 fix(dns): scope leaked ToggleButton style and theme the ComboBox dropdown popup (#4835)
Co-authored-by: Chris Titus <contact@christitus.com>
2026-07-15 17:09:10 -05:00
13a18eeeb2 Add maximaze button (#4841)
* Add maximize button logic and update assets

* Add maximize button with theming

* delelte logo

* Center and restyle the window control buttons

* Fix window state test setup

---------

Co-authored-by: aran628 <aran2014+@gmail.com>
Co-authored-by: Chris Titus <contact@christitus.com>
2026-07-15 16:59:51 -05:00
Chris Titus 822003d87f Fix AppX detection and add package restore support (#4842)
* Fix installed AppX package detection

* Add AppX package restore workflow

* Add AppX operation progress feedback

* Fix AppX operation launch race

* Handle AppX workflow failures
2026-07-15 15:57:56 -05:00
Yayo RazoandChris Titus c8c3c7869f Add window-level progress indicator for Run Tweaks and Undo (#4830)
* feat(tweaks): add window-level progress indicator for Run Tweaks and Undo

* Hide completed tweaks progress on next action

---------

Co-authored-by: Chris Titus <contact@christitus.com>
2026-07-15 14:17:42 -05:00
Paweł Gwozdowski 157a66b14d Update Invoke-WPFUIElements.ps1 (#4824) 2026-07-13 13:20:53 -05:00
OmarandChris Titus 9791386f53 fix: resolve silent failures in AppX removal and PS7 DISM bugs (#4822)
* fix: resolve silent failures in AppX removal and PS7 DISM bugs

- Fixed a bug where Remove-AppxPackage failed silently in PowerShell 7 due to pipeline binding issues. We now explicitly loop through Get-AppxPackage results and pass PackageFullName directly.
- Added wildcard matching to Get-AppxPackage and Get-AppxProvisionedPackage to reliably locate packages regardless of short name vs family name variations.
- Offloaded Get-AppxProvisionedPackage and Remove-AppxProvisionedPackage execution to Windows PowerShell 5.1 (powershell.exe) to bypass PowerShell 7 DISM COM exceptions ("Class not registered") and performance hangs.
- Deduplicated AppX removal logic by calling Remove-WinUtilAPPX directly from Invoke-WPFAppxRemoval instead of copying the implementation.

* refactor(Remove-WinUtilAPPX): use script block to improve readability

* feat: enhance AppX removal process and add provisioned package removal function

* fix(tests): update AppX removal tests

This also adds tests for the new Remove-WinUtilProvisionedAPPX functionality

* Move AppX removal under Tweaks

* Address AppX removal review feedback

* Complete AppX removal error handling

* Prevent AppX cleanup confirmation prompts

---------

Co-authored-by: Chris Titus <contact@christitus.com>
2026-07-13 13:16:35 -05:00
Chris Titus c8e756dc11 chore: Update generated dev docs (#4838) 2026-07-13 11:40:20 -05:00
Sean (ANGRYxScotsman) 9e21c8f4a7 Updated ConsumerFeatures description and small dev doc edit (#4817)
* Update tweaks.json

* Update _index.md

* Update _index.md
2026-07-13 11:39:49 -05:00
Chris Titus 8cd8679512 chore: Update generated dev docs (#4837) 2026-07-13 11:37:52 -05:00
KarimandChris Titus ac11c73b64 feat(legacy-panels): add Firewall, Security, Programs, and Mouse to L… (#4809)
* feat(legacy-panels): add Firewall, Security, Programs, and Mouse to Legacy Windows Panels

- Added `firewall.cpl`, `wscui.cpl`, `appwiz.cpl`, and `main.cpl` to `config/feature.json`

* chore(legacy-panels): alphabetize panel entries

---------

Co-authored-by: Chris Titus <contact@christitus.com>
2026-07-13 11:37:22 -05:00
Karim 9d67514bf9 feat(apps): add gsudo (#4810)
- Added gsudo to the Pro Tools category to provide a native sudo equivalent for Windows terminals.
2026-07-13 10:26:44 -05:00
Chris Titus fea9f4e869 chore: Update generated dev docs (#4836) 2026-07-13 10:26:33 -05:00
matthewkasiskiandmatthewkasiski 1aa0dd90ef prevent-automatic-download-of-applications-associated-with-device-metadata (#4827)
* add tweak

* add devdocs

* add devdocs

---------

Co-authored-by: matthewkasiski <matt@matthewkasiski.me>
2026-07-13 10:25:58 -05:00
Yayo Razo 90a19685f5 fix(install): use correctly-scoped $app instead of undefined $Apps in app entry rendering (#4834) 2026-07-13 04:23:24 -05:00
Vyas DevgnaandChris Titus 007995c112 Improve install app card UI (#4771)
Co-authored-by: Chris Titus <contact@christitus.com>
2026-07-11 11:21:59 -05:00
Chris Titus 0dcd361c51 Remove slash commands for contributors 2026-07-09 14:25:50 -05:00
eduardodepaiva aeaef46e30 Fix names in applications.json. (#4819) 2026-07-08 10:25:15 -05:00
Ivan Lepekha e0dfeb4f4d Remove Lightshot entry from applications.json (#4808)
Removed Lightshot application entry from applications.json
2026-07-04 09:52:55 -05:00
Chris Titus 1c7ee06bbe chore: skip automated updates in changelog 2026-07-04 00:58:24 -05:00
github-actions[bot]andChrisTitusTech ed6de94c46 Update sponsors in README (#4544)
Co-authored-by: ChrisTitusTech <7896101+ChrisTitusTech@users.noreply.github.com>
2026-07-04 00:52:10 -05:00
Chris Titus 640b02868a fix(iso): resolve windows update re-enabling failures on first boot (#4807)
* fix iso update service reenable

* test allow font scale sync state
2026-07-04 00:50:45 -05:00
Vyas DevgnaandChris Titus 29b269201d Add font scaling keyboard and mouse shortcuts (#4781)
* Add font scaling shortcuts

* Fix font scaling shortcut modifiers

---------

Co-authored-by: Chris Titus <contact@christitus.com>
2026-07-04 00:32:39 -05:00
Gabi 9fed8d1c4c Reapply font scaling after theme change (#4782) 2026-07-04 00:29:22 -05:00
Chris Titus 4ae3549b8a chore: Update generated dev docs (#4806) 2026-07-04 00:21:28 -05:00
Ivan Lepekha e72ac75d13 feat(github): Add version context for issues (#4803)
* Create app suggestion discussion template

Add a discussion template for app suggestions with rules and input fields.

* Add application suggestion link to issue template

Added a link for suggesting applications to the issue template.

* Update app suggestion discussion template

* Add checkbox for WinGet application presence check

* Changed name of file, didn't change name of link XD

* Add WinUtil version input to bug report template

Added input field for WinUtil version in bug report template.

* whoops :^)

* Someone forgot that label is single value parameter

* GH Wiki is a liar

* GH Docs are looking awful
2026-07-04 00:21:26 -05:00
LKmXr 9846dd7b49 Fix Multiplane Overlay toggle (#4768)
* Fix MPO values

DisableOverlays should be 0

* Update tweaks.json
2026-07-04 00:20:48 -05:00
eduardodepaiva 466d32e690 Add MiniTool Partition Wizard and fix Everything sorting. (#4766) 2026-07-04 00:10:40 -05:00
Chris Titus dce1536be0 chore: Update generated dev docs (#4805) 2026-07-04 00:06:25 -05:00
GabiandChris Titus 894d62ca68 Added WPFToggleWindowSnapping to tweaks.json (#4748)
* Added WPFToggleWindowSnapping to tweaks.json

* Update tweaks.json

* Update tweaks.json

* Update tweaks.json

* Update tweaks.json

* Update tweaks.json

* Add Window Snapping tweak docs

---------

Co-authored-by: Chris Titus <contact@christitus.com>
2026-07-04 00:05:56 -05:00
Paweł GwozdowskiandChris Titus 27e590577b fix: make tweak/feature link (?) follow font scaling (#4700)
* Update Invoke-WPFUIElements.ps1

* Update Invoke-WPFUIElements.ps1

* Update Invoke-WPFUIElements.ps1

Update Invoke-WPFUIElements.ps1

* Fix tweak link margin scaling

---------

Co-authored-by: Chris Titus <contact@christitus.com>
2026-07-03 23:51:11 -05:00
Chris Titus 8147903ff2 chore: Update generated dev docs (#4801) 2026-07-02 15:26:16 -05:00
Gabi 7a72c73906 Talk about "PowerShell 7 from the Microsoft Store" inside of KnownIssues.md (#4758)
* Talk about "PowerShell 7 from the Microsoft Store" inside of KnownIssues.md

* Update Invoke-WinUtilInstallPSProfile.ps1

* Update KnownIssues.md

* Update KnownIssues.md

* Update KnownIssues.md
2026-07-02 15:25:08 -05:00
Chris Titus 32891ada55 Fix DHCP DNS reset handling (#4800) 2026-07-02 15:24:14 -05:00
Chris Titus e2d6f8534e chore: Update generated dev docs (#4798) 2026-07-02 13:29:34 -05:00
Chris Titusandgepardjaro 299b68e82d Added winget uninstall of Copilot. Line 968 Remove-AppxPackage is not working when Copilot is installed back after Windows Updates and the only option that works is using winget (#4797)
Co-authored-by: gepardjaro <192244662+gepardjaro@users.noreply.github.com>
2026-07-02 13:28:57 -05:00
GabiandChris Titus de6652adc0 Remove local file preference storage and cleanup Invoke-WinutilThemeChange (#4617)
* Remove local file preference storage

* Update main.ps1

* Update main.ps1

* Update Set-Preferences.ps1

* Update main.ps1

* Update Set-Preferences.ps1

* Update main.ps1

* Delete functions/private/Set-Preferences.ps1

* simplify Invoke-WinutilThemeChange.ps1

* fix foss highlight in Invoke-WinutilThemeChange.ps1

* Update Invoke-WinutilThemeChange.ps1

* Update Invoke-WinutilThemeChange.ps1

* Update main.ps1

---------

Co-authored-by: Chris Titus <contact@christitus.com>
2026-07-02 13:04:50 -05:00
GabiandChris Titus 727ba52a4d Deleted Test-WinUtilPackageManager.ps1 + custom winget and choco installs + remove winget/choco enums and exeptions (#4606)
* Update Invoke-WPFGetInstalled.ps1

* Update Install-WinUtilWinget.ps1

* Update Install-WinUtilChoco.ps1

* Update Install-WinUtilChoco.ps1

* Update Install-WinUtilWinget.ps1

* Delete functions/private/Test-WinUtilPackageManager.ps1

* Update Install-WinUtilChoco.ps1

* Update Install-WinUtilWinget.ps1

* Update Install-WinUtilChoco.ps1

* Update Invoke-WPFGetInstalled.ps1

* Update Invoke-WPFGetInstalled.ps1

* Update Install-WinUtilChoco.ps1

* Update Install-WinUtilWinget.ps1

* Update Install-WinUtilWinget.ps1

* Update Install-WinUtilChoco.ps1

* Update Install-WinUtilWinget.ps1

* Update Install-WinUtilChoco.ps1

* Update Install-WinUtilWinget.ps1

* Update Install-WinUtilChoco.ps1

* Update Install-WinUtilChoco.ps1

* Update Install-WinUtilChoco.ps1

* Update Install-WinUtilChoco.ps1

* Update Install-WinUtilWinget.ps1

* Fixed lastrun.json

* refactor: remove PackageManagers enum and unused custom exception classes

* Update Invoke-WPFUIElements.ps1

* Update Get-WinUtilSelectedPackages.ps1

* Update Set-Preferences.ps1

* Update main.ps1

* Complete package manager enum removal

Use string package-manager preferences throughout the remaining helpers and focused tests. Restore the existing Winget install flow and package-manager probe helper so PR 4606 keeps the current WinGet repair method.

* Fix string keyed package split

---------

Co-authored-by: Chris Titus <contact@christitus.com>
2026-07-02 12:50:57 -05:00
GabiandChris Titus d45c62e470 Cleanup start.ps1 (#4587)
* Update start.ps1

* Update start.ps1

* Update start.ps1

* Update start.ps1

* Update start.ps1

* Update start.ps1

* Update start.ps1

* Update start.ps1

* Update start.ps1

* Fix startup logging regression

---------

Co-authored-by: Chris Titus <contact@christitus.com>
2026-07-02 12:20:38 -05:00
Chris Titus 492d5b57d7 cleanup 2026-07-02 12:06:36 -05:00
Chris Titus 58d37bb461 Clean up analyzer warnings across app search and ISO workflows (#4794)
* Clean up analyzer warnings

* Align analyzer warning cleanup policy

* Run PSScriptAnalyzer directly in unittests workflow

* Bind lazy-rendered buttons to click handlers

* Remove WinUtil performance tracing

* Fix Win11 ISO creator temp directory reuse
2026-07-02 12:05:25 -05:00
Sean (ANGRYxScotsman) b72bfb03ba Update pre-release.yaml (#4746) 2026-07-02 11:01:18 -05:00
Chris Titus cc2be2d5e8 cleanup 2026-07-02 10:21:41 -05:00
Chris Titus 93dc23dd66 Speed up runspace and tab initialization (#4793)
* Add startup performance tracing

* Lazy initialize non-default tabs

* Render install app entries incrementally

* Defer and cache toggle status checks

* Clean up runspace invocation ownership

* Defer GUI runspace pool startup

* Defer status taskbar asset rendering

* Record final speed verification

* Fix deferred install render timer callback

* Add dispatcher smoke coverage for install rendering

* Replace install render timer with dispatcher callbacks

* Gate performance tracing behind compile switch

* Clean up analyzer warnings in speed changes

* Speed up runspace and tab initialization
2026-07-01 23:34:59 -05:00
Gabi 916dc761ba remove useless xaml changes (#4632) 2026-07-01 21:59:43 -05:00
Chris Titus 2cb20893fc Expand Pester coverage across install, tweaks, and UI workflows (#4792)
* Harden Pester CI and discard runspace return values

* Add prioritized test backlog

* Add WinUtil action logging

* Add config integrity tests

* Add XAML control wiring tests

* Add registry and service helper tests

* Add package manager tests

* Add runspace behavior tests

* Add tweak orchestration tests

* Add install workflow tests

* Add update profile tests

* Add AppX removal tests

* Log package installer output

* Add UI state helper tests

* Pin Pester test runner version

* Expand Win11 Creator tests

* Add preferences and theme tests

* Add search filter tests

* Add compile contract tests

* Use single WinUtil session log

* Remove installer output logging helper

* Handle locked WinUtil transcript log

* Avoid appending to active transcript log

* Log install uninstall package identities
2026-07-01 21:49:15 -05:00
Chris Titus c3b4f85fce Handle Microsoft Store winget sources (#4790) 2026-07-01 17:15:44 -05:00
Chris Titus 104c763132 Fix Win11 Creator product-key validation failures (#4791)
* feat: Enhance Win11 Creator with edition ID handling and update autounattend.xml generation

* Strengthen Pester coverage for config and function files
2026-07-01 17:15:26 -05:00
Chris Titus 8062815655 Merge branch 'main' of https://github.com/ChrisTitusTech/winutil 2026-07-01 13:03:33 -05:00
Chris Titus 58be808823 feat: Add AGENTS.md and SPEC.md for project guidelines and instructions 2026-07-01 13:03:30 -05:00
Chris Titus 77dc64cbea chore: Update generated dev docs (#4787) 2026-07-01 12:24:30 -05:00
Sean (ANGRYxScotsman) 72d47ba020 Update preset configuration (#4744)
* Update preset.json

* Update preset.json
2026-07-01 12:22:17 -05:00
Gabi b6b479685a Stop hardcoding C:\ (#4725)
* Stop hardcoding C:\

* Update tweaks.json
2026-07-01 12:21:21 -05:00
Chris Titus c7dfbeb7fe chore: Update generated dev docs (#4786) 2026-07-01 12:14:00 -05:00
Gabi 7c71a39f7a Feature/appx removal tab (#4729)
* feat: add config-driven AppX package removal tab

- Add config/appx.json with curated list of removable AppX packages

- Add AppX Removal tab (WPFTab6) with Select All, Clear, and Remove buttons

- Reuse existing Invoke-WPFUIElements engine for minimal code footprint

- Add Invoke-WPFAppxRemoval.ps1 for background runspace package removal

- Add theme colors for the new tab button in light and dark modes

* yep

* yep

* yep

* yep

* Update inputXML.xaml

* Update Invoke-WPFButton.ps1

* Update Invoke-WPFButton.ps1

* Update Invoke-WPFSelectedCheckboxesUpdate.ps1

* Update appx.json

* Update appx.json

* Update appx.json

* Update tweaks.json

* Update appx.json

* Update appx.json

* Update appx.json

* Update Invoke-WPFAppxRemoval.ps1

* Update Invoke-WPFButton.ps1

* Delete functions/public/Invoke-WPFAppxRemoval.ps1

* Revert "Update Invoke-WPFButton.ps1"

This reverts commit d8705cc08e.

* Revert "Delete functions/public/Invoke-WPFAppxRemoval.ps1"

This reverts commit 9e45d1ad99.

* Update Invoke-WPFAppxRemoval.ps1

* Update Invoke-WPFAppxRemoval.ps1

* Update Invoke-WPFAppxRemoval.ps1

* Update Invoke-WPFButton.ps1

* yep

* Update appx.json

* Update appx.json

* Update tweaks.json

* Update start.ps1

* Update preset.json

* Update tweaks.json

* yep

* yep

* yep

* yep

* yep

* yep

* Update Invoke-WPFAppxRemoval.ps1

* Update Update-WinUtilSelections.ps1

* Update Update-WinUtilSelections.ps1

* yep

* Update Invoke-WPFAppxRemoval.ps1

* yep

* yep

* Update Invoke-WPFAppxRemoval.ps1

* Update appx.json

* Update Invoke-WPFAppxRemoval.ps1

* Update Invoke-WPFAppxRemoval.ps1

* Update appx.json

* Update Invoke-WPFGetInstalled.ps1

* Update Invoke-WPFAppxRemoval.ps1

* yep

* yep

* Update Invoke-WPFSelectedCheckboxesUpdate.ps1

* yep

* yep

* Update Invoke-WPFAppxRemoval.ps1

* Update Invoke-WPFAppxRemoval.ps1

* yep

* Update Invoke-WPFAppxRemoval.ps1

* Update Invoke-WPFAppxRemoval.ps1

* Update appx.json

* Update Invoke-WPFImpex.ps1

* Update Invoke-WPFImpex.ps1

* Update Invoke-WPFAppxRemoval.ps1

* Update preset.json

* Update preset.json

* Update Invoke-WPFSelectedCheckboxesUpdate.ps1

* Update Invoke-WPFAppxRemoval.ps1

* Update tweaks.json

* Update Invoke-WPFAppxRemoval.ps1

* Update Invoke-WPFAppxRemoval.ps1

* Update Invoke-WPFAppxRemoval.ps1

* Update Invoke-WPFAppxRemoval.ps1

* yep

* yep

* Update Invoke-WPFAppxRemoval.ps1

* yep

* Delete functions/private/Find-AppxByNameOrDescription.ps1

* yep

* Update Invoke-WPFButton.ps1

* Update main.ps1

* Update Invoke-WPFTab.ps1

* yep

* yep

* Update themes.json
2026-07-01 12:13:32 -05:00
dependabot[bot] 0c42b9e458 chore(deps): bump actions/cache from 5 to 6 (#4775)
Bumps [actions/cache](https://github.com/actions/cache) from 5 to 6.
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](https://github.com/actions/cache/compare/v5...v6)

---
updated-dependencies:
- dependency-name: actions/cache
  dependency-version: '6'
  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-06-29 12:03:27 -05:00
Chris Titus 26f89adf95 chore: Update generated dev docs (#4779) 2026-06-29 10:34:21 -05:00
Gabi 5003f14e0a update edge uninstall (#4666)
* yep

* Update tweaks.json

* Update tweaks.json

* Update tweaks.json

* Update tweaks.json

* Update tweaks.json

* Update tweaks.json
2026-06-29 10:33:31 -05:00
Chris Titus 8b6098b36a chore: Update generated dev docs (#4778) 2026-06-29 10:32:35 -05:00
Gabi 1f0756336f Update tweaks.json (#4774) 2026-06-29 10:32:01 -05:00
Chris Titus 0f39648de6 chore: Update generated dev docs (#4763) 2026-06-26 19:34:10 -04:00
Gabi 7f0d2183e3 fix import not working (#4762) 2026-06-26 18:33:38 -05:00
Sean (ANGRYxScotsman) 6ae24d071d Fix doc gen (#4743)
* edit 1

* Update devdocs-generator.ps1
2026-06-23 12:08:21 -05:00
Ivan Lepekha af900dab3a feat(github): Create a discussion template for app suggestion (#4741)
* Create app suggestion discussion template

Add a discussion template for app suggestions with rules and input fields.

* Add application suggestion link to issue template

Added a link for suggesting applications to the issue template.

* Update app suggestion discussion template

* Add checkbox for WinGet application presence check

* Changed name of file, didn't change name of link XD
2026-06-22 18:22:59 -05:00
Chris Titus 31425a5520 chore: Update generated dev docs (#4739) 2026-06-22 14:47:09 -05:00
Gabi 47f06e34e3 Deleted lastrun.json (#4714)
* Update Invoke-WPFtweaksbutton.ps1

* Update main.ps1

* Update tweaks.json

* Update tweaks.json

* Update tweaks.json
2026-06-22 14:46:38 -05:00
Chris Titus ae4c787545 chore: Update generated dev docs (#4738) 2026-06-22 14:35:13 -05:00
NotDecided b2a258a45f Add option to disable lock screen in tweaks.json (#4721) 2026-06-22 14:34:11 -05:00
Gabi d7cc5981e0 allow uninstallation of edge trough install tab (#4716)
* unlock edge uninstall whenever the user trys to uninstall edge trough install tab

* Update Invoke-WPFUnInstall.ps1
2026-06-22 14:33:09 -05:00
Gabi 9bfba35788 Correct old infromation in CONTRIBUTING.md (#4709) 2026-06-22 14:30:23 -05:00
Gabi 51d7350e35 Fix Add-SelectedAppsMenuItem's spaces (#4707) 2026-06-22 14:28:39 -05:00
Gabi 652ea6368c Removed useless logic from main.ps1 (#4706) 2026-06-22 14:27:16 -05:00
Gabi 57be85b566 Added lightshot and KeePassXC to applications.json (#4702)
* Added lightshot to applications.json

* Added keepassxc to applications.json
2026-06-22 14:26:24 -05:00
4hm3dn3d41 376156f072 Rework foss filtering (#4696)
* Replace FOSS highlight toggle with inline label

Remove the separate "Highlight FOSS" toggle and its theming logic, and instead append an inline "- FOSS" label to FOSS app entries. Changes: remove WPFToggleFOSSHighlight from app navigation and related event handlers, delete FOSSColor resource updates in theme code and button handler, simplify checkbox setup in Invoke-WPFUIElements by removing the special-case toggle logic, and update Initialize-InstallAppEntry to build a horizontal panel containing the app name plus a small green "- FOSS" TextBlock for FOSS items. This consolidates FOSS indication into the item UI and cleans up toggle/theme handling.

* Add inline FOSS label to app entries

Replace the separate StackPanel/TextBlock used for the FOSS indicator with an inline System.Windows.Documents.Run appended to the app name. The run is styled (green RGB(76,175,80) and FontSize=10) and the checkbox content assignment was moved outside the conditional so the appName (with optional FOSS run) is always used. Cleaned up related comments to reflect the FOSS label change.

* Add FOSS note type with green bullet

Added FOSS notes in the UI and FOSS labels with a green bullet instead of the text '#FOSS'

* Use larger circle glyph; remove italic text

Replaced the FOSS and list bullet glyphs with a larger circle for better visual consistency and removed the italic styling

* Update FOSS/bullet glyphs, colors and sizes

Updated FOSS/list bullet styling by switching glyphs from U+2B24 to U+25CF, increasing size (10→11.5), and adjusting bullet/text colors for better visibility and consistency across.
2026-06-22 14:23:09 -05:00
Chris Titus cc40fdf42a chore: Update generated dev docs (#4737) 2026-06-22 14:21:05 -05:00
GabiandChris Titus 1b8a834d5d Simplify WPFTweaksRevertStartMenu (#4694)
Co-authored-by: Chris Titus <contact@christitus.com>
2026-06-22 14:20:31 -05:00
Chris Titus 7ffb396786 chore: Update generated dev docs (#4736) 2026-06-22 14:17:57 -05:00
Diego 1d4fa15f7e Add pnpm package manager (#4681) 2026-06-22 14:17:50 -05:00
Paweł Gwozdowski aefbf1a847 standardize console message punctuation and capitalization (#4680) 2026-06-22 14:17:23 -05:00
Chris Titus edca5207ec chore: Update generated dev docs (#4735) 2026-06-22 14:17:10 -05:00
Paweł GwozdowskiandChris Titus 3307e88f2c Update tweaks.json (#4679)
Co-authored-by: Chris Titus <contact@christitus.com>
2026-06-22 14:16:28 -05:00
Paweł Gwozdowski 36dc2e73ff Update applications.json (#4678) 2026-06-22 14:14:51 -05:00
Paweł Gwozdowski c5ed3a9773 fix typos in .github folder (#4677)
* .yaml

* Update feature_request.yaml

* Update compile-check.yaml

* Update close-old-issues.yaml
2026-06-22 14:14:10 -05:00
Paweł Gwozdowski d268bb721b correct "WinUtil" in docs (#4676)
* Update _index.md

* Update architecture.md

* Update faq.md

* Update KnownIssues.md

* Update _index.md

* Update _index.md

* Update _index.md

* Update _index.md

* Update _index.md

* Update _index.md

* Update _index.md

* Update hugo.toml
2026-06-22 14:13:16 -05:00
Chris Titus b9e324b01a chore: Update generated dev docs (#4734) 2026-06-22 14:08:57 -05:00
Vyas DevgnaandDev 910c9f698c feat: add advanced tweak to disable reserved storage (#4664)
Co-authored-by: Dev <dev@localhost>
2026-06-22 14:08:18 -05:00
Chris Titus dbab51061d chore: Update generated dev docs (#4733) 2026-06-22 14:03:36 -05:00
Gabi 8eadd527ad Stop using temp varible (#4645)
* Update Invoke-WPFOOSU.ps1

* Update Invoke-WPFPanelAutologin.ps1
2026-06-22 14:03:00 -05:00
dependabot[bot] 7745364e66 Bump actions/checkout from 6 to 7 (#4730)
Bumps [actions/checkout](https://github.com/actions/checkout) from 6 to 7.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v6...v7)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: '7'
  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-06-22 13:59:59 -05:00
Gabi ac0982f9f5 Removed Get-ComputerInfo from main.ps1 (#4634) 2026-06-22 13:59:37 -05:00
Gabi 298542e4f7 Removed icons from release-drafter.yml (#4590) 2026-06-22 13:52:59 -05:00
Chris Titus 9d75eadf16 chore: Update generated dev docs (#4732) 2026-06-22 13:52:03 -05:00
GabiandBreaking Changes 36f39091ec Make WIndowsAI tweak more understandable in tweaks.json (#4684)
* Make WIndowsAI tweak more understandable in tweaks.json

* Update config/tweaks.json

why not

Co-authored-by: Breaking Changes <107767789+HopeItBuilds@users.noreply.github.com>

---------

Co-authored-by: Breaking Changes <107767789+HopeItBuilds@users.noreply.github.com>
2026-06-22 13:51:36 -05:00
Gabi 58a81b106c Added back VoidTools Everything to applications.json (#4693) 2026-06-11 23:15:05 -05:00
Paweł Gwozdowski a280ddb1fa correct case of "WinUtil" in GUI / user-facing messages (#4675)
* WinUtil in .ps1

* WinUtil in GUI

* Update KnownIssues.md
2026-06-09 12:22:56 -05:00
Paweł Gwozdowski 01c0e999c1 Update CODE_OF_CONDUCT.md (#4674) 2026-06-09 12:21:34 -05:00
Paweł Gwozdowski 5efef2c0f3 Update SECURITY.md (#4673) 2026-06-09 12:21:05 -05:00
Chris Titus ea1cff0724 Add 'Refactor' option to PR template 2026-06-08 10:19:47 -05:00
Chris Titus 09569162a1 chore: Update generated dev docs (#4672) 2026-06-08 10:10:56 -05:00
Neac0 bced250ae1 Fix Remove Home and Gallery (#4654)
Fixes the deletion of "Home" and "Gallery" in File Explorer. Now it correctly deletes both.
2026-06-08 10:10:19 -05:00
Chris Titus 80aa6af30a chore: Update generated dev docs (#4671) 2026-06-08 10:05:32 -05:00
Vyas DevgnaandDev 5a233b3422 fix: add registry tracking to WPFTweaksRightClickMenu for drift detection (#4636)
* fix: correct false-positives and service tracking in drift detection

* Update Invoke-WPFtweaksbutton.ps1

* Update Invoke-WPFtweaksbutton.ps1

* Update Invoke-WPFtweaksbutton.ps1

---------

Co-authored-by: Dev <dev@localhost>
2026-06-08 10:04:20 -05:00
Gabi 01ef78915a Remove -NoUi (#4572)
* Made -NoUi not exit the window

* Update start.ps1

* Update main.ps1

* Update main.ps1

* Update Set-WinUtilProgressbar.ps1

* Update Invoke-WPFImpex.ps1

* Update Invoke-WPFUIThread.ps1

* Update start.ps1

* Update Invoke-WPFUIThread.ps1

* Update main.ps1

* Update main.ps1
2026-06-08 10:02:35 -05:00
Chris Titus 7dfebba70f chore: Update generated dev docs (#4670) 2026-06-08 10:01:26 -05:00
GabiandChris Titus 0a018e0405 Update WPFTweaksRevertStartMenu (#4615)
* Update tweaks.json

* Update preset.json

* Update preset.json

* Update tweaks.json

* Update KnownIssues.md

---------

Co-authored-by: Chris Titus <contact@christitus.com>
2026-06-08 10:00:43 -05:00
Chris Titus e50621a9dc chore: Update generated dev docs (#4669) 2026-06-08 09:49:20 -05:00
Jarosław Drzewiecki de Ogańczykandgepardjaro 3ef100a083 Fixed bug merged in #4577 that breaks Taskbar Search Icon tweak (#4649)
Co-authored-by: gepardjaro <266757713+drzewjaro@users.noreply.github.com>
2026-06-08 09:48:41 -05:00
Chris Titus eebb56ac5a chore: Update generated dev docs (#4668) 2026-06-08 09:45:11 -05:00
Gabi daf045390d fix dev branch not working (#4651)
* fix dev branch not working

* Update start.ps1
2026-06-08 09:44:14 -05:00
Gabi 6214012fd1 Added -NoRestart to WPFTweaksWindowsAI (#4639) 2026-06-08 09:43:20 -05:00
CodingWonders 297b3079e5 Fix slop remains (#4640)
* Fix slop remains

Chris likes to vibe code. AI likes to use different types of dashes (em-dashes, en-dashes), instead of regular dashes (-).

On PowerShell 7 this appears to work. The parser doesn't care. But, what about PowerShell 5? It begins throwing errors about the ampersand. Loading it in the ISE reveals how it stops parsing the syntax correctly when it encounters em-dashes. Rather than displaying them as such, the ISE displays them as —.

Chris, if you want to vibe code, I don't mind. But at least use regular dashes.

Anyway, I won't fix the AI code. I just want to make it work on my beloved powershell 5.

* Apparently this file is important
2026-06-08 09:43:04 -05:00
Chris Titus 9fdf944ef9 chore: Update generated dev docs (#4667) 2026-06-08 09:43:02 -05:00
Gabi 6b5a9bcb9b Added -Recurse for Onedrive Remove-Item command (#4642) 2026-06-08 09:42:25 -05:00
Vyas Devgnaandvyas-devgna e4d305284b feat: detect reverted tweaks on startup (#4582)
Co-authored-by: vyas-devgna <vyas-devgna@users.noreply.github.com>
2026-06-04 15:28:37 -05:00
Gabi 78593cc58d Fixed irfanview's and openvpn's foss selection (#4546)
* Fixed irfanview's foss selection

* Update applications.json

* Update applications.json
2026-06-04 13:42:08 -05:00
Gabi e83033a122 Update KnownIssues.md (#4537)
* Update KnownIssues.md

* Update KnownIssues.md

* Update KnownIssues.md
2026-06-03 16:12:02 -05:00
Chris Titus 5832f0df81 chore: Update generated dev docs (#4631) 2026-06-03 16:09:54 -05:00
Gabi 26f3284919 Show ctt logo instantly (#4603)
* Update main.ps1

* Delete functions/public/Show-CTTLogo.ps1

* Update main.ps1

* Update main.ps1
2026-06-03 16:09:44 -05:00
Gabi 1f8455e90d Removed WPFTweaksWidget's UndoScript (#4608) 2026-06-03 16:08:12 -05:00
Chris Titus 62c43e6e82 chore: Update generated dev docs (#4630) 2026-06-03 16:07:49 -05:00
Gabi a1949ed917 Update feature.json (#4612) 2026-06-03 16:07:01 -05:00
Chris Titus 74a3ddad1c chore: Update generated dev docs (#4629) 2026-06-03 16:06:49 -05:00
Gabi d7b0389a93 Removed WPFTweaksPowershell7Tele and added it to WPFTweaksTelemetry (#4613)
* Update tweaks.json

* Update preset.json
2026-06-03 16:06:03 -05:00
Gabi 23f197b644 Update main.ps1 (#4604) 2026-06-03 13:50:51 -05:00
Chris Titus b2eeda9eb2 chore: Update generated dev docs (#4627) 2026-06-03 13:46:17 -05:00
Gabi ceec8aeb53 Update Invoke-WPFPanelAutologin.ps1 (#4596) 2026-06-03 13:45:16 -05:00
Gabi 6b125346cd Simplify Invoke-WPFFixesNetwork.ps1 (#4594)
* Update Invoke-WPFFixesNetwork.ps1

* Update Invoke-WPFFixesNetwork.ps1
2026-06-03 13:44:21 -05:00
Chris Titus 5f8e493536 chore: Update generated dev docs (#4626) 2026-06-03 13:43:59 -05:00
Gabi 4db0248911 Simplify Invoke-WPFOOSU.ps1 (#4593)
* Simplify Invoke-WPFOOSU.ps1

* Update Invoke-WPFOOSU.ps1
2026-06-03 13:43:15 -05:00
Gabi 2bee0d6f2c Update Invoke-WinUtilSponsors.ps1 (#4589) 2026-06-03 13:36:42 -05:00
Chris Titus 58df36841f chore: Update generated dev docs (#4625) 2026-06-03 13:35:59 -05:00
Gabi 5ba840f87f refactor WPFTweaksBlockAdobeNet (#4585)
* Update tweaks.json

* Update tweaks.json
2026-06-03 13:35:21 -05:00
Gabi fe2dd829b8 Removed RustDesk from applications.json (#4584) 2026-06-03 13:33:07 -05:00
Alfyus 5cdb6c6e22 Italian README in ".github" (#4623)
* Create READMEITALIAN.md for Italian users

Added Italian translation for the README file, detailing the functionality and usage of WinUtil.

* Fix formatting in READMEITALIAN.md

* Rename READMEITALIAN.md to .github/READMEITALIAN.md
2026-06-03 13:29:51 -05:00
Chris Titus 4bda00ec2d chore: Update generated dev docs (#4624) 2026-06-03 13:29:11 -05:00
GabiandChris Titus 462cc40a6a better explanation for toggle description (#4577)
* Update tweaks.json

* Update tweaks.json

* Update tweaks.json

* Update tweaks.json

* Update tweaks.json

---------

Co-authored-by: Chris Titus <contact@christitus.com>
2026-06-03 13:28:32 -05:00
Gabi 0e061692ba Made "Upgrade all applications" not exit after completion (#4575)
* Update Invoke-WPFInstallUpgrade.ps1

* Update Test-WinUtilPackageManager.ps1

* Update Test-WinUtilPackageManager.ps1
2026-06-03 13:23:46 -05:00
Gabi ffec7a8a8f Added nomacs to applications.json (#4566) 2026-06-03 13:18:29 -05:00
Gabi 6e4b1d26c6 Removed WPFTweaksDVR from preset.json (#4565) 2026-06-03 13:15:30 -05:00
Chris Titus 32cec06ed6 chore: Update generated dev docs (#4622) 2026-06-03 13:15:11 -05:00
Gabi a24193ce18 Update tweaks.json (#4564) 2026-06-03 13:14:20 -05:00
PChaicot 8f919be14b Add Playnite to applications.json (#4588) 2026-06-03 13:13:12 -05:00
Gabi ad5d103df9 Cleanup .gitignore (#4563)
* Update .gitignore

* Update .gitignore

* Update .gitignore

* Update .gitignore

* Update .gitignore
2026-06-03 13:11:49 -05:00
Chris Titus b5160d9e24 chore: Update generated dev docs (#4621) 2026-06-03 13:09:04 -05:00
Gabi 614eb949db Remove OneDrive left overs (#4561)
* Update tweaks.json

* Update tweaks.json
2026-06-03 13:08:18 -05:00
Gabi d1edd5b2ba Delete overrides directory (#4554) 2026-06-03 13:07:34 -05:00
Gabi 333937d2fa Made Compile.ps1 not load the script into memory and use -Raw (#4536)
* Made Compile.ps1 not load the script into memory

* Update Compile.ps1

* Update Compile.ps1

* Update Compile.ps1
2026-06-03 13:04:04 -05:00
Chris Titus 3ca87648b4 chore: Update generated dev docs (#4619) 2026-06-03 13:01:02 -05:00
Jarosław Drzewiecki de Ogańczyk 4894a545f0 Fixed Json for Scrollbars Always Visible (#4528) 2026-06-03 13:00:22 -05:00
Jarosław Drzewiecki de Ogańczyk 9f55bced01 Added Delivery Optimization tweak to Standard-Advanced Tweaks preset (#4548)
* Added Delivery Optimization tweak to Standard Tweaks preset

* Added Delivery Optimization tweak to Standard Tweaks preset and Advanced preset to match Gabi PR
2026-06-03 12:59:05 -05:00
Chris Titus 56e0541113 chore: Update generated dev docs (#4618) 2026-06-03 12:59:00 -05:00
Jarosław Drzewiecki de Ogańczyk 7607b92e21 Added Delivery Optimization disable tweak (#4527) 2026-06-03 12:58:23 -05:00
Sean (ANGRYxScotsman) 153900a77b fix pics not loading in app page (#4614) 2026-06-03 12:57:33 -05:00
Gabi 691224f465 Rework README.md (#4586)
* Update README.md

* Update README.md

* Update README.md

* Update README.md

* Update README.md

* Update README.md

* Update README.md

* Update README.md

* Update README.md

* Update README.md

* Update README.md

* Update README.md

* Update README.md

* Update README.md
2026-06-03 12:56:58 -05:00
Chris Titus 893dca4055 chore: Update generated dev docs (#4579) 2026-05-28 13:14:28 -05:00
Gabi 2ebc9bd6c4 fix WPFTweaksWindowsAI (#4578) 2026-05-28 13:13:54 -05:00
Gabi 076ef02b2c Rework contributing.md (#4567)
* Delete docs/assets/images/Complie.png

* Delete docs/assets/images/Commit-GHD.png

* Delete docs/assets/images/Discard-GHD.png

* Delete docs/assets/images/Push-Commit.png

* Delete docs/assets/images/Fork-Button-Dark.png

* Delete docs/assets/images/Fork-Button-Light.png

* Update CONTRIBUTING.md

* Update CONTRIBUTING.md

* Update CONTRIBUTING.md

* Update CONTRIBUTING.md

* Update CONTRIBUTING.md

* Update CONTRIBUTING.md
2026-05-28 12:32:27 -05:00
Gabi c99114e9e1 Added -Preset for automation (#4539)
* Update start.ps1

* Update main.ps1

* Update start.ps1

* Update start.ps1

* Update main.ps1

* Update main.ps1

* Update _index.md

* Update _index.md

* Update _index.md

* Update README.md

* Update main.ps1

* Update start.ps1

* Update main.ps1

* Update main.ps1

* Update start.ps1

* Update main.ps1

* Update main.ps1

* Update main.ps1

* Update main.ps1
2026-05-26 15:22:28 -05:00
Gabi 9b72c1e2de Added advanced preset to tweaks (#4538)
* Update preset.json

* Update Invoke-WPFButton.ps1

* Update inputXML.xaml
2026-05-26 15:21:12 -05:00
Chris Titus b379574574 chore: Update generated dev docs (#4558) 2026-05-26 15:17:54 -05:00
Sean (ANGRYxScotsman) 565597a906 Update documentation and images across multiple pages (#4549)
* Update CONTRIBUTING.md

* updated the apps page and pics

* updated tweaks tab pic

* updated features page with pic

* updated update page with pic

* update win 11 page with pic

* update pics for app page

* deleted old pics

* fix favicon from not showing

* added forums link in help

* Update hugo.toml

* updated title screen pic and added it to the main screen

* Update _index.md

* added the recommended section to the user guild tweeks

* Update _index.md

* added the new advance preset

* clean up pages

* fix links

* fixed wikipedia link

* Update _index.md
2026-05-26 15:17:26 -05:00
Gabi 62ccf80856 Cleanup gitignore (#4526)
* Clean Up .gitignore

* Update .gitignore

* Clean Up .gitignore

* Update .gitignore

* Update .gitignore

* Update .gitignore
2026-05-26 15:14:35 -05:00
Gabi 70cdacb9f9 replaced some choco "na" packages with there package name in applications.json (#4523) 2026-05-26 15:08:58 -05:00
Gabi 459d0fd1b2 Fixed Get-WinUtilToggleStatus.ps1 displaying incorrect infromation for tweaks (#4522)
* Fixed Get-WinUtilToggleStatus.ps1 displaying incorrect infromation of tweaks

* Update Get-WinUtilToggleStatus.ps1

* Update Get-WinUtilToggleStatus.ps1

* Update Get-WinUtilToggleStatus.ps1

* Update Get-WinUtilToggleStatus.ps1
2026-05-26 15:05:25 -05:00
Chris Titus 48e94f71bc chore: Update generated dev docs (#4555) 2026-05-26 15:01:09 -05:00
Gabi 2582f094ff Powerplan fix (#4521)
* Update Invoke-WPFUltimatePerformance.ps1

* Update Invoke-WPFButton.ps1

* Update Invoke-WPFUltimatePerformance.ps1

* Update KnownIssues.md

* Update KnownIssues.md

* Update Invoke-WPFUltimatePerformance.ps1

* Update Invoke-WPFUltimatePerformance.ps1

* Update Invoke-WPFUltimatePerformance.ps1

* Update tweaks.json
2026-05-26 15:00:33 -05:00
Chris Titus 5aa099f6e2 Fix missing dism metadata (#4516)
* Fix product key invalid and missing metadata on some isos

* Fix Gabi's broken light mode pr
2026-05-19 14:11:27 -05:00
github-actions[bot]andChrisTitusTech 9d85eea4e5 Update sponsors in README (#4489)
Co-authored-by: ChrisTitusTech <7896101+ChrisTitusTech@users.noreply.github.com>
2026-05-19 13:27:33 -05:00
Sree Sankar S c765ffb317 Add minimize button to WinUtil window (#4508) 2026-05-19 13:26:54 -05:00
Chris Titus 82f51b4bf1 chore: Update generated dev docs (#4515) 2026-05-19 13:26:45 -05:00
Gabi d44c013464 Changes windev.ps1's syntax (#4506)
* Changes windev.ps1's syntax

* Update windev.ps1
2026-05-19 13:26:32 -05:00
Chris Titus 753d47b9bc Merge branch 'main' into pr/gepardjaro/4503 (#4514) 2026-05-19 13:26:07 -05:00
Gabi 8034e85521 Remove Write-Debug (#4498)
* Update Invoke-WinUtilCurrentSystem.ps1

* Update Invoke-WinUtilFontScaling.ps1

* Update Invoke-WinUtilTweaks.ps1

* Update Reset-WPFCheckBoxes.ps1

* Update Set-Preferences.ps1

* Update Update-WinUtilSelections.ps1

* Update Invoke-WPFSelectedCheckboxesUpdate.ps1

* Update Invoke-WPFtweaksbutton.ps1

* Update main.ps1

* Update main.ps1

* Update main.ps1

* Update main.ps1

* Update main.ps1

* Merge branch 'main' into Remove-Write-Debug
2026-05-19 13:16:06 -05:00
Gabi a09736f9a8 Cleanup Get-WinUtilToggleStatus.ps1 (#4497)
* Cleanup Get-WinUtilToggleStatus.ps1

* Update Get-WinUtilToggleStatus.ps1

* Merge branch 'main' into patch-9

* Update Get-WinUtilToggleStatus.ps1
2026-05-19 13:13:27 -05:00
Gabi 24aaf9a3cf Cleanup Get-WinUtilSelectedPackages.ps1 and remove annoying messages (#4496)
* Cleanup Get-WinUtilSelectedPackages.ps1 and remove annoying messages

* Update Get-WinUtilSelectedPackages.ps1

* Update Get-WinUtilSelectedPackages.ps1

* Update Get-WinUtilSelectedPackages.ps1

* Merge branch 'main' into patch-8

* Update Get-WinUtilSelectedPackages.ps1

* Update Get-WinUtilSelectedPackages.ps1

* Update Get-WinUtilSelectedPackages.ps1

* Update Get-WinUtilSelectedPackages.ps1
2026-05-19 13:07:10 -05:00
Chris Titus f57b5f4ffa chore: Update generated dev docs (#4513) 2026-05-19 13:01:00 -05:00
Pinak Dhabu 32d24c8024 Add Game Mode toggle and fix MPO overlay for 25H2 (#4495) 2026-05-19 13:00:07 -05:00
Nazrul Islam 743f9e3783 Refactor: Secure literal search and defensive scope handling (#4492)
* Refactor: Secure literal search and defensive scope handling

* Refactor: Secure literal search for Tweaks Tab

* Merge branch 'ChrisTitusTech:main' into fix-search-security
2026-05-19 12:56:58 -05:00
Chris Titus 522c4471c0 chore: Update generated dev docs (#4512) 2026-05-19 12:42:19 -05:00
Gabi ea698f3791 Added WPFTweaksDisableBitLocker to tweaks.json (#4486)
* Added WPFTweaksDisableBitLocker to tweaks.json

* Update tweaks.json

* Update tweaks.json

* Update tweaks.json

* Merge branch 'main' into patch-6
2026-05-19 12:41:49 -05:00
Gabi 8ffd15c9f3 simplify Compile.ps1 by alot (#4484)
* Update Compile.ps1

* Delete tools/Invoke-Preprocessing.ps1

* Update .gitignore

* Update Compile.ps1

* Update Compile.ps1

* Update Compile.ps1

* Update Compile.ps1

* Update Compile.ps1

* Update .gitignore

* Update Compile.ps1

* Update Compile.ps1

* Update Compile.ps1

* Merge branch 'main' into patch-5
2026-05-19 12:40:02 -05:00
Gabi 6c1cb0caab Deleted unused functions (#4482)
* Delete functions/private/Get-LocalizedYesNo.ps1

* Delete functions/private/Get-WPFObjectName.ps1

* Merge branch 'main' into patch-4
2026-05-19 12:36:49 -05:00
Gabi bcafbe6234 CleanUp Invoke-WinUtilFeatureInstall.ps1 and fix typo (#4481)
* CleanUp Invoke-WinUtilFeatureInstall.ps1

* Update Invoke-WinUtilFeatureInstall.ps1

* Update feature.json
2026-05-19 12:34:04 -05:00
dependabot[bot] fb54380b8b Bump actions/github-script from 7 to 9 (#4510)
Bumps [actions/github-script](https://github.com/actions/github-script) from 7 to 9.
- [Release notes](https://github.com/actions/github-script/releases)
- [Commits](https://github.com/actions/github-script/compare/v7...v9)

---
updated-dependencies:
- dependency-name: actions/github-script
  dependency-version: '9'
  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-05-19 10:56:12 -05:00
Gabi 39f26133f4 Update pre-release.yaml (#4487) 2026-05-15 09:02:05 -05:00
Gabi 09695f10aa Fixed mpc-qt's description in applications.json (#4480) 2026-05-15 08:54:44 -05:00
tacostrange d1becc5310 Fixed typo - 'there' to 'their' (#4477)
* Fixed typo - 'there' to 'their'

* fix typo in tweaks.json from 'there' to 'their'
2026-05-15 08:54:03 -05:00
CopilotandChrisTitusTech 543b8958ef Fix Actions script injection vulnerability in issue-slash-commands.yaml (#4493)
* Initial plan

* Fix Actions script injection vulnerability in issue-slash-commands.yaml

Agent-Logs-Url: https://github.com/ChrisTitusTech/winutil/sessions/94895aac-198f-40b6-af42-27fe0c646587

Co-authored-by: ChrisTitusTech <7896101+ChrisTitusTech@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: ChrisTitusTech <7896101+ChrisTitusTech@users.noreply.github.com>
2026-05-14 18:13:02 -05:00
Sean (ANGRYxScotsman) c39c54c7c1 update theme (#4490) 2026-05-14 14:22:33 -05:00
Chris Titus d8193fd8ac chore: Update generated dev docs (#4475) 2026-05-12 13:07:48 -05:00
Chris Titus 25adabd622 update bug 2026-05-12 13:07:27 -05:00
Gabi 2d605f1875 Make WPFTweaksServices do what it says (#4466)
* Update tweaks.json

* Update tweaks.json
2026-05-12 13:06:46 -05:00
Gabi d46d324df8 Cleanup programs install (#4465)
* Cleanup programs install

* Update Install-WinUtilProgramChoco.ps1
2026-05-12 13:06:13 -05:00
Chris Titus 3e16817640 chore: Update generated dev docs (#4474) 2026-05-12 13:03:58 -05:00
Chris Titus d0b91d190a chore: Update generated dev docs (#4473) 2026-05-12 13:03:01 -05:00
Gabi bdbfdb6681 Fixed WPFTweaksRemoveGallery and WPFTweaksRemoveHome (#4464)
* Fixed WPFTweaksRemoveGallery not setting explorer launchto

* Update tweaks.json

* Update tweaks.json
2026-05-12 13:02:54 -05:00
Gabi 0154b749a4 Added WPFTweaksWindowsAI (#4461)
* Added WPFTweaksWindowsAI

* Update tweaks.json
2026-05-12 13:02:26 -05:00
jb49088andChris Titus e6e44e3e04 Add Deskflow to applications (#4450)
* Add Deskflow to applications

* add: Include Deskflow in applications list

---------

Co-authored-by: Chris Titus <contact@christitus.com>
2026-05-12 13:01:42 -05:00
Gabi e6d8fdff75 fix import (#4447)
* Made -Config use Runspaces main.ps1

* Fix no-UI config autorun

* Skip empty no-UI autorun sections

* Update Invoke-WinUtilAutoRun.ps1

* Ignore blank DNS selection during autorun

* Update main.ps1

* Update Invoke-WPFRunspace.ps1

* Update Invoke-WPFRunspace.ps1

* Update Invoke-WinUtilAutoRun.ps1

* Update Invoke-WinUtilAutoRun.ps1

* Update Invoke-WPFtweaksbutton.ps1

* Update start.ps1

* Update main.ps1

* Update Invoke-WPFtweaksbutton.ps1

* Update Invoke-WPFRunspace.ps1

* Update _index.md

* Merge branch 'ChrisTitusTech:main' into patch-3

* Merge branch 'ChrisTitusTech:main' into patch-3
2026-05-12 12:58:46 -05:00
Gabi 6ba184bdeb Hide Windows Updates from setting menu when disabling updates (#4445)
* Update Invoke-WPFUpdatesdisable.ps1

* Update Invoke-WPFUpdatesdefault.ps1

* Update Invoke-WPFUpdatesdefault.ps1

* Merge branch 'ChrisTitusTech:main' into patch-1

* Merge branch 'ChrisTitusTech:main' into patch-1

* Update Invoke-WPFUpdatesdisable.ps1

* Update Invoke-WPFUpdatesdisable.ps1
2026-05-12 12:57:07 -05:00
Ivan LepekhaandChris Titus 6d6defc206 improve: Clearing Applications list (#4451)
* Less radical removal of apps

* Moving some applications to Selfhosted category

* Some more chess-boxing

* Document section is too small

* TG forks are too niche

* Floorp should be good

* feat: Add new multimedia tools and update existing application entries in applications.json

---------

Co-authored-by: Chris Titus <contact@christitus.com>
2026-05-12 12:54:23 -05:00
Chris Titus fa073f8475 chore: Update generated dev docs (#4472) 2026-05-12 12:19:19 -05:00
Gabi 63aecc0bee Make WPFTweaksDeBloat an essential tweak and add it to presets (#4458)
* Update tweaks.json

* Update preset.json
2026-05-12 12:18:42 -05:00
Gabi a0887783f8 fix allowing everyone to close issues (#4454)
* Update issue-slash-commands.yaml

* Update issue-slash-commands.yaml

* Update issue-slash-commands.yaml
2026-05-07 16:23:43 -05:00
Ivan Lepekha f3880b66bb feat: Update GH issue template for known issues (#4455)
* Add checkbox for known issues acknowledgment

Some people do not check the link

* typo fix

Updated checkbox type to checkboxes in bug report template.

* :zombie_sound:

* :zombie_sound_2:

* AAAAAAAAAAAAAAA

* I'm tired of testing commits

* :zombie_sound_1337:

Added a description to the read issues checkbox.

* my bad
2026-05-07 15:56:01 -05:00
Chris Titus aa636926fa chore: Update generated dev docs (#4457) 2026-05-07 15:53:01 -05:00
Gabi ec3166bdc6 Update Invoke-WinUtilInstallPSProfile.ps1 (#4456)
* Update Invoke-WinUtilInstallPSProfile.ps1

* Update Invoke-WinUtilUninstallPSProfile.ps1

* Update Invoke-WinUtilInstallPSProfile.ps1

* Update Invoke-WinUtilUninstallPSProfile.ps1
2026-05-07 15:52:20 -05:00
Gabi a3f57532b6 Cleanup winget upgrade (#4410)
* Update Update-WinUtilProgramWinget.ps1

* Delete functions/private/Update-WinUtilProgramWinget.ps1

* Delete functions/private/Get-WinUtilInstallerProcess.ps1

* Update Invoke-WPFInstallUpgrade.ps1

* Update Invoke-WPFInstallUpgrade.ps1

* Update Invoke-WPFInstallUpgrade.ps1

* Update Invoke-WPFInstallUpgrade.ps1

* Update Invoke-WPFInstallUpgrade.ps1

* Update Invoke-WPFInstallUpgrade.ps1
2026-05-05 15:16:39 -05:00
github-actions[bot]andChrisTitusTech 3a7851b0f4 Update sponsors in README (#4387)
Co-authored-by: ChrisTitusTech <7896101+ChrisTitusTech@users.noreply.github.com>
2026-04-30 15:19:09 -05:00
Gabi 6fa73db245 Removed anythingllm from applications.json (#4428) 2026-04-30 15:18:07 -05:00
Chris TitusandGabi 184fe22a35 Cleanup: Delete all Scheduled Tasks related things (#4435)
* Delete functions/private/Set-WinUtilScheduledTask.ps1

* Update Invoke-WinUtilTweaks.ps1

* Update Invoke-WinUtilCurrentSystem.ps1

* waste of time

---------

Co-authored-by: Gabi <218829269+GabiNun2@users.noreply.github.com>
2026-04-30 15:16:27 -05:00
Gabi 9d4613d838 Strip unneccary surpassion from win11 creator (#4422)
* Update Invoke-WinUtilISO.ps1

* Update Invoke-WinUtilISOScript.ps1

* Update Invoke-WinUtilISOUSB.ps1

* Merge branch 'ChrisTitusTech:main' into patch-8
2026-04-30 14:58:07 -05:00
Gabi 10d83c5b20 Added tweaks_applied to issue temeplate (#4416)
* Update bug_report.yaml

* Merge branch 'ChrisTitusTech:main' into patch-5
2026-04-30 14:37:34 -05:00
Chris Titus 4065759ca0 chore: Update generated dev docs (#4434) 2026-04-30 12:46:57 -05:00
Chris TitusandCopilot 97d5f7b850 feat: Add Brave debloat settings to tweaks.json (#4427)
Co-authored-by: Copilot <copilot@github.com>
2026-04-30 12:46:12 -05:00
Gabi bf542af426 Fix TranslucentTB not installing (#4424) 2026-04-29 12:26:07 -05:00
Gabi ea9c7de722 Add a reminder that docs are auto-generated (#4421)
* Update PULL_REQUEST_TEMPLATE.md

* Update PULL_REQUEST_TEMPLATE.md
2026-04-29 12:24:24 -05:00
Gabi d2e5886b02 Update docs images (#4419)
* Delete docs/assets/images/Install/Install-apps.png

* Add files via upload

* Delete docs/assets/images/Tweaks-Tab-Light.png

* Delete docs/assets/images/Tweaks-Tab-Dark.png

* Delete docs/assets/images/Settings-Export-Light.png

* Delete docs/assets/images/Settings-Export-Dark.png

* Delete docs/assets/images/Install-Tab-Light.png

* Delete docs/assets/images/Install-Tab-Dark.png

* Delete docs/assets/images/Get-Installed-Light.png

* Delete docs/assets/images/Get-Installed-Dark.png

* Add files via upload
2026-04-29 12:22:26 -05:00
Chris Titus d43c26e314 chore: Update generated dev docs (#4433) 2026-04-29 12:18:13 -05:00
Gabi 4297d69f2c Added WPFToggleBatteryPercentage to tweaks.json (#4412)
* Added `WPFTweaksBatteryPercentage` to tweaks.json

* Update tweaks.json

* Update tweaks.json

* Update tweaks.json

* Update tweaks.json
2026-04-29 12:17:16 -05:00
Gabi 36e4b27872 Update autounattend.xml (#4409) 2026-04-29 12:00:54 -05:00
Chris Titus ec5c7a4639 chore: Update generated dev docs (#4432) 2026-04-29 11:59:52 -05:00
Gabi f2ca10e8c9 Changed Some names (#4406)
* Changed Some names in tweaks.json

* Update feature.json

* Update tweaks.json

* Update tweaks.json
2026-04-29 11:59:03 -05:00
Chris Titus 51cf62cdba chore: Update generated dev docs (#4403) 2026-04-21 15:32:37 -05:00
Jarosław Drzewiecki de Ogańczyk 415d1864d7 Add WPFToggleScrollbars tweak to Always show scrollbars (#4402) 2026-04-21 15:32:05 -05:00
Gabi b463d9d460 Make sure to disable AppCaptureEnabled (#4401) 2026-04-21 15:20:04 -05:00
adakkusu-san 8fa354dec2 added IrfanView to applications.json (#4393) 2026-04-21 14:57:26 -05:00
Graham David 683f9ee811 Added Dangerzone to Utilities (#4392) 2026-04-21 14:56:44 -05:00
dependabot[bot] 31d3c29447 Bump actions/upload-pages-artifact from 4 to 5 (#4391)
Bumps [actions/upload-pages-artifact](https://github.com/actions/upload-pages-artifact) from 4 to 5.
- [Release notes](https://github.com/actions/upload-pages-artifact/releases)
- [Commits](https://github.com/actions/upload-pages-artifact/compare/v4...v5)

---
updated-dependencies:
- dependency-name: actions/upload-pages-artifact
  dependency-version: '5'
  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-04-21 14:50:23 -05:00
Vaso 68aa6e31bd Added BlurAutoClicker (#4383)
* Added YASB and Modrinth

* Added BlurAutoClicker
2026-04-21 14:50:03 -05:00
Chris Titus cdf8727911 chore: Update generated dev docs (#4399) 2026-04-21 14:40:29 -05:00
CodingWonders 21273bd3a8 [Tweaks] New tweak for unsigned RDP files (#4374)
* [Tweaks] New tweak for unsigned RDP

* Merge branch 'main' into tweaks-unsigned-rdp
2026-04-21 14:39:58 -05:00
potato 67910df019 style: normalize themes.json spacing & uppercase hex values (#4346)
* style: normalize themes.json spacing

* style: uppercase theme hex values

* Merge branch 'main' into fix/themes-json-spacing
2026-04-21 14:37:02 -05:00
Chris Titus dee694b166 Merge branch 'main' of https://github.com/ChrisTitusTech/winutil 2026-04-21 14:20:14 -05:00
Chris Titus 87a5779f0b tweak service reduction 2026-04-21 14:20:08 -05:00
Gabi 9d777842f7 Changes policyplus category to Utilities (#4375) 2026-04-17 09:05:15 -05:00
github-actions[bot]andChrisTitusTech 99b7d94b08 Update sponsors in README (#4361)
Co-authored-by: ChrisTitusTech <7896101+ChrisTitusTech@users.noreply.github.com>
2026-04-17 09:04:52 -05:00
Chris Titus f31e5eb2ac chore: Update generated dev docs (#4382) 2026-04-17 09:04:35 -05:00
Gabi a8efcc9c96 Rename (and reorder) everything (#4372)
* Standardize tweak names to 'Target - Action' format

* Rename Microsoft Store Apps tweak to Unwanted Pre-Installed Apps - Remove

* Update tweaks.json

* Rename and reorder customize preference tweaks

* Standardize config feature labels

* Update feature.json
2026-04-17 09:04:03 -05:00
Gabi 747b6f8ca1 Added restriction policy error (#4370)
* Added restriction policy error

* Update KnownIssues.md

* Update KnownIssues.md

* Update KnownIssues.md

* Update KnownIssues.md
2026-04-17 09:02:27 -05:00
Chris Titus 26959b0e63 chore: Update generated dev docs (#4381) 2026-04-17 09:01:16 -05:00
Sean (ANGRYxScotsman) c5fc9490a8 fixed a lie (#4368) 2026-04-17 09:01:04 -05:00
Gabi 5902b0bd64 Move SvcHostSplitThresholdInKB tweak into WPFTweaksServices tweak (#4364) 2026-04-17 09:00:39 -05:00
Vaso 5dc8547dad Added YASB and Modrinth (#4353) 2026-04-17 08:58:47 -05:00
Chris Titus d736bc4305 chore: Update generated dev docs (#4380) 2026-04-17 08:58:38 -05:00
VasoandVaso a4d0f36ed5 Add toggler for Acrylic effect on login screen (#4348)
* Update applications.json

* Remove Borderless Gaming

* Update UniGetUI code for their link and winget

* Add login blur toggler

* hidden -> removed / sorry!

---------

Co-authored-by: Vaso <92270244+VasoHD@users.noreply.github.com>
2026-04-17 08:58:06 -05:00
Gabi e1e077c69b Added Notion and Todoist and Morgen and Helium to applications.json (#4345)
* Added Notion and Todoist and Morgen to applications.json

* Update applications.json

* Update applications.json

* Update applications.json

* Update applications.json

* Update applications.json

* Update applications.json

* Added helium to applications.json

* Update applications.json

* Added netspeedtray to applications.json
2026-04-17 08:57:01 -05:00
Gabi 8e2dc21823 Update Invoke-WinUtilRemoveEdge.ps1 (#4358)
* Replce Get-ChildItem with Resolve-Path inside of Invoke-WinUtilRemoveEdge.ps1

* Update Invoke-WinUtilRemoveEdge.ps1

* Update Invoke-WinUtilRemoveEdge.ps1
2026-04-14 11:03:07 -05:00
Gabi 8378fd5377 Removed onedrivesetup removal from Invoke-WinUtilISOScript.ps1 (#4350)
* Removed onedrivesetup removal Invoke-WinUtilISOScript.ps1

* Added OneDrive removal to autounattend.xml
2026-04-14 10:04:16 -05:00
Tommi Pöntinen eb08eae357 Remove Xtreme Download Manager from applications.json (#4352)
Removed Xtreme Download Manager entry from applications.
2026-04-14 09:39:56 -05:00
dependabot[bot] 4783e71750 Bump softprops/action-gh-release from 2 to 3 (#4355)
Bumps [softprops/action-gh-release](https://github.com/softprops/action-gh-release) from 2 to 3.
- [Release notes](https://github.com/softprops/action-gh-release/releases)
- [Changelog](https://github.com/softprops/action-gh-release/blob/master/CHANGELOG.md)
- [Commits](https://github.com/softprops/action-gh-release/compare/v2...v3)

---
updated-dependencies:
- dependency-name: softprops/action-gh-release
  dependency-version: '3'
  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-04-14 09:39:29 -05:00
dependabot[bot] 805a004a3a Bump actions/github-script from 8 to 9 (#4356)
Bumps [actions/github-script](https://github.com/actions/github-script) from 8 to 9.
- [Release notes](https://github.com/actions/github-script/releases)
- [Commits](https://github.com/actions/github-script/compare/v8...v9)

---
updated-dependencies:
- dependency-name: actions/github-script
  dependency-version: '9'
  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-04-14 09:39:06 -05:00
github-actions[bot]andChrisTitusTech 780ea84e9e Update sponsors in README (#4359)
Co-authored-by: ChrisTitusTech <7896101+ChrisTitusTech@users.noreply.github.com>
2026-04-14 09:38:39 -05:00
YusufKhalifadev f47dcb01d2 Fix a ton of typos and still (#4347) 2026-04-14 09:38:16 -05:00
Gabi 4ab1681eb8 Added dorion to applications.json (#4340) 2026-04-08 12:33:12 -05:00
Gabi ed6ee897d5 Added language support warning to CONTRIBUTING.md (#4342) 2026-04-08 11:19:10 -05:00
Chris Titus 5516be2464 chore: Update generated dev docs (#4338) 2026-04-07 14:10:34 -05:00
Chris Titus 9f972fdac1 Merge branch 'main' of https://github.com/ChrisTitusTech/winutil 2026-04-07 14:09:40 -05:00
Chris Titus c453f260cf Revert "Revert "Simplfy Invoke-WPFUltimatePerformance.ps1"" (#4335)
* Revert "Revert "Simplfy Invoke-WPFUltimatePerformance.ps1 (#4319)" (#4333)"

This reverts commit 419b150220.

* Refactor Invoke-WPFUltimatePerformance function to use "ChrisTitus - Ultimate Power Plan" naming and improve power plan management

* add message for laptop users

* Remove activation of "ChrisTitus - Ultimate Power Plan" during setup
2026-04-07 14:09:31 -05:00
Chris Titus 98eba09986 formatting 2026-04-07 13:07:36 -05:00
Chris Titus 61bce6afda chore: Update generated dev docs (#4334) 2026-04-07 13:04:43 -05:00
Chris Titus 419b150220 Revert "Simplfy Invoke-WPFUltimatePerformance.ps1 (#4319)" (#4333)
This reverts commit e30c0a4c27.
2026-04-07 13:04:02 -05:00
Chris Titus 372fa0159a chore: Update generated dev docs (#4332) 2026-04-07 13:00:56 -05:00
Gabi 406d6fdfc4 oopsy (#4330) 2026-04-07 12:59:59 -05:00
Gabi e30c0a4c27 Simplfy Invoke-WPFUltimatePerformance.ps1 (#4319)
* Simplfy Invoke-WPFUltimatePerformance.ps1

* Update Invoke-WPFButton.ps1

* Update Invoke-WPFUltimatePerformance.ps1

* Update Invoke-WPFUltimatePerformance.ps1

* Update Invoke-WPFButton.ps1

* Update Invoke-WPFUltimatePerformance.ps1

* Update Invoke-WPFUltimatePerformance.ps1

* Update Invoke-WPFUltimatePerformance.ps1

* Update Invoke-WPFUltimatePerformance.ps1
2026-04-07 12:59:37 -05:00
Chris Titus 3d300f6634 chore: Update generated dev docs (#4331) 2026-04-07 12:58:59 -05:00
Sean (ANGRYxScotsman) a72c0770dd removed redundant appx packages (#4308)
* updated appx list

* kept camera

* kept dolby

* removed copilot as we have another tweak for this

* Update tweaks.json

* undo last commits

* removed likedin

* other tweaks do this.

* remove copilot tweak does this

* Update tweaks.json

* removed redundant packages

* removed AppUp.IntelManagementandSecurityStatus

* updated content

* Update tweaks.json

* Update tweaks.json

* Update tweaks.json

* Update tweaks.json

* Update tweaks.json

* Update tweaks.json

* Update tweaks.json
2026-04-07 12:58:27 -05:00
Chris Titus 811cc126e6 chore: Update generated dev docs (#4329) 2026-04-07 12:51:25 -05:00
Gabi 3ceea1b9c1 Disable GeoLocation service in WPFTweaksLocation (#4307)
* Disable GeoLocation service in WPFTweaksLocation

* Update tweaks.json

* Update tweaks.json
2026-04-07 12:50:50 -05:00
Gabi 0cd971d992 Update Install-WinUtilWinget.ps1 (#4302)
* Update Install-WinUtilWinget.ps1

* Update Install-WinUtilWinget.ps1

* Update Install-WinUtilWinget.ps1

* Update Install-WinUtilWinget.ps1

* Update Install-WinUtilWinget.ps1
2026-04-07 12:50:05 -05:00
Chris Titus e077fc7e21 chore: Update generated dev docs (#4328) 2026-04-07 12:47:42 -05:00
Jarosław Drzewiecki de Ogańczyk 0abac833ce Fixed InitialKeyboardIndicators to be String instead of Dword (#4306) 2026-04-07 12:47:12 -05:00
Sean (ANGRYxScotsman) a0fdf2cb80 removed redundant appx packages from win11 creator (#4321)
* redundant

* Update Invoke-WinUtilISOScript.ps1

* Update Invoke-WinUtilISOScript.ps1

* Update Invoke-WinUtilISOScript.ps1

* Update Invoke-WinUtilISOScript.ps1

* Update Invoke-WinUtilISOScript.ps1

* Update Invoke-WinUtilISOScript.ps1

* Update Invoke-WinUtilISOScript.ps1

* Update Invoke-WinUtilISOScript.ps1

* removed notes aswell
2026-04-07 10:48:52 -05:00
Gabi b8f1671ff7 Removed some old code from Invoke-WPFButton.ps1 (#4318) 2026-04-07 10:47:42 -05:00
Gabi 0536047200 Fix: onedrivesetup not being removed (#4317)
* Removed onedrive removal from Invoke-WinUtilISOScript.ps1

* Update autounattend.xml

* Update Invoke-WinUtilISOScript.ps1
2026-04-07 10:47:24 -05:00
dependabot[bot] 2a4bff017d Bump actions/download-artifact from 4 to 8 (#4316)
Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 4 to 8.
- [Release notes](https://github.com/actions/download-artifact/releases)
- [Commits](https://github.com/actions/download-artifact/compare/v4...v8)

---
updated-dependencies:
- dependency-name: actions/download-artifact
  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-04-07 10:46:57 -05:00
dependabot[bot] 68d6ca7edc Bump actions/upload-artifact from 4 to 7 (#4315)
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 4 to 7.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](https://github.com/actions/upload-artifact/compare/v4...v7)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  dependency-version: '7'
  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-04-07 10:46:37 -05:00
Chris Titus 00fbd0e86d chore: Update generated dev docs (#4326) 2026-04-07 10:46:13 -05:00
Gabi c24ea5e53b Update Invoke-WinUtilISO.ps1 (#4314) 2026-04-07 10:46:11 -05:00
Gabi 786c7c677d Make WPFTweaksRemoveCopilot only remove copilot (#4310) 2026-04-07 10:45:44 -05:00
Sean (ANGRYxScotsman)andChris Titus c9e9214fd6 added next and previous (#4323)
Co-authored-by: Chris Titus <contact@christitus.com>
2026-04-07 10:38:37 -05:00
Sean (ANGRYxScotsman) b7f6a8cebe fixed more 404 errors (#4322)
* fixed 404 errors

* updated page

* Update _index.md
2026-04-07 10:37:37 -05:00
Gabi 355bd17b88 Added veravrypt and cryptomator and hugo to applications.json (#4305)
* Added veravrypt to applications.json

* Added hugo to applications.json

* Update applications.json
2026-04-07 10:36:14 -05:00
potato 6198bb2cdd feat: add uv to installable applications (#4304) 2026-04-07 10:35:37 -05:00
Chris Titus 6a495411e8 chore: Update generated dev docs (#4325) 2026-04-07 10:31:58 -05:00
Gabi 8f830a59df Update tweaks.json (#4303) 2026-04-07 10:31:25 -05:00
Chris Titus e4dd305084 fix release drafter 2026-04-02 15:49:39 -05:00
Gabi 01c808ab42 Fixed AmbieWhiteNoise's id (#4298)
* Removed AmbieWhiteNoise from applications.json

* Update applications.json
2026-04-02 15:31:40 -05:00
Chris Titus d2c9bc8751 formatting fixes 2026-04-02 15:30:12 -05:00
Gabi 7f105a58bb Update Invoke-WinUtilRemoveEdge.ps1 (#4291)
* Update Invoke-WinUtilRemoveEdge.ps1

* Update Invoke-WinUtilRemoveEdge.ps1

* Merge branch 'ChrisTitusTech:main' into patch-12
2026-04-02 15:24:18 -05:00
Chris Titus 838b0c1a1b chore: Update generated dev docs (#4301) 2026-04-02 15:17:58 -05:00
Gabi e0118aabe5 Added WPFFixesNTPPool (#4290)
* Added WPFFixesNTPPool

* Create Invoke-WPFFixesNTPPool.ps1

* Update Invoke-WPFFixesNTPPool.ps1

* Update Invoke-WPFFixesNTPPool.ps1

* Update Invoke-WPFFixesNTPPool.ps1

* Merge branch 'ChrisTitusTech:main' into patch-11

* Update NTP server to pool.ntp.org for improved synchronization
2026-04-02 15:17:27 -05:00
Gabi 9535302e6d Fix issue #4285 (#4289)
* Update Invoke-WPFFeatureInstall.ps1

* Merge branch 'ChrisTitusTech:main' into patch-10
2026-04-02 15:08:51 -05:00
Gabi 1eba305fab Update Invoke-WPFUpdatesdisable.ps1 to not require a restart (#4288)
* Update Invoke-WPFUpdatesdisable.ps1 to not require a restart

* Update Invoke-WPFUpdatesdisable.ps1

* Update Invoke-WPFUpdatesdefault.ps1

* Merge branch 'ChrisTitusTech:main' into patch-9
2026-04-02 15:07:34 -05:00
makhlwf 74f990028f fix: improve screen reader accessibility by naming control containers (#4287) 2026-04-02 15:06:39 -05:00
Chris Titus e94742a77d chore: Update generated dev docs (#4300) 2026-04-02 14:53:03 -05:00
Gabi fb6ef49a83 Remove not recommended from WPFTweaksDeBloat tweak (#4276)
* Update tweaks.json

* Update tweaks.json

* fix typo

* Merge branch 'ChrisTitusTech:main' into patch-2
2026-04-02 14:52:37 -05:00
Pere Gomila ab00ff2710 Add 'foss' key to NodeJS LTS in applications.json (#4272)
Added 'foss' key to NodeJS LTS application entry.
2026-04-02 14:51:05 -05:00
Gabi 50d8a8656b Make Security Updates tell the truth (#4269)
* Make Security Updates tell the truth

* Merge branch 'ChrisTitusTech:main' into patch-6
2026-04-02 14:36:26 -05:00
Gabi 1cd918cbe1 Remove OneDrive startup entry (#4253)
* Remove Onedrive startup entry

* Merge branch 'ChrisTitusTech:main' into patch-1

* Merge branch 'ChrisTitusTech:main' into patch-1

* Merge branch 'main' into patch-1
2026-04-02 14:28:06 -05:00
Sean (ANGRYxScotsman) bc2f6ce8f7 fix win11 Creator 404 error and site update (#4296)
* Update _index.md

* theme update
2026-04-02 14:23:20 -05:00
github-actions[bot]andChrisTitusTech c1fe9c6b88 Update sponsors in README (#4283)
Co-authored-by: ChrisTitusTech <7896101+ChrisTitusTech@users.noreply.github.com>
2026-03-31 10:40:09 -05:00
dependabot[bot] d0899b4f29 Bump actions/configure-pages from 5 to 6 (#4281)
Bumps [actions/configure-pages](https://github.com/actions/configure-pages) from 5 to 6.
- [Release notes](https://github.com/actions/configure-pages/releases)
- [Commits](https://github.com/actions/configure-pages/compare/v5...v6)

---
updated-dependencies:
- dependency-name: actions/configure-pages
  dependency-version: '6'
  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-03-31 10:39:41 -05:00
dependabot[bot] 3c8459f31f Bump actions/deploy-pages from 4 to 5 (#4280)
Bumps [actions/deploy-pages](https://github.com/actions/deploy-pages) from 4 to 5.
- [Release notes](https://github.com/actions/deploy-pages/releases)
- [Commits](https://github.com/actions/deploy-pages/compare/v4...v5)

---
updated-dependencies:
- dependency-name: actions/deploy-pages
  dependency-version: '5'
  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-03-31 10:39:16 -05:00
Gabi 0c38d420ee Removed WaaSMedicSvc from Invoke-WPFUpdatesdisable.ps1 (#4267) 2026-03-31 10:38:49 -05:00
Chris Titus e63d75e398 chore: Update generated dev docs (#4293) 2026-03-31 10:35:12 -05:00
Gabi 01d24bdf31 They added more widget services so... (#4262) 2026-03-31 10:34:33 -05:00
VasoandVaso 12abc7f281 Removing Borderless Gaming and updating UnigetUI (#4259)
* Update applications.json

* Remove Borderless Gaming

* Update UniGetUI code for their link and winget

---------

Co-authored-by: Vaso <92270244+VasoHD@users.noreply.github.com>
2026-03-31 10:33:47 -05:00
Chris Titus 10906e037e chore: Update generated dev docs (#4292) 2026-03-31 10:33:09 -05:00
Paweł Gwozdowski b43a712e9b Update UniGetUI winget id (#4231)
* Update applications.json

* Update applications.json

* Update applications.json

* Update applications.json

* Update applications.json
2026-03-31 10:32:51 -05:00
B1ack3ye ed74dc51b5 Update tweaks.json (#4256)
Disable Edge default browser campaign via policy
2026-03-31 10:32:32 -05:00
Paweł Gwozdowski 6b83f1da51 Update UniGetUI winget id (#4231)
* Update applications.json

* Update applications.json

* Update applications.json

* Update applications.json

* Update applications.json
2026-03-31 10:29:33 -05:00
Gabi 24c6706ab2 Update Invoke-WinUtilSSHServer.ps1 (#4254)
* Update Invoke-WinUtilSSHServer.ps1

* fix: correct ssh-agent restart, use USERPROFILE path, add sshd_config idempotency check

* Cleanup for Invoke-WinUtilSSHServer.ps1

* Update Invoke-WinUtilSSHServer.ps1

* Merge branch 'ChrisTitusTech:main' into patch-2

* Update Invoke-WinUtilSSHServer.ps1

* Update Invoke-WinUtilSSHServer.ps1

* Merge branch 'main' into patch-2

* Update Invoke-WinUtilSSHServer.ps1

* typo
2026-03-27 08:26:36 -05:00
Chris Titus f4703284ef chore: Update generated dev docs (#4264) 2026-03-26 15:26:48 -05:00
Paweł GwozdowskiandJay 0028e439b5 Cleaned up typos, fixes grammatical errors and other related fixes (#4215)
* cleaned up typo, fixes, grammatical and other related fixes (#2)

* typo in Lightshot app name

* remove trailing comma in applications.json

* consistent capitalization of Windows, WinGet - only user-facing text

	- includes update to devdocs-generator.ps1, so docs for tweaks modifying registry will have `Windows settings` rather than `windows settings`

* various fixes for typos, style, punctuation and capitalization

* capitalize 'AM'

* Update README.md

change formatting for GitHub UI interaction form code format (` `) to bold md

Co-authored-by: Jay <65828559+Jay-o-Way@users.noreply.github.com>

* typos and wording in docs

---------

Co-authored-by: Jay <65828559+Jay-o-Way@users.noreply.github.com>
2026-03-26 15:26:21 -05:00
Gabi 37529a5659 Added mpc-qt and qview and TeamSpeak 3 and ecm to applications.json (#4211)
* Added mpc-qt and qview to applications.json

* Update applications.json

* Added teamspeak3

* added ecm
2026-03-26 15:23:35 -05:00
Chris Titus 2dbf3d71c0 chore: Update generated dev docs (#4258) 2026-03-25 21:29:07 -05:00
Chris Titus ef226ac272 chore: Update generated dev docs (#4257) 2026-03-25 21:22:41 -05:00
Ivan Lepekha 1f7f653568 Typo fix WPFTweaksXboxRemoval (#4248) 2026-03-25 21:22:06 -05:00
Mochi 9bd5a2541d Add Ruby and Lua entries (#4240)
* Add Opera, OperaGX, Ruby and Lua entries

Update applications.json to include two new browser entries (Opera, OperaGX) and two development runtime entries (Ruby, Lua).

* Remove Opera and OperaGX from applications.json

Removed entries for Opera and OperaGX from applications list.
2026-03-25 21:21:35 -05:00
github-actions[bot]andChrisTitusTech c2dbcda2d5 Update sponsors in README (#4238)
Co-authored-by: ChrisTitusTech <7896101+ChrisTitusTech@users.noreply.github.com>
2026-03-25 21:20:39 -05:00
Vaso 0bd333dd47 Update applications.json (#4217) 2026-03-25 21:17:46 -05:00
Sean (ANGRYxScotsman) 6188447348 updated docs (#4203)
* updated docs

* Update KnownIssues.md

* Update faq.md

* Update _index.md

* Update _index.md

* Update _index.md

* Update faq.md

* Update faq.md

* Update faq.md
2026-03-25 21:17:09 -05:00
dependabot[bot] edfed488e8 Bump release-drafter/release-drafter from 6 to 7 (#4226)
Bumps [release-drafter/release-drafter](https://github.com/release-drafter/release-drafter) from 6 to 7.
- [Release notes](https://github.com/release-drafter/release-drafter/releases)
- [Commits](https://github.com/release-drafter/release-drafter/compare/v6...v7)

---
updated-dependencies:
- dependency-name: release-drafter/release-drafter
  dependency-version: '7'
  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-03-19 23:30:33 -05:00
Chris Titus 8d1f7d509a chore: Update generated dev docs (#4234) 2026-03-19 23:29:25 -05:00
Gabi 0a642be3b4 opps (#4220) 2026-03-19 23:28:56 -05:00
github-actions[bot]andChrisTitusTech d3f9584892 Update sponsors in README (#4212)
Co-authored-by: ChrisTitusTech <7896101+ChrisTitusTech@users.noreply.github.com>
2026-03-19 23:22:54 -05:00
Gabi a05034381d Update Win11 Creator (#4196)
* Update autounattend.xml

* Update autounattend.xml

* Updated autounattend.xml to disable reccomened section

* Update autounattend.xml
2026-03-13 10:18:36 -05:00
Chris Titus b1d4eb022c Fix mount disk error (#4204)
* wait for mounting to assign disk letter

* update

* Gabi fixing my slop with a comment
2026-03-12 15:45:42 -05:00
Gabi 3dbd993cb4 Update bug_report.yaml (#4206) 2026-03-12 15:27:37 -05:00
Gabi ec17c085df Fix: Prevent Win11 Creator UI reset when switching tabs during ISO Creation (#4199)
* Fix: Prevent Win11 Creator UI reset when switching tabs during ISO modification

* Update Invoke-WinUtilISO.ps1
2026-03-12 15:09:52 -05:00
Chris Titus 7da4e78d4b chore: Update generated dev docs (#4205) 2026-03-12 15:09:30 -05:00
Gabi 1943b30ec9 Make WPFTweaksRevertStartMenu more understandable and move it to essential tweaks (#4202)
* Make WPFTweaksRevertStartMenu more understandable

* Update tweaks.json
2026-03-12 15:08:56 -05:00
Chris Titus 6df8ae900c chore: Update generated dev docs (#4192) 2026-03-11 16:30:50 -05:00
Gabi a16f4b7d07 Update WPFTweaksXboxRemoval (#4170)
* Update WPFTweaksXboxRemoval

* Update tweaks.json
2026-03-11 16:30:00 -05:00
Chris Titus adaab0ab36 chore: Update generated dev docs (#4191) 2026-03-11 16:26:43 -05:00
Gabi c270d25460 Added WPFTweaksDisableStoreSearch (#4173)
* Added WPFTweaksDisableStoreSearch

* Update tweaks.json
2026-03-11 16:26:06 -05:00
Eren 2bb007b6ff Fix import / export config issue (#4189)
* apply toggle fix

* apply fix that disables all toggles outside of config
2026-03-11 16:23:32 -05:00
Garratt 34f29dd04c - Added AI-Automation download section. (#4159)
* - Added AI-Automation download section
- Fixed typo in CONTRIBUTING.md teminal -> terminal

* Move Cursor to Development

* Move AutoHotkey back to Utilities
2026-03-11 10:31:33 -05:00
Gabi ccb43bfe91 Added some apps to applications.json (#4146)
* Add Overwolf and Logitech G Hub to applications.json

* Added citrixworkspaceapp and pdf-xchange to applications.json

* Added visualstudio2026
2026-03-11 10:30:15 -05:00
Chris Titus 1d401b2e02 initial fix (#4178) 2026-03-11 10:29:38 -05:00
Gabi d8f6a8c50b Cleanup alot of old issues in KnownIssues.md (#4181)
* Cleanup alot of old issues in KnownIssues.md and add Windows Version

* Update KnownIssues.md

* Update KnownIssues.md
2026-03-11 10:25:34 -05:00
Sean (ANGRYxScotsman) 3da0221fb4 removed windows 10 reference and pages edits (#4185)
* removed any windows 10 reference

* update links

* page clean up

* Update _index.md

* clean up getting started page

* clean up more pages

* Update faq.md

* Update _index.md

* more clean up
2026-03-11 10:24:46 -05:00
Sean (ANGRYxScotsman) a30664002b added doc link to settings menu (#4156) 2026-03-06 08:29:20 -06:00
Chris Titus 5e78391518 chore: Update generated dev docs (#4163) 2026-03-06 08:29:10 -06:00
Sean (ANGRYxScotsman) 2d2497408f Website updated to latest version (#4157)
* updated theme to latest version

* updated tabs to the new way

* added missing frontmatter to pages

* updated hugo version

* edited the file structure

* revert back to old way

* Update _index.md

* fix typo and made sure it was upto date

* updated docs

* clean up navbar

* Update en.yaml
2026-03-06 08:28:34 -06:00
Gabi d2dbf03572 Update Invoke-WPFFixesWinget.ps1 (#4160) 2026-03-05 16:39:50 -06:00
Chris Titus 88c68fd411 update bug report 2026-03-04 15:50:00 -06:00
Chris Titus e82aaf03f0 update bug report 2026-03-04 15:46:18 -06:00
Chris Titus 9a77fed09b minimize feature request template 2026-03-04 15:29:48 -06:00
Chris Titus 336ac6fb8f remove key flag from unattended (#4154) 2026-03-04 15:14:16 -06:00
Gabi 72ad35bbd8 Remove product key from autounattend.xml (#4152) 2026-03-04 12:26:53 -06:00
Chris Titus df17ca4695 Fix offline mode (#4153)
* Fix usb error on drive with no existing partitions

* fix offline mode

* Add offline banner
2026-03-04 12:21:18 -06:00
Chris Titus 7f46e8d60d Fix usb error on drive with no existing partitions (#4151) 2026-03-04 11:44:10 -06:00
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
GabiandPaweł Gwozdowski 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
GabiandPaweł Gwozdowski 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
Gabi 349889b194 Minor format changes for Invoke-WPFSystemRepair.ps1 (#4100)
* Format changes

* Update Invoke-WPFSystemRepair.ps1
2026-02-22 17:31:54 -06:00
Raphaël c619f3a830 Add more development tools to applications.json (#4093)
* Add .NET Desktop Runtime 10 to applications.json

* Add LLVM to applications.json

* Add NASM to applications.json
2026-02-22 17:30:43 -06:00
KamaleiZestriandChris Titus d005a225a2 NoUI mode and Concurrency edits (#4092)
* Autorun changes

* Missed a handle

* Remove todo

---------

Co-authored-by: Chris Titus <dfm.titus@gmail.com>
2026-02-22 17:28:55 -06:00
Gabi e79e946e76 Remove incorrect infromaiton from WPFTweaksRazerBlock (#4082) 2026-02-22 17:23:19 -06:00
github-actions[bot]andChrisTitusTech 3b957e1a77 Update sponsors in README (#4095)
Co-authored-by: ChrisTitusTech <7896101+ChrisTitusTech@users.noreply.github.com>
2026-02-22 17:21:52 -06:00
Gabi d078d67b1d Remove debug option (#4094)
* Remove debug option

* Remove debug option
2026-02-22 17:21:32 -06:00
Gabi 191fe95572 Update-KnownIssues.md (#4096)
* Update KnownIssues.md

* Update KnownIssues.md
2026-02-22 17:20:39 -06:00
Sean (ANGRYxScotsman) d10c9413ac Update devdocs-generator (#4091)
* Update devdocs-generator.ps1

* made new dir

* Update devdocs-generator.ps1

* Update devdocs-generator.ps1
2026-02-22 17:19:43 -06:00
Chris Titus e93753e5c9 Json-Cleanup-Expansion (#4090)
* initial cleanup

* remove winutilgpu
2026-02-22 17:19:04 -06:00
Gabi 5eec99df1c Fix title screen image url (#4087) 2026-02-18 15:29:41 -06:00
Gabi 7e2ba41b8b Update inputXML.xaml (#4089) 2026-02-18 15:29:14 -06:00
Chris Titus d3dc3e7976 Merge branches 'main' and 'main' of https://github.com/ChrisTitusTech/winutil 2026-02-18 14:44:33 -06:00
Gabi 5a4d822710 Fix more images in CONTRIBUTING.md (#4086) 2026-02-18 14:44:19 -06:00
Chris Titus 2625478ef3 assign docs label 2026-02-18 14:41:00 -06:00
github-actions[bot]andChrisTitusTech 956a544c2e Update generated documentation (#4084)
Co-authored-by: ChrisTitusTech <7896101+ChrisTitusTech@users.noreply.github.com>
2026-02-18 14:33:39 -06:00
Gabi 50dbf5bd05 Fix fork image (#4085) 2026-02-18 14:32:29 -06:00
Gabi 338c3e7e57 Add warning to WPFToggleStartMenuRecommendations (#4083) 2026-02-18 14:31:38 -06:00
Gabi 1a0e084d7e Add Undoscript to WPFToggleTaskbarAlignment (#4079) 2026-02-18 14:23:09 -06:00
Gabi 89147414a0 Fix WPFTweaksRemoveCopilot's InvokeScript (#4077) 2026-02-18 14:22:23 -06:00
Gabi ae4b3f3ac7 Remove file missing error from running complie.ps1 (#4078)
* Remove Validatsion of the ExcludedItems List From complie.ps1 and remove annoying warning

* Update Invoke-Preprocessing.ps1
2026-02-18 14:21:45 -06:00
Chris Titus 043ec9abe0 Merge branch 'main' of https://github.com/ChrisTitusTech/winutil 2026-02-18 14:18:55 -06:00
Chris Titus 5c92fcbde5 delete branch after it merges 2026-02-18 14:18:53 -06:00
b1094c9177 chore: Update Generated Dev Docs (#4076)
* Update generated documentation

* trigger workflow

---------

Co-authored-by: ChrisTitusTech <7896101+ChrisTitusTech@users.noreply.github.com>
Co-authored-by: Chris Titus <contact@christitus.com>
2026-02-18 20:17:33 +00:00
Chris Titus 9ab1c6bbd3 automerge pat 2026-02-18 14:16:07 -06:00
Chris Titus 97d3ada895 update auto merge 2026-02-18 14:11:15 -06:00
Chris Titus 8212b3ed5e Merge branch 'main' of https://github.com/ChrisTitusTech/winutil 2026-02-18 13:57:50 -06:00
Chris Titus d410667c6d auto approve docs 2026-02-18 13:57:48 -06:00
Gabi e51e345438 Update tweaks.json (#4074) 2026-02-18 12:40:53 -06:00
github-actions[bot]andChrisTitusTech 3404f185f1 Update generated documentation (#4075)
Co-authored-by: ChrisTitusTech <7896101+ChrisTitusTech@users.noreply.github.com>
2026-02-18 12:37:09 -06:00
Chris Titus f15c212df5 no persist on perms workflow 2026-02-18 12:34:23 -06:00
Chris Titus 152c157b51 fix docs to create pr 2026-02-18 12:31:08 -06:00
Sean (ANGRYxScotsman) 80e54a0ea5 updated doc workflow (#4069)
* updated workflow

* changed the commit message

* fixed spacing in copyright

i will notice these issues before committing in future lol

* Update devdocs-generator.md
2026-02-18 11:51:44 -06:00
Gabi 7fb1643378 Someone touched my perfect code for WPFTweaksRemoveCopilot (#4068) 2026-02-18 11:45:05 -06:00
Eren f6c0c9682c apply escaping (#4071) 2026-02-18 11:44:42 -06:00
github-actions[bot]andChrisTitusTech b7ef73cb10 Update sponsors in README (#4073)
Co-authored-by: ChrisTitusTech <7896101+ChrisTitusTech@users.noreply.github.com>
2026-02-18 11:17:51 -06:00
Chris Titus 0b76ab3aa4 verbose checks for if PR is needed 2026-02-18 11:14:52 -06:00
Chris Titus 436e3c353e persist creds 2026-02-18 11:10:57 -06:00
Chris Titus 50ca97575b update perms 2026-02-18 11:08:56 -06:00
Chris Titus 618561e5cf update to pr for sponsors 2026-02-18 10:59:30 -06:00
Chris Titus 725244c28e change to issue pr 2026-02-18 10:52:46 -06:00
Chris Titus d4c768315b update sponsors 2026-02-18 10:45:21 -06:00
Gabi e909d1a847 Delete WPFTweaksLaptopHibernation (#4066) 2026-02-17 14:24:29 -06:00
Gabi dcfa68476a Add-WPFTweaksRevertStartMenu (#4023)
* Add WPFTweaksRevertStartMenu

* Create revertstartmenu.md

* Update tweaks.json

* Update tweaks.json

* Update tweaks.json

* Update revertstartmenu.md

* Update tweaks.json

* Update tweaks.json

* Update revertstartmenu.md

* Update tweaks.json
2026-02-17 13:49:54 -06:00
Eren 60d31a1fe0 Hightlight FOSS Apps (#4065)
* add foss tag functionality

* update applications

* update

* update

* fix

* update

* update

* fix formatting
2026-02-17 13:35:26 -06:00
Gabi 5476cd928f Fix WPFTweaksEdgeDebloat block copilot not working (#4063)
* Fix WPFTweaksEdgeDebloat block copilot not working

* Update tweaks.json

* Update tweaks.json

* Update tweaks.json
2026-02-17 13:31:44 -06:00
Gabi 84f2046912 Update-WPFTweaksWidget (#4058)
* Update WPFTweaksWidget how did you miss this chris?

* Fix WPFTweaksWidget not working
2026-02-17 13:30:37 -06:00
Gabi 586fd56603 Update-Invoke-WPFSystemRepair.ps1 (#4043)
* Update Invoke-WPFSystemRepair.ps1

* Update Invoke-WPFSystemRepair.ps1

* add chkdsk back in to tell users if there disk is broken

* Merge branch 'Update-Invoke-WPFSystemRepair' of https://github.com/gabinun/winutil into pr/GabiNun/4043

* add doc
2026-02-17 12:55:51 -06:00
KamaleiZestri 70a94abe02 Decoupled UI and data (#4051)
* Decoupled UI and data

* Fix bad variable naming

* Fix mistype

* Fix mistype v2

Editing from mobile is hard
2026-02-17 12:39:44 -06:00
KamaleiZestri 0e41122d89 More microwin files to delete (#4050) 2026-02-17 12:31:23 -06:00
Gabi 4e7416a2dc Remove Adobe Creative Cloud (#4048)
* Delete functions/public/Invoke-WPFRunAdobeCCCleanerTool.ps1

* Update feature.json
2026-02-17 12:30:38 -06:00
Gabi 61a6265cf9 Fix WPFTweaksBlockAdobeNet (#4042)
* Fix WPFTweaksBlockAdobeNet

* Update tweaks.json
2026-02-17 12:29:41 -06:00
Sean (ANGRYxScotsman) 5582c3cb44 More winutil docs update (#4038)
* updated the gen to add a blackline under the frontmatter and added .md file in the same location with breakdown on what the script does

* copyright fix.

found out the reason why it rendered correctly on my pc and not with site builder. it was because we use --minify for the site builder and i have not been using that on the local instance

* Update pre-release.yaml

* Update en.yaml
2026-02-17 12:28:36 -06:00
Gabi 08b24c7187 Change 'Get Installed' to 'Show Installed Apps' (#4027)
* Update appnavigation.json

* Update _index.md

* Update inputXML.xaml

* Update Invoke-WinUtilCurrentSystem.ps1

* Update Invoke-WinUtilCurrentSystem.ps1
2026-02-12 14:37:11 -06:00
KamaleiZestri 5fcc288037 Disable Sticky Keys shortcut added to toggle (#4028)
* disable sticky keys shortcut

* Merge branch 'main' into sticky
2026-02-12 14:36:17 -06:00
Gabi 8e8b0bb296 Make WPFToggleTaskbarAlignment restart explorer (#4034) 2026-02-12 14:35:31 -06:00
Eren be8d20d478 export and import toggle switch states in config JSON (#4037)
* feat: add support for importing and exporting WPFToggle checkbox states.

* feat: add export and import

* remove unnecessary buttons from tweaks tab

* Merge branch 'main' into feature/import-export

* Merge branch 'main' into feature/import-export
2026-02-12 14:34:28 -06:00
Sean (ANGRYxScotsman) 9b03b94435 more winutil website update and new features (#4030)
* updated theme to the latest version

* Update en.yaml

* removed all the order from the docs

* add the store link

* update homepage

* add filename and line number to all the code blocks and also removed pages

* auto pull the code from the json files

* Merge branch 'main' into winutil-new-features

* the script updated linenostart=

* Delete LaptopHibernation.md
2026-02-12 14:33:11 -06:00
Eren 9d841687e3 Fix winget package uninstallation issues (#4036)
* refactor: refine Program parameter type to string

* refactor: rename `Invoke-WPFRunspace` parameter `ArgumentList` to `ParameterList`
2026-02-12 13:52:09 -06:00
GabiandChris Titus 20046d4b73 Delete-WPFTweaksLaptopHibernation (#4031)
* Update tweaks.json

* Delete docs/content/dev/tweaks/Essential-Tweaks/LaptopHibernation.md

---------

Co-authored-by: Chris Titus <dfm.titus@gmail.com>
2026-02-11 09:31:05 -06:00
Eren b2ccb3669b Content-based Automatic Sorting (#4022)
* Implement Auto-sorting instead of manually defining order

* ffix visual bugs
2026-02-11 09:28:09 -06:00
Sean (ANGRYxScotsman) aaed116798 added frontmatter to pages (#4024)
* added frontmatter to widget.md

* update more pages

* updated copyright to automatically pull the year
2026-02-10 17:59:31 -06:00
Gabi 354b09ec0d Fix-WPFTweaksWidget (#4025)
* Fix WPFTweaksWidget

* Update Widget.md
2026-02-10 17:56:10 -06:00
Sean (ANGRYxScotsman) cfde1b5a92 Edited some things i forgot to do (#4019)
* move debloat edge to z--advanced-tweaks---caution

* updated frontmatter on the pages i have the shortcodes
2026-02-10 14:32:17 -06:00
Gabi 4ebe1a3535 Update WPFTweaksRemoveOneDrive to remove OneSyncSvc Service (#3991)
* Update tweaks.json

* Update RemoveOneDrive.md

* Update RemoveOneDrive.md

* Update tweaks.json

* Update RemoveOneDrive.md
2026-02-10 14:22:32 -06:00
Gabi 6708756574 Add xbox removal tweak (#4013)
* Update tweaks.json

* Create XboxRemoval.md

* Update tweaks.json

* Update XboxRemoval.md

* Update tweaks.json
2026-02-10 14:21:33 -06:00
Gabi 301059fd3f Add/remove a few packages to WPFTweaksDeBloat (#4012)
* Add/remove a few packages from WPFTweaksDeBloat

* Update DeBloat.md

* Update DeBloat.md

* Update tweaks.json

* Update tweaks.json

* Update DeBloat.md
2026-02-10 14:19:35 -06:00
dependabot[bot] df8d92cf11 Bump actions/github-script from 7 to 8 (#4011)
Bumps [actions/github-script](https://github.com/actions/github-script) from 7 to 8.
- [Release notes](https://github.com/actions/github-script/releases)
- [Commits](https://github.com/actions/github-script/compare/v7...v8)

---
updated-dependencies:
- dependency-name: actions/github-script
  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-10 14:18:42 -06:00
Chris Titus Tech 6cda509604 fix formatting 2026-02-10 14:18:09 -06:00
KamaleiZestri 8a8fed517c Unify $winutildir (#4004) 2026-02-10 14:14:20 -06:00
Gabi 681f0ec3b9 Change WinUtilInstallPSProfile to use pwsh (#3998)
* Update Invoke-WinUtilInstallPSProfile.ps1

* Update Invoke-WinUtilInstallPSProfile.ps1

* Update Invoke-WinUtilInstallPSProfile.ps1

* Update Invoke-WinUtilInstallPSProfile.ps1

* Update Invoke-WinUtilInstallPSProfile.ps1

* Mention that ps profile is pwsh only
2026-02-10 14:10:04 -06:00
Gabi 4a31af4faf Added WSAIFabricSvc to WPFTweaksServices (#3992)
* Added WSAIFabricSvc to WPFTweaksServices

* Update Services.md
2026-02-10 14:07:39 -06:00
Gabi 4ddb2795ff Update-WPFTweaksTelemetry (#3974)
* Update tweaks.json

* Update tweaks.json

* Update tweaks.json

* Update tweaks.json

* Update Telemetry.md

* Update tweaks.json

* Update Telemetry.md

* Update tweaks.json

* Update Telemetry.md

* Update tweaks.json
2026-02-10 14:03:02 -06:00
Gabi d5b5784492 Added More apps (#3961)
* Added sendme

* Update applications.json

* Update applications.json

* Update applications.json

* Added potplayer

* Update applications.json

* Update applications.json
2026-02-10 13:53:39 -06:00
Gabi 15d0b42165 Add links to tweaks without links (#3969)
* Create WPBT.md

* Create RazerBlock.md

* Update tweaks.json

* Update tweaks.json

* Create RemoveEdge.md

* Delete docs/content/dev/tweaks/Essential-Tweaks/RemoveEdge.md

* Create RazerBlock.md

* Delete docs/content/dev/tweaks/Essential-Tweaks/RazerBlock.md
2026-02-10 13:52:59 -06:00
Sean (ANGRYxScotsman) 8fc7d30112 more winutil website updates (#3967)
* changed autolinks to now use frontmatter instead off #heading

* updated all docs with front matter names

* Update DisableLegacyRecovery.md

this was the same as EnableLegacyRecovery file

* made sure pages have got the corrects scripts on them

* Update default.md

updated the archetype default to make sure every new page had the title and description automatically on the front matter

* Create BraveDebloat.md

* added brave debloat link to tweaks.json

* Update tweaks.json

* Update tweaks.json
2026-02-10 13:49:36 -06:00
QuadFeed a12ea71adb Update winget identifier for Zed application (#3966)
Changed from Zed.Zed to Zedindustries.Zed to fix install.
2026-02-10 13:48:00 -06:00
Gabi b00c7b1ea2 Add Remove widgets (#3962)
* Update tweaks.json

* Create Widget.md

* Update tweaks.json

* Update Widget.md

* Update tweaks.json

* Update Widget.md

* Update Widget.md

* Update tweaks.json

* Update tweaks.json

* Update Widget.md
2026-02-10 13:42:45 -06:00
Chris Titus Tech ef29ab9ffc remove hotfix 2026-02-10 13:41:42 -06:00
Chris Titus Tech 7219329d2c fix pr template to be clearer 2026-02-10 13:41:14 -06:00
Chris TitusandAkhil Achanta 27b0a59abb Zeus-toggle-fix (#4017)
* Fix Get Installed toggle detection and multiple config bugs

Fixes the issue where "Get Installed" in the Tweaks tab was not correctly
pulling all toggle states, plus several additional config bugs discovered
during investigation.

Changes:
- Unified toggle detection logic using Get-WinUtilToggleStatus
- Fixed registry value detection (0 values were incorrectly treated as missing)
- Added DefaultState support for missing registry keys
- Fixed WPFTweaksUTC registry type (QWord → DWord)
- Fixed WPFTweaksServices startup types (TermService, VaultSvc: Automatic → Manual)
- Fixed duplicate order collisions in tweaks
- Fixed FFmpeg display name
- Improved OneDrive removal script reliability
- Improved Copilot removal script with wildcard pattern and null check
- Fixed code formatting (added spaces after if/Foreach statements)

Files changed:
- functions/private/Invoke-WinUtilCurrentSystem.ps1
- functions/private/Get-WinUtilToggleStatus.ps1
- config/tweaks.json
- config/applications.json

Fixes #3762
Fixes #3189
Fixes #3876
Potentially fixes #3008
Potentially fixes #3815

* Fix toggles

---------

Co-authored-by: Akhil Achanta <akhilachanta8@gmail.com>
2026-02-10 13:37:37 -06:00
Chris Titus 457f1820c4 Revert "Fix Get Installed toggle detection and multiple config bugs (#3959)" (#4016)
This reverts commit 414cd139e2.
2026-02-10 13:33:07 -06:00
Akhil Kumar Achanta 414cd139e2 Fix Get Installed toggle detection and multiple config bugs (#3959)
Fixes the issue where "Get Installed" in the Tweaks tab was not correctly
pulling all toggle states, plus several additional config bugs discovered
during investigation.

Changes:
- Unified toggle detection logic using Get-WinUtilToggleStatus
- Fixed registry value detection (0 values were incorrectly treated as missing)
- Added DefaultState support for missing registry keys
- Fixed WPFTweaksUTC registry type (QWord → DWord)
- Fixed WPFTweaksServices startup types (TermService, VaultSvc: Automatic → Manual)
- Fixed duplicate order collisions in tweaks
- Fixed FFmpeg display name
- Improved OneDrive removal script reliability
- Improved Copilot removal script with wildcard pattern and null check
- Fixed code formatting (added spaces after if/Foreach statements)

Files changed:
- functions/private/Invoke-WinUtilCurrentSystem.ps1
- functions/private/Get-WinUtilToggleStatus.ps1
- config/tweaks.json
- config/applications.json

Fixes #3762
Fixes #3189
Fixes #3876
Potentially fixes #3008
Potentially fixes #3815
2026-02-10 13:29:50 -06:00
Gabi e68e190ff3 Update-Compile (#3922)
* Update Compile.ps1

* Update Compile.ps1

* Update Compile.ps1

* Update Compile.ps1

* Update Compile.ps1

* Update Compile.ps1
2026-02-10 13:19:46 -06:00
Chris Titus 86097572b0 fix adobe hosts (#3955) 2026-02-10 12:53:16 -06:00
titus 94d45a30fa fix docs to only run on main branch and not forks 2026-02-09 12:30:07 -06:00
GabiandChris Titus fcc5481477 Remove microwin (#3999)
* Delete microwin functions

* Update main.ps1

* Remove oscdimg.exe which is used by microwin

* Delete config/autounattend.xml

* Update .gitignore

* Update bug_report.yaml

* Update themes.json

* Update Invoke-WinUtilFontScaling.ps1

* Update Invoke-AutoConfigDialog.ps1

* Update Invoke-WPFButton.ps1

* Update inputXML.xaml

* Delete docs/assets/images/microwin directory

* Delete docs/assets/images/MicroWinScreen.png

* Delete docs/assets/images/Microwin-Dark.png

* Delete docs/assets/images/Microwin-Light.png

* Update faq.md

* Update KnownIssues.md

* Update getting-started.md

* Update _index.md

* Delete docs/content/userguide/microwin directory

* Update architecture.md

---------

Co-authored-by: Chris Titus <dfm.titus@gmail.com>
2026-02-06 10:29:10 -06:00
Chris Titus ac116d7083 New install gui (#3995)
* cleanup and checkbox addition

* Make collapsable categories

* finish new install GUI

* Fix search
2026-02-06 10:26:29 -06:00
Pádraic Slattery 68ab69a19c chore: Update outdated GitHub Actions version (#3980) 2026-02-04 18:51:28 -06:00
Gabi 29efb989bd Fix Links (#3965)
* Fix Links

* Update tweaks.json

* Update tweaks.json

* Update tweaks.json
2026-01-30 15:32:11 -06:00
Sean 99eb70d81b Docs, Winutil website update (#3947)
* Updated winutil website

add git ignore to not upload unnecessarily file. i have also updated microwin docs and added a copyright info to the footer

* Update _index.md

* Update KnownIssues.md

* Update links

update all the links for github to the corresponding pages. i have kept the original links aswell but commented out

* update hugo workflow to use version 0.147.0

* Update en.yaml

* update hugo toml to get rid off powered by

* Update docs.yaml

* Update KnownIssues.md

* Update KnownIssues.md

* Update KnownIssues.md

* Update compatibility note for MicroWin and Ventoy

* removed quad 9 dns

* fixed all the incorrect code block in markdown file

* Replace hardcoded page lists with auto-discovery shortcode

Created a new shortcode at docs/layouts/shortcodes/autolinks.html. This enables auto-discovery when creating new Markdown files, streamlining the workflow for future documentation updates.

* updated os requirements
2026-01-29 13:59:26 -06:00
Gabi 9013753d88 Remove snap assists toggles (#3954)
* Remove snap assists toggle

* Remove more snap stuff
2026-01-28 16:03:26 -06:00
Gabi 8ad96a9b6e Update tweaks.json (#3956) 2026-01-28 16:01:35 -06:00
titus 8ed3a31424 auto format and make categories for releases 2026-01-28 12:32:40 -06:00
titus 424d4030c1 add Gabi to close issues command 2026-01-28 12:14:01 -06:00
titus f88c9be70d u 2026-01-28 11:49:50 -06:00
titus bc4cd84127 update label pr 2026-01-28 11:47:41 -06:00
titus 54b4bcdda1 fix perms 2026-01-28 11:44:38 -06:00
Gabi c5c23d8d18 Update Compile.ps1 (#3914) 2026-01-28 11:37:53 -06:00
Gabi 28e84af33d Update tweaks.json (#3910) 2026-01-28 11:33:14 -06:00
Gabi 832af914e9 Update Microwin-NewFirstRun.ps1 (#3938) 2026-01-28 11:26:44 -06:00
Bagus Nugroho Budi Nurtomo 6d9ed9026d Disable Brave Stats Ping (#3951)
Signed-off-by: Bagus Nurtomo <bagusthanatos@gmail.com>
2026-01-28 11:23:33 -06:00
Gabi 9e877afe0e Update Services.md (#3950) 2026-01-28 11:21:56 -06:00
titus 0c0ced381a UPDATE CODEOWNERS 2026-01-28 11:21:06 -06:00
Chris Titus 8ebd127857 add flush dns (#3953) 2026-01-28 11:17:06 -06:00
Sean 25a392877f Update inputXML.xaml (#3943) 2026-01-28 11:09:01 -06:00
Gabi ef2c91b616 Add some apps from #1782 (#3948)
* Add imhex (Hex Editor)

* Add ffmpeg
2026-01-28 11:06:47 -06:00
Gabi b52ead87f4 Delete orig-services.txt (#3949) 2026-01-28 11:05:29 -06:00
titus 2dcfc2b109 auto-label and fix pr template 2026-01-28 11:03:02 -06:00
59a9c59064 Fix/issue 3815 (#3836)
* Fix: retry password prompt on failure to prevent script halting

* Update Invoke-WPFInstall.ps1

* format fix

* fix: change RealTimeIsUniversal to QWord for correct UTC time sync

---------

Co-authored-by: Chris Titus <contact@christitus.com>
Co-authored-by: Chris Titus Tech <dfm.titus@gmail.com>
2026-01-27 13:31:55 -06:00
Gabi fcc57fde50 Add back Remove OneDrive (#3920)
* Update tweaks.json

* Create RemoveOneDrive.md

* Update _index.md

* Update _index.md

* Update _index.md

* Update tweaks.json

* Update tweaks.json

* Update tweaks.json

* Update RemoveOneDrive.md

* Update tweaks.json

* Update RemoveOneDrive.md

* Update tweaks.json

* Update RemoveOneDrive.md

* Update tweaks.json

* Update RemoveOneDrive.md

* Update tweaks.json

* Update RemoveOneDrive.md
2026-01-27 13:24:17 -06:00
Gabi 06e5477d0e Remove-Edge (#3913)
* Update tweaks.json

* Create Invoke-WinUtilRemoveEdge.ps1

* Update and rename EdgeUninstall.md to RemoveEdge.md

* Update Invoke-WinUtilRemoveEdge.ps1

* Update RemoveEdge.md

* Update Invoke-WinUtilRemoveEdge.ps1

* Update RemoveEdge.md

* Update Invoke-WinUtilRemoveEdge.ps1

* Update RemoveEdge.md

* Update Invoke-WinUtilRemoveEdge.ps1

* Update RemoveEdge.md

* Update Invoke-WinUtilRemoveEdge.ps1

* Update Invoke-WinUtilRemoveEdge.ps1

* Update RemoveEdge.md
2026-01-27 13:11:30 -06:00
CodingWonders a5271597e9 [Fix] Force WinGet source (#3918)
* [Fix] Force WinGet source

* Force WinGet source for uninstall
2026-01-27 13:03:56 -06:00
Chris Titus d841792f8d add orig-services post tweaks 2026-01-27 12:30:40 -06:00
GabiandChris Titus 132260ab96 Fix #3876 Maybe (#3929)
* Update tweaks.json

* Update tweaks.json

* Update config/tweaks.json

Co-authored-by: Chris Titus <contact@christitus.com>

* Update tweaks.json

---------

Co-authored-by: Chris Titus <contact@christitus.com>
2026-01-27 12:29:21 -06:00
ChrisTitusTech 919b2e0b8f Deploying to main from @ ChrisTitusTech/winutil@22e083182d 🚀 2026-01-22 15:40:54 +00:00
regularentropy 22e083182d fix: change feature update delay from 2 years to 365 days (#3927) 2026-01-21 22:55:50 -06:00
Gabi 2ec37f952a Update _index.md (#3912) 2026-01-21 22:54:20 -06:00
CodingWondersandReal-MullaC aa719b49bf [MicroWin] 2026 Update (#3837)
* New reporting tool

* Why did we EVER need to load the component store?

* Up the execution policy for default PWSH sessions

This is required to run the diagnostics script, and any script that either we create here, or the user creates later. At least we don't go too wild and use unrestricted... we use something more "safe"

* Force Panther Setup instead of MoSetup

This will increase reliability and performance. Screw the Windows 8 installer, we're back with what was used on Windows 7!

Anyway, there are problems with the new installer:

1. It is slow at everything. Some people did benchmarks of both installers. MoSetup lost to Panther (ofc). Source: https://www.reddit.com/r/Windows11/comments/1kmjavl/i_made_a_small_test_comparing_which_one_installs/
2. It is unreliable. The "Install driver to show hardware" screen that appears in some systems AND in PXE/WDS for Server 2025 is possibly, and simply, due to Setup not being able to find the install image. From BlueBox.log in MoSetup:

...
2025-12-21 10:05:43: Creating path (with ACL): [X:\$WINDOWS.~BT]...
2025-12-21 10:05:43: Creating path: [X:\$WINDOWS.~BT\Sources]...
2025-12-21 10:05:43: CBootScenarioCtrl::PopulateWorkingDir: Install.wim/swm/esd was not found!
...

Other contributors in the CTT community stated similar unreliability with borked installs.

I'm pretty sure this change will benefit everyone. We'll see how long it lasts before Microsoft f's it up.

* Improve reporting tool

Display appx package dependency full names

* Rework ADK detection

* Add revamped detection for ISO creation

* File Explorer ain't broken anymore on 26200.7462

Those incompetent developers changed WindowsAppRuntime.CBS to WindowsAppRuntime.CBS.1.6 circa 10.0.26200.7462. No wonder why direct downloads were not causing this issue; they are still based on 10.0.26200.6584. The MCT, on the other hand...

* Patch maximum version boundary

Apparently they fixed that in November. Expanding the amd64_winappsdk-cbs-stable component manifest to a XML file reveals the dark secret:

  <registryKeys>
    <registryKey keyName="HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Appx\AppxAllUserStore\InboxApplications\Microsoft.WindowsAppRuntime.CBS.1.6_6000.653.2246.100_x64__8wekyb3d8bbwe">
      <registryValue name="Path" valueType="REG_SZ" value="$(runtime.windows)\SystemApps\Microsoft.WindowsAppRuntime.CBS_8wekyb3d8bbwe\AppxManifest.xml" />
      <securityDescriptor name="REGKEY_APPXALLUSERSTORE_SDDL" />
    </registryKey>
    <registryKey keyName="HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Appx\AppxAllUserStore\Config\Microsoft.WindowsAppRuntime.CBS.1.6_8wekyb3d8bbwe">
      <registryValue name="SetupPhase" valueType="REG_DWORD" value="0x00000427" />
    </registryKey>
    <registryKey keyName="HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Appx\AppxAllUserStore\UpdatedApplications\Microsoft.WindowsAppRuntime.CBS.1.6_8wekyb3d8bbwe" />
  </registryKeys>

This is not a problem in .6899 because we don't have amd64_winappsdk-cbs-stable, but a vnext counterpart. But, at this point, why bother checking with that? MCT will not bundle this update with the image!

* Default to showing file extensions

Apart from a security improvement (let's remember ILOVEYOU from 2000), it's also a QoL.

* Fix key for color modes

Color mode settings are saved per-user, not system-wide. So HKLM\SOFTWARE is not our solution. HKCU is, and is mapped to \Users\Default\NTUSER.DAT

* Move color mode from offline servicing to firstrun

* Drop build number by 100

* Update Invoke-Microwin.ps1 (#15)

* Revert "Update Invoke-Microwin.ps1 (#15)"

This reverts commit 88f8a3031b.

* Keep trying to commit and unmount images

* Consistent REG ADD /F /V...

Some issues happen with REG and strings if you put /f at the end... move it to the beginning, where it doesn't conflict with anything.

* Rework stub path reg value set

This works on both Windows 11 and Windows 10. It didn't work on Win10 before; it should work now

* Remove copy link step

We no longer do this

* Move Copy-Files to microwin folder

Only microwin calls this function; it's better if we place this script in that folder

* Add Create Bootable USB (#18)

* Add Create Bootable USB

* Apply suggestion from @CodingWonders

---------

Co-authored-by: CodingWonders <101426328+CodingWonders@users.noreply.github.com>

* Download ADK to get oscdimg if not to download on GitHub

If we don't download OSCDIMG from GitHub, because we now use ADK kits roots detection to get installed copies of the ADK and oscdimg, we just download the Deployment Tools. This is only 100 MB once fully installed, and removes the need to install Chocolatey.

One caveat is that, on 64-bit systems, the script will output "Could not find ADK" once. This is normal as it does checks on both regular SOFTWARE and WOW6432Node, and it's able to pick it on the latter. If it isn't found anywhere, that message will appear twice.

* Make indentation more consitent in bootable USB func.

* Initialize petoolspath variable

* Remove temporary adksetup on completion

* Fix whitespace

* Remove unnecessary comments and revamp admin check

* Revert "Add Create Bootable USB (#18)"

This reverts commit 64babfe986.

* Remove reporting tool creation

The reporting tool is now hosted on a separate repo. The script itself can be run anywhere, not just in microwin, so...

* Some formatting change here

* Remove copy to ventoy option

* Fix some more indents

* Add Description that ISO automatically removes Win11 Requirements

* Additional things

- WPBT done by defaults
- Skip Logon Animation
- Remove convert to ESD and Upgrade to Win11 as Win10 is no longer supported

* First attempt at OSCDIMG autodownload

* No more custom ScratchPaths!

Time to get rid of that mess and just use %TEMP%.

All of these minor changes were made on a Server 2K8R2 VM.

* Redetect ADK/OSCDIMG after autodownload

* Leave ADK reg query error to debug only

---------

Co-authored-by: Real-MullaC <callumjanes2007new+github@gmail.com>
2026-01-15 14:48:11 -06:00
ChrisTitusTech e9a6cd32d8 Deploying to main from @ ChrisTitusTech/winutil@b02c7f3eab 🚀 2026-01-15 15:38:18 +00:00
Chris Titus b02c7f3eab Merge branch 'main' of https://github.com/ChrisTitusTech/winutil 2026-01-14 17:27:19 -06:00
Chris Titus eb29dfced8 update menu 2026-01-14 17:27:17 -06:00
Chris Titus f9b01fdc81 Update README to remove contribution note
Removed note about contributing to documentation.
2026-01-14 17:22:27 -06:00
Chris Titus 61a80e270d Expand docs 2026-01-14 17:20:41 -06:00
a31c9cb235 Update-WPFTweaksRemoveCopilot (#3907)
* Update tweaks.json

* Update tweaks.json

* Update tweaks.json

* Update config/tweaks.json

Co-authored-by: Yuki <65764619+YukiNagat0@users.noreply.github.com>

* Remove comment on EOL trick for AppxPackages

Removed unnecessary comment about tricking Windows for package uninstallation.

* Fix escape characters in registry path

---------

Co-authored-by: Chris Titus <contact@christitus.com>
Co-authored-by: Yuki <65764619+YukiNagat0@users.noreply.github.com>
2026-01-14 17:01:09 -06:00
Gabi 2587a98848 Remove-WPFToggleTaskbarWidgets (#3906)
* Update tweaks.json

* Update tweaks.json
2026-01-14 16:24:28 -06:00
Gabi a5cf3a2ba7 Update-WPFTweaksWPBT (#3905)
* Update tweaks.json

* Update preset.json

* Update tweaks.json
2026-01-14 16:23:23 -06:00
GabiandChris Titus f59598cf07 Update-docs (#3889)
* Update _index.md

* Rename AH.md to Activity.md

* Update Activity.md

* Update Activity.md

* Update Activity.md

* Update ConsumerFeatures.md

* Update and rename DVR.md to GameDVR.md

* Update DeleteTempFiles.md

* Delete docs/content/dev/tweaks/Essential-Tweaks/DisableRecall.md

* Update _index.md

* Update _index.md

* Update DiskCleanup.md

* Update EdgeDebloat.md

* Update Activity.md

* Update EndTaskOnTaskbar.md

* Update ConsumerFeatures.md

* Update GameDVR.md

* Update and rename Hiber.md to Hibernation.md

* Delete docs/content/dev/tweaks/Essential-Tweaks/Home.md

* Update IPv46.md

* Update LaptopHibernation.md

* Update and rename Loc.md to Location.md

* Delete docs/content/dev/tweaks/Essential-Tweaks/Powershell7.md

* Update Powershell7Tele.md

* Update RestorePoint.md

* Update Services.md

* Update Storage.md

* Update Tele.md

* Rename Tele.md to Telemetry.md

* Delete docs/content/dev/tweaks/Essential-Tweaks/Wifi.md

* Update _index.md

* Update _index.md

* Update _index.md

* Update _index.md

* Update and rename RemoveUltPerf.md to RemoveProfile.md

* Delete docs/content/dev/tweaks/Performance-Plans/AddUltPerf.md

* Rename RemoveProfile.md to Profile.md

* Update _index.md

* Update _index.md

* Update _index.md

* Update BingSearch.md

* Update DarkMode.md

* Update DetailedBSoD.md

* Update HiddenFiles.md

* Update MouseAcceleration.md

* Update NumLock.md

* Update ShowExt.md

* Update SnapFlyout.md

* Update SnapSuggestion.md

* Update SnapWindow.md

* Update StickyKeys.md

* Update TaskView.md

* Update TaskbarAlignment.md

* Update TaskbarSearch.md

* Update TaskbarWidgets.md

* Update VerboseLogon.md

* Update _index.md

* Update _index.md

* Update _index.md

* Update BlockAdobeNet.md

* Update DeBloat.md

* Delete docs/content/dev/tweaks/z--Advanced-Tweaks---CAUTION/DebloatAdobe.md

* Update DisableBGapps.md

* Update DisableFSO.md

* Delete docs/content/dev/tweaks/z--Advanced-Tweaks---CAUTION/DisableLMS1.md

* Update DisableNotifications.md

* Update and rename Disableipsix.md to DisableIPv6.md

* Update Display.md

* Update OOSUbutton.md

* Delete docs/content/dev/tweaks/z--Advanced-Tweaks---CAUTION/RemoveCopilot.md

* Update and rename RemoveEdge.md to EdgeUninstall.md

* Update and rename RemoveHomeGallery.md to RemoveHome.md

* Create RemoveGallery.md

* Delete docs/content/dev/tweaks/z--Advanced-Tweaks---CAUTION/RemoveOnedrive.md

* Update RightClickMenu.md

* Update Teredo.md

* Update UTC.md

* Update Undoall.md

* Update button.md

* Delete docs/content/dev/tweaks/z--Advanced-Tweaks---CAUTION/changedns.md

* Delete docs/content/dev/tweaks/z--Advanced-Tweaks---CAUTION/button.md

* Delete docs/content/dev/tweaks/z--Advanced-Tweaks---CAUTION/Undoall.md

* Update _index.md

* Update _index.md

* Update _index.md

* Update _index.md

* Update DisableLegacyRecovery.md

* Delete docs/content/dev/features/Features/DisableSearchSuggestions.md

* Update EnableLegacyRecovery.md

* Update DisableLegacyRecovery.md

* Delete docs/content/dev/features/Features/EnableSearchSuggestions.md

* Delete docs/content/dev/features/Features/Install.md

* Update RegBackup.md

* Update Sandbox.md

* Update dotnet.md

* Update hyperv.md

* Update legacymedia.md

* Update nfs.md

* Update wsl.md

* Update _index.md

* Update _index.md

* Update _index.md

* Update Autologin.md

* Update and rename DISM.md to CorruptionScan.md

* Update Network.md

* Update RunAdobeCCCleanerTool.md

* Update Update.md

* Update Winget.md

* Update _index.md

* Update _index.md

* Update _index.md

* Update control.md

* Update network.md

* Update power.md

* Update printer.md

* Update region.md

* Update sound.md

* Update system.md

* Update user.md

* Update _index.md

* Update _index.md

* Update _index.md

* Delete docs/assets/images/Compile.png

* Add files via upload

* Update KnownIssues.md

* Update _index.md

* Update _index.md

* Update _index.md

* Update _index.md

* Update _index.md

* Update _index.md

* Update _index.md

* Delete docs/archetypes directory

* Delete docs/i18n directory

* Delete docs/assets/images/Install/Installation-completion.png

* Delete docs/assets/images/Install/track-progress.png

* Delete docs/assets/images/microwin/dism++_drivercontrol.png

* Delete docs/assets/images/microwin/dism++_driverexport.png

* Delete docs/assets/images/microwin/dt_activeinst.png

* Delete docs/assets/images/microwin/dt_exportdrvs.png

* Delete docs/assets/images/microwin/dt_exporttarget.png

* Rename microwin-customuser-dark.png to microwin-user-dark.png

* Rename microwin-customuser-light.png to microwin-user-light.png

* Delete docs/assets/images/microwin/microwin-downloader-dark.png

* Delete docs/assets/images/microwin/microwin-downloader-light.png

* Delete docs/assets/images/microwin/microwin-screen-dark.png

* Delete docs/assets/images/microwin/microwin-screen-full-dark.png

* Delete docs/assets/images/microwin/microwin-screen-full-light.png

* Delete docs/assets/images/microwin/microwin-screen-light.png

* Delete docs/assets/images/microwin/microwin-skuselect-dark.png

* Delete docs/assets/images/microwin/microwin-skuselect-light.png

* Delete docs/assets/images/microwin/microwin-user-dark.png

* Delete docs/assets/images/microwin/microwin-user-light.png

* Delete docs/assets/images/microwin/rapr_folderpicker.png

* Delete docs/assets/images/microwin/rapr_menu.png

* Create 4

* Add files via upload

* Delete docs/assets/images/microwin/4

* Delete docs/assets/images/microwin/Configure-Windows-ISO.png

* Add files via upload

* Delete docs/assets/images/microwin/Configure-Windows-ISO.png

* Add files via upload

* Create default.md

* Fix formatting in automation user guide

* Fix typo in Edge uninstall link text

* Fix typo in DeBloat.md description

Corrected a typo in the description of the WPFTweaksDeBloat section.

* Update links for Delete Temp Files and Activity History

* fix bad urls

* update typos

---------

Co-authored-by: Chris Titus <contact@christitus.com>
2026-01-14 12:28:45 -06:00
ozgur 66eaaaf9bf Fixes to Get installed tweaks does not handle <RemoveEntry> value (#3892) 2026-01-14 11:36:45 -06:00
dependabot[bot] 1b19311c2e Bump actions/upload-pages-artifact from 3 to 4 (#3902)
Bumps [actions/upload-pages-artifact](https://github.com/actions/upload-pages-artifact) from 3 to 4.
- [Release notes](https://github.com/actions/upload-pages-artifact/releases)
- [Commits](https://github.com/actions/upload-pages-artifact/compare/v3...v4)

---
updated-dependencies:
- dependency-name: actions/upload-pages-artifact
  dependency-version: '4'
  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-01-14 11:34:22 -06:00
dependabot[bot] e193eca64d Bump actions/checkout from 4 to 6 (#3901)
Bumps [actions/checkout](https://github.com/actions/checkout) from 4 to 6.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v4...v6)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: '6'
  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-01-14 11:33:54 -06:00
dependabot[bot] df0b511a24 Bump actions/cache from 4 to 5 (#3900)
Bumps [actions/cache](https://github.com/actions/cache) from 4 to 5.
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](https://github.com/actions/cache/compare/v4...v5)

---
updated-dependencies:
- dependency-name: actions/cache
  dependency-version: '5'
  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-01-14 11:33:24 -06:00
HapnanAR a017854a55 Update SyncTrayzor entry in applications.json with new GitHub link and winget package id (#3893) 2026-01-10 12:24:40 -06:00
HapnanAR 85f652ad6f Update Thorium entry in for Chocolatey package (#3891) 2026-01-09 11:40:30 -06:00
Gabi 38cec9bf3f Update windev.ps1 (#3886) 2026-01-09 11:31:42 -06:00
Chris Titus Tech a20719b65b update PR template 2026-01-08 09:08:28 -06:00
Chris Titus Tech 148360305c Fix whitespace and compile formatting 2026-01-08 09:01:34 -06:00
Gabi 644fa3975a Update applications.json (#3885) 2026-01-08 14:57:39 -06:00
Gabi 2e4124b903 Update-WPFTweaksServices (#3880)
* Fix some OriginalType'a in WPFTweaksServices

* Update tweaks.json
2026-01-08 14:56:58 -06:00
Gabi fac0d359f1 Update-WPFTweaksTele (#3878)
* Update tweaks.json

* Update tweaks.json
2026-01-08 14:54:51 -06:00
Gabi fe28e4064f Update-tweaks-order (#3852)
* Update tweaks.json

* Update tweaks.json

* Update tweaks.json

* Update tweaks.json

* Update tweaks.json

* Update tweaks.json

* Update tweaks.json

* Update tweaks.json

* Update tweaks.json
2026-01-08 14:38:33 -06:00
GabiandCopilot 1734241568 Update-Install-WinUtilChoco.ps1 (#3846)
* Update Install-WinUtilChoco.ps1

* Update Install-WinUtilChoco.ps1

* Update Install-WinUtilChoco.ps1

* Update functions/private/Install-WinUtilChoco.ps1

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-01-08 14:37:37 -06:00
Gabi e008f63674 Update Invoke-WinUtilUninstallPSProfile.ps1 (#3845)
* Update Invoke-WinUtilUninstallPSProfile.ps1

* Update Invoke-WinUtilUninstallPSProfile.ps1

* Update Invoke-WinUtilUninstallPSProfile.ps1

* Update Invoke-WinUtilUninstallPSProfile.ps1
2026-01-08 14:34:29 -06:00
Gabi 3af367ca28 Update Invoke-WinUtilInstallPSProfile.ps1 (#3844)
* Update Invoke-WinUtilInstallPSProfile.ps1

* Update Invoke-WinUtilInstallPSProfile.ps1
2026-01-08 14:33:35 -06:00
Gabi ea8e178964 Update-windev.ps1 (#3843)
* Update windev.ps1

* Update windev.ps1

* Update windev.ps1

* Update windev.ps1

* Update windev.ps1

* Update windev.ps1
2026-01-08 14:20:38 -06:00
Gabi 79ee9db8fe Update-Updates-Tab (#3833)
* Update Invoke-WPFUpdatessecurity.ps1

* Update Invoke-WPFUpdatesdisable.ps1

* Update Invoke-WPFUpdatesdefault.ps1

* Update Invoke-WPFUpdatesdefault.ps1

* Update Invoke-WPFUpdatesdisable.ps1

* Update Invoke-WPFUpdatesdisable.ps1

* Update Invoke-WPFUpdatessecurity.ps1

* Update Invoke-WPFUpdatessecurity.ps1

* Update Invoke-WPFUpdatesdefault.ps1

* Update Invoke-WPFUpdatesdisable.ps1

* Update Invoke-WPFUpdatessecurity.ps1

* Update Invoke-WPFUpdatesdisable.ps1

* Update Invoke-WPFUpdatesdisable.ps1

* Update Invoke-WPFUpdatesdisable.ps1

* Update Invoke-WPFUpdatesdefault.ps1

* Update Invoke-WPFUpdatesdisable.ps1

* Update Invoke-WPFUpdatesdefault.ps1

* Update Invoke-WPFUpdatesdisable.ps1

* Update Invoke-WPFUpdatesdefault.ps1

* Update Invoke-WPFUpdatesdisable.ps1

* Update Invoke-WPFUpdatesdefault.ps1

* Update Invoke-WPFUpdatesdisable.ps1

* Update Invoke-WPFUpdatesdisable.ps1

* Update Invoke-WPFUpdatesdefault.ps1

* Update Invoke-WPFUpdatesdefault.ps1

* Update Invoke-WPFUpdatessecurity.ps1

* Update Invoke-WPFUpdatessecurity.ps1

* Update Invoke-WPFUpdatesdisable.ps1

* Update Invoke-WPFUpdatesdefault.ps1

* Update Invoke-WPFUpdatesdefault.ps1

* Update Invoke-WPFUpdatesdefault.ps1
2026-01-08 13:04:36 -06:00
Gabi 3c87c3bc53 Update-WPFFeatureEnableLegacyRecovery (#3829)
* Update feature.json

* Update feature.json
2026-01-08 12:34:09 -06:00
Gabi eec16bdce5 Update-Remove-WinUtilAPPX.ps1 (#3822)
* Update Remove-WinUtilAPPX.ps1

* Modify Remove-WinUtilAPPX.ps1 to adjust package removal

Removed '-AllUsers' parameter from Remove-AppxProvisionedPackage call.

* Update Remove-WinUtilAPPX.ps1

* Fix formatting in Remove-WinUtilAPPX.ps1

* Update Remove-WinUtilAPPX.ps1
2026-01-08 12:29:55 -06:00
Chris Titus 1b99f13e5c fix paths issue 2026-01-07 17:14:06 -06:00
Chris Titus a9968e2247 clean docs 2026-01-07 17:09:44 -06:00
Chris Titus 2f11d9b1c2 fix hugo winutil docs site 2026-01-07 17:05:31 -06:00
Gabi 140280ddaa Update tweaks.json (#3879) 2026-01-07 15:39:13 -06:00
Gabi fde215f42d Update WPFTweaksDisableIPv6 (#3854) 2026-01-07 15:30:15 -06:00
Gabi 690c54888e Update tweaks.json (#3850) 2026-01-07 15:26:48 -06:00
Gabi c3216c6800 Update tweaks.json (#3849) 2026-01-07 15:26:17 -06:00
Gabi da989051db Update feature.json (#3840) 2026-01-07 15:06:18 -06:00
GabiandGabi 52a97dae09 Delete Test-WingetInstall.ps1 (#3838)
Co-authored-by: Gabi <218829269+Gabynun@users.noreply.github.com>
2026-01-07 15:05:41 -06:00
GabiandGabynun cd3fc2b698 Update-WPFFeatureshyperv (#3834)
* Update WPFFeatureshyperv

* Update feature.json

---------

Co-authored-by: Gabynun <218829269+Gabynun@users.noreply.github.com>
2026-01-07 14:58:12 -06:00
account183892 927fe24415 Update applications.json (#3832) 2026-01-07 14:50:14 -06:00
Chris Titus 188f37a447 Merge branch 'main' of https://github.com/ChrisTitusTech/winutil 2026-01-07 14:17:12 -06:00
Chris Titus 1082a93813 add type existence check for explorer refresh 2026-01-07 14:17:08 -06:00
Gabi 9a91da12d4 Delete-WPFTweaksPowershell7 (#3825)
* Delete WPFTweaksPowershell7 from tweaks.json

Removed WPFTweaksPowershell7 configuration for Windows Terminal.

* Delete functions/public/Invoke-WPFTweakPS7.ps1
2026-01-07 14:07:13 -06:00
Gabi 075572d415 Remove link from Razer block tweaks (#3824) 2026-01-07 14:06:32 -06:00
Chris Titus da07c2040b whitespace fixes 2026-01-07 14:02:54 -06:00
Gabi 172d107e56 Rename-WPFTweaksTele (#3821)
* Rename WPFTweaksTele to WPFTweaksTelemetry

* Update tweaks.json

* Modify WPFTweaksTelemetry description

Updated the description for WPFTweaksTelemetry.
2026-01-07 14:00:20 -06:00
Gabi fae64c0406 Update tweaks.json (#3820) 2026-01-07 13:59:32 -06:00
Gabi cfe20ccb0a Clarify WPFTweaksDeBloat description (#3816)
Updated the warning message for WPFTweaksDeBloat to clarify the impact on Microsoft Store apps.
2026-01-07 13:57:35 -06:00
Gabi 158fabd31e Bring-Back-#3710 (#3809)
* Update WPFTweaksRestorePoint

* Update tweaks.json

* Fix PowerShell script syntax in tweaks.json

* Update tweaks.json
2026-01-07 13:56:49 -06:00
Real-MullaC 69d8649986 Move docs over. (#3760)
* Docs

* Update docs.yaml

* Delete docs/LICENCE

* Delete docs/README.md

* Update module path in go.mod
2026-01-07 13:55:35 -06:00
Chris Titus Tech 63eeab0b19 fix whitespace 2026-01-05 10:18:24 -06:00
1b78cd1316 Update-Install-WinUtilWinget.ps1 and remove upgrading winget (#3839)
* Update Install-WinUtilWinget.ps1

* Update Install-WinUtilWinget.ps1

* Update Install-WinUtilWinget.ps1

* Update Install-WinUtilWinget.ps1

* Update Install-WinUtilWinget.ps1

* Update Install-WinUtilWinget.ps1

* Update Install-WinUtilWinget.ps1

* Update Test-WinUtilPackageManager.ps1

* Update Install-WinUtilWinget.ps1

* Update Install-WinUtilWinget.ps1

* Update Install-WinUtilWinget.ps1

* Change error action to SilentlyContinue for commands

* Fix indentation in Test-WinUtilPackageManager.ps1

---------

Co-authored-by: Gabi <218829269+Gabynun@users.noreply.github.com>
Co-authored-by: Chris Titus <contact@christitus.com>
2026-01-05 16:16:19 -06:00
Chris Titus a1907f5dee Use Install-WinUtilWinget function instead of choco 2026-01-05 16:09:02 -06:00
Gabi be415051ca Update tweaks.json (#3860) 2026-01-05 14:42:52 -06:00
ChrisTitusTech 80c15557d4 Deploying to main from @ ChrisTitusTech/winutil@a587bc60c4 🚀 2026-01-01 15:34:31 +00:00
ChrisTitusTech a587bc60c4 Deploying to main from @ ChrisTitusTech/winutil@c71fad54dc 🚀 2025-12-23 15:35:38 +00:00
Gabi c71fad54dc Change formating in WPFTweaksRemoveCopilot (#3808) 2025-12-15 10:17:47 -06:00
Gabi 4eb76a9099 Cleanup-WPFTweaksServices (#3806)
* Remove unneccary services from WPFTweaksServices

* Update tweaks.json
2025-12-15 10:16:59 -06:00
Gabi 95d8660b3a Update WPFToggleStartMenuRecommendations (#3805) 2025-12-15 10:16:19 -06:00
ChrisTitusTech 4bd25e62e1 Deploying to main from @ ChrisTitusTech/winutil@da6b105573 🚀 2025-12-15 15:37:23 +00:00
Gabi da6b105573 Remove Services from WPFTweaksServices (#3732) 2025-12-12 09:00:51 -06:00
Gabi 64022cc08d Remove unneccary ScheduledTasks from WPFTweaksTele (#3764) 2025-12-12 09:00:02 -06:00
Gabi 401f7f384a Remove-WPFTweaksWifi (#3765)
* Remove WPFTweaksWifi From Standart preset

* Remove WPFTweaksWifi
2025-12-12 08:59:29 -06:00
Gabi e2efb3a483 Update WPFTweaksRemoveCopilot (#3768) 2025-12-12 08:58:59 -06:00
GabiandChris Titus 4dc0fd6a6e Delete-WPFTweaksRecallOff (#3769)
Co-authored-by: Chris Titus <dfm.titus@gmail.com>
2025-12-12 08:58:01 -06:00
Gabi f671ad4518 Update-WPFTweaksRazerBlock (#3770)
* Update WPFTweaksRazerBlock's InvokeScript

* Format fix for WPFTweaksRazerBlock

* Update WPFTweaksRazerBlock

* Update WPFTweaksRazerBlock

* Update WPFTweaksRazerBlock

* Better format for WPFTweaksRazerBlock's InvokeScript

* Better format for WPFTweaksRazerBlock's InvokeScript

* Fomat fix on WPFTweaksRazerBlock
2025-12-12 08:55:27 -06:00
Gabi c2cb00fc68 Remove-WPFTweaksDebloatAdobe (#3771)
* Remove WPFTweaksDebloatAdobe

* Delete functions/public/Invoke-WPFRunAdobeCCCleanerTool.ps1

* Update feature.json

* Update feature.json

* Create Invoke-WPFRunAdobeCCCleanerTool.ps1
2025-12-12 08:48:43 -06:00
Gabi 7503444e2b Rename-WPFTweaksLoc (#3773)
* Rename WPFTweaksLoc

* Rename WPFTweaksLoc
2025-12-12 08:47:35 -06:00
Gabi 80ab6ba005 Description update for WPFTweaksConsumerFeatures (#3774) 2025-12-12 08:47:15 -06:00
Gabi 2e0073af75 Update-WPFTweaksTele (#3775)
* Update WPFTweaksTele's InvokeScript

* Update WPFTweaksTele's InvokeScript
2025-12-12 08:46:54 -06:00
GabiandChris Titus 3cb0a4b664 Deleted WPFTweaksDisableLMS1 (#3776)
Co-authored-by: Chris Titus <dfm.titus@gmail.com>
2025-12-11 14:33:01 -06:00
Gabi e9b40ae710 Description Update for WPFTweaksDisableEdge (#3778) 2025-12-11 14:25:32 -06:00
Gabi 408327daec Delete-WPFTweaksStorage (#3779)
* Remove WPFTweaksStorage from Standart Preset

* Remove WPFTweaksStorage

* move to advanced tweaks
2025-12-11 14:22:49 -06:00
Gabi 7f7424406f Rename WPFTweaksDisableWpbtExecution (#3780) 2025-12-11 14:18:04 -06:00
Gabi ccc44414a2 Rename WPFTweaksDisableipsix (#3782) 2025-12-11 14:09:26 -06:00
Gabi 06ea48dd01 Delete-WPFTweaksRemoveOnedrive (#3785)
* Update tweaks.json

* Update-WPFTweaksRemoveOnedrive

* Update-WPFTweaksRemoveOnedrive

* Update tweaks.json

* Update tweaks.json

* Update tweaks.json

* Delete WPFTweaksRemoveOnedrive
2025-12-11 14:03:54 -06:00
Gabi 5a6b1ef086 Update-WPFTweaksLaptopHibernation (#3786)
* Update WPFTweaksLaptopHibernation's InvokeScript

* Update WPFTweaksLaptopHibernation's Script
2025-12-11 14:01:16 -06:00
Gabi aba3d786bc Update applications.json (#3791) 2025-12-11 13:58:41 -06:00
Gabi 7765c1032b Add-WPFTweaksMakeEdgeUninstallable (#3792)
* Add WPFTweaksMakeEdgeUninstallable

* Update tweaks.json

* Update tweaks.json

* Update tweaks.json

* Update tweaks.json

* Update tweaks.json

* formating fix
2025-12-11 13:55:34 -06:00
Gabi 015f1b0709 Replace-System.IO.Directory (#3794)
* Update main.ps1

* Update start.ps1

* Update main.ps1

* Update main.ps1
2025-12-11 13:34:03 -06:00
Gabi 19b6f8abfa Remove-Reg.exe (#3798)
* Update WPFTweaksRemoveHome to use powershell

* Fix WPFTweaksRemoveGallery format

* Format fix for WPFTweaksRemoveHome

* Update tweaks.json

* fix my f up

* Update tweaks.json to use registry modifications

Replaced InvokeScript and UndoScript with registry modifications for removing Home from Explorer and setting This PC as default.

* fix missing comma from twitch chat
2025-12-11 13:13:16 -06:00
ChrisTitusTech 80e872aa60 Deploying to main from @ ChrisTitusTech/winutil@cfaf139a6a 🚀 2025-12-02 15:36:46 +00:00
CodingWondersandChris Titus cfaf139a6a [Tweaks] Conditionally determine when to use sc and Set-Service (#3761)
* [Tweaks] Conditionally determine when to use sc and Set-Service

* Clean up comments in Set-WinUtilService.ps1

Removed comments explaining the handling of auto delayed start for PWSH 5.

---------

Co-authored-by: Chris Titus <contact@christitus.com>
2025-12-01 14:29:27 -06:00
Chris Titus Tech becfba603d clean up spacing 2025-12-01 07:49:40 -06:00
makhlwf 2b68976e7b feat(accessibility): add accessibility labels to tweaks ui (#3731) 2025-12-01 13:45:58 -06:00
Gabi 5369d9d99b Add Create Issue (#3729) 2025-12-01 13:41:59 -06:00
Gabi 8b3e1280df Update-WPFTweaksDeBloat (#3709)
* Update tweaks.json

* Update tweaks.json

* Update tweaks.json

* Update tweaks.json

* Update tweaks.json

* Added comments to InvokeScript of WPFTweaksDeBloat

* Update tweaks.json

* Update tweaks.json
2025-12-01 13:41:28 -06:00
Alvaro Parker ce77be324b Add zed to applications (#3734) 2025-12-01 13:31:44 -06:00
Soumyadip Nayak 6168e93d4c Remove deprecated CryptoWalletEnabled policy from Edge debloat tweaks (#3737) 2025-12-01 13:29:59 -06:00
Younes Aassila d98118e322 Fix #3736 (#3748) 2025-12-01 13:26:21 -06:00
dependabot[bot] f69f107d9d Bump actions/checkout from 5 to 6 (#3745)
Bumps [actions/checkout](https://github.com/actions/checkout) from 5 to 6.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v5...v6)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: '6'
  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>
2025-12-01 13:20:16 -06:00
Gabi f3c3613d26 OneDrive Removal Updated, read description (#3659)
* Update tweaks.json

* Update tweaks.json

* Update tweaks.json

* Remove Unneccary -ErrorAction in OneDrive-Removal

* Format fixes for WPFTweaksRemoveOnedrive
2025-12-01 13:18:08 -06:00
Chris Titus Tech b265675560 Removal of more winget user scope code 2025-11-17 07:37:29 -06:00
Chris Titus e0237642c8 commit for removal of user scope progs and user scope winget (#3727) 2025-11-17 13:10:44 -06:00
Gabi aedaa2f789 Update-WPFTweaksStorage (#3717)
* Update tweaks.json

* Syntax fix for WPFTweaksStorage

* Merge branch 'ChrisTitusTech:main' into Update-WPFTweaksStorage
2025-11-17 12:52:14 -06:00
Gabi 8c2f9075a0 Rename-WPFTweaksAH (#3715)
* Update tweaks.json

* Update preset.json

* Merge branch 'ChrisTitusTech:main' into Rename-WPFTweaksAH
2025-11-17 12:51:29 -06:00
Chris Titus Tech c9e6861ad4 final fix for tweaks order 2025-11-17 06:50:06 -06:00
Chris Titus Tech 43ec73684e fix up ordering for tweaks 2025-11-17 06:46:54 -06:00
Gabi bfbb643543 Update-WPFTweaksEndTaskOnTaskbar (#3714)
* Update tweaks.json

* Syntax fix on WPFTweaksEndTaskOnTaskbar

* Merge branch 'ChrisTitusTech:main' into Update-WPFTweaksEndTaskOnTaskbar
2025-11-17 12:11:39 -06:00
Gabi 067ec31086 Update-WPFTweaksBlockAdobeNet (#3708)
* Update tweaks.json

* Fix

* Final Fix

* Added comments to WPFTweaksBlockAdobeNet

* Syntax change for WPFTweaksBlockAdobeNet

* Removed double \ from WPFTweaksBlockAdobeNet

* Added back double \ for WPFTweaksBlockAdobeNet

* Syntax fix for WPFTweaksBlockAdobeNet

* Syntax fix for WPFTweaksBlockAdobeNet again

* Fix for WPFTweaksBlockAdobeNet

* Merge branch 'ChrisTitusTech:main' into Update-WPFTweaksBlockAdobeNet
2025-11-17 12:07:23 -06:00
Gabi 63221a7cb9 Remove-WPFFeatureSearchSuggestions (#3706)
* Update feature.json

* Merge branch 'ChrisTitusTech:main' into Remove-WPFFeatureSearchSuggestions
2025-11-17 12:04:31 -06:00
Gabi 7e40d379d8 Update-WPFTweaksDeleteTempFiles (#3705)
* Update tweaks.json

* Add -Path for better syntax

* Fix

* Merge branch 'ChrisTitusTech:main' into Update-WPFTweaksDeleteTempFiles
2025-11-17 12:00:21 -06:00
Myles Markevich c766c974cf Fix typo in oscdimg.exe message box text (#3701) 2025-11-17 11:55:42 -06:00
Gabi 7d2804c706 Remove WPFTweaksHome (#3687)
* Remove WPFTweaksHome from tweaks.jsom

* Remove WPFTweaksHome from preset.json

* Merge branch 'ChrisTitusTech:main' into Remove-WPFTweaksHome

* Merge branch 'ChrisTitusTech:main' into Remove-WPFTweaksHome
2025-11-17 11:54:58 -06:00
Gabi 2ee9047dd6 Duplicates and Typos (#3660)
* Rename m to M

* Update tweaks.json

* Update tweaks.json

* Update tweaks.json

* Merge branch 'ChrisTitusTech:main' into Typo-Fix

* Merge branch 'ChrisTitusTech:main' into Typo-Fix

* Extra space

* From Tweaks to Toggle

* Merge branch 'ChrisTitusTech:main' into Typo-Fix
2025-11-17 11:48:07 -06:00
Ivan Lepekha 21c49d6a75 Fix explanation logic in 'WPFToggleSnapFlyout' (#3648) 2025-11-17 11:44:53 -06:00
Chris Titus Tech 351a77043e fix application errors from hyphens 2025-11-17 05:42:43 -06:00
Cube1berandCyberSphinx c8bb38f3a9 Added Proton Authenticator to applications.json (#3643)
* Added Proton Authenticator to applications.json

Proton Authenticator is a popular open source 2fa app from proton.

* Update name in applications.json

---------

Co-authored-by: CyberSphinx <202843220+CyberSphonx@users.noreply.github.com>
2025-11-17 11:33:49 -06:00
Ivan Lepekha 5fb5e43cc7 [Applications] Adding Ente Auth (#3635)
* Applications: Added Ente Auth

* Applications: Added Kando

* Revert "Applications: Added Kando"

This reverts commit 6a3e22f868.
2025-11-17 11:32:53 -06:00
Akhil Kumar Achanta eeb410e985 fix(tweaks): Correct operator for checking tweak type in Invoke-WinUtilTweaks (#3625)
The Invoke-WinUtilTweaks function was using the '-contains' operator on a string variable to check for toggle-type tweaks. This operator is intended for collections (arrays), not for substring matching within a string, leading to incorrect logic flow.

This caused an issue where selecting one tweak (e.g., WPFTweaksRightClickMenu) could erroneously trigger the action of another (e.g., WPFTweaksDisableCrossDeviceResume).

This commit replaces the incorrect '-contains' operator with the '-like' operator and appropriate wildcards ('*Toggle*'). This ensures that tweak types are identified correctly, resolving the bug and preventing unintended system modifications.
2025-11-17 11:29:56 -06:00
Akhil Kumar Achanta 8eaf6ddd9c feat: Add Beeper to Messaging applications (#3617)
* feat: Add Beeper to Messaging applications

This commit adds the Beeper desktop application to the list of installable packages in the "Messaging" category.

The entry has been added to `config/applications.json` with the official download URL and the correct silent installation arguments.

Fixes #3608

* Fix job failure: ensure excluded directory exists before processing

This commit updates the Invoke-Preprocessing function to prevent workflow failures caused by missing excluded directories.
Previously, the script would attempt to recursively list files in excluded paths, resulting in an error if a directory did not exist.
The updated logic checks if the excluded path refers to a directory (ends with a backslash) and creates it if necessary before proceeding. This avoids "Cannot find path" errors and ensures smoother preprocessing, especially for jobs that depend on directory existence for exclusion logic.
No changes are made for excluded files or wildcard patterns.
2025-11-17 11:24:28 -06:00
Brian 3c54e0ea3f Fix Multiplane Overlay toggle (#3632) 2025-11-17 11:19:12 -06:00
Gabi d17e8bcd98 Remove dns0.eu (#3682)
* Update dns.json

* Forgot one

* Forgot this
2025-11-17 11:18:31 -06:00
ChrisTitusTech ef1fc2ae59 Deploying to main from @ ChrisTitusTech/winutil@7d1fb52277 🚀 2025-11-17 15:35:22 +00:00
ChrisTitusTech 7d1fb52277 Deploying to main from @ ChrisTitusTech/winutil@95988fca80 🚀 2025-11-15 15:31:46 +00:00
ChrisTitusTech 95988fca80 Deploying to main from @ ChrisTitusTech/winutil@451040b5b1 🚀 2025-11-14 15:33:01 +00:00
ChrisTitusTech 451040b5b1 Deploying to main from @ ChrisTitusTech/winutil@47cb6b9273 🚀 2025-11-08 15:31:28 +00:00
ChrisTitusTech 47cb6b9273 Deploying to main from @ ChrisTitusTech/winutil@69233b1d8a 🚀 2025-11-01 15:30:51 +00:00
Gabi 69233b1d8a Update Disable Edge Tweak (#3649)
* Update tweaks.json

* Update tweaks.json

* Update tweaks.json

* Remove Disable edge invoke script

Removed scripts for disabling and enabling Microsoft Edge Update tasks.

* Update tweaks.json

* Update tweaks.json
2025-10-23 13:55:52 -05:00
ChrisTitusTech b621d9104e Deploying to main from @ ChrisTitusTech/winutil@1f81eec8f1 🚀 2025-10-20 15:33:21 +00:00
Viktor Szépe 1f81eec8f1 Fix typos (#3637) 2025-10-14 12:51:53 -05:00
Robyn C. Maehl 72cbdca556 Fix christitustech.github.io 404 links (#3629)
* Fix Contributing Link in Pull Request Template

* Update 404 to christitustech.github.io
2025-10-14 12:44:36 -05:00
CatBraaain d5127b14a3 fix(tweaks): remove duplicated (#3626) 2025-10-14 12:43:03 -05:00
Gabi e2c84d9834 Add Disable Edge Tweak (#3613)
* Update tweaks.json

* Update tweaks.json

* Update tweaks.json
2025-10-14 12:20:00 -05:00
ChrisTitusTech c454c93563 Deploying to main from @ ChrisTitusTech/winutil@70b1274425 🚀 2025-10-14 15:33:52 +00:00
ChrisTitusTech 70b1274425 Deploying to main from @ ChrisTitusTech/winutil@3b26620627 🚀 2025-10-08 15:33:58 +00:00
Chris Titus Tech 3b26620627 fix missing file paths for unit test during prepossess 2025-10-06 10:05:36 -05:00
Chris Titus Tech eeee941eb3 fix formatting 2025-10-06 09:57:32 -05:00
Chris Titus Tech 242fa6f210 temp disable of offline for online users 2025-10-06 09:55:25 -05:00
Chris Titus Tech 634ef3266c add windows restore to config tab 2025-10-06 09:51:48 -05:00
ChrisTitusTech a87c301636 Deploying to main from @ ChrisTitusTech/winutil@674d1368bb 🚀 2025-10-01 15:33:36 +00:00
CodingWonders 674d1368bb [Offline] Fixed invalid command in PWSH 5 (#3604)
-TimeoutSeconds is not a parameter in Test-Connection for PWSH 5
2025-09-21 16:21:18 -05:00
Chris Titus Tech c7495059fd Offline Capabilities 2025-09-18 10:26:11 -05:00
Real-MullaC dff974144f Remove mentions of Windows 11 Edition and pull latest (#3598) 2025-09-16 14:25:29 -05:00
Akhil Kumar Achanta 7db0b8a857 Fix: retry password prompt on failure to prevent script halting (#3581)
* Fix: retry password prompt on failure to prevent script halting

* Update Invoke-WPFInstall.ps1

* format fix
2025-09-16 14:16:04 -05:00
Jared Cervantes af7030d536 [Fix] Correctly scales the rest of the utility when the user changes the font size (#3564) 2025-09-16 13:15:27 -05:00
dependabot[bot] 40b2894ed1 Bump actions/checkout from 4 to 5 (#3559)
Bumps [actions/checkout](https://github.com/actions/checkout) from 4 to 5.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v4...v5)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: '5'
  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>
2025-09-16 12:57:44 -05:00
LinuxFurry 92728e65fd Fixed invalid winget install name for the Session application, as it's been updated to Session.Session for some time now. (#3554) 2025-09-16 12:14:41 -05:00
CodingWondersandChris Titus a6daeccb8c [Applications] DISM utility changes, app description fixes (#3551)
* [Applications] DISM utility changes, app description fixes

- NTLite has been added to the list of apps to give the user some choice
- Both DISMTools and NTLite have been moved to a new section so they can be identified more easily by what they do, and because the former is not a tool made by either Microsoft or Sysinternals. The former now has its description pulled from WinGet (and summarized using Copilot)
- Em-dashes in some app descriptions have been replaced with semicolons to avoid question marks in tooltips

* Change category from 'DISM Utilities' to 'Microsoft Tools'

---------

Co-authored-by: Chris Titus <contact@christitus.com>
2025-09-16 12:08:47 -05:00
carshaw 4eee519e76 Fix winget ID for OpenRGB (#3545)
Change winget package ID from CalcProgrammer1.OpenRGB to OpenRGB.OpenRGB.

Fixes #3540
2025-09-16 12:04:36 -05:00
CodingWondersandReal-MullaC 54e367a13b [MicroWin] 25H2 preparation (#3543)
* [Enhance] Configure all apps view in start menu

To keep look consistent with older Win11

* [Enhance] Additional Start menu settings

* [MicroWin] Change Write-Host to Write-Debug on debug lines. (#13)

* Add a resolution to scripts being disabled (#14)

* [MicroWin] Change Write-Host to Write-Debug on debug lines.

* Add a resolution to scripts being disabled

* Add skip first logon anim option

* Unrelated: indentation fixes from compile script

* Some little touches to the first-run script

---------

Co-authored-by: Real-MullaC <callumjanes2007new+github@gmail.com>
2025-09-16 12:04:11 -05:00
Chris Titus e2e9089d6f fix xaml error 2025-09-05 10:04:12 -05:00
Chris Titus aa1b1d2c18 fix revert of disable update 2025-09-05 09:52:20 -05:00
414 changed files with 43917 additions and 13961 deletions
+7 -57
View File
@@ -1,59 +1,9 @@
# This is a comment.
# Each line is a file pattern followed by one or more owners.
# Chris rules EVERYTHING (including paths listed below)
* @ChrisTitusTech
# These owners will be the default owners for everything in
# the repo. Unless a later match takes precedence,
# @global-owner1 and @global-owner2 will be requested for
# review when someone opens a pull request.
* @ChrisTitusTech
# Seanh1917 (ANGRYxScotsmans) is the docs guy
docs/ @ChrisTitusTech @seanh1995
tools/devdocs-generator.* @ChrisTitusTech @seanh1995
# Order is important; the last matching pattern takes the most
# precedence. When someone opens a pull request that only
# modifies JS files, only @js-owner and not the global
# owner(s) will be requested for a review.
# *.js @js-owner #This is an inline comment.
# You can also use email addresses if you prefer. They'll be
# used to look up users just like we do for commit author
# emails.
# *.go docs@example.com
# Teams can be specified as code owners as well. Teams should
# be identified in the format @org/team-name. Teams must have
# explicit write access to the repository. In this example,
# the octocats team in the octo-org organization owns all .txt files.
# *.txt @octo-org/octocats
# In this example, @doctocat owns any files in the build/logs
# directory at the root of the repository and any of its
# subdirectories.
# /build/logs/ @doctocat
# The `docs/*` pattern will match files like
# `docs/getting-started.md` but not further nested files like
# `docs/build-app/troubleshooting.md`.
# docs/* docs@example.com
# In this example, @octocat owns any file in an apps directory
# anywhere in your repository.
# apps/ @octocat
# In this example, @doctocat owns any file in the `/docs`
# directory in the root of your repository and any of its
# subdirectories.
# /docs/ @doctocat
# In this example, any change inside the `/scripts` directory
# will require approval from @doctocat or @octocat.
# /scripts/ @doctocat @octocat
# In this example, @octocat owns any file in a `/logs` directory such as
# `/build/logs`, `/scripts/logs`, and `/deeply/nested/logs`. Any changes
# in a `/logs` directory will require approval from @octocat.
# **/logs @octocat
# In this example, @octocat owns any file in the `/apps`
# directory in the root of your repository except for the `/apps/github`
# subdirectory, as its owners are left empty.
# /apps/ @octocat
# /apps/github
# Title screen generation
tools/title-screen/ @ChrisTitusTech @mewclouds
+2 -2
View File
@@ -2,7 +2,7 @@
## Our Pledge
We as members, contributors, and leaders pledge to make participation in our
We, as members, contributors, and leaders, pledge to make participation in our
community a harassment-free experience for everyone, regardless of age, body
size, visible or invisible disability, ethnicity, sex characteristics, gender
identity and expression, level of experience, education, socio-economic status,
@@ -106,7 +106,7 @@ Violating these terms may lead to a permanent ban.
### 4. Permanent Ban
**Community Impact**: Demonstrating a pattern of violation of community
standards, including sustained inappropriate behavior, harassment of an
standards, including sustained inappropriate behavior, harassment of an
individual, or aggression toward or disparagement of classes of individuals.
**Consequence**: A permanent ban from any sort of public interaction within
+40 -39
View File
@@ -5,13 +5,13 @@
* Test the latest changes to WinUtil by running the pre-release and reporting issues you are encountering to help us continually improve WinUtil!
#### **Run the latest pre-release**
```ps1
irm https://christitus.com/windev | iex
```
!!! bug "Keep in mind"
```ps1
irm https://christitus.com/windev | iex
```
This is a pre-release and should be treated as such. It exists for developers to test the utility and report or fix bugs before they get added to the stable release. Don't use it in production!
> [!CAUTION]
> **Keep in mind:** This is a pre-release and should be treated as such. It exists for developers to test the utility and report or fix bugs before they get added to the stable release. Don't use it in production!
## Issues
@@ -21,19 +21,19 @@
* Pull requests are now handled directly on the **MAIN branch**. This was done since we can now select specific releases to launch via releases in GitHub.
* If you're doing code changes, then you can submit a PR to `main` branch, but I am very selective about these.
* If you're doing code changes, then you can submit a PR to the `main` branch.
!!! warning "Important"
Do not use a code formatter, make massive amounts of line changes, or make multiple feature changes. EACH FEATURE CHANGE SHOULD BE IT'S OWN PULL REQUEST!
> [!IMPORTANT]
> Do not use a code formatter, make massive amounts of line changes, or make multiple feature changes. EACH FEATURE CHANGE SHOULD BE ITS OWN PULL REQUEST!
>
> Do not open a pull request that adds support for other languages to WinUtil for now, until we decide how we want to move forward with language support.
* When creating pull requests, it is essential to thoroughly document all changes made. This includes, but is not limited to, documenting any additions made to the `tweaks` section and corresponding `undo tweak`, so users are able to remove the newly added tweaks if necessary, and comprehensive documentation is required for all code changes. Document your changes and briefly explain why you made your changes in your Pull Request Description. Failure to adhere to this format may result in the denial of the pull request. Additionally, any code lacking sufficient documentation may also be denied.
* By following these guidelines, we can maintain a high standard of quality and ensure that the codebase remains organized and well-documented.
!!! note
When creating a function, please include "WPF" or "WinUtil" in the file name so it can be loaded into the runspace.
> [!NOTE]
> When creating a function, please include "WPF" or "WinUtil" in the file name so it can be loaded into the runspace.
## Walk through
@@ -45,37 +45,34 @@
### Overview
``` mermaid
```mermaid
%%{init: {"flowchart": {"curve": "cardinal"}} }%%
graph TD
  A[Fork Project] --> B[Clone Repository];
  B --> C[Create New Branch];
  C --> D[Make Changes];
  D --> G[Test Changes];
  G --> H{Tests Passed?};
  H -->|Yes| E[Commit Changes];
  H -->|No| J[Fix Issues];
  J --> G;
  E --> F[Push Branch];
  F --> K[Create Pull Request];
  K --> L[Fill out PR template];
A[Fork Project] --> B[Clone Repository];
B --> C[Create New Branch];
C --> D[Make Changes];
D --> G[Test Changes];
G --> H{Tests Passed?};
H -->|Yes| E[Commit Changes];
H -->|No| J[Fix Issues];
J --> G;
E --> F[Push Branch];
F --> K[Create Pull Request];
K --> L[Fill out PR template];
classDef default stroke:#333,stroke-width:4px,font-size:12pt;
```
!!! info
This is a diagram to guide you through the process. It may vary depending on the type of change you're making.
> [!NOTE]
> This is a diagram to guide you through the process. It may vary depending on the type of change you're making.
### Fork the Repo
* Fork the WinUtil Repository [here](https://github.com/ChrisTitusTech/winutil) to create a copy that will be available in your repository list.
![Fork Image](assets/Fork-Button-Dark.png#only-dark#gh-dark-mode-only)
![Fork Image](assets/Fork-Button-Light.png#only-light#gh-light-mode-only)
![Fork Image](/docs/src/assets/contributing/Fork-Button-Dark.png)
### Clone the Fork
!!! tip
While you can make your changes directly through the Web, we recommend cloning the repo to your device using the application GitHub Desktop (available in WinUtil) to test your fork easily.
> [!TIP]
> While you can make your changes directly through the Web, we recommend cloning the repo to your device using the application GitHub Desktop (available in WinUtil) to test your fork easily.
* Install GitHub Desktop if it is not already installed.
* Log in using the same GitHub account you used to fork WinUtil.
@@ -87,31 +84,35 @@ graph TD
### Testing your changes
* To test to see if your changes work as intended run following commands in a powershell teminal as admin:
* To test to see if your changes work as intended, run the following commands in a PowerShell terminal as admin:
* Change the directory where you are running the commands to the forked project.
* `cd {path to the folder with the compile.ps1}`
* Run the following command to compile and run WinUtil:
* `.\Compile.ps1 -run`
![Compile](assets/Compile.png)
![Compile](/docs/src/assets/contributing/Compile.png)
Open PowerShell as Administrator.
* After seeing that your changes work properly, feel free to commit the changes to the repository and make a PR. For help on that, follow the documentation below.
### Committing the changes
* Before committing your changes, please discard changes made to the `winutil.ps1` file, like the following:
![Push Commit Image](assets/Discard-GHD.png)
![Push Commit Image](/docs/src/assets/contributing/Discard-GHD.png)
* Now, commit your changes once you are happy with the result.
![Commit Image](assets/Commit-GHD.png)
![Commit Image](/docs/src/assets/contributing/Commit-GHD.png)
* Push the changes to upload them to your fork on github.com.
* Push the changes to upload them to your fork on GitHub.
![Push Commit Image](assets/Push-Commit.png)
![Push Commit Image](/docs/src/assets/contributing/Push-Commit.png)
### Making a PR
* To make a PR on your repo under a new branch linking to the main branch, a button will show and say Preview and Create pull request. Click that button and fill in all the information that is provided on the template. Once all the information is filled in correctly, check your PR to make sure there is not a WinUtil.ps1 file attached to the PR. Once everything is good, make the PR and wait for Chris (the maintainer) to accept or deny your PR. Once it is accepted by Chris, you will be able to see your changes in the "/windev" build.
* To make a PR on your repo under a new branch linking to the main branch, a button will show and say Preview and Create pull request. Click that button and fill in all the information that is provided on the template. Once all the information is filled in correctly, check your PR to make sure there is no WinUtil.ps1 file attached to the PR. Once everything is good, make the PR and wait for Chris (the maintainer) to accept or deny your PR. Once it is accepted by Chris, you will be able to see your changes in the "/windev" build.
* If you do not see your feature in the main "/win" build, that is fine. All new changes go into the /windev build to make sure everything is working OK before going fully public.
* Congratulations! You just submitted your first PR. Thank you so much for contributing to WinUtil.
@@ -0,0 +1,28 @@
title: "[App Suggestion] "
body:
- type: input
attributes:
label: "Application Link"
description: "Provide a link where this application can downloaded officially"
- type: checkboxes
attributes:
label: "Rules Checklist"
description: "You should agree with next rules"
options:
- label: "This application is popular enough, so is not considered as niche"
required: true
- label: "This application is not considered bloatware"
required: true
- label: "This application is free to access"
required: true
- label: "This application should be included on majority of fresh installed systems"
required: true
- label: "This application is present on WinGet (check winstall.app or do 'winget search your-app' in terminal)"
required: true
- type: checkboxes
attributes:
label: "Check for denied applications"
options:
- label: "Yes, I checked PRs, issues and discussions for existing suggestions and their result"
required: true
+32 -30
View File
@@ -1,62 +1,64 @@
name: "Bug report"
description: "Report a bug to help us identify and fix issues in the project."
title: "[Bug Report] - <your summary here>"
labels: ["bug"]
body:
- type: markdown
attributes:
value: |
# 🐞 **Issue Report**
Thank you for taking the time to report an issue! Please provide as much detail as possible to help us address the problem efficiently.
## ⚠️ **IMPORTANT**
- 🛠️ **Supported environments only:** We only support Windows 11. Custom ISOs that are not made using Microwin are not supported.
- 💡 For general questions, use the [Discussions section](https://github.com/Christitustech/winutil/discussions) or join our Community-driven [Discord Server](https://discord.gg/RUbZUZyByQ).
- Remember, we only support Windows 11. If you encounter problems on Windows 10, please consider upgrading to Windows 11.
- For general questions, join our Community-driven [Discord Server](https://discord.gg/RUbZUZyByQ).
- type: checkboxes
id: read_issues
attributes:
label: ⚙️ Issue Checklist
label: "I have read the known issues"
description: "You [better do](https://winutil.christitus.com/knownissues/), cause your issue can be already there"
options:
- label: I have read the guidelines.
- label: I checked for duplicate issues.
- label: I searched for existing discussions.
- label: I checked for an existing pull request that addresses this issue.
- label: Yes, I did
required: true
- type: input
id: winutil_version
attributes:
label: "Version of WinUtil"
description: "Provide a version that you are using when issue submitted (it can be found in right corner of app)"
validations:
required: true
- type: input
- type: dropdown
id: affected_part
attributes:
label: 📜 What part of Winutil are you having issues with?
placeholder: "e.g., Microwin, Tweaks, etc."
label: What part of WinUtil are you having issues with?
options:
- Program Install Tab
- Tweaks Tab
- Config Tab
- Updates Tab
- Win11 Creator Tab
validations:
required: true
required: false
- type: textarea
id: issue_description
attributes:
label: 📝 Provide a clear and concise description of the issue.
label: "Description of the issue"
description: Provide a clear and concise description of the issue.
validations:
required: true
- type: textarea
id: steps_to_reproduce
id: tweaks_applied
attributes:
label: 🔄 Steps to reproduce the issue.
placeholder: "e.g., Step 1: ..., Step 2: ..."
label: "List of Applied Tweaks"
description: List the tweaks you applied before the issue occurred.
validations:
required: true
required: false
- type: textarea
id: error_output
attributes:
label: ❌ Paste the full error output (if available).
placeholder: "Include any relevant logs or error messages."
- type: textarea
id: additional_context
attributes:
label: 🖼️ Additional context.
placeholder: "Include screenshots, code blocks (use triple backticks ```), or any other relevant information."
validations:
required: false
label: Paste the full error output (if available) or Screenshot or Video.
description: "If you're willing to share the whole log, please provide an external link to text-sharing service, i.e. Pastebin"
placeholder: "Include any relevant logs or error messages. Keep any sensitive info out of the presented log"
+4 -1
View File
@@ -2,4 +2,7 @@ blank_issues_enabled: false
contact_links:
- name: 💻 Community Discord
url: https://discord.gg/RUbZUZyByQ
about: Join our Community Discord server to chat with other users in the Winutil community.
about: Join our Community Discord server to chat with other users in the WinUtil community.
- name: Suggest an application
url: https://github.com/ChrisTitusTech/winutil/discussions/new?category=app-suggestion
about: If you want to suggest an application to be added, create a discussion with given template
+3 -37
View File
@@ -1,5 +1,6 @@
name: "Feature request"
description: "Suggest a new feature or improvement for the project."
title: "[Feature Request] - <your summary here>"
labels: ["enhancement"]
body:
@@ -11,47 +12,12 @@ body:
## ⚠️ **IMPORTANT**
- 🛠️ **Supported environments only:** We only support Windows 11.
- 💡 For general questions, use the [Discussions section](https://github.com/Christitustech/winutil/discussions) or join our Community-driven [Discord Server](https://discord.gg/RUbZUZyByQ).
- type: checkboxes
attributes:
label: ⚙️ Issue Checklist
options:
- label: I have read the guidelines.
- label: I checked for duplicate issues.
- label: I searched for existing discussions.
- label: I checked for an existing pull request that addresses this request.
validations:
required: true
- type: textarea
id: problem_statement
attributes:
label: ❓ Is your feature request related to a problem?
placeholder: "Provide a clear and concise description of the issue you're facing. Example: 'I'm always frustrated when [...]'"
validations:
required: false
- 💡 For general questions, use the [Discussions section](https://github.com/ChrisTitusTech/winutil/discussions) or join our Community-driven [Discord Server](https://discord.gg/RUbZUZyByQ).
- type: textarea
id: proposed_solution
attributes:
label: 💡 Describe the solution you'd like
placeholder: "Provide a clear and concise description of what you want to happen."
placeholder: "Provide a clear and concise description."
validations:
required: true
- type: textarea
id: alternatives
attributes:
label: 🔄 Describe alternatives you've considered
placeholder: "Provide details on any alternative solutions or features you've thought about."
validations:
required: false
- type: textarea
id: additional_context
attributes:
label: 🖼️ Additional context
placeholder: "Include screenshots, code blocks (use triple backticks ```), or any other relevant information."
validations:
required: false
+7 -22
View File
@@ -1,33 +1,18 @@
<!--Before you make this PR have you followed the docs here? - https://christitustech.github.io/winutil/contribute/ -->
<!--Before you make this PR have you followed the docs here? - https://winutil.christitus.com/contributing/ -->
<!--Documentation is auto-generated from configs - no manual documentation updates needed -->
## Type of Change
- [ ] New feature
- [ ] Bug fix
- [ ] Documentation update
- [ ] Refactoring
- [ ] Hotfix
- [ ] Security patch
- [ ] Refactor
- [ ] UI/UX improvement
<!-- This automatically adds labels to your PR based on the selections above. -->
## Description
<!--[Provide a detailed explanation of the changes you have made. Include the reasons behind these changes and any relevant context. Link any related issues.]-->
## Testing
<!--[Detail the testing you have performed to ensure that these changes function as intended. Include information about any added tests.]-->
## Impact
<!--[Discuss the impact of your changes on the project. This might include effects on performance, new dependencies, or changes in behaviour.]-->
<!--[What does this PR do? Provide Screenshots when possible.]-->
## Issue related to PR
<!--[What issue/discussion is related to this PR (if any)]-->
<!--[List any ISSUES this is related to as it AUTO-CLOSES Them!]-->
- Resolves #
## Additional Information
<!--[Any additional information that reviewers should be aware of.]-->
## Checklist
- [ ] My code adheres to the coding and style guidelines of the project.
- [ ] I have performed a self-review of my own code.
- [ ] I have commented my code, particularly in hard-to-understand areas.
- [ ] I have made corresponding changes to the documentation.
- [ ] My changes generate no errors/warnings/merge conflicts.
+105
View File
@@ -0,0 +1,105 @@
# Chris Titus Tech's Windows Utility
[![Version](https://img.shields.io/github/v/release/ChrisTitusTech/winutil?color=%230567ff&label=Latest%20Release&style=for-the-badge)](https://github.com/ChrisTitusTech/winutil/releases/latest)
![GitHub Downloads (specific asset, all releases)](https://img.shields.io/github/downloads/ChrisTitusTech/winutil/winutil.ps1?label=Total%20Downloads&style=for-the-badge)
[![](https://dcbadge.limes.pink/api/server/https://discord.gg/RUbZUZyByQ?theme=default-inverted&style=for-the-badge)](https://discord.gg/RUbZUZyByQ)
[![Static Badge](https://img.shields.io/badge/Documentation-_?style=for-the-badge&logo=bookstack&color=grey)](https://winutil.christitus.com/)
Questa utility è una raccolta di attività Windows che eseguo personalmente su ogni sistema che utilizzo. È progettata per snellire le *installazioni*, rimuovere i componenti superflui tramite *ottimizzazioni*, risolvere problemi tramite la *configurazione*, e riparare *aggiornamenti* di Windows. Sono estremamente selettivo riguardo ai contributi per mantenere questo progetto pulito ed efficiente.
![screen-install](/docs/src/assets/branding/title-screen.png)
## 💡 Come usarlo
Winutil deve essere eseguito con privilegi di amministratore, poiché apporta modifiche all'intero sistema. Per farlo, avvia PowerShell come amministratore. Ecco alcuni modi per procedere:
1. **Metodo del menu di Start:**
- Fai clic con il tasto destro sul menu Start.
- Scegli "Windows PowerShell (esegui come Amministratore)" (per Windows 10) o "Terminale (esegui come Amministratore)" (per Windows 11).
2. **Metodo tramite ricerca:**
- Premi il tasto Windows.
- Digita "PowerShell" o "Terminal" (per Windows 11).
- Premi `Ctrl + Shift + Invio` oppure fai clic con il tasto destro e seleziona "Esegui come amministratore" per avviarlo con privilegi elevati.
### Comando di avvio
#### Branch stabile (Consigliato)
```ps1
irm "https://christitus.com/win" | iex
```
#### Branch Sviluppatore
```ps1
irm "https://christitus.com/windev" | iex
```
### Automazione
Winutil supporta anche preset predefiniti che applicano automaticamente configurazioni comuni:
- `Standard`
- `Minimal`
- `Advanced`
Esempio:
```powershell
& ([ScriptBlock]::Create((irm "https://christitus.com/win"))) -Preset Standard
```
Per vedere esattamente cosa fa ogni preset, consulta:
https://github.com/ChrisTitusTech/winutil/blob/main/config/preset.json
In caso di problemi, consulta i [Problemi noti](https://winutil.christitus.com/knownissues/) o [Apri una segnalazione](https://github.com/ChrisTitusTech/winutil/issues)
## 🎓 Documentazione
### [Documentazione ufficiale di WinUtil](https://winutil.christitus.com/)
### [Tutorial su YouTube](https://www.youtube.com/watch?v=6UQZ5oQg8XA)
### [Articolo su ChrisTitus.com](https://christitus.com/windows-tool/)
## 🛠️ Build & Sviluppo
> [!NOTE]
> Winutil è uno script piuttosto esteso, per questo è suddiviso in più file che vengono combinati in un unico file `.ps1` tramite un compilatore personalizzato. Questo rende la manutenzione del progetto molto più semplice.
Ottieni una copia del codice sorgente. Puoi farlo tramite l'interfaccia di GitHub (**Code** > **Download ZIP**), oppure clonando (scaricando) la repo tramite git.
Se git è installato, esegui i seguenti comandi in una finestra PowerShell per clonare e accedere alla directory del progetto:
```ps1
git clone --depth 1 "https://github.com/ChrisTitusTech/winutil.git"
cd winutil
```
Per compilare il progetto, esegui lo script di compilazione in una finestra PowerShell (i permessi di amministratore NON sono richiesti):
```ps1
.\Compile.ps1
```
Troverai un nuovo file chiamato `winutil.ps1`, creato dallo script `Compile.ps1`. Ora puoi eseguirlo come amministratore e apparirà una nuova finestra. Goditi la tua versione compilata di WinUtil :)
> [!TIP]
> Per ulteriori informazioni sull'utilizzo di WinUtil e su come contribuire allo sviluppo, ti invitiamo a leggere le [Linee guida per i contributi](https://winutil.christitus.com/contributing/). Se non sai da dove iniziare o hai domande, puoi chiedere sul nostro [Server Discord della community](https://discord.gg/RUbZUZyByQ); i membri attivi del progetto risponderanno appena possibile.
## 💖 Supporto
- Per sostenere il progetto moralmente e mentalmente, non dimenticare di lasciare una ⭐️!
- Wrapper EXE a 10$ su https://www.cttstore.com/windows-toolbox
## 💖 Sponsor
Questi sono gli sponsor che aiutano a mantenere vivo il progetto con contributi mensili.
<!-- sponsors --><a href="https://github.com/dwelfusius"><img src="https:&#x2F;&#x2F;github.com&#x2F;dwelfusius.png" width="60px" alt="Avatar utente: " /></a><a href="https://github.com/mews-se"><img src="https:&#x2F;&#x2F;github.com&#x2F;mews-se.png" width="60px" alt="Avatar utente: Martin Stockzell" /></a><a href="https://github.com/jdiegmueller"><img src="https:&#x2F;&#x2F;github.com&#x2F;jdiegmueller.png" width="60px" alt="Avatar utente: Jason A. Diegmueller" /></a><a href="https://github.com/robertsandrock"><img src="https:&#x2F;&#x2F;github.com&#x2F;robertsandrock.png" width="60px" alt="Avatar utente: RMS" /></a><a href="https://github.com/paulsheets"><img src="https:&#x2F;&#x2F;github.com&#x2F;paulsheets.png" width="60px" alt="Avatar utente: Paul" /></a><a href="https://github.com/djones369"><img src="https:&#x2F;&#x2F;github.com&#x2F;djones369.png" width="60px" alt="Avatar utente: Dave J (WhamGeek)" /></a><a href="https://github.com/anthonymendez"><img src="https:&#x2F;&#x2F;github.com&#x2F;anthonymendez.png" width="60px" alt="Avatar utente: Anthony Mendez" /></a><a href="https://github.com/FatBastard0"><img src="https:&#x2F;&#x2F;github.com&#x2F;FatBastard0.png" width="60px" alt="Avatar utente: " /></a><a href="https://github.com/DursleyGuy"><img src="https:&#x2F;&#x2F;github.com&#x2F;DursleyGuy.png" width="60px" alt="Avatar utente: DursleyGuy" /></a><a href="https://github.com/DwayneTheRockLobster1"><img src="https:&#x2F;&#x2F;github.com&#x2F;DwayneTheRockLobster1.png" width="60px" alt="Avatar utente: " /></a><a href="https://github.com/KieraKujisawa"><img src="https:&#x2F;&#x2F;github.com&#x2F;KieraKujisawa.png" width="60px" alt="Avatar utente: Kiera Meredith" /></a><a href="https://github.com/andrewpayne68"><img src="https:&#x2F;&#x2F;github.com&#x2F;andrewpayne68.png" width="60px" alt="Avatar utente: Andrew P" /></a><!-- sponsors -->
## 🏅 Grazie a tutti i collaboratori
Un ringraziamento speciale per aver dedicato il vostro tempo ad aiutare Winutil a crescere. Grazie mille! Continuate così 🍻.
[![Contributori](https://contrib.rocks/image?repo=ChrisTitusTech/winutil)](https://github.com/ChrisTitusTech/winutil/graphs/contributors)
## 📊 Statistiche GitHub
![Alt](https://repobeats.axiom.co/api/embed/aad37eec9114c507f109d34ff8d38a59adc9503f.svg "Immagine analisi Repobeats")
+4 -2
View File
@@ -1,5 +1,7 @@
# Security Policy
If you find a security issue please make post it in the issues tab. If you think it should be private you can email me at contact@christitus.com.
If you find a security issue, please post it in the Issues tab. If you think it should be private, you can email me at contact@christitus.com.
For immediate response check out our discord server @ [![](https://dcbadge.limes.pink/api/server/https://discord.gg/RUbZUZyByQ?theme=default-inverted&style=for-the-badge)](https://discord.gg/RUbZUZyByQ)
For immediate response check out our Discord server:
[![](https://dcbadge.limes.pink/api/server/https://discord.gg/RUbZUZyByQ?theme=default-inverted&style=for-the-badge)](https://discord.gg/RUbZUZyByQ)
+3
View File
@@ -0,0 +1,3 @@
# Copilot Instructions
Read `AGENTS.md` in the repository root for operating instructions before doing anything else.
+8 -10
View File
@@ -1,18 +1,19 @@
tag-prefix: ''
categories:
- title: '🚀 Features'
- title: 'Features'
labels:
- 'feature'
- 'enhancement'
- title: '🐛 Bug Fixes'
- 'new feature'
- title: 'Bug Fixes'
labels:
- 'fix'
- 'hotfix'
- 'bugfix'
- 'bug'
- title: '📚 Documentation'
- title: 'Documentation'
label: 'documentation'
- title: '🔒 Security'
label: 'security'
- title: 'UI/UX Improvements'
label: 'ui update'
change-template: '- $TITLE @$AUTHOR (#$NUMBER)'
template: |
## Changes
@@ -31,7 +32,7 @@ autolabeler:
- '/fix\/.+/'
title:
- '/fix/i'
- label: 'enhancement'
- label: 'new feature'
branch:
- '/feature\/.+/'
body:
@@ -40,9 +41,6 @@ autolabeler:
files:
- '**/*.md'
- 'docs/**/*'
- label: 'security'
branch:
- '/security\/.+/'
replacers:
- search: /"/g
replace: ''
+31
View File
@@ -0,0 +1,31 @@
name: Auto-merge Automated Update PRs
on:
pull_request:
types: [opened, synchronize, reopened]
branches:
- main
jobs:
auto-merge:
if: (github.event.pull_request.head.ref == 'docs-update' || github.event.pull_request.head.ref == 'sponsors-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
contents: write
steps:
- name: Checkout
uses: actions/checkout@v7
- 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 --delete-branch --admin
env:
PR_NUMBER: ${{ github.event.pull_request.number }}
GH_TOKEN: ${{ secrets.AUTO_MERGE }}
@@ -9,7 +9,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@v7
- name: Check if PR was merged
if: github.event.pull_request.merged == true
@@ -18,10 +18,11 @@ jobs:
- name: Extract Discussion Number & Close If any Were Found
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
PR_BODY: ${{ github.event.pull_request.body }}
if: github.event.pull_request.merged == true
id: extract-discussion
run: |
pr_body="${{ github.event.pull_request.body }}"
pr_body="$PR_BODY"
discussion_ids=$(echo "$pr_body" | grep -oP '(?i)(resolve|fix|close)[s|d]? #\K[0-9]+')
if [ -z "$discussion_ids" ]; then
+4 -4
View File
@@ -14,14 +14,14 @@ jobs:
contents: none
steps:
- name: Close inactive issues
uses: actions/stale@v8
uses: actions/stale@v10
with:
# A list of labels to reference when looking through issues,
# and only when one (or even more) of these labels are found..
# and only when one (or even more) of these labels is found.
# then skip this issue, and never try to stale and/or close it.
exempt-issue-labels: "Keep Issue Open"
# Split it into two weeks, after one week the issue will be marked as stale,
# after another week have pasted without any update.. the issue will then be closed.
# Split it into two weeks, after one week, the issue will be marked as stale,
# after another week have passed without any update, the issue will then be closed.
days-before-issue-stale: 90
days-before-issue-close: 365
# NEVER mark PRs as Stale or Close + this workflow should never have write permissions on PRs, EVER!
+2 -2
View File
@@ -13,9 +13,9 @@ jobs:
runs-on: windows-latest
steps:
- name: Checkout Sources
uses: actions/checkout@v4
uses: actions/checkout@v7
- name: Compile and Syntaxcheck winutil.ps1
- name: Compile and Syntax check winutil.ps1
shell: pwsh
run: |
Set-ExecutionPolicy Bypass -Scope Process -Force; ./Compile.ps1
+48
View File
@@ -0,0 +1,48 @@
name: Deploy Astro site to Pages
on:
push:
branches:
- main
paths:
- "docs/**"
workflow_dispatch:
permissions:
contents: read
pages: write
id-token: write
concurrency:
group: "pages"
cancel-in-progress: false
jobs:
build:
if: github.repository == 'ChrisTitusTech/winutil'
runs-on: ubuntu-latest
env:
TZ: America/Chicago
steps:
- name: Checkout
uses: actions/checkout@v7
with:
fetch-depth: 0
persist-credentials: false
- name: Install, build, and upload your site
uses: withastro/action@v6
with:
path: docs
deploy:
if: github.repository == 'ChrisTitusTech/winutil'
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
runs-on: ubuntu-latest
needs: build
steps:
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v5
@@ -0,0 +1,207 @@
name: Generate WinUtil title screen
on:
workflow_dispatch:
permissions:
contents: read
concurrency:
group: winutil-title-screen
cancel-in-progress: true
jobs:
generate:
runs-on: windows-latest
timeout-minutes: 15
env:
WINUTIL_CAPTURE_WIDTH: "1920"
WINUTIL_CAPTURE_HEIGHT: "1080"
defaults:
run:
shell: pwsh
steps:
- name: Checkout repository
uses: actions/checkout@v7
with:
ref: main
persist-credentials: false
- name: Install uv and Python
uses: astral-sh/setup-uv@v10.2.0
with:
version: "0.12.0"
python-version: "3.13"
enable-cache: false
- name: Set display resolution
run: |
# Set-DisplayResolution is provided by Windows PowerShell's ServerCore
# module, so this step intentionally calls powershell.exe from pwsh.
& powershell.exe -NoLogo -NoProfile -Command @'
Set-DisplayResolution `
-Width $env:WINUTIL_CAPTURE_WIDTH `
-Height $env:WINUTIL_CAPTURE_HEIGHT `
-Force
'@
if ($LASTEXITCODE -ne 0) {
throw "Failed to set the runner display resolution."
}
Add-Type @"
using System.Runtime.InteropServices;
public static class ResolutionCheck {
[DllImport("user32.dll")]
public static extern int GetSystemMetrics(int index);
}
"@
$actualWidth = [ResolutionCheck]::GetSystemMetrics(0)
$actualHeight = [ResolutionCheck]::GetSystemMetrics(1)
if (
$actualWidth -ne [int]$env:WINUTIL_CAPTURE_WIDTH -or
$actualHeight -ne [int]$env:WINUTIL_CAPTURE_HEIGHT
) {
throw (
"The hosted runner rejected the requested resolution. " +
"Requested: $env:WINUTIL_CAPTURE_WIDTH" +
"x$env:WINUTIL_CAPTURE_HEIGHT; " +
"actual: ${actualWidth}x${actualHeight}."
)
}
- name: Report display environment
run: |
Add-Type @"
using System.Runtime.InteropServices;
public static class DisplayInfo {
[DllImport("user32.dll")]
public static extern int GetSystemMetrics(int index);
}
"@
$width = [DisplayInfo]::GetSystemMetrics(0)
$height = [DisplayInfo]::GetSystemMetrics(1)
$sessionId = [Diagnostics.Process]::GetCurrentProcess().SessionId
Write-Host "Resolution: ${width}x${height}"
Write-Host "Session ID: $sessionId"
Write-Host "User: $env:USERNAME"
- name: Compile WinUtil
run: |
Set-ExecutionPolicy Bypass -Scope Process -Force
./Compile.ps1
- name: Launch WinUtil
run: |
$scriptPath = Join-Path $env:GITHUB_WORKSPACE "winutil.ps1"
$command = "& '$scriptPath'"
$bytes = [Text.Encoding]::Unicode.GetBytes($command)
$encodedCommand = [Convert]::ToBase64String($bytes)
# Hide the console host while leaving the WPF window available.
$process = Start-Process powershell.exe -ArgumentList @(
"-NoLogo",
"-NoProfile",
"-ExecutionPolicy", "Bypass",
"-EncodedCommand", $encodedCommand
) -WindowStyle Hidden -PassThru
"WINUTIL_HOST_PID=$($process.Id)" |
Out-File $env:GITHUB_ENV -Append -Encoding utf8
$deadline = (Get-Date).AddSeconds(90)
do {
Start-Sleep -Seconds 2
# A versioned title excludes the unversioned console host.
$window = Get-Process |
Where-Object { $_.MainWindowTitle -match '^WinUtil\s+\d' } |
Select-Object -First 1
} until ($window -or (Get-Date) -ge $deadline)
if (-not $window) {
throw "WinUtil did not expose a window within 90 seconds."
}
Write-Host "WinUtil HWND: $($window.MainWindowHandle)"
Write-Host "WinUtil title: $($window.MainWindowTitle)"
# The exact HWND avoids desktop-enumeration ambiguity. Python validates
# the title and WPF class before using it.
"WINUTIL_HWND=$($window.MainWindowHandle)" |
Out-File $env:GITHUB_ENV -Append -Encoding utf8
- name: Generate title screen
working-directory: tools/title-screen
run: |
& uv run --locked python automate_title_screen.py `
--output ..\..\docs\src\assets\branding\title-screen.png 2>&1 |
Tee-Object -FilePath "$env:RUNNER_TEMP\title-screen-capture.log"
if ($LASTEXITCODE -ne 0) {
throw "Title-screen automation exited with code $LASTEXITCODE."
}
- name: Create title-screen update pull request
id: cpr
uses: peter-evans/create-pull-request@v8
with:
token: ${{ secrets.AUTO_MERGE }}
add-paths: docs/src/assets/branding/title-screen.png
base: main
branch: title-screen-update
delete-branch: true
commit-message: "docs: update WinUtil title screen"
title: "docs: update WinUtil title screen"
body: |
Regenerates the WinUtil Light and Dark title-screen composite from the current main branch.
Source workflow: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
labels: |
automated
documentation
skip-changelog
- name: Report pull request
if: steps.cpr.outputs.pull-request-url
env:
PR_OPERATION: ${{ steps.cpr.outputs.pull-request-operation }}
PR_URL: ${{ steps.cpr.outputs.pull-request-url }}
run: |
Write-Host "Pull request $env:PR_OPERATION`: $env:PR_URL"
- name: Inspect UI Automation on failure
if: failure()
continue-on-error: true
working-directory: tools/title-screen
run: |
uv run --locked python inspect_winutil.py `
"$env:RUNNER_TEMP\winutil-title-screen-inspect.txt"
- name: Upload failure diagnostics
if: failure()
uses: actions/upload-artifact@v7
with:
name: winutil-title-screen-failure-${{ github.run_number }}
path: |
docs/src/assets/branding/title-screen.png
${{ runner.temp }}/title-screen-capture.log
${{ runner.temp }}/winutil-title-screen-inspect.txt
if-no-files-found: warn
retention-days: 14
- name: Close WinUtil
if: always()
run: |
if ($env:WINUTIL_HOST_PID) {
Stop-Process `
-Id ([int]$env:WINUTIL_HOST_PID) `
-Force `
-ErrorAction SilentlyContinue
}
-115
View File
@@ -1,115 +0,0 @@
name: Issue slash commands
on:
issue_comment:
types: [created, edited]
jobs:
issueCommands:
# Skip this job if the comment was created/edited on a PR
if: ${{ !github.event.issue.pull_request }}
runs-on: ubuntu-latest
permissions:
issues: write
pull-requests: none
contents: read
steps:
- run: echo "command=false" >> $GITHUB_ENV
- name: Check for /label command
id: check_label_command
run: |
if [[ "${{ contains(github.event.comment.body, '/label') }}" == "true" ]]; then
echo "command=true" >> $GITHUB_ENV
LABEL_NAME=$(echo "${{ github.event.comment.body }}" | awk -F"/label" '/\/label/ { match($2, /'\''([^'\'']*)'\''/, arr); if (arr[1] != "") print arr[1] }')
echo "label_command=true" >> $GITHUB_ENV
echo "label_name=${LABEL_NAME}" >> $GITHUB_ENV
else
echo "label_command=false" >> $GITHUB_ENV
fi
- name: Check for /unlabel command
id: check_unlabel_command
run: |
if [[ "${{ contains(github.event.comment.body, '/unlabel') }}" == "true" ]]; then
echo "command=true" >> $GITHUB_ENV
UNLABEL_NAME=$(echo "${{ github.event.comment.body }}" | awk -F"/unlabel" '/\/unlabel/ { match($2, /'\''([^'\'']*)'\''/, arr); if (arr[1] != "") print arr[1] }')
echo "unlabel_command=true" >> $GITHUB_ENV
echo "unlabel_name=${UNLABEL_NAME}" >> $GITHUB_ENV
else
echo "unlabel_command=false" >> $GITHUB_ENV
fi
- name: Check for /close command
id: check_close_command
run: |
if [[ "${{ contains(github.event.comment.body, '/close') }}" == "true" ]]; then
echo "command=true" >> $GITHUB_ENV
echo "close_command=true" >> $GITHUB_ENV
echo "reopen_command=false" >> $GITHUB_ENV
else
echo "close_command=false" >> $GITHUB_ENV
fi
- name: Check for /open or /reopen command
id: check_reopen_command
run: |
if [[ "${{ contains(github.event.comment.body, '/open') }}" == "true" ]] || [[ "${{ contains(github.event.comment.body, '/reopen') }}" == "true" ]]; then
echo "command=true" >> $GITHUB_ENV
echo "reopen_command=true" >> $GITHUB_ENV
echo "close_command=false" >> $GITHUB_ENV
else
echo "reopen_command=false" >> $GITHUB_ENV
fi
- name: Check if the user is allowed
id: check_user
if: env.command == 'true'
run: |
ALLOWED_USERS=("ChrisTitusTech" "og-mrk" "Marterich" "MyDrift-user" "Real-MullaC" "CodingWonders")
if [[ " ${ALLOWED_USERS[@]} " =~ " ${{ github.event.comment.user.login }} " ]]; then
echo "user=true" >> $GITHUB_ENV
else
exit 0
fi
- name: Close issue
if: env.close_command == 'true'
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
ISSUE_NUMBER: ${{ github.event.issue.number }}
run: |
echo Closing the issue...
if [[ "${{ contains(github.event.comment.body, 'not planned') }}" == "true" ]]; then
gh issue close $ISSUE_NUMBER --repo ${{ github.repository }} --reason 'not planned'
else
gh issue close $ISSUE_NUMBER --repo ${{ github.repository }}
fi
- name: Reopen issue
if: env.reopen_command == 'true'
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
ISSUE_NUMBER: ${{ github.event.issue.number }}
run: |
echo Reopening the issue...
gh issue reopen $ISSUE_NUMBER --repo ${{ github.repository }}
- name: Label issue
if: env.label_command == 'true'
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
ISSUE_NUMBER: ${{ github.event.issue.number }}
run: |
echo Labeling the issue...
gh issue edit $ISSUE_NUMBER --repo ${{ github.repository }} --add-label "${{ env.label_name }}"
- name: Remove labels
if: env.unlabel_command == 'true'
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
ISSUE_NUMBER: ${{ github.event.issue.number }}
run: |
echo Unlabeling the issue...
gh issue edit $ISSUE_NUMBER --repo ${{ github.repository }} --remove-label "${{ env.unlabel_name }}"
+45
View File
@@ -0,0 +1,45 @@
name: Label PRs by Type of Change
on:
pull_request_target:
types: [opened, edited, synchronize]
jobs:
label-pr:
runs-on: ubuntu-latest
permissions:
pull-requests: write
issues: write
contents: read # Often needed for github-script
steps:
- name: Check PR body for Type of Change
uses: actions/github-script@v9
with:
script: |
const prBody = context.payload.pull_request.body || '';
const labelsToAdd = [];
if (/\[x\]\s*New feature/i.test(prBody)) {
labelsToAdd.push('new feature');
}
if (/\[x\]\s*Bug fix/i.test(prBody)) {
labelsToAdd.push('bug');
}
if (/\[x\]\s*Documentation update/i.test(prBody)) {
labelsToAdd.push('documentation');
}
if (/\[x\]\s*Hotfix/i.test(prBody)) {
labelsToAdd.push('hotfix');
}
if (/\[x\]\s*UI\/UX improvement/i.test(prBody)) {
labelsToAdd.push('ui update');
}
if (labelsToAdd.length > 0) {
await github.rest.issues.addLabels({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.payload.pull_request.number,
labels: labelsToAdd
});
}
+73 -5
View File
@@ -3,6 +3,7 @@ name: Pre-Release WinUtil
permissions:
contents: write
actions: read
pull-requests: write
on:
workflow_dispatch: # Manual trigger added
@@ -10,11 +11,19 @@ on:
jobs:
build-runspace:
runs-on: windows-latest
outputs:
version: ${{ steps.extract_version.outputs.version }}
env:
CERTIFICATE_BASE64: ${{ secrets.CERTIFICATE_BASE64 }}
steps:
- name: Checkout Repository
uses: actions/checkout@v4
uses: actions/checkout@v7
- name: Generate Dev Docs and Update JSON Links
shell: pwsh
run: |
Set-Location tools
./devdocs-generator.ps1
- name: Compile project
shell: pwsh
@@ -22,11 +31,37 @@ jobs:
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 Docs and JSON Links
id: cpr
uses: peter-evans/create-pull-request@v8
with:
token: ${{ secrets.AUTO_MERGE }}
commit-message: 'chore: Update generated dev docs and JSON links'
title: 'chore: Update generated dev docs and JSON links'
body: 'Automated update of generated documentation and JSON config links from pre-release build'
branch: docs-update
delete-branch: true
add-paths: |
docs/src/content/docs/code-reference/
config/tweaks.json
config/feature.json
labels: |
automated
documentation
skip-changelog
- 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: |
$version = (Get-Date -Format "yy.MM.dd")
echo "VERSION=$version" >> $env:GITHUB_ENV
echo "version=$version" >> $env:GITHUB_OUTPUT
shell: pwsh
- name: Create Tag
@@ -49,23 +84,56 @@ jobs:
}
shell: pwsh
- name: Upload compiled script
uses: actions/upload-artifact@v7
with:
name: winutil-ps1
path: ./winutil.ps1
release:
needs: build-runspace
runs-on: ubuntu-latest
steps:
- name: Download compiled script
uses: actions/download-artifact@v8
with:
name: winutil-ps1
- name: Set version from build job
run: echo "VERSION=${{ needs.build-runspace.outputs.version }}" >> $GITHUB_ENV
- name: Generate Release Notes
id: generate_notes
uses: release-drafter/release-drafter@v6
uses: release-drafter/release-drafter@v7
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
config-name: release-drafter.yml
version: ${{ env.VERSION }} # Pass the version variable
version: ${{ env.VERSION }}
- name: Remove Automated Updates from Release Notes
id: filter_notes
shell: pwsh
env:
RELEASE_NOTES: ${{ steps.generate_notes.outputs.body }}
run: |
$filteredNotes = ($env:RELEASE_NOTES -split '\r?\n' | Where-Object {
$_ -notmatch '(?i)Update (Generated Dev Docs|Sponsors)'
}) -join "`n"
$delimiter = [guid]::NewGuid().ToString()
"body<<$delimiter" >> $env:GITHUB_OUTPUT
$filteredNotes >> $env:GITHUB_OUTPUT
$delimiter >> $env:GITHUB_OUTPUT
- name: Create and Upload Release
id: create_release
uses: softprops/action-gh-release@v2
uses: softprops/action-gh-release@v3
with:
tag_name: ${{ env.VERSION }}
name: Pre-Release ${{ env.VERSION }}
body: |
${{ steps.generate_notes.outputs.body }}
${{ steps.filter_notes.outputs.body }}
![GitHub Downloads (specific asset, specific tag)](https://img.shields.io/github/downloads/ChrisTitusTech/winutil/${{ env.VERSION }}/winutil.ps1)
append_body: false
+1 -1
View File
@@ -11,7 +11,7 @@ jobs:
steps:
- name: Checkout code
uses: actions/checkout@v4
uses: actions/checkout@v7
- name: Check if winutil.ps1 exists
id: check_existence
+21 -5
View File
@@ -5,13 +5,16 @@ on:
- cron: 30 15 * * 0-6
permissions:
contents: write
pull-requests: write
jobs:
deploy:
runs-on: ubuntu-latest
if: (github.event_name == 'schedule' && github.repository == 'ChrisTitusTech/winutil') || (github.event_name != 'schedule')
steps:
- name: Checkout 🛎️
uses: actions/checkout@v4
uses: actions/checkout@v7
with:
persist-credentials: false
- name: Generate Sponsors 💖
uses: JamesIves/github-sponsors-readme-action@v1
@@ -19,8 +22,21 @@ jobs:
token: ${{ secrets.PAT }}
file: 'README.md'
- name: Deploy to GitHub Pages 🚀
uses: JamesIves/github-pages-deploy-action@v4
- name: Create Pull Request 🚀
id: cpr
uses: peter-evans/create-pull-request@v8
with:
branch: main
folder: '.'
token: ${{ secrets.AUTO_MERGE }}
commit-message: 'Update sponsors in README'
title: 'chore: Update Sponsors README'
body: 'Automated update of sponsors section'
branch: sponsors-update
delete-branch: true
labels: |
automated
skip-changelog
- name: Check outputs
run: |
echo "Pull Request Number - ${{ steps.cpr.outputs.pull-request-number }}"
echo "Pull Request URL - ${{ steps.cpr.outputs.pull-request-url }}"
+212
View File
@@ -0,0 +1,212 @@
name: Repo Contributors' Issue Triage Tools
on:
issue_comment:
types: [created, edited]
jobs:
triage-tools:
if: ${{ !github.event.issue.pull_request }}
runs-on: ubuntu-latest
permissions:
issues: write
pull-requests: none
contents: none
steps:
- name: Process issue command
uses: actions/github-script@v9
with:
script: |
const trustedUsers = [
7896101, // ChrisTitusTech
57459428, // FluffyPunk
125669256, // FallenGME
90123670, // mewclouds
121827219, // MyDrift-user
17331812, // Callum
101426328, // CodingWonders
70659536 // og-mrk
];
if (context.payload.issue.pull_request) {
console.log("Pull request comments are not supported. Exiting.");
return;
}
const comment = context.payload.comment;
const commentAuthor = comment.user;
if (!trustedUsers.includes(commentAuthor.id)) {
console.log(`Comment author ${commentAuthor.login} is not a trusted user. Exiting.`);
return;
}
const {owner, repo} = context.repo;
const issueNumber = context.issue.number;
const command = comment.body.trim().toLowerCase();
const triageMatch = command.match(/^\/triage$/);
const triageOffMatch = command.match(/^\/triageoff$/);
const notPlannedMatch = command.match(/^\/np(?:\s+(\w+))?$/);
const duplicateMatch = command.match(/^\/duplicate\s+#?(\d+)$/);
if (triageMatch) {
const issue = await github.rest.issues.get({
owner,
repo,
issue_number: issueNumber
});
if (issue.data.labels.some(label => label.name === "needs-triage")) {
await github.rest.issues.createComment({
owner,
repo,
issue_number: issueNumber,
body: "This issue already has the 'needs-triage' label. Use /triageoff to remove it."
});
} else {
await github.rest.issues.addLabels({
owner,
repo,
issue_number: issueNumber,
labels: ["needs-triage"]
});
await github.rest.issues.createComment({
owner,
repo,
issue_number: issueNumber,
body: `${commentAuthor.login} requested maintainer triage for this issue.`
});
}
} else if (triageOffMatch) {
const issue = await github.rest.issues.get({
owner,
repo,
issue_number: issueNumber
});
if (issue.data.labels.some(label => label.name === "needs-triage")) {
await github.rest.issues.removeLabel({
owner,
repo,
issue_number: issueNumber,
name: "needs-triage"
});
await github.rest.issues.createComment({
owner,
repo,
issue_number: issueNumber,
body: `${commentAuthor.login} removed the triage request from this issue.`
});
} else {
await github.rest.issues.createComment({
owner,
repo,
issue_number: issueNumber,
body: "This issue is not currently marked for triage."
});
}
} else if (notPlannedMatch) {
const reason = notPlannedMatch[1];
if (reason === "wontfix") {
await github.rest.issues.addLabels({
owner,
repo,
issue_number: issueNumber,
labels: ["wontfix"]
});
} else if (reason === "notrelated") {
await github.rest.issues.addLabels({
owner,
repo,
issue_number: issueNumber,
labels: ["not-related"]
});
}
await github.rest.issues.update({
owner,
repo,
issue_number: issueNumber,
state: "closed",
state_reason: "not_planned"
});
await github.rest.issues.createComment({
owner,
repo,
issue_number: issueNumber,
body: `${commentAuthor.login} closed this issue as not planned.`
});
} else if (duplicateMatch) {
const duplicateIssueNumber = Number(duplicateMatch[1]);
if (!Number.isSafeInteger(duplicateIssueNumber) || duplicateIssueNumber < 1) {
await github.rest.issues.createComment({
owner,
repo,
issue_number: issueNumber,
body: "The duplicate target must be a positive issue number."
});
} else if (duplicateIssueNumber === issueNumber) {
await github.rest.issues.createComment({
owner,
repo,
issue_number: issueNumber,
body: "An issue cannot be marked as a duplicate of itself."
});
} else {
let duplicateIssue;
try {
const response = await github.rest.issues.get({
owner,
repo,
issue_number: duplicateIssueNumber
});
duplicateIssue = response.data;
} catch (error) {
if (error.status !== 404) {
throw error;
}
}
if (duplicateIssue?.pull_request) {
await github.rest.issues.createComment({
owner,
repo,
issue_number: issueNumber,
body: `#${duplicateIssueNumber} is a pull request, not an issue.`
});
} else if (duplicateIssue) {
await github.rest.issues.update({
owner,
repo,
issue_number: issueNumber,
state: "closed",
state_reason: "duplicate",
duplicate_issue_id: duplicateIssue.id
});
await github.rest.issues.createComment({
owner,
repo,
issue_number: issueNumber,
body: `${commentAuthor.login} closed this issue as a duplicate of #${duplicateIssueNumber}.`
});
} else {
await github.rest.issues.createComment({
owner,
repo,
issue_number: issueNumber,
body: `Issue #${duplicateIssueNumber} does not exist.`
});
}
}
} else {
console.log("Comment does not contain a supported issue command. Exiting.");
return;
}
await github.rest.issues.deleteComment({
owner,
repo,
comment_id: comment.id
});
+23 -12
View File
@@ -8,32 +8,43 @@ jobs:
name: PS Script Analyzer
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: lint
uses: devblackops/github-action-psscriptanalyzer@master
with:
sendComment: false
settingsPath: lint/PSScriptAnalyser.ps1
failOnErrors: false
failOnWarnings: false
failOnInfos: false
- uses: actions/checkout@v7
- name: Install PSScriptAnalyzer
run: |
Set-PSRepository -Name PSGallery -InstallationPolicy Trusted
Install-Module -Name PSScriptAnalyzer -RequiredVersion 1.20.0 -Scope CurrentUser -Force
Import-Module PSScriptAnalyzer -RequiredVersion 1.20.0 -Force
Get-Module PSScriptAnalyzer | Select-Object Name, Version, Path
shell: pwsh
- name: Run PSScriptAnalyzer
run: |
$results = Invoke-ScriptAnalyzer -Path . -Settings ./lint/PSScriptAnalyser.ps1 -Recurse
if ($results) {
$results | Format-Table -AutoSize | Out-String -Width 4096 | Write-Host
} else {
Write-Host "PSScriptAnalyzer found no diagnostics."
}
shell: pwsh
test:
runs-on: windows-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
uses: actions/checkout@v7
- name: Install Pester
run: |
Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process
Install-Module -Name Pester -Force -SkipPublisherCheck -AllowClobber
Install-Module -Name Pester -RequiredVersion 5.8.0 -Force -SkipPublisherCheck -AllowClobber
Import-Module Pester -RequiredVersion 5.8.0 -Force
Get-Module Pester | Select-Object Name, Version, Path
shell: pwsh
- name: Run Pester tests
run: |
Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process
Invoke-Pester -Path 'pester/*.Tests.ps1' -Output Detailed
Import-Module Pester -RequiredVersion 5.8.0 -Force
Invoke-Pester -Path 'pester/*.Tests.ps1' -Output Detailed -CI
shell: pwsh
env:
+12 -52
View File
@@ -1,58 +1,18 @@
### VSCode ###
# Configuration folder
.vscode/
.idea/
### Visual Studio ###
# Visual Studio user-specific files
.vs/
winutil.pdb
### Preprocessor Hashes ###
.preprocessor_hashes.json
### Windows ###
# Folder config file
[Dd]esktop.ini
# Ignore Generated XAML Files
xaml/inputApp.xaml
xaml/inputFeatures.xaml
xaml/inputTweaks.xaml
# Executables and Configs
winget.msixbundle
pester.ps1
*.psd*
ooshutup10.cfg
winutil.exe.config
Microsoft.UI.Xaml*
license1.xml
winutil.ps1
# Libraries
# winutil
System.Management.Automation.dll
Microsoft.PowerShell.ConsoleHost.dll
# Compressed files
*.zip
### MacOS ###
# General
.DS_Store
microwin.log
True
test.ps1
winutil.exe.config
winutil.ps1
# temporary excludes for docs
.github/site/
binary/
testResults.xml
.preprocessor_hashes.json
# general software/os specific
desktop.ini
.DS_Store
__pycache__/
*.pyc
.venv/
.vscode/
.idea/
+190
View File
@@ -0,0 +1,190 @@
# AGENTS.md
Drop-in operating instructions for coding agents. Read this file before every task.
**Working code only. Finish the job. Plausibility is not correctness.**
`SPEC.md` in the repository root is the project contract — read it for what WinUtil is and how it's architected. This file covers how to work on it.
## 0. Non-Negotiables
These rules override everything else in this file when in conflict:
1. **Do not edit `winutil.ps1` directly.** It is generated build output (see SPEC.md's Build Model). Change source files and compile.
2. **Do not commit `winutil.ps1`.** It is ignored locally and generated by GitHub Actions for releases.
3. **Never touch `docs/src/content/docs/code-reference/tweaks/` or `docs/src/content/docs/code-reference/features/`.** Both are auto-generated (see SPEC.md's Docs Site). Edit the source JSON (`config/tweaks.json`, `config/feature.json`) or the relevant PowerShell function file instead. Other hand-written pages under `code-reference/` (e.g. `architecture.mdx`) are not touched by the generator and may be edited directly.
4. **Never fabricate.** Do not invent file paths, function names, command output, test results, commit hashes, or API behavior. Read the file or run the command.
5. **Disagree when the premise is wrong.** Say what is wrong before acting on it.
6. **Stop when genuinely ambiguous.** If two interpretations would produce materially different diffs, ask before editing.
7. **Touch only what the task requires.** No drive-by refactors, formatting sweeps, or unrelated cleanup.
8. **Verify before saying done.** A plausible-looking diff is not proof.
## 1. Key Commands
- Compile:
```powershell
.\Compile.ps1
```
- Compile and run GUI:
```powershell
.\Compile.ps1 -Run
```
- Install the supported Pester version (one-time). `-SkipPublisherCheck` is required because Windows ships an inbox Pester 3.4.0 that is catalog-signed, and PowerShell Gallery's Pester 5.8.0 is Authenticode-signed — `Install-Module` refuses the upgrade without it. This does not skip download integrity (still HTTPS + NuGet package hash verification); `-Repository PSGallery` pins the trusted source explicitly rather than relying on whatever repositories happen to be registered:
```powershell
Install-Module -Name Pester -RequiredVersion 5.8.0 -Repository PSGallery -Scope CurrentUser -Force -SkipPublisherCheck
```
- Run tests:
```powershell
Import-Module Pester -RequiredVersion 5.8.0 -Force
Invoke-Pester -Path 'pester/*.Tests.ps1' -Output Detailed -CI
```
- Run Script Analyzer with project settings when available. If a locally compiled `winutil.ps1` exists, delete it first — `lint/PSScriptAnalyser.ps1` only excludes rules, not files, so `-Recurse` would also lint the generated script and produce noise against line numbers that don't map to any source file:
```powershell
Invoke-ScriptAnalyzer -Path . -Settings .\lint\PSScriptAnalyser.ps1 -Recurse
```
- Docs site dev server (run from `docs/`; see Section 2 for why this goes through Docker):
```powershell
docker compose up winutil-astro
```
- Docs site production build (run from `docs/`):
```powershell
docker compose run --rm winutil-astro npm run build
```
Prefer the narrowest useful verification while iterating. Use the full relevant check before finishing.
## 2. Dependency Installs, Builds, And Dev Servers
Given the current wave of npm/pnpm/yarn supply-chain worms (malicious postinstall/preinstall scripts, credential-stealing packages): **never run npm/pnpm/yarn/npx directly on the host, full stop.** The docs site (`docs/`) is the only npm-based project in this repo; always run its tooling inside Docker via `docs/Dockerfile` and `docs/docker-compose.yml` (service `winutil-astro`).
- Never run `npm install`, `npm run <script>`, `npx <pkg>`, `pnpm`, or `yarn` directly on the host shell in `docs/`. Use `docker compose run --rm winutil-astro <command>` / `docker compose up winutil-astro` instead (see Section 1 for the exact commands).
- If a task needs a new docs dependency, add it to `docs/package.json` yourself, then rebuild the image and drop the `node_modules` volume so it repopulates from the new image (run from `docs/`): `docker compose build winutil-astro`, then `docker compose down -v`. Docker only seeds a named volume from the image the first time it's created, so a plain rebuild silently leaves the old `node_modules` in place. Don't install packages on the host, even temporarily, "just to check something."
- If Docker isn't available on the host, propose the install command for the current OS and wait for confirmation before running it — don't fall back to running npm on the host instead. If the daemon just isn't running (Docker is installed but not started), tell the user rather than trying to start it yourself.
- Treat any `postinstall`/`preinstall` lifecycle script in a new dependency as worth flagging to the user before installing — summarize what it does.
- Don't put real secrets anywhere under `docs/`. `docs/.dockerignore` only trims what `docker build` copies into the image — it does not affect the `docker compose` bind mount, which exposes the entire `docs/` directory (including any `.env` file) inside the container for every dev/build/preview command (see the next bullet). There is no "keep it out unless mounted" middle ground here.
- The container mounts `docs/` as a volume, so file edits on the host are reflected inside the container immediately — no rebuild needed for normal code changes, only when `docs/package.json`/`docs/package-lock.json` change (see the rebuild-and-drop-volume steps above).
- This Docker requirement is specific to `docs/`. PowerShell tooling runs directly on the host per Section 1. The Python project under `tools/title-screen/` runs with uv as documented in its README.
## 3. Source Of Truth
For changes that affect the compiled WinUtil script, make them only in the source files described in SPEC.md's Repository Layout — never in `winutil.ps1` itself. If behavior changes require the compiled script to change, update the source files and run `.\Compile.ps1` only to verify generation.
This scoping applies to compiled-script behavior only. Repository metadata — `AGENTS.md`, `SPEC.md`, `CLAUDE.md`/`GEMINI.md`/`.github/copilot-instructions.md`, `.github/workflows/`, and the root `.gitignore` — is edited directly when a task requires it, per the other sections of this file.
## 4. Before Editing
- State the plan in one or two sentences before editing. For non-trivial work, include the verification you intend to run.
- Read the files you will touch and the files that call them.
- Match existing patterns even when a different greenfield design would be cleaner.
- Surface assumptions when they affect behavior, compatibility, or user data.
- If two approaches have meaningful tradeoffs, name them before choosing. Trivial tasks can proceed directly.
## 5. Coding Guidelines
- Prefer the minimum code that solves the stated problem.
- Keep PowerShell functions in one function file when practical, with the file name matching the primary function name.
- Use approved PowerShell verb-noun names and follow the existing `WPF` / `WinUtil` naming conventions; keep UI event handler names aligned with XAML element names per SPEC.md's UI And Event Contract.
- Use `$sync` for shared state and UI references, consistent with SPEC.md's Runtime Model.
- Update WPF controls through the UI dispatcher when running work in a background runspace.
- Keep config-driven features in JSON when they fit the existing schema instead of hard-coding lists in PowerShell; follow SPEC.md's Configuration Contract for required fields and key-renaming rules.
- Preserve undo/original-state data for tweaks so users can reverse changes.
- Do not add abstractions, configurability, hooks, or "future extensibility" unless the task needs them now.
- Clean up orphans created by your own changes, such as unused variables or functions made obsolete by the edit.
- Avoid broad formatting-only edits, especially in JSON config files, XAML, docs, and generated output.
## 6. Runtime And Safety Rules
- WinUtil performs system-level Windows changes; treat registry, services, AppX removal, package manager, Windows Update, ISO, and unattended setup changes as high-risk (see SPEC.md's Safety Requirements).
- Prefer existing helper functions for WinGet, Chocolatey, registry, services, progress, and UI updates.
- Keep tweaks reversible where the schema supports it by including original values or original states.
- Never modify a user's original ISO in-place; follow existing copy/mount/export patterns.
- Avoid storing credentials, secrets, or machine-specific paths in repo files.
- Preserve logging and user feedback patterns for long-running or destructive operations.
## 7. Surgical Changes
- Do not improve adjacent code, comments, formatting, imports, or docs unless required.
- Do not refactor working code because you are already in the file.
- Do not delete pre-existing dead code unless asked; mention it in the summary if relevant.
- Keep diffs reviewable. Every changed line should trace to the user's request.
- If a change starts spreading across unrelated areas, pause and reassess the plan.
## 8. Verification
Define success in terms that can be checked, then check it.
- For compile/build changes, run `.\Compile.ps1`.
- For GUI behavior changes, run `.\Compile.ps1 -Run` when practical and verify the affected path manually.
- For config changes, run the compile check and relevant Pester tests.
- For function changes, run the relevant Pester tests or add/update focused tests when practical.
- For docs-only changes, proofread the changed files and skip runtime tests unless docs generation is affected.
- Read command output. Do not report tests as passing unless they actually passed.
- If verification fails, fix the cause rather than weakening the test.
If a check cannot be run, say exactly why and what residual risk remains. See SPEC.md's Testing And CI for what GitHub Actions runs on every push.
## 9. Generated Files And Git Hygiene
- Treat local `winutil.ps1` changes as disposable compile output.
- Never stage or commit `winutil.ps1`, `binary/`, or anything else ignored by the root `.gitignore` or `docs/.gitignore` — read those files rather than assuming. `docs/public/` is tracked source for static assets, not generated output.
- `docs/src/assets/branding/title-screen.png` is a tracked generated asset. Do not edit it manually. Update `tools/title-screen/` or run the title-screen workflow.
- Do not remove `.gitignore` rules that keep generated artifacts out of Git.
- Before finishing, check `git status --short` and separate your changes from pre-existing user changes.
- Do not revert user changes unless explicitly asked.
- Commit messages, when requested, should be descriptive: short subject under 72 characters, body explaining why when needed.
- When committing, split changes into small, logical commits rather than one large commit, so each commit's diff is reviewable as a single group of related changes.
## 10. Documentation Expectations
- Update `docs/src/content/docs/guides/` when user-facing behavior changes.
- Update `docs/src/content/docs/code-reference/architecture.mdx` and other hand-written developer docs when architecture, build flow, config schema, or contribution workflow changes — but never hand-edit the auto-generated `code-reference/tweaks/` or `code-reference/features/` subfolders (see Non-Negotiables).
- Keep sidebar entries in `docs/astro.config.mjs` in sync with page slugs (see SPEC.md's Docs Site).
- Keep README changes brief and high-level.
- Put detailed user and developer documentation under `docs/`.
- Keep SPEC.md aligned with project/architecture changes, and this file aligned with process changes.
## 11. Communication Style
- Be direct and concise. Start with the answer or action.
- No flattery, filler, ceremonial closings, or fake certainty.
- Use bullets only when they improve scanning.
- Report what changed, how it was verified, and anything not done.
- If the user asks for a review, lead with findings and file/line references.
## 12. When To Ask
Ask before proceeding when:
- The request has two plausible interpretations and the choice materially changes behavior or files touched.
- The change affects release generation, generated artifacts, migrations, or high-risk Windows behavior in a way the user did not specify.
- You need credentials, secrets, production resources, or access you do not have.
- The user's stated goal conflicts with the literal request.
Proceed without asking when:
- The task is trivial and reversible.
- Ambiguity can be resolved by reading the code or running a local command.
- The user already answered the question in this session.
## 13. Project Learnings
When the user corrects an agent approach, add or tighten one concrete rule here before ending the session. Keep this section short and prune rules that no longer matter.
- Keep `winutil.ps1` generated-only: change source files, compile to verify, and never stage the generated script.
- Keep WinUtil runtime logging in the existing timestamped `%LocalAppData%\winutil\logs\winutil_*.log` session file; do not create a separate root `winutil.log`.
- Import Pester 5.8.0 before running tests so `Invoke-Pester -Output Detailed -CI` does not resolve to Windows' inbox Pester 3.4.0.
- Keep package install/uninstall process launches simple unless explicitly requested; do not add a separate stdout/stderr process logging helper for winget or Chocolatey.
- When the active log file is owned by `Start-Transcript`, do not call `Add-Content` against that file; write to host output so the transcript captures the line in the same log file without recording a terminating-error diagnostic.
- Keep UI helpers such as `Invoke-WPFUIThread` and `Step-WinUtilJob` safe to call without a window; the `-Preset` and `-Config` paths run the workflows before the form is created and before PresentationCore is loaded. Ask `Test-WinUtilUIAlive` rather than writing the `$sync.Form` / dispatcher / `HasShutdownStarted` check out by hand.
- Put long operations on the job layer with `Start-WinUtilJob` and report from them with `Step-WinUtilJob`; a job body must not set the busy flag, print its own banner, or carry its own try/catch/finally around the interface. `Invoke-WPFRunspace` directly is for fire-and-forget work that is not a job.
- Drain interface work that nobody is waiting for through `Start-WinUtilBackgroundQueue`; do not hand-roll another dequeue-and-re-post pump.
- Values a posted scriptblock needs travel as the dispatcher's argument or through `-Parameters`, never captured from the caller: a plain block resolves them when the dispatcher gets to it, and `GetNewClosure` binds command lookup to a copied scope. For the same reason, prefer a compiled `[action]` over `Invoke-WPFUIThread -Async` on hot re-posting paths, which marshals its body as text and recompiles it per post.
- Diagnostic scaffolding does not ship. Measure with it, then delete it.
- Have each Pester file load the assemblies and dot-source the functions it needs; several passed only because an earlier file in alphabetical order happened to load them.
- Log install/uninstall package names and package-manager IDs before queuing background runspace work; do not rely on runspace host output for the package identity.
- For Win11 Creator, start each new ISO modification in a fresh `WinUtil_Win11ISO_*` temp directory; existing-work detection is only for resuming/exporting already modified media.
- For Win11 Creator driver injection, inject storage controllers (`SCSIAdapter` / `HDC`) into `boot.wim` index 2 with DISM, not `$WinpeDriver$`. Keep `install.wim` on its own per-package `/Add-Driver` retry loop. For each image, add each root package folder with its own `/Add-Driver /Recurse` so a single bad driver cannot fail the rest, and skip any folder whose ancestor is already in the set, since that ancestor's `/Recurse` covers it. Warn per failure and commit only when at least one package was added; when none were, warn and discard rather than throwing, so the run still produces an ISO. The discard in the cleanup block carries both orphaned mounts and that intentional zero-added case; keep it. Do not export editions or run unrelated WIM cleanup, and reject damaged metadata before ISO export. Use `-LiteralPath` for driver export paths, since `%TEMP%` can contain wildcard characters.
- For Script Analyzer cleanup, fix actionable source warnings first and do not globally suppress accepted convention warnings such as plural names, `ShouldProcess` on UI helpers, `$global:sync`, or compile-time cross-file false positives.
- For DNS DHCP reset, keep the cmdlet reset and explicitly set IPv4 and IPv6 DNS source to DHCP.
- Public pull-request diffs may be sent to configured external review services without a separate privacy approval; do not block the review loop on upload authorization for this public repository.
- Keep install-tab favicon loading overlapped with app-entry rendering; do not replace native WPF loading with a deferred second phase unless visible completion time is proven no slower than `main`.
+2
View File
@@ -0,0 +1,2 @@
# CLAUDE.md
@AGENTS.md
+24 -121
View File
@@ -1,145 +1,48 @@
param (
[switch]$Debug,
[switch]$Run,
[string]$Arguments
[switch]$Run
)
if ((Get-Item ".\winutil.ps1" -ErrorAction SilentlyContinue).IsReadOnly) {
Remove-Item ".\winutil.ps1" -Force
}
$OFS = "`r`n"
$scriptname = "winutil.ps1"
$workingdir = $PSScriptRoot
Push-Location
Set-Location $workingdir
# Variable to sync between runspaces
$sync = [Hashtable]::Synchronized(@{})
$sync.PSScriptRoot = $workingdir
$sync.configs = @{}
function Update-Progress {
param (
[Parameter(Mandatory, position=0)]
[string]$StatusMessage,
$script = (Get-Content -Path scripts\start.ps1) -replace '#{replaceme}', (Get-Date -Format 'yy.MM.dd')
$isLocalCompile = -not [string]::Equals($env:GITHUB_ACTIONS, "true", [StringComparison]::OrdinalIgnoreCase)
$script = $script -replace '#{islocalcompile}', $isLocalCompile.ToString().ToLowerInvariant()
[Parameter(Mandatory, position=1)]
[ValidateRange(0,100)]
[int]$Percent,
[Parameter(position=2)]
[string]$Activity = "Compiling"
)
Write-Progress -Activity $Activity -Status $StatusMessage -PercentComplete $Percent
$script += Get-ChildItem -Path functions -Recurse -File | ForEach-Object {
Get-Content -Path $_.FullName -Raw
}
$header = @"
################################################################################################################
### ###
### WARNING: This file is automatically generated DO NOT modify this file directly as it will be overwritten ###
### ###
################################################################################################################
"@
Get-ChildItem config | ForEach-Object {
$obj = Get-Content -Path $_.FullName -Raw | ConvertFrom-Json
Update-Progress "Pre-req: Running Preprocessor..." 0
# Dot source the 'Invoke-Preprocessing' Function from 'tools/Invoke-Preprocessing.ps1' Script
$preprocessingFilePath = ".\tools\Invoke-Preprocessing.ps1"
. $preprocessingFilePath
$excludedFiles = @('.\.git\', '.\.gitignore', '.\.gitattributes', '.\.github\CODEOWNERS', '.\LICENSE', "$preprocessingFilePath", '*.png', '*.exe','.\.preprocessor_hashes.json')
$msg = "Pre-req: Code Formatting"
Invoke-Preprocessing -WorkingDir "$workingdir" -ExcludedFiles $excludedFiles -ProgressStatusMessage $msg
# Create the script in memory.
Update-Progress "Pre-req: Allocating Memory" 0
$script_content = [System.Collections.Generic.List[string]]::new()
Update-Progress "Adding: Header" 5
$script_content.Add($header)
Update-Progress "Adding: Version" 10
$script_content.Add($(Get-Content "scripts\start.ps1").replace('#{replaceme}',"$(Get-Date -Format yy.MM.dd)"))
Update-Progress "Adding: Functions" 20
Get-ChildItem "functions" -Recurse -File | ForEach-Object {
$script_content.Add($(Get-Content $psitem.FullName))
}
Update-Progress "Adding: Config *.json" 40
Get-ChildItem "config" | Where-Object {$psitem.extension -eq ".json"} | ForEach-Object {
$json = (Get-Content $psitem.FullName -Raw)
$jsonAsObject = $json | ConvertFrom-Json
# Add 'WPFInstall' as a prefix to every entry-name in 'applications.json' file
if ($psitem.Name -eq "applications.json") {
foreach ($appEntryName in $jsonAsObject.PSObject.Properties.Name) {
$appEntryContent = $jsonAsObject.$appEntryName
$jsonAsObject.PSObject.Properties.Remove($appEntryName)
$jsonAsObject | Add-Member -MemberType NoteProperty -Name "WPFInstall$appEntryName" -Value $appEntryContent
if ($_.Name -eq "applications.json") {
$fixed = [ordered]@{}
foreach ($p in $obj.PSObject.Properties) {
$fixed["WPFInstall$($p.Name)"] = $p.Value
}
$obj = [pscustomobject]$fixed
}
# Line 90 requires no whitespace inside the here-strings, to keep formatting of the JSON in the final script.
$json = @"
$($jsonAsObject | ConvertTo-Json -Depth 3)
"@
$json = $obj | ConvertTo-Json -Depth 10
$sync.configs.$($psitem.BaseName) = $json | ConvertFrom-Json
$script_content.Add($(Write-Output "`$sync.configs.$($psitem.BaseName) = @'`r`n$json`r`n'@ `| ConvertFrom-Json" ))
$sync.configs[$_.BaseName] = $obj
$script += "`$sync.configs.$($_.BaseName) = @'`r`n$json`r`n'@ | ConvertFrom-Json"
}
# Read the entire XAML file as a single string, preserving line breaks
$xaml = Get-Content "$workingdir\xaml\inputXML.xaml" -Raw
$xaml = Get-Content -Path xaml\inputXML.xaml -Raw
$script += "`$inputXML = @'`r`n$xaml`r`n'@"
Update-Progress "Adding: Xaml " 90
$autounattendXml = Get-Content -Path tools\autounattend.xml -Raw
$script += "`$WinUtilAutounattendXml = @'`r`n$autounattendXml`r`n'@"
# Add the XAML content to $script_content using a here-string
$script_content.Add(@"
`$inputXML = @'
$xaml
'@
"@)
$script += Get-Content -Path scripts\main.ps1 -Raw
$script_content.Add($(Get-Content "scripts\main.ps1"))
Set-Content -Path winutil.ps1 -Value $script
if ($Debug) {
Update-Progress "Writing debug files" 95
$appXamlContent | Out-File -FilePath "xaml\inputApp.xaml" -Encoding ascii
$tweaksXamlContent | Out-File -FilePath "xaml\inputTweaks.xaml" -Encoding ascii
$featuresXamlContent | Out-File -FilePath "xaml\inputFeatures.xaml" -Encoding ascii
} else {
Update-Progress "Removing temporary files" 99
Remove-Item "xaml\inputApp.xaml" -ErrorAction SilentlyContinue
Remove-Item "xaml\inputTweaks.xaml" -ErrorAction SilentlyContinue
Remove-Item "xaml\inputFeatures.xaml" -ErrorAction SilentlyContinue
if ($Run) {
.\Winutil.ps1
}
Set-Content -Path "$scriptname" -Value ($script_content -join "`r`n") -Encoding ascii
Write-Progress -Activity "Compiling" -Completed
Update-Progress -Activity "Validating" -StatusMessage "Checking winutil.ps1 Syntax" -Percent 0
try {
Get-Command -Syntax .\winutil.ps1 | Out-Null
} catch {
Write-Warning "Syntax Validation for 'winutil.ps1' has failed"
Write-Host "$($Error[0])" -ForegroundColor Red
Pop-Location # Restore previous location before exiting...
exit 1
}
Write-Progress -Activity "Validating" -Completed
if ($run) {
$script = "& '$workingdir\$scriptname' $Arguments"
$powershellcmd = if (Get-Command pwsh -ErrorAction SilentlyContinue) { "pwsh" } else { "powershell" }
$processCmd = if (Get-Command wt.exe -ErrorAction SilentlyContinue) { "wt.exe" } else { $powershellcmd }
Start-Process $processCmd -ArgumentList "$powershellcmd -NoProfile -Command $script"
break
}
Pop-Location
+3
View File
@@ -0,0 +1,3 @@
# GEMINI.md
Read `AGENTS.md` in the repository root for operating instructions before doing anything else.
+62 -62
View File
@@ -1,91 +1,91 @@
# Chris Titus Tech's Windows Utility
[![Version](https://img.shields.io/github/v/release/ChrisTitusTech/winutil?color=%230567ff&label=Latest%20Release&style=for-the-badge)](https://github.com/ChrisTitusTech/winutil/releases/latest)
![GitHub Downloads (specific asset, all releases)](https://img.shields.io/github/downloads/ChrisTitusTech/winutil/winutil.ps1?label=Total%20Downloads&style=for-the-badge)
[![](https://dcbadge.limes.pink/api/server/https://discord.gg/RUbZUZyByQ?theme=default-inverted&style=for-the-badge)](https://discord.gg/RUbZUZyByQ)
[![Static Badge](https://img.shields.io/badge/Documentation-_?style=for-the-badge&logo=bookstack&color=grey)](https://winutil.christitus.com/)
![Downloads](https://img.shields.io/github/downloads/ChrisTitusTech/winutil/winutil.ps1?label=Total%20Downloads&style=for-the-badge)
[![Discord](https://dcbadge.limes.pink/api/server/https://discord.gg/RUbZUZyByQ?theme=default-inverted&style=for-the-badge)](https://discord.gg/RUbZUZyByQ)
This utility is a compilation of Windows tasks I perform on each Windows system I use. It is meant to streamline *installs*, debloat with *tweaks*, troubleshoot with *config*, and fix Windows *updates*. I am extremely picky about any contributions to keep this project clean and efficient.
A curated compilation of Windows system tasks streamline **installs**, debloat with **tweaks**, troubleshoot with **config**, and configure **Windows updates**. Run it fresh on every new Windows install.
![screen-install](https://raw.githubusercontent.com/Chris-Titus-Docs/winutil-docs/refs/heads/main/assets/images/Title-Screen.png)
![Title Screen](docs/src/assets/branding/title-screen.png)
## 💡 Usage
Winutil must be run in Admin mode because it performs system-wide tweaks. To achieve this, run PowerShell as an administrator. Here are a few ways to do it:
---
1. **Start menu Method:**
- Right-click on the start menu.
- Choose "Windows PowerShell (Admin)" (for Windows 10) or "Terminal (Admin)" (for Windows 11).
## Quick Start
2. **Search and Launch Method:**
- Press the Windows key.
- Type "PowerShell" or "Terminal" (for Windows 11).
- Press `Ctrl + Shift + Enter` or Right-click and choose "Run as administrator" to launch it with administrator privileges.
> **WinUtil must be run as Administrator** because it performs system-wide changes.
### Launch Command
#### Stable Branch (Recommended)
Open PowerShell or Terminal as admin, then run:
**Stable Branch (recommended)**
```ps1
irm "https://christitus.com/win" | iex
```
#### Dev Branch
```ps1
irm "https://christitus.com/windev" | iex
irm https://christitus.com/win | iex
```
If you have Issues, refer to [Known Issues](https://winutil.christitus.com/knownissues/)
## 🎓 Documentation
> [!NOTE]
> To contribute to the documentation, please visit [WinUtil Docs Repo](https://github.com/Chris-Titus-Docs/winutil-docs) for more info.
### [WinUtil Official Documentation](https://winutil.christitus.com/)
### [YouTube Tutorial](https://www.youtube.com/watch?v=6UQZ5oQg8XA)
### [ChrisTitus.com Article](https://christitus.com/windows-tool/)
## 🛠️ Build & Develop
> [!NOTE]
> Winutil is a relatively large script, so it's split into multiple files which're combined into a single `.ps1` file using a custom compiler. This makes maintaining the project a lot easier.
Get a copy of the source code, this can be done using GitHub UI (`Code -> Download ZIP`), or by cloning (downloading) the repo using git.
If git is installed, run the following commands under a PowerShell window to clone and move into project's directory:
**Development Branch**
```ps1
git clone --depth 1 "https://github.com/ChrisTitusTech/winutil.git"
cd winutil
irm https://christitus.com/windev | iex
```
To build the project, run the Compile Script under a PowerShell window (admin permissions IS NOT required):
```ps1
.\Compile.ps1
### How to open an admin terminal
- **Start menu:** Right-click Start → *Windows PowerShell (Admin)* or *Terminal (Admin)*
- **Search:** Press the `Windows key`, and type `PowerShell` or `Terminal`, then `Ctrl + Shift + Enter`
---
## Automation / Presets
Apply a predefined configuration without manual selection:
```powershell
& ([ScriptBlock]::Create((irm https://christitus.com/win))) -Preset Standard
```
You'll see a new file named `winutil.ps1`, which's created by `Compile.ps1` script, now you can run it as admin and a new window will popup, enjoy your own compiled version of WinUtil :)
| Preset | Description |
|--------|-------------|
| `Standard` | Balanced defaults for most users |
| `Minimal` | Minimal changes to suit every user |
| `Advanced` | Deep tweaks for power users |
> [!TIP]
> For more info on using WinUtil and how to develop for it, please consider reading [the Contribution Guidelines](https://winutil.christitus.com/contributing/), if you don't know where to start, or have questions, you can ask over on our [Discord Community Server](https://discord.gg/RUbZUZyByQ) and active project members will answer when they can.
To view exactly what each preset does, see:
https://github.com/ChrisTitusTech/winutil/blob/main/config/preset.json
## 💖 Support
- To morally and mentally support the project, make sure to leave a ⭐️!
- EXE Wrapper for $10 @ https://www.cttstore.com/windows-toolbox
---
## 💖 Sponsors
## Build & Develop
See https://github.com/ChrisTitusTech/winutil/blob/main/.github/CONTRIBUTING.md
---
## Resources
- [Official Documentation](https://winutil.christitus.com/)
- [YouTube Tutorial](https://www.youtube.com/watch?v=6UQZ5oQg8XA)
- [ChrisTitus.com Article](https://christitus.com/windows-tool/)
- [Known Issues](https://winutil.christitus.com/knownissues/)
- [Report an Issue](https://github.com/ChrisTitusTech/winutil/issues)
---
## Support
- Leave a ⭐ to show support!
- Faster Dotnet Implementation for sale here: https://www.cttstore.com/windows-toolbox
## Sponsors
These are the sponsors that help keep this project alive with monthly contributions.
<!-- sponsors --><a href="https://github.com/TriHydera"><img src="https:&#x2F;&#x2F;github.com&#x2F;TriHydera.png" width="60px" alt="User avatar: TriHydera" /></a><a href="https://github.com/DelDongo"><img src="https:&#x2F;&#x2F;github.com&#x2F;DelDongo.png" width="60px" alt="User avatar: " /></a><a href="https://github.com/markamos"><img src="https:&#x2F;&#x2F;github.com&#x2F;markamos.png" width="60px" alt="User avatar: Mark Amos" /></a><a href="https://github.com/dwelfusius"><img src="https:&#x2F;&#x2F;github.com&#x2F;dwelfusius.png" width="60px" alt="User avatar: " /></a><a href="https://github.com/mews-se"><img src="https:&#x2F;&#x2F;github.com&#x2F;mews-se.png" width="60px" alt="User avatar: Martin Stockzell" /></a><a href="https://github.com/jdiegmueller"><img src="https:&#x2F;&#x2F;github.com&#x2F;jdiegmueller.png" width="60px" alt="User avatar: Jason A. Diegmueller" /></a><a href="https://github.com/robertsandrock"><img src="https:&#x2F;&#x2F;github.com&#x2F;robertsandrock.png" width="60px" alt="User avatar: RMS" /></a><a href="https://github.com/KenichiQaz"><img src="https:&#x2F;&#x2F;github.com&#x2F;KenichiQaz.png" width="60px" alt="User avatar: Stefan" /></a><a href="https://github.com/paulsheets"><img src="https:&#x2F;&#x2F;github.com&#x2F;paulsheets.png" width="60px" alt="User avatar: Paul" /></a><a href="https://github.com/djones369"><img src="https:&#x2F;&#x2F;github.com&#x2F;djones369.png" width="60px" alt="User avatar: Dave J. - WhamGeek" /></a><a href="https://github.com/anthonymendez"><img src="https:&#x2F;&#x2F;github.com&#x2F;anthonymendez.png" width="60px" alt="User avatar: Anthony Mendez" /></a><a href="https://github.com/FatBastard0"><img src="https:&#x2F;&#x2F;github.com&#x2F;FatBastard0.png" width="60px" alt="User avatar: " /></a><a href="https://github.com/DursleyGuy"><img src="https:&#x2F;&#x2F;github.com&#x2F;DursleyGuy.png" width="60px" alt="User avatar: DursleyGuy" /></a><a href="https://github.com/realmuddy"><img src="https:&#x2F;&#x2F;github.com&#x2F;realmuddy.png" width="60px" alt="User avatar: Phillip Waters" /></a><a href="https://github.com/quaszi"><img src="https:&#x2F;&#x2F;github.com&#x2F;quaszi.png" width="60px" alt="User avatar: " /></a><a href="https://github.com/DwayneTheRockLobster1"><img src="https:&#x2F;&#x2F;github.com&#x2F;DwayneTheRockLobster1.png" width="60px" alt="User avatar: " /></a><a href="https://github.com/KieraKujisawa"><img src="https:&#x2F;&#x2F;github.com&#x2F;KieraKujisawa.png" width="60px" alt="User avatar: Kiera Meredith" /></a><a href="https://github.com/danhively"><img src="https:&#x2F;&#x2F;github.com&#x2F;danhively.png" width="60px" alt="User avatar: Dan Hively" /></a><!-- sponsors -->
<!-- sponsors --><a href="https://github.com/dwelfusius"><img src="https:&#x2F;&#x2F;github.com&#x2F;dwelfusius.png" width="60px" alt="User avatar: " /></a><a href="https://github.com/mews-se"><img src="https:&#x2F;&#x2F;github.com&#x2F;mews-se.png" width="60px" alt="User avatar: Martin" /></a><a href="https://github.com/jdiegmueller"><img src="https:&#x2F;&#x2F;github.com&#x2F;jdiegmueller.png" width="60px" alt="User avatar: Jason A. Diegmueller" /></a><a href="https://github.com/robertsandrock"><img src="https:&#x2F;&#x2F;github.com&#x2F;robertsandrock.png" width="60px" alt="User avatar: RMS" /></a><a href="https://github.com/paulsheets"><img src="https:&#x2F;&#x2F;github.com&#x2F;paulsheets.png" width="60px" alt="User avatar: Paul" /></a><a href="https://github.com/djones369"><img src="https:&#x2F;&#x2F;github.com&#x2F;djones369.png" width="60px" alt="User avatar: Dave J (WhamGeek)" /></a><a href="https://github.com/anthonymendez"><img src="https:&#x2F;&#x2F;github.com&#x2F;anthonymendez.png" width="60px" alt="User avatar: Anthony Mendez" /></a><a href="https://github.com/FatBastard0"><img src="https:&#x2F;&#x2F;github.com&#x2F;FatBastard0.png" width="60px" alt="User avatar: " /></a><a href="https://github.com/DursleyGuy"><img src="https:&#x2F;&#x2F;github.com&#x2F;DursleyGuy.png" width="60px" alt="User avatar: DursleyGuy" /></a><a href="https://github.com/DwayneTheRockLobster1"><img src="https:&#x2F;&#x2F;github.com&#x2F;DwayneTheRockLobster1.png" width="60px" alt="User avatar: " /></a><a href="https://github.com/KieraKujisawa"><img src="https:&#x2F;&#x2F;github.com&#x2F;KieraKujisawa.png" width="60px" alt="User avatar: Kiera Meredith" /></a><a href="https://github.com/seanh1995"><img src="https:&#x2F;&#x2F;github.com&#x2F;seanh1995.png" width="60px" alt="User avatar: Sean (ANGRYxScotsman)" /></a><a href="https://github.com/F-L-Perez"><img src="https:&#x2F;&#x2F;github.com&#x2F;F-L-Perez.png" width="60px" alt="User avatar: Fra · ppe" /></a><a href="https://github.com/josencarnacao"><img src="https:&#x2F;&#x2F;github.com&#x2F;josencarnacao.png" width="60px" alt="User avatar: José Encarnação" /></a><!-- sponsors -->
## 🏅 Thanks to all Contributors
Thanks a lot for spending your time helping Winutil grow. Thanks a lot! Keep rocking 🍻.
*<sub>Sponsors with a recurring subscription also get access to the .NET alternative.</sub>
---
## Contributors
[![Contributors](https://contrib.rocks/image?repo=ChrisTitusTech/winutil)](https://github.com/ChrisTitusTech/winutil/graphs/contributors)
## 📊 GitHub Stats
![Alt](https://repobeats.axiom.co/api/embed/aad37eec9114c507f109d34ff8d38a59adc9503f.svg "Repobeats analytics image")
Thanks to everyone who has contributed time and effort to this project. Keep rocking 🍻
+116
View File
@@ -0,0 +1,116 @@
# SPEC.md
Project contract for WinUtil — what the project is, how it's built, and how it runs. Written for anyone, human or AI, who needs to understand the project itself.
`AGENTS.md` in the repository root points here for these facts, and separately covers how an agent should behave while working in this repo. This file does not change based on who's reading it.
## Project Context
WinUtil is a Windows PowerShell utility with a WPF interface. The repository is maintained as modular source, but the distributed artifact is one compiled PowerShell script.
### Stack
- Language: Windows PowerShell / PowerShell.
- UI: WPF via `xaml/inputXML.xaml`.
- Configuration: JSON files under `config/`.
- Tests: Pester tests under `pester/`.
- Lint: PowerShell Script Analyzer with settings in `lint/PSScriptAnalyser.ps1`.
- Docs: Astro + Starlight site under `docs/`, built independently of `Compile.ps1` (its own `package.json`/`node_modules`).
- Release artifact: generated root `winutil.ps1`.
### Repository Layout
- `Compile.ps1`: build script that creates `winutil.ps1`.
- `scripts/start.ps1`: startup/bootstrap segment used at the beginning of the compiled script.
- `scripts/main.ps1`: main entrypoint appended at the end of the compiled script.
- `functions/public/`: public/UI-facing PowerShell functions.
- `functions/private/`: internal helper PowerShell functions.
- `config/`: JSON configuration consumed at compile time and embedded into `$sync.configs`.
- `xaml/inputXML.xaml`: WPF UI markup embedded into the compiled script.
- `tools/autounattend.xml`: unattended setup XML embedded for Windows ISO workflows.
- `pester/`: Pester tests for config and function checks.
- `lint/PSScriptAnalyser.ps1`: PowerShell Script Analyzer settings.
- `tools/title-screen/`: uv project that captures WinUtil's Light and Dark themes and generates the title-screen composite.
- `docs/`: Astro + Starlight documentation site, with its own `package.json` and build independent of `Compile.ps1`.
- `winutil.ps1`: ignored generated build artifact.
## Goals
- Provide a single-script Windows utility that can be launched from PowerShell.
- Keep development modular enough for contributors to work on functions, config, UI, docs, and tooling independently.
- Make install, tweak, feature, repair, update, and ISO workflows discoverable from the WPF UI.
- Keep common lists and options declarative in JSON config where possible.
- Preserve a repeatable compile process so local builds and GitHub Actions builds produce the distributable script from the same inputs.
## Non-Goals
- `winutil.ps1` is not hand-maintained.
- The project is not structured as a PowerShell module at runtime.
- The GUI is not a separate packaged desktop application in this repository's normal release path.
- Generated files should not be reviewed as source changes.
## Build Model
`Compile.ps1` combines the repository sources into `winutil.ps1` in this order:
1. Read `scripts/start.ps1` and replace `#{replaceme}` with the current `yy.MM.dd` build date.
2. Append every file under `functions/` recursively.
3. Convert each `config/*.json` file into embedded `$sync.configs` objects.
4. Special-case `config/applications.json` so keys receive the `WPFInstall` prefix in compiled config.
5. Embed `xaml/inputXML.xaml` into `$inputXML`.
6. Embed `tools/autounattend.xml` into `$WinUtilAutounattendXml`.
7. Append `scripts/main.ps1`.
8. Write the result to root `winutil.ps1`.
Because the final script is concatenated, code cannot rely on runtime module imports or source-relative dot-sourcing unless the compiled script will also contain the required code/data.
## Runtime Model
- WinUtil runs in PowerShell on Windows and uses WPF for the UI.
- Shared mutable state is stored in `$sync`, including configs, UI element references, runspace state, selections, and progress.
- Long-running operations use runspaces or existing async patterns so the UI remains responsive.
- UI updates from background work are dispatched back to the WPF UI thread.
- Declarative features such as apps, tweaks, presets, DNS providers, and navigation stay in `config/*.json` unless code is required.
## UI And Event Contract
- UI layout lives in `xaml/inputXML.xaml`.
- Named WPF controls are discovered and stored in `$sync`.
- Button/action wiring follows a naming convention: an element named like `WPFThingButton` maps to a function named like `Invoke-WPFThingButton`.
## Configuration Contract
- Config files must remain valid JSON and compile cleanly through `ConvertFrom-Json`.
- `config/dns.json` opts unfiltered providers into Fastest selection with `BenchmarkEligible: true`; missing or false values exclude a provider from the TCP latency benchmark.
- `config/applications.json` defines installable applications; each entry includes the fields expected by tests and UI code, such as package manager IDs, category, display content, description, and link.
- `config/tweaks.json` defines Windows tweaks; registry and service changes include original values or original states when applicable so undo workflows can restore user systems.
- Preset and navigation files reference valid config keys. Renaming a config key requires updating all presets, UI references, docs, and code paths together.
## Safety Requirements
- Registry, service, package manager, Windows Update, AppX removal, and ISO operations affect the host system and are treated as high-risk.
- Tweak changes include undo metadata when the schema supports it, so changes stay reversible.
- ISO workflows never modify the user's original ISO file; they work on copied/mounted content.
## Docs Site (Astro)
- `docs/` is an Astro + Starlight site, independent of `Compile.ps1`'s build (its own `package.json`/`node_modules`, deployed via the `docs.yaml` GitHub Actions workflow to GitHub Pages).
- Pages live under `docs/src/content/docs/` (`.mdx`), organized into `guides/`, `code-reference/`, plus top-level pages like `faq.mdx`, `knownissues.mdx`, `contributing.mdx`, `index.mdx`.
- `docs/src/content/docs/code-reference/tweaks/` and `.../features/` are auto-generated by `tools/devdocs-generator.ps1` from `config/tweaks.json`/`config/feature.json` and the relevant PowerShell function files. Other pages under `code-reference/` (e.g. `architecture.mdx`) are hand-written and untouched by the generator.
- Sidebar entries in `docs/astro.config.mjs` must match actual page slugs under `docs/src/content/docs/`.
- `docs/public/` is tracked source for static assets (favicons, etc.), not generated output. Generated/ignored paths are listed in `docs/.gitignore` (`dist/`, `.astro/`, `node_modules/`, local env files).
- `docs/src/assets/branding/title-screen.png` is a tracked generated image used by the repository README and docs homepage. Its raw Light and Dark captures are temporary.
- `docs/Dockerfile` and `docs/docker-compose.yml` (service `winutil-astro`) containerize the site's npm tooling; see AGENTS.md's Dependency Installs, Builds, And Dev Servers for why and how agents must use them instead of running npm on the host.
## Testing And CI
- `.\Compile.ps1` verifies the compiler can generate `winutil.ps1`.
- `.\Compile.ps1 -Run` compiles and launches the generated utility for manual GUI verification.
- Pester 5.8.0 runs the suite under `pester/*.Tests.ps1`. GitHub Actions (`unittests.yaml`) installs Pester 5.8.0 fresh and runs with `-CI`, which produces `testResults.xml` and exits non-zero on failure.
- GitHub Actions also runs PowerShell Script Analyzer with `lint/PSScriptAnalyser.ps1` on every push.
- The generated `winutil.ps1` may appear locally after compile. It remains ignored build output (see root `.gitignore`) and must not be committed.
- The manually triggered title-screen workflow compiles WinUtil from `main` and opens an image-only pull request when the generated composite changes. These pull requests require manual review. Failed runs retain diagnostics for 14 days.
## Release Artifact
GitHub Actions is responsible for producing the release `winutil.ps1` from repository sources. A release is considered valid only if the generated script came from the compile process, not from direct manual edits to `winutil.ps1`.
-16
View File
@@ -1,16 +0,0 @@
# Import the function (adjust the path according to your setup)
. "./functions/private/Install-WinUtilWinget.ps1"
. "./functions/private/Test-WinUtilPackageManager.ps1"
# Set up Information stream to be visible
$InformationPreference = "Continue"
Write-Host "Starting Winget installation test..." -ForegroundColor Cyan
try {
Install-WinUtilWinget
} catch {
Write-Host "Error occurred during testing: $($_.Exception.Message)" -ForegroundColor Red
Write-Host "Stack Trace:" -ForegroundColor Red
$_.ScriptStackTrace
}
+934 -1716
View File
File diff suppressed because it is too large Load Diff
+27 -6
View File
@@ -21,13 +21,13 @@
"Description": "Upgrade all applications to the latest version"
},
"WingetRadioButton": {
"Content": "Winget",
"Content": "WinGet",
"Category": "__Package Manager",
"Type": "RadioButton",
"GroupName": "PackageManagerGroup",
"Checked": true,
"Order": "1",
"Description": "Use Winget for package management"
"Description": "Use WinGet for package management"
},
"ChocoRadioButton": {
"Content": "Chocolatey",
@@ -38,25 +38,46 @@
"Order": "2",
"Description": "Use Chocolatey for package management"
},
"WPFCollapseAllCategories": {
"Content": "Collapse All Categories",
"Category": "__Selection",
"Type": "Button",
"Order": "1",
"Description": "Collapse all application categories"
},
"WPFExpandAllCategories": {
"Content": "Expand All Categories",
"Category": "__Selection",
"Type": "Button",
"Order": "2",
"Description": "Expand all application categories"
},
"WPFClearInstallSelection": {
"Content": "Clear Selection",
"Category": "__Selection",
"Type": "Button",
"Order": "1",
"Order": "3",
"Description": "Clear the selection of applications"
},
"WPFGetInstalled": {
"Content": "Get Installed",
"Content": "Show Installed Apps",
"Category": "__Selection",
"Type": "Button",
"Order": "2",
"Order": "4",
"Description": "Show installed applications"
},
"WPFselectedAppsButton": {
"Content": "Selected Apps: 0",
"Category": "__Selection",
"Type": "Button",
"Order": "3",
"Order": "5",
"Description": "Show the selected applications"
},
"WPFInstallFOSSInfo": {
"Content": "Free and Open Source Software",
"Category": "__Selection",
"Type": "Note",
"Order": "0",
"Description": "Information about the #FOSS label on application entries"
}
}
+271
View File
@@ -0,0 +1,271 @@
{
"WPFAppxMicrosoft_WindowsFeedbackHub": {
"Category": "Microsoft Apps",
"Content": "Feedback Hub",
"Description": "Allows users to submit bug reports, feature suggestions, and diagnostic data directly to Microsoft.",
"Panel": "0",
"PackageId": "Microsoft.WindowsFeedbackHub",
"StoreId": "9NBLGGH4R32N"
},
"WPFAppxMicrosoft_GetHelp": {
"Category": "Microsoft Apps",
"Content": "Get Help",
"Description": "Provides access to automated troubleshooting guides, support documentation, and direct Microsoft customer assistance.",
"Panel": "0",
"PackageId": "Microsoft.GetHelp",
"StoreId": "9PKDZBMV1H3T"
},
"WPFAppxMicrosoft_OutlookForWindows": {
"Category": "Microsoft Apps",
"Content": "Outlook for Windows",
"Description": "Provides modern email management, calendar scheduling, and contact organization features.",
"Panel": "0",
"PackageId": "Microsoft.OutlookForWindows",
"StoreId": "9NRX63209R7B"
},
"WPFAppxMSTeams": {
"Category": "Microsoft Apps",
"Content": "Microsoft Teams",
"Description": "Facilitates instant messaging, video conferencing, file sharing, and workspace collaboration.",
"Panel": "0",
"PackageId": "MSTeams",
"StoreId": "XP8BT8DW290MPQ"
},
"WPFAppxClipchamp_Clipchamp": {
"Category": "Utilities & Productivity",
"Content": "Clipchamp",
"Description": "Provides a user-friendly video editor with built-in templates, effects, and timeline editing tools.",
"Panel": "0",
"PackageId": "Clipchamp.Clipchamp",
"StoreId": "9P1J8S7CCWWT"
},
"WPFAppxMicrosoft_MicrosoftOfficeHub": {
"Category": "Microsoft Apps",
"Content": "Microsoft 365",
"Description": "Serves as a centralized launcher and dashboard for accessing cloud-based Microsoft 365 apps and recent documents.",
"Panel": "0",
"PackageId": "Microsoft.MicrosoftOfficeHub",
"StoreId": "9WZDNCRD29V9"
},
"WPFAppxMicrosoft_ZuneMusic": {
"Category": "Utilities & Productivity",
"Content": "Media Player",
"Description": "Plays local audio and video files with modern playlist management and casting capabilities.",
"Panel": "0",
"PackageId": "Microsoft.ZuneMusic",
"StoreId": "9WZDNCRFJ3PT"
},
"WPFAppxMicrosoft_BingSearch": {
"Category": "Bing & Web Services",
"Content": "Bing Search",
"Description": "Integrates Microsoft Bing search capabilities and web services directly into the operating system.",
"Panel": "1",
"PackageId": "Microsoft.BingSearch",
"StoreId": "9NZBF4GT040C"
},
"WPFAppxMicrosoftCorporationII_QuickAssist": {
"Category": "Utilities & Productivity",
"Content": "Quick Assist",
"Description": "Enables secure remote technical support and screen sharing over an internet connection.",
"Panel": "0",
"PackageId": "MicrosoftCorporationII.QuickAssist",
"StoreId": "9P7BP5VNWKX5"
},
"WPFAppxMicrosoft_WindowsDevHome": {
"Category": "Developer Tools",
"Content": "Dev Home",
"Description": "Provides a specialized dashboard for software developer environment setups, repository syncing, and hardware widgets.",
"Panel": "1",
"PackageId": "Microsoft.Windows.DevHome",
"StoreId": "9N8MHTPHNGVV"
},
"WPFAppxMicrosoft_WindowsCrossDevice": {
"Category": "Microsoft Ecosystem",
"Content": "Mobile Devices",
"Description": "Manages system-level background connectivity with paired mobile devices. Removing this may disable cross-device features such as phone screen mirroring, file transfer, and mobile hotspot handoff integrated into Windows Settings.",
"Panel": "0",
"PackageId": "MicrosoftWindows.CrossDevice",
"StoreId": "9NTXGKQ8P7N0"
},
"WPFAppxMicrosoft_Todos": {
"Category": "Utilities & Productivity",
"Content": "To Do",
"Description": "Creates, tracks, and synchronizes personal tasks, smart lists, and daily reminders.",
"Panel": "0",
"PackageId": "Microsoft.Todos",
"StoreId": "9NBLGGH5R558"
},
"WPFAppxMicrosoft_PowerAutomateDesktop": {
"Category": "Developer Tools",
"Content": "Power Automate",
"Description": "Automates repetitive workflows and desktop tasks using low-code visual scripting.",
"Panel": "1",
"PackageId": "Microsoft.PowerAutomateDesktop",
"StoreId": "9NFTCH6J7FHV"
},
"WPFAppxMicrosoft_YourPhone": {
"Category": "Microsoft Ecosystem",
"Content": "Phone Link",
"Description": "Synchronizes text messages, phone notifications, photos, and calls from a mobile device to the desktop.",
"Panel": "0",
"PackageId": "Microsoft.YourPhone",
"StoreId": "9NMPJ99VJBWV"
},
"WPFAppxMicrosoft_MicrosoftStickyNotes": {
"Category": "Utilities & Productivity",
"Content": "Sticky Notes",
"Description": "Creates quick, floating text notes on the desktop that automatically sync across devices.",
"Panel": "0",
"PackageId": "Microsoft.MicrosoftStickyNotes",
"StoreId": "9NBLGGH4QGHW"
},
"WPFAppxMicrosoft_WindowsSoundRecorder": {
"Category": "Utilities & Productivity",
"Content": "Sound Recorder",
"Description": "Records and trims live audio inputs with simple microphone adjustment controls.",
"Panel": "0",
"PackageId": "Microsoft.WindowsSoundRecorder",
"StoreId": "9WZDNCRFHWKN"
},
"WPFAppxMicrosoft_WindowsAlarms": {
"Category": "Utilities & Productivity",
"Content": "Clock",
"Description": "Features world clocks, alarms, countdown timers, stopwatches, and dedicated focus session tracking.",
"Panel": "0",
"PackageId": "Microsoft.WindowsAlarms",
"StoreId": "9WZDNCRFJ3PR"
},
"WPFAppxMicrosoft_Paint": {
"Category": "Utilities & Productivity",
"Content": "Paint",
"Description": "Provides built-in digital sketching, basic image editing, and pixel-level graphic manipulation tools.",
"Panel": "0",
"PackageId": "Microsoft.Paint",
"StoreId": "9PCFS5B6T72H"
},
"WPFAppxMicrosoft_WindowsNotepad": {
"Category": "Utilities & Productivity",
"Content": "Notepad",
"Description": "Provides a lightweight text editor with multi-tab support for plain text files and code snippets.",
"Panel": "0",
"PackageId": "Microsoft.WindowsNotepad",
"StoreId": "9MSMLRH6LZF3"
},
"WPFAppxMicrosoft_ScreenSketch": {
"Category": "Utilities & Productivity",
"Content": "Snipping Tool",
"Description": "Captures screenshots or screen recordings with built-in markup, image cropping, and optical character recognition (OCR).",
"Panel": "0",
"PackageId": "Microsoft.ScreenSketch",
"StoreId": "9MZ95KL8MR0L"
},
"WPFAppxMicrosoft_Copilot": {
"Category": "Bing & Web Services",
"Content": "Copilot",
"Description": "Launches the Microsoft AI companion for contextual answers, creative writing assistance, and intelligent web search.",
"Panel": "1",
"PackageId": "Microsoft.Copilot",
"StoreId": "9NHT9RB2F4HD"
},
"WPFAppxMicrosoft_WindowsCalculator": {
"Category": "Utilities & Productivity",
"Content": "Calculator",
"Description": "Performs standard arithmetic, scientific operations, programming calculations, and unit conversions.",
"Panel": "0",
"PackageId": "Microsoft.WindowsCalculator",
"StoreId": "9WZDNCRFHVN5"
},
"WPFAppxMicrosoft_WindowsCamera": {
"Category": "Utilities & Productivity",
"Content": "Camera",
"Description": "Captures photographs and records video files via connected webcams or imaging hardware.",
"Panel": "0",
"PackageId": "Microsoft.WindowsCamera",
"StoreId": "9WZDNCRFJBBG"
},
"WPFAppxMicrosoft_WindowsPhotos": {
"Category": "Utilities & Productivity",
"Content": "Photos",
"Description": "Organizes, views, and crops local images with basic color adjustment and album creation tools.",
"Panel": "0",
"PackageId": "Microsoft.Windows.Photos",
"StoreId": "9WZDNCRFJBH4"
},
"WPFAppxMicrosoft_BingNews": {
"Category": "Bing & Web Services",
"Content": "News",
"Description": "Aggregates breaking news headlines, personalized article feeds, and world current events.",
"Panel": "1",
"PackageId": "Microsoft.BingNews",
"StoreId": "9WZDNCRFHVFW"
},
"WPFAppxMicrosoft_BingWeather": {
"Category": "Bing & Web Services",
"Content": "Weather",
"Description": "Displays local real-time weather tracking, radar maps, and historical meteorological forecasts.",
"Panel": "1",
"PackageId": "Microsoft.BingWeather",
"StoreId": "9WZDNCRFJ3Q2"
},
"WPFAppxMicrosoft_GamingApp": {
"Category": "Xbox & Gaming",
"Content": "Xbox App",
"Description": "Serves as the primary gaming library manager, social community interface, and PC Game Pass dashboard.",
"Panel": "1",
"PackageId": "Microsoft.GamingApp",
"StoreId": "9MV0B5HZVK9Z"
},
"WPFAppxMicrosoft_XboxGamingOverlay": {
"Category": "Xbox & Gaming",
"Content": "Xbox Game Bar",
"Description": "Provides customizable in-game status widgets, audio balancing sliders, system monitoring tools, and gameplay recording.",
"Panel": "1",
"PackageId": "Microsoft.XboxGamingOverlay",
"StoreId": "9NZKPSTSNW4P"
},
"WPFAppxMicrosoft_XboxIdentityProvider": {
"Category": "Xbox & Gaming",
"Content": "Xbox Identity Provider",
"Description": "Manages Xbox network user authentication and background account validation for connected titles. Warning: removing this may break Microsoft account sign-in for non-Xbox games and apps that rely on this authentication pipeline.",
"Panel": "1",
"PackageId": "Microsoft.XboxIdentityProvider",
"StoreId": "9WZDNCRD1HKW"
},
"WPFAppxMicrosoft_XboxSpeechToTextOverlay": {
"Category": "Xbox & Gaming",
"Content": "Xbox Speech To Text Overlay",
"Description": "Provides system-level live accessibility captions and voice-to-text translation for gaming chat networks.",
"Panel": "1",
"PackageId": "Microsoft.XboxSpeechToTextOverlay"
},
"WPFAppxMicrosoft_Xbox_TCUI": {
"Category": "Xbox & Gaming",
"Content": "Xbox TCUI",
"Description": "Provides core account connection UI modules for single sign-on flows within game titles. Warning: removing this may break Microsoft account authentication in games and apps that do not otherwise require the Xbox app.",
"Panel": "1",
"PackageId": "Microsoft.Xbox.TCUI"
},
"WPFAppxMicrosoft_StartExperiencesApp": {
"Category": "Bing & Web Services",
"Content": "Start Experiences App",
"Description": "Powers the Windows Widgets board, delivering a personalized feed of news, weather, sports, and finance content.",
"Panel": "1",
"PackageId": "Microsoft.StartExperiencesApp",
"StoreId": "9PC1H9VN18CM"
},
"WPFAppxMicrosoft_MicrosoftSolitaireCollection": {
"Category": "Xbox & Gaming",
"Content": "Solitaire Collection",
"Description": "Bundles built-in card game modes including Klondike, Spider, FreeCell, Pyramid, and TriPeaks alongside daily challenges.",
"Panel": "1",
"PackageId": "Microsoft.MicrosoftSolitaireCollection"
},
"WPFAppxMicrosoft_ZuneVideo": {
"Category": "Utilities & Productivity",
"Content": "Movies & TV",
"Description": "The default video player and storefront for purchasing or renting media.",
"Panel": "0",
"PackageId": "Microsoft.ZuneVideo",
"StoreId": "9WZDNCRFJ3P2"
}
}
-442
View File
@@ -1,442 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<unattend xmlns="urn:schemas-microsoft-com:unattend" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State">
<!--https://schneegans.de/windows/unattend-generator/?LanguageMode=Unattended&UILanguage=en-US&Locale=en-US&Keyboard=00000409&GeoLocation=244&ProcessorArchitecture=amd64&BypassRequirementsCheck=true&BypassNetworkCheck=true&ComputerNameMode=Random&TimeZoneMode=Implicit&PartitionMode=Interactive&WindowsEditionMode=Unattended&WindowsEdition=pro&UserAccountMode=Unattended&AccountName0=User&AccountPassword0=&AccountGroup0=Administrators&AccountName1=&AccountName2=&AccountName3=&AccountName4=&AutoLogonMode=Own&PasswordExpirationMode=Unlimited&LockoutMode=Default&HideFiles=Hidden&DisableWidgets=true&ClassicContextMenu=true&DisableFastStartup=true&EnableLongPaths=true&DisableAppSuggestions=true&PreventDeviceEncryption=true&WifiMode=Skip&ExpressSettings=DisableAll&Remove3DViewer=true&RemoveBingSearch=true&RemoveCamera=true&RemoveClipchamp=true&RemoveClock=true&RemoveCopilot=true&RemoveCortana=true&RemoveDevHome=true&RemoveFamily=true&RemoveFeedbackHub=true&RemoveGetHelp=true&RemoveInternetExplorer=true&RemoveMailCalendar=true&RemoveMaps=true&RemoveMathInputPanel=true&RemoveZuneVideo=true&RemoveNews=true&RemoveNotepad=true&RemoveOffice365=true&RemoveOneDrive=true&RemoveOneNote=true&RemoveOpenSSHClient=true&RemoveOutlook=true&RemovePaint3D=true&RemovePeople=true&RemovePowerAutomate=true&RemoveQuickAssist=true&RemoveSkype=true&RemoveSolitaire=true&RemoveStepsRecorder=true&RemoveStickyNotes=true&RemoveTeams=true&RemoveGetStarted=true&RemoveToDo=true&RemoveVoiceRecorder=true&RemoveWeather=true&RemoveWindowsMediaPlayer=true&RemoveZuneMusic=true&RemoveWordPad=true&WdacMode=Skip-->
<settings pass="offlineServicing"></settings>
<settings pass="windowsPE">
<component name="Microsoft-Windows-International-Core-WinPE" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
<SetupUILanguage>
<UILanguage>en-US</UILanguage>
</SetupUILanguage>
<InputLocale>0409:00000409</InputLocale>
<SystemLocale>en-US</SystemLocale>
<UILanguage>en-US</UILanguage>
<UserLocale>en-US</UserLocale>
</component>
<component name="Microsoft-Windows-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
<UserData>
<ProductKey>
<Key>VK7JG-NPHTM-C97JM-9MPGT-3V66T</Key>
</ProductKey>
<AcceptEula>true</AcceptEula>
</UserData>
<RunSynchronous>
<RunSynchronousCommand wcm:action="add">
<Order>1</Order>
<Path>reg.exe add "HKLM\SYSTEM\Setup\LabConfig" /v BypassTPMCheck /t REG_DWORD /d 1 /f</Path>
</RunSynchronousCommand>
<RunSynchronousCommand wcm:action="add">
<Order>2</Order>
<Path>reg.exe add "HKLM\SYSTEM\Setup\LabConfig" /v BypassSecureBootCheck /t REG_DWORD /d 1 /f</Path>
</RunSynchronousCommand>
<RunSynchronousCommand wcm:action="add">
<Order>3</Order>
<Path>reg.exe add "HKLM\SYSTEM\Setup\LabConfig" /v BypassRAMCheck /t REG_DWORD /d 1 /f</Path>
</RunSynchronousCommand>
</RunSynchronous>
</component>
</settings>
<settings pass="generalize"></settings>
<settings pass="specialize">
<component name="Microsoft-Windows-Deployment" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
<RunSynchronous>
<RunSynchronousCommand wcm:action="add">
<Order>1</Order>
<Path>reg.exe add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\OOBE" /v BypassNRO /t REG_DWORD /d 1 /f</Path>
</RunSynchronousCommand>
<RunSynchronousCommand wcm:action="add">
<Order>2</Order>
<Path>reg.exe load "HKU\DefaultUser" "C:\Users\Default\NTUSER.DAT"</Path>
</RunSynchronousCommand>
<RunSynchronousCommand wcm:action="add">
<Order>3</Order>
<Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\Runonce" /v "UninstallCopilot" /t REG_SZ /d "powershell.exe -NoProfile -Command \"Get-AppxPackage -Name 'Microsoft.Windows.Ai.Copilot.Provider' | Remove-AppxPackage;\"" /f</Path>
</RunSynchronousCommand>
<RunSynchronousCommand wcm:action="add">
<Order>4</Order>
<Path>reg.exe add "HKU\DefaultUser\Software\Policies\Microsoft\Windows\WindowsCopilot" /v TurnOffWindowsCopilot /t REG_DWORD /d 1 /f</Path>
</RunSynchronousCommand>
<RunSynchronousCommand wcm:action="add">
<Order>5</Order>
<Path>reg.exe unload "HKU\DefaultUser"</Path>
</RunSynchronousCommand>
<RunSynchronousCommand wcm:action="add">
<Order>6</Order>
<Path>reg.exe delete "HKLM\SOFTWARE\Microsoft\WindowsUpdate\Orchestrator\UScheduler_Oobe\DevHomeUpdate" /f</Path>
</RunSynchronousCommand>
<RunSynchronousCommand wcm:action="add">
<Order>7</Order>
<Path>reg.exe load "HKU\DefaultUser" "C:\Users\Default\NTUSER.DAT"</Path>
</RunSynchronousCommand>
<RunSynchronousCommand wcm:action="add">
<Order>8</Order>
<Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Notepad" /v ShowStoreBanner /t REG_DWORD /d 0 /f</Path>
</RunSynchronousCommand>
<RunSynchronousCommand wcm:action="add">
<Order>9</Order>
<Path>reg.exe unload "HKU\DefaultUser"</Path>
</RunSynchronousCommand>
<RunSynchronousCommand wcm:action="add">
<Order>10</Order>
<Path>cmd.exe /c "del "C:\Users\Default\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\OneDrive.lnk""</Path>
</RunSynchronousCommand>
<RunSynchronousCommand wcm:action="add">
<Order>11</Order>
<Path>cmd.exe /c "del "C:\Windows\System32\OneDriveSetup.exe""</Path>
</RunSynchronousCommand>
<RunSynchronousCommand wcm:action="add">
<Order>12</Order>
<Path>cmd.exe /c "del "C:\Windows\SysWOW64\OneDriveSetup.exe""</Path>
</RunSynchronousCommand>
<RunSynchronousCommand wcm:action="add">
<Order>13</Order>
<Path>reg.exe load "HKU\DefaultUser" "C:\Users\Default\NTUSER.DAT"</Path>
</RunSynchronousCommand>
<RunSynchronousCommand wcm:action="add">
<Order>14</Order>
<Path>reg.exe delete "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\Run" /v OneDriveSetup /f</Path>
</RunSynchronousCommand>
<RunSynchronousCommand wcm:action="add">
<Order>15</Order>
<Path>reg.exe unload "HKU\DefaultUser"</Path>
</RunSynchronousCommand>
<RunSynchronousCommand wcm:action="add">
<Order>16</Order>
<Path>reg.exe delete "HKLM\SOFTWARE\Microsoft\WindowsUpdate\Orchestrator\UScheduler_Oobe\OutlookUpdate" /f</Path>
</RunSynchronousCommand>
<RunSynchronousCommand wcm:action="add">
<Order>17</Order>
<Path>reg.exe add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Communications" /v ConfigureChatAutoInstall /t REG_DWORD /d 0 /f</Path>
</RunSynchronousCommand>
<RunSynchronousCommand wcm:action="add">
<Order>18</Order>
<Path>powershell.exe -NoProfile -Command "$xml = [xml]::new(); $xml.Load('C:\Windows\Panther\unattend.xml'); $sb = [scriptblock]::Create( $xml.unattend.Extensions.ExtractScript ); Invoke-Command -ScriptBlock $sb -ArgumentList $xml;"</Path>
</RunSynchronousCommand>
<RunSynchronousCommand wcm:action="add">
<Order>19</Order>
<Path>powershell.exe -NoProfile -Command "Get-Content -LiteralPath 'C:\Windows\Temp\Microwin-RemovePackages.ps1' -Raw | Invoke-Expression;"</Path>
</RunSynchronousCommand>
<RunSynchronousCommand wcm:action="add">
<Order>20</Order>
<Path>powershell.exe -NoProfile -Command "Get-Content -LiteralPath 'C:\Windows\Temp\remove-caps.ps1' -Raw | Invoke-Expression;"</Path>
</RunSynchronousCommand>
<RunSynchronousCommand wcm:action="add">
<Order>21</Order>
<Path>reg.exe add "HKLM\SOFTWARE\Microsoft\PolicyManager\current\device\Start" /v ConfigureStartPins /t REG_SZ /d "{ \"pinnedList\": [] }" /f</Path>
</RunSynchronousCommand>
<RunSynchronousCommand wcm:action="add">
<Order>22</Order>
<Path>reg.exe add "HKLM\SOFTWARE\Microsoft\PolicyManager\current\device\Start" /v ConfigureStartPins_ProviderSet /t REG_DWORD /d 1 /f</Path>
</RunSynchronousCommand>
<RunSynchronousCommand wcm:action="add">
<Order>23</Order>
<Path>reg.exe add "HKLM\SOFTWARE\Microsoft\PolicyManager\current\device\Start" /v ConfigureStartPins_WinningProvider /t REG_SZ /d B5292708-1619-419B-9923-E5D9F3925E71 /f</Path>
</RunSynchronousCommand>
<RunSynchronousCommand wcm:action="add">
<Order>24</Order>
<Path>reg.exe add "HKLM\SOFTWARE\Microsoft\PolicyManager\providers\B5292708-1619-419B-9923-E5D9F3925E71\default\Device\Start" /v ConfigureStartPins /t REG_SZ /d "{ \"pinnedList\": [] }" /f</Path>
</RunSynchronousCommand>
<RunSynchronousCommand wcm:action="add">
<Order>25</Order>
<Path>reg.exe add "HKLM\SOFTWARE\Microsoft\PolicyManager\providers\B5292708-1619-419B-9923-E5D9F3925E71\default\Device\Start" /v ConfigureStartPins_LastWrite /t REG_DWORD /d 1 /f</Path>
</RunSynchronousCommand>
<RunSynchronousCommand wcm:action="add">
<Order>26</Order>
<Path>net.exe accounts /maxpwage:UNLIMITED</Path>
</RunSynchronousCommand>
<RunSynchronousCommand wcm:action="add">
<Order>27</Order>
<Path>reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\FileSystem" /v LongPathsEnabled /t REG_DWORD /d 1 /f</Path>
</RunSynchronousCommand>
<RunSynchronousCommand wcm:action="add">
<Order>28</Order>
<Path>reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Power" /v HiberbootEnabled /t REG_DWORD /d 0 /f</Path>
</RunSynchronousCommand>
<RunSynchronousCommand wcm:action="add">
<Order>29</Order>
<Path>reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Dsh" /v AllowNewsAndInterests /t REG_DWORD /d 0 /f</Path>
</RunSynchronousCommand>
<RunSynchronousCommand wcm:action="add">
<Order>30</Order>
<Path>reg.exe load "HKU\DefaultUser" "C:\Users\Default\NTUSER.DAT"</Path>
</RunSynchronousCommand>
<RunSynchronousCommand wcm:action="add">
<Order>31</Order>
<Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "ContentDeliveryAllowed" /t REG_DWORD /d 0 /f</Path>
</RunSynchronousCommand>
<RunSynchronousCommand wcm:action="add">
<Order>32</Order>
<Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "FeatureManagementEnabled" /t REG_DWORD /d 0 /f</Path>
</RunSynchronousCommand>
<RunSynchronousCommand wcm:action="add">
<Order>33</Order>
<Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "OEMPreInstalledAppsEnabled" /t REG_DWORD /d 0 /f</Path>
</RunSynchronousCommand>
<RunSynchronousCommand wcm:action="add">
<Order>34</Order>
<Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "PreInstalledAppsEnabled" /t REG_DWORD /d 0 /f</Path>
</RunSynchronousCommand>
<RunSynchronousCommand wcm:action="add">
<Order>35</Order>
<Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "PreInstalledAppsEverEnabled" /t REG_DWORD /d 0 /f</Path>
</RunSynchronousCommand>
<RunSynchronousCommand wcm:action="add">
<Order>36</Order>
<Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SilentInstalledAppsEnabled" /t REG_DWORD /d 0 /f</Path>
</RunSynchronousCommand>
<RunSynchronousCommand wcm:action="add">
<Order>37</Order>
<Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SoftLandingEnabled" /t REG_DWORD /d 0 /f</Path>
</RunSynchronousCommand>
<RunSynchronousCommand wcm:action="add">
<Order>38</Order>
<Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SubscribedContentEnabled" /t REG_DWORD /d 0 /f</Path>
</RunSynchronousCommand>
<RunSynchronousCommand wcm:action="add">
<Order>39</Order>
<Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SubscribedContent-310093Enabled" /t REG_DWORD /d 0 /f</Path>
</RunSynchronousCommand>
<RunSynchronousCommand wcm:action="add">
<Order>40</Order>
<Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SubscribedContent-338387Enabled" /t REG_DWORD /d 0 /f</Path>
</RunSynchronousCommand>
<RunSynchronousCommand wcm:action="add">
<Order>41</Order>
<Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SubscribedContent-338388Enabled" /t REG_DWORD /d 0 /f</Path>
</RunSynchronousCommand>
<RunSynchronousCommand wcm:action="add">
<Order>42</Order>
<Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SubscribedContent-338389Enabled" /t REG_DWORD /d 0 /f</Path>
</RunSynchronousCommand>
<RunSynchronousCommand wcm:action="add">
<Order>43</Order>
<Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SubscribedContent-338393Enabled" /t REG_DWORD /d 0 /f</Path>
</RunSynchronousCommand>
<RunSynchronousCommand wcm:action="add">
<Order>44</Order>
<Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SubscribedContent-353698Enabled" /t REG_DWORD /d 0 /f</Path>
</RunSynchronousCommand>
<RunSynchronousCommand wcm:action="add">
<Order>45</Order>
<Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SystemPaneSuggestionsEnabled" /t REG_DWORD /d 0 /f</Path>
</RunSynchronousCommand>
<RunSynchronousCommand wcm:action="add">
<Order>46</Order>
<Path>reg.exe unload "HKU\DefaultUser"</Path>
</RunSynchronousCommand>
<RunSynchronousCommand wcm:action="add">
<Order>47</Order>
<Path>reg.exe add "HKLM\Software\Policies\Microsoft\Windows\CloudContent" /v "DisableWindowsConsumerFeatures" /t REG_DWORD /d 0 /f</Path>
</RunSynchronousCommand>
<RunSynchronousCommand wcm:action="add">
<Order>48</Order>
<Path>reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\BitLocker" /v "PreventDeviceEncryption" /t REG_DWORD /d 1 /f</Path>
</RunSynchronousCommand>
<RunSynchronousCommand wcm:action="add">
<Order>49</Order>
<Path>reg.exe load "HKU\DefaultUser" "C:\Users\Default\NTUSER.DAT"</Path>
</RunSynchronousCommand>
<RunSynchronousCommand wcm:action="add">
<Order>50</Order>
<Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\Runonce" /v "ClassicContextMenu" /t REG_SZ /d "reg.exe add \"HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32\" /ve /f" /f</Path>
</RunSynchronousCommand>
<RunSynchronousCommand wcm:action="add">
<Order>51</Order>
<Path>reg.exe unload "HKU\DefaultUser"</Path>
</RunSynchronousCommand>
</RunSynchronous>
</component>
</settings>
<settings pass="auditSystem"></settings>
<settings pass="auditUser"></settings>
<settings pass="oobeSystem">
<component name="Microsoft-Windows-International-Core" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
<InputLocale>0409:00000409</InputLocale>
<SystemLocale>en-US</SystemLocale>
<UILanguage>en-US</UILanguage>
<UserLocale>en-US</UserLocale>
</component>
<component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
<UserAccounts>
<LocalAccounts>
<LocalAccount wcm:action="add">
<Name>User</Name>
<Group>Administrators</Group>
<Password>
<Value></Value>
<PlainText>true</PlainText>
</Password>
</LocalAccount>
</LocalAccounts>
</UserAccounts>
<AutoLogon>
<Username>User</Username>
<Enabled>true</Enabled>
<LogonCount>1</LogonCount>
<Password>
<Value></Value>
<PlainText>true</PlainText>
</Password>
</AutoLogon>
<OOBE>
<ProtectYourPC>3</ProtectYourPC>
<HideEULAPage>true</HideEULAPage>
<HideWirelessSetupInOOBE>true</HideWirelessSetupInOOBE>
</OOBE>
<FirstLogonCommands>
<SynchronousCommand wcm:action="add">
<Order>1</Order>
<CommandLine>reg.exe add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v AutoLogonCount /t REG_DWORD /d 0 /f</CommandLine>
</SynchronousCommand>
</FirstLogonCommands>
</component>
</settings>
<Extensions xmlns="https://schneegans.de/windows/unattend-generator/">
<ExtractScript>
param(
[xml]$Document
);
$scriptsDir = 'C:\Windows\Setup\Scripts\';
foreach( $file in $Document.unattend.Extensions.File ) {
$path = [System.Environment]::ExpandEnvironmentVariables(
$file.GetAttribute( 'path' )
);
if( $path.StartsWith( $scriptsDir ) ) {
mkdir -Path $scriptsDir -ErrorAction 'SilentlyContinue';
}
$encoding = switch( [System.IO.Path]::GetExtension( $path ) ) {
{ $_ -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( $path, ( $encoding.GetPreamble() + $encoding.GetBytes( $file.InnerText.Trim() ) ) );
}
</ExtractScript>
<File path="C:\Windows\Temp\Microwin-RemovePackages.ps1">
$selectors = @(
'Microsoft.Microsoft3DViewer';
'Microsoft.BingSearch';
'Microsoft.WindowsCamera';
'Clipchamp.Clipchamp';
'Microsoft.WindowsAlarms';
'Microsoft.549981C3F5F10';
'Microsoft.Windows.DevHome';
'MicrosoftCorporationII.MicrosoftFamily';
'Microsoft.WindowsFeedbackHub';
'Microsoft.GetHelp';
'Microsoft.Getstarted';
'microsoft.windowscommunicationsapps';
'Microsoft.WindowsMaps';
'Microsoft.BingNews';
'Microsoft.WindowsNotepad';
'Microsoft.MicrosoftOfficeHub';
'Microsoft.Office.OneNote';
'Microsoft.OutlookForWindows';
'Microsoft.MSPaint';
'Microsoft.People';
'Microsoft.PowerAutomateDesktop';
'MicrosoftCorporationII.QuickAssist';
'Microsoft.SkypeApp';
'Microsoft.MicrosoftSolitaireCollection';
'Microsoft.MicrosoftStickyNotes';
'MSTeams';
'Microsoft.Todos';
'Microsoft.WindowsSoundRecorder';
'Microsoft.BingWeather';
'Microsoft.ZuneMusic';
'Microsoft.ZuneVideo';
);
$getCommand = { Get-AppxProvisionedPackage -Online; };
$filterCommand = { $_.DisplayName -eq $selector; };
$removeCommand = {
[CmdletBinding()]
param(
[Parameter( Mandatory, ValueFromPipeline )]
$InputObject
);
process {
$InputObject | Remove-AppxProvisionedPackage -AllUsers -Online -ErrorAction 'Continue';
}
};
$type = 'Package';
$logfile = 'C:\Windows\Temp\Microwin-RemovePackages.log';
&amp; {
$installed = &amp; $getCommand;
foreach( $selector in $selectors ) {
$result = [ordered] @{
Selector = $selector;
};
$found = $installed | Where-Object -FilterScript $filterCommand;
if( $found ) {
$result.Output = $found | &amp; $removeCommand;
if( $? ) {
$result.Message = "$type removed.";
} else {
$result.Message = "$type not removed.";
$result.Error = $Error[0];
}
} else {
$result.Message = "$type not installed.";
}
$result | ConvertTo-Json -Depth 3 -Compress;
}
} *&gt;&amp;1 &gt;&gt; $logfile;
</File>
<File path="C:\Windows\Temp\remove-caps.ps1">
$selectors = @(
'Browser.InternetExplorer';
'MathRecognizer';
'OpenSSH.Client';
'App.Support.QuickAssist';
'App.StepsRecorder';
'Media.WindowsMediaPlayer';
'Microsoft.Windows.WordPad';
);
$getCommand = { Get-WindowsCapability -Online; };
$filterCommand = { ($_.Name -split '~')[0] -eq $selector; };
$removeCommand = {
[CmdletBinding()]
param(
[Parameter( Mandatory, ValueFromPipeline )]
$InputObject
);
process {
$InputObject | Remove-WindowsCapability -Online -ErrorAction 'Continue';
}
};
$type = 'Capability';
$logfile = 'C:\Windows\Temp\remove-caps.log';
&amp; {
$installed = &amp; $getCommand;
foreach( $selector in $selectors ) {
$result = [ordered] @{
Selector = $selector;
};
$found = $installed | Where-Object -FilterScript $filterCommand;
if( $found ) {
$result.Output = $found | &amp; $removeCommand;
if( $? ) {
$result.Message = "$type removed.";
} else {
$result.Message = "$type not removed.";
$result.Error = $Error[0];
}
} else {
$result.Message = "$type not installed.";
}
$result | ConvertTo-Json -Depth 3 -Compress;
}
} *&gt;&amp;1 &gt;&gt; $logfile;
</File>
<File path="C:\Users\Default\AppData\Local\Microsoft\Windows\Shell\LayoutModification.xml"><![CDATA[
<LayoutModificationTemplate Version="1" xmlns="http://schemas.microsoft.com/Start/2014/LayoutModification">
<LayoutOptions StartTileGroupCellWidth="6" />
<DefaultLayoutOverride>
<StartLayoutCollection>
<StartLayout GroupCellWidth="6" xmlns="http://schemas.microsoft.com/Start/2014/FullDefaultLayout" />
</StartLayoutCollection>
</DefaultLayoutOverride>
</LayoutModificationTemplate>
]]></File>
</Extensions>
</unattend>
+18 -26
View File
@@ -1,68 +1,60 @@
{
"Google":{
"BenchmarkEligible": true,
"Primary": "8.8.8.8",
"Secondary": "8.8.4.4",
"Primary6": "2001:4860:4860::8888",
"Secondary6": "2001:4860:4860::8844"
"Secondary6": "2001:4860:4860::8844",
"DohTemplate": "https://dns.google/dns-query"
},
"Cloudflare":{
"BenchmarkEligible": true,
"Primary": "1.1.1.1",
"Secondary": "1.0.0.1",
"Primary6": "2606:4700:4700::1111",
"Secondary6": "2606:4700:4700::1001"
"Secondary6": "2606:4700:4700::1001",
"DohTemplate": "https://cloudflare-dns.com/dns-query"
},
"Cloudflare_Malware":{
"Primary": "1.1.1.2",
"Secondary": "1.0.0.2",
"Primary6": "2606:4700:4700::1112",
"Secondary6": "2606:4700:4700::1002"
"Secondary6": "2606:4700:4700::1002",
"DohTemplate": "https://security.cloudflare-dns.com/dns-query"
},
"Cloudflare_Malware_Adult":{
"Primary": "1.1.1.3",
"Secondary": "1.0.0.3",
"Primary6": "2606:4700:4700::1113",
"Secondary6": "2606:4700:4700::1003"
"Secondary6": "2606:4700:4700::1003",
"DohTemplate": "https://family.cloudflare-dns.com/dns-query"
},
"Open_DNS":{
"Primary": "208.67.222.222",
"Secondary": "208.67.220.220",
"Primary6": "2620:119:35::35",
"Secondary6": "2620:119:53::53"
"Secondary6": "2620:119:53::53",
"DohTemplate": "https://doh.opendns.com/dns-query"
},
"Quad9":{
"Primary": "9.9.9.9",
"Secondary": "149.112.112.112",
"Primary6": "2620:fe::fe",
"Secondary6": "2620:fe::9"
"Secondary6": "2620:fe::9",
"DohTemplate": "https://dns.quad9.net/dns-query"
},
"AdGuard_Ads_Trackers":{
"Primary": "94.140.14.14",
"Secondary": "94.140.15.15",
"Primary6": "2a10:50c0::ad1:ff",
"Secondary6": "2a10:50c0::ad2:ff"
"Secondary6": "2a10:50c0::ad2:ff",
"DohTemplate": "https://dns.adguard-dns.com/dns-query"
},
"AdGuard_Ads_Trackers_Malware_Adult":{
"Primary": "94.140.14.15",
"Secondary": "94.140.15.16",
"Primary6": "2a10:50c0::bad1:ff",
"Secondary6": "2a10:50c0::bad2:ff"
},
"dns0.eu_Open":{
"Primary": "193.110.81.254",
"Secondary": "185.253.5.254",
"Primary6": "2a0f:fc80::ffff",
"Secondary6": "2a0f:fc81::ffff"
},
"dns0.eu_ZERO":{
"Primary": "193.110.81.9",
"Secondary": "185.253.5.9",
"Primary6": "2a0f:fc80::9",
"Secondary6": "2a0f:fc81::9"
},
"dns0.eu_KIDS":{
"Primary": "193.110.81.1",
"Secondary": "185.253.5.1",
"Primary6": "2a0f:fc80::1",
"Secondary6": "2a0f:fc81::1"
"Secondary6": "2a10:50c0::bad2:ff",
"DohTemplate": "https://family.adguard-dns.com/dns-query"
}
}
+165 -144
View File
@@ -1,44 +1,41 @@
{
"WPFFeaturesdotnet": {
"Content": "All .Net Framework (2,3,4)",
"Content": ".NET Framework (Versions 2, 3, 4) - Enable",
"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"
],
"InvokeScript": [],
"link": "https://winutil.christitus.com/dev/features/features/dotnet"
"link": "https://winutil.christitus.com/code-reference/features/features/dotnet"
},
"WPFFixesNTPPool": {
"Content": "NTP Server - Enable",
"Description": "Replaces the default Windows NTP server (time.windows.com) with pool.ntp.org for improved time synchronization accuracy and reliability.",
"category": "Fixes",
"panel": "1",
"Type": "Button",
"ButtonWidth": "300",
"function": "Invoke-WPFFixesNTPPool",
"link": "https://winutil.christitus.com/code-reference/features/fixes/ntppool"
},
"WPFFeatureshyperv": {
"Content": "HyperV Virtualization",
"Content": "Hyper-V - Enable",
"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": [
"HypervisorPlatform",
"Microsoft-Hyper-V-All",
"Microsoft-Hyper-V",
"Microsoft-Hyper-V-Tools-All",
"Microsoft-Hyper-V-Management-PowerShell",
"Microsoft-Hyper-V-Hypervisor",
"Microsoft-Hyper-V-Services",
"Microsoft-Hyper-V-Management-Clients"
"Microsoft-Hyper-V-All"
],
"InvokeScript": [
"Start-Process -FilePath cmd.exe -ArgumentList '/c bcdedit /set hypervisorschedulertype classic' -Wait"
],
"link": "https://winutil.christitus.com/dev/features/features/hyperv"
"link": "https://winutil.christitus.com/code-reference/features/features/hyperv"
},
"WPFFeatureslegacymedia": {
"Content": "Legacy Media (WMP, DirectPlay)",
"Description": "Enables legacy programs from previous versions of windows",
"Content": "Legacy Media Components (WMP, DirectPlay) - Enable",
"Description": "Enables legacy programs from previous versions of Windows.",
"category": "Features",
"panel": "1",
"Order": "a012_",
"feature": [
"WindowsMediaPlayer",
"MediaPlayback",
@@ -46,27 +43,25 @@
"LegacyComponents"
],
"InvokeScript": [],
"link": "https://winutil.christitus.com/dev/features/features/legacymedia"
"link": "https://winutil.christitus.com/code-reference/features/features/legacymedia"
},
"WPFFeaturewsl": {
"Content": "Windows Subsystem for Linux",
"Content": "Windows Subsystem for Linux (WSL) - Enable",
"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"
],
"InvokeScript": [],
"link": "https://winutil.christitus.com/dev/features/features/wsl"
"link": "https://winutil.christitus.com/code-reference/features/features/wsl"
},
"WPFFeaturenfs": {
"Content": "NFS - Network File System",
"Content": "Network File System (NFS) - Enable",
"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",
@@ -79,50 +74,13 @@
"nfsadmin client start",
"nfsadmin client localhost config fileaccess=755 SecFlavors=+sys -krb5 -krb5i"
],
"link": "https://winutil.christitus.com/dev/features/features/nfs"
},
"WPFFeatureEnableSearchSuggestions": {
"Content": "Enable Search Box Web Suggestions in Registry(explorer restart)",
"Description": "Enables web suggestions when searching using Windows Search.",
"category": "Features",
"panel": "1",
"Order": "a015_",
"feature": [],
"InvokeScript": [
"
If (!(Test-Path 'HKCU:\\SOFTWARE\\Policies\\Microsoft\\Windows\\Explorer')) {
New-Item -Path 'HKCU:\\SOFTWARE\\Policies\\Microsoft\\Windows\\Explorer' -Force | Out-Null
}
New-ItemProperty -Path 'HKCU:\\SOFTWARE\\Policies\\Microsoft\\Windows\\Explorer' -Name 'DisableSearchBoxSuggestions' -Type DWord -Value 0 -Force
Stop-Process -name explorer -force
"
],
"link": "https://winutil.christitus.com/dev/features/features/enablesearchsuggestions"
},
"WPFFeatureDisableSearchSuggestions": {
"Content": "Disable Search Box Web Suggestions in Registry(explorer restart)",
"Description": "Disables web suggestions when searching using Windows Search.",
"category": "Features",
"panel": "1",
"Order": "a016_",
"feature": [],
"InvokeScript": [
"
If (!(Test-Path 'HKCU:\\SOFTWARE\\Policies\\Microsoft\\Windows\\Explorer')) {
New-Item -Path 'HKCU:\\SOFTWARE\\Policies\\Microsoft\\Windows\\Explorer' -Force | Out-Null
}
New-ItemProperty -Path 'HKCU:\\SOFTWARE\\Policies\\Microsoft\\Windows\\Explorer' -Name 'DisableSearchBoxSuggestions' -Type DWord -Value 1 -Force
Stop-Process -name explorer -force
"
],
"link": "https://winutil.christitus.com/dev/features/features/disablesearchsuggestions"
"link": "https://winutil.christitus.com/code-reference/features/features/nfs"
},
"WPFFeatureRegBackup": {
"Content": "Enable Daily Registry Backup Task 12.30am",
"Content": "Registry Backup (Daily Task 12:30am) - Enable",
"Description": "Enables daily registry backup, previously disabled by Microsoft in Windows 10 1803.",
"category": "Features",
"panel": "1",
"Order": "a017_",
"feature": [],
"InvokeScript": [
"
@@ -133,122 +91,93 @@
Register-ScheduledTask -Action $action -Trigger $trigger -TaskName 'AutoRegBackup' -Description 'Create System Registry Backups' -User 'System'
"
],
"link": "https://winutil.christitus.com/dev/features/features/regbackup"
"link": "https://winutil.christitus.com/code-reference/features/features/regbackup"
},
"WPFFeatureEnableLegacyRecovery": {
"Content": "Enable Legacy F8 Boot Recovery",
"Content": "Legacy F8 Boot Recovery - Enable",
"Description": "Enables Advanced Boot Options screen that lets you start Windows in advanced troubleshooting modes.",
"category": "Features",
"panel": "1",
"Order": "a018_",
"feature": [],
"InvokeScript": [
"
If (!(Test-Path 'HKLM:\\SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Configuration Manager\\LastKnownGood')) {
New-Item -Path 'HKLM:\\SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Configuration Manager\\LastKnownGood' -Force | Out-Null
}
New-ItemProperty -Path 'HKLM:\\SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Configuration Manager\\LastKnownGood' -Name 'Enabled' -Type DWord -Value 1 -Force
Start-Process -FilePath cmd.exe -ArgumentList '/c bcdedit /Set {Current} BootMenuPolicy Legacy' -Wait
"
"bcdedit /set bootmenupolicy legacy"
],
"link": "https://winutil.christitus.com/dev/features/features/enablelegacyrecovery"
"link": "https://winutil.christitus.com/code-reference/features/features/enablelegacyrecovery"
},
"WPFFeatureDisableLegacyRecovery": {
"Content": "Disable Legacy F8 Boot Recovery",
"Content": "Legacy F8 Boot Recovery - Disable",
"Description": "Disables Advanced Boot Options screen that lets you start Windows in advanced troubleshooting modes.",
"category": "Features",
"panel": "1",
"Order": "a019_",
"feature": [],
"InvokeScript": [
"
If (!(Test-Path 'HKLM:\\SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Configuration Manager\\LastKnownGood')) {
New-Item -Path 'HKLM:\\SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Configuration Manager\\LastKnownGood' -Force | Out-Null
}
New-ItemProperty -Path 'HKLM:\\SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Configuration Manager\\LastKnownGood' -Name 'Enabled' -Type DWord -Value 0 -Force
Start-Process -FilePath cmd.exe -ArgumentList '/c bcdedit /Set {Current} BootMenuPolicy Standard' -Wait
"
"bcdedit /set bootmenupolicy standard"
],
"link": "https://winutil.christitus.com/dev/features/features/disablelegacyrecovery"
"link": "https://winutil.christitus.com/code-reference/features/features/disablelegacyrecovery"
},
"WPFFeaturesSandbox": {
"Content": "Windows Sandbox",
"Content": "Windows Sandbox - Enable",
"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_",
"Description": "Windows Sandbox is a lightweight virtual machine that provides a temporary desktop environment to safely run applications and programs in isolation.",
"link": "https://winutil.christitus.com/dev/features/features/sandbox"
"feature": [
"Containers-DisposableClientVM"
],
"link": "https://winutil.christitus.com/code-reference/features/features/sandbox"
},
"WPFFeatureInstall": {
"Content": "Install Features",
"category": "Features",
"panel": "1",
"Order": "a060_",
"Type": "Button",
"ButtonWidth": "300",
"link": "https://winutil.christitus.com/dev/features/features/install"
"function": "Invoke-WPFFeatureInstall",
"link": "https://winutil.christitus.com/code-reference/features/features/install"
},
"WPFPanelAutologin": {
"Content": "Set Up Autologin",
"Content": "AutoLogon - Run",
"category": "Fixes",
"Order": "a040_",
"panel": "1",
"Type": "Button",
"ButtonWidth": "300",
"link": "https://winutil.christitus.com/dev/features/fixes/autologin"
"function": "Invoke-WPFPanelAutologin",
"link": "https://winutil.christitus.com/code-reference/features/fixes/autologin"
},
"WPFFixesUpdate": {
"Content": "Reset Windows Update",
"Content": "Windows Update - Reset",
"category": "Fixes",
"panel": "1",
"Order": "a041_",
"Type": "Button",
"ButtonWidth": "300",
"link": "https://winutil.christitus.com/dev/features/fixes/update"
"function": "Invoke-WPFFixesUpdate",
"link": "https://winutil.christitus.com/code-reference/features/fixes/update"
},
"WPFFixesNetwork": {
"Content": "Reset Network",
"Content": "Network - Reset",
"category": "Fixes",
"Order": "a042_",
"panel": "1",
"Type": "Button",
"ButtonWidth": "300",
"link": "https://winutil.christitus.com/dev/features/fixes/network"
"function": "Invoke-WPFFixesNetwork",
"link": "https://winutil.christitus.com/code-reference/features/fixes/network"
},
"WPFPanelDISM": {
"Content": "System Corruption Scan",
"Content": "System Corruption Scan - Run",
"category": "Fixes",
"panel": "1",
"Order": "a043_",
"Type": "Button",
"ButtonWidth": "300",
"link": "https://winutil.christitus.com/dev/features/fixes/dism"
"function": "Invoke-WPFSystemRepair",
"link": "https://winutil.christitus.com/code-reference/features/fixes/dism"
},
"WPFFixesWinget": {
"Content": "WinGet Reinstall",
"Content": "WinGet - Reinstall",
"category": "Fixes",
"panel": "1",
"Order": "a044_",
"Type": "Button",
"ButtonWidth": "300",
"link": "https://winutil.christitus.com/dev/features/fixes/winget"
},
"WPFRunAdobeCCCleanerTool": {
"Content": "Remove Adobe Creative Cloud",
"category": "Fixes",
"panel": "1",
"Order": "a045_",
"Type": "Button",
"ButtonWidth": "300",
"link": "https://winutil.christitus.com/dev/features/fixes/runadobecccleanertool"
},
"WPFPanelControl": {
"Content": "Control Panel",
"category": "Legacy Windows Panels",
"panel": "2",
"Type": "Button",
"ButtonWidth": "300",
"link": "https://winutil.christitus.com/dev/features/legacy-windows-panels/control"
"function": "Invoke-WPFFixesWinget",
"link": "https://winutil.christitus.com/code-reference/features/fixes/winget"
},
"WPFPanelComputer": {
"Content": "Computer Management",
@@ -256,7 +185,32 @@
"panel": "2",
"Type": "Button",
"ButtonWidth": "300",
"link": "https://winutil.christitus.com/dev/features/legacy-windows-panels/computer"
"InvokeScript": [
"compmgmt.msc"
],
"link": "https://winutil.christitus.com/code-reference/features/legacy-windows-panels/computer"
},
"WPFPanelControl": {
"Content": "Control Panel",
"category": "Legacy Windows Panels",
"panel": "2",
"Type": "Button",
"ButtonWidth": "300",
"InvokeScript": [
"control"
],
"link": "https://winutil.christitus.com/code-reference/features/legacy-windows-panels/control"
},
"WPFPanelMouse": {
"Content": "Mouse Properties",
"category": "Legacy Windows Panels",
"panel": "2",
"Type": "Button",
"ButtonWidth": "300",
"InvokeScript": [
"main.cpl"
],
"link": "https://winutil.christitus.com/code-reference/features/legacy-windows-panels/mouse"
},
"WPFPanelNetwork": {
"Content": "Network Connections",
@@ -264,7 +218,10 @@
"panel": "2",
"Type": "Button",
"ButtonWidth": "300",
"link": "https://winutil.christitus.com/dev/features/legacy-windows-panels/network"
"InvokeScript": [
"ncpa.cpl"
],
"link": "https://winutil.christitus.com/code-reference/features/legacy-windows-panels/network"
},
"WPFPanelPower": {
"Content": "Power Panel",
@@ -272,7 +229,10 @@
"panel": "2",
"Type": "Button",
"ButtonWidth": "300",
"link": "https://winutil.christitus.com/dev/features/legacy-windows-panels/power"
"InvokeScript": [
"powercfg.cpl"
],
"link": "https://winutil.christitus.com/code-reference/features/legacy-windows-panels/power"
},
"WPFPanelPrinter": {
"Content": "Printer Panel",
@@ -280,7 +240,21 @@
"panel": "2",
"Type": "Button",
"ButtonWidth": "300",
"link": "https://winutil.christitus.com/dev/features/legacy-windows-panels/printer"
"InvokeScript": [
"Start-Process 'shell:::{A8A91A66-3A7D-4424-8D24-04E180695C7A}'"
],
"link": "https://winutil.christitus.com/code-reference/features/legacy-windows-panels/printer"
},
"WPFPanelPrograms": {
"Content": "Programs and Features",
"category": "Legacy Windows Panels",
"panel": "2",
"Type": "Button",
"ButtonWidth": "300",
"InvokeScript": [
"appwiz.cpl"
],
"link": "https://winutil.christitus.com/code-reference/features/legacy-windows-panels/programs"
},
"WPFPanelRegion": {
"Content": "Region",
@@ -288,7 +262,21 @@
"panel": "2",
"Type": "Button",
"ButtonWidth": "300",
"link": "https://winutil.christitus.com/dev/features/legacy-windows-panels/region"
"InvokeScript": [
"intl.cpl"
],
"link": "https://winutil.christitus.com/code-reference/features/legacy-windows-panels/region"
},
"WPFPanelSecurity": {
"Content": "Security and Maintenance",
"category": "Legacy Windows Panels",
"panel": "2",
"Type": "Button",
"ButtonWidth": "300",
"InvokeScript": [
"wscui.cpl"
],
"link": "https://winutil.christitus.com/code-reference/features/legacy-windows-panels/security"
},
"WPFPanelSound": {
"Content": "Sound Settings",
@@ -296,16 +284,21 @@
"panel": "2",
"Type": "Button",
"ButtonWidth": "300",
"link": "https://winutil.christitus.com/dev/features/legacy-windows-panels/user"
"InvokeScript": [
"mmsys.cpl"
],
"link": "https://winutil.christitus.com/code-reference/features/legacy-windows-panels/sound"
},
"WPFPanelSystem": {
"Content": "System Properties",
"category": "Legacy Windows Panels",
"panel": "2",
"Type": "Button",
"ButtonWidth": "300",
"link": "https://winutil.christitus.com/dev/features/legacy-windows-panels/system"
"InvokeScript": [
"sysdm.cpl"
],
"link": "https://winutil.christitus.com/code-reference/features/legacy-windows-panels/system"
},
"WPFPanelTimedate": {
"Content": "Time and Date",
@@ -313,30 +306,58 @@
"panel": "2",
"Type": "Button",
"ButtonWidth": "300",
"link": "https://winutil.christitus.com/dev/features/legacy-windows-panels/timedate"
"InvokeScript": [
"timedate.cpl"
],
"link": "https://winutil.christitus.com/code-reference/features/legacy-windows-panels/timedate"
},
"WPFPanelFirewall": {
"Content": "Windows Defender Firewall",
"category": "Legacy Windows Panels",
"panel": "2",
"Type": "Button",
"ButtonWidth": "300",
"InvokeScript": [
"firewall.cpl"
],
"link": "https://winutil.christitus.com/code-reference/features/legacy-windows-panels/firewall"
},
"WPFPanelRestore": {
"Content": "Windows Restore",
"category": "Legacy Windows Panels",
"panel": "2",
"Type": "Button",
"ButtonWidth": "300",
"InvokeScript": [
"rstrui.exe"
],
"link": "https://winutil.christitus.com/code-reference/features/legacy-windows-panels/restore"
},
"WPFWinUtilInstallPSProfile": {
"Content": "Install CTT PowerShell Profile",
"category": "Powershell Profile",
"Content": "CTT PowerShell Profile - Install",
"category": "Powershell Profile Powershell 7+ Only",
"panel": "2",
"Order": "a083_",
"Type": "Button",
"ButtonWidth": "300"
"ButtonWidth": "300",
"function": "Invoke-WinUtilInstallPSProfile",
"link": "https://winutil.christitus.com/code-reference/features/powershell-profile-powershell-7--only/installpsprofile"
},
"WPFWinUtilUninstallPSProfile": {
"Content": "Uninstall CTT PowerShell Profile",
"category": "Powershell Profile",
"Content": "CTT PowerShell Profile - Remove",
"category": "Powershell Profile Powershell 7+ Only",
"panel": "2",
"Order": "a084_",
"Type": "Button",
"ButtonWidth": "300"
"ButtonWidth": "300",
"function": "Invoke-WinUtilUninstallPSProfile",
"link": "https://winutil.christitus.com/code-reference/features/powershell-profile-powershell-7--only/uninstallpsprofile"
},
"WPFWinUtilSSHServer": {
"Content": "Enable OpenSSH Server",
"Content": "OpenSSH Server - Enable",
"category": "Remote Access",
"panel": "2",
"Order": "a084_",
"Type": "Button",
"ButtonWidth": "300"
"ButtonWidth": "300",
"function": "Invoke-WPFSSHServer",
"link": "https://winutil.christitus.com/code-reference/features/remote-access/sshserver"
}
}
+47 -12
View File
@@ -1,26 +1,61 @@
{
"Standard": [
"WPFTweaksAH",
"WPFTweaksActivity",
"WPFTweaksConsumerFeatures",
"WPFTweaksDisableExplorerAutoDiscovery",
"WPFTweaksDVR",
"WPFTweaksHome",
"WPFTweaksLoc",
"WPFTweaksWPBT",
"WPFTweaksLocation",
"WPFTweaksServices",
"WPFTweaksStorage",
"WPFTweaksTele",
"WPFTweaksWifi",
"WPFTweaksTelemetry",
"WPFTweaksDeliveryOptimization",
"WPFTweaksDiskCleanup",
"WPFTweaksDeleteTempFiles",
"WPFTweaksEndTaskOnTaskbar",
"WPFTweaksRestorePoint",
"WPFTweaksPowershell7Tele"
"WPFTweaksRestorePoint"
],
"Minimal": [
"WPFTweaksConsumerFeatures",
"WPFTweaksDisableExplorerAutoDiscovery",
"WPFTweaksHome",
"WPFTweaksWPBT",
"WPFTweaksServices",
"WPFTweaksTele"
"WPFTweaksTelemetry"
],
"Advanced": [
"WPFTweaksRestorePoint",
"WPFTweaksActivity",
"WPFTweaksConsumerFeatures",
"WPFTweaksDisableExplorerAutoDiscovery",
"WPFTweaksWPBT",
"WPFTweaksLocation",
"WPFTweaksServices",
"WPFTweaksTelemetry",
"WPFTweaksDeliveryOptimization",
"WPFTweaksDeleteTempFiles",
"WPFTweaksEndTaskOnTaskbar",
"WPFTweaksDisableStoreSearch",
"WPFTweaksRevertStartMenu",
"WPFTweaksWidget",
"WPFTweaksRemoveOneDrive",
"WPFTweaksWindowsAI",
"WPFTweaksRightClickMenu"
],
"AppxDefault": [
"WPFAppxMicrosoft_WindowsFeedbackHub",
"WPFAppxMicrosoft_GetHelp",
"WPFAppxMicrosoft_MicrosoftOfficeHub",
"WPFAppxMicrosoft_WindowsCalculator",
"WPFAppxClipchamp_Clipchamp",
"WPFAppxMicrosoft_WindowsAlarms",
"WPFAppxMicrosoftCorporationII_QuickAssist",
"WPFAppxMicrosoft_WindowsSoundRecorder",
"WPFAppxMicrosoft_MicrosoftStickyNotes",
"WPFAppxMicrosoft_Todos",
"WPFAppxMicrosoft_MicrosoftSolitaireCollection",
"WPFAppxMicrosoft_PowerAutomateDesktop",
"WPFAppxMicrosoft_WindowsDevHome",
"WPFAppxMicrosoft_BingWeather",
"WPFAppxMicrosoft_StartExperiencesApp",
"WPFAppxMicrosoft_BingNews",
"WPFAppxMicrosoft_Copilot",
"WPFAppxMicrosoft_BingSearch"
]
}
+130 -125
View File
@@ -1,127 +1,132 @@
{
"shared":{
"AppEntryWidth": "130",
"AppEntryFontSize": "11",
"AppEntryMargin": "1,1,1,1",
"AppEntryBorderTickness": "0",
"CustomDialogFontSize": "12",
"CustomDialogFontSizeHeader": "14",
"CustomDialogLogoSize": "25",
"CustomDialogWidth": "400",
"CustomDialogHeight": "200",
"FontSize": "12",
"FontFamily": "Arial",
"HeaderFontSize": "16",
"HeaderFontFamily": "Consolas, Monaco",
"CheckBoxBulletDecoratorSize": "14",
"CheckBoxMargin": "15,0,0,2",
"TabContentMargin": "5",
"TabButtonFontSize": "14",
"TabButtonWidth": "110",
"TabButtonHeight": "26",
"TabRowHeightInPixels": "50",
"ToolTipWidth": "300",
"IconFontSize": "14",
"IconButtonSize": "35",
"SettingsIconFontSize": "18",
"CloseIconFontSize": "18",
"MicroWinLogoSize": "10",
"MicrowinCheckBoxMargin": "-10,5,0,0",
"GroupBorderBackgroundColor": "#232629",
"ButtonFontSize": "12",
"ButtonFontFamily": "Arial",
"ButtonWidth": "200",
"ButtonHeight": "25",
"ConfigTabButtonFontSize": "14",
"ConfigUpdateButtonFontSize": "14",
"SearchBarWidth": "200",
"SearchBarHeight": "26",
"SearchBarTextBoxFontSize": "12",
"SearchBarClearButtonFontSize": "14",
"CheckboxMouseOverColor": "#999999",
"ButtonBorderThickness": "1",
"ButtonMargin": "1",
"ButtonCornerRadius": "2"
},
"Light": {
"AppInstallUnselectedColor": "#F7F7F7",
"AppInstallHighlightedColor": "#CFCFCF",
"AppInstallSelectedColor": "#C2C2C2",
"AppInstallOverlayBackgroundColor":"#6A6D72",
"ComboBoxForegroundColor": "#232629",
"ComboBoxBackgroundColor": "#F7F7F7",
"LabelboxForegroundColor": "#232629",
"MainForegroundColor": "#232629",
"MainBackgroundColor": "#F7F7F7",
"LabelBackgroundColor": "#F7F7F7",
"LinkForegroundColor": "#484848",
"LinkHoverForegroundColor": "#232629",
"ScrollBarBackgroundColor": "#4A4D52",
"ScrollBarHoverColor": "#5A5D62",
"ScrollBarDraggingColor": "#6A6D72",
"MicrowinBusyColor": "#2e77ff",
"ProgressBarForegroundColor": "#2e77ff",
"ProgressBarBackgroundColor": "Transparent",
"ProgressBarTextColor": "#232629",
"ButtonInstallBackgroundColor": "#F7F7F7",
"ButtonTweaksBackgroundColor": "#F7F7F7",
"ButtonConfigBackgroundColor": "#F7F7F7",
"ButtonUpdatesBackgroundColor": "#F7F7F7",
"ButtonInstallForegroundColor": "#232629",
"ButtonTweaksForegroundColor": "#232629",
"ButtonConfigForegroundColor": "#232629",
"ButtonUpdatesForegroundColor": "#232629",
"ButtonBackgroundColor": "#F5F5F5",
"ButtonBackgroundPressedColor": "#1A1A1A",
"ButtonBackgroundMouseoverColor": "#C2C2C2",
"ButtonBackgroundSelectedColor": "#F0F0F0",
"ButtonForegroundColor": "#232629",
"ToggleButtonOnColor": "#2e77ff",
"ToggleButtonOffColor": "#707070",
"ToolTipBackgroundColor": "#F7F7F7",
"BorderColor": "#232629",
"BorderOpacity": "0.2"
},
"Dark": {
"AppInstallUnselectedColor": "#232629",
"AppInstallHighlightedColor": "#3C3C3C",
"AppInstallSelectedColor": "#4C4C4C",
"AppInstallOverlayBackgroundColor":"#2E3135",
"ComboBoxForegroundColor": "#F7F7F7",
"ComboBoxBackgroundColor": "#1E3747",
"LabelboxForegroundColor": "#0567ff",
"MainForegroundColor": "#F7F7F7",
"MainBackgroundColor": "#232629",
"LabelBackgroundColor": "#232629",
"LinkForegroundColor": "#add8e6",
"LinkHoverForegroundColor": "#F7F7F7",
"ScrollBarBackgroundColor": "#2E3135",
"ScrollBarHoverColor": "#3B4252",
"ScrollBarDraggingColor": "#5E81AC",
"MicrowinBusyColor": "#2e77ff",
"ProgressBarForegroundColor": "#222222",
"ProgressBarBackgroundColor": "Transparent",
"ProgressBarTextColor": "#232629",
"ButtonInstallBackgroundColor": "#222222",
"ButtonTweaksBackgroundColor": "#333333",
"ButtonConfigBackgroundColor": "#444444",
"ButtonUpdatesBackgroundColor": "#555555",
"ButtonInstallForegroundColor": "#F7F7F7",
"ButtonTweaksForegroundColor": "#F7F7F7",
"ButtonConfigForegroundColor": "#F7F7F7",
"ButtonUpdatesForegroundColor": "#F7F7F7",
"ButtonBackgroundColor": "#1E3747",
"ButtonBackgroundPressedColor": "#F7F7F7",
"ButtonBackgroundMouseoverColor": "#3B4252",
"ButtonBackgroundSelectedColor": "#5E81AC",
"ButtonForegroundColor": "#F7F7F7",
"ToggleButtonOnColor": "#2e77ff",
"ToggleButtonOffColor": "#707070",
"ToolTipBackgroundColor": "#2F373D",
"BorderColor": "#2F373D",
"BorderOpacity": "0.2"
}
"shared": {
"AppEntryWidth": "220",
"AppEntryFontSize": "13.2",
"AppEntryIconSize": "28",
"AppEntryMargin": "3",
"AppEntryBorderThickness": "1",
"CustomDialogFontSize": "12",
"CustomDialogFontSizeHeader": "14",
"CustomDialogLogoSize": "25",
"CustomDialogWidth": "400",
"CustomDialogHeight": "200",
"FontSize": "12",
"FontFamily": "Arial",
"HeaderFontSize": "16",
"Win11StepTitleFontSize": "22",
"Win11StepHeroFontSize": "40",
"Win11LogFontFamily": "Consolas, Monaco",
"HeaderFontFamily": "Consolas, Monaco",
"CheckBoxBulletDecoratorSize": "14",
"CheckBoxMargin": "15,0,0,2",
"TabContentMargin": "5",
"TabButtonFontSize": "14",
"TabButtonWidth": "110",
"TabButtonHeight": "26",
"TabRowHeightInPixels": "50",
"ToolTipWidth": "300",
"IconFontSize": "14",
"IconButtonSize": "35",
"SettingsIconFontSize": "18",
"CloseIconFontSize": "12",
"GroupBorderBackgroundColor": "#232629",
"ButtonFontSize": "12",
"ButtonFontFamily": "Arial",
"ButtonWidth": "200",
"ButtonHeight": "25",
"ConfigTabButtonFontSize": "14",
"ConfigUpdateButtonFontSize": "14",
"SearchBarWidth": "200",
"SearchBarHeight": "26",
"SearchBarTextBoxFontSize": "12",
"SearchBarClearButtonFontSize": "14",
"CheckboxMouseOverColor": "#999999",
"ButtonBorderThickness": "1",
"ButtonMargin": "1",
"ButtonCornerRadius": "2"
},
"Light": {
"AppInstallUnselectedColor": "#F7F7F7",
"AppInstallHighlightedColor": "#CFCFCF",
"AppInstallSelectedColor": "#C2C2C2",
"ComboBoxForegroundColor": "#232629",
"ComboBoxBackgroundColor": "#F7F7F7",
"LabelboxForegroundColor": "#232629",
"MainForegroundColor": "#232629",
"MainBackgroundColor": "#F7F7F7",
"LabelBackgroundColor": "#F7F7F7",
"LinkForegroundColor": "#484848",
"LinkHoverForegroundColor": "#232629",
"ScrollBarBackgroundColor": "#4A4D52",
"ScrollBarHoverColor": "#5A5D62",
"ScrollBarDraggingColor": "#6A6D72",
"ProgressBarForegroundColor": "#2E77FF",
"ProgressBarErrorColor": "#D13438",
"ProgressBarWarningColor": "#B36A00",
"ProgressBarBackgroundColor": "Transparent",
"ButtonInstallBackgroundColor": "#F7F7F7",
"ButtonTweaksBackgroundColor": "#F7F7F7",
"ButtonConfigBackgroundColor": "#F7F7F7",
"ButtonUpdatesBackgroundColor": "#F7F7F7",
"ButtonWin11ISOBackgroundColor": "#F7F7F7",
"ButtonAppxBackgroundColor": "#F7F7F7",
"ButtonInstallForegroundColor": "#232629",
"ButtonTweaksForegroundColor": "#232629",
"ButtonConfigForegroundColor": "#232629",
"ButtonUpdatesForegroundColor": "#232629",
"ButtonWin11ISOForegroundColor": "#232629",
"ButtonAppxForegroundColor": "#232629",
"ButtonBackgroundColor": "#F5F5F5",
"ButtonBackgroundPressedColor": "#1A1A1A",
"ButtonBackgroundMouseoverColor": "#C2C2C2",
"ButtonBackgroundSelectedColor": "#F0F0F0",
"ButtonForegroundColor": "#232629",
"ToggleButtonOnColor": "#2E77FF",
"ToggleButtonOffColor": "#707070",
"ToolTipBackgroundColor": "#F7F7F7",
"BorderColor": "#232629",
"BorderOpacity": "0.2"
},
"Dark": {
"AppInstallUnselectedColor": "#232629",
"AppInstallHighlightedColor": "#3C3C3C",
"AppInstallSelectedColor": "#4C4C4C",
"ComboBoxForegroundColor": "#F7F7F7",
"ComboBoxBackgroundColor": "#1E3747",
"LabelboxForegroundColor": "#5BDCFF",
"MainForegroundColor": "#F7F7F7",
"MainBackgroundColor": "#232629",
"LabelBackgroundColor": "#232629",
"LinkForegroundColor": "#ADD8E6",
"LinkHoverForegroundColor": "#F7F7F7",
"ScrollBarBackgroundColor": "#2E3135",
"ScrollBarHoverColor": "#3B4252",
"ScrollBarDraggingColor": "#5E81AC",
"ProgressBarForegroundColor": "#6EFF72",
"ProgressBarErrorColor": "#FF6B6B",
"ProgressBarWarningColor": "#FFC83D",
"ProgressBarBackgroundColor": "Transparent",
"ButtonInstallBackgroundColor": "#222222",
"ButtonTweaksBackgroundColor": "#333333",
"ButtonConfigBackgroundColor": "#444444",
"ButtonUpdatesBackgroundColor": "#555555",
"ButtonWin11ISOBackgroundColor": "#666666",
"ButtonAppxBackgroundColor": "#777777",
"ButtonInstallForegroundColor": "#F7F7F7",
"ButtonTweaksForegroundColor": "#F7F7F7",
"ButtonConfigForegroundColor": "#F7F7F7",
"ButtonUpdatesForegroundColor": "#F7F7F7",
"ButtonWin11ISOForegroundColor": "#F7F7F7",
"ButtonAppxForegroundColor": "#F7F7F7",
"ButtonBackgroundColor": "#1E3747",
"ButtonBackgroundPressedColor": "#F7F7F7",
"ButtonBackgroundMouseoverColor": "#3B4252",
"ButtonBackgroundSelectedColor": "#5E81AC",
"ButtonForegroundColor": "#F7F7F7",
"ToggleButtonOnColor": "#2E77FF",
"ToggleButtonOffColor": "#707070",
"ToolTipBackgroundColor": "#2F373D",
"BorderColor": "#2F373D",
"BorderOpacity": "0.2"
}
}
+1268 -3359
View File
File diff suppressed because it is too large Load Diff
+7
View File
@@ -0,0 +1,7 @@
node_modules
.astro
dist
.git
.env
.env.*
*.log
+23
View File
@@ -0,0 +1,23 @@
# build output
dist/
# generated types
.astro/
# dependencies
node_modules/
# logs
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
# environment variables
.env
.env.production
.env.local
.env.*.local
# macOS-specific files
.DS_Store
+16
View File
@@ -0,0 +1,16 @@
FROM node:22-bookworm-slim
RUN corepack enable
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN chown -R node:node /app
USER node
EXPOSE 4321
CMD ["npm", "run", "dev", "--", "--host", "0.0.0.0"]
+61
View File
@@ -0,0 +1,61 @@
# WinUtil Docs
[![Built with Starlight](https://astro.badg.es/v2/built-with-starlight/tiny.svg)](https://starlight.astro.build)
Documentation site for [WinUtil](https://github.com/ChrisTitusTech/winutil), built with [Astro](https://astro.build) and [Starlight](https://starlight.astro.build). Served at [winutil.christitus.com](https://winutil.christitus.com/).
## 🚀 Project Structure
```
.
├── public/
├── src/
│ ├── assets/
│ ├── components/
│ ├── content/
│ │ └── docs/
│ ├── styles/
│ └── content.config.ts
├── astro.config.mjs
├── docker-compose.yml
├── Dockerfile
├── package.json
└── tsconfig.json
```
Starlight looks for `.md` or `.mdx` files in the `src/content/docs/` directory. Each file is exposed as a route based on its file name.
Images can be added to `src/assets/` and embedded in Markdown with a relative link.
Static assets, like favicons, can be placed in the `public/` directory.
## 🧞 Commands
All commands run in a Docker container — there's no need to install Node or npm dependencies on your host. This is deliberate, not just convenience: npm/pnpm/yarn have seen a steady stream of supply-chain attacks (malicious `postinstall`/`preinstall` scripts, credential-stealing packages), so `npm install` and friends never run directly on a contributor's machine here. Note the container still has read-write access to this `docs/` directory (it's bind-mounted for live reload), so this only contains a compromised package to the project folder plus the container itself — it doesn't reach the rest of your host (SSH keys, other repos, cloud credentials elsewhere on disk). Don't keep real secrets in `docs/` as a result.
[Docker](https://www.docker.com/) (with Compose) is required — install Docker Desktop (or Docker Engine + the `docker compose` plugin on Linux) and make sure the daemon is running before using any of the commands below.
All commands are run from the `docs/` directory, from a terminal:
| Command | Action |
| :------------------------------------------------ | :----------------------------------------------- |
| `docker compose build` | Builds the dev image (needed after Dockerfile or dependency changes) |
| `docker compose up winutil-astro` | Starts local dev server at `localhost:4321` |
| `docker compose run --rm winutil-astro npm run build` | Build the production site to `./dist/` |
| `docker compose run --rm --service-ports winutil-astro npm run preview -- --host 0.0.0.0` | Preview the build locally, before deploying |
| `docker compose run --rm winutil-astro npm run astro ...` | Run CLI commands like `astro add`, `astro check` |
| `docker compose down` | Stop and remove the dev container |
Source files are bind-mounted into the container, so edits on the host are picked up immediately by the dev server — no rebuild needed for normal content or code changes. After changing `package.json`, `package-lock.json`, or the `Dockerfile`, rebuild the image *and* drop the `node_modules` volume, since Docker only seeds a named volume from the image the first time it's created — a plain rebuild leaves the old `node_modules` in place:
```sh
docker compose build
docker compose down -v
docker compose up winutil-astro
```
The first `docker compose up` (or any command before an image exists) builds the image and runs `npm install` from scratch, which can take a few minutes. Subsequent runs reuse the cached image and start almost immediately.
## 👀 Want to learn more?
Check out [Starlight's docs](https://starlight.astro.build/), read [the Astro documentation](https://docs.astro.build), or jump into the [Astro Discord server](https://astro.build/chat).
+77
View File
@@ -0,0 +1,77 @@
// @ts-check
import { defineConfig } from 'astro/config';
import starlight from '@astrojs/starlight';
import { siteLinks } from './src/site-links.ts';
// https://astro.build/config
export default defineConfig({
site: 'https://winutil.christitus.com/',
integrations: [
starlight({
title: 'WinUtil',
description: "Chris Titus Tech's Windows Utility — install apps, apply tweaks, run fixes, and manage Windows from one place.",
logo: {
src: './src/assets/branding/navlogo.png',
replacesTitle: true,
},
favicon: '/favicon.svg',
head: [
{ tag: 'meta', attrs: { property: 'og:image', content: 'https://winutil.christitus.com/social-preview.png' } },
{ tag: 'meta', attrs: { property: 'og:image:width', content: '1200' } },
{ tag: 'meta', attrs: { property: 'og:image:height', content: '630' } },
{ tag: 'meta', attrs: { name: 'twitter:image', content: 'https://winutil.christitus.com/social-preview.png' } },
],
social: [
{ icon: 'github', label: 'GitHub', href: 'https://github.com/ChrisTitusTech/winutil' },
{ icon: 'discord', label: 'Discord', href: 'https://discord.gg/RUbZUZyByQ' },
],
// Global theme overrides (colors, fonts, landing-page section styles).
customCss: ['./src/styles/theme.css'],
// Custom component overrides, all under src/components/.
components: {
ThemeProvider: './src/components/ThemeProvider.astro',
Header: './src/components/Header.astro',
Hero: './src/components/Hero.astro',
Footer: './src/components/Footer.astro',
},
editLink: {
baseUrl: 'https://github.com/ChrisTitusTech/winutil/edit/main/docs/',
},
// Sidebar groups, top to bottom: User Guide, Code Reference, Help.
sidebar: [
{
label: 'User Guide',
items: [
{ label: 'Overview', slug: 'guides' },
{ label: 'Getting Started', slug: 'guides/getting-started' },
{ label: 'Applications', slug: 'guides/application' },
{ label: 'Tweaks', slug: 'guides/tweaks' },
{ label: 'Features', slug: 'guides/features' },
{ label: 'Updates', slug: 'guides/updates' },
{ label: 'Automation', slug: 'guides/automation' },
{ label: 'Win11 Creator', slug: 'guides/win11creator' },
],
},
{
label: 'Code Reference',
items: [
{ label: 'Architecture & Design', slug: 'code-reference/architecture' },
{ label: 'Issue Triage Commands', slug: 'code-reference/issue-triage' },
{ label: 'Tweaks Reference', items: [{ autogenerate: { directory: 'code-reference/tweaks' } }] },
{ label: 'Features Reference', items: [{ autogenerate: { directory: 'code-reference/features' } }] },
],
},
{
label: 'Help',
items: [
{ label: 'FAQ', slug: 'faq' },
{ label: 'Known Issues', slug: 'knownissues' },
{ label: 'Contributing', slug: 'contributing' },
{ label: siteLinks.forums.label, link: siteLinks.forums.href, attrs: { target: '_blank', rel: 'noreferrer' } },
],
},
{ label: siteLinks.store.label, link: siteLinks.store.href, attrs: { target: '_blank', rel: 'noreferrer' } },
],
}),
],
});
+16
View File
@@ -0,0 +1,16 @@
services:
winutil-astro:
build: .
ports:
- "127.0.0.1:4321:4321"
volumes:
- .:/app
- astro_node_modules:/app/node_modules
tmpfs:
- /app/.astro
environment:
- CHOKIDAR_USEPOLLING=true
- ASTRO_TELEMETRY_DISABLED=1
volumes:
astro_node_modules:
+7221
View File
File diff suppressed because it is too large Load Diff
+19
View File
@@ -0,0 +1,19 @@
{
"name": "docs-astro",
"type": "module",
"version": "0.0.1",
"scripts": {
"dev": "astro dev",
"start": "astro dev",
"build": "astro build",
"preview": "astro preview",
"astro": "astro"
},
"dependencies": {
"@astrojs/starlight": "^0.41.5",
"@fontsource-variable/jetbrains-mono": "^5.3.0",
"@fontsource/geist-sans": "^5.3.0",
"astro": "^7.3.2",
"sharp": "^0.35.4"
}
}
+3
View File
@@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32">
<image href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAACMVJREFUWEeVVwtQVOcV/u69y0uWBJ9YETaA8vCx+AABLWqMiGLEx/jG2um0sR0F2hibGh9RSaeZTtVUE5tIM2lDodM4HRFQJGmgCKiIxEe0jkAiSEBkwxsWdt3dezvfei/ZoFb7z9zZ3bv3nvOd75zz/ecX8N0SAPCS1E8FgAMAP7Xl+t3l9iNfaUdb/C6qNnlPVi+nLdcHdQDcAXioIOwAbOpFIHyR62kgNJuaYzfVLu3z3gMAFgC0L2sPE6EXgOcBDAfgqTruBdAHYEB90RXIUDCPc0w73gB8AAxTg+gB0KnatWm0EyWdj0fkzkXovCWiMb8ZQAcAE4B2AHzxSUA0NhkIbdGxXg1mNIDR8BgzAlFvTsT51HwA9QDaaE+jibSPAhAmLMjZJgWtTnI0F99UqnadQ8e1OgBNAO67ACGFpJKMaM7pmHbo2BfAGAD+0OkDBeOOGHHyz2cLojvsH4/8JYAvVZt9GgAi9gMwVYjP3Kqb9Eqik19b/wNHQ94NpTrjHHpu16ovtapAmB4CYU3QOanWHI+D6GkQJv8iRpySNlvwCR4pCBCUgbZOe9bo3QCqANwlq0MBGIX441t1k7Yscq1rxdo74Lhz4rpyeX8ZBpq+cmGkW80r80uqx0HUGRD6kyjJuH2O4BvuR8eaLXnA1OHI8tsL4BKABgC9Q1MwSZy5f7M0c98GuLzoZEOBoljb++XanGrl6u8qYGklENYHO2U4IAYiZMMMcdqv48URRn9BFFw7zInB0X7jjvxPYwaAKwC+AWB2LULSFwyPUbHi8rLtkm/E+KEgBoH0t/bItX+tVKozKiD3W2FYES5Of+NFcUyUQRBEFuIjS7FbrPbybVmo/YhFeEsF7yxCTXyYw3EAIuA5coYw/c2FYuimqYLHCC9XGgcVSYFiP/1SAe6VfCulNK4R9QHPPdax7HDILWWNcvWBf+P+uQsAbqr0d5E9DQBRM4+s3GAAEwEEwMt/vDBzT6Q4cWOo6Pac+1BGbLk/LIPpfLcu5e4CQR/IAAaXosiyfL+yRb7y1nU0fVYHyOykrwEwdfeYf4qRKwNsnx/o9foISZJCu7u7CYjd4QX9C+PFmLdnSiHrv5cWW27cJZgq+3Qb62cLPi9QyJxL7qrrdVzccRWNp2sAmfrBbun18/Nrb21tvQagEQALeJAByiSFKDhiypR5qVtTd5WUfP7F6YKCW1arlUqoFwKWGHVLCue6smA7GXcZ3zoBxLoCcNRkNcilPy5W8yxNNRoDVq9eE9Xe1lZz9OiRIwBq1Fa2aAxwD6AEh4WFhSXs2buPvaqYTK1tO3/zeo7NZrMJgS8bdYsLFj0GQL9uY/2s7wGo+0edXLKhkHKbsmlzfEJCwhxJkqQLFy+UvH/svfdUIaKeDCohhWQkgEkTJkxYsm9/xnZSabVaH6Ru2/YXi6W/RzAsm6xLzF/yTAC++qRWLl5/hmqZnv5qUvSs6Km0V1FeVn78+AfHAFwF0OIKgAwQwGQVwK/4gsVisaWlbv2bxWLpEAzJEbrEvKT/E4CSlpa+eFZM7CTaKy87V5GZefx9VQdYiP2uW6YGIGnf/gxXAH+3WCxtgiE5/NkBnKiRi9edpdNtqemJsbGxEUMAfKF2wvdSMIIaEBQUtPhAxm9fEwRBVBk4YbFYWhG4LES3OC9ZEL5TOFtuXBVMleZHivDrT27Ln68nALfUtPRFMTGxoQRwrrS07MMPM/+kpoAMDBYha4BKGOrr67vg4MHDb3h4enrabDbH7l07C1paWhrgHThct+72BsHNi+lyLltuXCVMlb26lIY5gt7AtnVKtuP6Hy4pl16n6Pjs2rN3aUR4BAUOnxYVnc3OzvqzWoTcXQcBcAxjGwYBiD106J09Y/z8uDsqOdnZl4uKCkmZXZi2d4Y0Y2e04DbMCcKWF1+K+xUUooUUIoXq03qxWS5a9imsHWZvb++xBw8eTtb7+FAjlCNH/5hZXVV1CsB/1HnA6qqEVDJ/ANN/9sqWLfPmzZ9HJyaTqWfP7t1nBwbMHCAEDJ8ySozOMIqBS0PsRctOo+mzNinlm7Ww9T+Qr/3+ulL78R3AQeEZtmFjSkxS0tIpfK+rq6tzx2uvvm21WskMZwxK8aASEog2lIT7+/u/yEL08vJyIr9x80bTsXePXjCbzZyQrM4t2G+uNyytXeiu6UXYT8NQl90OmX+Boua9cGFCxMZNP4py0+n4Wyk6W/ivnJzsLABUQsqymRuk6xzHBzm7BQCIXLdu/fqlLy9LZDE+FCVTT37+qS/Ly8rrZNlBIIyAMsthVRtGnh8fEDBu7Zq1kcbIaQZJkpw7Y/O9e81vHdj3rtls5hzAvYAjHtEqrgA0FtiOwaIoGlPT0jdHRUVHaZWvKIrS3NzUXlCQf6Xy4sUaWZY5XHIs048dOy5g5aqV06OiooPd3d1Z1M6a7Ozs6Hzn8KGP6uvrzwO4rY52lHfnyD90fmcxknZON8Gim9vkTSmbkufPmx/v5uamGYUsy3JDQ4PpVO7Jm42Nd/tWrFgVGhsXF+Lp6ck0aku529BwNzPzgxONjY2X1byz9cga58lHzgV8kYCcOVSVkekICQ+PmL5y5aqXwsLDJ0iSxP8f7nqyLNtsdtnDw33wHg23t7d1lhQXVxQWnimz2+0sOM5/bDs6d1L/JAC0y7zRoHZOYDuyOwyRkdMik5evmBsSEhKk5dc14u7urp7S0tKqwjOnz/f3999Rxy5qPnPOomPkrJnBw80jc5tqkCCYDva7VmAPh04gYNasmGnJycvnBgQGBoiiKJrNfb3lZeXVeXm55/v6+uiYZwpGzGLVDjacHQcj14A/CYCWDo0N5pZKR7UkkLEcXhISEqcaDIFjT57MvdzR0cYhg9FyUKVjbWynY+2M+cix7n8B0EDwk2wwLRoQqibBcIrifzwxccJha7pG/ETHz8LA0Ge0nVM7xLJGmCKyxNyyuHhpET/TYfZpDDwOqAaEkWtHeTpjtEMjftpJGv8FiVSZj/q1694AAAAASUVORK5CYII=" width="32" height="32"/>
</svg>

After

Width:  |  Height:  |  Size: 3.2 KiB

+4
View File
@@ -0,0 +1,4 @@
User-agent: *
Allow: /
Sitemap: https://winutil.christitus.com/sitemap-index.xml
Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 171 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 194 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 193 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 193 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 193 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 193 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 193 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 193 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 193 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 149 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

+127
View File
@@ -0,0 +1,127 @@
---
// Feature card with small corner brackets instead of a shadow/colored border.
import { Icon } from '@astrojs/starlight/components';
import type { ComponentProps } from 'astro/types';
interface Props {
icon: ComponentProps<typeof Icon>['name'];
title: string;
}
const { icon, title } = Astro.props;
---
<div class="wu-corner-card">
{/* Corner brackets decoration. */}
<span class="wu-corner-marks" aria-hidden="true">
<span class="mark top-left" /><span class="mark top-right" /><span class="mark bottom-left" /><span
class="mark bottom-right"
/>
</span>
{/* Icon badge + heading + description. */}
<div class="wu-corner-card-icon">
<Icon name={icon} size="1.25rem" />
</div>
<h3><slot name="title">{title}</slot></h3>
<div class="wu-corner-card-desc"><slot /></div>
</div>
<style>
@layer starlight.core {
.wu-corner-card {
position: relative;
display: flex;
flex-direction: column;
gap: 0.75rem;
padding: 1.5rem;
border: 1px solid var(--sl-color-hairline-light);
background-color: var(--sl-color-bg);
}
/* Corner brackets decoration (four small L-shaped marks). */
.wu-corner-marks {
position: absolute;
inset: 0;
pointer-events: none;
opacity: 0.5;
}
.mark {
position: absolute;
background: var(--sl-color-gray-4);
}
.mark.top-left,
.mark.top-right {
top: -1px;
height: 1px;
width: 0.9rem;
}
.mark.bottom-left,
.mark.bottom-right {
bottom: -1px;
height: 1px;
width: 0.9rem;
}
.mark.top-left,
.mark.bottom-left {
left: -1px;
}
.mark.top-right,
.mark.bottom-right {
right: -1px;
}
.mark.top-left::after,
.mark.top-right::after,
.mark.bottom-left::after,
.mark.bottom-right::after {
content: '';
position: absolute;
background: var(--sl-color-gray-4);
width: 1px;
height: 0.9rem;
}
.mark.top-left::after,
.mark.top-right::after {
top: 0;
}
.mark.bottom-left::after,
.mark.bottom-right::after {
bottom: 0;
}
.mark.top-left::after,
.mark.bottom-left::after {
left: 0;
}
.mark.top-right::after,
.mark.bottom-right::after {
right: 0;
}
/* Icon badge + heading + description. */
.wu-corner-card-icon {
display: flex;
align-items: center;
justify-content: center;
width: 2.5rem;
height: 2.5rem;
border-radius: var(--wu-radius-sm);
background-color: var(--sl-color-gray-6);
color: var(--sl-color-accent);
}
.wu-corner-card h3 {
margin: 0;
font-size: var(--sl-text-lg);
font-weight: 600;
color: var(--sl-color-white);
}
.wu-corner-card-desc {
font-size: var(--sl-text-sm);
line-height: var(--sl-line-height);
color: var(--sl-color-gray-3);
}
.wu-corner-card-desc :global(p) {
margin: 0;
}
}
</style>
+90
View File
@@ -0,0 +1,90 @@
---
import EditLink from 'virtual:starlight/components/EditLink';
import LastUpdated from 'virtual:starlight/components/LastUpdated';
import Pagination from 'virtual:starlight/components/Pagination';
import config from 'virtual:starlight/user-config';
import { Icon } from '@astrojs/starlight/components';
const year = new Date().getFullYear();
---
<footer class="sl-flex">
{/* Edit link + last-updated timestamp, and prev/next pagination. */}
<div class="meta sl-flex">
<EditLink />
<LastUpdated />
</div>
<Pagination />
{/* "Built with Starlight" credit (only shown if Starlight's `credits` config is enabled). */}
{
config.credits && (
<a class="kudos sl-flex" href="https://starlight.astro.build">
<Icon name={'starlight'} /> {Astro.locals.t('builtWithStarlight.label')}
</a>
)
}
{/* Copyright line. */}
<div class="site-footer-copyright">© {year} <a href="https://christitus.com">Chris Titus Tech</a>. All rights reserved.</div>
</footer>
<style>
@layer starlight.core {
/* Footer layout: stacked meta row + pagination. */
footer {
flex-direction: column;
gap: 1.5rem;
}
.meta {
gap: 0.75rem 3rem;
justify-content: space-between;
flex-wrap: wrap;
margin-top: 3rem;
font-size: var(--sl-text-sm);
color: var(--sl-color-gray-3);
}
.meta > :global(p:only-child) {
margin-inline-start: auto;
}
/* "Built with Starlight" credit link. */
.kudos {
align-items: center;
gap: 0.5em;
margin: 1.5rem auto;
font-size: var(--sl-text-xs);
text-decoration: none;
color: var(--sl-color-gray-3);
}
.kudos:hover {
color: var(--sl-color-white);
}
}
@layer starlight.components {
.kudos :global(svg) {
color: var(--sl-color-orange);
}
}
/* Collapse the meta/pagination rows entirely when they have nothing in them (e.g. editUrl: false and no prev/next), instead of leaving an empty gap. */
footer .meta:empty,
footer :global(.pagination-links):empty {
display: none;
margin: 0;
}
/* Site-wide copyright line, matching the previous Hugo docs site's footer. The divider above it comes from Starlight's own .content-panel border. */
.site-footer-copyright {
font-size: var(--sl-text-xs);
color: var(--sl-color-gray-3);
}
.site-footer-copyright a {
color: inherit;
text-decoration: underline;
}
.site-footer-copyright a:hover {
color: var(--sl-color-white);
}
</style>
+331
View File
@@ -0,0 +1,331 @@
---
import config from 'virtual:starlight/user-config';
import LanguageSelect from 'virtual:starlight/components/LanguageSelect';
import Search from 'virtual:starlight/components/Search';
import SiteTitle from 'virtual:starlight/components/SiteTitle';
import SocialIcons from 'virtual:starlight/components/SocialIcons';
import ThemeSelect from 'virtual:starlight/components/ThemeSelect';
import { Icon } from '@astrojs/starlight/components';
import { siteLinks } from '../site-links';
// Render the `Search` component if Pagefind is enabled or the default search component has been overridden.
const shouldRenderSearch =
config.pagefind || config.components.Search !== '@astrojs/starlight/components/Search.astro';
// Pages with a sidebar already have Starlight's own mobile menu toggle; only splash pages need this one.
const { hasSidebar } = Astro.locals.starlightRoute;
---
<div class="header">
{/* Site title. */}
<div class="title-wrapper sl-flex">
<SiteTitle />
</div>
<div class="mobile-actions sl-flex">
{/* Search box. */}
<div class="sl-flex print:hidden">
{shouldRenderSearch && <Search />}
</div>
{
!hasSidebar && (
<div class="site-nav-toggle sl-flex md:sl-hidden print:hidden">
<button type="button" aria-expanded="false" aria-controls="site-nav-panel" aria-label="Site navigation">
<Icon name="bars" class="open-menu" />
<Icon name="close" class="close-menu" />
</button>
<div id="site-nav-panel" class="site-nav-panel">
<div class="site-nav-panel-group">
<p class="site-nav-panel-heading">Documentation</p>
<a href="/guides/">User Guides</a>
<a href="/contributing/">Contribution Guides</a>
<a href="/code-reference/architecture/">Code Reference</a>
</div>
<div class="site-nav-panel-group">
<p class="site-nav-panel-heading">Help</p>
<a href="/faq/">FAQ</a>
<a href="/knownissues/">Known Issues</a>
<a href={siteLinks.forums.href} target="_blank" rel="noreferrer">{siteLinks.forums.label}</a>
</div>
<a class="site-nav-panel-link" href={siteLinks.store.href} target="_blank" rel="noreferrer">{siteLinks.store.label}</a>
</div>
</div>
)
}
</div>
{/* Right-side group: nav links, social icons, theme/language pickers. */}
<div class="sl-hidden md:sl-flex print:hidden right-group">
<nav class="site-nav" aria-label="Top">
{/* "Documentation" dropdown. */}
<div class="site-nav-dropdown">
<details name="site-nav-dropdown">
<summary class="site-nav-link">Documentation</summary>
</details>
<div class="site-nav-menu">
<a href="/guides/">User Guides</a>
<a href="/contributing/">Contribution Guides</a>
<a href="/code-reference/architecture/">Code Reference</a>
</div>
</div>
{/* "Help" dropdown. */}
<div class="site-nav-dropdown">
<details name="site-nav-dropdown">
<summary class="site-nav-link">Help</summary>
</details>
<div class="site-nav-menu">
<a href="/faq/">FAQ</a>
<a href="/knownissues/">Known Issues</a>
<a href={siteLinks.forums.href} target="_blank" rel="noreferrer">{siteLinks.forums.label}</a>
</div>
</div>
<a class="site-nav-link" href={siteLinks.store.href} target="_blank" rel="noreferrer">{siteLinks.store.label}</a>
</nav>
<div class="sl-flex social-icons">
<SocialIcons />
</div>
<ThemeSelect />
<LanguageSelect />
</div>
</div>
<script>
const toggle = document.querySelector<HTMLElement>('.site-nav-toggle');
const btn = toggle?.querySelector('button');
if (toggle && btn) {
const setExpanded = (expanded: boolean) => btn.setAttribute('aria-expanded', String(expanded));
btn.addEventListener('click', () => setExpanded(btn.getAttribute('aria-expanded') !== 'true'));
toggle.addEventListener('keyup', (e) => {
if (e.code === 'Escape') {
setExpanded(false);
btn.focus();
}
});
// Collapse the panel if the viewport grows past the mobile breakpoint.
matchMedia('(min-width: 50em)').addEventListener('change', () => setExpanded(false));
}
</script>
<style>
@layer starlight.core {
/* Header shell: title, search, right-side nav group. */
.header {
display: flex;
gap: var(--sl-nav-gap);
justify-content: space-between;
align-items: center;
height: 100%;
}
.title-wrapper {
/* Clips long titles instead of overflowing onto the search/menu buttons; padding/negative margin avoids clipping the focus ring. */
overflow: clip;
padding: 0.25rem;
margin: -0.25rem;
min-width: 0;
}
.mobile-actions {
align-items: center;
gap: 0.75rem;
}
/* Right-side group: nav + social icons, divided by a hairline. */
.right-group,
.social-icons {
gap: 1rem;
align-items: center;
}
.social-icons::after {
content: '';
height: 2rem;
border-inline-end: 1px solid var(--sl-color-hairline-light);
}
@media (min-width: 50rem) {
:global(:root[data-has-sidebar]) {
--__sidebar-pad: calc(2 * var(--sl-nav-pad-x));
}
:global(:root:not([data-has-toc])) {
--__toc-width: 0rem;
}
/* Columns: site title */
.header {
--__sidebar-width: max(0rem, var(--sl-content-inline-start, 0rem) - var(--sl-nav-pad-x));
--__main-column-fr: calc(
(
100% + var(--__sidebar-pad, 0rem) - var(--__toc-width, var(--sl-sidebar-width)) -
(2 * var(--__toc-width, var(--sl-nav-pad-x))) - var(--sl-content-inline-start, 0rem) -
var(--sl-content-width)
) / 2
);
display: grid;
grid-template-columns:
minmax(
calc(var(--__sidebar-width) + max(0rem, var(--__main-column-fr) - var(--sl-nav-gap))),
auto
)
1fr
auto;
align-content: center;
}
}
}
/* Top nav links + dropdowns. */
.site-nav {
display: flex;
align-items: center;
gap: 1.25rem;
padding-inline-end: 1.25rem;
border-inline-end: 1px solid var(--sl-color-hairline-light);
}
/* Top nav trigger: shared style for plain links and dropdown triggers. */
.site-nav-link {
font-size: var(--sl-text-sm);
font-weight: 500;
color: var(--sl-color-gray-2);
background: none;
border: none;
padding: 0;
font-family: inherit;
cursor: pointer;
white-space: nowrap;
text-decoration: none;
}
.site-nav-link:hover {
color: var(--sl-color-white);
}
/* Extends the hoverable box down to the menu, closing the dead zone between trigger and menu. */
.site-nav-dropdown {
position: relative;
padding-bottom: 0.75rem;
margin-bottom: -0.75rem;
}
/* No box of its own; only the <summary> lays out. Its `open` state (no JS) is read by .site-nav-menu below. */
.site-nav-dropdown > details {
display: contents;
}
.site-nav-dropdown > details > summary {
display: inline-flex;
align-items: center;
list-style: none;
}
.site-nav-dropdown > details > summary::-webkit-details-marker {
display: none;
}
/* Dropdown menu panel: shown on hover (mouse) or when the sibling <details> is toggled open (touch/keyboard). */
.site-nav-menu {
display: none;
position: absolute;
top: 100%;
left: 50%;
transform: translateX(-50%);
min-width: 11rem;
padding: 0.5rem;
flex-direction: column;
gap: 0.125rem;
background: var(--sl-color-bg-nav);
border: 1px solid var(--sl-color-hairline-light);
border-radius: var(--wu-radius-sm, 0.5rem);
box-shadow: var(--sl-shadow-lg);
z-index: 10;
}
.site-nav-dropdown:hover .site-nav-menu,
.site-nav-dropdown:has(details[open]) .site-nav-menu {
display: flex;
}
.site-nav-menu a {
padding: 0.4rem 0.6rem;
border-radius: var(--wu-radius-sm, 0.5rem);
font-size: var(--sl-text-sm);
color: var(--sl-color-gray-2);
text-decoration: none;
white-space: nowrap;
}
.site-nav-menu a:hover {
color: var(--sl-color-white);
background: var(--sl-color-gray-6);
}
/* Mobile equivalent of the site-nav, shown via a toggle button since the desktop nav is hidden below `md`. */
.site-nav-toggle button {
display: flex;
align-items: center;
justify-content: center;
width: 2.25rem;
height: 2.25rem;
border: 0;
border-radius: var(--wu-radius-sm, 0.5rem);
padding: 0;
background: none;
color: var(--sl-color-gray-2);
cursor: pointer;
}
.site-nav-toggle button:hover {
color: var(--sl-color-white);
}
.site-nav-toggle button svg {
width: 1.25rem;
height: 1.25rem;
}
.site-nav-toggle button[aria-expanded='true'] .open-menu,
.site-nav-toggle button:not([aria-expanded='true']) .close-menu {
display: none;
}
.site-nav-panel {
display: none;
position: fixed;
inset-inline: 0;
top: var(--sl-nav-height);
z-index: var(--sl-z-index-menu);
flex-direction: column;
gap: 0.25rem;
max-height: calc(100vh - var(--sl-nav-height));
overflow-y: auto;
padding: 1rem var(--sl-nav-pad-x) 1.5rem;
background: var(--sl-color-bg-nav);
border-bottom: 1px solid var(--sl-color-hairline-shade);
}
.site-nav-toggle button[aria-expanded='true'] ~ .site-nav-panel {
display: flex;
}
.site-nav-panel-link {
padding: 0.5rem 0.25rem;
font-size: var(--sl-text-sm);
font-weight: 500;
color: var(--sl-color-gray-2);
text-decoration: none;
}
.site-nav-panel-link:hover {
color: var(--sl-color-white);
}
.site-nav-panel-group {
display: flex;
flex-direction: column;
border-top: 1px solid var(--sl-color-hairline-light);
padding-top: 0.5rem;
}
.site-nav-panel-heading {
margin: 0 0 0.25rem;
padding: 0 0.25rem;
font-size: var(--sl-text-xs);
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.02em;
color: var(--sl-color-gray-3);
}
.site-nav-panel-group a {
padding: 0.5rem 0.25rem;
font-size: var(--sl-text-sm);
color: var(--sl-color-gray-2);
text-decoration: none;
}
.site-nav-panel-group a:hover {
color: var(--sl-color-white);
}
</style>
+301
View File
@@ -0,0 +1,301 @@
---
// Custom hero override: eyebrow, heading, tagline, actions, badges, screenshot.
import { Image } from 'astro:assets';
import { Icon } from '@astrojs/starlight/components';
// Matches Starlight's internal PAGE_TITLE_ID (used by the skip-to-content link).
const PAGE_TITLE_ID = '_top';
// Resolve hero content: Starlight's built-in hero fields plus our custom schema extensions.
const { data } = Astro.locals.starlightRoute.entry;
const { title = data.title, tagline, image, actions = [] } = data.hero || {};
const { heroEyebrow, heroCaption, heroBadges = [] } = data;
let heroImage: ImageMetadata | undefined;
if (image && 'file' in image) heroImage = image.file;
---
<section class="wu-hero">
{/* Full-bleed grid/glow background layer. */}
<div class="wu-hero-grid" aria-hidden="true"></div>
<div class="wu-hero-glow" aria-hidden="true"></div>
<div class="wu-hero-inner">
{/* Copy column: eyebrow, heading, tagline, actions, caption. */}
<div class="wu-hero-copy">
{heroEyebrow && <p class="wu-eyebrow">{heroEyebrow}</p>}
<h1 id={PAGE_TITLE_ID} data-page-title set:html={title} />
{tagline && <p class="wu-hero-tagline" set:html={tagline} />}
{
actions.length > 0 && (
<div class="wu-hero-actions">
{actions.map(({ icon, link: href, text, variant = 'primary' }) => (
<a href={href} class:list={['wu-btn', variant === 'primary' ? 'wu-btn-primary' : 'wu-btn-secondary']}>
{text}
{icon?.name && (
<Icon
name={icon.name}
size="1.5em"
class:list={[(icon.name === 'right-arrow' || icon.name === 'left-arrow') && 'wu-icon-arrow']}
/>
)}
</a>
))}
</div>
)
}
{heroCaption && <p class="wu-hero-caption">{heroCaption}</p>}
</div>
{/* Screenshot framed as a fake browser/app window. */}
{
heroImage && (
<div class="wu-hero-media">
<div class="wu-window">
<div class="wu-window-bar">
<span class="wu-window-title">winutil.ps1</span>
<div class="wu-caption-buttons">
<span class="wu-cap-btn wu-cap-min" aria-hidden="true">
<svg viewBox="0 0 10 10"><path d="M0 5h10" /></svg>
</span>
<span class="wu-cap-btn wu-cap-max" aria-hidden="true">
<svg viewBox="0 0 10 10"><rect x="0.5" y="0.5" width="9" height="9" /></svg>
</span>
<span class="wu-cap-btn wu-cap-close" aria-hidden="true">
<svg viewBox="0 0 10 10"><path d="M0 0l10 10M10 0L0 10" /></svg>
</span>
</div>
</div>
<Image src={heroImage} alt={image?.alt || ''} width={1200} loading="eager" decoding="async" />
</div>
</div>
)
}
</div>
{/* Badge row (shields.io / dcbadge images) below the two-column layout. */}
{
heroBadges.length > 0 && (
<div class="wu-hero-bottom">
<div class="wu-badges">
{heroBadges.map(({ src, alt, href }) =>
href ? (
<a href={href}>
<img src={src} alt={alt} />
</a>
) : (
<img src={src} alt={alt} />
)
)}
</div>
</div>
)
}
</section>
<style>
@layer starlight.core {
/* Outer hero shell; pulled up to close Starlight's fixed 1.5rem ContentPanel padding. */
.wu-hero {
position: relative;
border-bottom: 1px solid var(--sl-color-hairline-light);
margin-inline: calc(-1 * var(--sl-content-pad-x));
padding-inline: var(--sl-content-pad-x);
margin-top: -1.5rem;
padding-top: 1.5rem;
}
/* Full-bleed grid/glow background, forced behind all hero content via negative z-index. */
.wu-hero-grid,
.wu-hero-glow {
position: absolute;
z-index: -1;
top: 0;
bottom: 0;
left: 50%;
width: 100vw;
margin-left: -50vw;
pointer-events: none;
}
.wu-hero-grid {
background-image:
linear-gradient(90deg, var(--sl-color-hairline-light) 1px, transparent 1px),
linear-gradient(var(--sl-color-hairline-light) 1px, transparent 1px);
background-size: 40px 40px;
mask-image: radial-gradient(at top, #000 60%, transparent 100%);
-webkit-mask-image: radial-gradient(at top, #000 60%, transparent 100%);
opacity: 0.6;
}
.wu-hero-glow {
background: radial-gradient(
ellipse at center,
hsl(var(--wu-accent-h) 100% 61% / 0.14) 0%,
hsl(var(--wu-accent-h) 100% 61% / 0.05) 28%,
transparent 68%
);
}
/* Two-column layout: copy left, screenshot right (stacked on mobile). */
.wu-hero-inner {
position: relative;
z-index: 1;
display: grid;
gap: 3rem;
padding-block: 3rem 2rem;
}
/* Hero copy: eyebrow, heading, tagline, actions, caption. */
.wu-hero-copy {
text-align: center;
}
.wu-eyebrow {
margin: 0 0 1rem;
font-size: var(--sl-text-sm);
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.06em;
color: var(--sl-color-accent);
}
.wu-hero-copy h1 {
margin: 0;
font-size: clamp(var(--sl-text-4xl), calc(0.25rem + 5vw), var(--sl-text-6xl));
font-weight: 700;
line-height: 1.1;
letter-spacing: -0.02em;
color: var(--sl-color-white);
}
.wu-hero-tagline {
margin: 1.5rem auto 0;
max-width: 40rem;
font-size: var(--sl-text-lg);
line-height: var(--sl-line-height);
color: var(--sl-color-gray-2);
}
.wu-hero-actions {
display: flex;
flex-wrap: wrap;
justify-content: center;
gap: 0.75rem;
margin-top: 2.5rem;
}
.wu-hero-caption {
margin: 1.5rem 0 0;
font-size: var(--sl-text-sm);
color: var(--sl-color-gray-3);
}
/* Screenshot framed in a fake browser window (traffic-light dots + title bar). */
.wu-hero-media {
display: flex;
justify-content: center;
}
.wu-window {
width: 100%;
max-width: 56rem;
overflow: hidden;
border-radius: var(--wu-radius-lg);
border: 1px solid var(--sl-color-hairline-light);
background: var(--sl-color-gray-6);
box-shadow: 0 25px 50px -12px hsl(0 0% 0% / 0.5);
}
/* Window chrome: title bar + traffic-light buttons. */
.wu-window-bar {
display: flex;
align-items: center;
gap: 0.4rem;
padding-inline-start: 0.85rem;
border-bottom: 1px solid var(--sl-color-hairline-light);
background: var(--sl-color-black);
}
.wu-window-title {
font-size: var(--sl-text-xs);
color: var(--sl-color-gray-3);
flex: 1;
}
.wu-caption-buttons {
display: flex;
height: 2.1rem;
}
.wu-cap-btn {
display: inline-flex;
align-items: center;
justify-content: center;
width: 2.75rem;
height: 100%;
color: var(--sl-color-gray-3);
}
.wu-cap-btn svg {
width: 0.65rem;
height: 0.65rem;
fill: none;
stroke: currentColor;
stroke-width: 1;
}
.wu-cap-max svg {
fill: none;
}
.wu-cap-close svg {
fill: none;
}
.wu-cap-btn:hover {
background: var(--sl-color-gray-5);
}
.wu-cap-close:hover {
background: #e81123;
color: white;
}
.wu-window :global(img) {
display: block;
width: 100%;
height: auto;
}
/* Badge row below the two-column layout, centered full-width. */
.wu-hero-bottom {
position: relative;
z-index: 1;
display: flex;
justify-content: center;
padding-bottom: 2.5rem;
}
.wu-hero-bottom .wu-badges {
margin: 0;
}
/* Desktop breakpoint: side-by-side columns, left-aligned copy. */
@media (min-width: 50rem) {
.wu-hero-inner {
grid-template-columns: minmax(0, 0.9fr) minmax(0, 1.1fr);
align-items: center;
gap: 2rem;
padding-block: 5rem 3rem;
}
.wu-hero-copy {
text-align: left;
}
.wu-hero-tagline {
margin-inline: 0;
}
.wu-hero-actions {
justify-content: flex-start;
}
.wu-hero-bottom {
padding-bottom: 3rem;
}
}
}
</style>
+38
View File
@@ -0,0 +1,38 @@
---
// Overrides Starlight's default ThemeProvider: dark by default regardless of OS preference, unless the visitor has explicitly picked a theme before.
import { Icon } from '@astrojs/starlight/components';
---
<script is:inline>
window.StarlightThemeProvider = (() => {
// Apply the resolved theme to <html> immediately, before paint, to avoid a flash of the wrong theme.
const storedTheme =
typeof localStorage !== 'undefined' && localStorage.getItem('starlight-theme');
const theme = storedTheme || 'dark';
document.documentElement.dataset.theme = theme === 'light' ? 'light' : 'dark';
// Re-syncs each theme-select picker's icon + value after the visitor changes theme.
return {
updatePickers(theme = storedTheme || 'auto') {
document.querySelectorAll('starlight-theme-select').forEach((picker) => {
const select = picker.querySelector('select');
if (select) select.value = theme;
/** @type {HTMLTemplateElement | null} */
const tmpl = document.querySelector(`#theme-icons`);
const newIcon = tmpl && tmpl.content.querySelector('.' + theme);
if (newIcon) {
const oldIcon = picker.querySelector('svg.label-icon');
if (oldIcon) {
oldIcon.replaceChildren(...newIcon.cloneNode(true).childNodes);
}
}
});
},
};
})();
</script>
<template id="theme-icons">
<Icon name="sun" class="light" />
<Icon name="moon" class="dark" />
<Icon name="laptop" class="auto" />
</template>
+39
View File
@@ -0,0 +1,39 @@
---
// Responsive 16:9 YouTube embed using the privacy-enhanced (nocookie) domain.
interface Props {
id: string;
title: string;
}
const { id, title } = Astro.props;
---
<div class="wu-video-embed not-content">
<iframe
src={`https://www.youtube-nocookie.com/embed/${id}`}
title={title}
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
allowfullscreen
></iframe>
</div>
<style>
/* `not-content` on the wrapper opts it out of Starlight's markdown reset, which otherwise forces `iframe { height: auto }`. */
.wu-video-embed {
position: relative;
width: 100%;
aspect-ratio: 16 / 9;
margin: 1.5rem 0;
border: 1px solid var(--sl-color-hairline-light);
background-color: var(--sl-color-black);
}
.wu-video-embed iframe {
position: absolute;
inset: 0;
width: 100%;
height: 100%;
border: 0;
}
</style>
+29
View File
@@ -0,0 +1,29 @@
import { defineCollection } from 'astro:content';
import { z } from 'astro/zod';
import { docsLoader } from '@astrojs/starlight/loaders';
import { docsSchema } from '@astrojs/starlight/schema';
export const collections = {
docs: defineCollection({
loader: docsLoader(),
schema: docsSchema({
extend: () =>
z.object({
// Small uppercase kicker line above the hero heading, e.g. "Open Source Windows Setup Utility".
heroEyebrow: z.string().optional(),
// Muted one-liner below the hero actions, e.g. "Self-hosted. Script-powered. No installer.".
heroCaption: z.string().optional(),
// Badge images (shields.io, dcbadge, etc.) shown in a row at the bottom of the hero.
heroBadges: z
.array(
z.object({
src: z.string(),
alt: z.string(),
href: z.string().optional(),
})
)
.optional(),
}),
}),
}),
};
@@ -0,0 +1,744 @@
---
title: Architecture & Design
description: How WinUtil's GUI, functions, and JSON configuration files fit together, plus a deep dive into the Win11 Creator subsystem.
---
## Overview
WinUtil is a PowerShell-based Windows utility with a WPF (Windows Presentation Foundation) GUI. This document explains the architecture, code structure, and how different components work together.
## High-Level Architecture
```
┌─────────────────────────────────────────────────────┐
│ Winutil GUI │
│ (WPF XAML Interface) │
└──────────────────┬──────────────────────────────────┘
│
┌─────────┴─────────┐
│ │
┌────────▼──────┐ ┌───────▼────────┐
│ Public APIs │ │ Private APIs │
│ (User-facing)│ │ (Internal) │
└───────┬───────┘ └───────┬────────┘
│ │
└────────┬──────────┘
│
┌────────────▼────────────┐
│ Configuration Files │
│ (JSON definitions) │
└────────────┬────────────┘
│
┌────────────▼────────────┐
│ External Tools │
│ (WinGet, Chocolatey) │
└─────────────────────────┘
```
## Project Structure
### Directory Layout
```
winutil/
├── Compile.ps1 # Build script that combines all files
├── winutil.ps1 # Compiled output (generated)
├── scripts/
│ ├── main.ps1 # Entry point and GUI initialization
│ └── start.ps1 # Startup logic
├── functions/
│ ├── private/ # Internal helper functions
│ │ ├── Get-WinUtilVariables.ps1
│ │ ├── Install-WinUtilWinget.ps1
│ │ └── ...
│ ├── public/ # User-facing functions
│ │ ├── Initialize-WPFUI.ps1
│ │ └── ...
├── config/ # JSON configuration files
│ ├── applications.json # Application definitions
│ ├── tweaks.json # Tweak definitions
│ ├── feature.json # Windows feature definitions
│ └── preset.json # Preset configurations
├── xaml/
│ └── inputXML.xaml # GUI layout definition
└── docs/ # Documentation
```
### Key Components
#### 1. Compile.ps1
**Purpose**: Combines all separate script files into a single `winutil.ps1` for distribution.
**Process**:
1. Reads all function files from `/functions/`
2. Includes configuration JSON files
3. Embeds XAML GUI definition
4. Combines into a single script
5. Outputs `winutil.ps1`
**Why**: Makes distribution easier (single file) and improves load time.
#### 2. scripts/main.ps1
**Purpose**: Entry point that manages the run.
**Responsibilities**:
- Load configurations
- Run the headless `-Preset` and `-Config` paths
- Start the interface on a dedicated STA runspace and wait for it
- Report anything the interface thread failed with, then clean up
The interface itself lives in `Start-WinUtilUserInterface`, not here. See [Threading Model](#threading-model).
#### 3. functions/public/
**Purpose**: User-facing functions that implement main features.
**Key Functions**:
- `Initialize-WPFUI.ps1`: Sets up the GUI
- `Invoke-WPFTweak*`: Applies system tweaks
- `Invoke-WPFFeature*`: Enables Windows features
- `Install-WinUtilProgram*`: Installs applications
**Naming Convention**: Functions start with `WPF` or `Winutil` to be loaded into the runspace.
#### 4. functions/private/
**Purpose**: Internal helper functions not directly called by users.
**Key Functions**:
- `Get-WinUtilVariables.ps1`: Retrieves UI element references
- `Install-WinUtilWinget.ps1`: Ensures WinGet is installed
- `Get-WinUtilCheckBoxes.ps1`: Gets checkbox states
- `Invoke-WinUtilCurrentSystem.ps1`: Gets system information
#### 5. config/*.json
**Purpose**: Define available applications, tweaks, and features declaratively.
**Files**:
- `applications.json`: Application definitions with WinGet/Choco IDs
- `tweaks.json`: Registry tweaks and their undo actions
- `feature.json`: Windows features that can be enabled/disabled
- `preset.json`: Predefined tweak combinations
- `dns.json`: DNS provider configurations
#### 6. xaml/inputXML.xaml
**Purpose**: WPF GUI layout and design.
**Structure**:
- Buttons with event handlers
- TextBoxes for input
- 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 of the main package installation and tweak system.
### Win11 Creator Components
**Core Functions** (`functions/private/`):
- `Invoke-WinUtilISO.ps1`: Main orchestrator containing ISO workflow and helper functions
- `Invoke-WinUtilISOBrowse`: ISO file selection dialog
- `Invoke-WinUtilISOMountAndVerify`: Validates and mounts ISO, verifies it is an official Windows 11 ISO
- `Invoke-WinUtilISOModify`: Launches modification in background runspace
- `Invoke-WinUtilISOExport`: Builds bootable ISO via `oscdimg.exe`
- `Invoke-WinUtilISOCheckExistingWork`: Recovers incomplete work sessions
- `Invoke-WinUtilISOCleanAndReset`: Cleans up temp directories and resets UI
- `Write-WinUtilISOLog`: Posts log messages to UI status box and session log
- `Set-WinUtilISOStep`: Controls wizard navigation state
- `Get-WinUtilEditionIdFromName`: Maps edition display names to setup edition IDs
- `Invoke-WinUtilRobocopy`: Copies files with exit code verification
- `Find-WinUtilOscdimg` / `Get-WinUtilOscdimgPath`: Locates or installs `oscdimg.exe`
- `Invoke-WinUtilISOUSB.ps1`: USB drive detection and formatting
- `Invoke-WinUtilISORefreshUSBDrives`: Enumerates USB drives
- `Get-WinUtilFreeDriveLetter`: Finds available drive letters
- `Invoke-WinUtilISOWriteUSB`: Formats USB drive as GPT/FAT32, splits WIM if needed, and copies files
- `Invoke-WinUtilISOScript.ps1`: Prepares setup media and customizations
- Stages AppX removal (19 bloatware packages) into `autounattend.xml` for first logon
- Applies 50+ registry tweaks during Windows Setup and first logon; removes scheduled tasks at first logon
- Triggers OneDrive uninstall during first logon
- Stages setup script fallbacks to `sources\$OEM$\$$\Setup\Scripts\`
- Pins selected edition in `autounattend.xml` and writes `sources\ei.cfg`
- Injects eligible current system drivers into WIM images if enabled (WIM mount is only used for driver servicing)
### 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 the Driver Injection checkbox
↓
Invoke-WinUtilISOModify (runs in background runspace)
├─ Create work directory: ~WinUtil_Win11ISO_[timestamp]
├─ Copy ISO contents to disk via robocopy (~5-6 GB)
├─ Invoke-WinUtilISOScript:
│ ├─ Generate autounattend.xml with Windows PE and specialize safeguards
│ ├─ Add first-logon script (19 AppX removals, registry tweaks, OneDrive uninstall)
│ ├─ Pin selected edition index in autounattend.xml (/IMAGE/INDEX)
│ ├─ Stage setup script fallbacks to sources\$OEM$\$$\Setup\Scripts\
│ ├─ Write sources\ei.cfg and remove stale sources\PID.txt
│ └─ If driver injection enabled:
│ ├─ Require install.wim; install.esd cannot accept driver injection
│ ├─ Export current system drivers via DISM
│ ├─ Exclude stale duplicate packages
│ ├─ Inject storage drivers into boot.wim index 2 and eligible drivers into install.wim
│ └─ Validate WIM metadata before and after injection
├─ 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 (close to the source ISO size)
│
└─ Option 2: Write to USB
├─ Format USB as GPT
├─ Create single FAT32 partition (capped at 32 GB)
├─ Split install.wim into .swm files if > 3.8 GB
├─ Reject install.esd files of 4 GB or more
├─ Copy files via robocopy
└─ Output: Bootable USB (minimum 8 GB)
↓
Invoke-WinUtilISOCleanAndReset (optional)
├─ Dismount any open WIM mounts with discard
├─ 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
**WIM Metadata Validation**:
- During driver injection, `Assert-WinUtilISOWimMetadata` validates critical fields (`Languages`, `Installation`, `Edition`, `ProductSuite`, `ProductType`) before and after WIM servicing
- Driver injection stops before export if the required metadata is missing or changes
- Without driver injection, WinUtil preserves the original installation image and skips WIM metadata validation
**Edition Pinning & Setup Fallback**:
- Writes `sources\ei.cfg` and removes `sources\PID.txt` so setup does not use mismatched OEM product keys
- Pins the selected edition index in `autounattend.xml` (`/IMAGE/INDEX`)
- Stages fallback setup scripts under `sources\$OEM$\$$\Setup\Scripts\` with `UseConfigurationSet` enabled
**Work Session Recovery**:
- Auto-detects incomplete work from previous sessions
- Allows resuming the export step without re-running selection and modification
- Prevents redundant modifications
**Modification Safety**:
- Windows PE and specialize set hardware bypass and setup safeguards; `WinUtil-PostInstall.ps1` applies additional registry changes at first logon
- Original ISO never modified; only working copy
- Logged to the WinUtil session log and the live UI status panel
- DISM handles image dismount with automatic cleanup and discard on error
### Win11 Creator Registry Tweaks
The `Invoke-WinUtilISOScript` function applies **50+ registry tweaks** during setup and first logon:
**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 the 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:
- `install.wim` (main OS image), excluding stale duplicates
- `boot.wim` index 2 (Windows Setup PE environment), storage controllers only (`SCSIAdapter` / `HDC`)
**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**: close to the source ISO size
- **Total needed**: ~25 GB for safe operation
## Data Flow
### Application Installation Flow
```
User clicks "Install"
↓
Get-WinUtilCheckBoxes → Retrieves selected apps
↓
For each selected app:
↓
Check if WinGet/Choco is installed
↓
Install-WinUtilWinget/Choco (if needed)
↓
Install-WinUtilProgramWinget/Choco → Install app
↓
Update UI with progress
↓
Display completion message
```
### Tweak Application Flow
```
User selects tweaks and clicks "Run Tweaks"
↓
Get-WinUtilCheckBoxes → Get selected tweaks
↓
For each selected tweak:
↓
Load tweak definition from tweaks.json
↓
Invoke-WPFTweak → Apply registry/service changes
↓
Log changes
↓
Store original values (for undo)
↓
Update UI
↓
Display completion
```
### Undo Tweak Flow
```
User selects tweaks and clicks "Undo"
↓
Get-WinUtilCheckBoxes → Get selected tweaks
↓
For each tweak:
↓
Retrieve "OriginalState" from tweak definition
↓
Invoke-WPFUndoTweak → Restore original values
↓
Remove from the applied tweaks log
↓
Update UI
```
## Configuration File Format
### applications.json Structure
```json title="config/applications.json"
{
"WPFInstall<AppName>": {
"category": "Browsers",
"choco": "googlechrome",
"content": "Google Chrome",
"description": "Google Chrome browser",
"link": "https://chrome.google.com",
"winget": "Google.Chrome"
}
}
```
**Fields**:
- `category`: Which section in the Install tab
- `content`: Display name in GUI
- `description`: Tooltip/description text
- `winget`: WinGet package ID
- `choco`: Chocolatey package name
- `link`: Official website
### tweaks.json Structure
```json title="config/tweaks.json"
{
"WPFTweaksTelemetry": {
"Content": "Disable Telemetry",
"Description": "Disables Microsoft Telemetry",
"category": "Essential Tweaks",
"panel": "1",
"registry": [
{
"Path": "HKLM:\\SOFTWARE\\Policies\\Microsoft\\Windows\\DataCollection",
"Name": "AllowTelemetry",
"Type": "DWord",
"Value": "0",
"OriginalValue": "1"
}
]
}
}
```
**Fields**:
- `Content`: Display name
- `Description`: What it does
- `category`: Essential/Advanced/Customize
- `registry`: Registry changes to make
- `registry[].Values`: Per-state values for a registry-backed combobox
- `registry[].DefaultValue`: Effective value when the registry entry is absent
- `service`: Services to change
- `OriginalValue/State`: For undo functionality
## Threading Model
WinUtil runs on three kinds of thread, and each has one job:
| Thread | Runspace | Responsibility |
| --- | --- | --- |
| Main | The one the script started in | Start the interface, wait for it, surface its errors, clean up |
| Interface | `$sync.UIRunspace`, a dedicated STA runspace | Own the window. Paint and dispatch, nothing else |
| Workers | `$sync.runspace`, a shared pool | Run everything long: installs, tweaks, features, AppX, Win11 Creator |
All three are created from the same starting point, `New-WinUtilSessionState`, which carries
`$sync`, the compiled script's globals, and every WinUtil function. That is what lets any
thread call any helper without the caller injecting function definitions.
```powershell
# main.ps1 - the interface gets its own thread
$sync.UIRunspace = [runspacefactory]::CreateRunspace($Host, (New-WinUtilSessionState))
$sync.UIRunspace.ApartmentState = "STA"
$sync.UIRunspace.Open()
$uiShell = [powershell]::Create()
$uiShell.Runspace = $sync.UIRunspace
[void]$uiShell.AddScript({ Start-WinUtilUserInterface })
$uiHandle = $uiShell.BeginInvoke()
$uiHandle.AsyncWaitHandle.WaitOne()
```
**Why**: the window never blocks on work, and a failure on the interface thread is reported
instead of disappearing.
## Long-Running Work
Every long action goes through `Start-WinUtilJob`, which owns everything a running operation
needs: refusing to start while another job runs, the busy flag (`$sync.ActiveJob`), the progress
bar and taskbar item, the boxed console banner, a start/finish/failure line in the log, and
restoring the interface in a `finally` whatever happens.
`Invoke-WPFButton` decides what counts as a long action. Anything that changes the system gets a
job; anything that only changes what the interface is showing runs on the interface thread.
That single classification is why no workflow arranges its own progress, banner or busy state.
```powershell
Start-WinUtilJob -Name "Features" -Description "Installing Windows Features" -Parameters @{
Features = @($sync.selectedFeatures)
} -ScriptBlock {
param($Features)
$total = @($Features).Count
$completed = 0
foreach ($feature in $Features) {
$completed++
Step-WinUtilJob -Status "Installing $feature ($completed/$total)" -Percent ([int](($completed / $total) * 100))
Invoke-WinUtilFeatureInstall $feature
}
}
```
The body only has to do the work and call `Step-WinUtilJob`. Anything it throws is
caught, logged, and shown on the taskbar as a failure.
**Values, not closures**: the body is rebuilt inside the worker from its text, so it receives
what it needs through `-Parameters` rather than capturing the caller's variables.
## WPF Event Handling
Events are wired up via XAML element names:
```powershell
# Get all named elements
$sync.keys | ForEach-Object {
if($sync.$_.GetType().Name -eq "Button") {
$sync.$_.Add_Click({
$button = $sync.$($args[0].Name)
& "Invoke-$($args[0].Name)"
})
}
}
```
**Convention**: Button named `WPFInstallButton` calls function `Invoke-WPFInstallButton`.
## Package Manager Integration
### WinGet Integration
```powershell
# Check if installed
if (!(Get-Command winget -ErrorAction SilentlyContinue)) {
Install-WinUtilWinget
}
# Install package
winget install --id $app.winget --silent --accept-source-agreements
```
### Chocolatey Integration
```powershell
# Check if installed
if (!(Get-Command choco -ErrorAction SilentlyContinue)) {
Install-WinUtilChoco
}
# Install package
choco install $app.choco -y
```
## Error Handling And Logging
A job body does not need its own error handling. `Start-WinUtilJob` catches whatever the body
throws, logs it, and marks the run as failed on the taskbar, so a failure can never leave the
interface stuck busy. Only catch inside a body when you have something specific to do first,
such as cleaning up a mounted image, and then rethrow.
```powershell
Write-WinUtilLog -Level "ERROR" -Component "Install" -Message "winget install failed: $($_.Exception.Message)"
```
Entries and console diagnostics go to the same
`%LocalAppData%\winutil\logs\winutil_<timestamp>.log` session file. While `Start-Transcript`
owns that file, `Write-WinUtilLog` writes through the host so the transcript captures the entry
without a competing direct file write.
## Configuration Loading
At startup, Winutil loads all configurations:
```powershell
# Load JSON configs
$sync.configs = @{}
$sync.configs.applications = Get-Content "config/applications.json" | ConvertFrom-Json
$sync.configs.tweaks = Get-Content "config/tweaks.json" | ConvertFrom-Json
$sync.configs.features = Get-Content "config/feature.json" | ConvertFrom-Json
```
**Sync Hash**: `$sync` hashtable shares state across runspaces.
## UI Update Pattern
Controls may only be touched from the thread that owns the window, so background work reaches
them through `Invoke-WPFUIThread`:
```powershell
Invoke-WPFUIThread -Parameters @{ Count = $installed.Count } -ScriptBlock {
param($Count)
$sync.WPFselectedAppsButton.Content = "Selected Apps: $Count"
}
```
Add `-Async` to post the update instead of waiting for it. `Step-WinUtilJob` and the
Win11 Creator status log use that so a per-item update never stalls the worker.
**Values, not closures**: the body is rebuilt inside the interface runspace, so it takes what it
needs through `-Parameters`. Handing over a scriptblock from a worker instead would keep that
worker's session state, which loses the caller's variables on an async post and costs roughly
twenty times as much per command - enough to turn a checkbox refresh into a visible freeze.
## Adding New Features
### Adding a New Application
1. Edit `config/applications.json`:
```json title="config/applications.json"
{
"WPFInstallNewApp": {
"category": "Utilities",
"content": "New App",
"description": "Description of new app",
"winget": "Publisher.AppName",
"choco": "appname"
}
}
```
2. Recompile: `.\Compile.ps1`
3. The app appears automatically in the Install tab
### Adding a New Tweak
1. Edit `config/tweaks.json`:
```json title="config/tweaks.json"
{
"WPFTweaksNewTweak": {
"Content": "New Tweak",
"Description": "What it does",
"category": "Essential Tweaks",
"registry": [
{
"Path": "HKLM:\\Path\\To\\Key",
"Name": "ValueName",
"Type": "DWord",
"Value": "1",
"OriginalValue": "0"
}
]
}
}
```
2. Recompile: `.\Compile.ps1`
3. Tweak appears in the Tweaks tab
### Adding a New Function
1. Create file in `functions/public/` or `functions/private/`:
```powershell
# functions/public/Invoke-WPFNewFeature.ps1
function Invoke-WPFNewFeature {
<#
.SYNOPSIS
Does something new
#>
# Implementation
}
```
2. File naming must include "WPF" or "Winutil" to load
3. Recompile: `.\Compile.ps1`
## Testing
### Manual Testing
```powershell
# Compile and run with -run flag
.\Compile.ps1 -run
```
### Automated Tests
Tests are in `/pester/`:
- `configs.Tests.ps1`: Validates JSON configurations
- `functions.Tests.ps1`: Tests PowerShell functions
Run tests:
```powershell
Install-Module -Name Pester -RequiredVersion 5.8.0 -Scope CurrentUser -Force -SkipPublisherCheck
Import-Module Pester -RequiredVersion 5.8.0 -Force
Invoke-Pester -Path 'pester/*.Tests.ps1' -Output Detailed -CI
```
## Build Process
### Development Build
```powershell
.\Compile.ps1
```
Outputs `winutil.ps1` in the root directory.
### Production Release
1. Tag release in Git
2. GitHub Actions builds and uploads `winutil.ps1`
3. Release appears on GitHub Releases
4. Users download via `irm christitus.com/win`
## Dependencies
**Required**:
- PowerShell 5.1+
- .NET Framework 4.5+
- Windows 11
**Optional (auto-installed)**:
- WinGet (Windows Package Manager)
- Chocolatey
## Performance Considerations
**Optimization Strategies**:
- Lazy-load configurations (only when needed)
- Use runspaces for long operations
- Cache expensive lookups
- Minimize registry reads/writes
- Batch operations when possible
## Security Considerations
**Safety Measures**:
- All operations logged
- Registry backups for undo
- No credential storage
- Open source (auditable)
- Digitally signed (future)
## Contributing Guidelines
**Code Standards**:
- Use proper PowerShell cmdlet naming (Verb-Noun)
- Include comment-based help
- Follow existing code style
- Test thoroughly before PR
- Document significant changes
**File Naming**:
- Public functions: `Invoke-WPF*.ps1` or `Invoke-Winutil*.ps1`
- Private functions: `Get-WinUtil*.ps1` or verb-WinUtil*.ps1`
- Must include "WPF" or "Winutil" to load
## Future Architecture Plans
**Roadmap Considerations**:
- Plugin system for community extensions
- Config import/export
- Cloud sync for configurations
- Enhanced logging dashboard
- Modular compilation (choose features)
## Related Documentation
- [Contributing Guide](/contributing/) - How to contribute code
- [User Guide](/guides/) - End-user documentation
- [Win11 Creator Guide](/guides/win11creator/) - Building customized Windows 11 ISOs
- [FAQ](/faq/) - Common questions
## Additional Resources
- **GitHub Repository**: [ChrisTitusTech/winutil](https://github.com/ChrisTitusTech/winutil)
- **PowerShell Docs**: [Microsoft Docs](https://docs.microsoft.com/powershell/)
- **WPF Guide**: [WPF Documentation](https://docs.microsoft.com/dotnet/desktop/wpf/)
---
**Last Updated**: January 2026
**Maintainers**: Chris Titus Tech and contributors
@@ -0,0 +1,22 @@
---
title: "Legacy F8 Boot Recovery - Disable"
description: "Disables Advanced Boot Options screen that lets you start Windows in advanced troubleshooting modes."
editUrl: false
---
:::note
This page is generated from [`config/feature.json`](https://github.com/ChrisTitusTech/winutil/blob/main/config/feature.json). Do not edit this page directly.
:::
```json title="config/feature.json"
"WPFFeatureDisableLegacyRecovery": {
"Content": "Legacy F8 Boot Recovery - Disable",
"Description": "Disables Advanced Boot Options screen that lets you start Windows in advanced troubleshooting modes.",
"category": "Features",
"panel": "1",
"feature": [],
"InvokeScript": [
"bcdedit /set bootmenupolicy standard"
],
}
```
@@ -0,0 +1,22 @@
---
title: "Legacy F8 Boot Recovery - Enable"
description: "Enables Advanced Boot Options screen that lets you start Windows in advanced troubleshooting modes."
editUrl: false
---
:::note
This page is generated from [`config/feature.json`](https://github.com/ChrisTitusTech/winutil/blob/main/config/feature.json). Do not edit this page directly.
:::
```json title="config/feature.json"
"WPFFeatureEnableLegacyRecovery": {
"Content": "Legacy F8 Boot Recovery - Enable",
"Description": "Enables Advanced Boot Options screen that lets you start Windows in advanced troubleshooting modes.",
"category": "Features",
"panel": "1",
"feature": [],
"InvokeScript": [
"bcdedit /set bootmenupolicy legacy"
],
}
```
@@ -0,0 +1,28 @@
---
title: "Registry Backup (Daily Task 12:30am) - Enable"
description: "Enables daily registry backup, previously disabled by Microsoft in Windows 10 1803."
editUrl: false
---
:::note
This page is generated from [`config/feature.json`](https://github.com/ChrisTitusTech/winutil/blob/main/config/feature.json). Do not edit this page directly.
:::
```json title="config/feature.json"
"WPFFeatureRegBackup": {
"Content": "Registry Backup (Daily Task 12:30am) - Enable",
"Description": "Enables daily registry backup, previously disabled by Microsoft in Windows 10 1803.",
"category": "Features",
"panel": "1",
"feature": [],
"InvokeScript": [
"
New-ItemProperty -Path 'HKLM:\\SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Configuration Manager' -Name 'EnablePeriodicBackup' -Type DWord -Value 1 -Force
New-ItemProperty -Path 'HKLM:\\SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Configuration Manager' -Name 'BackupCount' -Type DWord -Value 2 -Force
$action = New-ScheduledTaskAction -Execute 'schtasks' -Argument '/run /i /tn \"\\Microsoft\\Windows\\Registry\\RegIdleBackup\"'
$trigger = New-ScheduledTaskTrigger -Daily -At 00:30
Register-ScheduledTask -Action $action -Trigger $trigger -TaskName 'AutoRegBackup' -Description 'Create System Registry Backups' -User 'System'
"
],
}
```
@@ -0,0 +1,21 @@
---
title: "Windows Sandbox - Enable"
description: "Windows Sandbox is a lightweight virtual machine that provides a temporary desktop environment to safely run applications and programs in isolation."
editUrl: false
---
:::note
This page is generated from [`config/feature.json`](https://github.com/ChrisTitusTech/winutil/blob/main/config/feature.json). Do not edit this page directly.
:::
```json title="config/feature.json"
"WPFFeaturesSandbox": {
"Content": "Windows Sandbox - Enable",
"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",
"feature": [
"Containers-DisposableClientVM"
],
}
```
@@ -0,0 +1,23 @@
---
title: ".NET Framework (Versions 2, 3, 4) - Enable"
description: ".NET and .NET Framework is a developer platform made up of tools, programming languages, and libraries for building many different types of applications."
editUrl: false
---
:::note
This page is generated from [`config/feature.json`](https://github.com/ChrisTitusTech/winutil/blob/main/config/feature.json). Do not edit this page directly.
:::
```json title="config/feature.json"
"WPFFeaturesdotnet": {
"Content": ".NET Framework (Versions 2, 3, 4) - Enable",
"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",
"feature": [
"NetFx4-AdvSrvs",
"NetFx3"
],
"InvokeScript": [],
}
```
@@ -0,0 +1,21 @@
---
title: "Hyper-V - Enable"
description: "Hyper-V is a hardware virtualization product developed by Microsoft that allows users to create and manage virtual machines."
editUrl: false
---
:::note
This page is generated from [`config/feature.json`](https://github.com/ChrisTitusTech/winutil/blob/main/config/feature.json). Do not edit this page directly.
:::
```json title="config/feature.json"
"WPFFeatureshyperv": {
"Content": "Hyper-V - Enable",
"Description": "Hyper-V is a hardware virtualization product developed by Microsoft that allows users to create and manage virtual machines.",
"category": "Features",
"panel": "1",
"feature": [
"Microsoft-Hyper-V-All"
],
}
```
@@ -0,0 +1,25 @@
---
title: "Legacy Media Components (WMP, DirectPlay) - Enable"
description: "Enables legacy programs from previous versions of Windows."
editUrl: false
---
:::note
This page is generated from [`config/feature.json`](https://github.com/ChrisTitusTech/winutil/blob/main/config/feature.json). Do not edit this page directly.
:::
```json title="config/feature.json"
"WPFFeatureslegacymedia": {
"Content": "Legacy Media Components (WMP, DirectPlay) - Enable",
"Description": "Enables legacy programs from previous versions of Windows.",
"category": "Features",
"panel": "1",
"feature": [
"WindowsMediaPlayer",
"MediaPlayback",
"DirectPlay",
"LegacyComponents"
],
"InvokeScript": [],
}
```
@@ -0,0 +1,30 @@
---
title: "Network File System (NFS) - Enable"
description: "Network File System (NFS) is a mechanism for storing files on a network."
editUrl: false
---
:::note
This page is generated from [`config/feature.json`](https://github.com/ChrisTitusTech/winutil/blob/main/config/feature.json). Do not edit this page directly.
:::
```json title="config/feature.json"
"WPFFeaturenfs": {
"Content": "Network File System (NFS) - Enable",
"Description": "Network File System (NFS) is a mechanism for storing files on a network.",
"category": "Features",
"panel": "1",
"feature": [
"ServicesForNFS-ClientOnly",
"ClientForNFS-Infrastructure",
"NFS-Administration"
],
"InvokeScript": [
"nfsadmin client stop",
"Set-ItemProperty -Path 'HKLM:\\SOFTWARE\\Microsoft\\ClientForNFS\\CurrentVersion\\Default' -Name 'AnonymousUID' -Type DWord -Value 0",
"Set-ItemProperty -Path 'HKLM:\\SOFTWARE\\Microsoft\\ClientForNFS\\CurrentVersion\\Default' -Name 'AnonymousGID' -Type DWord -Value 0",
"nfsadmin client start",
"nfsadmin client localhost config fileaccess=755 SecFlavors=+sys -krb5 -krb5i"
],
}
```
@@ -0,0 +1,23 @@
---
title: "Windows Subsystem for Linux (WSL) - Enable"
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."
editUrl: false
---
:::note
This page is generated from [`config/feature.json`](https://github.com/ChrisTitusTech/winutil/blob/main/config/feature.json). Do not edit this page directly.
:::
```json title="config/feature.json"
"WPFFeaturewsl": {
"Content": "Windows Subsystem for Linux (WSL) - Enable",
"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",
"feature": [
"VirtualMachinePlatform",
"Microsoft-Windows-Subsystem-Linux"
],
"InvokeScript": [],
}
```
@@ -0,0 +1,16 @@
---
title: "AutoLogon - Run"
description: ""
editUrl: false
---
:::note
This page is generated from [`functions/public/Invoke-WPFPanelAutologin.ps1`](https://github.com/ChrisTitusTech/winutil/blob/main/functions/public/Invoke-WPFPanelAutologin.ps1). Do not edit this page directly.
:::
```powershell title="functions/public/Invoke-WPFPanelAutologin.ps1"
function Invoke-WPFPanelAutologin {
Invoke-WebRequest -Uri https://live.sysinternals.com/Autologon.exe -OutFile "$winutildir\autologin.exe"
Start-Process -FilePath "$winutildir\autologin.exe" -ArgumentList /accepteula
}
```
@@ -0,0 +1,31 @@
---
title: "System Corruption Scan - Run"
description: ""
editUrl: false
---
:::note
This page is generated from [`functions/public/Invoke-WPFSystemRepair.ps1`](https://github.com/ChrisTitusTech/winutil/blob/main/functions/public/Invoke-WPFSystemRepair.ps1). Do not edit this page directly.
:::
```powershell title="functions/public/Invoke-WPFSystemRepair.ps1"
function Invoke-WPFSystemRepair {
<#
.SYNOPSIS
Checks for system corruption using SFC, and DISM
Checks for disk failure using Chkdsk
.DESCRIPTION
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 /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
Write-Host "==> Finished System Repair"
Set-WinUtilTaskbaritem -state "None" -overlay "checkmark"
}
```
@@ -0,0 +1,32 @@
---
title: "NTP Server - Enable"
description: "Replaces the default Windows NTP server (time.windows.com) with pool.ntp.org for improved time synchronization accuracy and reliability."
editUrl: false
---
:::note
This page is generated from [`functions/public/Invoke-WPFFixesNTPPool.ps1`](https://github.com/ChrisTitusTech/winutil/blob/main/functions/public/Invoke-WPFFixesNTPPool.ps1). Do not edit this page directly.
:::
```powershell title="functions/public/Invoke-WPFFixesNTPPool.ps1"
function Invoke-WPFFixesNTPPool {
<#
.SYNOPSIS
Configures Windows to use pool.ntp.org for NTP synchronization
.DESCRIPTION
Replaces the default Windows NTP server (time.windows.com) with
pool.ntp.org for improved time synchronization accuracy and reliability.
#>
Start-Service w32time
w32tm /config /update /manualpeerlist:"pool.ntp.org,0x8" /syncfromflags:MANUAL
Restart-Service w32time
w32tm /resync
Write-Host "================================="
Write-Host "-- NTP Configuration Complete ---"
Write-Host "================================="
}
```
@@ -0,0 +1,17 @@
---
title: "Network - Reset"
description: ""
editUrl: false
---
:::note
This page is generated from [`functions/public/Invoke-WPFFixesNetwork.ps1`](https://github.com/ChrisTitusTech/winutil/blob/main/functions/public/Invoke-WPFFixesNetwork.ps1). Do not edit this page directly.
:::
```powershell title="functions/public/Invoke-WPFFixesNetwork.ps1"
function Invoke-WPFFixesNetwork {
netsh winsock reset
netsh int ip reset
Write-Host "Network Configuration has been Reset. Please restart your computer."
}
```
@@ -0,0 +1,238 @@
---
title: "Windows Update - Reset"
description: ""
editUrl: false
---
:::note
This page is generated from [`functions/public/Invoke-WPFFixesUpdate.ps1`](https://github.com/ChrisTitusTech/winutil/blob/main/functions/public/Invoke-WPFFixesUpdate.ps1). Do not edit this page directly.
:::
```powershell title="functions/public/Invoke-WPFFixesUpdate.ps1"
function Invoke-WPFFixesUpdate {
<#
.SYNOPSIS
Performs various tasks in an attempt to repair Windows Update
.DESCRIPTION
1. (Aggressive Only) Scans the system for corruption using the Invoke-WPFSystemRepair function
2. Stops Windows Update Services
3. Remove the QMGR Data file, which stores BITS jobs
4. (Aggressive Only) Renames the DataStore and CatRoot2 folders
DataStore - Contains the Windows Update History and Log Files
CatRoot2 - Contains the Signatures for Windows Update Packages
5. Renames the Windows Update Download Folder
6. Deletes the Windows Update Log
7. (Aggressive Only) Resets the Security Descriptors on the Windows Update Services
8. Reregisters the BITS and Windows Update DLLs
9. Removes the WSUS client settings
10. Resets WinSock
11. Gets and deletes all BITS jobs
12. Sets the startup type of the Windows Update Services then starts them
13. Forces Windows Update to check for updates
.PARAMETER Aggressive
If specified, the script will take additional steps to repair Windows Update that are more dangerous, take a significant amount of time, or are generally unnecessary
#>
param($Aggressive = $false)
Write-Progress -Id 0 -Activity "Repairing Windows Update" -PercentComplete 0
Set-WinUtilTaskbaritem -state "Indeterminate" -overlay "logo"
Write-Host "Starting Windows Update Repair..."
# Wait for the first progress bar to show, otherwise the second one won't show
Start-Sleep -Milliseconds 200
if ($Aggressive) {
Invoke-WPFSystemRepair
}
Write-Progress -Id 0 -Activity "Repairing Windows Update" -Status "Stopping Windows Update Services..." -PercentComplete 10
# Stop the Windows Update Services
Write-Progress -Id 2 -ParentId 0 -Activity "Stopping Services" -Status "Stopping BITS..." -PercentComplete 0
Stop-Service -Name BITS -Force
Write-Progress -Id 2 -ParentId 0 -Activity "Stopping Services" -Status "Stopping wuauserv..." -PercentComplete 20
Stop-Service -Name wuauserv -Force
Write-Progress -Id 2 -ParentId 0 -Activity "Stopping Services" -Status "Stopping appidsvc..." -PercentComplete 40
Stop-Service -Name appidsvc -Force
Write-Progress -Id 2 -ParentId 0 -Activity "Stopping Services" -Status "Stopping cryptsvc..." -PercentComplete 60
Stop-Service -Name cryptsvc -Force
Write-Progress -Id 2 -ParentId 0 -Activity "Stopping Services" -Status "Completed" -PercentComplete 100
# Remove the QMGR Data file
Write-Progress -Id 0 -Activity "Repairing Windows Update" -Status "Renaming/Removing Files..." -PercentComplete 20
Write-Progress -Id 3 -ParentId 0 -Activity "Renaming/Removing Files" -Status "Removing QMGR Data files..." -PercentComplete 0
Remove-Item "$env:allusersprofile\Application Data\Microsoft\Network\Downloader\qmgr*.dat" -ErrorAction SilentlyContinue
if ($Aggressive) {
# Rename the Windows Update Log and Signature Folders
Write-Progress -Id 3 -ParentId 0 -Activity "Renaming/Removing Files" -Status "Renaming the Windows Update Log, Download, and Signature Folder..." -PercentComplete 20
Rename-Item $env:systemroot\SoftwareDistribution\DataStore DataStore.bak -ErrorAction SilentlyContinue
Rename-Item $env:systemroot\System32\Catroot2 catroot2.bak -ErrorAction SilentlyContinue
}
# Rename the Windows Update Download Folder
Write-Progress -Id 3 -ParentId 0 -Activity "Renaming/Removing Files" -Status "Renaming the Windows Update Download Folder..." -PercentComplete 20
Rename-Item $env:systemroot\SoftwareDistribution\Download Download.bak -ErrorAction SilentlyContinue
# Delete the legacy Windows Update Log
Write-Progress -Id 3 -ParentId 0 -Activity "Renaming/Removing Files" -Status "Removing the old Windows Update log..." -PercentComplete 80
Remove-Item $env:systemroot\WindowsUpdate.log -ErrorAction SilentlyContinue
Write-Progress -Id 3 -ParentId 0 -Activity "Renaming/Removing Files" -Status "Completed" -PercentComplete 100
if ($Aggressive) {
# Reset the Security Descriptors on the Windows Update Services
Write-Progress -Id 0 -Activity "Repairing Windows Update" -Status "Resetting the WU Service Security Descriptors..." -PercentComplete 25
Write-Progress -Id 4 -ParentId 0 -Activity "Resetting the WU Service Security Descriptors" -Status "Resetting the BITS Security Descriptor..." -PercentComplete 0
Start-Process -NoNewWindow -FilePath "sc.exe" -ArgumentList "sdset", "bits", "D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;AU)(A;;CCLCSWRPWPDTLOCRRC;;;PU)" -Wait
Write-Progress -Id 4 -ParentId 0 -Activity "Resetting the WU Service Security Descriptors" -Status "Resetting the wuauserv Security Descriptor..." -PercentComplete 50
Start-Process -NoNewWindow -FilePath "sc.exe" -ArgumentList "sdset", "wuauserv", "D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;AU)(A;;CCLCSWRPWPDTLOCRRC;;;PU)" -Wait
Write-Progress -Id 4 -ParentId 0 -Activity "Resetting the WU Service Security Descriptors" -Status "Completed" -PercentComplete 100
}
# Reregister the BITS and Windows Update DLLs
Write-Progress -Id 0 -Activity "Repairing Windows Update" -Status "Reregistering DLLs..." -PercentComplete 40
$oldLocation = Get-Location
Set-Location $env:systemroot\system32
$i = 0
$DLLs = @(
"atl.dll", "urlmon.dll", "mshtml.dll", "shdocvw.dll", "browseui.dll",
"jscript.dll", "vbscript.dll", "scrrun.dll", "msxml.dll", "msxml3.dll",
"msxml6.dll", "actxprxy.dll", "softpub.dll", "wintrust.dll", "dssenh.dll",
"rsaenh.dll", "gpkcsp.dll", "sccbase.dll", "slbcsp.dll", "cryptdlg.dll",
"oleaut32.dll", "ole32.dll", "shell32.dll", "initpki.dll", "wuapi.dll",
"wuaueng.dll", "wuaueng1.dll", "wucltui.dll", "wups.dll", "wups2.dll",
"wuweb.dll", "qmgr.dll", "qmgrprxy.dll", "wucltux.dll", "muweb.dll", "wuwebv.dll"
)
foreach ($dll in $DLLs) {
Write-Progress -Id 5 -ParentId 0 -Activity "Reregistering DLLs" -Status "Registering $dll..." -PercentComplete ($i / $DLLs.Count * 100)
$i++
Start-Process -NoNewWindow -FilePath "regsvr32.exe" -ArgumentList "/s", $dll
}
Set-Location $oldLocation
Write-Progress -Id 5 -ParentId 0 -Activity "Reregistering DLLs" -Status "Completed" -PercentComplete 100
# Remove the WSUS client settings
if (Test-Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate") {
Write-Progress -Id 0 -Activity "Repairing Windows Update" -Status "Removing WSUS client settings..." -PercentComplete 60
Write-Progress -Id 6 -ParentId 0 -Activity "Removing WSUS client settings" -PercentComplete 0
Remove-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate" -Name "AccountDomainSid" -ErrorAction SilentlyContinue
Remove-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate" -Name "PingID" -ErrorAction SilentlyContinue
Remove-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate" -Name "SusClientId" -ErrorAction SilentlyContinue
Write-Progress -Id 6 -ParentId 0 -Activity "Removing WSUS client settings" -Status "Completed" -PercentComplete 100
}
# Remove Group Policy Windows Update settings
Write-Progress -Id 0 -Activity "Repairing Windows Update" -Status "Removing Group Policy Windows Update settings..." -PercentComplete 60
Write-Progress -Id 7 -ParentId 0 -Activity "Removing Group Policy Windows Update settings" -PercentComplete 0
Remove-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate" -Name "ExcludeWUDriversInQualityUpdate" -ErrorAction SilentlyContinue
Write-Host "Defaulting driver offering through Windows Update..."
Remove-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\Device Metadata" -Name "PreventDeviceMetadataFromNetwork" -ErrorAction SilentlyContinue
Remove-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\DriverSearching" -Name "DontPromptForWindowsUpdate" -ErrorAction SilentlyContinue
Remove-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\DriverSearching" -Name "DontSearchWindowsUpdate" -ErrorAction SilentlyContinue
Remove-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\DriverSearching" -Name "DriverUpdateWizardWuSearchEnabled" -ErrorAction SilentlyContinue
Remove-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate" -Name "ExcludeWUDriversInQualityUpdate" -ErrorAction SilentlyContinue
Write-Host "Defaulting Windows Update automatic restart..."
Remove-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU" -Name "NoAutoRebootWithLoggedOnUsers" -ErrorAction SilentlyContinue
Remove-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU" -Name "AUPowerManagement" -ErrorAction SilentlyContinue
Write-Host "Clearing ANY Windows Update Policy settings..."
Remove-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings" -Name "BranchReadinessLevel" -ErrorAction SilentlyContinue
Remove-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings" -Name "DeferFeatureUpdatesPeriodInDays" -ErrorAction SilentlyContinue
Remove-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings" -Name "DeferQualityUpdatesPeriodInDays" -ErrorAction SilentlyContinue
Remove-Item -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Policies" -Recurse -Force -ErrorAction SilentlyContinue
Remove-Item -Path "HKCU:\Software\Microsoft\WindowsSelfHost" -Recurse -Force -ErrorAction SilentlyContinue
Remove-Item -Path "HKCU:\Software\Policies" -Recurse -Force -ErrorAction SilentlyContinue
Remove-Item -Path "HKLM:\Software\Microsoft\Policies" -Recurse -Force -ErrorAction SilentlyContinue
Remove-Item -Path "HKLM:\Software\Microsoft\Windows\CurrentVersion\Policies" -Recurse -Force -ErrorAction SilentlyContinue
Remove-Item -Path "HKLM:\Software\Microsoft\Windows\CurrentVersion\WindowsStore\WindowsUpdate" -Recurse -Force -ErrorAction SilentlyContinue
Remove-Item -Path "HKLM:\Software\Microsoft\WindowsSelfHost" -Recurse -Force -ErrorAction SilentlyContinue
Remove-Item -Path "HKLM:\Software\Policies" -Recurse -Force -ErrorAction SilentlyContinue
Remove-Item -Path "HKLM:\Software\WOW6432Node\Microsoft\Policies" -Recurse -Force -ErrorAction SilentlyContinue
Remove-Item -Path "HKLM:\Software\WOW6432Node\Microsoft\Windows\CurrentVersion\Policies" -Recurse -Force -ErrorAction SilentlyContinue
Remove-Item -Path "HKLM:\Software\WOW6432Node\Microsoft\Windows\CurrentVersion\WindowsStore\WindowsUpdate" -Recurse -Force -ErrorAction SilentlyContinue
Start-Process -NoNewWindow -FilePath "secedit" -ArgumentList "/configure", "/cfg", "$env:windir\inf\defltbase.inf", "/db", "defltbase.sdb", "/verbose" -Wait
Start-Process -NoNewWindow -FilePath "cmd.exe" -ArgumentList "/c RD /S /Q $env:WinDir\System32\GroupPolicyUsers" -Wait
Start-Process -NoNewWindow -FilePath "cmd.exe" -ArgumentList "/c RD /S /Q $env:WinDir\System32\GroupPolicy" -Wait
Start-Process -NoNewWindow -FilePath "gpupdate" -ArgumentList "/force" -Wait
Write-Progress -Id 7 -ParentId 0 -Activity "Removing Group Policy Windows Update settings" -Status "Completed" -PercentComplete 100
# Reset WinSock
Write-Progress -Id 0 -Activity "Repairing Windows Update" -Status "Resetting WinSock..." -PercentComplete 65
Write-Progress -Id 7 -ParentId 0 -Activity "Resetting WinSock" -Status "Resetting WinSock..." -PercentComplete 0
Start-Process -NoNewWindow -FilePath "netsh" -ArgumentList "winsock", "reset"
Start-Process -NoNewWindow -FilePath "netsh" -ArgumentList "winhttp", "reset", "proxy"
Start-Process -NoNewWindow -FilePath "netsh" -ArgumentList "int", "ip", "reset"
Write-Progress -Id 7 -ParentId 0 -Activity "Resetting WinSock" -Status "Completed" -PercentComplete 100
# Get and delete all BITS jobs
Write-Progress -Id 0 -Activity "Repairing Windows Update" -Status "Deleting BITS jobs..." -PercentComplete 75
Write-Progress -Id 8 -ParentId 0 -Activity "Deleting BITS jobs" -Status "Deleting BITS jobs..." -PercentComplete 0
Get-BitsTransfer | Remove-BitsTransfer
Write-Progress -Id 8 -ParentId 0 -Activity "Deleting BITS jobs" -Status "Completed" -PercentComplete 100
# Change the startup type of the Windows Update Services and start them
Write-Progress -Id 0 -Activity "Repairing Windows Update" -Status "Starting Windows Update Services..." -PercentComplete 90
Write-Progress -Id 9 -ParentId 0 -Activity "Starting Windows Update Services" -Status "Starting BITS..." -PercentComplete 0
Get-Service BITS | Set-Service -StartupType Manual -PassThru | Start-Service
Write-Progress -Id 9 -ParentId 0 -Activity "Starting Windows Update Services" -Status "Starting wuauserv..." -PercentComplete 25
Get-Service wuauserv | Set-Service -StartupType Manual -PassThru | Start-Service
Write-Progress -Id 9 -ParentId 0 -Activity "Starting Windows Update Services" -Status "Starting AppIDSvc..." -PercentComplete 50
# The AppIDSvc service is protected, so the startup type has to be changed in the registry
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\AppIDSvc" -Name "Start" -Value "3" # Manual
Start-Service AppIDSvc
Write-Progress -Id 9 -ParentId 0 -Activity "Starting Windows Update Services" -Status "Starting CryptSvc..." -PercentComplete 75
Get-Service CryptSvc | Set-Service -StartupType Manual -PassThru | Start-Service
Write-Progress -Id 9 -ParentId 0 -Activity "Starting Windows Update Services" -Status "Completed" -PercentComplete 100
# Force Windows Update to check for updates
Write-Progress -Id 0 -Activity "Repairing Windows Update" -Status "Forcing discovery..." -PercentComplete 95
Write-Progress -Id 10 -ParentId 0 -Activity "Forcing discovery" -Status "Forcing discovery..." -PercentComplete 0
try {
(New-Object -ComObject Microsoft.Update.AutoUpdate).DetectNow()
} catch {
Set-WinUtilTaskbaritem -state "Error" -overlay "warning"
Write-Warning "Failed to create Windows Update COM object: $_"
}
Start-Process -NoNewWindow -FilePath "wuauclt" -ArgumentList "/resetauthorization", "/detectnow"
Write-Progress -Id 10 -ParentId 0 -Activity "Forcing discovery" -Status "Completed" -PercentComplete 100
Write-Progress -Id 0 -Activity "Repairing Windows Update" -Status "Completed" -PercentComplete 100
Set-WinUtilTaskbaritem -state "None" -overlay "checkmark"
$ButtonType = [System.Windows.MessageBoxButton]::OK
$MessageboxTitle = "Reset Windows Update "
$Messageboxbody = ("Stock settings loaded.`n Please reboot your computer")
$MessageIcon = [System.Windows.MessageBoxImage]::Information
[System.Windows.MessageBox]::Show($Messageboxbody, $MessageboxTitle, $ButtonType, $MessageIcon)
Write-Host "==============================================="
Write-Host "-- Reset All Windows Update Settings to Stock -"
Write-Host "==============================================="
# Remove the progress bars
Write-Progress -Id 0 -Activity "Repairing Windows Update" -Completed
Write-Progress -Id 1 -Activity "Scanning for corruption" -Completed
Write-Progress -Id 2 -Activity "Stopping Services" -Completed
Write-Progress -Id 3 -Activity "Renaming/Removing Files" -Completed
Write-Progress -Id 4 -Activity "Resetting the WU Service Security Descriptors" -Completed
Write-Progress -Id 5 -Activity "Reregistering DLLs" -Completed
Write-Progress -Id 6 -Activity "Removing Group Policy Windows Update settings" -Completed
Write-Progress -Id 7 -Activity "Resetting WinSock" -Completed
Write-Progress -Id 8 -Activity "Deleting BITS jobs" -Completed
Write-Progress -Id 9 -Activity "Starting Windows Update Services" -Completed
Write-Progress -Id 10 -Activity "Forcing discovery" -Completed
}
```
@@ -0,0 +1,35 @@
---
title: "WinGet - Reinstall"
description: ""
editUrl: false
---
:::note
This page is generated from [`functions/public/Invoke-WPFFixesWinget.ps1`](https://github.com/ChrisTitusTech/winutil/blob/main/functions/public/Invoke-WPFFixesWinget.ps1). Do not edit this page directly.
:::
```powershell title="functions/public/Invoke-WPFFixesWinget.ps1"
function Invoke-WPFFixesWinget {
<#
.SYNOPSIS
Fixes WinGet by running `choco install winget`
.DESCRIPTION
BravoNorris for the fantastic idea of a button to reinstall WinGet
#>
# Install Choco if not already present
try {
Set-WinUtilTaskbaritem -state "Indeterminate" -overlay "logo"
Write-Host "==> Starting WinGet Repair"
Install-WinUtilWinget
} catch {
Write-Error "Failed to install WinGet: $_"
Set-WinUtilTaskbaritem -state "Error" -overlay "warning"
} finally {
Write-Host "==> Finished WinGet Repair"
Set-WinUtilTaskbaritem -state "None" -overlay "checkmark"
}
}
```
@@ -0,0 +1,22 @@
---
title: "Computer Management"
description: ""
editUrl: false
---
:::note
This page is generated from [`config/feature.json`](https://github.com/ChrisTitusTech/winutil/blob/main/config/feature.json). Do not edit this page directly.
:::
```json title="config/feature.json"
"WPFPanelComputer": {
"Content": "Computer Management",
"category": "Legacy Windows Panels",
"panel": "2",
"Type": "Button",
"ButtonWidth": "300",
"InvokeScript": [
"compmgmt.msc"
],
}
```
@@ -0,0 +1,22 @@
---
title: "Control Panel"
description: ""
editUrl: false
---
:::note
This page is generated from [`config/feature.json`](https://github.com/ChrisTitusTech/winutil/blob/main/config/feature.json). Do not edit this page directly.
:::
```json title="config/feature.json"
"WPFPanelControl": {
"Content": "Control Panel",
"category": "Legacy Windows Panels",
"panel": "2",
"Type": "Button",
"ButtonWidth": "300",
"InvokeScript": [
"control"
],
}
```
@@ -0,0 +1,22 @@
---
title: "Windows Defender Firewall"
description: ""
editUrl: false
---
:::note
This page is generated from [`config/feature.json`](https://github.com/ChrisTitusTech/winutil/blob/main/config/feature.json). Do not edit this page directly.
:::
```json title="config/feature.json"
"WPFPanelFirewall": {
"Content": "Windows Defender Firewall",
"category": "Legacy Windows Panels",
"panel": "2",
"Type": "Button",
"ButtonWidth": "300",
"InvokeScript": [
"firewall.cpl"
],
}
```
@@ -0,0 +1,22 @@
---
title: "Mouse Properties"
description: ""
editUrl: false
---
:::note
This page is generated from [`config/feature.json`](https://github.com/ChrisTitusTech/winutil/blob/main/config/feature.json). Do not edit this page directly.
:::
```json title="config/feature.json"
"WPFPanelMouse": {
"Content": "Mouse Properties",
"category": "Legacy Windows Panels",
"panel": "2",
"Type": "Button",
"ButtonWidth": "300",
"InvokeScript": [
"main.cpl"
],
}
```
@@ -0,0 +1,22 @@
---
title: "Network Connections"
description: ""
editUrl: false
---
:::note
This page is generated from [`config/feature.json`](https://github.com/ChrisTitusTech/winutil/blob/main/config/feature.json). Do not edit this page directly.
:::
```json title="config/feature.json"
"WPFPanelNetwork": {
"Content": "Network Connections",
"category": "Legacy Windows Panels",
"panel": "2",
"Type": "Button",
"ButtonWidth": "300",
"InvokeScript": [
"ncpa.cpl"
],
}
```
@@ -0,0 +1,22 @@
---
title: "Power Panel"
description: ""
editUrl: false
---
:::note
This page is generated from [`config/feature.json`](https://github.com/ChrisTitusTech/winutil/blob/main/config/feature.json). Do not edit this page directly.
:::
```json title="config/feature.json"
"WPFPanelPower": {
"Content": "Power Panel",
"category": "Legacy Windows Panels",
"panel": "2",
"Type": "Button",
"ButtonWidth": "300",
"InvokeScript": [
"powercfg.cpl"
],
}
```

Some files were not shown because too many files have changed in this diff Show More