# go-app — Build Progressive Web Apps with Go and WebAssembly > A Go package for building progressive web apps using a declarative component model, compiling Go code to WebAssembly so your entire application logic runs in the browser with native-like performance. ## Install Save in your project root: # go-app — Build Progressive Web Apps with Go and WebAssembly ## Quick Use ```go package main import "github.com/maxence-charriere/go-app/v10/pkg/app" type Hello struct{ app.Compo } func (h *Hello) Render() app.UI { return app.H1().Text("Hello from Go!") } func main() { app.Route("/", func() app.Composer { return &Hello{} }) app.RunWhenOnBrowser() http.Handle("/", &app.Handler{Name: "Hello"}) http.ListenAndServe(":8080", nil) } ``` ## Introduction go-app is a Go package that lets developers write frontend web applications entirely in Go. Your code compiles to WebAssembly and runs in the browser, while a thin Go HTTP server handles routing and asset delivery. The result is a progressive web app with offline support, installability, and the full type safety of Go. ## What go-app Does - Compiles Go application code to WebAssembly for client-side execution - Provides a declarative, component-based UI model similar to React - Generates a service worker and manifest for PWA installability and offline caching - Handles server-side rendering and prerendering for SEO and fast initial loads - Manages routing, lifecycle events, and state updates within a single Go codebase ## Architecture Overview go-app works in two modes simultaneously. On the server side, a Go HTTP handler serves the compiled WASM binary, static assets, and an auto-generated HTML shell. On the client side, the WASM binary bootstraps the component tree, mounts it to the DOM, and handles all user interaction. Components follow a lifecycle pattern with OnMount, OnNav, and Render methods. The framework manages a virtual DOM diffing layer that updates only the changed elements. ## Self-Hosting & Configuration - Add go-app to your module with `go get github.com/maxence-charriere/go-app/v10` - Build the client WASM binary with `GOARCH=wasm GOOS=js go build -o web/app.wasm` - Serve assets via the built-in app.Handler in any Go HTTP server - Configure the PWA manifest (name, icons, theme color) through app.Handler fields - Deploy as a single binary plus the WASM file to any hosting provider ## Key Features - Write frontend and backend in the same language with shared types and logic - Automatic PWA features including service worker generation and offline caching - SEO-friendly with server-side and prerendering support out of the box - No JavaScript, TypeScript, or Node.js tooling required in the build pipeline - Component-based architecture with lifecycle hooks and event handling ## Comparison with Similar Tools - **Wails** compiles Go for native desktop apps; go-app targets the browser via WebAssembly - **Vecty** is another Go-to-WASM framework but lacks built-in PWA and SSR support - **Lorca** uses Chrome as a UI shell; go-app runs entirely in the browser without requiring Chrome - **React/Next.js** requires JavaScript and Node.js; go-app keeps everything in Go - **Fyne** builds native desktop UIs with Go; go-app delivers web UIs through the browser ## FAQ **Q: How large is the resulting WASM binary?** A: A minimal go-app binary starts around 5-8 MB. Using TinyGo or wasm-opt can reduce this. Gzip compression brings the transfer size to roughly 1-2 MB. **Q: Can I use existing JavaScript libraries?** A: Yes. go-app provides js.Value interop to call JavaScript functions and access browser APIs from Go code. **Q: Does go-app support hot reloading during development?** A: Not natively, but you can use tools like air or entr to watch for file changes and rebuild the WASM binary automatically. **Q: Is go-app suitable for large applications?** A: go-app scales well for medium-complexity apps. For very large SPAs, the WASM binary size and Go's garbage collector pauses in WASM are factors to evaluate. ## Sources - https://github.com/maxence-charriere/go-app - https://go-app.dev --- Source: https://tokrepo.com/en/workflows/asset-6460e985 Author: AI Open Source