refactor: remove caelestia shell

This commit is contained in:
duma799
2026-04-04 15:23:22 +04:00
parent 1f9568f37b
commit df255c7f2a
8 changed files with 23 additions and 279 deletions
-118
View File
@@ -1,118 +0,0 @@
{{
"name": "pywal",
"flavour": "pywal",
"mode": "dark",
"variant": "tonalspot",
"colours": {{
"primary_paletteKeyColor": "{color4.strip}",
"secondary_paletteKeyColor": "{color5.strip}",
"tertiary_paletteKeyColor": "{color6.strip}",
"neutral_paletteKeyColor": "{color8.strip}",
"neutral_variant_paletteKeyColor": "{color8.strip}",
"background": "{background.strip}",
"onBackground": "{foreground.strip}",
"surface": "{background.strip}",
"surfaceDim": "{background.strip}",
"surfaceBright": "{color8.strip}",
"surfaceContainerLowest": "{color0.strip}",
"surfaceContainerLow": "{color0.strip}",
"surfaceContainer": "{color0.strip}",
"surfaceContainerHigh": "{color8.strip}",
"surfaceContainerHighest": "{color8.strip}",
"onSurface": "{foreground.strip}",
"surfaceVariant": "{color8.strip}",
"onSurfaceVariant": "{color7.strip}",
"inverseSurface": "{foreground.strip}",
"inverseOnSurface": "{background.strip}",
"outline": "{color8.strip}",
"outlineVariant": "{color8.strip}",
"shadow": "000000",
"scrim": "000000",
"surfaceTint": "{color4.strip}",
"primary": "{color4.strip}",
"onPrimary": "{background.strip}",
"primaryContainer": "{color4.strip}",
"onPrimaryContainer": "{foreground.strip}",
"inversePrimary": "{color12.strip}",
"secondary": "{color5.strip}",
"onSecondary": "{background.strip}",
"secondaryContainer": "{color5.strip}",
"onSecondaryContainer": "{foreground.strip}",
"tertiary": "{color6.strip}",
"onTertiary": "{background.strip}",
"tertiaryContainer": "{color6.strip}",
"onTertiaryContainer": "{foreground.strip}",
"error": "{color1.strip}",
"onError": "{background.strip}",
"errorContainer": "{color1.strip}",
"onErrorContainer": "{foreground.strip}",
"primaryFixed": "{color12.strip}",
"primaryFixedDim": "{color4.strip}",
"onPrimaryFixed": "{background.strip}",
"onPrimaryFixedVariant": "{color0.strip}",
"secondaryFixed": "{color13.strip}",
"secondaryFixedDim": "{color5.strip}",
"onSecondaryFixed": "{background.strip}",
"onSecondaryFixedVariant": "{color0.strip}",
"tertiaryFixed": "{color14.strip}",
"tertiaryFixedDim": "{color6.strip}",
"onTertiaryFixed": "{background.strip}",
"onTertiaryFixedVariant": "{color0.strip}",
"term0": "{color0.strip}",
"term1": "{color1.strip}",
"term2": "{color2.strip}",
"term3": "{color3.strip}",
"term4": "{color4.strip}",
"term5": "{color5.strip}",
"term6": "{color6.strip}",
"term7": "{color7.strip}",
"term8": "{color8.strip}",
"term9": "{color9.strip}",
"term10": "{color10.strip}",
"term11": "{color11.strip}",
"term12": "{color12.strip}",
"term13": "{color13.strip}",
"term14": "{color14.strip}",
"term15": "{color15.strip}",
"rosewater": "{color7.strip}",
"flamingo": "{color7.strip}",
"pink": "{color5.strip}",
"mauve": "{color4.strip}",
"red": "{color1.strip}",
"maroon": "{color1.strip}",
"peach": "{color3.strip}",
"yellow": "{color3.strip}",
"green": "{color2.strip}",
"teal": "{color6.strip}",
"sky": "{color6.strip}",
"sapphire": "{color4.strip}",
"blue": "{color4.strip}",
"lavender": "{color4.strip}",
"klink": "{color4.strip}",
"klinkSelection": "{color12.strip}",
"kvisited": "{color5.strip}",
"kvisitedSelection": "{color13.strip}",
"knegative": "{color1.strip}",
"knegativeSelection": "{color9.strip}",
"kneutral": "{color3.strip}",
"kneutralSelection": "{color11.strip}",
"kpositive": "{color2.strip}",
"kpositiveSelection": "{color10.strip}",
"text": "{foreground.strip}",
"subtext1": "{color7.strip}",
"subtext0": "{color8.strip}",
"overlay2": "{color8.strip}",
"overlay1": "{color8.strip}",
"overlay0": "{color8.strip}",
"surface2": "{color8.strip}",
"surface1": "{color0.strip}",
"surface0": "{color0.strip}",
"base": "{background.strip}",
"mantle": "{background.strip}",
"crust": "{color0.strip}",
"success": "{color2.strip}",
"onSuccess": "{background.strip}",
"successContainer": "{color2.strip}",
"onSuccessContainer": "{foreground.strip}"
}}
}}
+4 -18
View File
@@ -1,12 +1,11 @@
# Pywal Integration Guide # Pywal Integration Guide
Dynamic color theming based on your wallpaper, applied system-wide to Hyprland, Caelestia, Kitty, GTK apps, Firefox, and more. Dynamic color theming based on your wallpaper, applied system-wide to Hyprland, Kitty, GTK apps, Firefox, and more.
## Prerequisites ## Prerequisites
- `python-pywal` installed (`sudo pacman -S python-pywal`) - `python-pywal` installed (`sudo pacman -S python-pywal`)
- Hyprland window manager - Hyprland window manager
- Caelestia shell (optional, for full integration)
## Setup ## Setup
@@ -20,7 +19,7 @@ cp -r wal/templates/* ~/.config/wal/templates/
# Verify # Verify
ls ~/.config/wal/templates/ ls ~/.config/wal/templates/
# Should show: hyprland-colors.conf, caelestia-scheme.json # Should show: hyprland-colors.conf
``` ```
### 2. Install Scripts ### 2. Install Scripts
@@ -120,7 +119,6 @@ wal -i /path/to/wallpaper.png --backend haishoku # Another option
| Component | What changes | | Component | What changes |
|-----------|-------------| |-----------|-------------|
| **Hyprland** | Window borders (active gradient, inactive) | | **Hyprland** | Window borders (active gradient, inactive) |
| **Caelestia Shell** | Material Design 3 color scheme, all UI elements |
| **Kitty Terminal** | Background, foreground, all 16 colors | | **Kitty Terminal** | Background, foreground, all 16 colors |
| **Bash/Zsh Shell** | Terminal color palette via sequences | | **Bash/Zsh Shell** | Terminal color palette via sequences |
| **GTK Apps** | Via `wal-gtk` (if installed) | | **GTK Apps** | Via `wal-gtk` (if installed) |
@@ -169,29 +167,23 @@ Available variables: `{color0}` through `{color15}`, `{background}`, `{foregroun
After editing, regenerate with `wal -R`. After editing, regenerate with `wal -R`.
### Caelestia Colors
Edit `~/.config/wal/templates/caelestia-scheme.json` to adjust Material Design 3 color mappings.
## How It Works ## How It Works
1. `wal -i wallpaper.png` generates colors and processes templates in `~/.config/wal/templates/` 1. `wal -i wallpaper.png` generates colors and processes templates in `~/.config/wal/templates/`
2. Generated files land in `~/.cache/wal/` 2. Generated files land in `~/.cache/wal/`
3. `hyprland.conf` sources `~/.cache/wal/hyprland-colors.conf` for border colors 3. `hyprland.conf` sources `~/.cache/wal/hyprland-colors.conf` for border colors
4. `pywal.sh` copies the Caelestia scheme, reloads Hyprland, restarts Caelestia, reloads Kitty, and sets GTK/Firefox themes 4. `pywal.sh` reloads Hyprland, reloads Kitty, and sets GTK/Firefox themes
5. The waypaper hook (`waypaper-hook.sh`) runs this entire chain automatically on wallpaper change 5. The waypaper hook (`waypaper-hook.sh`) runs this entire chain automatically on wallpaper change
## Files ## Files
``` ```
~/.config/wal/templates/ ~/.config/wal/templates/
── hyprland-colors.conf # Template for Hyprland border colors ── hyprland-colors.conf # Template for Hyprland border colors
└── caelestia-scheme.json # Template for Caelestia color scheme
~/.cache/wal/ # Generated by pywal ~/.cache/wal/ # Generated by pywal
├── hyprland-colors.conf # Sourced by hyprland.conf ├── hyprland-colors.conf # Sourced by hyprland.conf
├── colors-kitty.conf # Included by kitty.conf ├── colors-kitty.conf # Included by kitty.conf
├── caelestia-scheme.json # Copied to Caelestia state dir
├── sequences # Loaded by bashrc ├── sequences # Loaded by bashrc
└── colors.json # Full color palette └── colors.json # Full color palette
``` ```
@@ -215,12 +207,6 @@ sed -i 's/kitty-colors.conf/colors-kitty.conf/g' ~/.config/kitty/kitty.conf
killall -SIGUSR1 kitty killall -SIGUSR1 kitty
``` ```
### Caelestia not updating
```bash
pkill caelestia && sleep 0.5 && caelestia shell -d &
```
### Hyprland fails to start (source file not found) ### Hyprland fails to start (source file not found)
Run `wal -i /path/to/wallpaper.png` once to generate initial colors before starting Hyprland. Run `wal -i /path/to/wallpaper.png` once to generate initial colors before starting Hyprland.
+16 -32
View File
@@ -14,7 +14,6 @@ Personal Hyprland configuration focused on productivity and ergonomics.
- Transparency with configurable opacity (active: 0.985, inactive: 0.85) - Transparency with configurable opacity (active: 0.985, inactive: 0.85)
- Smooth custom animations with bezier curves - Smooth custom animations with bezier curves
- **Pywal integration** - Dynamic system-wide colors from wallpaper - **Pywal integration** - Dynamic system-wide colors from wallpaper
- **Caelestia shell** integration for dynamic theming and AI features
### Input ### Input
- 3-finger gestures (horizontal: workspace, vertical: fullscreen) - 3-finger gestures (horizontal: workspace, vertical: fullscreen)
@@ -25,12 +24,12 @@ Personal Hyprland configuration focused on productivity and ergonomics.
### Display Setup ### Display Setup
- Auto-detected monitor configuration (works with any setup out of the box) - Auto-detected monitor configuration (works with any setup out of the box)
- Workspaces 1-4 on external monitor, 5-10 on laptop screen - Workspaces 1-4 on external monitor, 5-10 on laptop screen
- **Monitor handler** - automatically restores wallpaper and Caelestia shell after config reload - **Monitor handler** - automatically restores wallpaper after config reload
### Automation ### Automation
- **Auto-installer** - interactive Python installer handles the entire setup - **Auto-installer** - interactive Python installer handles the entire setup
- **Waypaper hook** - pywal colors auto-apply when wallpaper changes via waypaper GUI - **Waypaper hook** - pywal colors auto-apply when wallpaper changes via waypaper GUI
- **Monitor handler** - listens for Hyprland config reloads and restarts swaybg/Caelestia - **Monitor handler** - listens for Hyprland config reloads and restarts swaybg
- **Fastfetch config** - custom system info display with ASCII art - **Fastfetch config** - custom system info display with ASCII art
--- ---
@@ -50,12 +49,11 @@ python3 ~/hyprduma-config/install.py
The interactive installer handles everything: The interactive installer handles everything:
1. AUR helpers (yay/paru) 1. AUR helpers (yay/paru)
2. Required packages via pacman 2. Required packages via pacman
3. Caelestia shell 3. Config backup and installation
4. Config backup and installation 4. Pywal integration (templates, scripts, bashrc, initial colors)
5. Pywal integration (templates, scripts, bashrc, initial colors) 5. Waypaper hook for automatic color application
6. Waypaper hook for automatic color application 6. Monitor handler for config reload resilience
7. Monitor handler for config reload resilience 7. Fastfetch config with custom ASCII art
8. Fastfetch config with custom ASCII art
--- ---
@@ -82,13 +80,7 @@ cd paru && makepkg -si && cd .. && rm -rf paru
sudo pacman -S hyprland hyprlock hyprshot wlogout kitty waybar swaybg waypaper wofi nautilus wireplumber pipewire-pulse brightnessctl playerctl adwaita-cursors python-pywal fastfetch sudo pacman -S hyprland hyprlock hyprshot wlogout kitty waybar swaybg waypaper wofi nautilus wireplumber pipewire-pulse brightnessctl playerctl adwaita-cursors python-pywal fastfetch
``` ```
### Step 2: Install Caelestia Shell (Recommended) ### Step 2: Clone and Install Config
```bash
yay -S caelestia-shell
```
### Step 3: Clone and Install Config
```bash ```bash
cd ~/Downloads cd ~/Downloads
@@ -112,7 +104,7 @@ mkdir -p ~/Pictures/Screenshots
```bash ```bash
# Copy all scripts # Copy all scripts
mkdir -p ~/.config/hypr/scripts mkdir -p ~/.config/hypr/scripts
cp pywal.sh sync-caelestia-wallpaper.sh waypaper-hook.sh ~/.config/hypr/scripts/ cp pywal.sh waypaper-hook.sh ~/.config/hypr/scripts/
cp monitor-handler.py ~/.config/hypr/scripts/ cp monitor-handler.py ~/.config/hypr/scripts/
chmod +x ~/.config/hypr/scripts/*.sh chmod +x ~/.config/hypr/scripts/*.sh
@@ -198,7 +190,7 @@ Hyprland
**Using waypaper GUI (recommended):** **Using waypaper GUI (recommended):**
- Press `Super+W` to open waypaper - Press `Super+W` to open waypaper
- Select a wallpaper - the **waypaper hook** automatically runs pywal and syncs colors to all components (Hyprland, Caelestia, Kitty, GTK, Firefox) - Select a wallpaper - the **waypaper hook** automatically runs pywal and syncs colors to all components (Hyprland, Kitty, GTK, Firefox)
**Using command line:** **Using command line:**
```bash ```bash
@@ -208,9 +200,8 @@ wal -i /path/to/wallpaper.png && pywal
**How wallpaper management works:** **How wallpaper management works:**
- **swaybg** is the wallpaper backend (not hyprpaper) - **swaybg** is the wallpaper backend (not hyprpaper)
- **waypaper** GUI sets the wallpaper and triggers `waypaper-hook.sh` as a post-command - **waypaper** GUI sets the wallpaper and triggers `waypaper-hook.sh` as a post-command
- The hook runs pywal, syncs Caelestia colors/wallpaper, reloads Hyprland, and updates GTK/Firefox themes - The hook runs pywal, reloads Hyprland, and updates GTK/Firefox themes
- **sync-caelestia-wallpaper.sh** syncs Caelestia's wallpaper reference with swaybg on startup - **monitor-handler.py** listens for config reloads and restores swaybg if it gets killed
- **monitor-handler.py** listens for config reloads and restores swaybg/Caelestia if they get killed
### System-Wide Theme Syncing ### System-Wide Theme Syncing
@@ -243,7 +234,7 @@ Workspace assignment (lines 7-17) distributes workspaces 1-4 to the external mon
### Monitor Handler ### Monitor Handler
The `monitor-handler.py` script runs in the background and listens for Hyprland config reloads. When a reload is detected, it checks if swaybg and Caelestia are still running, and restarts them if needed. This prevents losing your wallpaper or shell after editing the config. The `monitor-handler.py` script runs in the background and listens for Hyprland config reloads. When a reload is detected, it checks if swaybg is still running and restarts it if needed. This prevents losing your wallpaper after editing the config.
### Keyboard Layout ### Keyboard Layout
@@ -262,15 +253,14 @@ hyprduma-config/
├── hyprland.conf # Main Hyprland configuration ├── hyprland.conf # Main Hyprland configuration
├── pywal.sh # Apply pywal colors to all components ├── pywal.sh # Apply pywal colors to all components
├── waypaper-hook.sh # Auto-apply colors on wallpaper change ├── waypaper-hook.sh # Auto-apply colors on wallpaper change
├── sync-caelestia-wallpaper.sh # Sync swaybg wallpaper to Caelestia ├── monitor-handler.py # Restart wallpaper after config reload
├── monitor-handler.py # Restart wallpaper/shell after config reload
├── install.py # Interactive auto-installer ├── install.py # Interactive auto-installer
├── wallpapers/ # Included wallpapers ├── wallpapers/ # Included wallpapers
├── config/ ├── config/
│ ├── kitty/kitty.conf # Kitty terminal config with pywal support │ ├── kitty/kitty.conf # Kitty terminal config with pywal support
│ ├── fastfetch/ # Custom fastfetch config with ASCII art │ ├── fastfetch/ # Custom fastfetch config with ASCII art
│ ├── nvim/ # Neovim config │ ├── nvim/ # Neovim config
│ └── wal/templates/ # Pywal templates for Hyprland & Caelestia │ └── wal/templates/ # Pywal templates for Hyprland
├── KEYBINDS.md # Complete keybindings reference ├── KEYBINDS.md # Complete keybindings reference
└── PYWAL-SETUP.md # Detailed pywal integration guide └── PYWAL-SETUP.md # Detailed pywal integration guide
``` ```
@@ -299,7 +289,7 @@ hyprduma-config/
1. **Check if templates are installed:** 1. **Check if templates are installed:**
```bash ```bash
ls ~/.config/wal/templates/ ls ~/.config/wal/templates/
# Should show: hyprland-colors.conf, caelestia-scheme.json # Should show: hyprland-colors.conf
``` ```
If missing, copy them: If missing, copy them:
@@ -357,12 +347,6 @@ hyprduma-config/
- Check if pywal cache exists: `ls ~/.cache/wal/` - Check if pywal cache exists: `ls ~/.cache/wal/`
- Manually reload: `pywal` - Manually reload: `pywal`
### Caelestia colors not updating
```bash
# Restart Caelestia daemon
pkill caelestia && sleep 0.5 && caelestia shell -d &
```
### Wallpaper not showing after config reload ### Wallpaper not showing after config reload
The monitor handler should restore it automatically. If not: The monitor handler should restore it automatically. If not:
```bash ```bash
-26
View File
@@ -19,8 +19,6 @@ workspace = 10, monitor:eDP-1
# Autostart # Autostart
exec-once = waypaper --restore exec-once = waypaper --restore
exec-once = sleep 1 && ~/.config/hypr/scripts/sync-caelestia-wallpaper.sh
exec-once = sleep 1 && caelestia shell -d
exec-once = python3 ~/.config/hypr/scripts/monitor-handler.py exec-once = python3 ~/.config/hypr/scripts/monitor-handler.py
exec-once = hyprctl setcursor Adwaita 24 exec-once = hyprctl setcursor Adwaita 24
exec-once = mkdir -p $HOME/Pictures/Screenshots exec-once = mkdir -p $HOME/Pictures/Screenshots
@@ -253,30 +251,6 @@ windowrule {
} }
# Layer Rules # Layer Rules
layerrule {
name = Caelestia-drawers
match:title = ^caelestia(drawers|background)$
animation = fade
}
layerrule {
name = drawers
match:namespace = caelestia-drawers
blur = on
}
layerrule {
name = drawers-alpha
match:namespace = caelestia-drawers
ignore_alpha = 0.57
}
layerrule {
name = border-exclusion
match:title = ^caelestia-(border-exclusion|area-picker)$
no_anim = true
}
layerrule { layerrule {
name = wofi name = wofi
match:namespace = wofi match:namespace = wofi
+2 -44
View File
@@ -132,7 +132,7 @@ def install_aur_helpers():
missing.append("paru") missing.append("paru")
if not ask_yn(f"Install AUR helper(s): {', '.join(missing)}?"): if not ask_yn(f"Install AUR helper(s): {', '.join(missing)}?"):
print_warn("Skipping AUR helpers (caelestia-shell will require manual install)") print_warn("Skipping AUR helpers")
return return
run("sudo pacman -S --needed --noconfirm git base-devel") run("sudo pacman -S --needed --noconfirm git base-devel")
@@ -168,44 +168,6 @@ def install_packages():
print_ok("All packages installed") print_ok("All packages installed")
def install_caelestia():
already_installed = cmd_exists("caelestia")
if already_installed:
print_ok("Caelestia shell is already installed")
else:
if not cmd_exists("yay") and not cmd_exists("paru"):
print_warn(
"No AUR helper found - skipping Caelestia (install manually: yay -S caelestia-shell)"
)
return
if not ask_yn("Install Caelestia Shell (recommended for dynamic theming)?"):
print_warn("Skipping Caelestia shell")
return
helper = "yay" if cmd_exists("yay") else "paru"
if run(f"{helper} -S --noconfirm caelestia-shell"):
print_ok("Caelestia shell installed")
else:
print_err(
"Failed to install Caelestia - you can try manually: yay -S caelestia-shell"
)
return
state_dir = Path.home() / ".local" / "state" / "caelestia"
wallpaper_dir = state_dir / "wallpaper"
wallpaper_dir.mkdir(parents=True, exist_ok=True)
print_ok("Created Caelestia state directories (~/.local/state/caelestia/)")
if run("pgrep -x Hyprland", capture=True) is not None:
print_info("Hyprland detected, launching Caelestia shell...")
run("caelestia shell -d &", check=False)
print_ok("Caelestia shell launched")
else:
print_info("Caelestia will start automatically on next Hyprland session")
def make_symlink(src: Path, dst: Path): def make_symlink(src: Path, dst: Path):
"""Create symlink dst -> src, backing up any existing non-symlink at dst.""" """Create symlink dst -> src, backing up any existing non-symlink at dst."""
if dst.is_symlink(): if dst.is_symlink():
@@ -473,7 +435,7 @@ def main():
check_arch() check_arch()
total = 9 total = 8
step = 0 step = 0
step += 1 step += 1
@@ -484,10 +446,6 @@ def main():
print_step(step, total, "Install Required Packages") print_step(step, total, "Install Required Packages")
install_packages() install_packages()
step += 1
print_step(step, total, "Install Caelestia Shell")
install_caelestia()
step += 1 step += 1
print_step(step, total, "Locate/Clone Repository") print_step(step, total, "Locate/Clone Repository")
repo = clone_repo() repo = clone_repo()
+1 -4
View File
@@ -1,5 +1,5 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
# Restarts wallpaper and caelestia shell after hyprland config reload # Restarts wallpaper after hyprland config reload
import os import os
import socket import socket
@@ -21,9 +21,6 @@ def handle_reload():
time.sleep(1) time.sleep(1)
if not is_running("swaybg"): if not is_running("swaybg"):
subprocess.Popen(["waypaper", "--restore"]) subprocess.Popen(["waypaper", "--restore"])
if not is_running("caelestia"):
time.sleep(1)
subprocess.Popen(["caelestia", "shell", "-d"])
def listen(path): def listen(path):
sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
-24
View File
@@ -53,22 +53,6 @@ else
fi fi
fi fi
# Caelestia wallpaper
if [ -f ~/.cache/wal/wal ]; then
WALLPAPER_PATH=$(cat ~/.cache/wal/wal)
mkdir -p ~/.local/state/caelestia/wallpaper
ln -sf "$WALLPAPER_PATH" ~/.local/state/caelestia/wallpaper/current
echo "$WALLPAPER_PATH" > ~/.local/state/caelestia/wallpaper/path.txt
echo "✓ Caelestia wallpaper reference updated"
fi
# Caelestia colors
if [ -f ~/.cache/wal/caelestia-scheme.json ]; then
mkdir -p ~/.local/state/caelestia
cp ~/.cache/wal/caelestia-scheme.json ~/.local/state/caelestia/scheme.json
echo "✓ Caelestia colors updated"
fi
# GTK themes # GTK themes
if command -v wal-gtk &> /dev/null; then if command -v wal-gtk &> /dev/null; then
wal-gtk wal-gtk
@@ -98,14 +82,6 @@ if command -v hyprctl &> /dev/null; then
echo "✓ Hyprland configuration reloaded" echo "✓ Hyprland configuration reloaded"
fi fi
# Caelestia
if pgrep -x "caelestia" > /dev/null; then
pkill caelestia
sleep 0.5
caelestia shell -d &
echo "✓ Caelestia shell restarted"
fi
# Kitty # Kitty
if command -v kitty &> /dev/null; then if command -v kitty &> /dev/null; then
if pgrep -x "kitty" > /dev/null; then if pgrep -x "kitty" > /dev/null; then
-13
View File
@@ -1,13 +0,0 @@
#!/bin/bash
# Sync Caelestia wallpaper with swaybg
WALLPAPER_PATH=$(pgrep -a swaybg | grep -oP '(?<=-i )[^ ]+' | head -1)
if [ -n "$WALLPAPER_PATH" ] && [ -f "$WALLPAPER_PATH" ]; then
mkdir -p ~/.local/state/caelestia/wallpaper
ln -sf "$WALLPAPER_PATH" ~/.local/state/caelestia/wallpaper/current
echo "$WALLPAPER_PATH" > ~/.local/state/caelestia/wallpaper/path.txt
echo "✓ Caelestia wallpaper synced to: $WALLPAPER_PATH"
else
echo "⚠ Could not detect swaybg wallpaper"
fi