Update 26.09.01

A new main menu, personalized game discovery, native Linux support, major UI rendering improvements, game jam announcement and the road ahead.

I am aware that us re-doing the menu is a meme at this point, but the main menu has once again been rebuilt.

The common complaint we get is that there are no good games. I think there are good games but we're not sufficiently putting them in front of people. Their instinct is the click on the server browser and find games there, which is the wrong way to do things in s&box, so we've removed the server browser.
This redesign puts games front and center. We're trying to show you more games that you might like and showing you exactly what they look like by playing videos.

There is also music. This music is temporary. It's there to encourage us to replace it. This does come with a new Game.Music API and a MusicComponent that will make it easier for everyone to add music to their games too.
Putting games front and center only works if we show you games you actually want to play, so the discovery algorithm has been rebuilt too.

The old discovery page showed the same 31 games to everyone, picked using a few global metrics. That only covers 1.2% of the games on the platform. If your game wasn't in that set, there was no realistic way for anyone to find it.

The new algorithm gets that coverage to around 70%, so most games now have a real chance of reaching at least a few players.

You might wonder about the remaining 30%. Those are games missing the basics: no thumbnail, no genre, no tags, no screenshots... If you fill those in and get a friend or two to play, your game will almost certainly start showing up for other people too.

Games now appear in a mix of shelves:
  • Some are  primarily based on personal taste, like Because you played X and Players like you played, More Genre X games...
  • Some are primarily based on global metrics, like Trending, Up & Coming and Highly Rated...

Overall we hope this gives every game a fair chance of being found, and makes it easier for players to find something they'll actually enjoy.
There's now a new Game Mounts page. The aim is to put this feature front and center and explain what it is.
Lastly we also updated the settings menu to align with the style of the new menu.
  • We also added a settings search
  • Fine-grained Post Processing options
  • And an auto detect mode that detects a preset we think is good for your GPU & CPU.
The game now ships with a fully playable native Linux client on Steam. This uses the Steam Runtime to provide a common set of dependencies and work across any distro.

People have been reporting good performance increases over the Windows version running in Proton. As well as big performance gains and stability on Steam Deck.

I'm sure we'll get snarky comments about Gmod and Rust's Linux support - this is different, we have made very deliberate choices to get here, we're open-source and we have the full source code and ownership of our engine.
We also got the editor shipping on Linux, this wasn't planned to happen as soon as it did, but the port of the client went so easily that a lot of the editor toolkit simply worked as well.

The editor never really worked all that well under Proton. And whilst there's obviously a good chunk of bugs still, the overall experience is so much better.

The only cave-at is this doesn't come with Valve native tools like Hammer, ModelDoc or Animgraph.
We've put ourselves in a very good position by choosing the right technologies that are open source and multi-platform like .NET, SDL3, Vulkan and more. This makes the burden of supporting multiple platforms much much easier.

So next up we'll be shipping a macOS editor.
Screen panels are drawn after post processing by default. That's usually what you want. But maybe you don't. Maybe you want your UI to get bloomed with the game, maybe you want radiation overlays to apply to the UI.

Well the ScreenPanel now has an option to render before Post Processing, which allows you to do just that.
Additionally, the UI can now render HDR colors, so you can make things super bright. The color parser understands basic multiplication now, so you can make colors brighter really easily.
background-color: rgba( white * 4, 0.5 );
color: #3273EB * 8; 
Linear, radial and conic CSS gradients are now rendered by the UI shader instead of baking an image. This means they're both smoother and quicker to generate.
I've gone through and made sure they're as close to 1:1 with the web standard as possible.. including positioned and repeated backgrounds, circle and ellipse sizing, pixel-based stops, transparent interpolation and corner directions.
The background-clip property is now supported!
I've been very bored of seeing rectangular UI in games, and wanted a way to draw arbitrary polygons and other shapes, but was lost on how to do it. Until I discovered the experimental CSS property border-shape.

