# go-flutter: Running Flutter Desktop Apps Through Go and GLFW

> go-flutter implements the Flutter Embedding API in Go on top of GLFW, giving Windows, macOS and Linux a single codebase for desktop Flutter apps. It is unofficial, plugin-dependent, and pinned to Flutter beta.

**go-flutter-desktop/go-flutter** — Flutter on Windows, MacOS and Linux - based on Flutter Embedding, Go and GLFW.

- Repository: https://github.com/go-flutter-desktop/go-flutter
- Website: https://hover.build/
- Stars: 5,931 · Forks: 278
- Language: Go
- License: BSD-3-Clause
- Published: 2026-09-22 · Updated: 2026-09-22 · Language: en
- Canonical page: https://hysenlabs.com/projects/go-flutter-desktop-go-flutter

## What go-flutter Actually Solves for Desktop Flutter

Flutter's engine does not know how to handle desktop input on its own. The README states that the engine exposes an abstraction layer for a platform to implement, and go-flutter is one implementation of that layer, written in Go and rendered through GLFW. The project describes itself as unofficial, and links to issue 191 as the place where that status is discussed. So the problem it solves is narrow and specific: you have a Flutter app, and you want it to run as a desktop program on Windows, macOS and Linux from a single codebase, without writing three separate embedders. The audience is developers who already know Flutter and are comfortable in Go, or who want to import the embedder as a Go library into a larger Go program. The README lists that library use as a supported feature, which is the clearest signal of who this is for. It is not a replacement for Flutter's own desktop support, and the README does not present it as one.

## The Embedding Layer, GLFW and the Plugin Channel

The repository layout shows the mechanism. Top-level files such as application.go, event-loop.go, glfw.go, key-events.go, mousecursor.go, text-input.go and window.go map onto the pieces of a desktop application: a run loop, window creation, keyboard events, pointer handling, and text input. Rendering goes through GLFW, which the README says provides the right abstractions over OpenGL buffers, mouse and keyboard for each platform. GLFW v3.3 is the version in use, according to the README, and go.mod pins github.com/go-gl/glfw/v3.3/glfw. The plugin side is where Flutter code meets native code. The README lists BinaryMessageCodec and BinaryMessageChannel, StandardMessageCodec and JSONMessageCodec, and StandardMethodCodec with MethodChannel as supported. That set is what a Flutter plugin uses to call into the host. The README also mentions plugin detection for supported plugins, which means the embedder can recognize plugins that have been written for it. The gap is that this recognition only covers plugins that exist in that form. There is no claim in the README that arbitrary pub.dev plugins work unchanged, and the wiki page it points to is about creating a hover-compatible plugin, not about automatic compatibility.

## Installing go-flutter and Running a First App

The README does not give install commands for go-flutter itself. It says the best way to get started is to install hover, described as the official go-flutter tool to set up, build and run Flutter apps on the desktop, including hot reload. It then points to the hover repository for the tutorial and to the examples repository for sample apps. Because the README does not document the install command, the honest move is to go to the hover repository and follow its tutorial rather than guess at a command here. What the material does show is the shape of a project that uses the library directly. The module path is in go.mod, and the Go version declared there is 1.12, with the current Go stable release recommended by the README.

## Where go-flutter Breaks Down

The version compatibility section is the most important limitation, and it is stated plainly. The README says go-flutter tries to stay compatible with the beta channel of Flutter. Beta channels move, and a project that tracks one inherits that movement. If you need your desktop build to sit on Flutter stable, this is the wrong tool, and the README does not offer a stable-channel alternative. The second limitation is plugins. The README directs readers to a separate plugins repository for popular plugins and to a wiki page for creating a hover-compatible plugin. That is an admission that plugin coverage is a separate effort, not a property of the embedder. If your app depends on a plugin nobody has ported, the work lands on you. The third is maintenance attention. The last push to the repository was on 2026-09-08, which is recent, so the project is not abandoned, but there are no retrieved releases, and the README's own compatibility notes describe a moving target rather than a frozen API. A fourth limitation is rendering: GLFW and OpenGL are the path, and the README does not describe a software or alternative backend. On machines with poor OpenGL support, that is the boundary.

