My personal machine provisioning scripts. Instead of clicking through the same installs every time I set up a new box, I run one script and it handles everything: system updates, dev tools, browsers, and the apps I use every day.
| Target | What it is | Setup guide |
|---|---|---|
| 🐧 GNOME | Debian/Ubuntu-family desktop, installed with apt | Gnome_Setup/README.md |
| 🎩 Fedora | Fedora GNOME desktop, installed with dnf | Fedora_Setup/README.md |
| 🐉 Kali | Pentest box: recon tools, priv-esc scripts, payloads | Kali_Setup/README.md |
GNOME and Fedora install the same set of apps through their own package manager, so it doesn't matter which one you started on, the muscle memory carries over.
- One script per machine. No clicking through app stores or copy-pasting install commands from memory.
- Safe to re-run. Every step checks whether it's already done before doing anything, so running the script again just catches you up instead of reinstalling everything from scratch.
- Self-locating. Clone this repo anywhere you want, the scripts figure out their own path at runtime.
- Native installs where they exist. Real apt/dnf repos for Brave, VS Code, Slack, ProtonVPN, and friends. Flatpak steps in for the handful of apps that don't publish a package for your distro. Ghostty needs one step further than that on every target, since it doesn't have a real Flatpak option either, a Fedora COPR on
Fedora_Setup(dnf still beats Snap in priority, even a lower-trust community repo), Snap onGnome_Setup/Kali_Setup(no COPR-equivalent trust tier available there). - The daily-driver app set. Discord, Slack, Zoom, VS Code, ProtonVPN, Spotify, Brave, Signal, and Claude Code, on both desktop targets.
- Key apps pinned to the GNOME dash. Brave, Ghostty, Discord, Slack, Spotify, ProtonVPN, Signal, and VS Code, merged into whatever's already pinned rather than replacing the list.
Gnome_SetupandFedora_Setuponly,Kali_Setupdoesn't install most of these apps or default to GNOME. - A
~/Devfolder on every target. A personal workspace for your own projects, kept separate from/opt, where every script clones its own tool installs. Kali also keeps its existing~/HACKINGfolder for engagement work, unrelated to~/Dev.
lib/common.sh
(shared helpers, idempotency, sudo lecture)
|
+------------------+------------------+
| | |
Gnome_Setup.sh Fedora_Setup.sh Kali_Setup.sh
| | |
apt, daily apps dnf, daily apps apt, pentest tools
All three scripts are built on the same helpers in lib/common.sh: idempotent installs, git clone-or-pull, the sudo lecture setup. What each one actually installs is completely different, but the underlying behavior is consistent across all three. See lib/README.md for what's actually in there.
git clone https://github.com/cameronww7/Linux-System-Setup.git
cd Linux-System-Setup/<Gnome_Setup|Fedora_Setup|Kali_Setup>/
chmod +x <Gnome_Setup|Fedora_Setup|Kali_Setup>.sh
./<Gnome_Setup|Fedora_Setup|Kali_Setup>.sh # don't run this with sudo, it calls sudo itself when it needs toWarning These scripts were rewritten and reviewed carefully, but haven't been run against a live install yet. Try the first run on a disposable VM before trusting it on a machine you care about.
There's no separate update script to remember. Just run the same setup script again whenever you want to catch up on new packages or config changes. It'll skip anything that's already in place and only do the work that's actually new.
Shell setup (prompt, plugins, .zshrc) isn't part of this repo. It lives in a separate project I maintain, Terminal-Customization. Each script here clones that repo to /opt/Terminal-Customization so it's available, but doesn't configure or run anything from it. That's entirely up to Terminal-Customization to handle.
This repo used to be two scripts that had drifted pretty far apart: a generic Linux_Setup and a Kali_Setup that had absorbed a separate old repo along the way. Both had picked up dead installs (Atom, a hardcoded old Go version), deprecated apt-key usage, and a handful of genuinely broken paths and commands. The 2026 rewrite fixed all of that, added the Fedora target, made every script idempotent, and split shell customization out into its own repo.
MIT. Do whatever you want with it.