Compare commits

..

27 Commits

Author SHA1 Message Date
149615c1f7 Updated a bit 2025-07-23 14:37:06 +02:00
5bbbe58c79 Update README.md 2025-07-23 12:14:12 +02:00
5f691a3438 Update setup-ubuntu.sh 2025-06-22 20:14:39 +02:00
d1af867812 Update setup-ubuntu.sh 2025-03-30 22:14:44 +02:00
bf6c30f25b Update README.md 2025-03-30 13:30:53 +02:00
f54e224b46 Update setup-ubuntu.sh 2025-03-30 13:24:10 +02:00
6eb67f7f1a Update setup-ubuntu.sh 2025-03-29 22:54:36 +01:00
fe4c4f2363 Update setup-ubuntu.sh
Remove CrossFTP.  Pull OpenRA from Flathub.
2025-03-29 20:07:56 +01:00
0931e20550 Whoops 2024-12-15 23:20:04 +01:00
15b66889f9 Add Localsend 2024-12-15 23:17:22 +01:00
b2f33f6d9a Silence kubectl install 2024-12-15 14:16:34 +01:00
8b929acfb4 Minor tweaks 2024-12-15 13:58:30 +01:00
408f6699e9 Update setup-ubuntu.sh 2024-12-12 22:46:15 +01:00
7f1a661d09 Update setup-ubuntu.sh 2024-12-12 22:42:23 +01:00
61b23c894a Update README.md 2024-12-12 22:37:38 +01:00
690e277fe1 Update setup-ubuntu.sh 2024-12-12 20:13:29 +01:00
c5df310e32 Update setup-ubuntu.sh 2024-12-12 19:55:58 +01:00
d1de2639f7 Add Ansible to PATH 2024-06-23 23:43:02 +02:00
686476fece Use Nala, install Ansible etc. 2024-06-23 23:32:40 +02:00
04a289dbf2 Update setup-ubuntu.sh 2024-06-22 01:04:24 +02:00
8921450eb4 Update setup-ubuntu.sh 2024-06-22 01:01:54 +02:00
bfdebb49d0 Update setup-ubuntu.sh 2024-06-22 00:42:13 +02:00
73fb3d628e Update setup-ubuntu.sh 2024-06-22 00:36:30 +02:00
713e878ac6 Update setup-ubuntu.sh 2024-06-22 00:34:35 +02:00
12bb57b2a3 Update setup-ubuntu.sh 2024-06-22 00:31:33 +02:00
eaa9557e5f Update README.md 2024-06-21 12:50:29 +02:00
962b82cbce Add setup-ubuntu.sh 2024-06-21 12:49:17 +02:00
14 changed files with 351 additions and 135 deletions

View File

