diff --git a/README.md b/README.md index 8ee8ecf..c231436 100644 --- a/README.md +++ b/README.md @@ -67,12 +67,51 @@ If you love that vibe — welcome home. --- +## 📋 Prerequisites + +**draphyOS requires Fedora Linux.** Install Fedora first, then run the draphyOS installer. + +### Recommended: Fedora i3 Spin (Best Experience) + +The [Fedora i3 Spin](https://fedoraproject.org/spins/i3/) is the ideal base — minimal, lightweight, and comes with i3 pre-configured. + +1. **Download** → [Fedora i3 Spin](https://fedoraproject.org/spins/i3/) (ISO ~1.8GB) +2. **Create bootable USB** → Use [Fedora Media Writer](https://fedoraproject.org/workstation/download) or [Ventoy](https://ventoy.net/) +3. **Install Fedora** → Boot from USB, follow the installer +4. **Run draphyOS** → After first login, run the install command below + +### Alternative: Other Fedora Variants + +draphyOS also works on other Fedora editions. The installer will set up i3 alongside your existing desktop: + +| Variant | Download | Notes | +|---------|----------|-------| +| **Fedora XFCE Spin** | [Download](https://fedoraproject.org/spins/xfce/) | ⭐ Recommended fallback — lightweight, stable | +| **Fedora Workstation** | [Download](https://fedoraproject.org/workstation/) | GNOME desktop, most popular | +| **Fedora KDE Spin** | [Download](https://fedoraproject.org/spins/kde/) | KDE Plasma desktop | +| **Fedora Server** | [Download](https://fedoraproject.org/server/) | Minimal, headless (add GUI manually) | + +> **💡 Tip:** If you're new to tiling window managers, **Fedora XFCE Spin** is a great choice. XFCE provides a familiar traditional desktop as a fallback if i3 feels overwhelming. You can switch between i3 and XFCE at the login screen (click the gear icon). + +### System Requirements + +| Requirement | Minimum | Recommended | +|-------------|---------|-------------| +| **RAM** | 1 GB | 2 GB+ | +| **Storage** | 10 GB | 20 GB+ | +| **CPU** | Any x86_64 | — | +| **GPU** | Any (Intel/AMD/NVIDIA) | — | + +--- + ## 🚀 Quick Start +> **⚠️ Make sure you have [Fedora installed](#-prerequisites) before proceeding.** + ### One-Command Install ```bash -curl -fsSL https://raw.githubusercontent.com/draphy/draphyOS/latest/install.sh | bash +curl -fsSL https://raw.githubusercontent.com/draphy/draphyOS/main/install.sh | bash ``` Or clone and run: @@ -203,8 +242,6 @@ Every tool in draphyOS was chosen with a purpose. Here's why: | `powertop` | Power management | | `arandr` | Display configuration | | `tmux` | Terminal multiplexer | -| `xarchiver` | Archive manager | -| `nitrogen` | Wallpaper manager | | `lxappearance` | GTK theme switcher | @@ -212,32 +249,32 @@ Every tool in draphyOS was chosen with a purpose. Here's why:
draphyOS Additions -| Package | Description | -| ---------------------- | ----------------------------------- | -| `polybar` | Status bar (replaces i3status) | -| `picom` | Compositor (transparency, shadows) | -| `fish` | Modern shell with auto-suggestions | -| `feh` | Image viewer, wallpaper setter | -| `flameshot` | Screenshot tool | -| `playerctl` | Media player control | -| `xss-lock` | Automatic screen locker | -| `blueman` | Bluetooth manager | -| `redshift` | Night light / blue light filter | -| `geoclue2` | Location services (for redshift) | -| `xfce-polkit` | Authentication dialogs | -| `gnome-keyring` | Password/secret storage | -| `xfce4-settings` | Settings manager | -| `yad` | Calendar popup dialogs | -| `qt5ct` | Qt5 theme configuration | -| `ImageMagick` | Image processing (lock screen blur) | -| `xdotool` | X11 automation | -| `xclip` | Clipboard manager | -| `fira-code-fonts` | Programming font | -| `google-noto-sans-mono-vf-fonts` | Fallback mono font | -| `fontawesome-6-free-fonts` | Icon font (solid) | -| `fontawesome-6-brands-fonts` | Icon font (brands) | -| `mint-y-icons` | Icon theme | -| `adwaita-cursor-theme` | Cursor theme | +| Package | Description | +| -------------------------------- | ----------------------------------- | +| `polybar` | Status bar (replaces i3status) | +| `picom` | Compositor (transparency, shadows) | +| `fish` | Modern shell with auto-suggestions | +| `feh` | Wallpaper setter, image viewer | +| `flameshot` | Screenshot tool | +| `playerctl` | Media player control | +| `xss-lock` | Automatic screen locker | +| `blueman` | Bluetooth manager | +| `redshift` | Night light / blue light filter | +| `geoclue2` | Location services (for redshift) | +| `xfce-polkit` | Authentication dialogs | +| `gnome-keyring` | Password/secret storage | +| `xfce4-settings` | Settings manager | +| `yad` | Calendar popup (click date in bar) | +| `qt5ct` | Qt5 theme configuration | +| `ImageMagick` | Image processing (lock screen blur) | +| `xdotool` | X11 automation (cheatsheet execute) | +| `xclip` | Clipboard (cheatsheet copy) | +| `fira-code-fonts` | Programming font with ligatures | +| `google-noto-sans-mono-vf-fonts` | Fallback mono font | +| `fontawesome-6-free-fonts` | Icon font (polybar icons) | +| `fontawesome-6-brands-fonts` | Icon font (brand logos) | +| `mint-y-icons` | Icon theme | +| `adwaita-cursor-theme` | Cursor theme |
@@ -259,6 +296,126 @@ Every tool in draphyOS was chosen with a purpose. Here's why: --- +## 💡 Productivity Tips + +draphyOS includes several tools to boost your productivity. Here's how to use them: + +
+🎵 Media Controls (playerctl) + +Control any media player (Spotify, Firefox, VLC) with keyboard: +- `Super + >` — Next track +- `Super + <` — Previous track +- `Super + .` — Play/Pause + +Works across all MPRIS-compatible players. + +
+ +
+📸 Screenshots (flameshot) + +- `Print` — Select area and capture +- After capture: annotate, blur, add arrows, copy/save + +Flameshot opens with editing tools. Draw, highlight, then save or copy to clipboard. + +
+ +
+📋 Cheatsheet (Super+F1) + +Interactive cheatsheet with rofi: +- **i3 keybindings**: Press Enter to execute the selected keybinding +- **Other cheatsheets** (vim, git, etc.): Press Enter to copy command to clipboard + +Add your own cheatsheets: create `~/.config/i3/scripts/cheatsheets/myapp.txt` + +
+ +
+📅 Calendar Popup + +Click the **date** in polybar to open a calendar popup (yad). + +
+ +
+🔵 Bluetooth (blueman) + +- Click the Bluetooth icon in system tray +- Or run `blueman-manager` to pair/manage devices + +
+ +
+🌙 Night Light (redshift) + +Automatically adjusts screen warmth based on time of day: +- Uses your location (via geoclue2) to calculate sunrise/sunset +- Reduces blue light at night for better sleep + +Config: `~/.config/redshift/redshift.conf` + +
+ +
+🖥️ Multi-Monitor Setup (arandr) + +- Run `arandr` to visually arrange displays +- Drag monitors to position, set resolution +- Save layout for later use + +
+ +
+🔋 Power Management (powertop) + +- Run `sudo powertop` to analyze power usage +- Use `--auto-tune` for automatic power optimization +- Great for laptops to extend battery life + +
+ +
+🖼️ Wallpaper (feh) + +Change wallpaper: +```bash +feh --bg-fill /path/to/image.jpg +``` + +The wallpaper is set automatically on login via `~/.xprofile`. + +
+ +
+🔐 Password Storage (gnome-keyring) + +Automatically stores: +- Browser passwords (Firefox, Chrome) +- SSH keys (unlocked on login) +- Application secrets + +No setup needed — works automatically with PAM. + +
+ +
+⌨️ Terminal Multiplexer (tmux) + +Split terminal into panes/windows: +- `tmux` — Start new session +- `Ctrl+b %` — Split vertically +- `Ctrl+b "` — Split horizontally +- `Ctrl+b arrow` — Navigate panes + +Great for remote work — sessions persist after disconnect. + +
+ +--- + ## 🗑️ Uninstall ```bash diff --git a/configs/polybar/config.ini b/configs/polybar/config.ini index 3161245..209ec0a 100644 --- a/configs/polybar/config.ini +++ b/configs/polybar/config.ini @@ -170,9 +170,9 @@ interface = eth0 interval = 3.0 ; Connected state - shows wired icon and label -format-connected-prefix = " " +format-connected-prefix = "  " format-connected-prefix-foreground = ${colors.primary} -label-connected = Wired ↓%downspeed% ↑%upspeed% +label-connected = ↓%downspeed% ↑%upspeed% label-connected-foreground = ${colors.foreground} ; Disconnected state - hidden (empty format shows nothing) diff --git a/install.sh b/install.sh index fb4e6a7..187365f 100755 --- a/install.sh +++ b/install.sh @@ -206,6 +206,23 @@ setup_repo() { print_success "draphyOS files ready" } +# Save current package state (for clean uninstall later) +save_package_state() { + print_step "Saving current package state..." + local pkg_state_file="$HOME/.draphyOS-packages-before" + + # Save list of currently installed packages (just package names, no versions) + dnf list installed 2>/dev/null | tail -n +2 | awk '{print $1}' | cut -d'.' -f1 | sort -u > "$pkg_state_file" + + if [ -f "$pkg_state_file" ]; then + local count + count=$(wc -l < "$pkg_state_file") + print_success "Package state saved ($count packages)" + else + print_warning "Could not save package state" + fi +} + # Install packages install_packages() { print_step "Installing required packages..." @@ -638,6 +655,14 @@ configure_vm() { print_step "Applying VM-optimized picom settings..." if [ -f "$picom_config" ]; then + # If it's a symlink, copy to real file for editing (don't modify repo!) + if [ -L "$picom_config" ]; then + local target + target=$(readlink -f "$picom_config") + rm -f "$picom_config" + cp "$target" "$picom_config" + fi + # Change backend from glx to xrender sed -i 's/^backend = "glx";/backend = "xrender";/' "$picom_config" 2>/dev/null || true @@ -677,6 +702,7 @@ main() { # Installation steps setup_repo + save_package_state # Save state BEFORE installing, for clean uninstall install_packages backup_configs install_configs diff --git a/uninstall.sh b/uninstall.sh index f741f40..2ebcc36 100755 --- a/uninstall.sh +++ b/uninstall.sh @@ -124,9 +124,43 @@ remove_configs() { fi fi + # Handle configs that were converted from symlinks to real files + # (polybar/picom are modified during hardware/VM configuration) + # Only remove if no backup exists (meaning draphyOS created them) + local CONVERTED_CONFIGS=( + "$HOME/.config/polybar/config.ini" + "$HOME/.config/picom/picom.conf" + ) + + for config in "${CONVERTED_CONFIGS[@]}"; do + # Skip if it's a symlink (already handled above) or doesn't exist + if [ -L "$config" ] || [ ! -f "$config" ]; then + continue + fi + + # Check if backup exists for this config + local config_name + config_name=$(basename "$(dirname "$config")") + local has_backup=false + + for backup_dir in "$HOME"/.config-backup-*/; do + if [ -d "$backup_dir$config_name" ] || [ -f "$backup_dir$config_name" ]; then + has_backup=true + break + fi + done + + # If no backup, this was created by draphyOS - safe to remove + if [ "$has_backup" = false ]; then + rm -f "$config" 2>/dev/null || true + fi + done + # Remove empty directories ONLY if they're truly empty rmdir "$HOME/.config/i3/scripts" 2>/dev/null || true rmdir "$HOME/.config/polybar/scripts" 2>/dev/null || true + rmdir "$HOME/.config/polybar" 2>/dev/null || true + rmdir "$HOME/.config/picom" 2>/dev/null || true # Don't remove main config dirs - they might have restored configs! print_success "draphyOS symlinks removed" @@ -165,76 +199,144 @@ revert_shell() { fi } -# Remove installed packages (smart detection based on base system) +# Remove installed packages (dynamic - only removes what draphyOS added) remove_packages() { - # Detect base system from marker file + local pkg_state_file="$HOME/.draphyOS-packages-before" local base_system="" local base_variant="" + if [ -f "$MARKER_FILE" ]; then base_system=$(grep "^BASE_SYSTEM=" "$MARKER_FILE" 2>/dev/null | cut -d= -f2) base_variant=$(grep "^BASE_VARIANT=" "$MARKER_FILE" 2>/dev/null | cut -d= -f2) fi - # draphyOS-specific packages (safe to remove on any system) - # These are additions that don't break the base system + # Check if we have saved package state for dynamic removal + if [ -f "$pkg_state_file" ]; then + echo -e "${GREEN}Found package state from before installation${NC}" + echo -e "This allows precise removal of only packages added by draphyOS." + echo "" + echo -e "Do you want to ${RED}remove packages added by draphyOS${NC}? (y/n)" + read -r response /dev/null | tail -n +2 | awk '{print $1}' | cut -d'.' -f1 | sort -u > "$current_pkgs" + + # Find packages that were added (in current but not in before) + local pkgs_to_remove + pkgs_to_remove=$(comm -23 "$current_pkgs" "$pkg_state_file") + + rm -f "$current_pkgs" + + if [ -z "$pkgs_to_remove" ]; then + print_step "No packages to remove (system already at original state)" + return + fi + + # Count and show what will be removed + local count + count=$(echo "$pkgs_to_remove" | wc -l) + echo -e "Found ${YELLOW}$count${NC} packages added by draphyOS" + echo "" + echo -e "Packages to remove:" + echo "$pkgs_to_remove" | head -20 | while read -r pkg; do + echo -e " ${RED}-${NC} $pkg" + done + if [ "$count" -gt 20 ]; then + echo -e " ... and $((count - 20)) more" + fi + echo "" + + echo -e "Proceed with removal? (y/n)" + read -r confirm /dev/null || true + print_success "Packages removed - system restored to pre-install state" + + # Clean up the state file + rm -f "$pkg_state_file" + else + print_step "Package removal cancelled" + fi + else + print_step "Skipping package removal" + fi + else + # Fallback: No saved state - use legacy method + print_warning "No saved package state found (older installation)" + echo -e "Will use predefined package list instead." + echo "" + remove_packages_legacy "$base_system" "$base_variant" + fi +} + +# Legacy package removal (fallback when no state file exists) +remove_packages_legacy() { + local base_system="$1" + local base_variant="$2" + + # Critical system packages that must NEVER be auto-removed + local PROTECTED_PACKAGES=( + xorg-x11-server-Xorg xorg-x11-xinit xorg-x11-drv-libinput + mesa-dri-drivers mesa-vulkan-drivers mesa-libGL + lightdm lightdm-gtk-greeter lightdm-gtk + i3 i3status i3lock dunst rofi rxvt-unicode + NetworkManager dbus-x11 polkit + gtk3 gtk2 adwaita-gtk2-theme adwaita-icon-theme + ) + + # draphyOS-specific packages local DRAPHYOS_PACKAGES=( - # Status bar & compositor (replaces i3status/i3bar) - polybar picom - # Shell - fish - # Utilities added by draphyOS + polybar picom fish feh flameshot playerctl xss-lock xdotool xclip ImageMagick - # Night light & theming redshift geoclue2 yad qt5ct - # Icons & fonts (polybar needs these) mint-y-icons fontawesome-6-free-fonts fontawesome-6-brands-fonts ) - # Core i3/desktop packages (only remove on non-i3 spins if user wants full removal) - # These are needed for i3 to function, or are common desktop utilities + # Core i3 packages (for full removal option) local CORE_I3_PACKAGES=( - # Window manager & related i3 i3lock dunst rofi - # Display manager lightdm lightdm-gtk-greeter - # Terminal rxvt-unicode - # Desktop utilities arandr lxappearance tmux powertop - # Authentication & settings xfce-polkit gnome-keyring xfce4-settings - # Bluetooth - blueman - # Cursor theme - adwaita-cursor-theme + blueman adwaita-cursor-theme ) if [ "$base_system" = "fedora-i3" ]; then - # Fedora i3 Spin - only remove draphyOS additions, keep core working echo -e "${GREEN}Detected: Fedora i3 Spin${NC}" echo -e "Only draphyOS-specific packages will be removed." - echo -e "Core i3 packages will be kept for your system to function." echo "" echo -e "Do you want to ${RED}remove draphyOS packages${NC}? (y/n)" echo -e "${YELLOW}(polybar, picom, fish, redshift, etc.)${NC}" read -r response /dev/null || true + print_step "Removing draphyOS-specific packages..." - sudo dnf remove -y "${DRAPHYOS_PACKAGES[@]}" 2>/dev/null || true + sudo dnf remove -y --noautoremove "${DRAPHYOS_PACKAGES[@]}" 2>/dev/null || true print_success "draphyOS packages removed (core i3 packages kept)" else print_step "Skipping package removal" fi else - # Non-i3 spin (XFCE, Workstation, etc.) - offer full removal option echo -e "${GREEN}Detected: Fedora ${base_variant:-other}${NC}" echo "" echo -e "Choose package removal option:" - echo -e " ${YELLOW}1)${NC} Remove only draphyOS additions (polybar, picom, fish, etc.)" - echo -e " ${YELLOW}2)${NC} Remove ALL i3-related packages (full cleanup)" + echo -e " ${YELLOW}1)${NC} Remove only draphyOS additions" + echo -e " ${YELLOW}2)${NC} Remove ALL i3-related packages" echo -e " ${YELLOW}3)${NC} Skip package removal" echo "" echo -n "Enter choice [1-3]: " @@ -242,22 +344,29 @@ remove_packages() { case "$choice" in 1) + print_step "Protecting critical system packages..." + sudo dnf mark install "${PROTECTED_PACKAGES[@]}" &>/dev/null || true + print_step "Removing draphyOS-specific packages..." - sudo dnf remove -y "${DRAPHYOS_PACKAGES[@]}" 2>/dev/null || true - print_success "draphyOS packages removed (i3 packages kept)" + sudo dnf remove -y --noautoremove "${DRAPHYOS_PACKAGES[@]}" 2>/dev/null || true + print_success "draphyOS packages removed" ;; 2) echo -e "${RED}WARNING: This will remove i3 and all related packages!${NC}" - echo -e "Your system will revert to ${GREEN}${base_variant:-default}${NC} desktop." echo -n "Are you sure? (yes/no): " read -r confirm /dev/null || true + print_step "Removing ALL i3-related packages..." - sudo dnf remove -y "${DRAPHYOS_PACKAGES[@]}" "${CORE_I3_PACKAGES[@]}" 2>/dev/null || true + sudo dnf remove -y --noautoremove "${DRAPHYOS_PACKAGES[@]}" "${CORE_I3_PACKAGES[@]}" 2>/dev/null || true print_success "All i3 packages removed" - echo -e "${YELLOW}Please reboot and select your original desktop at login.${NC}" - else - print_step "Full removal cancelled" fi ;; *) @@ -480,6 +589,7 @@ remove_install_dir() { rm -rf "$INSTALL_DIR" rm -f "$MARKER_FILE" + rm -f "$HOME/.draphyOS-packages-before" 2>/dev/null || true rm -f /tmp/draphyOS-install.log 2>/dev/null || true print_success "Installation removed"