Freek Van der Herten's Avatar

Freek Van der Herten

@freek

PHP developer at Spatie, built Mailcoach, ‪myray.app‬, ohdear.app and flareapp.io, blogging at ‪freek.dev‬, organising fullstackeurope.com

2,967
Followers
116
Following
372
Posts
25.05.2023
Joined
Posts Following

Latest posts by Freek Van der Herten @freek

This was a productive train ride: I finally updated the Lambda Layer powering sidecar-browsershot to Puppeteer v24 and added automation to make maintenance much easier.
github.com/stefanzweife...

sidecar-browsershot was updated as wel.
github.com/stefanzweife...

07.03.2026 18:33 👍 3 🔁 1 💬 0 📌 0

❓iTerm2 or Ghostty or…?

Tell me why as well 🙂

07.03.2026 17:06 👍 0 🔁 0 💬 5 📌 0
AI Doesn't Reduce Work, It Intensifies It A Berkeley Haas study of 200 employees found that AI makes workers take on more, not less. The productivity gains are real, but exhausting.

🔗 AI Doesn't Reduce Work, It Intensifies It
#productivity #ai #business #burnout #work-lifebalance

06.03.2026 13:30 👍 5 🔁 0 💬 0 📌 0
Oh Dear is now mobile-friendly Every page in Oh Dear now works on mobile. Not just slapped-on media queries, but reworked layouts: a floating action button for navigation, dedicated mobile card views for monitor lists, scrollable tables with fade hints, and bigger touch targets throughout. Over 160 Blade templates were touched.

🔗 Oh Dear is now mobile-friendly
#design #ohdear #ux #mobile #responsive

06.03.2026 10:35 👍 2 🔁 0 💬 0 📌 0
Summary of the upgrade for spatie/crawler from v8 to v9 highlights major changes and improvements in the API functionality.

Summary of the upgrade for spatie/crawler from v8 to v9 highlights major changes and improvements in the API functionality.

I just love how well Claude can do package upgrades.
(🕸️ in this case the spatie crawler)

05.03.2026 15:17 👍 3 🔁 0 💬 1 📌 0
Use the Hyper key Brian Lovin explains how to turn caps lock into a Hyper key that simulates pressing all four modifier keys at once. Use it for instant app switching, Raycast quicklinks, and custom window layouts.

🔗 Use the Hyper key
#tools #macos #workflow #productivity #shortcuts

05.03.2026 13:30 👍 1 🔁 0 💬 0 📌 0
Preview
Why I don't use down migrations | freek.dev Every once in a while, someone opens a PR on one of our open source packages adding a down function to the migration. I usually close those PRs fast with a thank you and a message “We don’t use down migrations in our projects”. While down migrations might seem like a safety net, they're often a false comfort that potentially creates more problems than they solve. Instead of explaining this in every PR separately, let me share why we don't write down migrations and what we do instead.

At Spatie we've used forward-only migrations for years. When something needs reversing, we handcraft a new migration that moves us forward instead of trying to reverse history.

Full post: freek.dev/2900-why-i-...

05.03.2026 12:56 👍 1 🔁 0 💬 0 📌 0
Post image

I never write down migrations.

Down migrations are the least tested code in any Laravel app. They're written once and never run.

And when you do need to roll back, you don't know beforehand what you need to do with the data would already be stored in the updated schema.

05.03.2026 12:56 👍 7 🔁 0 💬 2 📌 0
Write Faster PHP Code: Retracing Brent's Steps In this Tideways video, Brent's blog post on writing faster PHP is put to the test with real profiling data. <iframe width="560" height="315" src="https://www.youtube.com/embed/H4P6aWOvbh8" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

🔗 Write Faster PHP Code: Retracing Brent's Steps

04.03.2026 15:28 👍 0 🔁 0 💬 0 📌 0
How to tell if you're testing the framework Joel Clermont shares a simple trick to determine if a test is covering your application logic or just testing Laravel itself. If you can comment out a chunk of your code and the test still passes, it's probably not worth keeping.

🔗 How to tell if you're testing the framework
#php #testing #bestpractices #laravel

