GistGet is a CLI tool designed to synchronize Windows Package Manager (winget) packages across multiple devices using GitHub Gist. It enables users to back up and restore their installed applications consistently by leveraging a YAML configuration file stored in a private or public Gist.
Key Features:
Cloud Sync: Automatically synchronize installed packages with GitHub Gist for seamless backup and restoration.
Full Winget Compatibility: Use standard winget commands while integrating cloud sync capabilities (e.g., gistget search, gistget install).
Cross-Device Support: Maintain consistent software installations across workstations, home computers, or any Windows device.
Configuration as Code: Manage your package list in a readable and version-controlled YAML format stored in Gist.
Audience & Benefit:
Ideal for developers, IT professionals, and anyone managing multiple Windows machines. By using GistGet, users can ensure their software installations remain consistent across devices, simplify package management, and automate backups using GitHub Gist.
GistGet is available via winget and supports both native cloud sync features and standard winget commands, offering a seamless integration into existing workflows.
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.
Features
Cloud Sync: Synchronize installed packages via GitHub Gist.
Full Winget Compatibility: Use standard winget commands directly, with integrated cloud sync capabilities (e.g., gistget search, gistget install).
Cross-Device: Keep your work and home computers in sync.
Configuration as Code: Manage your software list in a readable GistGet.yaml format.
> Note: The published artifact is currently x64-only. ARM64 builds are not shipped yet.
Troubleshooting
gistget command not found after installation
After installing via WinGet, existing terminal sessions may not recognize the command because the PATH environment variable is not updated in running sessions. To resolve this:
& "$env:LOCALAPPDATA\Microsoft\WinGet\Links\gistget.exe" --help
Usage
Authentication
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.
Initial Setup
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.
Sync
To sync local packages with the Gist:
gistget sync
This performs the following operations:
Fetches GistGet.yaml from the Gist.
Compares it with locally installed packages.
Installs missing packages and uninstalls packages marked for removal.
Help
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
Command List
GistGet supports both its own cloud sync features and all winget commands.
GistGet Native 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
gist
List packages from 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
WinGet Compatible Commands (Passthrough)
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
Configuration
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:
Core Parameters
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.
Pin Types
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
Installation Options (winget passthrough)
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
Configuration Examples
# 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
For Developers
This section provides information for developers contributing to the GistGet project.
Development Environment
OS: Windows 10/11 (Windows 10.0.26100.0 or later)
.NET SDK: .NET 10.0 or later
Windows SDK: 10.0.26100.0 or later (including UAP Platform)
IDE: Visual Studio 2022 or Visual Studio Code (recommended)
Windows Package Manager: winget (via Windows App Installer)
> [!IMPORTANT]
> Integration tests use the actual GitHub API. Be sure to complete authentication with Run-AuthLogin.ps1 before running tests.
1. Run-AuthLogin.ps1 (First run / Auth expiration)
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.
2. Run-CodeQuality.ps1 (Daily development)
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
Release
Releases are automated via GitHub Actions. When you push a tag, build, upload to GitHub Releases, and PR creation to WinGet are automatically executed.
Official Release
# 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
Pre-release
Using pre-release tags (-alpha, -beta, -rc, etc.) will skip PR creation to WinGet: