Hey everyone,
I love Go, but building desktop apps with it has always been a massive headache for me. It usually feels like you have to pick your poison: either wrestle with CGO and ruin Go’s amazing cross-compilation, or bundle an entire web browser just to draw some buttons using HTML and JS.
I know Gio exists—and its rendering engine is fantastic—but the learning curve and raw API always felt a bit too steep when I just wanted to throw a quick tool together.
So, I built Proton.
It is a pure-Go GUI library built on top of Gio, but designed with an immediate-mode style API that is much easier to pick up. I basically wanted something where I could just define a window, write a draw function, and have things stack on the screen without dealing with XML files or weird component lifecycles.
Here is why I think it is pretty neat:
-
Zero CGO: It is 100% Go. You can cross-compile a Windows or macOS app straight from your Linux machine without fighting a C compiler.
-
Simple State: There is no
setStateor virtual DOM to manage. You just keep your state in standard Go structs. -
Decent Defaults: I got tired of building apps that look like Windows 95, so I baked in 46 themes (like Nord, Dracula, and Catppuccin) that you can swap with a single line of code.
-
It actually has widgets: It’s not just buttons and text. I’ve added data tables, draggable split panes, search inputs, and modals.
-
API Immunity: The whole thing runs through a
proton.Contextinterface. If Gio’s internals change tomorrow, your app code won’t break.
It is still in early development (v0.2.7), but I’ve been using it for my own tools and it is finally making Go desktop dev fun for me again. The exact same code also runs on Android, which is a fun bonus.
If anyone is interested in pure-Go desktop development, I would really appreciate it if you took a look. The repo is CzaxStudio/proton on GitHub.
Docs: Proton-Docs
I am very open to feedback, roasting of my code, or feature requests!