iOS and Android · Go 1.26+
Native apps in Go.The platform's widgets, not a web view.
Write an iOS and Android app in Go alone. RyUI shows it with UIKit and Material 3, and updates only what changed.
func Counter() ui.Node {
count := signal.New(0)
label := signal.Func(func() string {
return fmt.Sprintf("Count: %d", count.Get())
})
return ui.SafeArea(ui.Style{Align: ui.AlignCenter, Justify: ui.JustifyCenter},
ui.Text(label),
ui.Button(ui.ButtonProps{
Title: ui.Val("Add"),
Variant: ui.ButtonFilled,
OnPress: func() { count.Set(count.Peek() + 1) },
}),
)
}
func main() { app.Run(Counter) }Run it
$ ryui new hello && cd hello $ ryui dev -ios # the iOS simulator $ ryui dev -android # an emulator or a phone
Save a Go file and the app reloads in a moment, its state kept. See the examples: the gallery shows every component.
The platform's own widgets
UIKit on iOS, Android Views and Material 3 on Android: navigation, lists, fields, pickers, sheets and menus that look and feel as each platform's do.
Fine-grained signals
Components run once. A signal's change updates only the views that read it, in one batch for each frame, without diffing a tree.
Live on your phone
ryui dev runs your Go code on your Mac and the views on the simulator, an emulator or a phone, reloading on save with the app's state kept.
Motion
Animations, springs, transforms, enter and exit transitions, shared elements that grow from one view into another, and gestures.
Batteries
SQLite with live queries, secure storage, the camera and code scanning, photos, location, notifications, audio, video and web views.
Ready to ship
ryui build makes a signed .ipa for the App Store, with its privacy manifest, and an .aab for Google Play.