TL;DR
This post covers how my WSL bootstrap sets up Node.js, Python, and Docker and the core tools I use for frontend, backend, scripting, and container work.
Each tool has its own setup script, designed to be modular, idempotent, and fast.
Why These Tools?
My day-to-day work (and open source projects) span across:
- Frontend apps (Vue, Nuxt, TypeScript)
- Scripts, automation, CLI tools (Python)
- Testing infrastructure, running services, and debugging (Docker)
So my bootstrap includes all of them by default and no more grabbing install commands from old gists or StackOverflow every time I set up WSL.
Node.js Setup – node-setup.sh
I install Node.js LTS (v22) using nvm because it's the most flexible method for switching versions.
What the script does:
- Installs or updates NVM
- Loads it into the shell
- Installs Node.js v22 and sets it as default
- Installs global tools:
pnpmandyarn - Disables Yarn telemetry
Why this approach?
- Versioning via NVM makes switching Node versions trivial
- I use
pnpmfor speed and monorepos, andyarnwhere needed
nvm install 22
npm install -g pnpm yarn
Output is printed to verify versions and check everything succeeded.
Python Setup – python-setup.sh
Python is everywhere and whether I’m scripting quick tools, using CLI apps, or running data scripts.
What this setup covers:
- Installs Python via APT
- Installs
pip,venv, and upgradessetuptools,wheel, etc. - Prepares the environment for creating isolated Python workspaces
This setup is intentionally minimal and just enough to bootstrap Python for development, automation, and further customization.
Docker Setup – docker-setup.sh
I use Docker for containers when testing services or building isolated environments.
What the script does:
- Installs Docker via APT (using official repo)
- Adds the current user to the
dockergroup (so no need forsudo) - Enables the Docker service
Why this matters:
- WSL2 supports Docker with great performance
- You shouldn’t have to use
sudoto rundockerin dev environments
Docker is optional, but including it makes the bootstrap future-proof if I need containers down the line.
One Bootstrap to Install Them All
All of these are automatically set up when I run:
./run.sh
I don’t have to worry about:
- Which method to use (
nvm, APT, Snap, curl?) - Forgetting steps like adding users to Docker groups
- Repeating things across different machines
Future Improvements
Things I might add later:
- Version pinning via
.nvmrcor.tool-versions - Python virtualenv examples (or Poetry setup)
- Docker Compose install
Next: Make It Yours
In run.sh Diaries #5, I’ll show you how to:
- Add your own scripts
- Customize package lists
- Include dotfiles or Git config
- Extend the bootstrap for your own stack
Top comments (0)