Menu

Roadmap

Manticore compiles PHP 8.5 to standalone native binaries and compiles itself to a byte-identical fixpoint. The Zend interpreter is the oracle: if php runs a program, the native binary must print the same bytes.

Where we are heading: running real-world PHP applications — correctly, fast, and with modest memory — and compiling them in reasonable time. Self-hosting was the first milestone; it is now the floor.

[x] done · [ ] open · [~] partly done. Status is as of 2026-10-11 (release 0.14.0). Open bugs are tracked as GitHub issues, not here.

Where things stand#

1. Real-world applications#

Third-party code is the quality bar. Each target has a runnable exit criterion.

TargetStatusDone when
symfony/console app (examples/symfony-console)[x] builds and runsoutput matches php on its command set
Symfony framework app (examples/symfony-app)[x] builds and servesroutes answer 200/404 like php; cold var/ first request included
php-cs-fixer (@PSR12, @Symfony)[~] runs natively with a parallel worker pool; @Symfony output matches phpwhole rule corpus matches php; speed competitive with native fixers
symfony-demo (full framework, ~79k functions)[~] builds and runs to completionno missing-function traps; pages answer like php
HTTP server benchmark workload[~] 64k req/s on one process, 124k on eight workerscompetitive with established PHP servers
A Laravel-class application[ ]needs MySQL/PostgreSQL drivers, openssl, XML (see §2)
Composer[ ]composer install on a real project
Static analyzers (PHPStan / Psalm class)[ ]analyzes its own source
PHPUnit running a real test suite[ ]same pass/fail list as php

How it works: compile an application, collect every missing function and crash, and turn each into a stdlib item (§2) or a bug report with a minimal repro that becomes a regression test.

2. Standard library coverage#

Priority is how many real applications reach a function, not the percentage. A missing function compiles and fails at run time with Call to undefined function.

P0 — every application

P1 — web frameworks

P2 — common

P3 — on request: calendar, gettext, readline, bz2, ftp, ldap, soap, odbc, snmp, tidy, SysV IPC, exif, dba, Phar. mb_ereg* is parked (Oniguruma is EOL).

Ground rules: every function is checked against php output; extensions backed by a C library link it only in programs that use it; where php warns and carries on, Manticore throws.

3. Compile time and memory#

Reference point: compiling symfony-demo (79k functions, 1.1 GB of LLVM IR) takes about 33 minutes and 4.7 GiB at peak. The compiler rebuilds itself in 1–2 minutes.

Optimization policy: -O2 for anything shipped; -O1 without LTO for the edit–build loop.

4. Runtime performance#

Compute-heavy code already runs 2–50× faster than php 8.5; associative arrays beat php.

5. Correctness#

Known semantic gaps in detail: gaps.md.

6. Tooling, platforms and releases#

Not planned#

Further reading#

../README.md · install.md · builtins.md · superset.md · async.md · ffi.md · modules.md · memory.md · http.md · ds.md · gaps.md

Design notes: design/mir.md · design/memory-abi.md · design/module-system.md · design/stage0-bootstrap.md

Edit this page on GitHub