gui_toolkit
gui_toolkit logo

gui_toolkit

A fast, native, immediate-mode GUI toolkit in Odin. You describe the interface in code on every frame; it keeps the state between frames and draws with its own renderer: Direct3D 11 on Windows, Vulkan on Linux.

Windows 10+  ·  Linux (X11, Wayland)  ·  MIT

fidget, the widget gallery
fidget, the widget gallery: 2.4 MB, a frame in under a millisecond of CPU, 0 % at rest.

Immediate mode, retained state

Build the interface every frame with plain procedures; boxes keep their state by key: animations, scroll, focus, text fields. Size kinds, signals and tag-based themes, after the RAD Debugger's UI layers.

Its own renderer

Rounded rects, shadows, gradients, blurs and backdrops, masks, layers, transforms, Slug text from outlines (hinted when small), video; Direct3D 11 on Windows, WebGPU on Linux, damage tracking and a frame pacing model that never stretches a resize.

Text done properly

DirectWrite on Windows, or the native backend everywhere (Fontations, HarfRust, ICU4X): shaping, bidi, grapheme clusters, line breaking, colour emoji (COLR v1, and CBDT on Linux), fallback fonts.

Widgets

Fields and editors (wrapped, highlighted, secret), menus, pickers with fuzzy matching, virtualized tables and trees, splitters, tabs, dialogs, toasts, popovers, charts, drag and drop, find in page.

The platform

Integrated title bars with snap layouts, DPI, IME, clipboard, file dialogs, tray icons, single instance, accessibility through AccessKit; X11 and Wayland on Linux.

Tested

Windowless tests with pixel comparisons on WARP, every package through the WebGPU backend, a Linux job; pinned dependencies (Odin, crates, wgpu-native) by SHA-256. A whole program is driven end to end over the Chrome DevTools Protocol, which Puppeteer, Playwright and your own scripts can use too: clicks, keys, screenshots, the accessibility tree, without touching the mouse. A run can be kept as a timeline, a page with a picture per action and every frame's time, then played back and compared. Chrome's own DevTools attach to a window: its boxes in Elements, their styles and colours edited live, what a screen reader gets for each.

What's new

0.90.0 2026-11-06

  • render.surface_init under_children

0.89.0 2026-11-06

  • ui.tween
  • draw.glyph_run_stroke
  • font.glyph_ink_extent, font.run_ink_spans

0.88.0 2026-11-06

  • Text in a dialog or a popover can be selected

All versions

Start

As a submodule

Add it to your project and point a collection at it; examples/hello is a window in a few lines.

odin build src -collection:gt=ext/gui_toolkit

Built with it

opencode native, a desktop client for opencode (Windows and Linux), and Wren, a web browser.

Getting started