Skip to content

Espressif's IoT Development Framework

Slint provides a component ↗ for the Espressif IoT Development Framework ↗.

It has been tested on ESP32-S3 devices.

By default, Slint will use pre-compiled binaries. If for some reason there are no binaries available, the build will fall back to compiling Slint from source and you need to have Rust installed ↗ as well as the Rust toolchains for Espressif SoCs with Xtensa and RISC-V targets ↗.

The following steps will guide from the a bare-bones esp-idf “hello_world” to a GUI with Slint.

  1. Start by creating a new project:
Terminal window
idf.py create-project slint-hello-world
cd slint-hello-world
bash
  1. Select your chipset with idf.py set-target, for example if you’re using an ESP32S3 chipset, run
Terminal window
idf.py set-target esp32s3
bash
  1. Add a Board Support Package ↗ that matches your device as a dependency. For example, if you’re using an ESP-BOX, run
Terminal window
idf.py add-dependency esp-box
bash
  1. Add Slint as a dependency:
Terminal window
idf.py add-dependency slint/slint
bash
  1. Remove main/slint-hello-world.c.
  2. Create a new file main/slint-hello-world.cpp with the following contents:
#include <stdio.h>
#include <esp_err.h>
#include <bsp/esp-bsp.h>
#include <bsp/touch.h>
#include <bsp/display.h>
#include <slint-esp.h>
#if defined(BSP_LCD_DRAW_BUFF_SIZE)
# define DRAW_BUF_SIZE BSP_LCD_DRAW_BUFF_SIZE
#else
# define DRAW_BUF_SIZE (BSP_LCD_H_RES * CONFIG_BSP_LCD_DRAW_BUF_HEIGHT)
#endif
#include "app-window.h"
extern "C" void app_main(void)
{
/* Initialize display */
esp_lcd_panel_io_handle_t io_handle = NULL;
esp_lcd_panel_handle_t panel_handle = NULL;
const bsp_display_config_t bsp_disp_cfg = {
.max_transfer_sz = DRAW_BUF_SIZE * sizeof(uint16_t),
};
bsp_display_new(&bsp_disp_cfg, &panel_handle, &io_handle);
/* Set display brightness to 100% */
bsp_display_backlight_on();
/* Initialize touch */
esp_lcd_touch_handle_t touch_handle = NULL;
const bsp_touch_config_t bsp_touch_cfg = {};
bsp_touch_new(&bsp_touch_cfg, &touch_handle);
/* Allocate a drawing buffer */
static std::vector<slint::platform::Rgb565Pixel> buffer(BSP_LCD_H_RES * BSP_LCD_V_RES);
/* Initialize Slint's ESP platform support*/
slint_esp_init(SlintPlatformConfiguration {
.size = slint::PhysicalSize({ BSP_LCD_H_RES, BSP_LCD_V_RES }),
.panel_handle = panel_handle,
.touch_handle = touch_handle,
.buffer1 = buffer,
.byte_swap = true });
/* Instantiate the UI */
auto ui = AppWindow::create();
/* Show it on the screen and run the event loop */
ui->run();
}
C++
  1. Create main/app-window.slint with the following contents:
import { VerticalBox, AboutSlint } from "std-widgets.slint";
export component AppWindow inherits Window {
VerticalBox {
AboutSlint {}
Text {
text: "Hello World";
font-size: 18px;
horizontal-alignment: center;
}
}
}
plaintext
  1. Edit main/CMakeLists.txt to adjust for the new slint-hello-world.cpp, add slint as required component, and instruction the build system to compile app-window.slint to app-window.h. The file should look like this:
idf_component_register(SRCS "slint-hello-world.cpp" INCLUDE_DIRS "." REQUIRES slint)
slint_target_sources(${COMPONENT_LIB} app-window.slint)
cmake
  1. Open the configuration editor with idf.py menuconfig:

    • Change the stack size under Component config --> ESP System Settings --> Main task stack size to at least 8192. You may need to tweak this value in the future if you run into stack overflows.
    • You may need additional device-specific settings. For example if your device has external SPI RAM, you may need to enable that. For details for ESP32-S3 based devices see how to Configure the PSRAM ↗.
    • Quit the editor with Q and save the configuration.

    Alternatively, check in a default sdkconfig tweaked from your board that adds the right amount of ram, flash, and use CONFIG_MAIN_TASK_STACK_SIZE=8192

  2. Build the project with idf.py build.

  3. Connect your device, then flash and run it with idf.py flash monitor.

  4. Observe Slint rendering “Hello World” on the screen 🎉.

Congratulations, you’re all set up to develop with Slint.

If you run into compile or run-time issues, see the Troubleshooting page.


© 2026 SixtyFPS GmbH