Easily bootstrap your Ubuntu environment with a beautiful interactive menu and script automation. Install your favorite tools, set global aliases, and even uninstall them later — all with a single command.
- ✅ Install apps with an interactive checklist menu
- 🌍 Option to make the setup globally accessible via the
setupcommand - 🧼 Uninstall any installed app from a similar interactive menu
- 🛠️ Scripts are modular and easy to extend (
apps/folder) - 🧙♂️ Custom aliases are linked automatically when using ZSH
- 🧾 All actions are logged in
install.log
If you want to start with a minimal setup, run:
curl -fsSL https://raw.githubusercontent.com/michelpl/linux-dev-setup/main/script.sh | bashThis script (script.sh) is compatible with Ubuntu, installs git and the GitHub CLI (gh), waits for GitHub login, creates ~/projects, and clones michelpl/linux-dev-setup into ~/projects/linux-dev-setup.
Prepare an Ubuntu machine (post-install) to run the homeserver Docker stacks: Docker Engine, Tailscale package, SSH hardening, UFW, fail2ban, unattended security upgrades, and always-on power settings. Tailscale auth (tailscale up) and application stacks live in the homeserver repo.
curl -fsSL https://raw.githubusercontent.com/michelpl/linux-dev-setup/main/script.sh | bash
cd ~/projects/linux-dev-setup/Ubuntu
./setup.sh i homeserver-host
# Log out and back in if you were added to the docker group| App | Purpose |
|---|---|
docker |
Docker Engine + Compose v2, enabled on boot |
tailscale |
Tailscale package + tailscaled (no auth) |
openssh-hardening |
SSH key-only auth, drop-in 99-homeserver.conf |
ufw |
Firewall: deny incoming except SSH |
fail2ban |
sshd jail |
unattended-upgrades |
Automatic security updates |
homeserver-power |
Always-on: mask suspend/hibernate + logind/GNOME policy |
Before hardening SSH on a remote machine: ensure your public key is in ~/.ssh/authorized_keys.
See docs/homeserver-host.md for the full flow into the homeserver repository.
git clone https://github.com/michelpl/linux-dev-setup.git
cd linux-dev-setup/Ubuntu
chmod +x setup.sh./setup.shYou'll see a terminal menu where you can:
- Select which apps to install (e.g., Chrome, VSCode, Postman, etc.)
- Enable the Global option to run this script from anywhere as
setup - Choose to enter the Uninstall menu
If you selected the Global option, you can now use:
setup # opens the install menu
setup uninstall # opens the uninstall menuYou can uninstall apps at any time:
setup uninstallYou’ll be presented with a checklist of all installed apps (with uninstall scripts) and the option to remove the global setup command.
linux-dev-setup/Ubuntu
├── setup.sh # Main entry point
├── apps/
│ ├── chrome.sh # App install scripts
│ ├── vscode.sh
│ └── uninstall/
│ ├── chrome-uninstall.sh
│ └── vscode-uninstall.sh
├── configs/
│ └── aliases.zsh # Custom aliases
└── install.log # Logs of all actions
Re-running Ubuntu/apps/zsh.sh upgrades the zsh package and Oh My Zsh (when possible) and refreshes the ~/.aliases.zsh symlink to configs/aliases.zsh, so alias changes in the repo apply on the next shell reload (refresh-zsh or a new terminal).
Want to add a new app or improve the setup? Contributions are welcome!
- Create an install script inside
Ubuntu/apps/:Ubuntu/apps/mytool.sh
- (Optional) Create a matching uninstall script:
Ubuntu/apps/uninstall/mytool-uninstall.sh
- Your app will automatically appear in the setup and uninstall menus.
- Open a Pull Request with your changes!
See CONTRIBUTING.md for more details.
- To install an app:
./setup.sh i <appname> # or, if globally installed: setup i <appname>
- To uninstall an app:
./setup.sh u <appname> # or, if globally installed: setup u <appname>
- To use the interactive menu:
./setup.sh # or setup
- Ubuntu (tested on 24.04+)
whiptail(sudo apt install whiptail)- Internet connection
- Permissions to install packages (
sudo)
Made for devs who hate setting things up manually.

