Gum Release — July 6, 2026
Breaking Changes
Gum.SkiaSharp(SkiaGum) is now rendering/layout only.GumServicehas moved out to each host package (SkiaGum.Wpf,SkiaGum.Maui, standalone) instead of living on SkiaGum itself. This is a breaking change for any code that referenced SkiaGum'sGumServicedirectly — update to the host-specificGumService. Real-world impact is expected to be near-zero (no known external consumers ofSkiaGum.GumServicetoday), but it's a public API removal so it's called out here. (#3220)- Legacy V1/V2 Forms default visuals are now marked
[Obsolete](a compiler warning, not an error) and are planned for removal in a future release. V3 remains the current default. (#3493)
For more information on migrating, see the upgrade guide: https://docs.flatredball.com/gum/gum-tool/upgrading/migrating-to-2026-july
Biggest Changes
Raylib Reaches Render-Target & Post-Process Shader Parity
Raylib containers can now do everything MonoGame's render-target containers gained last release: bake a subtree to an offscreen texture and composite it back — including nested render targets, group alpha, additive blending, and now custom post-process shaders via RenderTargetEffect/SourceShaderFile. A string of raylib-specific bugs that would have undermined this (zero-size targets dropping content, blend leaking onto siblings, stale-frame flashing, camera zoom/pan getting clobbered by a blurred dropshadow bake, off-camera targets bleeding content into the visible area) were fixed along the way. See https://docs.flatredball.com/gum/code/standard-visuals/containerruntime
TextRuntime Baked Drop Shadows
Text can now have a real drop shadow baked directly into its font atlas at generation time. Set HasDropshadow (plus DropshadowColor, DropshadowOffsetX/Y, DropshadowBlur) on a TextRuntime and KernSmith bakes a per-glyph shadow into the font, replacing the old workaround of rendering the label twice to fake a shadow. Requires KernSmith registered as the font generator. See https://docs.flatredball.com/gum/code/standard-visuals/textruntime/fonts
Code Generation Now Targets Raylib
Screens and Components can generate C# code targeting RaylibGum — selectable in the tool's Output Library picker, or auto-detected by gumcli codegen-init for Raylib-cs projects. Initial support covers the FindByName instantiation style; FullyInCode codegen for Raylib isn't supported yet.
Raylib Inline BBCode Text Markup
Raylib's Text now renders inline BBCode markup — [color=Red], [FontScale=1.5], and friends — with per-run styling, matching MonoGame. Previously these tags were stripped with no visual effect on raylib. See https://docs.flatredball.com/gum/code/standard-visuals/textruntime/bbcode
Restyle Any Built-In Theme Before Applying It
Every built-in theme (DarkPro, Bubblegum, Editor, Retro95, Forest Glade, Meadow, Neon, Hazard) now exposes a mutable XyzStyling.ActiveStyle — e.g. DarkProStyling.ActiveStyle.Colors.Primary = ... — so you can restyle a shipped theme's colors and fonts before calling Apply() instead of forking its source. Along the way, a few themes had colors that were cached too early to pick up ActiveStyle changes; those now read live.
Animation Editor Reliability Overhaul
A cluster of fixes makes the animation editor trustworthy again: keyframes referencing a missing state or animation now show a clear red error icon (in both the keyframe list and the tree view) with a tooltip naming the specific missing state and category; errors refresh immediately on project open, on edit, and on undo/redo instead of going stale; animation edits (timing, state/animation references) are now part of undo/redo; deleting a keyframe prompts for confirmation; and .ganx files edited externally now live-reload instead of requiring a restart.
Experimental Standards Palette
A new View menu option ("Standards palette (experimental)", off by default) replaces the Standard elements tree folder with a draggable chip grid pinned to the bottom of the Project panel. Drag a chip onto the tree or wireframe canvas to create an instance, right-click a chip for "Add to current element" or "Edit defaults", or Ctrl+click to add it to the currently open Screen/Component.
Gum Tool
- Experimental Standards palette — see Biggest Changes. (#3404)
- Animation editor reliability overhaul — see Biggest Changes. (#3382, #3389, #3394, #3396, #3397, #3398, #3407, #3409, #3411, #3412)
- Code generation setup now auto-detects shared projects (
.shproj) as well as.vbproj/.fsprojas the project root, so KNI/MonoGame setups with multiple heads sharing one project no longer require a.csprojto enable code generation. (#3499) - Fixed a code-generation bug (CS0117) that made
FullyInCodegames fail to compile when targeting plain MonoGame, Raylib, WPF, MAUI, or Xamarin.Forms — a Forms-only method call was being generated for all output types, not just MonoGame Forms. (#3502) - Fixed a crash ("Cannot modify the empty collection") running
FullyInCode-generated code for a Screen with no BaseType on the unified MonoGame/Raylib/KNI/FNA runtime, if the Screen had any instances; also fixedFullyInCodeScreens outside MonoGame Forms output defaulting to a tiny 32x32 size instead of filling their parent when no explicit Width/Height was set. (#3503) - Fixed opening older (pre-v3) Gum projects auto-injecting newer v3-only variables into standard elements on load, which broke FlatRedBall codegen for older projects with compile errors after the project was re-saved. (#3290)
- Fixed SVG export (
gumcli svgand File > Export) silently dropping Rectangle shapes. (#3262) - Fixed a crash exporting a project to SVG when it contained a Line shape. (#3365)
- The Errors tab now explains the red "!" missing-file indicator in the tree: selecting a flagged element shows a GUM0004 error naming the element and the file path Gum expected to find (also surfaced by
gumcli check). (#3366) - Gum now detects when an element's file is deleted from disk while the tool is running and flags it with the red "!"/GUM0004 error instead of silently diverging until the next save; restoring the file automatically clears the indicator. (#3371)
- Fixed: declining to recreate a missing standard/screen/component file ("Recreate it?" > No) no longer gets silently overridden — Gum no longer regenerates that file the next time the project is saved. (#3370)
- Fixed a crash (KeyNotFoundException) when the tool tried to recreate a missing Skia shape standard (Arc, Canvas, Line, Svg, LottieAnimation) or legacy shape (ColoredCircle, RoundedRectangle) while loading a project; it now shows an informational message telling you to restore the file from version control or re-add the plugin instead of crashing. (#3375)
- Fixed a crash when pressing Ctrl+C to copy text in a dialog if Windows briefly denied clipboard access; the tool now retries more and silently gives up instead of crashing. (#3377)
- Copy/paste now preserves your selection: pasting a parent instance with children no longer selects all the new children too — only what you originally had selected is selected after paste. (#3272)
- The Variables tab's right-click menu on an exposed variable now says "Rename Variable [exposed name]" instead of the misleading "Edit Variable", since that action only renames the exposed name. (#3379)
- TextBox controls (Standard and Bubblegum Forms themes) now preview multi-line vs. single-line mode in the tool when you set TextWrapping/AcceptsReturn, instead of showing no visible change at design time. (#3387)
- Fixed the Output window printing the same "Error setting SourceFile" message 4 times when selecting a Screen or Component containing a Sprite with a missing/invalid SourceFile — now printed once. (#3213)
- The Output window now confirms when a Container's shader file compiles successfully for the WYSIWYG render-target preview, instead of staying silent on success. (#3216)
Gum Runtimes
- Raylib render-target & post-process shader parity — see Biggest Changes. (#3436, #3448, #3451, #3467, #3468, #3469, #3477, #3479)
- TextRuntime baked drop shadows via KernSmith — see Biggest Changes. (#3413)
- Raylib inline BBCode text markup — see Biggest Changes. (#3480)
- Built-in theme restyling via mutable
ActiveStyle— see Biggest Changes. (#3439, #3441, #3442) - Full raylib Blend-mode and shape-parity sweep: raylib now supports all Gum Blend modes (Replace, ReplaceAlpha, SubtractAlpha, MinAlpha, Additive, etc.) on Sprite, NineSlice, Rectangle, and Circle; Sprite texture wrap/tiling (
Wrap=true); Arc gradient fills; Sprite/NineSlice auto-loading.achxanimation chains; andIsAntialiasedadded to Circle for cross-platform code compatibility. (#3453, #3455, #3457, #3461, #3473, #3492) - Raylib Text now supports
GetCharacterIndexAtPosition(for click/tap-to-character lookup),Blend, and a per-instanceTextRenderingPositionModeoverride to opt out of pixel-snapping — all matching MonoGame. (#3485) - Raylib Forms gamepad navigation now reads the analog triggers and right stick, matching the MonoGame gamepad driver (previously only the left stick and face/shoulder buttons were read). (#3484)
- Raylib Sprite now honors
ColorOperation.ColorTextureAlpha(tint fills the sprite using only the texture's alpha as a mask), matching MonoGame; also fixed a MonoGame bug where a sprite using this color operation would retroactively tint other sprites already queued earlier in the same batch. (#3488) - Fixed raylib projects: Menu, MenuItem, and PasswordBox components defined visually in the Gum tool (loaded from a
.gumxfile) now get their proper interactive Forms behavior — previously they silently fell back to plain, non-interactive elements even though the identical controls worked when created in code. (#3489) - Fixed raylib Sprites with an oversized source rectangle repeating at the edges instead of clamping. (#3462)
- Fixed
CircleRuntime.Colorrendering a white outline instead of the assigned color on raylib. (#3446) - Fixed a RaylibGum font-cache bug that caused fonts to be repeatedly re-rasterized and re-uploaded to the GPU, making theme switching (and any repeated font use) slow to leak over time. (#3447)
- Raylib text now renders using the project's TextureFilter setting (Point or Linear) instead of always forcing Point filtering; loading a multi-page bitmap font from a bundled/in-memory stream now fails with a clear error instead of silently rendering wrong glyphs from only the first page. (#3497)
- Fixed rectangles with a ScreenPixel-unit corner radius not scaling correctly under camera zoom on raylib, matching MonoGame/KNI/FNA and Skia. (#3495)
- Fixed raylib text disappearing (and vertical stacking breaking) after the first Text failed to load a
.fntfile — the empty fallback font got reused for every later Text in the same layout, collapsing them to zero size. (#3232) - Fixed a memory leak where GPU render targets used by
IsRenderTargetcontainers were never freed when rendering via the single-layerDraw(Layer)path — most notably affecting FlatRedBall/Glue integration, which uses this draw path by default. (#3418) - Fixed render-target-backed textures (referenced via
RenderTargetTextureSource) showing up blank when referenced from a different layer than the one currently being drawn with per-layerDraw(Layer)calls. (#3420) - Performance: invisible
IsRenderTargetcontainers are no longer re-rendered every frame unless something actually references them. (#3421) - Fixed a performance issue in the experimental Forms Grid control where resizing a child inside a plain Auto-sized row triggered a full rebuild of every cell in the grid, causing multi-second freezes when nesting non-trivial controls inside Grid cells. (#3217)
- Fixed Text progressively shrinking and eventually disappearing (in both the tool's editor preview and at runtime) when using
TextOverflowVerticalMode.TruncateLinetogether withHeightUnitsset toRelativeToChildren. (#3378) - Fixed Text with an inline
[FontScale]markup run overlapping the next element in a stack — the larger run's height/width is now correctly included in the reported layout size. (#3482) - Fixed dropshadows with very large blur values saturating to a flat gray blob instead of fading out like a real soft glow, on Circle and RoundedRectangle in both the tool and at runtime. (#3266)
- Fixed a visible gap between the fill and stroke at rounded corners on filled Rectangles with a stroke and CornerRadius set. (#3270)
gue.AddChild(formsControl)/RemoveChildnow work under a plainusing Gum;— no need forusing Gum.Forms.Controls;(which could collide with your own control names likeStackPanel) or the olderMonoGameGum/RaylibGumnamespaces. (#3227)- Fixed a bug in the MonoGame Circle and Rectangle shape runtimes where cloning a shape with a gradient fill didn't apply the gradient to the clone until some other property was changed afterward. (#3427)
- Fixed a NullReferenceException loading MonoGame/KNI/Skia projects with previously code-generated screens/components that reference shape or standard runtimes predating the
Gum.GueDerivingnamespace migration — existing generated code now works without needing to regenerate. (#3381) - Fixed ListBox corrupting selection and throwing when a non-
ListBoxItemvisual (e.g. a Button) was mixed into Items — adding/selecting items after it could throw or select the wrong object; clicking a non-ListBoxItemis now correctly inert. (#3306) - Fixed ListBox rows all highlighting together when the same data object appeared more than once in the bound Items list; also fixed
SelectedIndexsometimes pointing at the wrong row after reordering, and Ctrl+Click multi-select failing when two rows shared the same duplicate data value. (#3510) - ListBox/ItemsControl now supports inert decorations (separators/chrome) placed between rows via new
AddDecoration/InsertDecorationBefore/InsertDecorationAfter/RemoveDecorationAPIs — decorations can't be selected, keepSelectedIndexcontiguous, and are skipped by keyboard/gamepad navigation. (#3314) - Fixed Standard Element category/state assignments (e.g. a NineSlice's
ColorCategoryStateorStyleCategoryState) silently doing nothing in code-only games — projects with no loaded.gumxfile, or usingFullyInCode— these now apply correctly. (#3506) - Reduced per-frame managed allocations during idle rendering by ~85% (831 to 128 bytes) by fixing an internal per-frame rendering state stack that grew unbounded every frame — less GC pressure and fewer potential frame hitches in MonoGame/KNI/FNA games. (#3514)
What's Changed
- Runtime allocation pass (#1934): idle Draw-walk zero-alloc + SpriteBatchStack NET8+ leak fix (#3514)
- Document Raylib code generation support (Output Library + codegen-init auto-detect) (#3511)
- Fix ListBox selection collapsing all rows sharing a duplicate data reference (#3510)
- Unify MonoGame shape demos into MonoGameGumInCode, retire GumShapesGallery (#3474) (#3508)
- Fix Standard Element category/state assignments silently no-op in code-only games (#3505) (#3506)
- Fix FullyInCode codegen crash and layout bugs for unified-runtime Screens with no BaseType (#3503)
- Fix RefreshInternalVisualReferences codegen gate to MonoGameForms only (#3502)
- Recognize .shproj (and .vbproj/.fsproj) as valid code-gen project roots (#3499)
- raylib Text: apply project TextureFilter to font textures (#3497)
- RaylibGum RectangleRuntime: add CornerRadiusUnits (ScreenPixel scaling) (#3494) (#3495)
- Forms: mark V1/V2 default visuals as [Obsolete] (#3493)
- RaylibGum CircleRuntime: add Blend (real) and IsAntialiased (parity) (#3491) (#3492)
- Samples: mirror Blend-on-Text row to MonoGame and make additive visible (#3490)
- raylib: register from-file Menu/MenuItem/PasswordBox Forms defaults (#3489)
- raylib Sprite: honor ColorOperation.ColorTextureAlpha (#3486) (#3488)
- Docs: mark raylib native text input as intentional won't-do (#3487)
- raylib Text parity: GetCharacterIndexAtPosition, Blend, TextRenderingPositionMode override (#3485)
- RaylibGum: read gamepad triggers and right stick in Forms driver (#3484)
- Text: grow reported size by per-line inline [FontScale] run (#3481) (#3482)
- raylib Text: render BBCode inline Color/FontScale markup (#3471) (#3480)
- raylib: render nothing for off-camera / degenerate render targets, converging on MonoGame (#3478) (#3479)
- raylib: skip off-camera render-target bake so it can't clear the screen (#3475) (#3477)
- raylib: implement full Blend mapping (Replace/ReplaceAlpha/SubtractAlpha/MinAlpha) (#3473)
- Fix raylib blurred dropshadow clobbering active render target inside a bake (#3469)
- Add raylib container post-process shader (RenderTargetEffect / SourceShaderFile) (#3465) (#3468)
- RaylibGum: bake invisible render-target containers when referenced by a Sprite (#3452) (#3467)
- Fix raylib blurred dropshadow clobbering active camera for rest of frame (#3460) (#3463)
- Implement software clamp-to-edge for raylib Sprite Wrap=false (#3459) (#3462)
- Add raylib Blend support to RectangleRuntime (#3458) (#3461)
- raylib: implement Sprite texture wrap / tiling (#3456) (#3457)
- Add gradient surface to raylib ArcRuntime/LineArc (#3454) (#3455)
- Port SpriteRuntime.RenderTargetTextureSource to raylib (#3451)
- Enable Sprite/NineSlice .achx auto-load via SourceFile on raylib (#3453)
- Fix RaylibGum font-cache poisoning causing repeated texture regen/leak (#3447)
- Re-enable ClipsChildren inside a render target on raylib (#3440) (#3448)
- Add theme customization checkbox + docs (#3445)
- Fix CircleRuntime.Color rendering white outline on raylib (#3444) (#3446)
- raylib render-to-texture for IsRenderTarget containers (#3434 PR 1) (#3436)
- Fix stale palette references in themes README (#3443)
- Themes: mutable XyzStyling.ActiveStyle for Retro95, ForestGlade, Meadow, Neon, Hazard, Template (batch, part of theme palette redesign) (#3442)
- Themes: mutable EditorStyling.ActiveStyle + fix missing Accent sync (#3441)
- Themes: mutable XyzStyling.ActiveStyle for DarkPro + Bubblegum (#3439)
- Document V3 code-only styling's state-color mechanism (#3438)
- Add Raylib support to code generation (#3431)
- Extract shared Gradient/Dropshadow state from Circle/RectangleRuntime (#3427)
- Skip baking invisible render targets unless referenced. (#3421)
- Fix cross-layer RenderTargetTextureSource on per-layer Draw(Layer). (#3420)
- Fix render-target leak on single-layer Draw(Layer) (#3418)
- Docs + samples: TextRuntime baked drop shadow (#3414) (#3415)
- Expose KernSmith baked text drop shadows at runtime (#2724). (#3413)
- Show broken-keyframe indicator on animation list rows (#3401) (#3412)
- Live-reload .ganx animation files edited on disk (#3410) (#3411)
- Name the missing reference in animation keyframe error (#3400) (#3409)
- Make animation edits undoable (fold into the element undo snapshot) + keyframe-delete prompt (#3407)
- Add experimental Standards palette to replace the Standard tree folder (#973) (#3404)
- Refresh animation keyframe errors after deleting a category (#3392) (#3398)
- Unify tree-view error icon to a circled-! matching the keyframe ErrorCircle (#3391) (#3397)
- Focus the animation-name textbox when the New Animation popup opens (#3390) (#3396)
- Make missing-state keyframe error readable in both themes and move it to the top (#3385) (#3394)
- Mark broken keyframes with a red error icon in the animation keyframe list (#3386) (#3389)
- TextBox: drive line-mode (LineModeCategoryState) from TextWrapping/AcceptsReturn at design time (#3387)
- Detect animation keyframe errors per-element (headless) so the tree '!' shows on project open and on edits (#3293) (#3382)
- Loader: instantiate obsolete shape/standard shims, not the new base (#3380) (#3381)
- Say 'Rename Variable' for exposed variables in the Variables-tab context menu (#3301) (#3379)
- Fix Text vanishing under TruncateLine + RelativeToChildren height (#3372) (#3378)
- Don't crash the tool when Ctrl+C clipboard copy hits CLIPBRD_E_CANT_OPEN (#3368) (#3377)
- Fix shape runtime docs: correct FillColor/IsFilled model and mirror Circle/Rectangle pages (#3376)
- Don't crash recreating a missing Skia standard; inform instead (#3373) (#3375)
- Detect runtime deletion of element files and flag missing source (#3367) (#3371)
- Don't recreate missing-source element files on project save (#3369) (#3370)
- Surface missing-source elements as GUM0004 in the Errors tab (#3309) (#3366)
- Fix headless SVG export crash on projects containing a Line (#3324) (#3365)
- Remove the shipped ListBoxSeparator convenience visual (#3321)
- Document the ListBox/ItemsControl decoration API (separators/chrome) (#3316) (#3318)
- ListBox/ItemsControl decoration API: inert separators/chrome between rows (#3305) (#3314)
- Resolve ListBox selection by reference so non-ListBoxItem visuals can't corrupt it (#556) (#3306)
- Version-gate standard-element back-fill so old projects aren't injected with v3 variables (FRB #1881) (#3290)
- Mirror copy-time selection after paste (#3269) (#3272)
- Fix #3268: reduce rounded-rect fill corner radius by FillInset (#3270)
- Fix #2955: energy-preservation falloff for extreme dropshadow blur (#3266)
- Fix #3259: register Rectangle runtime in SkiaGum so it renders in SVG export (#3262)
- Docs: modernize MonoGameGum.Input.* / MonoGameGum.Forms.* in code-doc samples (#3257) (#3258)
- Docs: teach
using Gum;for GumService in setup/tutorial pages (#3221) (#3255) - Docs: fix broken/missing internal links across the docs site (#3238) (#3244)
- Documentation updates (#3237) (thanks @kaltinril)
- Fix raylib font cache-hit serving the empty font cached after a failed .fnt load (regression from #3173) (#3232)
- Modernize hand-written samples to
using Gum;and normalize raylib loop order (#3222) (#3230) - Make GraphicalUiElement.AddChild/RemoveChild instance methods so gue.AddChild(formsControl) works under 'using Gum;' (#3226) (#3227)
- Make Gum.SkiaSharp rendering-only; relocate render-only GumService to a host-owned model (#3218) (#3220)
- Docs: make code-only Forms tutorial cross-platform (MonoGame + Raylib) (#3178) (#3219)
- Fix Forms Grid layout storm: skip rebuild on resize for plain Auto rows (#3205) (#3217)
- Report successful render-target shader compiles to the Output window (#3216)
- Fix Sprite SourceFile error printing 4x on screen selection (#3212) (#3213)
Full Changelog: Release_June_19_2026...Release_July_06_2026