Skip to content

Commit 5981e08

Browse files
committed
feat: rename Windots to Customize, fix pipeline leaks, config restore
- Rename modules/windots/ to modules/customize/, rewrite all Windots.* to Customize.* - Add Customize.Desktop.ps1 (GlazeWM, Zebar, Flow Launcher, Windhawk, Rainmeter) - Add GlazeWM config with height resize keybindings (alt+i/o) - Add Restore-ConfigBackup — scan .bak files, show date/size, restore one or all - Add Install-WingetPackage helper with exit code handling and Out-Host - Add Start-UserProcess for launching modules without admin elevation - Add Wiki link to Docs & Guides submenu - Fix pipeline pollution (True/False leak) in Invoke-Tool, Invoke-SecureScript - Fix UniGetUI package ID MartiCliment → Devolutions, winget list → Test-Path - Fix PC Manager install: Microsoft.PCManager → 9PM860492SZD --source msstore - Fix DefendNot reinstall conflict — clean previous installation before extract - Fix RemoveWindowsAI — run as separate powershell.exe process for GUI - Fix Show-MenuBox overflow — auto-calculate width from content - Fix Copy-ConfigFiles backup — preserve original .bak, no overwrite on repeat - Fix hardcoded Documents path → Environment.GetFolderPath in Set-PwshConfig - Fix em-dash encoding and remove noisy "No hash provided" warnings - Change Customize and App Bundles to run without admin (Start-UserProcess) - Change macOS Cursor to inline Invoke-WebRequest with SHA256 verification - Change Intel DSA to launch after install/already-installed - Change Oh My Posh, Starship, FastFetch to use Install-WingetPackage - Clean VSCode settings: remove 13 dead breadcrumb, stickyScroll, layoutControl - Remove old Windots module files and config/vscode/snippet.txt
1 parent 27881cb commit 5981e08

36 files changed

+1474
-666
lines changed