With this CSS property you can define what shape your panels should draw in CSS:
border-shape: polygon( 25% 5%, 75% 5%, 100% 50%, 75% 95%, 25% 95%, 0% 50% );
border-shape: circle( 42px at 60px 45px );
I've implemented this in our UI renderer as SDF shapes, this means they're all lovely and anti aliased. You can give them border colors, you can give them drop shadows, etc. and they'll bit hit tested properly when clicking.

I hope this enables more and more creative UI in games!
Boxes, borders, clips and shadows all had different ideas of how round a corner was. This code has all been unified now, so they're all on the same page. It's also been improved on so the border radius can have h/v definitions too.
UI rendering is now done in Gamma Mode, which means that alpha blending looks a LOT more like you'd expect, like exactly like the web. I don't think anyone cares about this but it bugged me for a long time.
Heavily profiling the menu shook out some nice performance wins from the UI system. 

We were doing some stuff that doesn't really matter on its own, but starts to add up when you're doing it to 2,000 panels every frame, like inverting a matrix.

The text rendering is now unpremultiplied, which means it can be batched with everything else, leading to less draw calls.

Scrolling has gone back to not invalidating the whole layout - which felt really horrible.
 
Select two neighbouring faces and press L to continue the loop across the mesh, making long strips of geometry much faster to work with. 
Select Similar finds matching meshes and models from the current selection, bringing a familiar Hammer workflow into the scene editor.

I have updated how transform gizmo behaves with scaling and rotation. Before this update, rotating and scaling objects would not differ regardless of current transform space. This wasn't very intuitive and convenient, so now I've made it so using global/local spaces would have a difference for these tools.

Now, when resizing a group of objects in global space, they will be treated as one, from the centre of selection, instead of scaling each object individually. Resizing objects in local space will resize objects from their origin, just like before.
Rotating objects in local space will now rotate each object individually around their origin. Global space rotation stays unchanged.



You can now specify how do you want to set up initial materials on the model when creating them from asset browser and context menu. Before this, your model would have been always created with a default material group with a global override.

Now you can opt out of it entirely, and if you enable this option, you can specify which material should be used as a global override.
Scene tabs can now be dragged into whatever order suits the way you are working.
Hovering or selecting a bone gizmo now displays the bone name directly in the scene view, making rigs easier to navigate.
Our long term goal is to remove usage of Qt entirely. We've been evaluating alternatives and have decided that our best move for the future is to use our own Panel system.. because whatever we end up using we'll be wrapping it and making our own UI system layer from it anyway. If we're using our own Panel system then anything we improve for the editor will also be usable in game. It just makes sense to us.

So, as a first step, we've converted the Launcher away from Qt, and now uses the panel system.
This launcher comes with a few user-requested features. One of the most asked for is the fact that when you launch the editor it will detect it, highlight it on the entry, and not launch it again.
The road to replacing Qt will be a long one. There are a bunch of things that we need to implement, fix and improve on the panel system. Some of them have already happened. But to help us so that we have another app, in the bin/managed/ folder called PanelGallery.exe. This is a way for us to show and test the UI system.
The forums are much more forum like now, they should feel more familiar and easier to use.
Our documentation, API reference, tutorials and release notes are now all available in markdown by either appending .md to the end of a URL or through Accept: text/markdown.

Pretty boring stuff for humans, but exciting for clankers 🤖
We weren't doing a good job conveying our goals and progress, so we've updated the roadmap page and items. We've made it easier for ourselves to keep this up to date, as well as made it more consumable for you guys, each roadmap item can be clicked into a modal that has further details, links to GitHub and more.
We've had a distracted few weeks, but we're back at it now. I wanted to go over our plans, because I think I've mentioned them in the discord but not actually wrote them anywhere, and with the player numbers being pretty flat I am sure people are worried.

This is our engine. It's the Facepunch engine. We're working on it because we're Facepunch and we think that at some point we'll want to make game using our own engine. I don't want us to rely completely on Unity. I don't want them to be able to change their mind one day and tell us we owe them 40% of revenue going forward. I don't want us to become Unity. I want us to make a free, open source, modern engine. So regardless of whether people are playing in the s&box platform or not, we're going to keep doing this, it's an investment in our idealised future.

