Bazzite answered git's password prompts from KDE Wallet via ksshaskpass, which Ubuntu won't have. Build git's libsecret helper (Ubuntu ships it as source only) and point credential.helper at it, falling back to a week-long credential cache if the build isn't possible. Note in the README that the first Gitea push has to re-enter the password, since keyrings aren't in the backup. 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). This replaces the Bazzite setup, which lives on in this repo's git history.
This is plain Ubuntu with no custom image: apt handles the system and dev tools, Flathub handles the desktop apps, and three scripts do the rest.
| Script | Where it runs | What it does |
|---|---|---|
| scripts/backup.sh | Bazzite, before wiping | Archives your home folder to server-marvin and reads every archive back to check it |
| scripts/setup.sh | Fresh Ubuntu | Adds repos, the NVIDIA driver, Docker, Steam, Flatpaks, dev tools and mounts, all in one pass |
| scripts/restore.sh | Ubuntu, after setup + reboot | Unpacks the backup and leaves out the Fedora/KDE bits that would fight Ubuntu |
All three are safe to re-run.
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.
The move, in order
1. Back up (on Bazzite)
From this repo's folder:
scripts/backup.sh # -> /var/mnt/server-marvin-personal/desktop-backup-<date>/
Close Steam, Firefox, Discord and Claude first. The script refuses to write to the disk that's about to be wiped. It's about 360 GB, so expect around 2 hours on gigabit, including the read-back check.
| Archive | Size | Contents |
|---|---|---|
home.tar.zst |
~120 GB | Everything in ~ except caches, Trash, container images, and the three below. Includes Desktop/Becky_backup (63 GB), all Flatpak app data (~/.var/app), Lutris games in ~/Games |
xlcore.tar.zst |
~124 GB | FFXIV install, because Square's patch servers make a redownload take hours |
comfyui.tar.zst |
~115 GB | ComfyUI minus its venv (mostly models) |
steam-saves.tar.zst |
~5 GB | Steam userdata + Proton compatdata (saves and prefixes). Game files on the home drive (216 GB) redownload |
manifest/ holds reference lists: Flatpaks, VS Code extensions, Steam games, the old fstab and
Flatpak overrides. The archives contain ~/.ssh and ~/.gnupg, so the backup folder is as
sensitive as your home folder.
Not backed up, but not lost: the Data drive (SteamLibrary, emu/) isn't touched by the
install.
2. 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 with your second Steam library, and it's full, so nothing on it is backed up.
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 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 scripts don't care which desktop you run.
3. Set up
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 and for the server-marvin SMB username/password (stored
root-only in /etc/samba/credentials-marvin). Flatpaks take most of the time. Reboot when it
finishes.
What it installs:
- NVIDIA driver: Ubuntu's recommended open-kernel branch (595 today) with the prebuilt, signed modules, so there's no DKMS. The script stops if it ends up with a non-open driver, because Blackwell only runs on the open modules. It also installs 32-bit GL for Steam/Proton.
- Gaming: Steam (
steam-installer+steam-devicesfor controllers), Lutris, GameMode, MangoHud. ProtonUp-Qt (Flatpak) 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. Also Podman. You're added todockerandkvm. - Apps: the 27 Flatpaks in flatpaks.txt, picked from the 42 that were on Bazzite (the rest are listed at the bottom of that file, commented out, if you want one back). Ubuntu's Firefox snap is removed in favor of the Flatpak so your old profile restores untouched. A systemd timer updates Flatpaks daily.
- Dev: VS Code, Claude desktop (Anthropic's apt repo), Claude Code CLI, and
build-essential/cmake, so no dev distrobox needed. No Node or .NET on the host by choice — LudosData and landingPage build in Docker. To add them later:sudo add-apt-repository ppa:jdxcode/mise && sudo apt install mise dotnet-sdk-10.0. - Mounts: the Data drive at
/mnt/dataand server-marvin at/mnt/server-marvin-personal(automounted).
4. Restore
scripts/restore.sh # newest backup on server-marvin
ONLY="home steam-saves" scripts/restore.sh # skip the big ones if you want
First it pulls the Flatpak NVIDIA GL runtime (only possible once the driver is loaded after the reboot). Without it, Flatpak apps render in software.
It deliberately skips a few things:
- Fedora's
.bashrcand.bash_profile ~/.local/bin(old pip--usertools such as rembg)- KDE's GNOME-settings database and generated GTK themes
- Bazzite's autostart items
Everything is still in the archives, e.g.
tar -I zstd -xf home.tar.zst -C ~ ./.config/some-app.
Old configs full of /var/home/ckoch/... paths keep working through a /var/home → /home
symlink. Claude Code's per-project memory and history are renamed to the new paths.
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 /mnt/server-marvin-personal
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.
By hand after restore
- Steam: sign in, then Settings → Storage → Add drive →
/mnt/data/SteamLibrary. Games there come back without downloading. - ComfyUI:
cd ~/ComfyUI && python3 -m venv venv && venv/bin/pip install -r requirements.txt(plus any custom nodes' requirements). - Display: Settings → Displays. The monitor does 5120x1440 @ 240 Hz; Bazzite was running it at 120. Turn on variable refresh rate there too. Ubuntu's built-in window tiling works well 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: your first
git pushasks for your username and password (or token) once — KDE Wallet was answering that for you here, and the GNOME keyring takes over on Ubuntu. Keyrings aren't in the backup, so no other password comes across either.
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 |
/var/home/ckoch |
/home/ckoch (+ compatibility symlink) |
/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, etc.). Turn them back on in Software & Updates → Other Software afterwards.