Back to feed

Gova: Declarative GUI Framework for Go

NV404/gova
306
+63/wk
6
GoDevTools💎 Hidden Gem

declarative GUI framework for Go

AI Analysis

Build native desktop apps with typed components and reactive state in pure Go.

Built for Go developers looking to build cross-platform desktop applications without JavaScript or embedded browsers.

From the README

Gova

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.Component(Counter{}))
}

Why Gova

  • 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.

At a glance

| 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.

Install

go get github.com/nv404/gova@latest

Optional CLI for dev / build / run:

go install github.com/nv404/gova/cmd/gova@latest
gova dev ./examples/counter

Prerequisites: Go 1.26+ and a C toolchain (Xcode CLT on macOS, build-essential + libgl1-mesa-dev on Linux, MinGW on Windows).

Docs

Full documentation lives at gova.dev (or run npm run dev inside docs-site/ for local browsing). Key sections: