A single-file PowerShell TUI to batch install Windows apps via winget. Pick a profile, hit space, hit enter.
Open PowerShell and run:
iwr https://github.com/enixCode/winget-ui/releases/latest/download/winget-ui.ps1 -OutFile winget-ui.ps1
.\winget-ui.ps1That is it. The script ships with default profiles (Developer, Designer, Office, Open Source) bundled inside. No clone, no install, no dependencies beyond winget itself.
After downloading the script once, register it in your PowerShell profile so you can type winget-ui from any directory:
.\winget-ui.ps1 --install
# open a new PowerShell window, or: . $PROFILE
winget-ui # works from anywhere now
winget-ui --uninstall # clean removal (configs/sources are kept)--install copies the bundle to $HOME\.winget-ui\bin\ and adds a winget-ui function to $PROFILE.CurrentUserCurrentHost (idempotent, safe to re-run). Configs you have added and sources you have cloned are preserved on --uninstall.
Profile menu
| Key | Action |
|---|---|
↑ / ↓ |
Navigate |
Enter |
Open selected profile |
S |
Add a config source (prompts for a URL) |
Q |
Quit |
Package menu
| Key | Action |
|---|---|
↑ / ↓ |
Navigate |
Space |
Toggle item |
A / N |
Select all / none |
Enter |
Install selected |
Q |
Quit |
Boxes: [x] winget package, {x} shell command, [+] already installed.
.\winget-ui.ps1 # full interactive: profile menu, then package menu
.\winget-ui.ps1 --config dev.json # skip the profile menu, open this profile's package list directly
.\winget-ui.ps1 --add owner/repo # add a source (GitHub repo, full URL, local folder, or .zip)
.\winget-ui.ps1 --update # pull all installed sources
.\winget-ui.ps1 --list-sources # show installed sources
.\winget-ui.ps1 --remove <name> # remove a source
.\winget-ui.ps1 --no-update # skip the auto-update check for this run
.\winget-ui.ps1 --helpCustom and private configs live outside this repo. See CUSTOM-CONFIGS.md for the format and the three ways to add them (drop a JSON, --add a repo, or press S in the menu).
On every interactive launch, the script checks the GitHub Releases API once per 24h and silently replaces itself if a newer version exists. The downloaded file is validated (size + header sentinel) before being moved over the old one. Disable with --no-update or by setting $env:WINGETUI_NO_UPDATE=1. Dev builds (Version = 'dev') never auto-update.
If you would rather pin a specific version, download a specific release asset directly and add --no-update to every call.
git clone https://github.com/enixCode/winget-ui
cd winget-ui
.\winget-ui.ps1 # dev mode (modules loaded from disk)
.\build.ps1 # produces dist\winget-ui.ps1 (single-file bundle)The build embeds every configs\*.json as base64 and inlines all modules. Tagging v* on main runs the release workflow which uploads the bundle as a release asset.
- Windows 10/11
- PowerShell 5.1+
- winget
- Optional, for
--addfrom a GitHub URL:gh: preferred for private repos (uses your GitHub login). Bypasses the GitHub API rate limit.git: bypasses the rate limit too if your credentials are set up.- Neither installed? Public repos still work via a ZIP download, but the tool queries the GitHub REST API for the default branch, which is rate-limited to 60 req/h for anonymous callers. Install
ghorgitif you expect to hit that.
- Optional, for
--addfrom a local path: nothing extra (uses built-inCopy-Item/Expand-Archive).
MIT

