<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
                        <id>https://richdynamix.com/feed</id>
                                <link href="https://richdynamix.com/feed" rel="self"></link>
            <link rel="hub" href="https://pubsubhubbub.appspot.com/" />
                                <title><![CDATA[RichDynamix Articles Feed]]></title>
                    
                                <subtitle>This is the RichDynamix articles feed, providing the latest updates and articles from the blog.</subtitle>
                                                    <updated>2026-04-10T00:00:00+00:00</updated>
                        <entry>
            <title><![CDATA[Upgrading From Laravel 12 to Laravel 13: The Practical Guide]]></title>
            <link rel="alternate" href="https://richdynamix.com/articles/laravel-12-to-13-upgrade-guide" />
            <id>https://richdynamix.com/1</id>
            <author>
                <name><![CDATA[Steven Richardson]]></name>
                        <email><![CDATA[steven@richdynamix.com]]></email>
                    </author>
            <summary type="html">
                <![CDATA[The Laravel 13 upgrade is mostly painless — but three config areas will silently change how your app behaves if you skip them. Here's what actually changed and what's worth adopting.]]>
            </summary>
                                    
            <published>2026-04-10T00:00:00+00:00</published>
            <updated>2026-04-10T00:00:00+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[The Complete Guide to the Laravel AI SDK in Laravel 13]]></title>
            <link rel="alternate" href="https://richdynamix.com/articles/laravel-ai-sdk-complete-guide" />
            <id>https://richdynamix.com/2</id>
            <author>
                <name><![CDATA[Steven Richardson]]></name>
                        <email><![CDATA[steven@richdynamix.com]]></email>
                    </author>
            <summary type="html">
                <![CDATA[Laravel 13 ships a first-party AI SDK that replaces the patchwork of vendor SDKs and community packages. Here's how to use every capability — agents, streaming, structured output, tools, embeddings and RAG — in one working project.]]>
            </summary>
                                    
            <published>2026-04-10T00:00:00+00:00</published>
            <updated>2026-04-10T00:00:00+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Stop Using parse_url(): PHP 8.5&#039;s URI Extension Explained]]></title>
            <link rel="alternate" href="https://richdynamix.com/articles/php-85-uri-extension" />
            <id>https://richdynamix.com/3</id>
            <author>
                <name><![CDATA[Steven Richardson]]></name>
                        <email><![CDATA[steven@richdynamix.com]]></email>
                    </author>
            <summary type="html">
                <![CDATA[PHP 8.5 ships a built-in URI extension that replaces parse_url() with immutable, type-safe objects. No third-party package needed.]]>
            </summary>
                                    
            <published>2026-04-09T00:00:00+00:00</published>
            <updated>2026-04-09T00:00:00+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Getting Started With Laravel Prism: Add AI to Any Laravel App in Minutes]]></title>
            <link rel="alternate" href="https://richdynamix.com/articles/laravel-prism-getting-started" />
            <id>https://richdynamix.com/4</id>
            <author>
                <name><![CDATA[Steven Richardson]]></name>
                        <email><![CDATA[steven@richdynamix.com]]></email>
                    </author>
            <summary type="html">
                <![CDATA[Prism gives you a provider-agnostic fluent interface for OpenAI, Anthropic, Ollama, and more inside any Laravel app. Here's how to go from zero to your first AI response.]]>
            </summary>
                                    
            <published>2026-04-07T00:00:00+00:00</published>
            <updated>2026-04-07T00:00:00+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Real-Time Notifications with Laravel Reverb and Echo]]></title>
            <link rel="alternate" href="https://richdynamix.com/articles/laravel-reverb-real-time-notifications" />
            <id>https://richdynamix.com/5</id>
            <author>
                <name><![CDATA[Steven Richardson]]></name>
                        <email><![CDATA[steven@richdynamix.com]]></email>
                    </author>
            <summary type="html">
                <![CDATA[Reverb is Laravel's free, first-party WebSocket server. Here's how to go from zero to live browser notifications — private channels, Echo, and an Alpine.js toast — without touching Pusher.]]>
            </summary>
                                    
            <published>2026-04-05T00:00:00+00:00</published>
            <updated>2026-04-05T00:00:00+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Laravel Vapor vs Laravel Forge in 2026: Which Deployment Platform Should You Choose?]]></title>
            <link rel="alternate" href="https://richdynamix.com/articles/laravel-vapor-vs-forge-2026" />
            <id>https://richdynamix.com/6</id>
            <author>
                <name><![CDATA[Steven Richardson]]></name>
                        <email><![CDATA[steven@richdynamix.com]]></email>
                    </author>
            <summary type="html">
                <![CDATA[Both are first-party Laravel deployment tools. They solve completely different problems. Here's the decision framework I use.]]>
            </summary>
                                    
            <published>2026-04-02T00:00:00+00:00</published>
            <updated>2026-04-02T00:00:00+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Stop Laravel Queue Workers from Leaking Memory with --max-jobs and --max-time]]></title>
            <link rel="alternate" href="https://richdynamix.com/articles/laravel-queue-worker-max-jobs-max-time" />
            <id>https://richdynamix.com/7</id>
            <author>
                <name><![CDATA[Steven Richardson]]></name>
                        <email><![CDATA[steven@richdynamix.com]]></email>
                    </author>
            <summary type="html">
                <![CDATA[Laravel queue workers are long-running daemons — and daemons drift. Here's how to configure them to self-restart before they start misbehaving.]]>
            </summary>
                                    
            <published>2026-04-01T00:00:00+00:00</published>
            <updated>2026-04-01T00:00:00+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[PHP 8.5 clone with: Updating Readonly Objects Without Boilerplate]]></title>
            <link rel="alternate" href="https://richdynamix.com/articles/php-85-clone-with-immutable-objects" />
            <id>https://richdynamix.com/8</id>
            <author>
                <name><![CDATA[Steven Richardson]]></name>
                        <email><![CDATA[steven@richdynamix.com]]></email>
                    </author>
            <summary type="html">
                <![CDATA[PHP 8.5 lets you pass an array to clone() to update properties in one expression. Here's how it replaces wither method boilerplate — and the gotchas you need to know first.]]>
            </summary>
                                    
            <published>2026-03-31T00:00:00+00:00</published>
            <updated>2026-03-31T00:00:00+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Building an Automated Bug-Fixing Pipeline with Claude Cowork]]></title>
            <link rel="alternate" href="https://richdynamix.com/articles/automated-bug-fixing-pipeline-claude-cowork" />
            <id>https://richdynamix.com/9</id>
            <author>
                <name><![CDATA[Steven Richardson]]></name>
                        <email><![CDATA[steven@richdynamix.com]]></email>
                    </author>
            <summary type="html">
                <![CDATA[A Claude Cowork scheduled task that reads Sentry errors, triages them via Linear, implements fixes in your Laravel codebase, and opens a GitHub PR — without you lifting a finger until review.]]>
            </summary>
                                    
            <published>2026-03-30T00:00:00+00:00</published>
            <updated>2026-03-30T00:00:00+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[PHP 8.5 Pipe Operator: Clean Function Chaining in One Line]]></title>
            <link rel="alternate" href="https://richdynamix.com/articles/php-85-pipe-operator" />
            <id>https://richdynamix.com/10</id>
            <author>
                <name><![CDATA[Steven Richardson]]></name>
                        <email><![CDATA[steven@richdynamix.com]]></email>
                    </author>
            <summary type="html">
                <![CDATA[PHP 8.5's |> operator lets you chain functions left-to-right instead of nesting them inside-out. Here's how it works and where it breaks down.]]>
            </summary>
                                    
            <published>2026-03-30T00:00:00+00:00</published>
            <updated>2026-03-30T00:00:00+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Stripe Checkout sessions in Laravel — without Cashier]]></title>
            <link rel="alternate" href="https://richdynamix.com/articles/stripe-checkout-laravel-without-cashier" />
            <id>https://richdynamix.com/11</id>
            <author>
                <name><![CDATA[Steven Richardson]]></name>
                        <email><![CDATA[steven@richdynamix.com]]></email>
                    </author>
            <summary type="html">
                <![CDATA[Laravel Cashier is excellent for subscriptions, but one-time payments don't need that overhead. Here's how to wire up Stripe Checkout directly with the PHP SDK.]]>
            </summary>
                                    
            <published>2026-03-30T00:00:00+00:00</published>
            <updated>2026-03-30T00:00:00+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Optimising Laravel Docker images with multi-stage builds]]></title>
            <link rel="alternate" href="https://richdynamix.com/articles/laravel-docker-multi-stage-build" />
            <id>https://richdynamix.com/12</id>
            <author>
                <name><![CDATA[Steven Richardson]]></name>
                        <email><![CDATA[steven@richdynamix.com]]></email>
                    </author>
            <summary type="html">
                <![CDATA[A single-stage Dockerfile for Laravel ends up with 800 MB+ images full of build tools you don't need in production. Multi-stage builds fix that — here's how.]]>
            </summary>
                                    
            <published>2026-03-29T00:00:00+00:00</published>
            <updated>2026-03-29T00:00:00+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Fine-grained rate limiting on Laravel API routes]]></title>
            <link rel="alternate" href="https://richdynamix.com/articles/laravel-rate-limiting-api-routes" />
            <id>https://richdynamix.com/13</id>
            <author>
                <name><![CDATA[Steven Richardson]]></name>
                        <email><![CDATA[steven@richdynamix.com]]></email>
                    </author>
            <summary type="html">
                <![CDATA[Slapping throttle:60,1 on every route treats your free-tier users and enterprise customers identically. Here's how to do it properly with named rate limiters.]]>
            </summary>
                                    
            <published>2026-03-29T00:00:00+00:00</published>
            <updated>2026-03-29T00:00:00+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Replacing String Constants with PHP Backed Enums in Laravel Models]]></title>
            <link rel="alternate" href="https://richdynamix.com/articles/php-backed-enums-laravel-models" />
            <id>https://richdynamix.com/14</id>
            <author>
                <name><![CDATA[Steven Richardson]]></name>
                        <email><![CDATA[steven@richdynamix.com]]></email>
                    </author>
            <summary type="html">
                <![CDATA[String constants like STATUS_PENDING are typo-prone, unautocompleted, and impossible to enumerate exhaustively. PHP backed enums fix all of that — and Laravel has native support throughout.]]>
            </summary>
                                    
            <published>2026-03-29T00:00:00+00:00</published>
            <updated>2026-03-29T00:00:00+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[PHP Readonly Classes as Value Objects in Laravel]]></title>
            <link rel="alternate" href="https://richdynamix.com/articles/php-readonly-classes-value-objects-laravel" />
            <id>https://richdynamix.com/15</id>
            <author>
                <name><![CDATA[Steven Richardson]]></name>
                        <email><![CDATA[steven@richdynamix.com]]></email>
                    </author>
            <summary type="html">
                <![CDATA[Primitive obsession is one of those code smells that's easy to ignore — until you're debugging which integer is pounds and which is pence. PHP readonly classes fix that cleanly.]]>
            </summary>
                                    
            <published>2026-03-29T00:00:00+00:00</published>
            <updated>2026-03-29T00:00:00+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Processing large CSV files with Laravel&#039;s lazy collections]]></title>
            <link rel="alternate" href="https://richdynamix.com/articles/laravel-lazy-collections-csv-processing" />
            <id>https://richdynamix.com/16</id>
            <author>
                <name><![CDATA[Steven Richardson]]></name>
                        <email><![CDATA[steven@richdynamix.com]]></email>
                    </author>
            <summary type="html">
                <![CDATA[Loading a 100k-row CSV with `collect()` will blow your memory limit. Laravel's `LazyCollection` gives you the full Collection API backed by PHP generators — here's how to use it.]]>
            </summary>
                                    
            <published>2026-03-28T00:00:00+00:00</published>
            <updated>2026-03-28T00:00:00+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Adding a Stripe Customer Portal to your Laravel app with Cashier]]></title>
            <link rel="alternate" href="https://richdynamix.com/articles/stripe-customer-portal-laravel-cashier" />
            <id>https://richdynamix.com/17</id>
            <author>
                <name><![CDATA[Steven Richardson]]></name>
                        <email><![CDATA[steven@richdynamix.com]]></email>
                    </author>
            <summary type="html">
                <![CDATA[Cashier's `redirectToBillingPortal()` gives your users a full subscription management UI — plan changes, cancellations, invoice downloads — in a single redirect. Here's how to wire it up.]]>
            </summary>
                                    
            <published>2026-03-28T00:00:00+00:00</published>
            <updated>2026-03-28T00:00:00+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Building custom Laravel Pulse recorders to track your own metrics]]></title>
            <link rel="alternate" href="https://richdynamix.com/articles/laravel-pulse-custom-recorders" />
            <id>https://richdynamix.com/18</id>
            <author>
                <name><![CDATA[Steven Richardson]]></name>
                        <email><![CDATA[steven@richdynamix.com]]></email>
                    </author>
            <summary type="html">
                <![CDATA[Pulse ships with solid built-in recorders. Here's how to extend it with your own — tracking the domain events that actually matter in your app.]]>
            </summary>
                                    
            <published>2026-03-27T00:00:00+00:00</published>
            <updated>2026-03-27T00:00:00+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Scaling Laravel queues in production: Horizon, Redis, and multi-server workers]]></title>
            <link rel="alternate" href="https://richdynamix.com/articles/scaling-laravel-queues-production-guide" />
            <id>https://richdynamix.com/19</id>
            <author>
                <name><![CDATA[Steven Richardson]]></name>
                        <email><![CDATA[steven@richdynamix.com]]></email>
                    </author>
            <summary type="html">
                <![CDATA[Queue tutorials stop at dispatch and queue:work. Here is everything else — the architecture, Horizon configuration, failure handling, and multi-server scaling that keeps production queues healthy under real traffic.]]>
            </summary>
                                    
            <published>2026-03-27T00:00:00+00:00</published>
            <updated>2026-03-27T00:00:00+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Monitoring Laravel queues in production with Horizon]]></title>
            <link rel="alternate" href="https://richdynamix.com/articles/laravel-horizon-queue-monitoring-production" />
            <id>https://richdynamix.com/20</id>
            <author>
                <name><![CDATA[Steven Richardson]]></name>
                        <email><![CDATA[steven@richdynamix.com]]></email>
                    </author>
            <summary type="html">
                <![CDATA[Most teams install Horizon and leave it at its defaults. Here's the production configuration that actually gives you visibility into your queues.]]>
            </summary>
                                    
            <published>2026-03-26T00:00:00+00:00</published>
            <updated>2026-03-26T00:00:00+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Upgrading from Livewire 3 to Livewire 4: A Practical Migration Guide]]></title>
            <link rel="alternate" href="https://richdynamix.com/articles/livewire-3-to-4-migration-guide" />
            <id>https://richdynamix.com/21</id>
            <author>
                <name><![CDATA[Steven Richardson]]></name>
                        <email><![CDATA[steven@richdynamix.com]]></email>
                    </author>
            <summary type="html">
                <![CDATA[Livewire 4 shipped in early 2026 with SFCs, smarter wire:model, and a leaner Volt story. Here's how to upgrade a real app without surprises.]]>
            </summary>
                                    
            <published>2026-03-25T00:00:00+00:00</published>
            <updated>2026-03-25T00:00:00+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Usage-based billing with Stripe Meters and Laravel Cashier]]></title>
            <link rel="alternate" href="https://richdynamix.com/articles/usage-based-billing-stripe-meters-laravel-cashier" />
            <id>https://richdynamix.com/22</id>
            <author>
                <name><![CDATA[Steven Richardson]]></name>
                        <email><![CDATA[steven@richdynamix.com]]></email>
                    </author>
            <summary type="html">
                <![CDATA[Stripe Meters replace the old metered subscription records. Here's how to wire them up with Laravel Cashier to charge customers per API call, token, or any countable unit.]]>
            </summary>
                                    
            <published>2026-03-24T00:00:00+00:00</published>
            <updated>2026-03-24T00:00:00+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[PHP 8.4 Fibers: Async Patterns Without a Framework]]></title>
            <link rel="alternate" href="https://richdynamix.com/articles/php-84-fibers-async-patterns" />
            <id>https://richdynamix.com/23</id>
            <author>
                <name><![CDATA[Steven Richardson]]></name>
                        <email><![CDATA[steven@richdynamix.com]]></email>
                    </author>
            <summary type="html">
                <![CDATA[PHP has had Fibers since 8.1, and PHP 8.4 quietly improved them. You don't need ReactPHP or Amp to get useful concurrency patterns — here's what Fibers actually give you and when to reach for them.]]>
            </summary>
                                    
            <published>2026-03-23T00:00:00+00:00</published>
            <updated>2026-03-23T00:00:00+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Enforcing Laravel architecture rules with Pest&#039;s arch() helper]]></title>
            <link rel="alternate" href="https://richdynamix.com/articles/pest-architecture-testing-laravel" />
            <id>https://richdynamix.com/24</id>
            <author>
                <name><![CDATA[Steven Richardson]]></name>
                        <email><![CDATA[steven@richdynamix.com]]></email>
                    </author>
            <summary type="html">
                <![CDATA[Pest's arch() helper lets you write rules that enforce your app's structure at test time — no more accidentally importing Eloquent into a controller.]]>
            </summary>
                                    
            <published>2026-03-22T00:00:00+00:00</published>
            <updated>2026-03-22T00:00:00+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Verifying Stripe webhook signatures in Laravel without Cashier]]></title>
            <link rel="alternate" href="https://richdynamix.com/articles/stripe-webhook-signature-verification-laravel" />
            <id>https://richdynamix.com/25</id>
            <author>
                <name><![CDATA[Steven Richardson]]></name>
                        <email><![CDATA[steven@richdynamix.com]]></email>
                    </author>
            <summary type="html">
                <![CDATA[You don't need Laravel Cashier to verify Stripe webhook signatures. Here's the minimal setup using the Stripe PHP SDK directly in a controller.]]>
            </summary>
                                    
            <published>2026-03-21T00:00:00+00:00</published>
            <updated>2026-03-21T00:00:00+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Zero-Downtime Laravel Deployments with GitHub Actions and Forge]]></title>
            <link rel="alternate" href="https://richdynamix.com/articles/zero-downtime-laravel-deployment-github-actions-forge" />
            <id>https://richdynamix.com/26</id>
            <author>
                <name><![CDATA[Steven Richardson]]></name>
                        <email><![CDATA[steven@richdynamix.com]]></email>
                    </author>
            <summary type="html">
                <![CDATA[Stop manually triggering Forge deploys. Here's how to wire GitHub Actions to Forge's deploy webhook so every push to main ships automatically — without downtime.]]>
            </summary>
                                    
            <published>2026-03-21T00:00:00+00:00</published>
            <updated>2026-03-21T00:00:00+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Fire HTTP requests after your response with Laravel 12&#039;s batch defer]]></title>
            <link rel="alternate" href="https://richdynamix.com/articles/laravel-12-defer-http-batch" />
            <id>https://richdynamix.com/27</id>
            <author>
                <name><![CDATA[Steven Richardson]]></name>
                        <email><![CDATA[steven@richdynamix.com]]></email>
                    </author>
            <summary type="html">
                <![CDATA[Laravel 12.32 adds defer() to Http::batch() — a clean way to fire outbound HTTP calls after your response is sent, no queue worker required.]]>
            </summary>
                                    
            <published>2026-03-20T00:00:00+00:00</published>
            <updated>2026-03-20T00:00:00+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[The Complete Laravel Developer Toolchain for 2026]]></title>
            <link rel="alternate" href="https://richdynamix.com/articles/laravel-developer-toolchain-2026" />
            <id>https://richdynamix.com/28</id>
            <author>
                <name><![CDATA[Steven Richardson]]></name>
                        <email><![CDATA[steven@richdynamix.com]]></email>
                    </author>
            <summary type="html">
                <![CDATA[Stop spending days configuring tools. Here is every tool in my Laravel stack for 2026, why I chose each one, and exactly how to set it up.]]>
            </summary>
                                    
            <published>2026-03-19T00:00:00+00:00</published>
            <updated>2026-03-19T00:00:00+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Running Laravel Pint Automatically with Git Pre-Commit Hooks]]></title>
            <link rel="alternate" href="https://richdynamix.com/articles/laravel-pint-pre-commit-hooks" />
            <id>https://richdynamix.com/29</id>
            <author>
                <name><![CDATA[Steven Richardson]]></name>
                        <email><![CDATA[steven@richdynamix.com]]></email>
                    </author>
            <summary type="html">
                <![CDATA[CI failing because someone forgot to run Pint again. Here's how to wire up a Git pre-commit hook so it never slips through.]]>
            </summary>
                                    
            <published>2026-03-19T00:00:00+00:00</published>
            <updated>2026-03-19T00:00:00+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[PHP 8.4 Property Hooks in Laravel Models]]></title>
            <link rel="alternate" href="https://richdynamix.com/articles/php-84-property-hooks-laravel-models" />
            <id>https://richdynamix.com/30</id>
            <author>
                <name><![CDATA[Steven Richardson]]></name>
                        <email><![CDATA[steven@richdynamix.com]]></email>
                    </author>
            <summary type="html">
                <![CDATA[PHP 8.4 property hooks are a tidy language-level alternative to getters and setters — but before you reach for them in your Eloquent models, there's a catch worth understanding.]]>
            </summary>
                                    
            <published>2026-03-19T00:00:00+00:00</published>
            <updated>2026-03-19T00:00:00+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Implementing Stripe trials for memberships: patterns and best practices]]></title>
            <link rel="alternate" href="https://richdynamix.com/articles/implementing-stripe-trials-memberships" />
            <id>https://richdynamix.com/31</id>
            <author>
                <name><![CDATA[Steven Richardson]]></name>
                        <email><![CDATA[steven@richdynamix.com]]></email>
                    </author>
            <summary type="html">
                <![CDATA[How to add trials to membership subscriptions using Stripe and Laravel Cashier, with patterns for free-until, trial_months, and safe webhook handling.]]>
            </summary>
                                    
            <published>2026-03-16T00:00:00+00:00</published>
            <updated>2026-03-16T00:00:00+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[How to audit PHP dependencies (practical guide)]]></title>
            <link rel="alternate" href="https://richdynamix.com/articles/audit-php-dependencies" />
            <id>https://richdynamix.com/32</id>
            <author>
                <name><![CDATA[Steven Richardson]]></name>
                        <email><![CDATA[steven@richdynamix.com]]></email>
                    </author>
            <summary type="html">
                <![CDATA[How to audit PHP Composer dependencies for security, license and maintenance issues, with tools and a small script you can run today.]]>
            </summary>
                                    
            <published>2026-03-13T00:00:00+00:00</published>
            <updated>2026-03-13T00:00:00+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Install Sentry Self-Hosted on EC2 with Docker, Forge &amp; SSL]]></title>
            <link rel="alternate" href="https://richdynamix.com/articles/install-sentry-self-hosted-on-ec2-with-docker-forge-ssl" />
            <id>https://richdynamix.com/33</id>
            <author>
                <name><![CDATA[Steven Richardson]]></name>
                        <email><![CDATA[steven@richdynamix.com]]></email>
                    </author>
            <summary type="html">
                <![CDATA[Step-by-step guide to deploy Sentry Self-Hosted on an AWS EC2 Ubuntu 24.04 server provisioned via Forge. Configure Docker, swap, SSL with Nginx, MaxMind GeoIP, Slack & GitHub integrations, Mailgun SMTP, Laravel backend + browser tracing, and connect GitHub Copilot via Sentry’s MCP server. Includes troubleshooting.]]>
            </summary>
                                    
            <published>2025-09-09T00:00:00+00:00</published>
            <updated>2025-09-09T00:00:00+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Stop Wasting Monitoring Quota: Block Malicious 404s with NGINX]]></title>
            <link rel="alternate" href="https://richdynamix.com/articles/block-malicious-404s-with-nginx-laravel-nightwatch" />
            <id>https://richdynamix.com/34</id>
            <author>
                <name><![CDATA[Steven Richardson]]></name>
                        <email><![CDATA[steven@richdynamix.com]]></email>
                    </author>
            <summary type="html">
                <![CDATA[Malicious bots were burning through my Laravel Nightwatch quota by hitting fake routes like /wp-login.php and /.env. Inspired by Michael Dyrynda’s approach using Cloudflare WAF, I built a portable NGINX blocklist that stops these 404s before they reach Laravel — no proxy required.]]>
            </summary>
                                    
            <published>2025-06-24T00:00:00+00:00</published>
            <updated>2025-06-24T00:00:00+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Streamlining Laravel Developer Onboarding with a Makefile and Herd Pro]]></title>
            <link rel="alternate" href="https://richdynamix.com/articles/streamlining-laravel-onboarding-with-makefile" />
            <id>https://richdynamix.com/35</id>
            <author>
                <name><![CDATA[Steven Richardson]]></name>
                        <email><![CDATA[steven@richdynamix.com]]></email>
                    </author>
            <summary type="html">
                <![CDATA[Speed up Laravel onboarding with a powerful Makefile. Automate Herd Pro setup, install dependencies, and seed databases for a consistent, one-command setup experience.]]>
            </summary>
                                    
            <published>2025-06-21T00:00:00+00:00</published>
            <updated>2025-06-21T00:00:00+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[A Developer’s Personal Site in 2025: What I Actually Use]]></title>
            <link rel="alternate" href="https://richdynamix.com/articles/blazing-fast-laravel-blog-with-markdown-and-sushi" />
            <id>https://richdynamix.com/36</id>
            <author>
                <name><![CDATA[Steven Richardson]]></name>
                        <email><![CDATA[steven@richdynamix.com]]></email>
                    </author>
            <summary type="html">
                <![CDATA[Rebuilding my personal site from scratch using Laravel 12, Sushi, Folio, and Spatie packages — no CMS, no clutter, just a clean, fast dev blog.]]>
            </summary>
                                    
            <published>2025-06-20T00:00:00+00:00</published>
            <updated>2025-06-20T00:00:00+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Blazing-Fast Blogs with Laravel, Markdown, and Sushi]]></title>
            <link rel="alternate" href="https://richdynamix.com/articles/developer-site-laravel-12-folio-sushi" />
            <id>https://richdynamix.com/37</id>
            <author>
                <name><![CDATA[Steven Richardson]]></name>
                        <email><![CDATA[steven@richdynamix.com]]></email>
                    </author>
            <summary type="html">
                <![CDATA[Why I chose Markdown and Sushi to power my Laravel blog — a simple, fast, and elegant alternative to heavier CMS setups.]]>
            </summary>
                                    
            <published>2025-06-19T00:00:00+00:00</published>
            <updated>2025-06-19T00:00:00+00:00</updated>
        </entry>
    </feed>
