Plasma Dynamic Wallpaper
Use Apple Dynamic Desktop HEIC wallpapers on KDE Plasma while preserving the
embedded apple_desktop:h24 timeline—or align the same frames with local dawn,
solar noon, and dusk.
Highlights
- Decodes Apple Dynamic Desktop metadata directly.
- Supports embedded and solar-aware schedules.
- Extracts frames once and reuses source-aware caches.
- Reconciles the active wallpaper after login, resume, display changes, and Plasma Shell restarts.
- Handles active multi-monitor layouts and ignores detached containments.
- Includes a managed local wallpaper library.
- Provides user-level systemd timer and watchdog services.
- Offers diagnostics, status, cache maintenance, and dry-run commands.
- Uses atomic state and configuration writes.
- Requires no root access for normal operation.
Quick start
pipx (recommended)
Install the Python package in an isolated environment:
pipx install plasma-dynamic-wallpaper
dynamic-wallpaper --setup
Import and activate a wallpaper:
dynamic-wallpaper install ~/Pictures/Fuji.heic --name fuji
dynamic-wallpaper use fuji
dynamic-wallpaper --force
From source
git clone https://github.com/dude297/plasma-dynamic-wallpaper.git
cd plasma-dynamic-wallpaper
./install.sh
Ubuntu and Kubuntu dependencies:
sudo apt install python3 libimage-exiftool-perl libheif-examples qdbus-qt6
See the installation guide for updating, uninstalling, and native package notes.
Common commands
| Command | Purpose |
|---|---|
dynamic-wallpaper --doctor |
Check dependencies, configuration, and cache access. |
dynamic-wallpaper --current |
Compare the scheduled frame with active Plasma desktops. |
dynamic-wallpaper --schedule |
Show today's resolved embedded or solar schedule. |
dynamic-wallpaper --status |
Show the last successful wallpaper application. |
dynamic-wallpaper --config |
Show resolved paths, screens, and schedule mode. |
dynamic-wallpaper --inspect |
Print decoded Apple metadata. |
dynamic-wallpaper --cache-status |
Check frame-cache freshness and integrity. |
dynamic-wallpaper --rebuild-cache |
Replace cached frames from the source HEIC. |
dynamic-wallpaper --at 18:00 --dry-run |
Preview selection for a specific time. |
dynamic-wallpaper --startup |
Wait for Plasma and reapply the current frame. |
dynamic-wallpaper --force --verbose |
Force an update with detailed diagnostics. |
Managed wallpapers
dynamic-wallpaper install ~/Pictures/Fuji.heic --name fuji
dynamic-wallpaper install ~/Pictures/Sonoma.heic --name sonoma
dynamic-wallpaper list
dynamic-wallpaper use sonoma
dynamic-wallpaper remove fuji
Each managed wallpaper receives an isolated source directory and cache. The
active entry is marked with * in dynamic-wallpaper list.
Scheduling
Embedded schedule
The default mode follows the transition times stored in Apple's HEIC metadata:
SCHEDULE_MODE=embedded
Solar-aware schedule
Solar mode preserves the original frame order but maps its day anchors to local civil dawn, solar noon, and civil dusk:
SCHEDULE_MODE=solar
LATITUDE=37.3382
LONGITUDE=-121.8863
Coordinates are decimal degrees; west longitudes are negative. The calculation is local and does not require network access. At polar dates without civil dawn or dusk, the command reports an actionable error rather than silently choosing an incorrect frame.
Inspect the resolved timeline with:
dynamic-wallpaper --schedule
dynamic-wallpaper --current
Multi-monitor behavior
By default, all currently active Plasma screens are detected automatically.
Detached containments reported as screen=-1 are ignored and retried when they
become active again. To restrict updates, set explicit screen IDs:
SCREEN_IDS=0,1
Reliability services
dynamic-wallpaper --setup installs two user services:
dynamic-wallpaper.timerreconciles the schedule every minute.dynamic-wallpaper-watch.servicerequests immediate recovery after Plasma returns on D-Bus or the machine resumes from sleep.
Useful checks:
systemctl --user status dynamic-wallpaper.timer --no-pager
systemctl --user status dynamic-wallpaper-watch.service --no-pager
journalctl --user -u dynamic-wallpaper.service -n 50 --no-pager
journalctl --user -u dynamic-wallpaper-watch.service -n 50 --no-pager
How it works
Apple HEIC
│
▼
metadata decoder ──► embedded or solar scheduler
│ │
▼ ▼
source-aware frame cache ─► selected PNG
│
▼
Plasma D-Bus adapter
│
▼
active desktop containments
The engine verifies Plasma's read-back response before saving state. Unique render aliases avoid stale image-provider caches, while active aliases are protected from cleanup.
More detail: Architecture.
Troubleshooting
Start with:
dynamic-wallpaper --doctor
dynamic-wallpaper --current
| Symptom | First check |
|---|---|
| Wallpaper did not change | dynamic-wallpaper --force --verbose |
| Default wallpaper after login | journalctl --user -u dynamic-wallpaper.service -b |
| Recovery after sleep failed | Check dynamic-wallpaper-watch.service. |
| A monitor is skipped | Check Plasma screen IDs with --current; detached screens are expected to be inactive. |
| Cache looks damaged | Run dynamic-wallpaper --cache-status, then --rebuild-cache. |
| Solar schedule looks wrong | Verify latitude, longitude, local time zone, and --schedule. |
See Troubleshooting and FAQ.
Development
python -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade pip
python -m pip install -e ".[dev]"
make check
python -m build
python -m twine check dist/*
Contribution and live-Plasma testing guidance:
Roadmap
- v0.3: release polish, native packaging, richer diagnostics.
- v0.4: native KDE configuration UI and previews.
- v0.5: optional GeoClue-based location discovery and additional desktop backends.
Automatic location discovery is intentionally deferred: solar mode currently uses explicit coordinates, stays offline, and avoids unexpected location access.
License
Released under the MIT License.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file plasma_dynamic_wallpaper-0.2.1.tar.gz.
File metadata
- Download URL: plasma_dynamic_wallpaper-0.2.1.tar.gz
- Upload date:
- Size: 49.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
75f764942cc8fd9a301d3cd0ab9040d6f30efd8eb75ce44696cd96767d53a5a6
|
|
| MD5 |
2eb765cdd30031470d1d7c47e18183d2
|
|
| BLAKE2b-256 |
dd57d96c5f239791b9d63cd84c4f6c55edfd2e058cb46fcc2a7dd44511e8eedb
|
Provenance
The following attestation bundles were made for plasma_dynamic_wallpaper-0.2.1.tar.gz:
Publisher:
release.yml on dude297/plasma-dynamic-wallpaper
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
plasma_dynamic_wallpaper-0.2.1.tar.gz -
Subject digest:
75f764942cc8fd9a301d3cd0ab9040d6f30efd8eb75ce44696cd96767d53a5a6 - Sigstore transparency entry: 2358994743
- Sigstore integration time:
-
Permalink:
dude297/plasma-dynamic-wallpaper@81c005c75061cdeb421b473f46aff7ec70c5a1a2 -
Branch / Tag:
refs/tags/v0.2.1 - Owner: https://github.com/dude297
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@81c005c75061cdeb421b473f46aff7ec70c5a1a2 -
Trigger Event:
push
-
Statement type:
File details
Details for the file plasma_dynamic_wallpaper-0.2.1-py3-none-any.whl.
File metadata
- Download URL: plasma_dynamic_wallpaper-0.2.1-py3-none-any.whl
- Upload date:
- Size: 37.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
22d10792fa7989fcdf43baea3aea395a99efc39af2e18f1efcd09f44c013af98
|
|
| MD5 |
ce8bb66381f7fbdfd78560e6fdb857f0
|
|
| BLAKE2b-256 |
7829566a0aaa07ce996f08fd1132dca59c8259b9ace33557407b0b377ef3be1a
|
Provenance
The following attestation bundles were made for plasma_dynamic_wallpaper-0.2.1-py3-none-any.whl:
Publisher:
release.yml on dude297/plasma-dynamic-wallpaper
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
plasma_dynamic_wallpaper-0.2.1-py3-none-any.whl -
Subject digest:
22d10792fa7989fcdf43baea3aea395a99efc39af2e18f1efcd09f44c013af98 - Sigstore transparency entry: 2358994829
- Sigstore integration time:
-
Permalink:
dude297/plasma-dynamic-wallpaper@81c005c75061cdeb421b473f46aff7ec70c5a1a2 -
Branch / Tag:
refs/tags/v0.2.1 - Owner: https://github.com/dude297
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@81c005c75061cdeb421b473f46aff7ec70c5a1a2 -
Trigger Event:
push
-
Statement type: