Last active
February 27, 2026 08:29
-
-
Save birgersp/70f0e6c5bac14d559e2c9eeada9e5ce2 to your computer and use it in GitHub Desktop.
Fedora setup script
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/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