June 24, 2026 by Slint Developers
Slint 1.17 Released 
We're happy to announce Slint 1.17, another big step toward making Slint desktop-ready. This release brings drag and drop, system tray icons, tooltips, and two-way bindings on model rows.
Slint is a toolkit written in Rust, with APIs for Rust, C++, JavaScript, and Python, for building native user interfaces for desktop, embedded, and mobile applications.
Making Slint Desktop-Ready
Back in November we laid out a plan to make Slint desktop-ready. With 1.17 we're checking off four more boxes from that list:
Work on drag and drop, system tray icons, and tooltips was funded by NLnet as part of the Slintify LibrePCB project. We're very grateful for their support.
Drag and Drop
You can now add drag and drop interactions to your Slint apps.
Try the kanban demo live in your browser.
A DragArea marks the source of a drag,
a DropArea marks the target,
and the payload is an opaque data-transfer value that you construct and read in your host language.
export global Api {
pure callback make-transfer(string) -> data-transfer;
pure callback read-transfer(data-transfer) -> string;
}
export component Example inherits Window {
DragArea {
data: Api.make-transfer("Hello World");
allow-copy: true;
Rectangle { background: #f0c000; width: 100px; height: 100px; }
}
drop := DropArea {
x: 150px;
can-drop(event) => DragAction.copy;
dropped(event) => {
debug("Got: ", Api.read-transfer(event.data));
return event.proposed-action;
}
Rectangle {
background: drop.contains-drag ? #80e080 : #a0a0a0;
width: 100px;
height: 100px;
}
}
}
can-drop runs while the drag hovers and returns a DragAction
that drives the cursor and any visual feedback;
dropped runs on release and confirms the action.
A DragArea declares which actions it allows and reacts to the result through drag-finished.
See the drag and drop guide for the full picture.
In this release, drag and drop works within the application. Dragging to other applications and receiving drops from them is in development upstream in winit.
System Tray Icons
Run a quiet background app, display status updates, or expose a quick-action menu from the system tray
with the new SystemTrayIcon element:
export component MyTray inherits SystemTrayIcon {
icon: @image-url("tray.png");
tooltip: "My App";
callback show-window();
callback hide-window();
Menu {
MenuItem {
title: "Show";
activated => { show-window(); }
}
MenuItem {
title: "Hide";
activated => { hide-window(); }
}
}
}
The same SystemTrayIcon works on macOS, Windows, and Linux.
The clip above shows it on Windows.
Tooltips and Radio Groups
Two new widgets that show up everywhere in a real desktop app.
Add a tooltip to any element with the new Tooltip element:
Button {
text: "Save";
Tooltip { text: @markdown("Save the current document (Ctrl+S)"); }
}
And bundle a set of radio buttons with RadioGroup,
which manages selection and keyboard navigation for you:
RadioGroup {
RadioButton { text: "Small"; }
RadioButton { text: "Medium"; checked: true; }
RadioButton { text: "Large"; }
}
Other Changes
Additional items worth highlighting:
- MCP server for AI assistants: a Slint application can now embed a Model Context Protocol server. Once connected, an assistant can inspect a running application through its accessibility tree, drive the UI by injecting mouse, touch, and keyboard input, and capture screenshots to reason about the result. We also ship skills and plugins that teach AI coding assistants how to write Slint code; see the AI coding assistants guide to set them up.
- Remote Slint viewer: a new
--remoteflag connectsslint-viewerto a Slint LSP running on another machine and renders the design locally, so you can edit a.slintfile on your desktop and watch the result on a phone or tablet as you type. The viewer is in beta for Android on Google Play (or grab the APK), and for iOS through TestFlight while the App Store review is underway. - Two-way bindings on model rows: following the two-way bindings on struct fields from Slint 1.15, you can now bind directly to model row data with
text <=> item.name, editing a row in place without bouncing through a callback to write the change back. - Cross-axis alignment on layouts: align children along the cross axis with the new
cross-axis-alignmentproperty onVerticalLayoutandHorizontalLayout(#2587). - A faster Node.js port: on Linux and macOS, Slint now ties its event loop to the libuv file descriptor that Node already polls, so the UI no longer wakes on a timer and idle CPU usage drops to near zero (Windows is still pending). A dedicated blog post on these changes is coming soon.
- C++ on Android: you can now build Slint apps for Android from a C++ codebase. See the Android guide to get started.
- Markdown parsing in native code: the
StyledTextAPI in Rust, C++, JavaScript, and Python now parses markdown at runtime, so you can construct styled text from data your app loads at runtime, not just from.slintliterals. - Drop-shadow improvements: we added
drop-shadow-spreadand a full set ofinner-shadow-*properties toRectangle(Skia only).
For the full picture, see the ChangeLog.
Getting Started with Slint 1.17
- New to Slint? Start here: Get Started
- Upgrading? Follow the steps on our GitHub release page
- Browse the latest docs at https://docs.slint.dev
Don't forget to star us on GitHub, join our Mattermost chat, and share your projects.
Thanks
Big thanks to everyone who contributed code, fixes, or feedback. You help us make Slint better with every release.
@0x6e @1mrnewton @agent10 @amirHdev @bennysj @bowenxuuu @DataTriny @dfaure-kdab @eira-fransham @Eyalm321 @farmaazon @fieran100 @flukejones @GrandAdmiralBee @ImFeH2 @lainon1 @manushT @megabyte6 @npwoods @pepin82 @qarmin @redstrate @ruffsl @stevekwon211 @task-jp @tilladam @ubruhin @wyhaya
Slint is a Rust-based toolkit for creating reactive and fluent user interfaces across a range of targets, from embedded devices with limited resources to powerful mobile devices and desktop machines. Supporting Android, Windows, Mac, Linux, and bare-metal systems, Slint features an easy-to-learn domain-specific language (DSL) that compiles into native code, optimizing for the target device's capabilities. It facilitates collaboration between designers and developers on shared projects and supports business logic development in Rust, C++, JavaScript, or Python.