Skip to content

2026-05

Choose a tag to compare

@Pagghiu Pagghiu released this 31 May 13:51
· 271 commits to main since this release

May 2026 Update Blog Post

Await

The biggest addition of the month is definitely Await.
It is a new C++20 coroutine layer on top of SC::Async, so the point is not replacing the existing async model, but letting the compiler write the callback state machine instead.

What I like here is that it is still very clearly shaped like Sane C++ code.
Tasks return Result, memory is still explicit through AwaitAllocator, buffers are caller-owned, and the underlying event loop remains the same one used by callback-style Async.
So the style changes a lot, but the project principles do not.

May has basically been about taking Await from "new experiment" to something that feels real enough to be tried on more than toy examples.
There are now awaiters for sockets, files, filesystem operations, signals, process exits, background work, wake-ups, task groups, detached registries, and timeouts, plus a pretty large set of examples to show how all these pieces fit together.

Development speed has also gone up a lot thanks to heavier AI usage.
I think this month already shows that pretty clearly, and next months will probably show even more of it, so...be prepared!

Even the very end of the month kept pushing Await further, with more stress coverage around teardown/cancellation, a spawnAll helper for task groups and even a no-stdlib coroutine shim.

Detailed list of commits:

  • b925529 Await: Add a new library wrapping Async primitives with C++ 20 coroutines
  • 46c5c64 Await: Add cancellations, arena and socket accept / sendAll
  • d38818e Await: Add documentation draft page and skill guide
  • 088ba97 Await: Add socket connect and UDP awaiters
  • d5aa320 Await: Add file read and write awaiters
  • 7a37c24 Await: Add loop work awaiter
  • d584bc7 Await: Add file send awaiter
  • 69a40a2 Await: Mark Await as draft library
  • 765b832 Await: Support waitFor cancellation
  • 03deac5 Await: Extend filesystem operations
  • e80a9b9 Await: Add process signal and spawn helpers
  • a6ed380 Await: Extend filesystem and task APIs
  • ce1df48 Await: Add wakeUp and waitAny support
  • 061ebff Await: Add scatter gather wrappers and echo example
  • 42c7f26 Await: Harden cancellation and arena policy
  • 663e3a0 Await: Add read helpers (receiveLine / receiveExact / readUntilEOF)
  • c8ebb4e Await: Add task group example
  • 8989972 Await: Add arena diagnostics
  • b757fec Await: Harden task lifetime guards
  • 849b4f5 Await: Add callback bridge example
  • f9a2fd1 Await: Add file courier example
  • 377194e Await: Defer child task teardown during callbacks
  • 111f82e Await: Promote docs to MVP status
  • a099e79 Await: Add line protocol example
  • c13f6f0 Await: Add background digest example
  • ee3ed9f Await: Add process exit example
  • c5f818d Await: Add thread wake-up example
  • 06e9491 Await: Add deadline example
  • 5a7cee4 Await: Add file patch example
  • c9d628d Await: Add config reload example
  • e40b1b0 Await: Add manifest preview example
  • 7e4a26a Await: Require explicit allocator
  • b83a382 Await: Add fixed task registry
  • 9fa7ce6 Await: Add task registry wait all
  • b3ebf67 Await: Add task registry wait any
  • 0c78efd Await: Add first response example
  • a12a41a Await: Guard cross-loop cancellation
  • 28df50b Await: Add service probe example
  • c0d1051 Await: Polish task ergonomics and allocator diagnostics
  • 61b1596 Await: Add task group spawnAll helper
  • fcf25c9 Await: Stress child teardown callback test
  • 24263c8 Await: Stress cancellation teardown
  • 219aa63 Await: Add no-stdlib coroutine shim

Http and HttpClient

The other huge theme of the month has been Http.
This is still a Draft library, but it has become much more practical for real examples instead of just being a parser plus a few low-level building blocks.

