This directory contains scripts and configuration files to automate the setup of a Windows development environment using PowerShell and various package managers.
The setup script (setup.ps1) automates the installation and configuration of:
- Chocolatey packages (applications and tools)
- PowerShell modules (via PSResourceGet)
- Windows PowerShell modules (via PowerShellGet)
- pipx packages (Python tools)
- uv tools (Python CLI tools)
- npm global packages (Node.js tools)
- .NET Global Tools (when .NET SDK is available)
- Visual Studio Code extensions
- Git configuration
- System preferences and Windows features
- Windows 11
- Administrative privileges
- PowerShell 5.1 or higher (comes with Windows 11)
- Internet connection
- Clone this repository or download the repository contents
- Open Windows PowerShell as Administrator
- Navigate to the
windowsdirectory - Run the setup script:
# Clone the repository if you haven't already
git clone https://github.com/ryanspletzer/dev-machine-setup.git
cd dev-machine-setup/windows
# Or copy the contents of the windows directory to somewhere like ~/Downloads if you don't have git installed yet
# cd ~/Downloads
# Change the PowerShell Execution Policy
# Note this is _not_ a security boundary, so don't worry...
# See this for more info:
# https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_execution_policies
Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Force
# Run the script
.\setup.ps1 -e your.email@example.comEmail is for the git user.email config.
The script also sets git user.name and it can be provided as shown below -- - if no name is provided, the script will
try to use the output of (Get-LocalUser -Name $env:USERNAME).FullName to pull the user's full name from the local
Windows user information (as long as it is not empty -- if it is the script will stop).
# Provide your name for git user.name config if you know your proper full name isn't set for your local windows user
.\setup.ps1 -e your.email@example.com -n 'Your Name'The default setup includes a curated selection of popular development tools and applications:
- Docker
- Git and Git LFS
- Visual Studio Code
- .NET SDK and .NET Framework
- Python, Node.js, Go, Rust
- AWS CLI, Azure CLI, Terraform, Packer, Vault
- PowerShell 7+
- Global npm packages (AWS CDK, npmrc)
- .NET global tools (Amazon Lambda Tools)
- 1Password
- Microsoft Office 365 Business
- Slack
- Zoom
- SQL Server Management Studio
- Microsoft Azure Storage Explorer
See vars.yaml for the complete list of installed packages.
The setup is driven by the vars.yaml file, which contains configurable options for the following items below.
It is encourage to take the vars.yaml file and customize it to your needs!
There are many common items in there that are desirable for dev machine setup, but each person is different and will
want to cater their own vars.yaml file to their needs.
Applications and tools installed via Chocolatey. Each entry has:
name: Package name (required)parameters: Optional installation parameters (e.g.,/WindowsTerminal)prerelease: Optional boolean to allow prerelease versions
choco_packages:
- name: git
parameters: /WindowsTerminal /NoShellIntegration
- name: vscode
# etc.PowerShell modules installed via PSResourceGet in PowerShell 7+ (pwsh):
powershell_modules:
- AWS.Tools.Common
- Terminal-Icons
# etc.Note: Some modules like
Pesterare pre-installed with Windows PowerShell. If you need to install a newer version, you might need to use-SkipPublisherCheckwhen installing manually.
Legacy modules to install in Windows PowerShell 5.1 (if needed):
windows_powershell_modules:
# - AWS.Tools.Common
# etc.Python tools installed in isolated environments (empty on Windows; uv is available via Chocolatey):
pipx_packages:Python CLI tools installed via uv tool install.
Skipped if uv is not installed:
uv_tools:
- cfn-lint
- poetry
# etc.Node.js packages installed globally:
npm_global_packages:
- aws-cdk
- npmrc
# etc..NET global tools to install (requires .NET SDK):
dotnet_tools:
- Amazon.Lambda.Tools
# etc.Note: .NET global tools are only installed if the .NET SDK is available on the system. The setup script will automatically detect if
dotnetcommand is available and skip this section if not found.
Extensions to install in VS Code:
vscode_extensions:
- ms-vscode.powershell
- github.copilot
# etc.Git user settings:
git_user_email: 'your.email@example.com'
git_user_name: 'Your Name'PowerShell commands to execute after setup:
custom_commands:
- Write-Output "Enabling dark mode..."
- Set-ItemProperty -Path HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize -Name SystemUsesLightTheme -Value 0
# etc.An optional script to run at the end of setup:
custom_script: "./examples/custom_script.ps1"For comprehensive documentation and examples:
- Complete Documentation - Full project documentation
- Design Principles - Understanding the philosophy
- Troubleshooting Guide - Common issues and solutions
- Architecture Overview - How all the pieces fit together
- Package Management Strategy - Our approach to managing packages
.\setup.ps1If you don't want to store your Git user email/name in the vars.yaml file, you can set them via command line arguments:
.\setup.ps1 -e your.email@example.com -n 'Your Name'To add more packages, edit the vars.yaml file and add entries to the appropriate sections.
For more complex customizations, create a script in the examples directory and reference it in the custom_script
section of vars.yaml.
When installing PowerShell modules, you might see a warning like:
WARNING: The installation path for the script does not currently appear in the CurrentUser path environment variable.
To make the script discoverable, add the script installation path, C:\Users\username\Documents\PowerShell\Modules, to
the environment PATH variable.
This warning is informational and doesn't prevent the modules from being used within PowerShell. It only means that executable scripts within the modules won't be directly callable from the command line without specifying their full path. Add the suggested path to your environment variables if you need this functionality.
Some Windows features require a system restart to take effect:
Enable-WindowsOptionalFeature -FeatureName Microsoft-Windows-Subsystem-Linux -Online -NoRestartAfter running the script, consider restarting your system to ensure all changes take effect.