✨ New Features
- Per-sensor thousands separator toggle — Each sensor can now independently display numeric values with comma grouping (e.g. "1234" becomes "1,234") via a new toggle in the sensor properties toolbar.
- Plugin browser — Browse, install, uninstall, and rate community plugins directly from the app without needing to restart. Includes download progress display, changelog view, and star ratings.
- Account page with Discord sign-in — Sign in to your InfoPanel account via Discord to access the plugin marketplace and related features.
- Toast notifications for updates — Windows toast notifications now appear when a new update is available, with a direct link to the Updates page.
- YouTube Live Stream and Windows 11 Now Playing plugins — Two new plugins are available in the plugin registry: one for displaying YouTube live stream HLS URLs, and one for showing currently playing media from Windows 11's Global Media Transport Controls.
- Plugin image support via shared memory (MMF) — Plugins can now provide image data to InfoPanel using memory-mapped file buffers, enabling efficient, double-buffered image sharing between the plugin host and the app.
- Runtime plugin install and uninstall — Plugins can now be installed and removed at runtime without restarting the app.
🚀 Improvements
- Plugin identity via slug — Plugin identity is now tracked using a stable slug stored in a
.hubfile, so plugins are correctly matched even if their folder name changes. - Formatted changelog display — The Updates page now renders markdown-formatted changelogs inline, including section headers, bullet points, and bold text.
- Plugin browser loads automatically on login — The plugin browser now loads its content as soon as you log in, without requiring a manual refresh.
- Download progress display — Plugin and update downloads now show a human-readable status (e.g. "12.4 MB / 50.0 MB") alongside a progress bar.
- DPI-aware hit-testing — Mouse interactions (selection, dragging, item detection) now correctly account for high-DPI display scaling, fixing misaligned hit areas on high-DPI monitors.
- App version via MinVer — The app version is now derived from git tags using MinVer, with consistent display across the UI, update checker, and API reporting. Prerelease versions are handled correctly.
- Async startup — App and engine startup now run asynchronously to avoid blocking the UI thread during initialization.
- Plugin configuration persistence — Plugin settings are now automatically saved and restored from per-plugin JSON files managed by the host, replacing the old shared INI file approach.
- Plugin config stored in AppData — Plugin configuration files are now stored under
%LOCALAPPDATA%\InfoPanel\plugins\for better isolation. - Thread-safe plugin list access — Plugin list operations are now protected with locks and use snapshots to prevent race conditions during concurrent access.
- Plugin image buffer resize support — Plugin image buffers can now be resized at runtime, with changes propagated to the host and UI automatically.
🐛 Bug Fixes
- High-DPI mouse position corrections — Fixed incorrect hit-testing and drag behavior on high-DPI displays by converting mouse positions to device coordinates before use.
- Image buffer and cache race condition fixes — Fixed several issues including bitmap leaks on buffer swap, concurrent cache initialization races, and unsafe image data access across threads.
- Null safety fixes in plugins — Fixed potential
NullReferenceExceptionin WeatherPlugin when the plugin is not yet configured, and tightened boolean config parsing in the plugin host. - Stale plugin entries removed on rebuild — The plugin list now correctly removes entries for plugins that are no longer present when rebuilding view models.
- Image scaling fix — Fixed double-scaling and incorrect dimension calculation in
HttpImageDisplayItem, ensuring images use cached dimensions when available and scale is applied only once. - Animation timer kept alive for plugin images — The animation timer no longer stops when a plugin-provided image is active, preventing static frames.
🔧 Internal
- NSwag-generated API client — Added an auto-generated C# API client for the InfoPanel API, with an OpenAPI spec, NSwag config, wrapper service, and a regeneration script.
- Session management added to API client — API client updated to support listing and revoking auth sessions.
- FlyleafLib bundled as local DLL — FlyleafLib is now referenced as a bundled DLL rather than a NuGet package.
- BitmapSource-based SKImage conversion — Replaced
System.Drawing-based image conversion with a WPFBitmapSourceflow for better compatibility. - Plugin image locking — Added synchronization to
PluginImageWriterto prevent races during buffer swaps, resizes, and disposal. - CI: full git history fetch and release notes generation — The CI workflow now fetches full git history and generates release notes via the InfoPanel API for tagged releases.
- Documentation updates — Added plugin registry docs, plugin architecture guide, naming conventions, release ZIP structure requirements, and expanded
PLUGINS.md. - Dependency updates — Updated
OpenWeatherMap.Cacheto 3.0.0 andFlyleafLib.dll.