<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>Luca Lusso</title>
		<link>https://lussoluca.github.io/blog/</link>
		<description>Notes on Drupal internals, PHP, profiling and AI, from the maintainer of WebProfiler and Monolog.</description>
		<language>en</language>
		<atom:link href="https://lussoluca.github.io/blog/rss.xml" rel="self" type="application/rss+xml" />
		<item>
			<title>Domain logic on entities, without touching the entity</title>
			<link>https://lussoluca.github.io/blog/articles/entity-adapter/</link>
			<guid isPermaLink="true">https://lussoluca.github.io/blog/articles/entity-adapter/</guid>
			<pubDate>Wed, 16 Sep 2026 00:00:00 GMT</pubDate>
			<description>Entity Adapter attaches domain-specific behaviour to entities, and to any other object, with a PHP attribute and an interface of your own. No bundle class, no entity class override, no helper functions in a .module file.</description>
		</item>
		<item>
			<title>Drupal in a long-running process</title>
			<link>https://lussoluca.github.io/blog/articles/drupal-in-a-long-running-process/</link>
			<guid isPermaLink="true">https://lussoluca.github.io/blog/articles/drupal-in-a-long-running-process/</guid>
			<pubDate>Mon, 17 Aug 2026 00:00:00 GMT</pubDate>
			<description>Drupal spends a request filling static caches and then throws the whole process away. Keep the process alive, in a Symfony Messenger worker or a FrankenPHP worker, and every one of those caches becomes a lie that outlives the work it was computed for.</description>
		</item>
		<item>
			<title>Profiling AI provider calls in Drupal</title>
			<link>https://lussoluca.github.io/blog/articles/profiling-ai-calls-in-drupal/</link>
			<guid isPermaLink="true">https://lussoluca.github.io/blog/articles/profiling-ai-calls-in-drupal/</guid>
			<pubDate>Fri, 14 Aug 2026 00:00:00 GMT</pubDate>
			<description>WebProfiler now collects every call the AI module makes to a provider, with timings, tokens, guardrail verdicts and tool exchanges. Here is what it records and how it stays out of the AI module's way.</description>
		</item>
	</channel>
</rss>
