3 releases (breaking)

Uses old Rust 2015

0.3.0 Jun 5, 2018
0.2.0 Feb 15, 2018
0.1.0 Jan 30, 2018

#478 in GUI

Download history 39/week @ 2023-12-14 34/week @ 2023-12-21 9/week @ 2023-12-28 16/week @ 2024-01-04 35/week @ 2024-01-11 31/week @ 2024-01-18 17/week @ 2024-01-25 12/week @ 2024-02-01 28/week @ 2024-02-08 53/week @ 2024-02-15 55/week @ 2024-02-22 49/week @ 2024-02-29 67/week @ 2024-03-07 50/week @ 2024-03-14 64/week @ 2024-03-21 50/week @ 2024-03-28

232 downloads per month
Used in 2 crates

MIT license

37K SLoC

C 14K SLoC // 0.1% comments C++ 10K SLoC // 0.1% comments Objective-C 9K SLoC // 0.1% comments Rust 3.5K SLoC // 0.1% comments Go 136 SLoC Swift 67 SLoC GNU Style Assembly 44 SLoC Shell 17 SLoC // 0.1% comments Batch 7 SLoC

Improved User Interface

A cross-platform UI toolkit for Rust based on libui

libui-rs travis build status libui-rs appveyor build status badge actively developed badge

iui: iui crates.io version badge docs.rs for iui ui-sys: ui-sys crates.io version badge docs.rs for ui-sys

iui is a simple, small, easy to distribute GUI library, a Rusty user interface library that binds to platform native APIs. These are work-in-progress bindings to the minimalistic native UI library [libui][libui] via the ui-sys bindings crate.

Add iui to your project with:

iui = "0.3"


This repository contains multiple Rust crates. Also be sure to look at our changelog and learn how to contribute.

  • iui is the safe Rust wrapper, to be used by most users.
  • ui-sys is the raw unsafe bindings to the libui C code. Requires cmake so it can build libui.
  • libui is included as a submodule.

Based on work by @pcwalton. Licensed MIT.


Three example GUI applications running on Linux

extern crate iui;
use iui::prelude::*;
use iui::controls::{Label, Button, VerticalBox, Group};

fn main() {
    // Initialize the UI library
    let ui = UI::init().expect("Couldn't initialize UI library");
    // Create a window into which controls can be placed
    let mut win = Window::new(&ui, "Test App", 200, 200, WindowType::NoMenubar);

    // Create a vertical layout to hold the controls
    let mut vbox = VerticalBox::new(&ui);
    vbox.set_padded(&ui, true);

    let mut group_vbox = VerticalBox::new(&ui);
    let mut group = Group::new(&ui, "Group");

    // Create two buttons to place in the window
    let mut button = Button::new(&ui, "Button");
    button.on_clicked(&ui, {
        let ui = ui.clone();
        move |btn| {
            btn.set_text(&ui, "Clicked!");

    let mut quit_button = Button::new(&ui, "Quit");
    quit_button.on_clicked(&ui, {
        let ui = ui.clone();
        move |_| {

    // Create a new label. Note that labels don't auto-wrap!
    let mut label_text = String::new();
    label_text.push_str("There is a ton of text in this label.\n");
    label_text.push_str("Pretty much every unicode character is supported.\n");
    label_text.push_str("πŸŽ‰ η”¨ζˆ·η•Œι’ μ‚¬μš©μž μΈν„°νŽ˜μ΄μŠ€");
    let label = Label::new(&ui, &label_text);

    vbox.append(&ui, label, LayoutStrategy::Stretchy);
    group_vbox.append(&ui, button, LayoutStrategy::Compact);
    group_vbox.append(&ui, quit_button, LayoutStrategy::Compact);
    group.set_child(&ui, group_vbox);
    vbox.append(&ui, group, LayoutStrategy::Compact);

    // Actually put the button in the window
    win.set_child(&ui, vbox);
    // Show the window
    // Run the application

Building ui-sys

ui-sys includes libui as a sub-module and allows it to be built on-the-fly with the default features fetch and build. Withfetch disabled, it will simply build the existing sources without updating them, and with build disabled it will build nothing, assuming either a system or local (in ./lib/) version of libui is available.

Note that most of the time, building libui on the fly is what you want. It does however require a copy of cmake, essential build tools, et cetera.