GistGet nuitsjp
winget install --id=NuitsJp.GistGet -e GistGet is a tool that synchronizes your WinGet package list with GitHub Gist, enabling easy backup and restoration of your installed packages across multiple machines.
winget install --id=NuitsJp.GistGet -e GistGet is a tool that synchronizes your WinGet package list with GitHub Gist, enabling easy backup and restoration of your installed packages across multiple machines.
GistGet is a CLI tool designed to synchronize Windows Package Manager (winget) packages across multiple devices using GitHub Gist.
It uses a simple YAML configuration file stored in a private or public Gist to keep your installed applications and tools consistent.
winget commands directly, with integrated cloud sync capabilities (e.g., gistget search, gistget install).GistGet.yaml format.winget)PATH.winget install NuitsJp.GistGet
After installation, you can launch it with:
gistget --help
> Note: The published artifact is currently x64-only. ARM64 builds are not shipped yet.
gistget command not found after installationAfter installing via WinGet, existing terminal sessions may not recognize the gistget command because the PATH environment variable is not updated in running sessions. To resolve this:
Restart your terminal (Recommended)
Refresh PATH in PowerShell
$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User")
Use the full path temporarily
& "$env:LOCALAPPDATA\Microsoft\WinGet\Links\gistget.exe" --help
First, log in to your GitHub account to enable Gist access.
gistget auth login
Follow the on-screen instructions to authenticate using the Device Flow.
When you install a package, it is automatically synced to Gist. Even if a package is already installed, running the install command will add it to Gist:
# Install a new package and sync
gistget install --id Microsoft.PowerToys
# Add an already installed package to Gist
gistget install --id 7zip.7zip
By adding frequently used packages with install, you naturally build a synced package list in Gist.
> Tip: If you want to select all installed packages at once, you can use the gistget init command to interactively choose them.
To sync local packages with the Gist:
gistget sync
This performs the following operations:
GistGet.yaml from the Gist.You can view the command list and options using the --help option:
# Display all commands
gistget --help
# Display help for a specific command
gistget install --help
gistget sync --help
GistGet supports both its own cloud sync features and all winget commands.
| Command | Description |
|---|---|
auth login | Authenticate with GitHub |
auth logout | Log out from GitHub |
auth status | Display current authentication status |
sync | Synchronize packages with Gist |
init | Interactively select installed packages to initialize Gist |
install | Install a package and save to Gist |
uninstall | Uninstall a package and update Gist |
upgrade | Upgrade a package and save to Gist |
pin add | Pin a package and save to Gist |
pin remove | Unpin a package and update Gist |
The following commands are passed directly to winget. You can use them just like regular winget commands:
| Command | Description |
|---|---|
list | Display installed packages |
search | Find and show basic package information |
show | Show detailed package information |
source | Manage package sources |
settings | Open settings or modify administrator settings |
features | Show status of experimental features |
hash | Helper to hash installer files |
validate | Validate a manifest file |
configure | Configure the system into a desired state |
download | Download installer from a package |
repair | Repair the selected package |
pin list | List current pins |
pin reset | Reset pins |
Usage Examples:
# Search for packages (same as winget)
gistget search vscode
# Show package information (same as winget)
gistget show Microsoft.PowerToys
# List installed packages (same as winget)
gistget list
GistGet uses a GistGet.yaml file in the Gist. It's a map where the package ID is the key, and the value contains installation options and sync flags.
:
name: # winget display name (auto-set)
pin: # Pinned version (omit for no pin)
pinType: # Pin type (default: pinning)
uninstall: # true to mark for uninstallation
# Installation options (winget passthrough)
scope:
architecture:
installerType:
interactive:
silent:
locale:
location:
log:
custom:
override:
force:
acceptPackageAgreements:
acceptSourceAgreements:
allowHashMismatch:
skipDependencies:
header:
| Parameter | Type | Description |
|---|---|---|
name | string | Package name displayed by winget. Auto-set by install / upgrade / uninstall / pin add / init. |
pin | string | Version to pin. Omit for no pin (always latest). Wildcards * supported (e.g., 1.7.*). |
pinType | enum | Pin type. Only effective when pin is specified. Default: pinning. |
uninstall | boolean | If true, will be uninstalled during sync. |
| Value | Description | upgrade --all | upgrade |
|---|---|---|---|
| None | No pin. Eligible for all upgrades. | Allowed | Allowed |
pinning | Default. Excluded from upgrade --all, but explicit upgrade is possible. | Skipped | Allowed |
blocking | Excluded from upgrade --all. Explicit upgrade is also possible. | Skipped | Allowed |
gating | Upgrade only within specified version range (e.g., 1.7.*). | Within range only | Within range only |
| Parameter | winget Option | Description |
|---|---|---|
scope | --scope | user or machine |
architecture | --architecture | x86, x64, arm, arm64 |
installerType | --installer-type | Installer type |
interactive | --interactive | Interactive installation |
silent | --silent | Silent installation |
locale | --locale | Locale (BCP47 format) |
location | --location | Installation path |
log | --log | Log file path |
custom | --custom | Additional installer arguments |
override | --override | Override installer arguments |
force | --force | Force execution |
acceptPackageAgreements | --accept-package-agreements | Accept package agreements |
acceptSourceAgreements | --accept-source-agreements | Accept source agreements |
allowHashMismatch | --ignore-security-hash | Ignore hash mismatch |
skipDependencies | --skip-dependencies | Skip dependencies |
header | --header | Custom HTTP header |
# Install latest version, upgradeable (no pin)
Microsoft.VisualStudioCode:
name: Visual Studio Code
scope: user
silent: true
override: /VERYSILENT /MERGETASKS=!runcode
# Pin to version 23.01 (excluded from upgrade --all)
7zip.7zip:
name: 7-Zip
pin: "23.01"
architecture: x64
# Restrict to version 1.7.x range (gating)
jqlang.jq:
name: jq
pin: "1.7.*"
pinType: gating
# Mark for uninstallation
DeepL.DeepL:
name: DeepL
uninstall: true
This section provides information for developers contributing to the GistGet project.
external/winget-cli/samples/WinGetClientSample/> [!IMPORTANT]
> Integration tests use the actual GitHub API. Be sure to complete authentication with Run-AuthLogin.ps1 before running tests.
Script to execute GitHub authentication and save credentials to Windows Credential Manager:
.\scripts\Run-AuthLogin.ps1
Credentials are persisted, so this only needs to be run on first use or when authentication expires.
Integrated script to run the code quality pipeline:
# Run all steps (default)
# FormatCheck -> Build -> Tests -> ReSharper
.\scripts\Run-CodeQuality.ps1
# Run specific steps only
.\scripts\Run-CodeQuality.ps1 -Build # Build only
.\scripts\Run-CodeQuality.ps1 -Build -Tests # Build and Tests only
.\scripts\Run-CodeQuality.ps1 -Tests # Tests only
# Run with Release build
.\scripts\Run-CodeQuality.ps1 -Configuration Release
# Change coverage threshold
.\scripts\Run-CodeQuality.ps1 -CoverageThreshold 95
Releases are automated via GitHub Actions. When you push a tag, build, upload to GitHub Releases, and PR creation to WinGet are automatically executed.
# 1. Update version in csproj and commit
git add .
git commit -m "chore: bump version to 0.2.0"
# 2. Create and push tag
git tag v0.2.0
git push origin main --tags
Using pre-release tags (-alpha, -beta, -rc, etc.) will skip PR creation to WinGet:
git tag v0.2.0-beta.1
git push origin --tags
MIT License