New: arcade, comic, Material 3 and a look for kids
Four new families join default, sci-fi and medieval — fourteen built-in looks now, each in dark and light. Every widget, popup and HUD piece takes them with no change to your code: switch the preset and the whole screen follows.

material_light
material_dark
kids_light
kids_dark
comic_light
comic_dark
arcade_light
arcade_darkMaterial 3 — for app screens
Material 3 Expressive, measured against the official M3 tokens: pill buttons with a 40dp plate inside the 48dp touch target, 28dp dialogs and sheets, filled cards, outlined fields and the Expressive slider. The app components — navigation bar, app bar, FAB, search bar, chips, progress and the date picker — follow the M3 component tokens, and titles are set in the bundled Roboto. For shops, settings, inboxes and every screen that should feel like an app.
Kids — the toy box
Made for children: every key, row and panel is a jelly candy with a chunky outline and a solid lip that sinks when pressed, each kind of control in its own crayon colour. Quick slots are candy blocks, badges are stickers, the joystick is a rainbow, windows get a sunny title ribbon and a round candy close button, and a press squishes. Sizes and your project's font stay exactly as they were.
Comic — bold ink
Every face is a comic-book panel: the surface colour inside a bold ink outline, with a hard shadow behind it that goes when the face is pressed. One setting turns every shadow on or off, two more set the outline width and the shadow size, and one call does the same for a single widget. Windows get a yellow title caption.
Arcade — painted keys
Every key is painted — a gradient, a white gloss and a lip that sinks when pressed, in a navy ink outline — and labelled in white with an ink outline: green to play, blue for the rest, red to delete. Boards are thick, a coloured frame round a pale well, and windows get a gold title banner and a round red close key.
GoUi.use_preset(GoThemePresets.MATERIAL_LIGHT) # or MATERIAL_DARK
GoUi.use_preset(&"kids_light") # or &"kids_dark"
GoUi.use_preset(&"comic_light") # or &"comic_dark"
GoUi.use_preset(&"arcade_light") # or &"arcade_dark"
Material 3 in detail → · Kids in detail → · Arcade, widget by widget ↓ · Comic, widget by widget ↓ · The same popup in all fourteen looks →
Arcade: painted keys and thick boards
The newest look dresses every screen like an arcade cabinet. Every key is a painted pill — a gradient from a light
top to a deeper bottom, a candy gloss (a sheen over the upper half and a glint round both top corners) and a lip that
sinks when pressed, all inside a navy ink outline — and its label is white with an ink outline. Tabs stand apart, gauges
are split into chunks by ink ticks, key hints are keycaps and window titles ride a gold ribbon with swallow tails.
Every board is thick: a coloured frame with its own gloss round a pale well.
arcade_light puts white boards on a sky-blue page; arcade_dark puts navy boards on a night page.
Every picture below is a real gohud screen — the same code, one preset line.
GoUi.use_preset(&"arcade_light") # or &"arcade_dark"

arcade_light · the gallery
arcade_dark · the gallery
GoDialogs
GoSheet
GoCoachMark
GoDrawer
GoPopover
GoDialogs.alert()
GoSnackbarEvery key painted

GoStyle.button()
GoStyle.tabs()


GoStyle.card()
GoForm
GoStyle.choice_grid()
GoSlotGrid

GoDatePicker
GoStyle.slider()
GoStyle.radio_group()
GoStyle.filter_chip()
GoSearchBar
GoStepper
GoTable
GoNavBar
GoTimePicker
GoCodeInput
GoWheelPickerAt night: arcade_dark
On a dark page the ink becomes the page itself, much deeper, and the paints stay just as bright.

GoStyle.button() at night
GoBar
GoStyle.hud_panel()
GoSlot
GoJoystick

GoFab
GoRewardCalendar

GoTabView
GoScroll

