<?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-04-16T13:14:39+00:00</updated>
                        <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[]]>
            </summary>
                                    <updated>2026-04-16T13:14:39+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>2025-12-15T10:29:00+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>2025-05-06T11:53:34+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Livewire and Inertia: how we love and use both]]></title>
            <link rel="alternate" href="https://spatie.be/blog/livewire-and-inertia-how-we-love-and-use-both" />
            <id>https://spatie.be/livewire-and-inertia-how-we-love-and-use-both</id>
            <author>
                <name><![CDATA[Sebastian]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>We've been building Laravel applications with Livewire and Inertia for over 5 years. If you held an individual Spatie employee at gunpoint (please don't) and forced them to pick a favorite, you'll get a 50/50 split. It's like choosing between chocolate or vanilla ice cream: there's no objective winner (except vanilla). But when we  look at the choice at hand as a team, it becomes easier to determine the right fit.</p>
]]>
            </summary>
                                    <updated>2025-05-05T13:39:06+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Media Library Pro: Easier validation in Livewire]]></title>
            <link rel="alternate" href="https://spatie.be/blog/media-library-pro-easier-validation-in-livewire" />
            <id>https://spatie.be/media-library-pro-easier-validation-in-livewire</id>
            <author>
                <name><![CDATA[Tim]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>This latest update provides more flexibility for validating media uploads directly in Livewire or controllers, streamlining the process.</p>
]]>
            </summary>
                                    <updated>2025-03-13T18:39:48+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Laravel CSP v3 and a call for contributors]]></title>
            <link rel="alternate" href="https://spatie.be/blog/releasing-laravel-csp-3-and-a-call-for-contributors" />
            <id>https://spatie.be/releasing-laravel-csp-3-and-a-call-for-contributors</id>
            <author>
                <name><![CDATA[Sebastian]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>We just tagged &amp; released a new major version of <code>spatie/laravel-csp</code>, a package to manage your Laravel app's content security policy. The development goal for version 3 was to reduce the boilerplate of configuring a policy for common services like Google Tag Manager, Fathom Analytics, Adobe Fonts… In addition, we've made it easier to add your own directives through your configuration file, without writing additional code.</p>
]]>
            </summary>
                                    <updated>2025-03-13T18:57:42+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[What to expect from open source]]></title>
            <link rel="alternate" href="https://spatie.be/blog/what-to-expect-from-open-source" />
            <id>https://spatie.be/what-to-expect-from-open-source</id>
            <author>
                <name><![CDATA[Niels]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>In 2023, DHH's decision to remove TypeScript from Hotwire and Turbo caused some drama in the JavaScript community. At Spatie we’re open source maintainers too, so this sparked an interesting debate: What can users expect from our open source packages?</p>
]]>
            </summary>
                                    <updated>2025-02-11T15:12:21+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Reintroducing Laravel Backup Server as an open source package]]></title>
            <link rel="alternate" href="https://spatie.be/blog/reintroducing-laravel-backup-server" />
            <id>https://spatie.be/reintroducing-laravel-backup-server</id>
            <author>
                <name><![CDATA[Freek]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>Today, we're reintroducing Laravel Backup Server with a fresh version 4 release. It comes with refactored internals and more control over notifications, but most importantly: we're removing it from our shop and open sourcing it instead.</p>
]]>
            </summary>
                                    <updated>2025-01-29T08:38:19+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Speeding up database searches using an invisible column]]></title>
            <link rel="alternate" href="https://spatie.be/blog/speeding-up-database-searches-using-an-invisible-column" />
            <id>https://spatie.be/speeding-up-database-searches-using-an-invisible-column</id>
            <author>
                <name><![CDATA[Rias]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>With Mailcoach, we handle email lists with up to millions of subscribers. Keeping queries, and especially search queries fast is paramount for a good user experience.</p>
]]>
            </summary>
                                    <updated>2025-01-24T14:15:20+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Expose legacy JavaScript code with import aliases]]></title>
            <link rel="alternate" href="https://spatie.be/blog/expose-legacy-javascript-code-with-import-aliases" />
            <id>https://spatie.be/expose-legacy-javascript-code-with-import-aliases</id>
            <author>
                <name><![CDATA[Sebastian]]></name>
            </author>
            <summary type="html">
                <![CDATA[<p>A large, legacy codebase can't be overhauled in one take. An undertaking of that magnitude is risky and can hinder progress on features users are waiting for now. On the other hand, we want to avoid a never-ending race by coupling new features to legacy components. Configuring import aliases can make the distinction of &quot;legacy, to be removed&quot; or not explicit.</p>
]]>
            </summary>
                                    <updated>2025-01-24T14:15:37+00:00</updated>
        </entry>
    </feed>
