The diff of a Laravel 11 upgrade on one mid-size API this week is mostly deletions. Almost empty app/, configuration in one fluent bootstrap file, the slim skeleton I wrote about in January now real. It feels great.
Now look at what survived untouched. The use case class that wraps an order state change in a transaction. The listener that must fire only after commit, because it queues an email about a row that must exist. The cache invalidation that follows every write to a heavily read table. The decision that validation lives in a request class and business rules one layer deeper. None of this is skeleton. None of it got smaller.
The framework became simpler. The product did not.
A framework automates the plumbing between an HTTP request and your code: routing, validation wiring, container, queue transport. It cannot automate where a transaction begins and ends. It cannot know that two writes are one invariant. It cannot decide which endpoint is allowed to be eventually consistent. Those are product decisions, and they are the actual engineering content of a backend.
This is why “framework X is bloated” against “framework Y is simple” bores me. The hard part of my job has been the same through Kohana, Symfony and Laravel: boundaries, invariants, failure modes. The framework only decides how much ceremony surrounds that work. Laravel 11 cuts ceremony well.
Upgrade, enjoy the empty folders. The weight was never in those files. I still felt lighter deleting them, which says more about me than about the framework.