MCPcopy Index your code
hub / github.com/NV404/gova

github.com/NV404/gova @main

Chat with this repo
repository ↗ · DeepWiki ↗ · + Follow
745 symbols 2,442 edges 87 files 258 documented · 35%
What it actually does AI analysis from the code graph — generated when you open this
loading…
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.

Go Reference Go Report Card CI License: MIT

Status: pre-1.0. The API will shift before v1.0.0. Pin a tag in production.

package main

import . "github.com/nv404/gova"

var Counter = Define(func(s *Scope) View {
    count := State(s, 0)
    return VStack(
        Text(count.Format("Count: %d")),
        Button("+", func() { count.Update(func(n int) int { return n + 1 }) }),
        Button("-", func() { count.Update(func(n int) int { return n - 1 }) }),
    )
})

func main() { Run("Counter", Counter) }

Counter example window on macOS

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:

Examples

Every example in examples/ is a runnable program:

Example What it shows
counter The minimum viable Gova app
todo State, lists, forms
fancytodo Categories, derived state, richer layout
notes Nav, multi-view, stores
themed Dark/light mode, semantic colors
components Viewable composition, ZStack, Scaffold
dialogs Native dialogs, dock badge / progress / menu, app icon
go run ./examples/dialogs

Platform support

Feature macOS Windows Linux
Core UI Supported Supported Supported
Hot reload (gova dev) Supported Supported Supported
App icon (runtime) Supported Supported Supported
Native dialogs NSAlert / NSOpenPanel Fyne fallback Fyne fallback
Dock / taskbar NSDockTile Planned Planned

CLI

The gova CLI ships alongside the framework.

Command Purpose Notes
gova dev Hot reload Watch .go files, rebuild on save, relaunch the window
gova build Compile Static binary to ./bin/<name>
gova run Execute Build and launch once, no file watching

Contributing

See CONTRIBUTING.md. Tests are the contract:

go test ./...

Issues, discussions, and PRs all live on GitHub. Security issues? See SECURITY.md.

License

MIT. Gova is built on Fyne (BSD-3), which ships with the module as an internal dependency.

Extension points exported contracts — how you extend this code

Viewable (Interface)
(no doc) [5 implementers]
component.go
Signal (Interface)
Signal is a reactive value that notifies subscribers when it changes. Implemented by derivedSignal and formatSignal.
signal.go
PersistOption (FuncType)
PersistOption configures PersistedState.
persist.go
View (Interface)
(no doc) [2 implementers]
view.go
Identifiable (Interface)
Identifiable is the interface types can implement to provide list identity. Used by ListOf for automatic key resolution.
list.go
TestOption (FuncType)
(no doc)
testing.go

Core symbols most depended-on inside this repo

Get
called by 83
state.go
viewNode
called by 60
view.go
Background
called by 57
modifier.go
Set
called by 51
state.go
Text
called by 47
testing.go
newScope
called by 46
scope.go
Text
called by 39
text.go
rgb
called by 34
style.go

Shape

Function 333
Method 276
Struct 109
TypeAlias 17
Interface 8
FuncType 2

Languages

Go96%
TypeScript4%

Modules by API surface

gova_test.go53 symbols
dialog.go50 symbols
internal/fyne/bridge.go45 symbols
modifier.go35 symbols
testing.go28 symbols
dock.go27 symbols
style.go26 symbols
nav.go25 symbols
docs-site/app/(home)/page.tsx25 symbols
signal.go23 symbols
view.go21 symbols
state.go19 symbols

For agents

$ claude mcp add gova \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact