I'm tired of waiting for a solution from Apple for several years now, and several major OS releases have already taken place, but the annoying bug hasn't been fixed.
I want dynamic wallpapers and to disable animations to speed up the OS. Why does the standard functionality in my own OS conflict with each other?!
Well then let's fix it ourselves.
**The idea:** replace system dynamic wallpapers with a simple launchd script that
rotates static wallpapers on a schedule. Zero conflict with the system, zero CPU load.
> ⚠️ Key discovery: use `Finder` to set the wallpaper, NOT `System Events` —
> System Events silently fails to update the wallpaper visually in macOS Tahoe.
---
## Step 1 — Create the script
```bash
mkdir -p ~/Scripts
cat > ~/Scripts/wallpaper.sh << 'SCRIPT'
#!/bin/bash
WALLPAPERS_DIR="$HOME/Pictures/wallpapers" # put your folder here
IMAGES=()
while IFS= read -r -d '' file; do
IMAGES+=("$file")
done < <(find "$WALLPAPERS_DIR" -maxdepth 1 -type f \( -iname "*.jpg" -o -iname "*.jpeg" -o -iname "*.png" -o -iname "*.heic" \) -print0)
COUNT=${#IMAGES[@]}
if [ "$COUNT" -eq 0 ]; then
echo "$(date): No images found in $WALLPAPERS_DIR" >> /tmp/wallpaper-changer.log
exit 1
fi
RANDOM_IMG="${IMAGES[$RANDOM % $COUNT]}"
osascript -e "tell application \"Finder\" to set desktop picture to POSIX file \"$RANDOM_IMG\""
echo "$(date): Set → $RANDOM_IMG" >> /tmp/wallpaper-changer.log
SCRIPT
chmod +x ~/Scripts/wallpaper.sh
```
## Step 2 — Create the launchd agent (autostart + schedule)
```bash
cat > ~/Library/LaunchAgents/com.wallpaper.changer.plist << 'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.wallpaper.changer</string>
<key>ProgramArguments</key>
<array>
<string>/bin/bash</string>
<string>/Users/YOUR_USERNAME/Scripts/wallpaper.sh</string>
</array>
<key>StartInterval</key>
<integer>900</integer>
<key>RunAtLoad</key>
<true/>
<key>StandardOutPath</key>
<string>/tmp/wallpaper-changer.log</string>
<key>StandardErrorPath</key>
<string>/tmp/wallpaper-changer.log</string>
</dict>
</plist>
EOF
```
Replace `YOUR_USERNAME` with your actual username (check with: `whoami`)
## Step 3 — Activate
```bash
launchctl load ~/Library/LaunchAgents/com.wallpaper.changer.plist
```
## Verify it works
```bash
# Is the agent running?
launchctl list | grep wallpaper
# Wallpaper change log
cat /tmp/wallpaper-changer.log
```
---
## Settings
| What to change | Where |
|---|---|
| Wallpapers folder | `WALLPAPERS_DIR` in wallpaper.sh |
| Change interval | `StartInterval` in plist (seconds: 900 = 15 min) |
## Stop / remove
```bash
launchctl unload ~/Library/LaunchAgents/com.wallpaper.changer.plist
rm ~/Library/LaunchAgents/com.wallpaper.changer.plist
rm ~/Scripts/wallpaper.sh
```
---
Tested on macOS Tahoe 26.
Apple, you should be ashamed!