CHANGELOG.md

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,52 @@ All notable changes to this project will be documented in this file.
55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
66
and this project uses [Calendar Versioning](https://calver.org/) (YY.M format).
77

8+
## [26.3] - 2026-03-23
9+
10+
### March 23 — Rename Windots to Customize, fix pipeline leaks, restore backups, config quality
11+
12+
- Renamed `modules/windots/` to `modules/customize/` — all files renamed from `Windots.*` to `Customize.*`
13+
- Added `Customize.Desktop.ps1` — GlazeWM, Zebar/YASB, Flow Launcher, Windhawk, Rainmeter, wallpaper browser
14+
- Added GlazeWM config (`config/glazewm/config.yaml`) with height resize keybindings (alt+i/o)
15+
- Added PowerShell 7 profile to `terminal.json`
16+
- Added `Restore-ConfigBackup` function — scans for `.bak` files across all config locations, shows date/size, restore one or all
17+
- Added `Install-WingetPackage` helper to `Common.ps1` — unified winget install with exit code handling, already-installed detection, `| Out-Host` to prevent pipeline pollution
18+
- Added `Pause-ForUser` helper to `Common.ps1`
19+
- Added `Start-UserProcess` to `AdminLaunch.ps1` for launching modules without elevation (WT tab support)
20+
- Added Wiki link to Docs & Guides submenu
21+
- Added `rectify11` entry to `tools.json`
22+
- Changed `Show-MenuBox` to auto-calculate width from content (no more overflow past box borders)
23+
- Changed Customize and App Bundles to run without admin elevation (`Start-UserProcess`)
24+
- Changed `Invoke-ReturnToMenu` placement inside `try/finally` in `Customize.ps1`
25+
- Changed `Copy-ConfigFiles` backup logic — preserves original `.bak`, won't overwrite on repeat runs
26+
- Changed `Set-PwshConfig` to use `[Environment]::GetFolderPath('MyDocuments')` instead of hardcoded path
27+
- Changed `Set-WinTermConfig` to properly handle font cancel in combo selection
28+
- Changed Oh My Posh, Starship, FastFetch installers to use `Install-WingetPackage` instead of raw `Start-Process winget`
29+
- Changed Starship, Oh My Posh, FastFetch menus — moved descriptions inside menu box instead of loose `Write-Log` above
30+
- Changed `Install-Starship` to show both PS 5.1 and PS 7+ profile paths
31+
- Changed `Disable-QuickAccess` — proper COM object cleanup, polling-based Explorer restart
32+
- Changed `Install-MacOSCursor` — inlined download with `Invoke-WebRequest`/`Get-FileHash`, `try/finally` for temp cleanup, combined path traversal regex
33+
- Changed macOS Cursor in `tools.json` from `browser` type to `download` with SHA256 hash verification
34+
- Changed UniGetUI package ID from `MartiCliment.UniGetUI` to `Devolutions.UniGetUI`
35+
- Changed UniGetUI install check from slow `winget list` to instant `Test-Path` for UniGetUI.exe
36+
- Changed PC Manager install from `Microsoft.PCManager` to `9PM860492SZD --source msstore`
37+
- Changed Intel DSA to launch after install/already-installed
38+
- Changed DefendNot to clean previous installation before re-install (fixes ExtractToDirectory conflict)
39+
- Changed RemoveWindowsAI to run as separate `powershell.exe` process (fixes GUI not showing)
40+
- Fixed pipeline pollution in `Invoke-Tool`, `Invoke-SecureScript`, `Install-WingetPackage` — added `| Out-Host` to prevent `True`/`False` leaking to console
41+
- Fixed `Invoke-SecureScript`/`Invoke-SecureDownload` — removed noisy "No hash provided" warning (only 1 of 14 tools has a hash)
42+
- Fixed em-dash encoding (```--`) in Common.ps1 warning messages for PS 5.1
43+
- Fixed PowerShell profile — replaced `Write-Warning` on startup with silent skip
44+
- Removed 13 redundant breadcrumb settings from VSCode `settings.json` (only `breadcrumbs.enabled: false` needed)
45+
- Removed dead `stickyScroll.scrollWithEditor`/`scrolling` settings, duplicate `layoutControl` from VSCode config
46+
- Removed `Windots.Apps.ps1`, `Windots.Configs.ps1`, `Windots.Customization.ps1`, `Windots.Menu.ps1`, `windots.ps1`, `config/vscode/snippet.txt`
47+
- Renamed `Set-WallpaperPack` to `Open-WallpaperBrowser`
48+
- Updated menu text "Windows Terminal config + Fira Code" → "Windows Terminal config + Nerd Font"
49+
- Changed README security note from collapsible `<details>` to blockquote
50+
- Changed `Benchmark.ps1` — added `$env:USERPROFILE` fallback chain for benchmark directory path
51+
- Changed `Initialize-Logging` — wrapped `Start-Transcript` in try/catch for locked file handling
52+
- Updated README, CONTRIBUTING, tests, and Customize README to match all renames
53+
854
## [26.3] - 2026-03-22
955

1056
### March 22 — Rebrand to Winrift, menu restructure, benchmark promotion, config flatten

CONTRIBUTING.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ winrift/
6666
│ ├── drivers/ # Driver installation
6767
│ ├── tools/ # Third-party tool integrations
6868
│ ├── unigetui/ # Package manager integration
69-
│ └── windots/ # Customization and ricing
69+
│ └── customize/ # Desktop environment, themes, configs
7070
├── docs/ # Documentation and guides
7171
└── media/ # Icons, logos, assets
7272
```

README.md

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -51,12 +51,7 @@ irm https://raw.githubusercontent.com/emylfy/winrift/main/scripts/install.ps1 |
5151

5252
</details>
5353

54-
<details>
55-
<summary>Security note on irm | iex</summary>
56-
57-
This is a common PowerShell install pattern (similar to `curl | sh`). The full source code is open at [github.com/emylfy/winrift](https://github.com/emylfy/winrift). All external scripts are verified with SHA256 hashes before execution.
58-
59-
</details>
54+
> **Security note:** This is a common PowerShell install pattern (similar to `curl | sh`). The full source code is open at [github.com/emylfy/winrift](https://github.com/emylfy/winrift). All external scripts are verified with SHA256 hashes before execution.
6055
6156
---
6257

@@ -105,7 +100,7 @@ Other tools apply tweaks and hope for the best. Winrift measures 13 system metri
105100
| **GPU Tweaks** | NVIDIA and AMD-specific optimizations with automatic device detection; hybrid GPU support |
106101
| **Security & Privacy** | Disable Defender ([DefendNot](https://github.com/es3n1n/defendnot)), remove Copilot/Recall ([RemoveWindowsAI](https://github.com/zoicware/RemoveWindowsAI)), privacy hardening ([privacy.sexy](https://github.com/undergroundwires/privacy.sexy)) |
107102
| **Drivers** | NVIDIA, AMD, Intel DSA auto-install, HP, Lenovo, ASUS, Acer, MSI, Dell, Huawei, Xiaomi, Gigabyte |
108-
| **Desktop Ricing** | Configs for VSCode/Cursor/Windsurf, Terminal, PowerShell, Oh My Posh, FastFetch, SpotX, Spicetify, Steam themes, Rectify11, macOS cursor |
103+
| **Customize** | Desktop environment ([GlazeWM](https://github.com/glzr-io/glazewm), [Zebar](https://github.com/glzr-io/zebar), [Flow Launcher](https://github.com/Flow-Launcher/Flow.Launcher), [Windhawk](https://windhawk.net/), [Rainmeter](https://www.rainmeter.net/)), terminal & shell configs, editor configs, app themes (Spotify, Steam, browser), Windows look & feel (dark mode, taskbar, accent color) |
109104
| **App Bundles** | Curated winget collections via [UniGetUI](https://github.com/marticliment/UniGetUI) — Development, Browsers, Utilities, Productivity, Creative & Media, Gaming, Communications |
110105
| **[Answer File](docs/autounattend_guide.md)** | Automated Windows 11 install — removes 25 bloatware apps, disables telemetry, cleans taskbar |
111106

config/tools.json

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,10 @@
9696
"id": "macos-cursor",
9797
"name": "macOS Cursor",
9898
"description": "macOS cursor theme for Windows",
99-
"type": "browser",
99+
"type": "download",
100100
"url": "https://github.com/ful1e5/apple_cursor/releases/download/v2.0.1/macOS-Windows.zip",
101+
"filename": "macOS-Windows.zip",
102+
"sha256": "64A2C74780908954A2EC497F67919709280EBB8EBDF3E3B9336BAC071589C9DE",
101103
"docs": "https://github.com/ful1e5/apple_cursor"
102104
},
103105
{
@@ -107,6 +109,14 @@
107109
"type": "irm",
108110
"url": "https://community.chocolatey.org/install.ps1",
109111
"docs": "https://chocolatey.org"
112+
},
113+
{
114+
"id": "rectify11",
115+
"name": "Rectify11",
116+
"description": "Windows 11 UI consistency fixes",
117+
"type": "browser",
118+
"url": "https://rectify11.net/home",
119+
"docs": "https://github.com/Rectify11/Installer"
110120
}
111121
]
112122
}
Lines changed: 228 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,228 @@
1+
function Invoke-Rectify11 {
2+
Clear-Host
3+
Invoke-Tool "rectify11"
4+
Pause-ForUser
5+
}
6+
7+
function Install-SpotX {
8+
Clear-Host
9+
Invoke-Tool "spotx"
10+
Pause-ForUser
11+
}
12+
13+
function Install-Spicetify {
14+
Clear-Host
15+
Invoke-Tool "spicetify"
16+
Pause-ForUser
17+
}
18+
19+
function Install-SteamMillennium {
20+
Clear-Host
21+
$result = Invoke-Tool "steam-millennium" -Wait -ErrorMessage "Failed to install Steam Millennium. Make sure Steam is installed"
22+
if (-not $result) {
23+
Pause-ForUser
24+
return
25+
}
26+
27+
Clear-Host
28+
Show-MenuBox -Title "Space Theme Installation" -Items @(
29+
"Would you like to install Space Theme for Steam?",
30+
"[Y] Yes [N] No"
31+
)
32+
$installChoice = Read-Host "Install Space Theme? (Y/N)"
33+
34+
if ($installChoice -eq 'y') {
35+
Invoke-Tool "spacetheme"
36+
}
37+
Pause-ForUser
38+
}
39+
40+
function Install-MacOSCursor {
41+
Clear-Host
42+
43+
$tool = Get-ToolConfig "macos-cursor"
44+
if (-not $tool) {
45+
Write-Log -Message "macOS Cursor tool config not found." -Level ERROR
46+
Pause-ForUser
47+
return
48+
}
49+
50+
$confirmed = Confirm-ExternalTool -Tool $tool
51+
if (-not $confirmed) {
52+
Write-Log -Message "User cancelled macOS Cursor download." -Level INFO
53+
return
54+
}
55+
56+
$zipPath = Join-Path $env:TEMP $tool.filename
57+
$extractPath = Join-Path $env:TEMP "macos-cursor"
58+
59+
try {
60+
# Download
61+
Write-Log -Message "Downloading $($tool.name) from $($tool.url)..." -Level INFO
62+
Invoke-WebRequest -Uri $tool.url -OutFile $zipPath -UseBasicParsing -ErrorAction Stop
63+
if (-not (Test-Path $zipPath)) {
64+
throw "Download failed: file not found after download"
65+
}
66+
if ($tool.sha256) {
67+
$actualHash = (Get-FileHash -Path $zipPath -Algorithm SHA256).Hash
68+
if ($actualHash -ne $tool.sha256) {
69+
Remove-Item $zipPath -Force -ErrorAction SilentlyContinue
70+
throw "Hash mismatch! Expected: $($tool.sha256), Got: $actualHash"
71+
}
72+
Write-Log -Message "Hash verified." -Level SUCCESS
73+
}
74+
75+
# Extract
76+
Write-Log -Message "Extracting..." -Level INFO
77+
if (Test-Path $extractPath) { Remove-Item $extractPath -Recurse -Force }
78+
Expand-Archive -Path $zipPath -DestinationPath $extractPath -Force
79+
80+
# Find available cursor themes (folders with .inf files)
81+
$infFiles = Get-ChildItem -Path $extractPath -Filter "*.inf" -Recurse
82+
if ($infFiles.Count -eq 0) {
83+
Write-Log -Message "No cursor .inf files found in archive." -Level ERROR
84+
Pause-ForUser
85+
return
86+
}
87+
88+
# Let user pick theme
89+
$themes = $infFiles | ForEach-Object { [PSCustomObject]@{ Name = $_.Directory.Name; InfPath = $_.FullName } }
90+
91+
if ($themes.Count -eq 1) {
92+
$selectedInf = $themes[0].InfPath
93+
Write-Log -Message "Found theme: $($themes[0].Name)" -Level INFO
94+
} else {
95+
$menuItems = @()
96+
for ($i = 0; $i -lt $themes.Count; $i++) {
97+
$menuItems += "[$($i + 1)] $($themes[$i].Name)"
98+
}
99+
$menuItems += "---"
100+
$menuItems += "[$($themes.Count + 1)] Cancel"
101+
102+
Show-MenuBox -Title "Select cursor theme" -Items $menuItems
103+
$choice = Read-Host ">"
104+
105+
$idx = 0
106+
if ([int]::TryParse($choice, [ref]$idx) -and $idx -ge 1 -and $idx -le $themes.Count) {
107+
$selectedInf = $themes[$idx - 1].InfPath
108+
} else {
109+
return
110+
}
111+
}
112+
113+
# Parse .inf to extract cursor registry mappings
114+
Write-Log -Message "Installing cursor theme..." -Level INFO
115+
116+
$cursorDir = Split-Path $selectedInf -Parent
117+
$cursorRegPath = "HKCU:\Control Panel\Cursors"
118+
$infContent = Get-Content $selectedInf -Raw
119+
120+
# Copy cursor files to a persistent user location — validate theme name to prevent path traversal
121+
$themeName = (Split-Path $cursorDir -Leaf)
122+
if ($themeName -match '(\.\.|[\\\/])') {
123+
Write-Log -Message "Invalid theme directory name: $themeName" -Level ERROR
124+
Pause-ForUser
125+
return
126+
}
127+
$persistDir = Join-Path "$env:USERPROFILE\.cursors" $themeName
128+
if (-not (Test-Path $persistDir)) {
129+
New-Item -Path $persistDir -ItemType Directory -Force | Out-Null
130+
}
131+
Copy-Item -Path "$cursorDir\*" -Destination $persistDir -Recurse -Force
132+
Write-Log -Message "Cursor files copied to $persistDir" -Level SUCCESS
133+
134+
# Parse .inf for HKCU,"Control Panel\Cursors","<Name>",,"%10%\...\<file>" lines
135+
$cursorMap = @{}
136+
$infContent -split "`r?`n" | ForEach-Object {
137+
if ($_ -match 'HKCU,\s*"Control Panel\\Cursors",\s*"([^"]+)",,\s*".*\\([^"\\]+)"') {
138+
$regName = $Matches[1]
139+
$fileName = $Matches[2]
140+
$cursorMap[$regName] = $fileName
141+
}
142+
}
143+
144+
# Also check for the scheme name line: HKCU,"Control Panel\Cursors",,"<name>"
145+
$schemeName = $themeName
146+
if ($infContent -match 'HKCU,\s*"Control Panel\\Cursors",,\s*"([^"]+)"') {
147+
$schemeName = $Matches[1]
148+
}
149+
150+
if ($cursorMap.Count -eq 0) {
151+
Write-Log -Message "Could not parse cursor mappings from .inf file. Trying file scan..." -Level WARNING
152+
# Fallback: scan for .cur/.ani files and use filename-based guessing
153+
$curFiles = Get-ChildItem -Path $persistDir -Include "*.cur","*.ani" -Recurse
154+
Write-Log -Message "Found $($curFiles.Count) cursor files in $persistDir" -Level INFO
155+
156+
# Common filename mappings for apple_cursor
157+
$fallbackMap = @{
158+
"left_ptr" = "Arrow"; "help" = "Help"
159+
"wait" = "Wait"; "progress" = "AppStarting"
160+
"crosshair" = "Crosshair"; "cross" = "Crosshair"
161+
"text" = "IBeam"; "xterm" = "IBeam"
162+
"pencil" = "NWPen"; "handwriting"= "NWPen"
163+
"circle" = "No"; "not-allowed"= "No"; "forbidden" = "No"
164+
"size_ver" = "SizeNS"; "ns-resize" = "SizeNS"
165+
"size_hor" = "SizeWE"; "ew-resize" = "SizeWE"
166+
"size_fdiag" = "SizeNWSE"; "nwse-resize"= "SizeNWSE"
167+
"size_bdiag" = "SizeNESW"; "nesw-resize"= "SizeNESW"
168+
"size_all" = "SizeAll"; "all-scroll" = "SizeAll"; "move" = "SizeAll"
169+
"up_arrow" = "UpArrow"; "center_ptr" = "UpArrow"
170+
"hand" = "Hand"; "pointer" = "Hand"; "link" = "Hand"
171+
}
172+
173+
foreach ($file in $curFiles) {
174+
$baseName = $file.BaseName.ToLower()
175+
if ($fallbackMap.ContainsKey($baseName)) {
176+
$cursorMap[$fallbackMap[$baseName]] = $file.Name
177+
}
178+
}
179+
}
180+
181+
if ($cursorMap.Count -eq 0) {
182+
Write-Log -Message "No cursor mappings found. Installation cannot proceed." -Level ERROR
183+
Pause-ForUser
184+
return
185+
}
186+
187+
Write-Log -Message "Applying $($cursorMap.Count) cursor mappings..." -Level INFO
188+
189+
# Set registry values for each cursor
190+
$applied = 0
191+
foreach ($regName in $cursorMap.Keys) {
192+
$curFile = Join-Path $persistDir $cursorMap[$regName]
193+
if (Test-Path $curFile) {
194+
Set-ItemProperty -Path $cursorRegPath -Name $regName -Value $curFile -Force
195+
$applied++
196+
}
197+
}
198+
199+
# Set the scheme name
200+
Set-ItemProperty -Path $cursorRegPath -Name "(Default)" -Value $schemeName -Force
201+
202+
Write-Log -Message "Set $applied cursor registry entries." -Level SUCCESS
203+
204+
# Notify the system of cursor change
205+
if (-not ('CursorHelper' -as [type])) {
206+
Add-Type -TypeDefinition @"
207+
using System;
208+
using System.Runtime.InteropServices;
209+
public class CursorHelper {
210+
[DllImport("user32.dll", SetLastError = true)]
211+
public static extern bool SystemParametersInfo(uint uiAction, uint uiParam, string pvParam, uint fWinIni);
212+
}
213+
"@
214+
}
215+
# SPI_SETCURSORS = 0x0057, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE = 0x03
216+
[CursorHelper]::SystemParametersInfo(0x0057, 0, $null, 0x03) | Out-Null
217+
218+
Write-Log -Message "macOS cursor applied successfully!" -Level SUCCESS
219+
} catch {
220+
Write-Log -Message "Failed to apply cursor: $($_.Exception.Message)" -Level ERROR
221+
} finally {
222+
# Cleanup temp files regardless of success or failure
223+
Remove-Item $zipPath -Force -ErrorAction SilentlyContinue
224+
Remove-Item $extractPath -Recurse -Force -ErrorAction SilentlyContinue
225+
}
226+
227+
Pause-ForUser
228+
}

0 commit comments

Comments
 (0)