Files and app logins move across by hand, so archiving and unpacking a home directory isn't this repo's job any more. setup.sh installs the machine and stops there. Two things restore.sh used to cover, kept where they still matter: the post-reboot `sudo flatpak update` that fetches the NVIDIA GL runtime (Flatpak can only match it to a loaded driver, so it can't happen during setup), and the notes on which dotfiles not to copy over from Fedora. The server-marvin mount is now optional — press Enter at the prompt to skip it. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
main-desktop
Ubuntu 26.04 LTS on my desktop (Ryzen 7 9800X3D, RTX 5090, 49" 5120x1440), set up by one script. This replaces the Bazzite/BlueBuild image that used to live here — that version is still in the git history.
scripts/setup.sh turns a fresh Ubuntu install into this machine: NVIDIA driver, Docker with GPU access, Steam, the apps in flatpaks.txt, and the drive mounts. It's safe to re-run. Copying files over and signing in to apps are deliberately not its job — I do those by hand.
Why leave Bazzite
The read-only base made ordinary things into projects. VS Code had to be layered with rpm-ostree,
Node and .NET came from Homebrew, and Claude desktop ran inside an Ubuntu distrobox because it
only ships for Ubuntu/Debian. On Ubuntu, each of those is an apt install.
1. Install Ubuntu 26.04 LTS
⚠ Two identical 1 TB NVMe drives. Install to the Samsung SSD 990 PRO. Never pick the Samsung SSD 970 EVO Plus — that's the "Data" drive holding the second Steam library and the emulator files, and it stays untouched.
nvme0/nvme1can swap between boots, so go by the model name the installer shows.
- "Erase disk and install Ubuntu" on the 990 PRO is fine.
- Make the user
ckoch. The first user gets UID 1000, which matches the file ownership already on the Data drive. - The "third-party drivers" checkbox doesn't matter; setup.sh installs the NVIDIA driver either way.
- Prefer KDE? Install Kubuntu 26.04 instead. The script doesn't care which desktop you run.
2. Run the script
sudo apt install -y git
git clone https://git.lazypugs.com/ckoch/main-desktop.git ~/Documents/git/main-desktop
cd ~/Documents/git/main-desktop && scripts/setup.sh
It asks for your sudo password once, then for the server-marvin SMB credentials — press Enter there to skip that mount. Flatpaks take most of the run. Reboot when it finishes.
What it installs:
- NVIDIA driver: Ubuntu's recommended open-kernel branch (595 today) with the prebuilt, signed modules, so no DKMS. The script stops if it ends up with a non-open driver, since Blackwell only runs on the open modules. Also 32-bit GL for Steam and Proton.
- Gaming: Steam (
steam-installerplussteam-devicesfor controllers), Lutris, GameMode, MangoHud, and ProtonUp-Qt for Proton-GE. The Xbox Bluetooth fix (disable_ertm) carries over from Bazzite. - Containers: Docker CE from Docker's repo (not the snap), with
--gpus allwired up through nvidia-container-toolkit. You're added todockerandkvm. - Apps: the 27 Flatpaks in flatpaks.txt, picked from the 42 that were on Bazzite. The rest sit commented out at the bottom of that file. Ubuntu's Firefox snap is removed in favour of the Flatpak. A systemd timer updates Flatpaks daily.
- Dev: VS Code, Claude desktop (Anthropic's apt repo), Claude Code CLI,
build-essentialand cmake, and git credentials kept in the GNOME keyring. No Node or .NET on the host by choice — LudosData and landingPage build in Docker. To add them:sudo add-apt-repository ppa:jdxcode/mise && sudo apt install mise dotnet-sdk-10.0. - Mounts: the Data drive at
/mnt/data, and server-marvin at/mnt/server-marvin-personalif you gave it credentials.
3. After the reboot
sudo flatpak update # fetches the NVIDIA GL runtime the Flatpak apps need
Flatpak can only match that runtime to the driver once the driver is actually loaded, which is why it waits until after the reboot. Skip it and apps fall back to software rendering until the daily timer catches up about 10 minutes after boot.
Then, by hand:
- Steam: sign in, then Settings → Storage → Add drive →
/mnt/data/SteamLibrary. Those games need no redownload. - Display: Settings → Displays. The monitor does 5120x1440 @ 240 Hz; Bazzite was running it at 120. Turn on variable refresh rate while you're there. Ubuntu's built-in tiling earns its keep at this width.
- PIA VPN: the official Linux app works on Ubuntu (it couldn't on Bazzite's read-only
/usr). Download the installer from PIA and run it. - Gitea: the first
git pushasks for your username and password once, then the GNOME keyring remembers it. KDE Wallet was doing that here.
Moving files across by hand
Worth knowing while you copy things over from the old install:
- Flatpak app data lives in
~/.var/app/<app-id>. Copying one app's folder across brings that app's logins, profile and settings with it — Firefox and Thunderbird profiles included — as long as the app ID matches. - Steam saves are in
~/.local/share/Steam/userdata(and Proton prefixes insteamapps/compatdata). Game files themselves redownload. - FFXIV is
~/.xlcore, ~124 GB. Worth copying rather than re-fetching from Square's patch servers. - ComfyUI: copy the folder but not its
venv— rebuild that withpython3 -m venv venv && venv/bin/pip install -r requirements.txt. - Don't copy Fedora's
.bashrc/.bash_profile,~/.local/bin(pip shims built against Fedora's Python),~/.config/dconf(KDE's settings database, which would overwrite GNOME's), or the KDE-generated~/.config/gtk-3.0andgtk-4.0themes.
Check it worked
nvidia-smi # RTX 5090, driver 595.x
modinfo -F license nvidia # "Dual MIT/GPL" = open modules
docker run --rm --gpus all nvidia/cuda:12.8.0-base-ubuntu24.04 nvidia-smi
flatpak list --app | wc -l # 27
findmnt /mnt/data
claude --version && code --version
Podman's --device nvidia.com/gpu=all needs a CDI spec. The toolkit normally generates one at
boot; if Podman says the device is unknown, run
sudo nvidia-ctk cdi generate --output=/etc/cdi/nvidia.yaml.
Coming from Bazzite: what moved
| Was | Now |
|---|---|
rpm-ostree layering / ujust |
apt |
Homebrew node@24, dotnet |
Nothing on the host — those projects build in Docker |
| Claude desktop in a distrobox | Native claude-desktop package |
| Git password from KDE Wallet | GNOME keyring, via git's libsecret helper |
/var/home/ckoch |
/home/ckoch |
/run/media/ckoch/Data |
/mnt/data |
/var/mnt/server-marvin-personal |
/mnt/server-marvin-personal |
| Image updates + rollback | Software Updater / sudo apt update && sudo apt upgrade; Flatpaks auto-update daily. No rollback by default; sudo apt install timeshift if you miss it |
Maintenance
- Add or remove an app: edit flatpaks.txt and re-run
scripts/setup.sh. Removing a line doesn't uninstall anything;flatpak uninstall <id>once by hand. - Next LTS (28.04): Ubuntu offers the upgrade in Software Updater once 28.04.1 is out. The upgrader disables third-party repos (Docker, NVIDIA toolkit, and so on) — turn them back on in Software & Updates → Other Software afterwards.