A declarative retained GUI framework for .NET. Written in G# and rendered directly with Vulkan.
Install the .NET 10 SDK and meet the platform requirements, then:
dotnet new install Goo.Templates@0.19.0
mkdir hello-goo
cd hello-goo
dotnet new gooRun the app:
dotnet runInstall .NET SDK 10.0.401 and Git. Download both pinned shader tools and set their SDK environment variables. The Gallery compiles shaders during its build.
git clone https://github.com/obselate/goo.git
cd goo
./bootstrap.sh
dotnet run --project apps/Goo.Gallery/Goo.Gallery.gsproj -c Releasegit clone https://github.com/obselate/goo.git
cd goo
bootstrap.bat
dotnet run --project apps/Goo.Gallery/Goo.Gallery.gsproj -c ReleaseThe bootstrap builds the pinned G# compiler and formatter, then downloads the released Goo package for the Gallery's native runtime files. It does not install software globally.
Applications reference Goo. The starter already includes it.
Install other packages separately as needed.
| Package | Purpose | Install |
|---|---|---|
| Goo | UI framework, renderer, images, gestures, native dialogs and menus, notifications, printing, rich text clipboard, spell checking, desktop instance hosting, and native runtime assets | dotnet add package Goo |
| Goo.Android | Android host, printing, and spell checking | dotnet add package Goo.Android |
| Goo.Audio | Audio playback | dotnet add package Goo.Audio |
| Goo.Accessibility | Desktop native accessibility adapters | dotnet add package Goo.Accessibility |
| Goo.DevTools | Launch, attach, and capture with the goo CLI |
dotnet tool install --global Goo.DevTools |
| Goo.DevTools.App | Graphical inspector, launched with goo-devtools |
dotnet tool install --global Goo.DevTools.App |
| Goo.Templates | Create starter projects with dotnet new goo |
dotnet new install Goo.Templates |
Add library packages from your application directory. Install both DevTools
packages to launch the graphical inspector with goo dev --inspector.
Remove references to Goo.AppHost, Goo.Gestures, Goo.Images, Goo.NativeDialogs,
Goo.NativeMenus, Goo.Notifications, Goo.Printing, Goo.RichText, Goo.SpellCheck, and Goo.SpellCheck.Hunspell
when upgrading to the consolidated Goo package. Remove Goo.Printing.Android
and Goo.SpellCheck.Android when upgrading Goo.Android. Keep existing namespace
imports and type names. The old package IDs no longer publish. System services
and native libraries load only when used. Hunspell includes no library or dictionaries.
Goo core supplies primitives. Use optional libraries for widgets and animation composition:
| Package | Purpose | Install |
|---|---|---|
| Goo Widgets | Pre-built UI widgets | dotnet add package Goo.Widgets |
| Goo Animations | A library for Animation and Motion factories | dotnet add package Goo.Animations |
The Goo.Templates app:
package CounterApp
import Goo
class Counter : Cell {
private var count int32
override func Build() Blob -> Container{
Width: Percent(100),
Height: Percent(100),
Padding: 24,
Gap: 12,
BackgroundColor: Color.Rgb(24, 31, 43),
Text{Content: "Count: $count", FontSize: 24, Color: Color.White},
Button{
Padding: 10,
BorderRadius: 10,
BackgroundColor: Color.Rgb(74, 125, 255),
OnClick: () -> {
count++
},
Text{Content: "Add one", Color: Color.White},
},
}
}
func Main() {
Window.ConfigureApplication("Goo starter", "1.0.0", "com.example.goostarter")
Window{Title: "Goo starter", Width: 360, Height: 220, Root: Counter{}}.Run()
}
Continue with After the counter, then edit and inspect. The app-author documentation index links core, widgets, assets, shipping and plugin guides with their version baselines.
Core concepts:
Blobis a UI primitive. Core adds behavior that cannot be composed, plus the semanticButton.Cellowns UI state, identity, and rebuilding. Input callbacks rebuild their owning Cell, so the template button only changescount.
Compose reusable UI with functions and methods. Use with to override properties:
let baseButton = ActionButton{Height: 38.0, MinWidth: 112.0, OnClick: () -> { },}
let primaryButton = baseButton with{Content = "Primary",}
let successButton = baseButton with{
Content = "Success",
BackgroundColor = Color.Parse("#166534"),
TextColor = Color.Parse("#fafafa"),
HoverBackgroundColor = Color.Parse("#15803d"),
ActiveBackgroundColor = Color.Parse("#14532d"),
}
let disabledButton = baseButton with{Content = "Disabled", Disabled = true,}
Direct children and spreads use Add in source order.
See the native authoring guide for composition, typed Cell inputs, and current language conventions.
Check platform preflight and troubleshooting before creating or distributing an app.
Goo ships runtime assets for Windows x64, Linux x64, macOS arm64, Android ARM64, and Android x64. The renderer requires the Vulkan 1.3 feature set used by Goo.
-
Windows x64 is tested on Windows 11 with current vendor Vulkan drivers. The minimum supported Windows version is not yet established.
-
Linux x64 requires Linux 6.6 or newer, glibc 2.27 or newer, a native Wayland 1.18 or newer session, and a TrueType or OpenType sans-serif font. X11 and XWayland are not supported.
-
macOS arm64 requires macOS 14 or newer on Apple silicon. Goo bundles MoltenVK 1.4.2 and selects installed Apple system fonts without requiring a Vulkan SDK.
-
Android requires Android 13 (API 33) or newer and a Vulkan 1.3 device with identity presentation support. The
Goo.Androidadapter hosts the same application in an Android activity or native view. See Android integration.
Goo includes the ShaderEffect build adapter and authoring modules. Install these
third-party tools only when the project contains <GooShaderEffect> items:
| Platform | Slang 2026.16 | Vulkan SDK 1.4.357.0 with spirv-val |
|---|---|---|
| Linux x64 | Download .tar.gz |
Download .tar.xz |
| Windows x64 | Download .zip |
Download installer |
| macOS arm64 | Download .tar.gz |
Download .zip |
Set SLANG_SDK and VULKAN_SDK to the extracted or installed SDK roots. Goo
also accepts slangc and spirv-val on PATH.
