<?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-08-14T12:30:33+02:00</updated>
                        <entry>
            <title><![CDATA[Can we make default Tailwind a more accessible choice?]]></title>
            <link rel="alternate" href="https://freek.dev/3179-can-we-make-default-tailwind-a-more-accessible-choice" />
            <id>https://freek.dev/3179</id>
            <author>
                <name><![CDATA[Freek Van der Herten]]></name>
                <email><![CDATA[freek@spatie.be]]></email>

            </author>
            <summary type="html">
                <![CDATA[<p>A sharp look at Tailwind's default rem-based breakpoints, and the accessibility tradeoff they make. It explains how browser font-size preferences can shift layouts, why that can help some users, and why px breakpoints are still a defensible choice.</p>


<a href='https://spatie.be/blog/can-we-make-default-tailwind-a-more-accessible-choice'>Read more</a>]]>
            </summary>
                                    <updated>2026-08-14T12:30:33+02:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Why we removed AI solutions from Flare]]></title>
            <link rel="alternate" href="https://freek.dev/3178-why-we-removed-ai-solutions-from-flare" />
            <id>https://freek.dev/3178</id>
            <author>
                <name><![CDATA[Freek Van der Herten]]></name>
                <email><![CDATA[freek@spatie.be]]></email>

            </author>
            <summary type="html">
                <![CDATA[<p>We explain why Flare's old AI-generated solutions no longer fit the way developers debug with modern coding agents. The replacement is a better workflow built around the MCP server, CLI, Copy for AI prompts, and agent-friendly docs.</p>


<a href='https://flareapp.io/blog/why-we-removed-ai-solutions-from-flare'>Read more</a>]]>
            </summary>
                                    <updated>2026-08-13T12:30:30+02:00</updated>
        </entry>
            <entry>
            <title><![CDATA[`exit()` may silently break your parallel tests]]></title>
            <link rel="alternate" href="https://freek.dev/3177-exit-may-silently-break-your-parallel-tests" />
            <id>https://freek.dev/3177</id>
            <author>
                <name><![CDATA[Freek Van der Herten]]></name>
                <email><![CDATA[freek@spatie.be]]></email>

            </author>
            <summary type="html">
                <![CDATA[<p>Michael explains why exit() can make parallel test workers crash without useful diagnostics, and why verbose flags do not help when the process dies outside PHPUnit's control. The fix is simple: throw an exception instead, so the failure is reported normally with a stack trace.</p>


<a href='https://dyrynda.com.au/blog/exit-may-silently-break-your-parallel-tests'>Read more</a>]]>
            </summary>
                                    <updated>2026-08-12T12:30:31+02:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Amped up]]></title>
            <link rel="alternate" href="https://freek.dev/3176-amped-up" />
            <id>https://freek.dev/3176</id>
            <author>
                <name><![CDATA[Freek Van der Herten]]></name>
                <email><![CDATA[freek@spatie.be]]></email>

            </author>
            <summary type="html">
                <![CDATA[<p>Sebastian explains why Amp became his default coding harness, and why user experience now matters more to him than model churn. He also shares the AGENTS.md tweaks that reduced overzealous verification during day-to-day coding.</p>


<a href='https://sebastiandedeyne.com/amped-up/'>Read more</a>]]>
            </summary>
                                    <updated>2026-08-11T12:30:28+02:00</updated>
        </entry>
            <entry>
            <title><![CDATA[sbx: Sandboxed Claude, complete with PHP and tools]]></title>
            <link rel="alternate" href="https://freek.dev/3175-sbx-sandboxed-claude-complete-with-php-and-tools" />
            <id>https://freek.dev/3175</id>
            <author>
                <name><![CDATA[Freek Van der Herten]]></name>
                <email><![CDATA[freek@spatie.be]]></email>

            </author>
            <summary type="html">
                <![CDATA[<p>A practical walkthrough for running Claude Code inside Docker's new sbx sandbox, with a custom PHP setup and extra tools for open source work. Benjamin also explains why sandboxing AI coding agents is the sensible default.</p>


<a href='https://www.beberlei.de/post/sbx-sandboxed-claude-complete-with-php-and-tools'>Read more</a>]]>
            </summary>
                                    <updated>2026-08-10T12:30:04+02:00</updated>
        </entry>
            <entry>
            <title><![CDATA[What's new in PHP 8.6]]></title>
            <link rel="alternate" href="https://freek.dev/3174-whats-new-in-php-86" />
            <id>https://freek.dev/3174</id>
            <author>
                <name><![CDATA[Freek Van der Herten]]></name>
                <email><![CDATA[freek@spatie.be]]></email>

            </author>
            <summary type="html">
                <![CDATA[<p>Brent surveys the most notable additions coming in PHP 8.6, including partial function application, the new polling API, readonly property defaults, and several smaller improvements and deprecations.</p>


<a href='https://stitcher.io/blog/new-in-php-86'>Read more</a>]]>
            </summary>
                                    <updated>2026-08-05T14:14:26+02:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Prevent cognitive debt by manually retyping LLM-generated code]]></title>
            <link rel="alternate" href="https://freek.dev/3173-prevent-cognitive-debt-by-manually-retyping-llm-generated-code" />
            <id>https://freek.dev/3173</id>
            <author>
                <name><![CDATA[Freek Van der Herten]]></name>
                <email><![CDATA[freek@spatie.be]]></email>

            </author>
            <summary type="html">
                <![CDATA[<p>Ankur Sethi argues that manually retyping LLM-generated code is a practical way to avoid cognitive debt. It slows you down, but helps you understand the code, catch bad suggestions, and keep a strong mental model of your codebase.</p>


<a href='https://ankursethi.com/blog/prevent-cognitive-debt-by-manually-retyping-llm-generated-code/'>Read more</a>]]>
            </summary>
                                    <updated>2026-08-04T14:56:26+02:00</updated>
        </entry>
            <entry>
            <title><![CDATA[We Became Editors-in-Chief, and Nobody Trained Us]]></title>
            <link rel="alternate" href="https://freek.dev/3172-we-became-editors-in-chief-and-nobody-trained-us" />
            <id>https://freek.dev/3172</id>
            <author>
                <name><![CDATA[Freek Van der Herten]]></name>
                <email><![CDATA[freek@spatie.be]]></email>

            </author>
            <summary type="html">
                <![CDATA[<p>An essay on how AI-assisted development turns engineers into full-time reviewers. We spend our days evaluating AI-generated diffs instead of writing code, and that shift carries a new cognitive fatigue and may widen the senior/junior gap.</p>


<a href='https://albertoarena.it/posts/we-became-editors-in-chief/'>Read more</a>]]>
            </summary>
                                    <updated>2026-08-03T16:56:25+02:00</updated>
        </entry>
            <entry>
            <title><![CDATA[PHP version stats: July, 2026]]></title>
            <link rel="alternate" href="https://freek.dev/3171-php-version-stats-july-2026" />
            <id>https://freek.dev/3171</id>
            <author>
                <name><![CDATA[Freek Van der Herten]]></name>
                <email><![CDATA[freek@spatie.be]]></email>

            </author>
            <summary type="html">
                <![CDATA[<p>Brendt shares fresh Packagist-based PHP version stats for July 2026: PHP 8.4 is now the most-used version, while PHP 8.5 reached 16% adoption after six months. He also notes that package minimum requirements still lag behind, with relatively few popular packages requiring a version that still gets active bugfix support.</p>


<a href='https://stitcher.io/blog/php-version-stats-july-2026'>Read more</a>]]>
            </summary>
                                    <updated>2026-07-29T17:23:14+02:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Building an order fulfilment workflow in Laravel]]></title>
            <link rel="alternate" href="https://freek.dev/3170-building-an-order-fulfilment-workflow-in-laravel" />
            <id>https://freek.dev/3170</id>
            <author>
                <name><![CDATA[Freek Van der Herten]]></name>
                <email><![CDATA[freek@spatie.be]]></email>

            </author>
            <summary type="html">
                <![CDATA[<p>Steve King builds a real order fulfilment flow to show how a workflow engine handles long-running processes in Laravel. The post covers steps, signals, retries, branching, human approval, compensation, and the surrounding tooling in one practical example.</p>


<a href='https://www.juststeveking.com/articles/building-an-order-fulfilment-workflow/'>Read more</a>]]>
            </summary>
                                    <updated>2026-07-25T14:30:28+02:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Setting up a remote environment for agentic coding on a VPS]]></title>
            <link rel="alternate" href="https://freek.dev/3169-setting-up-a-remote-environment-for-agentic-coding-on-a-vps" />
            <id>https://freek.dev/3169</id>
            <author>
                <name><![CDATA[Freek Van der Herten]]></name>
                <email><![CDATA[freek@spatie.be]]></email>

            </author>
            <summary type="html">
                <![CDATA[<p>Mattias walks through moving an AI coding setup off a laptop and onto a private VPS. He covers Tailscale, tmux, a browser-based editor, and the small tweaks that make a remote setup practical from any device.</p>


<a href='https://ma.ttias.be/remote-coding-environment-vps/'>Read more</a>]]>
            </summary>
                                    <updated>2026-07-24T16:00:27+02:00</updated>
        </entry>
            <entry>
            <title><![CDATA[There's no artisan schema:show, so I built one]]></title>
            <link rel="alternate" href="https://freek.dev/3168-theres-no-artisan-schemashow-so-i-built-one" />
            <id>https://freek.dev/3168</id>
            <author>
                <name><![CDATA[Freek Van der Herten]]></name>
                <email><![CDATA[freek@spatie.be]]></email>

            </author>
            <summary type="html">
                <![CDATA[<p>A live, zoomable ER diagram of your Laravel app's actual database schema, safe to run in production because it only ever reads structure, never rows.</p>


<a href='https://albertoarena.it/posts/introducing-truss/'>Read more</a>]]>
            </summary>
                                    <updated>2026-07-24T14:40:27+02:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Preventing SSRF in Laravel: Why Blocking Private IPs Fails]]></title>
            <link rel="alternate" href="https://freek.dev/3167-preventing-ssrf-in-laravel-why-blocking-private-ips-fails" />
            <id>https://freek.dev/3167</id>
            <author>
                <name><![CDATA[Freek Van der Herten]]></name>
                <email><![CDATA[freek@spatie.be]]></email>

            </author>
            <summary type="html">
                <![CDATA[<p>I found there wasn't any good SSRF prevention libraries for Laravel, so I built one. Very comprehensive tests based on this paper:
https://www.usenix.org/conference/usenixsecurity24/presentation/wessels</p>
<p>https://github.com/securized/laravel-ssrf</p>


<a href='https://securized.dev/laravel-ssrf-package'>Read more</a>]]>
            </summary>
                                    <updated>2026-07-22T15:24:24+02:00</updated>
        </entry>
            <entry>
            <title><![CDATA[PHP Attributes: What, Why, How and When]]></title>
            <link rel="alternate" href="https://freek.dev/3166-php-attributes-what-why-how-and-when" />
            <id>https://freek.dev/3166</id>
            <author>
                <name><![CDATA[Freek Van der Herten]]></name>
                <email><![CDATA[freek@spatie.be]]></email>

            </author>
            <summary type="html">
                <![CDATA[<p>A deep dive into PHP attributes, from metadata and Reflection to practical design patterns, Laravel examples, performance, testing, and the cases where explicit code is better.</p>


<a href='https://wendelladriel.com/blog/php-attributes-what-why-how-and-when'>Read more</a>]]>
            </summary>
                                    <updated>2026-07-21T14:43:26+02:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Claude Code Routines: A Third Way Beyond /goal and /loop]]></title>
            <link rel="alternate" href="https://freek.dev/3165-claude-code-routines-a-third-way-beyond-goal-and-loop" />
            <id>https://freek.dev/3165</id>
            <author>
                <name><![CDATA[Freek Van der Herten]]></name>
                <email><![CDATA[freek@spatie.be]]></email>

            </author>
            <summary type="html">
                <![CDATA[<p>There's a third way to automate Claude Code, and unlike /goal and /loop, it doesn't need your laptop open at all. Anthropic just shipped routines: cloud-hosted automations triggered by a schedule, an API call, or a GitHub event.</p>


<a href='https://albertoarena.it/posts/claude-code-routines-vs-goal-loop/'>Read more</a>]]>
            </summary>
                                    <updated>2026-07-20T14:26:25+02:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Supercharge your PHP apps with Go-powered PHP extensions]]></title>
            <link rel="alternate" href="https://freek.dev/3164-supercharge-your-php-apps-with-go-powered-php-extensions" />
            <id>https://freek.dev/3164</id>
            <author>
                <name><![CDATA[Freek Van der Herten]]></name>
                <email><![CDATA[freek@spatie.be]]></email>

            </author>
            <summary type="html">
                <![CDATA[<p>A practical conference session on building PHP extensions with Go and FrankenPHP, then wiring them into Laravel and Symfony as native-feeling features. It uses an in-memory LRU cache as the example and offers a nice tour of framework flexibility and PHP internals.</p>


<a href='https://phpconference.nl/session/supercharge-your-php-apps-with-go-powered-php-extensions/'>Read more</a>]]>
            </summary>
                                    <updated>2026-07-17T14:30:31+02:00</updated>
        </entry>
            <entry>
            <title><![CDATA[How I tricked Claude into leaking your deepest, darkest secrets]]></title>
            <link rel="alternate" href="https://freek.dev/3163-how-i-tricked-claude-into-leaking-your-deepest-darkest-secrets" />
            <id>https://freek.dev/3163</id>
            <author>
                <name><![CDATA[Freek Van der Herten]]></name>
                <email><![CDATA[freek@spatie.be]]></email>

            </author>
            <summary type="html">
                <![CDATA[<p>A sharp writeup on how a malicious site could trick Claude into exfiltrating memory-derived personal data through its web browsing flow. It walks through the attack chain, the prompt injection setup, and Anthropic's eventual mitigation.</p>


<a href='https://www.ayush.digital/blog/the-memory-heist'>Read more</a>]]>
            </summary>
                                    <updated>2026-07-16T14:30:27+02:00</updated>
        </entry>
            <entry>
            <title><![CDATA[New in PHP 8.6: Faster array_map with first-class callables]]></title>
            <link rel="alternate" href="https://freek.dev/3162-new-in-php-86-faster-array-map-with-first-class-callables" />
            <id>https://freek.dev/3162</id>
            <author>
                <name><![CDATA[Freek Van der Herten]]></name>
                <email><![CDATA[freek@spatie.be]]></email>

            </author>
            <summary type="html">
                <![CDATA[<p>In this video, Tideways shows how PHP 8.6 speeds up array_map when you use first-class callables.</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/Bbc0fXNXB3U" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
]]>
            </summary>
                                    <updated>2026-07-15T14:30:27+02:00</updated>
        </entry>
            <entry>
            <title><![CDATA[The Laravel Scheduler Under the Hood]]></title>
            <link rel="alternate" href="https://freek.dev/3161-the-laravel-scheduler-under-the-hood" />
            <id>https://freek.dev/3161</id>
            <author>
                <name><![CDATA[Freek Van der Herten]]></name>
                <email><![CDATA[freek@spatie.be]]></email>

            </author>
            <summary type="html">
                <![CDATA[<p>A deep dive into the Laravel Scheduler, from event registration and cron evaluation to mutexes, background processes, sub-minute tasks, and production-safe scheduling.</p>


<a href='https://wendelladriel.com/blog/the-laravel-scheduler-under-the-hood'>Read more</a>]]>
            </summary>
                                    <updated>2026-07-14T14:02:25+02:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Modernizing My Dotfiles]]></title>
            <link rel="alternate" href="https://freek.dev/3160-modernizing-my-dotfiles" />
            <id>https://freek.dev/3160</id>
            <author>
                <name><![CDATA[Freek Van der Herten]]></name>
                <email><![CDATA[freek@spatie.be]]></email>

            </author>
            <summary type="html">
                <![CDATA[<p>Stefan Zweifel shares how he reorganized his dotfiles into a minimal setup, split private config into a separate repo, and streamlined setup and Brewfile syncing with a few small scripts.</p>


<a href='https://stefanzweifel.dev/posts/2026/07/07/modernizing-my-dotfiles/'>Read more</a>]]>
            </summary>
                                    <updated>2026-07-13T14:30:26+02:00</updated>
        </entry>
    </feed>