GoStyle.chip()
GoSlotGrid
GoRangeSlider
GoPagination
GoBadgeHow the arcade look works
The face
Every key and board is a GoStyleBoxArcade: an ink outline, a gradient body, a lip and a gloss, drawn
inside the control's own rectangle — a key keeps its size from state to state, and a press only sinks it.
Labels that read
A white label with an ink outline reads on any paint the outline stands off — WCAG counts the outline as part of the letter. Every paint is moved until its label clears 4.6:1 at every height of the gradient.
Windows
A window's title sits on a gold banner in white letters outlined in ink, next to a round red close key. Dialogs, sheets, drawers and popovers are thick framed boards.
One key can take its own colour — an orange shop key in a pause menu:
menu.add_child(GoStyle.arcade_paint(GoStyle.button("Shop", _shop), Color("#FF8A1E")))
Comic: bold ink and a hard shadow
The comic look draws every face like a panel in a comic book — the surface colour inside a bold ink outline,
with a hard, solid shadow dropped down and to the right. comic_light inks black on a paper-cream page
with a cobalt primary; comic_dark inks cream on a night page with a yellow primary. Every picture below is
a real gohud screen — the same code, one preset line.
GoUi.use_preset(&"comic_light") # or &"comic_dark"

comic_light · the gallery
comic_dark · the gallery
GoSheet
GoCoachMark
GoDrawer
GoPopoverEvery widget, inked
Buttons, toggles, tabs, sliders, cards, forms, tables, pickers and chips all wear the ink — you do not style them one by one. Press a key and its shadow goes: the face sinks into its place, like a stamp. Disabled faces lose their shadow and fade, so what can be pressed stands out from what cannot.

GoStyle.button() — every kind


GoStyle.tabs()

GoStyle.slider()

GoStyle.card()
GoForm

GoTable
GoDatePicker
GoTimePicker
GoStepper

GoNavBar
GoInputGroup
GoSplitButton
GoPaginationAt night: comic_dark
On a dark page a black outline would vanish, so comic_dark draws it in cream and drops a faint shadow
tinted with the same ink. The HUD pieces — quick slots, bars, the joystick and the reward calendar — follow the same rules.

GoStyle.button() at night
GoSlot
GoBar
GoJoystick

GoSlotGrid
GoRewardCalendar