That said, we obviously want the platform to be successful. We want people to play games on the platform and enjoy it. We want people to make money from the platform. We want it to pay for its own development. So we're going to keep trying to encourage that.

The next step is a Game Jam. This will happen this month (September) starting on Friday 4th. It'll have a total prize pool of £50,000. We're trying to engineer a system that is as fun for players as it is for developers. We want the players to vote for the winner. We'll likely do a free weekend or a sale at this point. There'll be more on this really soon.

Then after that will be a Christmas sale with cross promotion with Rust. The hope is that if we're selling to an audience of people that aren't die hard Garry's Mod enthusiasts, they'll be more likely to find something they like, instead of things they don't like.

Then next year we'll aim to do more Game Jams at regular intervals. We'll iterate and improve each time and try to get them to a place where they basically run themselves.

Then at some point we'll look at what we have and say to ourselves.. you know.. let's make a game with a whole new IP. Then we'll get a team internally making a standalone game on our engine and release it on Steam and whatever consoles are knocking around at that point.
26.09.01
26.09.01
27 August 2026
🎁 Added
  • 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().
🧼 Improved
  • 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.
🪛 Fixed
  • 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.
🚯 Removed
  • 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.
matt
Facepunch
JoinedApr 2021 Posts251 Score2,045
Update 26.09.01 : news/update-26-09-01
zxcdulsed
Member
JoinedAug 2023 Posts25 Score1,355
Thanks for the native linux version of s&box ❤️ 
Zontax
Member
JoinedMay 2023 Posts77 Score7,317
Banger!
Playeroth
Member
JoinedApr 2026 Posts10 Score155
very cool! exciting stuff, cool Garry talk at the end. 
mikksies
Member
JoinedSep 2023 Posts3 Score3,789
oy vey
huge one fr
Asphaltian
Member
JoinedAug 2022 Posts178 Score1,473
I creamed
delete
Deleted Post
TheDapperGhost
Member
JoinedJan 2025 Posts4 Score4,147
Am I the one having trouble launching a project in linux
edited 9 hours ago#9
Novostranger
Member
JoinedJul 2022 Posts112 Score1,690
this update crashes my game. even after updating obs

My pc is full AMD, this didnt happen before. 
G+
Member
JoinedFeb 2024 Posts73 Score3,075
LINUX YES
Tomkha
Member
JoinedFeb 2025 Posts4 Score165
Thank you for the amazing update, appreciate all the work you're doing! pumped to be able to switch back to Linux 

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
Bubbies
Member
JoinedNov 2022 Posts20 Score1,370
Great job, im really happy about the UI updates that make the UI more cleaner with new shapes, gamma, and hdr colors 
Exl
Member
JoinedAug 2021 Posts7 Score3,415
Great job ! Another good update!

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
raresmac
Member
JoinedApr 2026 Posts5 Score561
Probably my favorite update so far. Really improved a lot and can'g wait for the game jam.

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.
The Relentless
Member
JoinedApr 2026 Posts9 Score345
 People need to have more patience, developing an engine isn't simple. Great update! 
Patrick Jr.
Member
JoinedApr 2021 Posts33 Score4,410
Oh boy theres the big blog post @matt mentioned, great job!
Missing
Member
JoinedJul 2022 Posts58 Score2,181
damn, this is actually a good patch note
El Weon Con Capucha
Member
JoinedJul 2022 Posts2 Score60
And what about Android support?
Sceggles
Member
JoinedFeb 2026 Posts1 Score5,251
Please add toggles for customizing the view of game content and thumbnails on the main menu. Every video playing by default makes me feel like an iPad Baby, just super overwhelming.
edited 2 hours ago#20
Fptbb
Member
JoinedAug 2022 Posts6 Score10
Biggest update ever, absolute cinema, but my editor is downloading the .exe still :D I mean, it's probably because the editor was last edited 27/04
⚔EmperShadows
Member
JoinedApr 2026 Posts4 Score5,573
Great update!
Titanovsky
Member
JoinedSep 2021 Posts319 Score3,283
 This is a great update, I think Linux users will be happy with it.

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.  💙
people
Log in to reply
You can't reply if you're not logged in. That would be crazy.