#!/bin/bash # Replace Flatpak apps with native installs # Migrates configs from Flatpak sandboxes to native locations # Safe to re-run — won't overwrite existing native configs without prompting set -e BACKUP="$HOME/flatpak-config-backup" TMPDIR="$HOME/Downloads/native-installs" mkdir -p "$TMPDIR" echo "============================================" echo " Step 1: Install KeePassXC via apt" echo "============================================" sudo apt-get update -qq sudo apt-get install -y keepassxc echo "Done." echo "" echo "============================================" echo " Step 1b: Install Telegram (official tarball)" echo "============================================" echo "Downloading Telegram..." wget -q --show-progress -O "$TMPDIR/telegram.tar.xz" \ "https://telegram.org/dl/desktop/linux" sudo mkdir -p /opt/telegram sudo tar -xJf "$TMPDIR/telegram.tar.xz" -C /opt/telegram --strip-components=1 sudo ln -sf /opt/telegram/Telegram /usr/local/bin/telegram mkdir -p ~/.local/share/applications cat > ~/.local/share/applications/telegram-desktop.desktop << EOF [Desktop Entry] Name=Telegram Desktop Comment=Official Telegram messaging app Exec=/opt/telegram/Telegram -- %u Icon=/opt/telegram/telegram.png Terminal=false Type=Application Categories=Chat;Network;InstantMessaging; MimeType=x-scheme-handler/tg; StartupNotify=true StartupWMClass=TelegramDesktop EOF update-desktop-database ~/.local/share/applications 2>/dev/null || true echo "Telegram installed to /opt/telegram" echo "" echo "============================================" echo " Step 2: Download Obsidian .deb" echo "============================================" wget -q --show-progress -O "$TMPDIR/obsidian.deb" \ "https://github.com/obsidianmd/obsidian-releases/releases/download/v1.12.7/obsidian_1.12.7_amd64.deb" echo "Obsidian downloaded." echo "" echo "============================================" echo " Step 3: Download FreeTube .deb (latest)" echo "============================================" FREETUBE_URL=$(curl -s https://api.github.com/repos/FreeTubeApp/FreeTube/releases/latest \ | grep -o '"browser_download_url": "[^"]*amd64\.deb"' \ | head -1 | cut -d'"' -f4) if [ -z "$FREETUBE_URL" ]; then echo "WARNING: Could not auto-detect FreeTube version. Check https://github.com/FreeTubeApp/FreeTube/releases" echo "Download the *_amd64.deb file manually and run: sudo dpkg -i ~/Downloads/freetube_*.deb" else wget -q --show-progress -O "$TMPDIR/freetube.deb" "$FREETUBE_URL" echo "FreeTube downloaded." fi echo "" echo "============================================" echo " Step 4: Install .deb packages" echo "============================================" sudo dpkg -i "$TMPDIR/obsidian.deb" 2>/dev/null || true [ -f "$TMPDIR/freetube.deb" ] && sudo dpkg -i "$TMPDIR/freetube.deb" 2>/dev/null || true sudo apt-get install -f -y # fix any missing dependencies echo "Done." echo "" echo "============================================" echo " Step 5: Install Zen Browser (native tar.xz)" echo "============================================" echo "Downloading Zen (this may take a minute — ~90MB)..." wget -q --show-progress -O "$TMPDIR/zen.tar.xz" \ "https://github.com/zen-browser/desktop/releases/latest/download/zen.linux-x86_64.tar.xz" sudo mkdir -p /opt/zen sudo tar -xJf "$TMPDIR/zen.tar.xz" -C /opt/zen --strip-components=1 sudo chmod +x /opt/zen/zen # Symlink so you can type 'zen' in the terminal sudo ln -sf /opt/zen/zen /usr/local/bin/zen # Find the icon (location varies by version) ZEN_ICON=$(find /opt/zen -name "default128.png" 2>/dev/null | head -1) [ -z "$ZEN_ICON" ] && ZEN_ICON="/opt/zen/browser/chrome/icons/default/default128.png" # Create application menu entry mkdir -p ~/.local/share/applications cat > ~/.local/share/applications/zen-browser.desktop << EOF [Desktop Entry] Name=Zen Browser Comment=Experience a calmer internet Exec=/opt/zen/zen %u Icon=$ZEN_ICON Terminal=false Type=Application Categories=Network;WebBrowser; MimeType=text/html;text/xml;application/xhtml+xml;x-scheme-handler/http;x-scheme-handler/https; StartupNotify=true StartupWMClass=zen-alpha EOF update-desktop-database ~/.local/share/applications 2>/dev/null || true echo "Zen installed to /opt/zen" echo "" echo "============================================" echo " Step 6: Migrate configs from Flatpak backups" echo "============================================" # KeePassXC — settings (recent files, window layout, etc.) if [ -d "$BACKUP/org.keepassxc.KeePassXC/config/keepassxc" ]; then mkdir -p ~/.config/keepassxc cp -rn "$BACKUP/org.keepassxc.KeePassXC/config/keepassxc/." ~/.config/keepassxc/ echo "KeePassXC: config migrated (database stays at ~/passwords/kpdb.kdbx)" else echo "KeePassXC: no config found in backup, skipping" fi # Telegram — tdata contains your login session (no need to re-scan QR code) if [ -d "$BACKUP/org.telegram.desktop/data/TelegramDesktop" ]; then mkdir -p ~/.local/share/TelegramDesktop cp -rn "$BACKUP/org.telegram.desktop/data/TelegramDesktop/." ~/.local/share/TelegramDesktop/ echo "Telegram: session data migrated (you should stay logged in)" else echo "Telegram: no data found in backup, you'll need to log in again" fi # FreeTube — subscriptions, history, settings if [ -d "$BACKUP/io.freetubeapp.FreeTube/config/FreeTube" ]; then mkdir -p ~/.config/FreeTube # Copy only the actual data files, skip caches for item in "$BACKUP/io.freetubeapp.FreeTube/config/FreeTube/"*; do name=$(basename "$item") case "$name" in Cache|"Code Cache"|GPUCache|DawnGraphiteCache|DawnWebGPUCache|Crashpad) echo "FreeTube: skipping cache: $name" ;; *) cp -rn "$item" ~/.config/FreeTube/ 2>/dev/null || true ;; esac done echo "FreeTube: config migrated (subscriptions + history preserved)" else echo "FreeTube: no config found in backup, skipping" fi # Obsidian — app-level config (vault list, theme, plugins list) if [ -d "$BACKUP/md.obsidian.Obsidian/config/obsidian" ]; then mkdir -p ~/.config/obsidian for item in "$BACKUP/md.obsidian.Obsidian/config/obsidian/"*; do name=$(basename "$item") case "$name" in Cache|"Code Cache"|GPUCache|DawnGraphiteCache|DawnWebGPUCache|Crashpad) echo "Obsidian: skipping cache: $name" ;; *) cp -rn "$item" ~/.config/obsidian/ 2>/dev/null || true ;; esac done echo "Obsidian: config migrated (vaults are wherever you stored them, unchanged)" else echo "Obsidian: no config found in backup, skipping" fi # Zen — full browser profile (bookmarks, extensions, history, passwords, settings) if [ -d "$BACKUP/app.zen_browser.zen/.zen" ]; then echo "Zen: migrating browser profile (bookmarks, extensions, history)..." mkdir -p ~/.zen cp -rn "$BACKUP/app.zen_browser.zen/.zen/." ~/.zen/ echo "Zen: profile migrated" else echo "Zen: no profile found in backup, starting fresh" fi echo "" echo "============================================" echo " Step 7: Remove Flatpak versions" echo "============================================" flatpak remove -y \ app.zen_browser.zen \ org.keepassxc.KeePassXC \ md.obsidian.Obsidian \ org.telegram.desktop \ io.freetubeapp.FreeTube echo "Flatpaks removed." echo "" echo "============================================" echo " All done!" echo "============================================" echo "" echo "Summary:" echo " KeePass database : ~/passwords/kpdb.kdbx (unchanged)" echo " Config backup : ~/flatpak-config-backup/ (safe to delete later)" echo " Downloaded debs : ~/Downloads/native-installs/ (safe to delete)" echo " Zen installed to : /opt/zen" echo "" echo "Next: open Zen and re-run 'firefoxpwa profile patch' to fix PWAs"