<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="/vendor/feed/atom.xsl" type="text/xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-US">
                        <id>https://freek.dev/feed</id>
                                <link href="https://freek.dev/feed" rel="self"></link>
                                <title><![CDATA[freek.dev - all blogposts]]></title>
                    
                                <subtitle>All blogposts on freek.dev</subtitle>
                                                    <updated>2026-06-17T12:30:28+02:00</updated>
                        <entry>
            <title><![CDATA[How PHP Attributes Changed the Way I Write Livewire]]></title>
            <link rel="alternate" href="https://freek.dev/3142-how-php-attributes-changed-the-way-i-write-livewire" />
            <id>https://freek.dev/3142</id>
            <author>
                <name><![CDATA[Freek Van der Herten]]></name>
                <email><![CDATA[freek@spatie.be]]></email>

            </author>
            <summary type="html">
                <![CDATA[<p>Bert De Swaef shows how PHP attributes made his Livewire components easier to read by attaching validation, URL sync, and event listeners directly to the properties and methods they belong to. Nice piece on how attributes reduce mental overhead, improve IDE support, and make components feel more self-documenting.</p>


<a href='https://bert.gent/articles/2026-05-24/how-php-attributes-changed-the-way-i-write-livewire'>Read more</a>]]>
            </summary>
                                    <updated>2026-06-17T12:30:28+02:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Rust Tutorial For PHP and JavaScript Developers]]></title>
            <link rel="alternate" href="https://freek.dev/3141-rust-tutorial-for-php-and-javascript-developers" />
            <id>https://freek.dev/3141</id>
            <author>
                <name><![CDATA[Freek Van der Herten]]></name>
                <email><![CDATA[freek@spatie.be]]></email>

            </author>
            <summary type="html">
                <![CDATA[

<a href='https://youtu.be/lJdqrDFswns?si=xs8_bE4e1JwIsZHu'>Read more</a>]]>
            </summary>
                                    <updated>2026-06-16T14:55:29+02:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Caching get_certificate lookups in Caddy]]></title>
            <link rel="alternate" href="https://freek.dev/3140-caching-get-certificate-lookups-in-caddy" />
            <id>https://freek.dev/3140</id>
            <author>
                <name><![CDATA[Freek Van der Herten]]></name>
                <email><![CDATA[freek@spatie.be]]></email>

            </author>
            <summary type="html">
                <![CDATA[<p>Mattias open sourced a small Caddy module that caches get_certificate HTTP lookups, avoiding a backend fetch on every TLS handshake. A nice write-up on the problem, the design, and the trade-offs.</p>


<a href='https://ma.ttias.be/caching-get-certificate-lookups-in-caddy/'>Read more</a>]]>
            </summary>
                                    <updated>2026-06-15T14:30:29+02:00</updated>
        </entry>
            <entry>
            <title><![CDATA[The ghost domain problem in DNS, and what we're doing about it]]></title>
            <link rel="alternate" href="https://freek.dev/3139-the-ghost-domain-problem-in-dns-and-what-were-doing-about-it" />
            <id>https://freek.dev/3139</id>
            <author>
                <name><![CDATA[Freek Van der Herten]]></name>
                <email><![CDATA[freek@spatie.be]]></email>

            </author>
            <summary type="html">
                <![CDATA[<p>A good write-up on the ghost domain problem in DNS: domains removed from a registry can still appear healthy to uptime checkers because recursive resolvers keep stale delegations warm. The Oh Dear team explains the edge case and how they're tightening their resolver setup to reduce that blind spot.</p>


<a href='https://ohdear.app/news-and-updates/the-ghost-domain-problem-in-dns-and-what-were-doing-about-it'>Read more</a>]]>
            </summary>
                                    <updated>2026-06-14T14:30:34+02:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Multi-Agent Orchestration in Laravel: When You Actually Need It]]></title>
            <link rel="alternate" href="https://freek.dev/3138-multi-agent-orchestration-in-laravel-when-you-actually-need-it" />
            <id>https://freek.dev/3138</id>
            <author>
                <name><![CDATA[Freek Van der Herten]]></name>
                <email><![CDATA[freek@spatie.be]]></email>

            </author>
            <summary type="html">
                <![CDATA[<p>A practical take on multi-agent setups in Laravel: another agent only earns its place when it needs its own model, tools, or instructions. Good piece on delegation tradeoffs, context handoff, and how to test routing before it becomes an expensive latency tax.</p>


<a href='https://mujahidabbas.dev/blog/laravel-multi-agent-orchestration/'>Read more</a>]]>
            </summary>
                                    <updated>2026-06-13T14:30:26+02:00</updated>
        </entry>
            <entry>
            <title><![CDATA[#[RouteParameter] Does Not Bind Your Model]]></title>
            <link rel="alternate" href="https://freek.dev/3137-routeparameter-does-not-bind-your-model" />
            <id>https://freek.dev/3137</id>
            <author>
                <name><![CDATA[Freek Van der Herten]]></name>
                <email><![CDATA[freek@spatie.be]]></email>

            </author>
            <summary type="html">
                <![CDATA[<p>Michael Dyrynda explains a subtle Laravel gotcha: #[RouteParameter] only reads the current route parameter value, it does not perform implicit model binding. Good reminder that the controller signature still matters when you expect a bound model inside a form request.</p>


<a href='https://dyrynda.com.au/blog/route-parameters-can-hurt'>Read more</a>]]>
            </summary>
                                    <updated>2026-06-12T14:30:26+02:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Prompt-Injection Guardrails in Laravel: Defend the Tools, Not the Prompt]]></title>
            <link rel="alternate" href="https://freek.dev/3136-prompt-injection-guardrails-in-laravel-defend-the-tools-not-the-prompt" />
            <id>https://freek.dev/3136</id>
            <author>
                <name><![CDATA[Freek Van der Herten]]></name>
                <email><![CDATA[freek@spatie.be]]></email>

            </author>
            <summary type="html">
                <![CDATA[<p>You can't out-prompt an attacker — to the model, your system instructions and a malicious support ticket are the same text. So stop defending the prompt and lock down the boundaries you actually control: tools scoped to the authenticated user server-side, middleware that screens and logs, output handled as untrusted input, a human in front of anything irreversible, and a fake-free test that fails CI the moment someone drops the auth scope.</p>


<a href='https://mujahidabbas.dev/blog/laravel-prompt-injection-guardrails/'>Read more</a>]]>
            </summary>
                                    <updated>2026-06-11T14:10:30+02:00</updated>
        </entry>
            <entry>
            <title><![CDATA[More time to think]]></title>
            <link rel="alternate" href="https://freek.dev/3135-more-time-to-think" />
            <id>https://freek.dev/3135</id>
            <author>
                <name><![CDATA[Freek Van der Herten]]></name>
                <email><![CDATA[freek@spatie.be]]></email>

            </author>
            <summary type="html">
                <![CDATA[<p>Matthias writes that AI has shifted more of software development from typing to thinking, reviewing, and iterating. Nice reflection on how agentic coding, parallel worktrees, and voice dictation can slow individual features down while still increasing overall output.</p>


<a href='https://ma.ttias.be/more-time-to-think/'>Read more</a>]]>
            </summary>
                                    <updated>2026-06-10T14:30:29+02:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Logging is here!]]></title>
            <link rel="alternate" href="https://freek.dev/3147-logging-is-here" />
            <id>https://freek.dev/3147</id>
            <author>
                <name><![CDATA[Freek Van der Herten]]></name>
                <email><![CDATA[freek@spatie.be]]></email>

            </author>
            <summary type="html">
                <![CDATA[<p>Flare now supports log collection for Laravel and PHP apps, with real-time filtering and search in the same polished interface. A nice overview of what logging adds and how to get started with the new SDK release.</p>


<a href='https://flareapp.io/blog/logging-is-here'>Read more</a>]]>
            </summary>
                                    <updated>2026-06-09T14:30:28+02:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Evals in Laravel: How to Prove Your AI Output Is Actually Good]]></title>
            <link rel="alternate" href="https://freek.dev/3132-evals-in-laravel-how-to-prove-your-ai-output-is-actually-good" />
            <id>https://freek.dev/3132</id>
            <author>
                <name><![CDATA[Freek Van der Herten]]></name>
                <email><![CDATA[freek@spatie.be]]></email>

            </author>
            <summary type="html">
                <![CDATA[<p>Your Agent::fake() tests prove your Laravel AI feature runs — not that its output is any good. This evals a real ticket classifier with the AI SDK: a golden dataset for the fields you can check, an LLM-as-judge for the free text you can't, and a regression gate that catches a bad prompt before your customers do.</p>


<a href='https://mujahidabbas.dev/blog/laravel-ai-evals/'>Read more</a>]]>
            </summary>
                                    <updated>2026-06-08T14:26:26+02:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Flare ❤️ Livewire]]></title>
            <link rel="alternate" href="https://freek.dev/3122-flare-livewire" />
            <id>https://freek.dev/3122</id>
            <author>
                <name><![CDATA[Freek Van der Herten]]></name>
                <email><![CDATA[freek@spatie.be]]></email>

            </author>
            <summary type="html">
                <![CDATA[<p>We built deep Livewire support into Flare, making component hierarchies, lifecycle phases, method calls, and related queries visible inside traces. It looks like a solid step forward for understanding where Livewire apps spend time and where things go wrong.</p>


<a href='https://flareapp.io/blog/flare-livewire'>Read more</a>]]>
            </summary>
                                    <updated>2026-06-06T14:30:04+02:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Svelte support for Flare is here!]]></title>
            <link rel="alternate" href="https://freek.dev/3130-svelte-support-for-flare-is-here" />
            <id>https://freek.dev/3130</id>
            <author>
                <name><![CDATA[Freek Van der Herten]]></name>
                <email><![CDATA[freek@spatie.be]]></email>

            </author>
            <summary type="html">
                <![CDATA[<p>We shipped a Svelte 5 integration for Flare with an error boundary, component hierarchy reporting, and lifecycle-aware context. Looks especially useful for seeing which component broke, and where the error came from.</p>


<a href='https://flareapp.io/blog/svelte-support-for-flare-is-here'>Read more</a>]]>
            </summary>
                                    <updated>2026-06-05T14:30:05+02:00</updated>
        </entry>
            <entry>
            <title><![CDATA[New Webpack and Next.js plugins for Flare]]></title>
            <link rel="alternate" href="https://freek.dev/3129-new-webpack-and-nextjs-plugins-for-flare" />
            <id>https://freek.dev/3129</id>
            <author>
                <name><![CDATA[Freek Van der Herten]]></name>
                <email><![CDATA[freek@spatie.be]]></email>

            </author>
            <summary type="html">
                <![CDATA[<p>We shipped dedicated webpack and Next.js plugins for Flare that upload sourcemaps after each production build. Nice update, especially the Next.js wrapper that handles source map generation and cleanup for you.</p>


<a href='https://flareapp.io/blog/new-webpack-and-nextjs-plugins-for-flare'>Read more</a>]]>
            </summary>
                                    <updated>2026-06-04T14:30:04+02:00</updated>
        </entry>
            <entry>
            <title><![CDATA[The Reason I Love Tempest for APIs]]></title>
            <link rel="alternate" href="https://freek.dev/3127-the-reason-i-love-tempest-for-apis" />
            <id>https://freek.dev/3127</id>
            <author>
                <name><![CDATA[Freek Van der Herten]]></name>
                <email><![CDATA[freek@spatie.be]]></email>

            </author>
            <summary type="html">
                <![CDATA[<p>Steve King explains why Tempest feels so nice for API work: typed request objects, declarative validation, route discovery, and a low-ceremony action flow. It is a good look at how the framework removes boilerplate without giving up clarity.</p>


<a href='https://www.juststeveking.com/articles/the-reason-i-love-tempest-for-apis/'>Read more</a>]]>
            </summary>
                                    <updated>2026-06-03T14:30:27+02:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Forgot to Update Livewire. Got Hacked]]></title>
            <link rel="alternate" href="https://freek.dev/3126-forgot-to-update-livewire-got-hacked" />
            <id>https://freek.dev/3126</id>
            <author>
                <name><![CDATA[Freek Van der Herten]]></name>
                <email><![CDATA[freek@spatie.be]]></email>

            </author>
            <summary type="html">
                <![CDATA[<p>Daniel Petrica tells the story of how an unpatched Livewire vulnerability on a forgotten side project exposed Mailcoach API keys and led to 50,000 spam emails being sent. It is a useful reminder to keep dormant apps updated, and a good real-world example of how Docker can limit the blast radius when something goes wrong.</p>


<a href='https://danielpetrica.com/50-000-spam-emails-and-a-3-am-panic-what-happened-when-i-forgot-about-a-side-project/'>Read more</a>]]>
            </summary>
                                    <updated>2026-06-02T14:30:29+02:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Using property hooks in PHP]]></title>
            <link rel="alternate" href="https://freek.dev/3125-using-property-hooks-in-php" />
            <id>https://freek.dev/3125</id>
            <author>
                <name><![CDATA[Freek Van der Herten]]></name>
                <email><![CDATA[freek@spatie.be]]></email>

            </author>
            <summary type="html">
                <![CDATA[<p>Michael Dyrynda shows how PHP 8.4 property hooks can replace simple computed getter methods with virtual properties. He makes the case for using them when you want a clean, property-based API for derived values.</p>


<a href='https://dyrynda.com.au/blog/using-property-hooks-in-php'>Read more</a>]]>
            </summary>
                                    <updated>2026-06-01T14:30:31+02:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Validating distinct data in requests]]></title>
            <link rel="alternate" href="https://freek.dev/3124-validating-distinct-data-in-requests" />
            <id>https://freek.dev/3124</id>
            <author>
                <name><![CDATA[Freek Van der Herten]]></name>
                <email><![CDATA[freek@spatie.be]]></email>

            </author>
            <summary type="html">
                <![CDATA[<p>Michael Dyrynda shows how Laravel's <code>distinct</code> validation rule can protect nested request payloads from duplicate reference values before they corrupt relationship mapping. He also highlights the <code>strict</code> and <code>ignore_case</code> options for cases where loose comparison is not enough.</p>


<a href='https://dyrynda.com.au/blog/validating-distinct-request-data'>Read more</a>]]>
            </summary>
                                    <updated>2026-05-31T14:30:37+02:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Compound Engineering: How Every Codes With Agents]]></title>
            <link rel="alternate" href="https://freek.dev/3123-compound-engineering-how-every-codes-with-agents" />
            <id>https://freek.dev/3123</id>
            <author>
                <name><![CDATA[Freek Van der Herten]]></name>
                <email><![CDATA[freek@spatie.be]]></email>

            </author>
            <summary type="html">
                <![CDATA[<p>Every shares how its team uses AI agents in a compounding loop of planning, working, assessing, and feeding lessons back into the system. The big idea: each feature should make the next one easier to build because the agents keep learning the codebase.</p>


<a href='https://every.to/chain-of-thought/compound-engineering-how-every-codes-with-agents'>Read more</a>]]>
            </summary>
                                    <updated>2026-05-30T10:15:04+02:00</updated>
        </entry>
            <entry>
            <title><![CDATA[The stack behind There There]]></title>
            <link rel="alternate" href="https://freek.dev/3133-the-stack-behind-there-there" />
            <id>https://freek.dev/3133</id>
            <author>
                <name><![CDATA[Freek Van der Herten]]></name>
                <email><![CDATA[freek@spatie.be]]></email>

            </author>
            <summary type="html">
                <![CDATA[<p>An inside look at the stack powering There There: Laravel, Inertia, React, TypeScript, Horizon, Reverb, and a bunch of Spatie packages and services. A nice overview of the pragmatic tooling choices behind the product.</p>


<a href='https://there-there.app/blog/the-stack-behind-there-there'>Read more</a>]]>
            </summary>
                                    <updated>2026-05-30T10:13:56+02:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Automate your PHP security updates]]></title>
            <link rel="alternate" href="https://freek.dev/3131-automate-your-php-security-updates" />
            <id>https://freek.dev/3131</id>
            <author>
                <name><![CDATA[Freek Van der Herten]]></name>
                <email><![CDATA[freek@spatie.be]]></email>

            </author>
            <summary type="html">
                <![CDATA[<p>Yoeri shows how to automatically open a pull request when a new PHP security advisory appears. Nice little workflow that combines Laravel Health, Oh Dear, and GitHub Actions to keep apps patched quickly.</p>


<a href='https://yoeri.me/blog/automate-your-php-security-updates'>Read more</a>]]>
            </summary>
                                    <updated>2026-05-29T14:30:30+02:00</updated>
        </entry>
    </feed>
