Why Customization Matters
1. Add or Remove Packages
2. Add Your Own Scripts
3. Include Dotfiles or Shell Config
4. Handle Secrets and Git Identity
5. WSL-Specific Optimizations
Fork It, Extend It, Own It
Final Recap TL;DR
In this final post, I’ll show you how to take my Ubuntu WSL bootstrap and make it your own. Whether you want to add dotfiles, set up Git identity, or install completely different tools, this structure makes it easy to fork, extend, and personalize. This project works for me, but you should own your environment. My goal from the beginning was to make this: This isn’t a framework, it’s a blueprint. You can edit packages.conf to: These arrays are passed into helper functions from utils.sh, which handle install logic cleanly. To add new tooling (like Go, Deno, or Rust), follow this pattern: Want to bootstrap your .bashrc, .tmux.conf, or .gitconfig? This is also a good place to add default Git config, like: Avoid committing private tokens or configs. Instead: Some tweaks worth adding if you run WSL full time: You can even add a WSL check to run.sh: Over the last 5 posts, you’ve seen how I: Automate the boring stuff, personalize the rest, and keep improving it. Templates let you quickly answer FAQs or store snippets for re-use. Hide child comments as well For further actions, you may consider blocking this person and/or reporting abuse
SYSTEM_UTILS_APT=( wget curl jq htop
) DEV_TOOLS_SNAP=( nvim
)
SYSTEM_UTILS_APT=( wget curl jq htop
) DEV_TOOLS_SNAP=( nvim
)
SYSTEM_UTILS_APT=( wget curl jq htop
) DEV_TOOLS_SNAP=( nvim
)
readonly SCRIPTS=( ... "go-setup.sh"
)
readonly SCRIPTS=( ... "go-setup.sh"
)
readonly SCRIPTS=( ... "go-setup.sh"
)
git config --global user.name "Your Name"
git config --global user.email "[email protected]"
git config --global user.name "Your Name"
git config --global user.email "[email protected]"
git config --global user.name "Your Name"
git config --global user.email "[email protected]"
if [ -f "$HOME/.local-setup.sh" ]; then echo "Running local custom setup..." bash "$HOME/.local-setup.sh"
fi
if [ -f "$HOME/.local-setup.sh" ]; then echo "Running local custom setup..." bash "$HOME/.local-setup.sh"
fi
if [ -f "$HOME/.local-setup.sh" ]; then echo "Running local custom setup..." bash "$HOME/.local-setup.sh"
fi
grep -qi microsoft /proc/version && echo "Running under WSL"
grep -qi microsoft /proc/version && echo "Running under WSL"
grep -qi microsoft /proc/version && echo "Running under WSL" - Modular (each tool gets its own script)
- Transparent (readable Bash, no black-box logic)
- Easy to tweak (just edit configs or scripts) - Add tools you always install (e.g. jq, htop, gh)
- Remove things you don’t use (e.g. yazi, btop) - Create a new file like go-setup.sh
- Add install logic using apt, Snap, curl, or custom methods
- Append it to the SCRIPTS=(...) array in run.sh - Clone your dotfiles repo in a new dotfiles-setup.sh
- Symlink them or append to existing configs
- Set aliases, functions, or themes - Keep a local ~/.local-setup.sh script with personal logic
- Add .local-setup.sh to your .gitignore
- Source it at the end of run.sh (if it exists) - Create a .wslconfig on Windows for better resource limits
- Add mounts or performance tweaks in /etc/wsl.conf
- Disable unnecessary services that don’t apply in WSL - This whole project is meant to be cloned, forked, and hacked.
- Start with mine, and make it match your exact stack and preferences.
- If you build something cool from this, I’d love to see it. - Automated my WSL Ubuntu setup from scratch
- Wrote modular Bash scripts with smart defaults
- Bootstrapped a full terminal dev stack
- Installed Node, Python, and Docker with zero hassle
- Built a foundation that anyone can extend