## go-flutter Against Flutter's Own Desktop Tooling

The real alternative is Flutter's own desktop support, which does not need a Go embedder at all. The difference in approach is who owns the embedding layer. With Flutter's own tooling, the Flutter team implements the platform side. With go-flutter, the community implements it in Go over GLFW, and the README is explicit that this is unofficial. That difference decides most adoption questions. If you want the shortest path to a desktop build of a normal Flutter app, the official route avoids the plugin porting problem entirely. If you want to embed Flutter inside a Go program, or you want a single Go codebase that also handles the window and input, go-flutter is doing something the official tooling does not offer, and the README lists importable-as-a-Go-library as a supported feature. A second alternative worth naming is writing the desktop shell yourself against the Flutter Embedding API. The README frames go-flutter as one implementation of that API, so the API is the underlying contract, and go-flutter is the ready-made implementation of it in Go. Choosing to write your own means owning the event loop, input handling and texture registry that the repository already contains as files.

## Licence, Upgrade Cost and What You Inherit

go-flutter is BSD-3-Clause. That is a permissive licence, and the repository ships the LICENSE file the README links to. A permissive licence does not answer the questions that matter here, though. Your Flutter app's own dependencies carry their own licences, and a plugin ported to go-flutter is a separate work with its own terms. The upgrade cost is the part to think about before adopting. The README states that the project tries to stay compatible with the Flutter beta channel, and that it remains compatible with the latest Go stable release. Those two sentences describe a project that moves with two upstreams. Every Flutter beta bump is a chance that something in the embedder or a plugin needs attention, and the README does not document a rollback procedure for a broken upgrade. What you inherit is a small Go module with a pinned GLFW, a plugin system, and a compatibility promise that is directional rather than versioned. Budget for that, and check the wiki before assuming an upgrade is routine.

## Conclusion

Adopt go-flutter when you want to embed Flutter in an existing Go program or need a desktop target that the official tooling does not give you, and when you can accept the Flutter beta channel and per-plugin work. Do not adopt it if you need a stable, officially supported desktop path, or if your app depends on plugins that have no hover-compatible implementation, because the README points to a separate plugins repository and a wiki page rather than a complete port. Before committing, check that hover builds your app on your target platforms, confirm each plugin you rely on exists in go-flutter-desktop/plugins, and read the wiki page on creating a hover-compatible plugin, since that is where the missing pieces will surface.

## FAQ

### Is go-flutter the official way to run Flutter on the desktop?

No. The README links to issue 191 and describes the project as unofficial. It implements the Flutter Embedding API in Go over GLFW rather than being part of the Flutter project.

### How do I install go-flutter?

The README does not give install commands for go-flutter itself. It says the best way to get started is to install hover, the official go-flutter tool for setting up, building and running Flutter desktop apps, and points to the hover repository for the tutorial.

### Which Flutter version does go-flutter work with?

The README states that the project tries to stay compatible with the beta channel of Flutter, and that it remains compatible with the latest Go stable release. It does not claim stable-channel Flutter support.

### Do existing Flutter plugins work with go-flutter?

Not automatically. The README lists a plugin system with MethodChannel and message codecs, plus plugin detection for supported plugins, and points to a separate plugins repository and a wiki page on creating a hover-compatible plugin.

### What licence does go-flutter use?

BSD 3-Clause. The README links to the LICENSE file in the repository, and the project's licence field matches that.

## Sources

- [go-flutter-desktop/go-flutter on GitHub](https://github.com/go-flutter-desktop/go-flutter)
- [Issues](https://github.com/go-flutter-desktop/go-flutter/issues)
- [License: BSD-3-Clause](https://github.com/go-flutter-desktop/go-flutter/blob/master/LICENSE)
- [Project website](https://hover.build/)
- [README](https://github.com/go-flutter-desktop/go-flutter/blob/master/README.md)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/go-flutter-desktop-go-flutter
