[
    {
        "title": "Senior Laravel & PHP Developer | Custom Software, APIs, SaaS & SEO",
        "url": "/",
        "description": "Senior Laravel and PHP developer for custom software, backend systems, APIs, SaaS platforms, Filament admin panels, Blade SEO websites, performance cleanup, architecture review, and AI-readable content structure.",
        "type": "page",
        "keywords": "custom software development, web application development, backend development, PHP developer, Laravel developer, software development services, Laravel API development, Laravel SaaS development, business automation, internal tools, Filament admin panels, software architecture review, technical SEO developer, AI search optimization, Blade SEO websites, Laravel performance optimization",
        "updated": "2026-05-14",
        "image": "https://andrej.prus.dev/assets/images/optimized/page-home/page-home-1200.webp"
    },
    {
        "title": "Laravel and PHP Blog",
        "url": "/blog",
        "description": "Practical Laravel, PHP, performance, modernization, testing, and technical SEO notes from Andrej Prus.",
        "type": "page",
        "keywords": "Laravel PHP Laravel Octane PHPStan multi-tenancy modernization property hooks technical SEO",
        "updated": "2026-05-14",
        "image": "https://andrej.prus.dev/assets/images/optimized/page-blog/page-blog-1200.webp"
    },
    {
        "title": "About Andrej Prus | Senior Laravel & PHP 8.5 Developer",
        "url": "/about",
        "description": "Learn about a senior Laravel developer with 20+ years of PHP experience and production Laravel expertise from Laravel 4 through Laravel 13.",
        "type": "page",
        "keywords": "about senior Laravel developer, PHP 8.5 developer, Laravel 13 expert, Laravel architect",
        "updated": "2026-05-14",
        "image": "https://andrej.prus.dev/assets/images/optimized/page-about/page-about-1200.webp"
    },
    {
        "title": "Accessibility Statement | Senior Laravel Developer",
        "url": "/accessibility",
        "description": "Accessibility statement for andrej.prus.dev, covering semantic markup, keyboard access, readable contrast, responsive layouts, and reduced motion support.",
        "type": "page",
        "keywords": "accessibility statement, semantic markup, keyboard access, responsive Laravel portfolio, Laravel, PHP 8.5, Laravel 13, API Development, SaaS Architecture",
        "updated": "2026-05-14",
        "image": "https://andrej.prus.dev/assets/images/optimized/page-accessibility/page-accessibility-1200.webp"
    },
    {
        "title": "Laravel Codebase Audit | Performance & Security Review",
        "url": "/audit",
        "description": "Focused Laravel codebase audits covering routes, controllers, Eloquent models, Blade views, Filament resources, queries, queues, tests, security, and deployment risk.",
        "type": "page",
        "keywords": "Laravel codebase audit, Laravel architecture review, Laravel performance audit, Filament audit, Laravel security review, Laravel, PHP 8.5, Laravel 13, API Development, SaaS Architecture",
        "updated": "2026-05-14",
        "image": "https://andrej.prus.dev/assets/images/optimized/page-audit/page-audit-1200.webp"
    },
    {
        "title": "Backend Development | APIs, Databases, Queues & Laravel",
        "url": "/backend-development",
        "description": "Backend development for APIs, databases, queues, webhooks, authorization, integrations, SaaS workflows, performance, and production Laravel systems.",
        "type": "page",
        "keywords": "backend development, backend developer, API development, Laravel backend developer, PHP backend developer, database architecture, queue workers, webhook integrations, SaaS backend",
        "updated": "2026-05-14",
        "image": "https://andrej.prus.dev/assets/images/optimized/page-stack/page-stack-1200.webp"
    },
    {
        "title": "Laravel Blade SEO Websites | Server-rendered Landing Pages",
        "url": "/blade-seo-websites",
        "description": "Laravel Blade SEO website development for fast server-rendered landing pages, semantic markup, structured data, Open Graph metadata, accessibility, and reusable components.",
        "type": "page",
        "keywords": "Laravel Blade SEO websites, server rendered landing pages, semantic markup, structured data, Open Graph, Laravel, PHP 8.5, Laravel 13, API Development, SaaS Architecture",
        "updated": "2026-05-14",
        "image": "https://andrej.prus.dev/assets/images/optimized/page-blade-seo-websites/page-blade-seo-websites-1200.webp"
    },
    {
        "title": "Laravel SaaS Case Study | Multi-tenant Billing Platform",
        "url": "/case-study-saas",
        "description": "Laravel SaaS case study covering tenant safety, billing workflows, Filament administration, queue reliability, release confidence, and measurable production outcomes.",
        "type": "page",
        "keywords": "Laravel SaaS case study, multi tenant Laravel, Laravel billing platform, Filament SaaS admin, Laravel queue reliability, Laravel, PHP 8.5, Laravel 13, API Development, SaaS Architecture",
        "updated": "2026-05-14",
        "image": "https://andrej.prus.dev/assets/images/optimized/page-case-study-saas/page-case-study-saas-1200.webp"
    },
    {
        "title": "Contact | Hire a Senior Laravel Developer",
        "url": "/contact",
        "description": "Contact a senior Laravel developer for API development, Laravel SaaS architecture, backend performance optimization, modernization, reviews, and mentoring.",
        "type": "page",
        "keywords": "hire Laravel developer, contact Laravel developer, Laravel consultant for hire, PHP backend developer for hire",
        "updated": "2026-05-14",
        "image": "https://andrej.prus.dev/assets/images/optimized/page-contact/page-contact-1200.webp"
    },
    {
        "title": "Custom Software Development | Business Apps & Internal Tools",
        "url": "/custom-software-development",
        "description": "Custom software development for business applications, internal tools, customer portals, workflow automation, API integrations, dashboards, and long-term PHP systems.",
        "type": "page",
        "keywords": "custom software development, business application development, internal tools development, workflow automation software, customer portal development, PHP software developer, Laravel custom software",
        "updated": "2026-05-14",
        "image": "https://andrej.prus.dev/assets/images/optimized/page-services/page-services-1200.webp"
    },
    {
        "title": "Laravel Developer FAQ | Hiring, Architecture, Performance & Support",
        "url": "/faq",
        "description": "A redesigned FAQ hub with 50 practical answers about hiring a senior Laravel and PHP developer for architecture, APIs, SaaS, modernization, performance, security, testing, mentoring, pricing, and support.",
        "type": "page",
        "keywords": "Laravel developer FAQ, hire senior Laravel developer, Laravel consultant, PHP developer FAQ, Laravel architecture questions, Laravel modernization FAQ, Laravel performance consultant, Laravel support questions",
        "updated": "2026-05-14",
        "image": "https://andrej.prus.dev/assets/images/optimized/page-faq/page-faq-1200.webp"
    },
    {
        "title": "Filament Admin Panels | Laravel Resources & Tables",
        "url": "/filament-admin-panels",
        "description": "Filament admin panel development for Laravel teams needing production-ready resources, tables, forms, relation managers, dashboards, widgets, filters, and authorization.",
        "type": "page",
        "keywords": "Filament admin panel development, Laravel Filament resources, Filament tables, Filament forms, Filament dashboards, Laravel, PHP 8.5, Laravel 13, API Development, SaaS Architecture",
        "updated": "2026-05-14",
        "image": "https://andrej.prus.dev/assets/images/optimized/page-filament-admin-panels/page-filament-admin-panels-1200.webp"
    },
    {
        "title": "Laravel Glossary | Eloquent, Filament, Blade, Policies & Queues",
        "url": "/glossary",
        "description": "Plain-language glossary of Laravel, Filament, Blade, Eloquent, Form Request, Policy, Queue, Job, Action, and SaaS architecture terms.",
        "type": "page",
        "keywords": "Laravel glossary, Eloquent glossary, Filament glossary, Blade glossary, Laravel terminology, Laravel, PHP 8.5, Laravel 13, API Development, SaaS Architecture",
        "updated": "2026-05-14",
        "image": "https://andrej.prus.dev/assets/images/optimized/page-glossary/page-glossary-1200.webp"
    },
    {
        "title": "Laravel API Development | REST APIs & Webhooks",
        "url": "/laravel-api-development",
        "description": "Laravel API development for REST APIs, API Resources, authentication, webhooks, integrations, pagination, rate limiting, error contracts, and production documentation.",
        "type": "page",
        "keywords": "Laravel API development, Laravel REST API, Laravel API Resources, Laravel webhooks, Laravel Sanctum, Laravel, PHP 8.5, Laravel 13, API Development, SaaS Architecture",
        "updated": "2026-05-14",
        "image": "https://andrej.prus.dev/assets/images/optimized/page-laravel-api-development/page-laravel-api-development-1200.webp"
    },
    {
        "title": "Laravel Performance | Eloquent, Queues & Caching",
        "url": "/laravel-performance",
        "description": "Laravel performance optimization for slow Eloquent queries, N+1 problems, missing indexes, caching, queues, pagination, dashboards, and production bottlenecks.",
        "type": "page",
        "keywords": "Laravel performance optimization, Eloquent optimization, Laravel N+1 queries, Laravel caching, Laravel queues, Laravel, PHP 8.5, Laravel 13, API Development, SaaS Architecture",
        "updated": "2026-05-14",
        "image": "https://andrej.prus.dev/assets/images/optimized/page-laravel-performance/page-laravel-performance-1200.webp"
    },
    {
        "title": "Laravel SaaS Development | Multi-tenant Billing",
        "url": "/laravel-saas",
        "description": "Laravel SaaS development for multi-tenant applications, teams, roles, subscriptions, billing states, onboarding, customer portals, queues, and operational dashboards.",
        "type": "page",
        "keywords": "Laravel SaaS development, Laravel multi tenant, SaaS billing Laravel, Laravel teams roles, Laravel customer portal, Laravel, PHP 8.5, Laravel 13, API Development, SaaS Architecture",
        "updated": "2026-05-14",
        "image": "https://andrej.prus.dev/assets/images/optimized/page-laravel-saas/page-laravel-saas-1200.webp"
    },
    {
        "title": "Laravel vs WordPress | Platform Choice",
        "url": "/laravel-vs-wordpress",
        "description": "A practical comparison of Laravel and WordPress for complex products, custom workflows, backend systems, SEO websites, admin panels, and maintainable applications.",
        "type": "page",
        "keywords": "Laravel vs WordPress, Laravel for complex products, WordPress alternative, custom Laravel application, Laravel, PHP 8.5, Laravel 13, API Development, SaaS Architecture",
        "updated": "2026-05-14",
        "image": "https://andrej.prus.dev/assets/images/optimized/page-laravel-vs-wordpress/page-laravel-vs-wordpress-1200.webp"
    },
    {
        "title": "Laravel Maintenance & Support | Safer Releases",
        "url": "/maintenance",
        "description": "Ongoing Laravel maintenance and support for package updates, queue review, scheduler checks, Filament improvements, performance cleanup, tests, and release checklists.",
        "type": "page",
        "keywords": "Laravel maintenance, Laravel support retainer, Laravel package updates, Laravel production support, Laravel, PHP 8.5, Laravel 13, API Development, SaaS Architecture",
        "updated": "2026-05-14",
        "image": "https://andrej.prus.dev/assets/images/optimized/page-maintenance/page-maintenance-1200.webp"
    },
    {
        "title": "PHP Development | Modern PHP, Laravel & Legacy Systems",
        "url": "/php-development",
        "description": "PHP development services for modern PHP 8.5 applications, Laravel systems, legacy modernization, packages, CLI tools, integrations, tests, and backend architecture.",
        "type": "page",
        "keywords": "PHP development, PHP developer, modern PHP developer, PHP 8.5 development, Laravel PHP development, legacy PHP modernization, PHP backend developer, PHP application development",
        "updated": "2026-05-14",
        "image": "https://andrej.prus.dev/assets/images/optimized/page-services-laravel/page-services-laravel-1200.webp"
    },
    {
        "title": "Laravel Portfolio & Case Studies | SaaS, APIs, Modernization",
        "url": "/portfolio",
        "description": "Selected Laravel 13 and PHP 8.5 case studies covering SaaS billing, headless commerce APIs, modernization, real-time dashboards, and developer platforms.",
        "type": "page",
        "keywords": "Laravel portfolio, Laravel case studies, SaaS billing platform, Laravel API case study, Laravel modernization",
        "updated": "2026-05-14",
        "image": "https://andrej.prus.dev/assets/images/optimized/page-portfolio/page-portfolio-1200.webp"
    },
    {
        "title": "Senior Laravel Developer Pricing | Audits, Sprints & Retainers",
        "url": "/pricing",
        "description": "Senior Laravel developer pricing and engagement options for codebase audits, feature sprints, Filament builds, performance cleanup, architecture review, and retainers.",
        "type": "page",
        "keywords": "senior Laravel developer pricing, Laravel audit pricing, Laravel feature sprint, Laravel retainer, Laravel, PHP 8.5, Laravel 13, API Development, SaaS Architecture",
        "updated": "2026-05-14",
        "image": "https://andrej.prus.dev/assets/images/optimized/page-pricing/page-pricing-1200.webp"
    },
    {
        "title": "Privacy Policy | andrej.prus.dev",
        "url": "/privacy",
        "description": "Privacy policy for andrej.prus.dev, a PHP senior Laravel developer portfolio with no analytics, advertising pixels, tracking cookies, or backend database collection.",
        "type": "page",
        "keywords": "privacy policy, andrej.prus.dev privacy, PHP website privacy, Laravel, PHP 8.5, Laravel 13, API Development, SaaS Architecture",
        "updated": "2026-05-14",
        "image": "https://andrej.prus.dev/assets/images/optimized/page-privacy/page-privacy-1200.webp"
    },
    {
        "title": "Laravel Process | Architecture, Testing & Handover",
        "url": "/process",
        "description": "A clear Laravel development process covering discovery, proposal, architecture, short delivery cycles, testing, deployment, handover, and ongoing support.",
        "type": "page",
        "keywords": "Laravel development process, Laravel project discovery, Laravel architecture process, Laravel testing, Laravel deployment",
        "updated": "2026-05-14",
        "image": "https://andrej.prus.dev/assets/images/optimized/page-process/page-process-1200.webp"
    },
    {
        "title": "Laravel Developer Resources | Brief, Resume & Discovery Files",
        "url": "/resources",
        "description": "Resource hub for andrej.prus.dev with Laravel project brief, portfolio JSON, resume JSON, search index, LLM summary, RSS feed, vCard contact, and every public sitemap XML.",
        "type": "page",
        "keywords": "Laravel developer resources, Laravel project brief, Laravel portfolio JSON, resume JSON, Laravel, PHP 8.5, Laravel 13, API Development, SaaS Architecture",
        "updated": "2026-05-14",
        "image": "https://andrej.prus.dev/assets/images/optimized/page-resources/page-resources-1200.webp"
    },
    {
        "title": "Senior Laravel Developer Resume | Andrej Prus",
        "url": "/resume",
        "description": "Printable senior Laravel developer resume for Andrej Prus, covering Laravel, Filament, Blade, Eloquent, SaaS architecture, APIs, queues, testing, and production support.",
        "type": "page",
        "keywords": "Andrej Prus resume, senior Laravel developer resume, Laravel consultant resume, Laravel, PHP 8.5, Laravel 13, API Development, SaaS Architecture",
        "updated": "2026-05-14",
        "image": "https://andrej.prus.dev/assets/images/optimized/page-resume/page-resume-1200.webp"
    },
    {
        "title": "Laravel Development Services | SaaS, APIs & Blade",
        "url": "/services-laravel",
        "description": "Senior Laravel development services for SaaS applications, APIs, queues, policies, Blade pages, Eloquent models, and production-ready PHP systems.",
        "type": "page",
        "keywords": "senior Laravel development services, Laravel SaaS development, Laravel API development, Blade pages, Eloquent models, Laravel, PHP 8.5, Laravel 13, API Development, SaaS Architecture",
        "updated": "2026-05-14",
        "image": "https://andrej.prus.dev/assets/images/optimized/page-services-laravel/page-services-laravel-1200.webp"
    },
    {
        "title": "Laravel Services | APIs, SaaS & Performance",
        "url": "/services",
        "description": "Senior Laravel development services for APIs, SaaS platforms, performance optimization, legacy modernization, architecture review, mentoring, and Laravel Cloud setup.",
        "type": "page",
        "keywords": "Laravel development services, Laravel API development, Laravel SaaS architecture, Laravel performance optimization, Laravel Cloud setup",
        "updated": "2026-05-14",
        "image": "https://andrej.prus.dev/assets/images/optimized/page-services/page-services-1200.webp"
    },
    {
        "title": "Site Map | andrej.prus.dev Laravel Developer Portfolio",
        "url": "/sitemap",
        "description": "Site map for the senior Laravel developer portfolio, including canonical PHP pages for About, Services, Portfolio, Stack, Process, Blog, FAQ, Contact, and resources.",
        "type": "page",
        "keywords": "site map, andrej.prus.dev sitemap, Laravel developer portfolio pages, PHP pages, Laravel, PHP 8.5, Laravel 13, API Development, SaaS Architecture",
        "updated": "2026-05-14",
        "image": "https://andrej.prus.dev/assets/images/optimized/page-sitemap/page-sitemap-1200.webp"
    },
    {
        "title": "Software Architecture Review | Laravel, PHP & SaaS Systems",
        "url": "/software-architecture-review",
        "description": "Software architecture review for Laravel and PHP applications covering code structure, data flow, security, performance, deployment risk, tests, APIs, queues, and maintainability.",
        "type": "page",
        "keywords": "software architecture review, Laravel architecture review, PHP codebase audit, technical architecture audit, SaaS architecture review, code quality review, backend architecture consulting",
        "updated": "2026-05-14",
        "image": "https://andrej.prus.dev/assets/images/optimized/page-audit/page-audit-1200.webp"
    },
    {
        "title": "PHP & Laravel Technical Stack | Backend Developer",
        "url": "/stack",
        "description": "Technical stack for Laravel 13 backend development: PHP 8.5, Octane, Horizon, Reverb, PostgreSQL, Redis, AWS, PHPStan, Pest, Docker, and Laravel Cloud.",
        "type": "page",
        "keywords": "PHP 8.5 stack, Laravel 13 stack, Laravel Octane, Laravel Reverb, PHPStan level 9, Laravel Cloud",
        "updated": "2026-05-14",
        "image": "https://andrej.prus.dev/assets/images/optimized/page-stack/page-stack-1200.webp"
    },
    {
        "title": "Terms of Service | andrej.prus.dev",
        "url": "/terms",
        "description": "Terms of service for andrej.prus.dev, an informational portfolio for senior Laravel development, architecture review, performance work, and consulting inquiries.",
        "type": "page",
        "keywords": "terms of service, andrej.prus.dev terms, Laravel consulting terms, Laravel, PHP 8.5, Laravel 13, API Development, SaaS Architecture",
        "updated": "2026-05-14",
        "image": "https://andrej.prus.dev/assets/images/optimized/page-terms/page-terms-1200.webp"
    },
    {
        "title": "Laravel Testimonials | Architecture & Performance",
        "url": "/testimonials",
        "description": "Testimonials and proof points for Laravel architecture, Filament admin workflows, safer deployments, Eloquent performance cleanup, testing, and production support.",
        "type": "page",
        "keywords": "Laravel developer testimonials, Laravel consultant reviews, Filament testimonials, Laravel performance results, Laravel, PHP 8.5, Laravel 13, API Development, SaaS Architecture",
        "updated": "2026-05-14",
        "image": "https://andrej.prus.dev/assets/images/optimized/page-testimonials/page-testimonials-1200.webp"
    },
    {
        "title": "Web Application Development | SaaS, Portals & Dashboards",
        "url": "/web-application-development",
        "description": "Web application development for SaaS products, customer portals, internal dashboards, admin workflows, forms, reporting, SEO pages, and server-rendered PHP interfaces.",
        "type": "page",
        "keywords": "web application development, SaaS application development, customer portal development, dashboard development, PHP web application, Laravel web application, internal web tools",
        "updated": "2026-05-14",
        "image": "https://andrej.prus.dev/assets/images/optimized/page-portfolio/page-portfolio-1200.webp"
    },
    {
        "title": "A Laravel Package Code Quality Stack That Survives Version Drift",
        "url": "/blog/laravel-package-code-quality-stack-pest-phpstan-rector-pint",
        "description": "A practical Laravel package maintenance guide for Pest, PHPStan, Rector, Pint, matrix CI, release gates, and compatibility checks that catch version drift early.",
        "type": "post",
        "keywords": "Code Quality Laravel Pest PHPStan Rector Pint CI A Laravel Package Code Quality Stack That Survives Version Drift A practical Laravel package maintenance guide for Pest, PHPStan, Rector, Pint, matrix CI, release gates, and compatibility checks that catch version drift early.",
        "category": "Code Quality",
        "tags": [
            "Laravel",
            "Code Quality",
            "Pest",
            "PHPStan",
            "Rector",
            "Pint",
            "CI"
        ],
        "updated": "2026-05-14",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-composer-best-practices-autoloading-version-constraints-monorepos/blog-composer-best-practices-autoloading-version-constraints-monorepos-1200.webp"
    },
    {
        "title": "AI Search Optimization for Laravel Websites in 2026",
        "url": "/blog/ai-search-laravel",
        "description": "A 2026 playbook for AI search optimization in Laravel: schema, content depth, llms.txt, sitemaps, IndexNow, and measurable visibility.",
        "type": "post",
        "keywords": "SEO Laravel AI Search Technical SEO Structured Data PHP AI Search Optimization for Laravel Websites in 2026 A 2026 playbook for AI search optimization in Laravel: schema, content depth, llms.txt, sitemaps, IndexNow, and measurable visibility.",
        "category": "SEO",
        "tags": [
            "Laravel",
            "SEO",
            "AI Search",
            "Technical SEO",
            "Structured Data",
            "PHP"
        ],
        "updated": "2026-05-14",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-laravel-ai-sdk-sub-agents-orchestration-pattern/blog-laravel-ai-sdk-sub-agents-orchestration-pattern-1200.webp"
    },
    {
        "title": "Splitting Laravel Boost Guidelines Into Focused Package Partials",
        "url": "/blog/splitting-laravel-boost-guidelines-into-focused-partials",
        "description": "A package-maintainer pattern for composing Laravel Boost AI guidelines from Blade partials without turning core.blade.php into an unreadable wall of instructions.",
        "type": "post",
        "keywords": "Tooling Laravel Boost AI Packages Blade Splitting Laravel Boost Guidelines Into Focused Package Partials A package-maintainer pattern for composing Laravel Boost AI guidelines from Blade partials without turning core.blade.php into an unreadable wall of instructions.",
        "category": "Tooling",
        "tags": [
            "Laravel",
            "Boost",
            "AI",
            "Packages",
            "Blade"
        ],
        "updated": "2026-05-14",
        "image": "https://andrej.prus.dev/assets/images/optimized/page-contact/page-contact-1200.webp"
    },
    {
        "title": "Keep SQLite Alive During Laravel Forge Zero-Downtime Deployments",
        "url": "/blog/keep-sqlite-alive-laravel-forge-zero-downtime-deploys",
        "description": "A practical deployment guide for running SQLite on Laravel Forge without losing data when zero-downtime releases switch the current symlink.",
        "type": "post",
        "keywords": "Deployment Laravel Forge SQLite Database Keep SQLite Alive During Laravel Forge Zero-Downtime Deployments A practical deployment guide for running SQLite on Laravel Forge without losing data when zero-downtime releases switch the current symlink.",
        "category": "Deployment",
        "tags": [
            "Laravel",
            "Forge",
            "SQLite",
            "Deployment",
            "Database"
        ],
        "updated": "2026-05-14",
        "image": "https://andrej.prus.dev/assets/images/optimized/page-filament-admin-panels/page-filament-admin-panels-1200.webp"
    },
    {
        "title": "Laravel AI SDK Sub-Agents as a Clean Orchestration Pattern",
        "url": "/blog/laravel-ai-sdk-sub-agents-orchestration-pattern",
        "description": "A practical guide to Laravel AI SDK sub-agents, specialist agent boundaries, tool exposure, queueing, testing, and production orchestration patterns.",
        "type": "post",
        "keywords": "AI Laravel AI SDK Agents Orchestration PHP Laravel AI SDK Sub-Agents as a Clean Orchestration Pattern A practical guide to Laravel AI SDK sub-agents, specialist agent boundaries, tool exposure, queueing, testing, and production orchestration patterns.",
        "category": "AI",
        "tags": [
            "Laravel",
            "AI SDK",
            "Agents",
            "Orchestration",
            "PHP"
        ],
        "updated": "2026-05-14",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-laravel-ai-sdk-sub-agents-orchestration-pattern/blog-laravel-ai-sdk-sub-agents-orchestration-pattern-1200.webp"
    },
    {
        "title": "Authenticating Any Eloquent Model in a Laravel Sanctum API",
        "url": "/blog/authenticating-any-eloquent-model-laravel-sanctum-api",
        "description": "A production guide to using Laravel Sanctum tokens for projects, tenants, devices, and organizations instead of forcing every API request through User.",
        "type": "post",
        "keywords": "Laravel Sanctum APIs Authentication Eloquent Authenticating Any Eloquent Model in a Laravel Sanctum API A production guide to using Laravel Sanctum tokens for projects, tenants, devices, and organizations instead of forcing every API request through User.",
        "category": "Laravel",
        "tags": [
            "Laravel",
            "Sanctum",
            "APIs",
            "Authentication",
            "Eloquent"
        ],
        "updated": "2026-05-14",
        "image": "https://andrej.prus.dev/assets/images/optimized/page-laravel-api-development/page-laravel-api-development-1200.webp"
    },
    {
        "title": "Laravel Addressable for Polymorphic Addresses on Eloquent Models",
        "url": "/blog/laravel-addressable-polymorphic-addresses-eloquent-models",
        "description": "A production-focused guide to Laravel Addressable, polymorphic addresses, billing and shipping relations, eager loading, primary addresses, metadata, and spatial queries.",
        "type": "post",
        "keywords": "Laravel Eloquent Addressable Models Geospatial Laravel Addressable for Polymorphic Addresses on Eloquent Models A production-focused guide to Laravel Addressable, polymorphic addresses, billing and shipping relations, eager loading, primary addresses, metadata, and spatial queries.",
        "category": "Laravel",
        "tags": [
            "Laravel",
            "Eloquent",
            "Addressable",
            "Models",
            "Geospatial"
        ],
        "updated": "2026-05-14",
        "image": "https://andrej.prus.dev/assets/images/optimized/page-sitemap/page-sitemap-1200.webp"
    },
    {
        "title": "Wirebones Generates Livewire Skeletons from the Real DOM",
        "url": "/blog/wirebones-livewire-skeleton-placeholders-real-dom",
        "description": "A detailed guide to Wirebones, Livewire lazy placeholders, DOM-based skeleton generation, responsive capture, CI checks, and production deployment.",
        "type": "post",
        "keywords": "Livewire Laravel Wirebones UX Vite Wirebones Generates Livewire Skeletons from the Real DOM A detailed guide to Wirebones, Livewire lazy placeholders, DOM-based skeleton generation, responsive capture, CI checks, and production deployment.",
        "category": "Livewire",
        "tags": [
            "Laravel",
            "Livewire",
            "Wirebones",
            "UX",
            "Vite"
        ],
        "updated": "2026-05-14",
        "image": "https://andrej.prus.dev/assets/images/optimized/site-og/site-og-1200.webp"
    },
    {
        "title": "Building Laravel Recommendations with MongoDB Vector Search",
        "url": "/blog/laravel-mongodb-vector-search-recommendation-engine",
        "description": "A production guide to Laravel recommendations with MongoDB Vector Search, embeddings, Atlas indexes, queued refreshes, filters, caching, and safe UI output.",
        "type": "post",
        "keywords": "AI Laravel MongoDB Vector Search Recommendations Building Laravel Recommendations with MongoDB Vector Search A production guide to Laravel recommendations with MongoDB Vector Search, embeddings, Atlas indexes, queued refreshes, filters, caching, and safe UI output.",
        "category": "AI",
        "tags": [
            "Laravel",
            "MongoDB",
            "Vector Search",
            "Recommendations",
            "AI"
        ],
        "updated": "2026-05-14",
        "image": "https://andrej.prus.dev/assets/images/optimized/page-contact/page-contact-1200.webp"
    },
    {
        "title": "PHP Container Best Practices: Alpine Images, Multi-Stage & OCI Labels",
        "url": "/blog/php-container-best-practices-alpine-images-multi-stage-oci-labels",
        "description": "Production Docker guide for PHP - minimal Alpine base images, multi-stage builds, non-root users, and health check configuration.",
        "type": "post",
        "keywords": "Tooling PHP Docker Containers DevOps PHP Container Best Practices: Alpine Images, Multi-Stage & OCI Labels Production Docker guide for PHP - minimal Alpine base images, multi-stage builds, non-root users, and health check configuration.",
        "category": "Tooling",
        "tags": [
            "PHP",
            "Docker",
            "Containers",
            "Tooling",
            "DevOps"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/page-stack/page-stack-1200.webp"
    },
    {
        "title": "Generics in PHP: Current Workarounds and What the Future Holds",
        "url": "/blog/generics-in-php-current-workarounds-what-future-holds",
        "description": "Explores PHP's current lack of runtime generics: PHPDoc template annotations, Psalm and PHPStan generics, and the current RFC landscape.",
        "type": "post",
        "keywords": "Core PHP PHP Generics PHPStan Psalm Static Analysis Generics in PHP: Current Workarounds and What the Future Holds Explores PHP's current lack of runtime generics: PHPDoc template annotations, Psalm and PHPStan generics, and the current RFC landscape.",
        "category": "Core PHP",
        "tags": [
            "PHP",
            "Generics",
            "PHPStan",
            "Psalm",
            "Static Analysis",
            "Core PHP"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-automated-testing-pyramid-php-unit-integration-e2e-pest/blog-automated-testing-pyramid-php-unit-integration-e2e-pest-1200.webp"
    },
    {
        "title": "PHP 8.5 Property Hooks in Laravel",
        "url": "/blog/php-85-property-hooks-in-laravel",
        "description": "A practical guide to PHP 8.5 property hooks in Laravel, including safe use cases, Eloquent boundaries, DTO patterns, and SEO-friendly examples.",
        "type": "post",
        "keywords": "PHP PHP 8.5 Laravel Eloquent Architecture Technical SEO PHP 8.5 Property Hooks in Laravel A practical guide to PHP 8.5 property hooks in Laravel, including safe use cases, Eloquent boundaries, DTO patterns, and SEO-friendly examples.",
        "category": "PHP",
        "tags": [
            "PHP 8.5",
            "Laravel",
            "Eloquent",
            "Architecture",
            "Technical SEO"
        ],
        "updated": "2026-05-06",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-php-85-property-hooks-in-laravel/blog-php-85-property-hooks-in-laravel-1200.webp"
    },
    {
        "title": "PHP Webhooks With Filament: Admin Panels and Webhook Monitoring UI",
        "url": "/blog/php-webhooks-filament-admin-panels-webhook-monitoring-ui",
        "description": "Builds a Filament v3 admin panel with a webhook log viewer, retry controls, and signature verification status dashboard.",
        "type": "post",
        "keywords": "Tooling PHP Laravel Filament Webhooks PHP Webhooks With Filament: Admin Panels and Webhook Monitoring UI Builds a Filament v3 admin panel with a webhook log viewer, retry controls, and signature verification status dashboard.",
        "category": "Tooling",
        "tags": [
            "PHP",
            "Laravel",
            "Filament",
            "Webhooks",
            "Tooling"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-building-cli-tools-php-symfony-console-component/blog-building-cli-tools-php-symfony-console-component-1200.webp"
    },
    {
        "title": "Laravel Pulse: Real-Time Application Monitoring Dashboard Explained",
        "url": "/blog/laravel-pulse-real-time-application-monitoring-dashboard-explained",
        "description": "Practical guide to Laravel Pulse: setting up, configuring recorders, creating custom cards, and interpreting performance metrics.",
        "type": "post",
        "keywords": "Laravel Pulse Monitoring Performance Observability Livewire Laravel Pulse: Real-Time Application Monitoring Dashboard Explained Practical guide to Laravel Pulse: setting up, configuring recorders, creating custom cards, and interpreting performance metrics.",
        "category": "Laravel",
        "tags": [
            "Laravel",
            "Pulse",
            "Monitoring",
            "Performance",
            "Observability",
            "Livewire"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-automated-testing-pyramid-php-unit-integration-e2e-pest/blog-automated-testing-pyramid-php-unit-integration-e2e-pest-1200.webp"
    },
    {
        "title": "Laravel Schema Sentinel Turns Schema Drift into a CI Problem",
        "url": "/blog/laravel-schema-sentinel-database-schema-drift-ci",
        "description": "A production guide to Laravel Schema Sentinel, schema drift detection, strict checks, generated fixes, CI gates, admin health checks, and release workflows.",
        "type": "post",
        "keywords": "Database Laravel Migrations CI Schema Drift Laravel Schema Sentinel Turns Schema Drift into a CI Problem A production guide to Laravel Schema Sentinel, schema drift detection, strict checks, generated fixes, CI gates, admin health checks, and release workflows.",
        "category": "Database",
        "tags": [
            "Laravel",
            "Database",
            "Migrations",
            "CI",
            "Schema Drift"
        ],
        "updated": "2026-05-14",
        "image": "https://andrej.prus.dev/assets/images/optimized/page-laravel-performance/page-laravel-performance-1200.webp"
    },
    {
        "title": "PHP Benchmarking 101: phpbench, Xdebug Profiler & Flame Graphs",
        "url": "/blog/php-benchmarking-101-phpbench-xdebug-profiler-flame-graphs",
        "description": "Introduces phpbench for micro-benchmarks, Xdebug callgrind output, and flame graph visualization for identifying hot paths.",
        "type": "post",
        "keywords": "Performance PHP Benchmarking Xdebug PHPBench PHP Benchmarking 101: phpbench, Xdebug Profiler & Flame Graphs Introduces phpbench for micro-benchmarks, Xdebug callgrind output, and flame graph visualization for identifying hot paths.",
        "category": "Performance",
        "tags": [
            "PHP",
            "Benchmarking",
            "Performance",
            "Xdebug",
            "PHPBench"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-composer-best-practices-autoloading-version-constraints-monorepos/blog-composer-best-practices-autoloading-version-constraints-monorepos-1200.webp"
    },
    {
        "title": "Environment Configuration in PHP: .env Files, Secrets & Vault Integration",
        "url": "/blog/environment-configuration-php-env-files-secrets-vault-integration",
        "description": "Best practices for managing config - dotenv libraries, secrets management with HashiCorp Vault, and runtime injection in containers.",
        "type": "post",
        "keywords": "Security PHP Environment Configuration Secrets Vault Environment Configuration in PHP: .env Files, Secrets & Vault Integration Best practices for managing config - dotenv libraries, secrets management with HashiCorp Vault, and runtime injection in containers.",
        "category": "Security",
        "tags": [
            "PHP",
            "Environment Configuration",
            "Secrets",
            "Vault",
            "Security"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-building-crud-apis-laravel-sanctum-authentication-2021/blog-building-crud-apis-laravel-sanctum-authentication-2021-1200.webp"
    },
    {
        "title": "Laravel 13 Multi-tenancy in Production",
        "url": "/blog/laravel-13-multi-tenancy-in-production",
        "description": "A production Laravel 13 multi-tenancy guide covering database isolation, tenant routing, queues, analytics, security, and SEO-safe tenant pages.",
        "type": "post",
        "keywords": "Architecture Laravel 13 SaaS Multi-tenancy PostgreSQL Technical SEO Laravel 13 Multi-tenancy in Production A production Laravel 13 multi-tenancy guide covering database isolation, tenant routing, queues, analytics, security, and SEO-safe tenant pages.",
        "category": "Architecture",
        "tags": [
            "Laravel 13",
            "SaaS",
            "Multi-tenancy",
            "PostgreSQL",
            "Technical SEO"
        ],
        "updated": "2026-05-06",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-laravel-13-multi-tenancy-in-production/blog-laravel-13-multi-tenancy-in-production-1200.webp"
    },
    {
        "title": "Hexagonal Architecture in PHP: Practical Ports and Adapters Implementation",
        "url": "/blog/hexagonal-architecture-php-practical-ports-adapters-implementation",
        "description": "Builds a complete hexagonal architecture example - domain model, use cases, ports, and adapters for HTTP, CLI, and database.",
        "type": "post",
        "keywords": "Architecture PHP Hexagonal Architecture Ports and Adapters Testing Hexagonal Architecture in PHP: Practical Ports and Adapters Implementation Builds a complete hexagonal architecture example - domain model, use cases, ports, and adapters for HTTP, CLI, and database.",
        "category": "Architecture",
        "tags": [
            "PHP",
            "Architecture",
            "Hexagonal Architecture",
            "Ports and Adapters",
            "Testing"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-laravel-octane-production-checklist/blog-laravel-octane-production-checklist-1200.webp"
    },
    {
        "title": "PHP Data Transfer Objects: Validation, Casting and Immutability Patterns",
        "url": "/blog/php-data-transfer-objects-validation-casting-immutability-patterns",
        "description": "Shows multiple DTO patterns in PHP, including readonly classes, Spatie DTO package, validation at construction, and collection helpers.",
        "type": "post",
        "keywords": "Architecture PHP DTO Immutability PHP Data Transfer Objects: Validation, Casting and Immutability Patterns Shows multiple DTO patterns in PHP, including readonly classes, Spatie DTO package, validation at construction, and collection helpers.",
        "category": "Architecture",
        "tags": [
            "PHP",
            "DTO",
            "Architecture",
            "Immutability"
        ],
        "updated": "2026-05-06",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-composer-best-practices-autoloading-version-constraints-monorepos/blog-composer-best-practices-autoloading-version-constraints-monorepos-1200.webp"
    },
    {
        "title": "Building a PHP SDK: HTTP Client Abstraction, Retries & Test Fakes",
        "url": "/blog/building-php-sdk-http-client-abstraction-retries-test-fakes",
        "description": "Full tutorial for designing a third-party PHP SDK - fluent interface, PSR-18 HTTP client, retry middleware, and testable fakes.",
        "type": "post",
        "keywords": "APIs PHP SDK PSR-18 Testing Building a PHP SDK: HTTP Client Abstraction, Retries & Test Fakes Full tutorial for designing a third-party PHP SDK - fluent interface, PSR-18 HTTP client, retry middleware, and testable fakes.",
        "category": "APIs",
        "tags": [
            "PHP",
            "SDK",
            "PSR-18",
            "APIs",
            "Testing"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-building-php-sdk-http-client-abstraction-retries-test-fakes/blog-building-php-sdk-http-client-abstraction-retries-test-fakes-1200.webp"
    },
    {
        "title": "Surviving Legacy Laravel Modernization",
        "url": "/blog/surviving-legacy-laravel-modernization",
        "description": "A practical Laravel modernization plan for legacy applications, covering tests, PHP upgrades, PHPStan, SEO regressions, and safe delivery.",
        "type": "post",
        "keywords": "Modernization Laravel Legacy Modernization Testing PHPStan Technical SEO Surviving Legacy Laravel Modernization A practical Laravel modernization plan for legacy applications, covering tests, PHP upgrades, PHPStan, SEO regressions, and safe delivery.",
        "category": "Modernization",
        "tags": [
            "Laravel",
            "Legacy Modernization",
            "Testing",
            "PHPStan",
            "Technical SEO"
        ],
        "updated": "2026-05-06",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-surviving-legacy-laravel-modernization/blog-surviving-legacy-laravel-modernization-1200.webp"
    },
    {
        "title": "PHP Refactoring Handbook: How to Modernize Legacy Codebases Safely",
        "url": "/blog/php-refactoring-handbook-modernize-legacy-codebases-safely",
        "description": "Systematic approach to legacy PHP modernization - strangler fig pattern, characterization tests, dependency inversion, and incremental upgrades.",
        "type": "post",
        "keywords": "Architecture PHP Refactoring Legacy Code Modernization PHP Refactoring Handbook: How to Modernize Legacy Codebases Safely Systematic approach to legacy PHP modernization - strangler fig pattern, characterization tests, dependency inversion, and incremental upgrades.",
        "category": "Architecture",
        "tags": [
            "PHP",
            "Refactoring",
            "Architecture",
            "Legacy Code",
            "Modernization"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-deploying-php-apps-aws-ec2-ecs-fargate-lambda-runtimes-guide/blog-deploying-php-apps-aws-ec2-ecs-fargate-lambda-runtimes-guide-1200.webp"
    },
    {
        "title": "PHP Memory Management: Reference Counting, Garbage Collection & Leaks",
        "url": "/blog/php-memory-management-reference-counting-garbage-collection-leaks",
        "description": "Explains PHP's zval memory model, reference cycles, gc_collect_cycles, and tools like Valgrind and xDebug for leak detection.",
        "type": "post",
        "keywords": "Performance PHP Memory Management Garbage Collection Xdebug PHP Memory Management: Reference Counting, Garbage Collection & Leaks Explains PHP's zval memory model, reference cycles, gc_collect_cycles, and tools like Valgrind and xDebug for leak detection.",
        "category": "Performance",
        "tags": [
            "PHP",
            "Memory Management",
            "Garbage Collection",
            "Performance",
            "Xdebug"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-database-indexing-strategies-php-apps-b-trees-full-text-composite/blog-database-indexing-strategies-php-apps-b-trees-full-text-composite-1200.webp"
    },
    {
        "title": "PHP Workers and Queues: Supervisor, Horizon & Zero-Downtime Deploys",
        "url": "/blog/php-workers-queues-supervisor-horizon-zero-downtime-deploys",
        "description": "Production guide for managing PHP queue workers - Supervisor config, graceful restarts, deploy coordination, and alerting setup.",
        "type": "post",
        "keywords": "Tooling PHP Queues Supervisor Horizon Deployments PHP Workers and Queues: Supervisor, Horizon & Zero-Downtime Deploys Production guide for managing PHP queue workers - Supervisor config, graceful restarts, deploy coordination, and alerting setup.",
        "category": "Tooling",
        "tags": [
            "PHP",
            "Queues",
            "Supervisor",
            "Horizon",
            "Deployments",
            "Tooling"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-integrating-stripe-payments-laravel-subscriptions-webhooks-guide/blog-integrating-stripe-payments-laravel-subscriptions-webhooks-guide-1200.webp"
    },
    {
        "title": "Laravel Octane Production Checklist",
        "url": "/blog/laravel-octane-production-checklist",
        "description": "A production Laravel Octane checklist for safe workers, memory, queues, database connections, Core Web Vitals, and measurable SEO performance gains.",
        "type": "post",
        "keywords": "Performance Laravel Octane Production Queues Core Web Vitals Laravel Octane Production Checklist A production Laravel Octane checklist for safe workers, memory, queues, database connections, Core Web Vitals, and measurable SEO performance gains.",
        "category": "Performance",
        "tags": [
            "Laravel Octane",
            "Performance",
            "Production",
            "Queues",
            "Core Web Vitals"
        ],
        "updated": "2026-05-06",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-laravel-octane-production-checklist/blog-laravel-octane-production-checklist-1200.webp"
    },
    {
        "title": "Laravel Zero: Build Powerful PHP CLI Applications and Distribute Them",
        "url": "/blog/laravel-zero-build-powerful-php-cli-applications-distribute-them",
        "description": "Walks through building, testing, and compiling a Laravel Zero CLI tool to a PHAR with self-update and platform-specific builds.",
        "type": "post",
        "keywords": "Tooling PHP Laravel Zero CLI PHAR Laravel Zero: Build Powerful PHP CLI Applications and Distribute Them Walks through building, testing, and compiling a Laravel Zero CLI tool to a PHAR with self-update and platform-specific builds.",
        "category": "Tooling",
        "tags": [
            "PHP",
            "Laravel Zero",
            "CLI",
            "PHAR",
            "Tooling"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-database-indexing-strategies-php-apps-b-trees-full-text-composite/blog-database-indexing-strategies-php-apps-b-trees-full-text-composite-1200.webp"
    },
    {
        "title": "Securing Laravel APIs: Passport vs Sanctum vs JWT Deep Comparison",
        "url": "/blog/securing-laravel-apis-passport-sanctum-jwt-deep-comparison",
        "description": "Evaluates three Laravel auth strategies for APIs - comparing token types, setup complexity, revocation, and mobile app scenarios.",
        "type": "post",
        "keywords": "Security Laravel APIs Passport Sanctum JWT Securing Laravel APIs: Passport vs Sanctum vs JWT Deep Comparison Evaluates three Laravel auth strategies for APIs - comparing token types, setup complexity, revocation, and mobile app scenarios.",
        "category": "Security",
        "tags": [
            "Laravel",
            "APIs",
            "Security",
            "Passport",
            "Sanctum",
            "JWT"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/page-services-laravel/page-services-laravel-1200.webp"
    },
    {
        "title": "PHPStan Level 9 on Existing Laravel",
        "url": "/blog/phpstan-level-9-existing-laravel",
        "description": "A step-by-step PHPStan Level 9 adoption plan for existing Laravel applications, with baselines, module cleanup, CI rules, and SEO-safe releases.",
        "type": "post",
        "keywords": "Code Quality PHPStan Laravel Testing Technical SEO PHPStan Level 9 on Existing Laravel A step-by-step PHPStan Level 9 adoption plan for existing Laravel applications, with baselines, module cleanup, CI rules, and SEO-safe releases.",
        "category": "Code Quality",
        "tags": [
            "PHPStan",
            "Laravel",
            "Code Quality",
            "Testing",
            "Technical SEO"
        ],
        "updated": "2026-05-06",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-phpstan-level-9-existing-laravel/blog-phpstan-level-9-existing-laravel-1200.webp"
    },
    {
        "title": "Understanding PHP Stream API: File I/O, Wrappers & Custom Protocols",
        "url": "/blog/understanding-php-stream-api-file-io-wrappers-custom-protocols",
        "description": "Explores PHP streams - wrappers, filters, stream contexts, and building custom stream wrappers for exotic storage backends.",
        "type": "post",
        "keywords": "Core PHP PHP Streams File IO Wrappers Understanding PHP Stream API: File I/O, Wrappers & Custom Protocols Explores PHP streams - wrappers, filters, stream contexts, and building custom stream wrappers for exotic storage backends.",
        "category": "Core PHP",
        "tags": [
            "PHP",
            "Streams",
            "File IO",
            "Wrappers",
            "Core PHP"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-api-versioning-in-php-strategies-url-paths-header-based-approaches/blog-api-versioning-in-php-strategies-url-paths-header-based-approaches-1200.webp"
    },
    {
        "title": "Full-Text Search in PHP: Elasticsearch, Meilisearch & Laravel Scout",
        "url": "/blog/full-text-search-php-elasticsearch-meilisearch-laravel-scout",
        "description": "Compares search backends, integrates each with Laravel Scout, and benchmarks relevance and performance on large datasets.",
        "type": "post",
        "keywords": "Database PHP Laravel Scout Elasticsearch Meilisearch Full-Text Search Full-Text Search in PHP: Elasticsearch, Meilisearch & Laravel Scout Compares search backends, integrates each with Laravel Scout, and benchmarks relevance and performance on large datasets.",
        "category": "Database",
        "tags": [
            "PHP",
            "Laravel Scout",
            "Elasticsearch",
            "Meilisearch",
            "Full-Text Search"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-laravel-octane-production-checklist/blog-laravel-octane-production-checklist-1200.webp"
    },
    {
        "title": "Symfony UX Components: Turbo, Stimulus & Live Components in 2026",
        "url": "/blog/symfony-ux-components-turbo-stimulus-live-components-2026",
        "description": "Shows how to build dynamic UIs in Symfony with UX Turbo page transitions, Stimulus controllers, and real-time Live Components.",
        "type": "post",
        "keywords": "Symfony Symfony UX Turbo Stimulus Live Components PHP Symfony UX Components: Turbo, Stimulus & Live Components in 2026 Shows how to build dynamic UIs in Symfony with UX Turbo page transitions, Stimulus controllers, and real-time Live Components.",
        "category": "Symfony",
        "tags": [
            "Symfony",
            "Symfony UX",
            "Turbo",
            "Stimulus",
            "Live Components",
            "PHP"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-database-migrations-best-practices-laravel-rollbacks-seeds-factories/blog-database-migrations-best-practices-laravel-rollbacks-seeds-factories-1200.webp"
    },
    {
        "title": "PHP Profiling in Production: Blackfire, Tideways & SPX Compared",
        "url": "/blog/php-profiling-production-blackfire-tideways-spx-compared",
        "description": "Evaluates three PHP profilers for production use - setup, overhead, callgraph visualizations, and alerting on regressions.",
        "type": "post",
        "keywords": "Performance PHP Profiling Blackfire Tideways SPX PHP Profiling in Production: Blackfire, Tideways & SPX Compared Evaluates three PHP profilers for production use - setup, overhead, callgraph visualizations, and alerting on regressions.",
        "category": "Performance",
        "tags": [
            "PHP",
            "Profiling",
            "Blackfire",
            "Tideways",
            "SPX",
            "Performance"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-modern-php-development-workflow-git-ci-cd-docker-github-actions/blog-modern-php-development-workflow-git-ci-cd-docker-github-actions-1200.webp"
    },
    {
        "title": "Laravel Precognition: Real-Time Validation Without Full Form Submission",
        "url": "/blog/laravel-precognition-real-time-validation-without-full-form-submission",
        "description": "Deep-dive into Precognition - how it works, how to set it up with Inertia and Livewire, and front-end integration patterns.",
        "type": "post",
        "keywords": "Laravel Precognition Validation Inertia Livewire Laravel Precognition: Real-Time Validation Without Full Form Submission Deep-dive into Precognition - how it works, how to set it up with Inertia and Livewire, and front-end integration patterns.",
        "category": "Laravel",
        "tags": [
            "Laravel",
            "Precognition",
            "Validation",
            "Inertia",
            "Livewire"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-laravel-precognition-real-time-validation-without-full-form-submission/blog-laravel-precognition-real-time-validation-without-full-form-submission-1200.webp"
    },
    {
        "title": "Building a PHP Blog Engine From Scratch: No Framework, Clean Code",
        "url": "/blog/building-php-blog-engine-from-scratch-no-framework-clean-code",
        "description": "Builds a feature-complete blog - routing, templating, SQLite storage, markdown support - using only the PHP standard library.",
        "type": "post",
        "keywords": "Core PHP PHP Blog Engine SQLite Markdown No Framework Building a PHP Blog Engine From Scratch: No Framework, Clean Code Builds a feature-complete blog - routing, templating, SQLite storage, markdown support - using only the PHP standard library.",
        "category": "Core PHP",
        "tags": [
            "PHP",
            "Blog Engine",
            "SQLite",
            "Markdown",
            "No Framework"
        ],
        "updated": "2026-05-14",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-building-multi-tenant-saas-apps-laravel-architecture-tenancy-strategies/blog-building-multi-tenant-saas-apps-laravel-architecture-tenancy-strategies-1200.webp"
    },
    {
        "title": "Building Webhooks in PHP: Payload Validation, Retries & Idempotency",
        "url": "/blog/building-webhooks-php-payload-validation-retries-idempotency",
        "description": "Shows how to implement a robust webhook receiver - HMAC signature verification, duplicate detection, and async processing patterns.",
        "type": "post",
        "keywords": "APIs PHP Webhooks Idempotency Security Building Webhooks in PHP: Payload Validation, Retries & Idempotency Shows how to implement a robust webhook receiver - HMAC signature verification, duplicate detection, and async processing patterns.",
        "category": "APIs",
        "tags": [
            "PHP",
            "APIs",
            "Webhooks",
            "Idempotency",
            "Security"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-optimizing-mysql-queries-php-indexes-joins-execution-plans/blog-optimizing-mysql-queries-php-indexes-joins-execution-plans-1200.webp"
    },
    {
        "title": "PHP Event Loops Explained: How ReactPHP and Amp Handle Concurrency",
        "url": "/blog/php-event-loops-explained-reactphp-amp-handle-concurrency",
        "description": "Demystifies event loops, non-blocking I/O, and timer scheduling in PHP, comparing ReactPHP streams vs Amp channels.",
        "type": "post",
        "keywords": "Core PHP PHP Event Loops ReactPHP Amp Concurrency PHP Event Loops Explained: How ReactPHP and Amp Handle Concurrency Demystifies event loops, non-blocking I/O, and timer scheduling in PHP, comparing ReactPHP streams vs Amp channels.",
        "category": "Core PHP",
        "tags": [
            "PHP",
            "Event Loops",
            "ReactPHP",
            "Amp",
            "Concurrency"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-optimizing-mysql-queries-php-indexes-joins-execution-plans/blog-optimizing-mysql-queries-php-indexes-joins-execution-plans-1200.webp"
    },
    {
        "title": "PHP Code Review Checklist: 50 Things Senior Developers Always Check",
        "url": "/blog/php-code-review-checklist-50-things-senior-developers-always-check",
        "description": "A comprehensive, annotated code review checklist covering naming, error handling, security, performance, and testability issues.",
        "type": "post",
        "keywords": "Tooling PHP Code Review Security Testing PHP Code Review Checklist: 50 Things Senior Developers Always Check A comprehensive, annotated code review checklist covering naming, error handling, security, performance, and testability issues.",
        "category": "Tooling",
        "tags": [
            "PHP",
            "Code Review",
            "Tooling",
            "Security",
            "Testing"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-composer-best-practices-autoloading-version-constraints-monorepos/blog-composer-best-practices-autoloading-version-constraints-monorepos-1200.webp"
    },
    {
        "title": "PHP and PostgreSQL: Advanced Queries, JSONB & Full-Text Search",
        "url": "/blog/php-postgresql-advanced-queries-jsonb-full-text-search",
        "description": "Explores PostgreSQL-specific features from PHP - JSONB querying, array columns, CTEs, and pg_query for performance-critical apps.",
        "type": "post",
        "keywords": "Database PHP PostgreSQL JSONB Full-Text Search PHP and PostgreSQL: Advanced Queries, JSONB & Full-Text Search Explores PostgreSQL-specific features from PHP - JSONB querying, array columns, CTEs, and pg_query for performance-critical apps.",
        "category": "Database",
        "tags": [
            "PHP",
            "PostgreSQL",
            "JSONB",
            "Full-Text Search",
            "Database"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/site-og/site-og-1200.webp"
    },
    {
        "title": "API Design Best Practices for PHP Developers: REST, HATEOAS & OpenAPI",
        "url": "/blog/api-design-best-practices-php-developers-rest-hateoas-openapi",
        "description": "Covers API design fundamentals - hypermedia controls, status codes, versioning, and generating OpenAPI docs from PHP attributes.",
        "type": "post",
        "keywords": "APIs PHP REST OpenAPI HATEOAS API Design Best Practices for PHP Developers: REST, HATEOAS & OpenAPI Covers API design fundamentals - hypermedia controls, status codes, versioning, and generating OpenAPI docs from PHP attributes.",
        "category": "APIs",
        "tags": [
            "PHP",
            "APIs",
            "REST",
            "OpenAPI",
            "HATEOAS"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/page-laravel-api-development/page-laravel-api-development-1200.webp"
    },
    {
        "title": "Testing Laravel Applications: Feature Tests, Mocking & Database Factories",
        "url": "/blog/testing-laravel-applications-feature-tests-mocking-database-factories",
        "description": "Covers Laravel's HTTP test helpers, Mockery integration, database factory states, and running tests against in-memory SQLite.",
        "type": "post",
        "keywords": "Testing Laravel Feature Tests Mockery Factories SQLite Testing Laravel Applications: Feature Tests, Mocking & Database Factories Covers Laravel's HTTP test helpers, Mockery integration, database factory states, and running tests against in-memory SQLite.",
        "category": "Testing",
        "tags": [
            "Laravel",
            "Testing",
            "Feature Tests",
            "Mockery",
            "Factories",
            "SQLite"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-php-security-checklist-2020-xss-csrf-sql-injection/blog-php-security-checklist-2020-xss-csrf-sql-injection-1200.webp"
    },
    {
        "title": "Pest PHP 3 New Features: Architectural Testing & Mutation Testing",
        "url": "/blog/pest-php-3-new-features-architectural-testing-mutation-testing",
        "description": "Covers Pest 3's new architectural assertions, built-in mutation testing, how it compares with Infection PHP, and snapshot testing support.",
        "type": "post",
        "keywords": "Testing PHP Pest Architecture Testing Mutation Testing Infection Pest PHP 3 New Features: Architectural Testing & Mutation Testing Covers Pest 3's new architectural assertions, built-in mutation testing, how it compares with Infection PHP, and snapshot testing support.",
        "category": "Testing",
        "tags": [
            "PHP",
            "Pest",
            "Testing",
            "Architecture Testing",
            "Mutation Testing",
            "Infection"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-api-versioning-in-php-strategies-url-paths-header-based-approaches/blog-api-versioning-in-php-strategies-url-paths-header-based-approaches-1200.webp"
    },
    {
        "title": "PHP 9.0 Preview: What's Coming and How to Prepare Your Codebase",
        "url": "/blog/php-90-preview-whats-coming-how-prepare-codebase",
        "description": "Early look at PHP 9.0 planned changes - removal of deprecated features, new syntax proposals, and migration path from 8.x.",
        "type": "post",
        "keywords": "Core PHP PHP PHP 9.0 Migration Deprecations PHP 9.0 Preview: What's Coming and How to Prepare Your Codebase Early look at PHP 9.0 planned changes - removal of deprecated features, new syntax proposals, and migration path from 8.x.",
        "category": "Core PHP",
        "tags": [
            "PHP",
            "PHP 9.0",
            "Migration",
            "Core PHP",
            "Deprecations"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/page-stack/page-stack-1200.webp"
    },
    {
        "title": "Laravel Volt & Folio: Single-File Components and Page-Based Routing",
        "url": "/blog/laravel-volt-folio-single-file-components-page-based-routing",
        "description": "Explores Laravel Folio's file-based routing and Volt's single-file Livewire components for rapid full-stack PHP development.",
        "type": "post",
        "keywords": "Laravel Livewire Volt Folio Routing Laravel Volt & Folio: Single-File Components and Page-Based Routing Explores Laravel Folio's file-based routing and Volt's single-file Livewire components for rapid full-stack PHP development.",
        "category": "Laravel",
        "tags": [
            "Laravel",
            "Livewire",
            "Volt",
            "Folio",
            "Routing"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-automated-testing-pyramid-php-unit-integration-e2e-pest/blog-automated-testing-pyramid-php-unit-integration-e2e-pest-1200.webp"
    },
    {
        "title": "PHP Rate Limiting Strategies: Token Bucket, Sliding Window & Redis",
        "url": "/blog/php-rate-limiting-strategies-token-bucket-sliding-window-redis",
        "description": "Implements three rate-limiting algorithms in PHP with Redis, covering distributed locking, graceful degradation, and HTTP 429 responses.",
        "type": "post",
        "keywords": "Performance PHP Redis Rate Limiting APIs PHP Rate Limiting Strategies: Token Bucket, Sliding Window & Redis Implements three rate-limiting algorithms in PHP with Redis, covering distributed locking, graceful degradation, and HTTP 429 responses.",
        "category": "Performance",
        "tags": [
            "PHP",
            "Redis",
            "Rate Limiting",
            "Performance",
            "APIs"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-building-cli-tools-php-symfony-console-component/blog-building-cli-tools-php-symfony-console-component-1200.webp"
    },
    {
        "title": "SOLID Principles in PHP: Practical Examples for Better Code Quality",
        "url": "/blog/solid-principles-php-practical-examples-better-code-quality",
        "description": "Demonstrates each SOLID principle with before/after PHP refactoring examples, showing how they reduce coupling and increase cohesion.",
        "type": "post",
        "keywords": "Architecture PHP SOLID Refactoring OOP SOLID Principles in PHP: Practical Examples for Better Code Quality Demonstrates each SOLID principle with before/after PHP refactoring examples, showing how they reduce coupling and increase cohesion.",
        "category": "Architecture",
        "tags": [
            "PHP",
            "SOLID",
            "Architecture",
            "Refactoring",
            "OOP"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-automated-testing-pyramid-php-unit-integration-e2e-pest/blog-automated-testing-pyramid-php-unit-integration-e2e-pest-1200.webp"
    },
    {
        "title": "Building a PHP Package for Packagist: From Scratch to First Release",
        "url": "/blog/building-php-package-packagist-scratch-first-release",
        "description": "Full guide to designing, testing, documenting, and publishing a PHP library on Packagist with SemVer and GitHub releases.",
        "type": "post",
        "keywords": "Tooling PHP Composer Packagist SemVer Building a PHP Package for Packagist: From Scratch to First Release Full guide to designing, testing, documenting, and publishing a PHP library on Packagist with SemVer and GitHub releases.",
        "category": "Tooling",
        "tags": [
            "PHP",
            "Composer",
            "Packagist",
            "Tooling",
            "SemVer"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-composer-best-practices-autoloading-version-constraints-monorepos/blog-composer-best-practices-autoloading-version-constraints-monorepos-1200.webp"
    },
    {
        "title": "PHP Observability: Logging, Tracing & Metrics With OpenTelemetry",
        "url": "/blog/php-observability-logging-tracing-metrics-opentelemetry",
        "description": "Implements the three pillars of observability in PHP - structured logging, distributed tracing, and Prometheus metrics with OTEL PHP SDK.",
        "type": "post",
        "keywords": "Tooling PHP OpenTelemetry Observability Logging Metrics PHP Observability: Logging, Tracing & Metrics With OpenTelemetry Implements the three pillars of observability in PHP - structured logging, distributed tracing, and Prometheus metrics with OTEL PHP SDK.",
        "category": "Tooling",
        "tags": [
            "PHP",
            "OpenTelemetry",
            "Observability",
            "Logging",
            "Metrics"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-building-crud-apis-laravel-sanctum-authentication-2021/blog-building-crud-apis-laravel-sanctum-authentication-2021-1200.webp"
    },
    {
        "title": "Symfony 7 Migration Guide: What Changed and How to Upgrade Safely",
        "url": "/blog/symfony-7-migration-guide-what-changed-how-upgrade-safely",
        "description": "Step-by-step upgrade path from Symfony 6 to 7 - breaking changes, removed components, new features, and automated migration tools.",
        "type": "post",
        "keywords": "Symfony Migration PHP Composer Upgrade Symfony 7 Migration Guide: What Changed and How to Upgrade Safely Step-by-step upgrade path from Symfony 6 to 7 - breaking changes, removed components, new features, and automated migration tools.",
        "category": "Symfony",
        "tags": [
            "Symfony",
            "Migration",
            "PHP",
            "Composer",
            "Upgrade"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-composer-best-practices-autoloading-version-constraints-monorepos/blog-composer-best-practices-autoloading-version-constraints-monorepos-1200.webp"
    },
    {
        "title": "PHP Type System Mastery: Union, Intersection & Never Types Explained",
        "url": "/blog/php-type-system-mastery-union-intersection-never-types-explained",
        "description": "Comprehensive guide to PHP's evolving type system - union, nullable, intersection, never, and void types with strict mode best practices.",
        "type": "post",
        "keywords": "Core PHP PHP Type System Union Types Intersection Types PHP Type System Mastery: Union, Intersection & Never Types Explained Comprehensive guide to PHP's evolving type system - union, nullable, intersection, never, and void types with strict mode best practices.",
        "category": "Core PHP",
        "tags": [
            "PHP",
            "Core PHP",
            "Type System",
            "Union Types",
            "Intersection Types"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-building-php-sdk-http-client-abstraction-retries-test-fakes/blog-building-php-sdk-http-client-abstraction-retries-test-fakes-1200.webp"
    },
    {
        "title": "Laravel Reverb: Build Real-Time WebSocket Apps Without Third-Party Services",
        "url": "/blog/laravel-reverb-build-real-time-websocket-apps-without-third-party-services",
        "description": "Introduces Laravel's first-party WebSocket server - setup, horizontal scaling, authentication, and broadcasting channel integration.",
        "type": "post",
        "keywords": "Laravel Reverb WebSockets Broadcasting Real-Time Laravel Reverb: Build Real-Time WebSocket Apps Without Third-Party Services Introduces Laravel's first-party WebSocket server - setup, horizontal scaling, authentication, and broadcasting channel integration.",
        "category": "Laravel",
        "tags": [
            "Laravel",
            "Reverb",
            "WebSockets",
            "Broadcasting",
            "Real-Time"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-deploying-php-apps-aws-ec2-ecs-fargate-lambda-runtimes-guide/blog-deploying-php-apps-aws-ec2-ecs-fargate-lambda-runtimes-guide-1200.webp"
    },
    {
        "title": "Database Indexing Strategies for PHP Apps: B-Trees, Full-Text & Composite",
        "url": "/blog/database-indexing-strategies-php-apps-b-trees-full-text-composite",
        "description": "Explains index types, covering indexes, partial indexes, and full-text search with practical MySQL and PostgreSQL PHP examples.",
        "type": "post",
        "keywords": "Database PHP MySQL PostgreSQL Indexes Database Indexing Strategies for PHP Apps: B-Trees, Full-Text & Composite Explains index types, covering indexes, partial indexes, and full-text search with practical MySQL and PostgreSQL PHP examples.",
        "category": "Database",
        "tags": [
            "Database",
            "PHP",
            "MySQL",
            "PostgreSQL",
            "Indexes"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-database-indexing-strategies-php-apps-b-trees-full-text-composite/blog-database-indexing-strategies-php-apps-b-trees-full-text-composite-1200.webp"
    },
    {
        "title": "PHP and AI: Integrating ChatGPT & Claude APIs Into Your PHP Application",
        "url": "/blog/php-ai-integrating-chatgpt-claude-apis-php-application",
        "description": "Practical tutorial for calling LLM APIs from PHP - streaming responses, function calling, context management, and cost optimization.",
        "type": "post",
        "keywords": "APIs PHP OpenAI ChatGPT Claude AI PHP and AI: Integrating ChatGPT & Claude APIs Into Your PHP Application Practical tutorial for calling LLM APIs from PHP - streaming responses, function calling, context management, and cost optimization.",
        "category": "APIs",
        "tags": [
            "PHP",
            "OpenAI",
            "ChatGPT",
            "Claude",
            "APIs",
            "AI"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-api-versioning-in-php-strategies-url-paths-header-based-approaches/blog-api-versioning-in-php-strategies-url-paths-header-based-approaches-1200.webp"
    },
    {
        "title": "Modern PHP Development Workflow: Git, CI/CD, Docker & GitHub Actions",
        "url": "/blog/modern-php-development-workflow-git-ci-cd-docker-github-actions",
        "description": "End-to-end guide for a professional PHP dev workflow - feature branches, automated tests, Docker builds, and zero-downtime deploys.",
        "type": "post",
        "keywords": "Tooling PHP Git CI/CD Docker GitHub Actions Modern PHP Development Workflow: Git, CI/CD, Docker & GitHub Actions End-to-end guide for a professional PHP dev workflow - feature branches, automated tests, Docker builds, and zero-downtime deploys.",
        "category": "Tooling",
        "tags": [
            "PHP",
            "Git",
            "CI/CD",
            "Docker",
            "GitHub Actions"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-modern-php-development-workflow-git-ci-cd-docker-github-actions/blog-modern-php-development-workflow-git-ci-cd-docker-github-actions-1200.webp"
    },
    {
        "title": "What the Next Generation of Languages Is Teaching Us About How We Think Today",
        "url": "/blog/what-the-next-generation-of-languages-is-teaching-us-about-how-we-think-today",
        "description": "Looks at emerging languages - Zig, Gleam, Elixir, Carbon - and what their design choices reveal about the limitations in how current mainstream languages have trained developers to think.",
        "type": "post",
        "keywords": "Language Evolution Programming Languages Zig Gleam Elixir Carbon Developer Thinking What the Next Generation of Languages Is Teaching Us About How We Think Today Looks at emerging languages - Zig, Gleam, Elixir, Carbon - and what their design choices reveal about the limitations in how current mainstream languages have trained developers to think.",
        "category": "Language Evolution",
        "tags": [
            "Language Evolution",
            "Programming Languages",
            "Zig",
            "Gleam",
            "Elixir",
            "Carbon",
            "Developer Thinking"
        ],
        "updated": "2026-05-08",
        "image": "https://andrej.prus.dev/assets/images/optimized/page-laravel-api-development/page-laravel-api-development-1200.webp"
    },
    {
        "title": "Laravel 11 Complete Guide: New Minimal App Structure & Bootstrapping",
        "url": "/blog/laravel-11-complete-guide-minimal-app-structure-bootstrapping",
        "description": "Covers the redesigned minimal directory structure, single bootstrap file, merged config, and new artisan commands in Laravel 11.",
        "type": "post",
        "keywords": "Laravel Laravel 11 Bootstrapping Artisan Architecture Laravel 11 Complete Guide: New Minimal App Structure & Bootstrapping Covers the redesigned minimal directory structure, single bootstrap file, merged config, and new artisan commands in Laravel 11.",
        "category": "Laravel",
        "tags": [
            "Laravel",
            "Laravel 11",
            "Bootstrapping",
            "Artisan",
            "Architecture"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-building-multi-tenant-saas-apps-laravel-architecture-tenancy-strategies/blog-building-multi-tenant-saas-apps-laravel-architecture-tenancy-strategies-1200.webp"
    },
    {
        "title": "PHP 8.4 Released: Complete Breakdown of Every New Feature",
        "url": "/blog/php-84-released-complete-breakdown-every-new-feature",
        "description": "Definitive release guide covering property hooks, asymmetric visibility, lazy objects, the new HTML5 parser, and all deprecations.",
        "type": "post",
        "keywords": "Core PHP PHP PHP 8.4 Property Hooks Migration PHP 8.4 Released: Complete Breakdown of Every New Feature Definitive release guide covering property hooks, asymmetric visibility, lazy objects, the new HTML5 parser, and all deprecations.",
        "category": "Core PHP",
        "tags": [
            "PHP",
            "PHP 8.4",
            "Property Hooks",
            "Migration",
            "Core PHP"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-optimizing-mysql-queries-php-indexes-joins-execution-plans/blog-optimizing-mysql-queries-php-indexes-joins-execution-plans-1200.webp"
    },
    {
        "title": "Giving Back at Scale: How to Build an Open Source Culture Within Your Engineering Team",
        "url": "/blog/giving-back-at-scale-how-to-build-an-open-source-culture-within-your-engineering-team",
        "description": "Practical playbook for engineering managers - allocating contribution time, choosing strategic projects, recognising contributors, and making open source part of the team identity.",
        "type": "post",
        "keywords": "Open Source Engineering Management Team Culture OSPO Developer Workflow Giving Back at Scale: How to Build an Open Source Culture Within Your Engineering Team Practical playbook for engineering managers - allocating contribution time, choosing strategic projects, recognising contributors, and making open source part of the team identity.",
        "category": "Open Source",
        "tags": [
            "Open Source",
            "Engineering Management",
            "Team Culture",
            "OSPO",
            "Developer Workflow"
        ],
        "updated": "2026-05-08",
        "image": "https://andrej.prus.dev/assets/images/optimized/page-laravel-api-development/page-laravel-api-development-1200.webp"
    },
    {
        "title": "Symfony Messenger: Async Messaging, Retry Logic & Dead Letter Queues",
        "url": "/blog/symfony-messenger-async-messaging-retry-logic-dead-letter-queues",
        "description": "Explores Symfony Messenger transports, middleware, retry stamps, failure transport, and monitoring with built-in CLI commands.",
        "type": "post",
        "keywords": "Symfony Messenger Queues Async PHP Symfony Messenger: Async Messaging, Retry Logic & Dead Letter Queues Explores Symfony Messenger transports, middleware, retry stamps, failure transport, and monitoring with built-in CLI commands.",
        "category": "Symfony",
        "tags": [
            "Symfony",
            "Messenger",
            "Queues",
            "Async",
            "PHP"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-php-security-checklist-2020-xss-csrf-sql-injection/blog-php-security-checklist-2020-xss-csrf-sql-injection-1200.webp"
    },
    {
        "title": "The Slow Death of Boilerplate: How Modern Frameworks Liberated Developer Thinking",
        "url": "/blog/the-slow-death-of-boilerplate-how-modern-frameworks-liberated-developer-thinking",
        "description": "Charts the progressive elimination of ceremony in frameworks - from struts XML configs to Laravel's zero-config defaults - and how each reduction shifted developer attention toward actual problems.",
        "type": "post",
        "keywords": "Language Evolution Frameworks Boilerplate Laravel Rails Spring Boot Convention over Configuration The Slow Death of Boilerplate: How Modern Frameworks Liberated Developer Thinking Charts the progressive elimination of ceremony in frameworks - from struts XML configs to Laravel's zero-config defaults - and how each reduction shifted developer attention toward actual problems.",
        "category": "Language Evolution",
        "tags": [
            "Language Evolution",
            "Frameworks",
            "Boilerplate",
            "Laravel",
            "Rails",
            "Spring Boot",
            "Convention over Configuration"
        ],
        "updated": "2026-05-08",
        "image": "https://andrej.prus.dev/assets/images/optimized/page-stack/page-stack-1200.webp"
    },
    {
        "title": "Secure PHP File Uploads: Validation, Storage & Malware Prevention",
        "url": "/blog/secure-php-file-uploads-validation-storage-malware-prevention",
        "description": "Complete upload security guide: MIME validation, file-name sanitization, virus scanning integration, and secure S3 storage patterns.",
        "type": "post",
        "keywords": "Security PHP File Uploads S3 Malware Scanning Secure PHP File Uploads: Validation, Storage & Malware Prevention Complete upload security guide: MIME validation, file-name sanitization, virus scanning integration, and secure S3 storage patterns.",
        "category": "Security",
        "tags": [
            "PHP",
            "Security",
            "File Uploads",
            "S3",
            "Malware Scanning"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-integrating-stripe-payments-laravel-subscriptions-webhooks-guide/blog-integrating-stripe-payments-laravel-subscriptions-webhooks-guide-1200.webp"
    },
    {
        "title": "Post-Mortem Culture: Turning Every Major Bug Into a Team Learning Opportunity",
        "url": "/blog/post-mortem-culture-turning-every-major-bug-into-team-learning-opportunity",
        "description": "Establishes a blameless post-mortem process - timeline reconstruction, five-whys root cause analysis, and action items that prevent entire classes of future bugs.",
        "type": "post",
        "keywords": "Debugging PHP Postmortems Incident Response Reliability Post-Mortem Culture: Turning Every Major Bug Into a Team Learning Opportunity Establishes a blameless post-mortem process - timeline reconstruction, five-whys root cause analysis, and action items that prevent entire classes of future bugs.",
        "category": "Debugging",
        "tags": [
            "PHP",
            "Debugging",
            "Postmortems",
            "Incident Response",
            "Reliability"
        ],
        "updated": "2026-05-08",
        "image": "https://andrej.prus.dev/assets/images/optimized/page-laravel-api-development/page-laravel-api-development-1200.webp"
    },
    {
        "title": "PHP Fibers vs ReactPHP vs Amp: Async PHP Ecosystem Comparison 2024",
        "url": "/blog/php-fibers-vs-reactphp-vs-amp-async-php-ecosystem-comparison-2024",
        "description": "Side-by-side comparison of PHP async approaches: native Fibers, ReactPHP event loop, and Amp coroutines with benchmark methodology.",
        "type": "post",
        "keywords": "Core PHP PHP Fibers ReactPHP Amp Async PHP Fibers vs ReactPHP vs Amp: Async PHP Ecosystem Comparison 2024 Side-by-side comparison of PHP async approaches: native Fibers, ReactPHP event loop, and Amp coroutines with benchmark methodology.",
        "category": "Core PHP",
        "tags": [
            "PHP",
            "Fibers",
            "ReactPHP",
            "Amp",
            "Async"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/page-services-laravel/page-services-laravel-1200.webp"
    },
    {
        "title": "What Corporate Open Source Contributions Actually Look Like From the Inside",
        "url": "/blog/what-corporate-open-source-contributions-actually-look-like-from-the-inside",
        "description": "An insider look at how companies like Google, Meta, and Microsoft structure open source teams, measure contribution impact, and balance community needs with business objectives.",
        "type": "post",
        "keywords": "Open Source OSPO Engineering Management Corporate Engineering Software Strategy What Corporate Open Source Contributions Actually Look Like From the Inside An insider look at how companies like Google, Meta, and Microsoft structure open source teams, measure contribution impact, and balance community needs with business objectives.",
        "category": "Open Source",
        "tags": [
            "Open Source",
            "OSPO",
            "Engineering Management",
            "Corporate Engineering",
            "Software Strategy"
        ],
        "updated": "2026-05-08",
        "image": "https://andrej.prus.dev/assets/images/optimized/page-stack/page-stack-1200.webp"
    },
    {
        "title": "Language Paradigms as Lenses: What Learning a New Paradigm Does to Your Developer Brain",
        "url": "/blog/language-paradigms-as-lenses-what-learning-a-new-paradigm-does-to-your-developer-brain",
        "description": "Explores the cognitive science of paradigm shifts - how learning OOP, functional, or concurrent programming rewires problem-solving instincts that persist long after you stop using the language.",
        "type": "post",
        "keywords": "Language Evolution Programming Paradigms Mental Models Functional Programming Concurrency Language Paradigms as Lenses: What Learning a New Paradigm Does to Your Developer Brain Explores the cognitive science of paradigm shifts - how learning OOP, functional, or concurrent programming rewires problem-solving instincts that persist long after you stop using the language.",
        "category": "Language Evolution",
        "tags": [
            "Language Evolution",
            "Programming Paradigms",
            "Mental Models",
            "Functional Programming",
            "Concurrency"
        ],
        "updated": "2026-05-08",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-automated-testing-pyramid-php-unit-integration-e2e-pest/blog-automated-testing-pyramid-php-unit-integration-e2e-pest-1200.webp"
    },
    {
        "title": "Simplicity at Scale: How Great Engineering Teams Keep Codebases Clean Over Time",
        "url": "/blog/simplicity-at-scale-great-engineering-teams-keep-codebases-clean-over-time",
        "description": "Examines how high-performing teams sustain simplicity through architectural decision records, complexity budgets, and a shared culture of ruthless editing.",
        "type": "post",
        "keywords": "Engineering Simplicity Architecture Code Review Team Practices Simplicity at Scale: How Great Engineering Teams Keep Codebases Clean Over Time Examines how high-performing teams sustain simplicity through architectural decision records, complexity budgets, and a shared culture of ruthless editing.",
        "category": "Engineering",
        "tags": [
            "Engineering",
            "Simplicity",
            "Architecture",
            "Code Review",
            "Team Practices"
        ],
        "updated": "2026-05-08",
        "image": "https://andrej.prus.dev/assets/images/optimized/page-laravel-api-development/page-laravel-api-development-1200.webp"
    },
    {
        "title": "Optimizing Laravel for High Traffic: Horizon, Telescope & Load Testing",
        "url": "/blog/optimizing-laravel-high-traffic-horizon-telescope-load-testing",
        "description": "End-to-end performance playbook: queue tuning with Horizon, debug profiling with Telescope, and k6 load testing strategies.",
        "type": "post",
        "keywords": "Performance Laravel Horizon Telescope Load Testing Optimizing Laravel for High Traffic: Horizon, Telescope & Load Testing End-to-end performance playbook: queue tuning with Horizon, debug profiling with Telescope, and k6 load testing strategies.",
        "category": "Performance",
        "tags": [
            "Laravel",
            "Performance",
            "Horizon",
            "Telescope",
            "Load Testing"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-database-migrations-best-practices-laravel-rollbacks-seeds-factories/blog-database-migrations-best-practices-laravel-rollbacks-seeds-factories-1200.webp"
    },
    {
        "title": "Building Event Sourcing Systems in PHP: A Step-by-Step Implementation",
        "url": "/blog/building-event-sourcing-systems-php-step-by-step-implementation",
        "description": "Implements an event store, aggregate roots, projectors, and process managers for an event-sourced PHP application from scratch.",
        "type": "post",
        "keywords": "Architecture PHP Event Sourcing CQRS Domain Events Building Event Sourcing Systems in PHP: A Step-by-Step Implementation Implements an event store, aggregate roots, projectors, and process managers for an event-sourced PHP application from scratch.",
        "category": "Architecture",
        "tags": [
            "PHP",
            "Event Sourcing",
            "Architecture",
            "CQRS",
            "Domain Events"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/site-og/site-og-1200.webp"
    },
    {
        "title": "PHP Rector: Automated Code Upgrades and Refactoring Made Simple",
        "url": "/blog/php-rector-automated-code-upgrades-refactoring-made-simple",
        "description": "Introduction to Rector: running existing rule sets for PHP upgrades, writing custom rules, and integrating into CI/CD pipelines.",
        "type": "post",
        "keywords": "Tooling PHP Rector Refactoring CI PHP Rector: Automated Code Upgrades and Refactoring Made Simple Introduction to Rector: running existing rule sets for PHP upgrades, writing custom rules, and integrating into CI/CD pipelines.",
        "category": "Tooling",
        "tags": [
            "PHP",
            "Rector",
            "Refactoring",
            "Tooling",
            "CI"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-api-versioning-in-php-strategies-url-paths-header-based-approaches/blog-api-versioning-in-php-strategies-url-paths-header-based-approaches-1200.webp"
    },
    {
        "title": "How Kubernetes Rewired the Way Engineers Think About Infrastructure and Applications",
        "url": "/blog/how-kubernetes-rewired-the-way-engineers-think-about-infrastructure-and-applications",
        "description": "Examines how Kubernetes shifted infrastructure thinking from servers and processes to desired state, reconciliation loops, and declarative configuration as the new lingua franca of operations.",
        "type": "post",
        "keywords": "Language Evolution Kubernetes Infrastructure Declarative Configuration Operations How Kubernetes Rewired the Way Engineers Think About Infrastructure and Applications Examines how Kubernetes shifted infrastructure thinking from servers and processes to desired state, reconciliation loops, and declarative configuration as the new lingua franca of operations.",
        "category": "Language Evolution",
        "tags": [
            "Language Evolution",
            "Kubernetes",
            "Infrastructure",
            "Declarative Configuration",
            "Operations"
        ],
        "updated": "2026-05-08",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-building-cli-tools-php-symfony-console-component/blog-building-cli-tools-php-symfony-console-component-1200.webp"
    },
    {
        "title": "Security in Open Source: Why Transparency Is Both the Greatest Strength and Risk",
        "url": "/blog/security-in-open-source-why-transparency-is-both-greatest-strength-and-risk",
        "description": "Examines the dual nature of open source security - public code enables auditing but also attack research - covering responsible disclosure and dependency vulnerability management.",
        "type": "post",
        "keywords": "Open Source Security Vulnerability Management Supply Chain Responsible Disclosure Security in Open Source: Why Transparency Is Both the Greatest Strength and Risk Examines the dual nature of open source security - public code enables auditing but also attack research - covering responsible disclosure and dependency vulnerability management.",
        "category": "Open Source",
        "tags": [
            "Open Source",
            "Security",
            "Vulnerability Management",
            "Supply Chain",
            "Responsible Disclosure"
        ],
        "updated": "2026-05-08",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-automated-testing-pyramid-php-unit-integration-e2e-pest/blog-automated-testing-pyramid-php-unit-integration-e2e-pest-1200.webp"
    },
    {
        "title": "Debugging Across the Full Stack: Tracing a Bug From Browser to Database",
        "url": "/blog/debugging-across-full-stack-tracing-bug-browser-database",
        "description": "Walks through a realistic end-to-end bug hunt spanning JavaScript console errors, HTTP requests, backend exceptions, and slow database queries.",
        "type": "post",
        "keywords": "Debugging PHP JavaScript HTTP Database Observability Debugging Across the Full Stack: Tracing a Bug From Browser to Database Walks through a realistic end-to-end bug hunt spanning JavaScript console errors, HTTP requests, backend exceptions, and slow database queries.",
        "category": "Debugging",
        "tags": [
            "PHP",
            "Debugging",
            "JavaScript",
            "HTTP",
            "Database",
            "Observability"
        ],
        "updated": "2026-05-08",
        "image": "https://andrej.prus.dev/assets/images/optimized/page-stack/page-stack-1200.webp"
    },
    {
        "title": "Elegant APIs: How to Design Interfaces That Feel Obvious to Use",
        "url": "/blog/elegant-apis-how-design-interfaces-feel-obvious-use",
        "description": "Covers the principles behind intuitive API design - minimal required knowledge, consistent conventions, and interfaces that guide users toward correct usage.",
        "type": "post",
        "keywords": "Architecture PHP API Design Interfaces Developer Experience Elegant APIs: How to Design Interfaces That Feel Obvious to Use Covers the principles behind intuitive API design - minimal required knowledge, consistent conventions, and interfaces that guide users toward correct usage.",
        "category": "Architecture",
        "tags": [
            "PHP",
            "Architecture",
            "API Design",
            "Interfaces",
            "Developer Experience"
        ],
        "updated": "2026-05-08",
        "image": "https://andrej.prus.dev/assets/images/optimized/page-stack/page-stack-1200.webp"
    },
    {
        "title": "Real-Time Notifications in Laravel With Broadcasting & Pusher",
        "url": "/blog/real-time-notifications-laravel-broadcasting-pusher",
        "description": "Implements server-side events, Echo.js front-end integration, private channels, and presence channels for real-time user notifications.",
        "type": "post",
        "keywords": "Laravel Broadcasting Pusher Echo Notifications Real-Time Notifications in Laravel With Broadcasting & Pusher Implements server-side events, Echo.js front-end integration, private channels, and presence channels for real-time user notifications.",
        "category": "Laravel",
        "tags": [
            "Laravel",
            "Broadcasting",
            "Pusher",
            "Echo",
            "Notifications"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-optimizing-mysql-queries-php-indexes-joins-execution-plans/blog-optimizing-mysql-queries-php-indexes-joins-execution-plans-1200.webp"
    },
    {
        "title": "Mastering PHP Composer Plugins: Extend Your Build Pipeline Powerfully",
        "url": "/blog/mastering-php-composer-plugins-extend-build-pipeline-powerfully",
        "description": "Shows how to write, test, and publish Composer plugins for code generation, post-install hooks, and asset compilation automation.",
        "type": "post",
        "keywords": "Tooling PHP Composer Build Pipeline Plugins Mastering PHP Composer Plugins: Extend Your Build Pipeline Powerfully Shows how to write, test, and publish Composer plugins for code generation, post-install hooks, and asset compilation automation.",
        "category": "Tooling",
        "tags": [
            "PHP",
            "Composer",
            "Tooling",
            "Build Pipeline",
            "Plugins"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-composer-best-practices-autoloading-version-constraints-monorepos/blog-composer-best-practices-autoloading-version-constraints-monorepos-1200.webp"
    },
    {
        "title": "The Evolution of SQL: How a 50-Year-Old Language Keeps Reinventing Developer Thinking",
        "url": "/blog/the-evolution-of-sql-how-a-50-year-old-language-keeps-reinventing-developer-thinking",
        "description": "Traces SQL from relational theory to window functions, CTEs, JSON columns, and vector search - showing how each addition changed what developers reached for when modelling data problems.",
        "type": "post",
        "keywords": "Language Evolution SQL Relational Databases Data Modeling Query Languages The Evolution of SQL: How a 50-Year-Old Language Keeps Reinventing Developer Thinking Traces SQL from relational theory to window functions, CTEs, JSON columns, and vector search - showing how each addition changed what developers reached for when modelling data problems.",
        "category": "Language Evolution",
        "tags": [
            "Language Evolution",
            "SQL",
            "Relational Databases",
            "Data Modeling",
            "Query Languages"
        ],
        "updated": "2026-05-08",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-automated-testing-pyramid-php-unit-integration-e2e-pest/blog-automated-testing-pyramid-php-unit-integration-e2e-pest-1200.webp"
    },
    {
        "title": "PHP 8.4 Preview: Property Hooks, Lazy Objects & New Array Functions",
        "url": "/blog/php-84-preview-property-hooks-lazy-objects-new-array-functions",
        "description": "Early preview of PHP 8.4 changes: property hooks as a major OOP addition, lazy object proxies, and new array helper functions.",
        "type": "post",
        "keywords": "Core PHP PHP PHP 8.4 Property Hooks Lazy Objects Arrays PHP 8.4 Preview: Property Hooks, Lazy Objects & New Array Functions Early preview of PHP 8.4 changes: property hooks as a major OOP addition, lazy object proxies, and new array helper functions.",
        "category": "Core PHP",
        "tags": [
            "PHP",
            "PHP 8.4",
            "Property Hooks",
            "Lazy Objects",
            "Arrays"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-laravel-octane-production-checklist/blog-laravel-octane-production-checklist-1200.webp"
    },
    {
        "title": "Writing Code That Is Easy to Debug: Observability-First Development",
        "url": "/blog/writing-code-easy-debug-observability-first-development",
        "description": "Shifts the mindset from reactive debugging to proactive observability - designing state machines, audit trails, and invariant checks into the code itself.",
        "type": "post",
        "keywords": "Debugging PHP Observability Logging Architecture Writing Code That Is Easy to Debug: Observability-First Development Shifts the mindset from reactive debugging to proactive observability - designing state machines, audit trails, and invariant checks into the code itself.",
        "category": "Debugging",
        "tags": [
            "PHP",
            "Debugging",
            "Observability",
            "Logging",
            "Architecture"
        ],
        "updated": "2026-05-08",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-automated-testing-pyramid-php-unit-integration-e2e-pest/blog-automated-testing-pyramid-php-unit-integration-e2e-pest-1200.webp"
    },
    {
        "title": "The Culture of Code Review in Open Source: Honest, Harsh & Occasionally Brilliant",
        "url": "/blog/the-culture-of-code-review-in-open-source-honest-harsh-occasionally-brilliant",
        "description": "Explores the unique norms of open source code review - directness without cruelty, technical precision, and the rare experience of having your code reviewed by true domain experts.",
        "type": "post",
        "keywords": "Open Source Code Review Maintainers Collaboration Software Culture The Culture of Code Review in Open Source: Honest, Harsh & Occasionally Brilliant Explores the unique norms of open source code review - directness without cruelty, technical precision, and the rare experience of having your code reviewed by true domain experts.",
        "category": "Open Source",
        "tags": [
            "Open Source",
            "Code Review",
            "Maintainers",
            "Collaboration",
            "Software Culture"
        ],
        "updated": "2026-05-08",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-building-cli-tools-php-symfony-console-component/blog-building-cli-tools-php-symfony-console-component-1200.webp"
    },
    {
        "title": "The Relationship Between Tests and Elegant Design: Simplicity as a Signal",
        "url": "/blog/relationship-between-tests-elegant-design-simplicity-signal",
        "description": "Argues that hard-to-test code is a symptom of poor design, and that writing tests first naturally drives toward simpler, more cohesive structures.",
        "type": "post",
        "keywords": "Clean Code PHP Testing TDD Design The Relationship Between Tests and Elegant Design: Simplicity as a Signal Argues that hard-to-test code is a symptom of poor design, and that writing tests first naturally drives toward simpler, more cohesive structures.",
        "category": "Clean Code",
        "tags": [
            "PHP",
            "Clean Code",
            "Testing",
            "TDD",
            "Design"
        ],
        "updated": "2026-05-08",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-automated-testing-pyramid-php-unit-integration-e2e-pest/blog-automated-testing-pyramid-php-unit-integration-e2e-pest-1200.webp"
    },
    {
        "title": "Laravel API Resources: Transform Your JSON Responses Like a Pro",
        "url": "/blog/laravel-api-resources-transform-json-responses-like-a-pro",
        "description": "Covers resource classes, resource collections, conditional attributes, nested includes, and metadata injection for clean API outputs.",
        "type": "post",
        "keywords": "Laravel API Resources JSON Eloquent APIs Laravel API Resources: Transform Your JSON Responses Like a Pro Covers resource classes, resource collections, conditional attributes, nested includes, and metadata injection for clean API outputs.",
        "category": "Laravel",
        "tags": [
            "Laravel",
            "API Resources",
            "JSON",
            "Eloquent",
            "APIs"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-database-indexing-strategies-php-apps-b-trees-full-text-composite/blog-database-indexing-strategies-php-apps-b-trees-full-text-composite-1200.webp"
    },
    {
        "title": "How React Changed the Mental Model of UI Development Across the Entire Industry",
        "url": "/blog/how-react-changed-the-mental-model-of-ui-development-across-the-entire-industry",
        "description": "Documents React's paradigm shift - declarative rendering, unidirectional data flow, and component thinking - and how it permanently changed how developers conceptualise user interfaces.",
        "type": "post",
        "keywords": "Language Evolution React UI Development Components Declarative UI How React Changed the Mental Model of UI Development Across the Entire Industry Documents React's paradigm shift - declarative rendering, unidirectional data flow, and component thinking - and how it permanently changed how developers conceptualise user interfaces.",
        "category": "Language Evolution",
        "tags": [
            "Language Evolution",
            "React",
            "UI Development",
            "Components",
            "Declarative UI"
        ],
        "updated": "2026-05-08",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-composer-best-practices-autoloading-version-constraints-monorepos/blog-composer-best-practices-autoloading-version-constraints-monorepos-1200.webp"
    },
    {
        "title": "Design Patterns in PHP: Factory, Strategy, Observer & Decorator",
        "url": "/blog/design-patterns-php-factory-strategy-observer-decorator",
        "description": "Code-heavy tutorial implementing GoF design patterns in modern PHP 8.x with interface-first design and practical use cases.",
        "type": "post",
        "keywords": "Architecture PHP Design Patterns OOP SOLID Design Patterns in PHP: Factory, Strategy, Observer & Decorator Code-heavy tutorial implementing GoF design patterns in modern PHP 8.x with interface-first design and practical use cases.",
        "category": "Architecture",
        "tags": [
            "PHP",
            "Design Patterns",
            "Architecture",
            "OOP",
            "SOLID"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-laravel-octane-production-checklist/blog-laravel-octane-production-checklist-1200.webp"
    },
    {
        "title": "The Thrill of the Fix: What Solving a Hard Bug Teaches You About Your System",
        "url": "/blog/thrill-fix-solving-hard-bug-teaches-system",
        "description": "Reflects on how the most painful debugging sessions yield the deepest system knowledge, and how to capture and share that understanding with your team.",
        "type": "post",
        "keywords": "Debugging PHP Incident Review Observability Team Practices The Thrill of the Fix: What Solving a Hard Bug Teaches You About Your System Reflects on how the most painful debugging sessions yield the deepest system knowledge, and how to capture and share that understanding with your team.",
        "category": "Debugging",
        "tags": [
            "PHP",
            "Debugging",
            "Incident Review",
            "Observability",
            "Team Practices"
        ],
        "updated": "2026-05-08",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-building-cli-tools-php-symfony-console-component/blog-building-cli-tools-php-symfony-console-component-1200.webp"
    },
    {
        "title": "Contributing to Open Source as a Junior Developer: What Nobody Tells You",
        "url": "/blog/contributing-to-open-source-as-a-junior-developer-what-nobody-tells-you",
        "description": "Honest account of the challenges new developers face - imposter syndrome, intimidating codebases, slow review cycles - with concrete strategies for pushing through each one.",
        "type": "post",
        "keywords": "Open Source Junior Developers Career Growth Contributions Code Review Contributing to Open Source as a Junior Developer: What Nobody Tells You Honest account of the challenges new developers face - imposter syndrome, intimidating codebases, slow review cycles - with concrete strategies for pushing through each one.",
        "category": "Open Source",
        "tags": [
            "Open Source",
            "Junior Developers",
            "Career Growth",
            "Contributions",
            "Code Review"
        ],
        "updated": "2026-05-08",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-automated-testing-pyramid-php-unit-integration-e2e-pest/blog-automated-testing-pyramid-php-unit-integration-e2e-pest-1200.webp"
    },
    {
        "title": "PHP Async HTTP Requests With Guzzle Promises & cURL Multi Handle",
        "url": "/blog/php-async-http-requests-guzzle-promises-curl-multi-handle",
        "description": "Compares serial vs parallel HTTP calls, demonstrates Guzzle pool concurrency, and benchmarks real-world API aggregation speedups.",
        "type": "post",
        "keywords": "Performance PHP Guzzle cURL Async HTTP PHP Async HTTP Requests With Guzzle Promises & cURL Multi Handle Compares serial vs parallel HTTP calls, demonstrates Guzzle pool concurrency, and benchmarks real-world API aggregation speedups.",
        "category": "Performance",
        "tags": [
            "PHP",
            "Guzzle",
            "cURL",
            "Async HTTP",
            "Performance"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-laravel-precognition-real-time-validation-without-full-form-submission/blog-laravel-precognition-real-time-validation-without-full-form-submission-1200.webp"
    },
    {
        "title": "Code Reviews That Champion Simplicity: What to Look for and How to Say It",
        "url": "/blog/code-reviews-champion-simplicity-what-look-how-say-it",
        "description": "Gives reviewers a practical vocabulary for identifying and discussing unnecessary complexity without discouraging experimentation.",
        "type": "post",
        "keywords": "Engineering Code Review Simplicity Refactoring Team Practices Code Reviews That Champion Simplicity: What to Look for and How to Say It Gives reviewers a practical vocabulary for identifying and discussing unnecessary complexity without discouraging experimentation.",
        "category": "Engineering",
        "tags": [
            "Engineering",
            "Code Review",
            "Simplicity",
            "Refactoring",
            "Team Practices"
        ],
        "updated": "2026-05-08",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-building-cli-tools-php-symfony-console-component/blog-building-cli-tools-php-symfony-console-component-1200.webp"
    },
    {
        "title": "Laravel Eloquent Relationships: HasManyThrough, MorphMany & Performance",
        "url": "/blog/laravel-eloquent-relationships-hasmanythrough-morphmany-performance",
        "description": "Deep-dive into complex Eloquent relationships, N+1 problem detection with Telescope, eager loading strategies, and query optimization.",
        "type": "post",
        "keywords": "Laravel Eloquent Relationships Database Performance Laravel Eloquent Relationships: HasManyThrough, MorphMany & Performance Deep-dive into complex Eloquent relationships, N+1 problem detection with Telescope, eager loading strategies, and query optimization.",
        "category": "Laravel",
        "tags": [
            "Laravel",
            "Eloquent",
            "Relationships",
            "Database",
            "Performance"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/page-laravel-api-development/page-laravel-api-development-1200.webp"
    },
    {
        "title": "The Symfony Component Model: How One Framework Taught PHP to Think in Reusable Parts",
        "url": "/blog/the-symfony-component-model-how-one-framework-taught-php-to-think-in-reusable-parts",
        "description": "Traces Symfony's evolution from monolithic framework to a decoupled component library - and how that architectural shift influenced every major PHP project that followed.",
        "type": "post",
        "keywords": "Language Evolution Symfony PHP Components Architecture The Symfony Component Model: How One Framework Taught PHP to Think in Reusable Parts Traces Symfony's evolution from monolithic framework to a decoupled component library - and how that architectural shift influenced every major PHP project that followed.",
        "category": "Language Evolution",
        "tags": [
            "Language Evolution",
            "Symfony",
            "PHP",
            "Components",
            "Architecture"
        ],
        "updated": "2026-05-08",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-building-crud-apis-laravel-sanctum-authentication-2021/blog-building-crud-apis-laravel-sanctum-authentication-2021-1200.webp"
    },
    {
        "title": "Functional Thinking as a Path to Simpler Code: Pure Functions & Immutability",
        "url": "/blog/functional-thinking-path-simpler-code-pure-functions-immutability",
        "description": "Explains how functional programming ideas - pure functions, no side effects, immutable data - produce code that is dramatically easier to reason about.",
        "type": "post",
        "keywords": "Architecture PHP Functional Programming Immutability Clean Code Functional Thinking as a Path to Simpler Code: Pure Functions & Immutability Explains how functional programming ideas - pure functions, no side effects, immutable data - produce code that is dramatically easier to reason about.",
        "category": "Architecture",
        "tags": [
            "PHP",
            "Architecture",
            "Functional Programming",
            "Immutability",
            "Clean Code"
        ],
        "updated": "2026-05-08",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-automated-testing-pyramid-php-unit-integration-e2e-pest/blog-automated-testing-pyramid-php-unit-integration-e2e-pest-1200.webp"
    },
    {
        "title": "PHP Serverless With Bref on AWS Lambda: Cold Starts, Layers & Cost",
        "url": "/blog/php-serverless-with-bref-aws-lambda-cold-starts-layers-cost",
        "description": "Guide to running Laravel/Symfony on Lambda via Bref, covering layer management, cold start mitigation, and real-world cost analysis.",
        "type": "post",
        "keywords": "Tooling PHP Bref AWS Lambda Serverless Laravel Symfony PHP Serverless With Bref on AWS Lambda: Cold Starts, Layers & Cost Guide to running Laravel/Symfony on Lambda via Bref, covering layer management, cold start mitigation, and real-world cost analysis.",
        "category": "Tooling",
        "tags": [
            "PHP",
            "Bref",
            "AWS Lambda",
            "Serverless",
            "Laravel",
            "Symfony"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/page-stack/page-stack-1200.webp"
    },
    {
        "title": "Debugging Third-Party Libraries: When the Bug Is Not Your Code",
        "url": "/blog/debugging-third-party-libraries-when-bug-not-your-code",
        "description": "Guides developers through diagnosing bugs inside dependencies - reading source, bisecting versions, writing minimal reproducers, and filing useful issues.",
        "type": "post",
        "keywords": "Debugging PHP Composer Dependencies Open Source Debugging Third-Party Libraries: When the Bug Is Not Your Code Guides developers through diagnosing bugs inside dependencies - reading source, bisecting versions, writing minimal reproducers, and filing useful issues.",
        "category": "Debugging",
        "tags": [
            "PHP",
            "Debugging",
            "Composer",
            "Dependencies",
            "Open Source"
        ],
        "updated": "2026-05-08",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-automated-testing-pyramid-php-unit-integration-e2e-pest/blog-automated-testing-pyramid-php-unit-integration-e2e-pest-1200.webp"
    },
    {
        "title": "How Open Source Shaped the Modern Internet: A History Worth Knowing",
        "url": "/blog/how-open-source-shaped-modern-internet-history-worth-knowing",
        "description": "Traces the infrastructure of the modern web - Linux, Apache, OpenSSL, PostgreSQL, and Git - showing how freely shared code became the foundation everything else runs on.",
        "type": "post",
        "keywords": "Open Source Internet History Linux Apache PostgreSQL Git How Open Source Shaped the Modern Internet: A History Worth Knowing Traces the infrastructure of the modern web - Linux, Apache, OpenSSL, PostgreSQL, and Git - showing how freely shared code became the foundation everything else runs on.",
        "category": "Open Source",
        "tags": [
            "Open Source",
            "Internet History",
            "Linux",
            "Apache",
            "PostgreSQL",
            "Git"
        ],
        "updated": "2026-05-08",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-composer-best-practices-autoloading-version-constraints-monorepos/blog-composer-best-practices-autoloading-version-constraints-monorepos-1200.webp"
    },
    {
        "title": "Implementing OAuth 2.0 in PHP: Authorization Code Flow From Scratch",
        "url": "/blog/implementing-oauth-20-php-authorization-code-flow-from-scratch",
        "description": "Full implementation of OAuth 2.0 authorization code + PKCE flow in PHP, authorization endpoint, token exchange, and refresh logic.",
        "type": "post",
        "keywords": "Security PHP OAuth 2.0 PKCE Authentication Implementing OAuth 2.0 in PHP: Authorization Code Flow From Scratch Full implementation of OAuth 2.0 authorization code + PKCE flow in PHP, authorization endpoint, token exchange, and refresh logic.",
        "category": "Security",
        "tags": [
            "PHP",
            "OAuth 2.0",
            "PKCE",
            "Security",
            "Authentication"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-automated-testing-pyramid-php-unit-integration-e2e-pest/blog-automated-testing-pyramid-php-unit-integration-e2e-pest-1200.webp"
    },
    {
        "title": "How to Develop an Eye for Elegant Code: A Skill-Building Roadmap",
        "url": "/blog/how-develop-eye-elegant-code-skill-building-roadmap",
        "description": "Outlines a deliberate practice path - reading great codebases, performing kata exercises, and seeking feedback to develop aesthetic code judgment.",
        "type": "post",
        "keywords": "Clean Code PHP Practice Refactoring Code Review How to Develop an Eye for Elegant Code: A Skill-Building Roadmap Outlines a deliberate practice path - reading great codebases, performing kata exercises, and seeking feedback to develop aesthetic code judgment.",
        "category": "Clean Code",
        "tags": [
            "PHP",
            "Clean Code",
            "Practice",
            "Refactoring",
            "Code Review"
        ],
        "updated": "2026-05-08",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-composer-best-practices-autoloading-version-constraints-monorepos/blog-composer-best-practices-autoloading-version-constraints-monorepos-1200.webp"
    },
    {
        "title": "How Docker Changed the Way Developers Think About Environments Forever",
        "url": "/blog/how-docker-changed-the-way-developers-think-about-environments-forever",
        "description": "Argues that Docker's container model did not just solve deployment - it fundamentally shifted how developers conceptualise application boundaries, dependencies, and reproducibility.",
        "type": "post",
        "keywords": "Language Evolution Docker Containers DevOps Reproducibility Environments How Docker Changed the Way Developers Think About Environments Forever Argues that Docker's container model did not just solve deployment - it fundamentally shifted how developers conceptualise application boundaries, dependencies, and reproducibility.",
        "category": "Language Evolution",
        "tags": [
            "Language Evolution",
            "Docker",
            "Containers",
            "DevOps",
            "Reproducibility",
            "Environments"
        ],
        "updated": "2026-05-08",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-composer-best-practices-autoloading-version-constraints-monorepos/blog-composer-best-practices-autoloading-version-constraints-monorepos-1200.webp"
    },
    {
        "title": "When the Bug Is Not Where You Think It Is: Classic Misdirection in Debugging",
        "url": "/blog/when-bug-not-where-you-think-classic-misdirection-debugging",
        "description": "Examines common misdirection patterns - symptoms in module A caused by bugs in module B - and how to retrace assumptions when a trail goes cold.",
        "type": "post",
        "keywords": "Debugging PHP Troubleshooting Root Cause Analysis Observability When the Bug Is Not Where You Think It Is: Classic Misdirection in Debugging Examines common misdirection patterns - symptoms in module A caused by bugs in module B - and how to retrace assumptions when a trail goes cold.",
        "category": "Debugging",
        "tags": [
            "PHP",
            "Debugging",
            "Troubleshooting",
            "Root Cause Analysis",
            "Observability"
        ],
        "updated": "2026-05-08",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-composer-best-practices-autoloading-version-constraints-monorepos/blog-composer-best-practices-autoloading-version-constraints-monorepos-1200.webp"
    },
    {
        "title": "Building CLI Tools With PHP and Symfony Console Component",
        "url": "/blog/building-cli-tools-php-symfony-console-component",
        "description": "Creates a feature-rich CLI application with commands, progress bars, table output, interactive prompts, and PHAR compilation.",
        "type": "post",
        "keywords": "Tooling PHP Symfony Console CLI PHAR Building CLI Tools With PHP and Symfony Console Component Creates a feature-rich CLI application with commands, progress bars, table output, interactive prompts, and PHAR compilation.",
        "category": "Tooling",
        "tags": [
            "PHP",
            "Symfony Console",
            "CLI",
            "PHAR",
            "Tooling"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-building-cli-tools-php-symfony-console-component/blog-building-cli-tools-php-symfony-console-component-1200.webp"
    },
    {
        "title": "Forking as a Feature: How Disagreement Drives Innovation in Open Source",
        "url": "/blog/forking-as-a-feature-how-disagreement-drives-innovation-in-open-source",
        "description": "Reframes the fork not as a failure of community but as a vital mechanism - exploring famous forks like MariaDB, LibreOffice, and Node/io.js and what they produced.",
        "type": "post",
        "keywords": "Open Source Forks Governance MariaDB LibreOffice Node.js Forking as a Feature: How Disagreement Drives Innovation in Open Source Reframes the fork not as a failure of community but as a vital mechanism - exploring famous forks like MariaDB, LibreOffice, and Node/io.js and what they produced.",
        "category": "Open Source",
        "tags": [
            "Open Source",
            "Forks",
            "Governance",
            "MariaDB",
            "LibreOffice",
            "Node.js"
        ],
        "updated": "2026-05-08",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-building-crud-apis-laravel-sanctum-authentication-2021/blog-building-crud-apis-laravel-sanctum-authentication-2021-1200.webp"
    },
    {
        "title": "Linux IPv6 Configuration: Enabling, Addressing & Firewall Rules With ip6tables",
        "url": "/blog/linux-ipv6-configuration-enabling-addressing-firewall-rules-ip6tables",
        "description": "Configures static and SLAAC IPv6 addressing, sets up ip6tables firewall rules, enables Router Advertisements, and tests connectivity end-to-end.",
        "type": "post",
        "keywords": "Networking Linux IPv6 ip6tables SLAAC Router Advertisements Linux IPv6 Configuration: Enabling, Addressing & Firewall Rules With ip6tables Configures static and SLAAC IPv6 addressing, sets up ip6tables firewall rules, enables Router Advertisements, and tests connectivity end-to-end.",
        "category": "Networking",
        "tags": [
            "Linux",
            "IPv6",
            "Networking",
            "ip6tables",
            "SLAAC",
            "Router Advertisements"
        ],
        "updated": "2026-05-08",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-modern-php-development-workflow-git-ci-cd-docker-github-actions/blog-modern-php-development-workflow-git-ci-cd-docker-github-actions-1200.webp"
    },
    {
        "title": "Automated Testing Pyramid in PHP: Unit, Integration & E2E With Pest",
        "url": "/blog/automated-testing-pyramid-php-unit-integration-e2e-pest",
        "description": "Introduces Pest as an expressive PHP testing framework, demonstrates the testing pyramid, and shows parallel test execution.",
        "type": "post",
        "keywords": "Testing PHP Pest E2E CI Automated Testing Pyramid in PHP: Unit, Integration & E2E With Pest Introduces Pest as an expressive PHP testing framework, demonstrates the testing pyramid, and shows parallel test execution.",
        "category": "Testing",
        "tags": [
            "PHP",
            "Pest",
            "Testing",
            "E2E",
            "CI"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-automated-testing-pyramid-php-unit-integration-e2e-pest/blog-automated-testing-pyramid-php-unit-integration-e2e-pest-1200.webp"
    },
    {
        "title": "The Object-Oriented Revolution: How OOP Changed the Mental Model of an Entire Industry",
        "url": "/blog/the-object-oriented-revolution-how-oop-changed-the-mental-model-of-an-entire-industry",
        "description": "Examines how object-oriented thinking transformed software design in the 1990s and how its dominance shaped - and occasionally distorted - the way developers model every problem.",
        "type": "post",
        "keywords": "Language Evolution Object-Oriented Programming OOP Software Design Programming Paradigms The Object-Oriented Revolution: How OOP Changed the Mental Model of an Entire Industry Examines how object-oriented thinking transformed software design in the 1990s and how its dominance shaped - and occasionally distorted - the way developers model every problem.",
        "category": "Language Evolution",
        "tags": [
            "Language Evolution",
            "Object-Oriented Programming",
            "OOP",
            "Software Design",
            "Programming Paradigms"
        ],
        "updated": "2026-05-08",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-building-php-sdk-http-client-abstraction-retries-test-fakes/blog-building-php-sdk-http-client-abstraction-retries-test-fakes-1200.webp"
    },
    {
        "title": "The YAGNI Principle in Practice: Shipping Simple Code That Lasts",
        "url": "/blog/yagni-principle-practice-shipping-simple-code-lasts",
        "description": "Practical guide to You Aren't Gonna Need It - recognizing speculative features in code review, and techniques for deferring decisions safely.",
        "type": "post",
        "keywords": "Engineering YAGNI Simplicity Code Review Refactoring The YAGNI Principle in Practice: Shipping Simple Code That Lasts Practical guide to You Aren't Gonna Need It - recognizing speculative features in code review, and techniques for deferring decisions safely.",
        "category": "Engineering",
        "tags": [
            "Engineering",
            "YAGNI",
            "Simplicity",
            "Code Review",
            "Refactoring"
        ],
        "updated": "2026-05-08",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-building-crud-apis-laravel-sanctum-authentication-2021/blog-building-crud-apis-laravel-sanctum-authentication-2021-1200.webp"
    },
    {
        "title": "Configuring Linux Audit System: auditd Rules, Reports & Compliance",
        "url": "/blog/configuring-linux-audit-system-auditd-rules-reports-compliance",
        "description": "Sets up auditd with custom rules for file access, privilege escalation, and network-related syscalls, then generates aureport reports for compliance audits.",
        "type": "post",
        "keywords": "Security Linux auditd auditctl aureport Compliance Configuring Linux Audit System: auditd Rules, Reports & Compliance Sets up auditd with custom rules for file access, privilege escalation, and network-related syscalls, then generates aureport reports for compliance audits.",
        "category": "Security",
        "tags": [
            "Linux",
            "Security",
            "auditd",
            "auditctl",
            "aureport",
            "Compliance"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-building-multi-tenant-saas-apps-laravel-architecture-tenancy-strategies/blog-building-multi-tenant-saas-apps-laravel-architecture-tenancy-strategies-1200.webp"
    },
    {
        "title": "The Debugging Notebook: Why Writing Down Your Hypotheses Makes You Faster",
        "url": "/blog/debugging-notebook-why-writing-down-hypotheses-makes-you-faster",
        "description": "Makes the case for keeping a live debugging journal - recording what you tried, what you ruled out, and what you suspect to prevent circular thinking.",
        "type": "post",
        "keywords": "Debugging PHP Troubleshooting Incident Response Engineering Process The Debugging Notebook: Why Writing Down Your Hypotheses Makes You Faster Makes the case for keeping a live debugging journal - recording what you tried, what you ruled out, and what you suspect to prevent circular thinking.",
        "category": "Debugging",
        "tags": [
            "PHP",
            "Debugging",
            "Troubleshooting",
            "Incident Response",
            "Engineering Process"
        ],
        "updated": "2026-05-08",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-building-crud-apis-laravel-sanctum-authentication-2021/blog-building-crud-apis-laravel-sanctum-authentication-2021-1200.webp"
    },
    {
        "title": "PHP Encryption Best Practices: AES-256, Libsodium & Secure Key Management",
        "url": "/blog/php-encryption-best-practices-aes-256-libsodium-secure-key-management",
        "description": "Shows proper symmetric and asymmetric encryption, key rotation, and envelope encryption using PHP's sodium extension.",
        "type": "post",
        "keywords": "Security PHP Encryption Libsodium Key Management PHP Encryption Best Practices: AES-256, Libsodium & Secure Key Management Shows proper symmetric and asymmetric encryption, key rotation, and envelope encryption using PHP's sodium extension.",
        "category": "Security",
        "tags": [
            "PHP",
            "Security",
            "Encryption",
            "Libsodium",
            "Key Management"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-composer-best-practices-autoloading-version-constraints-monorepos/blog-composer-best-practices-autoloading-version-constraints-monorepos-1200.webp"
    },
    {
        "title": "Linux Boot Process Deep Dive: GRUB2, initramfs & systemd Target Config",
        "url": "/blog/linux-boot-process-deep-dive-grub2-initramfs-systemd-target-config",
        "description": "Traces the full boot sequence from BIOS or UEFI through GRUB2 menu configuration, initramfs hooks, systemd targets, and default runlevel setup.",
        "type": "post",
        "keywords": "Administration Linux Boot GRUB2 initramfs systemd Linux Boot Process Deep Dive: GRUB2, initramfs & systemd Target Config Traces the full boot sequence from BIOS or UEFI through GRUB2 menu configuration, initramfs hooks, systemd targets, and default runlevel setup.",
        "category": "Administration",
        "tags": [
            "Linux",
            "Boot",
            "GRUB2",
            "initramfs",
            "systemd",
            "Administration"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-optimizing-mysql-queries-php-indexes-joins-execution-plans/blog-optimizing-mysql-queries-php-indexes-joins-execution-plans-1200.webp"
    },
    {
        "title": "SQL vs NoSQL in PHP Apps: When to Use MySQL, MongoDB or Redis",
        "url": "/blog/sql-vs-nosql-php-apps-when-use-mysql-mongodb-redis",
        "description": "Decision guide comparing relational, document, and key-value stores for common PHP use cases, with code examples for all three.",
        "type": "post",
        "keywords": "Database PHP MySQL MongoDB Redis SQL vs NoSQL in PHP Apps: When to Use MySQL, MongoDB or Redis Decision guide comparing relational, document, and key-value stores for common PHP use cases, with code examples for all three.",
        "category": "Database",
        "tags": [
            "PHP",
            "MySQL",
            "MongoDB",
            "Redis",
            "Database"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-building-crud-apis-laravel-sanctum-authentication-2021/blog-building-crud-apis-laravel-sanctum-authentication-2021-1200.webp"
    },
    {
        "title": "From User to Contributor to Maintainer: The Open Source Career Path",
        "url": "/blog/from-user-to-contributor-to-maintainer-the-open-source-career-path",
        "description": "Maps the natural progression from grateful user to active contributor to trusted maintainer, with milestones, mindset shifts, and skills developed at each stage.",
        "type": "post",
        "keywords": "Open Source Maintainers Contributors Career Growth Governance From User to Contributor to Maintainer: The Open Source Career Path Maps the natural progression from grateful user to active contributor to trusted maintainer, with milestones, mindset shifts, and skills developed at each stage.",
        "category": "Open Source",
        "tags": [
            "Open Source",
            "Maintainers",
            "Contributors",
            "Career Growth",
            "Governance"
        ],
        "updated": "2026-05-08",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-composer-best-practices-autoloading-version-constraints-monorepos/blog-composer-best-practices-autoloading-version-constraints-monorepos-1200.webp"
    },
    {
        "title": "Implementing CQRS in PHP: Separating Commands and Queries for Scalability",
        "url": "/blog/implementing-cqrs-in-php-separating-commands-queries-scalability",
        "description": "Walks through a PHP CQRS implementation - command/query buses, read models, projections, and eventual consistency trade-offs.",
        "type": "post",
        "keywords": "Architecture PHP CQRS Message Bus Read Models Implementing CQRS in PHP: Separating Commands and Queries for Scalability Walks through a PHP CQRS implementation - command/query buses, read models, projections, and eventual consistency trade-offs.",
        "category": "Architecture",
        "tags": [
            "PHP",
            "CQRS",
            "Architecture",
            "Message Bus",
            "Read Models"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-composer-best-practices-autoloading-version-constraints-monorepos/blog-composer-best-practices-autoloading-version-constraints-monorepos-1200.webp"
    },
    {
        "title": "Setting Up Ansible for Linux Configuration Management: Playbooks & Roles",
        "url": "/blog/setting-up-ansible-linux-configuration-management-playbooks-roles",
        "description": "Introduction to Ansible inventory, playbooks, roles, handlers, and Vault for secrets, automating repeatable Linux server configuration at scale.",
        "type": "post",
        "keywords": "Automation Linux Ansible Playbooks Roles Vault Setting Up Ansible for Linux Configuration Management: Playbooks & Roles Introduction to Ansible inventory, playbooks, roles, handlers, and Vault for secrets, automating repeatable Linux server configuration at scale.",
        "category": "Automation",
        "tags": [
            "Linux",
            "Ansible",
            "Automation",
            "Playbooks",
            "Roles",
            "Vault"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-php-security-checklist-2020-xss-csrf-sql-injection/blog-php-security-checklist-2020-xss-csrf-sql-injection-1200.webp"
    },
    {
        "title": "Elegant Error Handling: How Simplicity Applies Beyond the Happy Path",
        "url": "/blog/elegant-error-handling-simplicity-beyond-happy-path",
        "description": "Applies elegance principles to error handling - meaningful error types, fail-fast design, and avoiding defensive code that obscures real intent.",
        "type": "post",
        "keywords": "Engineering Error Handling PHP Clean Code Reliability Elegant Error Handling: How Simplicity Applies Beyond the Happy Path Applies elegance principles to error handling - meaningful error types, fail-fast design, and avoiding defensive code that obscures real intent.",
        "category": "Engineering",
        "tags": [
            "Engineering",
            "Error Handling",
            "PHP",
            "Clean Code",
            "Reliability"
        ],
        "updated": "2026-05-08",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-composer-best-practices-autoloading-version-constraints-monorepos/blog-composer-best-practices-autoloading-version-constraints-monorepos-1200.webp"
    },
    {
        "title": "How Functional Programming Languages Quietly Reshaped Mainstream Development",
        "url": "/blog/how-functional-programming-languages-quietly-reshaped-mainstream-development",
        "description": "Traces how ideas from Haskell, Erlang, and Clojure - immutability, map/filter/reduce, pattern matching - migrated into Python, Java, JavaScript, and PHP over two decades.",
        "type": "post",
        "keywords": "Language Evolution Functional Programming Haskell Erlang Clojure Mainstream Languages How Functional Programming Languages Quietly Reshaped Mainstream Development Traces how ideas from Haskell, Erlang, and Clojure - immutability, map/filter/reduce, pattern matching - migrated into Python, Java, JavaScript, and PHP over two decades.",
        "category": "Language Evolution",
        "tags": [
            "Language Evolution",
            "Functional Programming",
            "Haskell",
            "Erlang",
            "Clojure",
            "Mainstream Languages"
        ],
        "updated": "2026-05-08",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-deploying-php-apps-aws-ec2-ecs-fargate-lambda-runtimes-guide/blog-deploying-php-apps-aws-ec2-ecs-fargate-lambda-runtimes-guide-1200.webp"
    },
    {
        "title": "Linux Kernel Module Configuration: Loading, Blacklisting & Building",
        "url": "/blog/linux-kernel-module-configuration-loading-blacklisting-building",
        "description": "Covers modprobe, /etc/modules-load.d, blacklisting problematic modules, writing a minimal kernel module in C, and signing for Secure Boot.",
        "type": "post",
        "keywords": "Administration Linux Kernel Modules modprobe Secure Boot C Linux Kernel Module Configuration: Loading, Blacklisting & Building Covers modprobe, /etc/modules-load.d, blacklisting problematic modules, writing a minimal kernel module in C, and signing for Secure Boot.",
        "category": "Administration",
        "tags": [
            "Linux",
            "Kernel Modules",
            "modprobe",
            "Secure Boot",
            "C",
            "Administration"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-integrating-stripe-payments-laravel-subscriptions-webhooks-guide/blog-integrating-stripe-payments-laravel-subscriptions-webhooks-guide-1200.webp"
    },
    {
        "title": "Using a Debugger Properly: Breakpoints, Watch Expressions & Call Stack Inspection",
        "url": "/blog/using-debugger-properly-breakpoints-watch-expressions-call-stack-inspection",
        "description": "Goes beyond print statements to teach conditional breakpoints, logpoints, memory inspection, and stepping strategies in modern debugger tooling.",
        "type": "post",
        "keywords": "Debugging PHP Xdebug Breakpoints Tooling Using a Debugger Properly: Breakpoints, Watch Expressions & Call Stack Inspection Goes beyond print statements to teach conditional breakpoints, logpoints, memory inspection, and stepping strategies in modern debugger tooling.",
        "category": "Debugging",
        "tags": [
            "PHP",
            "Debugging",
            "Xdebug",
            "Breakpoints",
            "Tooling"
        ],
        "updated": "2026-05-08",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-composer-best-practices-autoloading-version-constraints-monorepos/blog-composer-best-practices-autoloading-version-constraints-monorepos-1200.webp"
    },
    {
        "title": "Laravel Octane: Turbocharged PHP With Swoole & RoadRunner in Production",
        "url": "/blog/laravel-octane-turbocharged-php-swoole-roadrunner-production",
        "description": "Explains how Octane boots your app once per worker, covers stateful pitfalls, memory leaks, and production deployment considerations.",
        "type": "post",
        "keywords": "Laravel Laravel Octane Swoole RoadRunner Performance Laravel Octane: Turbocharged PHP With Swoole & RoadRunner in Production Explains how Octane boots your app once per worker, covers stateful pitfalls, memory leaks, and production deployment considerations.",
        "category": "Laravel",
        "tags": [
            "Laravel",
            "Laravel Octane",
            "Swoole",
            "RoadRunner",
            "Performance"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-building-php-sdk-http-client-abstraction-retries-test-fakes/blog-building-php-sdk-http-client-abstraction-retries-test-fakes-1200.webp"
    },
    {
        "title": "Why Documentation Is the Most Undervalued Contribution in Open Source",
        "url": "/blog/why-documentation-is-the-most-undervalued-contribution-in-open-source",
        "description": "Makes the case that great documentation multiplies the impact of every other contribution, and gives a practical framework for writing docs that actually help newcomers.",
        "type": "post",
        "keywords": "Open Source Documentation Technical Writing Contributors Community Why Documentation Is the Most Undervalued Contribution in Open Source Makes the case that great documentation multiplies the impact of every other contribution, and gives a practical framework for writing docs that actually help newcomers.",
        "category": "Open Source",
        "tags": [
            "Open Source",
            "Documentation",
            "Technical Writing",
            "Contributors",
            "Community"
        ],
        "updated": "2026-05-08",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-building-php-sdk-http-client-abstraction-retries-test-fakes/blog-building-php-sdk-http-client-abstraction-retries-test-fakes-1200.webp"
    },
    {
        "title": "Deploying PHP Apps to AWS: EC2, ECS Fargate & Lambda Runtimes Guide",
        "url": "/blog/deploying-php-apps-aws-ec2-ecs-fargate-lambda-runtimes-guide",
        "description": "Compares deployment approaches for PHP on AWS - from traditional EC2 to containerized Fargate and serverless Bref Lambda functions.",
        "type": "post",
        "keywords": "Tooling PHP AWS EC2 ECS Fargate Lambda Bref Deploying PHP Apps to AWS: EC2, ECS Fargate & Lambda Runtimes Guide Compares deployment approaches for PHP on AWS - from traditional EC2 to containerized Fargate and serverless Bref Lambda functions.",
        "category": "Tooling",
        "tags": [
            "PHP",
            "AWS",
            "EC2",
            "ECS Fargate",
            "Lambda",
            "Bref"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-deploying-php-apps-aws-ec2-ecs-fargate-lambda-runtimes-guide/blog-deploying-php-apps-aws-ec2-ecs-fargate-lambda-runtimes-guide-1200.webp"
    },
    {
        "title": "Configuring Samba on Linux: File Shares, Active Directory & Permissions",
        "url": "/blog/configuring-samba-linux-file-shares-active-directory-permissions",
        "description": "Sets up Samba shares with user authentication, joins Linux to Windows Active Directory with Winbind, and maps UNIX/Windows permissions.",
        "type": "post",
        "keywords": "Storage Linux Samba SMB Active Directory Permissions Configuring Samba on Linux: File Shares, Active Directory & Permissions Sets up Samba shares with user authentication, joins Linux to Windows Active Directory with Winbind, and maps UNIX/Windows permissions.",
        "category": "Storage",
        "tags": [
            "Linux",
            "Samba",
            "SMB",
            "Active Directory",
            "Storage",
            "Permissions"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/page-services-laravel/page-services-laravel-1200.webp"
    },
    {
        "title": "Linux Namespace and cgroup Fundamentals: How Containers Really Work",
        "url": "/blog/linux-namespace-cgroup-fundamentals-how-containers-really-work",
        "description": "Explores PID, network, mount, UTS, IPC, and user namespaces, linking them to cgroups to show the foundations of container isolation.",
        "type": "post",
        "keywords": "Administration Linux Containers Namespaces cgroups Isolation Linux Namespace and cgroup Fundamentals: How Containers Really Work Explores PID, network, mount, UTS, IPC, and user namespaces, linking them to cgroups to show the foundations of container isolation.",
        "category": "Administration",
        "tags": [
            "Linux",
            "Containers",
            "Namespaces",
            "cgroups",
            "Administration",
            "Isolation"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-database-migrations-best-practices-laravel-rollbacks-seeds-factories/blog-database-migrations-best-practices-laravel-rollbacks-seeds-factories-1200.webp"
    },
    {
        "title": "Debugging Race Conditions and Concurrency Bugs: A Practical Field Guide",
        "url": "/blog/debugging-race-conditions-concurrency-bugs-practical-field-guide",
        "description": "Tackles the hardest class of bugs - race conditions, deadlocks, and stale reads - with thread sanitiser tools, lock analysis, and deterministic replay.",
        "type": "post",
        "keywords": "Debugging PHP Concurrency Race Conditions Deadlocks Debugging Race Conditions and Concurrency Bugs: A Practical Field Guide Tackles the hardest class of bugs - race conditions, deadlocks, and stale reads - with thread sanitiser tools, lock analysis, and deterministic replay.",
        "category": "Debugging",
        "tags": [
            "PHP",
            "Debugging",
            "Concurrency",
            "Race Conditions",
            "Deadlocks"
        ],
        "updated": "2026-05-08",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-building-php-sdk-http-client-abstraction-retries-test-fakes/blog-building-php-sdk-http-client-abstraction-retries-test-fakes-1200.webp"
    },
    {
        "title": "Writing Code for Humans First: Readability as a Professional Responsibility",
        "url": "/blog/writing-code-humans-first-readability-professional-responsibility",
        "description": "Makes the case that code is read far more than it is written, and that optimising for the reader is the most impactful thing a developer can do.",
        "type": "post",
        "keywords": "Clean Code PHP Readability Code Review Maintainability Writing Code for Humans First: Readability as a Professional Responsibility Makes the case that code is read far more than it is written, and that optimising for the reader is the most impactful thing a developer can do.",
        "category": "Clean Code",
        "tags": [
            "PHP",
            "Clean Code",
            "Readability",
            "Code Review",
            "Maintainability"
        ],
        "updated": "2026-05-08",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-building-php-sdk-http-client-abstraction-retries-test-fakes/blog-building-php-sdk-http-client-abstraction-retries-test-fakes-1200.webp"
    },
    {
        "title": "From Callbacks to Promises to Async/Await: How Async Thinking Evolved in JavaScript",
        "url": "/blog/from-callbacks-to-promises-to-async-await-how-async-thinking-evolved-in-javascript",
        "description": "Traces the decade-long evolution of asynchronous JavaScript - how each abstraction layer changed how developers reason about time, concurrency, and error handling.",
        "type": "post",
        "keywords": "Language Evolution JavaScript Async Await Promises Callbacks Event Loop From Callbacks to Promises to Async/Await: How Async Thinking Evolved in JavaScript Traces the decade-long evolution of asynchronous JavaScript - how each abstraction layer changed how developers reason about time, concurrency, and error handling.",
        "category": "Language Evolution",
        "tags": [
            "Language Evolution",
            "JavaScript",
            "Async Await",
            "Promises",
            "Callbacks",
            "Event Loop"
        ],
        "updated": "2026-05-08",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-database-indexing-strategies-php-apps-b-trees-full-text-composite/blog-database-indexing-strategies-php-apps-b-trees-full-text-composite-1200.webp"
    },
    {
        "title": "PHP 8.3 Features: Typed Class Constants, json_validate() & More",
        "url": "/blog/php-83-features-typed-class-constants-json-validate-more",
        "description": "Comprehensive coverage of PHP 8.3 additions: typed class constants, json_validate(), mb_str_pad(), Randomizer improvements, and migration notes for PHP 8.2 teams.",
        "type": "post",
        "keywords": "Core PHP PHP PHP 8.3 Type System Migration PHP 8.3 Features: Typed Class Constants, json_validate() & More Comprehensive coverage of PHP 8.3 additions: typed class constants, json_validate(), mb_str_pad(), Randomizer improvements, and migration notes for PHP 8.2 teams.",
        "category": "Core PHP",
        "tags": [
            "PHP",
            "PHP 8.3",
            "Core PHP",
            "Type System",
            "Migration"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-database-indexing-strategies-php-apps-b-trees-full-text-composite/blog-database-indexing-strategies-php-apps-b-trees-full-text-composite-1200.webp"
    },
    {
        "title": "Hardening Linux SSH: 2FA With Google Authenticator & Certificate Auth",
        "url": "/blog/hardening-linux-ssh-2fa-google-authenticator-certificate-auth",
        "description": "Implements SSH two-factor authentication with the Google Authenticator PAM module and OpenSSH certificate authority authentication for controlled server access.",
        "type": "post",
        "keywords": "Security Linux SSH OpenSSH MFA Certificates Hardening Linux SSH: 2FA With Google Authenticator & Certificate Auth Implements SSH two-factor authentication with the Google Authenticator PAM module and OpenSSH certificate authority authentication for controlled server access.",
        "category": "Security",
        "tags": [
            "Linux",
            "SSH",
            "OpenSSH",
            "Security",
            "MFA",
            "Certificates"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/site-og/site-og-1200.webp"
    },
    {
        "title": "The Economics of Open Source: Sponsorships, Grants & Building a Sustainable Income",
        "url": "/blog/the-economics-of-open-source-sponsorships-grants-building-a-sustainable-income",
        "description": "Surveys funding models for open source developers - GitHub Sponsors, Open Collective, Tidelift, consulting arrangements, and dual-licensing strategies.",
        "type": "post",
        "keywords": "Open Source Sustainability Maintainers Funding Software Business The Economics of Open Source: Sponsorships, Grants & Building a Sustainable Income Surveys funding models for open source developers - GitHub Sponsors, Open Collective, Tidelift, consulting arrangements, and dual-licensing strategies.",
        "category": "Open Source",
        "tags": [
            "Open Source",
            "Sustainability",
            "Maintainers",
            "Funding",
            "Software Business"
        ],
        "updated": "2026-05-08",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-deploying-php-apps-aws-ec2-ecs-fargate-lambda-runtimes-guide/blog-deploying-php-apps-aws-ec2-ecs-fargate-lambda-runtimes-guide-1200.webp"
    },
    {
        "title": "API Versioning in PHP: Strategies, URL Paths & Header-Based Approaches",
        "url": "/blog/api-versioning-in-php-strategies-url-paths-header-based-approaches",
        "description": "Evaluates URL path, query string, header, and media-type versioning with PHP implementation examples and backwards-compatibility tips.",
        "type": "post",
        "keywords": "APIs PHP REST Versioning Backwards Compatibility API Versioning in PHP: Strategies, URL Paths & Header-Based Approaches Evaluates URL path, query string, header, and media-type versioning with PHP implementation examples and backwards-compatibility tips.",
        "category": "APIs",
        "tags": [
            "PHP",
            "APIs",
            "REST",
            "Versioning",
            "Backwards Compatibility"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-api-versioning-in-php-strategies-url-paths-header-based-approaches/blog-api-versioning-in-php-strategies-url-paths-header-based-approaches-1200.webp"
    },
    {
        "title": "Simple Abstractions vs Leaky Ones: How to Tell the Difference",
        "url": "/blog/simple-abstractions-vs-leaky-ones-how-tell-difference",
        "description": "Defines what makes an abstraction genuinely useful versus one that forces callers to understand its internals to use it correctly.",
        "type": "post",
        "keywords": "Architecture PHP Abstractions Interfaces Design Simple Abstractions vs Leaky Ones: How to Tell the Difference Defines what makes an abstraction genuinely useful versus one that forces callers to understand its internals to use it correctly.",
        "category": "Architecture",
        "tags": [
            "PHP",
            "Architecture",
            "Abstractions",
            "Interfaces",
            "Design"
        ],
        "updated": "2026-05-08",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-deploying-php-apps-aws-ec2-ecs-fargate-lambda-runtimes-guide/blog-deploying-php-apps-aws-ec2-ecs-fargate-lambda-runtimes-guide-1200.webp"
    },
    {
        "title": "Linux High Availability With Keepalived: VRRP & Failover Configuration",
        "url": "/blog/linux-high-availability-keepalived-vrrp-failover-configuration",
        "description": "Sets up Keepalived VRRP for virtual IP failover, configures health check scripts, tracks interface state, and tests manual failover.",
        "type": "post",
        "keywords": "Networking Linux Keepalived VRRP High Availability Failover Linux High Availability With Keepalived: VRRP & Failover Configuration Sets up Keepalived VRRP for virtual IP failover, configures health check scripts, tracks interface state, and tests manual failover.",
        "category": "Networking",
        "tags": [
            "Linux",
            "Keepalived",
            "VRRP",
            "High Availability",
            "Networking",
            "Failover"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-api-versioning-in-php-strategies-url-paths-header-based-approaches/blog-api-versioning-in-php-strategies-url-paths-header-based-approaches-1200.webp"
    },
    {
        "title": "PHP Microservices With RoadRunner: High-Performance Worker Pattern Explained",
        "url": "/blog/php-microservices-with-roadrunner-high-performance-worker-pattern-explained",
        "description": "Introduces RoadRunner as a Go-based PHP app server, covering worker loops, middleware, HTTP/2, and benchmarks vs php-fpm.",
        "type": "post",
        "keywords": "Performance PHP RoadRunner Microservices Workers PHP Microservices With RoadRunner: High-Performance Worker Pattern Explained Introduces RoadRunner as a Go-based PHP app server, covering worker loops, middleware, HTTP/2, and benchmarks vs php-fpm.",
        "category": "Performance",
        "tags": [
            "PHP",
            "RoadRunner",
            "Microservices",
            "Performance",
            "Workers"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-modern-php-development-workflow-git-ci-cd-docker-github-actions/blog-modern-php-development-workflow-git-ci-cd-docker-github-actions-1200.webp"
    },
    {
        "title": "How to Reproduce a Bug Reliably: The Most Underrated Debugging Skill",
        "url": "/blog/how-reproduce-bug-reliably-most-underrated-debugging-skill",
        "description": "Argues that reliable reproduction is 80% of the solution, covering environment snapshots, seed data, request replay, and minimising the reproduction case.",
        "type": "post",
        "keywords": "Debugging PHP Reproduction Testing Incident Response How to Reproduce a Bug Reliably: The Most Underrated Debugging Skill Argues that reliable reproduction is 80% of the solution, covering environment snapshots, seed data, request replay, and minimising the reproduction case.",
        "category": "Debugging",
        "tags": [
            "PHP",
            "Debugging",
            "Reproduction",
            "Testing",
            "Incident Response"
        ],
        "updated": "2026-05-08",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-deploying-php-apps-aws-ec2-ecs-fargate-lambda-runtimes-guide/blog-deploying-php-apps-aws-ec2-ecs-fargate-lambda-runtimes-guide-1200.webp"
    },
    {
        "title": "The Laravel Effect: How One Framework Made PHP Developers Think in Elegant Patterns",
        "url": "/blog/the-laravel-effect-how-one-framework-made-php-developers-think-in-elegant-patterns",
        "description": "Documents how Laravel introduced expressive APIs, Eloquent ORM, and a developer-experience philosophy that fundamentally raised expectations across the entire PHP ecosystem.",
        "type": "post",
        "keywords": "Language Evolution Laravel PHP Eloquent Developer Experience Frameworks The Laravel Effect: How One Framework Made PHP Developers Think in Elegant Patterns Documents how Laravel introduced expressive APIs, Eloquent ORM, and a developer-experience philosophy that fundamentally raised expectations across the entire PHP ecosystem.",
        "category": "Language Evolution",
        "tags": [
            "Language Evolution",
            "Laravel",
            "PHP",
            "Eloquent",
            "Developer Experience",
            "Frameworks"
        ],
        "updated": "2026-05-08",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-api-versioning-in-php-strategies-url-paths-header-based-approaches/blog-api-versioning-in-php-strategies-url-paths-header-based-approaches-1200.webp"
    },
    {
        "title": "Building Multi-Tenant SaaS Apps in Laravel: Architecture & Tenancy Strategies",
        "url": "/blog/building-multi-tenant-saas-apps-laravel-architecture-tenancy-strategies",
        "description": "Compares single-database, multi-database, and schema-based tenancy with practical code for middleware, scoping, and data isolation.",
        "type": "post",
        "keywords": "Laravel SaaS Multi Tenancy Architecture Database Building Multi-Tenant SaaS Apps in Laravel: Architecture & Tenancy Strategies Compares single-database, multi-database, and schema-based tenancy with practical code for middleware, scoping, and data isolation.",
        "category": "Laravel",
        "tags": [
            "Laravel",
            "SaaS",
            "Multi Tenancy",
            "Architecture",
            "Database"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-building-multi-tenant-saas-apps-laravel-architecture-tenancy-strategies/blog-building-multi-tenant-saas-apps-laravel-architecture-tenancy-strategies-1200.webp"
    },
    {
        "title": "How to Maintain an Open Source Project Without It Consuming Your Life",
        "url": "/blog/how-to-maintain-an-open-source-project-without-it-consuming-your-life",
        "description": "Practical boundaries and systems for maintainers - issue triage templates, bot automation, co-maintainer onboarding, and how to say no without guilt.",
        "type": "post",
        "keywords": "Open Source Maintainers Triage Automation Sustainability How to Maintain an Open Source Project Without It Consuming Your Life Practical boundaries and systems for maintainers - issue triage templates, bot automation, co-maintainer onboarding, and how to say no without guilt.",
        "category": "Open Source",
        "tags": [
            "Open Source",
            "Maintainers",
            "Triage",
            "Automation",
            "Sustainability"
        ],
        "updated": "2026-05-08",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-database-indexing-strategies-php-apps-b-trees-full-text-composite/blog-database-indexing-strategies-php-apps-b-trees-full-text-composite-1200.webp"
    },
    {
        "title": "Configuring PostgreSQL on Linux: Authentication, Tuning & Replication",
        "url": "/blog/configuring-postgresql-linux-authentication-tuning-replication",
        "description": "Covers pg_hba.conf authentication methods, postgresql.conf memory and connection tuning, WAL-based streaming replication, and pg_stat monitoring.",
        "type": "post",
        "keywords": "Database Linux PostgreSQL Replication Tuning Monitoring Configuring PostgreSQL on Linux: Authentication, Tuning & Replication Covers pg_hba.conf authentication methods, postgresql.conf memory and connection tuning, WAL-based streaming replication, and pg_stat monitoring.",
        "category": "Database",
        "tags": [
            "Linux",
            "PostgreSQL",
            "Database",
            "Replication",
            "Tuning",
            "Monitoring"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-optimizing-mysql-queries-php-indexes-joins-execution-plans/blog-optimizing-mysql-queries-php-indexes-joins-execution-plans-1200.webp"
    },
    {
        "title": "Linux Resource Limits: ulimit, cgroups v2 & Systemd Slice Configuration",
        "url": "/blog/linux-resource-limits-ulimit-cgroups-v2-systemd-slice-configuration",
        "description": "Sets per-user and per-process limits with ulimit and /etc/security/limits.conf, then manages resources with cgroups v2 and systemd slices.",
        "type": "post",
        "keywords": "Administration Linux systemd cgroups PAM Performance Linux Resource Limits: ulimit, cgroups v2 & Systemd Slice Configuration Sets per-user and per-process limits with ulimit and /etc/security/limits.conf, then manages resources with cgroups v2 and systemd slices.",
        "category": "Administration",
        "tags": [
            "Linux",
            "Administration",
            "systemd",
            "cgroups",
            "PAM",
            "Performance"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-composer-best-practices-autoloading-version-constraints-monorepos/blog-composer-best-practices-autoloading-version-constraints-monorepos-1200.webp"
    },
    {
        "title": "Memory Leaks and Infinite Loops: Debugging the Bugs That Hide in Plain Sight",
        "url": "/blog/memory-leaks-infinite-loops-debugging-bugs-hide-plain-sight",
        "description": "Methodical approach to diagnosing memory leaks and infinite loops - profiler usage, heap snapshots, watchdog timers, and systematic reproduction steps.",
        "type": "post",
        "keywords": "Debugging PHP Memory Leaks Profiling Reliability Memory Leaks and Infinite Loops: Debugging the Bugs That Hide in Plain Sight Methodical approach to diagnosing memory leaks and infinite loops - profiler usage, heap snapshots, watchdog timers, and systematic reproduction steps.",
        "category": "Debugging",
        "tags": [
            "PHP",
            "Debugging",
            "Memory Leaks",
            "Profiling",
            "Reliability"
        ],
        "updated": "2026-05-08",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-database-indexing-strategies-php-apps-b-trees-full-text-composite/blog-database-indexing-strategies-php-apps-b-trees-full-text-composite-1200.webp"
    },
    {
        "title": "The Art of Knowing What to Delete: Elegance Through Subtraction",
        "url": "/blog/art-knowing-what-delete-elegance-through-subtraction",
        "description": "Shows how the most impactful refactors remove code rather than add it - dead branches, redundant layers, and abstractions that outlived their purpose.",
        "type": "post",
        "keywords": "Engineering Refactoring Simplicity Dead Code Code Quality The Art of Knowing What to Delete: Elegance Through Subtraction Shows how the most impactful refactors remove code rather than add it - dead branches, redundant layers, and abstractions that outlived their purpose.",
        "category": "Engineering",
        "tags": [
            "Engineering",
            "Refactoring",
            "Simplicity",
            "Dead Code",
            "Code Quality"
        ],
        "updated": "2026-05-08",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-database-indexing-strategies-php-apps-b-trees-full-text-composite/blog-database-indexing-strategies-php-apps-b-trees-full-text-composite-1200.webp"
    },
    {
        "title": "Working With PHP Attributes: Replace Annotations With Native Metadata",
        "url": "/blog/working-with-php-attributes-replace-annotations-native-metadata",
        "description": "Shows how to write, read, and validate PHP 8 Attributes, and how frameworks like Symfony and Doctrine are adopting them internally.",
        "type": "post",
        "keywords": "Core PHP PHP Attributes PHP 8 Symfony Doctrine Working With PHP Attributes: Replace Annotations With Native Metadata Shows how to write, read, and validate PHP 8 Attributes, and how frameworks like Symfony and Doctrine are adopting them internally.",
        "category": "Core PHP",
        "tags": [
            "PHP",
            "Attributes",
            "PHP 8",
            "Symfony",
            "Doctrine"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-optimizing-mysql-queries-php-indexes-joins-execution-plans/blog-optimizing-mysql-queries-php-indexes-joins-execution-plans-1200.webp"
    },
    {
        "title": "Open Source Governance Models: BDFL, Committees & Foundation-Led Projects",
        "url": "/blog/open-source-governance-models-bdfl-committees-foundation-led-projects",
        "description": "Compares how major projects make decisions - from Linus Torvalds' Linux model to Python's steering council and Apache Foundation's committee structure.",
        "type": "post",
        "keywords": "Open Source Governance Maintainers Foundations Software Culture Open Source Governance Models: BDFL, Committees & Foundation-Led Projects Compares how major projects make decisions - from Linus Torvalds' Linux model to Python's steering council and Apache Foundation's committee structure.",
        "category": "Open Source",
        "tags": [
            "Open Source",
            "Governance",
            "Maintainers",
            "Foundations",
            "Software Culture"
        ],
        "updated": "2026-05-08",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-api-versioning-in-php-strategies-url-paths-header-based-approaches/blog-api-versioning-in-php-strategies-url-paths-header-based-approaches-1200.webp"
    },
    {
        "title": "How Rust Changes the Way You Think About Memory Forever",
        "url": "/blog/how-rust-changes-the-way-you-think-about-memory-forever",
        "description": "Explores how Rust's ownership model does not just prevent bugs - it instils a permanent mental model of memory lifetimes that improves how developers reason in every language they return to.",
        "type": "post",
        "keywords": "Language Evolution Rust Ownership Borrowing Lifetimes Memory Safety How Rust Changes the Way You Think About Memory Forever Explores how Rust's ownership model does not just prevent bugs - it instils a permanent mental model of memory lifetimes that improves how developers reason in every language they return to.",
        "category": "Language Evolution",
        "tags": [
            "Language Evolution",
            "Rust",
            "Ownership",
            "Borrowing",
            "Lifetimes",
            "Memory Safety"
        ],
        "updated": "2026-05-08",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-modern-php-development-workflow-git-ci-cd-docker-github-actions/blog-modern-php-development-workflow-git-ci-cd-docker-github-actions-1200.webp"
    },
    {
        "title": "Setting Up a Linux DNS Server With BIND9: Zones, Records & DNSSEC",
        "url": "/blog/setting-up-linux-dns-server-bind9-zones-records-dnssec",
        "description": "Configures BIND9 authoritative and recursive resolvers, writes forward and reverse zone files, enables DNSSEC signing, and tests with dig.",
        "type": "post",
        "keywords": "Networking Linux BIND9 DNS DNSSEC Ubuntu Setting Up a Linux DNS Server With BIND9: Zones, Records & DNSSEC Configures BIND9 authoritative and recursive resolvers, writes forward and reverse zone files, enables DNSSEC signing, and tests with dig.",
        "category": "Networking",
        "tags": [
            "Linux",
            "BIND9",
            "DNS",
            "DNSSEC",
            "Networking",
            "Ubuntu"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-laravel-octane-production-checklist/blog-laravel-octane-production-checklist-1200.webp"
    },
    {
        "title": "PHP Static Analysis With PHPStan & Psalm: Catch Bugs Before Runtime",
        "url": "/blog/php-static-analysis-with-phpstan-psalm-catch-bugs-before-runtime",
        "description": "Compares PHPStan and Psalm, covers level configuration, baseline management, custom rules, and CI integration for zero-defect deploys.",
        "type": "post",
        "keywords": "Testing PHP PHPStan Psalm Static Analysis PHP Static Analysis With PHPStan & Psalm: Catch Bugs Before Runtime Compares PHPStan and Psalm, covers level configuration, baseline management, custom rules, and CI integration for zero-defect deploys.",
        "category": "Testing",
        "tags": [
            "PHP",
            "Testing",
            "PHPStan",
            "Psalm",
            "Static Analysis"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-php-security-checklist-2020-xss-csrf-sql-injection/blog-php-security-checklist-2020-xss-csrf-sql-injection-1200.webp"
    },
    {
        "title": "Linux Container Networking: Bridges, veth Pairs & iptables Deep Dive",
        "url": "/blog/linux-container-networking-bridges-veth-pairs-iptables-deep-dive",
        "description": "Explains how Docker and LXC use Linux bridges, veth pairs, network namespaces, and iptables NAT rules for container connectivity.",
        "type": "post",
        "keywords": "Networking Linux Containers Docker LXC iptables Linux Container Networking: Bridges, veth Pairs & iptables Deep Dive Explains how Docker and LXC use Linux bridges, veth pairs, network namespaces, and iptables NAT rules for container connectivity.",
        "category": "Networking",
        "tags": [
            "Linux",
            "Containers",
            "Docker",
            "LXC",
            "Networking",
            "iptables"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-database-indexing-strategies-php-apps-b-trees-full-text-composite/blog-database-indexing-strategies-php-apps-b-trees-full-text-composite-1200.webp"
    },
    {
        "title": "The Role of Logging in Debugging: What to Log, What to Skip & How to Search It",
        "url": "/blog/role-logging-debugging-what-log-skip-how-search-it",
        "description": "Designs a logging strategy that makes future debugging fast - structured log fields, correlation IDs, appropriate log levels, and querying with grep and jq.",
        "type": "post",
        "keywords": "Debugging PHP Logging Observability Tooling The Role of Logging in Debugging: What to Log, What to Skip & How to Search It Designs a logging strategy that makes future debugging fast - structured log fields, correlation IDs, appropriate log levels, and querying with grep and jq.",
        "category": "Debugging",
        "tags": [
            "PHP",
            "Debugging",
            "Logging",
            "Observability",
            "Tooling"
        ],
        "updated": "2026-05-08",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-api-versioning-in-php-strategies-url-paths-header-based-approaches/blog-api-versioning-in-php-strategies-url-paths-header-based-approaches-1200.webp"
    },
    {
        "title": "Integrating Stripe Payments in Laravel: Subscriptions & Webhooks Guide",
        "url": "/blog/integrating-stripe-payments-laravel-subscriptions-webhooks-guide",
        "description": "Step-by-step Stripe Checkout integration covering recurring billing, webhook verification, idempotency, and failed-payment handling.",
        "type": "post",
        "keywords": "Laravel Stripe Payments Subscriptions Webhooks Integrating Stripe Payments in Laravel: Subscriptions & Webhooks Guide Step-by-step Stripe Checkout integration covering recurring billing, webhook verification, idempotency, and failed-payment handling.",
        "category": "Laravel",
        "tags": [
            "Laravel",
            "Stripe",
            "Payments",
            "Subscriptions",
            "Webhooks"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-integrating-stripe-payments-laravel-subscriptions-webhooks-guide/blog-integrating-stripe-payments-laravel-subscriptions-webhooks-guide-1200.webp"
    },
    {
        "title": "Naming Things Well: The Single Biggest Step Toward Elegant Code",
        "url": "/blog/naming-things-well-single-biggest-step-toward-elegant-code",
        "description": "Argues that precise, honest naming is the foundation of simplicity - covering variables, functions, classes, and the discipline of renaming when meaning shifts.",
        "type": "post",
        "keywords": "Clean Code PHP Naming Refactoring Readability Naming Things Well: The Single Biggest Step Toward Elegant Code Argues that precise, honest naming is the foundation of simplicity - covering variables, functions, classes, and the discipline of renaming when meaning shifts.",
        "category": "Clean Code",
        "tags": [
            "PHP",
            "Clean Code",
            "Naming",
            "Refactoring",
            "Readability"
        ],
        "updated": "2026-05-08",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-api-versioning-in-php-strategies-url-paths-header-based-approaches/blog-api-versioning-in-php-strategies-url-paths-header-based-approaches-1200.webp"
    },
    {
        "title": "Configuring Redis on Linux: Persistence, Memory Limits & Replication",
        "url": "/blog/configuring-redis-linux-persistence-memory-limits-replication",
        "description": "Tunes redis.conf for production: RDB and AOF persistence, maxmemory policies, bind address, password auth, and primary-replica replication.",
        "type": "post",
        "keywords": "Database Redis Linux Persistence Replication Operations Configuring Redis on Linux: Persistence, Memory Limits & Replication Tunes redis.conf for production: RDB and AOF persistence, maxmemory policies, bind address, password auth, and primary-replica replication.",
        "category": "Database",
        "tags": [
            "Redis",
            "Linux",
            "Database",
            "Persistence",
            "Replication",
            "Operations"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-laravel-octane-production-checklist/blog-laravel-octane-production-checklist-1200.webp"
    },
    {
        "title": "The Art of Writing a Good Pull Request: What Open Source Maintainers Actually Want",
        "url": "/blog/the-art-of-writing-a-good-pull-request-what-open-source-maintainers-actually-want",
        "description": "Covers what separates accepted PRs from rejected ones - focused scope, clear description, linked issues, passing tests, and respectful engagement with feedback.",
        "type": "post",
        "keywords": "Open Source Pull Requests Code Review Maintainers Collaboration The Art of Writing a Good Pull Request: What Open Source Maintainers Actually Want Covers what separates accepted PRs from rejected ones - focused scope, clear description, linked issues, passing tests, and respectful engagement with feedback.",
        "category": "Open Source",
        "tags": [
            "Open Source",
            "Pull Requests",
            "Code Review",
            "Maintainers",
            "Collaboration"
        ],
        "updated": "2026-05-08",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-modern-php-development-workflow-git-ci-cd-docker-github-actions/blog-modern-php-development-workflow-git-ci-cd-docker-github-actions-1200.webp"
    },
    {
        "title": "The Go Language Philosophy: How Simplicity and Constraints Produce Better Engineers",
        "url": "/blog/the-go-language-philosophy-how-simplicity-and-constraints-produce-better-engineers",
        "description": "Examines how Go's deliberate omissions - no generics for years, no inheritance, minimal syntax - force developers to solve problems differently and value clarity over cleverness.",
        "type": "post",
        "keywords": "Language Evolution Go Simplicity Software Engineering Generics Interfaces The Go Language Philosophy: How Simplicity and Constraints Produce Better Engineers Examines how Go's deliberate omissions - no generics for years, no inheritance, minimal syntax - force developers to solve problems differently and value clarity over cleverness.",
        "category": "Language Evolution",
        "tags": [
            "Language Evolution",
            "Go",
            "Simplicity",
            "Software Engineering",
            "Generics",
            "Interfaces"
        ],
        "updated": "2026-05-08",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-building-multi-tenant-saas-apps-laravel-architecture-tenancy-strategies/blog-building-multi-tenant-saas-apps-laravel-architecture-tenancy-strategies-1200.webp"
    },
    {
        "title": "Event-Driven Architecture in PHP: Events, Listeners & Message Buses",
        "url": "/blog/event-driven-architecture-php-events-listeners-message-buses",
        "description": "Implements a simple in-process event bus in PHP, then scales to RabbitMQ and Symfony Messenger for distributed event processing.",
        "type": "post",
        "keywords": "Architecture PHP Events RabbitMQ Symfony Messenger Event-Driven Architecture in PHP: Events, Listeners & Message Buses Implements a simple in-process event bus in PHP, then scales to RabbitMQ and Symfony Messenger for distributed event processing.",
        "category": "Architecture",
        "tags": [
            "PHP",
            "Architecture",
            "Events",
            "RabbitMQ",
            "Symfony Messenger"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/page-services-laravel/page-services-laravel-1200.webp"
    },
    {
        "title": "Linux Disk Encryption With LUKS: Full-Disk & Container Encryption",
        "url": "/blog/linux-disk-encryption-luks-full-disk-container-encryption",
        "description": "Encrypts partitions and loop devices with LUKS2, manages key slots, sets up auto-unlock with TPM2, and configures /etc/crypttab.",
        "type": "post",
        "keywords": "Security Linux LUKS cryptsetup systemd TPM2 Linux Disk Encryption With LUKS: Full-Disk & Container Encryption Encrypts partitions and loop devices with LUKS2, manages key slots, sets up auto-unlock with TPM2, and configures /etc/crypttab.",
        "category": "Security",
        "tags": [
            "Linux",
            "LUKS",
            "cryptsetup",
            "Security",
            "systemd",
            "TPM2"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-laravel-precognition-real-time-validation-without-full-form-submission/blog-laravel-precognition-real-time-validation-without-full-form-submission-1200.webp"
    },
    {
        "title": "Database Migrations Best Practices in Laravel: Rollbacks, Seeds & Factories",
        "url": "/blog/database-migrations-best-practices-laravel-rollbacks-seeds-factories",
        "description": "Covers atomic migrations, safe schema changes in production, Eloquent factories for realistic test data, and migration-only deployments.",
        "type": "post",
        "keywords": "Database Laravel Migrations Seeds Factories Database Migrations Best Practices in Laravel: Rollbacks, Seeds & Factories Covers atomic migrations, safe schema changes in production, Eloquent factories for realistic test data, and migration-only deployments.",
        "category": "Database",
        "tags": [
            "Laravel",
            "Database",
            "Migrations",
            "Seeds",
            "Factories"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-database-migrations-best-practices-laravel-rollbacks-seeds-factories/blog-database-migrations-best-practices-laravel-rollbacks-seeds-factories-1200.webp"
    },
    {
        "title": "Debugging in Production: Safe Techniques for Live Systems Without Downtime",
        "url": "/blog/debugging-production-safe-techniques-live-systems-without-downtime",
        "description": "Covers non-destructive production debugging - distributed tracing, feature flags, canary analysis, and live log tailing without touching running processes.",
        "type": "post",
        "keywords": "Debugging PHP Production Observability Reliability Debugging in Production: Safe Techniques for Live Systems Without Downtime Covers non-destructive production debugging - distributed tracing, feature flags, canary analysis, and live log tailing without touching running processes.",
        "category": "Debugging",
        "tags": [
            "PHP",
            "Debugging",
            "Production",
            "Observability",
            "Reliability"
        ],
        "updated": "2026-05-08",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-modern-php-development-workflow-git-ci-cd-docker-github-actions/blog-modern-php-development-workflow-git-ci-cd-docker-github-actions-1200.webp"
    },
    {
        "title": "What Beautiful Code Actually Looks Like: Real Examples Across Languages",
        "url": "/blog/what-beautiful-code-actually-looks-like-real-examples-across-languages",
        "description": "Curates genuinely elegant code snippets from open-source projects, analysing what makes each example immediately readable and intention-revealing.",
        "type": "post",
        "keywords": "Clean Code PHP Open Source Readability Refactoring What Beautiful Code Actually Looks Like: Real Examples Across Languages Curates genuinely elegant code snippets from open-source projects, analysing what makes each example immediately readable and intention-revealing.",
        "category": "Clean Code",
        "tags": [
            "PHP",
            "Clean Code",
            "Open Source",
            "Readability",
            "Refactoring"
        ],
        "updated": "2026-05-08",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-modern-php-development-workflow-git-ci-cd-docker-github-actions/blog-modern-php-development-workflow-git-ci-cd-docker-github-actions-1200.webp"
    },
    {
        "title": "PHP Performance Tuning: OPcache, JIT Compiler & Profiling With Blackfire",
        "url": "/blog/php-performance-tuning-opcache-jit-compiler-profiling-with-blackfire",
        "description": "Shows how to enable and tune OPcache and JIT, use Blackfire.io to pinpoint bottlenecks, and reduce response times by up to 60%.",
        "type": "post",
        "keywords": "Performance PHP OPcache JIT Blackfire PHP Performance Tuning: OPcache, JIT Compiler & Profiling With Blackfire Shows how to enable and tune OPcache and JIT, use Blackfire.io to pinpoint bottlenecks, and reduce response times by up to 60%.",
        "category": "Performance",
        "tags": [
            "PHP",
            "Performance",
            "OPcache",
            "JIT",
            "Blackfire"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/site-og/site-og-1200.webp"
    },
    {
        "title": "How to Configure SELinux: Policies, Contexts & Troubleshooting Denials",
        "url": "/blog/how-configure-selinux-policies-contexts-troubleshooting-denials",
        "description": "Covers enforcing vs permissive modes, reading audit2allow output, writing custom type enforcement modules, and labeling files correctly.",
        "type": "post",
        "keywords": "Security Linux SELinux RHEL Fedora Policy How to Configure SELinux: Policies, Contexts & Troubleshooting Denials Covers enforcing vs permissive modes, reading audit2allow output, writing custom type enforcement modules, and labeling files correctly.",
        "category": "Security",
        "tags": [
            "Linux",
            "SELinux",
            "Security",
            "RHEL",
            "Fedora",
            "Policy"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/page-laravel-api-development/page-laravel-api-development-1200.webp"
    },
    {
        "title": "Building a Welcoming Open Source Community: Code of Conduct, Docs & Onboarding",
        "url": "/blog/building-a-welcoming-open-source-community-code-of-conduct-docs-onboarding",
        "description": "Practical guide for maintainers to reduce contribution friction - writing good CONTRIBUTING files, labelling beginner issues, and creating a culture of constructive review.",
        "type": "post",
        "keywords": "Open Source Community Maintainers Documentation Onboarding Building a Welcoming Open Source Community: Code of Conduct, Docs & Onboarding Practical guide for maintainers to reduce contribution friction - writing good CONTRIBUTING files, labelling beginner issues, and creating a culture of constructive review.",
        "category": "Open Source",
        "tags": [
            "Open Source",
            "Community",
            "Maintainers",
            "Documentation",
            "Onboarding"
        ],
        "updated": "2026-05-08",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-building-multi-tenant-saas-apps-laravel-architecture-tenancy-strategies/blog-building-multi-tenant-saas-apps-laravel-architecture-tenancy-strategies-1200.webp"
    },
    {
        "title": "Heisenbug, Schrodinger Bug & Other Phantom Failures: Debugging the Unpredictable",
        "url": "/blog/heisenbug-schrodinger-bug-other-phantom-failures-debugging-unpredictable",
        "description": "Catalogs bugs that vanish under observation, change behavior with logging, or only appear in production - and the techniques to corner each type.",
        "type": "post",
        "keywords": "Debugging PHP Flaky Tests Race Conditions Observability Heisenbug, Schrodinger Bug & Other Phantom Failures: Debugging the Unpredictable Catalogs bugs that vanish under observation, change behavior with logging, or only appear in production - and the techniques to corner each type.",
        "category": "Debugging",
        "tags": [
            "PHP",
            "Debugging",
            "Flaky Tests",
            "Race Conditions",
            "Observability"
        ],
        "updated": "2026-05-08",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-building-multi-tenant-saas-apps-laravel-architecture-tenancy-strategies/blog-building-multi-tenant-saas-apps-laravel-architecture-tenancy-strategies-1200.webp"
    },
    {
        "title": "Python's Rise to Dominance: How Readability as a Value Reshaped a Generation of Programmers",
        "url": "/blog/pythons-rise-to-dominance-how-readability-as-a-value-reshaped-a-generation-of-programmers",
        "description": "Traces Python's journey from scripting utility to the language of science, AI, and education - and how its radical readability ethic influenced language design far beyond its own community.",
        "type": "post",
        "keywords": "Language Evolution Python Readability Programming Languages Data Science Education AI Python's Rise to Dominance: How Readability as a Value Reshaped a Generation of Programmers Traces Python's journey from scripting utility to the language of science, AI, and education - and how its radical readability ethic influenced language design far beyond its own community.",
        "category": "Language Evolution",
        "tags": [
            "Language Evolution",
            "Python",
            "Readability",
            "Programming Languages",
            "Data Science",
            "Education",
            "AI"
        ],
        "updated": "2026-05-08",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-optimizing-mysql-queries-php-indexes-joins-execution-plans/blog-optimizing-mysql-queries-php-indexes-joins-execution-plans-1200.webp"
    },
    {
        "title": "How to Secure PHP Applications: HTTPS, CSP Headers & Input Validation",
        "url": "/blog/how-to-secure-php-applications-https-csp-headers-input-validation",
        "description": "Practical implementation guide covering TLS enforcement, Content Security Policy headers, and robust server-side input sanitization.",
        "type": "post",
        "keywords": "Security PHP HTTPS CSP Input Validation How to Secure PHP Applications: HTTPS, CSP Headers & Input Validation Practical implementation guide covering TLS enforcement, Content Security Policy headers, and robust server-side input sanitization.",
        "category": "Security",
        "tags": [
            "PHP",
            "Security",
            "HTTPS",
            "CSP",
            "Input Validation"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-api-versioning-in-php-strategies-url-paths-header-based-approaches/blog-api-versioning-in-php-strategies-url-paths-header-based-approaches-1200.webp"
    },
    {
        "title": "Linux Time Synchronization: Configuring NTP and chrony Correctly",
        "url": "/blog/linux-time-synchronization-configuring-ntp-chrony-correctly",
        "description": "Sets up chrony as an NTP client and server, configures stratum hierarchy, verifies sync status, and handles leap second adjustments.",
        "type": "post",
        "keywords": "Administration Linux chrony NTP Time Synchronization Ubuntu Linux Time Synchronization: Configuring NTP and chrony Correctly Sets up chrony as an NTP client and server, configures stratum hierarchy, verifies sync status, and handles leap second adjustments.",
        "category": "Administration",
        "tags": [
            "Linux",
            "Administration",
            "chrony",
            "NTP",
            "Time Synchronization",
            "Ubuntu"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/page-stack/page-stack-1200.webp"
    },
    {
        "title": "Building a GraphQL API in PHP With Webonyx: A Complete Tutorial",
        "url": "/blog/building-graphql-api-php-webonyx-complete-tutorial",
        "description": "Full guide to defining schemas, resolvers, mutations, and subscriptions using the webonyx/graphql-php library with Laravel integration.",
        "type": "post",
        "keywords": "APIs PHP GraphQL Webonyx Laravel Building a GraphQL API in PHP With Webonyx: A Complete Tutorial Full guide to defining schemas, resolvers, mutations, and subscriptions using the webonyx/graphql-php library with Laravel integration.",
        "category": "APIs",
        "tags": [
            "PHP",
            "GraphQL",
            "Webonyx",
            "Laravel",
            "APIs"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-optimizing-mysql-queries-php-indexes-joins-execution-plans/blog-optimizing-mysql-queries-php-indexes-joins-execution-plans-1200.webp"
    },
    {
        "title": "Setting Up HAProxy on Linux: Load Balancing, Health Checks & SSL",
        "url": "/blog/setting-up-haproxy-linux-load-balancing-health-checks-ssl",
        "description": "Configures HAProxy frontend/backend blocks, round-robin and least-connections balancing, active health checks, and SSL termination.",
        "type": "post",
        "keywords": "Networking Linux HAProxy Load Balancing TLS Health Checks Setting Up HAProxy on Linux: Load Balancing, Health Checks & SSL Configures HAProxy frontend/backend blocks, round-robin and least-connections balancing, active health checks, and SSL termination.",
        "category": "Networking",
        "tags": [
            "Linux",
            "HAProxy",
            "Load Balancing",
            "Networking",
            "TLS",
            "Health Checks"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-automated-testing-pyramid-php-unit-integration-e2e-pest/blog-automated-testing-pyramid-php-unit-integration-e2e-pest-1200.webp"
    },
    {
        "title": "The Psychology of Complexity: Why Developers Default to Over-Engineering",
        "url": "/blog/psychology-complexity-developers-default-over-engineering",
        "description": "Examines the cognitive biases - fear of future requirements, desire to appear clever - that push developers toward needless complexity.",
        "type": "post",
        "keywords": "Engineering Complexity Over-Engineering Clean Code Refactoring The Psychology of Complexity: Why Developers Default to Over-Engineering Examines the cognitive biases - fear of future requirements, desire to appear clever - that push developers toward needless complexity.",
        "category": "Engineering",
        "tags": [
            "Engineering",
            "Complexity",
            "Over-Engineering",
            "Clean Code",
            "Refactoring"
        ],
        "updated": "2026-05-08",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-building-multi-tenant-saas-apps-laravel-architecture-tenancy-strategies/blog-building-multi-tenant-saas-apps-laravel-architecture-tenancy-strategies-1200.webp"
    },
    {
        "title": "Binary Search Debugging: The Fastest Way to Isolate Any Bug in Any Codebase",
        "url": "/blog/binary-search-debugging-fastest-way-isolate-any-bug-any-codebase",
        "description": "Applies binary search thinking to bug isolation - systematically halving the problem space with targeted experiments to converge on the root cause fast.",
        "type": "post",
        "keywords": "Debugging PHP Testing Git Root Cause Analysis Binary Search Debugging: The Fastest Way to Isolate Any Bug in Any Codebase Applies binary search thinking to bug isolation - systematically halving the problem space with targeted experiments to converge on the root cause fast.",
        "category": "Debugging",
        "tags": [
            "PHP",
            "Debugging",
            "Testing",
            "Git",
            "Root Cause Analysis"
        ],
        "updated": "2026-05-08",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-optimizing-mysql-queries-php-indexes-joins-execution-plans/blog-optimizing-mysql-queries-php-indexes-joins-execution-plans-1200.webp"
    },
    {
        "title": "How Companies Exploit Open Source and What the Community Is Doing About It",
        "url": "/blog/how-companies-exploit-open-source-and-what-the-community-is-doing-about-it",
        "description": "Examines the tension between commercial adoption and community contribution, covering license changes like SSPL, the Commons Clause, and fair-code experiments.",
        "type": "post",
        "keywords": "Open Source Licensing Sustainability Governance Source Available How Companies Exploit Open Source and What the Community Is Doing About It Examines the tension between commercial adoption and community contribution, covering license changes like SSPL, the Commons Clause, and fair-code experiments.",
        "category": "Open Source",
        "tags": [
            "Open Source",
            "Licensing",
            "Sustainability",
            "Governance",
            "Source Available"
        ],
        "updated": "2026-05-08",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-optimizing-mysql-queries-php-indexes-joins-execution-plans/blog-optimizing-mysql-queries-php-indexes-joins-execution-plans-1200.webp"
    },
    {
        "title": "PHP 8.2 Released: Readonly Classes, DNF Types & Deprecations Explained",
        "url": "/blog/php-82-released-readonly-classes-dnf-types-deprecations-explained",
        "description": "First look at PHP 8.2 features — readonly classes, Disjunctive Normal Form types, new ini options, and upcoming deprecation clean-ups.",
        "type": "post",
        "keywords": "Core PHP PHP PHP 8.2 Type System Migration PHP 8.2 Released: Readonly Classes, DNF Types & Deprecations Explained First look at PHP 8.2 features — readonly classes, Disjunctive Normal Form types, new ini options, and upcoming deprecation clean-ups.",
        "category": "Core PHP",
        "tags": [
            "PHP",
            "PHP 8.2",
            "Core PHP",
            "Type System",
            "Migration"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-composer-best-practices-autoloading-version-constraints-monorepos/blog-composer-best-practices-autoloading-version-constraints-monorepos-1200.webp"
    },
    {
        "title": "Linux Backup Strategies: rsync, Restic & Automated Snapshot Rotation",
        "url": "/blog/linux-backup-strategies-rsync-restic-automated-snapshot-rotation",
        "description": "Compares rsync incremental backups and Restic deduplicated snapshots, covering remote targets, encryption, retention policies, and restore testing.",
        "type": "post",
        "keywords": "Storage Linux Backup rsync Restic Automation Linux Backup Strategies: rsync, Restic & Automated Snapshot Rotation Compares rsync incremental backups and Restic deduplicated snapshots, covering remote targets, encryption, retention policies, and restore testing.",
        "category": "Storage",
        "tags": [
            "Linux",
            "Backup",
            "rsync",
            "Restic",
            "Storage",
            "Automation"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-building-cli-tools-php-symfony-console-component/blog-building-cli-tools-php-symfony-console-component-1200.webp"
    },
    {
        "title": "How TypeScript Changed the Way JavaScript Developers Think About Correctness",
        "url": "/blog/how-typescript-changed-the-way-javascript-developers-think-about-correctness",
        "description": "Explores TypeScript's cognitive impact - how adding a type layer shifts mental models from runtime debugging to compile-time reasoning and changes how APIs are designed and consumed.",
        "type": "post",
        "keywords": "Language Evolution TypeScript JavaScript Type Systems API Design Static Analysis Correctness How TypeScript Changed the Way JavaScript Developers Think About Correctness Explores TypeScript's cognitive impact - how adding a type layer shifts mental models from runtime debugging to compile-time reasoning and changes how APIs are designed and consumed.",
        "category": "Language Evolution",
        "tags": [
            "Language Evolution",
            "TypeScript",
            "JavaScript",
            "Type Systems",
            "API Design",
            "Static Analysis",
            "Correctness"
        ],
        "updated": "2026-05-08",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-php-security-checklist-2020-xss-csrf-sql-injection/blog-php-security-checklist-2020-xss-csrf-sql-injection-1200.webp"
    },
    {
        "title": "Refactoring Toward Elegance: How to Simplify Code Without Breaking It",
        "url": "/blog/refactoring-toward-elegance-simplify-code-without-breaking-it",
        "description": "Step-by-step refactoring guide - extracting intent into named functions, collapsing conditionals, and eliminating redundant state one change at a time.",
        "type": "post",
        "keywords": "Clean Code PHP Refactoring Testing Code Quality Refactoring Toward Elegance: How to Simplify Code Without Breaking It Step-by-step refactoring guide - extracting intent into named functions, collapsing conditionals, and eliminating redundant state one change at a time.",
        "category": "Clean Code",
        "tags": [
            "PHP",
            "Clean Code",
            "Refactoring",
            "Testing",
            "Code Quality"
        ],
        "updated": "2026-05-08",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-optimizing-mysql-queries-php-indexes-joins-execution-plans/blog-optimizing-mysql-queries-php-indexes-joins-execution-plans-1200.webp"
    },
    {
        "title": "Configuring AppArmor on Ubuntu: Profiles, Modes & Custom Policies",
        "url": "/blog/configuring-apparmor-ubuntu-profiles-modes-custom-policies",
        "description": "Covers AppArmor enforce vs complain modes, reading audit logs, generating profiles with aa-genprof, and writing custom policy rules.",
        "type": "post",
        "keywords": "Security Linux AppArmor Ubuntu Policy Hardening Configuring AppArmor on Ubuntu: Profiles, Modes & Custom Policies Covers AppArmor enforce vs complain modes, reading audit logs, generating profiles with aa-genprof, and writing custom policy rules.",
        "category": "Security",
        "tags": [
            "Linux",
            "AppArmor",
            "Ubuntu",
            "Security",
            "Policy",
            "Hardening"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-automated-testing-pyramid-php-unit-integration-e2e-pest/blog-automated-testing-pyramid-php-unit-integration-e2e-pest-1200.webp"
    },
    {
        "title": "Caching Strategies in PHP: Redis, Memcached & HTTP Cache Headers",
        "url": "/blog/caching-strategies-php-redis-memcached-http-cache-headers",
        "description": "Covers key-value caching, cache-aside pattern, cache invalidation, and HTTP cache headers to reduce server load significantly.",
        "type": "post",
        "keywords": "Performance PHP Redis Memcached HTTP Cache Caching Strategies in PHP: Redis, Memcached & HTTP Cache Headers Covers key-value caching, cache-aside pattern, cache invalidation, and HTTP cache headers to reduce server load significantly.",
        "category": "Performance",
        "tags": [
            "PHP",
            "Performance",
            "Redis",
            "Memcached",
            "HTTP Cache"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-laravel-octane-production-checklist/blog-laravel-octane-production-checklist-1200.webp"
    },
    {
        "title": "Designing a Clean PHP Architecture: Hexagonal, Onion & Clean Code",
        "url": "/blog/designing-clean-php-architecture-hexagonal-onion-clean-code",
        "description": "Contrasts architectural patterns, shows PHP project layouts for each, and explains the dependency rule and port/adapter separation.",
        "type": "post",
        "keywords": "Architecture PHP Clean Architecture Hexagonal Architecture Onion Architecture Designing a Clean PHP Architecture: Hexagonal, Onion & Clean Code Contrasts architectural patterns, shows PHP project layouts for each, and explains the dependency rule and port/adapter separation.",
        "category": "Architecture",
        "tags": [
            "PHP",
            "Architecture",
            "Clean Architecture",
            "Hexagonal Architecture",
            "Onion Architecture"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-database-indexing-strategies-php-apps-b-trees-full-text-composite/blog-database-indexing-strategies-php-apps-b-trees-full-text-composite-1200.webp"
    },
    {
        "title": "Who Owns Open Source Code? Licenses, Copyright & Contributor Agreements Explained",
        "url": "/blog/who-owns-open-source-code-licenses-copyright-contributor-agreements-explained",
        "description": "Clarifies the legal landscape - MIT, Apache, GPL, and AGPL licenses, contributor license agreements, and what corporate adoption means for ownership and control.",
        "type": "post",
        "keywords": "Open Source Licensing Copyright Contributor Agreements Compliance Who Owns Open Source Code? Licenses, Copyright & Contributor Agreements Explained Clarifies the legal landscape - MIT, Apache, GPL, and AGPL licenses, contributor license agreements, and what corporate adoption means for ownership and control.",
        "category": "Open Source",
        "tags": [
            "Open Source",
            "Licensing",
            "Copyright",
            "Contributor Agreements",
            "Compliance"
        ],
        "updated": "2026-05-08",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-php-security-checklist-2020-xss-csrf-sql-injection/blog-php-security-checklist-2020-xss-csrf-sql-injection-1200.webp"
    },
    {
        "title": "Rubber Duck Debugging and Why Explaining Your Bug Out Loud Actually Works",
        "url": "/blog/rubber-duck-debugging-why-explaining-bug-out-loud-actually-works",
        "description": "Explains the cognitive science behind verbalising a problem - how articulation forces precision and surfaces hidden assumptions in your mental model.",
        "type": "post",
        "keywords": "Debugging PHP Rubber Duck Debugging Problem Solving Mental Models Rubber Duck Debugging and Why Explaining Your Bug Out Loud Actually Works Explains the cognitive science behind verbalising a problem - how articulation forces precision and surfaces hidden assumptions in your mental model.",
        "category": "Debugging",
        "tags": [
            "PHP",
            "Debugging",
            "Rubber Duck Debugging",
            "Problem Solving",
            "Mental Models"
        ],
        "updated": "2026-05-08",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-php-security-checklist-2020-xss-csrf-sql-injection/blog-php-security-checklist-2020-xss-csrf-sql-injection-1200.webp"
    },
    {
        "title": "Bash Shell Configuration: .bashrc, .bash_profile & Environment Variables",
        "url": "/blog/bash-shell-configuration-bashrc-bash-profile-environment-variables",
        "description": "Explains login vs non-login shells, customizing PS1 prompts, managing PATH, aliases, functions, and sourcing configs in the right order.",
        "type": "post",
        "keywords": "Administration Linux Bash Shell Terminal Environment Bash Shell Configuration: .bashrc, .bash_profile & Environment Variables Explains login vs non-login shells, customizing PS1 prompts, managing PATH, aliases, functions, and sourcing configs in the right order.",
        "category": "Administration",
        "tags": [
            "Linux",
            "Bash",
            "Shell",
            "Administration",
            "Terminal",
            "Environment"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-composer-best-practices-autoloading-version-constraints-monorepos/blog-composer-best-practices-autoloading-version-constraints-monorepos-1200.webp"
    },
    {
        "title": "Linux Monitoring With Prometheus & Grafana: Full Stack Setup Guide",
        "url": "/blog/linux-monitoring-prometheus-grafana-full-stack-setup-guide",
        "description": "Installs Node Exporter and Prometheus, configures scrape intervals, builds Grafana dashboards, and sets up alerting rules.",
        "type": "post",
        "keywords": "Monitoring Linux Prometheus Grafana Node Exporter Alerting Linux Monitoring With Prometheus & Grafana: Full Stack Setup Guide Installs Node Exporter and Prometheus, configures scrape intervals, builds Grafana dashboards, and sets up alerting rules.",
        "category": "Monitoring",
        "tags": [
            "Linux",
            "Monitoring",
            "Prometheus",
            "Grafana",
            "Node Exporter",
            "Alerting"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-building-crud-apis-laravel-sanctum-authentication-2021/blog-building-crud-apis-laravel-sanctum-authentication-2021-1200.webp"
    },
    {
        "title": "Mastering PHP Generators: Memory-Efficient Data Processing at Scale",
        "url": "/blog/mastering-php-generators-memory-efficient-data-processing-scale",
        "description": "Demonstrates generators as iterators and coroutines, benchmarking memory savings against array-based approaches for large datasets.",
        "type": "post",
        "keywords": "Core PHP PHP Generators Performance Memory Iterators Mastering PHP Generators: Memory-Efficient Data Processing at Scale Demonstrates generators as iterators and coroutines, benchmarking memory savings against array-based approaches for large datasets.",
        "category": "Core PHP",
        "tags": [
            "PHP",
            "Generators",
            "Performance",
            "Memory",
            "Iterators"
        ],
        "updated": "2026-05-06",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-laravel-octane-production-checklist/blog-laravel-octane-production-checklist-1200.webp"
    },
    {
        "title": "Simplicity as a Design Principle: Lessons From Unix, Python & Go",
        "url": "/blog/simplicity-design-principle-lessons-unix-python-go",
        "description": "Draws lessons from languages and systems famously built around simplicity, showing how their constraints produced more maintainable ecosystems.",
        "type": "post",
        "keywords": "Engineering Simplicity Unix Python Go Software Design Simplicity as a Design Principle: Lessons From Unix, Python & Go Draws lessons from languages and systems famously built around simplicity, showing how their constraints produced more maintainable ecosystems.",
        "category": "Engineering",
        "tags": [
            "Engineering",
            "Simplicity",
            "Unix",
            "Python",
            "Go",
            "Software Design"
        ],
        "updated": "2026-05-08",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-php-security-checklist-2020-xss-csrf-sql-injection/blog-php-security-checklist-2020-xss-csrf-sql-injection-1200.webp"
    },
    {
        "title": "Test-Driven Development in PHP: A Practical Workflow for Teams",
        "url": "/blog/test-driven-development-in-php-practical-workflow-for-teams",
        "description": "Shows how to embed TDD red-green-refactor cycles into team sprints, configure CI pipelines, and measure coverage regressions.",
        "type": "post",
        "keywords": "Testing PHP PHPUnit TDD CI Test-Driven Development in PHP: A Practical Workflow for Teams Shows how to embed TDD red-green-refactor cycles into team sprints, configure CI pipelines, and measure coverage regressions.",
        "category": "Testing",
        "tags": [
            "PHP",
            "PHPUnit",
            "TDD",
            "Testing",
            "CI"
        ],
        "updated": "2026-05-06",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-laravel-precognition-real-time-validation-without-full-form-submission/blog-laravel-precognition-real-time-validation-without-full-form-submission-1200.webp"
    },
    {
        "title": "How to Configure NFS on Linux: Server Setup, Exports & Client Mounts",
        "url": "/blog/how-configure-nfs-linux-server-setup-exports-client-mounts",
        "description": "Sets up NFS v4 server, configures /etc/exports with security options, mounts shares on clients, and automates with /etc/fstab.",
        "type": "post",
        "keywords": "Storage Linux NFS Ubuntu Filesystems Administration How to Configure NFS on Linux: Server Setup, Exports & Client Mounts Sets up NFS v4 server, configures /etc/exports with security options, mounts shares on clients, and automates with /etc/fstab.",
        "category": "Storage",
        "tags": [
            "Linux",
            "NFS",
            "Storage",
            "Ubuntu",
            "Filesystems",
            "Administration"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-composer-best-practices-autoloading-version-constraints-monorepos/blog-composer-best-practices-autoloading-version-constraints-monorepos-1200.webp"
    },
    {
        "title": "Maintainer Burnout in Open Source: The Hidden Crisis Nobody Talks About",
        "url": "/blog/maintainer-burnout-in-open-source-the-hidden-crisis-nobody-talks-about",
        "description": "Documents the epidemic of maintainer exhaustion - unpaid pressure, hostile issues, and endless support requests - and what communities can do to protect the people who keep projects alive.",
        "type": "post",
        "keywords": "Open Source Maintainers Burnout Sustainability Community Maintainer Burnout in Open Source: The Hidden Crisis Nobody Talks About Documents the epidemic of maintainer exhaustion - unpaid pressure, hostile issues, and endless support requests - and what communities can do to protect the people who keep projects alive.",
        "category": "Open Source",
        "tags": [
            "Open Source",
            "Maintainers",
            "Burnout",
            "Sustainability",
            "Community"
        ],
        "updated": "2026-05-08",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-integrating-stripe-payments-laravel-subscriptions-webhooks-guide/blog-integrating-stripe-payments-laravel-subscriptions-webhooks-guide-1200.webp"
    },
    {
        "title": "The Frustration Loop: Why Debugging Feels Impossible Before It Suddenly Clicks",
        "url": "/blog/the-frustration-loop-why-debugging-feels-impossible-before-it-suddenly-clicks",
        "description": "Explores the psychological cycle of confusion, tunnel vision, and breakthrough that characterises a difficult debugging session and how to shorten it.",
        "type": "post",
        "keywords": "Debugging PHP Problem Solving Cognitive Load Troubleshooting The Frustration Loop: Why Debugging Feels Impossible Before It Suddenly Clicks Explores the psychological cycle of confusion, tunnel vision, and breakthrough that characterises a difficult debugging session and how to shorten it.",
        "category": "Debugging",
        "tags": [
            "PHP",
            "Debugging",
            "Problem Solving",
            "Cognitive Load",
            "Troubleshooting"
        ],
        "updated": "2026-05-08",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-integrating-stripe-payments-laravel-subscriptions-webhooks-guide/blog-integrating-stripe-payments-laravel-subscriptions-webhooks-guide-1200.webp"
    },
    {
        "title": "The Cost of Complexity: How Over-Engineered Code Kills Developer Productivity",
        "url": "/blog/cost-complexity-over-engineered-code-kills-developer-productivity",
        "description": "Quantifies the hidden costs of unnecessary abstraction - slower onboarding, harder debugging, and cascading rework caused by premature generalization.",
        "type": "post",
        "keywords": "Engineering Complexity Productivity Over-Engineering Clean Code The Cost of Complexity: How Over-Engineered Code Kills Developer Productivity Quantifies the hidden costs of unnecessary abstraction - slower onboarding, harder debugging, and cascading rework caused by premature generalization.",
        "category": "Engineering",
        "tags": [
            "Engineering",
            "Complexity",
            "Productivity",
            "Over-Engineering",
            "Clean Code"
        ],
        "updated": "2026-05-08",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-integrating-stripe-payments-laravel-subscriptions-webhooks-guide/blog-integrating-stripe-payments-laravel-subscriptions-webhooks-guide-1200.webp"
    },
    {
        "title": "Laravel Livewire vs Inertia.js: Choosing the Right Full-Stack Approach",
        "url": "/blog/laravel-livewire-vs-inertia-js-choosing-right-full-stack-approach",
        "description": "Compares both approaches side-by-side with architecture diagrams, performance profiles, and developer experience analysis.",
        "type": "post",
        "keywords": "Laravel Livewire Inertia.js Frontend Laravel Livewire vs Inertia.js: Choosing the Right Full-Stack Approach Compares both approaches side-by-side with architecture diagrams, performance profiles, and developer experience analysis.",
        "category": "Laravel",
        "tags": [
            "Laravel",
            "Livewire",
            "Inertia.js",
            "Frontend"
        ],
        "updated": "2026-05-06",
        "image": "https://andrej.prus.dev/assets/images/optimized/page-laravel-api-development/page-laravel-api-development-1200.webp"
    },
    {
        "title": "Linux Kernel Tuning With sysctl: Network Stack & Security Hardening",
        "url": "/blog/linux-kernel-tuning-sysctl-network-stack-security-hardening",
        "description": "Tunes TCP buffer sizes, connection tracking, SYN flood protection, ICMP restrictions, and kernel hardening parameters via sysctl.conf.",
        "type": "post",
        "keywords": "Performance Linux sysctl Kernel Networking Security Linux Kernel Tuning With sysctl: Network Stack & Security Hardening Tunes TCP buffer sizes, connection tracking, SYN flood protection, ICMP restrictions, and kernel hardening parameters via sysctl.conf.",
        "category": "Performance",
        "tags": [
            "Linux",
            "sysctl",
            "Kernel",
            "Networking",
            "Security",
            "Performance"
        ],
        "updated": "2026-05-08",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-building-php-sdk-http-client-abstraction-retries-test-fakes/blog-building-php-sdk-http-client-abstraction-retries-test-fakes-1200.webp"
    },
    {
        "title": "Symfony 6 New Features: What Every PHP Developer Must Know",
        "url": "/blog/symfony-6-new-features-every-php-developer-must-know",
        "description": "Comprehensive overview of Symfony 6 highlights including PHP 8 attributes, typed properties, and the mature Mailer/Notifier components.",
        "type": "post",
        "keywords": "Symfony PHP 8 Attributes Mailer Symfony 6 New Features: What Every PHP Developer Must Know Comprehensive overview of Symfony 6 highlights including PHP 8 attributes, typed properties, and the mature Mailer/Notifier components.",
        "category": "Symfony",
        "tags": [
            "Symfony",
            "PHP 8",
            "Attributes",
            "Mailer"
        ],
        "updated": "2026-05-06",
        "image": "https://andrej.prus.dev/assets/images/optimized/page-stack/page-stack-1200.webp"
    },
    {
        "title": "Setting Up Postfix Mail Server on Linux: SMTP, DKIM & SPF Records",
        "url": "/blog/setting-up-postfix-mail-server-linux-smtp-dkim-spf-records",
        "description": "Full Postfix configuration walkthrough covering virtual domains, TLS encryption, OpenDKIM signing, SPF and DMARC DNS records, and spam filtering.",
        "type": "post",
        "keywords": "Networking Linux Postfix SMTP DKIM SPF DMARC Setting Up Postfix Mail Server on Linux: SMTP, DKIM & SPF Records Full Postfix configuration walkthrough covering virtual domains, TLS encryption, OpenDKIM signing, SPF and DMARC DNS records, and spam filtering.",
        "category": "Networking",
        "tags": [
            "Linux",
            "Postfix",
            "SMTP",
            "DKIM",
            "SPF",
            "DMARC",
            "Networking"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-deploying-php-apps-aws-ec2-ecs-fargate-lambda-runtimes-guide/blog-deploying-php-apps-aws-ec2-ecs-fargate-lambda-runtimes-guide-1200.webp"
    },
    {
        "title": "The Philosophy of Giving Back: Why Open Source Sustainability Depends on Contributors",
        "url": "/blog/the-philosophy-of-giving-back-why-open-source-sustainability-depends-on-contributors",
        "description": "Examines the tragedy of the commons in software - how projects collapse when everyone consumes and nobody contributes - and what healthy contribution cultures look like.",
        "type": "post",
        "keywords": "Open Source Contributors Sustainability Community Reciprocity The Philosophy of Giving Back: Why Open Source Sustainability Depends on Contributors Examines the tragedy of the commons in software - how projects collapse when everyone consumes and nobody contributes - and what healthy contribution cultures look like.",
        "category": "Open Source",
        "tags": [
            "Open Source",
            "Contributors",
            "Sustainability",
            "Community",
            "Reciprocity"
        ],
        "updated": "2026-05-08",
        "image": "https://andrej.prus.dev/assets/images/optimized/page-services-laravel/page-services-laravel-1200.webp"
    },
    {
        "title": "How Senior Developers Think When Debugging: A Mental Model Breakdown",
        "url": "/blog/how-senior-developers-think-debugging-mental-model-breakdown",
        "description": "Reveals the systematic reasoning process experienced engineers use - narrowing scope, isolating variables, and resisting the urge to guess.",
        "type": "post",
        "keywords": "Debugging PHP Mental Models Troubleshooting Engineering How Senior Developers Think When Debugging: A Mental Model Breakdown Reveals the systematic reasoning process experienced engineers use - narrowing scope, isolating variables, and resisting the urge to guess.",
        "category": "Debugging",
        "tags": [
            "PHP",
            "Debugging",
            "Mental Models",
            "Troubleshooting",
            "Engineering"
        ],
        "updated": "2026-05-08",
        "image": "https://andrej.prus.dev/assets/images/optimized/page-services-laravel/page-services-laravel-1200.webp"
    },
    {
        "title": "Linux User Management: Groups, sudo Policies & PAM Configuration",
        "url": "/blog/linux-user-management-groups-sudo-policies-pam-configuration",
        "description": "Covers useradd, usermod, groupadd, /etc/sudoers syntax, sudo logging, password policies with PAM, and account expiration management.",
        "type": "post",
        "keywords": "Security Linux Users Groups sudo PAM Linux User Management: Groups, sudo Policies & PAM Configuration Covers useradd, usermod, groupadd, /etc/sudoers syntax, sudo logging, password policies with PAM, and account expiration management.",
        "category": "Security",
        "tags": [
            "Linux",
            "Users",
            "Groups",
            "sudo",
            "PAM",
            "Security"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-database-indexing-strategies-php-apps-b-trees-full-text-composite/blog-database-indexing-strategies-php-apps-b-trees-full-text-composite-1200.webp"
    },
    {
        "title": "PHP Fiber Introduction: Async Programming Without the Complexity",
        "url": "/blog/php-fiber-introduction-async-programming-without-complexity",
        "description": "Explains PHP 8.1 Fibers as lightweight coroutines, compares them to async/await patterns, and shows practical cooperative scheduling.",
        "type": "post",
        "keywords": "Core PHP PHP PHP 8.1 Fibers Async PHP Fiber Introduction: Async Programming Without the Complexity Explains PHP 8.1 Fibers as lightweight coroutines, compares them to async/await patterns, and shows practical cooperative scheduling.",
        "category": "Core PHP",
        "tags": [
            "PHP",
            "PHP 8.1",
            "Fibers",
            "Async"
        ],
        "updated": "2026-05-06",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-automated-testing-pyramid-php-unit-integration-e2e-pest/blog-automated-testing-pyramid-php-unit-integration-e2e-pest-1200.webp"
    },
    {
        "title": "Code Elegance Explained: What Senior Developers Mean When They Say Less Is More",
        "url": "/blog/code-elegance-explained-senior-developers-mean-less-more",
        "description": "Defines elegance in software through concrete examples - minimal surface area, single responsibility, and expressive naming that removes the need for comments.",
        "type": "post",
        "keywords": "Clean Code PHP Elegance Simplicity Refactoring Code Elegance Explained: What Senior Developers Mean When They Say Less Is More Defines elegance in software through concrete examples - minimal surface area, single responsibility, and expressive naming that removes the need for comments.",
        "category": "Clean Code",
        "tags": [
            "PHP",
            "Clean Code",
            "Elegance",
            "Simplicity",
            "Refactoring"
        ],
        "updated": "2026-05-08",
        "image": "https://andrej.prus.dev/assets/images/optimized/page-services-laravel/page-services-laravel-1200.webp"
    },
    {
        "title": "Configuring Linux swap: Size, Priority & zram for Better Performance",
        "url": "/blog/configuring-linux-swap-size-priority-zram-better-performance",
        "description": "Explains swap partitions vs swapfiles, tuning swappiness and vfs_cache_pressure, and setting up compressed zram for low-memory systems.",
        "type": "post",
        "keywords": "Performance Linux Swap zram Memory sysctl Configuring Linux swap: Size, Priority & zram for Better Performance Explains swap partitions vs swapfiles, tuning swappiness and vfs_cache_pressure, and setting up compressed zram for low-memory systems.",
        "category": "Performance",
        "tags": [
            "Linux",
            "Swap",
            "zram",
            "Performance",
            "Memory",
            "sysctl"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-api-versioning-in-php-strategies-url-paths-header-based-approaches/blog-api-versioning-in-php-strategies-url-paths-header-based-approaches-1200.webp"
    },
    {
        "title": "Domain-Driven Design in PHP: Entities, Value Objects & Aggregates",
        "url": "/blog/domain-driven-design-php-entities-value-objects-aggregates",
        "description": "Introduces DDD tactical patterns, showing how to model complex domains with PHP classes while keeping business logic framework-agnostic.",
        "type": "post",
        "keywords": "Architecture PHP DDD Domain Modeling Domain-Driven Design in PHP: Entities, Value Objects & Aggregates Introduces DDD tactical patterns, showing how to model complex domains with PHP classes while keeping business logic framework-agnostic.",
        "category": "Architecture",
        "tags": [
            "PHP",
            "DDD",
            "Architecture",
            "Domain Modeling"
        ],
        "updated": "2026-05-06",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-building-cli-tools-php-symfony-console-component/blog-building-cli-tools-php-symfony-console-component-1200.webp"
    },
    {
        "title": "How to Make Your First Open Source Contribution Without Feeling Like an Imposter",
        "url": "/blog/how-to-make-your-first-open-source-contribution-without-feeling-like-an-imposter",
        "description": "A beginner-friendly walkthrough of finding a welcoming project, understanding contribution guidelines, and submitting a first pull request that gets merged.",
        "type": "post",
        "keywords": "Open Source First Contribution Pull Requests GitHub Career Growth How to Make Your First Open Source Contribution Without Feeling Like an Imposter A beginner-friendly walkthrough of finding a welcoming project, understanding contribution guidelines, and submitting a first pull request that gets merged.",
        "category": "Open Source",
        "tags": [
            "Open Source",
            "First Contribution",
            "Pull Requests",
            "GitHub",
            "Career Growth"
        ],
        "updated": "2026-05-08",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-database-migrations-best-practices-laravel-rollbacks-seeds-factories/blog-database-migrations-best-practices-laravel-rollbacks-seeds-factories-1200.webp"
    },
    {
        "title": "How to Implement JWT Authentication in Pure PHP Step by Step",
        "url": "/blog/how-to-implement-jwt-authentication-pure-php-step-by-step",
        "description": "Builds a JWT auth flow from scratch without libraries, covering header/payload/signature generation, verification, and refresh tokens.",
        "type": "post",
        "keywords": "Security PHP JWT Authentication How to Implement JWT Authentication in Pure PHP Step by Step Builds a JWT auth flow from scratch without libraries, covering header/payload/signature generation, verification, and refresh tokens.",
        "category": "Security",
        "tags": [
            "PHP",
            "JWT",
            "Security",
            "Authentication"
        ],
        "updated": "2026-05-06",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-automated-testing-pyramid-php-unit-integration-e2e-pest/blog-automated-testing-pyramid-php-unit-integration-e2e-pest-1200.webp"
    },
    {
        "title": "The Art of Reading a Stack Trace: What Every Line Is Really Telling You",
        "url": "/blog/art-reading-stack-trace-what-every-line-really-telling-you",
        "description": "Teaches developers to extract maximum signal from stack traces - reading frame order, spotting framework noise, and identifying the true origin of a failure.",
        "type": "post",
        "keywords": "Debugging PHP Stack Traces Exceptions Error Handling The Art of Reading a Stack Trace: What Every Line Is Really Telling You Teaches developers to extract maximum signal from stack traces - reading frame order, spotting framework noise, and identifying the true origin of a failure.",
        "category": "Debugging",
        "tags": [
            "PHP",
            "Debugging",
            "Stack Traces",
            "Exceptions",
            "Error Handling"
        ],
        "updated": "2026-05-08",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-database-migrations-best-practices-laravel-rollbacks-seeds-factories/blog-database-migrations-best-practices-laravel-rollbacks-seeds-factories-1200.webp"
    },
    {
        "title": "Linux Performance Tuning: CPU, Memory & I/O Optimization Techniques",
        "url": "/blog/linux-performance-tuning-cpu-memory-io-optimization-techniques",
        "description": "Covers sysctl kernel parameter tuning, CPU governor settings, NUMA awareness, swappiness, and I/O scheduler selection for workloads.",
        "type": "post",
        "keywords": "Performance Linux CPU Memory IO sysctl Linux Performance Tuning: CPU, Memory & I/O Optimization Techniques Covers sysctl kernel parameter tuning, CPU governor settings, NUMA awareness, swappiness, and I/O scheduler selection for workloads.",
        "category": "Performance",
        "tags": [
            "Linux",
            "Performance",
            "CPU",
            "Memory",
            "IO",
            "sysctl"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-modern-php-development-workflow-git-ci-cd-docker-github-actions/blog-modern-php-development-workflow-git-ci-cd-docker-github-actions-1200.webp"
    },
    {
        "title": "How to Set Up a Linux VPN Server With WireGuard: Complete Tutorial",
        "url": "/blog/how-set-up-linux-vpn-server-wireguard-complete-tutorial",
        "description": "Installs and configures WireGuard on Ubuntu, generates key pairs, sets up peer configs, enables IP forwarding, and automates with wg-quick.",
        "type": "post",
        "keywords": "Networking Linux WireGuard VPN Ubuntu wg-quick How to Set Up a Linux VPN Server With WireGuard: Complete Tutorial Installs and configures WireGuard on Ubuntu, generates key pairs, sets up peer configs, enables IP forwarding, and automates with wg-quick.",
        "category": "Networking",
        "tags": [
            "Linux",
            "WireGuard",
            "VPN",
            "Ubuntu",
            "Networking",
            "wg-quick"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-building-multi-tenant-saas-apps-laravel-architecture-tenancy-strategies/blog-building-multi-tenant-saas-apps-laravel-architecture-tenancy-strategies-1200.webp"
    },
    {
        "title": "How Programming Languages Shape the Way Developers Think About Problems",
        "url": "/blog/how-programming-languages-shape-the-way-developers-think-about-problems",
        "description": "Argues that the language you work in daily does not just express your thinking - it actively constrains and moulds how you conceptualise solutions before you write a single line.",
        "type": "post",
        "keywords": "Language Evolution Programming Languages Software Design Type Systems Developer Thinking How Programming Languages Shape the Way Developers Think About Problems Argues that the language you work in daily does not just express your thinking - it actively constrains and moulds how you conceptualise solutions before you write a single line.",
        "category": "Language Evolution",
        "tags": [
            "Language Evolution",
            "Programming Languages",
            "Software Design",
            "Type Systems",
            "Developer Thinking"
        ],
        "updated": "2026-05-08",
        "image": "https://andrej.prus.dev/assets/images/optimized/site-og/site-og-1200.webp"
    },
    {
        "title": "Why Simple Code Is Not the Same as Easy Code: A Developer's Perspective",
        "url": "/blog/why-simple-code-not-same-easy-code-developers-perspective",
        "description": "Breaks down the cognitive gap between writing code that works and writing code that is effortlessly understandable by others.",
        "type": "post",
        "keywords": "Clean Code PHP Simplicity Readability Maintainability Why Simple Code Is Not the Same as Easy Code: A Developer's Perspective Breaks down the cognitive gap between writing code that works and writing code that is effortlessly understandable by others.",
        "category": "Clean Code",
        "tags": [
            "PHP",
            "Clean Code",
            "Simplicity",
            "Readability",
            "Maintainability"
        ],
        "updated": "2026-05-08",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-database-migrations-best-practices-laravel-rollbacks-seeds-factories/blog-database-migrations-best-practices-laravel-rollbacks-seeds-factories-1200.webp"
    },
    {
        "title": "PHP 8.1 Enums Deep Dive: Pure, Backed, and Interface Implementation",
        "url": "/blog/php-81-enums-deep-dive-pure-backed-interface-implementation",
        "description": "Explores every aspect of PHP 8.1 enums, including pure vs backed enums, cases(), from(), tryFrom(), interface implementation, and use in match.",
        "type": "post",
        "keywords": "Core PHP PHP PHP 8.1 Enums Match PHP 8.1 Enums Deep Dive: Pure, Backed, and Interface Implementation Explores every aspect of PHP 8.1 enums, including pure vs backed enums, cases(), from(), tryFrom(), interface implementation, and use in match.",
        "category": "Core PHP",
        "tags": [
            "PHP",
            "PHP 8.1",
            "Enums",
            "Match"
        ],
        "updated": "2026-05-06",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-composer-best-practices-autoloading-version-constraints-monorepos/blog-composer-best-practices-autoloading-version-constraints-monorepos-1200.webp"
    },
    {
        "title": "Building CRUD APIs With Laravel Sanctum Authentication in 2021",
        "url": "/blog/building-crud-apis-laravel-sanctum-authentication-2021",
        "description": "End-to-end tutorial creating a token-authenticated CRUD API with Laravel Sanctum, resource transformers, and form request validation.",
        "type": "post",
        "keywords": "Laravel Sanctum APIs Authentication Building CRUD APIs With Laravel Sanctum Authentication in 2021 End-to-end tutorial creating a token-authenticated CRUD API with Laravel Sanctum, resource transformers, and form request validation.",
        "category": "Laravel",
        "tags": [
            "Laravel",
            "Sanctum",
            "APIs",
            "Authentication"
        ],
        "updated": "2026-05-06",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-building-crud-apis-laravel-sanctum-authentication-2021/blog-building-crud-apis-laravel-sanctum-authentication-2021-1200.webp"
    },
    {
        "title": "Linux Log Management: rsyslog, logrotate & Centralized Logging Setup",
        "url": "/blog/linux-log-management-rsyslog-logrotate-centralized-logging-setup",
        "description": "Configures rsyslog for remote log forwarding, sets up logrotate policies, and introduces the ELK stack for centralized log aggregation.",
        "type": "post",
        "keywords": "Monitoring Linux Logging rsyslog logrotate ELK Linux Log Management: rsyslog, logrotate & Centralized Logging Setup Configures rsyslog for remote log forwarding, sets up logrotate policies, and introduces the ELK stack for centralized log aggregation.",
        "category": "Monitoring",
        "tags": [
            "Linux",
            "Logging",
            "rsyslog",
            "logrotate",
            "ELK",
            "Monitoring"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-optimizing-mysql-queries-php-indexes-joins-execution-plans/blog-optimizing-mysql-queries-php-indexes-joins-execution-plans-1200.webp"
    },
    {
        "title": "Open Source Culture Explained: What It Really Means to Build Software Together",
        "url": "/blog/open-source-culture-explained-what-it-really-means-to-build-software-together",
        "description": "Introduces the values underpinning open source - radical transparency, shared ownership, and the belief that software improves faster when built in public.",
        "type": "post",
        "keywords": "Open Source Software Culture Maintainers Contributors Collaboration Open Source Culture Explained: What It Really Means to Build Software Together Introduces the values underpinning open source - radical transparency, shared ownership, and the belief that software improves faster when built in public.",
        "category": "Open Source",
        "tags": [
            "Open Source",
            "Software Culture",
            "Maintainers",
            "Contributors",
            "Collaboration"
        ],
        "updated": "2026-05-08",
        "image": "https://andrej.prus.dev/assets/images/optimized/site-og/site-og-1200.webp"
    },
    {
        "title": "Debugging as Detective Work: Why Hunting Bugs Is the Most Thrilling Part of Development",
        "url": "/blog/debugging-as-detective-work-why-hunting-bugs-most-thrilling-part-development",
        "description": "Draws a direct parallel between software debugging and criminal investigation - forming hypotheses, gathering evidence, and closing in on the culprit.",
        "type": "post",
        "keywords": "Debugging PHP Troubleshooting Problem Solving Developer Workflow Debugging as Detective Work: Why Hunting Bugs Is the Most Thrilling Part of Development Draws a direct parallel between software debugging and criminal investigation - forming hypotheses, gathering evidence, and closing in on the culprit.",
        "category": "Debugging",
        "tags": [
            "PHP",
            "Debugging",
            "Troubleshooting",
            "Problem Solving",
            "Developer Workflow"
        ],
        "updated": "2026-05-08",
        "image": "https://andrej.prus.dev/assets/images/optimized/site-og/site-og-1200.webp"
    },
    {
        "title": "Automating Linux Tasks With Cron and Systemd Timers: Full Guide",
        "url": "/blog/automating-linux-tasks-cron-systemd-timers-full-guide",
        "description": "Compares cron and systemd timers, covers crontab syntax, environment variables, logging cron output, and monotonic vs realtime timers.",
        "type": "post",
        "keywords": "Administration Linux cron systemd Automation Scheduling Automating Linux Tasks With Cron and Systemd Timers: Full Guide Compares cron and systemd timers, covers crontab syntax, environment variables, logging cron output, and monotonic vs realtime timers.",
        "category": "Administration",
        "tags": [
            "Linux",
            "Administration",
            "cron",
            "systemd",
            "Automation",
            "Scheduling"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-php-security-checklist-2020-xss-csrf-sql-injection/blog-php-security-checklist-2020-xss-csrf-sql-injection-1200.webp"
    },
    {
        "title": "Composer Best Practices: Autoloading, Version Constraints & Monorepos",
        "url": "/blog/composer-best-practices-autoloading-version-constraints-monorepos",
        "description": "Essential Composer tips including PSR-4 autoloading, semantic versioning strategies, and managing a PHP monorepo with path repositories.",
        "type": "post",
        "keywords": "Tooling Composer PHP Autoloading Monorepos Composer Best Practices: Autoloading, Version Constraints & Monorepos Essential Composer tips including PSR-4 autoloading, semantic versioning strategies, and managing a PHP monorepo with path repositories.",
        "category": "Tooling",
        "tags": [
            "Composer",
            "PHP",
            "Autoloading",
            "Monorepos"
        ],
        "updated": "2026-05-06",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-composer-best-practices-autoloading-version-constraints-monorepos/blog-composer-best-practices-autoloading-version-constraints-monorepos-1200.webp"
    },
    {
        "title": "The Beauty of Elegant Code: Why Simplicity Is the Hardest Skill to Master",
        "url": "/blog/beauty-elegant-code-simplicity-hardest-skill-master",
        "description": "Explores why writing simple, readable code demands more discipline and experience than writing complex solutions, with real before/after examples.",
        "type": "post",
        "keywords": "Clean Code PHP Simplicity Refactoring Code Quality The Beauty of Elegant Code: Why Simplicity Is the Hardest Skill to Master Explores why writing simple, readable code demands more discipline and experience than writing complex solutions, with real before/after examples.",
        "category": "Clean Code",
        "tags": [
            "PHP",
            "Clean Code",
            "Simplicity",
            "Refactoring",
            "Code Quality"
        ],
        "updated": "2026-05-08",
        "image": "https://andrej.prus.dev/assets/images/optimized/site-og/site-og-1200.webp"
    },
    {
        "title": "Linux Network Configuration: Static IP, DNS & Netplan on Ubuntu",
        "url": "/blog/linux-network-configuration-static-ip-dns-netplan-ubuntu",
        "description": "Covers Netplan YAML syntax, setting static IPs, configuring DNS resolvers, bonding interfaces, and troubleshooting with ip and ss commands.",
        "type": "post",
        "keywords": "Networking Linux Ubuntu Netplan DNS Static IP Linux Network Configuration: Static IP, DNS & Netplan on Ubuntu Covers Netplan YAML syntax, setting static IPs, configuring DNS resolvers, bonding interfaces, and troubleshooting with ip and ss commands.",
        "category": "Networking",
        "tags": [
            "Linux",
            "Ubuntu",
            "Netplan",
            "Networking",
            "DNS",
            "Static IP"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-integrating-stripe-payments-laravel-subscriptions-webhooks-guide/blog-integrating-stripe-payments-laravel-subscriptions-webhooks-guide-1200.webp"
    },
    {
        "title": "How to Configure a LAMP Stack on Ubuntu: Apache, MySQL & PHP Tuning",
        "url": "/blog/how-configure-lamp-stack-ubuntu-apache-mysql-php-tuning",
        "description": "Full LAMP installation and optimization: MPM worker tuning, MySQL InnoDB settings, PHP-FPM pools, and .htaccess security hardening.",
        "type": "post",
        "keywords": "Web Server LAMP Ubuntu Apache MySQL PHP-FPM How to Configure a LAMP Stack on Ubuntu: Apache, MySQL & PHP Tuning Full LAMP installation and optimization: MPM worker tuning, MySQL InnoDB settings, PHP-FPM pools, and .htaccess security hardening.",
        "category": "Web Server",
        "tags": [
            "LAMP",
            "Ubuntu",
            "Apache",
            "MySQL",
            "PHP-FPM",
            "Web Server"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/page-services-laravel/page-services-laravel-1200.webp"
    },
    {
        "title": "PHP 8.0 New Features: Complete Developer Guide to Named Arguments, JIT and More",
        "url": "/blog/php-80-new-features-named-arguments-jit",
        "description": "The biggest PHP release in years, with a practical breakdown of new syntax features, JIT compilation benefits, and migration tips.",
        "type": "post",
        "keywords": "Core PHP PHP 8.0 Named Arguments JIT Migration PHP 8.0 New Features: Complete Developer Guide to Named Arguments, JIT and More The biggest PHP release in years, with a practical breakdown of new syntax features, JIT compilation benefits, and migration tips.",
        "category": "Core PHP",
        "tags": [
            "PHP 8.0",
            "Named Arguments",
            "JIT",
            "Migration"
        ],
        "updated": "2026-05-06",
        "image": "https://andrej.prus.dev/assets/images/optimized/site-og/site-og-1200.webp"
    },
    {
        "title": "PHP 8 Match Expression vs Switch: Everything You Need to Know",
        "url": "/blog/php-8-match-expression-vs-switch",
        "description": "Detailed comparison of the new match expression against switch, covering exhaustiveness, strict comparison, and return values.",
        "type": "post",
        "keywords": "Core PHP PHP 8 Match Expression Switch PHP 8 Match Expression vs Switch: Everything You Need to Know Detailed comparison of the new match expression against switch, covering exhaustiveness, strict comparison, and return values.",
        "category": "Core PHP",
        "tags": [
            "PHP 8",
            "Match Expression",
            "Switch",
            "Core PHP"
        ],
        "updated": "2026-05-06",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-deploying-php-apps-aws-ec2-ecs-fargate-lambda-runtimes-guide/blog-deploying-php-apps-aws-ec2-ecs-fargate-lambda-runtimes-guide-1200.webp"
    },
    {
        "title": "Linux Disk Management: LVM, Partitions & Filesystem Configuration",
        "url": "/blog/linux-disk-management-lvm-partitions-filesystem-configuration",
        "description": "Explains fdisk, parted, LVM physical volumes, volume groups, logical volumes, and resizing filesystems without downtime.",
        "type": "post",
        "keywords": "Storage Linux LVM Partitions Filesystems Administration Linux Disk Management: LVM, Partitions & Filesystem Configuration Explains fdisk, parted, LVM physical volumes, volume groups, logical volumes, and resizing filesystems without downtime.",
        "category": "Storage",
        "tags": [
            "Linux",
            "Storage",
            "LVM",
            "Partitions",
            "Filesystems",
            "Administration"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-database-migrations-best-practices-laravel-rollbacks-seeds-factories/blog-database-migrations-best-practices-laravel-rollbacks-seeds-factories-1200.webp"
    },
    {
        "title": "How to Use Docker With PHP: Complete Local Development Setup Guide",
        "url": "/blog/how-to-use-docker-with-php-local-development-setup",
        "description": "Shows how to containerize a PHP app with PHP-FPM, Nginx, and MySQL using Docker Compose for reproducible dev environments.",
        "type": "post",
        "keywords": "Tooling Docker PHP PHP-FPM Docker Compose How to Use Docker With PHP: Complete Local Development Setup Guide Shows how to containerize a PHP app with PHP-FPM, Nginx, and MySQL using Docker Compose for reproducible dev environments.",
        "category": "Tooling",
        "tags": [
            "Docker",
            "PHP",
            "PHP-FPM",
            "Docker Compose"
        ],
        "updated": "2026-05-06",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-database-indexing-strategies-php-apps-b-trees-full-text-composite/blog-database-indexing-strategies-php-apps-b-trees-full-text-composite-1200.webp"
    },
    {
        "title": "Building a Real-Time Chat App With PHP WebSockets and Ratchet",
        "url": "/blog/building-real-time-chat-app-php-websockets-ratchet",
        "description": "Full project walkthrough using the Ratchet library to implement pub/sub messaging, rooms, and authentication over WebSockets.",
        "type": "post",
        "keywords": "APIs PHP WebSockets Ratchet Real-Time Building a Real-Time Chat App With PHP WebSockets and Ratchet Full project walkthrough using the Ratchet library to implement pub/sub messaging, rooms, and authentication over WebSockets.",
        "category": "APIs",
        "tags": [
            "PHP",
            "WebSockets",
            "Ratchet",
            "Real-Time"
        ],
        "updated": "2026-05-06",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-api-versioning-in-php-strategies-url-paths-header-based-approaches/blog-api-versioning-in-php-strategies-url-paths-header-based-approaches-1200.webp"
    },
    {
        "title": "Setting Up a Linux Firewall With UFW: Rules, Logging & Best Practices",
        "url": "/blog/setting-up-linux-firewall-ufw-rules-logging-best-practices",
        "description": "Practical UFW configuration covering allow/deny rules, application profiles, rate limiting, IPv6 support, and persistent rule management.",
        "type": "post",
        "keywords": "Security Linux UFW Firewall Ubuntu Hardening Setting Up a Linux Firewall With UFW: Rules, Logging & Best Practices Practical UFW configuration covering allow/deny rules, application profiles, rate limiting, IPv6 support, and persistent rule management.",
        "category": "Security",
        "tags": [
            "Linux",
            "Security",
            "UFW",
            "Firewall",
            "Ubuntu",
            "Hardening"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/site-og/site-og-1200.webp"
    },
    {
        "title": "Linux systemd Services: Create, Enable & Manage Custom Unit Files",
        "url": "/blog/linux-systemd-services-create-enable-manage-custom-unit-files",
        "description": "Shows how to write systemd service, timer, and socket unit files, configure restart policies, and use journalctl for log inspection.",
        "type": "post",
        "keywords": "Administration Linux systemd Services Timers Sockets Linux systemd Services: Create, Enable & Manage Custom Unit Files Shows how to write systemd service, timer, and socket unit files, configure restart policies, and use journalctl for log inspection.",
        "category": "Administration",
        "tags": [
            "Linux",
            "systemd",
            "Services",
            "Timers",
            "Sockets",
            "Administration"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-building-php-sdk-http-client-abstraction-retries-test-fakes/blog-building-php-sdk-http-client-abstraction-retries-test-fakes-1200.webp"
    },
    {
        "title": "Understanding PHP Traits: When to Use Them and When to Avoid Them",
        "url": "/blog/understanding-php-traits-when-to-use-avoid",
        "description": "Practical guidance on trait composition, method conflict resolution, and the design pitfalls developers commonly fall into.",
        "type": "post",
        "keywords": "Core PHP PHP Traits Object-Oriented PHP Architecture Understanding PHP Traits: When to Use Them and When to Avoid Them Practical guidance on trait composition, method conflict resolution, and the design pitfalls developers commonly fall into.",
        "category": "Core PHP",
        "tags": [
            "PHP",
            "Traits",
            "Object-Oriented PHP",
            "Architecture"
        ],
        "updated": "2026-05-06",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-modern-php-development-workflow-git-ci-cd-docker-github-actions/blog-modern-php-development-workflow-git-ci-cd-docker-github-actions-1200.webp"
    },
    {
        "title": "PHP Unit Testing With PHPUnit: From Zero to 100% Code Coverage",
        "url": "/blog/php-unit-testing-with-phpunit-code-coverage",
        "description": "Comprehensive tutorial on writing unit, integration, and data-provider tests using PHPUnit, including mocking and assertion best practices.",
        "type": "post",
        "keywords": "Testing PHPUnit PHP Code Coverage PHP Unit Testing With PHPUnit: From Zero to 100% Code Coverage Comprehensive tutorial on writing unit, integration, and data-provider tests using PHPUnit, including mocking and assertion best practices.",
        "category": "Testing",
        "tags": [
            "PHPUnit",
            "PHP",
            "Testing",
            "Code Coverage"
        ],
        "updated": "2026-05-06",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-building-multi-tenant-saas-apps-laravel-architecture-tenancy-strategies/blog-building-multi-tenant-saas-apps-laravel-architecture-tenancy-strategies-1200.webp"
    },
    {
        "title": "Configuring Nginx on Ubuntu 20.04: Virtual Hosts, SSL & Reverse Proxy",
        "url": "/blog/configuring-nginx-ubuntu-20-04-virtual-hosts-ssl-reverse-proxy",
        "description": "Complete Nginx setup guide - server blocks, Let's Encrypt TLS, HTTP/2, Gzip compression, and proxying to upstream application servers.",
        "type": "post",
        "keywords": "Web Server Nginx Ubuntu TLS Reverse Proxy Let's Encrypt Configuring Nginx on Ubuntu 20.04: Virtual Hosts, SSL & Reverse Proxy Complete Nginx setup guide - server blocks, Let's Encrypt TLS, HTTP/2, Gzip compression, and proxying to upstream application servers.",
        "category": "Web Server",
        "tags": [
            "Nginx",
            "Ubuntu",
            "Web Server",
            "TLS",
            "Reverse Proxy",
            "Let's Encrypt"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/page-laravel-api-development/page-laravel-api-development-1200.webp"
    },
    {
        "title": "Optimizing MySQL Queries in PHP: Indexes, Joins and Execution Plans Explained",
        "url": "/blog/optimizing-mysql-queries-php-indexes-joins-execution-plans",
        "description": "Deep-dive into slow-query diagnosis, index strategies, and using EXPLAIN to drastically cut database round-trip time.",
        "type": "post",
        "keywords": "Database MySQL PHP Query Optimization Indexes Optimizing MySQL Queries in PHP: Indexes, Joins and Execution Plans Explained Deep-dive into slow-query diagnosis, index strategies, and using EXPLAIN to drastically cut database round-trip time.",
        "category": "Database",
        "tags": [
            "MySQL",
            "PHP",
            "Query Optimization",
            "Indexes"
        ],
        "updated": "2026-05-06",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-optimizing-mysql-queries-php-indexes-joins-execution-plans/blog-optimizing-mysql-queries-php-indexes-joins-execution-plans-1200.webp"
    },
    {
        "title": "Linux File Permissions Explained: chmod, chown & ACLs in Depth",
        "url": "/blog/linux-file-permissions-chmod-chown-acls-depth",
        "description": "Demystifies octal and symbolic permission notation, setuid/setgid/sticky bits, and extended ACLs for fine-grained access control.",
        "type": "post",
        "keywords": "Administration Linux Permissions chmod chown ACL Linux File Permissions Explained: chmod, chown & ACLs in Depth Demystifies octal and symbolic permission notation, setuid/setgid/sticky bits, and extended ACLs for fine-grained access control.",
        "category": "Administration",
        "tags": [
            "Linux",
            "Permissions",
            "chmod",
            "chown",
            "ACL",
            "Administration"
        ],
        "updated": "2026-05-08",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-linux-file-permissions-chmod-chown-acls-depth/blog-linux-file-permissions-chmod-chown-acls-depth-1200.webp"
    },
    {
        "title": "PHP Security Checklist 2020: Protect Your App From XSS, CSRF and SQL Injection",
        "url": "/blog/php-security-checklist-2020-xss-csrf-sql-injection",
        "description": "A complete, actionable security checklist covering the OWASP Top 10 vulnerabilities with PHP-specific remediation code snippets.",
        "type": "post",
        "keywords": "Security PHP XSS CSRF SQL Injection PHP Security Checklist 2020: Protect Your App From XSS, CSRF and SQL Injection A complete, actionable security checklist covering the OWASP Top 10 vulnerabilities with PHP-specific remediation code snippets.",
        "category": "Security",
        "tags": [
            "PHP",
            "Security",
            "XSS",
            "CSRF",
            "SQL Injection"
        ],
        "updated": "2026-05-06",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-php-security-checklist-2020-xss-csrf-sql-injection/blog-php-security-checklist-2020-xss-csrf-sql-injection-1200.webp"
    },
    {
        "title": "How to Configure SSH on Linux: Keys, Port Change & Fail2Ban Setup",
        "url": "/blog/how-configure-ssh-linux-keys-port-change-fail2ban-setup",
        "description": "Step-by-step guide to generating SSH key pairs, disabling password authentication, changing the default port, and blocking brute-force attempts with Fail2Ban.",
        "type": "post",
        "keywords": "Security Linux SSH OpenSSH Fail2Ban How to Configure SSH on Linux: Keys, Port Change & Fail2Ban Setup Step-by-step guide to generating SSH key pairs, disabling password authentication, changing the default port, and blocking brute-force attempts with Fail2Ban.",
        "category": "Security",
        "tags": [
            "Linux",
            "SSH",
            "OpenSSH",
            "Fail2Ban",
            "Security"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-how-configure-ssh-linux-keys-port-change-fail2ban-setup/blog-how-configure-ssh-linux-keys-port-change-fail2ban-setup-1200.webp"
    },
    {
        "title": "Master PHP Dependency Injection: A Practical Guide with Real Examples",
        "url": "/blog/master-php-dependency-injection-practical-guide",
        "description": "Explains constructor, setter, and interface injection with concrete examples, showing how DI improves testability and flexibility.",
        "type": "post",
        "keywords": "Architecture PHP Dependency Injection Testing Master PHP Dependency Injection: A Practical Guide with Real Examples Explains constructor, setter, and interface injection with concrete examples, showing how DI improves testability and flexibility.",
        "category": "Architecture",
        "tags": [
            "PHP",
            "Dependency Injection",
            "Architecture",
            "Testing"
        ],
        "updated": "2026-05-06",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-integrating-stripe-payments-laravel-subscriptions-webhooks-guide/blog-integrating-stripe-payments-laravel-subscriptions-webhooks-guide-1200.webp"
    },
    {
        "title": "Laravel vs Symfony in 2020: Which PHP Framework Should You Choose?",
        "url": "/blog/laravel-vs-symfony-2020-php-framework",
        "description": "An objective, data-driven comparison of Laravel and Symfony covering performance benchmarks, ecosystem, and learning curve.",
        "type": "post",
        "keywords": "Laravel Symfony PHP Frameworks Architecture Laravel vs Symfony in 2020: Which PHP Framework Should You Choose? An objective, data-driven comparison of Laravel and Symfony covering performance benchmarks, ecosystem, and learning curve.",
        "category": "Laravel",
        "tags": [
            "Laravel",
            "Symfony",
            "PHP Frameworks",
            "Architecture"
        ],
        "updated": "2026-05-06",
        "image": "https://andrej.prus.dev/assets/images/optimized/page-services-laravel/page-services-laravel-1200.webp"
    },
    {
        "title": "Linux Server Initial Setup: Complete Security Configuration Guide for Beginners",
        "url": "/blog/linux-server-initial-setup-complete-security-configuration-guide-beginners",
        "description": "Covers first-login hardening steps: creating sudo users, disabling root SSH, configuring UFW firewall, and enabling automatic security updates.",
        "type": "post",
        "keywords": "Security Linux Server Security SSH UFW Ubuntu Hardening Linux Server Initial Setup: Complete Security Configuration Guide for Beginners Covers first-login hardening steps: creating sudo users, disabling root SSH, configuring UFW firewall, and enabling automatic security updates.",
        "category": "Security",
        "tags": [
            "Linux",
            "Server Security",
            "SSH",
            "UFW",
            "Ubuntu",
            "Hardening"
        ],
        "updated": "2026-05-07",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-linux-server-initial-setup-complete-security-configuration-guide-beginners/blog-linux-server-initial-setup-complete-security-configuration-guide-beginners-1200.webp"
    },
    {
        "title": "How to Build a REST API in PHP Without a Framework in 2020",
        "url": "/blog/how-to-build-rest-api-php-without-framework-2020",
        "description": "Step-by-step tutorial building a lightweight, dependency-free REST API using only native PHP and best-practice folder structure.",
        "type": "post",
        "keywords": "APIs PHP REST API Native PHP Architecture How to Build a REST API in PHP Without a Framework in 2020 Step-by-step tutorial building a lightweight, dependency-free REST API using only native PHP and best-practice folder structure.",
        "category": "APIs",
        "tags": [
            "PHP",
            "REST API",
            "Native PHP",
            "Architecture"
        ],
        "updated": "2026-05-06",
        "image": "https://andrej.prus.dev/assets/images/optimized/blog-database-migrations-best-practices-laravel-rollbacks-seeds-factories/blog-database-migrations-best-practices-laravel-rollbacks-seeds-factories-1200.webp"
    }
]
