Modern, lightweight C UI framework

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

keyboard_arrow_down Scroll to explore

Capabilities

Designed for the
most constrained hardware.

Pure C. Works on Espressif and Embedded Linux.

memory

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 ready
widgets

Rich widget library

A broad widget set including buttons, lists, labels, icons, tables, images, maps, textboxes, tabs, dialogs, snackbars, and tooltips, all styleable.

30+ widgets
animation

Smooth animations

Built-in animation engine with easing, property interpolation, and timeline sequencing, optimized for smooth UI transitions on native and WebGL backends.

60 FPS
touch_app

Any input device

Input support for touchscreen, mouse, and keyboard, with scroll containers and gesture-friendly behavior for interactive UIs.

Multi-input
speed

Hardware acceleration

Pluggable graphics backends: GLFW, GLPS, Emscripten WebGL, Vulkan, Android canvas, and support for embedded display accelerators.

GPU support

Developer Experience

Expressive.
Concise C.

Build complex UIs with a clean object-oriented API in pure C. Widgets, styles, events, and animations, composable and predictable.

example.c

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

Runs on
everything.

From small embedded targets to full Linux infotainment systems, one portable C codebase and a shared API.

watch Wearables & Smartwatches
precision_manufacturing Industrial HMI
home_iot_device Smart Home
directions_car Automotive Cluster
ecg_heart Medical Devices
point_of_sale POS & Retail
code Desktop Simulator
public Web via Emscripten
phone_android Android Canvas

Open Source

Start building your
embedded UI today.

MIT licensed. No royalties. Works with your existing toolchain in minutes.