Tue 31 March 2026

☔️ Sane C++ March 26

SC

Welcome to the March 2026 update!
This month focuses on a much more capable native backend in SC::Build, plus faster Http parsing and the first standalone HttpClient library.

Build

March has been a big month for SC::Build. Introducing the standalone native backend to build executables directly! It now supports static libraries, shared libraries, direct host builds on Windows, binary stripping and more control over exported symbols.

Parallel compile jobs and scheduling of independent projects are already in in this first draft, but more features will be coming!

Detailed list of commits:

Http and HttpClient

The Http work this month has been improving the hot path while cleaning up the internal API surface. A parser benchmark has been added, the parser itself gained a specialized fast path, and both request parsing and response header emission have been tightened up.

On the server side, Http also gained chunked encoding support and better AsyncFileServer PUT handling. These are the kind of features that slowly move a draft implementation away from toy examples and toward something that can be stress-tested more seriously.

The biggest user-facing addition is probably the new HttpClient library. It is a separate streaming-first HTTP client built on native OS backends (NSURLSession on Apple, WinHTTP on Windows and libcurl on Linux), while keeping the same caller-owned memory style used by the rest of the project.

Detailed list of commits:

Platform and Runtime

Another major theme of the month has been widening the platform surface exposed by the lower level libraries. FileSystem and File received a proper batch of metadata, permission and descriptor APIs, including link metadata, stat / lstat, path permissions, descriptor stat / sync / permissions, and reading stored symlink targets on Windows.

These are not especially flashy additions, but they matter because they reduce the amount of platform-specific glue needed by applications built on top of Sane C++. The libraries become more useful precisely when they cover this boring but essential operating-system surface in a clean and cross-platform way.

At the same time Socket and Async keep filling in some gaps with TCP_NODELAY, multicast, AsyncSignal, clearer io_uring diagnostics, explicit wake-up coalescing, easier OS-handle association helpers and a fix to make offset-zero writes use pwrite / pwritev instead of silently falling back to write / writev.

Detailed list of commits:

AsyncStreams and Tooling

AsyncStreams can now reason about backpressure more precisely inside AsyncPipeline, slice buffers more conveniently, check whether a readable stream can be started, and most importantly it has dropped an internal dependency on Async.

That same dependency cleanup extends to FileSystemWatcher, which now uses a template-based approach to avoid depending directly on Async, while Linux relative-path storage has been improved too. These changes are useful because they keep the dependency graph tighter and make the individual libraries easier to reuse in isolation.

The month also brought a few practical tooling improvements: a command line parser in Strings, a more reliable bootstrap timestamp check, updated tool dependencies, and repository skills for the various libraries and workflows.

Detailed list of commits:

See you next month!