<?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://spatie.be/feeds/blog</id>
                                <link href="https://spatie.be/feeds/blog" rel="self"></link>
                                <title><![CDATA[Spatie: Blog]]></title>
                    
                                <subtitle>News &amp; insights from the Spatie team.</subtitle>
                                                    <updated>2026-05-13T12:58:49+00:00</updated>
                        <entry>
            <title><![CDATA[Introducing Piper: array and string manipulation with the pipe operator]]></title>
            <link rel="alternate" href="https://spatie.be/blog/introducing-piper" />
            <id>https://spatie.be/introducing-piper</id>
            <author>
                <name><![CDATA[Sebastian]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>The pipe operator was a great addition in PHP 8.5. It brings the ergonomics of wrapper objects with the composability of standalone functions. Unfortunately, the standard array &amp; string manipulation functions in PHP aren't exactly known for their API consistency, which makes the pipe operator awkward to use. Piper is an attempt to wrap the standard library to make it compatible with the pipe operator.</p>
]]>
            </summary>
                                    <updated>2026-05-13T12:58:49+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Utilizing Claude Skills in client projects]]></title>
            <link rel="alternate" href="https://spatie.be/blog/utilizing-claude-skills-in-client-projects" />
            <id>https://spatie.be/utilizing-claude-skills-in-client-projects</id>
            <author>
                <name><![CDATA[Marceli]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>How I use AI skills in a real client project to speed up repetitive Laravel development. From Saloon request classes and DTOs to Livewire components and custom registrations.</p>
]]>
            </summary>
                                    <updated>2026-05-07T11:50:42+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Claude Talk Small. Code Still Big.]]></title>
            <link rel="alternate" href="https://spatie.be/blog/claude-talk-small-code-still-big" />
            <id>https://spatie.be/claude-talk-small-code-still-big</id>
            <author>
                <name><![CDATA[Marceli]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>A short experiment with the Caveman skill, which makes AI coding assistants respond in short caveman-like sentences. It did save some tokens, but less than expected.</p>
]]>
            </summary>
                                    <updated>2026-05-06T12:12:30+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Locally great, globally drifting]]></title>
            <link rel="alternate" href="https://spatie.be/blog/locally-great-globally-drifting" />
            <id>https://spatie.be/locally-great-globally-drifting</id>
            <author>
                <name><![CDATA[Sébastien]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>I spent the large part of two days reviewing a front-end that was built almost entirely by AI for a real product. Short verdict: locally great, globally drifting. Here's how I did it, how I used AI to help me out, and the ruleset I came back with.</p>
]]>
            </summary>
                                    <updated>2026-05-05T13:06:18+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Reading code with AI, not generating it]]></title>
            <link rel="alternate" href="https://spatie.be/blog/reading-code-with-ai-not-generating-it" />
            <id>https://spatie.be/reading-code-with-ai-not-generating-it</id>
            <author>
                <name><![CDATA[Nick Denys]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Most posts about AI coding are about generating code. This one's about pointing Claude at an existing codebase to read it. The tools, the prompts, and where AI got it right and wrong.</p>
]]>
            </summary>
                                    <updated>2026-05-04T10:34:45+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[The robots are replacing the packages]]></title>
            <link rel="alternate" href="https://spatie.be/blog/the-robots-are-replacing-the-packages" />
            <id>https://spatie.be/the-robots-are-replacing-the-packages</id>
            <author>
                <name><![CDATA[Sebastian]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Not every problem or package is equal. As serial package builder, how do we make the decision between relying on an external library versus making the robots dance to build us exactly what we need?</p>
]]>
            </summary>
                                    <updated>2026-05-05T11:36:45+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[The latest and greatest in postcardware at Spatie]]></title>
            <link rel="alternate" href="https://spatie.be/blog/the-latest-and-greatest-in-postcardware-at-spatie" />
            <id>https://spatie.be/the-latest-and-greatest-in-postcardware-at-spatie</id>
            <author>
                <name><![CDATA[Nick Bevers]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Our postcard page felt a bit neglected and hadn't been updated for a while, so we decided to create Kaartje (/ˈkaːr.tʲə/), a digital version of our wall, during a company-wide hackathon.</p>
]]>
            </summary>
                                    <updated>2026-05-05T11:36:55+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Our hackathon project: Live at Spatie]]></title>
            <link rel="alternate" href="https://spatie.be/blog/our-hackathon-project-live-at-spatie" />
            <id>https://spatie.be/our-hackathon-project-live-at-spatie</id>
            <author>
                <name><![CDATA[Tim]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>We built a way to all listen to a shared queue on the speakers in our office, to once and for all answer the question: 'What the hell is this and who put it on'?</p>
]]>
            </summary>
                                    <updated>2026-04-22T12:03:57+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Spatie Guidelines as AI Skills]]></title>
            <link rel="alternate" href="https://spatie.be/blog/spatie-guidelines-as-ai-skills" />
            <id>https://spatie.be/spatie-guidelines-as-ai-skills</id>
            <author>
                <name><![CDATA[Tim]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>We turned our guidelines into AI skills that work with any coding assistant.</p>
]]>
            </summary>
                                    <updated>2026-04-15T13:10:06+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Introducing ourray.app: debugging is better together]]></title>
            <link rel="alternate" href="https://spatie.be/blog/introducing-ourrayapp-debugging-is-better-together" />
            <id>https://spatie.be/introducing-ourrayapp-debugging-is-better-together</id>
            <author>
                <name><![CDATA[Ruben]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Introducing ourray.app, a shared cloud-based Ray instance where everyone's debugging output streams live on one dashboard. Install <code>spatie/our-ray</code>, prepend <code>our()</code> before your <code>ray()</code> calls, and your dumps are visible to the world.</p>
]]>
            </summary>
                                    <updated>2026-04-01T11:41:21+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Run seeders from migrations]]></title>
            <link rel="alternate" href="https://spatie.be/blog/run-seeders-from-migrations" />
            <id>https://spatie.be/run-seeders-from-migrations</id>
            <author>
                <name><![CDATA[Sebastian]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Manually running seeders on a production server is error-prone and can cause downtime if it goes wrong. Seed data from migrations to stay in the deployment pipeline without manual intervention.</p>
]]>
            </summary>
                                    <updated>2026-03-09T13:54:39+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Rethinking our frontend future at Spatie]]></title>
            <link rel="alternate" href="https://spatie.be/blog/rethinking-our-frontend-future-at-spatie" />
            <id>https://spatie.be/rethinking-our-frontend-future-at-spatie</id>
            <author>
                <name><![CDATA[Nick Bevers]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Native HTML/CSS features like dialog, the Popover API, CSS Anchor Positioning, and customizable selects are catching up to what libraries like shadcn and Radix provide. Here's what changed, what's possible now, and how it might reshape how we build frontend components at Spatie.</p>
]]>
            </summary>
                                    <updated>2026-02-20T14:30:34+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[How to structure the frontend of a Laravel Inertia React application]]></title>
            <link rel="alternate" href="https://spatie.be/blog/how-to-structure-the-frontend-of-a-laravel-inertia-react-application" />
            <id>https://spatie.be/how-to-structure-the-frontend-of-a-laravel-inertia-react-application</id>
            <author>
                <name><![CDATA[Sebastian]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>With multiple large, long-running Inertia apps in production we know what we like, don't like, and what works. It’s time to formalize our thoughts and decisions as we’re starting new projects and onboarding a few developers this year.</p>
]]>
            </summary>
                                    <updated>2025-07-29T11:51:33+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Why we use React]]></title>
            <link rel="alternate" href="https://spatie.be/blog/why-we-use-react" />
            <id>https://spatie.be/why-we-use-react</id>
            <author>
                <name><![CDATA[Sebastian]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Where possible, we try to stick with the popular choice for our tools. There's a lot of value in sticking to defaults. We only stray away from them when we have a really good reason. In the case of Laravel (and Inertia), the popular choice would be Vue, but we've landed on React. Why? Story time!</p>
]]>
            </summary>
                                    <updated>2025-07-28T07:43:19+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[How to make your AI agent program PHP and Laravel with grace and style]]></title>
            <link rel="alternate" href="https://spatie.be/blog/how-to-make-your-ai-agent-program-with-grace-and-style" />
            <id>https://spatie.be/how-to-make-your-ai-agent-program-with-grace-and-style</id>
            <author>
                <name><![CDATA[Freek]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>We've converted our PHP and Laravel coding guidelines into AI-friendly instructions so Claude Code and other AI agents can generate code that matches our established programming style.</p>
]]>
            </summary>
                                    <updated>2026-05-05T11:36:31+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[A package to handle one-time passwords (OTP) in Laravel apps]]></title>
            <link rel="alternate" href="https://spatie.be/blog/a-package-to-handle-one-time-passwords-otp-in-laravel-apps" />
            <id>https://spatie.be/a-package-to-handle-one-time-passwords-otp-in-laravel-apps</id>
            <author>
                <name><![CDATA[Freek]]></name>
            </author>
            <summary type="html">
                <![CDATA[]]>
            </summary>
                                    <updated>2025-05-22T13:13:32+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Do not call toArray() to get all items from a Laravel Collection]]></title>
            <link rel="alternate" href="https://spatie.be/blog/do-not-call-toarray-to-get-all-items-from-a-laravel-collection" />
            <id>https://spatie.be/do-not-call-toarray-to-get-all-items-from-a-laravel-collection</id>
            <author>
                <name><![CDATA[Freek]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Laravel's <code>toArray</code> collection method might not return what you might expect.</p>
]]>
            </summary>
                                    <updated>2025-05-19T13:25:07+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[5 levels of handling images in Laravel]]></title>
            <link rel="alternate" href="https://spatie.be/blog/five-levels-of-handling-images-in-laravel" />
            <id>https://spatie.be/five-levels-of-handling-images-in-laravel</id>
            <author>
                <name><![CDATA[Tim]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Need to handle image uploads in your Laravel app? In this post, we start with the basics and level up step-by-step—from a simple form upload to full-blown image handling with resizing, optimization, and a slick drag &amp; drop UI. Whether you're building something quick or scaling up, there’s a Spatie package (or two) that can help you out.</p>
]]>
            </summary>
                                    <updated>2025-05-20T09:58:29+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[A package to handle passkeys in Laravel]]></title>
            <link rel="alternate" href="https://spatie.be/blog/a-package-to-handle-passkeys-in-laravel" />
            <id>https://spatie.be/a-package-to-handle-passkeys-in-laravel</id>
            <author>
                <name><![CDATA[Freek]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Passkeys are very convenient for users to log in: they don’t have to type in an email/password, you aren’t redirected to a third party for authentication, and it’s fast.</p>
<p>We've made a new package that makes it easy to let your users authenticate to your app with passkeys.</p>
]]>
            </summary>
                                    <updated>2025-06-13T13:55:12+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Introducing PHP Operators]]></title>
            <link rel="alternate" href="https://spatie.be/blog/introducing-php-operators" />
            <id>https://spatie.be/introducing-php-operators</id>
            <author>
                <name><![CDATA[Sebastian]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Today we're launching php-operators.com, a little web page to browse, search, and learn more about all operators in PHP. Sure, you could just ask AI to explain them the you, but where's the fun in that?</p>
]]>
            </summary>
                                    <updated>2026-05-05T11:37:03+00:00</updated>
        </entry>
    </feed>
