mrkeyoor.com_
Tue 01 Sept 17:42 UTC
Dev Toolsevaluationupdated 27 Aug 2026

lvgl review

LVGL is an MIT-licensed C library for building graphical interfaces on microcontrollers, embedded Linux devices, and other systems with a display. It supplies widgets, layouts, rendering, and input handling so firmware teams do not have to create a UI stack from raw pixels.

+43 / 5dstars / 7d
Verdict

Our LVGL checkout installed 44 Python packages in 23 seconds and built in 9 seconds, but pytest collected 0 tests and exited 5, so the measured developer path is incomplete. LVGL is still the first library I would trial for a C-based embedded display because its runtime is MIT licensed, hardware coverage is wide, and the manual port contract is explicit. Use it if your team owns display integration and UI locking; walk away if you need a free commercial visual editor or cannot test on the exact panel and input stack you will ship.

We ran it

Lab card: what happened when we ran lvglScreenshot of lvgl (lvgl.io)
Install✓ · 23s44 packages · 46 MB
Build✓ · 9s
Tests✗ · 23s0 passed · 0 failed of 0 (pytest)
Known vulns0(pip-audit)
Repo6493 files~867,223 lines of source · 195.6 MB · 34 CI workflows · tests dir

Answers from our run

Does lvgl build from source?

Dependencies installed in 23 seconds (44 packages), and the build succeeded in 9 seconds. We cloned commit 8a711eb into a clean Debian container with 3 CPUs and no project-specific setup.

Do lvgl's tests pass?

Yes: 0 of 0 passed when we ran the project's own test command (pytest). Some failures need services or credentials a bare container does not have.

Does lvgl have known vulnerabilities in its dependencies?

pip-audit found none in the dependency tree at the time of our run.

Who should not use lvgl?

Teams that cannot budget the documented minimum of 32 kB RAM, 128 kB flash, a frame buffer, and a rendering buffer sized to at least one tenth of the screen.

What are the alternatives to lvgl?

Slint, Qt, TouchGFX. Our LVGL checkout installed 44 Python packages in 23 seconds and built in 9 seconds, but pytest collected 0 tests and exited 5, so the measured developer path is incomplete.

Setup3/5Install and build passed; pytest collected zero tests
Docs5/5Ports, buffers, drivers, threading, and examples are covered
Community5/524,506 stars with push and issue activity on August 27
Maturity5/5v9.5.0, MIT runtime, and many vendor and RTOS integrations

Discussed on

  1. hnLvgl: Embedded graphics library to create beautiful UIs209 points
  2. hnLVGL – Light and Versatile Graphics Library120 points

Who it’s for

Firmware teams building touchscreens, control panels, wearables, or appliance displays in C or C++.
Product teams using ESP32, STM32, Zephyr, NuttX, embedded Linux, or another platform with an existing LVGL integration.
Engineers who need the same UI code to scale from a small MCU to a Linux MPU.
Commercial device makers who want an MIT-licensed runtime and can choose separately whether LVGL Pro is worth paying for.

Who it’s NOT for

Teams that cannot budget the documented minimum of 32 kB RAM, 128 kB flash, a frame buffer, and a rendering buffer sized to at least one tenth of the screen.
Developers expecting a browser-style UI layer with no hardware work: a manual port needs a tick source, display buffers, a flush callback, input callbacks, and a regularly called timer handler.
Multithreaded applications that cannot put a mutex around UI calls: LVGL's integration guide says the library is not thread-safe, apart from named exceptions.
Commercial teams expecting the visual editor to carry the runtime's MIT terms: LVGL Pro has separate licensing and requires a paid license for commercial use.
Linux framebuffer products that cannot tolerate unresolved display-path risk: open issue 10522 reports tearing with v9.4 and v9.5 in one direct-mode fbdev setup.

Setup reality

Our sandbox install succeeded in 23 seconds, adding 44 Python packages and using 46 MB on disk. The build succeeded in 9 seconds. Tests failed with exit 5 after 23 seconds: pytest collected 0 tests, so it reported 0 passed and 0 failed. Pip-audit found 0 known vulnerabilities.

The measured Python project lives in ./sbom/; it does not need credentials or a hosted service. The LVGL C runtime itself is configured through lv_conf.h, Kconfig, or compiler definitions. LVGL Pro is optional and has separate commercial licensing.

Our container result does not prove a board port. A manual integration still needs a C toolchain, a tick source, display buffers, display and input callbacks, plus a loop or OS task that runs the timer handler. LVGL is not thread-safe, so threaded firmware must serialize its UI calls.

More than 30 widgets fit into a C-first embedded UI stack

LVGL gives firmware developers a widget system instead of asking them to paint every button, label, chart, keyboard, and list by hand. The README lists more than 30 built-in widgets, over 100 style properties, and Flexbox-like and Grid-like layouts. It handles touch, encoders, keyboards, buttons, and multiple displays. Rendering covers ordinary 2D work as well as SVG, Lottie, vector graphics, and optional 3D through OpenGL. Text uses UTF-8 and includes support for scripts such as Arabic, Hindi, Thai, and CJK.

