zhanghandong/makepad-2.0-migration
| makepad migration, live_design to script_mod, makepad upgrade, makepad 1.x, old syntax, new syntax, makepad breaking changes, makepad 迁移, 旧语法, LiveHook to ScriptHook, apply_over to script_apply_eval, Live to Script, live_design!, angle brackets to curly braces
npx skills add https://github.com/ZhangHanDong/makepad-skills --skill makepad-2.0-migration
> Version: makepad-widgets (dev branch) | Last Updated: 2026-03-03
Makepad 2.0 is a fundamental architecture shift from compile-time static DSL to runtime scripting. Migration involves syntax changes, derive macro updates, lifecycle method renames, and new patterns for state management.
Refer to the local files for detailed documentation:
./references/migration-guide.md - Complete migration reference with examples| Makepad 1.x | Makepad 2.0 | Notes |
|-------------|-------------|-------|
| live_design! { ... } | script_mod! { ... } | Core macro change |
| <Widget> { ... } | Widget{ ... } | No angle brackets |
| Key = Value | Key: value | Colon, not equals |
| (THEME_COLOR) | theme.color_* | Theme namespace |
| live_body: { ... } | body +: { ... } | Merge operator |
| #[derive(Live)] | #[derive(Script)] | Derive macro |
| #[derive(LiveHook)] | #[derive(ScriptHook)] | Lifecycle hooks |
| #[derive(Widget)] | #[derive(Widget)] | Unchanged |
| before_apply() | on_before_apply() | Method rename |
| after_apply() | on_after_apply() | Method rename |
| apply_over!() | script_apply_eval!() | Runtime updates |
| DefaultNone | Default | Enum default |
| LiveRegister | WidgetRegister | Widget registration |
| live_register() | register_widget(vm) | Registration method |
| LiveId | LiveId | Unchanged |
// OLD
live_design! {
import makepad_widgets::base::*;
import makepad_widgets::theme_desktop_dark::*;
App = {{App}} {
ui: <Root> { ... }
}
}
// NEW
script_mod! {
use mod.prelude.widgets.*
startup() do #(App::script_component(vm)){
ui: Root{
// ... UI definition
}
}
}
// OLD
#[derive(Live, LiveHook, Widget)]
pub struct MyWidget { ... }
// NEW
#[derive(Script, ScriptHook, Widget)]
pub struct MyWidget { ... }
// OLD
impl LiveRegister for App {
fn live_register(cx: &mut Cx) {
makepad_widgets::live_design(cx);
}
}
// NEW
impl App {
fn run(vm: &mut ScriptVm) -> Self {
crate::makepad_widgets::script_mod(vm);
App::from_script_mod(vm, self::script_mod)
}
}
// OLD
impl LiveHook for MyWidget {
fn before_apply(&mut self, cx: &mut Cx, ...) { ... }
fn after_apply(&mut self, cx: &mut Cx, ...) { ... }
}
// NEW
impl ScriptHook for MyWidget {
fn on_before_apply(&mut self, cx: &mut Cx, ...) { ... }
fn on_after_apply(&mut self, cx: &mut Cx, ...) { ... }
}
// OLD - angle brackets, equals signs
<View> {
width: Fill, height: Fill
show_bg: true
draw_bg: { color: (THEME_BG) }
title = <Label> {
text: "Hello"
draw_text: { color: #fff }
}
}
// NEW - curly braces, colons, theme namespace
View{
width: Fill height: Fill
show_bg: true
draw_bg.color: theme.color_bg_app
title := Label{
text: "Hello"
draw_text.color: #fff
}
}
// OLD
self.label(id!(title)).apply_over(cx, live! {
text: "New text"
});
// NEW
script_eval!(cx, {
ui.title.set_text("New text")
});
// OR
script_apply_eval!(cx, self.ui, {
title.text: "New text"
});
theme.* prefix, not (THEME_*) syntax:= operator, not =+: not : for extending parent propertiesheight: Fit is MANDATORY on containers (default is 0px, not auto)App::run, not live_register#[source] links to script object (required on some widgets)10. Old old/ directory contains archived 1.x code for reference
| Mistake | Symptom | Fix |
|---------|---------|-----|
| Still using live_design! | Compile error | Replace with script_mod! |
| Using <Widget> syntax | Parse error | Use Widget{} |
| Using Key = Value | Property not applied | Use Key: value |
| Using (THEME_COLOR) | Unknown token | Use theme.color_* |
| Missing height: Fit | Container invisible (0px) | Add height: Fit |
| Using Live derive | Compile error | Use Script |
| Using before_apply | Method not found | Use on_before_apply |
| Using commas between props | Parse error | Remove commas |
examples/counter and examples/todo for 2.0 patternsheight: Fit - Most invisible UI is caused by missing heighttheme.*new_batch: true - Any View with show_bg and text children needs itTake zhanghandong/makepad-2.0-migration from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.