Blender's interface, for your app.

BUI lifts Blender's widgets and the way they feel out of Blender and into a small, fast C library. Keep the syntax you know: tkinter, Qt, Rust, React, Dear ImGui or C.

pip install blenderui

Python 3.11+: tkinter, Qt syntax, components, Dear ImGui

~5 ms first frame40× sooner than gpui-fast0 ms idle CPUSee the numbers
A real BUI window: a Blender modifier stack with collapsible panels, enum rows, number fields, dropdowns, a slider, checkboxes and buttonsA real BUI window: a Blender modifier stack with collapsible panels, enum rows, number fields, dropdowns, a slider, checkboxes and buttons

Starts in milliseconds, then sleeps

Damage rendering redraws only the widget that changed. On the same gpui code, BUI shows its first frame about 5× sooner than gpui and uses a fraction of the CPU.

  • First frame40× sooner

    ~5ms

    BUI~5 ms
    gpui-fast~200 ms

    3000 animated cells

  • Start, same code5.8× faster start

    40ms

    BUI40 ms
    gpui231 ms

    the same gpui code, compiled three ways

  • CPU per frame2.8× less CPU

    11.6ms

    BUI11.6 ms
    gpui-fast31.9 ms + GPU

    3000 cells, GPU renderer

  • Idle CPU per minuteNothing while idle

    0ms

    BUI0 ms
    gpui743 ms

    it sleeps until something changes

First frame

Rust, 3000 animated cells: from launch to the first frame on screen

Lower is better

40×sooner on screen than gpui-fast

  • BUI
  • Others
  • blenderuiGPU renderer~5 ms
  • blenderuiCPU renderer~5 ms
  • gpui-fast~200 ms40× more
  • gpui~220 ms44× more
Open bench
Rust, 3000 animated cells, all apps in the same session
blenderui (GPU)blenderui (CPU)gpui-fastgpui
FPS59.957.631.519.9
CPU per frame11.6 ms22.0 ms31.9 ms + GPU50.5 ms + GPU
RAM40 MB30 MB65 MB77 MB
First frame~5 ms~5 ms~200 ms~220 ms
Idle CPU0 %0–0.9 %0–0.4 %0.9–1.4 %

gpui-fast's heavy-scene frame rate varies between sessions on this laptop (30–60 fps), so compare within one session.

Source: README.md#performance · Ryzen 7 5800U laptop, Windows 11, on AC power

Start time, same gpui code

One gpui-syntax file compiled against each library; median of 10 launches

Lower is better

5.7×faster start than gpui-fast

  • BUI
  • Others
  • blenderuiCPU renderer40 ms
  • blenderuiGPU renderer43 ms
  • gpui-fastGPU226 ms5.7× more
  • gpuiZed's, GPU231 ms5.8× more
Open bench
Start time, the same gpui-syntax file (bindings/rust/bench/common/settings.rs) compiled against each library: median of 10 launches, process start to first frame
Same gpui codeRendererStart timeCPU used to startMemory (idle)Idle CPU per minute
blenderuiCPU40 ms27 ms15 MB0 ms
blenderuiGPU43 ms60 ms31 MB2.1 ms
gpuiGPU231 ms226 ms29 MB743 ms
gpui-fastGPU226 ms217 ms31 MB2.5 ms

gpui has no form widgets, so there the controls are styled divs. Memory doesn't count GPU memory.

Source: README.md#performance · Ryzen 7 5800U laptop, Windows 11, on AC power

CPU per frame

Rust, 3000 animated cells; gpui's numbers don't include its GPU time

Lower is better

2.8×less CPU per frame than gpui-fast

  • BUI
  • Others
  • blenderuiGPU renderer11.6 ms
  • blenderuiCPU renderer22.0 ms
  • gpui-fast31.9 ms + GPU2.8× more
  • gpui50.5 ms + GPU4.4× more
