Go-app is a package for building progressive web apps (PWAs) with Go and WebAssembly (Wasm).
Write your UI in Go using reusable components and a declarative syntax. Handle user interactions in Go and serve your app with the standard net/http package.
Apps built with go-app are SEO-friendly and support offline use. On supported browsers and devices, users can install your app and run it in its own window.
Requires Go 1.26 or newer.
From your project directory, initialize a Go module if you do not already have one. Replace example.com/myapp with your module path:
go mod init example.com/myappAdd go-app to your project:
go get github.com/maxence-charriere/go-app/v11/pkg/appDescribe your UI with Go functions using go-app's declarative syntax. Each component embeds app.Compo and defines a Render method that returns its UI.
Create a main.go file with the following component, then add the main function from the next section. The component displays a greeting that updates as you type your name:
package main
import (
"log"
"net/http"
"github.com/maxence-charriere/go-app/v11/pkg/app"
)
type hello struct {
app.Compo
name string
}
func (h *hello) Render() app.UI {
return app.Div().Body(
app.H1().Body(
app.Text("Hello, "),
app.If(h.name != "", func() app.UI {
return app.Text(h.name)
}).Else(func() app.UI {
return app.Text("World!")
}),
),
app.Input().
Type("text").
Value(h.name).
Placeholder("What is your name?").
AutoFocus(true).
OnInput(h.ValueTo(&h.name)),
)
}Serve your app with Go's standard net/http package. The app.Handler type implements http.Handler and can be used with an existing Go server.
Add this function to main.go to register the component at / and serve the app on port 8000:
func main() {
// Register the component.
app.Route("/", func() app.Composer { return &hello{} })
// Start the app in the browser; on the server, continue below.
app.RunWhenOnBrowser()
// Serve the app over HTTP.
http.Handle("/", &app.Handler{
Name: "Hello",
Description: "A Hello World example",
})
if err := http.ListenAndServe(":8000", nil); err != nil {
log.Fatal(err)
}
}From your project directory, build the WebAssembly app and the server, then run the server:
mkdir -p web
GOOS=js GOARCH=wasm go build -o web/app.wasm
go build -o server
./serverOpen localhost:8000 in your browser. After changing the code, rebuild both binaries and restart the server.
Follow the Getting Started guide to build and run your first app.
- Murlok: World of Warcraft character builds and guides.
- GoApp Docs: The documentation website, built with go-app.
- liwasc: Network discovery, port scanning, and Wake-on-LAN.
If go-app is useful to you, consider sponsoring its development.
