Fastest way — let your AI agent install it
One block of text, pasted into Claude Code, Codex, Cursor or Gemini CLI, installs both the skill and the add-on and then explains gohud to you. Nothing below this card is needed if you take that road.
Install
Put the add-on folder into your project. There is nothing else to set up.
From the Asset Store or a release ZIP
Extract into your project root so you get res://addons/gohud/. That is all. Optionally enable
Project → Project Settings → Plugins → gohud.
As a git submodule
git submodule add https://github.com/thruthesky/gohud.git addons/gohud
git submodule update --init
git -C addons/gohud checkout v1.0.0 # optional: pin a tag or commit
The repository root is the add-on folder, so it lands exactly where Godot expects it. Edit in place,
commit and push inside addons/gohud, then commit the submodule pointer in your game.
GoUi.MIN_ENGINE.
Quick start
Every widget is .new() and add_child() — no scene files, no autoload.
Pick a look before building UI (optional)
GoUi.use_preset(GoThemePresets.SCIFI_DARK) # default_dark is used when you skip this
A confirmation you await
var dialogs := GoDialogs.new()
add_child(dialogs)
if await dialogs.confirm("Delete save", "This cannot be undone."):
delete_save()
Pass destructive = true (the last argument) and the confirm button is drawn as a filled danger button.
A bottom sheet with a sticky search field and footer
var sheet := GoSheet.new()
add_child(sheet)
sheet.open("Inventory")
sheet.toolbar().add_child(GoStyle.line_edit("Search…"))
sheet.toolbar().visible = true
for item in items:
sheet.body.add_child(GoStyle.list_button(GoIconSet.BOX, item.name, _use.bind(item),
Color.TRANSPARENT, item.description, false))
sheet.footer().add_child(GoStyle.button("Close", sheet.close, GoStyle.Tone.PRIMARY))
sheet.footer().visible = true
body and a long list pushes them off screen. footer() is always visible.
A HUD corner
var corner := GoHudAnchor.new()
corner.spot = GoHudAnchor.Spot.TOP_LEFT
corner.landscape_spot = GoHudAnchor.Spot.TOP_RIGHT
add_child(corner)
var hp := GoBar.new()
hp.label_text = "HP"
hp.ink = GoUi.color(GoTheme.DANGER_FILL)
corner.add_child(hp)
hp.set_values(320, 500)
Content that keeps clear of the HUD
form.avoid_hud = true # keep clear of every visible GoHudAnchor
joystick_anchor.reserve_space = false # …except ones that only appear under a finger
notice_anchor.avoid_peers = true # a toast settles below the fixed HUD instead of covering it
Each rectangle is avoided in whichever direction costs the least area — downwards on a portrait phone, sideways in landscape. How the HUD avoids itself →
Examples you can run
Three ways to see gohud before writing a line — none needs a server or an autoload.
| Example | How to open | What it shows |
|---|---|---|
| Gallery | examples/gallery/gallery.tscn · F6 | Every widget, a picker for every installed preset, and the full icon set |
| Medieval | examples/medieval/medieval.tscn · F6 | A character sheet, satchel and quest journal; buttons switch iron and parchment and open item details |
| Demo app | cd examples/demo && godot | A home screen opening the gallery, the 19-chapter guided tour, the showcase screen and the medieval look, with live widgets and one card per class |
cd examples/demo && godot # home screen; links and imports on first run
bash examples/demo/run.sh # the same app, from the add-on root
bash examples/demo/run.sh -- --open=gallery # skip the home screen
bash examples/demo/run.sh -- --explore=surfaces # open straight onto one tour chapter
bash examples/demo/run.sh --record /tmp/gohud-demo.avi # 1080p / 60 fps recording of the tour
The demo app needs no setup: if the add-on link or the import cache is missing it says so, repairs the folder and reopens itself. Its home screen opens each example inside the same window — press 1–4 or click a row, and the bar across the top brings you back.
In the tour, C toggles Cinema mode, F11 fullscreen, Space pauses (or plays the current widget while exploring), the arrows change chapters and Escape returns to Start.
Using an AI coding agent? Open all three with one command →