# Xo 0.16 release notes


## Introduction

In Xo 0.16 the native runtime has no C left. On 2026-10-13 it was 26,743
lines of C, with 206,879 more in third party libraries. See
[No C left in the runtime](/blog/zero-c-runtime/).

## Runtime

- The runtime's C is 0 lines. `main` is Xo
  ([decision 0234](https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0234-exact-c-name-exports-data-symbols-entry-stubs.md)),
  the backends emit the program's entry, and Windows' stack overflow
  handler is Xo. The compiler builds no C into a native program.
- Faults unwind through a frame cache: 0.57 to 0.64 of the time before
  the runtime moved to Xo, on arm64.
- The native in-memory file system has every `Fs` method.

## Changes to the language

- `File`, `FileLock` and `Child` are handles: comparing them with `==`
  is error `XO0404`.

## Tools

- `xo test` runs native tests in batches, shrinks failures over a pipe,
  runs chunks in parallel, caches runs, builds LLVM test binaries at
  `-O0`, and takes `--timeout`. A warm run of the notes-service example
  went from about 43 s to about 0.25 s
  ([decision 0235](https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0235-batched-native-test-runs.md),
  [decision 0236](https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0236-fast-native-test-builds.md)).

## Compiler

- LLVM runtime slow paths are cold; AES-GCM and ML-KEM are faster.

## Ports

- Linux: every test program passes on linux/arm64 with both native
  backends. linux/amd64, run under emulation, passes after two unwinder
  fixes and a thread local fix in the LLVM backend. ThreadSanitizer and
  AddressSanitizer builds pass.

