Status

Loxodon is a spike with a kill gate: performance against php-wasm and against native PHP decides whether it continues. These are the facts as of late October 2026.

Runs byte-identically to PHP 8.5

  • WordPress 7.1 on SQLite: installation, the front end, the REST API, wp-admin including the block and site editors, WP-CLI, and WooCommerce 11.2 through WP-CLI and through a browser (shop, cart, block checkout, orders).
  • Laravel 12: requests, Blade, Eloquent on SQLite, sessions and cache on the database, Artisan and Tinker; Symfony 7.4; Drupal 11; MediaWiki 1.43; Grav; Kirby.
  • The tools: Composer, PHPStan, PHPUnit, PHP_CodeSniffer, PHP-CS-Fixer, Rector, each run from its phar.
  • Library suites under PHPUnit: php-parser, brick/math, CommonMark, Twig, Carbon, Monolog, Guzzle PSR-7, Symfony Console and YAML, Doctrine DBAL, Nette, PHPMailer, phpseclib, Laravel’s own 11,987 tests, WordPress’s own 27,442.

Where it runs

Node is the development host and the drop-in PHP CLI. Cloudflare Workers and Durable Objects serve Laravel and WordPress compiled ahead of time; this site is one such Durable Object, with an edge cache in front for anonymous pages. A browser host runs the same compiled code in a Web Worker with SQLite in WebAssembly: that is the playground, where WordPress, WooCommerce, Laravel and Drupal run inside the tab, and where Scratch, a blank project with a code editor, runs the PHP you write and shows the JavaScript each file compiles to.

Speed, honestly

Measured on the same application trees and databases, warm, PHP 8.5 with opcache and JIT against Loxodon in Chromium’s V8. A full WordPress boot runs on every request in both, as PHP-FPM does.

RequestPHP 8.5Loxodon
Laravel skeleton, three routes16 ms24 ms
WordPress front page (this theme)60 ms160–180 ms
WooCommerce shop page143 msabout 700 ms

Modern code is close; WordPress-style code, heavy on arrays and on the SQLite drop-in’s MySQL-to-SQLite translation, is where the runtime’s array layer is being worked on now. Profiles of these requests are taken in the browser and drive that work.

This site, measured from its own Worker: a page costs 190–290 ms of CPU in the Durable Object (Amsterdam) and about 320 ms at the edge when the edge cache misses; anonymous pages are then served from the cache for five minutes. Every response carries a Server-Timing header with the round trip to the object, so you can check in your browser’s network panel.

Known gaps

Reference counting is not emulated: destructors run through escape analysis, which covers the applications in the corpus but not every construct. The browser host runs in Chromium-based browsers and Firefox; Safari is untested. Image processing beyond the basics, Argon2 and X.509 depend on the host’s libraries. Code generated at run time runs on Node and in the browser, not yet on Workers.