Introduction#
We're excited to announce LVGL v9.5. Over the past few releases, we've been systematically expanding what's possible on MPU-class hardware, adding 3D rendering, GPU backends and better driver support, without compromising the lightness and efficiency that make LVGL viable on resource-constrained MCUs. v9.5 continues that trajectory.
This release adds blur and drop shadow rendering that work entirely in software. It brings RISC-V SIMD acceleration for faster software rendering on vector-capable cores. It ships a rewritten Wayland driver with EGL support, a complete NanoVG rendering backend for OpenGL, and runtime glTF manipulation for 3D scenes. And it rounds out the widget API with property interfaces, better theming primitives, and input handling improvements that benefit everyone, MCU or MPU, bare metal or Linux.
Whether you're building a smart home panel on a Cortex-M or a full-blown HMI on a Linux SBC, there's something here for you. Let's walk through what's new.
Visual & Rendering#
Blur and Drop Shadow: A Visual Upgrade for Everyone#
This one landed with a thud, in the best way. v9.5 ships with native blur and drop shadow support, and it works entirely in software. No GPU required.
Drop shadows give depth to overlays, modals, and cards without any tricks.

Blur opens the door to frosted-glass effects, background dimming, and smooth transitions that used to require workarounds or custom draw callbacks. These features are immediately usable on any target LVGL supports, MCU or MPU, bare metal or Linux.

These are one of those additions that make UIs built with LVGL look qualitatively different overnight.
Curved Charts with Bézier Rendering#
Draw smooth Bézier curves between data points instead of straight line segments in a chart by using the new LV_CHART_TYPE_CURVE. Requires Vector Graphics support.

Drivers & Backends#
Wayland: Rewritten from the Ground Up#
The Wayland driver has been completely rewritten. It's cleaner, faster, and now supports a proper set of rendering backends:
SHM (shared memory) backend now supports double-buffered direct mode rendering, which means smoother compositing and lower latency on systems where the GPU isn't available or desirable.
EGL backend is new in this release. With EGL, the Wayland driver gains full hardware-accelerated OpenGL rendering. This is what enables 3D content to run natively on Wayland without any hacks.
The rewritten driver no longer supports client-side window decorations out of the box. If your application needs title bars, close buttons,
or window chrome, you can build them directly with LVGL widgets — lv_win is a natural fit for this.
NanoVG: A Complete OpenGL Rendering Backend#
A new NanoVG rendering backend has been added, which provides a full OpenGL draw unit for LVGL. What this means practically: vector rendering, anti-aliased shapes, gradients, and image compositing can all be handled on the GPU, with no software fallback required for any of these operations.
The NanoVG backend integrates with OpenGL ES and desktop GL, and it auto-initializes when the OpenGL context is available. Combined with the new EGL support across Wayland, DRM, SDL, and GLFW, this creates a coherent GPU rendering story for Linux-class targets.
SDL: EGL Support Added#
SDL now supports EGL as a rendering backend. This completes the picture for developers targeting desktop or embedded Linux platforms: SDL, Wayland, DRM, and GLFW all now have EGL support, which means any of them can host hardware-accelerated or 3D content consistently.
3D Rendering: Now Viable Across All Major Linux Backends#
With EGL landed across the major display backends, building 3D-capable LVGL applications is now straightforward on Linux.
The full list of supported backends for 3D rendering is: SDL, Wayland, DRM, and GLFW.
Beyond the backend work, v9.5 also brings meaningful upgrades to the 3D experience itself:
Runtime glTF model manipulation: you can now read and modify glTF model nodes while the application is running. Scaling, rotation, translation, and animation state are all accessible and mutable at runtime, which enables dynamic 3D scenes rather than just static model viewers.
Raycasting utilities: a new set of functions makes it straightforward to convert between 3D world space and 2D screen coordinates, and to compute ray-object intersections in 3D space. This is the foundation you need for things like hit-testing 3D objects with touch input, tooltips that follow 3D geometry, or any interaction that needs to bridge the 2D UI and 3D scene.