@@ -1,9 +1,16 @@
# misebuntu
Turn a fresh Ubuntu installation into a fully configured desktop by running a single command.
misebuntu is what I prefer Ubuntu to be.
It is a play in on the term *mise en place* and Ubuntu.
# Setup Ubuntu
Install everything with a single command
Getting starting is simple - just run:
```bash
wget -qO- https://git.cbo.dk/rasmus/setup-ubuntu/raw/branch/v0.1/installer.sh | bash
wget -qO- https://git.cbo.dk/rasmus/setup-ubuntu/raw/branch/main/setup-ubuntu.sh | bash
```
# A few manual touches to change terminal colors
Using [Gogh](https://github.com/Gogh-Co/Gogh)
```bash
sudo apt-get install dconf-cli uuid-runtime
wget -O gogh https://git.io/vQgMr && chmod +x gogh && ./gogh && rm gogh
# Select #7 - Afterglow
```
(If it fails due to missing profile - then manually add a Terminal profile called "Default")

View File

@@ -1,23 +0,0 @@
# Exit immediately if a command exits with a non-zero status
set -e
# Needed for all installers
sudo apt update -y
sudo apt install -y curl git unzip
# Ensure computer doesn't go to sleep or lock while installing
gsettings set org.gnome.desktop.screensaver lock-enabled false
gsettings set org.gnome.desktop.session idle-delay 0
# Run installers
for script in ~/.local/share/mise-en-place/install/*.sh; do source $script; done
# Upgrade everything that might ask for a reboot last
sudo apt upgrade -y
# Revert to normal idle and lock settings
gsettings set org.gnome.desktop.screensaver lock-enabled true
gsettings set org.gnome.desktop.session idle-delay 300
# Logout to pickup changes
#gum confirm "Ready to logout for all settings to take effect?" && gnome-session-quit --logout --no-prompt

View File

@@ -1,2 +0,0 @@
# Flameshot is a nice step-up over the default Gnome screenshot tool
sudo apt install -y flameshot

View File

@@ -1,7 +0,0 @@
cd ~/Downloads
LAZYDOCKER_VERSION=$(curl -s "https://api.github.com/repos/jesseduffield/lazydocker/releases/latest" | grep -Po '"tag_name": "v\K[^"]*')
curl -sLo lazydocker.tar.gz "https://github.com/jesseduffield/lazydocker/releases/latest/download/lazydocker_${LAZYDOCKER_VERSION}_Linux_x86_64.tar.gz"
tar -xf lazydocker.tar.gz lazydocker
sudo install lazydocker /usr/local/bin
rm lazydocker.tar.gz lazydocker
cd -

View File

@@ -1,7 +0,0 @@
cd ~/Downloads
LAZYGIT_VERSION=$(curl -s "https://api.github.com/repos/jesseduffield/lazygit/releases/latest" | grep -Po '"tag_name": "v\K[^"]*')
curl -sLo lazygit.tar.gz "https://github.com/jesseduffield/lazygit/releases/latest/download/lazygit_${LAZYGIT_VERSION}_Linux_x86_64.tar.gz"
tar -xf lazygit.tar.gz lazygit
sudo install lazygit /usr/local/bin
rm lazygit.tar.gz lazygit
cd -

View File

@@ -1,6 +0,0 @@
cd ~/Downloads
LOCALSEND_VERSION=$(curl -s "https://api.github.com/repos/localsend/localsend/releases/latest" | grep -Po '"tag_name": "v\K[^"]*')
wget -O localsend.deb "https://github.com/localsend/localsend/releases/latest/download/LocalSend-${LOCALSEND_VERSION}-linux-x86-64.deb"
sudo apt install -y ./localsend.deb
rm localsend.deb
cd -

View File

@@ -1,6 +0,0 @@
cd ~/Downloads
LOCALSEND_VERSION=$(curl -s "https://api.github.com/repos/localsend/localsend/releases/latest" | grep -Po '"tag_name": "v\K[^"]*')
wget -O localsend.deb "https://github.com/localsend/localsend/releases/latest/download/LocalSend-${LOCALSEND_VERSION}-linux-x86-64.deb"
sudo apt install -y ./localsend.deb
rm localsend.deb
cd -

View File

@@ -1,9 +0,0 @@
wget -qO - https://typora.io/linux/public-key.asc | sudo tee /etc/apt/trusted.gpg.d/typora.asc
sudo add-apt-repository -y 'deb https://typora.io/linux ./'
sudo apt update
sudo apt install -y typora
# Add iA Typora theme
mkdir -p ~/.config/Typora/themes
cp ~/.local/share/omakub/themes/typora/ia_typora.css ~/.config/Typora/themes/
cp ~/.local/share/omakub/themes/typora/ia_typora_night.css ~/.config/Typora/themes/

View File

@@ -1 +0,0 @@
sudo apt install -y vlc

View File

@@ -1,14 +0,0 @@
cd ~/Downloads
wget -O code.deb 'https://code.visualstudio.com/sha/download?build=stable&os=linux-deb-x64'
sudo apt install -y ./code.deb
rm code.deb
cd -
mkdir -p ~/.config/Code/User
cp ~/.local/share/omakub/configs/vscode.json ~/.config/Code/User/settings.json
# Install default supported themes
code --install-extension enkia.tokyo-night
# Install default language extensions
code --install-extension golang.go

View File

@@ -1,15 +0,0 @@
sudo apt install -y docker.io docker-buildx
sudo usermod -aG docker ${USER}
# Limit log size to avoid running out of disk
echo '{"log-driver":"json-file","log-opts":{"max-size":"10m","max-file":"5"}}' | sudo tee /etc/docker/daemon.json
DOCKER_COMPOSE_VERSION="2.27.0"
DOCKER_CONFIG=${DOCKER_CONFIG:-$HOME/.docker}
mkdir -p $DOCKER_CONFIG/cli-plugins
curl -sSL https://github.com/docker/compose/releases/download/v$DOCKER_COMPOSE_VERSION/docker-compose-linux-x86_64 -o $DOCKER_CONFIG/cli-plugins/docker-compose
chmod +x $DOCKER_CONFIG/cli-plugins/docker-compose
sudo docker create --restart unless-stopped -p "127.0.0.1:3306:3306" --name=mysql8 -e MYSQL_ROOT_PASSWORD= -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql:8.4
sudo docker create --restart unless-stopped -p "127.0.0.1:6379:6379" --name=redis redis:7
sudo docker create --restart unless-stopped -p "127.0.0.1:5432:5432" --name=postgres16 -e POSTGRES_HOST_AUTH_METHOD=trust postgres:16

View File

@@ -1,33 +0,0 @@
mkdir -p ~/.local/share/fonts
cd ~/Downloads
wget https://github.com/ryanoasis/nerd-fonts/releases/latest/download/CascadiaMono.zip
unzip CascadiaMono.zip -d CascadiaFont
cp CascadiaFont/*.ttf ~/.local/share/fonts
rm -rf CascadiaMono.zip CascadiaFont
wget https://github.com/ryanoasis/nerd-fonts/releases/latest/download/FiraMono.zip
unzip FiraMono.zip -d FiraMono
cp FiraMono/*.otf ~/.local/share/fonts
rm -rf FiraMono.zip FiraMono
wget https://github.com/ryanoasis/nerd-fonts/releases/latest/download/JetBrainsMono.zip
unzip JetBrainsMono.zip -d JetBrainsMono
cp JetBrainsMono/*.ttf ~/.local/share/fonts
rm -rf JetBrainsMono.zip JetBrainsMono
wget https://github.com/ryanoasis/nerd-fonts/releases/latest/download/Meslo.zip
unzip Meslo.zip -d Meslo
cp Meslo/*.ttf ~/.local/share/fonts
rm -rf Meslo.zip Meslo
wget https://github.com/iaolo/iA-Fonts/archive/refs/heads/master.zip
unzip master.zip -d iaFonts
cp iaFonts/iA-Fonts-master/iA\ Writer\ Mono/Static/iAWriterMonoS-*.ttf ~/.local/share/fonts
rm -rf master.zip iaFonts
fc-cache
cd -
# Set Cascadia Mono as the default
gsettings set org.gnome.desktop.interface monospace-font-name 'CaskaydiaMono Nerd Font 10'

View File

@@ -1,7 +0,0 @@
echo "Installing git..."
sudo apt-get update > /dev/null
sudo apt-get install -y git > /dev/null
echo "Cloning stable Mise-en-place..."
git clone -b v0.1 https://git.cbo.dk/rasmus/setup-ubuntu.git ~/.local/share/mise-en-place > /dev/null
source ~/.local/share/mise-en-place/install.sh

339
setup-ubuntu.sh Executable file
View File

@@ -0,0 +1,339 @@
#!/bin/bash
set -e # Fail on errors
# Pre-req: Use OS with apt - like Ubuntu, POP_OS!, etc.
# Update apt and all existing applications
# Install Nala - enables multithreading when installing apt packages
echo "🚧 APT update/upgrade + installing nala..."
sudo apt-get update > /dev/null && sudo apt-get upgrade -y > /dev/null
sudo apt-get update > /dev/null && sudo apt-get install -y nala > /dev/null
sudo nala install -y apt-transport-https ca-certificates cifs-utils cksfv curl curl git gnupg golang-go jq mc nano pipx python3 sshpass unrar unzip wget > /dev/null
# Uninstall Transmission if installed (Ubuntu sometimes installs it by default)
echo "🔧 Checking for Transmission..."
if dpkg -l | grep -q transmission-gtk; then
echo "Removing Transmission (transmission-gtk)..."
sudo apt-get remove --purge -y transmission-gtk transmission-common transmission-qt > /dev/null
sudo apt-get autoremove -y > /dev/null
echo "Transmission removed."
else
echo "Transmission not installed."
fi
# Change work-dir to /tmp/
cd /tmp/
# Install apps from APT
echo "📦 Installing a few more applications from apt/nala..."
software=(
doublecmd-common # Double Commander
filezilla # FTP client
mc # Midnight Commander
nextcloud-desktop # Nextcloud Desktop Client
notepadqq # NotepadQQ
openscad # OpenSCAD - for drawing 3D
rpi-imager # Raspberry Pi Imager
solaar # Solaar - Logitech keyboard/mouse software for Linux
)
# Run nala install for all software in the array
sudo nala install -y "${software[@]}" > /dev/null
# Flatpak and flathub repo
echo "📦 Installing applications from Flathub..."
sudo nala install -y flatpak gnome-software-plugin-flatpak > /dev/null
sudo flatpak remote-add --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo
# Flatpak applications
# Flatpak applications
flatpakapps=(
com.bitwarden.desktop # Bitwarden client
com.discordapp.Discord # Discord
com.prusa3d.PrusaSlicer # PrusaSlicer
com.valvesoftware.Steam # Steam - games
md.obsidian.Obsidian # Obsidian - markdown notepad
one.ablaze.floorp # Floorp - browser
org.deluge_torrent.deluge # Deluge - torrent client
org.remmina.Remmina # SSH client
org.videolan.VLC # VLC video player
org.localsend.localsend_app # Airdrop alternative
net.openra.OpenRA # Open Red Alert
)
# Run flatpak install for all apps in the array
sudo flatpak install -y "${flatpakapps[@]}" > /dev/null
# Ansible
echo "📦 Installing Ansbile..."
pipx install --include-deps ansible > /dev/null
pipx ensurepath
pipx completions
eval "$(register-python-argcomplete pipx)"
#####################################
# Extend APT with more applications #
#####################################
### Tailscale ###
echo "📦 Installing Tailscale..."
curl -fsSL https://pkgs.tailscale.com/stable/ubuntu/noble.noarmor.gpg | sudo tee /usr/share/keyrings/tailscale-archive-keyring.gpg >/dev/null
curl -fsSL https://pkgs.tailscale.com/stable/ubuntu/noble.tailscale-keyring.list | sudo tee /etc/apt/sources.list.d/tailscale.list
sudo nala update > /dev/null
sudo nala install -y tailscale > /dev/null
### Fastfetch ###
echo "📦 Installing Fastfetch..."
sudo add-apt-repository -y ppa:zhangsongcui3371/fastfetch > /dev/null
sudo nala update > /dev/null
sudo nala install -y fastfetch > /dev/null
### Docker ###
echo "📦 Installing Docker..."
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg > /dev/null; done
# Add Docker's official GPG key:
sudo nala update > /dev/null
sudo nala install -y ca-certificates curl > /dev/null
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo nala update > /dev/null
sudo nala install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin > /dev/null
sudo groupadd --force docker
sudo usermod -aG docker $USER
### Helm ###
echo "📦 Installing Helm..."
sudo install -m 0755 -d /etc/apt/keyrings
sudo nala install -y apt-transport-https wget gpg > /dev/null
wget -qO- https://baltocdn.com/helm/signing.asc | gpg --dearmor > packages.helm.gpg
sudo install -D -o root -g root -m 644 packages.helm.gpg /etc/apt/keyrings/packages.helm.gpg
echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/packages.helm.gpg] https://baltocdn.com/helm/stable/debian/ all main" | sudo tee /etc/apt/sources.list.d/helm.list > /dev/null
rm -f packages.helm.gpg
sudo nala update > /dev/null
sudo nala install -y helm > /dev/null
### Minikube ###
echo "📦 Installing Minikube..."
curl -sLO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube && rm minikube-linux-amd64
### Kubectl ###
echo "📦 Installing Kubectl..."
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.29/deb/Release.key | sudo gpg --batch --yes --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.29/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo nala update > /dev/null
sudo nala install -y kubectl > /dev/null
### KubeSeal ###
echo "📦 Installing Kubeseal..."
# Fetch the latest sealed-secrets version using GitHub API
KUBESEAL_VERSION=$(curl -s https://api.github.com/repos/bitnami-labs/sealed-secrets/tags | jq -r '.[0].name' | cut -c 2-)
# Check if the version was fetched successfully
if [ -z "$KUBESEAL_VERSION" ]; then
echo "Failed to fetch the latest KUBESEAL_VERSION"
exit 1
fi
curl -sOL "https://github.com/bitnami-labs/sealed-secrets/releases/download/v${KUBESEAL_VERSION}/kubeseal-${KUBESEAL_VERSION}-linux-amd64.tar.gz"
tar -xvzf kubeseal-${KUBESEAL_VERSION}-linux-amd64.tar.gz kubeseal > /dev/null
sudo install -m 755 kubeseal /usr/local/bin/kubeseal && rm kubeseal*
# Lazygit - TUI for Git
echo "📦 Installing Lazygit..."
LAZYGIT_VERSION=$(curl -s "https://api.github.com/repos/jesseduffield/lazygit/releases/latest" | grep -Po '"tag_name": "v\K[^"]*')
curl -sLo lazygit.tar.gz "https://github.com/jesseduffield/lazygit/releases/latest/download/lazygit_${LAZYGIT_VERSION}_Linux_x86_64.tar.gz" > /dev/null
tar xf lazygit.tar.gz lazygit
sudo install lazygit /usr/local/bin
# Lazydocker - TUI for Docker
echo "📦 Installing Lazydocker..."
LAZYDOCKER_VERSION=$(curl -s "https://api.github.com/repos/jesseduffield/lazydocker/releases/latest" | grep -Po '"tag_name": "v\K[^"]*')
curl -sLo lazydocker.tar.gz "https://github.com/jesseduffield/lazydocker/releases/latest/download/lazydocker_${LAZYDOCKER_VERSION}_Linux_x86_64.tar.gz" > /dev/null
tar -xf lazydocker.tar.gz lazydocker
sudo install lazydocker /usr/local/bin
rm lazydocker.tar.gz lazydocker
# K9s - TUI for Kubernetes
echo "📦 Installing K9s..."
K9S_VERSION=$(curl -s "https://api.github.com/repos/derailed/k9s/releases/latest" | grep -Po '"tag_name": "v\K[^"]*')
curl -sLo k9s_linux_amd64.deb "https://github.com/derailed/k9s/releases/download/v${K9S_VERSION}/k9s_linux_amd64.deb" > /dev/null
sudo apt-get install -y ./k9s_linux_amd64.deb > /dev/null
rm k9s_linux_amd64.deb
# Google Chrome
echo "📦 Installing Google Chrome..."
wget -q https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
sudo dpkg -i google-chrome-stable_current_amd64.deb > /dev/null
sudo apt-get install -f > /dev/null
rm google-chrome-stable_current_amd64.deb
# Unrarall
echo "📦 Installing Unrarall..."
wget -qO unrarall https://raw.githubusercontent.com/arfoll/unrarall/master/unrarall
sudo chmod 0777 unrarall
sudo chown root:root unrarall
sudo mv unrarall /usr/bin/unrarall
# VSCode
echo "📦 Installing VSCode..."
# Install prerequisites
sudo apt-get install -y wget gpg apt-transport-https > /dev/null
# Import the Microsoft GPG key
wget -qO- https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg
sudo install -D -o root -g root -m 644 microsoft.gpg /usr/share/keyrings/microsoft.gpg
rm -f microsoft.gpg
# Add the VS Code repository in .sources format
sudo tee /etc/apt/sources.list.d/vscode.sources > /dev/null <<EOF
Types: deb
URIs: https://packages.microsoft.com/repos/code
Suites: stable
Components: main
Architectures: amd64,arm64,armhf
Signed-By: /usr/share/keyrings/microsoft.gpg
EOF
# Update and install VS Code
sudo nala update > /dev/null
sudo nala install -y code > /dev/null
# Install VSCode extensions
echo "📦 Installing more VSCode extensions.."
code --install-extension esbenp.prettier-vscode > /dev/null
code --install-extension golang.go > /dev/null
code --install-extension ms-azuretools.vscode-docker > /dev/null
code --install-extension ms-python.debugpy > /dev/null
code --install-extension ms-python.python > /dev/null
code --install-extension ms-python.vscode-pylance > /dev/null
code --install-extension ms-vscode-remote.remote-containers > /dev/null
code --install-extension ms-vscode-remote.remote-ssh > /dev/null
code --install-extension ms-vscode-remote.remote-ssh-edit > /dev/null
code --install-extension ms-vscode-remote.remote-wsl > /dev/null
code --install-extension ms-vscode-remote.vscode-remote-extensionpack > /dev/null
code --install-extension ms-vscode.remote-explorer > /dev/null
code --install-extension ms-vscode.remote-server > /dev/null
code --install-extension rangav.vscode-thunder-client > /dev/null
code --install-extension redhat.ansible > /dev/null
code --install-extension redhat.java > /dev/null
code --install-extension redhat.vscode-commons > /dev/null
code --install-extension redhat.vscode-microprofile > /dev/null
code --install-extension redhat.vscode-quarkus > /dev/null
code --install-extension redhat.vscode-xml > /dev/null
code --install-extension redhat.vscode-yaml > /dev/null
code --install-extension vscjava.vscode-java-debug > /dev/null
############################
# #
# Configure look of Ubuntu #
# #
############################
echo "🎨 Configure Ubuntu look and feel..."
# Color theme
gsettings set org.gnome.desktop.interface clock-format '24h'
gsettings set org.gnome.desktop.interface clock-show-date true
gsettings set org.gnome.desktop.interface clock-show-seconds false
gsettings set org.gnome.desktop.interface clock-show-weekday true
gsettings set org.gnome.desktop.interface color-scheme 'prefer-dark'
gsettings set org.gnome.desktop.interface cursor-theme 'Adwaita'
gsettings set org.gnome.desktop.interface enable-animations true
gsettings set org.gnome.desktop.interface enable-hot-corners false
gsettings set org.gnome.desktop.interface gtk-theme 'Yaru-blue'
gsettings set org.gnome.desktop.interface icon-theme 'Yaru-blue'
gsettings set org.gnome.desktop.interface show-battery-percentage true
gsettings set org.gnome.desktop.interface text-scaling-factor 1.0
gsettings set org.gnome.desktop.interface toolbar-detachable false
gsettings set org.gnome.desktop.interface toolbar-icons-size 'large'
gsettings set org.gnome.desktop.interface toolbar-style 'both-horiz'
gsettings set org.gnome.desktop.interface toolkit-accessibility false
# Move dock to right side of screen
gsettings set org.gnome.shell.extensions.dash-to-dock dock-position "RIGHT"
# Activate night light
gsettings set org.gnome.settings-daemon.plugins.color night-light-enabled true
gsettings set org.gnome.settings-daemon.plugins.color night-light-schedule-automatic true
gsettings set org.gnome.settings-daemon.plugins.color night-light-temperature 4000
# Deactivate "Begin move" shortcut, as the same keys are used in Double Commander
gsettings set org.gnome.desktop.wm.keybindings begin-move "[]"
# Remove unwanted apps from favorites using jq for robust JSON handling
apps_to_remove=(
"yelp.desktop"
"rhythmbox.desktop"
"org.gnome.Rhythmbox3.desktop"
"thunderbird.desktop"
"thunderbird_thunderbird.desktop"
)
# Get current favorites as JSON array, with error handling
gsettings_output=$(gsettings get org.gnome.shell favorite-apps 2>/dev/null)
if echo "$gsettings_output" | grep -q '^@as '; then
# Remove the @as prefix if present
gsettings_output=${gsettings_output#@as }
fi
# Try to convert to JSON, fallback to empty array if invalid
if echo "$gsettings_output" | grep -q '^\['; then
current_apps=$(echo "$gsettings_output" | tr "'" '"')
else
echo "⚠️ Could not get valid favorite-apps from gsettings, using empty array."
current_apps='[]'
fi
for app in "${apps_to_remove[@]}"; do
current_apps=$(echo "$current_apps" | jq --arg app "$app" '[.[] | select(. != $app)]')
done
# Desired order: Firefox, Floorp, Chrome, Double Commander, then the rest
ordered_apps=(
"firefox.desktop"
"firefox_firefox.desktop"
"one.ablaze.floorp.desktop"
"google-chrome.desktop"
"doublecmd.desktop"
)
# Only keep ordered apps that are present in current favorites
ordered_present=()
for app in "${ordered_apps[@]}"; do
if echo "$current_apps" | jq -e --arg a "$app" 'index($a)' > /dev/null; then
ordered_present+=("$app")
fi
done
# Remove all ordered_present from current_apps to avoid duplicates
remaining=$(echo "$current_apps" | jq -c --argjson order "$(printf '%s\n' "${ordered_present[@]}" | jq -R . | jq -s .)" '. as $in | $order as $order | [.[] | select(. as $a | ($order | index($a) | not))]')
# Build new favorites array in desired order, then add the rest
new_favorites=$(jq -c -n --argjson ordered "$(printf '%s\n' "${ordered_present[@]}" | jq -R . | jq -s .)" --argjson rest "$remaining" '$ordered + $rest')
# Convert JSON array to gsettings format: single-quoted, comma-separated
gsettings_favorites=$(echo "$new_favorites" | jq -r 'map("'\''" + . + "'\''") | "[" + join(", ") + "]"')
gsettings set org.gnome.shell favorite-apps "$gsettings_favorites"
# Cleaup unwanted apps from favorites
for app in "${apps_to_remove[@]}"; do
if echo "$current_set" | grep -q "$app"; then
echo "$app is still present in favorites!"
else
echo "$app is not present in favorites."
fi
done
# All done
cd # change directory to homedir
echo "🎉 Setup of Ubuntu is done! 🚀"