04.03.2026 13:30 👍 3 🔁 0 💬 0 📌 0
Laravel Backup v10: serializable events, resilient multi-destination backups, and more We just released v10 of [laravel-backup](https://spatie.be/docs/laravel-backup), our package that creates backups of your Laravel app. The backup is a zip file containing all files in the directories you specify, along with a dump of your database. You can store it on any of the filesystems Laravel supports, and you can even back up to multiple disks at once. We originally created this package after [DigitalOcean lost one of our servers](https://freek.dev/374-today-digitalocean-lost-our-entire-server). That experience taught us the hard way that you should never rely solely on your hosting provider for backups. The package has been actively maintained ever since. ## Taking backups With the package installed, taking a backup is as simple as running: ```bash php artisan backup:run ``` This creates a zip of your configured files and databases and stores it on your configured disks. You can also back up just the database or just the files: ```bash php artisan backup:run --only-db php artisan backup:run --only-files ``` Or target a specific disk: ```bash php artisan backup:run --only-to-disk=s3 ``` In most setups you'll want to schedule this. In your `routes/console.php`: ```php use Illuminate\Support\Facades\Schedule; Schedule::command('backup:run')->daily()->at('01:00'); ``` ## Listing and monitoring backups To see an overview of all your backups, run: ```bash php artisan backup:list ``` This shows a table with the backup name, disk, date, and size for each backup. The package also ships with a monitor that checks whether your backups are healthy. A backup is considered unhealthy when it's too old or when the total backup size exceeds a configured threshold. ```bash php artisan backup:monitor ``` You'll typically schedule the monitor to run daily: ```php Schedule::command('backup:monitor')->daily()->at('03:00'); ``` When the monitor detects a problem, it fires an event that triggers notifications. Out of the box the package supports mail, Slack, Discord, and (new in v10) a generic webhook channel. ## Cleaning up old backups Over time backups pile up. The package includes a cleanup command that removes old backups based on a configurable retention strategy: ```bash php artisan backup:clean ``` The default strategy keeps all backups for a certain number of days, then keeps one daily backup, then one weekly backup, and so on. It will never delete the most recent backup. You'll want to schedule this alongside your backup command: ```php Schedule::command('backup:clean')->daily()->at('02:00'); ``` ## What's new in v10 v10 is mostly about addressing long-standing community requests and cleaning up internals. The biggest change is that all events now carry primitive data (`string $diskName`, `string $backupName`) instead of `BackupDestination` objects. This means events can now be used with queued listeners, which was previously impossible because those objects weren't serializable. If you have existing listeners, you'll need to update them to use `$event->diskName` instead of `$event->backupDestination->diskName()`. Events and notifications are now decoupled. Events always fire, even when `--disable-notifications` is used. This fixes an issue where `BackupWasSuccessful` never fired when notifications were disabled, which also broke encryption since it depends on the `BackupZipWasCreated` event. There's a new `continue_on_failure` config option for multi-destination backups. When enabled, a failure on one destination won't abort the entire backup. It fires a failure event for that destination and continues with the rest. Other additions include a `verify_backup` config option that validates the zip archive after creation, a generic webhook notification channel for Mattermost/Teams/custom integrations, new command options (`--filename-suffix`, `--exclude`, `--destination-path`), and improved health checks that now report all failures instead of stopping at the first one. On the internals side, the `ConsoleOutput` singleton has been replaced by a `backupLogger()` helper, encryption config now uses a proper enum, and `storage/framework` is excluded from backups by default. The full list of breaking changes and migration instructions can be found in the [upgrade guide](https://github.com/spatie/laravel-backup/blob/main/UPGRADING.md). ## In closing You can find the complete documentation at [spatie.be/docs/laravel-backup](https://spatie.be/docs/laravel-backup) and the source code [on GitHub](https://github.com/spatie/laravel-backup). This is one of the many packages we've created at [Spatie](https://spatie.be). If you want to support our open source work, consider picking up one of [our paid products](https://spatie.be/products).

🌟 Laravel Backup v10: serializable events, resilient multi-destination backups, and more
#php #laravel #package #spatie #backups

04.03.2026 13:19 👍 2 🔁 0 💬 1 📌 0
Preview
Introduction | laravel-backup laravel-backup

Check it out!

✍️ Blog post: freek.dev/3015-larave...
📦 Repo: github.com/spatie/lara...
📖 Docs: spatie.be/docs/larave...

04.03.2026 13:01 👍 0 🔁 0 💬 0 📌 0

v10 is mainly a clean up release, where we could make breaking changes to make the behavior better.

Multi-destination backups are more resilient. With continue_on_failure enabled, a failure on one disk won't abort the rest. It fires a failure event and moves on.

04.03.2026 13:01 👍 1 🔁 0 💬 1 📌 0

📦 A little while ago, we released v10 of Laravel Backup

This one can dump your database and put it in a zip file together with any files you want. It will copy over that zip to any external storage you want.

It can also monitor your backups and alert you if there isn't one after X days.

04.03.2026 13:01 👍 5 🔁 0 💬 1 📌 0
Post image

At Laracon EU, we took a quick picture of the awesome human beings who are part of Spatie’s story, past and present.

Feeling lucky to know every one of them 🙂

04.03.2026 11:55 👍 12 🔁 0 💬 0 📌 0
Preview
Freek Van der Herten writes about Laravel, PHP and AI. Co-owner of Spatie, maintainer of 300+ open source packages with over 2 billion downloads.

Try the search for yourself here: freek.dev/search

04.03.2026 10:48 👍 1 🔁 0 💬 0 📌 0
A search interface on a website displays results related to Laravel packages, including titles, dates, and tags for various articles.

A search interface on a website displays results related to Laravel packages, including titles, dates, and tags for various articles.

Post image

I've updated the search on my blog to use the new major version of our spatie/laravel-site-search package (which can crawl a site and index all content)

I'll talk more about the package soon!

04.03.2026 10:48 👍 4 🔁 1 💬 1 📌 0
Preview
Agent skill | Documentation | Flare The Flare agent skill gives AI coding agents the knowledge to use the [Flare CLI](/docs/flare/general/using-the-cli) to interact with the Flare API. When installed, agents like Claude Code, Cursor, and Codex can access your error data, performance...

Full write-up with demo videos: freek.dev/3034-let-yo...

Flare CLI docs: flareapp.io/docs/flare/...
Agent skill docs: flareapp.io/docs/flare/...

03.03.2026 16:01 👍 0 🔁 0 💬 0 📌 0
Preview
The Agent Skills Directory Discover and install skills for AI agents.

Why a skill instead of MCP? One command vs. per-client server configuration. No separate process, no transport protocols. Just a file in your project.

Skills are portable too. They follow the skills.sh standard, so they work with any compatible agent. Switch tools tomorrow and the skill comes along

03.03.2026 16:01 👍 0 🔁 0 💬 1 📌 0
AI performance reviews for your app with the Flare CLI
AI performance reviews for your app with the Flare CLI The Flare CLI connects to your Flare performance monitoring data and uses AI to turn it into actionable insights, right from your terminal.In this video, you...

It also does AI-powered performance reviews. Ask it to create a performance report for your app, and it comes back with actionable suggestions based on your actual monitoring data. Slow routes, heavy queries, bottlenecks.

www.youtube.com/watch?v=eQR...

03.03.2026 16:01 👍 0 🔁 0 💬 1 📌 0
Fixing a production error with the Flare CLI and AI, from discovery to deploy
Fixing a production error with the Flare CLI and AI, from discovery to deploy Using the Flare CLI and its agent skill to find, fix, and resolve a production error without leaving the terminal.The AI agent looks up the latest error on f...

The real power: the agent can go from error discovery to resolution without you leaving the terminal.

Find the error, analyze the stack trace against your local files, generate a fix, deploy it, and mark the error as resolved in Flare. All in one flow.https://www.youtube.com/watch?v=G3FxC2VDFYM

03.03.2026 16:01 👍 0 🔁 0 💬 1 📌 0
Post image

From there, just ask your agent things like:

"Show me the latest open errors"
"Investigate the most recent RuntimeException and suggest a fix"
"Show me the slowest routes in my app"

The agent fetches data from Flare, cross-references it with your local code, and proposes fixes.

03.03.2026 16:01 👍 0 🔁 0 💬 1 📌 0
Post image

Install the skill in your project:

flare install-skill

That's it. The skill file gets added to your project and any compatible agent (Claude Code, Cursor, Codex) picks it up automatically.

03.03.2026 16:01 👍 0 🔁 0 💬 1 📌 0

The Flare CLI now ships with an agent skill. One command and your AI coding agent can use Flare to triage errors, review performance, and even fix bugs for you.

Here's what that looks like 👇

03.03.2026 16:01 👍 1 🔁 0 💬 1 📌 0
Awesome developers/friends!

Awesome developers/friends!

A group of people poses on stage, with a backdrop announcing lunch sponsorship by Algolia, at a Laracon event.

A group of people poses on stage, with a backdrop announcing lunch sponsorship by Algolia, at a Laracon event.

Picture 1: Ahmedabad, Laracon India, 2023
Picture 2: Amsterdam, Laracon EU, 2026
@LaraconIN @LaraconEU

03.03.2026 14:02 👍 2 🔁 0 💬 0 📌 0
Introducing the SHIP Score: Straightforward prioritization for indie founders A simple scoring system for deciding what to build next. Score each idea on Strategic Heft, Income potential, and Perspiration (effort), then rank them to find your highest-ROI opportunities.

🔗 Introducing the SHIP Score: Straightforward prioritization for indie founders
#productivity #business #startup #entrepreneurship #decisionmaking

03.03.2026 13:55 👍 3 🔁 0 💬 3 📌 0

Under the hood we've upgraded to spatie/crawler v9, removed guzzlehttp/guzzle and symfony/dom-crawler as direct dependencies, and modernized the test suite with Pest v4.

v8 requires PHP 8.4+ and Laravel 12+.

Read the full post here: freek.dev/3041-larave...

03.03.2026 11:25 👍 0 🔁 0 💬 0 📌 0

Also new: XSL stylesheet support. Sitemaps look rough in a browser. Attach a stylesheet with setStylesheet() to make them human-readable. Works on both Sitemap and SitemapIndex.

03.03.2026 11:25 👍 0 🔁 0 💬 1 📌 0

New in v8: automatic sitemap splitting. Large sites can exceed the 50,000 URL limit per file. Now you can call maxTagsPerSitemap() and the package splits into multiple files with a sitemap index automatically.

03.03.2026 11:25 👍 0 🔁 0 💬 1 📌 0

Your Eloquent models can implement the Sitemapable interface and be added to the sitemap directly, one at a time or as a collection.

03.03.2026 11:25 👍 0 🔁 0 💬 1 📌 0