# 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](scripts/setup.sh) turns a fresh Ubuntu install into this machine: NVIDIA driver, Docker with GPU access, Steam, the apps in [flatpaks.txt](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`/`nvme1` can 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 ```bash 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-installer` plus `steam-devices` for 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 all` wired up through nvidia-container-toolkit. You're added to `docker` and `kvm`. - **Apps:** the 27 Flatpaks in [flatpaks.txt](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-essential` and 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-personal`** if you gave it credentials. ## 3. After the reboot ```bash 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 push` asks 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/`. 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 in `steamapps/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 with `python3 -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.0` and `gtk-4.0` themes. ## Check it worked ```bash 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](flatpaks.txt) and re-run `scripts/setup.sh`. Removing a line doesn't uninstall anything; `flatpak uninstall ` 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.