<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <atom:link href="https://hafiz.dev/feed.xml" rel="self" type="application/rss+xml" />
        <title><![CDATA[hafiz.dev — Laravel, AI, and Indie Dev]]></title>
        <link><![CDATA[https://hafiz.dev/feed.xml]]></link>
        <image>
            <url>https://hafiz.dev/profile-photo.png</url>
            <title><![CDATA[hafiz.dev — Laravel, AI, and Indie Dev]]></title>
            <link><![CDATA[https://hafiz.dev/feed.xml]]></link>
        </image>
        <description><![CDATA[Tutorials and essays on Laravel, Vue, AI-assisted development, and building SaaS as an indie developer. By Hafiz Riaz.]]></description>
        <language>en</language>
        <pubDate>Thu, 15 Oct 2026 06:15:00 +0200</pubDate>

                    <item>
                <title><![CDATA[Stop Sharing .env Files in Slack: Laravel's Built-In env:encrypt Workflow]]></title>
                <link>https://hafiz.dev/blog/laravel-env-encrypt-share-secrets-team</link>
                <description><![CDATA[Laravel can encrypt .env files so they live in git, readable only with the key. The workflow, the new diff-friendly mode, and the gotchas.]]></description>
                <author><![CDATA[Hafiz Riaz <contact@hafiz.dev>]]></author>
                <pubDate>Thu, 15 Oct 2026 06:15:00 +0200</pubDate>
                                    <category>Laravel</category>
                            </item>
                    <item>
                <title><![CDATA[Filament 5.10 Security Fixes: The Livewire Scope Gap Your Upgrade Doesn't Close]]></title>
                <link>https://hafiz.dev/blog/filament-5-10-security-fixes-livewire-scope-gap</link>
                <description><![CDATA[Filament fixed four security advisories in 5.10. Upgrading closes most of them, but one root cause sits in Livewire and needs your own checks.]]></description>
                <author><![CDATA[Hafiz Riaz <contact@hafiz.dev>]]></author>
                <pubDate>Mon, 12 Oct 2026 06:15:00 +0200</pubDate>
                                    <category>Filament</category>
                            </item>
                    <item>
                <title><![CDATA[Laravel AI SDK Skills: Load Agent Instructions Only When They're Needed]]></title>
                <link>https://hafiz.dev/blog/laravel-ai-sdk-agent-skills</link>
                <description><![CDATA[Agent skills landed in Laravel AI SDK v1.1.0. Here is how LoadSkill works, and how to give each team its own skills from the database.]]></description>
                <author><![CDATA[Hafiz Riaz <contact@hafiz.dev>]]></author>
                <pubDate>Thu, 08 Oct 2026 06:15:00 +0200</pubDate>
                                    <category>Laravel</category>
                            </item>
                    <item>
                <title><![CDATA[How I Set Up Encrypted Off-Site Backups for My MacBook With restic and Backblaze B2]]></title>
                <link>https://hafiz.dev/blog/macbook-offsite-backups-restic-backblaze-b2</link>
                <description><![CDATA[My Mac had zero backups. Now it has encrypted daily snapshots on Backblaze B2 for pennies a month. The setup, the costs, and what tripped me up.]]></description>
                <author><![CDATA[Hafiz Riaz <contact@hafiz.dev>]]></author>
                <pubDate>Mon, 05 Oct 2026 06:15:00 +0200</pubDate>
                                    <category>DevOps</category>
                            </item>
                    <item>
                <title><![CDATA[Squashing Laravel Migrations: 5 Ways schema:dump --prune Bites a Real Team]]></title>
                <link>https://hafiz.dev/blog/laravel-squash-migrations-schema-dump-prune</link>
                <description><![CDATA[schema:dump --prune turns hundreds of migrations into one file. I reproduced the five ways it quietly breaks a team, and the fix for each.]]></description>
                <author><![CDATA[Hafiz Riaz <contact@hafiz.dev>]]></author>
                <pubDate>Wed, 30 Sep 2026 06:15:00 +0200</pubDate>
                                    <category>Laravel</category>
                            </item>
                    <item>
                <title><![CDATA[Laravel Mercure Broadcasting: Real-Time Without a WebSocket Server (and 3 Setup Traps)]]></title>
                <link>https://hafiz.dev/blog/laravel-mercure-broadcasting-frankenphp</link>
                <description><![CDATA[Laravel 13.32 ships a Mercure broadcast driver. I built presence and encrypted channels on FrankenPHP and hit three traps the docs skip.]]></description>
                <author><![CDATA[Hafiz Riaz <contact@hafiz.dev>]]></author>
                <pubDate>Mon, 28 Sep 2026 06:15:00 +0200</pubDate>
                                    <category>Laravel</category>
                            </item>
                    <item>
                <title><![CDATA[Migrate Laravel Uploads From Local Disk to S3 With Zero Downtime: Read-Through Disks and moveToDisk]]></title>
                <link>https://hafiz.dev/blog/laravel-read-through-disk-migrate-uploads-to-s3</link>
                <description><![CDATA[Laravel 13.26 added read-through disks and 13.32 added moveToDisk. Together they turn a storage migration into a config change and a background sweep.]]></description>
                <author><![CDATA[Hafiz Riaz <contact@hafiz.dev>]]></author>
                <pubDate>Thu, 24 Sep 2026 06:15:00 +0200</pubDate>
                                    <category>Laravel</category>
                            </item>
                    <item>
                <title><![CDATA[Jev Gives Your Laravel App a Probability. Here Is What to Do When It Says 0.69]]></title>
                <link>https://hafiz.dev/blog/laravel-ai-sdk-jev-classification-confidence-review-queue</link>
                <description><![CDATA[The Classification API tells you what Jev thinks and how sure it is. Here is the part where your code decides what to do with a 0.69.]]></description>
                <author><![CDATA[Hafiz Riaz <contact@hafiz.dev>]]></author>
                <pubDate>Mon, 21 Sep 2026 06:15:00 +0200</pubDate>
                                    <category>Laravel</category>
                            </item>
                    <item>
                <title><![CDATA[Your Queue Worker Gets a SIGTERM on Every Deploy. Here Is What Laravel 13.31 Lets You Do About It]]></title>
                <link>https://hafiz.dev/blog/laravel-queue-worker-sigterm-interruptible-jobs</link>
                <description><![CDATA[Every deploy sends your workers a SIGTERM. Laravel 13.31 added the events to handle it properly, and one common flag turns them all off.]]></description>
                <author><![CDATA[Hafiz Riaz <contact@hafiz.dev>]]></author>
                <pubDate>Thu, 17 Sep 2026 06:15:00 +0200</pubDate>
                                    <category>Laravel</category>
                            </item>
                    <item>
                <title><![CDATA[Laravel Starter Kits Now Ship Vite+. Here Is What vp migrate Does to an App You Already Have]]></title>
                <link>https://hafiz.dev/blog/laravel-starter-kits-vite-plus-migration</link>
                <description><![CDATA[Vite+ landed in every Laravel starter kit. Running vp migrate on an app you already have is a different story.]]></description>
                <author><![CDATA[Hafiz Riaz <contact@hafiz.dev>]]></author>
                <pubDate>Mon, 14 Sep 2026 06:15:00 +0200</pubDate>
                                    <category>Laravel</category>
                            </item>
                    <item>
                <title><![CDATA[Spatie Permission vs Bouncer: One Question Decides Which One You Need]]></title>
                <link>https://hafiz.dev/blog/spatie-permission-vs-bouncer-laravel-roles</link>
                <description><![CDATA[Spatie handles permissions on kinds of things. Bouncer handles them on particular things. That one difference decides which package your app needs.]]></description>
                <author><![CDATA[Hafiz Riaz <contact@hafiz.dev>]]></author>
                <pubDate>Thu, 10 Sep 2026 06:15:00 +0200</pubDate>
                                    <category>Laravel</category>
                            </item>
                    <item>
                <title><![CDATA[Every AI Word You Keep Hearing, Explained With Laravel Code]]></title>
                <link>https://hafiz.dev/blog/ai-terms-explained-for-laravel-developers</link>
                <description><![CDATA[Thirty-one AI terms, grouped into five layers, each one anchored to code you can actually run in a Laravel app.]]></description>
                <author><![CDATA[Hafiz Riaz <contact@hafiz.dev>]]></author>
                <pubDate>Mon, 07 Sep 2026 06:15:00 +0200</pubDate>
                                    <category>AI</category>
                            </item>
                    <item>
                <title><![CDATA[Your Query Bindings Are in Your Logs: Laravel 13.27 Can Mask Them, and How to Clean Up What Leaked]]></title>
                <link>https://hafiz.dev/blog/laravel-query-bindings-in-logs-db-mask-bindings</link>
                <description><![CDATA[Every failed query in Laravel writes its real values into the error message. Where they end up, the one line that stops it, and how to clean up.]]></description>
                <author><![CDATA[Hafiz Riaz <contact@hafiz.dev>]]></author>
                <pubDate>Wed, 02 Sep 2026 06:15:00 +0200</pubDate>
                                    <category>Laravel</category>
                            </item>
                    <item>
                <title><![CDATA[How I Turned a €5 VPS Into a Dev Workstation I Can Use From Anywhere]]></title>
                <link>https://hafiz.dev/blog/remote-dev-workstation-vps-tmux-claude-code</link>
                <description><![CDATA[One cheap VPS is the workstation. Laptop and phone are windows onto it. The full setup, the control panel, and the table of everything that broke.]]></description>
                <author><![CDATA[Hafiz Riaz <contact@hafiz.dev>]]></author>
                <pubDate>Mon, 31 Aug 2026 06:15:00 +0200</pubDate>
                                    <category>DevOps</category>
                            </item>
                    <item>
                <title><![CDATA[NativePHP v4: Build a Truly Native iOS Screen in Blade, No Xcode Required]]></title>
                <link>https://hafiz.dev/blog/nativephp-v4-supernative-first-native-screen</link>
                <description><![CDATA[NativePHP v4 turns Blade into real SwiftUI. I built a native screen, ran it on my iPhone without Xcode, and hit the sharp edges so you do not have to.]]></description>
                <author><![CDATA[Hafiz Riaz <contact@hafiz.dev>]]></author>
                <pubDate>Wed, 26 Aug 2026 06:15:00 +0200</pubDate>
                                    <category>Laravel</category>
                            </item>
                    <item>
                <title><![CDATA[Laravel Lock vs Cache::lock: When Entity-Scoped Locking Earns a Package]]></title>
                <link>https://hafiz.dev/blog/laravel-lock-vs-cache-lock</link>
                <description><![CDATA[Cache::lock has shipped with Laravel for years. Here is what Laravel Lock adds, and when the extra dependency is worth it.]]></description>
                <author><![CDATA[Hafiz Riaz <contact@hafiz.dev>]]></author>
                <pubDate>Mon, 24 Aug 2026 06:15:00 +0200</pubDate>
                                    <category>Laravel</category>
                            </item>
                    <item>
                <title><![CDATA[Your Laravel MCP Server Is a Public API for Robots. Here's How to Lock It Down.]]></title>
                <link>https://hafiz.dev/blog/laravel-mcp-server-security-authorization</link>
                <description><![CDATA[An MCP server is a public endpoint that lets an AI run your code. Most tutorials stop before the part where you stop it doing damage.]]></description>
                <author><![CDATA[Hafiz Riaz <contact@hafiz.dev>]]></author>
                <pubDate>Wed, 19 Aug 2026 06:14:22 +0200</pubDate>
                                    <category>Laravel</category>
                            </item>
                    <item>
                <title><![CDATA[How I Moved a Live Laravel SaaS to a New Server With 2 Minutes of Downtime]]></title>
                <link>https://hafiz.dev/blog/live-laravel-saas-server-migration-2-minutes-downtime</link>
                <description><![CDATA[The plan, the 1m55s cutover, and the four silent failures that almost shipped with the migration of a live Laravel SaaS to a new VPS.]]></description>
                <author><![CDATA[Hafiz Riaz <contact@hafiz.dev>]]></author>
                <pubDate>Mon, 17 Aug 2026 06:15:52 +0200</pubDate>
                                    <category>Laravel</category>
                            </item>
                    <item>
                <title><![CDATA[Laravel Head vs SEOTools vs Your Hand-Rolled Meta Partial: Who Should Actually Migrate]]></title>
                <link>https://hafiz.dev/blog/laravel-head-vs-seotools-migration-guide</link>
                <description><![CDATA[Every Laravel app already solved the <head> problem. Laravel Head is the first-party answer, and the migration question has three answers.]]></description>
                <author><![CDATA[Hafiz Riaz <contact@hafiz.dev>]]></author>
                <pubDate>Wed, 12 Aug 2026 06:38:24 +0200</pubDate>
                                    <category>Laravel</category>
                            </item>
                    <item>
                <title><![CDATA[Filament v4.12 and v5.7: 92% Faster Forms, and the Security Fixes You Still Have to Turn On]]></title>
                <link>https://hafiz.dev/blog/filament-v4-12-v5-7-performance-security-breakdown</link>
                <description><![CDATA[Filament's big performance release landed. The speed is free. The security half of the release is not, and the announcement undersells that.]]></description>
                <author><![CDATA[Hafiz Riaz <contact@hafiz.dev>]]></author>
                <pubDate>Mon, 10 Aug 2026 06:41:27 +0200</pubDate>
                                    <category>Filament</category>
                            </item>
                    <item>
                <title><![CDATA[Laravel's New Image API Doesn't Replace Intervention or Spatie Media Library]]></title>
                <link>https://hafiz.dev/blog/laravel-image-api-vs-intervention-vs-spatie-media-library</link>
                <description><![CDATA[Laravel 13.20 shipped a first-party image API. It requires Intervention Image to work, and it competes with neither package.]]></description>
                <author><![CDATA[Hafiz Riaz <contact@hafiz.dev>]]></author>
                <pubDate>Wed, 05 Aug 2026 06:35:12 +0200</pubDate>
                                    <category>Laravel</category>
                            </item>
                    <item>
                <title><![CDATA[Human-in-the-Loop for Laravel AI Agents: Stop Your Agent Before It Refunds the Wrong Order]]></title>
                <link>https://hafiz.dev/blog/laravel-ai-sdk-human-in-the-loop-tool-approval</link>
                <description><![CDATA[The Laravel AI SDK can now pause an agent before it runs a sensitive tool. Here is the complete approval flow and the parts that will bite you.]]></description>
                <author><![CDATA[Hafiz Riaz <contact@hafiz.dev>]]></author>
                <pubDate>Mon, 03 Aug 2026 06:18:00 +0200</pubDate>
                                    <category>Laravel</category>
                            </item>
                    <item>
                <title><![CDATA[Pest 5 TIA: Run Only the Tests Your Code Change Touched]]></title>
                <link>https://hafiz.dev/blog/pest-5-tia-run-only-tests-your-change-touched</link>
                <description><![CDATA[Pest 5 shipped Test Impact Analysis. It reruns only the tests your change actually touched, turning a 10-minute suite into a few seconds.]]></description>
                <author><![CDATA[Hafiz Riaz <contact@hafiz.dev>]]></author>
                <pubDate>Thu, 30 Jul 2026 07:21:51 +0200</pubDate>
                                    <category>Laravel</category>
                            </item>
                    <item>
                <title><![CDATA[Laravel Scout in 2026: Meilisearch vs Typesense vs Algolia vs Database Driver]]></title>
                <link>https://hafiz.dev/blog/laravel-scout-2026-meilisearch-vs-typesense-vs-algolia-vs-database</link>
                <description><![CDATA[Scout ships five drivers and the docs treat them as equals. They are not. Here is the real comparison: features, ops burden, and actual monthly cost.]]></description>
                <author><![CDATA[Hafiz Riaz <contact@hafiz.dev>]]></author>
                <pubDate>Mon, 27 Jul 2026 06:03:39 +0200</pubDate>
                                    <category>Laravel</category>
                            </item>
                    <item>
                <title><![CDATA[Laravel Telegram Bot: How I Cleared My YouTube Watch Later with AI Summaries]]></title>
                <link>https://hafiz.dev/blog/laravel-telegram-bot-ai-watch-later-summaries</link>
                <description><![CDATA[My Watch Later list was a graveyard. So I built a Telegram bot with Laravel and the AI SDK that summarizes everything I save and makes me decide.]]></description>
                <author><![CDATA[Hafiz Riaz <contact@hafiz.dev>]]></author>
                <pubDate>Thu, 23 Jul 2026 06:19:26 +0200</pubDate>
                                    <category>Laravel</category>
                            </item>
            </channel>
</rss>
