Everything New with Laravel and Cloud | Taylor Otwell Keynote at Laracon US 2026

Taylor Otwell demos Laravel's latest features: AI-friendly framework updates, the Laravel Head package for meta tags, built-in image manipulation, and an AI SDK with string summarization. Laravel Cloud now handles over 3.5 million deploys with a $5 starter plan, scale-to-zero infrastructure, and sub-500ms cold starts, plus support for Go, Python, Node, and Rails alongside Laravel.
Chapters
So up next is Mr. Otwell himself, the founder, CEO, and creator of Laravel. Please welcome Taylor Otwell. All right. How's everyone doing? These are bright lights. It's good to be back. Yeah, it's been a crazy year since the last Laracon in Denver. How many people here, this is your very first Laracon? Wow, that's a lot. It's always, it actually is always quite a few people that are attending their very first Laracon, which is good to see, right? Like we have fresh faces coming into the community. We don't want, you know, we don't want total stagnation, so it's good to see. Like I said, it has been a crazy year since the last Laracon. I think I told this story in Europe, but, you know, when we did like hackathons a year ago before Laracon, None of us were really like heavily using AI, right? Like we were using like Cursor maybe to tab complete or Copilot or something like that. But none of us had like tons of agents up, uh, spinning up code. And that wasn't like weird or anything. It just like wasn't a thing even just one year ago. And you know, this spring when we did a hackathon, uh, before Laracon in Amsterdam, none of us were writing code by hand. Um, so it's just been a crazy time. It's been, Uh, a really exciting time, honestly, but maybe for some people a bit disorienting. And I've personally found it like very invigorating and very exciting. Um, I'm having more fun building things than ever because I can build more things. I can experiment with new ideas. If they don't work, I can throw them away. No big deal. Uh, but if they do work, great. Like I, I can build so much faster. And, um, you know, I think for Laravel, Laravel is just in an amazing place in the age of AI because We have this great, um, opinionated framework that kind of gives the AI guardrails to build things, really complicated apps in like one prompt or one shot. Uh, because the same things that made Laravel easy to understand for humans makes it easy to understand for, uh, AI as well. Uh, which is great. And Laravel's doing great. Um, these are, you know, framework daily installs really since almost the very beginning, you know, starting way down there. Just a couple hundred installs a day. And you can see on the far right, it's taking a very steep increase now to over 350,000 Laravel framework package installs per day, which is wild. And we're seeing new Laravel apps created by a variety of coding agents. Pretty much every major coding agent out there is spinning up new Laravel apps. And in fact, the number of Laravel apps created by agents is doubling about every 5 weeks. So this is an avenue of Laravel apps being created that is increasing rapidly. Agents are spinning up new apps, building new apps all the time, and that's increasing very quickly, which is great for us, right? That's a lot of new people in our community. That's a lot of you building new things and shipping great stuff. And I think, you know, When I think about Laravel in the age of AI, all of the stuff that made Laravel special is, is still relevant, right? Building great software, um, shipping great products, building quickly, being productive, developer happiness. Um, that's what we're still doubling down on at Laravel. That's what I'm still very passionate about. So I just really couldn't be more excited about where we're at. I'm having a lot of fun, and, uh, I hope you are too. So, yeah, great. If you've never been to one of my talks before, I kind of run them a little bit like a casual demo of stuff we've been working on, maybe stuff we've shipped in the last couple of weeks that you might have missed, or maybe the last month or so, some stuff that I'll be unveiling today for the first time. I'll be showing some stuff that's shipping in a couple of weeks from now. So, you kind of get a mix of Stuff we've recently done, stuff we're doing today, and what's coming in the very near future. Yeah, and let's dig into it. I'm going to start kind of on the open source side of things with some framework stuff that we've been shipping. We'll start with some basic stuff, and then we'll work up to some kind of more advanced examples for stuff we're shipping across the board. All right, so I've got this little app here that will just kind of work top to bottom to reveal this stuff and to kind of try it out. Let's go ahead and reveal the first one. to make it a little bit bigger for you. Complex bindings. This is one that just shipped in the last week. It's a very simple feature, but I wanted to show it to you. It's kind of a cool thing you can do. I'm actually going to dive into some code. I know probably a lot of us— how many of us are writing code by hand exclusively? You don't use any AI to write code? A couple hands, maybe, not a lot. How many of your people are not writing any code at all? Mix of both, 50/50. Probably a lot of you. I'm gonna jump into the code even though, um, some of you, you know, some of us may not be writing code as much anymore. I think it's still important to see like what's available to you so that you can have your agent build these things. Or if you're still interested in writing this by hand, you know what's available. So complex bindings, let me show you in my demo app. So this is a Laravel app where we'll walk through some of these features and just kind of, uh, I'll show you how they work. So in this file, I have an example of this. So, This is a very, like, basic route in Laravel where we're injecting a payment gateway. That's an interface. That's a contract. It's not a concrete implementation. And, you know, with interfaces, we could have a couple different implementations of this interface. And so let's go ahead and jump over to the interface file. And Laravel recently this year added a lot of attributes that let you control how things are done in the framework across a variety of different facilities in the framework. So one of them is this bind attribute where you can actually bind an interface to an implementation right next to the interface, like in that interface file, which is really convenient because it kind of just gives you one spot to look. If you look at the interface, you can just immediately see what it's bound to in the container, which is really convenient. You don't have to jump into a service provider or anything like that. But what recently got added is the second attribute, bind when. So what this is basically doing is under normal circumstances, we'll bind the payment gateway to the Stripe payment gateway, but maybe we're gonna run like a beta with a new feature flag of a new payment gateway, let's imagine. And we want to bind the interface to that implementation if a feature flag is active in our database. And I'm using Laravel Pinot, uh, to control my feature flags. Um, so these conditional bindings, this is actually only supported in PHP 8.5. Which unlocked the ability to pass a closure to an attribute. So this is pretty cutting-edge, uh, PHP and pretty cutting-edge framework feature. So anyway, if this feature is, uh, not enabled, and I don't think it is for this user, let's go ahead and hit this route. We will get the Stripe payment gateway, as you can see here. But if we were to jump into like our app service provider and, uh, turn on this feature, I'll just return true here where I define the feature. and we hit the route, we get the beta payment gateway. So simple feature, but I wanted to start small and show you something where you can do kind of complex conditional bindings right in an interface definition, and it lets you build, like, really readable, understandable, kind of cool code, and tap into even your feature flags right in your interface definition. All right, so that's complex conditional bindings and attributes. All right, let's go ahead and hop into the next reveal. Debounced jobs. This is a really cool feature that I feel like, I think it shipped about a month ago, and I feel like just went kind of under the radar for how cool it is, and I wanna show you how it works. So, let's look at the code first. Close this stuff out. I'll go ahead and start a queue worker while I'm over here. If we look at this route, when we run this POST route, we're gonna loop through a loop 20 times, and we're gonna dispatch this job just really quickly, like, 20 instances of that job, you know, basically all at the same time. And then we'll keep track of which ones are executing in the cache. But imagine a situation where, like, you have maybe a search index of products, and every time the product is updated, you want to update the search index. But imagine that the product is updated very frequently, right? Um, either, uh, your catalog is just very, like, updated at a high rate, and, um, you don't necessarily want to update the search index Like every time, if it's updated every few seconds, right? You might wanna debounce the jobs. So basically how that works is if I go to the job definition, there's a new attribute called debounce_for, and then I'm passing the number of seconds that I want to debounce the job for. And then I'll explain max_wait in a second. But basically what this means is no matter how many jobs I queue, only one of them will execute. The last one will win basically, uh, in that 5-second period. So it lets me dispatch jobs very quickly without having to worry about them all executing. Only the last one will win in that 5-second period. So my search index is not like constantly being hit. It kind of lets you, uh, be a little bit more performant or, um, you know, what's the word I'm looking for? It lets you not just like denial of service your, uh, search index. Um, and then we'll just execute the job like normal. Whichever one wins, we'll just put, uh, an entry in the cache that said that Executed successfully, and then we'll be able to visualize this, um, in our browser. So we've got our queue worker running. Let's hit this route, and I've kind of got a little dashboard here for us to visualize this. But if I hit, if I hit this, uh, button to dispatch 20 jobs, see them all push out onto the queue. We're kind of in this waiting period for 5 seconds. The first 19 are just discarded, and then the 20th one should be lighting up green because it executed. So hopefully that helped you visualize kind of how debounce jobs work. It lets you throw a bunch of stuff out onto the queue and just let the last one win. Very convenient. It lets your controllers be very simple and still do something very complex behind the scenes just by adding a simple attribute to your job. So I felt like this feature just was, like, a little bit underrated when it first came out, but was very cool. So try that out if you need to debounce your jobs. All right. Yeah, good one. That was a community contribution. Next reveal, bonus unlocked. There are some bonus reveals throughout the talk that are not in the code, but sort of tangential to the code that I wanted to show you that are very cool. Let's open the first one, php artisan dev. We have made some cool improvements to the development server in Laravel. Let me just walk you through it. So in my terminal, I'll close out this queue worker. You may have seen that recently, I think last year, honestly, we shipped this thing called Composer Dev. where if you run it, it starts up various things that your Laravel app needs to run. It starts up the web server so you can actually hit the app in the browser at localhost port 8000. So there's the app, but it also starts like a queue worker. It starts your Vite stuff. So all your frontend assets are getting compiled and you're getting hot module reloading. Um, and it starts all of that at once in one command. And kind of the idea behind it was, um, if someone new on your team clones down the project, they can just run this one command and everything starts. They don't have to remember a bunch of different terminal commands that they need to run. So this was cool, but we've kind of taken a step further with a new artisan command that does a really similar thing with a couple of added benefits. So I'm gonna kill off the composer dev and, uh, I'm gonna do php artisan dev, and you'll see the output pretty much looks the same. It's starting all of the same stuff, but I wanna walk you through a couple of the benefits. So it started the web server like usual. We can hit the app. It started a queue worker, it started Vite. But, um, let me go ahead and close it down and show you that in the code you can actually programmatically change what runs. So maybe your team wants to add a couple more commands to your dev setup. So you can call dev.commands::artisan and register additional things that should run when you run php artisan dev. So for example, maybe you wanna run your web server on port 9000, or maybe you wanna run the scheduler, uh, via the schedule work command. You can add this in your app service provider so that anyone on your team that boots up the app gets everything they need right out of the box. So now if I start up php artisan dev, we should see— sorry, typo. We should see, you know, there's the scheduler running. So the scheduler is running, we're running scheduled jobs. But another really cool thing about this is packages can hook into this. So let me close it down, and let's do a composer require laravel/reverb. So maybe we're using Reverb for WebSockets. Now, if you install Reverb, that's another thing that you have to run when you start your app, or your WebSockets don't work. So php artisan dev automatically accepts these registrations from packages. They could be our first-party packages or even packages that the community is building. that need to register commands. And you can see now we get a Reverb server running when we run php artisan dev. So it's kind of like one dev command to rule them all, basically, that not only you can tap into programmatically, but packages can register their own commands so that when you start your app up to work on it, everything is running. It's just really convenient, simple feature, but saves you quite a bit of time and, uh, you know, a convenient thing to have. So that is the new php artisan dev command that we are shipping today. Let's see. I'll get rid of that stuff. All right. Let's keep going. Next reveal, refreshing locks. This is another feature that shipped recently that also is very underrated. Let's hop into a route, and I'll kind of show you how it works and what the benefits are. So, Let's imagine that you have, in this case I'm doing it in a route, but you have some long-running task that is generating a lot of reports or something that takes a lot of time, and you want to lock the process, generate all the reports, and then release the lock. That's like a typical Laravel workflow using our atomic locks feature in the cache. The problem with that is if it's very long-running, let's say it's gonna take like an hour, and you grab the lock, And, um, it takes a little bit longer than that, or maybe it takes a little bit shorter than that, or something goes wrong. The lock can be held for way longer than it needs to be in one case, or it cannot be held for long enough in the other case, and then you have, like, a duplicate report being generated. So what is actually a better approach to this, and it wasn't possible until the last few weeks, is take a shorter lock, generate one thing, and then refresh the lock for a shorter amount of time so that if it fails, your lock is only held for like a few seconds and not a whole hour, and you can rerun the job. Hopefully that makes sense. Uh, it's a little bit of a complicated concept, but hopefully this will illustrate it for you. So in this route, I'm gonna grab a lock for just 5 seconds. I'm gonna go through a loop where let's just imagine I'm generating 3 reports, and all I have to do is call lock refresh on line 17. That will refresh the lock for another 5 seconds so I can generate the next report. Or I could pass the number of seconds that I wanna refresh the lock for. If I wanna, uh, refresh it for 10 seconds, if I don't pass the seconds, it will just refresh it for the amount of time I originally requested. Okay? Hopefully that makes sense. But when we hit this route, we should just see it kind of refreshing the lock and spinning through. So it acquired the lock, generating the reports, refreshed the lock on each iteration, and then finally released the lock. Again, very like, Sounds simple under the hood, actually kind of complicated, but very useful if you're running long-running tasks. I recommend you hold the locks for a shorter amount of time, refresh them as you go. It can avoid, like, very kind of painful problems in production. All right, so that is refreshable locks, another really cool community contribution. So thank you to the community for contributing that to our open-source framework. All right, next one. We are baking image manipulations right into Laravel as a first-party thing. This is super cool. So this has kind of been a long time coming, I feel like, but the ability to optimize images, to manipulate them right as a Laravel kind of first-party thing is, uh, gonna be available today. So let's look at this, uh, routes file where we have a few different examples. The most basic example are just like accepting an image through a form. I can call this new optimized method off the request image method that will convert the image to a WebP image. It will optimize it so it's a smaller file size, and then I can just call the store method to throw it out onto Laravel Cloud Storage, some S3-compatible storage, or even just to local disk. Um, and then we'll just return the result and we'll see what happens. So let's go ahead and hit this. I've got this little form here. Um, let's pick an image. I've got some wallpapers here. Upload and optimize. All right, so you can see this is the image we uploaded before. It was 2.35 megabytes. We optimized it to about 500 kilobytes for a 77% reduction. Super easy, built right into Laravel. You don't have to install any other packages or anything like that. Works locally, works on Laravel Cloud. It's really convenient. All right, you can do a few other things. Let me hop back into the code. So, we, we've added a couple other kind of, like, really common image manipulation methods. So, you can scale images, basically resize them while maintaining their aspect ratio. So, in this case, maybe you want to scale an image, uh, you know, to 800 pixels wide. You can control the quality of the output image, you know, with an integer from 0 to 100. And then let's go ahead and hit this route and see what happens. Scale. Okay, we've scaled the image down to 800 pixels. Super simple. You can also do cover. Basically, this is almost like cropping the image that's built right in. You can do contain, which will resize the image, but then allow you to fill in the gaps with a certain hex code or a color. Or you can do even just funky effects like convert it to grayscale. You can rotate images. You can do all sorts of things built right into the framework, and it's all using really simple methods. Cover 500 pixels, contain 500 pixels, scale, grayscale, rotate, sharpen. You can do all of this stuff. You can convert to different formats, and again, you don't really need to install anything extra. It's just built right into the framework now. We tried to kind of COVID the most common stuff. That most developers need. Um, and hopefully that's super convenient for you. Again, even if you're not writing the code, this will be plugged into Laravel Boost so that your agents know that they can tap into all of these new features, uh, right in the framework. Super cool. Nuno did a great job working on this actually, and community member, uh, Oliver Vogel, who maintains the Intervention package, um, which is powering a lot of this under the hood. Thank you so much for your efforts in, uh, making this possible. So really a really great new feature. All right. Let's go back to our directory reveal. Bonus unlocked. I honestly don't remember which bonus this is, uh, so we'll be surprised together. CPX 2.0. This is super cool. So community member Liam Hammett, who's here at the conference, he started this project called CPX a while back. And have you ever used npx in the Node ecosystem? Okay, not a lot of you, so this will actually be cool. It'll be something new. Um, it's easier if I just kind of show you how this works. So when you're using PHP and Composer, maybe a lot of you have seen packages that are like, use composer global require to install this package so that you can use it from anywhere on your machine. Have you ever done anything like that? Composer global require? Um, the problem with that is the way Composer works is it installs all of those packages in one shared Composer directory on your machine, and if any of their version constraints conflict, you're like super hosed. Um, you just like are kind of stuck and you can't get any further. So it's just, it's, it's not great. Um, so CPX really improves that whole story. It lets you run any like, um, command line PHP package just like on the fly. So let me show you how it works. So basically, I can do something like CPX Nuno Maduro PHP Insights, and it will install that package and just run the CLI tool. This is a tool that Nuno built that gives you insights about your PHP code. And I, I'm not like installing it globally. There's no version constraint problems to worry about. I can just run these things on the fly. And it's super, super convenient. Or I could do like CPX Laravel Cloud CLI list. It's gonna run that from the Cloud CLI. But again, I'm not globally installing it. I'm just running like an ad hoc thing. And you know, you could see that it took a second to download the package, but what's cool is if we run it again, it's gonna be very fast. So it caches the things that you use, keeps them all isolated so you don't have any dependency conflicts. And then you can run these things very quickly without cluttering up your, like, global Composer dependencies. It's really a great tool. It's very, very convenient. And, um, lemme show you a couple other things it can do. So I can do things like, I think, CPX installed to see the packages that I've kind of got cached and when I last ran them. Or I could do CPX clean to kind of purge the cache. If there's any updates to the packages and you run the CPX command, it will update the package and then run the command. So you're like, always up to date. It's a really awesome little tool, and CPX 2.0 is going to be available today. It's launching right after I get off stage. Second bonus, back-to-back bonus, Pint and Blade. Let me show you this. So Pint is a tool that Nuno on the open source team built to format your PHP code kind of in this opinionated way so you never have to think about it. Historically, it has never worked on Blade templates, which has always been a real pain point if you're using Blade or using Livewire, Filament, stuff like that. That is also being fixed today. So let me show you an example. Let me see. I'm going to go into a separate project. I have got a Livewire component here, and if I scroll down, you can see, one, my PHP code is kind of messed up, right? Like the braces, they're in the wrong spot. My Blade template down here is also messed up. You know, the if statements aren't really like aligned, the foreach is not aligned, things like that. So I can now just run vendor/bin/pint --blade, and everything is just formatted. It just works. And yeah, really great. So thank you to Nuno. Thank you for the community members that worked on this for making this possible. Really great. I'm not sure there's much more to say about it other than it just works. It formats your Blade now, and that's, that's awesome. All right, I'm gonna close out that project. Let's go back to our list. Laravel Head. This is a new package we are releasing to manage head tag attributes in your applications. I will admit that when the open source team first kind of like pitched this idea, I was like, eh, like, I guess that's okay. The way it turned out, I'm actually super happy with. It's a very cool, convenient thing that, like, once you see it, you're like, oh, yeah, that— I actually have needed that my entire life, and I didn't realize it. So let me show you kind of how it works. I've got a demo here, and we'll look at the code as well. So let's see, where is this demo? So there's a couple new things going on that I want to show you. First, let's go to our App Service Provider. And you can see down here I've defined some defaults about what I want to go in my head tag for my application. This is where I can set sort of like your application level fallback defaults. So my title tag, I want it to be Laricon. I can set a suffix so individual pages will be able to override the title and it will be prefixed to this suffix. So I want every page's title to end with kind of this bar Laravel. I can set a description, I can set canonical URLs, I can set an Open Graph image. I can set, you know, my Twitter card. I can define all of that application-wide, and then in my template, all I have to do is @head to output all of the attributes that should go in my head tag, and then I'll show you how we can override those on a route-by-route basis. So if we hop into these routes, you can see that for this head about route, I can now chain this withHead method onto the route definition. and override the title, override the description. And now on this page, you know, we can see this is kind of a visualization of what the head tag would receive. The title about, you know, I can get the new description, and all of that is just dumped out in the head tag for me. Plus, I get my Twitter image, my Open Graph stuff. Everything just works. All right, back in the code. I can also kind of override it programmatically within the route. I don't have to chain it on the route definition. Uh, which lets me do, you know, if I have kind of more lengthy, uh, head definition I need to add, I can do that here. So I could override the description, I could override the Open Graph type, I override the Open Graph image, uh, for this article. Maybe this is like a blog. I can even do conditional stuff like if this is a draft article, I want it hidden from robots. There's a lot of really cool methods you can use to manipulate all of these tags very easily and very simply from your routes. And, um, if we hit this in our browser, you can see that everything just updates and you just never really have to think about it. This is really cumbersome stuff to like kind of bolt on at the end of your application development cycle. Um, so having this built right in to have this nice way to manage all this is just super convenient. And once I saw it, I was just like, wow, that would've been nice to have, you know, all these years. Um, so pretty cool. And again, if we hit the droughts, you can, or the drafts, you can see that, um, we're not letting robots index this content. We can define schemas. So if we want to define JSON linked data schemas, we can do that. And what that looks like in the code is, you know, we can define product schemas for t-shirts, prices, offers. All of that stuff is built right in. Really a thoroughly done package that's very, very convenient. All right. So that is the new Laravel head package. We're also releasing that today. So you'll be able to start using it in your apps immediately. Really, really nice. All right, I'm gonna get into some AI stuff. So we have our AI SDK, um, which makes working with AI super convenient to do different kinds of agents, text generation, image generation, audio generation, all sorts of stuff. Um, I wanna show you a really cool, simple method that we added just a couple days ago to quickly generate text summaries. All right, so we're now, um, gonna be heading into some of the AI SDK stuff. If I look at this route, I'm gonna make it a little bit bigger. You can see I've got this big long string of text that I'm passing to the string of method. All I have to do now is call summarize, and I will get a summarize of any long string that I want to anywhere in my app. Um, it's becoming increasingly common to kind of have these little AI summaries of things, you know, blog posts, drafts, things like that. So this was very convenient in the same way you can say like imageOf and tell Laravel what you wanted to make an image of. Just being able to call summarize on a string and get an AI-powered summary of any string in your app with zero configuration. We automatically use the cheapest model on your preferred provider that you have configured in your config AI file, and it sort of just works. So let's go ahead and hit this route. We should get a summary of know, that big long chunk of text. All right, so we get a shorter summary. And what's cool is you can actually pass, you know, how many sentences roughly do you want the agent to summarize this into. Uh, very convenient. So I can rerun it and get a little bit shorter summary. Really convenient feature. You can build like an Eloquent cast out of this so that if a post is, uh, is updated, this AI-generated summary automatically gets updated. A lot of kind of like cool stuff you can do with this that's very, very simple. So that's the, uh, new string summarize method, uh, powered by the AI SDK. All right, let's hop into some more stuff. Bonus unlocked. All right, another bonus. Inertia Chrome DevTools. This one is cool. Let me start up, um, my Vite server, and I have got a React starter kit using our Inertia React starter kit right here. I've already got an account here, so let's just log in. And if I open up my Chrome DevTools, there is a new Inertia tab, which is really cool. It is just, like, so simple and so easy to use. I can go to any page that I've navigated to. I can see all of the props that came down from the server. I can see if they're shared. I can see if they're always sent. I can see the HTTP headers that were sent, the response headers. I can even see the routes that handled this request. I can click on it. I can click on the TypeScript component. It opens it right in my editor. It is just so, so slick. Um, and if I navigate around, let me show you this. Uh, let's say if I'm going to like the settings page, you can see that prefetch that came in there on the bottom left, and then I can navigate. And what's really cool is I can see that this was a cache hit right here. And so it shows me, oh, you might wanna view the prefetch request that actually made this request. I can get all the props for that. It is just like, yeah, I don't know. I, I don't know how we survived without this. Um, but Pascal on the open source team just did an amazing job on this. It's almost so simple, it's like hard for me to even demo, 'cause it's just like, it just is what it is. It's just, it's just great. Um, if I come into this order dashboard, this is a polling page. So I can see that like right here on the bottom left, you can see these polling requests come in. So it indicates that these are polls that are happening. I can see the props that were sent down, the new orders. I can expand it all really conveniently. It is just super, super nice. It is in the Chrome extension store, whatever it's called today. You can install it, you can start using it. It will make your Inertia dev experience much, much better. I just, I couldn't be happier to have this out to you today. So enjoy that. All right, let's keep moving. Um, we recently released an OpenAI-compatible provider for the AI SDK. So the AI SDK supports all of the most popular providers, you know, of course Anthropic, uh, OpenAI, Gemini, Bedrock on AWS, and a variety of others. But we also recently added one that's just called OpenAI-compatible, which unlocks like, you know, probably hundreds of other providers that you can use. Um, and even local providers, which I wanted to show you. So in this case, I've got this little AI chat. Um, it's just using the AI SDK to have a simple chat agent in our Laravel app. And, uh, I can control the model up here. And I'm using the, uh, OpenAI compatible driver to talk to Fireworks, who's an inference provider. And I'm gonna be talking to an OpenWeight GPT model by OpenAI. So I can just say, you know, hi, how are you? Um, tell me about Laravel. All right, very fast. So I can, I can hook into a lot more inference providers than I could before just using the same simple AI SDK. Again, like I said, I could even talk to local models. Let me clear out my database so this chat history is gone, and we can switch this to local. I've actually got a model running. I've got a, a Google model running locally on this laptop. Um, hello, how are you? It is not quite as fast to run models locally yet, uh, but it, it's not too bad. Um, what model are you? You can see I'm a large language model trained by Google. So I'm actually talking to a Google-trained model running locally in LM Studio. So nothing's ever leaving my laptop. Um, and our new OpenAI compatible, uh, provider in the AI SDK is what makes this possible. So go out and experiment with a bunch of different models. Um, it opens up a lot of different provider options for you in your Laravel apps and even local models, as you can see here. So really cool. That's also available today. Image embeddings. This is another really fun one and, and really cool one that unlocks a lot of cool possibilities for your app. So we have had embedding support in the AIsDK since it launched where you could generate embeddings from text and then semantically search that text. We are now, uh, today launching multimodal embedding support so you can generate embeddings for images, audio, video, and then quickly search through them in something like a pgvector database. Um, and I'll show you a demo of it. It, it's really cool stuff. Um, so to show you how it works, I actually wrote an Artisan command Let me get to the right route. I wrote an Artisan command to ingest a bunch of images that I have put in my storage directory. So I have this photos directory, and it just has, like, you know, maybe 30 images in it, different wallpapers, and I wrote this command to ingest them all. So in here, I'm just going to loop through every photo. I'm going to optimize it using the new image stuff that we saw earlier. I'm gonna create an AI image, uh, powered by our AI SDK. And then I can just call embeddings_for and pass it the whole, all 30 images at once and generate embeddings, uh, using Google's new Gemini Embedding 2 model. And then I'm going to put them in a local Postgres database that I'm using pgvector on to search. And we'll be able to semantically search these images, uh, very quickly. And it, it's, it's pretty impressive. So let's go ahead and run this artisan command, photos index. Artisan photos index. That's going to run for just a few seconds while it generates those embeddings and puts them in our database. Come on, robots. There we go. All right. We got 36 photos indexed. And let's go ahead and hit this route. And you can see we've kind of got this image directory here, and I can just search semantically across any of the image images. So I can search like cactus and get, uh, hopefully a cactus, or I can search, you know, lake in gold field, and I get an image that looks like that. Or I can search Ferris wheel, right? So we've generated semantic embeddings for all of these images, and what is cool is since the AI SDK caches embeddings, you can see how when I search for this stuff, it kind of took a second because it was generating the embeddings for this, the text that I'm searching for, and then searching the image embeddings. But caching is built into the AI SDK. So now, like, if I search cactus again, did you see how fast it was? Or if I search Ferris wheel, it's like almost instantaneous because we're actually caching the embeddings, and you don't really have to do anything in your own application to unlock this. We just intelligently cache embeddings based on matching text using your configured cache driver. So you can use this to build semantic search for images in your application. But again, not only for images, for audio, if you wanna build semantic search for podcasts or things like that, or even video, if you wanna be able to query semantically for certain videos that contain certain content, and the words don't even have to be contained in the video, right? We're just semantically searching them, and you can very quickly build that in your Laravel apps now. And again, multimodal embedding support is available today in the AI SDK. All right, last bonus of the open source section, Laravel LSP. So we have built a language server for Laravel. You may remember, I don't know if it was last year or year before, we launched a VS Code extension for Laravel that gave you kind of intelligence about your app, config completions, environment variable completions. We have now built a language server to bring that to all editors. So if you're using Zed, if you're using NeoVim, whatever you're using, you now can install the Laravel LSP. You get config completion, you get Vue completion, you get environment variable completion, validation completion, all sorts of stuff. And it can even hook into your agents, which I'll show you, uh, in a second. So let me show you how this works. I actually have installed it on my, uh, Zed editor here locally. So if I open Zed, let me open a recent project, uh, this Laracon project. Actually, let's go into this one. Um, and let's go to this order controller. And if I'm in this project, I should just be able to like, yeah, you can see I'm getting completions on my configs. I can do even like click through. So order index will take me straight to that component. I can do like the env function and I get all my environment variables. This works across all editors, really great. And it brings that intelligence to wherever you're writing code. Or if you're using it like in an agent, I have got this Laravel app and let me open it up real quick. And I've got my OpenCode JSON where I've actually configured the Laravel LSP in my OpenCode agent config. And so now, like, if I start open code and say, I don't know, what is in my routes file? If you look over here on the right on the LSPs, once it reads that routes file, it should activate our Laravel LSP, and that's going to give your AI agents more intelligence about your Laravel apps. And you can see there it activated the PHP IntelliSense, which is kind of the basic PHP LSP, and our Laravel LSP. So even your agent has access to, you know, a little bit more intelligence to help it be guided more correctly when it's building your Laravel app. So again, even if you're not manually editing the code, you can still plug this LSP into your agents and get better results, more correct code. All right, so that is the Laravel LSP. That is also shipping today. So you can install that immediately. All right. Last reveal of the open source section, human tool approvals in the AI SDK. This is one of the really big features that I wanted to get out before tagging a 1.0 of the AI SDK, and it is, it is super, super cool. So, the AI SDK always had tools, and tools are, you know, things that an agent can do. Maybe you have an agent that sends emails, and it has a, a tool that it uses to do that using some email provider. But sometimes tools need, like, human approval. Maybe you want to issue a refund, or before you want to send an email campaign, you want, you know, a Slack notification that lets you click approve, uh, by a human before that campaign is sent. Um, human tool approvals in our AI SDK let you do that. So let's look at that in the code first. Um, I'll go ahead and open the demo, but let's look at the code first, and, um, you can kind of see how you define these types of tools. So I'm gonna open a separate project here. Um, this is basically going to be, uh, a campaign email sender that a marketing team could use to work up an email campaign, and then we're gonna send it to some audience that our application, uh, has registered. So if I go into this send campaign tool, this is a normal Laravel AI SDK agent tool. I can now implement this approvable interface, and this means that this tool potentially needs human approval. And down here further in the class, I just need to define a needs approval method where I can dynamically decide, is this, does this invocation of the tool need human approval? In this case, I'm basically going to require approval before any email campaigns are sent, but I could conditionally check it. Like, I could put an if statement here and return false, you know, like, if we're sending to, like, a testing audience and maybe we don't want human tool approval, I can do that here. All right. But, um, let me just show you what it looks like. It's a little bit easier to see when you actually see it on the screen, but this is all we need to do. And, um, the AI SDK is automatically going to store all of the pending tool approvals. It's gonna serialize them to your database for you. You really don't have to do a lot. All you have to do is like represent the tool approval on the front end however you want, and you can style it however you want. All right. So what it looks like is, um, let's just say we want to draft an invitation to Laracon speakers for the closing reception. I'll send that to the agent. It's going to generate a potential email. Maybe I want to iterate on it a little bit. I can say the reception is over at 8:00 PM. It's at, let's say, Soa Power Station. It will update that email. All right, maybe we're good to send this now. So let's just say, looks good. Send it. Send it. And we should get an approval before it is sent. All right, so now we get this human tool approval waiting for us. And again, we could show this on the web, we could show this in Slack, we could show it wherever we want. And like I said, this is all persisted for you if you're using the remembers conversations trait on your agent. So if I refresh this, you know, everything's persisted, it loads right back up. I can come back to this tomorrow if I want, and that's perfectly fine. Um, if this all looks good, this does. Um, I can just hit approve and send. All right, that campaign's approved. The agent says it was sent to 42 Laracon speakers. Super nice, super easy. And it, it's hard honestly for me to articulate like how much goes into building this kind of feature. Um, there's a lot of stuff that needs to happen, and most other like AI SDKs, they don't really give you any of the persistence or any of that state out of the box. They're just like, yep, There's pending decisions, like, good luck, you know, like storing them. There's no opinions around anything. But with Laravel and our AI SDK and all of the opinions that are baked into the framework, we know how to store this. We know how to make it as simple as possible for you so that it's just super, super easy to set this up, which is typically not trivial. So that's human tool approvals in the AI SDK available today, so you can start using it immediately. All right. That kind of concludes the open source section of the talk. It took a little bit longer than I expected, to be honest. Almost everything I showed you is available today. Um, I'll recap that at the end, but you can kind of start digging in. Hopefully you really enjoy it. Open source is still at the heart of what we do at Laravel. It's still what I'm super passionate about. I spend probably 2 to 3 hours per day on GitHub still to this day. for 15 years, basically, maintaining the Laravel framework. I still read every line of code that goes into the Laravel framework. It is not a slop factory. Even though we are just greatly benefiting from agents, I still really enjoy making sure the framework is very highly curated and a great experience for you all, and hopefully you all enjoy it. All right, I wanna transition to the back half of the talk, which is gonna be about Laravel Cloud, which we have been like pouring our hearts into to make the absolute best deployment experience for Laravel that you've ever seen. And it has come a long way, which I think you'll see today. Um, and Cloud's been doing really well, so thank you for your support. Um, you know, 3.5 million plus cloud deploys, half million deploys in the last month, 50,000 databases we are running here at Laravel now. Uh, which is wild. 150,000 cloud users across 180 countries. Um, there's been an overwhelming amount of support for cloud, which is really great to see. Um, we've recently introduced, if you haven't seen it, a starter plan on Laravel Cloud that is just $5 a month. It is the cheapest way to get started deploying Laravel. You also get $5 of compute included. So what that means is for just $5, and with our new scale to zero stuff, you can run pretty much all of your side projects and stay within that credit, and you don't spend more than $5. We also introduced spin caps, which I'll show you, scale to zero databases, which I'll show you, managed queues, which are just awesome, and you're gonna hear more about today. So I wanted to bring that to your attention, 'cause it is pretty recent. If you didn't know that there was a new pricing plan on cloud that is very accessible for almost every member of the community, give that a shot. Cloud has come a long way, which you'll see today. When we first launched Cloud, you know, a little over a year ago, you know, we would show it to people, and it's impressive, and it's like, cool, but how's that really better than, like, what I have now? Understandable, right? It's like 1.0 of the product. It was just out the door, but it has come so far in the last year-plus months, and I'm just so proud of the team at Laravel for the work they have put into this. In a way, I feel like, I don't know, it feels almost unfair that I get to deliver some of these features to you because so much of the Laravel team has poured their hearts in the cloud. Um, and there's so many new features that weren't there when we launched that make it just totally such a game-changing platform. Preview environments, uh, scale-to-zero Valkyrie, Reverb, MySQL, which wasn't there at launch, uh, managed queues, scheduled auto-scaling, monorepos, which we just launched, and I'll show you. Private cloud networks, secret managers, usage limits, lots of stuff. So if you haven't tried Cloud in a while, give it a shot. I'm gonna give you a quick tour of it today as well as some of the new stuff that we're shipping so you can see what we've been work— we've been working on. All right, so I'm in the Cloud dashboard here. Let's just get started by deploying a fresh Laravel app out on the cloud so you can see what it looks like, and we'll kind of walk through some of the new stuff and what it means. All right, so I've got a Laravel app here. All right, I'm just gonna hit create application, and then I'm dropped into my infrastructure canvas. This is where I can configure my app, and let's go ahead and add a database. Most Laravel apps use a database. It is super easy to add databases in Laravel Cloud. Um, I've already got one created here, a Laravel MySQL database. I'm gonna attach it to this app. That's really all I have to do. What is brand new, uh, within the last couple weeks is scale-to-zero MySQL. So we have invested a lot of time into our scale-to-zero technology on Laravel Cloud, which will put your app to sleep when it's not being used. And previously on our first iteration of kind of hibernation, as we called it, it took like 10 seconds plus to wake up your app. We can now wake it up many cases under a second, in many cases under 500 milliseconds. It feels almost instantaneous, which means that even for your side projects in production, you can totally leave Scale to Zero on, and your users— it's really negligible to your users, and you save a lot of money. We've got great bot protection around it so that your app isn't woken up by bots just constantly keeping it awake. It's really, really a game changer. But what is new is Scale to Zero MySQL, which lets you have a Scale to Zero MySQL database, We already had scale to zero Valky Redis caches, Redis-compatible caches, and your App Compute can scale to zero, and it can all wake up extremely quickly. It is really like full-stack scale to zero, which is very hard to pull off, and I'm really proud of the team for making this happen. All right, so let's go ahead and save that configuration of adding the database to the app. And then, um, I'm just gonna go ahead and deploy this. While this is deploying and we're waiting on kind of this fresh app to come online, let me show you just how fast Scale to Zero is. I've got this app right here called Scale to Zero, and if I click on it, I've got a Scale to Zero app cluster, a Scale to Zero MySQL database, and a Scale to Zero Valkyrie cluster. That database and that cache are running on our infrastructure. This is not through third-party providers. It sits right next to your app, so it's lightning, lightning fast. And let's go ahead and visit this app, and it should take just like a second. The whole stack is up and it was totally sleeping. The app woke up, the database woke up, and the cache woke up because this route is pulling users from the database. It's hitting the cache, and of course we're hitting the app, uh, route. So everything had to wake up, and that's how fast it was. Um, and now it's awake. Very quick. It is unbelievable. Wow. So this is really like a game changer, especially around preview environments, which I'll show you in a little bit, where, you know, with agents generating so much code, um, pull requests and code review and previews is sort of becoming like the, the bottleneck, right? We're generating a lot of code, but with scale to zero across the full stack, you can have your agents churning out tons of features, ship those all the cloud on preview environments with this whole scale-to-zero full-stack setup, and you're not paying anything while you're waiting on, you know, someone to come review that feature or your team to make sure everything looks good. It's all just out there scaled to zero. You're not paying anything, and it wakes up less than a second. It's really, really great for an agentic workflow. All right, so I, I do have a few bullet points. I tweeted I'm not using a script. I did jot down a few bullet points. Let's go back to our main app here that we just deployed. Oh, I did forget one more thing on scale to zero. Sorry. Let me hop over here. Did I lose internet? Okay. We're back. All right. This is my scale to zero app that I was just showing you. One previous limitation of our old hibernation system was people couldn't use hibernation because they had scheduled tasks. Right? Tasks that run every hour or that run every night. And when we first launched Cloud, if you had that, you couldn't scale your app to zero because then the scheduler wouldn't run. We have actually built a scale-to-zero-compatible scheduling system that just works. So you define all your scheduled tasks like normal. When you ship them out to Cloud, we actually detect the scheduled tasks in your app. In this case, I've scheduled this php artisan inspire command to run every day at 5:00 AM. And what happens is we will actually wake the app up, run the scheduled thing, and then it will scale back down to zero for you. So even if you're using scheduled tasks or you're using queue jobs, which we'll see in a bit, you can still turn on scale to zero and take full advantage of the cost savings, still have your agentic workflows, but your scheduled tasks will still run if you want them to. So just making you aware of that, it is relatively new, uh, but a really big unlock for using scale to zero on cloud. All right. Let's go back to that other app we were working on. All right. Let's see. What else did I want to show you? Okay. New HTTP auto scaling stuff. This is also new. So when we build Laravel Cloud, one of, like, the things I think about is we're trying to make incredibly hard problems feel really easy for you. And scaling is one of those things that, you know, if you're managing your own servers, And your app's kind of taken off. You're getting more visitors, and you need to add another server. Well, now you need to add a load balancer. Now you gotta maintain the load balancer. You gotta do security updates on the load balancer. You gotta maintain the second server. You gotta clone the app onto the second server. It really gets kind of nasty pretty quick. Um, when you're using cloud, you know, scaling is as simple as like sliding how much you want us to scale, uh, from 1 server up to 5 servers to 10+ servers. Uh, you can go even higher. if you're on Laravel Private Cloud. And when we first launched, we had these CPU and memory thresholds, which you can see here on the right. We've recently launched within the last month or so more intelligent HTTP demand-based auto scaling in addition to these thresholds. And you don't have to set this up. It's just, it's always turned on on your app. That's why there's no switch for it here. But when you're auto scaling, we will actually watch the HTTP capacity coming into your app and how many available PHP workers you have serving requests. And when those are getting saturated, we will also scale up to another replica on your app. And the reason we do that is if your app is highly efficient, your database is super tuned, your code is very fast, you can actually exhaust your PHP worker capacity before, like, your memory or CPU is exhausted. So we will actually intelligently scale even in that scenario now, and you don't have to configure it. Totally automatic. And again, this is us solving a pretty hard problem, and our infrastructure team kind of going above and beyond to make sure that your life is super easy, which is awesome. So that's just something that's available today. You don't have to do anything. If you're deploying on cloud, you just get that if you have auto scaling turned on. All right, I wanna show you another brand new feature. So we just shipped the Laravel Cloud Secret Manager. So I'm gonna go back up to the org level, this Laracon org, and if I go into my settings and go to secrets, I can now define secrets that I maybe use across a variety of my applications. Maybe like common services I use, maybe I use OpenAI, maybe I use Postmark, Resend, Sentry, uh, companies like this where I want to, like, I'm gonna be using these secrets a lot. I don't want to have to copy them to like every environment that I deploy deploy on cloud, that's really annoying. So I can add them here. They are encrypted locally. We never see the unencrypted version of these secrets, and we store the encrypted version on our side, but they're encrypted locally on your laptop when you add them. And then I can come to any of these apps, and I'll go into my settings here. I'll go into down here to my environment variables, and I can just hit leak secrets. And I can just choose, like, what secrets I want to add to this environment, and that's all I have to do. They'll automatically be injected into the environment when I deploy. I don't have to, like, copy them over every time I'm, like, building a new app. I don't have to copy my Postmark key or my Recents key or my OpenAI key. I can just save them once in the Secret Manager securely and then add them to any environment really, really quickly. Really convenient. All right, I want to talk about some managed queue stuff. We just launched managed queues, um, maybe about a month ago, and we're almost like relaunching it next week. Uh, the infrastructure team has been absolutely cooking on the next iteration of managed queues, which is a whole bundle of improvements that I want to show you really quick. Um, and it almost feels like a whole new thing, like Right? It is really, really next level. Queues are a big part of the Laravel ecosystem. I love queue jobs. A lot of Laravel apps use them heavily. And when we built managed queues on Laravel Cloud, we wanted it to like just work. Like I just wanna put jobs on the queue and I wanna know they're getting executed and they're, it's not gonna pile up. I don't have like my queue jobs backing up because I don't have enough workers. And then on the flip side, if I don't have any jobs, I don't wanna be paying for, 40, 50 workers that I don't need, right? Maybe overnight I don't get a lot of traffic, or I don't get a lot of jobs. I don't want to have to pay for excess infrastructure in that situation. And we basically tried to take, like, everything we learned from building, like, Laravel Horizon, Laravel Vapor, and build just, like, the perfect queue system. And I think it turned out really great. So I'll show you some of the new stuff. When you go to add a managed queue on Laravel Cloud, you get really just a few options you have to configure, and you almost don't have to configure anything if you don't want. You can give the queue a name. Next week we're launching support for first-in-first-out queues. So if you use FIFO queues, which means that the exact order that you queue the jobs in, they will be worked— that is not always the case in distributed queue systems. So under a standard queue, you could dispatch some jobs, it's not a guarantee that they'll be worked in that exact order. They will be worked, But again, they could be kind of shuffled around. But if you want, you can easily enable first-in, first-out support. You just keep queuing jobs like normal. We will handle the rest. We'll make sure that all of the jobs are handled in the exact order that you queue them. Really, really convenient. All you have to do is pick what kind of queue you want. It, it really couldn't be simpler. We're also launching support for a pro class of compute on managed queues, which lets jobs run for longer, up to an hour. Uh, which is really important in AI workflows where you're working with AI providers. Some of these tasks can take a while when you're hitting the LLM. Um, and if you're doing like multi-step agentic workflows in your queue in your Laravel app, you might need this Pro Class Compute. So if you need to run for a longer amount of time, or if you don't need that, you can use the Flex Compute. If your app just needs, if your job just needs to run for a couple minutes, use the cheaper, uh, Flex Compute. All right, so that's gonna be shipping next week as well. Auto scaling. We've made some improvements here. So of course, the minimum workers is 0. This will scale all the way to 0 if you don't have any queued jobs. If there's no jobs on your queue, you don't pay anything for Laravel Cloud managed queues. When we see a job, we will automatically scale up the workers for you. But one addition is you can now actually set a minimum workers if you don't want to scale down to 0. Maybe you always want at least 5 workers. Watching your queue, you can now easily set that in the UI. Um, and then you can also do scheduled overrides, so you can override your auto— auto scaling, uh, strategy. So if you have like a big sale coming up or you have some big promotion coming up, you know you're going to be getting a lot of traffic, schedule like a one-time or recurring override on a certain time, and we will spin up however many queue workers you want so that it's ready. They're warm, they're ready to work jobs. Okay? That's also going to be launching next week. All right. Let's go ahead and I guess I'll go ahead and add this to my app. Once you add a managed queue to your app, you see it right here in your canvas. That's really all you have to do. You can just keep queuing jobs like normal in your Laravel app. It will just work. And we can go ahead and deploy that. So I kind of left out the best feature of the new managed queue system that we built in that we're shipping next week. And to show you, show you how it works, I want to jump into this managed queue app. So in the first iteration of managed queues, um, if jobs hit your queue, it could take like up to 30 seconds if we were scaled to zero to start up a worker to actually process those jobs. Um, this dashboard right here, it's using Laravel Cloud managed queues, The new version that we're shipping next week. I'm gonna put 500 jobs on the queue. I want you to watch how fast it starts processing these jobs. It is totally scaled to zero right now. We're paying nothing for our queue. Let's go ahead and start putting some jobs out there. You can see we're loading up the queue. All right, it's already back at processing. We've already churned through all 500 jobs. The wake-up time is just 1 to 2 seconds to spin up a worker, down from 30 seconds, and sometimes even faster, sometimes 500 to 600 milliseconds to spin up workers on the new Laravel Cloud managed queue. It honestly is so fast, I usually just always leave the min workers at 0. It is just imperceptible. If a job comes in, we will spin up a worker, and it will start working. We have also made a lot of algorithmic— it's a tough one— improvements to managed queues. So in the first version that we launched a month ago, The scaling strategy was somewhat naive. So if 10 jobs came into the queue, we'd spin up 1 worker. So 100 jobs equals 10 workers. Okay, really simple, pretty naive strategy. The problem with that is imagine like 5 jobs come onto the queue, but every job takes like 3 minutes to finish. Previously, we would only spin up 1 worker. The infrastructure team has cooked up a new algorithm where we're watching how long it takes your jobs to process. We're watching how deep the queue is. We're watching if the jobs are idle or active. And now if we see that your jobs are taking a longer amount of time, we will actually scale up the workers. Even though there's only 5 jobs on the queue, we might spin up 5 workers if the jobs are taking a longer amount of time. It is much, much more intelligent, and it's just unbelievable. I'm really proud of the infrastructure team for just building just like the queue system I've always dreamed of. Um, and we're shipping this next week. You can turn it on, you can use scale to zero, you can see the, the fast cold start. It's just, it's unbelievable. Um, and I hope you really, really enjoy it. It's one of my favorite features in Laravel Cloud. All right. Oh, I did wanna show you on, um, if you use managed queues, I actually, um, put an app out here a few days ago to let it run. When you're using managed queues, you get this new queue tab in your, um, Cloud dashboard. So again, this one's been running for a few days, so we have some data. And this is kind of what you get. You can see your job volume over time. You can see the, uh, job duration, both average and kind of the max amount of time your jobs are taking, the memory. And then you can also see the auto scaling that's happening here on the right as we're spinning up and down workers very dynamically to the queue load. You can also see your failed jobs. You can retry failed jobs. You can clear out your failed jobs. Um, we're going to keep improving this, but this gives you a really good start on kind of observing what's happening in your queue. Um, super nice. Um, you can see here I kind of tried to simulate like fixing a performance problem on the queue. So right here the duration drops, and what's really cool is I can actually view these queue metrics by deployment. So let's go to this deployment, and you can see that my average queue runtime was 150 milliseconds per job. I went into the job, I fixed a performance problem on this deployment right here, and now I can see my average time dropped to 89 milliseconds. So very easy to kind of dig in across deployments what's happening in your queue. It's really, really sweet. And really, we're just getting started on the observability part of managed queues and cloud in general, but this is a good start. So check that out if you haven't already. All right, let's go back into my Laravel app. Um, I'm just gonna mention this. I was gonna demo this, but I think I'm gonna skip it in the order of time. We have streamlined how you set up preview deployments. Um, now when you put a new app on Laravel Cloud, just hit set up previews and we walk you through it. And every PR that comes into your app, we will spin up a new environment for it. It will scale to zero, so you're not paying for it. Again, like I mentioned earlier, really great for agentic workflows, so that you're not paying for the preview environments that maybe your agents are spinning up. And when you're ready to review it, we'll spin it up, less than a second, you review it. Once you merge the PR, we will delete all of the infrastructure for you automatically. You don't have to worry about cleaning up your preview environment infrastructure. It just works. But we have streamlined the entire process of setting this up. So if you haven't played with Cloud Preview, Vue deployments, please give that a shot. It is super, super cool. All right. I want to show you just a couple more things before I wrap. Um, a lot of Laravel shops, in fact, um, you know, based on the surveys we put out, up to about 50% of Laravel shops are pairing their Laravel with a Nuxt or a Next frontend in some sort of monorepo or maybe separately Uh, but it's a super common combination, super common way to build Laravel apps. Is anyone using Nuxt or Next in the audience? Yeah, decent number of you. Um, yeah, but that, you know, our scaled customers that have a separate frontend team and backend team, super common setup. This was very gnarly to make work in Laravel Cloud. If you wanted to deploy your Laravel app that was within a monorepo, it was very, very hacky. You could get it to work. It was not pretty. We have improved that greatly, which I'm I wanna show you now. So if I go to new app, um, I have a monorepo app, and if you select a repository that is a monorepo, we will now detect that and we will show you the apps that are within the monorepo. Uh, it is very nice. It is very clean. You can even pick a custom directory. And what is also brand new is if you are running Nuxt or Next on the front end, you can actually just deploy that straight to Laravel Cloud. You don't have to go anywhere else to run that, so you can bring your entire stack. home to Laravel Cloud. So in this case, I've got a Nuxt frontend paired with this Laravel backend. So I'm gonna pick my Nuxt app, uh, you, which you can see the framework was detected. Uh, I'll name it Nuxt app. I can pick the region, create the application. All right, we get a canvas just like usual. You can see that we now have a framework indicator. This is my Nuxt frontend, and I can just hit deploy and it just works. We intelligently detect Nuxt or Next, set the right environment variables. If you attach a database, we'll inject the right database credentials. Um, and you can deploy this right to Laravel Cloud. You get a lot of the same benefits. You get preview environments, you get scale to zero, you can run arbitrary commands, you can see your logs, you can see your metrics. It just works. So if you're running your frontend separately from your Laravel app, you no longer have to go anywhere else to manage that. You can bring your entire stack home. to Laravel Cloud and benefit from almost all of the features I showed you today, including all of the scale-to-zero stuff, which is really, really sweet. All right, we'll go ahead and let this finish deploying, and hopefully we'll have a working Nuxt app on Laravel Cloud, which is super cool. All right, we're almost done here. And we've made these deployments fast, but when you're up on stage waiting for deployment to finish, there is like no slower time in the world. All right. Any second now. There it goes. All right. We've got this app live. We can visit it, and we've got Nuxt running on Laravel Cloud with scale to zero. Really cool. Um, Nuxt and Next support and monorepo support is launching today. So you can play with this tonight if you've got a Nuxt frontend, you've got a Next frontend that you pair with your Laravel app. We also recently added Symfony support on Laravel Cloud. If you're an agency, you work with Symfony clients, uh, you can also run Symfony on Laravel Cloud. Also have managed queue support for for Symfony. Um, so you're not, you don't lose out on any features. You know, if you work on Symfony projects, you can run those here as well. Um, so that's Nuxt Next monorepo support on cloud launching today. We decided to go a little bit further. Why the heck not? Um, we're living in crazy times, so we thought we'd get a little crazy. Um, I think in the AI age, we're gonna see more and more Laravel teams have the freedom to experiment with all sorts of stacks. Right? Laravel's at the heart of what we do, but even in the last few months, I've written a game in TypeScript. I've written a microservice in Go. I've written a microservice in Bun. Um, I've dabbled with Python, right? Probably many of you have been free to experiment with different stacks, different services in your business that just wasn't tenable before. Like, I remember 5 years ago, um, we were gonna write a little monitoring service for Laravel Forge. James Brooks and I were having this discussion in Slack, I remember, and we debated writing it in Go, and I think we actually maybe even did end up writing it in Go at the end of the day. But it was like a big decision, right? We don't have any Go developers on staff. We don't know how to maintain a Go app. Um, but now with AI, right? Like those barriers are removed and, and Laravel teams of the future are gonna be shipping with all sorts of like supporting services, uh, that are supporting their Laravel monolith, and it's just much, much easier. than it was before. So we wanted to support that as well. So let's go ahead and go to a new app. I didn't know what to call this, so I called it mega repo. And this repo actually has a Go microservice supporting my Laravel app and my Nuxt frontend. So let's go ahead and pick Go. I'm using the Gin framework from Go. I'll call it my Go app. We'll put this in US East. All right, so now we've got a Go app. Let's just attach one of our scale-to-zero MySQL databases, right? I can attach that. The database credentials will be injected into the environment for me. Let's save it, and we'll just hit deploy. I don't have to do anything else. It just works. All right, while that's deploying, let's get even crazier. Let's go out here. Maybe we've been dabbling with Python a little bit. Let's get a Flask app going on Laravel Cloud. We'll put that in US East as well. All right, I'm not gonna configure anything. It should just work. Let's hit deploy. Get 2 deployments going. Let's go back. Let's get, let's get, let's keep it going. Let's put a Node microservice out there, maybe a Hano microservice. Okay? Automatically detected. Create the app in US East. No more config. Let's just hit deploy. Again, it's gonna scale to zero. If we get preview environments, we get metrics, we get logs. Okay? We got all 3 of these going. Let's get even crazy. Let's get really crazy. Next month, I'm going to Denmark for Laravel Live Denmark. I'm actually gonna be on stage with DHH. the creator of Ruby on Rails, right? Really my, one of my programming heroes, one of my inspirations for creating Laravel. I thought it would be rude if I went there and I couldn't run a Rails app. You know what I mean? This felt, would feel rude. So let's, let's throw a Rails app on Laravel Cloud. Heroku's dead, right? These, these people need us. They need us. Okay. Let's put a scale-to-zero MySQL database on that. We'll use ActiveRecord Rails, a good framework. Go ahead and kick that off. We'll let that run. Hit deploy. All right, let's see, let's see what's done here. We kicked off a lot of stuff. What do we got? We got our Go app that's live. Let's visit it. It's hitting our MySQL scale-to-zero database. It's pulling users out of the database. We've got Go running on Laravel Cloud with full preview environments. If you wanna build a Go microservice to support your Laravel app, maybe there's a Go package that does something really well. It'd be great to have one route that does that. Throw it out on cloud, your Laravel app can talk to it. You get environment secrets, you get previews, you get everything. Okay, so that one's working. What else do we get? Uh, what about Python? Looks like that one's done. We got Python running on Laravel Cloud. We got a Flask microservice going here that can support our Laravel app. Let's see what else. Is our Node one done? Got a little Hanno microservice out here running Node. Again, if I go to this app, I could go to commands, Node version. I can run arbitrary commands against this infrastructure. It outputs, I get preview environments, I get scaled to zero. Looks like our Rails app is deploying. That'll be the last one here. All right, looks like we're almost done. Looks like that just finished deploying. Again, we attached a scale-to-zero MySQL database. We've got Ruby on Rails on Laravel Cloud. Even DHH is like, even DHH is surprised, you know? All right, so that's a bunch of cool stuff. I think the future for Laravel, or the future for programming is interesting, right? Laravel is, to me, it's not just a framework. It's a platform for building on the web built by people who build on the web. Like I said, I'm still on GitHub as CEO of Laravel. I am on GitHub for hours a day shipping on the web. So it runs from top to bottom at this company. And, you know, I believe in creating a community and a space for people that love to build great great things. And I don't think the age of AI changes that. I think it unlocks a lot of crazy possibilities for this entire community to dabble in things maybe we didn't dabble in before. Laravel's at the heart of everything we do, but we can get a little crazy. Maybe we wanna ship a Go microservice. Maybe we want a Python service helping our Laravel app. Maybe we have a Nuxt frontend and we could bring it all home on an amazing platform and we can still share it with this amazing community. that loves to build really great stuff. So that's what I wanted to show you on cloud today. Um, we also have something called Laravel Private Cloud. Before I wrap, if you're running Laravel seriously at scale, I would love for you to talk to us at our Artisan booth about this. We can give you your own isolated AWS account. We can do, uh, we got SOC 2, we got ISO, we got HIPAA, which is brand new. Um, so if you need us to sign a BAA, if you're doing HIPAA, stuff, we can do that. Again, you get your own AWS account. We can do VPC peering. If you already have an AWS footprint, you wanna talk to some other stuff on AWS, we can VPC peer to your own AWS account. You can still talk to those resources. Um, we can do Artisan support. You get your own Slack channel. We can do RDS, we can do ElastiCache. Um, really, if you think we can't do it, please come talk to us because I promise we've seen it. We, we may be running it. We've got great customers already using this at really, really high scale. So if this is interesting to you, please talk to us. You get the same great cloud experience. The dashboard looks the same. It's not like some clunky enterprise interface. The dashboard is the same great interface that you saw today, but just with your own AWS account and access to some more resources, access to higher scaling limits. We've got customers running hundreds, over 1,000 workers on managed queues. So, if you need that, please come talk to us, come talk to me, and I'll link you up with the right people. It is a really impressive product that we're really proud of. All right, quick recap. Available today, pretty much all of the open-source stuff I showed you, Artisan dev, image stuff, human-in-the-loop tool approval. On the cloud side, MySQL scale to zero, Secret Manager, monorepo support, Next Nuxt frontend support available today. Next week, all the improvements to managed queues I showed you, the fast cold start, you know, the, the basically zero config is launching next week. And then next month, we'll start shipping out some of this Go, Python microservice support. So if you wanna bring that and start experimenting, supplementing your Laravel monolith, you can do that next month. Hopefully that's fun to you. Hopefully that invigorates you. I know that I haven't been more excited to build than I have been in a long time. Um, you know, it, it was never really like about the keystrokes for me. You know, like I think Aaron said this at a recent event. Um, after AI, you know, like I realized, like I, at first I was scared, but then I realized it was never about like the typing of the code. It was about building great software and shipping it to users. And we're now enabled to do that faster, better than ever. So my parting words to you, as always, are to go build something amazing. Share it with who, uh, you work with. Share it with me. I'd love to hear about what you're building. And, uh, I'll see you all at the afterparty. Thanks.
More from Taylor

In conversation with Taylor Otwell: The India Comeback - Hosted by Vishal Rajpurohit

Introducing Laravel VPS & Major Updates to Forge | Laracon Keynote 2025 (Taylor Otwell & Team)

Introducing Nightwatch for Laravel | Taylor Otwell & Jess Archer Keynote at LaraconAU 2024

Laravel Cloud, Inertia 2.0, VS Code Extension, & OSS Updates | Taylor Otwell Keynote | Laracon US

Taylor Otwell "Laravel Herd, Laravel 11, Laravel Folio, Laravel Volt" - Laracon US 2023 Nashville




