Skip to content

Instantly share code, notes, and snippets.

@koad
Created August 9, 2025 02:58
Show Gist options
  • Save koad/9295c94e77e75223268efcf654ea7369 to your computer and use it in GitHub Desktop.
Save koad/9295c94e77e75223268efcf654ea7369 to your computer and use it in GitHub Desktop.
A bash script that will destroy all your open tabs, they remain in place so you can refresh them when needed.
#!/usr/bin/env bash
# ANSI color codes
GREEN='\033[0;32m'
CYAN='\033[0;36m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
BLUE='\033[0;34m'
PURPLE='\033[0;35m'
NC='\033[0m' # No Color
# Initialize counters
total_tabs_killed=0
total_memory_freed=0
# ASCII Art Banner
display_banner() {
cat << "EOF"
╔══════════════════════════════════════════════════════════════════════════╗
║ ║
║ ████████╗ █████╗ ██████╗ ██╗ ██╗██╗██╗ ██╗ ███████╗██████╗ ║
║ ╚══██╔══╝██╔══██╗██╔══██╗ ██║ ██╔╝██║██║ ██║ ██╔════╝██╔══██╗║
║ ██║ ███████║██████╔╝ █████╔╝ ██║██║ ██║ █████╗ ██████╔╝║
║ ██║ ██╔══██║██╔══██╗ ██╔═██╗ ██║██║ ██║ ██╔══╝ ██╔══██╗║
║ ██║ ██║ ██║██████╔╝ ██║ ██╗██║███████╗███████╗███████╗██║ ██║║
║ ╚═╝ ╚═╝ ╚═╝╚═════╝ ╚═╝ ╚═╝╚═╝╚══════╝╚══════╝╚══════╝╚═╝ ╚═╝║
║ ║
║ [v1.0] ©2025 SYSTEM OPTIMIZER ║
╚══════════════════════════════════════════════════════════════════════════╝
EOF
}
# Function to display box with text
display_box() {
local text=$1
local width=74
local padding=$(( (width - ${#text}) / 2 ))
echo "╔══════════════════════════════════════════════════════════════════════════╗"
printf "║%${padding}s%s%$((width - padding - ${#text}))s║\n" "" "$text" ""
echo "╚══════════════════════════════════════════════════════════════════════════╝"
}
# Display loading animation
display_loading() {
local text=$1
echo -n -e "${CYAN}$text ${NC}"
for i in {1..5}; do
echo -n "."
sleep 0.1
done
echo ""
}
# Function to convert memory units to MB
convert_to_mb() {
local mem=$1
local unit=${2:-KB}
case $unit in
B) echo "scale=2; $mem / 1048576" | bc ;;
KB) echo "scale=2; $mem / 1024" | bc ;;
MB) echo $mem ;;
GB) echo "scale=2; $mem * 1024" | bc ;;
*) echo $mem ;;
esac
}
# Function to kill tabs for a specified browser
kill_browser_tabs() {
local browser_name=$1
local process_name=$2
local browser_tabs_killed=0
local browser_memory_freed=0
echo -e "${YELLOW}┌──────────────────────────────────────────────────────────────────────────┐${NC}"
echo -e "${YELLOW}│${NC} ${CYAN}SCANNING${NC}: Looking for ${GREEN}${browser_name}${NC} tabs... ${YELLOW}│${NC}"
echo -e "${YELLOW}└──────────────────────────────────────────────────────────────────────────┘${NC}"
display_loading "INITIALIZING SCAN"
# Get processes, extract URL or title info if possible, then kill
pgrep -f -a "${process_name}" | grep 'type=renderer' | grep -v "extension" | while read pid cmd; do
# Get memory usage before killing
local mem_info=$(ps -o rss= -p $pid 2>/dev/null)
if [ -n "$mem_info" ]; then
# Convert KB to MB and add to total
local mem_mb=$(convert_to_mb $mem_info)
browser_memory_freed=$(echo "scale=2; $browser_memory_freed + $mem_mb" | bc)
total_memory_freed=$(echo "scale=2; $total_memory_freed + $mem_mb" | bc)
fi
# Extract a meaningful name for the tab if possible
tab_info=$(echo "$cmd" | grep -o -E 'https?://[^ ]+|--app=[^ ]+' | head -1)
if [ -z "$tab_info" ]; then
tab_info="[UNKNOWN]"
fi
echo -e "${RED}■ TERMINATING${NC} ${browser_name} [PID:$pid] ${BLUE}${tab_info}${NC} ${YELLOW}(${mem_mb:-0} MB)${NC}"
kill $pid
browser_tabs_killed=$((browser_tabs_killed + 1))
total_tabs_killed=$((total_tabs_killed + 1))
sleep 0.05 # Slow down for visual effect
done
if [ $browser_tabs_killed -gt 0 ]; then
echo -e "${YELLOW}┌──────────────────────────────────────────────────────────────────────────┐${NC}"
echo -e "${YELLOW}│${NC} ${GREEN}COMPLETE${NC}: ${browser_name} - Terminated $browser_tabs_killed processes / Freed ${browser_memory_freed} MB ${YELLOW}│${NC}"
echo -e "${YELLOW}└──────────────────────────────────────────────────────────────────────────┘${NC}"
echo ""
else
echo -e "${BLUE}>> No ${browser_name} tabs found <<${NC}"
echo ""
fi
}
# Function for Firefox, which has a different process model
kill_firefox_tabs() {
echo -e "${YELLOW}┌──────────────────────────────────────────────────────────────────────────┐${NC}"
echo -e "${YELLOW}│${NC} ${CYAN}SCANNING${NC}: Looking for ${GREEN}Firefox${NC} tabs... ${YELLOW}│${NC}"
echo -e "${YELLOW}└──────────────────────────────────────────────────────────────────────────┘${NC}"
local ff_tabs_killed=0
local ff_memory_freed=0
display_loading "INITIALIZING SCAN"
pgrep -f -a 'firefox' | grep -v "MainThread" | while read pid cmd; do
# Get memory usage before killing
local mem_info=$(ps -o rss= -p $pid 2>/dev/null)
if [ -n "$mem_info" ]; then
# Convert KB to MB and add to total
local mem_mb=$(convert_to_mb $mem_info)
ff_memory_freed=$(echo "scale=2; $ff_memory_freed + $mem_mb" | bc)
total_memory_freed=$(echo "scale=2; $total_memory_freed + $mem_mb" | bc)
fi
echo -e "${RED}■ TERMINATING${NC} Firefox [PID:$pid] ${YELLOW}(${mem_mb:-0} MB)${NC}"
kill $pid
ff_tabs_killed=$((ff_tabs_killed + 1))
total_tabs_killed=$((total_tabs_killed + 1))
sleep 0.05 # Slow down for visual effect
done
if [ $ff_tabs_killed -gt 0 ]; then
echo -e "${YELLOW}┌──────────────────────────────────────────────────────────────────────────┐${NC}"
echo -e "${YELLOW}│${NC} ${GREEN}COMPLETE${NC}: Firefox - Terminated $ff_tabs_killed processes / Freed ${ff_memory_freed} MB ${YELLOW}│${NC}"
echo -e "${YELLOW}└──────────────────────────────────────────────────────────────────────────┘${NC}"
echo ""
else
echo -e "${BLUE}>> No Firefox tabs found <<${NC}"
echo ""
fi
}
# Clear screen for dramatic effect
clear
# Display banner
display_banner
echo ""
display_box "BROWSER TAB KILLER - MEMORY OPTIMIZER"
echo ""
echo -e "${CYAN}[INFO]${NC} Tabs will remain in place for manual reload when needed"
echo -e "${CYAN}[INFO]${NC} Memory will be freed immediately"
echo ""
sleep 1
# Chromium-based browsers
kill_browser_tabs "Chrome" "chrome"
kill_browser_tabs "Chromium" "chromium"
kill_browser_tabs "Brave" "brave"
kill_browser_tabs "Microsoft Edge" "msedge"
kill_browser_tabs "Opera" "opera"
kill_browser_tabs "Vivaldi" "vivaldi"
# Firefox
kill_firefox_tabs
# Print overall summary with ASCII art frame
echo -e "${GREEN}╔══════════════════════════════════════════════════════════════════════════╗${NC}"
echo -e "${GREEN}║${NC} ${PURPLE}OPERATION COMPLETE${NC} ${GREEN}║${NC}"
echo -e "${GREEN}╠══════════════════════════════════════════════════════════════════════════╣${NC}"
echo -e "${GREEN}║${NC} ▶ Total tabs terminated: ${YELLOW}$total_tabs_killed${NC} ${GREEN}║${NC}"
echo -e "${GREEN}║${NC} ▶ Total memory recovered: ${YELLOW}${total_memory_freed}${NC} MB ${GREEN}║${NC}"
echo -e "${GREEN}╚══════════════════════════════════════════════════════════════════════════╝${NC}"
echo ""
echo -e "${BLUE}System optimized. Press any key to continue...${NC}"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment