Install any skill in seconds. Free to start, no credit card required.
Get Started Free →CRITICAL: Use for Makepad getting started and app structure. Triggers on: makepad, makepad getting started, makepad tutorial, live_design!, app_main!, makepad project setup, makepad hello world, "how to create makepad app", makepad 入门, 创建 makepad 应用, makepad 教程, makepad 项目结构
.claude/skills/sickn33-makepad-basics/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 31% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 34% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 17% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 55% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 23% | 0% |
> Version: makepad-widgets (dev branch) | Last Updated: 2026-01-19 > > Check for updates: https://crates.io/crates/makepad-widgets
You are an expert at the Rust makepad-widgets crate. Help users by:
live_design!, app_main!, or first-screen application wiring.Refer to the local files for detailed documentation:
./references/app-structure.md - Complete app boilerplate and structure./references/event-handling.md - Event handling patternsBefore answering questions, Claude MUST:
/sync-crate-skills makepad --force 更新文档"rustuse makepad_widgets::*; live_design! { use link::theme::*; use link::shaders::*; use link::widgets::*; App = {{App}} { ui: <Root> { main_window = <Window> { body = <View> { width: Fill, height: Fill flow: Down <Label> { text: "Hello Makepad!" } } } } } } app_main!(App); #[derive(Live, LiveHook)] pub struct App { #[live] ui: WidgetRef, } impl LiveRegister for App { fn live_register(cx: &mut Cx) { crate::makepad_widgets::live_design(cx); } } impl AppMain for App { fn handle_event(&mut self, cx: &mut Cx, event: &Event) { self.ui.handle_event(cx, event, &mut Scope::empty()); } }
toml[package] name = "my_app" version = "0.1.0" edition = "2024" [dependencies] makepad-widgets = { git = "https://github.com/makepad/makepad", branch = "dev" }
rustimpl AppMain for App { fn handle_event(&mut self, cx: &mut Cx, event: &Event) { let actions = self.ui.handle_event(cx, event, &mut Scope::empty()); if self.ui.button(id!(my_button)).clicked(&actions) { log!("Button clicked!"); } } }
rust// Get widget references let label = self.ui.label(id!(my_label)); label.set_text("Updated text"); let input = self.ui.text_input(id!(my_input)); let text = input.text();
| Macro/Type | Description | Example | |------------|-------------|---------| | live_design! | Defines UI in DSL | live_design! { App = {{App}} { ... } } | | app_main! | Entry point macro | app_main!(App); | | #[derive(Live)] | Derive live data | #[derive(Live, LiveHook)] | | WidgetRef | Reference to UI tree | #[live] ui: WidgetRef | | Cx | Context for rendering | fn handle_event(&mut self, cx: &mut Cx, ...) | | id!() | Widget ID macro | self.ui.button(id!(my_button)) |
| Platform | Requirements | |----------|--------------| | macOS | Works out of the box | | Windows | Works out of the box | | Linux | apt-get install clang libaudio-dev libpulse-dev libx11-dev libxcursor-dev | | Web | cargo install wasm-pack |
use makepad_widgets::*;live_design! macro for all UI definitionsLiveRegister and AppMain traitsid!() macro for widget referenceshandle_event method| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 10,893 | 8,425 | -23% | 1 | 1 | 0% | 2,387 | 3,119 | +31% | 0 | 0 | — |
case-21 | pass→pass | 10,026 | 7,863 | -22% | 1 | 1 | 0% | 1,924 | 2,803 | +46% | 0 | 0 | — |
case-02 | fail→pass | 11,821 | 9,180 | -22% | 1 | 1 | 0% | 2,400 | 3,218 | +34% | 0 | 0 | — |
case-03 | fail→pass | 13,786 | 7,307 | -47% | 1 | 1 | 0% | 2,510 | 2,943 | +17% | 0 | 0 | — |
case-04 | fail→fail | 12,316 | 4,591 | -63% | 1 | 1 | 0% | 2,357 | 2,127 | -10% | 0 | 0 | — |
case-05 | pass→pass | 7,553 | 6,437 | -15% | 1 | 1 | 0% | 1,529 | 2,421 | +58% | 0 | 0 | — |
case-06 | fail→pass | 6,468 | 2,596 | -60% | 1 | 1 | 0% | 1,107 | 1,712 | +55% | 0 | 0 | — |
case-07 | fail→pass | 10,511 | 4,867 | -54% | 1 | 1 | 0% | 1,759 | 2,158 | +23% | 0 | 0 | — |
case-08 | fail→pass | 9,121 | 5,919 | -35% | 1 | 1 | 0% | 1,718 | 2,426 | +41% | 0 | 0 | — |
case-09 | pass→pass | 8,191 | 3,818 | -53% | 1 | 1 | 0% | 1,455 | 1,977 | +36% | 0 | 0 | — |
case-10 | pass→pass | 3,455 | 3,454 | -0% | 1 | 1 | 0% | 611 | 1,911 | +213% | 0 | 0 | — |
case-11 | fail→pass | 8,399 | 3,261 | -61% | 1 | 1 | 0% | 1,834 | 1,904 | +4% | 0 | 0 | — |
case-12 | fail→pass | 16,079 | 4,732 | -71% | 1 | 1 | 0% | 2,994 | 2,080 | -31% | 0 | 0 | — |
case-13 | fail→pass | 11,024 | 6,528 | -41% | 1 | 1 | 0% | 1,856 | 2,379 | +28% | 0 | 0 | — |
case-14 | pass→pass | 4,903 | 3,787 | -23% | 1 | 1 | 0% | 909 | 2,002 | +120% | 0 | 0 | — |
case-15 | pass→pass | 5,810 | 2,497 | -57% | 1 | 1 | 0% | 958 | 1,690 | +76% | 0 | 0 | — |
case-16 | pass→pass | 8,806 | 5,025 | -43% | 1 | 1 | 0% | 1,318 | 2,094 | +59% | 0 | 0 | — |
case-17 | pass→pass | 3,884 | 4,190 | +8% | 1 | 1 | 0% | 668 | 1,913 | +186% | 0 | 0 | — |
case-18 | pass→pass | 2,821 | 1,911 | -32% | 1 | 1 | 0% | 420 | 1,602 | +281% | 0 | 0 | — |
case-19 | fail→pass | 10,848 | 8,796 | -19% | 1 | 1 | 0% | 1,997 | 3,005 | +50% | 0 | 0 | — |
case-20 | pass→pass | 11,634 | 8,823 | -24% | 1 | 1 | 0% | 2,288 | 3,153 | +38% | 0 | 0 | — |
case-22 | pass→pass | 10,517 | 11,139 | +6% | 1 | 1 | 0% | 2,045 | 3,416 | +67% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +45 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.