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"