We overhauled the third person camera to be a lot smoother, so being in a vehicle feels great.
You can now stick hoverballs on your contraptions to fly around!
There are now Saves in Sandbox so you can save and load entire play sessions. These work in singleplayer or multiplayer, and will keep track of the map, players, all props and entities, ect.
We've been pushing updates almost every single day now, so if you've noticed something that was previously broken, it's probably been fixed. A lot of our focus over the last couple of weeks has been on stability, so there's not been as many glossy features.

We're always looking for feedback, so feel free to share your feedback on the forums, and show us your contraptions, and screenshots!
Facepunch sponsored DreamHack Birmingham over the weekend. We attended and had a booth showcasing s&box, letting people try out the platform, Sandbox, Sausage Survivors 2 and community games.

It was an overwhelming success with many people coming back again and again for another round of Sausage Survivors 2. We got some valuable feedback on how people use the platform for the first time. And it was great to support our local gaming community where we're based.
When we first got Source 2 it was the Half-Life: Alyx branch, the only dynamic light you could have was your flashlight. We threw more in but it was never really intended to be used this way, we didn't have ownership of the shadow mapping and it was difficult to do anything with.

I've removed all of Valve's C++ shadow mapping code and written a new shadow mapper in C#. Why rewrite?
  • Our C# and HLSL is open source, anyone can see how it works, fork and improve it. 
  • Full ownership: we know how every part works.
  • Less code, simpler, easier to follow and less room to fuck up. 
We saw this fixing critical bugs like shadows disappearing completely in Construct, but we also see small performance wins without any real changes to behaviour.
One of the key changes with shadows is the swap from a traditional shadow atlas to bindless shadow maps.

A shadow atlas is a big preallocated texture (8192 x 8192) that contains all shadows in the scene, at 32 bits this texture takes up 256MB of VRAM. If you're playing a game that doesn't need many shadows this is wasted, if you're playing a game or map that needs a lot, you can potentially run out of space.

Switching to bindless means we can dynamically allocate individual shadow maps, we don't have to mess around with finding where in the atlas we can render to, trying to manage what happens if we run out of space etc.

If your game uses no shadows, congratulations you've got 256MB of VRAM back!
Directional lights can now configure their cascades, specifying how many they want and where they split.
This is great if you're working on a top down game with a limited view, you'll only need 1 cascade for all your shadows, increasing performance.
Each light can now control the hardness of it's shadow's from 0 - 1.
Lights placed in Hammer set to Baked were getting mixed shadows, this was wrong. We've changed the behaviour of the direct light setting now.
  • Baked: baked shadows, nothing dynamic is rendered
  • Dynamic: no baked shadow, renders everything dynamically
  • Stationary: uses a baked shadow map and mixes dynamic shadows over the top
We had no ways to configure the performance settings of shadows, now we have a shit ton of convars to control max shadows, max number of cascades, shadow filter quality, max resolutions, and more.. These are globally configured in the graphics settings menu now too.

Here's how the different filter qualities look:
Source 2's Vulkan renderer is designed to be used from a very specific amount of threads.

However in s&box .NET can run async code from any thread, we need to be able to use renderer methods from 100s of different threads, we need it to still be fast and we need it to be stable.

We had a hacky solution before which was growing unbounded, leading to memory leaks and crashes.

This has now been resolved, improving engine stability.
We made a few changes to how we handle larger network payloads (ObjectCreate & Refresh Messages). Most of the gains come from improvements to our compression pipeline, reducing CPU and bandwidth usage on client and server:
  • Server were compressing broadcasted messages once per connection instead of once per message, resulting in  unnecessary CPU load.
  • We now strip null values from JSON before compressing. Doesn't reduce the payload size a lot, but noticeably cuts compression/decompression overhead for both client & server.
  • We used to chunk large payloads first and then compress each chunk individually. Flipping that around turns out to make a pretty big difference, especially on the client side.
Here are some cherry picked benchmarks (~1MB payload 1000 GOs & 2000 components):

Compress   with nulls                       0.210 ms/op (old)
Compress   without nulls                    0.165 ms/op (new, 1.27x faster)

Decompress with nulls                       0.232 ms/op (old)
Decompress without nulls                    0.074 ms/op (new, 3.13x faster)

Server chunk-first:                         0.85 ms/op  (old)
Server compress-first:                      0.88 ms/op  (new, ~same)

Client chunk-first:                         1.16 ms/op  (old)
Client compress-first:                      0.34 ms/op  (new, 3.4x faster)
If you're unfortunate enough to be French you very likely have an AZERTY keyboard, or German with a QWERTZ layout. With games binding default keys to WASD, you would always have to rebind to ZQSD... 😫

We've made our input system use scan codes now, which standardizes input keys based on position instead of name. Meaning when a game binds something to the W key, if you're an AZERTY keyboard that will be bound to the Z key automatically.
The hub page was confusing, I've redesigned it a bit with smarter cards and grouped friend activity. I'm sure we'll change it some more.
  • New cards, which are a little bit smarter and give info about upvotes/downvotes and active players. 
  • Friend activity is now condensed and grouped nicely, making it more readable. We use avatars instead of game icons here, showing online state, allowing you to join friends, etc. 
  • Achievements are sorted by percentage complete, and we filter out games with no earned achievements now. 
