# Xo 0.19 release notes


## Introduction

Xo 0.19 makes native code the default, links Linux programs with no C
library, makes servers much smaller, runs the playground on Xo's own
compiler, and makes tasks faster.

## Tools

- Native is the default backend: arm64 on arm64 hosts, LLVM elsewhere.
  Use `--backend=go` for programs that `use go`
  ([decision 0248](https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0248-native-default-backend.md)).
- Contract fuzzing on the native backends
  ([decision 0250](https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0250-native-contract-fuzzing.md)),
  and `xo dump` of a running program's tasks on SIGQUIT
  ([decision 0251](https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0251-native-dump.md)).
- An execution trace: `XO_TRACE` and `xo trace`
  ([decision 0240](https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0240-native-execution-trace.md)).
- The profiler is gated in release builds and samples on Windows too;
  its writers moved to `xo prof`
  ([decision 0245](https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0245-profiler-in-binaries.md)).
- DWARF types and variables for arm64, first stages
  ([decision 0252](https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0252-dwarf-variables.md)).
- The browser [playground](/play/) runs on Xo's WebAssembly backend
  ([decision 0242](https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0242-playground-on-xo-wasm.md)).
- Lazy runtime bodies: `hello` builds in 622 ms instead of 947 ms
  ([decision 0247](https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0247-lazy-runtime-bodies.md)).

## Runtime

- Single thread task spawn went from about 4.8 to 1.13 times tokio
  current_thread's cycles.
- RWMutex readers stay on the worker that granted them: the rwmutex
  benchmark went from 90 to 40 ms, and HTTP p99 latency from 1,536 to
  1,328 us.

## Compiler

- Smaller binaries: TLS and HTTP/2 are linked only when a program calls
  `with_tls`, so a JSON server went from 2.51 to 0.94 MB on arm64
  ([decision 0244](https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0244-tls-linked-only-when-configured.md)),
  and code for other targets is folded away
  ([decision 0246](https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0246-fold-target-and-test-mode.md)).
- arm64: if-conversion, carry intrinsics inlined, constant folding of
  `*`, `/` and `%`, and cold slow paths kept out of line.
- The first part of Xo's own x86-64 backend: its assembler
  ([decision 0254](https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0254-amd64-backend.md)).

## Standard library

- Time zones ship with the standard library (IANA 2026e); no Go needed.

## Ports

- Linux without C: programs that do not `use c` link no C library. Xo's
  ELF linker builds them as static binaries, also when cross built from
  a Mac
  ([decision 0243](https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0243-linux-without-c.md)).

