Show HN: Gova – The declarative GUI framework for Go

Build native desktop apps for macOS, Windows, and Linux from a single Go codebase with typed components and reactive state. Gova produces a single static binary without the need for a JavaScript runtime or embedded browser.
The declarative GUI framework for Go. Build native desktop apps for macOS, Windows, and Linux from a single Go codebase — typed components, reactive state, real platform dialogs, and one static binary. No JavaScript runtime, no embedded browser, no C++ toolchain to learn.
Status: pre-1.0. The API will shift before v1.0.0. Pin a tag in production.
package main
import g "github.com/nv404/gova"
type Counter struct{}
func (Counter) Body(s *g.Scope) g.View {
count := g.State(s, 0)
return g.VStack(
g.Text(count.Format("Count: %d")).Font(g.Title),
g.HStack(
g.Button("-", func() { count.Set(count.Get() - 1) }),
g.Button("+", func() { count.Set(count.Get() + 1) }),
).Spacing(g.SpaceMD),
).Padding(g.SpaceLG)
}
func main() {
g.Run("Counter", g.Define(func(s *g.Scope) g.View {
return Counter{}
}))
}
Components as structs. Views are plain Go structs with typed prop fields; defaults are zero values; composition is plain function calls. No magic property wrappers, no string keys, no hook-ordering rules. Explicit reactive scope. State, signals, and effects live on a Scope you can see. No hidden scheduler, no re-render surprises, no Rx, no Redux. Real native integrations where it matters. NSAlert, NSOpenPanel, NSSavePanel, and NSDockTile badge/progress/menu on macOS through cgo. Fyne fallbacks on Windows and Linux — same API everywhere. One static binary. go build produces a single executable. No JavaScript runtime, no embedded browser, no extra assets to bundle. Hot reload that actually reloads. gova dev watches Go files, rebuilds on save, and relaunches — with an opt-in PersistedState so UI state survives the reload. Built on Fyne, but Fyne stays internal. The public API is yours to rely on. We swap out renderer details without breaking your code.
| Metric | Value | Notes |
|---|---|---|
| Binary size | ~32 MB | counter example, default build |
| Stripped | ~23 MB | go build -ldflags "-s -w" |
| Memory idle | ~80 MB | RSS, counter running |
| Go version | 1.26+ | plus a C toolchain for cgo |
| License | MIT | no runtime fees |
Measured on macOS arm64 with Go 1.26.2. Numbers will vary by platform and feature set.
Source: Hacker News















