My Fedora Workstation Setup
An opinionated Fedora GNOME setup focused on NVIDIA drivers, Docker, Zen Browser, Ghostty, OpenCode, creative apps, and a low-friction Linux desktop.
Fedora Workstation is the Linux desktop that feels the most complete to me.
That is not because it is the most configurable distribution. It is not. Arch gives you more control. NixOS gives you more reproducibility. Debian gives you more conservatism. Fedora sits in the middle: current enough to run modern hardware well, stable enough to trust, and polished enough that the desktop does not feel like a hobby project.
I use Fedora Workstation with GNOME because I like GNOME’s way of doing things. The workflow is opinionated, but coherent. The overview, workspaces, keyboard-driven navigation, and extension ecosystem make sense to me. Once the NVIDIA driver is installed and the basics are in place, Fedora mostly disappears into the background.
That is what I want from a workstation.
The principle#
A workstation should reduce friction.
It should boot reliably, drive the display correctly, run containers, launch the browser, open the terminal, edit code, handle creative work, and not require constant maintenance. The goal is not to turn the desktop into an art project. The goal is to make a machine that can be trusted.
My setup has five priorities:
- Get NVIDIA working before anything else.
- Enable the repositories Fedora does not ship by default.
- Install the tools I actually use.
- Keep GNOME polished, not over-customized.
- Document the setup so a reinstall is not a memory test.
Before anything else: NVIDIA#
If the machine has an NVIDIA GPU, I deal with the driver first.
This is not the most exciting step, but it is the most load-bearing one. If display acceleration, CUDA support, or video workloads are broken, the rest of the setup does not matter. Browser polish and terminal themes can wait.
I normally start with a full update:
sudo dnf upgrade --refresh -yThen I enable Fedora’s third-party repositories from GNOME Software if the prompt appears. After that, I add RPM Fusion, because Fedora’s default repositories intentionally do not include everything most desktop users need.
sudo dnf install -y \ https://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm \ https://download1.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm
sudo dnf upgrade --refresh -yThen the NVIDIA driver:
sudo dnf install -y akmod-nvidia xorg-x11-drv-nvidia-cudaAfter this, I reboot and wait. The first boot can take longer because the kernel module has to build. I do not judge the setup until the reboot is done and the driver is actually loaded.
To check:
nvidia-smiIf nvidia-smi works, the machine is ready for the rest of the setup.
Why GNOME#
I like GNOME because it is polished and opinionated.
Linux desktops often confuse configurability with quality. GNOME does not try to expose every setting. It gives you a workflow: activities overview, dynamic workspaces, clean defaults, and a strong keyboard-first rhythm.
Extensions are what make it personal. I do not want a desktop that needs twenty tweaks before it becomes usable, but I do like being able to add the few behaviours I miss.
The rule is simple: use extensions to remove friction, not to fight the desktop.
The extensions I usually care about are in this category:
- App indicators or tray support
- Clipboard history
- Tiling assistance
- Blur or cosmetic polish if it does not hurt performance
- Dash or dock behaviour, depending on the machine
GNOME works best when you respect the model and adjust the edges.
Browser: Zen#
Zen Browser is currently my preferred browser on Fedora.
The browser is the centre of a modern workstation, so it matters more than people admit. It has to feel fast, manage tabs well, and not fight the desktop. Zen fits my current workflow better than the usual defaults.
Because browser packaging can change, I do not treat the install command as the important part. The important part is that the browser is one of the first things I set up, because it becomes the gateway to documentation, accounts, downloads, and everything else.
If the official Flatpak is available, I prefer that route:
flatpak install -y flathub app.zen_browser.zenIf packaging changes, I use the current official install path instead of forcing an old command to stay true.
Terminal: Ghostty#
Ghostty is my terminal choice right now.
The terminal is infrastructure. It does not need to be flashy, but it does need to be fast, readable, and predictable. Ghostty gets the basics right: performance, font rendering, keyboard behaviour, and a clean configuration model.
I install it early because almost every other setup step flows through the terminal.
If it is available through the package route I am using on that Fedora version, I install it there. Otherwise I follow the official Ghostty instructions. I do not like turning terminal installation into a fragile script because packaging is still moving.
The configuration is minimal: font, theme, window behaviour, and keybindings. Anything more than that is usually procrastination disguised as setup.
Core developer tools#
The basic toolchain is not exotic.
sudo dnf install -y \ git git-lfs \ gcc gcc-c++ make cmake \ python3 python3-pip python3-virtualenv \ nodejs npm \ fzf ripgrep fd-find bat \ fastfetch btop htop \ curl wget unzip p7zip p7zip-pluginsThen Git gets configured:
git config --global init.defaultBranch maingit config --global pull.rebase truegit config --global push.autoSetupRemote trueI do not overthink this part. Git, compilers, Node, Python, search tools, archive tools, and a system monitor are the baseline. Everything else gets installed when a real project asks for it.
Docker#
Fedora ships Podman, and Podman is good. I still use Docker because my self-hosting and development workflows are Docker-first.
That is not an ideological position. It is a compatibility position. Most compose files, examples, dev containers, and homelab services assume Docker. I want fewer translation layers, not more.
Docker’s official Fedora instructions are the safest reference, but the shape is usually:
sudo dnf install -y dnf-plugins-core
sudo dnf config-manager addrepo \ --from-repofile=https://download.docker.com/linux/fedora/docker-ce.repo
sudo dnf install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo systemctl enable --now dockersudo usermod -aG docker $USERThen log out and back in so the group change applies.
Check it:
docker run hello-worlddocker compose versionDocker is one of the first things I install because it turns the workstation into a development and testing machine immediately.
Code and OpenCode#
For editing, I want a code editor that is fast enough for daily work and flexible enough for projects. I keep the editor setup practical: syntax support, Git integration, terminal integration, and enough extensions to work without turning the editor into its own operating system.
OpenCode is part of my current workflow for agentic coding and testing. I treat it like a serious tool, not a toy. It is useful when it has the right context and when the repo has enough structure for it to operate safely.
The important rule is that AI tools should sit inside the workflow, not replace the workflow. Git still matters. Diffs still matter. Tests still matter. Reading the code still matters.
Creative tools: GIMP and DaVinci Resolve#
I install GIMP because it is the practical default for image work on Linux.
sudo dnf install -y gimpFor video work, I use DaVinci Resolve Studio, the paid version. The free version exists and is enough for many people, but Studio is what I use.
Resolve on Linux is powerful, but it is not as frictionless as installing a normal desktop app. GPU drivers, codecs, and packaging matter. This is another reason NVIDIA gets handled first. Creative tools are downstream of the driver stack.
My recommendation is simple: if Resolve matters to your workflow, test it early after the driver setup. Do not spend three hours perfecting the desktop and then discover that your editor does not launch.
Multimedia and third-party repositories#
Fedora’s default position on codecs is understandable, but a real workstation needs media support.
After RPM Fusion is enabled, I install the common multimedia pieces:
sudo dnf group upgrade -y multimedia --setop="install_weak_deps=False" --exclude=PackageKit-gstreamer-pluginsudo dnf group install -y sound-and-videosudo dnf install -y ffmpeg vlcI also keep Flatpak enabled because it is useful for desktop applications. Fedora handles Flatpak well, and Flathub fills gaps that the RPM repositories should not always be expected to fill.
flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepoGNOME polish#
After the functional pieces are installed, I adjust GNOME.
This is the order I prefer because it prevents aesthetic setup from hiding real problems. First drivers. Then repositories. Then Docker and core apps. Then polish.
I usually configure:
- Dark mode
- Fractional scaling if the display needs it
- Keyboard shortcuts
- Workspace behaviour
- Night Light
- Extensions
- Fonts
- Default apps
I try not to over-customize. A desktop should be pleasant, but every customization becomes something to remember during a reinstall. If a tweak does not make the machine easier to use, I skip it.
What can go wrong#
Fedora is polished, but Linux is still Linux.
The common problems are predictable.
- NVIDIA module not built yet: wait after reboot, then check
nvidia-smi. - Secure Boot blocks the driver: either enroll the module properly or disable Secure Boot if that fits your risk model.
- Missing codecs: RPM Fusion and multimedia groups usually fix this.
- Docker group not applied: log out and back in.
- Flatpak app permissions: use Flatseal if an app cannot see a folder it needs.
- Resolve does not launch: check GPU driver, library dependencies, and codec assumptions.
The important thing is not to panic and reinstall immediately. Diagnose the layer. Driver, repository, package, permission, or app.
The setup order I recommend#
If I were setting up a fresh Fedora workstation today, this is the order:
- Install Fedora Workstation GNOME.
- Update the system.
- Enable Fedora third-party repositories and RPM Fusion.
- Install NVIDIA drivers if the machine needs them.
- Reboot and verify
nvidia-smi. - Install Zen Browser.
- Install Ghostty.
- Install Git and core developer tools.
- Install Docker and Docker Compose.
- Install the code editor and OpenCode.
- Install GIMP and DaVinci Resolve.
- Install codecs and media tooling.
- Configure GNOME extensions and polish.
- Write down what changed.
That last step matters. A workstation is infrastructure. If the setup cannot be repeated, it is not really understood.
The conclusion#
Fedora Workstation works for me because it gives me a polished GNOME desktop without trapping me in an outdated stack.
It is current, practical, and boring in the right places. NVIDIA needs attention first. Docker makes the machine useful for real work. Zen, Ghostty, Git, OpenCode, GIMP, and Resolve fill out the daily workflow. GNOME provides the desktop rhythm, and extensions let me adjust the edges without fighting the system.
That is the point of a good Linux workstation. Not endless tweaking. Capability, control, and a machine that gets out of the way.