Flutter Linux C++ embedder for desktop and embedded/automotive displays โ Wayland, DRM/KMS, EGL, Vulkan (incl. zero-copy dma-buf), and software backends
386
stars
1,629
commits
C++
primary language
Sep 13, 2026
updated
xdg, agl, ivi and RDK simple shell roles <- docsconfig.toml <- docsPlatformView framework and compositor <- docs
ivi-homescreen-pluginsui_query, ui_tap, ui_set_text, ui_scroll_to, ui_tap_at); no app changes neededihs_mcp_app_toolsThe documentation is organized around the system architecture and the subsystems that implement it:
Building via emb_cli is currently the recommended approach. emb will also automatically install the necessary dependencies for your host system.
See docs below for legacy instructions.
Install emb_cli before proceeding with the build.
# Clone the repository
git clone --recurse-submodules -j8 https://github.com/toyota-connected/ivi-homescreen.git
# Build the project
cd ivi-homescreen
emb cross . --target local --build
To include first-party out-of-tree plugins available via ivi-homescreen-plugins, clone the repository in a sibling folder and configure the necessary CMake variables:
cd ..
git clone https://github.com/toyota-connected/ivi-homescreen-plugins
cd ivi-homescreen
cmake -S . -B build \
-DDISABLE_PLUGINS=OFF \
-DPLUGINS_DIR=../ivi-homescreen-plugins
Alternatively, create an extended emb config that configures the plugin inclusion:
cross:
targets:
rpi5-bookworm:
extends: '../ivi-homescreen#rpi5-bookworm' # โ project target (โ board)
defines: { DISABLE_PLUGINS: 'OFF', PLUGINS_DIR: '../ivi-homescreen-plugins/plugins' }
sysroot: { dev_packages: [ libnl-3-dev ] }
Then run the emb cross command again to build the project with the plugins included.
More info in emb_cli docs: https://github.com/toyota-connected/emb_cli#layered-manifests-extends-board--project--app
Without plugins:
git clone --recurse-submodules -j8 https://github.com/toyota-connected/ivi-homescreen.git
mkdir build && cd build
cmake ../ivi-homescreen -DCMAKE_STAGING_PREFIX=`pwd`/out/usr/local
make install -j
With plugins:
git clone --recurse-submodules -j8 https://github.com/toyota-connected/ivi-homescreen.git
git clone https://github.com/toyota-connected/ivi-homescreen-plugins.git
mkdir build && cd build
cmake ../ivi-homescreen -DCMAKE_STAGING_PREFIX=`pwd`/out/usr/local -DPLUGINS_DIR=`pwd`/ivi-homescreen-plugins
make install -j
Toolchain setup:
wget https://apt.llvm.org/llvm.sh
chmod +x llvm.sh
sudo ./llvm.sh 19
sudo apt-get install -y libc++-19-dev libc++abi-19-dev libunwind-dev
Without plugins:
git clone --recurse-submodules -j8 https://github.com/toyota-connected/ivi-homescreen.git
mkdir build && cd build
CC=/usr/bin/clang CXX=/usr/bin/clang++ cmake ../ivi-homescreen -DCMAKE_STAGING_PREFIX=`pwd`/out/usr/local
make install -j
With plugins:
git clone --recurse-submodules -j8 https://github.com/toyota-connected/ivi-homescreen.git
git clone https://github.com/toyota-connected/ivi-homescreen-plugins.git
mkdir build && cd build
CC=/usr/bin/clang CXX=/usr/bin/clang++ cmake ../ivi-homescreen -DCMAKE_STAGING_PREFIX=`pwd`/out/usr/local -DPLUGINS_DIR=`pwd`/ivi-homescreen-plugins
make install -j
Path prefix used to determine required files is determined at build.
For desktop CMAKE_INSTALL_PREFIX defaults to /usr/local
For target Yocto builds CMAKE_INSTALL_PREFIX defaults to /usr
Below are some of the flags available for configuring the CMake build. Please note the most detailed & up-to-date doucumentation can be found via ARCHITECTURE.md.
ENABLE_XDG_CLIENT - Enable XDG Client. Defaults to ON
ENABLE_AGL_SHELL_CLIENT - Enable AGL Client. Defaults to OFF
ENABLE_IVI_SHELL_CLIENT - Enable ivi-shell Client. Defaults to OFF
ENABLE_SIMPLE_SHELL_CLIENT - Enable RDK/Westeros simple_shell Client. Defaults to OFF
BUILD_BACKEND_WAYLAND_LEASED_DRM - Build the Wayland leased-DRM backend (drm-lease-v1). Must be paired with a renderer tier - see the build matrix. Defaults to OFF
ENABLE_LTO - Enable Link Time Optimization. Defaults to OFF
ENABLE_DLT - Enable DLT logging. Defaults to OFF
BUILD_BACKEND_WAYLAND_EGL - Build Backend for EGL. Defaults to ON
BUILD_EGL_TRANSPARENCY - Build with EGL Transparency Enabled. Defaults to ON
BUILD_EGL_ENABLE_3D - Build with EGL Stencil, Depth, and Stencil config Enabled. Defaults to ON
BUILD_EGL_ENABLE_MULTISAMPLE - Build with EGL Sample set to 4. Defaults to OFF
BUILD_BACKEND_WAYLAND_VULKAN - Build Backend for Vulkan. Declared (default ON) only when BUILD_BACKEND_WAYLAND_EGL=OFF; can still be set explicitly alongside EGL
BUILD_COMPOSITOR - Enable the FlutterCompositor backing-store API so platform-view layers can be interleaved with Flutter UI. See Compositor Mode and Platform Views. Defaults to OFF.
BUILD_COMPOSITOR_DMABUF_EXPORT - When the Vulkan backend is active and BUILD_COMPOSITOR=ON, export each VulkanBackingStore's memory as a DMA-BUF fd so plugins can import it zero-copy (requires VK_KHR_external_memory_fd at runtime; silently falls back to a plain allocation if unavailable). Defaults to OFF.
DEBUG_PLATFORM_MESSAGES - Dump Platform Channel Messages. Defaults to OFF
BUILD_CRASH_HANDLER - Build Sentry IO Crash Handler Support. Defaults to OFF
BUILD_DOCS - Builds Docs. Defaults to OFF
BUILD_UNIT_TESTS - Build Unit Tests. Defaults to OFF
UNIT_TEST_SAVE_GOLDENS - Update test goldens. Defaults to OFF
EXE_OUTPUT_NAME - Set executable output name. Defaults to homescreen
DISABLE_PLUGINS - Disables all plugins located in the plugins folder. Defaults to OFF
BUILD_PLUGIN_AUDIOPLAYERS_LINUX - Include Audioplayers Linux plugin. Defaults to OFF
BUILD_PLUGIN_CAMERA - Include Camera plugin. Defaults to OFF
BUILD_PLUGIN_DESKTOP_WINDOW_LINUX - Includes Desktop Window Linux Plugin. Defaults to OFF
BUILD_PLUGIN_FILE_SELECTOR - Include File Selector plugin. Defaults to OFF
BUILD_PLUGIN_GO_ROUTER - Includes Go Router Plugin. Defaults to ON
BUILD_PLUGIN_GOOGLE_SIGN_IN - Include Google Sign In manager. Defaults to OFF
BUILD_PLUGIN_INTEGRATION_TEST - Included Flutter Integration Test support. Defaults to OFF
BUILD_PLUGIN_PDF - Include PDF plugin. Defaults to OFF
BUILD_PLUGIN_SECURE_STORAGE - Includes Flutter Secure Storage. Defaults to OFF
BUILD_PLUGIN_URL_LAUNCHER - Includes URL Launcher Plugin. Defaults to OFF
BUILD_PLUGIN_VIDEO_PLAYER_LINUX - Include Video Player plugin. Defaults to OFF
BUILD_PLUGIN_FILAMENT_VIEW - Include Filament View plugin. Defaults to OFF
BUILD_PLUGIN_LAYER_PLAYGROUND_VIEW - Include Layer Playground View plugin. Defaults to OFF
BUILD_PLUGIN_NAV_RENDER_VIEW - Include Navigation Render View plugin. Defaults to OFF
BUILD_PLUGIN_WEBIVEW_FLUTTER_VIEW - Includes WebView View Plugin. Defaults to OFF
BUILD_WATCHDOG - Build Watchdog support. Monitors main and render threads for hangs and aborts on timeout. Defaults to OFF
BUILD_SYSTEMD_WATCHDOG - Integrate with systemd watchdog (sd_notify). Requires BUILD_WATCHDOG=ON and a systemd-enabled Linux distro. Defaults to OFF
Each BUILD_BACKEND_* option gates whether that backend is compiled in; any
subset may be enabled together and the active one is chosen at runtime (see
Backend Support).
make package -j
sudo apt install ./ivi-homescreen-1.0.0-Release-beta-Linux-x86_64.deb
A bundle (-b) directory has this structure:
Flutter Application
.desktop-homescreen/
โโโ data
โ โโโ flutter_assets
โ โ โโโ ...
โ โโโ icudtl.dat
โโโ default_config.json (optional)
โโโ lib
โโโ libapp.so
โโโ libflutter_engine.so
Running the bundle above would be:
homescreen --b=`pwd`/.desktop-homescreen
If an override file is not present, it gets loaded from a default location.
icudtl.datBundle Override
{bundle path}/data/icudtl.dat
Yocto Default
/usr/share/flutter/icudtl.dat
Desktop Default
/usr/local/share/flutter/icudtl.dat
libflutter_engine.soBundle Override
{bundle path}/lib/libflutter_engine.so
Yocto/Desktop Default - https://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html
Running via emb_cli is currently the recommended approach.
First, install Flutter via emb.
Then, create a bundle and run it:
<path to ivi-homescreen>/build/shell/homescreen -b <path to bundle>
Running EGL backend on a Lenovo Thinkpad with NVidia drivers may generate many GL runtime errors. This should resolve it:
export __EGL_VENDOR_LIBRARY_FILENAMES=/usr/share/glvnd/egl_vendor.d/50_mesa.json
All CLI flags, the full config.toml reference, the schema walkthrough, the parameter loading order, and multi-display examples now live with the configuration subsystem's documentation:
shell/configuration/README.md.
This project is licensed under the Apache License 2.0 - see the LICENSE file for details.
This package is developed/maintained by the following people
C++
78.4%
Shell
5.8%
Dart
5.1%
C
4.4%
CMake
4.4%
Python
1.8%
Flutter Linux C++ embedder for desktop and embedded/automotive displays โ Wayland, DRM/KMS, EGL, Vulkan (incl. zero-copy dma-buf), and software backends
386
stars
1,629
commits
C++
primary language
Sep 13, 2026
updated
xdg, agl, ivi and RDK simple shell roles <- docsconfig.toml <- docsPlatformView framework and compositor <- docs
ivi-homescreen-pluginsui_query, ui_tap, ui_set_text, ui_scroll_to, ui_tap_at); no app changes neededihs_mcp_app_toolsThe documentation is organized around the system architecture and the subsystems that implement it:
Building via emb_cli is currently the recommended approach. emb will also automatically install the necessary dependencies for your host system.
See docs below for legacy instructions.
Install emb_cli before proceeding with the build.
# Clone the repository
git clone --recurse-submodules -j8 https://github.com/toyota-connected/ivi-homescreen.git
# Build the project
cd ivi-homescreen
emb cross . --target local --build
To include first-party out-of-tree plugins available via ivi-homescreen-plugins, clone the repository in a sibling folder and configure the necessary CMake variables:
cd ..
git clone https://github.com/toyota-connected/ivi-homescreen-plugins
cd ivi-homescreen
cmake -S . -B build \
-DDISABLE_PLUGINS=OFF \
-DPLUGINS_DIR=../ivi-homescreen-plugins
Alternatively, create an extended emb config that configures the plugin inclusion:
cross:
targets:
rpi5-bookworm:
extends: '../ivi-homescreen#rpi5-bookworm' # โ project target (โ board)
defines: { DISABLE_PLUGINS: 'OFF', PLUGINS_DIR: '../ivi-homescreen-plugins/plugins' }
sysroot: { dev_packages: [ libnl-3-dev ] }
Then run the emb cross command again to build the project with the plugins included.
More info in emb_cli docs: https://github.com/toyota-connected/emb_cli#layered-manifests-extends-board--project--app
Without plugins:
git clone --recurse-submodules -j8 https://github.com/toyota-connected/ivi-homescreen.git
mkdir build && cd build
cmake ../ivi-homescreen -DCMAKE_STAGING_PREFIX=`pwd`/out/usr/local
make install -j
With plugins:
git clone --recurse-submodules -j8 https://github.com/toyota-connected/ivi-homescreen.git
git clone https://github.com/toyota-connected/ivi-homescreen-plugins.git
mkdir build && cd build
cmake ../ivi-homescreen -DCMAKE_STAGING_PREFIX=`pwd`/out/usr/local -DPLUGINS_DIR=`pwd`/ivi-homescreen-plugins
make install -j
Toolchain setup:
wget https://apt.llvm.org/llvm.sh
chmod +x llvm.sh
sudo ./llvm.sh 19
sudo apt-get install -y libc++-19-dev libc++abi-19-dev libunwind-dev
Without plugins:
git clone --recurse-submodules -j8 https://github.com/toyota-connected/ivi-homescreen.git
mkdir build && cd build
CC=/usr/bin/clang CXX=/usr/bin/clang++ cmake ../ivi-homescreen -DCMAKE_STAGING_PREFIX=`pwd`/out/usr/local
make install -j
With plugins:
git clone --recurse-submodules -j8 https://github.com/toyota-connected/ivi-homescreen.git
git clone https://github.com/toyota-connected/ivi-homescreen-plugins.git
mkdir build && cd build
CC=/usr/bin/clang CXX=/usr/bin/clang++ cmake ../ivi-homescreen -DCMAKE_STAGING_PREFIX=`pwd`/out/usr/local -DPLUGINS_DIR=`pwd`/ivi-homescreen-plugins
make install -j
Path prefix used to determine required files is determined at build.
For desktop CMAKE_INSTALL_PREFIX defaults to /usr/local
For target Yocto builds CMAKE_INSTALL_PREFIX defaults to /usr
Below are some of the flags available for configuring the CMake build. Please note the most detailed & up-to-date doucumentation can be found via ARCHITECTURE.md.
ENABLE_XDG_CLIENT - Enable XDG Client. Defaults to ON
ENABLE_AGL_SHELL_CLIENT - Enable AGL Client. Defaults to OFF
ENABLE_IVI_SHELL_CLIENT - Enable ivi-shell Client. Defaults to OFF
ENABLE_SIMPLE_SHELL_CLIENT - Enable RDK/Westeros simple_shell Client. Defaults to OFF
BUILD_BACKEND_WAYLAND_LEASED_DRM - Build the Wayland leased-DRM backend (drm-lease-v1). Must be paired with a renderer tier - see the build matrix. Defaults to OFF
ENABLE_LTO - Enable Link Time Optimization. Defaults to OFF
ENABLE_DLT - Enable DLT logging. Defaults to OFF
BUILD_BACKEND_WAYLAND_EGL - Build Backend for EGL. Defaults to ON
BUILD_EGL_TRANSPARENCY - Build with EGL Transparency Enabled. Defaults to ON
BUILD_EGL_ENABLE_3D - Build with EGL Stencil, Depth, and Stencil config Enabled. Defaults to ON
BUILD_EGL_ENABLE_MULTISAMPLE - Build with EGL Sample set to 4. Defaults to OFF
BUILD_BACKEND_WAYLAND_VULKAN - Build Backend for Vulkan. Declared (default ON) only when BUILD_BACKEND_WAYLAND_EGL=OFF; can still be set explicitly alongside EGL
BUILD_COMPOSITOR - Enable the FlutterCompositor backing-store API so platform-view layers can be interleaved with Flutter UI. See Compositor Mode and Platform Views. Defaults to OFF.
BUILD_COMPOSITOR_DMABUF_EXPORT - When the Vulkan backend is active and BUILD_COMPOSITOR=ON, export each VulkanBackingStore's memory as a DMA-BUF fd so plugins can import it zero-copy (requires VK_KHR_external_memory_fd at runtime; silently falls back to a plain allocation if unavailable). Defaults to OFF.
DEBUG_PLATFORM_MESSAGES - Dump Platform Channel Messages. Defaults to OFF
BUILD_CRASH_HANDLER - Build Sentry IO Crash Handler Support. Defaults to OFF
BUILD_DOCS - Builds Docs. Defaults to OFF
BUILD_UNIT_TESTS - Build Unit Tests. Defaults to OFF
UNIT_TEST_SAVE_GOLDENS - Update test goldens. Defaults to OFF
EXE_OUTPUT_NAME - Set executable output name. Defaults to homescreen
DISABLE_PLUGINS - Disables all plugins located in the plugins folder. Defaults to OFF
BUILD_PLUGIN_AUDIOPLAYERS_LINUX - Include Audioplayers Linux plugin. Defaults to OFF
BUILD_PLUGIN_CAMERA - Include Camera plugin. Defaults to OFF
BUILD_PLUGIN_DESKTOP_WINDOW_LINUX - Includes Desktop Window Linux Plugin. Defaults to OFF
BUILD_PLUGIN_FILE_SELECTOR - Include File Selector plugin. Defaults to OFF
BUILD_PLUGIN_GO_ROUTER - Includes Go Router Plugin. Defaults to ON
BUILD_PLUGIN_GOOGLE_SIGN_IN - Include Google Sign In manager. Defaults to OFF
BUILD_PLUGIN_INTEGRATION_TEST - Included Flutter Integration Test support. Defaults to OFF
BUILD_PLUGIN_PDF - Include PDF plugin. Defaults to OFF
BUILD_PLUGIN_SECURE_STORAGE - Includes Flutter Secure Storage. Defaults to OFF
BUILD_PLUGIN_URL_LAUNCHER - Includes URL Launcher Plugin. Defaults to OFF
BUILD_PLUGIN_VIDEO_PLAYER_LINUX - Include Video Player plugin. Defaults to OFF
BUILD_PLUGIN_FILAMENT_VIEW - Include Filament View plugin. Defaults to OFF
BUILD_PLUGIN_LAYER_PLAYGROUND_VIEW - Include Layer Playground View plugin. Defaults to OFF
BUILD_PLUGIN_NAV_RENDER_VIEW - Include Navigation Render View plugin. Defaults to OFF
BUILD_PLUGIN_WEBIVEW_FLUTTER_VIEW - Includes WebView View Plugin. Defaults to OFF
BUILD_WATCHDOG - Build Watchdog support. Monitors main and render threads for hangs and aborts on timeout. Defaults to OFF
BUILD_SYSTEMD_WATCHDOG - Integrate with systemd watchdog (sd_notify). Requires BUILD_WATCHDOG=ON and a systemd-enabled Linux distro. Defaults to OFF
Each BUILD_BACKEND_* option gates whether that backend is compiled in; any
subset may be enabled together and the active one is chosen at runtime (see
Backend Support).
make package -j
sudo apt install ./ivi-homescreen-1.0.0-Release-beta-Linux-x86_64.deb
A bundle (-b) directory has this structure:
Flutter Application
.desktop-homescreen/
โโโ data
โ โโโ flutter_assets
โ โ โโโ ...
โ โโโ icudtl.dat
โโโ default_config.json (optional)
โโโ lib
โโโ libapp.so
โโโ libflutter_engine.so
Running the bundle above would be:
homescreen --b=`pwd`/.desktop-homescreen
If an override file is not present, it gets loaded from a default location.
icudtl.datBundle Override
{bundle path}/data/icudtl.dat
Yocto Default
/usr/share/flutter/icudtl.dat
Desktop Default
/usr/local/share/flutter/icudtl.dat
libflutter_engine.soBundle Override
{bundle path}/lib/libflutter_engine.so
Yocto/Desktop Default - https://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html
Running via emb_cli is currently the recommended approach.
First, install Flutter via emb.
Then, create a bundle and run it:
<path to ivi-homescreen>/build/shell/homescreen -b <path to bundle>
Running EGL backend on a Lenovo Thinkpad with NVidia drivers may generate many GL runtime errors. This should resolve it:
export __EGL_VENDOR_LIBRARY_FILENAMES=/usr/share/glvnd/egl_vendor.d/50_mesa.json
All CLI flags, the full config.toml reference, the schema walkthrough, the parameter loading order, and multi-display examples now live with the configuration subsystem's documentation:
shell/configuration/README.md.
This project is licensed under the Apache License 2.0 - see the LICENSE file for details.
This package is developed/maintained by the following people
C++
78.4%
Shell
5.8%
Dart
5.1%
C
4.4%
CMake
4.4%
Python
1.8%