Open Source
I've been contributing to open source since 2010. Much of it has been maintenance: taking over packages other people started, and keeping them working.
Writing a library is the easy part. Maintaining one means triaging issues, cutting releases, and occasionally making a change that breaks somebody's build for a reason you have to be able to defend in public.
Figures below are as of August 26, 2026.
Pagerfanta
I took over Pagerfanta in June 2020. It's a pagination library for PHP that had been around since 2011 and had gone quiet.
The first thing I did was take it apart. It shipped as a single package with adapters for Doctrine ORM, Doctrine DBAL, MongoDB ODM, PHPCR, Elastica, and Solarium built in — so installing it to paginate an array in memory dragged in dependency constraints for six data sources you weren't using. Since 3.0 it's ten focused packages: a core, a Twig integration, and one adapter each. You install what you actually page over.
289 packages depend on Pagerfanta, and it's installed around 640,000 times a month. The core package — the split I designed — has been installed 9.3 million times since 2020. I maintain the Symfony integration alongside it, at 20.2 million installs and 73 dependents.
The original package carries 53 million lifetime installs going back to 2011, most of them from before I took it on.
WebSockets
I sent 22 patches to an existing Symfony WebSocket bundle before writing my own. When that project stopped moving, I wrote a WebSocket server library for PHP, with the Symfony integration as a separate bundle on top.
That split is the point. The bundle I'd been patching pulled in a full WebSocket stack, two more bundles, and around ten Symfony components — so running a WebSocket server meant building a Symfony application. Mine depends on the RFC 6455 protocol implementation, ReactPHP's event loop and sockets, and the two Symfony components it actually uses. The server runs anywhere; the bundle is optional.
Both are small: a little over a thousand installs a month each.
Transifex
I wrote a PHP client for the Transifex API to get better translation automation on a Joomla project, then used it to build Mautic's translation infrastructure, which rebuilds its language packs from Transifex every day.
I stopped maintaining it at around 157,000 installs. In January 2020 the Mautic team forked it in-house to keep their pipeline running.
Sylius plugins
Two of my Sylius plugins came out of a client build: a shipping estimator and product samples. Each solved a real problem for one store, and neither was specific to that store.
If a feature isn't about the client paying for it, it has no business being trapped in their codebase. They get the feature, the ecosystem gets a package, and I get one implementation to maintain instead of two.
Adoption on both is minimal.
Joomla
I spent about a decade in the Joomla project.
- Release coordinator for four feature releases — 3.2, 3.3, 3.8, and 3.9. Joomla 3.9 was the project's privacy release; the GDPR compliance tooling shipped under it.
- Core developer on the Joomla Framework, through its 1.x and 2.0 releases.
- Security team member for years, and its lead for part of them.
- Board of Directors of Open Source Matters, Inc., the not-for-profit behind the project, as Production Department Coordinator.
I also built and maintained Joomla's official Docker image and shipped its releases through Docker's official images program. It's still an official image, across eight processor architectures; other people maintain it now.
Elsewhere
Around 535 merged pull requests into other people's projects. The ones I've put the most into:
- Doctrine Extensions — 78 merged
- JWT Refresh Token Bundle — 43 merged. Refresh-token rotation under real concurrency came up again years later in my day job; that bundle is where I first worked through the problem.
- Sylius — 31 merged across the core and its resource bundle
- Symfony — 15 merged into the framework itself
- JMS Serializer, Liip's Imagine and test-fixtures bundles, Doctrine Bundle, FOSRestBundle, and Packagist
I was also one of the lead developers on Mautic through its 1.0 release, and I wrote its original Docker image, which is still active eleven years later at 481 stars and 345 forks.
Documentation lives elsewhere
The packages have their own home. Installation, configuration, upgrade guides, and release notes are at babdev.com.