Skip to main content

Plasma Dynamic Wallpaper

CI PyPI Python License KDE Plasma 6

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.

Plasma Dynamic Wallpaper demo

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.timer reconciles the schedule every minute.
  • dynamic-wallpaper-watch.service requests 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

plasma_dynamic_wallpaper-0.2.1.tar.gz (49.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

plasma_dynamic_wallpaper-0.2.1-py3-none-any.whl (37.2 kB view details)

Uploaded Python 3

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

Hashes for plasma_dynamic_wallpaper-0.2.1.tar.gz
Algorithm Hash digest
SHA256 75f764942cc8fd9a301d3cd0ab9040d6f30efd8eb75ce44696cd96767d53a5a6
MD5 2eb765cdd30031470d1d7c47e18183d2
BLAKE2b-256 dd57d96c5f239791b9d63cd84c4f6c55edfd2e058cb46fcc2a7dd44511e8eedb

See more details on using hashes here.

Provenance

The following attestation bundles were made for plasma_dynamic_wallpaper-0.2.1.tar.gz:

Publisher: release.yml on dude297/plasma-dynamic-wallpaper

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file plasma_dynamic_wallpaper-0.2.1-py3-none-any.whl.

File metadata

File hashes

Hashes for plasma_dynamic_wallpaper-0.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 22d10792fa7989fcdf43baea3aea395a99efc39af2e18f1efcd09f44c013af98
MD5 ce8bb66381f7fbdfd78560e6fdb857f0
BLAKE2b-256 7829566a0aaa07ce996f08fd1132dca59c8259b9ace33557407b0b377ef3be1a

See more details on using hashes here.

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

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page