Racket GUI library · MIT · Qt 6 · Three platforms

Real Qt widgets. Written in Racket.

Bezel binds Qt Widgets to Racket through a small, validated C ABI. Write your application in Racket, style it with QSS, and ship self-contained packages on Windows, macOS, and Linux.

Bezel showcase — real Qt widgets rendered headlessly from Racket
Why Bezel

racket/gui is hard to style. Web shells trade away native feel.

Real Qt widgets

Windows, buttons, inputs, lists, tables, trees, tabs, menus, dialogs, layouts — professional-tools UI on Qt Widgets.

QSS styling

Qt's CSS-like styling system on every window — make it look like your product, not like a demo.

Thread-safe by design

Public widget calls from any Racket thread marshal to the GUI thread; timers marshal back automatically.

Agent-friendly verification

widget-grab-png renders real widgets to PNG; CI runs headlessly with Qt's offscreen backend.

Self-contained packages

libbezel, the Qt runtime, and plugins are embedded — end users install with raco pkg install, nothing else.

Ship real applications

raco bezel package produces distributable app folders, installers, signing helpers, and silent self-update.

How it compares

A third path, over Qt Widgets.

A stable C ABI sits under Qt Widgets; the Racket layer on top handles GUI-thread marshaling, signals, lifetime rules, and generated bindings.

Bezel racket/gui Web-based shells
UI toolkit Qt Widgets (native) custom-drawn widgets HTML in a WebView
Styling QSS limited, hard to modernize full CSS
App language Racket Racket Rust or JS/Node
Native look & feel real OS widgets custom look DOM widgets
User installation runtime bundled, nothing extra Racket distribution WebView or bundled Chromium
Quick start

Two commands to a real Qt window.

terminal
# grab the matching zip from GitHub Releases, then: $ raco pkg install --auto --name bezel-lib bezel-lib-windows-x86_64.zip # verify the native runtime end to end $ raco bezel doctor ✓ windows-x86_64 · Qt runtime bundled · ABI verified
hello.rkt
#lang racket/base (require bezel) (make-application #:name "Hello Bezel") (define count (make-label "Clicked 0 times")) (define btn (make-button "Click me")) (connect! btn "clicked()" (lambda (_) (widget-set-text! count "Clicked!"))) (define win (make-window #:title "Hello Bezel" #:size '(320 140))) (layout! win (vbox count btn)) (run win)
Requirements. Racket 8.0+ on a supported release target — Linux x86_64, Windows x86_64, macOS Apple Silicon. Bezel is MIT licensed; redistributed Qt keeps its own license terms.