Native apps in Go.The platform's widgets, not a web view.
Write one app in Go alone, for phones, desktops and the web. Asuka shows it with each platform's own widgets, 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
$ asuka new hello && cd hello $ asuka dev # this computer: Mac, PC or Linux $ asuka dev -platform ios # the iOS simulator $ asuka dev -platform android # an emulator or a phone $ asuka dev -platform web # your browser
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, Material 3 on Android, AppKit on the Mac, Win32 drawn as Windows 11's, GTK 4 and libadwaita on Linux, the DOM in a browser: 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 as you save
asuka dev runs the app on your computer, the simulator, an emulator, a phone or a browser, and reloads it 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
asuka build makes a signed .ipa for the App Store, an .aab for Google Play, a notarized Mac app, a signed Windows .exe, a Linux archive and Flatpak manifest, and a static site.