Skip to content

Instantly share code, notes, and snippets.

@planetis-m
Last active January 29, 2026 18:55
Show Gist options
  • Select an option

  • Save planetis-m/10e8214975be7f3be6a67ca45ac7346d to your computer and use it in GitHub Desktop.

Select an option

Save planetis-m/10e8214975be7f3be6a67ca45ac7346d to your computer and use it in GitHub Desktop.
New Fedora Workspace Installation Guide

New Fedora Workstation Installation Guide

Author: planetis-m

Download and Boot Fedora ISO

  1. Download the latest Fedora Workstation ISO from Fedora Downloads.
  2. Burn the ISO to a USB drive using Fedora Media Writer or Rufus.
  3. Boot from the USB drive and start the live installation.

Installation (Manual Partitioning)

Reference: Fedora 42 Manual Partition Guide

Partition scheme (GPT):

  • /boot/efi – 512M (EFI System Partition)
  • /boot – 1G (EXT4)
  • /var – 10G (XFS)
  • / (root) – 15G (XFS)
  • /home – Remaining space (XFS)

Install Chromium

sudo dnf update --refresh
sudo dnf install chromium

cp /usr/share/applications/chromium-browser.desktop ~/.local/share/applications/
nano ~/.local/share/applications/chromium-browser.desktop

In the opened file, find each Exec= line and append the following flags:

--password-store=gnome-libsecret --disable-pinch

Extensions:

Troubleshoot: Didn't shut down correctly

The profile appears to be in use by another Chromium process on another computer.

rm -rf ~/.config/chromium/Singleton*

Install GNOME Extensions

sudo dnf install gnome-extensions-app

Remove Unneeded Packages

Remove LibreOffice and other preinstalled apps you don’t use:

sudo dnf remove \
  libreoffice* \
  gnome-boxes \
  evince \
  evince-libs \
  btrfs-progs \
  hplip \
  hplip-common \
  ibus \
  mediawriter \
  qt5-qtbase \
  anaconda \
  anaconda-live \
  anaconda-install-env-deps \
  sos \
  virtualbox-guest-additions \
  gnome-tour \
  gnome-initial-setup \
  dracut-live \
  simple-scan \
  sane-backends \
  qemu-guest-agent \
  cups-client \
  gnome-disk-utility \
  gnome-abrt

Optional: Qt6 Look & Feel

Reference: Arch Wiki

sudo dnf install kvantum
kvantummanager

Select theme → KvLibadwaita

Install Utilities

# PDF and torrent clients
sudo dnf install papers fragments showtime --setopt=install_weak_deps=False

# Gaming support
sudo dnf copr enable jc141/DwarFS
sudo dnf install dwarfs

Ad Blocking (hosts file)

wget https://raw.githubusercontent.com/StevenBlack/hosts/master/alternates/fakenews-gambling/hosts -O hosts.txt
sudo mv -Z hosts.txt /etc/hosts

Development Setup

Toolbox and Container

Docs: containertoolbx.org

Containerfile:

FROM registry.fedoraproject.org/fedora-toolbox:43

# Base tools and compilers
RUN dnf -y upgrade --refresh && \
    dnf -y --setopt=install_weak_deps=False install \
      git-credential-libsecret nano gdb gcc git curl wget ca-certificates \
      gcc-c++ cmake uv python3-pip \
      alsa-lib-devel mesa-libGL-devel libxkbcommon-devel wayland-devel libatomic \
      nodejs nodejs-full-i18n npm tesseract tesseract-langpack-eng \
      unzip xz tar libasan libubsan libtsan valgrind valgrind-devel unifdef && \
    dnf -y copr enable planetis/nim && \
    dnf -y install nim-devel nimony-devel && \
    dnf clean all

Build and create the toolbox:

podman system prune -a --force
podman build --pull --squash -t localhost/toolbox-dev:v1.0 .
toolbox create -c devcontainer -i localhost/toolbox-dev:v1.0
toolbox enter devcontainer

Nim Development Environment

Nim Syntax Highlighting

# Native GNOME Builder
mkdir -p ~/.local/share/gtksourceview-5/language-specs/
wget https://github.com/dom96/Aporia/raw/refs/heads/master/share/gtksourceview-2.0/language-specs/nim.lang -O nim.lang
mv nim.lang ~/.local/share/gtksourceview-5/language-specs/