GStreamer: Camera Streams and Audio-Free Sources#
The GStreamer integration now supports sources that have no audio track. This sounds like a small fix, but in practice it means you can now embed a camera stream, or any video-only source, directly into your LVGL application without the pipeline failing. This was a real blocker for a lot of camera-based HMI applications, and it's resolved cleanly in this release.
Widgets, Styles & Platform#
Style and Theme System: More Expressive, More Composable#
The style system received several quality-of-life improvements:
LV_STATE_ALT is a new widget state designed specifically for dark/light mode switching.
Instead of managing two full theme trees, you can now tag styles with LV_STATE_ALT and toggle the entire UI between modes with a single call.

lv_obj_remove_theme and lv_obj_bind_style_prop round out the theme manipulation API. The former lets you cleanly detach a theme from an object;
the latter enables data-driven style binding, which is useful when style properties need to track runtime values.

RISC-V Vector Extension Support#
LVGL now includes RISC-V V extension support for software rendering operations. This brings SIMD acceleration to RISC-V platforms that implement the vector extension, speeding up common drawing tasks like blending, filling.
Enable RISC-V vector acceleration by setting LV_USE_DRAW_SW_ASM to LV_DRAW_SW_ASM_RISCV_V in your lv_conf.h.
Property Interface: Consistent Data Binding Across Widgets#
A large batch of widgets now expose a property interface: arc, bar, switch, checkbox, LED, line, scale, spinbox, spinner, table, tabview, buttonmatrix, span, menu, and chart.
The property interface enables external systems like data binding layers or UI frameworks, to read and write widget state in a uniform way. If you're building your own data binding or reactive UI layer on top of LVGL, this release makes that considerably easier. All the major widgets now speak the same language.
Input Handling Improvements#
Several input-related improvements landed that are worth calling out:
Key remapping: you can now remap keypad keys at the driver level, which is useful when your physical keyboard layout doesn't match what the UI expects. No more remapping in application code.
Gesture threshold API: the thresholds for swipe and gesture recognition are now configurable per-indev, rather than being compile-time constants. This makes it easier to tune gesture sensitivity for different screen sizes and use cases.
Radio buttons: lv_obj_set_radio_button makes it trivial to build radio button groups without managing group exclusivity manually.
Keypad events without an assigned group: previously, keypad events were silently dropped if no group was assigned. Now they're emitted as indev events regardless, which gives application code more flexibility in how it handles raw key input.
WebP Decoder#
LVGL can now decode WebP images natively. Combined with existing support for JPEG (including orientation and CMYK), PNG, GIF, and others, the image format coverage in v9.5 is the most complete it's ever been.
Breaking Changes#
Wayland client-side decorations removed. The rewritten Wayland driver does not support client-side window decorations. Use LVGL widgets (such as lv_win) to implement application-level window chrome if needed.
XML engine removed from the repository. Development of the XML UI engine continues, but outside of the main LVGL repository. We'll share more about this decision and what it means for the roadmap in a separate post.
The following changes may require updates to your application when upgrading to v9.5.
Deprecations#
lv_fragment is deprecated. If you're currently using lv_fragment for view lifecycle management, plan to migrate. It will be removed in a future release.
lv_wayland_display_close_cb_t is deprecated. Bind to LV_EVENT_DELETE on the display returned by lv_wayland_window_create instead.
The following APIs are deprecated and will be removed in a future release. Plan your migration accordingly.
Wrapping Up#
v9.5 is one of the bigger releases in LVGL's recent history. The GPU rendering story is more complete than it's ever been, the visual capabilities of the library have taken a genuine step forward with blur and drop shadow, and the widget API surface is broader and more consistent.
As always, the full changelog is available on GitHub with every commit listed. If you run into issues or have questions, the forum and GitHub issues are the best places to reach the team.
Thanks to everyone who contributed, reporters, reviewers, and coders alike.
