Build responsive embedded and desktop user interfaces in C. Runs on Web (Emscripten/WebGL), GLFW, Android, ESP32, and Vulkan backends. Includes font rendering, theming, animations, and a rich widget set for automotive and embedded scenarios.
Live example: examples/smartwatch_example
Capabilities
Pure C. Works on Espressif and Embedded Linux.
Tiny hardware footprint
Runs on desktop, embedded Linux, WebAssembly via Emscripten, Android, and constrained devices, portable C code and multiple backends.
check_circle Bare-metal readyRich widget library
A broad widget set including buttons, lists, labels, icons, tables, images, maps, textboxes, tabs, dialogs, snackbars, and tooltips, all styleable.
30+ widgetsSmooth animations
Built-in animation engine with easing, property interpolation, and timeline sequencing, optimized for smooth UI transitions on native and WebGL backends.
60 FPSAny input device
Input support for touchscreen, mouse, and keyboard, with scroll containers and gesture-friendly behavior for interactive UIs.
Multi-inputHardware acceleration
Pluggable graphics backends: GLFW, GLPS, Emscripten WebGL, Vulkan, Android canvas, and support for embedded display accelerators.
GPU supportDeveloper Experience
Build complex UIs with a clean object-oriented API in pure C. Widgets, styles, events, and animations, composable and predictable.
aroma_ui_init();
AromaTheme theme = aroma_theme_create_material_blue();
aroma_ui_set_theme(&theme);
AromaFont *ui_font = aroma_font_create_from_memory(aroma_ubuntu_ttf, aroma_ubuntu_ttf_len, 24);
AromaWindow *window = aroma_ui_create_window("Hello World", WIN_W, WIN_H);
aroma_event_set_root((AromaNode *)window);
aroma_ui_prepare_font_for_window(0, ui_font);
AromaNode *label = aroma_ui_label(
(AromaNode *)window,
"Hello, World!",
WIN_W / 2 - 70, /* x */
WIN_H / 2 - 12, /* y */
LABEL_STYLE_LABEL_LARGE,
ui_font);
aroma_label_set_color(label, theme.colors.text_primary);
while (aroma_ui_is_running())
{
aroma_ui_process_events();
aroma_ui_render(window);
}
aroma_ui_destroy_window(window);
aroma_ui_unload_font(ui_font);
aroma_ui_shutdown();
Supported Platforms
From small embedded targets to full Linux infotainment systems, one portable C codebase and a shared API.