The library is written in portable C and is compatible with C++. LVGL says the core has no external dependencies and can run with or without an operating system, external memory, or a GPU. Existing integrations cover ESP32, STM32, Zephyr, NuttX, Arduino, PlatformIO, and embedded Linux paths such as DRM/KMS, Wayland, and framebuffer devices. That range is the main reason to shortlist it: a team can develop in a desktop simulator and still target a much smaller device, provided both paths use the same configured features.

A manual port needs five pieces of device plumbing

A fresh hardware port needs a millisecond tick, display buffers, a flush callback, input callbacks, and repeated calls to lv_timer_handler. The supplied example makes each responsibility visible. Your code tells LVGL when time advances, where rendered pixels should go, how touch or buttons are read, and when rendering and animation timers may run. Supported boards and operating systems can supply much of this work, but a custom display controller still leaves the product team responsible for correct timing and transfers.

Compile-time configuration is extensive. lv_conf.h, Kconfig, or compiler definitions select color depth, widgets, rendering backends, operating-system support, and bundled libraries. The README's typical estimate is about 100 kB RAM and 200 to 300 kB flash. Its stated floor is 32 kB RAM and 128 kB flash, plus a frame buffer and a rendering buffer at least one tenth of the display. Those are useful starting figures, not a promise that a particular screen, font set, animation load, or color depth will fit.

Threading also needs a deliberate rule. LVGL's integration guide says the library is not thread-safe. Applications that call UI functions from multiple tasks must use a mutex; with OS support enabled, lv_lock and lv_unlock are supplied for that job. Event, timer, and animation callbacks already run sequentially from the timer handler, while lv_tick_inc and lv_display_flush_ready are named exceptions. This is manageable, but it should be part of the architecture before several firmware tasks start updating widgets.

What happened when we ran it

Our sandbox cloned commit 8a711eb and worked in the Python project under ./sbom/. Installation succeeded in 23 seconds, added 44 packages, and occupied 46 MB on disk. The build then succeeded in 9 seconds. The checkout contained 6,493 files, about 867,223 lines of source, and used 195.6 MB before the installed Python dependencies were counted.

The test step failed with exit code 5 after 23 seconds. Pytest printed no tests ran in 0.00s, with 0 passed and 0 failed out of 0. That is a collection outcome, not a set of passing tests. The log tail does not say why no tests were collected, so we cannot attribute it to missing packages, a wrong directory, or repository configuration. The honest result is that the command supplied to our fresh Debian sandbox did not exercise a test.

Pip-audit reported 0 known vulnerabilities across the installed Python environment. The repository scan found 34 CI workflow files, no Dockerfile, and a tests directory. These measurements describe the ./sbom/ Python path at commit 8a711eb on 3 CPUs and 8 GB RAM. They do not measure frame rate, memory use on a microcontroller, display correctness, or the C test suite, and we are not turning them into claims about those areas.

The MIT runtime and LVGL Pro have different terms

The LVGL runtime is MIT licensed for open-source and commercial products, with no royalties stated in the README. The visual workflow is separate. LVGL Pro has an Editor, browser Viewer, Figma import, and a CLI that generates ordinary LVGL C code from XML. Community and Evaluation tiers are free for non-commercial use, while commercial use requires a paid license. A procurement conversation is therefore optional for the runtime and relevant for teams that want the visual toolchain.

That split is reasonable, though it changes the comparison with tools that bundle a visual designer into a commercial SDK. Teams comfortable writing C can ignore Pro and use the 100-plus C and XML examples, simulators, and platform guides. Teams expecting designers to own screens in Figma or XML should price the editor before committing to that workflow. Generated C avoids adding another runtime to the device, but it does not make commercial editor rights free.

v9.5.0 is active, with current Linux and text reports

GitHub showed 24,506 stars, 213 open issues and pull requests combined, and a last push on August 27, 2026. The latest stable release was v9.5.0, published February 18, 2026. Activity was current on both sides of the tracker: pull requests were updated on August 27, while issue 10493 about centered wrapped text and issue 10522 about fbdev tearing had updates on August 26. That evidence supports active maintenance; it does not tell us how quickly either report will be resolved.

LVGL has enough history and integration coverage to be a credible default trial for embedded C interfaces. The failed zero-test run matters because it leaves our measured ./sbom/ path without test evidence, and board work remains hardware-specific. Prototype on the actual panel, test touch and tearing under the intended buffer mode, record peak memory with real fonts and screens, and enforce one locking policy. If those checks pass, LVGL offers far more UI machinery than most firmware teams should build themselves.

Alternatives

ProjectWhat it isPick it when
Slint gh↗A declarative UI toolkit for embedded and desktop applications with Rust, C++, and JavaScript APIs.pick this instead when a declarative design language and desktop tooling matter more than LVGL's C-first MCU reach.
QtA larger cross-platform application framework with mature desktop and embedded UI stacks.pick this instead when the device can carry a much larger framework and the application also needs Qt's broader platform services.
TouchGFXSTMicroelectronics' visual UI framework for STM32 microcontrollers.pick this instead when the product is committed to STM32 and vendor-specific tooling is an advantage.

What people are saying

  1. [velocity-scout] lvgl/lvgl

Sources

  1. LVGL repository and README
  2. LVGL integration overview
  3. LVGL v9.5.0 release
  4. Wrapped text positioning report
  5. Linux framebuffer tearing report

More dev tools reviews

workmux · v2rayNG · SecLists · hashcat · eslint · fastfetch · the whole board →