No Chrome, no Node, no problem: PDF generation in Laravel finally grows up
The title is a tad hyperbolic, but this blogpost provides a nice overview of how the Laravel PDF package works under the hood.
Read more [jpcaparas.medium.com]
The title is a tad hyperbolic, but this blogpost provides a nice overview of how the Laravel PDF package works under the hood.
Read more [jpcaparas.medium.com]
We just published a new package called Laravel OpenAPI CLI that turns any OpenAPI spec into dedicated Laravel artisan commands. Each endpoint gets its own command with typed options for path parameters, query parameters and request bodies.
Let me walk you through what the package can do.
Join 9,500+ smart developers
Get my monthly newsletter with what I learn from running Spatie, building Oh Dear, and maintaining 300+ open source packages. Practical takes on Laravel, PHP, and AI that you can actually use.
No spam. Unsubscribe anytime. You can also follow me on X.
"Freek’s newsletter is one of the best ways to stay updated with the Laravel and PHP ecosystem. It consistently highlights useful packages, tools, and ideas from the community, especially the amazing work coming from Spatie. As a Laravel developer building SaaS and web platforms, I find it extremely helpful to discover practical tools and insights that improve my development workflow."
Hafiz Riaz walks through building a document analyzer agent with the Laravel AI SDK. The tutorial covers structured output, streaming responses, and tool use, all in about 30 minutes.
Read more [hafiz.dev]
What if you could write your terminal prompt and shell commands with a language you're already familiar with?
I only switched to Zed last week (you can see my full setup on my uses page), so I'm still learning the ropes. One thing I ran into is that its external formatter configuration is global. You configure one formatter command for PHP, and that's what gets used in every project you open.
The problem is that not all of my projects use the same formatter. Some use Pint, some use PHP-CS-Fixer directly. My Zed config originally pointed to ./vendor/bin/pint, which meant it silently did nothing in projects that don't have Pint installed.
Let me walk you through how I solved this.
Our laravel-responsecache package speeds up your app by caching entire responses on the server. When the same page is requested again, the cached response is served without hitting your controller at all.
We just released v8, a new major version with a powerful new feature: flexible caching. It uses a stale-while-revalidate strategy, so that every visitor gets a fast response, even when the cache is being refreshed.
Let me walk you through it.
After posting a screenshot, I often get questions about which editor, font or tools I'm using. Instead of replying to those questions individually I've decided to just write down the settings and apps that I'm using.
We just released laravel-screenshot, a new package to take screenshots of web pages in Laravel apps.
It uses a driver-based architecture, so you can choose between Browsershot (which requires you to install Chromium) and Cloudflare Browser Rendering (which can be used on environments like Laravel Cloud).
Let me walk you through the package.
Laravel's built-in authorization is great when permissions are defined in code. With gates and policies, you can write logic like this:
// Defined in code, requires a deploy to change Gate::define('edit-posts', function (User $user) { return $user->is_admin; });
But in some projects roles and permissions are dynamic: created by users, managed through an admin panel, or changed at runtime without deploying code. Our Laravel Permission package can help you dynamically create roles and permissions.
We just released v7 which doesn't bring any new features, but cleans up the internal code and modernizes it. Let me walk you through what the package can do.
Laravel Fuse is a circuit breaker package for Laravel queue jobs. When an external service like Stripe or Mailgun goes down, instead of letting thousands of jobs timeout (30s each), the circuit opens after a configurable failure threshold and jobs fail instantly. It supports three-state circuit breaking (closed/open/half-open), intelligent failure classification (429s and auth errors do not trip the circuit), peak hours config, and a built-in status page.
Read more [github.com]
Amit Merchant walks through practical use cases for the Laravel AI SDK: mining user data with Eloquent models as context, building a code review bot that comments on PRs, and creating adaptive quiz systems for EdTech apps. Nice examples of agents, structured output, and conversation memory beyond the typical chatbot demo.
Read more [www.amitmerchant.com]
A fascinating deep dive into the very first commit of Laravel, made by Taylor Otwell on June 9, 2011. The article explores the original directory structure, the early Eloquent ORM, the session system with its clever flash data prefixing, and the authentication basics that are still recognizable in today's framework.
Read more [laravelnepal.com]
A while ago, we released laravel-pdf, a package to generate PDFs in Laravel apps.
Under the hood, it used Browsershot (and therefore Puppeteer/Chrome) to convert HTML to PDF. That approach works great, but it does require Node.js and a headless Chrome binary on your server.
Last week, my buddy Dries shared on X how to generate PDFs using Cloudflare services. This way doesn’t require Node or any binaries. Very neat! This unlocks PDF generation for environments where Node or Chrome cannot be installed easily, like Laravel Cloud.
To support this way of rendering a PDF, we’ve released a new major release (v2) of Laravel PDF. The package now ships with three drivers: Browsershot, Cloudflare Browser Rendering, and DOMPDF. You can also create your own driver. On top of that, we've added queued PDF generation and the ability to set PDF metadata. And to let your AI understand our package, we've added a Laravel Boost skill.
Let me walk you through all of it.
Ray 3.0 is here! Completely rebuilt for better performance (60% less memory), a fresh new look, message archiving, and MCP support so AI agents can interact with Ray directly.
Read more [myray.app]
PHP 8.6 will introduce partial function application, allowing you to pre-fill some arguments while leaving others for later. Brent explains this new language feature with practical examples.
Read more [stitcher.io]
Brent continues his optimization journey processing 11 million database events. Starting from 50k events per second, he implements combined inserts, skips unnecessary deserialization, and reaches 400k events per second. A great deep dive into PHP performance optimization.
Read more [stitcher.io]
The final part of Oh Dear's series on SQL performance. Mattias introduces phpunit-query-count-assertions, a package that catches N+1 queries, duplicate queries, and missing indexes in your test suite. Since implementing this at Oh Dear, they've eliminated 15% of their SELECT queries.
Read more [ohdear.app]
If you're using AI tools like Claude Code to help write code, you've probably noticed they don't automatically know your team's coding conventions. The AI might write perfectly valid PHP, but it won't follow your specific style guide unless you tell it to. That's the problem Laravel Boost solves. It…
– tighten.com - submitted by Kayla Helmick
We released version v1.5.0 of Parental, our package that adds support for Single Table Inheritance (STI) in Laravel. This new version allows types to become other types and use numeric type columns instead of strings. It also adds new helper methods for eager-loading.
Read more [tighten.com]
– danielpetrica.com - submitted by Andrei-Daniel Petrica
A quick but essential fix for anyone pushing the edges of the Laravel ecosystem. The default FrankenPHP binary provided by artisan octane:install is static and locked to PHP 8.4, which causes major headaches if your application relies on PHP 8.5 features or specific system extensions.
Read more [danielpetrica.com]