A PHP compiler, not a PHP interpreter

Modern PHP, compiled for everywhere JavaScript runs.

Loxodon turns PHP 8 into JavaScript that V8 optimizes like any other. WordPress, Laravel, Symfony and Drupal run on Cloudflare Workers, on Node, and in a browser tab, with no PHP binary and no PHP-in-Wasm.

You are reading WordPress 7.1, compiled by Loxodon, served from a Cloudflare Durable Object. Every page here is a request that ran through the compiler’s output.

What changes when PHP becomes JavaScript

It runs where PHP cannot

Cloudflare Workers and Durable Objects, Node, Bun, Deno, and the browser. One runtime, one host interface, the same compiled code.

V8 does the optimizing

Your PHP functions become JavaScript functions, so the JIT that makes the web fast inlines, specializes and optimizes them. No interpreter loop, no opcode dispatch.

Small enough to ship

A pure-PHP package compiles to tens of kilobytes of JavaScript plus a tree-shaken runtime. The floor is not a multi-megabyte interpreter.

Byte for byte

Loxodon is tested against PHP 8.5 itself: real applications and real libraries run under both, and their output must match exactly. Not a subset of PHP, and not an approximation of it.

27,442tests of WordPress’s own suite, PHP’s results test for test

11,987tests of Laravel’s framework suite, plus 2,670 integration tests

13applications and tools in the corpus: WordPress, WooCommerce, Laravel, Symfony, Drupal, MediaWiki, Composer, PHPStan, PHPUnit and more

How a request runs

# build once: every PHP file becomes an ES module
loxodon build ./wordpress index.php ./out

# each request: a fresh World, FPM semantics, synchronous SQLite
export default { fetch: (request) => app.fetch(request) }

Each request starts from a clean World, exactly as PHP-FPM starts each request from scratch, while compiled code and JIT state stay warm. Classic PHP semantics, modern hosting economics: a WordPress site that scales to zero.