Open bench
Rust, 3000 animated cells, all apps in the same session
blenderui (GPU)blenderui (CPU)gpui-fastgpui
FPS59.957.631.519.9
CPU per frame11.6 ms22.0 ms31.9 ms + GPU50.5 ms + GPU
RAM40 MB30 MB65 MB77 MB
First frame~5 ms~5 ms~200 ms~220 ms
Idle CPU0 %0–0.9 %0–0.4 %0.9–1.4 %

gpui-fast's heavy-scene frame rate varies between sessions on this laptop (30–60 fps), so compare within one session.

Source: README.md#performance · Ryzen 7 5800U laptop, Windows 11, on AC power

RAM

Rust, 3000 animated cells

Lower is better

2.6×less RAM than gpui (CPU renderer)

  • BUI
  • Others
  • blenderuiGPU renderer40 MB
  • blenderuiCPU renderer30 MB
  • gpui-fast65 MB2.2× more
  • gpui77 MB2.6× more
Open bench
Rust, 3000 animated cells, all apps in the same session
blenderui (GPU)blenderui (CPU)gpui-fastgpui
FPS59.957.631.519.9
CPU per frame11.6 ms22.0 ms31.9 ms + GPU50.5 ms + GPU
RAM40 MB30 MB65 MB77 MB
First frame~5 ms~5 ms~200 ms~220 ms
Idle CPU0 %0–0.9 %0–0.4 %0.9–1.4 %

gpui-fast's heavy-scene frame rate varies between sessions on this laptop (30–60 fps), so compare within one session.

Source: README.md#performance · Ryzen 7 5800U laptop, Windows 11, on AC power

Ryzen 7 5800U laptop, Windows 11, on AC power. Measured before the latest features (ImGui, the Linux GPU renderer, the Blender search and expression code) landed. Your numbers will differ; the tools ship with the repo. gpui figures don't include their GPU time.

Every benchmark Method and raw data

Write it the way you already write UI

Five languages, a dozen syntaxes, one C runtime. Every snippet comes from the repository's docs and examples.

Syntax

Your tkinter app, unchanged

Every public tkinter and ttk name is there: 7,846 of 7,846. Run an existing program with blenderui-tk and it wakes up looking like Blender.

greet.py
import blenderui.tksyntax as tk
from blenderui.tksyntax import ttk, messagebox
root = tk.Tk()
name = tk.StringVar(value="Cube")
ttk.Entry(root, textvariable=name).pack(fill="x", padx=8, pady=8)
ttk.Button(root, text="Greet",
command=lambda: messagebox.showinfo("Hi", "Hello " + name.get())).pack()
root.mainloop()
An unmodified tkinter program on BUI: a glTF export dialog with entries, check and radio buttons, a spinbox, an option menu, a scale and a listbox, drawn with Blender's widgetsAn unmodified tkinter program on BUI: a glTF export dialog with entries, check and radio buttons, a spinbox, an option menu, a scale and a listbox, drawn with Blender's widgets
examples/site/tk_export.py, unmodified tkinter

$ pip install blenderui && blenderui-tk my_app.py

Blender's own widgets, as components

Not look-alikes: the number fields, sliders, color picker and node editor are ported from Blender's source, behaviour included.

Try a Blender number field

  1. 1Drag a number sideways to scrub it. Shift is finer, Ctrl snaps.
  2. 2Click a field and type 2*pi or 90/4: Blender's expression evaluator.
  3. 3Ctrl+Z undoes it. A whole drag is one step.
Transform

Location

X
Y
Z
Scale

Render

Drag a number sideways.

A browser sketch of the feel. In BUI these widgets are native, drawn by the C kit.

45 widgets and editors, from Python

Panels, number sliders, the color picker, pie menus, tree views and a node editor: Blender's own, ported from interface_widgets.cc.

