API Platform 4.3: MCP server, Scalar UI, and security before the provider

API Platform 4.3 shipped March 13, 2026. The headline addition is MCP support: your API resources can now be exposed as tools and resources for LLM agents with no extra infrastructure. Alongside that, two quality-of-life improvements stand out — Scalar as an alternative documentation UI, and security checks that fire before the state provider runs. MCP server support The Model Context Protocol is the emerging standard for connecting LLMs to external tools and data sources. 4.3 ships an experimental MCP integration that maps directly onto the API Platform resource model. ...

March 23, 2026 · 4 min · Guillaume Delré

Building a self-hosted homelab with Docker Compose and Traefik

For years I wanted a homelab at home. A place of my own to host development tools, monitor my machines, run home automation, and experiment without risking breaking anything important. The idea is simple. Getting it running, a bit less so. Back then, Kubernetes didn’t exist yet. Options for running multiple services on a single machine came down to bash scripting, hand-written Nginx configs, and a lot of coffee. Tutorials on “homelab for humans” were nowhere to be found. ...

February 17, 2026 · 11 min · Guillaume Delré

Symfony 8.0: PHP 8.4 minimum, native lazy objects, and FormFlow

Symfony 8.0 shipped November 27, 2025, same day as 7.4. It requires PHP 8.4 and drops everything that was deprecated in 7.4. The two most interesting changes are what it stops doing and what it starts doing with PHP 8.4. Native lazy objects Symfony’s proxy system, used for lazy service initialization and Doctrine’s entity proxies, has historically relied on code generation. The proxy classes were generated at cache warmup, stored as files, and loaded when needed. It worked, but it added real complexity: generated files to manage, cache to invalidate, code that looked nothing like the class it proxied. ...

January 12, 2026 · 6 min · Guillaume Delré

Symfony 7.4 LTS: message signing, PHP config arrays, and the last 7.x

Symfony 7.4 landed November 2025, alongside 8.0. It’s the last LTS of the 7.x line: PHP 8.2 minimum, three years of bug fixes, four of security. For teams that can’t or won’t follow 8.0’s PHP 8.4 requirement, 7.4 is where you land. Message signing in Messenger Transport security in Messenger has always been the application’s problem to solve. 7.4 adds message signing: a stamp-based mechanism that signs dispatched messages and validates signatures on reception. ...

January 10, 2026 · 6 min · Guillaume Delré

PHP 8.5: the pipe operator, a URI library, and a lot of cleanup

PHP 8.5 shipped November 20th. Two features define this release: the pipe operator and the URI extension. They solve different problems, but both share the same motivation: making common operations less awkward to express. The pipe operator Functional pipelines in PHP have always been a mess. Chaining transformations meant either nesting function calls inside out, or breaking them into intermediate variables: // before — read right to left $result = array_sum(array_map('strlen', array_filter($strings, 'strlen'))); // or verbose but readable $filtered = array_filter($strings, 'strlen'); $lengths = array_map('strlen', $filtered); $result = array_sum($lengths); // after — read left to right $result = $strings |> array_filter(?, 'strlen') |> array_map('strlen', ?) |> array_sum(?); The |> operator passes the left-hand value into the right-hand expression. The ? placeholder marks where it goes. Pipelines now read in the order operations happen: left to right, top to bottom. ...

January 4, 2026 · 7 min · Guillaume Delré

API Platform 4.2: JSON streamer, ObjectMapper, and autoconfigure

API Platform 4.2 arrived in September 2025. Three changes stand out: a JSON streamer for large collections that avoids buffering the entire response in memory, an ObjectMapper that replaces the manual wiring in stateOptions-based DTO flows, and autoconfiguration of #[ApiResource] without explicit service registration. JSON streamer for large collections The default Symfony serializer builds the full response in memory before writing it to the output. For a collection of 10,000 items, this means allocating a PHP array, serializing it to a string, and keeping both in memory until the response is flushed. At scale, this is the source of the OOM errors that force people to add pagination everywhere. ...

September 18, 2025 · 3 min · Guillaume Delré

Observability on FrankenPHP containers before the cloud migration was done

When you run workloads on-premise, you can get away with almost no observability. You have SSH. You have top. You have someone who knows that the authentication service always spikes on Monday mornings. Institutional knowledge substitutes for instrumentation, and nobody budgets the time to replace it. Then you migrate to the cloud. The institutional knowledge doesn’t follow. The SSH access is gone or inconvenient. And for the first time, you’re staring at fourteen FrankenPHP containers with no idea what they’re actually doing. ...

June 7, 2025 · 4 min · Guillaume Delré

Local HTTPS with Traefik: traefik.me is dead, long live sslip.io

The setup seemed perfect. Point *.traefik.me at 127.0.0.1, download a wildcard certificate from the same domain, drop it into Traefik, and every local service gets a clean HTTPS URL with no IP in the address bar. No Let’s Encrypt rate limits, no mkcert to explain to teammates, no self-signed warnings to click through. Just https://myapp.traefik.me and a green padlock. Then in March 2025, Let’s Encrypt revoked the certificate. The wildcard cert for traefik.me is gone and it’s not coming back. ...

April 17, 2025 · 5 min · Guillaume Delré

API Platform 4.1: strict query params, multi-spec OpenAPI, and GraphQL limits

API Platform 4.1 arrived in February 2025 with a batch of features that are less about new capabilities and more about making the existing ones production-ready. Strict query param validation gets a first-class property. OpenAPI gains a mechanism for splitting large APIs into separate specs. GraphQL gets the abuse prevention controls it was missing. Strict query parameter validation 3.3 introduced query parameter validation as opt-in. 3.4 deprecated the loose behavior. 4.1 formalizes it with a native strictQueryParameterValidation property on resources and operations: when set to true, unknown query parameters return 400. ...

February 28, 2025 · 3 min · Guillaume Delré

PostgreSQL full-text search through Doctrine, without a line of raw SQL

The search box on the media library returned results in 800 milliseconds on staging. Production had forty times more rows. The query plan showed a sequential scan: no index involved, no way to fix it with a standard B-tree. The product team also wanted multi-word search: type “interview president”, get results containing both words. A LIKE query with wildcards has no clean way to express that without multiple independent conditions, each requiring its own scan. ...

February 10, 2025 · 6 min · Guillaume Delré