From Personal Script to Public Tool: How I Built a Windows Setup Generator
Turning a Personal Automation Into a Tool Anyone Can Use
You know that sinking feeling when you format your Windows machine and realize you have to install everything again manually?
Downloading countless executable files, clicking “Next” seventy times. Accepting seventy license agreements. Waiting through seventy progress bars. It’s tedious. It isn’t enjoyable. It’s the digital equivalent of moving from one house to another.
So I did what any reasonable developer would do: I automated it. I wrote a bash script that installed everything I needed with a few commands. Problem solved.
Except it only solved my problem. The script lived in one of my private repositories, tailored to my exact needs, useless to anyone else. It worked perfectly, but only for me.
Then one day it hit me: Why keep this to myself when anyone could use it?
This is the story of how I transformed a personal automation script into an open-source React web app that generates custom Windows setup scripts for anyone - no coding required on the user’s end. Just click, download and run.
The Personal Script That Started It All
Let me paint you a picture: a fresh Windows install. Clean slate. Beautiful, in theory.
In practice? You’re staring at an empty desktop, a default browser you’ll immediately replace, and hours of repetitive installation ahead. Browsers. Development tools. Media players. Productivity apps. The essentials.
I got tired of this dance. Really tired. So I created a bash script that used Winget and Regedit, the Windows Package Manager, to automate everything.
# My original approach (simplified)
winget install Google.Chrome
winget install Mozilla.Firefox
winget install Microsoft.VisualStudioCode
winget install Git.Git
reg add ....
# ... and so onRun it once, walk away, come back to a fully configured machine. Magic.
It worked beautifully. I’d format my machine, run my script, grab coffee, and return to a system ready to rock - my personal setup assistant, living in a text file.
But here’s the thing: it was mine. Hardcoded to my preferences. My apps. My workflow. If you wanted to use it, you’d have to fork it, edit the bash script, figure out the Winget package IDs and your preferred settings, and hope you didn’t break anything.
Not exactly user-friendly.
The “Why Not Everyone?” Moment
The insight came when I was preparing to format my PC after installing a new SSD. I opened my old post-install script to update a few entries and immediately noticed something:
Both the app installs and the system configurations followed patterns.
They were predictable. Structured. Repetitive in precisely the way automation loves.
It didn’t need to be edited - it could be generated, and if it could be generated for me, it could be generated for anyone.
That was the real turning point.
Not that the script was difficult to use, but that it was already halfway to becoming a universal tool. The logic, the categories, the configurations - everything could be exposed through a UI and exported as a script tailored to each person.
Once I realized that, the project stopped being a personal setup file and became a public, automated Windows setup generator.
Building the Universal Solution
I decided to build a web application. React, Vite, Tailwind CSS. Something fast, modern, and browser-based. No installation needed. No command line required.
The core idea was simple: Let people click on software they want, then generate a batch script they can download and run.
Think of it like creating a recipe. You browse a menu (100+ software applications), select what you want (browsers, dev tools, games), customize your order (system configurations), and get a ready-to-cook recipe (a .bat script) delivered to your door (your Downloads folder) so you can eat (run as Administrator).
The Stack: Simple, Fast, Modern
I went with React 19 because I needed something interactive and component-based. Users would be clicking, searching, selecting. React excels at this.
Vite for the build tool. Fast dev server, instant hot module replacement. No webpack configuration headaches.
Tailwind CSS for styling. Utility-first, rapid prototyping, and honestly? I wanted to try something new. Plus, I gave it a **Windows 98-inspired UI** for nostalgia points. 🎨
No heavy state management library. No Redux. No MobX. Just React Context API with localStorage for persisting selections. Please keep it simple.
The Brain: Script Generation
Here’s where it gets interesting. The app generates Windows batch scripts on the fly.
Every software item in the catalog has a winget package ID. When you click on Google Chrome, the app knows it’s `Google Chrome`. Firefox? `Mozilla.Firefox`. You get the idea.
When you hit “Download Script,” the app:
Groups your selections by category (Browsers, Development, Gaming, Configs, etc.)
Generates a batch script with proper formatting
Adds UTF-8 encoding support (`chcp 65001` in the script header - learned this the hard way)
Includes admin privilege checks (because winget needs admin rights)
Wraps it all in a clean, readable format with progress messages
The generated script looks something like this:
@echo off
chcp 65001 >nul
echo ========================================
echo Windows Post-Install Script (.bat)
echo Generated: 2025-12-01 10:30:00
echo ========================================
...
:: BROWSERS
echo Installing Browsers...
echo - Google Chrome
winget install Google.Chrome --silent --accept-package-agreements --accept-source-agreements
echo - Mozilla Firefox
winget install Mozilla.Firefox --silent --accept-package-agreements --accept-source-agreements
echo installation Complete!
...
::============================================
:: SYSTEM CONFIGURATIONS
::============================================
echo.
echo Applying system configurations...
echo.
:: Disable Bing search in Start Menu
echo Applying: Disable Bing search in Start Menu
reg add “HKCU\Software\Microsoft\Windows\CurrentVersion\Search” /v BingSearchEnabled /t REG_DWORD /d 0 /f
echo.
::============================================
:: INSTALLATION COMPLETE
::============================================
echo.
echo ========================================
echo Installation Complete!
echo ========================================
echo.
echo If any installations failed, check errors.log
echo.
...
echo Next steps:
echo 1. Restart your computer if required
echo 2. Log into your installed applications
echo 3. Customize your settings as needed
Simple. Clean. Anyone can read it, and more importantly, Windows can run it.
The Catalog: 100+ Applications and 80 System Configurations
Building the catalog wasn’t just about collecting apps. It became a whole research project. I spent hours on winget.run, checking package IDs, validating metadata, and organizing everything into a structure that made sense for users.
In the end, the tool shipped with 100+ applications across 13 categories:
Browsers
Development
Communication
Productivity
Media
Gaming
Utilities
Security
File Management
Design
Education
Drivers
Cloud Storage
Each entry includes:
Name and description
Verified winget ID
Category
Icon (via react-icons)
License information
Whether it requires admin privileges
But the catalog doesn’t stop at apps.
I also added 80 Windows system configurations - everything from File Explorer tweaks to performance, gaming, privacy, visual customization, Windows Update behavior, Start Menu settings, networking, and cleanup options.
These configurations follow the same structure as the apps: predictable, declarative, and perfect for script generation. The user selects what they want - “show file extensions,” “disable telemetry,” “enable hardware GPU scheduling,” “remove bloatware,” “set high-performance power plan,” and so on - and the generator translates those choices into PowerShell and batch commands.
Some of the categories include:
File Explorer (show extensions, show hidden files, disable Quick Access…)
Performance (turn off hibernation, disable SysMain, set max CPU performance…)
Gaming Optimizations (disable Game DVR, enable GPU scheduling, remove telemetry…)
Privacy (telemetry off, advertising ID off, activity history off…)
Visual Customization (taskbar tweaks, remove OneDrive, classic right-click menu…)
Windows Update (turn off auto-restart, toggle full update…)
Start Menu & Taskbar (remove Bing search, show all tray icons…)
Network & Internet (disable WiFi Sense, set DNS to Cloudflare…)
Cleanup (safely remove preinstalled apps and UWP bloat…)
Everything is explicit. Everything is documented.
And everything can be generated into a script with a single click.
It’s essentially a curated “Windows setup store”- but instead of installing things directly, you export a reproducible installer and configuration script tailored to your machine and workflow.
The Result
What did I build? A tool that anyone can use to generate custom Windows setup scripts.
Features
- 100+ Software Applications – Browsers, dev tools, games, productivity apps, and more
- 80 System Configurations – Optimize Windows settings, privacy tweaks, gaming optimizations
- Categories – Find what you need quickly
- One-Click Download – Generate and download your .bat script instantly
- No Installation Required – Runs entirely in your browser
- Open Source – MIT licensed, available on GitHub
The workflow is dead simple:
Visit the site
Browse categories and search for apps
Click to select what you want
Add system configurations if needed (turn off telemetry, optimize performance, etc.)
Click “Download Script.”
Run the script as Administrator on your Windows machine
Walk away while it installs everything (but only if it’s a brisk walk, because it is quick)
It’s the tool I wish existed when I started automating my setups.
What I Learned
This project taught me something important: The best tools aren’t just the ones that work, they’re the ones that work for everyone.
My original script was functional, but exclusive. It solved a problem for an audience of one. By taking the time to transform it into something universal, I created something that actually helps people.
I also learned to embrace simplicity. I didn’t need Redux. I didn’t need a backend. I didn’t need a database. Context API, localStorage, and client-side script generation were enough. Sometimes the simplest solution is the right solution.
And finally: Open source matters. The project code is on GitHub and is live for everyone to use. Anyone can contribute. Add new software. Suggest features. Report bugs. It’s not just my tool anymore, it’s a community resource.
Personal tools are great. Universal tools are better.
Try It Yourself
The Windows Post-Install Script Generator is live and ready to use.
🌐 Try it: Windows Post-Install Generator
💻 GitHub: Code
🏗️ Open Source: MIT License - fork it, improve it, make it yours!
Got a fresh Windows install coming up? Give it a try. Have ideas for new software or configurations? Contributions are welcome.
What started as a personal script became a public tool. And that’s the beauty of open source - solutions that scale from one to everyone.