The most visible part is that the server side now has a small router, API server examples, better file-server behavior, and a more complete WebSocket path.
Things like SPA fallback, byte ranges, validators, If-Range, HEAD, OPTIONS, asset types, safer multipart filenames, cookies, authorization helpers, and URL query parsing are all the kind of boring HTTP details that make the difference between a demo and something actually pleasant to use.

The async client side has also been tightened up a lot, and the separate HttpClient keeps moving toward a more stable allocation-free transport layer.
There is now a better request API, transport metadata, TLS options, compression support, stronger validation, and examples for both the native-backend client and the async transport integration.

The TLS work is for now just preliminary, do not expert https support (for now).

Detailed list of commits:

  • ad7e13c HttpClient: Improve request API and add redirect/TLS transport metadata
  • 76112da Http: Add WebSocket frame core and tests
  • ec83d8e Http: Add WebSocket upgrade handshake
  • 4c650db Http: Add WebSocket lifecycle helpers
  • 9687f30 Http: Add WebSocket small hub
  • e8c1a04 Http: Add WebSocket canvas example
  • b207909 Http: Add client compression
  • 1bb6edf Http: Add WebSocket client connect
  • 4cdaa76 Http: Add API server example
  • 30895c9 Http: Add URL query parser
  • d8d5c9a Http: Add SCExample canvas demo
  • f2f5ebf Http: Harden file server paths
  • abd7070 Http: Add file server asset types
  • b02b3dc Http: Add HEAD request support
  • 620a795 Http: Reject unsafe multipart filenames
  • 70f0c9f Http: Add async client HEAD helper
  • 41e072d Http: Add common method parsing
  • efcd342 Http: Add file server OPTIONS
  • 2a4ccf5 Http: Add common response statuses
  • affc650 Http: Surface async server errors
  • 0969773 Http: Add file validator responses
  • 7b355e7 Http: Expose server header limit
  • 2047b4f Http: Add request target accessors
  • 24dce05 Http: Add content length helper
  • 49e3552 Http: Fix streamed file uploads
  • 3b4a402 Http: Add file server validators
  • 2ef75ba Http: Add file server byte ranges
  • 4025dea Http: Add file server SPA fallback
  • 6455961 Http: Match listed file server ETags
  • bd96df9 Http: Honor If-Range for file ranges
  • ba9a1bb Http: Add cookie header iterator
  • 205b92d Http: Add authorization header helpers
  • 6a706d4 Http: Add Set-Cookie helpers
  • 031ece2 Http: Export header helpers
  • 0c34393 Http: Add minimal router helper
  • 58ef1d7 Http: Route API server example
  • 9fce1b8 Http: Add urlencoded form helpers
  • d2056e9 Http: Harden async HTTP APIs and WebSocket support
  • c4100e4 HttpClient: Stabilize allocation-free transport API
  • 67e7842 HttpClient: Add async example and harden buffer validation
  • e1aaec9 Http: Add active transport streams
  • 348ea73 Http: Add TLS options
  • a5ca233 Http: Add async transport setup hook
  • 710945e Http: Polish HTTP helpers and example ergonomics
  • 88bf48f Http: Add multipart part predicates
  • f799967 Http: Stress chunked request decoding
  • 2c7a97e Http: Simplify canvas WebSocket
  • ffa22ad Http: HTTPS transport hook dispatch
  • 42a8d4a HttpClient: Validate request URLs
  • fd69550 HttpClient: Fail on response header overflow

Build and SC-package

After April being the big SC::Build month, May has been more specifically about SC-package.
The package manager got a fairly serious internal redesign to become more declarative, with structured receipts, exports, capabilities, recipes, locks, verification, and repair/doctor flows.

There is also more validation around cross support, more CI cache work, direct running of native translated Linux targets, and a Fil-C zlib package plus CI coverage for that toolchain.

