Compare commits

...
89 Commits
Author SHA1 Message Date
Chris TitusandGitHub a0142ace72 chore: Update generated dev docs and JSON links (#4909) 2026-08-03 19:12:47 -05:00
OmarandGitHub 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
OmarandGitHub 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
OmarandGitHub 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 FaizandGitHub 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)andGitHub 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
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)andGitHub 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)andGitHub 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
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)andGitHub 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 TitusandGitHub e591161dac Update sponsors in README (#4900) 2026-08-01 10:46:40 -05:00
Chris TitusandGitHub d98f8a9916 Update README.md 2026-07-31 15:32:15 -05:00
Chris TitusandGitHub 144d516751 chore: Update generated dev docs (#4895) 2026-07-31 15:29:34 -05:00
Sean (ANGRYxScotsman)andGitHub 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 HikriandGitHub 5f37ef4a80 ci: read the PR body from env instead of interpolating it into the shell (#4880) 2026-07-28 14:11:17 -05:00
OmarandGitHub 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
OmarGitHubChris Tituscoderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
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 TitusandGitHub fae58d73c4 Update sponsors in README (#4881) 2026-07-28 11:10:13 -05:00
Chris TitusandGitHub 9e2989964e Update sponsors in README (#4878) 2026-07-27 11:14:18 -05:00
OmarandGitHub 50be7390e5 fix: restore WindowStyle to SingleBorderWindow for proper window framing (#4868) 2026-07-22 12:42:25 -05:00
Chris TitusandGitHub 8ab02ae756 chore: Update generated dev docs (#4873) 2026-07-22 12:42:13 -05:00
OmarandGitHub 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ł GwozdowskiandGitHub 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 TitusandGitHub 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
OmarandGitHub 3d1904ebbe fix: wrap Tweaks header buttons to prevent layout clipping (#4847) 2026-07-16 10:29:16 -05:00
Chris TitusandGitHub 70f1c50bdd chore: Update generated dev docs (#4846) 2026-07-15 23:37:16 -05:00
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 TitusandGitHub 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 TitusandGitHub 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
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
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
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 TitusandGitHub 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
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ł GwozdowskiandGitHub 157a66b14d Update Invoke-WPFUIElements.ps1 (#4824) 2026-07-13 13:20:53 -05:00
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 TitusandGitHub c8e756dc11 chore: Update generated dev docs (#4838) 2026-07-13 11:40:20 -05:00
Sean (ANGRYxScotsman)andGitHub 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 TitusandGitHub 8cd8679512 chore: Update generated dev docs (#4837) 2026-07-13 11:37:52 -05:00
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
KarimandGitHub 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 TitusandGitHub fea9f4e869 chore: Update generated dev docs (#4836) 2026-07-13 10:26:33 -05:00
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 RazoandGitHub 90a19685f5 fix(install): use correctly-scoped $app instead of undefined $Apps in app entry rendering (#4834) 2026-07-13 04:23:24 -05:00
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
eduardodepaivaandGitHub aeaef46e30 Fix names in applications.json. (#4819) 2026-07-08 10:25:15 -05:00
Ivan LepekhaandGitHub 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
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 TitusandGitHub 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
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
GabiandGitHub 9fed8d1c4c Reapply font scaling after theme change (#4782) 2026-07-04 00:29:22 -05:00
Chris TitusandGitHub 4ae3549b8a chore: Update generated dev docs (#4806) 2026-07-04 00:21:28 -05:00
Ivan LepekhaandGitHub 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
LKmXrandGitHub 9846dd7b49 Fix Multiplane Overlay toggle (#4768)
* Fix MPO values

DisableOverlays should be 0

* Update tweaks.json
2026-07-04 00:20:48 -05:00
eduardodepaivaandGitHub 466d32e690 Add MiniTool Partition Wizard and fix Everything sorting. (#4766) 2026-07-04 00:10:40 -05:00
Chris TitusandGitHub dce1536be0 chore: Update generated dev docs (#4805) 2026-07-04 00:06:25 -05:00
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
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 TitusandGitHub 8147903ff2 chore: Update generated dev docs (#4801) 2026-07-02 15:26:16 -05:00
GabiandGitHub 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 TitusandGitHub 32891ada55 Fix DHCP DNS reset handling (#4800) 2026-07-02 15:24:14 -05:00
Chris TitusandGitHub e2d6f8534e chore: Update generated dev docs (#4798) 2026-07-02 13:29:34 -05:00
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
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
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
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 TitusandGitHub 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)andGitHub 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 TitusandGitHub 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
GabiandGitHub 916dc761ba remove useless xaml changes (#4632) 2026-07-01 21:59:43 -05:00
Chris TitusandGitHub 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 TitusandGitHub c3b4f85fce Handle Microsoft Store winget sources (#4790) 2026-07-01 17:15:44 -05:00
Chris TitusandGitHub 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 TitusandGitHub 77dc64cbea chore: Update generated dev docs (#4787) 2026-07-01 12:24:30 -05:00
Sean (ANGRYxScotsman)andGitHub 72d47ba020 Update preset configuration (#4744)
* Update preset.json

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

* Update tweaks.json
2026-07-01 12:21:21 -05:00
Chris TitusandGitHub c7dfbeb7fe chore: Update generated dev docs (#4786) 2026-07-01 12:14:00 -05:00
GabiandGitHub 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]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
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
311 changed files with 21042 additions and 3611 deletions
+5 -1
View File
@@ -1,2 +1,6 @@
# Chris rules EVERYTHING (including paths listed below)
* @ChrisTitusTech
* @ChrisTitusTech
# Seanh1917 (ANGRYxScotsmans) is the docs guy
docs/ @ChrisTitusTech @seanh1995
tools/devdocs-generator.* @ChrisTitusTech @seanh1995
+85 -116
View File
@@ -1,149 +1,118 @@
## Contributing Code
# How to Contribute?
### Before You Start
## Testing
- Keep each pull request focused on a single feature or fix.
- Avoid unnecessary formatting changes or large unrelated edits.
- Document what changed and why in your PR description.
* 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**
## Basic Git Workflow
### 1. Fork the Repository
Go to the ChrisTitusTech/winutil repository on GitHub and click the Fork button in the top right corner.
<img width="171" height="50" alt="{650A4723-F38A-44A4-9820-D232BC87C8A0}" src="https://github.com/user-attachments/assets/a214f27c-2fee-444a-920f-d87b14f5896f" />
---
### 2. Clone Your Fork
```powershell
git clone https://github.com/YOUR_USERNAME/winutil.git
cd winutil
```ps1
irm https://christitus.com/windev | iex
```
---
> [!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!
### 3. Create a Branch
## Issues
Never work directly on `main`.
* If you encounter any challenges or problems with the script, I kindly request that you submit them via the "Issues" tab on the GitHub repository. By filling out the provided template, you can provide specific details about the issue, allowing me (and others in the community) to promptly address any bugs or consider feature requests.
Create a branch related to your change:
## Contribute Code
```powershell
git checkout -b feature-name
* 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 the `main` branch.
> [!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.
## Walk through
* This is a guide for beginners. If you are still having issues, look at the following official GitHub documentation:
* [Commit through WEB](https://docs.github.com/en/pull-requests/committing-changes-to-your-project/creating-and-editing-commits/about-commits)
* [Commit through GitHub Desktop](https://docs.github.com/en/desktop/making-changes-in-a-branch/committing-and-reviewing-changes-to-your-project-in-github-desktop#about-commits)
* [Create a Pull Request](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-a-pull-request)
### Overview
```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];
classDef default stroke:#333,stroke-width:4px,font-size:12pt;
```
Example:
> [!NOTE]
> This is a diagram to guide you through the process. It may vary depending on the type of change you're making.
```powershell
git checkout -b add-firefox-tweak
```
### 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](/docs/src/assets/contributing/Fork-Button-Dark.png)
### 4. Edit the Code
### 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.
Open the project in your preferred text editor and make your changes.
* Install GitHub Desktop if it is not already installed.
* Log in using the same GitHub account you used to fork WinUtil.
* Choose the fork under "Your Repositories" and press "clone {repo name}"
* Create a new branch and name it something relatable to your changes.
Keep changes small and focused.
* Now you can modify WinUtil to your liking using your preferred text editor.
---
### 5. Test Your Changes
### Testing your changes
Open Powershell as Administrator.
* To test to see if your changes work as intended, run the following commands in a PowerShell terminal as admin:
Go to the project folder:
* 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`
```powershell
cd path\to\winutil
```
![Compile](/docs/src/assets/contributing/Complie.png)
Run:
```powershell
.\Compile.ps1 -Run
```
Open PowerShell as Administrator.
Verify:
* 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.
- WinUtil launches correctly
- Your feature works
- Nothing else breaks
If something fails, fix it before committing.
### Committing the changes
* Before committing your changes, please discard changes made to the `winutil.ps1` file, like the following:
---
![Push Commit Image](/docs/src/assets/contributing/Discard-GHD.png)
### 6. Review Your Changes
* Now, commit your changes once you are happy with the result.
Check what changed:
![Commit Image](/docs/src/assets/contributing/Commit-GHD.png)
```powershell
git status
```
* Push the changes to upload them to your fork on GitHub.
Review the diff:
![Push Commit Image](/docs/src/assets/contributing/Push-Commit.png)
```powershell
git diff
```
Make sure you did not accidentally modify unrelated files.
---
### 7. Commit Your Changes
Stage files:
```powershell
git add .
```
Commit them:
```powershell
git commit -m "Add feature description"
```
Example:
```powershell
git commit -m "Add Firefox package tweak"
```
---
### 8. Push Your Branch
```powershell
git push origin branch-name
```
Example:
```powershell
git push origin add-firefox-tweak
```
---
### 9. Open a Pull Request
Go to your fork on GitHub.
GitHub will show a button to create a pull request.
<img width="1009" height="71" alt="{C8C6A3CC-79D4-44FD-A54C-4C5717F12730}" src="https://github.com/user-attachments/assets/0419d193-d4e7-47c0-87cf-b986742201a0" />
Before submitting:
- Explain what changed
- Explain why you changed it
- Make sure unrelated files are not included
Once submitted, maintainers will review your PR.
### 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 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.
+8
View File
@@ -18,6 +18,14 @@ body:
- 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: dropdown
id: affected_part
attributes:
+1 -1
View File
@@ -7,7 +7,7 @@
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/assets/images/Title-Screen.png)
![screen-install](/docs/src/assets/branding/title-screen.png)
## 💡 Come usarlo
+2 -2
View File
@@ -1,4 +1,4 @@
name: Auto-merge Docs PRs
name: Auto-merge Automated Update PRs
on:
pull_request:
@@ -8,7 +8,7 @@ on:
jobs:
auto-merge:
if: github.event.pull_request.head.ref == 'docs-update' && (github.event.pull_request.user.login == 'ChrisTitusTech' || github.event.pull_request.user.login == 'github-actions[bot]')
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
@@ -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 -76
View File
@@ -1,4 +1,4 @@
name: Deploy Hugo site to Pages
name: Deploy Astro site to Pages
on:
push:
@@ -6,106 +6,34 @@ on:
- main
paths:
- "docs/**"
- "config/tweaks.json"
- "config/feature.json"
- "functions/**"
workflow_dispatch:
permissions:
contents: read
pages: write
id-token: write
pull-requests: write
concurrency:
group: "pages"
cancel-in-progress: false
defaults:
run:
shell: bash
jobs:
build:
if: github.repository == 'ChrisTitusTech/winutil'
runs-on: ubuntu-latest
env:
HUGO_VERSION: 0.156.0
HUGO_ENVIRONMENT: production
TZ: America/Chicago
steps:
- name: Install Hugo CLI
run: |
wget -O ${{ runner.temp }}/hugo.deb https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_extended_${HUGO_VERSION}_linux-amd64.deb \
&& sudo dpkg -i ${{ runner.temp }}/hugo.deb
- name: Checkout
uses: actions/checkout@v7
with:
submodules: recursive
fetch-depth: 0
persist-credentials: false
- name: Setup Pages
id: pages
uses: actions/configure-pages@v6
- name: Generate Dev Docs from JSON
shell: pwsh
run: |
Set-Location tools
./devdocs-generator.ps1
- name: Create Pull Request
id: cpr
uses: peter-evans/create-pull-request@v8
- name: Install, build, and upload your site
uses: withastro/action@v6
with:
token: ${{ secrets.AUTO_MERGE }}
commit-message: 'chore: Update generated dev docs'
title: 'chore: Update Generated Dev Docs'
body: 'Automated update of generated documentation from JSON sources'
branch: docs-update
delete-branch: true
add-paths: |
docs/content/dev/
config/tweaks.json
config/feature.json
labels: |
automated
documentation
- name: Check outputs
run: |
echo "Pull Request Number - ${{ steps.cpr.outputs.pull-request-number }}"
echo "Pull Request URL - ${{ steps.cpr.outputs.pull-request-url }}"
- name: Install Node.js dependencies
run: "cd docs && [[ -f package-lock.json || -f npm-shrinkwrap.json ]] && npm ci || true"
- name: Cache Restore
id: cache-restore
uses: actions/cache/restore@v5
with:
path: |
${{ runner.temp }}/hugo_cache
key: hugo-${{ github.run_id }}
restore-keys: hugo-
- name: Build with Hugo
run: |
hugo \
--gc \
--minify \
--cleanDestinationDir \
--source docs \
--cacheDir "${{ runner.temp }}/hugo_cache"
- name: Cache Save
id: cache-save
uses: actions/cache/save@v5
with:
path: |
${{ runner.temp }}/hugo_cache
key: ${{ steps.cache-restore.outputs.cache-primary-key }}
- name: Upload artifact
uses: actions/upload-pages-artifact@v5
with:
path: ./docs/public
path: docs
deploy:
if: github.repository == 'ChrisTitusTech/winutil'
@@ -1,77 +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:
- name: Process slash command
uses: actions/github-script@v9
with:
script: |
const allowedUsers = ["ChrisTitusTech", "og-mrk", "Marterich", "MyDrift-user", "Real-MullaC", "CodingWonders", "GabiNun2", "FluffyPunk"];
const commenter = context.payload.comment.user.login;
// Authorization check first — before any parsing of comment content
if (!allowedUsers.includes(commenter)) {
console.log(`User ${commenter} is not in the allowlist. Skipping.`);
return;
}
// Read comment body as data, never interpolated into shell
const body = context.payload.comment.body;
const issueNumber = context.issue.number;
const owner = context.repo.owner;
const repo = context.repo.repo;
// /label 'name' or /label name
const labelMatch = body.match(/\/label\s+'([^']+)'|\/label\s+(\S+?)(?:\s|$)/);
if (labelMatch) {
const labelName = (labelMatch[1] || labelMatch[2]).trim();
console.log(`Adding label: ${labelName}`);
await github.rest.issues.addLabels({
owner, repo, issue_number: issueNumber,
labels: [labelName],
});
}
// /unlabel 'name' or /unlabel name
const unlabelMatch = body.match(/\/unlabel\s+'([^']+)'|\/unlabel\s+(\S+?)(?:\s|$)/);
if (unlabelMatch) {
const labelName = (unlabelMatch[1] || unlabelMatch[2]).trim();
console.log(`Removing label: ${labelName}`);
await github.rest.issues.removeLabel({
owner, repo, issue_number: issueNumber,
name: labelName,
});
}
// /close (optionally with 'not planned')
if (body.includes('/close')) {
const stateReason = body.includes('not planned') ? 'not_planned' : 'completed';
console.log(`Closing issue (reason: ${stateReason})`);
await github.rest.issues.update({
owner, repo, issue_number: issueNumber,
state: 'closed',
state_reason: stateReason,
});
}
// /open or /reopen
if (body.includes('/open') || body.includes('/reopen')) {
console.log('Reopening issue');
await github.rest.issues.update({
owner, repo, issue_number: issueNumber,
state: 'open',
});
}
+22 -5
View File
@@ -31,21 +31,23 @@ 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 JSON Links
- 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 documentation links in JSON configs'
title: 'chore: Update Generated Dev Docs'
body: 'Automated update of documentation links in JSON configs from pre-release build'
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
@@ -109,6 +111,21 @@ jobs:
config-name: release-drafter.yml
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@v3
@@ -116,7 +133,7 @@ jobs:
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
+4 -2
View File
@@ -26,13 +26,15 @@ jobs:
id: cpr
uses: peter-evans/create-pull-request@v8
with:
token: ${{ secrets.GITHUB_TOKEN }}
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
labels: |
automated
skip-changelog
- name: Check outputs
run: |
+21 -10
View File
@@ -9,14 +9,22 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
- name: lint
uses: devblackops/github-action-psscriptanalyzer@master
with:
sendComment: false
settingsPath: lint/PSScriptAnalyser.ps1
failOnErrors: false
failOnWarnings: false
failOnInfos: false
- 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
@@ -27,13 +35,16 @@ jobs:
- 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:
+5 -4
View File
@@ -5,6 +5,7 @@ Microsoft.PowerShell.ConsoleHost.dll
winutil.exe.config
winutil.ps1
binary/
testResults.xml
# general software/os specific
desktop.ini
@@ -13,7 +14,7 @@ desktop.ini
.vscode/
.idea/
# hugo files
docs/public/
docs/.hugo_build.lock
docs/resources/
# hugo files (archived docs)
docs-old/public/
docs-old/.hugo_build.lock
docs-old/resources/
+194
View File
@@ -0,0 +1,194 @@
# 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.**
This repository follows the AGENTS.md convention: these instructions are for Codex, Claude Code, Cursor, Windsurf, Copilot, Aider, Devin, Amp, and other coding agents that read `AGENTS.md`.
## 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. Change source files and compile.
2. **Do not commit `winutil.ps1`.** It is ignored locally and generated by GitHub Actions for releases.
3. **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.
4. **Disagree when the premise is wrong.** Say what is wrong before acting on it.
5. **Stop when genuinely ambiguous.** If two interpretations would produce materially different diffs, ask before editing.
6. **Touch only what the task requires.** No drive-by refactors, formatting sweeps, or unrelated cleanup.
7. **Verify before saying done.** A plausible-looking diff is not proof.
## 1. 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: Hugo site under `docs/`.
- Release artifact: generated root `winutil.ps1`.
### Key Commands
- Compile:
```powershell
.\Compile.ps1
```
- Compile and run GUI:
```powershell
.\Compile.ps1 -Run
```
- Run tests:
```powershell
Import-Module Pester -RequiredVersion 5.8.0 -Force
Invoke-Pester -Path 'pester/*.Tests.ps1' -Output Detailed
```
- Run Script Analyzer with project settings when available:
```powershell
Invoke-ScriptAnalyzer -Path . -Settings .\lint\PSScriptAnalyser.ps1 -Recurse
```
Prefer the narrowest useful verification while iterating. Use the full relevant check before finishing.
## 2. Source Of Truth
Make durable changes only in files consumed by `Compile.ps1` or in documentation/test files:
- `scripts/start.ps1` for startup/bootstrap code.
- `functions/public/*.ps1` for UI-facing and user-facing workflows.
- `functions/private/*.ps1` for internal helpers.
- `config/*.json` for applications, tweaks, features, DNS, presets, navigation, themes, and related declarative data.
- `xaml/inputXML.xaml` for the WPF UI layout.
- `tools/autounattend.xml` for the embedded unattended Windows setup template.
- `scripts/main.ps1` for the final entrypoint and GUI initialization logic appended during compile.
- `pester/*.Tests.ps1` for automated checks.
- `docs/` for Hugo documentation.
If behavior changes require the compiled script to change, update these source files and run `.\Compile.ps1` only to verify generation.
## 3. 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, do not rely on runtime module imports or source-relative dot-sourcing unless the compiled script will also contain the required code/data.
## 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. A button named `WPFExampleButton` is typically handled by `Invoke-WPFExampleButton`.
- Use `$sync` for shared state and UI references, consistent with the existing runspace 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.
- 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.
- 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.
## 9. Generated Files And Git Hygiene
- Treat local `winutil.ps1` changes as disposable compile output.
- Never stage or commit `winutil.ps1`, `docs/public/`, `docs/resources/`, `binary/`, editor folders, or other ignored build artifacts.
- 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.
## 10. Documentation Expectations
- Update `docs/content/` when user-facing behavior changes.
- Update developer docs when architecture, build flow, config schema, or contribution workflow changes.
- Keep README changes brief and high-level.
- Put detailed user and developer documentation under `docs/`.
- Keep `SPEC.md` aligned with build/runtime contract 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.
- 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, keep offline WIM servicing to one mount, one `/Add-Driver`, and one commit; do not export editions or run unrelated WIM cleanup, and reject damaged metadata before ISO export.
- 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.
+3 -1
View File
@@ -10,7 +10,9 @@ $sync.configs = @{}
$script = (Get-Content -Path scripts\start.ps1) -replace '#{replaceme}', (Get-Date -Format 'yy.MM.dd')
$script += Get-ChildItem -Path functions -Recurse -File | Get-Content -Raw
$script += Get-ChildItem -Path functions -Recurse -File | ForEach-Object {
Get-Content -Path $_.FullName -Raw
}
Get-ChildItem config | ForEach-Object {
$obj = Get-Content -Path $_.FullName -Raw | ConvertFrom-Json
+3 -2
View File
@@ -6,7 +6,8 @@
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.
![Title Screen](/docs/assets/images/Title-Screen.png)
![Title Screen](docs/src/assets/branding/title-screen.png)
---
@@ -77,7 +78,7 @@ See https://github.com/ChrisTitusTech/winutil/blob/main/.github/CONTRIBUTING.md
These are the sponsors that help keep this project alive with monthly contributions.
<!-- 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 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/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/andrewpayne68"><img src="https:&#x2F;&#x2F;github.com&#x2F;andrewpayne68.png" width="60px" alt="User avatar: Andrew P" /></a><!-- sponsors -->
<!-- sponsors --><a href="https://github.com/ysaito8015"><img src="https:&#x2F;&#x2F;github.com&#x2F;ysaito8015.png" width="60px" alt="User avatar: Yusuke Saito" /></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" /></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/andrewpayne68"><img src="https:&#x2F;&#x2F;github.com&#x2F;andrewpayne68.png" width="60px" alt="User avatar: Andrew P" /></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/Abs313a"><img src="https:&#x2F;&#x2F;github.com&#x2F;Abs313a.png" width="60px" alt="User avatar: Abs" /></a><!-- sponsors -->
---
+105
View File
@@ -0,0 +1,105 @@
# SPEC.md
## Project Contract
WinUtil is a Windows PowerShell utility with a WPF interface. The repository is maintained as modular source files, but the released artifact is a single generated `winutil.ps1` script.
The compiled `winutil.ps1` is not source code for editing or review. It is generated by `Compile.ps1` and produced during release automation. All durable changes must be made to the source files that feed the compiler.
## 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.
## 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.
- `docs/`: Hugo documentation site.
- `winutil.ps1`: ignored generated build artifact.
## Compile Specification
`Compile.ps1` must produce a standalone root `winutil.ps1` by combining all required project files.
The compile flow is:
1. Initialize shared state with `$sync = [Hashtable]::Synchronized(@{})` and `$sync.configs = @{}`.
2. Read `scripts/start.ps1`.
3. Replace `#{replaceme}` in startup code with the current `yy.MM.dd` build date.
4. Append raw content from all files under `functions/` recursively.
5. For every file in `config/`, parse JSON and embed it into `$sync.configs.<basename>`.
6. Special-case `config/applications.json` so application keys are emitted with the `WPFInstall` prefix.
7. Embed `xaml/inputXML.xaml` as `$inputXML`.
8. Embed `tools/autounattend.xml` as `$WinUtilAutounattendXml`.
9. Append `scripts/main.ps1`.
10. Write the combined script to `winutil.ps1`.
11. If `-Run` is supplied, execute the generated script.
The generated script must have everything it needs from repository sources embedded or appended by this process.
## 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 should use runspaces or existing async patterns so the UI remains responsive.
- UI updates from background work must be dispatched back to the WPF UI thread.
- Declarative features such as apps, tweaks, presets, DNS providers, and navigation should 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 existing naming conventions, where an element named like `WPFThingButton` maps to a function named like `Invoke-WPFThingButton`.
- When adding controls, ensure the XAML name, config key, and PowerShell function names line up with the existing event system.
## Configuration Contract
Config files must remain valid JSON and compile cleanly through `ConvertFrom-Json`.
`config/applications.json` defines installable applications. Each application entry should include 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 should include original values or original states when applicable so undo workflows can restore user systems.
Preset and navigation files should reference valid config keys. Avoid renaming config keys unless all presets, UI references, docs, and code paths are updated together.
## Safety Requirements
- Registry, service, package manager, Windows Update, AppX removal, and ISO operations can affect the host system. Changes must be explicit, reversible where practical, and consistent with existing logging and confirmation patterns.
- Tweak changes should include undo metadata when the schema supports it.
- Package installation should prefer existing WinGet and Chocolatey helper functions.
- ISO workflows must not modify the user's original ISO file; they should work on copied/mounted content following existing patterns.
## Testing And CI
Expected validation for source changes:
- `.\Compile.ps1` verifies the compiler can generate `winutil.ps1`.
- `.\Compile.ps1 -Run` compiles and launches the generated utility for manual GUI verification.
- `Install-Module -Name Pester -RequiredVersion 5.8.0 -Scope CurrentUser -Force -SkipPublisherCheck` installs the supported Pester version.
- `Import-Module Pester -RequiredVersion 5.8.0 -Force; Invoke-Pester -Path 'pester/*.Tests.ps1' -Output Detailed -CI` runs the Pester suite.
- GitHub Actions also runs a compile check and PowerShell Script Analyzer with `lint/PSScriptAnalyser.ps1`.
The generated `winutil.ps1` may appear locally after compile. It remains ignored build output and must not be committed.
## Release Artifact
GitHub Actions is responsible for producing the release `winutil.ps1` from repository sources. A release should be considered valid only if the generated script came from the compile process, not from direct manual edits to `winutil.ps1`.
+208 -19
View File
@@ -18,7 +18,7 @@
"foss": true
},
"adobe": {
"category": "Multimedia Tools",
"category": "Document",
"choco": "adobereader",
"content": "Adobe Acrobat Reader",
"description": "Adobe Acrobat Reader is a free PDF viewer with essential features for viewing, printing, and annotating PDF documents.",
@@ -161,6 +161,15 @@
"winget": "Cemu.Cemu",
"foss": true
},
"chatgpt": {
"category": "Development",
"choco": "na",
"content": "ChatGPT Desktop",
"description": "The official ChatGPT desktop app for Windows, distributed through the Microsoft Store.",
"link": "https://apps.microsoft.com/detail/9nt1r1c2hh7j",
"winget": "msstore:9NT1R1C2HH7J",
"foss": false
},
"chatterino": {
"category": "Communications",
"choco": "chatterino",
@@ -188,6 +197,33 @@
"winget": "Hibbiki.Chromium",
"foss": true
},
"cinebenchr23": {
"category": "Pro Tools",
"choco": "na",
"content": "Cinebench R23",
"description": "Cinebench R23 is a benchmark tool for comparing CPU rendering performance across systems.",
"link": "https://www.maxon.net/en/cinebench",
"winget": "Maxon.CinebenchR23",
"foss": false
},
"claude": {
"category": "Development",
"choco": "claude",
"content": "Claude Desktop",
"description": "Anthropic's Claude desktop application for focused AI-assisted work and chat.",
"link": "https://claude.ai/download",
"winget": "Anthropic.Claude",
"foss": false
},
"claude-code": {
"category": "Development",
"choco": "claude-code",
"content": "Claude Code",
"description": "Anthropic's agentic coding tool for terminal and IDE development workflows.",
"link": "https://code.claude.com/",
"winget": "Anthropic.ClaudeCode",
"foss": false
},
"cmake": {
"category": "Development",
"choco": "cmake",
@@ -197,6 +233,15 @@
"winget": "Kitware.CMake",
"foss": true
},
"codex": {
"category": "Development",
"choco": "codex",
"content": "Codex",
"description": "Codex CLI is an OpenAI coding agent that runs locally in your terminal.",
"link": "https://developers.openai.com/codex/cli",
"winget": "OpenAI.Codex",
"foss": true
},
"cpuz": {
"category": "Pro Tools",
"choco": "cpu-z",
@@ -314,6 +359,15 @@
"winget": "Microsoft.DotNet.DesktopRuntime.10",
"foss": true
},
"dropbox": {
"category": "Utilities",
"choco": "dropbox",
"content": "Dropbox",
"description": "Dropbox is a cloud storage client for syncing files, sharing content, and keeping documents available across devices.",
"link": "https://www.dropbox.com/desktop",
"winget": "Dropbox.Dropbox",
"foss": false
},
"eaapp": {
"category": "Games",
"choco": "ea-app",
@@ -404,6 +458,15 @@
"winget": "flux.flux",
"foss": false
},
"foxpdfreader": {
"category": "Document",
"choco": "foxitreader",
"content": "Foxit PDF Reader",
"description": "Foxit PDF Reader is a free PDF viewer with a familiar ribbon-style interface.",
"link": "https://www.foxit.com/pdf-reader/",
"winget": "Foxit.FoxitReader",
"foss": false
},
"geforcenow": {
"category": "Games",
"choco": "nvidia-geforce-now",
@@ -476,6 +539,15 @@
"winget": "TechPowerUp.GPU-Z",
"foss": false
},
"gsudo": {
"category": "Pro Tools",
"choco": "gsudo",
"content": "gsudo",
"description": "gsudo is a sudo equivalent for Windows. It allows you to run commands with elevated administrative privileges directly within the current console window.",
"link": "https://github.com/gerardog/gsudo",
"winget": "gerardog.gsudo",
"foss": true
},
"helium": {
"category": "Browsers",
"choco": "helium",
@@ -539,6 +611,15 @@
"winget": "DuongDieuPhap.ImageGlass",
"foss": true
},
"internetdownloadmanager": {
"category": "Utilities",
"choco": "internet-download-manager",
"content": "Internet Download Manager",
"description": "Internet Download Manager is a download manager for accelerating, resuming, and scheduling file downloads.",
"link": "https://www.internetdownloadmanager.com/",
"winget": "Tonec.InternetDownloadManager",
"foss": false
},
"irfanview": {
"category": "Multimedia Tools",
"choco": "irfanview",
@@ -629,6 +710,15 @@
"winget": "sylikc.JPEGView",
"foss": true
},
"joplin": {
"category": "Document",
"choco": "joplin",
"content": "Joplin",
"description": "Joplin is an open-source note-taking and to-do application with synchronization capabilities.",
"link": "https://joplinapp.org/",
"winget": "Joplin.Joplin",
"foss": true
},
"keepassxc": {
"category": "Utilities",
"choco": "keepassxc",
@@ -656,15 +746,6 @@
"winget": "XBMCFoundation.Kodi",
"foss": true
},
"lightshot": {
"category": "Multimedia Tools",
"choco": "lightshot",
"content": "Lightshot",
"description": "The fastest way to take a customizable screenshot.",
"link": "https://app.prntscr.com/",
"winget": "Skillbrains.Lightshot",
"foss": false
},
"lazygit": {
"category": "Development",
"choco": "lazygit",
@@ -675,7 +756,7 @@
"foss": true
},
"libreoffice": {
"category": "Multimedia Tools",
"category": "Document",
"choco": "libreoffice-fresh",
"content": "LibreOffice",
"description": "LibreOffice is a powerful and free office suite, compatible with other major office suites.",
@@ -719,6 +800,15 @@
"winget": "Element.Element",
"foss": true
},
"minitoolpartitionwizard": {
"category": "Utilities",
"choco": "minitoolpartitionwizard",
"content": "MiniTool Partition Wizard",
"description": "Comprehensive free partition manager that performs advanced operations Windows natively cannot, such as merging partitions, converting file systems, and organizing disk capacity.",
"link": "https://www.partitionwizard.com/",
"winget": "MiniTool.PartitionWizard.Free",
"foss": false
},
"modrinth": {
"category": "Games",
"choco": "modrinth-app",
@@ -810,9 +900,9 @@
"foss": true
},
"naps2": {
"category": "Multimedia Tools",
"category": "Document",
"choco": "naps2",
"content": "NAPS2 (Document Scanner)",
"content": "NAPS2 (Scanner)",
"description": "NAPS2 is a document scanning application that simplifies the process of creating electronic documents.",
"link": "https://www.naps2.com/",
"winget": "Cyanfish.NAPS2",
@@ -908,7 +998,7 @@
"foss": true
},
"obsidian": {
"category": "Multimedia Tools",
"category": "Document",
"choco": "obsidian",
"content": "Obsidian",
"description": "Obsidian is a powerful note-taking and knowledge management application.",
@@ -916,6 +1006,15 @@
"winget": "Obsidian.Obsidian",
"foss": false
},
"okular": {
"category": "Document",
"choco": "okular",
"content": "Okular",
"description": "Okular is a versatile document viewer with advanced features.",
"link": "https://okular.kde.org/",
"winget": "KDE.Okular",
"foss": true
},
"onedrive": {
"category": "Microsoft Tools",
"choco": "onedrive",
@@ -926,7 +1025,7 @@
"foss": false
},
"onlyoffice": {
"category": "Multimedia Tools",
"category": "Document",
"choco": "onlyoffice",
"content": "ONLYOFFICE Desktop",
"description": "ONLYOFFICE Desktop is a comprehensive office suite for document editing and collaboration.",
@@ -1015,6 +1114,42 @@
"winget": "Giorgiotani.Peazip",
"foss": true
},
"pdf-xchange": {
"category": "Document",
"choco": "pdfxchangeeditor",
"content": "PDF-XChange Editor",
"description": "A comprehensive Windows-based software suite and editor for creating, viewing, editing, annotating, and signing PDF files.",
"link": "https://www.pdf-xchange.com/",
"winget": "TrackerSoftware.PDF-XChangeEditor",
"foss": false
},
"pdf24creator": {
"category": "Document",
"choco": "pdf24",
"content": "PDF24 Creator",
"description": "Free and easy-to-use online/desktop PDF tools that make you more productive",
"link": "https://tools.pdf24.org/en/creator",
"winget": "geeksoftwareGmbH.PDF24Creator",
"foss": false
},
"pdfgear": {
"category": "Document",
"choco": "pdfgear",
"content": "PDFgear",
"description": "PDFgear is a piece of full-featured PDF management software for Windows, macOS, and mobile, and it's completely free to use.",
"link": "https://www.pdfgear.com/",
"winget": "PDFgear.PDFgear",
"foss": false
},
"pdfsam": {
"category": "Document",
"choco": "pdfsam",
"content": "PDFsam Basic",
"description": "PDFsam Basic is a free and open-source tool for splitting, merging, and rotating PDF files.",
"link": "https://pdfsam.org/",
"winget": "PDFsam.PDFsam",
"foss": true
},
"playnite": {
"category": "Games",
"choco": "playnite",
@@ -1135,7 +1270,7 @@
"processmonitor": {
"category": "Microsoft Tools",
"choco": "procexp",
"content": "SysInternals Process Monitor",
"content": "Process Monitor",
"description": "SysInternals Process Monitor is an advanced monitoring tool that shows real-time file system, registry, and process/thread activity.",
"link": "https://docs.microsoft.com/en-us/sysinternals/downloads/procmon",
"winget": "Microsoft.Sysinternals.ProcessMonitor",
@@ -1267,6 +1402,15 @@
"winget": "WhirlwindFX.SignalRgb",
"foss": false
},
"simplenote": {
"category": "Document",
"choco": "simplenote",
"content": "Simplenote",
"description": "Simplenote is an easy way to keep notes, lists, ideas and more.",
"link": "https://simplenote.com/",
"winget": "Automattic.Simplenote",
"foss": true
},
"simplewall": {
"category": "Pro Tools",
"choco": "simplewall",
@@ -1285,6 +1429,15 @@
"winget": "SlackTechnologies.Slack",
"foss": false
},
"startallback": {
"category": "Utilities",
"choco": "StartAllBack",
"content": "StartAllBack",
"description": "StartAllBack restores and improves Windows taskbar, Start menu, File Explorer, and shell UI behavior.",
"link": "https://www.startallback.com/",
"winget": "StartIsBack.StartAllBack",
"foss": false
},
"steam": {
"category": "Games",
"choco": "steam-client",
@@ -1303,6 +1456,15 @@
"winget": "SublimeHQ.SublimeText.4",
"foss": false
},
"sumatra": {
"category": "Document",
"choco": "sumatrapdf",
"content": "Sumatra PDF",
"description": "Sumatra PDF is a lightweight and fast PDF viewer with minimalistic design.",
"link": "https://www.sumatrapdfreader.org/free-pdf-reader.html",
"winget": "SumatraPDF.SumatraPDF",
"foss": true
},
"sunshine": {
"category": "Selfhosted Tools",
"choco": "sunshine",
@@ -1315,7 +1477,7 @@
"tcpview": {
"category": "Microsoft Tools",
"choco": "tcpview",
"content": "SysInternals TCPView",
"content": "TCPView",
"description": "SysInternals TCPView is a network monitoring tool that displays a detailed list of all TCP and UDP endpoints on your system.",
"link": "https://docs.microsoft.com/en-us/sysinternals/downloads/tcpview",
"winget": "Microsoft.Sysinternals.TCPView",
@@ -1432,7 +1594,7 @@
"ungoogled": {
"category": "Browsers",
"choco": "ungoogled-chromium",
"content": "Ungoogled",
"content": "Ungoogled Chromium",
"description": "Ungoogled Chromium is a version of Chromium without Google's integration for enhanced privacy and control.",
"link": "https://github.com/Eloston/ungoogled-chromium",
"winget": "eloston.ungoogled-chromium",
@@ -1450,7 +1612,7 @@
"everything": {
"category": "Utilities",
"choco": "everything",
"content": "VoidTools Everything",
"content": "Everything",
"description": "Everything is a search engine that locates files and folders by filename instantly for Windows. Unlike Windows search Everything initially displays every file and folder on your computer (hence the name Everything). You type in a search filter to limit what files and folders are displayed.",
"link": "https://www.voidtools.com/",
"winget": "voidtools.Everything",
@@ -1573,6 +1735,15 @@
"winget": "Waterfox.Waterfox",
"foss": true
},
"whatsapp": {
"category": "Communications",
"choco": "na",
"content": "WhatsApp Desktop",
"description": "WhatsApp Desktop is the official Windows desktop messaging app from Meta, distributed through the Microsoft Store.",
"link": "https://apps.microsoft.com/detail/9nksqgp7f2nh",
"winget": "msstore:9NKSQGP7F2NH",
"foss": false
},
"wingetui": {
"category": "Utilities",
"choco": "wingetui",
@@ -1636,6 +1807,15 @@
"winget": "MHNexus.HxD",
"foss": false
},
"xournal": {
"category": "Document",
"choco": "xournalplusplus",
"content": "Xournal++",
"description": "Xournal++ is an open-source handwriting notetaking software with PDF annotation capabilities.",
"link": "https://xournalpp.github.io/",
"winget": "Xournal++.Xournal++",
"foss": true
},
"yarn": {
"category": "Development",
"choco": "yarn",
@@ -1717,6 +1897,15 @@
"winget": "ZedIndustries.Zed",
"foss": true
},
"zotero": {
"category": "Document",
"choco": "zotero",
"content": "Zotero",
"description": "Zotero is a free, easy-to-use tool to help you collect, organize, cite, and share your research materials.",
"link": "https://www.zotero.org/",
"winget": "DigitalScholar.Zotero",
"foss": true
},
"deskflow": {
"category": "Utilities",
"choco": "deskflow",
+263
View File
@@ -0,0 +1,263 @@
{
"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"
}
}
+16 -8
View File
@@ -3,48 +3,56 @@
"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":{
"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"
"Secondary6": "2a10:50c0::bad2:ff",
"DohTemplate": "https://family.adguard-dns.com/dns-query"
}
}
+86 -42
View File
@@ -9,7 +9,7 @@
"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",
@@ -19,7 +19,7 @@
"Type": "Button",
"ButtonWidth": "300",
"function": "Invoke-WPFFixesNTPPool",
"link": "https://winutil.christitus.com/dev/features/fixes/ntppool"
"link": "https://winutil.christitus.com/code-reference/features/fixes/ntppool"
},
"WPFFeatureshyperv": {
"Content": "Hyper-V - Enable",
@@ -29,7 +29,7 @@
"feature": [
"Microsoft-Hyper-V-All"
],
"link": "https://winutil.christitus.com/dev/features/features/hyperv"
"link": "https://winutil.christitus.com/code-reference/features/features/hyperv"
},
"WPFFeatureslegacymedia": {
"Content": "Legacy Media Components (WMP, DirectPlay) - Enable",
@@ -43,7 +43,7 @@
"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 (WSL) - Enable",
@@ -55,7 +55,7 @@
"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": "Network File System (NFS) - Enable",
@@ -74,7 +74,7 @@
"nfsadmin client start",
"nfsadmin client localhost config fileaccess=755 SecFlavors=+sys -krb5 -krb5i"
],
"link": "https://winutil.christitus.com/dev/features/features/nfs"
"link": "https://winutil.christitus.com/code-reference/features/features/nfs"
},
"WPFFeatureRegBackup": {
"Content": "Registry Backup (Daily Task 12:30am) - Enable",
@@ -91,7 +91,7 @@
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": "Legacy F8 Boot Recovery - Enable",
@@ -102,7 +102,7 @@
"InvokeScript": [
"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": "Legacy F8 Boot Recovery - Disable",
@@ -113,7 +113,7 @@
"InvokeScript": [
"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 - Enable",
@@ -123,7 +123,7 @@
"feature": [
"Containers-DisposableClientVM"
],
"link": "https://winutil.christitus.com/dev/features/features/sandbox"
"link": "https://winutil.christitus.com/code-reference/features/features/sandbox"
},
"WPFFeatureInstall": {
"Content": "Install Features",
@@ -132,7 +132,7 @@
"Type": "Button",
"ButtonWidth": "300",
"function": "Invoke-WPFFeatureInstall",
"link": "https://winutil.christitus.com/dev/features/features/install"
"link": "https://winutil.christitus.com/code-reference/features/features/install"
},
"WPFPanelAutologin": {
"Content": "AutoLogon - Run",
@@ -141,7 +141,7 @@
"Type": "Button",
"ButtonWidth": "300",
"function": "Invoke-WPFPanelAutologin",
"link": "https://winutil.christitus.com/dev/features/fixes/autologin"
"link": "https://winutil.christitus.com/code-reference/features/fixes/autologin"
},
"WPFFixesUpdate": {
"Content": "Windows Update - Reset",
@@ -150,7 +150,7 @@
"Type": "Button",
"ButtonWidth": "300",
"function": "Invoke-WPFFixesUpdate",
"link": "https://winutil.christitus.com/dev/features/fixes/update"
"link": "https://winutil.christitus.com/code-reference/features/fixes/update"
},
"WPFFixesNetwork": {
"Content": "Network - Reset",
@@ -159,7 +159,7 @@
"Type": "Button",
"ButtonWidth": "300",
"function": "Invoke-WPFFixesNetwork",
"link": "https://winutil.christitus.com/dev/features/fixes/network"
"link": "https://winutil.christitus.com/code-reference/features/fixes/network"
},
"WPFPanelDISM": {
"Content": "System Corruption Scan - Run",
@@ -168,7 +168,7 @@
"Type": "Button",
"ButtonWidth": "300",
"function": "Invoke-WPFSystemRepair",
"link": "https://winutil.christitus.com/dev/features/fixes/dism"
"link": "https://winutil.christitus.com/code-reference/features/fixes/dism"
},
"WPFFixesWinget": {
"Content": "WinGet - Reinstall",
@@ -177,18 +177,7 @@
"Type": "Button",
"ButtonWidth": "300",
"function": "Invoke-WPFFixesWinget",
"link": "https://winutil.christitus.com/dev/features/fixes/winget"
},
"WPFPanelControl": {
"Content": "Control Panel",
"category": "Legacy Windows Panels",
"panel": "2",
"Type": "Button",
"ButtonWidth": "300",
"InvokeScript": [
"control"
],
"link": "https://winutil.christitus.com/dev/features/legacy-windows-panels/control"
"link": "https://winutil.christitus.com/code-reference/features/fixes/winget"
},
"WPFPanelComputer": {
"Content": "Computer Management",
@@ -199,7 +188,29 @@
"InvokeScript": [
"compmgmt.msc"
],
"link": "https://winutil.christitus.com/dev/features/legacy-windows-panels/computer"
"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",
@@ -210,7 +221,7 @@
"InvokeScript": [
"ncpa.cpl"
],
"link": "https://winutil.christitus.com/dev/features/legacy-windows-panels/network"
"link": "https://winutil.christitus.com/code-reference/features/legacy-windows-panels/network"
},
"WPFPanelPower": {
"Content": "Power Panel",
@@ -221,7 +232,7 @@
"InvokeScript": [
"powercfg.cpl"
],
"link": "https://winutil.christitus.com/dev/features/legacy-windows-panels/power"
"link": "https://winutil.christitus.com/code-reference/features/legacy-windows-panels/power"
},
"WPFPanelPrinter": {
"Content": "Printer Panel",
@@ -232,7 +243,18 @@
"InvokeScript": [
"Start-Process 'shell:::{A8A91A66-3A7D-4424-8D24-04E180695C7A}'"
],
"link": "https://winutil.christitus.com/dev/features/legacy-windows-panels/printer"
"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",
@@ -243,18 +265,18 @@
"InvokeScript": [
"intl.cpl"
],
"link": "https://winutil.christitus.com/dev/features/legacy-windows-panels/region"
"link": "https://winutil.christitus.com/code-reference/features/legacy-windows-panels/region"
},
"WPFPanelRestore": {
"Content": "Windows Restore",
"WPFPanelSecurity": {
"Content": "Security and Maintenance",
"category": "Legacy Windows Panels",
"panel": "2",
"Type": "Button",
"ButtonWidth": "300",
"InvokeScript": [
"rstrui.exe"
"wscui.cpl"
],
"link": "https://winutil.christitus.com/dev/features/legacy-windows-panels/restore"
"link": "https://winutil.christitus.com/code-reference/features/legacy-windows-panels/security"
},
"WPFPanelSound": {
"Content": "Sound Settings",
@@ -265,7 +287,7 @@
"InvokeScript": [
"mmsys.cpl"
],
"link": "https://winutil.christitus.com/dev/features/legacy-windows-panels/sound"
"link": "https://winutil.christitus.com/code-reference/features/legacy-windows-panels/sound"
},
"WPFPanelSystem": {
"Content": "System Properties",
@@ -276,7 +298,7 @@
"InvokeScript": [
"sysdm.cpl"
],
"link": "https://winutil.christitus.com/dev/features/legacy-windows-panels/system"
"link": "https://winutil.christitus.com/code-reference/features/legacy-windows-panels/system"
},
"WPFPanelTimedate": {
"Content": "Time and Date",
@@ -287,7 +309,29 @@
"InvokeScript": [
"timedate.cpl"
],
"link": "https://winutil.christitus.com/dev/features/legacy-windows-panels/timedate"
"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": "CTT PowerShell Profile - Install",
@@ -296,7 +340,7 @@
"Type": "Button",
"ButtonWidth": "300",
"function": "Invoke-WinUtilInstallPSProfile",
"link": "https://winutil.christitus.com/dev/features/powershell-profile-powershell-7--only/installpsprofile"
"link": "https://winutil.christitus.com/code-reference/features/powershell-profile-powershell-7--only/installpsprofile"
},
"WPFWinUtilUninstallPSProfile": {
"Content": "CTT PowerShell Profile - Remove",
@@ -305,7 +349,7 @@
"Type": "Button",
"ButtonWidth": "300",
"function": "Invoke-WinUtilUninstallPSProfile",
"link": "https://winutil.christitus.com/dev/features/powershell-profile-powershell-7--only/uninstallpsprofile"
"link": "https://winutil.christitus.com/code-reference/features/powershell-profile-powershell-7--only/uninstallpsprofile"
},
"WPFWinUtilSSHServer": {
"Content": "OpenSSH Server - Enable",
@@ -314,6 +358,6 @@
"Type": "Button",
"ButtonWidth": "300",
"function": "Invoke-WPFSSHServer",
"link": "https://winutil.christitus.com/dev/features/remote-access/sshserver"
"link": "https://winutil.christitus.com/code-reference/features/remote-access/sshserver"
}
}
+21 -3
View File
@@ -4,7 +4,6 @@
"WPFTweaksConsumerFeatures",
"WPFTweaksDisableExplorerAutoDiscovery",
"WPFTweaksWPBT",
"WPFTweaksDeBloat",
"WPFTweaksLocation",
"WPFTweaksServices",
"WPFTweaksTelemetry",
@@ -16,17 +15,16 @@
],
"Minimal": [
"WPFTweaksConsumerFeatures",
"WPFTweaksDeBloat",
"WPFTweaksWPBT",
"WPFTweaksServices",
"WPFTweaksTelemetry"
],
"Advanced": [
"WPFTweaksRestorePoint",
"WPFTweaksActivity",
"WPFTweaksConsumerFeatures",
"WPFTweaksDisableExplorerAutoDiscovery",
"WPFTweaksWPBT",
"WPFTweaksDeBloat",
"WPFTweaksLocation",
"WPFTweaksServices",
"WPFTweaksTelemetry",
@@ -39,5 +37,25 @@
"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"
]
}
+11 -10
View File
@@ -1,9 +1,10 @@
{
"shared": {
"AppEntryWidth": "200",
"AppEntryFontSize": "11",
"AppEntryMargin": "1,0,1,0",
"AppEntryBorderThickness": "0",
"AppEntryWidth": "220",
"AppEntryFontSize": "13.2",
"AppEntryIconSize": "28",
"AppEntryMargin": "3",
"AppEntryBorderThickness": "1",
"CustomDialogFontSize": "12",
"CustomDialogFontSizeHeader": "14",
"CustomDialogLogoSize": "25",
@@ -24,7 +25,7 @@
"IconFontSize": "14",
"IconButtonSize": "35",
"SettingsIconFontSize": "18",
"CloseIconFontSize": "18",
"CloseIconFontSize": "12",
"GroupBorderBackgroundColor": "#232629",
"ButtonFontSize": "12",
"ButtonFontFamily": "Arial",
@@ -45,7 +46,6 @@
"AppInstallUnselectedColor": "#F7F7F7",
"AppInstallHighlightedColor": "#CFCFCF",
"AppInstallSelectedColor": "#C2C2C2",
"AppInstallOverlayBackgroundColor": "#6A6D72",
"ComboBoxForegroundColor": "#232629",
"ComboBoxBackgroundColor": "#F7F7F7",
"LabelboxForegroundColor": "#232629",
@@ -59,17 +59,18 @@
"ScrollBarDraggingColor": "#6A6D72",
"ProgressBarForegroundColor": "#2E77FF",
"ProgressBarBackgroundColor": "Transparent",
"ProgressBarTextColor": "#232629",
"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",
@@ -85,7 +86,6 @@
"AppInstallUnselectedColor": "#232629",
"AppInstallHighlightedColor": "#3C3C3C",
"AppInstallSelectedColor": "#4C4C4C",
"AppInstallOverlayBackgroundColor": "#2E3135",
"ComboBoxForegroundColor": "#F7F7F7",
"ComboBoxBackgroundColor": "#1E3747",
"LabelboxForegroundColor": "#5BDCFF",
@@ -97,19 +97,20 @@
"ScrollBarBackgroundColor": "#2E3135",
"ScrollBarHoverColor": "#3B4252",
"ScrollBarDraggingColor": "#5E81AC",
"ProgressBarForegroundColor": "#222222",
"ProgressBarForegroundColor": "#6EFF72",
"ProgressBarBackgroundColor": "Transparent",
"ProgressBarTextColor": "#232629",
"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",
+109 -139
View File
@@ -27,7 +27,7 @@
"OriginalValue": "<RemoveEntry>"
}
],
"link": "https://winutil.christitus.com/dev/tweaks/essential-tweaks/activity"
"link": "https://winutil.christitus.com/code-reference/tweaks/essential-tweaks/activity"
},
"WPFTweaksHiber": {
"Content": "Hibernation - Disable",
@@ -56,7 +56,7 @@
"UndoScript": [
"powercfg.exe /hibernate on"
],
"link": "https://winutil.christitus.com/dev/tweaks/essential-tweaks/hiber"
"link": "https://winutil.christitus.com/code-reference/tweaks/essential-tweaks/hiber"
},
"WPFTweaksWidget": {
"Content": "Widgets - Remove",
@@ -75,7 +75,7 @@
Write-Host \"Removed widgets\"
"
],
"link": "https://winutil.christitus.com/dev/tweaks/essential-tweaks/widget"
"link": "https://winutil.christitus.com/code-reference/tweaks/essential-tweaks/widget"
},
"WPFTweaksRevertStartMenu": {
"Content": "Start Menu Previous Layout - Enable",
@@ -91,7 +91,7 @@
"OriginalValue": "<RemoveEntry>"
}
],
"link": "https://winutil.christitus.com/dev/tweaks/essential-tweaks/revertstartmenu"
"link": "https://winutil.christitus.com/code-reference/tweaks/essential-tweaks/revertstartmenu"
},
"WPFTweaksDisableStoreSearch": {
"Content": "Microsoft Store Recommended Search Results - Disable",
@@ -104,7 +104,7 @@
"UndoScript": [
"icacls \"$Env:LocalAppData\\Packages\\Microsoft.WindowsStore_8wekyb3d8bbwe\\LocalState\\store.db\" /grant Everyone:F"
],
"link": "https://winutil.christitus.com/dev/tweaks/essential-tweaks/disablestoresearch"
"link": "https://winutil.christitus.com/code-reference/tweaks/essential-tweaks/disablestoresearch"
},
"WPFTweaksLocation": {
"Content": "Location Tracking - Disable",
@@ -141,7 +141,7 @@
"OriginalValue": "1"
}
],
"link": "https://winutil.christitus.com/dev/tweaks/essential-tweaks/location"
"link": "https://winutil.christitus.com/code-reference/tweaks/essential-tweaks/location"
},
"WPFTweaksServices": {
"Content": "Services - Set to Manual",
@@ -181,7 +181,7 @@
Set-ItemProperty -Path \"HKLM:\\SYSTEM\\CurrentControlSet\\Control\" -Name SvcHostSplitThresholdInKB -Value $Memory
"
],
"link": "https://winutil.christitus.com/dev/tweaks/essential-tweaks/services"
"link": "https://winutil.christitus.com/code-reference/tweaks/essential-tweaks/services"
},
"WPFTweaksBraveDebloat": {
"Content": "Brave Browser - Debloat",
@@ -274,7 +274,7 @@
"OriginalValue": "<RemoveEntry>"
}
],
"link": "https://winutil.christitus.com/dev/tweaks/z--advanced-tweaks---caution/bravedebloat"
"link": "https://winutil.christitus.com/code-reference/tweaks/z--advanced-tweaks---caution/bravedebloat"
},
"WPFTweaksDisableWarningForUnsignedRdp": {
"Content": "RDP Unsigned File Warnings - Disable",
@@ -297,7 +297,7 @@
"OriginalValue": "<RemoveEntry>"
}
],
"link": "https://winutil.christitus.com/dev/tweaks/z--advanced-tweaks---caution/disablewarningforunsignedrdp"
"link": "https://winutil.christitus.com/code-reference/tweaks/z--advanced-tweaks---caution/disablewarningforunsignedrdp"
},
"WPFTweaksEdgeDebloat": {
"Content": "Microsoft Edge - Debloat",
@@ -425,11 +425,11 @@
"OriginalValue": "<RemoveEntry>"
}
],
"link": "https://winutil.christitus.com/dev/tweaks/z--advanced-tweaks---caution/edgedebloat"
"link": "https://winutil.christitus.com/code-reference/tweaks/z--advanced-tweaks---caution/edgedebloat"
},
"WPFTweaksConsumerFeatures": {
"Content": "ConsumerFeatures - Disable",
"Description": "Windows will not automatically install any games, third-party apps, or application links from the Windows Store for the signed-in user. Some default Apps will be inaccessible (e.g. Phone Link).",
"Description": "Stops promoted app installs and reduces app suggestions from Microsoft Store content.",
"category": "Essential Tweaks",
"panel": "1",
"registry": [
@@ -441,7 +441,7 @@
"OriginalValue": "<RemoveEntry>"
}
],
"link": "https://winutil.christitus.com/dev/tweaks/essential-tweaks/consumerfeatures"
"link": "https://winutil.christitus.com/code-reference/tweaks/essential-tweaks/consumerfeatures"
},
"WPFTweaksTelemetry": {
"Content": "Telemetry - Disable",
@@ -566,7 +566,7 @@
[Environment]::SetEnvironmentVariable('POWERSHELL_TELEMETRY_OPTOUT', '', 'Machine')
"
],
"link": "https://winutil.christitus.com/dev/tweaks/essential-tweaks/telemetry"
"link": "https://winutil.christitus.com/code-reference/tweaks/essential-tweaks/telemetry"
},
"WPFTweaksDeliveryOptimization": {
"Content": "Delivery Optimization - Disable",
@@ -582,7 +582,7 @@
"OriginalValue": "<RemoveEntry>"
}
],
"link": "https://winutil.christitus.com/dev/tweaks/essential-tweaks/deliveryoptimization"
"link": "https://winutil.christitus.com/code-reference/tweaks/essential-tweaks/deliveryoptimization"
},
"WPFTweaksRemoveEdge": {
"Content": "Microsoft Edge - Remove",
@@ -608,7 +608,7 @@
winget install Microsoft.Edge --source winget
"
],
"link": "https://winutil.christitus.com/dev/tweaks/z--advanced-tweaks---caution/removeedge"
"link": "https://winutil.christitus.com/code-reference/tweaks/z--advanced-tweaks---caution/removeedge"
},
"WPFTweaksDisableBitLocker": {
"Content": "BitLocker - Disable",
@@ -621,7 +621,7 @@
"UndoScript": [
"Enable-BitLocker -MountPoint $Env:SystemDrive"
],
"link": "https://winutil.christitus.com/dev/tweaks/essential-tweaks/disablebitlocker"
"link": "https://winutil.christitus.com/code-reference/tweaks/essential-tweaks/disablebitlocker"
},
"WPFTweaksUTC": {
"Content": "Date & Time - Set Time to UTC",
@@ -637,7 +637,7 @@
"OriginalValue": "0"
}
],
"link": "https://winutil.christitus.com/dev/tweaks/z--advanced-tweaks---caution/utc"
"link": "https://winutil.christitus.com/code-reference/tweaks/z--advanced-tweaks---caution/utc"
},
"WPFTweaksRemoveOneDrive": {
"Content": "Microsoft OneDrive - Remove",
@@ -650,7 +650,7 @@
icacls $Env:OneDrive /deny \"Administrators:(D,DC)\"
Write-Host \"Uninstalling OneDrive...\"
Start-Process 'C:\\Windows\\System32\\OneDriveSetup.exe' -ArgumentList '/uninstall' -Wait
Start-Process -FilePath (Join-Path $Env:SystemRoot \"System32\\OneDriveSetup.exe\") -ArgumentList '/uninstall' -Wait
# Some of OneDrive files use explorer, and OneDrive uses FileCoAuth
Write-Host \"Removing leftover OneDrive Files...\"
@@ -658,7 +658,7 @@
Stop-Process -Name FileCoAuth,Explorer
Remove-Item \"$Env:LocalAppData\\Microsoft\\OneDrive\" -Recurse -Force
Remove-Item \"C:\\ProgramData\\Microsoft OneDrive\" -Recurse -Force
Remove-Item \"$Env:ProgramData\\Microsoft OneDrive\" -Recurse -Force
# Grant back permission to access OneDrive folder
icacls $Env:OneDrive /grant \"Administrators:(D,DC)\"
@@ -681,7 +681,7 @@
Set-Service -Name OneSyncSvc -StartupType Automatic
"
],
"link": "https://winutil.christitus.com/dev/tweaks/z--advanced-tweaks---caution/removeonedrive"
"link": "https://winutil.christitus.com/code-reference/tweaks/z--advanced-tweaks---caution/removeonedrive"
},
"WPFTweaksRemoveHomeAndGallery": {
"Content": "File Explorer Home and Gallery - Disable",
@@ -711,7 +711,7 @@
"OriginalValue": "<RemoveEntry>"
}
],
"link": "https://winutil.christitus.com/dev/tweaks/z--advanced-tweaks---caution/removehomeandgallery"
"link": "https://winutil.christitus.com/code-reference/tweaks/z--advanced-tweaks---caution/removehomeandgallery"
},
"WPFTweaksDisplay": {
"Content": "Visual Effects - Set to Best Performance",
@@ -810,71 +810,7 @@
"UndoScript": [
"Remove-ItemProperty -Path \"HKCU:\\Control Panel\\Desktop\" -Name \"UserPreferencesMask\""
],
"link": "https://winutil.christitus.com/dev/tweaks/z--advanced-tweaks---caution/display"
},
"WPFTweaksXboxRemoval": {
"Content": "Xbox & Gaming Components - Remove",
"Description": "Removes Xbox services, the Xbox app, Game Bar, and related authentication components.",
"category": "z__Advanced Tweaks - CAUTION",
"panel": "1",
"registry": [
{
"Path": "HKCU:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\GameDVR",
"Name": "AppCaptureEnabled",
"Value": "0",
"Type": "DWord",
"OriginalValue": "1"
}
],
"appx": [
"Microsoft.XboxIdentityProvider",
"Microsoft.XboxSpeechToTextOverlay",
"Microsoft.GamingApp",
"Microsoft.Xbox.TCUI",
"Microsoft.XboxGamingOverlay"
],
"link": "https://winutil.christitus.com/dev/tweaks/z--advanced-tweaks---caution/xboxremoval"
},
"WPFTweaksDeBloat": {
"Content": "Unwanted Pre-Installed Apps - Remove",
"Description": "This will remove a bunch of Windows pre-installed applications which most people dont want on their system.",
"category": "Essential Tweaks",
"panel": "1",
"appx": [
"Microsoft.WindowsFeedbackHub",
"Microsoft.BingNews",
"Microsoft.BingSearch",
"Microsoft.BingWeather",
"Clipchamp.Clipchamp",
"Microsoft.Todos",
"Microsoft.PowerAutomateDesktop",
"Microsoft.MicrosoftSolitaireCollection",
"Microsoft.WindowsSoundRecorder",
"Microsoft.MicrosoftStickyNotes",
"Microsoft.Windows.DevHome",
"Microsoft.Paint",
"Microsoft.OutlookForWindows",
"Microsoft.WindowsAlarms",
"Microsoft.StartExperiencesApp",
"Microsoft.GetHelp",
"Microsoft.ZuneMusic",
"MicrosoftCorporationII.QuickAssist",
"MSTeams"
],
"InvokeScript": [
"
$TeamsPath = \"$Env:LocalAppData\\Microsoft\\Teams\\Update.exe\"
if (Test-Path $TeamsPath) {
Write-Host \"Uninstalling Teams\"
Start-Process $TeamsPath -ArgumentList -uninstall -wait
Write-Host \"Deleting Teams directory\"
Remove-Item $TeamsPath -Recurse -Force
}
"
],
"link": "https://winutil.christitus.com/dev/tweaks/essential-tweaks/debloat"
"link": "https://winutil.christitus.com/code-reference/tweaks/z--advanced-tweaks---caution/display"
},
"WPFTweaksReservedStorage": {
"Content": "Disable Reserved Storage",
@@ -887,7 +823,7 @@
"UndoScript": [
"DISM /Online /Set-ReservedStorageState /State:Enabled"
],
"link": "https://winutil.christitus.com/dev/tweaks/z--advanced-tweaks---caution/reservedstorage"
"link": "https://winutil.christitus.com/code-reference/tweaks/z--advanced-tweaks---caution/reservedstorage"
},
"WPFTweaksRestorePoint": {
"Content": "Restore Point - Create",
@@ -914,7 +850,7 @@
Write-Host \"System Restore Point Created Successfully\" -ForegroundColor Green
"
],
"link": "https://winutil.christitus.com/dev/tweaks/essential-tweaks/restorepoint"
"link": "https://winutil.christitus.com/code-reference/tweaks/essential-tweaks/restorepoint"
},
"WPFTweaksEndTaskOnTaskbar": {
"Content": "End Task With Right Click - Enable",
@@ -930,7 +866,7 @@
"OriginalValue": "<RemoveEntry>"
}
],
"link": "https://winutil.christitus.com/dev/tweaks/essential-tweaks/endtaskontaskbar"
"link": "https://winutil.christitus.com/code-reference/tweaks/essential-tweaks/endtaskontaskbar"
},
"WPFTweaksStorage": {
"Content": "Storage Sense - Disable",
@@ -946,7 +882,7 @@
"OriginalValue": "1"
}
],
"link": "https://winutil.christitus.com/dev/tweaks/z--advanced-tweaks---caution/storage"
"link": "https://winutil.christitus.com/code-reference/tweaks/z--advanced-tweaks---caution/storage"
},
"WPFTweaksWindowsAI": {
"Content": "Windows AI - Disable And Remove",
@@ -977,6 +913,7 @@
New-Item \"HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Appx\\AppxAllUserStore\\EndOfLife\\$Sid\\$Appx\" -Force
Get-AppxPackage -AllUsers \"*Copilot*\" | Remove-AppxPackage -AllUsers
winget uninstall -e --name \"Copilot\" --silent --force --accept-source-agreements 2>$null
Get-AppxPackage -AllUsers Microsoft.MicrosoftOfficeHub | Remove-AppxPackage -AllUsers
if ($Appx) {
@@ -989,7 +926,7 @@
Write-Host \"Windows AI Disabled\"
"
],
"link": "https://winutil.christitus.com/dev/tweaks/z--advanced-tweaks---caution/windowsai"
"link": "https://winutil.christitus.com/code-reference/tweaks/z--advanced-tweaks---caution/windowsai"
},
"WPFTweaksWPBT": {
"Content": "Windows Platform Binary Table (WPBT) - Disable",
@@ -1005,7 +942,23 @@
"OriginalValue": "<RemoveEntry>"
}
],
"link": "https://winutil.christitus.com/dev/tweaks/essential-tweaks/wpbt"
"link": "https://winutil.christitus.com/code-reference/tweaks/essential-tweaks/wpbt"
},
"WPFTweaksPreventDeviceMetadataFromNetwork": {
"Content": "Prevent Device Companion Apps",
"Description": "Prevents additional software from being installed when plugging in devices (e.g. Ads when plugging in a monitor). Poses potential security risk.",
"category": "Essential Tweaks",
"panel": "1",
"registry": [
{
"Path": "HKLM:\\SOFTWARE\\Policies\\Microsoft\\Windows\\Device Metadata",
"Name": "PreventDeviceMetadataFromNetwork",
"Value": "1",
"Type": "DWord",
"OriginalValue": "<RemoveEntry>"
}
],
"link": "https://winutil.christitus.com/code-reference/tweaks/essential-tweaks/preventdevicemetadatafromnetwork"
},
"WPFTweaksRazerBlock": {
"Content": "Razer Software Auto-Install - Disable",
@@ -1030,7 +983,7 @@
],
"InvokeScript": [
"
$RazerPath = \"C:\\Windows\\Installer\\Razer\"
$RazerPath = \"$Env:SystemRoot\\Installer\\Razer\"
if (Test-Path $RazerPath) {
Remove-Item $RazerPath\\* -Recurse -Force
@@ -1043,10 +996,10 @@
],
"UndoScript": [
"
icacls \"C:\\Windows\\Installer\\Razer\" /remove:d Everyone
icacls \"$Env:SystemRoot\\Installer\\Razer\" /remove:d Everyone
"
],
"link": "https://winutil.christitus.com/dev/tweaks/z--advanced-tweaks---caution/razerblock"
"link": "https://winutil.christitus.com/code-reference/tweaks/z--advanced-tweaks---caution/razerblock"
},
"WPFTweaksDisableNotifications": {
"Content": "System Tray Notifications & Calendar - Disable",
@@ -1069,7 +1022,7 @@
"OriginalValue": "1"
}
],
"link": "https://winutil.christitus.com/dev/tweaks/z--advanced-tweaks---caution/disablenotifications"
"link": "https://winutil.christitus.com/code-reference/tweaks/z--advanced-tweaks---caution/disablenotifications"
},
"WPFTweaksBlockAdobeNet": {
"Content": "Adobe URL Block List - Enable",
@@ -1095,7 +1048,7 @@
Write-Host 'Removed Adobe url block list from host file'
"
],
"link": "https://winutil.christitus.com/dev/tweaks/z--advanced-tweaks---caution/blockadobenet"
"link": "https://winutil.christitus.com/code-reference/tweaks/z--advanced-tweaks---caution/blockadobenet"
},
"WPFTweaksRightClickMenu": {
"Content": "Right-Click Menu Previous Layout - Enable",
@@ -1111,7 +1064,7 @@
"UndoScript": [
"Remove-Item -Path \"HKCU:\\Software\\Classes\\CLSID\\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\" -Recurse"
],
"link": "https://winutil.christitus.com/dev/tweaks/z--advanced-tweaks---caution/rightclickmenu"
"link": "https://winutil.christitus.com/code-reference/tweaks/z--advanced-tweaks---caution/rightclickmenu"
},
"WPFTweaksDiskCleanup": {
"Content": "Disk Cleanup - Run",
@@ -1124,7 +1077,7 @@
Dism.exe /online /Cleanup-Image /StartComponentCleanup /ResetBase
"
],
"link": "https://winutil.christitus.com/dev/tweaks/essential-tweaks/diskcleanup"
"link": "https://winutil.christitus.com/code-reference/tweaks/essential-tweaks/diskcleanup"
},
"WPFTweaksDeleteTempFiles": {
"Content": "Temporary Files - Remove",
@@ -1137,7 +1090,7 @@
Remove-Item -Path \"$Env:SystemRoot\\Temp\\*\" -Recurse -Force
"
],
"link": "https://winutil.christitus.com/dev/tweaks/essential-tweaks/deletetempfiles"
"link": "https://winutil.christitus.com/code-reference/tweaks/essential-tweaks/deletetempfiles"
},
"WPFTweaksIPv46": {
"Content": "IPv6 - Set IPv4 as Preferred",
@@ -1153,7 +1106,7 @@
"OriginalValue": "0"
}
],
"link": "https://winutil.christitus.com/dev/tweaks/z--advanced-tweaks---caution/ipv46"
"link": "https://winutil.christitus.com/code-reference/tweaks/z--advanced-tweaks---caution/ipv46"
},
"WPFTweaksTeredo": {
"Content": "Teredo - Disable",
@@ -1175,7 +1128,7 @@
"UndoScript": [
"netsh interface teredo set state default"
],
"link": "https://winutil.christitus.com/dev/tweaks/z--advanced-tweaks---caution/teredo"
"link": "https://winutil.christitus.com/code-reference/tweaks/z--advanced-tweaks---caution/teredo"
},
"WPFTweaksDisableIPv6": {
"Content": "IPv6 - Disable",
@@ -1197,7 +1150,7 @@
"UndoScript": [
"Enable-NetAdapterBinding -Name * -ComponentID ms_tcpip6"
],
"link": "https://winutil.christitus.com/dev/tweaks/z--advanced-tweaks---caution/disableipv6"
"link": "https://winutil.christitus.com/code-reference/tweaks/z--advanced-tweaks---caution/disableipv6"
},
"WPFTweaksDisableBGapps": {
"Content": "Background Apps - Disable",
@@ -1213,7 +1166,7 @@
"OriginalValue": "0"
}
],
"link": "https://winutil.christitus.com/dev/tweaks/z--advanced-tweaks---caution/disablebgapps"
"link": "https://winutil.christitus.com/code-reference/tweaks/z--advanced-tweaks---caution/disablebgapps"
},
"WPFTweaksDisableFSO": {
"Content": "Fullscreen Optimizations - Disable",
@@ -1229,7 +1182,7 @@
"OriginalValue": "0"
}
],
"link": "https://winutil.christitus.com/dev/tweaks/z--advanced-tweaks---caution/disablefso"
"link": "https://winutil.christitus.com/code-reference/tweaks/z--advanced-tweaks---caution/disablefso"
},
"WPFTweaksDisableExplorerAutoDiscovery": {
"Content": "File Explorer Automatic Folder Discovery - Disable",
@@ -1284,7 +1237,7 @@
Write-Host Please sign out and back in, or restart your computer to apply the changes!
"
],
"link": "https://winutil.christitus.com/dev/tweaks/essential-tweaks/disableexplorerautodiscovery"
"link": "https://winutil.christitus.com/code-reference/tweaks/essential-tweaks/disableexplorerautodiscovery"
},
"WPFToggleDetailedBSoD": {
"Content": "BSoD Verbose Mode",
@@ -1310,7 +1263,7 @@
"DefaultState": "false"
}
],
"link": "https://winutil.christitus.com/dev/tweaks/customize-preferences/detailedbsod"
"link": "https://winutil.christitus.com/code-reference/tweaks/customize-preferences/detailedbsod"
},
"WPFToggleBatteryPercentage": {
"Content": "System Tray Battery Percentage",
@@ -1328,7 +1281,7 @@
"DefaultState": "false"
}
],
"link": "https://winutil.christitus.com/dev/tweaks/customize-preferences/batterypercentage"
"link": "https://winutil.christitus.com/code-reference/tweaks/customize-preferences/batterypercentage"
},
"WPFToggleDarkMode": {
"Content": "Dark Theme for Windows",
@@ -1370,7 +1323,7 @@
}
"
],
"link": "https://winutil.christitus.com/dev/tweaks/customize-preferences/darkmode"
"link": "https://winutil.christitus.com/code-reference/tweaks/customize-preferences/darkmode"
},
"WPFToggleShowExt": {
"Content": "File Explorer File Extensions",
@@ -1398,7 +1351,7 @@
Invoke-WinUtilExplorerUpdate -action \"restart\"
"
],
"link": "https://winutil.christitus.com/dev/tweaks/customize-preferences/showext"
"link": "https://winutil.christitus.com/code-reference/tweaks/customize-preferences/showext"
},
"WPFToggleHiddenFiles": {
"Content": "File Explorer Hidden Files",
@@ -1426,7 +1379,7 @@
Invoke-WinUtilExplorerUpdate -action \"restart\"
"
],
"link": "https://winutil.christitus.com/dev/tweaks/customize-preferences/hiddenfiles"
"link": "https://winutil.christitus.com/code-reference/tweaks/customize-preferences/hiddenfiles"
},
"WPFToggleVerboseLogon": {
"Content": "Logon Verbose Mode",
@@ -1444,7 +1397,7 @@
"DefaultState": "false"
}
],
"link": "https://winutil.christitus.com/dev/tweaks/customize-preferences/verboselogon"
"link": "https://winutil.christitus.com/code-reference/tweaks/customize-preferences/verboselogon"
},
"WPFToggleNewOutlook": {
"Content": "Microsoft Outlook New Version",
@@ -1486,7 +1439,7 @@
"DefaultState": "true"
}
],
"link": "https://winutil.christitus.com/dev/tweaks/customize-preferences/newoutlook"
"link": "https://winutil.christitus.com/code-reference/tweaks/customize-preferences/newoutlook"
},
"WPFToggleScrollbars": {
"Content": "Scrollbars Always Visible",
@@ -1501,11 +1454,10 @@
"Value": "0",
"Type": "DWord",
"OriginalValue": "1",
"DefaultState": "false",
"link": "https://winutil.christitus.com/dev/tweaks/customize-preferences/scrollbars"
"DefaultState": "false"
}
],
"link": "https://winutil.christitus.com/dev/tweaks/customize-preferences/scrollbars"
"link": "https://winutil.christitus.com/code-reference/tweaks/customize-preferences/scrollbars"
},
"WPFToggleMultiplaneOverlay": {
"Content": "Multiplane Overlay",
@@ -1525,13 +1477,13 @@
{
"Path": "HKLM:\\SYSTEM\\CurrentControlSet\\Control\\GraphicsDrivers",
"Name": "DisableOverlays",
"Value": "1",
"Value": "0",
"Type": "DWord",
"OriginalValue": "0",
"DefaultState": "false"
"OriginalValue": "1",
"DefaultState": "true"
}
],
"link": "https://winutil.christitus.com/dev/tweaks/customize-preferences/multiplaneoverlay"
"link": "https://winutil.christitus.com/code-reference/tweaks/customize-preferences/multiplaneoverlay"
},
"WPFToggleMouseAcceleration": {
"Content": "Mouse Acceleration",
@@ -1565,7 +1517,7 @@
"DefaultState": "true"
}
],
"link": "https://winutil.christitus.com/dev/tweaks/customize-preferences/mouseacceleration"
"link": "https://winutil.christitus.com/code-reference/tweaks/customize-preferences/mouseacceleration"
},
"WPFToggleNumLock": {
"Content": "Num Lock on Startup",
@@ -1591,7 +1543,25 @@
"DefaultState": "false"
}
],
"link": "https://winutil.christitus.com/dev/tweaks/customize-preferences/numlock"
"link": "https://winutil.christitus.com/code-reference/tweaks/customize-preferences/numlock"
},
"WPFToggleWindowSnapping": {
"Content": "Window Snapping",
"Description": "Toggles the window snapping feature when dragging windows.",
"category": "Customize Preferences",
"panel": "2",
"Type": "Toggle",
"registry": [
{
"Path": "HKCU:\\Control Panel\\Desktop",
"Name": "WindowArrangementActive",
"Value": "1",
"Type": "String",
"OriginalValue": "0",
"DefaultState": "true"
}
],
"link": "https://winutil.christitus.com/code-reference/tweaks/customize-preferences/windowsnapping"
},
"WPFToggleStandbyFix": {
"Content": "S0 Sleep Network Connectivity",
@@ -1609,7 +1579,7 @@
"DefaultState": "true"
}
],
"link": "https://winutil.christitus.com/dev/tweaks/customize-preferences/standbyfix"
"link": "https://winutil.christitus.com/code-reference/tweaks/customize-preferences/standbyfix"
},
"WPFToggleS3Sleep": {
"Content": "S3 Sleep",
@@ -1627,7 +1597,7 @@
"DefaultState": "false"
}
],
"link": "https://winutil.christitus.com/dev/tweaks/customize-preferences/s3sleep"
"link": "https://winutil.christitus.com/code-reference/tweaks/customize-preferences/s3sleep"
},
"WPFToggleHideSettingsHome": {
"Content": "Settings Home Page",
@@ -1645,7 +1615,7 @@
"DefaultState": "true"
}
],
"link": "https://winutil.christitus.com/dev/tweaks/customize-preferences/hidesettingshome"
"link": "https://winutil.christitus.com/code-reference/tweaks/customize-preferences/hidesettingshome"
},
"WPFToggleBingSearch": {
"Content": "Start Menu Bing Search",
@@ -1663,7 +1633,7 @@
"DefaultState": "true"
}
],
"link": "https://winutil.christitus.com/dev/tweaks/customize-preferences/bingsearch"
"link": "https://winutil.christitus.com/code-reference/tweaks/customize-preferences/bingsearch"
},
"WPFToggleLoginBlur": {
"Content": "Logon Screen Acrylic Blur",
@@ -1681,7 +1651,7 @@
"DefaultState": "true"
}
],
"link": "https://winutil.christitus.com/dev/tweaks/customize-preferences/loginblur"
"link": "https://winutil.christitus.com/code-reference/tweaks/customize-preferences/loginblur"
},
"WPFTweaksDisableLockscreen": {
"Content": "Lock Screen - Disable",
@@ -1698,7 +1668,7 @@
"OriginalValue": "<RemoveEntry>"
}
],
"link": "https://winutil.christitus.com/dev/tweaks/customize-preferences/disablelockscreen"
"link": "https://winutil.christitus.com/code-reference/tweaks/customize-preferences/disablelockscreen"
},
"WPFToggleStartMenuRecommendations": {
"Content": "Start Menu Recommendations",
@@ -1742,7 +1712,7 @@
Invoke-WinUtilExplorerUpdate -action \"restart\"
"
],
"link": "https://winutil.christitus.com/dev/tweaks/customize-preferences/startmenurecommendations"
"link": "https://winutil.christitus.com/code-reference/tweaks/customize-preferences/startmenurecommendations"
},
"WPFToggleStickyKeys": {
"Content": "Sticky Keys",
@@ -1760,7 +1730,7 @@
"DefaultState": "true"
}
],
"link": "https://winutil.christitus.com/dev/tweaks/customize-preferences/stickykeys"
"link": "https://winutil.christitus.com/code-reference/tweaks/customize-preferences/stickykeys"
},
"WPFToggleTaskbarAlignment": {
"Content": "Taskbar Centered Icons",
@@ -1788,7 +1758,7 @@
Invoke-WinUtilExplorerUpdate -action \"restart\"
"
],
"link": "https://winutil.christitus.com/dev/tweaks/customize-preferences/taskbaralignment"
"link": "https://winutil.christitus.com/code-reference/tweaks/customize-preferences/taskbaralignment"
},
"WPFToggleTaskbarSearch": {
"Content": "Taskbar Search Icon",
@@ -1806,7 +1776,7 @@
"DefaultState": "true"
}
],
"link": "https://winutil.christitus.com/dev/tweaks/customize-preferences/taskbarsearch"
"link": "https://winutil.christitus.com/code-reference/tweaks/customize-preferences/taskbarsearch"
},
"WPFToggleTaskView": {
"Content": "Taskbar Task View Icon",
@@ -1824,7 +1794,7 @@
"DefaultState": "true"
}
],
"link": "https://winutil.christitus.com/dev/tweaks/customize-preferences/taskview"
"link": "https://winutil.christitus.com/code-reference/tweaks/customize-preferences/taskview"
},
"WPFToggleGameMode": {
"Content": "Game Mode",
@@ -1850,7 +1820,7 @@
"DefaultState": "true"
}
],
"link": "https://winutil.christitus.com/dev/tweaks/customize-preferences/gamemode"
"link": "https://winutil.christitus.com/code-reference/tweaks/customize-preferences/gamemode"
},
"WPFToggleLongPaths": {
"Content": "Enable Long Paths",
@@ -1868,14 +1838,14 @@
"DefaultState": "false"
}
],
"link": "https://winutil.christitus.com/dev/tweaks/customize-preferences/longpaths"
"link": "https://winutil.christitus.com/code-reference/tweaks/customize-preferences/longpaths"
},
"WPFOOSUbutton": {
"Content": "O&O ShutUp10++ - Run",
"category": "z__Advanced Tweaks - CAUTION",
"panel": "1",
"Type": "Button",
"link": "https://winutil.christitus.com/dev/tweaks/z--advanced-tweaks---caution/oosubutton"
"link": "https://winutil.christitus.com/code-reference/tweaks/z--advanced-tweaks---caution/oosubutton"
},
"WPFchangedns": {
"Content": "DNS - Set to:",
@@ -1883,7 +1853,7 @@
"panel": "1",
"Type": "Combobox",
"ComboItems": "Default DHCP Google Cloudflare Cloudflare_Malware Cloudflare_Malware_Adult Open_DNS Quad9 AdGuard_Ads_Trackers AdGuard_Ads_Trackers_Malware_Adult",
"link": "https://winutil.christitus.com/dev/tweaks/z--advanced-tweaks---caution/changedns"
"link": "https://winutil.christitus.com/code-reference/tweaks/z--advanced-tweaks---caution/changedns"
},
"WPFAddUltPerf": {
"Content": "Ultimate Performance Profile - Enable",
@@ -1891,7 +1861,7 @@
"panel": "2",
"Type": "Button",
"ButtonWidth": "300",
"link": "https://winutil.christitus.com/dev/tweaks/performance-plans---not-for-laptops/addultperf"
"link": "https://winutil.christitus.com/code-reference/tweaks/performance-plans---not-for-laptops/addultperf"
},
"WPFRemoveUltPerf": {
"Content": "Ultimate Performance Profile - Disable",
@@ -1899,6 +1869,6 @@
"panel": "2",
"Type": "Button",
"ButtonWidth": "300",
"link": "https://winutil.christitus.com/dev/tweaks/performance-plans---not-for-laptops/removeultperf"
"link": "https://winutil.christitus.com/code-reference/tweaks/performance-plans---not-for-laptops/removeultperf"
}
}
+21
View File
@@ -0,0 +1,21 @@
# 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
# macOS-specific files
.DS_Store
+49
View File
@@ -0,0 +1,49 @@
# Starlight Starter Kit: Basics
[![Built with Starlight](https://astro.badg.es/v2/built-with-starlight/tiny.svg)](https://starlight.astro.build)
```
npm create astro@latest -- --template starlight
```
> 🧑‍🚀 **Seasoned astronaut?** Delete this file. Have fun!
## 🚀 Project Structure
Inside of your Astro + Starlight project, you'll see the following folders and files:
```
.
├── public/
├── src/
│ ├── assets/
│ ├── content/
│ │ └── docs/
│ └── content.config.ts
├── astro.config.mjs
├── 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 are run from the root of the project, from a terminal:
| Command | Action |
| :------------------------ | :----------------------------------------------- |
| `npm install` | Installs dependencies |
| `npm run dev` | Starts local dev server at `localhost:4321` |
| `npm run build` | Build your production site to `./dist/` |
| `npm run preview` | Preview your build locally, before deploying |
| `npm run astro ...` | Run CLI commands like `astro add`, `astro check` |
| `npm run astro -- --help` | Get help using the Astro CLI |
## 👀 Want to learn more?
Check out [Starlights docs](https://starlight.astro.build/), read [the Astro documentation](https://docs.astro.build), or jump into the [Astro Discord server](https://astro.build/chat).
-6
View File
@@ -1,6 +0,0 @@
---
title: '{{ replace .File.ContentBaseName "-" " " | title }}'
description: ""
date: '{{ .Date }}'
draft: true
---
Binary file not shown.

Before

Width:  |  Height:  |  Size: 139 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 139 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 139 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 139 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 139 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 55 KiB

+70
View File
@@ -0,0 +1,70 @@
// @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',
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: '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' } },
],
}),
],
});
-153
View File
@@ -1,153 +0,0 @@
---
toc: true
---
## Contributing Code
### Before You Start
- Keep each pull request focused on a single feature or fix.
- Avoid unnecessary formatting changes or large unrelated edits.
- Document what changed and why in your PR description.
---
## Basic Git Workflow
### 1. Fork the Repository
Go to the ChrisTitusTech/winutil repository on GitHub and click the Fork button in the top right corner.
<img width="171" height="50" alt="{650A4723-F38A-44A4-9820-D232BC87C8A0}" src="https://github.com/user-attachments/assets/a214f27c-2fee-444a-920f-d87b14f5896f" />
---
### 2. Clone Your Fork
```bash
git clone https://github.com/YOUR_USERNAME/winutil.git
cd winutil
```
---
### 3. Create a Branch
Never work directly on `main`.
Create a branch related to your change:
```bash
git checkout -b feature-name
```
Example:
```bash
git checkout -b add-firefox-tweak
```
---
### 4. Edit the Code
Open the project in your preferred text editor and make your changes.
Keep changes small and focused.
---
### 5. Test Your Changes
Open PowerShell as Administrator.
Go to the project folder:
```powershell
cd path\to\winutil
```
Run:
```powershell
.\Compile.ps1 -Run
```
Verify:
- WinUtil launches correctly
- Your feature works
- Nothing else breaks
If something fails, fix it before committing.
---
### 6. Review Your Changes
Check what changed:
```bash
git status
```
Review the diff:
```bash
git diff
```
Make sure you did not accidentally modify unrelated files.
---
### 7. Commit Your Changes
Stage files:
```bash
git add .
```
Commit them:
```bash
git commit -m "Add feature description"
```
Example:
```bash
git commit -m "Add Firefox package tweak"
```
---
### 8. Push Your Branch
```bash
git push origin branch-name
```
Example:
```bash
git push origin add-firefox-tweak
```
---
### 9. Open a Pull Request
Go to your fork on GitHub.
GitHub will show a button to create a pull request.
<img width="1009" height="71" alt="{C8C6A3CC-79D4-44FD-A54C-4C5717F12730}" src="https://github.com/user-attachments/assets/0419d193-d4e7-47c0-87cf-b986742201a0" />
Before submitting:
- Explain what changed
- Explain why you changed it
- Make sure unrelated files are not included
Once submitted, maintainers will review your PR.
-28
View File
@@ -1,28 +0,0 @@
---
title: Welcome to WinUtil Documentation!
toc: false
width: full
---
<div style="display: flex; justify-content: center; align-items: center; width: 100%; flex-wrap: wrap; gap: 5px;margin-top:30px;" >
<a href="https://github.com/ChrisTitusTech/winutil/releases/latest"><img src="https://img.shields.io/github/v/release/ChrisTitusTech/winutil?color=%230567ff&label=Latest%20Release&style=for-the-badge" alt="Version" style="height: 28px; width: auto; min-width: 10px; object-fit: contain; margin: 0;"></a>
<img src="https://img.shields.io/github/downloads/ChrisTitusTech/winutil/winutil.ps1?label=Total%20Downloads&style=for-the-badge" alt="GitHub Downloads" style="height: 28px; width: auto; min-width: 10px; object-fit: contain; margin: 0;">
<a href="https://discord.gg/RUbZUZyByQ"><img src="https://dcbadge.limes.pink/api/server/https://discord.gg/RUbZUZyByQ" alt="Discord Community Server" style="height: 28px; width: auto; min-width: 10px; object-fit: contain; margin: 0;"></a>
</div>
Welcome to the official documentation for WinUtil, your go-to utility for optimizing and managing your Windows environment. Whether youre an IT professional, power user, or regular user, WinUtil provides a comprehensive set of tools to enhance your Windows experience.
{{< image src="images/Title-Screen" alt="WinUtil title screen" >}}
## Running the latest release of WinUtil
* You will first need to start a PowerShell terminal **as Admin**.
* Now you can run the following command:
```
irm "https://christitus.com/win" | iex
```
> [!IMPORTANT]
> WinUtil is updated frequently as of the time of writing. Consequently, features and functionalities may evolve, and the documentation may not always reflect the most current images or information.
-52
View File
@@ -1,52 +0,0 @@
---
title: Developer Reference
weight: 3
toc: false
---
> [!NOTE]
> This section contains technical documentation for developers. For end-user documentation, see the [User Guide](../userguide/).
## Architecture
- [Architecture & Design](architecture/) - Code structure, data flow, and how Winutil works internally
## Tweaks
### Essential Tweaks
{{< autolinks section="dev/tweaks/essential-tweaks" >}}
### Advanced Tweaks (CAUTION)
{{< autolinks section="dev/tweaks/z--advanced-tweaks---caution" >}}
### Customize Preferences
{{< autolinks section="dev/tweaks/customize-preferences" >}}
### Performance Plans
{{< autolinks section="dev/tweaks/performance-plans" >}}
## Features
### Fixes
{{< autolinks section="dev/features/fixes" >}}
### Legacy Windows Panels
{{< autolinks section="dev/features/legacy-windows-panels" >}}
### Features
{{< autolinks section="dev/features/features" >}}
### Remote Access
{{< autolinks section="dev/features/remote-access" >}}
### Powershell Profile Powershell 7+ Only
{{< autolinks section="dev/features/powershell-profile-powershell-7--only" >}}
@@ -1,7 +0,0 @@
---
title: "Features"
weight: 1
toc: false
---
{{< autolinks section="dev/features/features" >}}
@@ -1,15 +0,0 @@
---
title: "Hyper-V - Enable"
description: ""
---
```json {filename="config/feature.json",linenos=inline,linenostart=24}
"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"
],
```
@@ -1,11 +0,0 @@
---
title: "AutoLogon - Run"
description: ""
---
```powershell {filename="functions/public/Invoke-WPFPanelAutologin.ps1",linenos=inline,linenostart=1}
function Invoke-WPFPanelAutologin {
Invoke-WebRequest -Uri https://live.sysinternals.com/Autologon.exe -OutFile "$winutildir\autologin.exe"
Start-Process -FilePath "$winutildir\autologin.exe" -ArgumentList /accepteula
}
```
@@ -1,12 +0,0 @@
---
title: "Network - Reset"
description: ""
---
```powershell {filename="functions/public/Invoke-WPFFixesNetwork.ps1",linenos=inline,linenostart=1}
function Invoke-WPFFixesNetwork {
netsh winsock reset
netsh int ip reset
Write-Host "Network Configuration has been Reset. Please restart your computer."
}
```
@@ -1,7 +0,0 @@
---
title: "Fixes"
weight: 2
toc: false
---
{{< autolinks section="dev/features/fixes" >}}
@@ -1,7 +0,0 @@
---
title: "Legacy Windows Panels"
weight: 3
toc: false
---
{{< autolinks section="dev/features/legacy-windows-panels" >}}
@@ -1,7 +0,0 @@
---
title: "Powershell Profile Powershell 7+ Only"
weight: 5
toc: false
---
{{< autolinks section="dev/features/powershell-profile-powershell-7--only" >}}
@@ -1,7 +0,0 @@
---
title: "Remote Access"
weight: 4
toc: false
---
{{< autolinks section="dev/features/remote-access" >}}
-25
View File
@@ -1,25 +0,0 @@
---
title: "Features"
weight: 1
toc: false
---
### Fixes
{{< autolinks section="dev/features/fixes" >}}
### Legacy Windows Panels
{{< autolinks section="dev/features/legacy-windows-panels" >}}
### Features
{{< autolinks section="dev/features/features" >}}
### Remote Access
{{< autolinks section="dev/features/remote-access" >}}
### Powershell Profile Powershell 7+ Only
{{< autolinks section="dev/features/powershell-profile-powershell-7--only" >}}
@@ -1,9 +0,0 @@
---
title: "Customize Preferences"
weight: 3
toc: false
---
### Customize Preferences
{{< autolinks section="dev/tweaks/customize-preferences" >}}
@@ -1,46 +0,0 @@
---
title: "Unwanted Pre-Installed Apps - Remove"
description: ""
---
```json {filename="config/tweaks.json",linenos=inline,linenostart=838}
"WPFTweaksDeBloat": {
"Content": "Unwanted Pre-Installed Apps - Remove",
"Description": "This will remove a bunch of Windows pre-installed applications which most people dont want on their system.",
"category": "Essential Tweaks",
"panel": "1",
"appx": [
"Microsoft.WindowsFeedbackHub",
"Microsoft.BingNews",
"Microsoft.BingSearch",
"Microsoft.BingWeather",
"Clipchamp.Clipchamp",
"Microsoft.Todos",
"Microsoft.PowerAutomateDesktop",
"Microsoft.MicrosoftSolitaireCollection",
"Microsoft.WindowsSoundRecorder",
"Microsoft.MicrosoftStickyNotes",
"Microsoft.Windows.DevHome",
"Microsoft.Paint",
"Microsoft.OutlookForWindows",
"Microsoft.WindowsAlarms",
"Microsoft.StartExperiencesApp",
"Microsoft.GetHelp",
"Microsoft.ZuneMusic",
"MicrosoftCorporationII.QuickAssist",
"MSTeams"
],
"InvokeScript": [
"
$TeamsPath = \"$Env:LocalAppData\\Microsoft\\Teams\\Update.exe\"
if (Test-Path $TeamsPath) {
Write-Host \"Uninstalling Teams\"
Start-Process $TeamsPath -ArgumentList -uninstall -wait
Write-Host \"Deleting Teams directory\"
Remove-Item $TeamsPath -Recurse -Force
}
"
],
```
@@ -1,9 +0,0 @@
---
title: "Essential Tweaks"
weight: 1
toc: false
---
### Essential Tweaks
{{< autolinks section="dev/tweaks/essential-tweaks" >}}
@@ -1,9 +0,0 @@
---
title: "Performance Plans"
weight: 4
toc: false
---
### Performance Plans
{{< autolinks section="dev/tweaks/performance-plans" >}}
-21
View File
@@ -1,21 +0,0 @@
---
title: "Tweaks"
weight: 2
toc: false
---
### Essential Tweaks
{{< autolinks section="dev/tweaks/essential-tweaks" >}}
### Advanced Tweaks (CAUTION)
{{< autolinks section="dev/tweaks/z--advanced-tweaks---caution" >}}
### Customize Preferences
{{< autolinks section="dev/tweaks/customize-preferences" >}}
### Performance Plans
{{< autolinks section="dev/tweaks/performance-plans" >}}
@@ -1,19 +0,0 @@
---
title: "O&O ShutUp10++ - Run"
description: ""
---
```powershell {filename="functions/public/Invoke-WPFOOSU.ps1",linenos=inline,linenostart=1}
function Invoke-WPFOOSU {
try {
$ProgressPreference = 'SilentlyContinue'
Invoke-WebRequest -Uri https://dl5.oo-software.com/files/ooshutup10/OOSU10.exe -OutFile "$winutildir\ooshutup10.exe"
Start-Process -FilePath "$winutildir\ooshutup10.exe"
$ProgressPreference = 'Continue'
} catch {
Write-Error "Couldn't download O&O ShutUp10. Please make sure you have an active Internet connection."
}
}
```
@@ -1,34 +0,0 @@
---
title: "Xbox & Gaming Components - Remove"
description: ""
---
```json {filename="config/tweaks.json",linenos=inline,linenostart=815}
"WPFTweaksXboxRemoval": {
"Content": "Xbox & Gaming Components - Remove",
"Description": "Removes Xbox services, the Xbox app, Game Bar, and related authentication components.",
"category": "z__Advanced Tweaks - CAUTION",
"panel": "1",
"registry": [
{
"Path": "HKCU:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\GameDVR",
"Name": "AppCaptureEnabled",
"Value": "0",
"Type": "DWord",
"OriginalValue": "1"
}
],
"appx": [
"Microsoft.XboxIdentityProvider",
"Microsoft.XboxSpeechToTextOverlay",
"Microsoft.GamingApp",
"Microsoft.Xbox.TCUI",
"Microsoft.XboxGamingOverlay"
],
```
## Registry Changes
Applications and System Components store and retrieve configuration data to modify Windows settings, so we can use the registry to change many settings in one place.
You can find information about the registry on [Wikipedia](https://en.wikipedia.org/wiki/Windows_Registry) and [Microsoft's Website](https://learn.microsoft.com/en-us/windows/win32/sysinfo/registry).
@@ -1,9 +0,0 @@
---
title: "Advanced Tweaks (CAUTION)"
weight: 2
toc: false
---
### Advanced Tweaks (CAUTION)
{{< autolinks section="dev/tweaks/z--advanced-tweaks---caution" >}}
@@ -1,57 +0,0 @@
---
title: Applications
weight: 3
prev: /userguide/getting-started/
next: /userguide/tweaks/
---
Use the Applications tab to install, upgrade, uninstall, and review supported apps from one place. WinUtil relies on package manager support for these actions, so the available results depend on what WinGet can detect and manage on your system.
{{< tabs >}}
{{< tab name="Installation & Updates" selected=true >}}
* Choose the applications you want to install or upgrade.
* For programs not currently installed, this action will install them.
* For programs already installed, this action will update them to the latest version.
* Click the `Install/Upgrade Selected` button to start the installation or upgrade process.
{{< image src="images/install-pics/installation" alt="Install or upgrade selected applications" >}}
{{< /tab >}}
{{< tab name="Upgrade All" >}}
* Simply press the `Upgrade All` button.
* This upgrades every supported installed program without individual selection.
{{< image src="images/install-pics/install-apps" alt="Upgrade all applications" >}}
{{< /tab >}}
{{< tab name="Uninstall" >}}
* Select the programs you wish to uninstall.
* Click the `Uninstall Selected` button to remove them.
{{< image src="images/install-pics/uninstall-apps" alt="Uninstall selected applications" >}}
{{< /tab >}}
{{< tab name="Show Installed Apps" >}}
* Click the `Show Installed Apps` button.
* This scans for and selects installed applications supported by WinGet.
{{< image src="images/install-pics/show-installed-apps" alt="Show installed apps" >}}
{{< /tab >}}
{{< tab name="Clear Selection" >}}
* Click the `Clear Selection` button.
* This clears all current selections.
{{< image src="images/install-pics/clear-selection-apps" alt="Clear app selections" >}}
{{< /tab >}}
{{< /tabs >}}
> [!TIP]
> If you have trouble finding an application, press `Ctrl + F` and search for its name. The list filters as you type.
> [!NOTE]
> `Show Installed Apps` only selects software that WinGet can identify. Apps installed outside supported package sources may not appear.
> [!IMPORTANT]
> Before uninstalling or upgrading apps, close any running programs first. Some packages may still prompt for input or fail if their source is unavailable.
@@ -1,256 +0,0 @@
---
title: Getting Started
weight: 2
prev: /userguide/
next: /userguide/application/
---
## Welcome to Winutil!
Winutil helps you install apps, apply system tweaks, run common fixes, and manage Windows settings from one place. This guide covers the safest way to get started and the first actions most users take.
## System Requirements
Before running Winutil, ensure your system meets these requirements:
> [!IMPORTANT]
> Windows 10 is not supported by Winutil. Windows 10 reached the end of support on **October 14, 2025**.
- **Operating System**: Windows 11
- **PowerShell**: Version 5.1 or later (included by default in Windows 11)
- **Administrator Access**: Required for system-level changes
- **Internet Connection**: Required for downloading applications and updates
- **.NET Framework**: Version 4.5 or later (usually pre-installed)
## Installation
Winutil doesn't require traditional installation. It runs directly from PowerShell as a script.
### Step 1: Open PowerShell as Administrator
There are several ways to open PowerShell with admin rights:
**Method 1: Start Menu (Recommended)**
1. Right-click the Windows Start button
2. Select "Terminal (Admin)"
**Method 2: Search Method**
1. Press the `Windows` key
2. Type "PowerShell" or "Terminal"
3. Press `Ctrl + Shift + Enter` to launch as administrator
4. Or right-click and select "Run as administrator"
**Method 3: Run Dialog**
1. Press `Windows + R`
2. Type `powershell`
3. Press `Ctrl + Shift + Enter`
### Step 2: Run the Launch Command
With PowerShell running as Administrator, run one of the following commands depending on the release channel you want.
**Stable release (recommended)**
```powershell
irm "https://christitus.com/win" | iex
```
**Development branch (bleeding edge — for testing only)**
```powershell
irm "https://christitus.com/windev" | iex
```
> [!NOTE]
> - The `irm` command downloads the script, and `iex` executes it. This is safe when downloading from the official source.
> - The development branch may contain experimental changes and should only be used for testing on non-production systems.
### Step 3: Wait for Winutil to Load
The first time you run Winutil, it may take a few moments to:
- Download the latest version
- Initialize the interface
- Load all features and settings
## First Time Setup
### Understanding the Interface
Winutil opens with a clean, tabbed interface:
**Main Tabs**:
- **Install**: Browse and install applications
- **Tweaks**: Apply system optimizations and customizations
- **Config**: Access system tools and utilities
- **Updates**: Manage Windows updates
- **Win11 Creator**: Build a customized Windows 11 ISO from an official Microsoft image.
## Your First Actions
Here are some recommended first steps for new users:
### 1. Create a Restore Point
Before making any changes, create a system restore point:
1. Go to the **Tweaks** tab
2. Find "Create Restore Point" under Essential Tweaks
3. Check the box and click **Run Tweaks**
This gives you a rollback point if needed.
### 2. Install Essential Applications
1. Navigate to the **Install** tab
2. Browse categories or use the search bar
3. Check the applications you want to install
4. Click "Install/Upgrade Selected" at the bottom
### 3. Apply Basic Tweaks
For a better Windows experience with minimal risk:
1. Go to the **Tweaks** tab
2. Select the **Standard** preset for a balanced configuration
3. Review the selected tweaks
4. Click **Run Tweaks**
> [!NOTE]
> Some tweaks, fixes, and update changes may require a restart or sign-out before the full effect is visible.
## Common Tasks
### Installing Applications
**Single Application**:
1. Open the **Install** tab
2. Search for the application name
3. Check the box next to it
4. Click "Install/Upgrade Selected"
**Multiple Applications**:
1. Check multiple application boxes
2. All checked apps will install in sequence
3. Progress is shown in the bottom panel
### Applying Tweaks
**Essential Tweaks** (Safe for all users):
1. Go to the **Tweaks** tab
2. Select from the Essential Tweaks section
3. Click **Run Tweaks**
**Advanced Tweaks** (Use with caution):
1. Only modify if you understand the implications
2. Always create a restore point first
3. Review documentation for each tweak
**Undoing Tweaks**:
1. Select the same tweaks you applied
2. Click **Undo Selected Tweaks**
3. The system reverts to the previous state
### Using Quick Fixes
For common Windows issues:
1. Go to the **Config** tab
2. Navigate to the **Fixes** section
3. Select the appropriate fix:
- **Reset Network**: Fixes network connectivity issues
- **Reset Windows Update**: Resolves update problems
- **System Corruption Scan**: Repairs corrupted system files
- **WinGet Reinstall**: Fixes package manager issues
### Changing DNS Servers
For improved privacy and speed:
1. Go to the **Tweaks** tab
2. Find the DNS section
3. Select a provider:
- **Cloudflare**: Fast and privacy-focused
- **Google**: Reliable and widely used
- **Quad9**: Security-focused with malware blocking
- **AdGuard**: Blocks ads and trackers
4. Click **Apply**
## Understanding Presets
Winutil offers several preset configurations:
- **Minimal**: Minimal changes that keep most Windows features
- **Standard**: A good middle ground for most users
- **Advanced**: Selects a focused set of safer advanced tweaks.
## Safety Tips
**DO**:
- Create restore points before major changes
- Read tweak descriptions before applying
- Start with Essential Tweaks
- Keep Windows up to date
- Back up important data
**DON'T**:
- Apply all tweaks at once without understanding them
- Skip creating restore points
- Use Advanced Tweaks without research
- Disable security features unless necessary
- Run on production systems without testing
## Troubleshooting First Run
### Script Won't Download
If the launch command fails:
- Make sure PowerShell or Terminal is running as Administrator.
- Confirm the PC has internet access and can reach `christitus.com`.
- Retry from a normal PowerShell session rather than a restricted enterprise shell profile.
- If the command starts and then closes immediately, reopen Terminal as Administrator and run it again so you can read the error output.
If it still fails, check the [Known Issues](/knownissues/) page.
## Next Steps
Now that you're set up, explore these guides:
- [Applications Guide](../application/) - Learn about installing, upgrading, and uninstalling software
- [Tweaks Guide](../tweaks/) - Understand system optimizations
- [FAQ](/faq/) - Common questions and answers
## Getting Help
If you need assistance:
- **Documentation**: Browse this documentation site
- **Known Issues**: Check the [Known Issues](/knownissues/) page
- **Discord**: Join the [community Discord server](https://discord.gg/RUbZUZyByQ)
- **GitHub Issues**: Report bugs on [GitHub](https://github.com/ChrisTitusTech/winutil/issues)
- **YouTube**: Watch [video tutorials](https://www.youtube.com/watch?v=6UQZ5oQg8XA)
## Quick Reference Card
| Task | Location | Action |
| ---- | -------- | ------ |
| Install or upgrade apps | Install tab | Check boxes -> Install/Upgrade Selected |
| Uninstall apps | Install tab | Check boxes -> Uninstall Selected |
| Apply tweaks | Tweaks tab | Select tweaks -> Run Tweaks |
| Undo tweaks | Tweaks tab | Select tweaks -> Undo Selected Tweaks |
| Create restore point | Tweaks tab | Essential Tweaks section |
| Fix network | Config tab | Fixes -> Reset Network |
| Change DNS | Tweaks tab | DNS section |
| Open Control Panel | Config tab | Legacy Windows Panels |
-36
View File
@@ -1,36 +0,0 @@
---
title: Updates
weight: 6
prev: /userguide/features/
next: /userguide/automation/
---
WinUtil provides three update modes so you can choose how aggressively Windows Update is managed on your system:
Changing modes adjusts system-wide Windows Update behavior. After switching modes, give Windows a moment to apply the policy and plan for a restart if the new state does not appear immediately.
{{< image src="images/updates-tab-new" alt="Updates tab in WinUtil" >}}
- **Default (Out of the Box) Settings**: Restores standard Windows Update behavior
- **Security (Recommended) Settings**: Prioritizes stability while still receiving security updates
- **Disable ALL Updates**: Turns off Windows Update entirely and should only be used with extreme caution
### Default (Out of Box) Settings
- **What it does**: Restores the default Windows Update configuration.
- **Best for**: Systems where you want Windows to manage updates normally.
- **Notes**: This removes custom update settings previously applied by WinUtil. If update errors continue, use the reset option in the **Config** tab to restore Microsoft Update services to their default state.
### Security (Recommended) Settings
- **What it does**: Applies a more conservative update strategy designed for most users.
- **Feature updates**: Delayed by **365 days** to reduce the chance of disruption from major Windows changes.
- **Security updates**: Delayed by **4 days** to allow time for early issues to surface while still keeping the system protected.
- **Why use it**: This mode offers the best balance between security and stability, which is why it is the recommended option for most PCs.
### Disable ALL Updates (NOT RECOMMENDED!)
- **What it does**: Disables all Windows updates.
- **Best for**: Highly controlled or special-purpose systems where updates must remain off temporarily.
- **Warning**: This leaves the system without security patches and significantly increases security risk.
- **Recommendation**: Avoid this mode unless you fully understand the tradeoffs and have a specific reason to use it.
-5
View File
@@ -1,5 +0,0 @@
module github.com/ChrisTitusTech/WinUtil
go 1.26
require github.com/imfing/hextra v0.12.3 // indirect
-2
View File
@@ -1,2 +0,0 @@
github.com/imfing/hextra v0.12.3 h1:DZHY2rUWYteyzjlHi9r4n7Bb5e2Q+6LXe4C1Dqn0ZjM=
github.com/imfing/hextra v0.12.3/go.mod h1:vi+yhpq8YPp/aghvJlNKVnJKcPJ/VyAEcfC1BSV9ARo=
-140
View File
@@ -1,140 +0,0 @@
baseURL = "https://winutil.christitus.com/"
languageCode = "en-us"
title = "WinUtil Documentation"
enableGitInfo = true
canonifyURLs = true
[[module.mounts]]
source = "assets"
target = "assets"
[[module.imports]]
path = "github.com/imfing/hextra"
[[menu.main]]
identifier = "userguide"
name = "User Guides"
pageRef = "/userguide"
weight = 1
[[menu.main]]
identifier = "documentation"
name = "Developer Documentation"
weight = 2
[[menu.main]]
identifier = "contribution-guides"
name = "Contribution Guides"
pageRef = "CONTRIBUTING.md"
weight = 1
parent = "documentation"
[[menu.main]]
identifier = "developer-documentation"
name = "Developer Docs"
pageRef = "/dev"
weight = 2
parent = "documentation"
[[menu.main]]
identifier = "help"
name = "Help"
weight = 3
[[menu.main]]
identifier = "faq"
name = "FAQ"
pageRef = "faq.md"
weight = 1
parent = "help"
[[menu.main]]
identifier = "known-issues"
name = "Known Issues"
pageRef = "KnownIssues.md"
weight = 2
parent = "help"
[[menu.main]]
identifier = "forums"
name = "Forums"
url = "https://forum.christitus.com/"
weight = 3
parent = "help"
[[menu.main]]
name = "Store"
url = "https://christitus.com/downloads/"
weight = 5
[[menu.main]]
name = "Search"
weight = 6
[menu.main.params]
type = "search"
[[menu.main]]
name = "GitHub"
weight = 7
url = "https://github.com/christitustech/winutil"
[menu.main.params]
icon = "github"
[params]
description = "Chris Titus Tech's Windows Utility - Install Programs, Tweaks, Fixes, and Updates"
displayUpdatedDate = true
dateFormat = "January 2, 2006"
[params.navbar]
displayTitle = false
displayLogo = true
[params.navbar.logo]
path = "navlogo.png"
dark = "navlogo.png"
link = "/"
width = 150
height = 50
[params.theme]
default = "system"
displayToggle = true
[params.page]
width = "wide"
[params.footer]
enable = true
displayCopyright = true
displayPoweredBy = false
width = "normal"
[params.highlight.copy]
enable = true
display = "hover"
[menu]
[[menu.sidebar]]
name = "Links"
weight = 1
[menu.sidebar.params]
type = "separator"
[[menu.sidebar]]
name = "GitHub Repo ↗"
url = "https://github.com/ChrisTitusTech/winutil"
weight = 2
[[menu.sidebar]]
name = "Discord Server ↗"
url = "https://discord.gg/RUbZUZyByQ"
weight = 3
[markup]
[markup.goldmark]
[markup.goldmark.renderer]
unsafe = true
-23
View File
@@ -1,23 +0,0 @@
copyright: "&copy; <script>document.write(new Date().getFullYear())</script>&nbsp;<a href='https://christitus.com'>Chris Titus Tech</a>. All rights reserved."
backToTop: "Scroll to top"
changeLanguage: "Change language"
changeTheme: "Change theme"
copy: "Copy"
copied: "Copied!"
copyAsMarkdown: "Copy as Markdown"
copyPage: "Copy Page"
copyCode: "Copy code"
dark: "Dark"
editThisPage: "Edit this page on GitHub →"
lastUpdated: "Last updated on"
light: "Light"
next: "Next"
noResultsFound: "No results found."
onThisPage: "On this page"
poweredBy: "Powered by Chris Titus Tech"
previous: "Prev"
readMore: "Read more →"
searchPlaceholder: "Search..."
system: "System"
tags: "Tags"
viewAsMarkdown: "View as Markdown"
-17
View File
@@ -1,17 +0,0 @@
{{- $section := .Get "section" | lower -}}
{{- $pages := slice -}}
{{- range .Site.RegularPages -}}
{{- if in .RelPermalink $section -}}
{{- $pageTitle := .Title -}}
{{- if eq $pageTitle "" -}}
{{- $pageTitle = .File.BaseFileName | humanize | title -}}
{{- end -}}
{{- $pageDesc := .Description -}}
{{- $pages = $pages | append (dict "title" $pageTitle "description" $pageDesc "url" .RelPermalink) -}}
{{- end -}}
{{- end -}}
<ul>
{{- range sort $pages "title" "asc" }}
<li><a href="{{ .url }}">{{ .title }}</a>{{ with .description }} - {{ . }}{{ end }}</li>
{{- end }}
</ul>
-114
View File
@@ -1,114 +0,0 @@
{{/*Retrive Passed Shortcode Parameters*/}}
{{ $src := .Get "src" }}
{{ $alt := .Get "alt" }}
{{/*Define sizes*/}}
{{ $Small := 200 }}
{{ $Medium := 600 }}
{{ $Large := 1000 }}
{{/*Define Image variables as global variables to make them easily accessible in this shortcode*/}}
{{ $DarkImage := "" }} {{ $DarkSmallImage := "" }} {{ $DarkMediumImage := "" }} {{ $DarkLargeImage := "" }}
{{ $LightImage := "" }} {{ $LightSmallImage := "" }} {{ $LightMediumImage := "" }} {{ $LightLargeImage := "" }}
{{ $SingleImage := "" }} {{ $SingleSmallImage := "" }} {{ $SingleMediumImage := "" }} {{ $SingleLargeImage := "" }}
{{/*Find images and update the previous Single,Dark,Light Images variables*/}}
{{ with resources.GetMatch (print $src ".jpg") }} {{ $SingleImage = . }} {{ end }}
{{ with resources.GetMatch (print $src "-Dark" ".jpg") }} {{ $DarkImage = . }} {{ end }}
{{ with resources.GetMatch (print $src "-Light" ".jpg") }} {{ $LightImage = . }} {{ end }}
{{ with resources.GetMatch (print $src ".png") }} {{ $SingleImage = . }} {{ end }}
{{ with resources.GetMatch (print $src "-Dark" ".png") }} {{ $DarkImage = . }} {{ end }}
{{ with resources.GetMatch (print $src "-Light" ".png") }} {{ $LightImage = . }} {{ end }}
{{/*Applying Image Processing*/}}
{{ with $SingleImage }}
{{ with .Resize (printf "%dx%d webp q50" .Width .Height) }}
{{ $SingleImage = . }}
{{ end }}
{{ end }}
{{ with $DarkImage }}
{{ with .Resize (printf "%dx%d webp q50" .Width .Height) }}
{{ $DarkImage = . }}
{{ end }}
{{ end }}
{{ with $LightImage }}
{{ with .Resize (printf "%dx%d webp q50" .Width .Height) }}
{{ $LightImage = . }}
{{ end }}
{{ end }}
{{/*Make different sized versions to images if applicable*/}}
{{ with $SingleImage }}
{{ if gt (.Width) ($Small) }}
{{ with .Resize (printf "%dx" $Small) }}
{{ $SingleSmallImage = . }}
{{ end }}
{{ end }}
{{ if gt (.Width) ($Medium) }}
{{ with .Resize (printf "%dx" $Medium) }}
{{ $SingleMediumImage = . }}
{{ end }}
{{ end }}
{{ if gt (.Width) ($Large) }}
{{ with .Resize (printf "%dx" $Large) }}
{{ $SingleLargeImage = . }}
{{ end }}
{{ end }}
{{ end }}
{{ with $DarkImage }}
{{ if gt (.Width) ($Small) }}
{{ with .Resize (printf "%dx" $Small) }}
{{ $DarkSmallImage = . }}
{{ end }}
{{ end }}
{{ if gt (.Width) ($Medium) }}
{{ with .Resize (printf "%dx" $Medium) }}
{{ $DarkMediumImage = . }}
{{ end }}
{{ end }}
{{ if gt (.Width) ($Large) }}
{{ with .Resize (printf "%dx" $Large) }}
{{ $DarkLargeImage = . }}
{{ end }}
{{ end }}
{{ end }}
{{ with $LightImage }}
{{ if gt (.Width) ($Small) }}
{{ with .Resize (printf "%dx" $Small) }}
{{ $LightSmallImage = . }}
{{ end }}
{{ end }}
{{ if gt (.Width) ($Medium) }}
{{ with .Resize (printf "%dx" $Medium) }}
{{ $LightMediumImage = . }}
{{ end }}
{{ end }}
{{ if gt (.Width) ($Large) }}
{{ with .Resize (printf "%dx" $Large) }}
{{ $LightLargeImage = . }}
{{ end }}
{{ end }}
{{ end }}
{{ if $SingleImage }}
<picture>
{{ with $SingleSmallImage }}<source media='(max-width: {{ printf "%dpx" $Small}})' srcset='{{ .RelPermalink }}'>{{ end }}
{{ with $SingleMediumImage }}<source media='(min-width: {{ printf "%dpx" $Small}}) and (max-width: {{ printf "%dpx" $Medium}})' srcset='{{ .RelPermalink }}'>{{ end }}
{{ with $SingleLargeImage }}<source media='(min-width: {{ printf "%dpx" $Medium}}) and (max-width: {{ printf "%dpx" $Large}})' srcset='{{ .RelPermalink }}'>{{ end }}
{{ with $SingleImage }}<img loading="lazy" src="{{ .RelPermalink }}" Width="{{ .Width }}" height="{{ .Height }}" {{ with $alt }}alt="{{.}}"{{ else }}alt=""{{ end }}/>{{ end }}
</picture>
{{ else }}
<picture>
{{ with $DarkSmallImage }}<source media='(max-width: {{ printf "%dpx" $Small}}) and (prefers-color-scheme: dark)' srcset='{{ .RelPermalink }}'>{{ end }}
{{ with $DarkMediumImage }}<source media='(min-width: {{ printf "%dpx" $Small}}) and (max-width: {{ printf "%dpx" $Medium}}) and (prefers-color-scheme: dark)' srcset='{{ .RelPermalink }}'>{{ end }}
{{ with $DarkLargeImage }}<source media='(min-width: {{ printf "%dpx" $Medium}}) and (max-width: {{ printf "%dpx" $Large}}) and (prefers-color-scheme: dark)' srcset='{{ .RelPermalink }}'>{{ end }}
{{ with $DarkImage }}<source media='(prefers-color-scheme: dark)' srcset='{{ .RelPermalink }}'>{{ end }}
{{ with $LightSmallImage }}<source media='(max-width: {{ printf "%dpx" $Small}}) and (prefers-color-scheme: light)' srcset='{{ .RelPermalink }}'>{{ end }}
{{ with $LightMediumImage }}<source media='(min-width: {{ printf "%dpx" $Small}}) and (max-width: {{ printf "%dpx" $Medium}}) and (prefers-color-scheme: light)' srcset='{{ .RelPermalink }}'>{{ end }}
{{ with $LightLargeImage }}<source media='(min-width: {{ printf "%dpx" $Medium}}) and (max-width: {{ printf "%dpx" $Large}}) and (prefers-color-scheme: light)' srcset='{{ .RelPermalink }}'>{{ end }}
{{ with $LightImage }}<source media='(prefers-color-scheme: light)' srcset='{{ .RelPermalink }}'>{{ end }}
{{ with $LightImage }}<img loading="lazy" src="{{ .RelPermalink }}" Width="{{ .Width }}" height="{{ .Height }}" {{ with $alt }}alt="{{.}}"{{ else }}alt=""{{ end }}/>
{{ else with $DarkImage }}<img loading="lazy" src="{{ .RelPermalink }}" Width="{{ .Width }}" height="{{ .Height }}" {{ with $alt }}alt="{{.}}"{{ else }}alt=""{{ end }}/>{{ end }}
</picture>
{{ end }}
+6950
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.0.2",
"sharp": "^0.35.3"
}
}

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 3.2 KiB

Before

Width:  |  Height:  |  Size: 7.8 KiB

After

Width:  |  Height:  |  Size: 7.8 KiB

Before

Width:  |  Height:  |  Size: 173 KiB

After

Width:  |  Height:  |  Size: 173 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

Before

Width:  |  Height:  |  Size: 67 KiB

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

Before

Width:  |  Height:  |  Size: 149 KiB

After

Width:  |  Height:  |  Size: 149 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

Before

Width:  |  Height:  |  Size: 45 KiB

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(),
}),
}),
}),
};
@@ -1,7 +1,6 @@
---
title: Architecture & Design
weight: 1
toc: true
description: How WinUtil's GUI, functions, and JSON configuration files fit together, plus a deep dive into the Win11 Creator subsystem.
---
## Overview
@@ -342,7 +341,7 @@ Update UI
### applications.json Structure
```json {filename="config/applications.json"}
```json title="config/applications.json"
{
"WPFInstall<AppName>": {
"category": "Browsers",
@@ -365,7 +364,7 @@ Update UI
### tweaks.json Structure
```json {filename="config/tweaks.json"}
```json title="config/tweaks.json"
{
"WPFTweaksTelemetry": {
"Content": "Disable Telemetry",
@@ -504,7 +503,7 @@ $sync.form.Dispatcher.Invoke([action]{
### Adding a New Application
1. Edit `config/applications.json`:
```json {filename="config/applications.json"}
```json title="config/applications.json"
{
"WPFInstallNewApp": {
"category": "Utilities",
@@ -522,7 +521,7 @@ $sync.form.Dispatcher.Invoke([action]{
### Adding a New Tweak
1. Edit `config/tweaks.json`:
```json {filename="config/tweaks.json"}
```json title="config/tweaks.json"
{
"WPFTweaksNewTweak": {
"Content": "New Tweak",
@@ -578,7 +577,9 @@ Tests are in `/pester/`:
Run tests:
```powershell
Invoke-Pester
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
@@ -652,10 +653,10 @@ Outputs `winutil.ps1` in the root directory.
## Related Documentation
- [Contributing Guide](../../contributing/) - How to contribute code
- [User Guide](../../userguide/) - End-user documentation
- [Win11 Creator Guide](../../userguide/win11creator/) - Building customized Windows 11 ISOs
- [FAQ](../../faq/) - Common questions
- [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
@@ -1,9 +1,14 @@
---
title: "Legacy F8 Boot Recovery - Disable"
description: ""
description: "Disables Advanced Boot Options screen that lets you start Windows in advanced troubleshooting modes."
editUrl: false
---
```json {filename="config/feature.json",linenos=inline,linenostart=107}
:::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.",
@@ -13,4 +18,5 @@ description: ""
"InvokeScript": [
"bcdedit /set bootmenupolicy standard"
],
}
```
@@ -1,9 +1,14 @@
---
title: "Legacy F8 Boot Recovery - Enable"
description: ""
description: "Enables Advanced Boot Options screen that lets you start Windows in advanced troubleshooting modes."
editUrl: false
---
```json {filename="config/feature.json",linenos=inline,linenostart=96}
:::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.",
@@ -13,4 +18,5 @@ description: ""
"InvokeScript": [
"bcdedit /set bootmenupolicy legacy"
],
}
```
@@ -1,9 +1,14 @@
---
title: "Registry Backup (Daily Task 12:30am) - Enable"
description: ""
description: "Enables daily registry backup, previously disabled by Microsoft in Windows 10 1803."
editUrl: false
---
```json {filename="config/feature.json",linenos=inline,linenostart=79}
:::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.",
@@ -19,4 +24,5 @@ description: ""
Register-ScheduledTask -Action $action -Trigger $trigger -TaskName 'AutoRegBackup' -Description 'Create System Registry Backups' -User 'System'
"
],
}
```
@@ -1,9 +1,14 @@
---
title: "Windows Sandbox - Enable"
description: ""
description: "Windows Sandbox is a lightweight virtual machine that provides a temporary desktop environment to safely run applications and programs in isolation."
editUrl: false
---
```json {filename="config/feature.json",linenos=inline,linenostart=118}
:::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.",
@@ -12,4 +17,5 @@ description: ""
"feature": [
"Containers-DisposableClientVM"
],
}
```
@@ -1,9 +1,14 @@
---
title: ".NET Framework (Versions 2, 3, 4) - Enable"
description: ""
description: ".NET and .NET Framework is a developer platform made up of tools, programming languages, and libraries for building many different types of applications."
editUrl: false
---
```json {filename="config/feature.json",linenos=inline,linenostart=2}
:::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.",
@@ -14,4 +19,5 @@ description: ""
"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"
],
}
```
@@ -1,9 +1,14 @@
---
title: "Legacy Media Components (WMP, DirectPlay) - Enable"
description: ""
description: "Enables legacy programs from previous versions of Windows."
editUrl: false
---
```json {filename="config/feature.json",linenos=inline,linenostart=34}
:::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.",
@@ -16,4 +21,5 @@ description: ""
"LegacyComponents"
],
"InvokeScript": [],
}
```
@@ -1,9 +1,14 @@
---
title: "Network File System (NFS) - Enable"
description: ""
description: "Network File System (NFS) is a mechanism for storing files on a network."
editUrl: false
---
```json {filename="config/feature.json",linenos=inline,linenostart=60}
:::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.",
@@ -21,4 +26,5 @@ description: ""
"nfsadmin client start",
"nfsadmin client localhost config fileaccess=755 SecFlavors=+sys -krb5 -krb5i"
],
}
```
@@ -1,9 +1,14 @@
---
title: "Windows Subsystem for Linux (WSL) - Enable"
description: ""
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
---
```json {filename="config/feature.json",linenos=inline,linenostart=48}
:::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.",
@@ -14,4 +19,5 @@ description: ""
"Microsoft-Windows-Subsystem-Linux"
],
"InvokeScript": [],
}
```

Some files were not shown because too many files have changed in this diff Show More