# Flatpak GNOME Builder
mkdir -p ~/.var/app/org.gnome.Builder/data/gtksourceview-5/language-specs/
ln -s ~/.local/share/gtksourceview-5/language-specs/nim.lang \
      ~/.var/app/org.gnome.Builder/data/gtksourceview-5/language-specs/nim.lang

Add Nimble to PATH

echo 'export PATH=~/.nimble/bin:$PATH' >> ~/.bashrc

Install ntagger

nimble install --useSystemNim https://github.com/elcritch/ntagger

Enable ntagger integration in GNOME Builder:

sudo dnf copr enable planetis/gnome-builder-nim
sudo dnf install gnome-builder-nim

In GNOME Builder: Preferences → Editor → Code Completions → Ctags path:

~/.nimble/bin/ntagger --private

Git Setup

git config --global user.name "Antonis Geralis"
git config --global user.email [email protected]
git config --global init.defaultBranch master

sudo dnf install git-credential-libsecret
git config --global credential.helper libsecret

Generate token:

  • GitHub → Settings → Developer Settings → Fine-grained tokens
  • Repo access: All → Permissions: Contents (Read/Write), Workflows

Setup Coding Assistant (Qwen)

Config Files

~/.qwen/settings.json

{
  "selectedAuthType": "openai",
  "preferredEditor": "nano",
  "contextFileName": "AGENTS.md",
  "disableUpdateNag": true,
  "mcpServers": {
    "excel": { "command": "uvx", "args": ["excel-mcp-server", "stdio"] },
    "pdf-reader": { "command": "uvx", "args": ["mcp-pdf-reader", "stdio"] }
  }
}

~/.qwen/.env

OPENAI_API_KEY=<api_key>
OPENAI_BASE_URL=https://api.groq.com/openai/v1
OPENAI_MODEL=openai/gpt-oss-120b

Install Qwen Globally

mkdir ~/.npm-global
npm config set prefix '~/.npm-global'
echo 'export PATH=~/.npm-global/bin:$PATH' >> ~/.bashrc
source ~/.bashrc

npm install -g @qwen-code/qwen-code
qwen --version

Tutorials:

Projects and Dev Tools

cd ~/Projects

# c2nim
git clone --depth 1 https://github.com/nim-lang/c2nim
cd c2nim
nim c c2nim.nim
cp c2nim ~/.local/bin/

# atlas
git clone --depth 1 https://github.com/nim-lang/atlas
cd atlas
atlas init
atlas use sat
nim c atlas
cp atlas ~/.local/bin/

ESP-IDF SDK

mkdir -p ~/Projects/esp && cd ~/Projects/esp
wget https://github.com/espressif/esp-idf/releases/download/v5.5.1/esp-idf-v5.5.1.zip
unzip esp-idf-v5.5.1.zip
cd esp-idf-v5.5.1
export IDF_GITHUB_ASSETS="dl.espressif.com/github_assets"
./install.sh esp32s3

Update ~/.bashrc:

alias get_idf='. $HOME/Projects/esp/esp-idf-v1.0/export.sh'

Reload:

source ~/.bashrc

Access ESP32 inside container

Run toolbox create --verbose, extract the podman create command, and add --group-add keep-groups to preserve dialout group access for ESP32 serial devices.

podman build --pull --squash -t localhost/toolbox-esp:v1.0 .
podman --log-level error create \
  --cgroupns host \
  --dns none \
  --env TOOLBOX_PATH=/usr/bin/toolbox \
  --env XDG_RUNTIME_DIR=/run/user/1000 \
  --hostname toolbx \
  --ipc host \
  --label com.github.containers.toolbox=true \
  --mount type=devpts,destination=/dev/pts \
  --name esp-dev \
  --network host \
  --no-hosts \
  --pid host \
  --privileged \
  --security-opt label=disable \
  --ulimit host \
  --userns keep-id \
  --group-add keep-groups \
  --user root:root \
  --volume /:/run/host:rslave \
  --volume /dev:/dev:rslave \
  --volume /run/dbus/system_bus_socket:/run/dbus/system_bus_socket \
  --volume /home/${USER}:/home/${USER}:rslave \
  --volume /usr/bin/toolbox:/usr/bin/toolbox:ro \
  --volume /run/user/1000:/run/user/1000 \
  --volume /run/avahi-daemon/socket:/run/avahi-daemon/socket \
  --volume /run/.heim_org.h5l.kcm-socket:/run/.heim_org.h5l.kcm-socket \
  --volume /media:/media:rslave \
  --volume /mnt:/mnt:rslave \
  --volume /run/pcscd/pcscd.comm:/run/pcscd/pcscd.comm \
  --volume /run/media:/run/media:rslave \
  --volume /etc/profile.d/toolbox.sh:/etc/profile.d/toolbox.sh:ro \
  localhost/toolbox-esp:v1.0 \
  toolbox --log-level debug init-container \
  --gid 1000 \
  --home /home/${USER} \
  --shell /bin/bash \
  --uid 1000 \
  --user ${USER}

Basic Container Management

podman inspect --latest   # Inspect last used container
toolbox list              # List toolbox containers/images
podman stop <name>        # Stop a running container
toolbox rm <name>         # Remove a toolbox container

Identify the Problem Image

When toolbox list shows:

IMAGE ID      IMAGE NAME
f0dfc31ec879  <none>

…and removal fails with:

Error: image <ID> has dependent children

…it usually means an external buildah container is still referencing it. — list them with:

podman ps --all --external

Remove the storage containers podman rm <ID>, then remove the image podman rmi <ID>.

VSCode

Warning: Installing VS Code will override your Git credential helper configuration.

Reference: VS Code Linux Setup Guide

systemctl --user enable --now podman.socket

After installation, open VS Code and install the Dev Containers extension.

Settings

Make sure the following are configured:

  • podman-compose
  • podman
  • /var/run/podman/podman.sock

To attach to a running container:

Ctrl + Shift + P → Dev Containers: Attach to Running Container

Toolbox Integration (Flatpak Version)

For Toolbox support, use the Flatpak version of VS Code:

cd ~/.vscode
git clone https://github.com/owtaylor/toolbox-vscode.git
cd toolbox-vscode
ln -s "$PWD/code.sh" ~/.local/bin/code

Quality of Life Tweaks

Flatpak Maintenance

sudo flatpak uninstall --unused -y
sudo flatpak repair

RPM Fusion Non-Free

sudo dnf install \
  https://download1.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm

sudo dnf group upgrade core

Fix Choppy Video Playback

sudo dnf install libavcodec-freeworld ffmpeg --allowerasing

Remove Old Kernels

rpm -q kernel-core
sudo dnf remove kernel*<version>*

Fix WiFi After Suspend (Realtek RTL8851BE)

Disable the d3cold power state for the WiFi controller:

lspci -nnk | grep -A 3 -i network  # 02:00.0 Network controller...
cat << EOF | sudo tee /etc/udev/rules.d/99-rtw89-d3cold.rules
SUBSYSTEM=="pci", KERNEL=="0000:02:00.0", ATTR{d3cold_allowed}="0"
EOF

sudo udevadm control --reload-rules && sudo udevadm trigger
cat /sys/bus/pci/devices/0000:02:00.0/d3cold_allowed  # Should output "0"

Updating an Expired GitHub Token

When a GitHub access token expires, explicitly reject the cached credential and then retry the push.

Explicitly reject the credential with input, then push.

printf "protocol=https\nhost=github.com\n\n" | git credential reject
git push

All-in-One Command to Update Agent CLIs

npm install -g @google/gemini-cli@latest @qwen-code/qwen-code@latest @openai/codex@latest @anthropic-ai/claude-code@latest

SELinux Relabeling on Fedora

You must force a relabel whenever files are modified outside the normal boot path.

Fedora recovery mode fails with:

Cannot open access to console, the root account is locked.

Recovery mode cannot be used because Fedora ships with root disabled by default. If you haven't run sudo passwd root before and cannot enter Emergency Mode:

Correct approach

Boot once with:

rw init=/bin/bash

From the emergency shell, looks like bash-5.x#:

passwd root

Then force a relabel.

touch /.autorelabel

Then reboot:

exec /sbin/reboot -f
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment