<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>Pext Blog</title><description>News, updates, and technical insights from the Pext team.</description><link>https://pext.dev/</link><language>en-us</language><item><title>Closing out myclabs/deep-copy: cycles, filters, and the last 17 percent</title><link>https://pext.dev/blog/myclabs-deep-copy-conversion/</link><guid isPermaLink="true">https://pext.dev/blog/myclabs-deep-copy-conversion/</guid><description>myclabs/deep-copy sat at 83% in May on the back of a full clone implementation. The last stretch to 100%: circular object graphs keyed by identity, the library&apos;s filter and matcher chain including closures used as filters, and reflection-based property enumeration that had to respect Pext&apos;s own property visibility filter.</description><pubDate>Fri, 31 Jul 2026 00:00:00 GMT</pubDate><category>Case Study</category><author>office@pext.dev (Alex)</author></item><item><title>Porting to JS/TS, Part 4: the AI tooling gap compounds every year you wait</title><link>https://pext.dev/blog/porting-to-js-4-ai-tooling/</link><guid isPermaLink="true">https://pext.dev/blog/porting-to-js-4-ai-tooling/</guid><description>Series close for Porting to JS/TS. AI coding assistants in 2026 are strongest where the training corpus and the tooling ecosystem are deepest, and that is JavaScript and TypeScript, not PHP. Landing on JS/TS means the same agent tooling that already maintains the frontend can maintain the backend, one mental model instead of two, and the gap only widens the longer a codebase waits.</description><pubDate>Wed, 29 Jul 2026 00:00:00 GMT</pubDate><category>Architecture</category><author>office@pext.dev (Alex)</author></item><item><title>Week in review: 20 July 2026</title><link>https://pext.dev/blog/week-in-review-2026-07-20/</link><guid isPermaLink="true">https://pext.dev/blog/week-in-review-2026-07-20/</guid><description>A recap of the week of 20 July: the third Porting to JS/TS post on TypeScript&apos;s type system, an update to the open source showcase page after eight published case studies, and myclabs/deep-copy closing in on 100% ahead of next week&apos;s write-up.</description><pubDate>Mon, 27 Jul 2026 00:00:00 GMT</pubDate><category>Weekly</category><author>office@pext.dev (Alex)</author></item><item><title>Eight case studies in, and a new home for them on pext.dev</title><link>https://pext.dev/blog/case-studies-showcase-update/</link><guid isPermaLink="true">https://pext.dev/blog/case-studies-showcase-update/</guid><description>Eight external libraries have gone through a full Pext case study since April: PHPUnit, sebastian/exporter, brick/math, composer/semver, egulias/email-validator, dragonmantank/cron-expression, voku/portable-ascii, and ramsey/uuid. A short recap of what they collectively prove, and an update to the open source showcase page that makes them easier to browse.</description><pubDate>Fri, 24 Jul 2026 00:00:00 GMT</pubDate><category>Announcement</category><author>office@pext.dev (Alex)</author></item><item><title>Porting to JS/TS, Part 3: TypeScript&apos;s type system is the payoff, not the tax</title><link>https://pext.dev/blog/porting-to-js-3-typescript-types/</link><guid isPermaLink="true">https://pext.dev/blog/porting-to-js-3-typescript-types/</guid><description>Part 3 of the Porting to JS/TS series. PHP&apos;s type system arrived late and is still opt-in in the places that matter most; TypeScript&apos;s structural typing, generics, and strict null checks give a refactoring safety net that eight years of incremental PHP RFCs still have not closed, and Pext&apos;s TypeScript output target is a way to land inside that safety net without a rewrite.</description><pubDate>Wed, 22 Jul 2026 00:00:00 GMT</pubDate><category>Architecture</category><author>office@pext.dev (Alex)</author></item><item><title>Week in review: 13 July 2026</title><link>https://pext.dev/blog/week-in-review-2026-07-13/</link><guid isPermaLink="true">https://pext.dev/blog/week-in-review-2026-07-13/</guid><description>A recap of the week of 13 July: the second Porting to JS/TS post on choosing between Node.js and Bun as a landing runtime, pext-viz shipping as a real module, and a batch of small parity fixes in pext-strings and pext-math that surfaced while closing out ramsey/uuid.</description><pubDate>Mon, 20 Jul 2026 00:00:00 GMT</pubDate><category>Weekly</category><author>office@pext.dev (Alex)</author></item><item><title>pext-viz: from proof of concept to a real module for visualising converted control flow</title><link>https://pext.dev/blog/pext-viz-module/</link><guid isPermaLink="true">https://pext.dev/blog/pext-viz-module/</guid><description>The pext-viz proof of concept teased in the 29 June recap is now a working module. It reads the call graph, async colouring, and escape edges the closed-world pipeline already computes and renders them as an interactive graph, so a migration decision or an async colouring result has a picture behind it instead of just a text report.</description><pubDate>Fri, 17 Jul 2026 00:00:00 GMT</pubDate><category>Feature</category><author>office@pext.dev (Alex)</author></item><item><title>Porting to JS/TS, Part 2: Node.js or Bun as the landing runtime</title><link>https://pext.dev/blog/porting-to-js-2-node-or-bun/</link><guid isPermaLink="true">https://pext.dev/blog/porting-to-js-2-node-or-bun/</guid><description>Part 2 of the Porting to JS/TS series. Now that Bun runs converted Pext output at parity with Node, which should a migrating team target: Node&apos;s maturity and default-everywhere status, or Bun&apos;s startup time and built-in tooling. The honest answer is that Pext&apos;s output does not force the choice, because the same vanilla JS or TS runs on both.</description><pubDate>Wed, 15 Jul 2026 00:00:00 GMT</pubDate><category>Architecture</category><author>office@pext.dev (Alex)</author></item><item><title>Week in review: 6 July 2026</title><link>https://pext.dev/blog/week-in-review-2026-07-06/</link><guid isPermaLink="true">https://pext.dev/blog/week-in-review-2026-07-06/</guid><description>A recap of the week of 6 July: a new series asking why a PHP migration lands specifically on JavaScript and TypeScript, ramsey/uuid at 100% covering every UUID version the library supports, and a searchable function index added to the docs site.</description><pubDate>Mon, 13 Jul 2026 00:00:00 GMT</pubDate><category>Weekly</category><author>office@pext.dev (Alex)</author></item><item><title>Transpiling ramsey/uuid: RFC 4122 versions, a CSPRNG, and node-based UUIDs without leaking a MAC address</title><link>https://pext.dev/blog/ramsey-uuid-conversion/</link><guid isPermaLink="true">https://pext.dev/blog/ramsey-uuid-conversion/</guid><description>How Pext brought ramsey/uuid to 100%: matching PHP&apos;s CSPRNG output for v4 UUIDs, 128-bit arithmetic for the time-based and namespace variants, the codec and converter abstraction the library builds on, and the privacy detail in v1 generation where a missing MAC address is replaced by a random node id with the multicast bit set.</description><pubDate>Fri, 10 Jul 2026 00:00:00 GMT</pubDate><category>Case Study</category><author>office@pext.dev (Alex)</author></item><item><title>Porting to JS/TS, Part 1: why JavaScript, and not Go, Rust, or Python</title><link>https://pext.dev/blog/porting-to-js-1-why-js/</link><guid isPermaLink="true">https://pext.dev/blog/porting-to-js-1-why-js/</guid><description>First part of a new series on where a PHP migration actually lands once the decision to leave is made. Go and Rust ask a PHP team to learn a new memory model and a thinner web framework ecosystem, Python carries its own concurrency and packaging baggage, and JavaScript and TypeScript are the only landing zone where the same language already runs the other half of the stack.</description><pubDate>Wed, 08 Jul 2026 00:00:00 GMT</pubDate><category>Architecture</category><author>office@pext.dev (Alex)</author></item><item><title>Week in review: 29 June 2026</title><link>https://pext.dev/blog/week-in-review-2026-06-29/</link><guid isPermaLink="true">https://pext.dev/blog/week-in-review-2026-06-29/</guid><description>A recap of the week of 29 June: Bun is now a supported runtime for Pext-converted code after the WASM swap for PCRE and LibXML removed the last native-binding blockers, a new closed-world conversion flag ingests the whole source set as one unit for stronger inter-file reasoning, and an early POC of pext-viz visualises the control flow of a converted project.</description><pubDate>Mon, 06 Jul 2026 00:00:00 GMT</pubDate><category>Weekly</category><author>office@pext.dev (Alex)</author></item><item><title>Design notes: an async/await SAPI, driven by closed-world control-flow colouring</title><link>https://pext.dev/blog/async-await-sapi-consideration/</link><guid isPermaLink="true">https://pext.dev/blog/async-await-sapi-consideration/</guid><description>Design notes on a Pext SAPI built around async/await. Under closedWorld the transpiler ingests the entire source set and colours the control flow, propagating I/O calls up through the call graph to the top-level web handlers. Async execution comes out of a single conversion, no post-processing. Caveats: autoloaders, magic methods, and destructors all fire at arbitrary points and cannot await.</description><pubDate>Fri, 03 Jul 2026 00:00:00 GMT</pubDate><category>Architecture</category><author>office@pext.dev (Alex)</author></item><item><title>Leaving PHP, Part 10: the strategic question, not the technical one</title><link>https://pext.dev/blog/leaving-php-10-strategic/</link><guid isPermaLink="true">https://pext.dev/blog/leaving-php-10-strategic/</guid><description>Series finale of the ten-part Leaving PHP series. Every prior post was tactical. Step back and the real question is strategic: for a decade-scale platform bet, where will the talent, the libraries, the integrations, and the AI tooling be in 2030? PHP will not disappear, but &quot;will not disappear&quot; is a low bar for a technology bet, and the ecosystem momentum is elsewhere.</description><pubDate>Wed, 01 Jul 2026 00:00:00 GMT</pubDate><category>Architecture</category><author>office@pext.dev (Alex)</author></item><item><title>Week in review: 22 June 2026</title><link>https://pext.dev/blog/week-in-review-2026-06-22/</link><guid isPermaLink="true">https://pext.dev/blog/week-in-review-2026-06-22/</guid><description>A recap of the week of 22 June: an arrays refactor bringing Pext closer to the packed-array shape used by PHP internally, static scope emission with vanilla let bindings when the semantics allow it, and a best-effort tokenizer that lets opensourcepos convert with byte-for-byte token parity against PHP.</description><pubDate>Mon, 29 Jun 2026 00:00:00 GMT</pubDate><category>Weekly</category><author>office@pext.dev (Alex)</author></item><item><title>Pext cluster mode: a drop-in replacement for php-fpm behind Apache</title><link>https://pext.dev/blog/pext-cluster-mode/</link><guid isPermaLink="true">https://pext.dev/blog/pext-cluster-mode/</guid><description>How Pext uses Node cluster mode to reproduce the php-fpm request lifecycle: a master process bound to the FastCGI socket, a pool of workers, requests dispatched to the pool by Apache mod_proxy_fcgi. The result is a runtime that slots in where php-fpm used to sit, with .htaccess and every existing Apache configuration untouched.</description><pubDate>Fri, 26 Jun 2026 00:00:00 GMT</pubDate><category>Feature</category><author>office@pext.dev (Alex)</author></item><item><title>Leaving PHP, Part 9: rewriting incrementally is now realistic</title><link>https://pext.dev/blog/leaving-php-9-incremental-rewrite/</link><guid isPermaLink="true">https://pext.dev/blog/leaving-php-9-incremental-rewrite/</guid><description>Part 9 of the ten-part Leaving PHP series. The old argument against leaving PHP was that a rewrite is impossibly expensive. Big-bang rewrites are still bad, but the option set has widened: strangler-fig behind a shared gateway, file-by-file transpilation with a compatibility runtime, and hot-path extraction. Migration is no longer a binary, and most of the gradient is cheaper than it looks.</description><pubDate>Wed, 24 Jun 2026 00:00:00 GMT</pubDate><category>Architecture</category><author>office@pext.dev (Alex)</author></item><item><title>Week in review: 15 June 2026</title><link>https://pext.dev/blog/week-in-review-2026-06-15/</link><guid isPermaLink="true">https://pext.dev/blog/week-in-review-2026-06-15/</guid><description>A recap of the week of 15 June: NanoCMS moving from PHP 7 to PHP 8 and running under Apache in pext, a streamlined WASM pipeline for PHP C dependencies like PCRE and LibXML that avoids the pain of porting Node bindings across versions, and ten end-to-end REST scenarios for opensourcepos cross-checked between PHP and Pext.</description><pubDate>Mon, 22 Jun 2026 00:00:00 GMT</pubDate><category>Weekly</category><author>office@pext.dev (Alex)</author></item><item><title>Leaving PHP, Part 8: the tooling exists, but it is not the default experience</title><link>https://pext.dev/blog/leaving-php-8-tooling/</link><guid isPermaLink="true">https://pext.dev/blog/leaving-php-8-tooling/</guid><description>Part 8 of the ten-part Leaving PHP series. PHPStan, PHP-CS-Fixer, Pest, Psalm, and PHPUnit are all excellent. Vite, Cargo, and go fmt are also excellent, and one command wires them into your project. In PHP the assembly is your problem, and that assembly is a daily tax for onboarding, for greenfield projects, and for anyone who would rather focus on the product than on the toolchain.</description><pubDate>Fri, 19 Jun 2026 00:00:00 GMT</pubDate><category>Architecture</category><author>office@pext.dev (Alex)</author></item><item><title>Auditing namespaces in pext: a partial overhaul of the slot-based hierarchy</title><link>https://pext.dev/blog/partial-namespace-audit/</link><guid isPermaLink="true">https://pext.dev/blog/partial-namespace-audit/</guid><description>How pext models PHP namespaces as a runtime map of slots instead of relocating files under PSR-4, and the partial overhaul that landed this week: case-insensitive lookups, kind-aware resolution between functions, classes and constants of the same name, canonical FQN preservation through use-aliases, namespace-versus-class disambiguation, and a faster cold path for use-heavy scripts.</description><pubDate>Thu, 18 Jun 2026 00:00:00 GMT</pubDate><category>Feature</category><author>office@pext.dev (Alex)</author></item><item><title>Transpiling voku/portable-ascii: a transliteration story, with no ICU on the JS side</title><link>https://pext.dev/blog/portable-ascii-conversion/</link><guid isPermaLink="true">https://pext.dev/blog/portable-ascii-conversion/</guid><description>voku/portable-ascii is at 100%, but the interesting story is transliteration. PHP leans on ICU through the Transliterator class, and ICU has no clean equivalent in JavaScript. A survey of the landscape (the transliteration npm package, Node&apos;s embedded ICU, unicode-org/icu4x, the deprecated icu-transliterator binding), why stable Pext ships a patched transliteration package, and why a custom ICU4x WASM build stays reserved for enterprise.</description><pubDate>Tue, 16 Jun 2026 00:00:00 GMT</pubDate><category>Case Study</category><author>office@pext.dev (Alex)</author></item><item><title>Week in review: 8 June 2026</title><link>https://pext.dev/blog/week-in-review-2026-06-08/</link><guid isPermaLink="true">https://pext.dev/blog/week-in-review-2026-06-08/</guid><description>A recap of the week of 8 June: a new analyze step that statically infers what each function does with its variables, grab-bag locals lowered to plain JS bindings when nothing needs the dynamic scoping, an optimized $this emission backed by its invariants, and the converted PHPUnit suite running in about half the time it did last week.</description><pubDate>Mon, 15 Jun 2026 00:00:00 GMT</pubDate><category>Weekly</category><author>office@pext.dev (Alex)</author></item><item><title>pext-vanillify: AI post-processing for non-canonical JS patterns</title><link>https://pext.dev/blog/pext-vanillify-showcase/</link><guid isPermaLink="true">https://pext.dev/blog/pext-vanillify-showcase/</guid><description>pext-vanillify is an opt-in AI-driven pass that runs after the deterministic transpiler and rewrites non-idiomatic JS patterns into shapes a JS engineer would have written. First two skills: detokenizing Kint&apos;s caller introspection into named parameters, and replacing CodeIgniter 4&apos;s class-from-file resolution with a PSR-4-backed lookup.</description><pubDate>Fri, 12 Jun 2026 00:00:00 GMT</pubDate><category>Feature</category><author>office@pext.dev (Alex)</author></item><item><title>Leaving PHP, Part 7: the shared-hosting mental model still leaks into the language</title><link>https://pext.dev/blog/leaving-php-7-deployment/</link><guid isPermaLink="true">https://pext.dev/blog/leaving-php-7-deployment/</guid><description>Part 7 of the ten-part Leaving PHP series. PHP grew up on cPanel and the defaults still encode that world: superglobals, .htaccess, php.ini, mod_php. Containers, serverless, and edge runtimes are the 2026 deployment story, and every PHP target there is an adapter project working around the language&apos;s assumptions.</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><category>Architecture</category><author>office@pext.dev (Alex)</author></item><item><title>Week in review: 1 June 2026</title><link>https://pext.dev/blog/week-in-review-2026-06-01/</link><guid isPermaLink="true">https://pext.dev/blog/week-in-review-2026-06-01/</guid><description>A recap of the week of 1 June: a second framework roadmap for CodeIgniter 4 alongside Laravel, new runtime modules for password, hash, sessions, and MySQL, continued work on the embedded -S server and ini parameter handling, a full audit of how each PHP type is represented in JS, and the removal of Rector as a pre-processing step.</description><pubDate>Mon, 08 Jun 2026 00:00:00 GMT</pubDate><category>Weekly</category><author>office@pext.dev (Alex)</author></item><item><title>CodeIgniter 4 joins the roadmap: password, hash, sessions, MySQL, and an opensourcepos POC</title><link>https://pext.dev/blog/codeigniter4-roadmap/</link><guid isPermaLink="true">https://pext.dev/blog/codeigniter4-roadmap/</guid><description>CodeIgniter 4 is now a side roadmap running alongside Laravel. New runtime support for password, hash, sessions, and a working MySQL client, the framework boots (autoloader, configuration, CLI commands), and a POC against opensourcepos boots the application and runs login and logout end to end.</description><pubDate>Fri, 05 Jun 2026 00:00:00 GMT</pubDate><category>Feature</category><author>office@pext.dev (Alex)</author></item><item><title>Leaving PHP, Part 6: async, concurrency, and streaming are still awkward</title><link>https://pext.dev/blog/leaving-php-6-async/</link><guid isPermaLink="true">https://pext.dev/blog/leaving-php-6-async/</guid><description>Part 6 of the ten-part Leaving PHP series. Fibers landed in 8.1, Swoole and ReactPHP and AmPHP exist, and yet writing async PHP in 2026 still puts you on a side path. The libraries, the frameworks, and the team mental model all assume the request-response shape.</description><pubDate>Wed, 03 Jun 2026 00:00:00 GMT</pubDate><category>Architecture</category><author>office@pext.dev (Alex)</author></item><item><title>Week in review: 25 May 2026</title><link>https://pext.dev/blog/week-in-review-2026-05-25/</link><guid isPermaLink="true">https://pext.dev/blog/week-in-review-2026-05-25/</guid><description>A recap of the week of 25 May: multiple new SAPIs including the embedded -S server, a TypeScript port of the bootstrap module that mirrors PHP for extension loading and ini reading, and the centralized in-memory storage that separates per-request execution contexts.</description><pubDate>Mon, 01 Jun 2026 00:00:00 GMT</pubDate><category>Weekly</category><author>office@pext.dev (Alex)</author></item><item><title>Leaving PHP, Part 5: frontend-backend type sharing is a different sport now</title><link>https://pext.dev/blog/leaving-php-5-types-sharing/</link><guid isPermaLink="true">https://pext.dev/blog/leaving-php-5-types-sharing/</guid><description>Part 5 of the ten-part Leaving PHP series. In a TypeScript-everywhere stack the type of an API response is one source of truth, consumed by server and client. PHP plus JavaScript leaves you with two type systems that do not talk, and the productivity gap is now too large to ignore.</description><pubDate>Sat, 30 May 2026 00:00:00 GMT</pubDate><category>Architecture</category><author>office@pext.dev (Alex)</author></item><item><title>Phase 2 complete: every Laravel utility package at 100%, and five new runtime modules to get there</title><link>https://pext.dev/blog/laravel-utility-phase-complete/</link><guid isPermaLink="true">https://pext.dev/blog/laravel-utility-phase-complete/</guid><description>Phase 2 of the Laravel roadmap closes with a 100% pass rate on every utility package. Five new runtime modules landed alongside it (ctype, filter, intl, mbstring, sessions), and the roadmap deliberately deviates to cross-check against PhpSpreadsheet and CodeIgniter 4 before continuing.</description><pubDate>Thu, 28 May 2026 00:00:00 GMT</pubDate><category>Feature</category><author>office@pext.dev (Alex)</author></item><item><title>Week in review: 18 May 2026</title><link>https://pext.dev/blog/week-in-review-2026-05-18/</link><guid isPermaLink="true">https://pext.dev/blog/week-in-review-2026-05-18/</guid><description>A recap of the week of 18 May: opening transpilation of PhpSpreadsheet and its test suite, an initial conversion of CodeIgniter 4, multi-process testing finished for nette/schema and nette/utils, and a transpiler-side cleanup pass that trims superfluous emitted JavaScript.</description><pubDate>Mon, 25 May 2026 00:00:00 GMT</pubDate><category>Weekly</category><author>office@pext.dev (Alex)</author></item><item><title>How Pext handles HTTP requests: the same model as PHP, with a path out</title><link>https://pext.dev/blog/pext-request-model/</link><guid isPermaLink="true">https://pext.dev/blog/pext-request-model/</guid><description>A walk through the Pext request lifecycle: shared-nothing bootstrap on par with PHP, drop-in replacement for the PHP CLI, separated centralized storage that opens the door to async and threaded SAPIs, and transpile-time inference for the I/O calls that would need refactoring to take advantage of them.</description><pubDate>Fri, 22 May 2026 00:00:00 GMT</pubDate><category>Architecture</category><author>office@pext.dev (Alex)</author></item><item><title>Leaving PHP, Part 4: the package ecosystem is fine, the gravity is elsewhere</title><link>https://pext.dev/blog/leaving-php-4-ecosystem/</link><guid isPermaLink="true">https://pext.dev/blog/leaving-php-4-ecosystem/</guid><description>Part 4 of the ten-part Leaving PHP series. Composer works, Packagist works, Laravel and Symfony are mature. None of that is the problem. The problem is that the cutting edge of every new category ships JavaScript and Python first, and PHP fifth, late, or never.</description><pubDate>Wed, 20 May 2026 00:00:00 GMT</pubDate><category>Architecture</category><author>office@pext.dev (Alex)</author></item><item><title>Week in review: 11 May 2026</title><link>https://pext.dev/blog/week-in-review-2026-05-11/</link><guid isPermaLink="true">https://pext.dev/blog/week-in-review-2026-05-11/</guid><description>A recap of the week of 11 May: cron-expression at 100%, magic-method fixes for __call and __invoke, by-ref and copy-on-write across call boundaries, dynamic member syntax, a new pext CLI with a pext.ini equivalent, a TypeScript pipeline finished end-to-end, native new for static instantiation, plus variadic coercion, call_user_func by-ref, and grouped use.</description><pubDate>Mon, 18 May 2026 00:00:00 GMT</pubDate><category>Weekly</category><author>office@pext.dev (Alex)</author></item><item><title>Transpiling dragonmantank/cron-expression: timezones, DST, PHP date formats, and a cache for Intl.DateTimeFormat</title><link>https://pext.dev/blog/cron-expression-conversion/</link><guid isPermaLink="true">https://pext.dev/blog/cron-expression-conversion/</guid><description>How Pext brought dragonmantank/cron-expression to 100%. The work was almost entirely in the datetime module: timezone arithmetic, DST transitions, the add/sub/diff family, the long tail of PHP-specific date format characters, and a cache for Intl.DateTimeFormat that turned a slow run into a reasonable one.</description><pubDate>Fri, 15 May 2026 00:00:00 GMT</pubDate><category>Case Study</category><author>office@pext.dev (Alex)</author></item><item><title>Leaving PHP, Part 3: the type system arrived late and incomplete</title><link>https://pext.dev/blog/leaving-php-3-types/</link><guid isPermaLink="true">https://pext.dev/blog/leaving-php-3-types/</guid><description>Part 3 of the ten-part Leaving PHP series. A decade of incremental type-system additions (7.0 through 8.4), still no generics in the language, and the refactoring confidence gap that hits hardest on a 200,000-line codebase compared to TypeScript, Kotlin, and Python with Pyright.</description><pubDate>Thu, 14 May 2026 00:00:00 GMT</pubDate><category>Architecture</category><author>office@pext.dev (Alex)</author></item><item><title>Transpiling egulias/email-validator: a multibyte string module, DNS, and the road to 100%</title><link>https://pext.dev/blog/email-validator-conversion/</link><guid isPermaLink="true">https://pext.dev/blog/email-validator-conversion/</guid><description>How Pext reached 100% on egulias/email-validator: a new pext-multibyte-string module covering the mb_* family, a pext-network module for DNS lookups, the codepoint-vs-byte fixes the parser needed, and the CRLF handling that closed the folded-header tests.</description><pubDate>Tue, 12 May 2026 00:00:00 GMT</pubDate><category>Case Study</category><author>office@pext.dev (Alex)</author></item><item><title>Week in review: 04 May 2026</title><link>https://pext.dev/blog/week-in-review-2026-05-04/</link><guid isPermaLink="true">https://pext.dev/blog/week-in-review-2026-05-04/</guid><description>A recap of the week of 04 May: a partial audit of the arrays module, doctrine/lexer at 100%, egulias/email-validator at 92% on the back of two new runtime modules (pext-network, pext-multibyte-string), hamcrest-php at 90%, myclabs/deep-copy at 83% with a full clone implementation, and datetime improvements driven by cron-expression.</description><pubDate>Mon, 11 May 2026 00:00:00 GMT</pubDate><category>Weekly</category><author>office@pext.dev (Alex)</author></item><item><title>Transpiling composer/semver: PHPUnit 9 via Symfony symlink and eval-generated version_compare</title><link>https://pext.dev/blog/semver-conversion/</link><guid isPermaLink="true">https://pext.dev/blog/semver-conversion/</guid><description>How Pext reached 100% on the composer/semver test suite. Two hurdles that had nothing to do with the library itself: a PHPUnit 9 binary bootstrapped through a Symfony symlink, and dozens of eval calls that generate version_compare code which had to see the caller scope.</description><pubDate>Thu, 07 May 2026 00:00:00 GMT</pubDate><category>Case Study</category><author>office@pext.dev (Alex)</author></item><item><title>Leaving PHP, Part 2: the runtime model is from a different era</title><link>https://pext.dev/blog/leaving-php-2-runtime/</link><guid isPermaLink="true">https://pext.dev/blog/leaving-php-2-runtime/</guid><description>Part 2 of the ten-part Leaving PHP series. The architectural cost of shared-nothing in 2026: a 10–30× throughput gap on TechEmpower, the connection-pool math that hits Postgres ten times harder than Node, and what you give up when you reach for Swoole, RoadRunner, or FrankenPHP.</description><pubDate>Wed, 06 May 2026 00:00:00 GMT</pubDate><category>Architecture</category><author>office@pext.dev (Alex)</author></item><item><title>Week in review: 27 Apr 2026</title><link>https://pext.dev/blog/week-in-review-2026-04-27/</link><guid isPermaLink="true">https://pext.dev/blog/week-in-review-2026-04-27/</guid><description>A recap of the week of 27 April: a complete audit of the math module against every PHP version since 4, composer/semver and doctrine/inflector at 100%, a deep analysis of string literal encodings, experimental TypeScript output, and initial support for static variables inside functions.</description><pubDate>Mon, 04 May 2026 00:00:00 GMT</pubDate><category>Weekly</category><author>office@pext.dev (Alex)</author></item><item><title>Auditing the math module to full PHP parity</title><link>https://pext.dev/blog/math-module-audit/</link><guid isPermaLink="true">https://pext.dev/blog/math-module-audit/</guid><description>How Pext brought the math module to full PHP parity: dual test suites, version-aware ValueError throwing, operators that branch on PHP_INT_SIZE at runtime, the C99 corner cases in pow, comparable-aware max/min, operator-overridable pow, dual rounding mode acceptance, and inlining as the next step.</description><pubDate>Sun, 03 May 2026 00:00:00 GMT</pubDate><category>Feature</category><author>office@pext.dev (Alex)</author></item><item><title>Leaving PHP, Part 1: the talent pool is shrinking, and the numbers are worse than you think</title><link>https://pext.dev/blog/leaving-php-1-talent/</link><guid isPermaLink="true">https://pext.dev/blog/leaving-php-1-talent/</guid><description>Part 1 of a ten-part series on why teams are leaving PHP in 2026. A data-driven look at the talent market: a ~40% relative drop in seven years, an aging bench, only 15.2% of new programmers picking PHP first, and a salary curve that punishes hiring at the wrong end.</description><pubDate>Wed, 29 Apr 2026 00:00:00 GMT</pubDate><category>Architecture</category><author>office@pext.dev (Alex)</author></item><item><title>Week in review: 20 Apr 2026</title><link>https://pext.dev/blog/week-in-review-2026-04-20/</link><guid isPermaLink="true">https://pext.dev/blog/week-in-review-2026-04-20/</guid><description>A recap of the week of 20 April: brick/math at 100%, bcmath support, numeric conversion and coercion finalized, PCRE comprehensively tested, the Laravel roadmap published, and the Foundations phase complete.</description><pubDate>Mon, 27 Apr 2026 00:00:00 GMT</pubDate><category>Weekly</category><author>office@pext.dev (Alex)</author></item><item><title>Transpiling brick/math: the road to 100%</title><link>https://pext.dev/blog/brick-math-conversion/</link><guid isPermaLink="true">https://pext.dev/blog/brick-math-conversion/</guid><description>How Pext reached 100% on the brick/math test suite: keeping PHP int and float distinct in JavaScript, fixing static $var, handling overflow, tuning preg_match flags, scope resolution, and operator coercion.</description><pubDate>Fri, 24 Apr 2026 00:00:00 GMT</pubDate><category>Case Study</category><author>office@pext.dev (Alex)</author></item><item><title>Pext vs AI conversion vs manual rewrite</title><link>https://pext.dev/blog/pext-vs-ai-vs-rewrite/</link><guid isPermaLink="true">https://pext.dev/blog/pext-vs-ai-vs-rewrite/</guid><description>An honest comparison of the three ways to move a PHP codebase to Node.js. Speed, cost, risk, lock-in, and the transition problem that neither AI nor manual rewrites acknowledge.</description><pubDate>Wed, 22 Apr 2026 00:00:00 GMT</pubDate><category>Architecture</category><author>office@pext.dev (Alex)</author></item><item><title>Week in review: 13 Apr 2026</title><link>https://pext.dev/blog/week-in-review-2026-04-13/</link><guid isPermaLink="true">https://pext.dev/blog/week-in-review-2026-04-13/</guid><description>A recap of the week of 13 April: exporter at 92.5%, operator and type coercion improvements, math module testing, X account launch, blog filtering, and program execution support.</description><pubDate>Mon, 20 Apr 2026 00:00:00 GMT</pubDate><category>Weekly</category><author>office@pext.dev (Alex)</author></item><item><title>Transpiling sebastian/exporter: What it took to get to 92.5%</title><link>https://pext.dev/blog/exporter-recursion/</link><guid isPermaLink="true">https://pext.dev/blog/exporter-recursion/</guid><description>sebastian/exporter is small but technically demanding. A look at the three challenges it posed for Pext: destructor timing, object-to-array casting, and property visibility.</description><pubDate>Sat, 18 Apr 2026 00:00:00 GMT</pubDate><category>Case Study</category><author>office@pext.dev (Alex)</author></item><item><title>Mitigating runtime lock-in</title><link>https://pext.dev/blog/runtime-lock-in/</link><guid isPermaLink="true">https://pext.dev/blog/runtime-lock-in/</guid><description>An honest look at how Pext&apos;s modular runtime, inspectable output, escrow licensing, and two-phase roadmap are designed to de-risk migration, not trap you in a new ecosystem.</description><pubDate>Wed, 15 Apr 2026 00:00:00 GMT</pubDate><category>Architecture</category><author>office@pext.dev (Alex)</author></item><item><title>Week in review: 06 Apr 2026</title><link>https://pext.dev/blog/week-in-review-2026-04-06/</link><guid isPermaLink="true">https://pext.dev/blog/week-in-review-2026-04-06/</guid><description>A recap of the week of 6 April: website launch, refcounting destructors, sebastian/exporter at 82%, reflection line numbers, and comment-attribute preprocessing.</description><pubDate>Mon, 13 Apr 2026 00:00:00 GMT</pubDate><category>Weekly</category><author>office@pext.dev (Alex)</author></item><item><title>Converting PHPUnit to JavaScript with Pext</title><link>https://pext.dev/blog/phpunit-conversion/</link><guid isPermaLink="true">https://pext.dev/blog/phpunit-conversion/</guid><description>A deep dive into transpiling PHPUnit: 54k lines, 4,500+ tests, and one of the most demanding codebases in the PHP ecosystem.</description><pubDate>Thu, 09 Apr 2026 00:00:00 GMT</pubDate><category>Case Study</category><author>office@pext.dev (Alex)</author></item><item><title>Introducing pext.dev</title><link>https://pext.dev/blog/pext-dev-launch/</link><guid isPermaLink="true">https://pext.dev/blog/pext-dev-launch/</guid><description>The Pext presentation website goes public. A look at what we built, what it does, and where we go from here.</description><pubDate>Wed, 08 Apr 2026 00:00:00 GMT</pubDate><category>Announcement</category><author>office@pext.dev (Alex)</author></item></channel></rss>