hulls from render would create a single hull from ALL render meshes, now they have the option to create a hull per mesh or per element (each set of connected faces)

this allows better collision when saving map meshes, selected map meshes that have a mix of hull and mesh collision types are supported in the saved model.
Everything is continuing to come together, we've been playing Sandbox everyday, it's starting to feel very well rounded. Building contraptions, messing around, taking screenshots for our Steam page.

We tried to quietly announce our release date — 28th April, but it seems everyone has got excited.

Before then we'll be revoking anyone who hasn't played a lot recently, developed games or bought skins.
And we'll then go on sale for $20

It's April  — we've got the month left to really beat out the worst of the rough edges. Don't expect too much fanfare in the upcoming updates, we're doing the boring stuff before we can get to the fun stuff again.
26.04.01
26.04.01
1 April 2026
🎁 Added
  • New C# shadow mapper, fully replacing Source 2's native shadow mapper
  • Bindless per-light shadow maps
  • Directional light configurable cascade counts
  • Per-light shadow hardness
  • User quality settings for shadows
  • ModelDoc hulls from meshes now supports per-mesh and per-element hull generation, allowing better collision when saving map meshes with mixed hull and mesh collision types
  • HtmlPanel now supports ordered and unordered lists
  • Footstep sounds for glass surfaces
  • Mesh element selection now supports undo/redo in the editor
  • New hub page layout with smarter game cards showing upvotes/downvotes and active players, condensed friend activity grouped by game, and achievements sorted by completion percentage
  • Movie recordings can now be imported from any game into a blank project, and games can disable demo recording on clients
🧼 Improved
  • Input system now uses scan codes for gameplay input, making the game usable on non-QWERTY keyboard layouts (e.g. AZERTY) without rebinding — key glyphs are translated to local key names
  • Vulkan per-thread data rewritten with a dynamic slot pool that bounds memory usage and eliminates potential out-of-bounds access from unbounded thread indices
  • Pixel shaders are now stripped for opaque objects during shadow and depth passes, reducing GPU work
  • Physics hull creation is more robust, routing through CQuickHullBuilder to avoid potential infinite loops with coplanar points and adding support for planar geometry
  • Network broadcast now encodes the wire payload once instead of per-connection, and large messages are compressed before chunking — client decompression is ~3.4x faster
  • Network serialization omits null values, reducing JSON processing overhead and improving compression/decompression speed
  • Sprite system optimized to perform a single GPU upload instead of one per group, eliminating upload overhead
  • RadiusDamage batches and parallelizes LOS traces with reduced allocations, improving heavy explosion processing from ~10s to ~2s
  • Heartbeat ping/pong switched to unreliable channel, eliminating head-of-line blocking under packet loss
  • Movie recording performance improved by avoiding reflection in hot paths, reducing per-frame recording cost
🪛 Fixed
  • Potential infinite loop in PolygonMesh.Rebuild with fractional/coplanar vertex positions
  • Memory leak in DeltaSnapshotSystem where pooled snapshot IDs were not cleared before returning to the pool
  • OutOfRangeException in Rigidbody when Bodies and BodyTransforms sync lists arrive independently
  • "Lobby Disbanded" spam, lingering socket, and stuck loading screen when host disconnects mid-join
  • Modals not closing when joining a game, server, or lobby
  • Lingering error toast popups not dismissing across game/menu context switches
  • Atmosphere sky shader not using the new single sunlight path
  • IgnoreGameObjectHierarchy not applying to child objects
  • Client hotload not clearing reflection type cache, causing errors after server-side code changes
  • Damage falloff being inverted in RadiusDamage
  • Movie recording of TextRenderer, NaN rotations, and target creation edge cases
🚯 Removed
  • Deprecated OnDirty, MakeDirty, and OnPropertyDirty in favor of field-backed properties
trophy 1540
Apr 2021 177 posts
Update 26.04.01 : news/update-26-04-01
trophy 1998
Sep 2021 213 posts
trophy 2470
Apr 2021 77 posts
Loving the progress as usual. Keep it up lads.
trophy 3316
Jan 2025 22 posts
what is the April fools joke?
trophy 315
Jul 2023 38 posts
"If you're unfortunate enough to be French you very likely have an AZERTY keyboard" What do you mean "unfortunate"... 😡😡

Joke aside, nice devblog, I really appreciate this change for the keyboard layout and the improvements to shadows especially !
trophy 0
Apr 2026 1 post
props to all squad to amazing work especially with the hub rework ,excited for full release on steam
trophy 1385
Feb 2024 50 posts
Im glad there was no april fools joke here! this is all awesome!
trophy 3955
Aug 2021 11 posts
Glad to see the official release upon us, wish the game well success and hope to see many new games in S&box down the line 
trophy 495
Jul 2022 2 posts
Nice update thanks for hard work guys.
people
Log in to reply
You can't reply if you're not logged in. That would be crazy.