GoRangeSlider
GoSearchBar
GoFabHow the comic look works
One StyleBox for every face
Every face is a GoStyleBoxComic: a fill, an outline and a shadow, drawn inside the control’s own rectangle. It reads the outline and shadow sizes from GoConfig each time it draws, so one setting changes the whole screen at once.
Pressed means flat
A pressed key drops its shadow and moves into its place. Hover keeps the shadow; focus adds an inner ink ring that never covers the outline; disabled faces lose the shadow and fade.
The skin inks the rest
GoSkinComic inks what code draws: quick slots, chips, badges, avatars, notices, the navigation bar, the FAB, the date cells and the joystick, whose knob casts a shadow.
Windows get a caption
A window’s title sits on a yellow caption, like the narration box of a comic, next to an inked round close button. Dialogs, sheets, drawers and popovers are opaque inked panels.
Readable day and night
Both palettes pass the same WCAG contrast checks as every other preset, including pressed and disabled keys. When a caption colour would sit too close to the page, its outline falls back to the page colour.
No layout changes
The outline and shadow fit inside each control and the padding stays as the theme gave it, so a screen laid out in another look keeps its layout — and your project’s font.
Three settings and one call
Three GoConfig settings change every comic face at once. Nothing is rebuilt — the screen redraws as you set them.
GoUi.config.comic_border_width = 2.0 # the outline (dp) — 3 by default
GoUi.config.comic_shadow_size = 6.0 # the shadow (dp) — 4 by default
GoUi.config.comic_shadow = false # no shadows anywhere
One widget can go its own way, whatever the settings say. Pass true as the last argument to include everything inside it.
GoStyle.comic_shadow(skip_button, false) # this button sits flat
GoStyle.comic_shadow(card, true, true) # this card and everything in it keep their shadow
GoStyle.comic_border(title, 5.0) # a thicker outline on this one
tools/new_theme.py inked --from comic_light copies the palette; change the
paper, ink and primary colours and run tools/make_theme.py inked. The ink, the shadow and the skin come along.
What it looks like in a game
The medieval and sci-fi presets — character sheets, inventories and quests; forms, grids and prompt cards; angular panels and touch controls. Switching presets is one line of code.
What it takes off your hands
What costs the most time in game UI is not the shape of a button — it is everything that drifts apart between devices. gohud handles that drift in one place.
Every measurement is a token
Spacing, corners and text sizes are called by name, not written as numbers. Swap the theme and the whole screen moves with it.
Visible size ≠ pressable size
A close button looks 36dp but its touch target is 48dp. Where crowded slots overlap, the one whose centre is nearer takes the press.
Notches and keyboards
HUD pieces sit inside the safe area, and an input rises above the virtual keyboard when it appears.
Back closes one thing
Escape and Android Back close only the topmost surface. Stacked windows do not vanish together.
Notices never steal input
Press through a snackbar and the button underneath receives it. Focus is not taken either.
Icons are asked for by name
Widgets only know GoIconSet.CLOSE. Swap the set and every drawing changes without touching a line of code. Icons →
Fourteen looks, one line
GoUi.use_preset() swaps theme, skin and icons together — rounded, chamfered sci-fi, forged medieval frames, Material 3 app components, kids' jelly candies, comic ink or arcade paint.
Legible by measurement
Every theme is checked against WCAG, including button states and translucent HUD panels over pure white and pure black.
Install gohud
Two ways in. Let your AI agent do it, or drop the folder into your project — there is nothing else to set up.
Quick start
Five lines put a themed screen on the display. See the whole walk-through on the install page.
Change the look — colours and shape
A Theme can only restyle what the engine draws. Rounded corners are the only corners StyleBoxFlat has, and the joystick, quick slots and coach mark are drawn by code — so a theme alone can never change their shape. gohud therefore ships presets: a theme, a skin and an icon set picked as one unit.
GoUi.use_preset(GoThemePresets.MEDIEVAL_DARK) # theme, skin and icons together
| Preset | Look |
|---|---|
default_dark | The original gohud — rounded corners, soft blue accent |
default_light | The same shapes on a light palette |
scifi_dark | Chamfered corners, cyan neon edges and glow, hexagonal joystick, targeting brackets |
scifi_light | The same angular shapes in a bright blueprint palette |
medieval_dark | Dark iron and leather, antique-gold frames, rivets, engraved icons, Cinzel headings |
medieval_light | Parchment, ink and bronze with the same forged frames |
material_light New | Material 3 for app screens — pill buttons, 28dp dialogs, filled cards, an app's navigation bar, FAB and search bar, Roboto |
material_dark New | The same Material 3 shapes on the dark baseline |
kids_light New | The toy box for children — jelly-candy keys with a chunky outline and a lip that sinks when pressed, crayon colours, a sunny page |
kids_dark New | The same toy box on a night-blue page |
comic_light New | Comic-book panels — a bold ink outline and a hard shadow on every face, white panels on a paper-cream page; the shadow, its size and the outline width are settings |
comic_dark New | The same ink on a night page — cream outlines and a yellow primary |
arcade_light New | An arcade cabinet — every key painted with a gradient, a gloss and a lip, labelled in white with an ink outline; thick framed boards on a sky-blue page, a gold title banner on windows |
arcade_dark New | The same bright keys on navy boards and a night page |
default_dark — rounded corners, soft blue accent
default_light — same shapes, light palette
scifi_dark — chamfered corners, cyan neon
scifi_light — same angular shapes, blueprint paletteThose four are the same gallery screen. Not a line of code differs — only the preset name. Button corners, toggle shapes, list rows and input borders all move together.
Medieval collection
medieval_dark pairs iron and leather with antique gold; medieval_light uses parchment
and ink. Menu frames carry a rivet and a small corner ornament while the always-visible HUD stays quiet;
16 engraved icons redraw the item names, and only titles and subtitles use the bundled Cinzel font.
medieval_dark — iron and leather
medieval_light — parchment and inkBoth shots are examples/medieval/medieval.tscn, built from the standard widgets.
The medieval guide and how to make your own kingdom →
The same screen on a phone and on a desktop
The gallery shots are a phone in portrait. Below is the same code at 1280×800 — the content stops at a readable width (480dp) and centres, while the HUD stays in the corners. The form steps around floating HUD pieces, but does not move when it is already clear of them: pushing anyway would throw the content off-centre on a wide screen.
default_dark · 1280×800
scifi_dark · 1280×800The same sheet, a different look
Pick one from Project Settings → gohud → Theme → Preset, or set GoConfig.preset.
Filling in theme, skin or icons explicitly wins over the
preset, so you can take a preset and override just one of them.
new_theme.py kingdom --from medieval_dark writes a palette that
spells out every inherited value; make_theme.py kingdom builds the theme, its control artwork and
its skin dials, and the preset appears in the picker. Every setting and dial →
Skins — where a Theme cannot reach
A skin owns the joystick, quick-slot faces, the coach-mark ring, chips, skeletons, alerts, dividers and section headings. Subclass it and override only what you want changed.
class_name MySkin extends GoSkin
func slot_box(accent: Color, lit: bool) -> StyleBox:
var box := GoStyleBoxCut.new()
box.bg_color = accent
box.cut = 6.0
box.edge_color = accent
return box
| Class | Shapes it can make |
|---|---|
GoStyleBoxCut | Diagonally cut corners (chamfer), one thickened accent edge, an outer glow |
GoStyleBoxBracket | Corner marks only, without enclosing the content |
GoStyleBoxMedieval | A forged frame with rivets, corner engraving, a bevel highlight and material grain |
GoStyleBoxJelly | A jelly candy — a chunky outline, a solid lip that sinks when pressed, a body lighter on top and a white shine |
GoStyleBoxComic | A comic-book panel — a bold ink outline and a hard drop shadow, both sized by GoConfig while the game runs |
GoStyleBoxArcade | An arcade key or board — a gradient body, a white gloss, a lip that sinks when pressed and an ink outline; a board adds a thick coloured frame round a pale well |
All six serialise into a Theme resource — which is what lets a theme change shape, not just colour.
GoSkinSciFi, GoSkinMedieval, GoSkinMaterial, GoSkinKids, GoSkinComic and GoSkinArcade are the shipped subclasses.



