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.

$go get github.com/nv404/gova@latestshell
Go 1.26+macOSWindowsLinux
main.go
1package main
2 
3import . "github.com/nv404/gova"
4 
5var Counter = Define(func(s *Scope) View {
6 count := State(s, 0)
7 
8 return VStack(
9 Text(count.Format("Count: %d")).Font(Title),
10 Button("+", func() { count.Update(func(n int) int { return n + 1 }) }),
11 Button("-", func() { count.Update(func(n int) int { return n - 1 }) }),
12 )
13})
14 
15func main() { Run("Counter", Counter) }
Binary size32 MBcounter, default go build
Stripped23 MBgo build -ldflags "-s -w"
Memory idle~80 MBRSS, counter running
Go version1.26+plus C toolchain for cgo
LicenseMITno runtime fees

Measured on macOS arm64 with Go 1.26.2, counter example, static build. Your numbers will vary by platform and feature set.

What the framework gives you.

01 / 06

Components as structs

Views are plain Go structs. Props are fields, defaults are zero values, and composition is just function calls. The compiler checks your UI.

02 / 06

Explicit reactive scope

State, signals, and effects live on a Scope you can see. No hidden scheduler, no hook-order rules, no re-render surprises.

03 / 06

Real native dialogs

NSAlert, NSOpenPanel, and NSDockTile on macOS through cgo. Fyne fallbacks on Windows and Linux. Same API everywhere.

04 / 06

One static binary

go build produces a single executable. No JavaScript runtime, no embedded browser, no extra assets to bundle.

05 / 06

Hot reload in dev

gova dev watches Go files and rebuilds on save. Ignores .git, node_modules, vendor, and _test.go files by default.

06 / 06

Cross-platform by default

One codebase compiles to macOS, Windows, and Linux. Platform-specific code degrades to safe fallbacks so your app keeps running.

Platform support.

Gova compiles to macOS, Windows, and Linux from the same Go file. Platform integrations degrade to safe fallbacks so portable code stays portable.

FeaturemacOSWindowsLinux
Core UI: layouts, widgets, navigation
Supported
Supported
Supported
Hot reload via gova dev
Supported
Supported
Supported
App icon at runtime
Supported
Supported
Supported
Native dialogs
NSAlert and NSOpenPanel on macOS. Fyne fallback elsewhere.
Supported
Partial
Partial
Dock and taskbar (badge, progress, menu)
NSDockTile on macOS. Planned on Windows and Linux.
Supported
Planned
Planned

Command-line tools.

The gova CLI ships alongside the framework. Install it with go install github.com/nv404/gova/cmd/gova@latest.

Hot reload
gova dev

Watch .go files in the working directory, rebuild on save, and relaunch the window. Ignores .git, node_modules, vendor, and _test.go.

Compile
gova build

Produce a static binary for the current platform. Pair with -ldflags "-s -w" to strip debug info for a smaller artifact.

Execute
gova run

Build and launch the app once, without file watching. Useful for CI smoke tests or one-off demos.

Quickstart.

01

Install the prerequisites

Go 1.26 or later, plus a C toolchain for cgo. On macOS: Xcode Command Line Tools. On Linux: build-essential and libgl1-mesa-dev. On Windows: mingw-w64.

See the installation guide for platform specifics.
02

Pull the module

Add gova to a new or existing Go module.

go mod init myapp
go get github.com/nv404/gova
03

Run the counter example

Clone the repo and run the example directly. No scaffold, no boilerplate.

git clone https://github.com/nv404/gova
cd gova
go run ./examples/counter

Try it. Break it. File an issue.

Gova is pre-1.0 and the API is still moving. If you build a Go desktop app with it, we want to hear what worked and what did not.

Get started Star on GitHub