Skip to content

Instantly share code, notes, and snippets.

@birgersp
Last active February 27, 2026 08:29
Show Gist options
  • Select an option

  • Save birgersp/70f0e6c5bac14d559e2c9eeada9e5ce2 to your computer and use it in GitHub Desktop.

Select an option

Save birgersp/70f0e6c5bac14d559e2c9eeada9e5ce2 to your computer and use it in GitHub Desktop.
Fedora setup script
#!/usr/bin/env bash
set -euo pipefail
DNF_PACKAGES=(
nautilus-typeahead
git
curl
wget
zsh
gnome-tweaks
gnome-extensions-app
pipx
mosh
flatpak
yaru-theme
code
insync
)
FLATPAK_APPS=(
com.github.git_cola.git-cola
org.pgadmin.pgadmin4
com.spotify.Client
com.discordapp.Discord
io.github.Faugus.faugus-launcher
org.sqlitebrowser.sqlitebrowser
)
# Helper functions
tolower() {
echo "$1" | tr '[:upper:]' '[:lower:]'
}
log() {
printf "\n[setup] %s\n" "$1"
}
check_install_vscode_extension() {
local targetFolder="$(tolower "$1")"
targetFolder="$(echo $targetFolder | sed 's/@/-/g')"
echo $1 $targetFolder
if ! find "$HOME/.vscode/extensions" -maxdepth 1 -type d -name "$targetFolder*" | grep -q .; then
code --install-extension $1
fi
}
command_exists() {
if command -v "$1" >/dev/null 2>&1; then
# in bash code 0 means success
return 0
fi
return 1
}
# Setup steps
require_fedora() {
if [[ ! -f /etc/os-release ]]; then
echo "Cannot detect OS: /etc/os-release missing."
exit 1
fi
# shellcheck disable=SC1091
source /etc/os-release
if [[ "${ID:-}" != "fedora" ]]; then
echo "This script is for Fedora only. Detected: ${PRETTY_NAME:-unknown}."
exit 1
fi
}
install_packages() {
log "Installing missing dnf packages..."
# nautilus patch
dnf copr enable nelsonaloysio/nautilus-typeahead
sudo dnf remove nautilus -y
# vscode repo
sudo tee /etc/yum.repos.d/vscode.repo > /dev/null <<-EOF
[vscode-yum]
name=vscode-yum
baseurl=https://packages.microsoft.com/yumrepos/vscode/
repo_gpgcheck=0
gpgcheck=0
enabled=1
gpgkey=https://packages.microsoft.com/yumrepos/vscode/repodata/repomd.xml.key
EOF
# docker repo
sudo dnf config-manager addrepo --from-repofile https://download.docker.com/linux/fedora/docker-ce.repo
# insync
sudo rpm --import https://d2t3ff60b2tol4.cloudfront.net/repomd.xml.key
sudo tee /etc/yum.repos.d/insync.repo > /dev/null <<-EOF
[insync]
name=insync repo
baseurl=http://yum.insync.io/fedora/\$releasever/
gpgcheck=1
gpgkey=https://d2t3ff60b2tol4.cloudfront.net/repomd.xml.key
enabled=1
metadata_expire=120m
EOF
# packages
sudo dnf install -y "${DNF_PACKAGES[@]}"
# docker desktop
local dockerDesktopInstallFile="$HOME/docker-desktop.rpm"
if [ ! -f "$dockerDesktopInstallFile" ]; then
wget https://desktop.docker.com/linux/main/amd64/docker-desktop-x86_64.rpm\?utm_source\=docker\&utm_medium\=webreferral\&utm_campaign\=docs-driven-download-linux-amd64\&_gl\=1\*9ftrfy\*_gcl_au\*MjAwNjU4Mjc5NC4xNzcwODg3MjQ4\*_ga\*MTY2NjE2NzExNC4xNzcwODg3MjQ4\*_ga_XJWPQMJYHQ\*czE3NzEwNTgzMzEkbzIkZzEkdDE3NzEwNTgzNDUkajQ2JGwwJGgw -O $HOME/docker-desktop.rpm
fi
sudo dnf install "$dockerDesktopInstallFile"
}
setup_flatpak() {
if ! command -v flatpak >/dev/null 2>&1; then
log "Installing flatpak..."
sudo dnf install -y flatpak
fi
sudo flatpak remote-add --if-not-exists \
flathub \
https://flathub.org/repo/flathub.flatpakrepo
log "Installing missing flatpak apps..."
flatpak install -y flathub "${FLATPAK_APPS[@]}"
}
set_default_shell_to_zsh() {
local zsh_path
zsh_path="$(command -v zsh)"
if [[ "${SHELL:-}" == "$zsh_path" ]]; then
return
fi
log "Changing default shell to zsh for user '$USER'..."
chsh -s "$zsh_path"
log "Default shell updated. Re-login required."
exit 0
}
install_nvm() {
wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.4/install.sh | bash
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
nvm install 22
}
install_deno() {
if ! command -v deno >/dev/null 2>&1; then
log "Installing deno..."
curl -fsSL https://deno.land/install.sh | sh
fi
}
setup_vscode() {
check_install_vscode_extension AlexShen.classdiagram-ts
check_install_vscode_extension aljazsim.tsco@1.0.31
check_install_vscode_extension dbaeumer.vscode-eslint
check_install_vscode_extension denoland.vscode-deno
check_install_vscode_extension edonet.vscode-command-runner
check_install_vscode_extension eeyore.yapf
check_install_vscode_extension EnkelDigital.relative-goto
check_install_vscode_extension esbenp.prettier-vscode
check_install_vscode_extension fractalbrew.backticks
check_install_vscode_extension GitHub.copilot
check_install_vscode_extension mhutchie.git-graph
check_install_vscode_extension ms-ossdata.vscode-pgsql
check_install_vscode_extension ms-python.python
check_install_vscode_extension ms-vscode-remote.vscode-remote-extensionpack
check_install_vscode_extension MylesMurphy.prettify-ts
check_install_vscode_extension Prisma.prisma
check_install_vscode_extension retepaskab.relativegoto
check_install_vscode_extension ryuta46.multi-command
check_install_vscode_extension YoavBls.pretty-ts-errors
}
install_gnome_extensions() {
gnome-extensions-cli install\
switcher@landau.fi\
dash-to-panel@jderose9.github.com\
emoji-copy@felipeftn\
clipboard-indicator@tudmotu.com\
window-calls@domandoman.xyz
}
configure_gnome() {
dconf write "/org/gnome/desktop/interface/icon-theme" "'Yaru-blue'"
dconf write "/org/gnome/desktop/wm/preferences/resize-with-right-button" "true"
# key bindings
# disable Super+p key
dconf write "/org/gnome/mutter/keybindings/switch-monitor" "@as []"
# disable "open terminal" hotkey
dconf write "/org/gnome/settings-daemon/plugins/media-keys/terminal" "@as []"
# add a custom key binding for Control+Alt+t
dconf write "/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings" "['/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/']"
dconf write "/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/binding" "'<Control><Alt>t'"
dconf write "/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/command" "'bash $HOME/repo/tools/linux/hotkeys.sh --open-terminal'"
dconf write "/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/name" "'open terminal'"
# use Control+Alt+h to open clipboard history
dconf write "/org/gnome/shell/extensions/clipboard-indicator/toggle-menu" "['<Control><Alt>h']"
# misc extension settings
dconf write "/org/gnome/shell/extensions/dash-to-panel/dot-size" "0"
dconf write "/org/gnome/shell/extensions/dash-to-panel/group-apps" "false"
dconf write "/org/gnome/shell/extensions/dash-to-panel/trans-bg-color" "'#3d3846'"
dconf write "/org/gnome/shell/extensions/dash-to-panel/trans-panel-opacity" "1.0"
dconf write "/org/gnome/shell/extensions/dash-to-panel/trans-use-custom-bg" "true"
dconf write "/org/gnome/shell/extensions/dash-to-panel/trans-use-custom-opacity" "false"
dconf write "/org/gnome/shell/extensions/emoji-copy/always-show" "false"
dconf write "/org/gnome/shell/extensions/emoji-copy/emoji-keybind" "['<Ctrl><Alt>period']"
dconf write "/org/gnome/shell/extensions/switcher/fade-enable" "true"
dconf write "/org/gnome/shell/extensions/switcher/font-size" "uint32 24"
dconf write "/org/gnome/shell/extensions/switcher/max-width-percentage" "uint32 50"
# enable window buttons
gsettings set org.gnome.desktop.wm.preferences button-layout ':minimize,maximize,close'
}
main() {
require_fedora
sudo -v
install_packages
setup_flatpak
set_default_shell_to_zsh
install_nvm
install_deno
setup_vscode
install_gnome_extensions
configure_gnome
log "Done. Reboot/re-login is recommended."
}
main "$@"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment