<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Release history on Xo Language</title><link>https://xolang.dev/releases/</link><description>Recent content in Release history on Xo Language</description><generator>Hugo</generator><language>en-US</language><lastBuildDate>Sun, 25 Oct 2026 19:58:16 -0400</lastBuildDate><atom:link href="https://xolang.dev/releases/index.xml" rel="self" type="application/rss+xml"/><item><title>Xo 0.32 release notes</title><link>https://xolang.dev/releases/0.32/</link><pubDate>Sun, 25 Oct 2026 19:58:16 -0400</pubDate><guid>https://xolang.dev/releases/0.32/</guid><description>&lt;p&gt;&lt;strong&gt;Downloads:&lt;/strong&gt; &lt;a href="https://github.com/xo-lang/xo/releases/tag/v0.32.0"&gt;Xo 0.32.0 on GitHub&lt;/a&gt;,&#10;with archives for macOS (Apple silicon and Intel, signed and&#10;notarized), Linux (arm64 and x86-64), and Windows (x86-64, Authenticode&#10;signed), and a &lt;code&gt;SHA256SUMS&lt;/code&gt; file.&#10;&lt;a href="https://xolang.dev/docs/getting-started/#install"&gt;Getting started&lt;/a&gt; shows how to install&#10;one. Versions 0.28 to 0.31 were internal bootstrap compilers with no&#10;public archives, so these notes cover everything since 0.27.0.&lt;/p&gt;&#10;&lt;h2 id="xo-against-go"&gt;Xo against Go&lt;/h2&gt;&#10;&lt;p&gt;Each release is measured against Go on the same Mac&#10;(&lt;a href="https://github.com/xo-lang/xo/blob/main/bench/results/release-vs-go-v0.32.0.md"&gt;bench/results/release-vs-go-v0.32.0.md&lt;/a&gt;,&#10;lines 9 to 295):&lt;/p&gt;</description></item><item><title>Xo 0.27 release notes</title><link>https://xolang.dev/releases/0.27/</link><pubDate>Fri, 23 Oct 2026 13:35:07 -0400</pubDate><guid>https://xolang.dev/releases/0.27/</guid><description>&lt;p&gt;&lt;strong&gt;Downloads:&lt;/strong&gt; &lt;a href="https://github.com/xo-lang/xo/releases/tag/v0.27.0"&gt;Xo 0.27.0 on GitHub&lt;/a&gt;,&#10;with archives for macOS (Apple silicon and Intel, signed and&#10;notarized), Linux (arm64 and x86-64), and Windows (x86-64, Authenticode&#10;signed), and a &lt;code&gt;SHA256SUMS&lt;/code&gt; file.&#10;&lt;a href="https://xolang.dev/docs/getting-started/#install"&gt;Getting started&lt;/a&gt; shows how to install&#10;one.&lt;/p&gt;&#10;&lt;h2 id="xo-against-go"&gt;Xo against Go&lt;/h2&gt;&#10;&lt;p&gt;Each release is measured against Go on the same Mac&#10;(&lt;a href="https://github.com/xo-lang/xo/blob/main/bench/results/release-vs-go-v0.27.0.md"&gt;bench/results/release-vs-go-v0.27.0.md&lt;/a&gt;,&#10;lines 11 to 24):&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Run time: Xo is faster on 14 of 20 workloads, within noise on 2, and&#10;slower on 4 (conc rwmutex 3.58 times Go&amp;rsquo;s wall time, llvm nbody 1.57,&#10;conc spawn 1.20, conc pmap 1.07).&lt;/li&gt;&#10;&lt;li&gt;Peak memory of the run: lower than Go&amp;rsquo;s on all 20 (0.38 to 0.99).&lt;/li&gt;&#10;&lt;li&gt;Binary size: 1.85 to 1.94 MB against Go&amp;rsquo;s 2.39 to 2.43 MB.&lt;/li&gt;&#10;&lt;li&gt;Compile: cold builds 1.8 to 2.3 s against Go&amp;rsquo;s 1.6 to 1.9 s; a warm&#10;build of an unchanged program, 0.27 to 0.34 s against 0.04 s (0.42 to&#10;0.64 s in 0.26.0), is still the largest gap, and xo&amp;rsquo;s build now peaks&#10;at 0.49 to 0.50 GB cold (0.76 to 0.89 GB in 0.26.0).&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="breaking-changes"&gt;Breaking changes&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;A third-party &lt;code&gt;use go&lt;/code&gt; needs a pin&lt;/strong&gt; (decision 0356). A &lt;code&gt;use go&lt;/code&gt; of&#10;a package outside Go&amp;rsquo;s standard library needs &lt;code&gt;require go &amp;lt;module&amp;gt; &amp;lt;version&amp;gt;&lt;/code&gt; in xo.mod; without it the use is error XO1319. Before, the&#10;build followed the module&amp;rsquo;s latest version and recorded it only in&#10;the git-ignored &lt;code&gt;.xo/&lt;/code&gt;, so two machines could build different code&#10;from the same commit. &lt;code&gt;xo fix&lt;/code&gt; adds the line with the version the&#10;binding resolved, and &lt;code&gt;xo mod tidy&lt;/code&gt; adds missing pins. xo.lock now&#10;records each pinned Go module&amp;rsquo;s go.sum hashes (&lt;code&gt;go &amp;lt;module&amp;gt; &amp;lt;version&amp;gt; h1:...&lt;/code&gt;): a changed module is XO1304, a missing line XO1305 (run &lt;code&gt;xo mod tidy&lt;/code&gt;). Go&amp;rsquo;s standard library packages need nothing.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;std&amp;rsquo;s errors print plain messages&lt;/strong&gt; (decision 0358). Display of&#10;std&amp;rsquo;s error enums is a sentence, as Go&amp;rsquo;s error strings are: &lt;code&gt;PATH: no such file or directory&lt;/code&gt;, &lt;code&gt;connection refused&lt;/code&gt;, &lt;code&gt;no rows in result set&lt;/code&gt;, instead of nested Debug output such as &lt;code&gt;Conn(msg: &amp;quot;Io(msg: \&amp;quot;tls: ...\&amp;quot;)&amp;quot;)&lt;/code&gt;. This covers FsErr, NetErr, IoErr, EnvErr,&#10;ProcErr, ClockErr, SqlErr, HttpErr, ClientErr, UrlErr, CookieErr,&#10;TlsErr, SmtpErr and TemplateErr. &lt;code&gt;${e:?}&lt;/code&gt; (Debug) is unchanged. A&#10;program or test that compares the printed text changes with it.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="new"&gt;New&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;&lt;code&gt;--release&lt;/code&gt; is a preset&lt;/strong&gt; (decision 0354). Each setting it changes&#10;has its own flag in any build (&lt;code&gt;xo build&lt;/code&gt;, &lt;code&gt;run&lt;/code&gt;, &lt;code&gt;test&lt;/code&gt;), which wins&#10;over the preset whatever the order: &lt;code&gt;--debug-contracts&lt;/code&gt;, &lt;code&gt;--dbg&lt;/code&gt;,&#10;&lt;code&gt;--error-args&lt;/code&gt;, &lt;code&gt;--debug-info=on|off|split&lt;/code&gt;, &lt;code&gt;--profile-support&lt;/code&gt;,&#10;&lt;code&gt;--trace-support&lt;/code&gt; (&lt;code&gt;on|off&lt;/code&gt;, a bare flag is on) and &lt;code&gt;--opt=O0..O3&lt;/code&gt;&#10;(LLVM). &lt;code&gt;--error-args=off&lt;/code&gt; no longer needs &lt;code&gt;--release&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;&lt;code&gt;--debug-info=split&lt;/code&gt;&lt;/strong&gt; (decision 0355) keeps the debug information&#10;beside the program: &lt;code&gt;PROG.dSYM&lt;/code&gt; on macOS, &lt;code&gt;PROG.debug&lt;/code&gt; on Linux, found&#10;by tracebacks, lldb, gdb and addr2line.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Build information in every binary.&lt;/strong&gt; &lt;code&gt;xo version -m BINARY&lt;/code&gt; prints&#10;what built it, as &lt;code&gt;go version -m&lt;/code&gt; does: the xo, backend, target, every&#10;effective setting, the stamps and the sources&amp;rsquo; hashes. A native crash&#10;report names the build on its second line.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Deterministic scheduling on the native backends&lt;/strong&gt; (decision 0350):&#10;&lt;code&gt;xo run --seed=N&lt;/code&gt;, &lt;code&gt;xo build --seed=N&lt;/code&gt;, and &lt;code&gt;xo test --seed=N&lt;/code&gt; /&#10;&lt;code&gt;--explore=N&lt;/code&gt; run every task on one thread with a seeded choice at&#10;each scheduling point, so a seed reproduces an interleaving.&#10;&lt;code&gt;--explore&lt;/code&gt; prints the command that reproduces a failure.&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;XO_PROF_HEAP_AT=TEXT&lt;/code&gt; (std/debug) writes the heap in use when a&#10;labeled point is reached.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="faster"&gt;Faster&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;&lt;code&gt;xo check&lt;/code&gt;&lt;/strong&gt; is about 2.5 times faster on a warm run (xo itself 1.8 s&#10;to 0.67 s, a small server 0.59 s to 0.26 s) and peaks a third lower in&#10;memory: an unchanged module is skipped and its diagnostics replayed,&#10;and the native runtime&amp;rsquo;s bodies are checked as a build checks them.&#10;&lt;code&gt;xo check --support&lt;/code&gt; is 2.3 to 2.6 times faster (3.7 s to 1.6 s on xo&#10;itself). The output is unchanged; &lt;code&gt;XO_CHK_CACHE=off&lt;/code&gt; checks&#10;everything.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Warm builds&lt;/strong&gt;: the module check cache and a shared cache pack are on&#10;by default (a warm build of xo itself 0.885 of the wall time; a new&#10;program&amp;rsquo;s first build 0.831), front end cache keys that are never&#10;stored are no longer looked up, and std and runtime function bodies&#10;are parsed only when needed (a small program&amp;rsquo;s warm build peaks about&#10;40% lower in memory). &lt;code&gt;XO_CHK_CACHE=off&lt;/code&gt;, &lt;code&gt;XO_SHARED_PACK=off&lt;/code&gt; and&#10;&lt;code&gt;XO_LAZY_PARSE=off&lt;/code&gt; turn them off.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Runtime&lt;/strong&gt;: channels of one-word values (integers, Float, Bool, enums&#10;without payloads) send the word instead of a one-element list (ping&#10;pong 0.835 of the wall time); &lt;code&gt;List.sort&lt;/code&gt; sorts runs of 16 and merges&#10;between two buffers (1M Ints 0.82 of the wall time, now level with&#10;Go); derived JSON decoders find every field in one pass; the macOS&#10;monotonic clock is read as Go reads it.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Code generation&lt;/strong&gt; on x86_64: a better register ranking for long hot&#10;ranges, cold-path saves, and a larger inlining budget for a function&#10;called once.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;std/http and std/url&lt;/strong&gt;: a URL is parsed once, a plain query is read&#10;in place, and router path parameters skip a range check.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="fixes"&gt;Fixes&lt;/h2&gt;&#10;&lt;p&gt;Most of these come from field testing of 0.26.0 on an Intel Mac and on&#10;Windows. Thank you to the testers: every report below was reproduced,&#10;fixed with a test, and checked again.&lt;/p&gt;</description></item><item><title>Xo 0.26 release notes</title><link>https://xolang.dev/releases/0.26/</link><pubDate>Thu, 22 Oct 2026 23:51:42 -0400</pubDate><guid>https://xolang.dev/releases/0.26/</guid><description>&lt;p&gt;&lt;strong&gt;Downloads:&lt;/strong&gt; &lt;a href="https://github.com/xo-lang/xo/releases/tag/v0.26.0"&gt;Xo 0.26.0 on GitHub&lt;/a&gt;,&#10;with archives for macOS (Apple silicon and Intel, signed and&#10;notarized), Linux (arm64 and x86-64), and Windows (x86-64, Authenticode&#10;signed), and a &lt;code&gt;SHA256SUMS&lt;/code&gt; file.&#10;&lt;a href="https://xolang.dev/docs/getting-started/#install"&gt;Getting started&lt;/a&gt; shows how to install&#10;one.&lt;/p&gt;&#10;&lt;h2 id="xo-against-go"&gt;Xo against Go&lt;/h2&gt;&#10;&lt;p&gt;Each release is measured against Go on the same Mac&#10;(&lt;a href="https://github.com/xo-lang/xo/blob/main/bench/results/release-vs-go-v0.26.0.md"&gt;bench/results/release-vs-go-v0.26.0.md&lt;/a&gt;,&#10;lines 11 to 22):&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Run time: Xo is faster on 14 of 20 workloads, within noise on 3, and&#10;slower on 3 (conc rwmutex 3.78 times Go&amp;rsquo;s wall time, conc pingpong&#10;1.51, llvm nbody 1.43).&lt;/li&gt;&#10;&lt;li&gt;Peak memory of the run: lower than Go&amp;rsquo;s on all 20 (0.38 to 0.97).&lt;/li&gt;&#10;&lt;li&gt;Binary size: 1.81 to 1.89 MB against Go&amp;rsquo;s 2.39 to 2.43 MB.&lt;/li&gt;&#10;&lt;li&gt;Compile: cold builds 2.0 to 2.4 s against Go&amp;rsquo;s 1.9 to 2.0 s; a warm&#10;build of an unchanged program, 0.42 to 0.64 s against 0.04 to 0.08 s,&#10;is the largest gap.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="behavior-changes-to-read-before-upgrading"&gt;Behavior changes to read before upgrading&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;&lt;code&gt;xo run DIR&lt;/code&gt; runs exactly DIR; a plain directory never walks below&#10;it&lt;/strong&gt; (decision 0345). In a parent of two programs, &lt;code&gt;xo run .&lt;/code&gt; used to&#10;run the first one it found; it now says which subdirectories hold a&#10;program. &lt;code&gt;build&lt;/code&gt;, &lt;code&gt;check&lt;/code&gt;, &lt;code&gt;test&lt;/code&gt;, &lt;code&gt;vet&lt;/code&gt;, &lt;code&gt;doc&lt;/code&gt;, &lt;code&gt;fmt&lt;/code&gt;, &lt;code&gt;fix&lt;/code&gt;, &lt;code&gt;parse&lt;/code&gt;&#10;and &lt;code&gt;audit&lt;/code&gt; cover subdirectories only with &lt;code&gt;DIR/...&lt;/code&gt;, which stops past&#10;6,000 .xo files or 60,000 entries. Write &lt;code&gt;xo check ./...&lt;/code&gt; where &lt;code&gt;xo check .&lt;/code&gt; used to cover the tree.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;&lt;code&gt;xo build&lt;/code&gt; and &lt;code&gt;xo run&lt;/code&gt; no longer read &lt;code&gt;_test.xo&lt;/code&gt; files&lt;/strong&gt;&#10;(decision 0348). A type error in a test file no longer fails a build,&#10;a helper declared only in a test file is not visible to the program,&#10;and a &lt;code&gt;use&lt;/code&gt; that only tests have is neither fetched nor bound. &lt;code&gt;xo test&lt;/code&gt; and &lt;code&gt;xo check&lt;/code&gt; report test files&amp;rsquo; errors as before.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;Fault tracebacks by default.&lt;/strong&gt; An uncaught fault in a native program&#10;prints &lt;code&gt;traceback:&lt;/code&gt; and one line per frame down to main, as a hardware&#10;fault&amp;rsquo;s report already did. &lt;code&gt;XO_TRACEBACK=0&lt;/code&gt; restores the one-line&#10;report. The binary is unchanged; each fault costs about 0.55 us more,&#10;a caught one included.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;Embedded DWARF on macOS&lt;/strong&gt; (decision 0346). Darwin executables carry&#10;their debug information in a &lt;code&gt;__DWARF&lt;/code&gt; segment instead of a&#10;&lt;code&gt;NAME.dSYM&lt;/code&gt; beside them, so a copied or packaged binary keeps file and&#10;line names in crash reports, tracebacks, the profiler, &lt;code&gt;--race&lt;/code&gt;, atos&#10;and lldb. &lt;code&gt;--dsym&lt;/code&gt; also writes the bundle; &lt;code&gt;-s&lt;/code&gt; and &lt;code&gt;--release&lt;/code&gt; leave&#10;both out (&lt;code&gt;--release --debug-info&lt;/code&gt; keeps the segment). Release&#10;binaries ship with their DWARF: the darwin archive grows from 23.2 MB&#10;to 34.4 MB (+11 MB).&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;&lt;code&gt;--race&lt;/code&gt; is native by default&lt;/strong&gt; wherever a prebuilt ThreadSanitizer&#10;runtime ships (darwin/arm64, darwin/amd64, linux/arm64, linux/amd64,&#10;windows/amd64), so it no longer needs clang. In 0.25.2 &lt;code&gt;xo build --race .&lt;/code&gt; picked the LLVM backend and failed without clang. Other&#10;targets still use LLVM. (decision 0273 addendum)&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;&lt;code&gt;opt?&lt;/code&gt; on an Option in a test block fails the test&lt;/strong&gt; (decision&#10;0347) with &lt;code&gt;error: missing value: EXPR&lt;/code&gt;, instead of being error&#10;XO0204. Helper functions and fn literals keep the usual rules.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;xo has a memory budget&lt;/strong&gt; (decision 0349): past three quarters of&#10;physical memory, at least 16 GiB (18 GiB on a 24 GB Mac), xo stops&#10;with &lt;code&gt;fatal error: memory budget exceeded: ...&lt;/code&gt; and the phase it was&#10;in, instead of swapping the machine. Builds of xo itself peak at 9.9&#10;to 11.2 GB counted. &lt;code&gt;XO_MAX_MEM&lt;/code&gt; sets another budget (&lt;code&gt;off&lt;/code&gt; for none);&#10;any native program can use it.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;Daylight saving gaps: &lt;code&gt;Ambiguity.Earlier&lt;/code&gt; and &lt;code&gt;Later&lt;/code&gt; were&#10;swapped.&lt;/strong&gt; For a local time inside a spring-forward gap, &lt;code&gt;Earlier&lt;/code&gt;&#10;now gives the earlier instant and &lt;code&gt;Later&lt;/code&gt; the later one, as in an&#10;overlap: 02:30 on 2026-03-08 in New York is 01:30 EST with &lt;code&gt;Earlier&lt;/code&gt;&#10;and 03:30 EDT with &lt;code&gt;Later&lt;/code&gt;. A program that relied on the old result&#10;swaps the two arguments.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;Large Maps branch instead of copying&lt;/strong&gt; (decision 0291): on the&#10;native backends, a Map or Set of 1024 or more entries written while&#10;another value shares it no longer copies its lists; the written copy&#10;reads the shared lists in place. bench/perf/xo branch: 0.071 of the&#10;wall time (65.6 to 4.7 ms), 0.733 of the peak RSS; the HTTP CRUD&#10;server within noise. &lt;code&gt;XO_MAP_LOG=1&lt;/code&gt; builds without it.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;LLVM builds of large programs split&lt;/strong&gt;: over 100 MB of&#10;IR (xo itself), &lt;code&gt;--backend=llvm&lt;/code&gt; splits into modules of about 50 MB&#10;with thin LTO and runs as many clang jobs as three quarters of&#10;memory allows at 3.5 GB each; the LLVM build of xo peaks at 11.1 GB&#10;instead of passing 20 GB. Smaller programs are unchanged (one module,&#10;full LTO). &lt;code&gt;XO_LLVM_SPLIT&lt;/code&gt; and &lt;code&gt;XO_LLVM_JOBS&lt;/code&gt; override.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ol&gt;</description></item><item><title>Xo 0.25 release notes</title><link>https://xolang.dev/releases/0.25/</link><pubDate>Thu, 22 Oct 2026 08:41:57 -0400</pubDate><guid>https://xolang.dev/releases/0.25/</guid><description>&lt;h2 id="0252-the-first-binary-release"&gt;0.25.2: the first binary release&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;Downloads:&lt;/strong&gt; &lt;a href="https://github.com/xo-lang/xo/releases/tag/v0.25.2"&gt;Xo 0.25.2 on GitHub&lt;/a&gt;,&#10;with archives for macOS (Apple silicon and Intel, signed and&#10;notarized), Linux (arm64 and x86-64), and Windows (x86-64, not code&#10;signed yet), and a &lt;code&gt;SHA256SUMS&lt;/code&gt; file.&#10;&lt;a href="https://xolang.dev/docs/getting-started/#install"&gt;Getting started&lt;/a&gt; shows how to install&#10;one.&lt;/p&gt;&#10;&lt;p&gt;0.25.2 is the first Xo release with prebuilt binaries. It is 0.25.0 plus&#10;the fixes below. 0.25.1 was tagged but never got binaries: its Windows&#10;&lt;code&gt;xo.exe&lt;/code&gt; crashed on every build, because Xo&amp;rsquo;s COFF writer overflowed the&#10;16-bit relocation count of a section with 65,535 or more relocations.&#10;0.25.2 writes the extended count, as LLVM&amp;rsquo;s COFF writer does.&lt;/p&gt;</description></item><item><title>Xo 0.24 release notes</title><link>https://xolang.dev/releases/0.24/</link><pubDate>Wed, 21 Oct 2026 14:25:46 -0400</pubDate><guid>https://xolang.dev/releases/0.24/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;&#10;&lt;p&gt;Xo 0.24 makes native Maps and Sets a hybrid persistent map, which takes a&#10;mixed CRUD server at 1024 connections from 18.0k to 83.0k requests per&#10;second. Native code generation is level with LLVM on arm64 and about 6&#10;percent behind on amd64, builds are faster, and the standard library&#10;gains XML, big numbers, compression, and a streaming JSON decoder.&lt;/p&gt;&#10;&lt;h2 id="changes-to-the-language"&gt;Changes to the language&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Moves of the move-only builders are flow sensitive: a &lt;code&gt;return&lt;/code&gt;,&#10;&lt;code&gt;break&lt;/code&gt;, &lt;code&gt;continue&lt;/code&gt;, or failing &lt;code&gt;?&lt;/code&gt; ends its path&amp;rsquo;s moves, so a value&#10;moved there is still usable after the branch&#10;(&lt;a href="https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0300-flow-sensitive-moves.md"&gt;decision 0300&lt;/a&gt;).&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;embed&lt;/code&gt; puts files in the binary&#10;(&lt;a href="https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0304-embed-files.md"&gt;decision 0304&lt;/a&gt;).&lt;/li&gt;&#10;&lt;li&gt;A program&amp;rsquo;s own values convert to the capability interfaces (&lt;code&gt;Fs&lt;/code&gt;,&#10;&lt;code&gt;Proc&lt;/code&gt;, &lt;code&gt;Env&lt;/code&gt;, &lt;code&gt;Net&lt;/code&gt;) on the native backends&#10;(&lt;a href="https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0307-user-fs-native.md"&gt;decision 0307&lt;/a&gt;).&lt;/li&gt;&#10;&lt;li&gt;Wire names per format for JSON, SQL, and XML, and &lt;code&gt;derive Xml&lt;/code&gt;&#10;(&lt;a href="https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0315-derive-xml.md"&gt;decision 0315&lt;/a&gt;).&lt;/li&gt;&#10;&lt;li&gt;Prelude additions.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="compiler-and-runtime"&gt;Compiler and runtime&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Native Maps and Sets are the hybrid persistent map by default; the&#10;micro benchmarks stay within 1.2 times the lists&#10;(&lt;a href="https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0291-native-map-log-and-fork.md"&gt;decision 0291&lt;/a&gt;).&lt;/li&gt;&#10;&lt;li&gt;Preemption polls on amd64 and on LLVM&amp;rsquo;s x86-64 code, with the&#10;thread-local table no longer reused across a poll&#10;(&lt;a href="https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0286-scheduler-stealing-preemption.md"&gt;decision 0286&lt;/a&gt;).&lt;/li&gt;&#10;&lt;li&gt;Native code generation level with LLVM on arm64 and about 6 percent&#10;behind on amd64&#10;(&lt;a href="https://github.com/xo-lang/xo/blob/main/bench/results/compare-2026-10-21.md"&gt;the comparison&lt;/a&gt;).&lt;/li&gt;&#10;&lt;li&gt;Faster builds: std interface hashing from tokens, per-file LLVM test&#10;splits, a run cache for std module tests, and reference counting&#10;insertion in about half its cold time.&lt;/li&gt;&#10;&lt;li&gt;The Go backend compiles &lt;code&gt;path&lt;/code&gt; and &lt;code&gt;uuid&lt;/code&gt; from their Xo source and&#10;supports tuples of up to 64 elements&#10;(&lt;a href="https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0312-std-written-once-go-backend.md"&gt;decision 0312&lt;/a&gt;).&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="standard-library"&gt;Standard library&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;std/xml&lt;/code&gt;&#10;(&lt;a href="https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0314-std-xml.md"&gt;decision 0314&lt;/a&gt;).&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;std/big&lt;/code&gt;, with Karatsuba multiplication and recursive division&#10;(&lt;a href="https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0311-std-big.md"&gt;decision 0311&lt;/a&gt;).&lt;/li&gt;&#10;&lt;li&gt;JSON &lt;code&gt;omitempty&lt;/code&gt; and a streaming decoder&#10;(&lt;a href="https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0309-json-omitempty-and-stream.md"&gt;decision 0309&lt;/a&gt;).&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;std/compress&lt;/code&gt; and gzip responses; &lt;code&gt;client_ip&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;The HTTP/1.1 client keeps connections alive&#10;(&lt;a href="https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0303-http1-client-keepalive-pool.md"&gt;decision 0303&lt;/a&gt;).&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="tools"&gt;Tools&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;xo def&lt;/code&gt;, &lt;code&gt;refs&lt;/code&gt;, &lt;code&gt;rename&lt;/code&gt;, and &lt;code&gt;symbols&lt;/code&gt; cover runtime names, fields,&#10;variants, and interface methods.&lt;/li&gt;&#10;&lt;li&gt;The strict inliner verifier runs in &lt;code&gt;xo dev goldens&lt;/code&gt; and codegen&#10;checks.&lt;/li&gt;&#10;&lt;li&gt;Every Go test names the &lt;code&gt;xo&lt;/code&gt; it runs and refuses a stale one.&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;--no-preempt&lt;/code&gt;; &lt;code&gt;xo build --profile&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;Backend cache pruning fixed (an overflow, concurrent accounting, a&#10;prune version guard).&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="fixes"&gt;Fixes&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;CI and fresh builds work again: 0.23.0 cannot build them, because its&#10;inliner verifier rejects &lt;code&gt;main&lt;/code&gt;.&lt;/li&gt;&#10;&lt;/ul&gt;</description></item><item><title>Xo 0.23 release notes</title><link>https://xolang.dev/releases/0.23/</link><pubDate>Tue, 20 Oct 2026 21:52:07 -0400</pubDate><guid>https://xolang.dev/releases/0.23/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;&#10;&lt;p&gt;Xo 0.23 makes Xo&amp;rsquo;s own backend the default on x86-64 hosts, keeps build caches across compiler rebuilds and shares them&#10;across programs, runs &lt;code&gt;--race&lt;/code&gt; on arm64 with no clang, cuts HTTP tail&#10;latency under CPU-bound handlers from about 86 ms to about 3 ms at p99,&#10;and adds the first batch of a standard library modeled on Go&amp;rsquo;s.&lt;/p&gt;&#10;&lt;h2 id="changes-to-the-language"&gt;Changes to the language&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Field wire names, &lt;code&gt;field as &amp;quot;key&amp;quot;: T&lt;/code&gt;, and case rules for derived&#10;encodings&#10;(&lt;a href="https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0277-field-wire-names.md"&gt;decision 0277&lt;/a&gt;).&lt;/li&gt;&#10;&lt;li&gt;A newtype encodes to JSON as its underlying value on every backend&#10;(&lt;a href="https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0097-newtype-value.md"&gt;decision 0097&lt;/a&gt;).&lt;/li&gt;&#10;&lt;li&gt;An interface value holding a handle or a function equals nothing.&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;ServerConn&lt;/code&gt; for accepted connections&#10;(&lt;a href="https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0280-connection-effects-by-origin.md"&gt;decision 0280&lt;/a&gt;).&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="tools"&gt;Tools&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;--race&lt;/code&gt; on the arm64 backend: Xo&amp;rsquo;s own linker loads a TSan runtime&#10;shipped with Xo, so no clang is needed&#10;(&lt;a href="https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0273-native-race-prebuilt-tsan.md"&gt;decision 0273&lt;/a&gt;).&lt;/li&gt;&#10;&lt;li&gt;One name resolver behind &lt;code&gt;xo def&lt;/code&gt;, &lt;code&gt;refs&lt;/code&gt;, &lt;code&gt;doc&lt;/code&gt;, &lt;code&gt;symbols&lt;/code&gt; and&#10;&lt;code&gt;query&lt;/code&gt;, covering std too, with text output at a terminal; &lt;code&gt;xo vet&lt;/code&gt;&#10;runs on std&#10;(&lt;a href="https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0289-agent-tools-names-and-output.md"&gt;decision 0289&lt;/a&gt;).&lt;/li&gt;&#10;&lt;li&gt;x86-64 native binaries carry DWARF line tables and variables on Linux&#10;and macOS. &lt;code&gt;XO_TRACEBACK=locals&lt;/code&gt; shows the faulting frame&amp;rsquo;s values&#10;and inlined callees&amp;rsquo; variables.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="compiler"&gt;Compiler&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Native is the default backend on x86-64 hosts too (macOS, Linux and&#10;Windows): &lt;code&gt;xo build&lt;/code&gt; uses Xo&amp;rsquo;s own x86-64 backend, with no C&#10;toolchain, and &lt;code&gt;--backend=llvm&lt;/code&gt; still selects LLVM&#10;(&lt;a href="https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0270-amd64-native-default.md"&gt;decision 0270&lt;/a&gt;).&lt;/li&gt;&#10;&lt;li&gt;Build caches are keyed by the code generation sources instead of&#10;&lt;code&gt;xo&lt;/code&gt;&amp;rsquo;s binary, so a rebuilt &lt;code&gt;xo&lt;/code&gt; keeps them: rebuilding &lt;code&gt;xo&lt;/code&gt; after a&#10;driver-only change takes about 41% of a cold build&#10;(&lt;a href="https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0275-cache-keys-by-codegen-inputs.md"&gt;decision 0275&lt;/a&gt;).&#10;Standard library function bodies are shared across programs&#10;(&lt;a href="https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0271-parallel-module-front-end.md"&gt;decision 0271&lt;/a&gt;).&lt;/li&gt;&#10;&lt;li&gt;x86-64: immediates, load sinking and branch on compare (RSA signing&#10;6% fewer instructions, other compute 2 to 8%).&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="runtime"&gt;Runtime&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;A parked root task hands its next task to an idle worker, so an&#10;accept loop is no longer stuck behind a running handler. With 8&#10;CPU-bound handlers on Linux arm64, p99 from dial to response went&#10;from 86 ms to 2.4 to 3.1 ms (Go: 7.5 to 12.5 ms)&#10;(&lt;a href="https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0286-scheduler-stealing-preemption.md"&gt;decision 0286&lt;/a&gt;).&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="standard-library"&gt;Standard library&lt;/h2&gt;&#10;&lt;p&gt;The standard library now follows Go&amp;rsquo;s for scope, code and tests, with&#10;Xo&amp;rsquo;s own API&#10;(&lt;a href="https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0276-std-follows-go-std.md"&gt;decision 0276&lt;/a&gt;).&#10;New in this version:&lt;/p&gt;</description></item><item><title>Xo 0.22 release notes</title><link>https://xolang.dev/releases/0.22/</link><pubDate>Mon, 19 Oct 2026 21:13:49 -0400</pubDate><guid>https://xolang.dev/releases/0.22/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;&#10;&lt;p&gt;Xo 0.22 builds Windows programs with Xo&amp;rsquo;s own backend and no C&#10;toolchain, cuts the size of LLVM builds to between a half and a third,&#10;speeds up the edit loop, makes HTTP and TLS cheaper, and fixes a heap&#10;overrun every native program had at startup since 0.21&amp;rsquo;s development.&lt;/p&gt;&#10;&lt;h2 id="fixes"&gt;Fixes&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;The runtime&amp;rsquo;s root context registry used a byte offset as a slot&#10;index and wrote about 2 KB past a 296-byte runtime record at startup&#10;on every OS. It was silent on macOS and Linux and a crash at startup&#10;on Windows.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="ports"&gt;Ports&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Windows: Xo&amp;rsquo;s own x86-64 backend builds &lt;code&gt;windows/amd64&lt;/code&gt;&#10;(&lt;code&gt;--backend=amd64&lt;/code&gt;) with its own COFF writer and PE linker, a&#10;checked-in import table, manifest and version resources, and no C&#10;runtime: no clang, lld-link, or Windows SDK&#10;(&lt;a href="https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0254-amd64-backend.md"&gt;decision 0254&lt;/a&gt;).&#10;The default backend on x86-64 hosts stays LLVM for now&#10;(&lt;a href="https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0270-amd64-native-default.md"&gt;decision 0270&lt;/a&gt;).&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="compiler"&gt;Compiler&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Smaller binaries: &lt;code&gt;xo&lt;/code&gt;&amp;rsquo;s code went from 40.18 MB to 31.78 MB built&#10;natively and from 89.82 MB to 32.59 MB built with LLVM; the Windows&#10;&lt;code&gt;xo.exe&lt;/code&gt; from 160 MB to 63.65 MB.&lt;/li&gt;&#10;&lt;li&gt;A faster edit loop: packed and lazily decoded cache entries, parallel&#10;borrow inference, and a front end cache for function bodies&#10;(&lt;a href="https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0220-per-module-parallel-compilation.md"&gt;decision 0220&lt;/a&gt;).&#10;Rebuilding &lt;code&gt;xo&lt;/code&gt; after a one-constant edit went from about 9.5 s to&#10;about 6 to 8 s.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="runtime-and-standard-library"&gt;Runtime and standard library&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;TLS is 8.2% and HTTP/2 9.2% cheaper per request on arm64, with&#10;cheaper JSON encoding and HTTP/1 headers.&lt;/li&gt;&#10;&lt;li&gt;Faster allocation while other threads run.&lt;/li&gt;&#10;&lt;li&gt;Task stacks are kept at their peak size: 97% fewer page faults in&#10;connection bursts.&lt;/li&gt;&#10;&lt;/ul&gt;</description></item><item><title>Xo 0.21 release notes</title><link>https://xolang.dev/releases/0.21/</link><pubDate>Sun, 18 Oct 2026 15:12:17 -0400</pubDate><guid>https://xolang.dev/releases/0.21/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;&#10;&lt;p&gt;Xo 0.21 builds Intel Mac programs with Xo&amp;rsquo;s own backend and no C&#10;toolchain, makes native binaries smaller, brings &lt;code&gt;dbg&lt;/code&gt; to every backend,&#10;adds Int word methods and lookup commands for agents, and makes TLS and&#10;HTTP cheaper.&lt;/p&gt;&#10;&lt;h2 id="changes-to-the-language"&gt;Changes to the language&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;dbg(expr)&lt;/code&gt; works on every backend and in &lt;code&gt;--no-gc&lt;/code&gt; builds, and&#10;&lt;code&gt;--release&lt;/code&gt; strips it&#10;(&lt;a href="https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0265-debug-print-pure.md"&gt;decision 0265&lt;/a&gt;).&lt;/li&gt;&#10;&lt;li&gt;Int&amp;rsquo;s word operations are methods that compile to inline operations:&#10;&lt;code&gt;wrapping_shl&lt;/code&gt;, &lt;code&gt;shr_logical&lt;/code&gt;, &lt;code&gt;rotate_right&lt;/code&gt;, &lt;code&gt;rotate_right32&lt;/code&gt;,&#10;&lt;code&gt;swap_bytes&lt;/code&gt;, &lt;code&gt;mul_hi_unsigned&lt;/code&gt;, &lt;code&gt;lt_unsigned&lt;/code&gt; and &lt;code&gt;le_unsigned&lt;/code&gt;, next&#10;to the existing &lt;code&gt;wrapping_add&lt;/code&gt;, &lt;code&gt;wrapping_sub&lt;/code&gt; and &lt;code&gt;wrapping_mul&lt;/code&gt;&#10;(&lt;a href="https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0260-named-wrapping-unsigned-ops.md"&gt;decision 0260&lt;/a&gt;).&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="tools"&gt;Tools&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Lookups for agents: &lt;code&gt;xo def&lt;/code&gt;, &lt;code&gt;xo refs&lt;/code&gt;, &lt;code&gt;xo type&lt;/code&gt;, &lt;code&gt;xo doc&lt;/code&gt; and&#10;&lt;code&gt;xo symbols&lt;/code&gt;&#10;(&lt;a href="https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0261-agent-commands.md"&gt;decision 0261&lt;/a&gt;).&lt;/li&gt;&#10;&lt;li&gt;Miscompile triage: &lt;code&gt;XO_PASSES&lt;/code&gt; turns optional optimization passes off&#10;by name, and &lt;code&gt;xo dev bisect-pass&lt;/code&gt; finds the first pass whose build&#10;behaves differently. Property tests reduce a failing case&#10;automatically.&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;xo test --std-module&lt;/code&gt; runs a standard library module&amp;rsquo;s own tests&#10;(&lt;a href="https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0262-std-private-tests.md"&gt;decision 0262&lt;/a&gt;).&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;XO_POISON_FRAMES&lt;/code&gt; for finding reads of stale stack memory.&lt;/li&gt;&#10;&lt;li&gt;Test programs no longer outlive their tests: each runs in its own&#10;process group.&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;xo vet&lt;/code&gt; warns about large copies with &lt;code&gt;XO0530&lt;/code&gt;&#10;(&lt;a href="https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0263-copy-lint.md"&gt;decision 0263&lt;/a&gt;).&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="compiler"&gt;Compiler&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Native builds drop every function nothing calls. &lt;code&gt;hello&lt;/code&gt; is 26.5%&#10;smaller, and the JSON, HTTP and TLS servers 13.5 to 16.7% smaller on&#10;an Apple silicon Mac, smaller than LLVM&amp;rsquo;s builds. &lt;code&gt;xo&lt;/code&gt; itself went&#10;from 57 MB to 42 MB.&lt;/li&gt;&#10;&lt;li&gt;Tuple folding after inlining: HTTP/2 11.5% and TLS 8.9% fewer&#10;instructions per request.&lt;/li&gt;&#10;&lt;li&gt;Fixes to range analysis, including a crash on an empty interval.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="standard-library"&gt;Standard library&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Bytes from outside the program that are not valid UTF-8 become a valid&#10;&lt;code&gt;Str&lt;/code&gt; at every boundary&#10;(&lt;a href="https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0259-external-bytes-to-str.md"&gt;decision 0259&lt;/a&gt;).&lt;/li&gt;&#10;&lt;li&gt;TLS handshakes are 13.9% cheaper on arm64 and 22% on x86-64; HTTP/2&#10;is 11.6% cheaper, and more from moving reference counted payloads.&#10;P-256 and X25519 are faster.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="ports"&gt;Ports&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Intel Macs: Xo&amp;rsquo;s own x86-64 backend now targets &lt;code&gt;darwin/amd64&lt;/code&gt;, with&#10;its own Mach-O assembler (objects byte identical to clang&amp;rsquo;s) and&#10;linker. All 193 test programs pass on an Intel Mac with no C&#10;toolchain&#10;(&lt;a href="https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0254-amd64-backend.md"&gt;decision 0254&lt;/a&gt;).&lt;/li&gt;&#10;&lt;li&gt;Windows: Xo&amp;rsquo;s own calls on Windows will use the System V convention,&#10;decided for the coming windows/amd64 port.&lt;/li&gt;&#10;&lt;/ul&gt;</description></item><item><title>Xo 0.20 release notes</title><link>https://xolang.dev/releases/0.20/</link><pubDate>Sun, 18 Oct 2026 00:54:28 -0400</pubDate><guid>https://xolang.dev/releases/0.20/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;&#10;&lt;p&gt;Xo 0.20 adds Xo&amp;rsquo;s own x86-64 backend, brings native code within about&#10;10% of LLVM&amp;rsquo;s instructions, makes TLS and HTTP much faster, and gives&#10;debuggers DWARF variables and types. See&#10;&lt;a href="https://xolang.dev/blog/correct-first-fast-later/"&gt;Correct first, fast later&lt;/a&gt; for how&#10;the backends caught up. In the source, the compiler moved from&#10;&lt;code&gt;selfhost/&lt;/code&gt; to &lt;code&gt;compiler/&lt;/code&gt;, and the licenses are MIT, with MIT-0 for&#10;the standard library.&lt;/p&gt;&#10;&lt;h2 id="changes-to-the-language"&gt;Changes to the language&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;A discarded result of a pure call is an error, &lt;code&gt;XO0209&lt;/code&gt;&#10;(&lt;a href="https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0258-discarded-pure-results.md"&gt;decision 0258&lt;/a&gt;).&lt;/li&gt;&#10;&lt;li&gt;A native fault inside deferred code is handled as the spec says&#10;(section 5.6).&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="tools"&gt;Tools&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Debugging: DWARF variables and types (Str, List, Map, enums) on the&#10;arm64 and LLVM backends, constant locations, and gdb and lldb&#10;backtraces that end cleanly&#10;(&lt;a href="https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0252-dwarf-variables.md"&gt;decision 0252&lt;/a&gt;).&#10;&lt;code&gt;xo debug&lt;/code&gt;, a debugger written in Xo, has its reader, unwinder, batch&#10;session and JSON protocol working on recorded threads&#10;(&lt;a href="https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0253-xo-debugger.md"&gt;decision 0253&lt;/a&gt;).&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="runtime"&gt;Runtime&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Memory copies use SIMD, atomics use LSE on Linux arm64, and task&#10;spawn is faster (on Linux, below tokio&amp;rsquo;s current_thread).&lt;/li&gt;&#10;&lt;li&gt;Reads and writes over 2 GiB work.&lt;/li&gt;&#10;&lt;li&gt;Small maps have no hash table.&lt;/li&gt;&#10;&lt;li&gt;Fewer reference count operations: immortal values are not counted,&#10;and retain and release pairs cancel.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="compiler"&gt;Compiler&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;x86-64 backend&#10;(&lt;a href="https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0254-amd64-backend.md"&gt;decision 0254&lt;/a&gt;):&#10;&lt;code&gt;xo build --backend=amd64&lt;/code&gt; builds linux/amd64 programs with no C&#10;toolchain, with Xo&amp;rsquo;s own assembler and linker, and uses AES-NI,&#10;PCLMULQDQ and SHA-NI. Its geometric mean went from 1.63 to 1.14 times&#10;LLVM&amp;rsquo;s instructions.&lt;/li&gt;&#10;&lt;li&gt;arm64: the geometric mean went from 1.32 to about 1.09 times LLVM&amp;rsquo;s,&#10;and P-256 is at parity. Load and store pairing now works on Linux,&#10;along with reload reuse, address and rotate folding, inline string&#10;pushes, constant hoisting in loops that call, loop invariant fields&#10;(&lt;a href="https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0257-loop-invariant-list-fields.md"&gt;decision 0257&lt;/a&gt;),&#10;and inlining of closures, map lookups, and callees with landing pads&#10;at closure sites&#10;(&lt;a href="https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0256-inline-landing-pads.md"&gt;decision 0256&lt;/a&gt;).&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="standard-library"&gt;Standard library&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;TLS keep-alive requests take 19 to 27% fewer instructions (no copy of&#10;the connection state per read and write), plain HTTP/1.1 about 10%&#10;fewer, and ML-KEM 60% fewer.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="ports"&gt;Ports&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;WebAssembly: file handles and file operations over WASI, and time&#10;zones when a program uses them; 169 test programs pass.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="known-issues"&gt;Known issues&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;On Intel Macs with the LLVM backend, this version&amp;rsquo;s standard library&#10;does not catch faults (a stale register in the unwinder&amp;rsquo;s frame&#10;cache). Fixed in 0.21.&lt;/li&gt;&#10;&lt;/ul&gt;</description></item><item><title>Xo 0.19 release notes</title><link>https://xolang.dev/releases/0.19/</link><pubDate>Sat, 17 Oct 2026 04:08:21 -0400</pubDate><guid>https://xolang.dev/releases/0.19/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;&#10;&lt;p&gt;Xo 0.19 makes native code the default, links Linux programs with no C&#10;library, makes servers much smaller, runs the playground on Xo&amp;rsquo;s own&#10;compiler, and makes tasks faster.&lt;/p&gt;&#10;&lt;h2 id="tools"&gt;Tools&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Native is the default backend: arm64 on arm64 hosts, LLVM elsewhere.&#10;Use &lt;code&gt;--backend=go&lt;/code&gt; for programs that &lt;code&gt;use go&lt;/code&gt;&#10;(&lt;a href="https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0248-native-default-backend.md"&gt;decision 0248&lt;/a&gt;).&lt;/li&gt;&#10;&lt;li&gt;Contract fuzzing on the native backends&#10;(&lt;a href="https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0250-native-contract-fuzzing.md"&gt;decision 0250&lt;/a&gt;),&#10;and &lt;code&gt;xo dump&lt;/code&gt; of a running program&amp;rsquo;s tasks on SIGQUIT&#10;(&lt;a href="https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0251-native-dump.md"&gt;decision 0251&lt;/a&gt;).&lt;/li&gt;&#10;&lt;li&gt;An execution trace: &lt;code&gt;XO_TRACE&lt;/code&gt; and &lt;code&gt;xo trace&lt;/code&gt;&#10;(&lt;a href="https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0240-native-execution-trace.md"&gt;decision 0240&lt;/a&gt;).&lt;/li&gt;&#10;&lt;li&gt;The profiler is gated in release builds and samples on Windows too;&#10;its writers moved to &lt;code&gt;xo prof&lt;/code&gt;&#10;(&lt;a href="https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0245-profiler-in-binaries.md"&gt;decision 0245&lt;/a&gt;).&lt;/li&gt;&#10;&lt;li&gt;DWARF types and variables for arm64, first stages&#10;(&lt;a href="https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0252-dwarf-variables.md"&gt;decision 0252&lt;/a&gt;).&lt;/li&gt;&#10;&lt;li&gt;The browser &lt;a href="https://xolang.dev/play/"&gt;playground&lt;/a&gt; runs on Xo&amp;rsquo;s WebAssembly backend&#10;(&lt;a href="https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0242-playground-on-xo-wasm.md"&gt;decision 0242&lt;/a&gt;).&lt;/li&gt;&#10;&lt;li&gt;Lazy runtime bodies: &lt;code&gt;hello&lt;/code&gt; builds in 622 ms instead of 947 ms&#10;(&lt;a href="https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0247-lazy-runtime-bodies.md"&gt;decision 0247&lt;/a&gt;).&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="runtime"&gt;Runtime&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Single thread task spawn went from about 4.8 to 1.13 times tokio&#10;current_thread&amp;rsquo;s cycles.&lt;/li&gt;&#10;&lt;li&gt;RWMutex readers stay on the worker that granted them: the rwmutex&#10;benchmark went from 90 to 40 ms, and HTTP p99 latency from 1,536 to&#10;1,328 us.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="compiler"&gt;Compiler&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Smaller binaries: TLS and HTTP/2 are linked only when a program calls&#10;&lt;code&gt;with_tls&lt;/code&gt;, so a JSON server went from 2.51 to 0.94 MB on arm64&#10;(&lt;a href="https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0244-tls-linked-only-when-configured.md"&gt;decision 0244&lt;/a&gt;),&#10;and code for other targets is folded away&#10;(&lt;a href="https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0246-fold-target-and-test-mode.md"&gt;decision 0246&lt;/a&gt;).&lt;/li&gt;&#10;&lt;li&gt;arm64: if-conversion, carry intrinsics inlined, constant folding of&#10;&lt;code&gt;*&lt;/code&gt;, &lt;code&gt;/&lt;/code&gt; and &lt;code&gt;%&lt;/code&gt;, and cold slow paths kept out of line.&lt;/li&gt;&#10;&lt;li&gt;The first part of Xo&amp;rsquo;s own x86-64 backend: its assembler&#10;(&lt;a href="https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0254-amd64-backend.md"&gt;decision 0254&lt;/a&gt;).&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="standard-library"&gt;Standard library&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Time zones ship with the standard library (IANA 2026e); no Go needed.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="ports"&gt;Ports&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Linux without C: programs that do not &lt;code&gt;use c&lt;/code&gt; link no C library. Xo&amp;rsquo;s&#10;ELF linker builds them as static binaries, also when cross built from&#10;a Mac&#10;(&lt;a href="https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0243-linux-without-c.md"&gt;decision 0243&lt;/a&gt;).&lt;/li&gt;&#10;&lt;/ul&gt;</description></item><item><title>Xo 0.18 release notes</title><link>https://xolang.dev/releases/0.18/</link><pubDate>Fri, 16 Oct 2026 16:21:00 -0400</pubDate><guid>https://xolang.dev/releases/0.18/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;&#10;&lt;p&gt;Xo 0.18 adds a profiler, debug line tables, and race checking, moves the&#10;runtime&amp;rsquo;s stress tests to Xo, and makes arm64 code faster.&lt;/p&gt;&#10;&lt;h2 id="tools"&gt;Tools&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Profiling: &lt;code&gt;XO_PROF=cpu,heap&lt;/code&gt;, or &lt;code&gt;xo run&lt;/code&gt; and &lt;code&gt;xo test&lt;/code&gt; with&#10;&lt;code&gt;--profile=cpu,heap&lt;/code&gt;, writes pprof output and a text summary, on the&#10;arm64 and LLVM backends, on macOS and Linux&#10;(&lt;a href="https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0238-native-sampling-profiler.md"&gt;decision 0238&lt;/a&gt;).&lt;/li&gt;&#10;&lt;li&gt;Debug information: DWARF line tables from both native backends (a&#10;dSYM on macOS), so lldb stops at &lt;code&gt;.xo&lt;/code&gt; lines and shows inlined calls,&#10;and the profiler names &lt;code&gt;.xo&lt;/code&gt; lines. &lt;code&gt;XO_TRACEBACK&lt;/code&gt; prints a fault&amp;rsquo;s&#10;frames, and &lt;code&gt;xo test&lt;/code&gt; sets it&#10;(&lt;a href="https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0239-dwarf-line-tables.md"&gt;decision 0239&lt;/a&gt;).&lt;/li&gt;&#10;&lt;li&gt;Races: &lt;code&gt;xo build --backend=llvm --race&lt;/code&gt; builds every function, the&#10;runtime&amp;rsquo;s too, with ThreadSanitizer. The races it reported in the&#10;runtime are fixed.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="runtime"&gt;Runtime&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;The scheduler has a monitor thread and defers wakes for channel hand&#10;offs and spawns, bounded by the waker&amp;rsquo;s next runtime call. Real-time&#10;programs get none, &lt;code&gt;XO_DEFER_WAKE=0&lt;/code&gt; turns it off, and mutex wakes&#10;stay direct&#10;(&lt;a href="https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0077-native-scheduler-go-style.md"&gt;decision 0077&lt;/a&gt;).&lt;/li&gt;&#10;&lt;li&gt;The runtime&amp;rsquo;s C stress tests are Xo programs&#10;(&lt;a href="https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0241-runtime-tests-in-xo.md"&gt;decision 0241&lt;/a&gt;).&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="compiler"&gt;Compiler&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;arm64: SHA-256 on the SHA instructions; add with carry chains with&#10;constant operands and the zero register; &lt;code&gt;bic&lt;/code&gt;, &lt;code&gt;orn&lt;/code&gt;, &lt;code&gt;eon&lt;/code&gt; and&#10;&lt;code&gt;extr&lt;/code&gt;; one more register for the allocator. RSA, P-256, P-521 and&#10;X25519 are faster on arm64.&lt;/li&gt;&#10;&lt;li&gt;The WebAssembly backend passes its compiler build test again (it&#10;failed since 0.15).&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="ports"&gt;Ports&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;macOS arm64 links with Xo&amp;rsquo;s own linker by default again. The XProtect&#10;false positive and the stall at a program&amp;rsquo;s first launch from each&#10;path are fixed. TLS loads Security and CoreFoundation only at the first&#10;certificate check.&lt;/li&gt;&#10;&lt;/ul&gt;</description></item><item><title>Xo 0.17 release notes</title><link>https://xolang.dev/releases/0.17/</link><pubDate>Fri, 16 Oct 2026 08:31:52 -0400</pubDate><guid>https://xolang.dev/releases/0.17/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;&#10;&lt;p&gt;Xo 0.17 makes public key crypto and bulk TLS much faster and fixes a&#10;macOS XProtect false positive.&lt;/p&gt;&#10;&lt;h2 id="runtime"&gt;Runtime&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Faults on Linux unwind without &lt;code&gt;/proc&lt;/code&gt; (and under valgrind): the&#10;auxiliary vector is read from memory.&lt;/li&gt;&#10;&lt;li&gt;Native standard input from a FIFO sees its end of input on macOS.&lt;/li&gt;&#10;&lt;li&gt;Processes have 256 static words for the runtime&amp;rsquo;s own state&#10;(&lt;a href="https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0237-static-words-256.md"&gt;decision 0237&lt;/a&gt;).&lt;/li&gt;&#10;&lt;li&gt;Security and CoreFoundation load lazily on macOS: start up went from&#10;28.5M to 14.4M instructions on LLVM.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="compiler"&gt;Compiler&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Add with carry chains on arm64, up to 8 pairs an instruction&#10;(&lt;a href="https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0231-crypto-intrinsics.md"&gt;decision 0231&lt;/a&gt;).&lt;/li&gt;&#10;&lt;li&gt;Large constant integer lists are kept as data: the HTTP client went&#10;from 2.51 to 2.12 MB on LLVM.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="standard-library"&gt;Standard library&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;P-256, X25519 and RSA use the carry chains: RSA 4096 server&#10;handshakes take 45.6% fewer instructions on arm64 and 43.3% on LLVM,&#10;RSA 2048 32.9% and 29.9%.&lt;/li&gt;&#10;&lt;li&gt;P-384 and P-521 signing use fixed base tables made on first use (0.37&#10;to 0.45 of the time); ML-KEM takes 8 to 12% fewer instructions on&#10;arm64.&lt;/li&gt;&#10;&lt;li&gt;AES-GCM: GHASH folds four blocks per reduction and CTR runs 64 byte&#10;chunks. Bulk TLS beats Mbed TLS on both backends (AES-128, TLS 1.2:&#10;arm64 13.6, LLVM 11.8, Mbed 14.0 million instructions per MiB).&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="ports"&gt;Ports&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;macOS: binaries from Xo&amp;rsquo;s own linker no longer match an XProtect&#10;signature (a program hung waiting for assessment); all 179 test&#10;programs scan clean.&lt;/li&gt;&#10;&lt;/ul&gt;</description></item><item><title>Xo 0.16 release notes</title><link>https://xolang.dev/releases/0.16/</link><pubDate>Fri, 16 Oct 2026 01:29:36 -0400</pubDate><guid>https://xolang.dev/releases/0.16/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;&#10;&lt;p&gt;In Xo 0.16 the native runtime has no C left. On 2026-10-13 it was 26,743&#10;lines of C, with 206,879 more in third party libraries. See&#10;&lt;a href="https://xolang.dev/blog/zero-c-runtime/"&gt;No C left in the runtime&lt;/a&gt;.&lt;/p&gt;&#10;&lt;h2 id="runtime"&gt;Runtime&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;The runtime&amp;rsquo;s C is 0 lines. &lt;code&gt;main&lt;/code&gt; is Xo&#10;(&lt;a href="https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0234-exact-c-name-exports-data-symbols-entry-stubs.md"&gt;decision 0234&lt;/a&gt;),&#10;the backends emit the program&amp;rsquo;s entry, and Windows&amp;rsquo; stack overflow&#10;handler is Xo. The compiler builds no C into a native program.&lt;/li&gt;&#10;&lt;li&gt;Faults unwind through a frame cache: 0.57 to 0.64 of the time before&#10;the runtime moved to Xo, on arm64.&lt;/li&gt;&#10;&lt;li&gt;The native in-memory file system has every &lt;code&gt;Fs&lt;/code&gt; method.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="changes-to-the-language"&gt;Changes to the language&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;File&lt;/code&gt;, &lt;code&gt;FileLock&lt;/code&gt; and &lt;code&gt;Child&lt;/code&gt; are handles: comparing them with &lt;code&gt;==&lt;/code&gt;&#10;is error &lt;code&gt;XO0404&lt;/code&gt;.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="tools"&gt;Tools&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;xo test&lt;/code&gt; runs native tests in batches, shrinks failures over a pipe,&#10;runs chunks in parallel, caches runs, builds LLVM test binaries at&#10;&lt;code&gt;-O0&lt;/code&gt;, and takes &lt;code&gt;--timeout&lt;/code&gt;. A warm run of the notes-service example&#10;went from about 43 s to about 0.25 s&#10;(&lt;a href="https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0235-batched-native-test-runs.md"&gt;decision 0235&lt;/a&gt;,&#10;&lt;a href="https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0236-fast-native-test-builds.md"&gt;decision 0236&lt;/a&gt;).&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="compiler"&gt;Compiler&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;LLVM runtime slow paths are cold; AES-GCM and ML-KEM are faster.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="ports"&gt;Ports&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Linux: every test program passes on linux/arm64 with both native&#10;backends. linux/amd64, run under emulation, passes after two unwinder&#10;fixes and a thread local fix in the LLVM backend. ThreadSanitizer and&#10;AddressSanitizer builds pass.&lt;/li&gt;&#10;&lt;/ul&gt;</description></item><item><title>Xo 0.15 release notes</title><link>https://xolang.dev/releases/0.15/</link><pubDate>Thu, 15 Oct 2026 20:46:40 -0400</pubDate><guid>https://xolang.dev/releases/0.15/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;&#10;&lt;p&gt;Xo 0.15 moves a program&amp;rsquo;s entry toward Xo: the runtime&amp;rsquo;s C went from&#10;476 lines to 343.&lt;/p&gt;&#10;&lt;h2 id="runtime"&gt;Runtime&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Xo functions can be exported under exact C names, and the backends&#10;define the data symbols a program with no C library needs (&lt;code&gt;environ&lt;/code&gt;,&#10;&lt;code&gt;stdin&lt;/code&gt;, &lt;code&gt;stdout&lt;/code&gt;, &lt;code&gt;stderr&lt;/code&gt;)&#10;(&lt;a href="https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0234-exact-c-name-exports-data-symbols-entry-stubs.md"&gt;decision 0234&lt;/a&gt;).&lt;/li&gt;&#10;&lt;li&gt;With no C library, the process entry (&lt;code&gt;_start&lt;/code&gt;, the thread pointer,&#10;the stack switch) is emitted by the arm64 and LLVM backends, and the&#10;runtime&amp;rsquo;s own printf is gone.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="compiler"&gt;Compiler&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;LLVM builds of a single module use no LTO at &lt;code&gt;-O0&lt;/code&gt; (the compiler&#10;built in 129 s instead of 1,871 s) and full LTO at &lt;code&gt;-O2&lt;/code&gt;&#10;(&lt;code&gt;XO_LLVM_LTO&lt;/code&gt;).&lt;/li&gt;&#10;&lt;li&gt;arm64: Int constants fold after inlining; ML-KEM and SHA-3 run about&#10;2.8 times faster.&lt;/li&gt;&#10;&lt;/ul&gt;</description></item><item><title>Xo 0.14 release notes</title><link>https://xolang.dev/releases/0.14/</link><pubDate>Thu, 15 Oct 2026 17:36:42 -0400</pubDate><guid>https://xolang.dev/releases/0.14/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;&#10;&lt;p&gt;In Xo 0.14 the runtime&amp;rsquo;s C went from about 2,660 lines to 476.&lt;/p&gt;&#10;&lt;h2 id="runtime"&gt;Runtime&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;The services records, the scheduler&amp;rsquo;s statistics and fiber records,&#10;the poller&amp;rsquo;s and shutdown&amp;rsquo;s callbacks, the signal and console&#10;handlers, and the code that runs &lt;code&gt;main&lt;/code&gt; are Xo&#10;(&lt;a href="https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0233-xo-function-addresses-and-frame-address.md"&gt;decision 0233&lt;/a&gt;).&lt;/li&gt;&#10;&lt;li&gt;The C record layouts of the task runtime, the heap, and the event&#10;loop are gone.&lt;/li&gt;&#10;&lt;li&gt;Large allocations use Xo&amp;rsquo;s allocator with a per-thread cache.&lt;/li&gt;&#10;&lt;li&gt;Optional features register their own exit functions.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="compiler"&gt;Compiler&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Error &lt;code&gt;XO0608&lt;/code&gt; reports an export name defined in two modules.&lt;/li&gt;&#10;&lt;li&gt;The empty list and the zero handle are emitted per program.&lt;/li&gt;&#10;&lt;/ul&gt;</description></item><item><title>Xo 0.13 release notes</title><link>https://xolang.dev/releases/0.13/</link><pubDate>Thu, 15 Oct 2026 14:19:20 -0400</pubDate><guid>https://xolang.dev/releases/0.13/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;&#10;&lt;p&gt;Xo 0.13 deletes the last third party C: TLS is written only in Xo. The&#10;runtime&amp;rsquo;s C went from about 5,800 lines to about 2,660.&lt;/p&gt;&#10;&lt;h2 id="runtime"&gt;Runtime&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Mbed TLS and fiat-crypto are deleted (206,879 lines of third party C).&lt;/li&gt;&#10;&lt;li&gt;The Windows event loop, main&amp;rsquo;s threads, the network, clock, scope and&#10;fault entries, the x86-64 unwinder, the allocator&amp;rsquo;s entries, and the&#10;handle code are Xo.&lt;/li&gt;&#10;&lt;li&gt;The backends call the Xo runtime directly for faults, string compare,&#10;number formatting, network, clock, scope, cancellation, and real-time&#10;entries.&lt;/li&gt;&#10;&lt;li&gt;A fault in a native server&amp;rsquo;s connection ends only that connection.&lt;/li&gt;&#10;&lt;li&gt;Sanitizer builds map the heap through libc, so ASan and TSan see it.&lt;/li&gt;&#10;&lt;/ul&gt;</description></item><item><title>Xo 0.12 release notes</title><link>https://xolang.dev/releases/0.12/</link><pubDate>Thu, 15 Oct 2026 11:58:07 -0400</pubDate><guid>https://xolang.dev/releases/0.12/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;&#10;&lt;p&gt;Xo 0.12 moves most of the native runtime into Xo: its C went from&#10;26,743 lines to about 5,900.&lt;/p&gt;&#10;&lt;h2 id="runtime"&gt;Runtime&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;The scheduler, the event loop, sockets, processes, the test world,&#10;the HTTP/1.1 and HTTP/2 client and server, standard input, the file&#10;system, and the program&amp;rsquo;s entry are Xo.&lt;/li&gt;&#10;&lt;li&gt;The backends call the Xo runtime&amp;rsquo;s allocation, reference count, list,&#10;string, heap, and &lt;code&gt;Any&lt;/code&gt; entries directly.&lt;/li&gt;&#10;&lt;li&gt;A fault in middleware or a connection no longer stops the native HTTP&#10;server.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="compiler"&gt;Compiler&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Crypto intrinsics: add and subtract with carry, AES rounds, and&#10;carry-less multiply&#10;(&lt;a href="https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0231-crypto-intrinsics.md"&gt;decision 0231&lt;/a&gt;).&#10;External C symbols can be referenced from Xo weakly&#10;(&lt;a href="https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0232-external-c-symbols-from-xo.md"&gt;decision 0232&lt;/a&gt;).&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;==&lt;/code&gt; on enum constants folds at compile time.&lt;/li&gt;&#10;&lt;li&gt;An inlining verification failure is reported, not hidden.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="standard-library"&gt;Standard library&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;TLS 1.2 and 1.3, X.509 parsing and verification, and the crypto under&#10;them (SHA-2, SHA-3, HMAC, HKDF, AES-GCM, ChaCha20-Poly1305, X25519,&#10;P-224 to P-521, RSA, Ed25519, and the ML-KEM-768 and -1024 hybrids)&#10;are Xo, matching Go 1.26&amp;rsquo;s behavior and group list&#10;(&lt;a href="https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0202-tls-in-xo.md"&gt;decision 0202&lt;/a&gt;).&#10;The default build links no Mbed TLS or fiat-crypto.&lt;/li&gt;&#10;&lt;/ul&gt;</description></item><item><title>Xo 0.11 release notes</title><link>https://xolang.dev/releases/0.11/</link><pubDate>Wed, 14 Oct 2026 13:51:55 -0400</pubDate><guid>https://xolang.dev/releases/0.11/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;&#10;&lt;p&gt;Xo 0.11 has no language or spec changes from 0.10: programs build and&#10;behave the same. It moves more of the runtime from C into Xo, with&#10;every moved piece within 5 percent of the C&amp;rsquo;s instructions&#10;(&lt;a href="https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0180-runtime-in-xo-pilot.md"&gt;decision 0180&lt;/a&gt;),&#10;and makes rebuilds faster.&lt;/p&gt;&#10;&lt;h2 id="runtime"&gt;Runtime&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;About 4,900 lines of runtime C deleted. Standard output and error,&#10;exit, environment and arguments, the constant time barrier&#10;(&lt;a href="https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0222-constant-time-barrier.md"&gt;decision 0222&lt;/a&gt;),&#10;the HTTP/1.1 client parser and response writer, the HTTP/2 HPACK&#10;coder, string and list objects&#10;(&lt;a href="https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0226-list-objects-without-c-level.md"&gt;decision 0226&lt;/a&gt;),&#10;the test world, file system operations on Linux and macOS, and the&#10;linux/arm64 unwinder for programs with no C library&#10;(&lt;a href="https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0221-unwinder-in-xo.md"&gt;decision 0221&lt;/a&gt;)&#10;are Xo.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="compiler"&gt;Compiler&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;arm64 shrink wrapping and tail calls: the compiler&amp;rsquo;s own build runs&#10;0.985 of the instructions&#10;(&lt;a href="https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0224-arm64-shrink-wrapping-tail-calls.md"&gt;decision 0224&lt;/a&gt;).&lt;/li&gt;&#10;&lt;li&gt;Constant Int expressions fold to one constant.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="tools"&gt;Tools&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Per function back-end and reference counting caches: a one module&#10;edit of the compiler rebuilds in about 12 s instead of 31 s on a Mac&#10;(&lt;a href="https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0220-per-module-parallel-compilation.md"&gt;decision 0220&lt;/a&gt;).&lt;/li&gt;&#10;&lt;li&gt;Build caches are pruned by age and size&#10;(&lt;a href="https://github.com/xo-lang/xo/blob/main/knowledgebase/decisions/0223-cache-pruning.md"&gt;decision 0223&lt;/a&gt;).&lt;/li&gt;&#10;&lt;/ul&gt;</description></item></channel></rss>