Sun 31 May 2026

🌸 Sane C++ May 26

SC

Welcome to the May 2026 update!
This month introduces the new Await coroutine library, expands Http into something much more practical, and keeps pushing SC-package and standard C++ integration forward.

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:

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:

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:

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:

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:

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:

See you next month!