Detailed list of commits:

  • 05297ef Build: Add clarifications for the version pragma
  • d2f4fe9 Build: Fix Windows build tool stale dependency detection
  • fe6ccbd Build: Add package phase registry
  • 95ab29b Build: Expose package recipe descriptors
  • 4ebdd31 Build: Add package doctor command
  • ec8a9dc Build: Validate package receipt contracts
  • d20e854 Build: Add package lock metadata
  • 91691aa Build: Add package capability constants
  • fb60224 Build: Run Fil-C SCTest in CI
  • 43c4c09 Build: Prewarm package caches
  • 7cf8841 Build: Cache macOS cross package installs
  • 810b686 Build: Run Linux native translated targets directly
  • 66412b4 Build: Transform SC-Package to become more declarative
  • c9490ee Build: Add package repair command
  • 57af5ac Build: Split package manager headers
  • 8eec625 Build: Split built-in package catalog
  • 168ff2a Build: Split package recipe engine
  • dc56c53 Build: Split package receipt engine
  • 5652f7e Build: Split package health engine
  • 5323f17 Build: Split package CLI engine
  • b0107dc Build: Split built-in package installers
  • 41c9963 Build: Structure package registry exports
  • 792003f Build: Use typed package export kinds
  • 8efe627 Build: Add package kind constants
  • 70e5ba5 Build: Use typed capability export lookup
  • c53cde4 Build: Stabilize cross support validation
  • 859810b Build: Fix package receipt validation
  • 8ec096c Build: Normalize package receipt JSON
  • 518458a Build: Add package lock verification
  • a988e8c Build: Add Fil-C zlib package

Standard Library Integration

Another notable theme of the month has been making Sane C++ easier to consume from normal C++ projects.
Standard C++ headers are now allowed by default, while the stricter no-stdlib mode is still available when one actually wants to push in that direction.

I think this is the right tradeoff.
The libraries still try hard to avoid hidden allocations and broad runtime dependencies, but making integration easier by default removes friction for external users and also makes features like Await much easier to justify.

The follow-up cleanup here is also nice: LibC.h is gone, public include coverage has been tightened up, and some no-stdlib edge cases in GCC / plugin builds have been corrected.

Detailed list of commits:

  • f662619 Everywhere: Add some missing public includes
  • 06e49ee Everywhere: Allow using C++ stdlib by default
  • 7e790e4 Foundation: Get rid of LibC.h
  • c7d68f5 Plugin: Do not use nostdinc++ on plugins
  • 50717f2 Build: Avoid unsupported GCC no-stdlib flag

Async

Async also deserves its own section this month.
The main point here is getting rid of the dynamic liburing loading and using io_uring directly instead, which makes the Linux backend story cleaner and more self-contained.

There are also a few useful follow-up fixes around filesystem handles, dispatched kernel events and Ubuntu 22.04 headers.
Not a huge flashy section, but definitely a nice set of improvements on its own.

Detailed list of commits:

  • 4540c76 Async: Preserve filesystem operation handles
  • 8b1a343 Async: Add AsyncFileSystemOperation::stop
  • 28f00ce Async: Use io_uring directly
  • 27892f4 Async: Clear dispatched kernel events
  • f8ab066 Async: Fix io_uring headers for Ubuntu 22.04

Others

The rest of the month is a mix of practical lower-level improvements.
There are a few platform fixes around shutdown and plugin cleanup, and the single-file generation tooling can now emit standalone amalgamations.

There are also a couple of nice quality-of-life fixes around development tooling and examples.
These are still the sort of changes that make the project easier to build, test, and use across different setups.

Detailed list of commits:

  • 1b9e045 File: Keep POSIX pipe descriptors out of the stdio range
  • a6b779b FileSystemWatcher: Avoid Linux shutdown fd race
  • 2d1c27e Plugin: Skip debugger file cleanup on registry close
  • f58835d SCExample: Close plugins before event loop shutdown
  • 43b9fc3 SingleFileLibs/Python: Emit standalone amalgamations
  • 9cd93b6 SCExample: Restore using GLES3 backend on Linux
  • e746176 VSCode: Start executable from native build folders

See you next month!

Full Changelog: release/2026/04...release/2026/05