object.py
from blenderui.components import App, Panel, NumberSlider, VectorField, Checkbox, ColorSwatch, Button
App("Object", (420, 520),
Panel("Transform",
VectorField("Location", (0.0, 1.25, 0.0)),
NumberSlider("Scale", 1.0, min=0, max=10, on_change=print)),
Panel("Shading",
Checkbox("Shadows", True),
ColorSwatch("Color", (0.8, 0.3, 0.1, 1.0))),
Button("Apply", on_click=lambda: print("apply")),
).run()
Blender components from Python: a Render Properties editor with panels, sub-panels with header checkboxes, number fields, sliders, dropdowns, a color swatch and a progress barBlender components from Python: a Render Properties editor with panels, sub-panels with header checkboxes, number fields, sliders, dropdowns, a color swatch and a progress bar

Blender's interaction rules, in your app

The habits Blender users rely on all day come along for free, in every language BUI speaks.

Pie menus

Press a key, flick toward a choice, release. Point here to aim.

Menu search that gets you

“ad cu” finds Add Cube; typos are forgiven. It's Blender's search, ported, and it also runs this site's .

  • Add Cube
  • Add Cylinder
  • Add Camera
  • Add Light
  • Apply Scale
  • Apply Rotation
  • Shade Smooth
  • Shade Flat
  • Duplicate Objects
  • Delete
  • Join
  • Set Origin to Geometry
  • Snap Cursor to Selected
  • Mark Seam
  • Subdivide

Your fingers already know it

The keyboard habits of Blender users, in every app.

  • steps a valueCtrl+Wheel
  • copy and paste valuesCtrl+C/Ctrl+V
  • resets to the defaultBackspace
  • moves between fieldsTab

Press, drag, release

Menus open on press and pick on release, so a whole choice is one gesture. Drag across checkboxes to set them all.

Multi-field drags

Drag down across X, Y and Z to edit all three at once. Panels collapse with Blender's own animation.

Real Blender code

Widget drawing is a C port of interface_widgets.cc; interaction follows interface_handlers.cc.

Native on Windows and Linux

With macOS written and waiting for its first real Mac.

What runs where
FeatureWindowsLinuxmacOS
WindowNative (Win32)Native (X11; Wayland via XWayland)ExperimentalNative (Cocoa)
Python (pip install)WorksWheelsWorksWheelsWorksWheels
RustWorksWorksBuild from sourceExperimental
JavaScript / ReactWorksPrebuilt on npmWorksBuild the addon from sourcePartialHeadless for now
C, C++, Dear ImGuiWorksWorksExperimental
RendererCPU raster, or GPU (Direct3D 11)CPU raster, or GPU (OpenGL 3.3)CPU raster
HiDPIPer-monitor DPIXft.dpiRetina

ExperimentalThe macOS window host is a port of Blender's Cocoa code (GHOST): written, but not yet run on a Mac. Python can use the standard Tk window there meanwhile (BUI_HOST=tk). If you have a Mac and a free afternoon, you could be the first: the macOS testing guidewalks you through it.

On the roadmap

Honest status: these aren't built yet. Follow along, or pick one up.

  • In progress

    macOS, tested

    The Cocoa host is written but untested. Next: running it on a real Mac (testers welcome), then the GPU renderer and JavaScript windows there.

  • Planned

    WebAssembly

    The kit in the browser: the raster blits to a <canvas>, and React and the DOM-like API run on top, unchanged.

  • Planned

    egui

    BUI panels inside egui apps, plus a Blender-styled egui theme.

  • Planned

    More languages

    MyGo, C#, Go, Zig, Swift, Kotlin and Lua over the same C header; Godot, Unity, Bevy and Flutter.

  • Planned

    Font fallback and IME

    Per-glyph fallback (Blender's BLF), input methods, units in number fields and widget drag and drop.

  • Planned

    Vulkan and WebGPU

    More GPU backends drawing the same instance stream as Direct3D 11 and OpenGL.

  • Soon

    blenderui-imgui on crates.io

    blenderui is on crates.io already. The Dear ImGui crate is next; until then it's a git dependency.

  • In progress

    More Qt

    Model/view classes, docks, toolbars, splitters and Qt stylesheets, on top of today's everyday subset.

The full roadmap

Blender's UI, minus the default cube.