Shift is a service for automating your Laravel upgrades. I built it over 10 years ago. In that time, it's performed over 160,000 upgrades. The motivation is simple: upgrading is tedious, mundane work. Much of which can be automated. Even more so with AI.
In this article, I'll dive into the tech stack, use case, and future of Shift.
The tech stack
Before jumping into the tech stack, it's important to realize Shift was built over 10 years ago. At the time, Laravel 5.0 had just released. Forge had recently launched. There was no Cashier, Spark, Horizon, Livewire, even Tailwind. None of that existed yet.
This is why Shift's tech stack may seem a bit basic. While I like simplicity in code, the tech stack may be different if I built it now. Nonetheless, over the years I have incorporated Tailwind and Livewire. But even still, I don't need much more (YAGNI).
Another important note is Shift is two codebases: the website, laravelshift.com, and the engine.
laravelshift.com is:
- Laravel 12
- Livewire 3 (+Alpine)
- Tailwind 4
- Cashier (+Stripe Billing Portal)
- Socialite
The website is the storefront. It displays the product catalog, handles checkout, and provides a user dashboard to manage your account and Shifts.
There are two interesting parts of the website. First, the public facing pages are completely cached. They load directly from Cloudflare. The cache is warmed every 24 hours or rebuilt on deploy. I go in depth on how I did this in my recent course - Fast Laravel.
Second, I spawn additional queue workers dynamically. While there is one dedicated queue worker, Shift has spikes in load. For example, more Shifts are run on Tuesdays. This is likely a combination of work habits, but also Laravel releases minor updates on Tuesday. An event is fired when Horizon has a long wait time (> 5 minutes). A listener dispatches a job to create a new worker via Digital Ocean's API. That job fires another job with a 1 hour delay to destroy the new worker.
Again, alternatives exist now which do some of this. Spatie also turned my work into a package. But at the time, this was custom for Shift. Since it is so heavily customized, I've never replaced it.
The final interest point about Shift is that I use Shift to upgrade Shift. Or at least laravelshift.com, since it's a Laravel application. Of course, my focus is on the community upgrading their apps. So I normally wait a few months before upgrading to the latest version. I don't risk breaking something during the initial release.
The use case
Most Laravel applications fall behind on versions not because developers don't care, but because the upgrade never gets prioritized. There's always a feature to ship, a bug to fix, something more pressing. The upgrade gets delayed. Then delayed again. Until you're multiple versions behind. Just as I waited before upgrading Shift itself, we may choose not to upgrade immediately - for fear of a breaking change.
Whatever the reason you may be behind, Shift is there when you are ready to upgrade. It can automate years of technical debt in minutes. You don't need to spend days upgrading. You run a Shift, review the pull request, and merge it.
Shift isn't fully hands-off. There are manual changes noted in the pull request comments. In addition, it's not a one-shot upgrade. But that's by design — you should be reviewing what changed in your codebase within the context of that version's changes.
Now, it's easy to think in today's AI world, can't I just use AI? Sure. I think you can guide AI through the upgrade. But it's not really the same result. Shift's goal is different. Shift's bar is higher than simply getting your application compatible or running. Shift's bar is to make your application feel like it's always been running that version of Laravel. It goes well beyond the Upgrade Guide. Shift has 10 years of experience. 10 years of contextual tweaks and thousands of users' feedback.
The community consensus is pretty consistent: "Well worth the price."
Automating even more
Now, with all that said Shift isn't trying to compete with AI. In fact, I want Shift to collaborate with AI. To use both tools to the best of their ability. I recently shared on X what I'm most excited about in the upcoming Laravel 13.x Shift.
Shift has always been built on reliability and deep expertise — deterministic automation you can trust. That's not going away. But there are parts of an upgrade that genuinely benefit from AI - where it may gather more context about your specific application.
I never built Shift with the expectation I could automate 100% of the changes for 100% of applications. I used to look at this like a failure. But developers always expected there would be a little work to do. Adam Wathan, an earlier user of Shift, advised me to embrace the pull request comments and give more guidance. With AI, those detailed comments have now become, ironically, the next bit of automation.
The Laravel 13.x Shift introduces copyable prompts for exactly those cases. Wherever a comment would normally say, "you should review this change", you'll now get a prompt you can paste directly into your AI tool of choice. The prompt is curated by me and AI (Claude) to provide full context — what changed, what Shift already did, and what still needs attention — so you're not starting from scratch.
Conclusion
What I care about most is that you keep your Laravel applications up-to-date. I, of course, think Shift is the best way to do that. But, staying upgraded is what allows you to use the latest features of Laravel and PHP. This, in turn, keeps the community fresh. As someone who has been a PHP developer for over 25 years, freshness matters. A big reason projects or communities become stale is drag. Said another way, all those new features and conventions in the latest version don't matter if no one is up-to-date.
If you'd like to hear more about the origin story or technical details of Shift, you may listen to the final season of The BaseCode Podcast.