Xo is experimental. The source is now public on GitHub, or try Xo in your browser.

Xo 0.17 release notes

released 2026-10-16 · tag v0.17.0 · all releases

Introduction

Xo 0.17 makes public key crypto and bulk TLS much faster and fixes a macOS XProtect false positive.

Runtime

  • Faults on Linux unwind without /proc (and under valgrind): the auxiliary vector is read from memory.
  • Native standard input from a FIFO sees its end of input on macOS.
  • Processes have 256 static words for the runtime’s own state (decision 0237).
  • Security and CoreFoundation load lazily on macOS: start up went from 28.5M to 14.4M instructions on LLVM.

Compiler

  • Add with carry chains on arm64, up to 8 pairs an instruction (decision 0231).
  • Large constant integer lists are kept as data: the HTTP client went from 2.51 to 2.12 MB on LLVM.

Standard library

  • P-256, X25519 and RSA use the carry chains: RSA 4096 server handshakes take 45.6% fewer instructions on arm64 and 43.3% on LLVM, RSA 2048 32.9% and 29.9%.
  • P-384 and P-521 signing use fixed base tables made on first use (0.37 to 0.45 of the time); ML-KEM takes 8 to 12% fewer instructions on arm64.
  • AES-GCM: GHASH folds four blocks per reduction and CTR runs 64 byte chunks. Bulk TLS beats Mbed TLS on both backends (AES-128, TLS 1.2: arm64 13.6, LLVM 11.8, Mbed 14.0 million instructions per MiB).

Ports

  • macOS: binaries from Xo’s own linker no longer match an XProtect signature (a program hung waiting for assessment); all 179 test programs scan clean.