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.

Metadata

Release files for plasma-dynamic-wallpaper 0.2.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for plasma-dynamic-wallpaper 0.2.1
File Size Uploaded
plasma_dynamic_wallpaper-0.2.1.tar.gz 49.2 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for plasma-dynamic-wallpaper 0.2.1
File Interpreter ABI Platform
plasma_dynamic_wallpaper-0.2.1-py3-none-any.whl Python 3 none any Details

Total release size: 86.5 kB

Release files / plasma_dynamic_wallpaper-0.2.1.tar.gz

Download URL plasma_dynamic_wallpaper-0.2.1.tar.gz
Size 49.2 kB
Tags Source
SHA-256 checksum
How to use checksums
75f764942cc8fd9a301d3cd0ab9040d6f30efd8eb75ce44696cd96767d53a5a6
BLAKE2b-256 checksum
How to use checksums
dd57d96c5f239791b9d63cd84c4f6c55edfd2e058cb46fcc2a7dd44511e8eedb
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 6, 2026.

Transparency log

Release files / plasma_dynamic_wallpaper-0.2.1-py3-none-any.whl

Download URL plasma_dynamic_wallpaper-0.2.1-py3-none-any.whl
Size 37.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
22d10792fa7989fcdf43baea3aea395a99efc39af2e18f1efcd09f44c013af98
BLAKE2b-256 checksum
How to use checksums
7829566a0aaa07ce996f08fd1132dca59c8259b9ace33557407b0b377ef3be1a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 6, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.2.1 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page