Gum Release — June 19, 2026
Breaking Changes
This release continues the namespace unification toward a single Gum.* surface and bumps the runtime syntax version to v3. Existing code keeps compiling via permanent [Obsolete] shims (you'll get build warnings pointing at the new names), and Roslyn analyzer code-fixes automate most of the edits.
GumServicemoved to theGumnamespace.MonoGameGum.GumServiceandRaylibGum.GumServiceremain as permanent[Obsolete]shims, so existing code still compiles — but you can now dropusing MonoGameGum;and useGum.GumService.WindowZoomModeand the hot-reload types moved as well. (#3122)AddToRoot()/RemoveFromRoot()are now instance methods on visuals (a single GumCommon implementation that dispatches through the activeGumService), so they work withoutusing MonoGameGum;. (#3122)- Forms default visuals, default shape renderables, and the
IReadOnlyListextension methods moved toGum.Forms.DefaultVisuals,Gum.Renderables, andGum.ExtensionMethods. The oldMonoGameGum.*names still compile but are now[Obsolete](CS0618 warnings pointing at the new namespace). (#3138) - Input consolidated onto
Gum.Input. Addusing Gum.Input;— the GUM001 analyzer code-fix applies it automatically. Gamepad query methods (ButtonDown/ButtonPushed/ButtonReleased/ButtonRepeatRate) now takeGum.Input.GamepadButtoninstead of XNAButtons; the GUM003 code-fix rewritesButtons.X→GamepadButton.X.CursorandKeyCombointentionally remain inMonoGameGum.Input. (#3146) - Code generation now emits
using Gum;and targets the collapsed shape runtimes —ColoredCirclegeneratesCircleRuntime, andColoredRectangle/RoundedRectanglegenerateRectangleRuntime— for projects at runtime syntax version 2+. The legacyColoredCircleRuntime/ColoredRectangleRuntime/RoundedRectangleRuntimetypes are no longer generated; legacy v0 projects keepusing MonoGameGum;. (#3115, #3122)
For more information on migrating, see the upgrade guide: https://docs.flatredball.com/gum/gum-tool/upgrading/migrating-to-2026-june
Biggest Changes
Custom Post-Process Shaders on Render-Target Containers
A render-target Container can now run a custom post-process shader over its entire contents. In code, set ContainerRuntime.RenderTargetEffect to a constructed MonoGame Effect, or reference a .fx file by name through ContainerRuntime.SourceShaderFile (registering a resolver that compiles the .fx into an Effect, a seam similar to the font loader). The shader is applied when the container's cached texture is blitted back to the screen, including for nested containers and under camera zoom (MonoGame/KNI/FNA). In the Gum tool you can pick the .fx from a file picker (shown when Is Render Target is checked) and see it applied live in the WYSIWYG preview, with the reference carried into generated code. See https://docs.flatredball.com/gum/code/standard-visuals/containerruntime
Every Built-In Theme Now Has a raylib Variant
All eight built-in Gum themes — Editor, Dark Pro, Bubblegum, Forest Glade, Hazard, Meadow, Neon, and Retro 95 — now ship raylib variants (Gum.Themes.<Name>.Raylib NuGet packages). raylib users can style an entire UI with a single parameterless Apply() call, matching MonoGame and KNI, including shape-based and embedded-TTF-font themes like Dark Pro.
Runtime Font Generation on raylib
The raylib backend now supports in-memory font generation via the new KernSmith.RaylibGum package — generate fonts on the fly by family, size, bold/italic, and outline with no pre-baked .fnt files, matching what MonoGame/KNI/FNA already had. Large and outlined fonts now render correctly (previously they came out as garbage), and generated fonts are cached and freed so repeatedly changing font properties — e.g. dragging a size slider — no longer leaks VRAM.
Create a Component From an Instance
The tree-view Create Component command now promotes the selected instance — its children and intrinsic variables — into a real new component, instead of creating an empty Container shell. An optional checkbox replaces the original subtree with a single instance of the new component (preserving its name and position) as one undoable action.
Gum Tool
- Create a Component from an instance — promote a selected instance (its children and variables) into a new component, optionally replacing the original subtree with an instance of it, in one undoable action. (#3149)
- Render-target shader authoring — pick a
.fxpost-process shader on a render-target Container via a file picker (shown only when Is Render Target is checked) and preview it live in the editor; the reference is carried into generated code, and compile failures are reported to the Output window. (#3211) - Git merge-conflict markers left in
.gumx/element/behavior files now produce a clear, actionable error (naming the conflict) in the Errors tab andgumcli check, instead of a cryptic "error in XML document". A conflict in the main project stops the load; a conflict in an element file flags just that element and lets the rest of the project load. (#3158) - Committing an invalid variable-reference line by clicking away to another instance no longer leaves the Variables grid showing the previous instance's data — the failure dialog is now deferred until the selection change settles. (#3154)
- Drag-and-drop onto the wireframe that silently did nothing now reports why in the Output window (blocked target, unsupported file type, empty/multi-file drop, or an exception during the drop). (#3135)
- Dragging multiple sprite files from outside the project folder now shows a single consolidated copy-confirmation dialog listing all files at once, instead of one prompt per file. (#3130)
- A dropped sprite now shows the correct sprite icon in the tree view and is created directly as a Sprite, instead of being created as a Container and then converted. (#3132)
- Fixed a NullReferenceException that could crash the editor while loading or refreshing a project with an instance still selected. (#3202)
- Authoring a Forms StackPanel: its Spacing and Orientation now drive the visual layout (StackSpacing / ChildrenLayout) live in the editor preview, and those visual variables are hidden on instances so the Forms properties are the single source of truth — previously a Spacing value or Horizontal orientation set in the tool was reverted at runtime. (#3189)
- The Forms Spacing slider on a StackPanel now scrubs smoothly instead of at ~1fps; also fixed numeric scrubbing leaking fractional rounding between pooled variable rows and not snapping to whole pixels on high-DPI/scaled displays. (#3192)
- The Output window (and Code window) are now left-aligned (ragged-right) with a monospace font (Consolas), so diagnostics and column-aligned content are readable. (#3195)
gumcli codegennow loads the project's localization files (CSV/RESX) before generating, so command-line codegen produces correctly localized output like the in-tool generator. (#3121)- Code generation targets the collapsed shape runtimes (
CircleRuntime/RectangleRuntime) for projects at runtime syntax version 2+. (#3115) - The Gum tool download (
Gum.zip) now uses a single-file publish, so the top-level folder is no longer cluttered with dozens of loose DLLs. (#3133) - Runtime snapshot export now reconstructs Forms controls as real Gum Components (ten buttons become one Button component plus ten thin instances), so a snapshot of a live game UI opens in the tool reading structurally as Button/ListBox/Label, with layout-container and Text-control fidelity fixes. (#3193)
GumServiceis now in theGumnamespace,AddToRoot/RemoveFromRootare instance methods, and generated code emitsusing Gum;. (#3122) — see Breaking Changes.
Gum Runtimes
- Custom post-process shaders on render-target Containers — set
ContainerRuntime.RenderTargetEffectto a MonoGameEffect, or reference a.fxfile viaSourceShaderFilewith a registered resolver; applied when the container's cached texture is blitted, including nested containers and under camera zoom (MonoGame/KNI/FNA). (#3204, #3207) - raylib runtime font generation via the new
KernSmith.RaylibGumpackage — on-the-fly fonts by family/size/bold/italic/outline with no.fntfiles; large and outlined fonts now render correctly; generated fonts are cached and freed to stop VRAM growth. (#3173) - Menu, MenuItem, PasswordBox, and Image Forms controls now work on raylib (V3 default visuals) — previously
new Menu()/new PasswordBox()on raylib produced a null Visual or threw a NullReferenceException. (#3177) - raylib NineSlices now support tiling the middle section,
BorderScale, andCustomFrameTextureCoordinateWidth, reaching parity with MonoGame/Skia. (#3106) - raylib shape stroke parity:
StrokeWidth=0now fully suppresses the stroke on raylib (no more faint ~1px white hairline on slider tracks and scrollbars), matching MonoGame. (#3184) - raylib now sizes Text from the bitmap font's
.fntline height instead of approximating it, so raylib Text — and any container around it, like a ListBoxItem — matches MonoGame's height instead of coming out ~3px short. (#3186) - Fixed every Editor-theme control (Button, CheckBox, ComboBox, ListBox, TextBox) drawing a white outline on raylib — the legacy Color now drives the rendered stroke, matching MonoGame. (#3187)
- raylib fonts are now correctly deferred while layout is globally suspended (
IsAllLayoutSuspended), so the font-batching optimization actually takes effect on raylib as it does on MonoGame. (#3147) - NineSlice runtimes created in code now default to 100x100 on MonoGame, matching raylib/Skia (previously they started at the 32x32 base default). (#3107)
- NineSlice animation properties (
Animate,CurrentChainName,AnimationChains,AnimationSpeed,CustomFrameTextureCoordinateWidth) are now data-bindable on MonoGame/raylib/Skia —PropertyChangedpreviously fired only on the Sokol backend. (#3111) - SkiaGum's
GumServicenow implementsIGumServiceand setsIGumService.Default, so GumCommon/Forms code resolves the Skia runtime the same way it does on MonoGame and raylib — making Forms controls usable on Skia. (#3113) - Fixed a "ShapeRenderer is null" crash on KNI/WASM (e.g. XnaFiddle) where a plain
RectangleRuntime/CircleRuntimecrashed merely because the shapes assembly was present in the deployment — these now fall back to the core no-shapes renderer and render correctly. (#3114) - New
ClickBubblingvisual event — respond to a click on an element even when it lands on a child: it fires first on the clicked element, then bubbles up to each parent, and a handler can setargs.Handled = trueto stop it (counterpart toClick, which only fires on the clicked element). See https://docs.flatredball.com/gum/code/events-and-interactivity/visual-events (#3117) - Project Properties → Texture Filter now carries from the editor to your running game on load (e.g. Linear), so scaled sprites render smoothed to match the WYSIWYG preview instead of always falling back to Point filtering (MonoGame/KNI/FNA and raylib; per-layer settings and any code-set
Renderer.TextureFilterstill win). (#3201) - Loose content (custom fonts, sprite textures) now resolves correctly when your game runs inside a macOS
.appbundle (Contents/Resources/), across all backends (MonoGame, KNI, FNA, raylib, Skia). (#3159) - Fixed AutoGrid layouts spreading rows/columns apart with a growing gap once children spilled past the minimum cell count — most visible in a Forms ListBox whose InnerPanel uses AutoGridHorizontal. (#3168)
- Runtime snapshot export: embedded sprite-sheet visuals (Forms-control backgrounds) are saved to deduped PNG files next to the project instead of rendering blank in the tool; export now works with a relative or bare filename; and Forms Image icons export as proper Sprites instead of empty Containers. (#3203)
- Runtime snapshot export now stamps the current (v3) project version, so the exported
.gumxshows the expanded Circle/Rectangle shape-variable categories in the tool. (#3144) - Variable references can now assign enum-typed variables, and a string/int value reaching an enum property (
ChildrenLayout,XOrigin/YOrigin,Width/HeightUnits,TextureAddress) is now coerced instead of throwing — fixing an editor-tab crash and silent value loss in release builds. (#3189) - Input consolidated onto
Gum.Input; gamepad APIs takeGamepadButton. (#3146) — see Breaking Changes. - Many
MonoGameGum.*types moved toGum.*namespaces. (#3138) — see Breaking Changes.
Tutorials and Templates
- New Font Playground sample (MonoGame, with a matching raylib host) — pick a font family, size, bold/italic, outline thickness, and smoothing and watch a
TextRuntimere-render live, demonstrating runtime in-memory font generation with no.fntfiles on disk. (#3172, #3173) - New RaylibGumThemesShowcase sample that applies and compares the raylib theme variants side-by-side against the MonoGame showcase. (#3179)
- New RenderTargetEffectScreen demo in the MonoGameGumInCode sample showing a custom post-process shader applied to a render-target Container — exercises both the
RenderTargetEffect(constructedEffect) and.fxSourceShaderFilepaths. (#3204, #3207)
What's Changed
(Complete per-PR list since Release_June_11_2026. Curated highlights are above; this is the full, verifiable changelog. 58 PRs.)
- Tool authoring for render-target Container SourceShaderFile (.fx picker, codegen, preview resolver) (#3210) (#3211)
- Docs: cross-link tool Outline Thickness page to code-side colored-outline path (#3209)
- Resolve render-target shader from a .fx reference on ContainerRuntime (SourceShaderFile, runtime half) (#3206) (#3207)
- Document that Styling.ActiveStyle.Text styles fonts across all controls (#3208)
- Add post-process shader support for render target containers (#816) (#3204)
- Runtime snapshot: extract embedded-texture backgrounds to PNG files (#3197) (#3203)
- Apply project TextureFilter to the runtime on load (xnalikes + raylib) (#3199) (#3201)
- Fix NRE in AvailableContainedTypeConverter.GetStandardValues when SelectedElement is null (#3196) (#3202)
- Document texture filtering (Project Properties + runtime Renderer.TextureFilter) (#3200)
- Runtime snapshot: synthesize Components from Forms-control instances (#3073) (#3193)
- Output window: left-align (ragged-right) text + monospace font (#3194) (#3195)
- Fix StackPanel Spacing slider ~1fps scrub (incremental wireframe update for Forms value-aliases) (#3192)
- StackPanel Forms: drive Spacing/StackSpacing & Orientation/ChildrenLayout from Forms properties (+ enum support in variable references) (#3189)
- Modernize obsolete RectangleRuntime single-color API in Editor theme + samples (#3188)
- Fix raylib RectangleRuntime legacy Color to drive the rendered stroke (#3187)
- Fix raylib text line height to use .fnt lineHeight (match MonoGame) (#3186)
- Add Raylib install tabs to the themes docs (preview) (#3185)
- #3183: Fix raylib shape stroke parity (StrokeWidth=0 hairline + 1px-stroke vanish) (#3184)
- Add raylib variant of the Editor theme (Gum.Themes.Editor.Raylib) (#3179)
- #3181: Replace per-theme NuGet list with copy-paste backend tabs (#3182)
- #3160: Surface themes in tutorials, themes reference, and repo README (#3180)
- #3174: Enable Menu/MenuItem/PasswordBox/Image Forms controls on raylib (#3177)
- #3162/#3164: Raylib font parity via KernSmith + dynamic font playground (raylib) (#3173)
- Add dynamic font playground sample (MonoGame) (#3172)
- #3163: Move KernSmith<->Gum font integrations into the Gum repo (#3171)
- Docs: right-to-left stacking + gum-user-question-triage skill (#3170)
- #3167: Document ListBox keyboard/gamepad item-focus model (#3169)
- #3166: Pack AutoGrid rows/columns when they spill past the cell minimum (#3168)
- Docs: restructure the June 2026 migration page for clarity and completeness (#3165)
- #3153: Detect git conflict markers on load and report a clear error (#3158)
- #731: Resolve loose content from macOS .app bundle Resources directory (#3159)
- #480: Document the Animations tab; note Named Events are FRB1-only (#3155)
- #566: Defer invalid variable-reference dialog so the variable grid isn't left showing a stale instance (#3154)
- Remove Star Velocity section from README (#3151)
- #130: Create Component from an instance (promote to component, optional replace) (#3149)
- #3039: Defer Raylib font loading under IsAllLayoutSuspended (converge deferral guard with MonoGame copy) (#3147)
- #3137: Consolidate gamepad input onto Gum.Input and unify the input namespace (GUM001/GUM003) (#3146)
- #3136: Add 'Using Gum with AI' docs section (#3145)
- #3141: Stamp NativeVersion on runtime snapshot export (.gumx) (#3144)
- #3140: Add Version 3 section to 'Upgrading File (GUMX) Version' doc (#3143)
- #3120: Unify MonoGameGum.{ExtensionMethods,Renderables,Forms.DefaultVisuals} namespaces into Gum.* (#3138)
- #105: Document rotating/scaling clipped contents via render-target Sprite (#3139)
- #3128: Add diagnostics for silent drag+drop failures (#3135)
- Organize Gum.zip: single-file publish to reduce top-level DLL clutter (#3133)
- #3123: Link Introduction to Setup page; add direct latest-release link (#3134)
- #3127: Pass baseType directly to AddInstance in file drag+drop (#3132)
- #3126: Consolidate file copy dialog when drag+dropping multiple sprites (#3130)
- #3119: Unify GumService namespace (GumService/WindowZoomMode → Gum, AddToRoot as instance method, syntax v3) (#3122)
- gumcli codegen: load project localization files; fix Localization harness CodeProjectRoot (#3118) (#3121)
- Add ClickBubbling visual event (#3116) (#3117)
- #2775: Codegen targets collapsed shape runtimes at syntax version 2 (#3115)
- RectangleRuntime/CircleRuntime no longer require shapes (#3112) (#3114)
- Wire IGumService on SkiaGum and convert SilkNet screens to FrameworkElement (#3108) (#3113)
- NineSliceRuntime: raise NotifyPropertyChanged on all platforms (#3110) (#3111)
- NineSliceRuntime Bucket 4 (#2908): document XNA-only per-slice texture model as a permanent gate (#3109)
- NineSliceRuntime Bucket 1 (#2908): align MG default size, document XNA-only gates (#3107)
- Raylib NineSlice: tiling middle sections, BorderScale, CustomFrameTextureCoordinateWidth (#3105) (#3106)
- Docs: clarify runtime snapshot has no passive cost but a real per-call cost (#3103)
Full Changelog: Release_June_11_2026...Release_June_19_2026