Reset Pack, reinstalling Windows in a single command
PowerShell pack to fully automate reinstalling a Windows 11 PC after a reset: apps, drivers, dev setup, tweaks, debloat, restoring configs from OneDrive.
Why?
I reset my PCs fairly often, every 3 or 4 months at home. After redoing the same steps over and over, I ended up building a small install routine — and each generation of that routine evolved alongside the tooling of the moment.
Back in 2021, it was a Reset Pack built on Ketarin — a tool that automatically downloads and installs packages from a frozen list. At the time it was perfect: 7zip, Brave, Discord, Driver Booster, Everything, FileZilla, Office 365, PatchMyPC, PUTTY, VirtualBox, VLC, XAMPP all installed themselves while I did something else. Alternatives like Ninite or PatchMyPC did the same job, mostly a matter of taste.
But by 2026, the landscape has shifted. winget ships natively with Windows 11, which makes Ketarin a bit obsolete. PowerShell 5.1 is still there, by default on every machine. My needs, on the other hand, have grown: it’s no longer just about installing a dozen apps, it’s also about rebuilding my dev environment (WSL2, gh, Git config, SSH keys), restoring my configs (Claude Code, Claude Desktop, Obsidian, PowerToys, Windows Terminal), killing ads and telemetry, pinning my taskbar, and reinstalling 30+ VSCode extensions.
Hence this V2, completely rewritten: Reset Pack, a set of PowerShell scripts that automates all of that in a single command on a clean Windows install. A few minutes later, all my apps, drivers, configs, shortcuts, scheduled tasks and even default apps are back in place. The lost day spent reconfiguring everything by hand is over.
How it works
The pack is split into 11 numbered modules, each responsible for a specific step. Every module is idempotent, meaning I can re-run it without breaking anything, and I can also run just one if needed:
- 01-apps: install via
wingetof all my apps from anapps.json(Brave, 7zip, Git, Obsidian, Signal, Steam, VLC, PowerToys, VSCode, Claude Desktop, Docker, Node, gh, etc.). - 02-drivers: NVCleanstall for Nvidia + SDIO for chipset/audio, run in silent mode.
- 03-dev-setup:
git config, WSL2 Ubuntu, long paths,gh auth loginwith SSH key generation. - 04-symlinks: restores configs from
OneDrive\Documents\08_Logiciels\Configs\via symlinks (Git, Claude Code, Claude Desktop, Windsurf, Windows Terminal, PowerToys, Obsidian). - 05-vscode: reinstalls all extensions from a frozen list.
- 06-tweaks: visible file extensions, hidden files, classic context menu, widgets/Copilot off, telemetry off, Win+V on.
- 07-defaults: Brave as default for web/pdf/html, VLC for media, via SetUserFTA (otherwise Microsoft blocks programmatic changes to file associations).
- 08-debloat: Cortana and preinstalled apps gone, OneDrive stays.
- 09-games: Saved Games / My Games symlinks, plus LoL/Overwatch/Dofus installs.
- 10-scheduled: weekly
winget upgrade --alltask and auto dark/light switch (7am ↔ 8pm). - 11-finalize: pin taskbar (Brave, Explorer, Terminal, Claude), hosts file for ad blocking, opens the Brave Sync page.
Alongside, a backup-configs.ps1 script that runs ahead of the reset (or periodically) and pushes all my configs to OneDrive, so that the restore step has files to point at.
And of course, the best friend of Windows productivity is still around: PowerToys, which I use every day, especially the color picker and FancyZones. It’s installed by the 01-apps module and its config is restored by the symlinks step.
My contributions
All of it, end to end. Modular architecture, PowerShell scripts, common helpers (banner, colored log, safe symlinks with automatic backup of the existing target, retry, force-download for OneDrive Files On-Demand), interactive vs -Auto mode, automatic admin elevation, normalization of comma-separated args (because PowerShell 5.1 handles that poorly). I also planned for two variants depending on the target machine (Codect and EXODIUS), which lets me keep a slightly different app set per box.
Takeaways
Idempotence is the key. A script you don’t dare re-run because you don’t know what’ll happen is a script you stop maintaining. Here, I can re-run any module ten times in a row and nothing changes if the state is already correct. So I test fearlessly, and that’s what let me iterate fast.
PowerShell 5.1 has real gotchas. Comma-separated parameters via -File not splitting into [string[]], admin permissions getting lost on relaunch, symlinks that can be locked by PowerToys or Claude Desktop while you try to replace them. Long story short, retries had to go almost everywhere, because we’re on Windows and nothing is ever guaranteed.
Centralizing configs on OneDrive is a win. Before, my configs were scattered around, and at every reset I’d lose stuff. Now everything lives in OneDrive\Documents\08_Logiciels\Configs\, implicitly versioned by OneDrive, and symlinks do the rest. If I tweak a config on one machine, it propagates on its own.
Default apps on Windows 11 are locked down. Microsoft prevents programmatic changes to file associations, so you have to go through SetUserFTA, which exploits an internal hash to push changes through. Shame it has to be this way, but the workaround works perfectly.
Context
Personal project, V2 of a routine I’ve been maintaining since 2021. The prospect of spending another full day reinstalling, configuring, re-pinning the taskbar, and re-checking fifty-two boxes in Windows settings at every reset is what pushed me to take it much further than the original Ketarin version. The pack was paired with Claude Code, which let me crank fast on the modules themselves and focus on the edge cases (error handling, retries, winget quirks, etc.).
Happy installs, and most of all, happy routine.
Tech stack
-
PowerShell 5.1+
-
winget (Windows Package Manager)
-
WSL2 / Ubuntu
-
SetUserFTA (file associations)
-
NVCleanstall + SDIO (drivers)
-
gh CLI (GitHub auth)
-
OneDrive (config storage)