GoStyle.box() always returns a StyleBoxFlat, because calling code
receives it and adjusts bg_color or corner_radius. Use
GoStyle.surface() when a custom shape has to survive.
Widgets
The pieces, in one table. Each one in detail → · Every widget with a picture → · Popups and dialogs, the full guide →
| Class | Base | What it does |
|---|---|---|
GoSurface | Control | Floating card shell — centre, bottom or anchored placement, sticky header and footer, scrolling body, drag-to-resize |
GoSheet | CanvasLayer | Pages rising from the bottom, on their own layer so they sit above the HUD |
GoDialogs | Node | Confirmations and alerts you await; destructive for irreversible actions |
GoForm | MarginContainer | Width-capped forms that avoid the virtual keyboard and, with avoid_hud, the HUD |
GoScroll | ScrollContainer | Touch scrolling; the scrollbar tucks into the card padding |
GoNotice | PanelContainer | A snackbar that takes neither input nor focus |
GoPromptCard | PanelContainer | A question that does not block the game |
GoCoachMark | Control | A guided tour that points at real controls; pressing the target advances |
GoHudAnchor | Control | Pins HUD pieces to one of nine safe-area spots |
GoBar | Control | Health, mana and experience bars with eased changes |
GoSlot | Button | A quick slot — icon, quantity, cooldown and shortcut on one face |
GoJoystick | Control | Virtual stick in fixed, follow or relative mode |
GoIconButton | Button | Looks small, presses large |
GoStyle | static | Buttons, list rows, inputs, chips, tables, tabs and more, made one consistent way |
Waiting, telling, counting
| Class | Base | What it does |
|---|---|---|
GoSnackbar | Node | the message that places itself |
GoSpinner | Control | a wait with no end in sight |
GoBadge | PanelContainer | the unread dot, the NEW tag, the 99+ |
Forms and lists
| Class | Base | What it does |
|---|---|---|
GoField | VBoxContainer | the row that can be wrong |
GoInputGroup | HBoxContainer | an input welded to its button |
GoCombobox | Button | a picker that searches |
GoCodeInput | VBoxContainer | coupon and gift codes |
GoTable | VBoxContainer | sortable headers, selectable rows |
GoPagination | HBoxContainer | pages, or a More row |
Shapes games actually use
| Class | Base | What it does |
|---|---|---|
GoRewardCalendar | VBoxContainer | daily attendance |
GoRadar · GoDonut | Control | stats at a glance |
GoCarousel | VBoxContainer | banners and character select |
GoKbd | HBoxContainer | key hints that do not lie |
Over the screen
| Class | Base | What it does |
|---|---|---|
GoDrawer | CanvasLayer | the side panel |
GoPopover | RefCounted | the anchored card |
GoContextMenu | RefCounted | long-press and right-click |
GoConsole | CanvasLayer | the developer console |
Go HUD Skill
gohud ships an AI skill: the whole API, runnable templates and a preview launcher. Paste one block into your coding agent and it installs gohud and knows how to use it.
Readability is measured, not eyeballed
"Pretty" is taste; "legible" can be measured. Faint grey text looks fine on a good monitor and disappears on a phone in daylight — picking by eye guarantees it eventually.
python3 addons/gohud/tools/check_contrast.py
Every colour pair and every button state's label over the panel it sits on is measured against WCAG, in all fourteen themes. Translucent colours are composited over their real backdrop first — measuring them directly reports a better ratio than the screen shows.
Text colours are therefore derived, not chosen: the builder takes the palette entry as a starting point and pushes its lightness until it clears the threshold on every surface it can land on. Change the palette and the contrast follows. The rules and the traps behind them →
Checks, releases and this site
One entry point runs every check; each part sees something the others cannot.
bash addons/gohud/tools/check_all.sh
| Check | What it catches |
|---|---|
run_tests.sh at four screen sizes | Widget behaviour and layout, RTL positions, keyboard focus, runtime skin contrast, every preset |
new_project_check.sh | Hidden dependencies on a host project; with --zip the release as shipped, with --export a Web build |
check_contrast.py | WCAG contrast of every theme file, button states and translucent panels included |
check_generated.py · check_scaffold.sh | Generated themes match their palettes; a throwaway theme builds and passes contrast |
check_package.py | The version taken from package.json, changelog moves and ZIP contents, in temporary copies |
check_site.py | This site's links, anchors, page language, glossary and dial tables |
Release versions
cat addons/gohud/package.json # { "version": "1.1.0" }
bash addons/gohud/tools/release.sh # every check → ZIP → that ZIP in an empty project
bash addons/gohud/tools/package.sh # 1.1.0 → builds/1.1.0/gohud-1.1.0.zip
The version is the one written in package.json — packaging never raises it. To release a new
version, change that number first. A successful run sets plugin.cfg and GoUi.VERSION
to it and, the first time that version is packaged, moves the Unreleased notes of CHANGELOG.md into
a dated entry. Packaging the same version again rebuilds its ZIP and replaces the old one. A failed run changes
nothing. The ZIP leaves out this website, the tests, the tools and package.json.
This site
python3 addons/gohud/tools/make_site.py # glossary and skin-dial tables, generated from source
python3 addons/gohud/tools/check_site.py # links, anchors, language, glossary, generated tables
bash addons/gohud/tools/site_shots.sh /tmp/shots # desktop and phone screenshots of every page
The pages are plain HTML in www/ — English at the root, Korean in ko/. A GitHub
Actions workflow publishes that folder as the site root.