A new main menu, personalized game discovery, native Linux support, major UI rendering improvements, game jam announcement and the road ahead.
Linux support - the native engine, editor tooling and client build and run on Linux, packaged and shipped to Steam as a dedicated depot.
Linux builds are produced inside the Steam Runtime (sniper) container and bundle their own .NET runtime, so they run without a system install.
Main menu redesign - a new front page with navbar and condensed sidebar, a floating footer, game tiles and spotlight rows, activity and in-game-now feeds, and the reward drop and popup.
Menu music, with an easy API for playing it: Game.Music and MusicComponent.
The mounts page is rebuilt as a MountCard grid with mount extensions alongside it, and BaseGameMount exposes what the card needs to show.
border-shape generalises border-radius from rounded corners to an arbitrary polygon or circle, drawn with shape SDFs so edges antialias and borders trace the shape, with matching hit testing.
CSS colours can go above 1 for HDR - color, border-color and background-color all take them, and the parser understands brightness multipliers like rgba( white multiplied by 4, 0.5 ).
background-clip, including clipping a background to the text sitting on top of it.
Elliptical border-radius, via the h / v syntax and the two-value longhands.
Select a face loop when editing meshes.
Select all similar meshes and models, the same way Hammer does.
A bounds toggle in object mode.
Shaders can be recompiled in batches from an asset browser selection, through a proper compile queue rather than only ever compiling the last file selected.
Switching tabs in Project Settings without saving now warns you about unsaved changes.
MCP toolsets for driving and inspecting the UI - dump the live panel tree, probe panels, list matched rules, hit test, read pixels, screenshot, set styles and pseudo-classes, measure text and check batch counts, all without editing a file.
A UI parity test scene, so CSS behaviour can be eyeballed side by side against a browser.
A full-screen Settings page with search, hover descriptions and fine-grained post-processing controls.
Automatic graphics quality selection on first launch based on GPU and system memory.
A new launcher built with the Panel UI system, with running-editor detection and support for dropping projects into the window.
Panel-based native windows through PanelWindow, including clipboard integration and OS file and text drag-and-drop delivered to panels and games.
TextEntry undo and redo, read-only mode, improved Unicode and IME input, text drag-and-drop, multiline caret scrolling and more reliable selection behavior.
Number inputs can be scrubbed by dragging their labels.
Camera depth fade for SpriteRenderer, ParticleSpriteRenderer and ParticleTextRenderer.
ParticleSphereEmitter distance bias and one-sided axis controls for domes, lines and partial sphere emission.
ParticleEmitter.EvaluatedDuration and EvaluatedDelay expose resolved runtime timing values.
A Panel Gallery application for testing controls and UI behavior.
Optional material overrides when creating models from Asset Browser selections.
Scene tabs can be reordered by dragging.
Bone names are shown when bone gizmos are selected or hovered.
Slang uniformity validation catches unsafe bindless sampler indexing; sampler indices that vary across a wave must use NonUniform().
The UI blended in linear space against sRGB targets, so anything with alpha came out wrong. The shaders encode their own output for gamma blending now and it composites correctly.
Text is rastered unpremultiplied, so text textures are straight alpha like every other texture and batch together with regular boxes instead of needing their own blend mode.
Glyph overhang is no longer clipped out of the texture, sampling is clamped so neighbouring glyphs can't bleed in, text isn't mip-biased, and text can carry HDR colours.
Rich label spans use their own font size.
HDR colour used to blow out anti-aliased edges into a hard step; edge softening keys on coverage rather than alpha, so glyphs and rounded corners keep an SDR-shaped ramp while the solid interior still carries HDR for bloom.
Boxes, borders, clips and shadows now share one rounded-rectangle SDF and one gaussian blur, so a corner looks the same whatever draws it.
filter: blur and drop-shadow use a real gaussian instead of an approximation, and the colour filters use the CSS colour matrices evaluated in sRGB, like the web.
CSS gradients are evaluated in the pixel shader from a gradient table rather than baked into an image per panel, sized and placed by background-size and background-position like the web, with the angle convention no longer mirrored.
Gradient stop positions can be pixel lengths rather than only percentages, and a gradient to a corner leans with the box the way the web draws it.
Corner radii resolve the way the web does, including scaling down when adjacent radii overflow.
The batched box shader evaluates only the clips an instance actually has, and clips before shading rather than after; the clip ramp follows the screen pixel on world panels so the edge stays a pixel wide however the panel is angled.
A perf pass out of profiling the menu: PanelRenderer no longer inverts a matrix per panel per frame, layout and length values sit behind the dirty gate, scrolling doesn't invalidate the whole layout, Panel.GameObject caches from its parent, Razor skips bind updates when there are no binds, Texture.MarkUsed early-outs, CameraComponent reuses its mip-gen command list and Package.FullIdent is cached.
Screen panels can render before post processing, are snapshotted for the render thread, and have a stable sort order when z-index ties. Early UI is off by default now and the camera opts in, since it costs a seed and composite pass on the HDR buffer.
Menu music ducks while videos with audio are playing.
Undo works properly on Hide and Isolate actions.
Asset Browser directory watchers are shared and lifecycle-managed, and filesystem notifications dispatch safely.
Shader compile errors are no longer swallowed by the compile step.
Aftermath outputs the shader that crashed the GPU, so there's some context to debug with.
mimalloc's debug knobs are kept out of Retail, and its errors are recorded without allocating.
Panel applications avoid allocating scene memory they never use, and Panel windows draw without the scene rendering pipeline.
Menu videos select quality from their displayed size, limit and rotate concurrent playback, crossfade cleanly and stop decoding while not being drawn.
Launcher startup work was deferred and Vulkan discovery optimized, reducing measured startup-to-visible-window time from 2.12 seconds to 0.98 seconds.
Global-space scaling treats a multi-object selection as one group around its center; local-space scaling and rotation operate around each object origin.
Movie Maker creates missing playback targets by default, handles MapInstance children correctly, records fewer redundant Enabled tracks and keeps maps visible while scrubbing recorded demos.
Curve presets preserve the current curve range by default, with an explicit option to apply the saved range.
Fractional mouse-wheel input is preserved for high-resolution wheels and trackpads.
Base package code and controls now live in the engine, reducing package startup and dependency overhead.
Shared package UI controls retain source compatibility where they do not conflict with older navigation APIs.
Baked envmaps crashed on higher quality settings - probe coefficients were read out of bounds, which the new slang backend no longer implicitly safeguarded.
Corner radii changed shape with the root panel's scale: a plain border-radius: 8px rendered as a circle at 1080p but a progressively flatter ellipse above it.
Movie bone animation: several places resolved the animator from the wrong scene, bone overrides weren't cleared when bone track data was deleted, and "Remove Empty" was slow because it updated the track list after every removal.
Animgraph event dispatch survives re-entrant tag handlers.
A square corner where opposite radii overlapped, and a wrong box-shadow silhouette on tall radii.
A vertical border radius transitions from the horizontal one instead of snapping.
Hit-testing treats rounded corners as ellipses, matching how they're actually drawn.
Downsampled render targets no longer round to zero.
A batch of CSS parser fixes: text-decoration: none was ignored, an empty url() threw instead of resolving to nothing, aspect-ratio didn't accept none, hsl() failed to parse with spaced-out components, a child selector didn't match when nested in another block, Panel.SetAttribute threw on a null key, and scroll offsets moved even with nothing to scroll.
The text measure cache keys on height when text-overflow is set, so an ellipsised label doesn't reuse a measurement taken at a different height.
Nav active state ignores the query string.
Gizmo.Position signature restored.
Menu polish: sidebar nav button alignment, the pill-shaped cancel load button, MapSelector text sitting under a gradient, home page content scrolling under the tab bar, right-hand column padding matching the sidebar, centred section-head content, and GameGroup titles matching other sections.
Max-width centring shifted from the page content to the whole menu now that navigation is on the side, and widened to a 21:9 size.
World-space animation transforms remain correct when root motion data exists but root motion application is disabled.
Launcher fixes for variable DPI, missing samples directories and incorrectly positioned popups.
Fixed absolute-positioned UI children collapsing against unpositioned parents and inherited inline styles failing to load, including Settings pages remaining visible after navigation.
Focusing a TextEntry repaints both affected panels so its caret appears immediately.
Shared dynamic textures no longer render stretched in every panel after the first one using them.
SceneObject.OnAfterRender now runs after every primitive of a multi-material model rather than after its first draw call.
ResourceCompiler no longer mistakes serialized component type names such as Sandbox.Decal for asset dependencies.
Velocity-facing particles preserve their position and orientation as damping reduces velocity to zero.
Curve handles work when a curve contains one key or has a length of one.
Inspector group paste works correctly.
Edge Arch undo works correctly and matches the behavior of the bevel tool.
Default combo keybinds display correctly.
Absolute asset paths work correctly on Linux.
Linux editor file watching, managed launchers, filesystem paths and packaged .NET runtime behavior were corrected.
Package builds fail clearly when no assemblies are copied and carry addon assemblies correctly between build and upload runners.
PackageCard styling now lives in the engine-owned base controls so uses outside the main menu, such as the organization modal, render correctly.
Preserved gizmo and editor-tool PNGs when filtering material source files from package builds.
Obsolete CitizenAnimationHelper enum aliases continue to resolve for existing packages.
Protocol 29 removes the package.base and local.base package. Its code now lives in the engine and its assets live under core. Remove explicit base-package references and calls to CompilerExtensions.AddBaseReference, then rebuild your package.
Removed legacy navigation compatibility types that conflict with old packages: Sandbox.UI.NavHostPanel, Sandbox.UI.NavLinkPanel, Sandbox.UI.INavigatorPage and the old Sandbox.UI.NavigationExtensions. Use the equivalents in Sandbox.UI.Navigation.
Removed public SceneCamera.OnRenderPostProcess and SceneCamera.OnRenderOpaque. SceneCamera.OnRenderOverlay and SceneCamera.OnRenderUI are now internal. Use CameraComponent.AddCommandList with the appropriate rendering stage.
Removed SrgbWriteEnable0 through SrgbWriteEnable7 render states. Render-target color space now controls sRGB encoding; custom shaders should remove assumptions based on these states.
Removed the standalone CSS shadow and outline shaders, now folded into the shared SDF box shader.
Removed BoxDrawDescriptor.PremultiplyAlpha and the per-instance premultiply flag now that text uses straight alpha.
Removed the featured item from the item store.
Removed desktop buttons from the menu UI.
Removed unused scene-system code and unnecessary work from CFrustum construction.
huge one fr
My pc is full AMD, this didnt happen before.
I looked forward to the game jam but sadly bummed out that I will not be able to participate this time. Hopefully there'll be more opportunities for that soon! Looking forward to checking out all the submissions tho
I regret the server browser; this is probably the end of the roleplay community with custom RP mods different than DXRP or something else that's popular
Are the categories for winners and/or prize rankings going to be announced when it starts? Right now it looks like only first place takes it all.
Like I said before, s&box is a long-term project, and there is still a lot of work to be done. Obviously, the connection between the platform and the engine is very strong, and honestly, I don't know if Facepunch will be able to stay this positive with some very strange maps, you could even call them bad. I believe in them, and I really want us to get an engine that makes exporting easy and straightforward, as well as a platform with several tens of thousands of players, preferably within a year or two, not in 2040.
Either way, this is a great update, and I'll keep making games in s&box! This is the future. This is what Rockstar, Epic, and Unity are now desperately trying to catch up with because they didn't believe in UGC platforms. 💙