This is how I set up a fresh Zorin OS install for development. It automates the packages, tools, desktop apps, and GNOME/Zorin tweaks I want on a new machine.
You're welcome to fork this repo, copy parts of it, or use it however you like — no permission needed.
- Zorin OS or another Ubuntu-based distro
- A normal user account with
sudoaccess - Internet connection
Run as your normal user — not with sudo ./install.sh:
git clone https://github.com/josephcorbett/linux-bootstrap.git
cd linux-bootstrap
./install.shinstall.sh prints the detected distro, warns on non-Ubuntu/Zorin systems, then runs each script in order. After it finishes, log out or reboot so Docker group membership takes effect.
| Category | Details |
|---|---|
| Base tools | Git, build tools, curl, jq, ripgrep, fd, htop, btop, shellcheck, GNOME tweak tools |
| .NET | SDK 8, 9, and 10 (APT first; install-script fallback for SDK 10 if needed) |
| Node.js | Node 22 via nvm v0.40.3 |
| Docker | Official Docker Engine packages from Docker's APT repository |
| Database | PostgreSQL (APT) and Beekeeper Studio (official APT repository) |
| Desktop apps | Opera, Discord, Slack (snap); LibreOffice, GitHub CLI, and Cursor (APT) |
| Desktop settings | Zorin taskbar layout and behavior via gsettings |
install.sh # preflight checks, then orchestrates everything
├── scripts/base.sh
├── scripts/dotnet.sh
├── scripts/node.sh
├── scripts/docker.sh
├── scripts/postgres.sh
├── scripts/apps.sh
└── scripts/desktop.sh
Each script is plain Bash, uses set -euo pipefail, and is safe to re-run on its own:
./scripts/docker.shShared helpers live in scripts/common.sh: package/snap install checks, APT source detection, signing-key setup, and idempotent shell-config line appends.
Docker — Installs the official docker-ce packages. Removes conflicting distro packages (docker.io, podman-docker, etc.) before setup. Does not delete existing images, containers, or /var/lib/docker.
Beekeeper Studio — Uses Beekeeper's official Debian repository so apt upgrade can update it normally.
Opera — Snap only, by design. The .deb build has had media codec issues on Zorin, and the Flatpak build caused NordPass browser-extension autofill problems. Conflicting apt/flatpak installs are removed first.
Cursor — Resolves the current Linux .deb URL from Cursor's official download API, installs it with apt, and cleans up the temporary file. If the API is unavailable, the script prints a manual fallback link.
.NET — SDK 8, 9, and 10 are installed through APT when available. SDK 10 falls back to dotnet-install.sh into the system dotnet directory so all versions appear in one dotnet --list-sdks listing. DOTNET_ROOT is not modified.
Zorin taskbar — desktop.sh sets portable taskbar behavior and a global panel size. Per-monitor panel settings are intentionally omitted so the bootstrap works on both laptops and multi-monitor desktops. On systems without the Zorin taskbar schema, those steps are skipped.
- Add or remove packages in
scripts/base.sh - Add desktop apps in
scripts/apps.sh - Adjust taskbar settings in
scripts/desktop.sh - Comment out steps in
install.shto skip them
GitHub Actions runs ShellCheck on install.sh and every script under scripts/ on push and pull request.
- Docker — Log out and back in (or reboot) before running Docker without
sudo. - Non-Zorin distros — The bootstrap warns and continues; some steps may not apply.