來源:YouTube | 01:17:04 | 2026-08-12
Laravel 在 AI 時代不只持續鞏固「具高度意見的全端框架」定位,更把 Laravel Cloud 推向全棧、多語言、可治理的現代 Web 平台,讓個人開發者到大型團隊都能用同一套 DX 建構、部署與管理 Laravel 及其周邊服務。
- AI 加速下的 Laravel 生態成長:框架每日安裝突破 35 萬,agent 建立 Laravel app 的數量約每 5 週翻倍;Laravel 的意見化設計正好成為 AI 生成程式碼的護欄。
- 開源框架新功能:包含條件綁定、任務去抖、可刷新鎖、內建圖片處理,並推出
php artisan dev一鍵開發流程。 - DX 工具鏈升級:CPX 2.0、Pint Blade 格式化、Laravel Head 管理 head 標籤、Inertia Chrome DevTools 與 Laravel LSP 跨編輯器/agent 智慧補全相繼釋出。
- AI SDK 擴充與治理:新增字串摘要、OpenAI-compatible provider、本地模型、多模態嵌入,以及需要人類核准的 agent tools。
- Cloud 全棧 scale-to-zero:MySQL、Valkyrie、app compute、scheduler 皆可休眠並在亞秒級喚醒,且新增 Secret Manager、HTTP 智能自動擴容與 preview 流程簡化。
- Managed Queues 大改版:FIFO、pro compute、更智能的 worker 自動擴容、scheduled overrides、1–2 秒冷啟動與 queue observability 面板。
- Monorepo 與多語言部署:Laravel Cloud 開始支援 Nuxt、Next、Go、Python、Node、Rails,讓團隊把整個 stack 放上同一平台。
- 企業方案與未來路線:Private Cloud 提供獨立 AWS account、VPC peering、SOC 2/ISO/HIPAA;多語言 microservice 支援下個月逐步推出。
-
意見化框架成為 AI 生成程式碼的「護欄」:Taylor 提到一年前尚未大量使用 agent 寫碼,如今幾乎沒人全程手寫。這背後不只是 AI 模型變強,而是 Laravel 的慣例式路由、容器、隊列、Eloquent 等設計,降低了人類與模型理解系統的認知負荷。當 Laravel app 可被 agent 在單一 prompt 中建立時,代表框架的「可預測性」本身就是 AI 時代的競爭力。Taylor 強調他每天仍讀 GitHub、逐行審查進框架的程式碼,並說「這不是 slop factory」,也是在回應愈來愈多人擔心 agent 產生大量低品質程式碼的風險:平台不能只擁抱 AI 產能,仍要維持高度策展與品質控制。
-
Scale-to-zero 從省錢功能變成全棧經濟模型:舊版 hibernation 醒來動輒超過 10 秒,新版可在 500–1000 毫秒內喚醒 app、MySQL、Redis 與 scheduler,使「用到才付費」真正可用於 production side project,也適合大量 agent 產生的 preview environments。把有狀態資料庫也 scale-to-zero 是技術與產品策略上的重要一步:資料庫不像 stateless compute 可任意休眠,必須處理連線、WAL、快取暖機與 bot protection 等細節。Laravel Cloud 把這些包成預設行為,試圖讓「零流量零成本」不再與「使用者遇到明顯延遲」互斥,這是對 Heroku、Vercel、Render 等平台的有力回應。
-
Managed Queues 顯示 Laravel 把分散式系統的「意見」產品化:第一版 managed queues 採用 10 個 job 啟動 1 個 worker 的 naive 策略,新版會觀察 job 處理時間、queue 深度、idle/active 狀態,即使只有 5 個 job,若每個要跑 3 分鐘也可能啟動多個 worker。這類動態判斷過去落在 Horizon/Vapor 使用者自己的設定與維運中,現在成為平台預設。新增 FIFO 也很關鍵:分散式 queue 通常不保證順序,能在 managed 層提供 FIFO 表示 Laravel Cloud 正在把 queue 從「基礎設施」拉高到「開發者工作流」的抽象層,但同時也可能讓使用者在極端背壓或延遲情境下失去部分底層掌控。
-
Laravel Cloud 從 PHP PaaS 轉向多語言 Web 平台:支援 Nuxt/Next、Go、Python、Node,甚至 Rails,並喊出「Heroku is dead, these people need us」,表面上是行銷幽默,實則反映 AI 降低語言轉換成本後,Laravel 團隊更頻繁用 Go、TypeScript、Python 建立支援服務。這不是拋棄 Laravel,而是承認未來 Laravel monolith 周邊會出現更多衛星服務。從平台策略看,Laravel Cloud 與其只服務 PHP 社群,不如成為「build on the web」的共同底座;但風險是品牌稀釋、支援矩陣擴大,以及如何讓非 Laravel 工作負載仍保有同等 DX 與維運品質。
-
Human tool approvals 讓 AI 從生成器轉向可治理的工作流:新增的
approvableinterface 與needsApproval讓 agent 可暫停下來等人類核准,例如寄送行銷 emails 或退款。多數 AI SDK 只提供工具呼叫,不提供 pending decision 的持久化、狀態管理與前端呈現,而 Laravel 把這些「意見」一併完成,這正好切入企業最在意的信任、稽核與安全邊界。在 agentic workflow 愈來愈多的趨勢下,能否把「AI 自主動作」放回可審批、可追溯、可重試的流程,將決定 AI 功能是否能真正進入 production,而不是停在 demo。
| 概念 | 說明 |
|---|---|
| Complex Bindings | 透過 #[Bind] 與 #[BindWhen] 在 interface 旁做條件式容器綁定,BindWhen 依賴 PHP 8.5 的 attribute closure 能力。 |
| Debounce Jobs | 以 #[DebounceFor] 讓大量重複 job 在指定秒數內只有最後一個執行,適合 search index 等頻繁更新情境。 |
| Refreshable Locks | 短暫取得 lock 後在長任務中逐段 refresh(),避免長時間 hold lock 或 lock 提早失效。 |
php artisan dev |
一鍵啟動 web server、queue worker、Vite、scheduler,並允許 app 與 packages 註冊額外 dev commands。 |
| Image Manipulation | Laravel 內建 optimize、scale、cover、contain、grayscale 等圖片處理,底層由 Intervention 驅動。 |
| CPX 2.0 | 免全域安裝即可執行 PHP CLI package,類似 Node 的 npx,隔離依賴避免 global Composer 衝突。 |
| Pint Blade | Pint 新增 --blade 支援,可格式化 Blade/Livewire 樣板。 |
| Laravel Head | 集中定義 title、description、Open Graph、canonical、schema 等 head 屬性,並可 route level 覆寫。 |
| AI SDK Summarize | 對任意長字串呼叫 summarize(),用最便宜模型產生摘要,可控制句數並結合 Eloquent cast。 |
| OpenAI-compatible Provider | AI SDK 新增相容 OpenAI 的 driver,可連接 Fireworks、LM Studio 等外部或本地模型。 |
| Multimodal Embeddings | 產生圖片、音訊、視訊 embedding,並支援 caching,可快速建立 semantic search。 |
| Human Tool Approvals | AI tool 可實作 approvable,經人類在 Web/Slack 核准後才執行,且 pending state 持久化。 |
| Laravel LSP | 跨編輯器語言伺服器,提供 config、env、view、validation 補全,並可整合進 agent。 |
| Scale-to-Zero MySQL | Cloud 連 MySQL 也能休眠,喚醒時間多數低於 1 秒,打造全棧 scale-to-zero。 |
| Managed Queues | 全託管 queue,新版加入 FIFO、pro compute、智能 autoscaling、scheduled overrides 與極快冷啟動。 |
| Monorepo / Polyglot | Cloud 自動偵測 monorepo 中 app,支援 Nuxt、Next、Go、Python、Node 與 Rails 部署。 |
Laravel 的演講揭示了「AI 時代的框架價值」正在移往可預測性與治理能力。當開發者愈來愈少手寫程式碼,框架若提供明確的目錄、binding、queue、驗證與部署慣例,AI agent 就愈容易產生可維護的結果。Laravel 每日安裝數與 agent 建置數量成長,代表開發工具市場的贏家不只是模型或 IDE,更是能把「意見化」做成護欄的框架與平台。
對雲端產業而言,scale-to-zero 已不再是靜態網站的專利。Laravel Cloud 把資料庫、cache、queue、scheduler 都納入休眠與亞秒喚醒,意味著 PaaS 競爭從「部署容易」進入「有狀態工作負載也能極低成本運行」。Managed queues 與多語言支援則進一步模糊了 framework 與 cloud 的邊界:雲平台愈來愈需要理解應用層行為,不只是提供 CPU、記憶體與容器。
長期來看,Laravel 的企業化路線(Private Cloud、HIPAA、SOC 2、VPC peering)與 AI SDK 的 human-in-the-loop 工具核准,正把 Laravel 從開發者社群框架推向可被採購的企業平台。當 AI 加速程式碼產生,瓶頸會轉移到審查、安全、合規與維運;能在這些環節提供預設解的產品,將有機會在下一波 agentic software development 中取得主導地位。
- "Laravel is not just a framework, it's a platform for building on the web built by people who build on the web."(中譯:Laravel 不只是框架,而是由實際在網路上打造產品的人所建立、用來在網路上打造產品的平台。)
- "It was never about the keystrokes for me... it was about building great software and shipping it to users."(中譯:對我而言,重點從來不是敲鍵盤寫程式碼,而是打造優秀的軟體並交付給使用者。)
- "Go build something amazing, share it with who you work with, share it with me."(中譯:去打造令人驚艷的東西,與你的夥伴分享,也與我分享。)
點擊展開完整字幕
0:00 So, up next is Mr. Otwell himself, the 0:03 founder, CEO, and creator of Laravel. 0:07 Please welcome Taylor Otwell. 0:09 >> [cheering] 0:10 >> All right. 0:11 How's everyone doing? 0:13 Ooh, these are bright lights. 0:15 Uh, it's good to be back. Um, yeah, it's 0:18 been a crazy year since uh the last 0:21 Laracon in Denver. How many people here 0:23 this year are very first Laracon? 0:26 Wow, that's a lot. It's always It's 0:29 actually is always quite a few people uh 0:31 that are attending their very first 0:33 Laracon, which is good to see, right? 0:34 Like we have fresh faces coming in to 0:36 the community. We don't want uh you 0:38 know, we don't want total stagnation, so 0:40 it's it's good to see. Um, 0:42 like I said, it has been a crazy year 0:45 since the last Laracon. I think I told 0:47 this story um in Europe, but you know, 0:51 when we did like hackathons a year ago 0:53 before Laracon, 0:56 none of us were really like heavily 0:58 using AI, right? Like we were using like 1:00 cursor maybe to tab complete or Copilot 1:03 or something like that, but none of us 1:04 had like tons of agents up uh spinning 1:07 up code. And that wasn't like weird or 1:08 anything, it just like wasn't a thing 1:10 even just 1 year ago. 1:12 And, you know, this spring when we did a 1:14 hackathon uh before Laracon in 1:16 Amsterdam, none of us were writing code 1:19 by hands. 1:20 Um, so it's just been a crazy time. It's 1:23 been uh a really exciting time, 1:25 honestly, but maybe for some people a 1:27 bit disorienting. And I've personally 1:30 found it like very invigorating and very 1:32 exciting. Um, I'm having more fun 1:34 building things than ever because I can 1:36 build more things. I can experiment with 1:38 new ideas. If they don't work, I can 1:40 throw them away, no big deal. 1:42 Uh but if they do work, great. Like I I 1:44 can build so much faster. 1:46 And um 1:47 you know, I think for Laravel, Laravel 1:49 is just in an amazing place in the age 1:52 of AI because we have this great um 1:56 opinionated framework that kind of gives 1:58 the AI guardrails to build things, 2:01 really complicated apps in like one 2:03 prompt or one shot. Uh, because the same 2:06 things that made Laravel easy to 2:08 understand for humans makes it easy to 2:10 understand for AI as well. 2:13 Uh, which is great. And Laravel's doing 2:16 great. Um, 2:17 these are, you know, framework daily 2:19 installs really since almost the very 2:21 beginning, you know, starting way down 2:22 there at just a couple hundred installs 2:25 a day. And you can see on the far right 2:27 it's taking a very steep increase 2:30 um, now to over 350,000 2:33 Laravel framework package installs per 2:35 day. 2:37 Um, which is wild. Um, 2:39 and we're seeing new Laravel apps 2:42 created by a variety of coding agents. 2:45 Um, pretty much every major coding agent 2:47 out there is spinning up new Laravel 2:49 apps. And in fact, the number of Laravel 2:52 apps created by agents is doubling about 2:56 every 5 weeks. Um, so this is an avenue 2:59 of Laravel apps being created that is 3:01 increasing rapidly. 3:03 Um, agents are spinning up new apps, 3:04 building new apps all the time, and 3:06 that's increasing very quickly. Uh, 3:08 which is great for us, right? That's a 3:10 lot of new people in our community. 3:11 That's a lot of you building new things 3:14 uh, and shipping great stuff. And I 3:16 think, you know, when I think about 3:17 Laravel in the age of AI, all of the 3:19 stuff that made Laravel special is is 3:22 still relevant, right? Building great 3:24 software, 3:25 um, shipping great products, building 3:28 quickly, being productive, developer 3:30 happiness. Um, that's what we're still 3:32 doubling down on at Laravel. That's what 3:34 I'm still very passionate about. So, I 3:36 just really couldn't be more excited 3:38 about where we're at. I'm having a lot 3:39 of fun, and uh, I hope you are, too. 3:42 So, 3:43 um, yeah, great. 3:48 Um, 3:49 if you've never been to one of my talks 3:51 before, I kind of run them a little bit 3:53 like a casual demo of stuff we've been 3:56 working on, maybe stuff we've shipped in 3:58 the last couple weeks that you might 3:59 have missed or maybe the last month or 4:00 so, some stuff that I'll be unveiling 4:03 today for the first time. 4:05 I'll be showing some stuff that's 4:06 shipping in a couple weeks from now. So, 4:08 you kind of get a mix of stuff we've 4:10 recently done, stuff we're doing today, 4:11 and what's coming in the very near 4:13 future. 4:14 Yeah, and let's dig into it. I'm going 4:16 to start kind of on the open source side 4:18 of things with some framework stuff that 4:19 we've been shipping. We'll start with 4:21 some basic stuff and then we'll work up 4:22 to 4:23 some kind of more advanced examples for 4:26 stuff we're shipping across the board. 4:28 All right, so I've got this little app 4:29 here that we'll just kind of work top to 4:31 bottom to reveal this stuff and to kind 4:33 of try it out. 4:34 Let's go ahead and reveal the first one. 4:37 I'm going to make it a little bit bigger 4:38 for you. 4:39 Complex bindings. This is one that just 4:41 shipped in the last week. It's a very 4:43 simple feature, but I wanted to show it 4:45 to you. It's kind of a cool thing you 4:47 can do. I'm actually going to dive into 4:48 some code. I know probably a lot of us 4:50 How many of us are writing code by hand 4:52 exclusively? You don't use any AI to 4:54 write code. 4:56 A couple hands maybe, not a lot. How 4:58 many of people are not writing any code 4:59 at all? 5:02 Mix of both, 50/50. 5:04 Probably a lot of you. 5:06 I'm going to jump into the code even 5:07 though some of you, you know, some of us 5:10 may not be writing code as much anymore. 5:12 I think it's still important to see like 5:13 what's available to you so you can have 5:15 your agent build these things or if 5:16 you're still interested in writing this 5:17 by hand, you know what's available. 5:19 So, complex bindings. Let me show you in 5:21 my demo app. 5:23 So, this is a Laravel app where we'll 5:24 walk through some of these features and 5:26 just kind of I'll show you how they 5:28 work. So, in this file I have an example 5:31 of this. So, this is a very like basic 5:33 route in Laravel where we're injecting a 5:35 payment gateway. That's an interface, 5:37 that's a contract, it's not a concrete 5:39 implementation. 5:41 And you know, with interfaces we could 5:42 have a couple different implementations 5:44 of this interface. 5:45 And so, let's go ahead and jump over to 5:47 the interface file. 5:50 And Laravel recently, this year added a 5:53 lot of attributes that let you control 5:55 how things are done in the framework 5:57 across a variety of different uh 5:58 facilities in the framework. So, one of 6:00 them is this bind attribute where you 6:02 can actually bind an interface to an 6:04 implementation 6:06 right next to the interface, like in 6:08 that interface file, which is really 6:09 convenient because it kind of just gives 6:11 you one spot to look. 6:12 Uh if you look at the interface, you can 6:14 just immediately see what it's bound to 6:15 in the container, which is really 6:16 convenient. You don't have to jump into 6:18 a service provider or anything like 6:19 that. 6:21 But what recently got added is the 6:23 second attribute, bind when. So, what 6:26 this is basically doing is under normal 6:28 circumstances, we'll bind the payment 6:29 gateway to the Stripe payment gateway. 6:32 But maybe we're going to run like a beta 6:34 with a new feature flag of a new payment 6:36 gateway, let's imagine. 6:38 And we want to bind the interface to 6:41 that implementation if a feature flag is 6:43 active in our database. And I'm using 6:44 Laravel Pennant uh to control my feature 6:47 flags. 6:48 Um so, these conditional bindings, this 6:50 is actually only supported in PHP 8.5, 6:54 which unlocked the ability to pass a 6:55 closure to an attribute. So, this is 6:57 pretty cutting-edge uh PHP and pretty 7:00 cutting-edge framework feature. 7:02 So, anyway, if this feature is uh not 7:04 enabled, and I don't think it is for 7:06 this user, let's go ahead and hit this 7:07 route, we will get the Stripe payment 7:09 gateway as you can see here. 7:12 But if we were to jump into like our app 7:14 service provider and uh turn on this 7:16 feature, I'll just return true here 7:18 where I define the feature, and we hit 7:20 the route, we get the beta payment 7:22 gateway. So, simple feature, but I 7:24 wanted to start small and show you 7:26 something where you can do kind of 7:27 complex conditional bindings right in an 7:29 interface definition, and let you build 7:31 like really readable, understandable, 7:33 kind of um cool code um and tap into 7:35 even your feature flags right in your 7:37 interface definition. 7:39 All right, so that's complex conditional 7:41 bindings and attributes. 7:44 All right? Let's go ahead and hop into 7:45 the next reveal. 7:47 Debounce jobs. This is a really cool 7:50 feature that I feel like I think it 7:51 shipped about a month ago and I feel 7:53 like this went kind of under the radar 7:55 uh for how cool it is and I want to show 7:57 you how it works. So, 7:59 let's look at the code first. 8:01 Close this stuff out. Um I'll go ahead 8:04 and start a queue worker while I'm over 8:05 here. 8:07 Um if we look at this route, 8:09 um when we run this post route, we're 8:11 going to loop through a loop 20 times 8:13 and we're going to get a dispatch this 8:14 job uh just really quickly like 20 8:17 instances of that job, you know, 8:18 basically all at the same time. 8:21 And then we'll keep track of which ones 8:22 are executing in the cache, but imagine 8:24 a situation where like you have maybe a 8:27 search index of products and every time 8:29 the product is updated, you want to 8:30 update the search index. But imagine 8:33 that the product is updated very 8:34 frequently, right? Um either 8:37 uh your catalog is just very like 8:40 updated at a high rate and um you don't 8:42 necessarily want to update the search 8:44 index like every time if it's updated 8:47 every few seconds, right? You might want 8:48 to debounce the jobs. 8:51 So, basically how that works is if I go 8:52 to the job definition, there's a new 8:54 attribute called debounce for and then 8:56 I'm passing the number of seconds that I 8:58 want to debounce the job for and then 9:00 I'll explain max weight in a second. But 9:02 basically what this means is 9:04 no matter how many jobs I queue, only 9:06 one of them will execute. The last one 9:08 will win, basically, uh in that 5-second 9:11 period. So, it lets me dispatch jobs 9:14 very quickly without having to worry 9:16 about them all executing. Only the last 9:19 one will win in that 5-second period, so 9:20 my search index is not like constantly 9:22 being hit. It kind of lets you uh be a 9:24 little bit more performant or um 9:27 you know, what's the word I'm looking 9:28 for? It lets you not just like 9:30 denial-of-service your uh search index. 9:34 Um and then we'll just execute the job 9:35 like normal. Whichever one wins, we'll 9:37 just put uh an entry in the cache that 9:39 said that executed successfully, and 9:42 then we'll be able to visualize this um 9:44 in our browser. 9:45 So, we've got our Q worker running. 9:46 Let's hit this route. And I've kind of 9:48 got a little dashboard here for us to 9:50 visualize this. But, if I hit if I hit 9:52 this uh button to dispatch 20 jobs, see 9:55 them all push out onto the queue. We're 9:57 kind of in this waiting period for 5 9:59 seconds. 10:00 The first 19 are just discarded, and 10:02 then the 20th one should be lighting up 10:04 green because it executed. So, hopefully 10:06 that helped you visualize kind of how 10:07 debounce jobs work. It lets you throw a 10:09 bunch of stuff out onto the queue and 10:11 just let the last one win. 10:13 Um very convenient. It lets your 10:14 controllers be very simple and still do 10:17 something very complex behind the scenes 10:19 just by adding a simple attribute to 10:20 your job. Um so, I felt like this 10:22 feature just was like a little bit 10:24 underrated when it first came out, but 10:25 was very cool. 10:27 So, try that out uh if you need to 10:30 debounce your jobs. 10:32 All right. 10:33 Yeah, good one. That was a community 10:34 contribution. 10:38 Next reveal, bonus unlocked. There are 10:40 some bonus reveals throughout the talk 10:42 that are not in the code, but sort of 10:44 tangential to the code that I wanted to 10:46 show you that are very cool. 10:48 Let's open the first one. PHP Artisan 10:51 Dev. 10:52 We have made some cool improvements to 10:54 the development server in Laravel. 10:56 Um 10:57 let me just walk you through it. So, in 10:58 my terminal, I'll close out this Q 11:00 worker. You may have seen that recently, 11:03 I think last year honestly, we shipped 11:04 this thing called composer dev, where if 11:07 you run it, it starts up various things 11:09 that your Laravel app needs to run. It 11:11 starts up the web server, so you can 11:12 actually hit the app in the browser at 11:14 localhost:8000. 11:17 So, there's the app. 11:18 But, it also starts like a Q worker. It 11:20 starts your V stuff, so all your 11:22 front-end assets are getting compiled, 11:23 and you're getting hot module reloading. 11:25 Um and it starts all of that at once in 11:27 one command. And kind of the idea behind 11:29 it was um 11:31 if someone new on your team clones down 11:32 the project, they can just run this one 11:34 command and everything starts. They 11:35 don't have to remember a bunch of 11:37 different terminal commands that they 11:38 need to run. 11:40 So, this was cool, but we've kind of 11:41 taken a step further with a new artisan 11:43 command that does a really similar thing 11:45 with a couple of added benefits. 11:47 So, I'm going to kill off the composer 11:48 dev and I'm going to do PHP artisan dev. 11:52 And you'll see the output pretty much 11:54 looks the same. It's starting all of the 11:56 same stuff, but I want to walk you 11:57 through a couple of the benefits. 12:00 So, it started the web server like 12:01 usual. We can hit the app. It started a 12:03 queue worker. It started V. But, let me 12:05 go ahead and close it down and show you 12:07 that in the code, you can actually 12:09 programmatically change what runs. So, 12:13 maybe your team wants to add a couple 12:14 more commands to your dev setup. So, you 12:17 can call dev commands colon colon 12:19 artisan and register additional things 12:21 that should run when you run PHP artisan 12:23 dev. So, for example, maybe you want to 12:25 run your web server on port 9000 or 12:27 maybe you want to run the scheduler 12:30 via the schedule work command. You can 12:32 add this in your app service provider so 12:33 that anyone on your team that boots up 12:35 the app gets everything they need right 12:38 out of the box. 12:39 So, now if I start up PHP artisan dev, 12:44 we should see 12:45 Oops, sorry. Typo. 12:48 We should see you know, there's the 12:50 scheduler running. So, the schedule's 12:52 running. We're running scheduled jobs. 12:53 But, another really cool thing about 12:55 this is packages can hook into this. So, 12:57 let me close it down 12:59 and let's do a composer 13:02 require 13:05 Laravel Reverb. 13:07 So, maybe we're using Reverb for web 13:09 sockets. Now, if you install Reverb, 13:11 that's another thing that you have to 13:12 run when you start your app or your web 13:15 sockets don't work. So, PHP artisan dev 13:18 automatically accepts these 13:20 registrations from packages. They could 13:22 be our first-party packages or even 13:23 packages that the community is building 13:26 that need to register commands. And you 13:27 can see now we get a reverb server 13:29 running when we run PHP artisan dev. So, 13:32 it's kind of like one dev command to 13:33 rule them all basically that not only 13:35 you can tap into programmatically, but 13:37 packages can register their own commands 13:40 so that when you start your app up to 13:41 work on it, everything is running. Just 13:43 really convenient, simple feature, but 13:45 saves you quite a bit of time and you 13:47 know, a convenient thing to have. 13:49 So, that is the new PHP artisan dev 13:52 command that we are shipping today. 13:57 >> [applause] 13:59 >> Let's see. 14:01 I'll get rid of that stuff. 14:05 All right, let's keep going. Next 14:07 reveal. 14:08 Refreshing locks. This is another 14:10 feature that shipped recently that also 14:11 was very underrated. 14:13 Let's hop into a route and I'll kind of 14:15 show you how it works and what the 14:16 benefits are. 14:18 So, 14:19 let's imagine that you have In this case 14:22 I'm doing it in a route, but you have 14:23 some long-running task that is 14:25 generating a lot of reports or something 14:27 that takes a lot of time and you want to 14:29 lock 14:30 the process, generate all the reports, 14:33 and then release the lock. That's like a 14:34 typical Laravel workflow using our 14:36 atomic locks feature in the cache. 14:38 The problem with that is if it's very 14:40 long-running, let's say it's going to 14:41 take like an hour, 14:43 and you grab the lock and um 14:47 it takes a little bit longer than that 14:48 or maybe it takes a little bit shorter 14:49 than that or something goes wrong. The 14:52 The lock can be held for way longer than 14:54 it needs to be in one case or it can not 14:57 be held for long enough in the other 14:59 case and then you have like a duplicate 15:00 report being generated. 15:02 So, what is actually a better approach 15:04 to this and it wasn't possible until the 15:05 last few weeks is take a shorter lock, 15:09 generate one thing, and then refresh the 15:11 lock for a shorter amount of time so 15:13 that if it fails, your lock is only held 15:16 for like a few seconds and not a whole 15:18 hour and you can rerun the job. 15:21 Hopefully that makes sense. It's a 15:22 little bit of a complicated concept, but 15:24 hopefully this will illustrate it for 15:25 you. So, in this route, I'm going to 15:27 grab a lock for just 5 seconds. 15:29 I'm going to go through a loop where 15:31 let's just imagine I'm generating three 15:32 reports, and all I have to do is call 15:34 lock refresh on line 17. That will 15:37 refresh the lock for another 5 seconds 15:39 so I can generate the next report. Or I 15:42 could pass the number of seconds that I 15:43 want to refresh the lock for if I want 15:45 to refresh it for 10 seconds. If I don't 15:47 pass the seconds, it will just refresh 15:49 it for the amount of time I originally 15:51 requested. 15:52 Okay? Hopefully that makes sense. But 15:54 when we hit this route, we should just 15:55 see it kind of refreshing the lock and 15:58 spinning through. So, it acquired the 15:59 lock, 16:00 generating the reports, refresh the lock 16:02 on each iteration, and then finally 16:04 release the lock. 16:06 Again, very like 16:08 sounds simple under the hood, actually 16:09 kind of complicated, but very useful if 16:11 you're running long-running task. I 16:13 recommend you hold the locks for shorter 16:15 amount of time, refresh them as you go. 16:18 It can avoid like very kind of painful 16:20 problems in production. 16:22 All right. So, that is refreshable 16:23 locks. Another really cool community 16:25 contribution. So, thank you to the 16:27 community for contributing that to our 16:29 open source framework. 16:31 All right. Next one. 16:33 We are baking image manipulations right 16:36 into Laravel as a first-party thing. 16:39 This is super cool. 16:41 So, this has kind of been a long time 16:42 coming, I feel like, but the ability to 16:44 optimize images, to manipulate them 16:46 right as a Laravel kind of first-party 16:48 thing is going to be available today. 16:51 So, let's look at this uh routes file 16:54 where we have a few different examples. 16:55 The most basic example are just like 16:57 accepting an image through a form. I can 16:59 call this new optimized method off the 17:02 request image method. That will convert 17:05 the image to a WebP image. It will 17:07 optimize it so it's a smaller file size, 17:09 and then I can just call the store 17:10 method to throw it out onto Laravel 17:13 cloud storage, some S3 compatible 17:15 storage, or even just to local disk. 17:17 Um and then we'll just return the result 17:19 and we'll see what happens. 17:22 Let's go ahead and hit this. I've got 17:23 this little form here. 17:26 Let's pick an image. I've got some 17:28 wallpapers here. 17:31 Upload and optimize. 17:34 All right, so you can see this is the 17:35 image we uploaded. Before it was 2.35 17:38 megabytes. We optimized it to about 500 17:41 kilobytes for a 77% reduction. Super 17:44 easy. Built right into Laravel. You 17:46 don't have to install any other packages 17:47 or anything like that. Works locally, 17:49 works on Laravel Cloud. It's really 17:51 convenient. 17:53 All right, you can do a few other 17:54 things. We hop back into the code. 17:58 >> [applause] 18:02 >> So, we we've added a couple other kind 18:05 of like really common image manipulation 18:07 methods. So, you can scale images, 18:08 basically resize them while maintaining 18:10 their aspect ratio. So, in this case 18:13 maybe we want to scale an image you 18:15 know, to 800 pixels wide. You can 18:17 control the quality of the output image, 18:19 you know, with an integer from 0 to 100. 18:22 And then let's go ahead and hit this 18:23 route and see what happens. 18:26 Scale. Okay, we've scaled the image down 18:29 to 800 pixels. Super simple. You can 18:31 also do cover. Basically, this is almost 18:34 like cropping the image. That's built 18:36 right in. 18:37 You can do contain, which will 18:40 resize the image but then allow you to 18:42 fill in the gaps with a certain hex code 18:44 or a color. 18:46 Or you can do even just like funky 18:47 effects like convert it to grayscale, 18:49 you can rotate images. You can do all 18:51 sorts of things 18:52 built right into the framework. And it's 18:55 all using really simple methods, you 18:56 know, cover 500 pixels, contain 500 18:59 pixels, 19:01 scale, grayscale, rotate, sharpen. You 19:04 can do all of this stuff. You can 19:05 convert to different formats. 19:07 And again, you don't really need to 19:09 install anything extra. It's just built 19:10 right into the framework now. We tried 19:12 to kind of cover the most common stuff 19:14 that most developers need 19:16 um and hopefully that's super convenient 19:17 for you. Again, even if you're not 19:19 writing the code, this will be plugged 19:20 into Laravel Boost so that your agents 19:22 know that they can tap into all of these 19:24 new features uh right in the framework. 19:27 Super cool. Nuno did a great job working 19:29 on this actually and community member uh 19:31 Oliver Vogel who maintains the 19:32 Intervention package um which is 19:34 powering a lot of this under the hood. 19:36 Thank you so much for your efforts in uh 19:38 making this possible. So, really a 19:39 really great new feature. 19:41 All right. 19:44 >> [applause] 19:48 >> Let's go back to our directory. Reveal. 19:51 Bonus unlocked. I honestly don't 19:53 remember which bonus this is. 19:55 Uh so, we'll be surprised together. 19:57 CPX 2.0. This is super cool. 20:00 So, community member Liam Hammett who's 20:03 here at the conference, he started this 20:05 project called CPX a while back. 20:08 And have you ever used NPX in the Node 20:11 ecosystem? 20:13 Okay, not a lot of you. So, this will 20:14 actually be cool. It'll be something 20:16 new. Um 20:17 it's easier if I just kind of show you 20:18 how this works. So, 20:21 when you're using PHP and Composer, 20:23 maybe a lot of you have seen packages 20:24 that are like use Composer global 20:26 require to install this package so that 20:28 you can use it from anywhere on your 20:29 machine. Have you ever done anything 20:30 like that? Composer global require? 20:34 Um the problem with that is the way 20:36 Composer works is it installs all of 20:38 those packages in one shared Composer 20:40 directory on your machine and if any of 20:43 their version constraints conflict, 20:45 you're like super hosed. 20:47 Um you just like are kind of stuck and 20:48 you can't get any further. 20:50 So, it's just it's it's not great. 20:52 >> [snorts] 20:52 >> Um so, CPX really improves that whole 20:55 story. It lets you run any like 20:57 um command line PHP package just like on 21:00 the fly. 21:02 So, let me show you how it works. So, 21:03 basically I can do something like CPX 21:07 Nuno Maduro PHP Insights. 21:11 And it will install that package and 21:12 just run the CLI tool. This is a tool 21:15 that Nuno built that gives you insights 21:16 about your PHP code. And I I'm not like 21:19 installing it globally. There's no 21:22 version constraint problems to worry 21:23 about. I can just run these things on 21:25 the fly. 21:26 And it's super super convenient. Or I 21:29 could do like CPX Laravel Cloud CLI 21:32 list. 21:34 It's going to run that from the Cloud 21:35 CLI, but again, I'm not globally 21:36 installing it. I'm just running like an 21:38 ad hoc thing. 21:40 And you know, you could see that it took 21:42 a second to download the package, but 21:43 what's cool is if we run it again, it's 21:45 going to be very fast. So, it caches the 21:48 things that you use, keeps them all 21:50 isolated so you don't have any 21:51 dependency conflicts, and then you can 21:53 run these things very quickly without 21:55 cluttering up your like global composer 21:56 dependencies. It's really a great tool. 22:00 It's very very convenient. And um let me 22:03 show you a couple other things it can 22:04 do. 22:05 So, I can do things like I think CPX 22:08 installed to see the packages that I've 22:10 kind of got cached and when I last ran 22:12 them. Or I could do CPX clean to kind of 22:15 purge the cache. If there's any updates 22:17 to the packages and you run the CPX 22:19 command, it will update the package and 22:21 then run the command, so you're like 22:22 always up to date. It's a really awesome 22:24 little tool. And uh CPX 2.0 is going to 22:27 be available today. It's launching um 22:29 right after I get off stage. 22:38 Second bonus. Back-to-back bonus. 22:41 Pint and Blade. 22:43 Let me show you this. 22:45 So, Pint is a tool uh that Nuno on the 22:48 open source team built to format your 22:50 PHP code kind of in this opinionated 22:52 way, so you never have to think about 22:53 it. Historically, it has never worked on 22:55 Blade templates, which has always been a 22:58 real pain point if you're using Blade or 22:59 using Livewire, Filament, stuff like 23:01 that. 23:02 That is also being fixed today. 23:04 So, let me show you an example. 23:06 Uh let me see. I'm going to go into a 23:08 separate project. 23:11 I have got a Livewire component here. 23:15 And if I scroll down, you can see one my 23:16 PHP code is kind of messed up, right? 23:18 Like the braces are in the wrong spot. 23:20 My blade template down here is also 23:22 messed up, you know, the if statements 23:23 aren't really like aligned, the for each 23:26 is not aligned, things like 23:27 [clears throat] that. 23:28 So, I can now just run 23:31 vendor bin 23:33 pint {dash} {dash} blade 23:36 and everything is just formatted. It 23:38 just works. And yeah, really great. 23:43 >> [applause] 23:46 >> So, thank you to Nuno. Thank you for the 23:48 community members that worked on this 23:49 for making this possible. Really great. 23:51 I'm not sure there's much more to say 23:53 about it other than it just works. It 23:54 formats your blade now, and that's 23:55 that's awesome. 23:57 All right, I'm going to close out that 23:58 project. 24:00 Let's go back to our list. 24:03 Laravel head. This is a new package we 24:06 are releasing to manage head tag 24:08 attributes in your applications. I will 24:11 admit that when the open source team 24:12 first kind of like pitched this idea, I 24:14 was like, "Eh, like I guess that's 24:18 okay." 24:19 The way it turned out, I'm actually 24:20 super happy with. It's a very cool 24:23 convenient thing that like once you see 24:24 it, you're like, "Oh yeah, that I 24:25 actually have needed that my entire life 24:27 and I didn't realize it." 24:29 >> [snorts] 24:29 >> So, let me show you kind of how it 24:30 works. Um I've got a demo here and we'll 24:32 look at the code as well. 24:34 So, let's see. Where is this demo? 24:37 So, 24:38 there there's a couple new things going 24:40 on that I want to show you. First, let's 24:41 go to our app service provider. 24:43 And you can see down here I've defined 24:45 some defaults about what I want to go in 24:47 my head tag for my application. 24:49 This is where I can set sort of like 24:51 your application level fallback 24:53 defaults. So, my title tag, I want it to 24:55 be Laracon. 24:57 I can set a suffix. So, individual pages 25:00 will be able to override the title and 25:02 it will be prefixed to this suffix. So, 25:04 I want every page's title to end with 25:05 kind of this bar Laravel. I can set a 25:08 description. I can set canonical URLs. I 25:10 can set an open graph image. Um I can 25:13 set, you know, my Twitter card. I can 25:15 define all of that application wide. And 25:18 then in my template, 25:20 all I have to do is at head to output 25:23 all of the attributes that should go in 25:24 my head tag. And then I'll show you how 25:26 we can override those on a route by 25:28 route basis. 25:30 So, if we hop into these routes, 25:32 you can say that see that for this head 25:34 about route, I can now chain this with 25:36 head method onto the route definition 25:38 and override the title, override the 25:40 description. 25:41 And now on this page, 25:44 you know, we can see this is kind of a 25:45 visual visualization of what the head 25:47 tag would receive. The title about, you 25:50 know, I can get the new description and 25:52 all of that is just dumped out in the 25:53 head tag for me. Plus, I get my Twitter 25:55 image, my open graph stuff. Everything 25:57 just works. 25:59 All right, back in the code. 26:01 I can also kind of override it 26:02 programmatically within the route. I 26:04 don't have to chain it on the route 26:05 definition, uh which lets me do, you 26:07 know, if I have kind of more lengthy uh 26:10 head definition I need to add, I can do 26:12 that here. So, I could override the 26:13 description, I could override the open 26:15 graph type, I could override the open 26:17 graph image uh for this article. Maybe 26:20 this is like a blog. I can even do 26:21 conditional stuff. Like if this is a 26:23 draft article, I want it hidden from 26:24 robots. There's a lot of really cool 26:26 methods you can use to manipulate all of 26:28 these tags very easily and very simply 26:30 from your routes. 26:32 And um if we hit this in our browser, 26:35 you can see that everything just updates 26:37 and you just never really have to think 26:39 about it. This is really cumbersome 26:40 stuff to like kind of bolt on at the end 26:42 of your application development cycle. 26:44 Um so, having this built right in, to 26:46 have this nice way to manage all this is 26:48 just super convenient. And once I saw 26:49 it, I was just like, "Wow, that would 26:51 have been nice to have, you know, all 26:52 these years." 26:54 Um so, pretty cool. 26:55 And again, if we hit the droughts, you 26:56 can uh the drafts, you can see that 26:58 we're not letting robots index this 27:00 content. We can define schemas, so if we 27:02 want to define uh JSON linked data 27:05 schemas, we can do that. And what that 27:07 looks like in the code is, you know, we 27:10 can define product schemas for t-shirts, 27:12 prices, offers, all of that stuff is 27:14 built right in. Really a thoroughly done 27:17 package that that's very very 27:19 convenient. 27:20 All right, so that is the new Laravel 27:22 head head package. We're also releasing 27:24 that today, so you'll be able to start 27:26 using it in your apps immediately. 27:28 Really, really nice. 27:31 >> [applause] 27:37 >> All right, I'm going to get into some AI 27:39 stuff. So, we have our AI SDK, um which 27:42 makes working with AI super convenient 27:44 to do different kinds of agents, text 27:46 generation, image generation, audio 27:48 generation, all sorts of stuff. Um I 27:50 want to show you a really cool, simple 27:52 method that we added just a couple days 27:54 ago to quickly generate text summaries. 27:57 All right, so we're now um 27:59 going to be heading into some of the AI 28:01 SDK stuff. If I look at this route, I'm 28:03 going to make it a little bit bigger. 28:04 You can see I've got this big, long 28:06 string of text that I'm passing to the 28:07 string of method. 28:09 All I have to do now is call summarize, 28:11 and I'm going to summarize of any long 28:13 string that I want to anywhere in my 28:15 app. 28:16 Um it's becoming increasingly common to 28:17 kind of have these little AI summaries 28:19 of things, you know, blog posts, drafts, 28:20 things like that. So, this was very 28:23 convenient in the same way you can say 28:24 like image of and tell Laravel what you 28:26 wanted to make an image of. Just being 28:28 able to call summarize on a string and 28:30 get a AI-powered summary of any string 28:32 in your app with zero configuration. We 28:34 automatically use the cheapest model on 28:36 your preferred provider that you have 28:37 configured in your config AI file. And 28:40 it sort of just works. So, let's go 28:42 ahead and hit this route. 28:44 We should get a summary of, you know, 28:47 that big long chunk of text. 28:50 All right, so we get a shorter summary. 28:51 And what's cool is you can actually 28:53 pass, you know, how many sentences 28:56 roughly do you want the agent to 28:57 summarize this into? 28:59 Uh very convenient, so I can rerun it 29:01 and get a little bit shorter summary. 29:03 Really convenient feature. You can build 29:05 like an eloquent cast out of this so 29:06 that if a post is uh is updated, this 29:09 AI-generated summary automatically gets 29:11 updated. A lot of kind of like cool 29:12 stuff you can do with this that's very, 29:14 very simple. So, that's the uh new 29:16 string summarize method uh powered by 29:18 the AI SDK. 29:21 All right, let's hop into some more 29:22 stuff. 29:23 Bonus unlocked. All right, another 29:24 bonus. 29:26 Inertia Chrome DevTools. 29:29 This one is cool. 29:36 Let me start up um 29:38 my V server. 29:40 And I have got 29:43 a React starter kit using our Inertia 29:47 React starter kit uh right here. I've 29:49 already got an account here, so let's 29:51 just log in. 29:55 And 29:56 if I open up my Chrome DevTools, there 29:58 is a new Inertia tab, which is really 30:00 cool. 30:02 And it is just like so simple and so 30:05 easy to use. I can go to any page that 30:07 I've navigated to. I can see all of the 30:09 props that came down from the server. 30:12 I can see if they're shared. I can see 30:13 if they're always sent. Um I can see the 30:16 HTTP headers that were sent, the 30:18 response headers. I can even see the 30:20 routes 30:21 that handled this request. I can click 30:24 on it. 30:25 I can click on the TypeScript component. 30:26 It opens it right in my editor. 30:28 It is just so, so slick. Um and if I 30:31 navigate around, let me show you this. 30:34 Uh let's say if I'm going to like the 30:35 settings page, you can see that prefetch 30:37 that came in there on the bottom left, 30:39 and then I can navigate. And what's 30:41 really cool is I can see that this was a 30:43 cache hit right here. 30:45 And so it shows me, "Oh, you might want 30:47 to view the prefetch request that 30:48 actually made this request." I can get 30:50 all the props for that. It is just like 30:53 I don't know. I I don't know how we 30:54 survived without this. 30:57 But Pascal on the open source team just 31:00 did an amazing job on this. It's almost 31:02 so simple it's like hard for me to even 31:03 demo cuz it's just like it just is what 31:06 it is. It's just It's just great. Um if 31:08 I come into 31:10 this order dashboard, 31:12 this is a polling page so I can see that 31:14 like right here on the bottom left you 31:16 can see these polling requests come in. 31:17 So it indicates that these are polls 31:19 that are happening. I can see the props 31:20 that were sent down, the new orders. I 31:22 can expand it all really conveniently. 31:25 It is just super super nice. It is in 31:27 the Chrome extension store or whatever 31:29 it's called today. You can install it. 31:31 You can start using it. It will make 31:33 your Inertia devving experience much 31:35 much better. I just I couldn't be 31:36 happier to have this out to you today. 31:38 So enjoy that. 31:44 >> [applause] 31:49 >> All right, let's keep moving. 31:52 Um we recently released an Open AI 31:54 compatible provider for the AI SDK. So 31:57 the AI SDK supports all of the most 31:58 popular providers, you know, of course 32:00 Anthropic, Open AI, Gemini, Bedrock on 32:04 AWS, and a variety of others. But we 32:06 also recently added one that's just 32:08 called Open AI compatible 32:10 which unlocks like, you know, 32:12 probably hundreds of other providers 32:14 that you can use 32:16 um and even local providers which I 32:17 wanted to show you. 32:19 So in this case I've got this little AI 32:21 chat. 32:22 Um it's just using the AI SDK to have a 32:24 simple chat agent in our Laravel app. 32:26 And I can control the model up here. And 32:29 I'm using the Open AI compatible driver 32:32 to talk to Fireworks who's an inference 32:33 provider. And I'm going to be talking to 32:35 an Open Weight GPT model by Open AI. So, 32:38 I can just say, you know, "Hi, how are 32:40 you?" 32:42 Um tell me about Laravel. 32:47 All right, very fast. So, I can I can 32:49 hook into a lot more inference providers 32:51 than I could before just using the same 32:53 simple AI SDK. Again, like I said, I 32:56 could even talk to local models. Let me 32:58 clear out my database so this chat 32:59 history is gone. 33:01 And we can switch this to local. I've 33:03 actually got a model running. I've got a 33:06 Google model running locally on this 33:07 laptop. 33:09 Um 33:10 Hello. How are you? 33:13 It is not quite as fast to run models 33:14 locally yet, uh but it's not too bad. 33:17 Um what model are you? 33:23 You can see I'm a large language model 33:24 trained by Google. So, I'm actually 33:25 talking to a Google trained model 33:27 running locally in LM Studio. So, 33:29 nothing's ever leaving my laptop. Um and 33:31 our new Open AI compatible uh provider 33:34 in the AI SDK is what makes this 33:35 possible. So, go out, experiment with a 33:37 bunch of different models. Um it opens 33:39 up a lot of different provider options 33:41 for you in your Laravel apps and even 33:42 local models as you can see here. So, 33:44 really cool. That's also available 33:46 today. 33:49 >> [applause] 33:54 >> Image embeddings. This is another really 33:56 fun one and really cool one that unlocks 33:58 a lot of cool possibilities for your 33:59 app. 34:00 So, we have had embedding support in the 34:02 AI SDK since it launched where you could 34:05 generate embeddings from text and then 34:06 semantically search that text. We are 34:09 now uh today launching multimodal 34:11 embedding support so you can generate 34:13 embeddings for images, audio, video, and 34:16 then quickly search through them in 34:17 something like a PG vector database. 34:19 Um and I'll show you a demo of it. It's 34:21 really cool stuff. Um so, to show you 34:23 how it works, I actually wrote an 34:25 artisan command. 34:27 Let me get to the right route. I wrote 34:29 an artisan command to ingest a bunch of 34:32 images that I have put in my storage 34:34 directory. 34:36 So, I have this photos directory and it 34:38 just has like, you know, maybe 30 images 34:40 in it, different wallpapers. And I wrote 34:42 this command to ingest them all. 34:45 So, you in here, I'm just going to loop 34:47 through every photo. I'm going to 34:49 optimize it using the new image stuff 34:50 that we saw earlier. I'm going to create 34:52 an AI image uh powered by our AI SDK. 34:56 And then I can just call embeddings for 34:58 and pass it the whole all 30 images at 35:01 once and generate embeddings uh using 35:04 Google's new Gemini embedding two model. 35:07 And then I'm going to put them in a 35:08 local Postgres database that I'm using 35:11 PG vector on to search. And we'll be 35:13 able to semantically search these images 35:15 uh very quickly. And it's it's pretty 35:17 impressive. So, let's go ahead and run 35:18 this artisan command uh photos index. 35:22 artisan 35:25 photos index 35:28 That's going to run for just a few 35:29 seconds while it generates those 35:31 embeddings and puts them in our 35:32 database. 35:39 Come on, robots. There we go. All right, 35:42 we got 36 photos indexed. 35:44 And let's go ahead and hit this route. 35:46 And you can see we've kind of got this 35:47 image directory here. And I can just 35:49 search semantically across any of the 35:51 image images. So, I can search like 35:53 cactus and get uh hopefully a cactus. Or 35:57 I can search, you know, lake and gold 35:59 field. 36:01 And I get an image that looks like that. 36:03 Or I can search Ferris wheel. 36:06 Right, so we've generated semantic 36:08 embeddings for all of these images. And 36:09 what is cool is since the AI SDK caches 36:13 embeddings, you can see how when I 36:14 search for this stuff, it kind of took a 36:16 second because it was generating the 36:17 embeddings for this the text that I'm 36:19 searching for and then searching the 36:21 image embeddings. But, caching is built 36:23 into the AI SDK. So, now, like if I 36:25 search cactus again, did you see how 36:27 fast it was? 36:28 If I search Ferris wheel, it's like 36:30 almost instantaneous because we're 36:32 actually caching the embeddings, and you 36:34 don't really have to do anything in your 36:35 own application to unlock this. We just 36:37 intelligently cache embeddings based on 36:39 matching text using your configured 36:41 cache driver. So, you can use this to 36:43 build semantic search for images in your 36:44 application, but again, not only for 36:46 images, for audio. If you want to build 36:47 semantic search for podcasts or things 36:49 like that, or even video. If you want to 36:52 be able to query semantically for 36:54 certain videos that contain certain 36:55 content. And the words don't even have 36:57 to be contained in the video, right? 36:59 We're just semantically searching them, 37:00 and you can very quickly build that in 37:02 your Laravel apps now. And again, 37:04 multimodal embedding support is 37:06 available today in the AI SDK. 37:10 >> [applause] 37:18 >> All right, last bonus of the open-source 37:20 section. 37:22 Laravel LSP. 37:24 So, we have built a language server for 37:26 Laravel. Um, you may remember, I don't 37:29 know if it was last year or year before 37:30 we launched a VS Code extension for 37:32 Laravel that gave you kind of 37:33 intelligence about your app, config 37:35 completions, environment variable 37:37 completions. We have now built an a 37:39 language server to bring that to all 37:41 editors. So, if you're using Zed, if 37:43 you're using Neovim, whatever you're 37:45 using, you now can install the Laravel 37:47 LSP. You get config completion, you get 37:50 view completion, you get environment 37:52 variable completion, validation 37:53 completion, all sorts of stuff. And it 37:55 can even hook into your agents, which 37:57 I'll show you uh in a second. 37:59 So, let me show you how this works. I 38:00 actually have installed it on my uh Zed 38:03 editor here locally. 38:05 So, if I open Zed, let me open a recent 38:07 project. Uh, this Laracon project. 38:11 Actually, let's go into this one. 38:13 Um 38:15 and let's go to this order controller. 38:18 And if I'm in this project, I should 38:20 just be able to like 38:22 Yeah, you can see I'm getting 38:22 completions on my configs. 38:25 I can do even like click through. So, 38:28 order index will take me straight to 38:30 that component. I can do like the ENV 38:32 function and I get all my environment 38:34 variables. This works across all 38:36 editors. 38:37 Really great and it brings that 38:39 intelligence to wherever you're writing 38:41 code or if you're using it like in an 38:43 agent. 38:44 I have got this Laravel app. 38:47 And 38:48 let me open it up real quick. And I've 38:50 got my open code JSON where I have 38:52 actually configured the Laravel LSP in 38:54 my open code agent config. And so now 38:56 like if I start open code 38:59 and say, I don't know, what is in my 39:01 routes file. 39:04 If you look over here on the right on 39:05 the LSPs, once it reads that routes 39:07 file, it should activate our Laravel LSP 39:10 and that's going to give your AI agents 39:12 more intelligence about your Laravel 39:14 apps. And you can see there it activated 39:16 the PHP IntelliSense which is kind of 39:18 the basic PHP LSP and our Laravel LSP. 39:21 So, even your agent has access to, you 39:24 know, a little bit more intelligence to 39:25 help it be guided more correctly when 39:28 it's building your Laravel app. So, 39:29 again, even if you're not manually 39:31 editing the code, you can still plug 39:32 this LSP into your agents and get better 39:34 results, more correct code. 39:37 All right, so that is the Laravel LSP. 39:39 That is also shipping today. So, you can 39:42 install that immediately. 39:43 >> [applause] 39:50 >> All right. Last reveal the open source 39:53 section, 39:54 human tool approvals in the AI SDK. This 39:57 is one of the really big features that I 39:59 wanted to get out before tagging a 1.0 40:01 of the AI SDK and it is it is super 40:04 super cool. So, the AI SDK always had 40:06 tools and tools are, you know, things 40:08 that an agent can do. Maybe you have an 40:10 agent that sends emails and it has a 40:12 tool that it uses to do that using some 40:14 email provider. But sometimes tools need 40:17 like human approval. Maybe you want to 40:18 issue a refund, or before you want to 40:20 send an email campaign, you want, you 40:22 know, a Slack notification that lets you 40:24 click approve uh by a human before that 40:26 campaign is sent. Um human tool 40:29 approvals in our AI SDK let you do that. 40:32 So, let's look at that in the code 40:33 first. Um 40:34 I'll go ahead and open the demo. But, 40:36 let's look at the code first and um 40:39 you can kind of see how you define these 40:40 types of tools. 40:42 So, I'm going to open a separate project 40:43 here. 40:44 Um this is basically going to be uh a 40:46 campaign email sender that a marketing 40:48 team could use to work up an email 40:49 campaign, and then we're going to send 40:51 it to some audience that our application 40:53 uh has registered. 40:55 So, if I go into this send campaign 40:56 tool, 40:57 this is just a normal Laravel AI SDK 41:00 agent tool. I can now implement this 41:02 approvable interface, 41:04 and this means that this tool 41:05 potentially needs human approval. 41:07 And down here further in the class, I 41:09 just need to define a needs approval 41:11 method where I can dynamically decide is 41:14 this uh 41:15 does this invocation of the tool need 41:17 human approval? In this case, I'm 41:19 basically going to require approval 41:20 before any email campaigns are sent, but 41:23 I could conditionally check it. Like I 41:24 could put an if statement here and 41:26 return false, you know, like if we're 41:28 sending it to like a testing audience, 41:29 then maybe we don't want human tool 41:31 approval. I can do that here. 41:34 All right, but um let me just show you 41:36 what it looks like. It's a little bit 41:37 easier to see when you actually see it 41:38 on the screen. But, this is all we need 41:40 to do, and um the AI SDK is 41:42 automatically going to store all of the 41:44 pending tool approvals. It's going to 41:46 serialize them to your database for you. 41:48 You really don't have to do a lot. All 41:49 you have to do is like represent the 41:51 tool approval on the front end however 41:53 you want, and you can style it however 41:54 you want. 41:56 All right, so what it looks like is um 41:58 let's just say we want to draft an 41:59 invitation to Laracon speakers for the 42:00 closing reception. I'll send that to the 42:03 agent. 42:05 It's going to generate a potential 42:06 email. Maybe I want to iterate it on a 42:08 little on on it a little bit. I can say 42:10 um 42:11 the reception is over at 8:00 p.m. It's 42:15 at, let's say, SoWa Power Station." 42:19 It will update that email. 42:21 All right, let's maybe we're good to 42:22 send this now. So, let's just say, 42:25 "Looks good. Send it." 42:28 And we should get an approval before it 42:30 is sent. 42:33 All right, so now we get this human tool 42:35 approval waiting for us. And again, we 42:36 could show this on the web, we could 42:38 show this in Slack, we could show it 42:39 wherever we want. And like I said, this 42:41 is all persisted for you if you're using 42:43 the remembers conversations trait on 42:45 your agent. So, if I refresh this, you 42:47 know, everything's persistent, it loads 42:49 right back up. I can come back to this 42:50 tomorrow if I want, and that's perfectly 42:52 fine. If this all looks good, this does. 42:55 I can hit approve and send. 42:58 All right, that campaign's approved. The 43:00 agent says it was sent to 42 Laracon 43:02 speakers. Super nice, super easy. 43:05 And 43:06 it's hard, honestly, for me to 43:07 articulate like how much goes into 43:08 building this type of feature. There's a 43:10 lot of stuff that needs to happen, and 43:12 most other like AI SDKs, they don't 43:14 really give you any of that persistence 43:16 or any of that state out of the box. 43:18 They're just like, "Yep, there's pending 43:19 decisions. Like, good luck, you know, 43:21 like storing them." There's no opinions 43:23 around anything. But with Laravel and 43:25 our AI SDK and all of the opinions that 43:27 are baked into the framework, we know 43:28 how to store this, we know how to make 43:29 it as simple as possible for you so that 43:31 it's just super, super easy to set this 43:33 up, which is typically not trivial. So, 43:36 that's human tool approvals in the AI 43:38 SDK available today. So, you can start 43:40 using it immediately. 43:43 >> [applause] 43:49 >> All right, that kind of concludes the 43:51 open source section of the talk. It 43:52 little took a little bit longer than I 43:53 expected, to be honest. Almost 43:55 everything I showed you is available 43:57 today. 43:58 I'll recap that at the end, but you can 44:00 kind of start digging in. Hopefully, you 44:01 really enjoy it. Open source is still at 44:03 the heart of what we do at Laravel. It's 44:05 still what I'm super passionate about. I 44:07 spend probably two to three hours per 44:09 day on GitHub still to this day for 15 44:13 years basically 44:14 maintaining the Laravel framework. I 44:16 still read every line of code that it 44:18 goes into the Laravel framework. It is 44:20 not a slot factory 44:23 even though we are just greatly 44:24 benefiting benefiting from agents. I 44:26 still really enjoy making sure the 44:28 framework is very highly curated and a 44:30 great experience for you all and 44:31 hopefully you all enjoy it. 44:33 >> [applause] 44:39 >> All right, I want to transition to the 44:40 back half of the talk which is going to 44:41 be about Laravel Cloud which we have 44:43 been like pouring our hearts into to 44:45 make the absolute best deployment 44:47 experience for Laravel that you've ever 44:49 seen and it has come a long way which I 44:51 think you'll see today 44:52 and Cloud's been doing really well. So 44:54 thank you for your support. 44:56 You know, three and a half million plus 44:57 Cloud deploys, half million deploys in 45:00 the last month, 50,000 databases we are 45:02 running here at Laravel now 45:04 which is wild. 150,000 Cloud users 45:07 across 180 countries. There's been an 45:10 overwhelming amount of support for Cloud 45:12 which is really great to see. 45:14 We recently introduced if you haven't 45:17 seen it a starter plan on Laravel Cloud 45:19 that is just $5 a month. It is the 45:21 cheapest way to get started deploying 45:22 Laravel. You also get $5 of compute 45:25 included. So what that means is for just 45:27 five bucks and with our new scale to 45:29 zero stuff, you can run pretty much all 45:31 of your side projects and stay within 45:33 that credit. 45:34 You don't spend more than $5. We also 45:37 introduced spin caps which I'll show you 45:39 scale to zero databases which I'll show 45:41 you manage queues which are just awesome 45:43 and you're going to hear more about 45:44 today. 45:45 So I wanted to bring that to your 45:46 attention because it is pretty recent. 45:48 If you didn't know that there was a new 45:49 pricing plan on Cloud that is very 45:51 accessible for almost every member of 45:53 the community give that a shot. 45:56 Cloud has come a long way which you'll 45:58 see today. When we first launched Cloud 46:00 you know, a little over a year ago 46:03 You know, we would show it to people and 46:04 it's impressive and it's like, cool, but 46:07 how is that really better than like what 46:08 I have now? 46:10 Understandable, right? It's like 1.0 the 46:12 product it was just out the door, but it 46:14 has come so far in the last year plus 46:17 months. 46:18 And I'm just so proud of the team at 46:21 Laravel for the work they have put into 46:22 this. In a way, I feel like 46:24 I don't know, it feels almost unfair 46:25 that I get to deliver some of these 46:26 features to you because so much of the 46:28 Laravel team has poured their hearts 46:30 into the cloud. 46:31 And there's so many new features that 46:32 weren't there when we launched that make 46:34 it just totally such a game-changing 46:36 platform. Preview environments, 46:38 scale to zero Valkyrie, Reverb, MySQL 46:41 which wasn't there at the launch, 46:43 managed queues, scheduled auto scaling, 46:45 mono repos which we just launched and 46:46 I'll show you. 46:48 Private cloud networks, secret managers, 46:50 usage limits, lots of stuff. 46:54 So, if you haven't tried cloud in a 46:55 while, give it a shot. I'm going to give 46:56 you a quick tour of it today as well as 46:58 some of the new stuff that we're 46:59 shipping so you can see what we've we've 47:01 been working on. 47:03 All right. So, I'm in the cloud 47:05 dashboard here. Let's just get started 47:07 by deploying a fresh Laravel app out on 47:09 the cloud so you can see what it looks 47:10 like and we'll kind of walk through some 47:11 of the new stuff and what it means. 47:14 All right. So, I've got a Laravel app 47:16 here. 47:18 All right. I'm just going to hit create 47:19 application. 47:22 And then I'm dropped into my 47:23 infrastructure canvas. This is where I 47:25 can configure my app and let's go ahead 47:27 and add a database. Most Laravel apps 47:29 use a database. It is super easy to add 47:31 databases in Laravel cloud. 47:34 I've already got one created here, a 47:35 Laravel MySQL database. I'm going to 47:37 attach it to this app. That's really all 47:39 I have to do. 47:41 What is brand new within the last couple 47:43 weeks is scale to zero MySQL. So, we 47:47 have invested a lot of time into our 47:48 scale to zero technology on Laravel 47:50 cloud which will put your app to sleep 47:53 when it's not being used. And previously 47:55 on our first iteration of kind of 47:57 hibernation as we called it, it took 47:59 like 10 seconds plus to wake up your 48:02 app. 48:03 We can now wake it up many cases under a 48:05 second and many cases under 500 48:06 milliseconds. It feels almost 48:08 instantaneous, which means that even for 48:10 your side project in production, you can 48:12 totally leave scale to zero on and your 48:15 users are it's really negligible to your 48:17 users and you save a lot of money. We've 48:20 got great bot protection around it so 48:22 that your app isn't woken up by bots 48:24 just constantly keeping it awake. It's 48:26 really really a game-changer. But, what 48:28 is new is scale to zero MySQL, which 48:30 lets you have a scale to zero MySQL 48:32 database. We already had scale to zero 48:34 Valkyrie Redis caches Redis compatible 48:37 caches and your app compute can scale to 48:40 zero and it can all wake up extremely 48:42 quickly. It is really like full stack 48:45 scale to zero, which is very hard to 48:46 pull off and I'm really proud of the 48:47 team for making this happen. 48:50 All right, so let's go ahead and save 48:51 that configuration of adding the 48:52 database to the app. 48:57 And then I'm just going to go ahead and 48:59 deploy this. 49:01 While this is deploying and we're 49:02 waiting on kind of this fresh app to 49:03 come online, let me show you just how 49:05 fast scale to zero is. I've got this app 49:07 right here called scale to zero. 49:10 And if I click on it, I've got a scale 49:12 to zero app cluster, a scale to zero 49:14 MySQL database, and a scale to zero 49:16 Valkyrie cluster. That database and that 49:18 cache are running on our infrastructure. 49:20 This is not through third-party 49:21 providers. It sits right next to your 49:23 app, so it's lightning lightning fast. 49:25 And let's go ahead and visit this app. 49:28 And it should take just like a second. 49:30 The whole stack is up and it was totally 49:32 sleeping. The app woke up, the database 49:34 woke up, and the cache woke up because 49:36 this route is pulling users from the 49:38 database. It's hitting the cache and of 49:40 course we're hitting the app route, so 49:41 everything had to wake up and that's how 49:43 fast it was. 49:45 And now it's awake very quick. It is 49:47 unbelievable. 49:49 >> [applause] 49:53 >> So, 49:54 this is really like a game-changer, 49:56 especially around preview environments, 49:57 which I'll show you in a little bit, 49:59 where, you know, 50:00 with agents generating so much code, um 50:03 pull requests and code review and 50:05 previews are sort of becoming like the 50:07 the bottleneck, right? We're generating 50:09 a lot of code, but with scale to zero 50:11 across the full stack, you can have your 50:13 agents turning out tons of features, 50:16 ship those all to cloud on preview 50:17 environments with this whole scale to 50:19 zero full stack set up, and you're not 50:21 paying anything while you're waiting on, 50:23 you know, someone to come review that 50:25 feature or your team to make sure 50:26 everything looks good. It's all just out 50:29 there scaled to zero. You're not paying 50:31 anything, and it wakes up less than a 50:33 second. It's really, really great for an 50:34 agentic workflow. 50:37 All right. 50:38 So, I I do have a few bullet points. I 50:40 tweeted I'm not using a script. I did 50:41 jot down a few bullet points. Uh let's 50:43 go back to our main app here that we 50:45 just deployed. Um 50:48 Oh, I I did forget one more thing on 50:49 scale to zero. Sorry. 50:52 Let me hop over here. Did I lose 50:53 internet? 50:57 Okay, we're back. All right, uh this is 50:59 my scale to zero app that I was just 51:00 showing you. One previous limitation of 51:02 our old hibernation system 51:04 um was people couldn't use hibernation 51:07 cuz they had scheduled task, right? Task 51:09 that run every hour or that run every 51:11 night. And when we first launched cloud, 51:13 if you had that, you couldn't scale your 51:14 app to zero because then the scheduler 51:16 wouldn't run. We have actually built a 51:18 scale to zero compatible scheduling 51:20 system that just works. So, you define 51:22 all your scheduled tasks like normal. 51:24 When you ship them out to cloud, we 51:26 actually detect the scheduled task in 51:28 your app. In this case, I've scheduled 51:30 this PHP artisan inspire command to run 51:32 every day at 5:00 a.m. And what happens 51:35 is we will actually wake the app up, run 51:37 the scheduled thing, and then it will 51:38 scale back down to zero for you. So, 51:41 even if you're using scheduled task 51:44 or you're using queue jobs, which we'll 51:45 see in a bit, you can still turn on 51:47 scale to zero and take full advantage of 51:49 the cost savings, still have your 51:51 agentic workloads, but your scheduled 51:52 tasks will still run if you want them 51:54 to. So, just making you aware of that. 51:56 It is relatively new, uh but a really 51:58 big unlock for using scale to zero on 52:00 Cloud. 52:02 All right. Let's go back to that other 52:04 app we were working on. 52:07 All right. Let's see. What else did I 52:08 want to show you? 52:10 Okay, new uh HTTP auto scaling stuff. 52:13 This is also new. 52:15 So, 52:16 um 52:16 when we build Laravel Cloud, one of like 52:19 the things I think about is we're trying 52:21 to make incredibly hard problems feel 52:23 really easy for you. Um and scaling is 52:26 one of those things that, you know, if 52:28 you're managing your own servers and 52:30 your app's kind of taken off, you're 52:31 getting more visitors, and you need to 52:33 add another server. Well, now you need 52:35 to add a load balancer. Now you got to 52:37 maintain the load balancer. You got to 52:39 do security updates on the load 52:40 balancer. You got to maintain the second 52:41 server. You got to clone the app onto 52:43 the second server. It really gets kind 52:45 of nasty pretty quick. Um when you're 52:47 using Cloud, you know, scaling is as 52:49 simple as like sliding how much you want 52:51 us to scale uh from one server up to 52:53 five servers to 10 plus servers. Uh you 52:56 can go even higher if you're on Laravel 52:58 private Cloud. 52:59 And when we first launched, we had these 53:01 CPU and memory thresholds which you can 53:03 see here on the right. We've recently 53:05 launched within the last month or so 53:07 more intelligent HTTP demand-based auto 53:10 scaling in addition to these thresholds. 53:13 And you don't have to set this up. It's 53:14 just uh it's always turned on on your 53:16 app. That's why there's no switch for it 53:17 here. 53:18 But when you're auto scaling, we will 53:20 actually watch the HTTP capacity coming 53:22 into your app and how many available PHP 53:24 workers you have serving your requests. 53:26 And when those are getting saturated, we 53:28 will also scale up to another replica on 53:31 your app. 53:32 And the reason we do that is if your app 53:34 is highly efficient, your database is 53:36 super tuned, your code is very fast, you 53:39 can actually exhaust your PHP worker 53:41 capacity before like your memory or CPU 53:44 is exhausted. Um so we will actually 53:47 intelligently scale even in that 53:48 scenario now and you don't have to 53:50 configure it totally automatic. Um and 53:52 again, this is us solving a pretty hard 53:54 problem and our infrastructure team kind 53:56 of going above and beyond to make sure 53:57 that your life is uh super easy, which 53:59 is awesome. 54:01 So, that's just something that's 54:02 available today. You don't have to do 54:03 anything. If you're deploying on Cloud, 54:04 you just get that um if you have auto 54:06 scaling turned on. 54:09 All right, I want to show you another 54:10 brand new feature. 54:12 >> [applause] 54:16 >> So, we just shipped the Laravel Cloud 54:19 Secret Manager. So, I'm going to go back 54:21 up to the org level, this Laracon org, 54:23 and if I go into my settings and go to 54:25 secrets, I can now define secrets that I 54:27 maybe use across a variety of my 54:29 applications, maybe like common services 54:31 I use, maybe I use Open AI, maybe I use 54:33 Postmark, Recent, Sentry, uh companies 54:36 like this where I want to like I'm going 54:37 to be using the secrets a lot. I don't 54:39 want to have to copy them to like every 54:41 environment that I deploy on Cloud, 54:42 that's really annoying. Um so I can add 54:45 them here. They are are encrypted 54:47 locally. Um we never see the unencrypted 54:49 version of these secrets 54:51 uh and we store the encrypted version um 54:54 on our side, but they're encrypted 54:55 locally on your laptop when you add 54:57 them. 54:58 And then, I can come to any of these 55:00 apps 55:01 and I'll go into my settings here. Um 55:04 I'll go into down here to my environment 55:06 variables and I can just hit leak 55:07 secrets and I can just choose like what 55:10 secrets I want to add to this 55:11 environment and that's all I have to do. 55:13 They'll automatically be injected into 55:15 the environment when I deploy. I don't 55:17 have to like copy them over every time 55:19 I'm like building a new app. I don't 55:20 have to copy my Postmark key or my 55:22 Recent key or my Open AI key. I can just 55:24 save them once in the secret manager 55:26 securely and then add them to any 55:28 environment really, really quickly. 55:30 Really convenient. 55:33 >> [applause] 55:39 >> All right, I want to talk about some 55:40 managed queue stuff. We just launched 55:42 managed queues um maybe about a month 55:45 ago. 55:46 And 55:47 we're almost like relaunching it next 55:48 week. 55:50 Uh the infrastructure team has been 55:51 absolutely cooking on the next iteration 55:55 of managed queues, which is a whole 55:56 bundle of improvements that I want to 55:57 show you really quick. Um and it almost 56:00 feels like a whole new thing. Like it is 56:02 really, really next level. Um queues are 56:05 a big part of the Laravel ecosystem. I 56:07 love queue jobs. Um a lot of Laravel 56:09 apps use them heavily. And when we built 56:12 managed queues on Laravel Cloud, we 56:14 wanted it to like just work. Like I just 56:16 want to put jobs on the queue and I want 56:19 to know they're getting executed and 56:20 that it's not going to pile up. I don't 56:22 have like my queue jobs backing up 56:23 because I don't have enough workers. And 56:25 then on the flip side, if I don't have 56:27 any jobs, I don't want to be paying for 56:29 40, 50 workers that I don't need, right? 56:32 Maybe overnight I don't get a lot of 56:34 traffic or I don't get a lot of jobs. I 56:36 don't want to have to pay for excess 56:37 infrastructure in that situation. 56:40 Um 56:41 and we basically tried to take like 56:43 everything we learned from building like 56:45 Laravel Horizon, Laravel Vapor and build 56:47 just like the perfect queue system and I 56:50 think it turned out really great. So, 56:51 I'll show you some of the new stuff. Um 56:53 when you go to add a managed queue on 56:55 Laravel Cloud, you get really just a few 56:57 options you have to configure and you 56:58 almost don't have to configure anything 57:00 if you don't want. You can give the 57:01 queue a name. 57:02 Next week we're launching support for 57:04 first in, first out queues. So, if you 57:07 use FIFO queues, which means that the 57:09 exact order that you queue the jobs in, 57:12 they will be worked. That is not always 57:13 the case in distributed queue systems. 57:15 So, under a standard queue, you could 57:17 dispatch some jobs, it's not a guarantee 57:19 that they'll be worked in that exact 57:20 order. They will be worked, but again, 57:22 they could be kind of shuffled around. 57:25 But if you want, you can easily enable 57:27 first in, first out support. You just 57:29 keep queuing jobs like normal. We will 57:31 handle the rest. We'll make sure that 57:32 all of the jobs are handled in the exact 57:34 order that you queue them. Really, 57:36 really convenient. All you have to do is 57:37 pick what kind of queue you want. It 57:39 really couldn't be simpler. 57:42 We're also launching support for a pro 57:44 class of compute on managed queues, 57:46 which lets jobs run for longer up to an 57:48 hour, which is really important in AI 57:50 workflows where you're working with AI 57:52 providers. Some of these tasks can take 57:54 a while when you're hitting the LLM. 57:56 And if you're doing like multi-step 57:58 agentic workflows in your queue in your 57:59 Laravel app, you might need this pro 58:01 class compute so if you need to run for 58:03 a longer amount of time, or if you don't 58:05 need that, you can use the flex compute. 58:06 If your app just need If your job just 58:08 needs to run for a couple minutes, use 58:10 the cheaper flex compute. 58:12 All right, so that's going to be 58:13 shipping next week as well. 58:16 Auto scaling, we've made some 58:17 improvements here. 58:19 So of course the minimum workers is 58:20 zero. This will scale all the way to 58:22 zero if you don't have any queued jobs. 58:24 If there's no jobs on your queue, you 58:26 don't pay anything for Laravel Cloud 58:28 Managed Queues. When we see a job, we 58:30 will automatically scale up the workers 58:32 for you. 58:33 But one addition is you can now actually 58:35 set a minimum workers if you don't want 58:37 to scale down to zero. Maybe you always 58:39 want at least five workers watching your 58:42 queue, you can now easily set that in 58:44 the UI. 58:46 And then you can also do scheduled 58:48 overrides. So you can override your auto 58:51 auto scaling strategy. So if you have 58:54 like a big sale coming up or you have 58:55 some big promotion coming up, you know 58:57 you're going to be getting a lot of 58:58 traffic, schedule like a one-time or 59:00 recurring override on a certain time and 59:02 we will spin up however many queue 59:04 workers you want so that it's ready, 59:06 they're warm, they're ready to work 59:07 jobs. 59:08 Okay, that's also going to be launching 59:09 next week. 59:12 All right. 59:13 Let's go ahead and I guess I'll go ahead 59:15 and add this to my app. 59:18 Once you add a managed queue to your 59:20 app, you see it right here in your 59:21 canvas. That's really all you have to 59:22 do. You can just keep queuing jobs like 59:25 normal in your Laravel app, it will just 59:26 work. 59:27 Um and we can go ahead and deploy that. 59:30 So, 59:31 I kind of left out the best feature of 59:33 the new managed queue system that we 59:35 built and that we're shipping next week. 59:37 And to show you show you how it works, I 59:38 want to jump into this managed queue 59:40 app. 59:41 So, 59:43 in the first iteration of managed 59:45 queues, 59:46 um if jobs hit your queue, it could take 59:49 like up to 30 seconds if we were scaled 59:52 to zero to start up a worker to actually 59:54 process those jobs. 59:56 Um this dashboard right here, it's using 59:59 Laravel Cloud managed queues, the new 1:00:01 version that we're shipping next week. 1:00:03 I'm going to put 500 jobs on the queue. 1:00:04 I want you to watch how fast it starts 1:00:07 processing these jobs. It is totally 1:00:09 scaled to zero right now. We're paying 1:00:10 nothing for our queue. Let's go ahead 1:00:12 and start putting some jobs out there. 1:00:16 >> [snorts] 1:00:18 >> You can see we're loading up the queue. 1:00:21 All right, it's already back at 1:00:22 processing. We've already churned 1:00:24 through all 500 jobs. 1:00:26 The wake-up time is just 1 to 2 seconds 1:00:28 to spin up a worker down from 30 seconds 1:00:31 and sometimes even faster, sometimes 500 1:00:33 to 600 milliseconds to spin up workers 1:00:36 on the new Laravel Cloud managed queue. 1:00:38 It It honestly is so fast. I usually 1:00:41 just always leave them in workers at 1:00:42 zero. It is just imperceptible. If a job 1:00:45 comes in, we will spin up a worker and 1:00:47 it will start working. 1:00:49 We have also made a lot of algor- 1:00:51 algorithmic, ooh, that's a tough one, 1:00:53 improvements to managed queues. So, in 1:00:55 the first version that we launched a 1:00:56 month ago, 1:00:58 the scaling strategy was somewhat naive. 1:01:00 So, if 10 jobs came into the queue, we'd 1:01:02 spin up one worker. So, 100 jobs equals 1:01:05 10 workers. Okay? Really simple, pretty 1:01:07 naive strategy. The problem with that is 1:01:10 imagine like five jobs come onto the 1:01:12 queue, but every job takes like 3 1:01:14 minutes to finish. Previously, we would 1:01:16 only spin up one worker. 1:01:19 The infrastructure team has cooked up a 1:01:20 new algorithm where we're watching how 1:01:22 long it takes your jobs to process. 1:01:24 We're watching how deep the queue is. 1:01:25 We're watching if the jobs are idle or 1:01:27 active. And now if we see that your jobs 1:01:29 are taking a longer amount of time, we 1:01:31 will actually scale up the workers even 1:01:33 though there's only five jobs on the 1:01:34 queue, we might spin up five workers if 1:01:37 the jobs are taking a longer amount of 1:01:39 time. It is much much more intelligent 1:01:41 and it's just unbelievable. I'm really 1:01:42 proud of the infrastructure team for 1:01:44 just building just like the queue system 1:01:46 I've always dreamed of. 1:01:47 And we're shipping this next week. You 1:01:49 can turn it on can use scale to zero. 1:01:51 You can see the the fast cold start. 1:01:52 It's just it's unbelievable. 1:01:54 And I hope you really really enjoy it. 1:01:56 It's one of my favorite features in 1:01:57 Laravel Cloud. 1:02:00 >> [applause] 1:02:06 >> All right. Oh, I did want to show you on 1:02:08 if you use managed queues, I actually 1:02:11 put an app out here a few days ago to 1:02:13 let it run. When you're using managed 1:02:15 queues, you get this new queue tab in 1:02:17 your 1:02:18 cloud dashboard. 1:02:19 So this one's been running for a few 1:02:21 days so we have some data. And this is 1:02:22 kind of what you get. You can see your 1:02:24 job volume over time. You can see the 1:02:26 job duration both average and kind of 1:02:28 the maximum amount of time your jobs are 1:02:29 taking, the memory. And then you can 1:02:31 also see the auto scaling that's 1:02:33 happening here on the right as we're 1:02:34 spinning up and down workers very 1:02:36 dynamically to the queue load. 1:02:38 You can also see your failed jobs. You 1:02:41 can retry failed jobs. You can clear out 1:02:43 your failed jobs. 1:02:44 We're going to keep improving this but 1:02:45 this gives you a really good start on 1:02:47 kind of observing what's happening in 1:02:49 your queue. 1:02:50 Super nice. You can see here I kind of 1:02:53 tried to simulate like fixing a 1:02:55 performance problem on the queue. So 1:02:56 right here, the duration drops. And 1:02:58 what's really cool is I can actually 1:03:00 view these queue metrics by deployment. 1:03:03 So let's go to this deployment and you 1:03:05 can see that my average queue run time 1:03:06 was 150 milliseconds per job. I went 1:03:09 into the job. I fixed the performance 1:03:11 problem on this deployment right here. 1:03:14 And now I can see my average time 1:03:15 dropped to 89 milliseconds. So very easy 1:03:17 to kind of dig in across deployments 1:03:19 what's happening in your queue. It's 1:03:21 really, really sweet and really we're 1:03:23 just getting started on the 1:03:24 observability part of managed queues and 1:03:26 cloud in general. But, this is a good 1:03:29 start. 1:03:30 So, check that out if you haven't 1:03:31 already. 1:03:33 >> [applause] 1:03:39 >> All right, let's go back into my Laravel 1:03:42 app. 1:03:44 Um I'm just going to mention this. I was 1:03:46 going to demo this, but I think I'm 1:03:47 going to skip it in the order of time. 1:03:48 We have streamlined how you set up 1:03:49 preview deployments. 1:03:51 Now, when you put a new app on Laravel 1:03:53 Cloud, just hit set up previews and 1:03:55 we'll walk you through it and every PR 1:03:58 that comes into your app, we will spin 1:04:00 up a new environment for it. It will 1:04:02 scale to zero, so you're not paying for 1:04:04 it. Again, like I mentioned earlier, 1:04:06 really great for agentic workflows so 1:04:08 that you're not paying for the preview 1:04:09 environments that maybe your agents are 1:04:11 spinning up. And when you're ready to 1:04:12 review it, we'll spin it up less than a 1:04:14 second. You review it. Once you merge 1:04:16 the PR, we will delete all of the 1:04:18 infrastructure for you automatically. 1:04:20 You don't have to worry about cleaning 1:04:21 up your preview environment 1:04:22 infrastructure. It just works. But, we 1:04:24 have streamlined the entire process of 1:04:26 setting this up. So, if you haven't 1:04:28 played with cloud preview deployments, 1:04:29 please give that a shot. It is super, 1:04:31 super cool. 1:04:33 All right. 1:04:36 >> [applause] 1:04:38 >> I want to show you just a couple more 1:04:39 things before I wrap. Um 1:04:42 A lot of Laravel shops, in fact, 1:04:44 you know, based on the surveys we put 1:04:45 out, up to about 50% of Laravel shops 1:04:48 are pairing their Laravel with a Nuxt or 1:04:51 a Next front end in some sort of mono 1:04:53 repo or maybe separately. 1:04:56 But, it's a super common combination, 1:04:57 super common way to build Laravel apps. 1:05:00 Is anyone using Nuxt or Next in the 1:05:02 audience? 1:05:03 Yeah, a decent number of you. 1:05:05 Yeah, but you know, our scaled customers 1:05:07 have a separate front end team and back 1:05:08 end team, super common setup. This was 1:05:10 very gnarly to make work in Laravel 1:05:13 Cloud. If you wanted to deploy your 1:05:14 Laravel app that was within a mono repo, 1:05:17 it was very very hacky. You could get it 1:05:18 to work. It was not pretty. We have 1:05:20 improved that greatly, which I want to 1:05:22 show you now. 1:05:23 So, if I go to new app, um I have a mono 1:05:25 repo app. And if you select a repository 1:05:28 that is a mono repo, we will now detect 1:05:30 that and we will show you the apps that 1:05:32 are within the mono repo. 1:05:34 Uh it is very nice. It is very clean. 1:05:36 You can even pick a custom directory. 1:05:38 And what is also brand new is if you are 1:05:40 running Nuxt or Next on the front end, 1:05:42 you can actually just deploy that 1:05:43 straight to Laravel Cloud. You don't 1:05:45 have to go anywhere else to run that. 1:05:46 So, you can bring your entire stack home 1:05:49 to Laravel Cloud. So, in this case, I've 1:05:50 got a Nuxt front end paired with this 1:05:52 Laravel back end. So, I'm going to pick 1:05:53 my Nuxt app. 1:05:55 Uh which you can see the framework was 1:05:56 detected. Uh I'll name it Nuxt app. I 1:05:59 can pick the region. Create the 1:06:01 application. 1:06:04 All right. We get a canvas just like 1:06:05 usual. You can see that we now have a 1:06:07 framework indicator. This is my Nuxt 1:06:09 front end. And I can just hit deploy and 1:06:11 it just works. We intelligently detect 1:06:14 Nuxt or Next, set the right environment 1:06:16 variables. If you attach a database, 1:06:18 we'll inject the right database 1:06:19 credentials. 1:06:20 Um and you can deploy this right to 1:06:22 Laravel Cloud. You get a lot of the same 1:06:24 benefits. You get preview environments. 1:06:26 You get scale to zero. You can run 1:06:28 arbitrary commands. You can see your 1:06:29 logs. You can see your metrics. It just 1:06:32 works. So, if you're running your front 1:06:33 end separately from your Laravel app, 1:06:35 you no longer have to go anywhere else 1:06:37 to manage that. You can bring your 1:06:38 entire stack home uh to Laravel Cloud 1:06:40 and benefit from almost all of the 1:06:42 features I showed you today uh including 1:06:44 all of the scale to zero stuff, which is 1:06:46 really really sweet. 1:06:48 All right. We'll go ahead and let this 1:06:50 finish deploying and hopefully we'll 1:06:51 have a working Nuxt app on Laravel 1:06:54 Cloud, which is super cool. 1:06:58 All right. We're almost done here. 1:07:09 >> Now, we've made these deployments fast, 1:07:11 but when you're up on stage waiting for 1:07:12 a deployment to finish, there is like no 1:07:14 slower time 1:07:16 in the world. 1:07:20 All right, any second now. 1:07:23 There it goes. 1:07:24 All right, we've got this app live. We 1:07:27 can visit it, and we've got Nuxed 1:07:29 running on Laravel Cloud with scale to 1:07:31 zero. 1:07:32 Really cool. 1:07:34 >> [applause] 1:07:39 >> Um Nuxed and Next support and mono repo 1:07:41 support is launching today. So, you can 1:07:44 play with this tonight. If you've got a 1:07:45 Nuxed front end, you've got a Next front 1:07:47 end that you pair with your Laravel app. 1:07:49 We also recently added Symphony support 1:07:51 on Laravel Cloud. If you're an agency, 1:07:53 you work with Symphony clients, uh you 1:07:55 can also run Symphony on Laravel Cloud. 1:07:57 Also have managed queue support for 1:07:59 Symphony. 1:08:00 Um so, you're not you don't lose out on 1:08:02 any features, you know, if you work on 1:08:03 Symphony projects, you can run those 1:08:04 here as well. 1:08:06 Um so, that's Nuxed, Next, mono repo 1:08:08 support on Cloud launching today. 1:08:11 We decided to go a little bit further. 1:08:12 Why the heck not? Um we're living in 1:08:14 crazy times, so we thought we'd get a 1:08:16 little crazy. Um I think in the AI age, 1:08:20 we're going to see more and more Laravel 1:08:22 teams have the freedom to experiment 1:08:24 with all sorts of stacks, right? 1:08:26 Laravel's at the heart of what we do, 1:08:28 but even in the last few months, I've 1:08:30 written a game in TypeScript. I've 1:08:33 written a microservice in Go. I've 1:08:35 written a microservice in Bun. 1:08:37 Um I've dabbled with Python, right? 1:08:40 Probably many of you have been free to 1:08:42 experiment with different stacks, 1:08:43 different services in your business that 1:08:46 just wasn't tenable before. Like, I 1:08:48 remember 5 years ago, um we were going 1:08:50 to write a little monitoring service for 1:08:52 Laravel Forge. James Brooks and I were 1:08:53 having this discussion in Slack, I 1:08:55 remember, and we debated writing it in 1:08:57 Go, and I think we actually maybe even 1:08:58 did end up writing it in Go at the end 1:09:00 of the day, but it was like a big 1:09:02 decision, right? We don't have any Go 1:09:03 developers on staff. We don't know how 1:09:05 to maintain a Go app. 1:09:07 Um but, now with AI, right? Like, those 1:09:10 barriers are removed. And Laravel teams 1:09:13 of the future are going to be shipping 1:09:15 with all sorts of like supporting 1:09:16 services uh that are supporting their 1:09:18 Laravel monolith, and it's just much, 1:09:20 much easier than it was before. 1:09:23 So, we wanted to support that as well. 1:09:25 So, let's go ahead and go to a new app. 1:09:29 I didn't know what to call this, so I 1:09:30 call it mega repo. 1:09:33 And this repo actually has a Go 1:09:35 microservice 1:09:36 supporting my Laravel app and my next 1:09:38 front end. 1:09:40 So, let's go ahead and pick Go. 1:09:43 I'm using the Gin framework from Go. 1:09:45 I'll call it my Go app. We'll put this 1:09:48 in US East. 1:09:52 All right. So, now we've got a Go app. 1:09:53 Let's just attach one of the our 1:09:55 scale-to-zero MySQL databases. 1:09:59 All right. I can attach that. The 1:10:01 database credentials will be injected 1:10:02 into the environment for me. Let's save 1:10:04 it. 1:10:07 And we'll just hit deploy. I don't have 1:10:08 to do anything else. It just works. 1:10:11 All right. While that's deploying, let's 1:10:12 get even crazier. 1:10:14 Let's go out here. Maybe we've been 1:10:15 dabbling with Python a little bit. 1:10:18 Let's get a Flask app going on Laravel 1:10:20 Cloud. 1:10:22 We'll put that in US East as well. 1:10:26 All right. I'm not going to configure 1:10:28 anything. It should just work. Let's hit 1:10:29 deploy. 1:10:31 We got two deployments going. Let's go 1:10:33 back. Let's get Let's get Let's keep it 1:10:35 going. 1:10:36 Let's put a Node microservice out there. 1:10:38 Maybe a Honcho microservice. 1:10:40 Okay. Automatically detected. 1:10:43 Create the app in US East. 1:10:48 No more config. Let's just hit deploy. 1:10:50 Again, it's going to scale to zero. If 1:10:51 we get preview environments, we get 1:10:52 metrics, we get logs. 1:10:55 Okay. We got all three of these going. 1:10:57 Let's get even crazy Let's get really 1:10:59 crazy. 1:11:00 Um next month I'm going to Denmark for a 1:11:03 Laravel Live dinner. I'm actually going 1:11:04 to be on stage with DHH, 1:11:07 the creator of Ruby on Rails, right? 1:11:09 Really my one of my programming heroes, 1:11:11 one of my inspirations for creating 1:11:12 Laravel. I thought it would be rude if I 1:11:15 went there and I couldn't run a Rails 1:11:17 app. 1:11:18 You know what I mean? This felt 1:11:21 would feel rude. So, let's let's throw a 1:11:22 Rails app on Laravel Cloud. Heroku's 1:11:24 dead. Right? These These people need us. 1:11:27 They need us. 1:11:29 Okay? 1:11:31 Let's put a scale to zero MySQL database 1:11:33 on that. 1:11:35 We'll use active record, Rails a good 1:11:36 framework. 1:11:38 Go ahead and kick that off. We'll let 1:11:39 that run. 1:11:42 Hit deploy. All right, let's see let's 1:11:43 see what's done here. We kicked off a 1:11:45 lot of stuff. 1:11:46 Uh what do we got? We got our Go app. 1:11:49 That's live. Let's visit it. 1:11:51 It's hitting our MySQL scale to zero 1:11:53 database. It's pulling user from our 1:11:55 database. We've got Go running on 1:11:57 Laravel Cloud with full of preview 1:11:59 environments. If you want to build a Go 1:12:00 microservice to support your Laravel 1:12:02 app, maybe there's a Go package that 1:12:03 does something really well. It'd be 1:12:05 great to have one route that does that. 1:12:07 Throw it out on Cloud. Your Laravel app 1:12:08 can talk to it. You get environment 1:12:10 secrets. You get previews. You get 1:12:11 everything. 1:12:13 Okay, so that one's working. What else 1:12:14 did we get? 1:12:15 Um what about Python? Looks like that 1:12:17 one's done. 1:12:20 We got Python running on Laravel Cloud. 1:12:21 We got a Flask microservice going here 1:12:23 that can support our Laravel app. 1:12:26 Let's see what else. Is our Node one 1:12:27 done? 1:12:29 Got a little hot old microservice out 1:12:31 here running. Node. Again, if I go to 1:12:34 this app, I could go to commands. 1:12:37 Node version. I can run arbitrary 1:12:39 commands against this infrastructure. It 1:12:40 outputs. I get preview environments. I 1:12:42 get scale to zero. 1:12:44 Looks like our Rails app is deploying. 1:12:45 That'll be the last one here. 1:12:50 All right, looks like we're almost done. 1:12:51 Looks like that just finished deploying. 1:12:53 Again, we attached a scale to zero MySQL 1:12:55 database. We got Ruby on Rails on 1:12:58 Laravel Cloud. Even DHH is like Even DHH 1:13:02 is surprised, you know. 1:13:08 >> [applause] 1:13:13 >> All right, so that's a bunch of cool 1:13:15 stuff. I think the future for Laravel or 1:13:18 the future for programming is 1:13:19 interesting, right? Laravel is to me 1:13:23 it's not just a framework, it's a 1:13:25 platform for building on the web built 1:13:28 by people who build on the web. Like I 1:13:31 said, I'm still on GitHub. As CEO of 1:13:33 Laravel, I am on GitHub for hours a day 1:13:36 shipping on the web. Uh so that runs 1:13:38 from top to bottom at this company. 1:13:41 And you know, I believe in creating a 1:13:44 community and a space for people that 1:13:46 love to build great things. And I don't 1:13:48 think the age of AI changes that. I 1:13:50 think it unlocks a lot of crazy 1:13:52 possibilities for this entire community 1:13:55 to dabble in things maybe we didn't 1:13:56 dabble in before. Laravel's at the heart 1:13:58 of everything we do, but we can get a 1:14:01 little crazy. Maybe we want to ship a Go 1:14:02 microservice. Maybe we want a Python 1:14:04 service helping our Laravel app. Maybe 1:14:06 we have a Knux running and we can bring 1:14:07 it all home on a amazing platform and we 1:14:10 can still share it with this amazing 1:14:12 community that loves to build really 1:14:14 great stuff. 1:14:15 So that's what I wanted to show you on a 1:14:17 cloud today. 1:14:18 Um 1:14:20 We also have something called Laravel 1:14:21 Private Cloud before I wrap. If you're 1:14:22 running Laravel seriously at scale, I 1:14:25 would love for you to talk to us at our 1:14:27 Artisan booth about this. We can give 1:14:29 you your own isolated AWS account. We 1:14:31 can do We got SOC 2. We got ISO. We got 1:14:34 HIPAA, which is brand new. 1:14:36 So if you need us to sign a BAA, if 1:14:38 you're doing HIPAA stuff, we can do 1:14:40 that. Again, you get your own 1:14:42 AWS account. We can do VPC peering. If 1:14:45 you already have an AWS footprint, you 1:14:47 want to talk to some other stuff on AWS, 1:14:50 we can VPC peer to your own AWS account. 1:14:52 You can still talk to those resources. 1:14:55 We can do artisan support. You get your 1:14:57 own Slack channel. We can do RDS. We can 1:14:59 do elastic cache. 1:15:01 Really, if you think we can't do it, 1:15:03 please come talk to us because I promise 1:15:05 we've seen it. We we may be running it. 1:15:07 We've got great customers already using 1:15:09 this at really really high scale. 1:15:12 So, if this is interesting to you, 1:15:13 please talk to us. You get the same 1:15:16 great cloud experience. The dashboard 1:15:17 looks the same. It's not like some 1:15:19 clunky enterprise interface. The 1:15:21 dashboard is the same great interface 1:15:24 that you saw today, but just with your 1:15:26 own AWS account and access to some more 1:15:28 resources, access to higher scaling 1:15:30 limits. We've got customers running 1:15:32 hundreds, you know, over a thousand 1:15:33 workers on managed queues. So, if you 1:15:36 need that, please come talk to us. Come 1:15:37 talk to me and I'll link you up with the 1:15:39 right people. It is a It's a really 1:15:40 impressive product that we're really 1:15:42 proud of. 1:15:44 All right. Quick recap. Available today. 1:15:47 Pretty much all of the open source open 1:15:49 source stuff I showed you, artisan dev 1:15:51 image stuff, human in the loop tool 1:15:52 approval. On the cloud side, MySQL scale 1:15:55 to zero, secret manager, mono repo 1:15:57 support, next next front end support 1:16:00 available today. 1:16:02 Next week, all the improvements to 1:16:03 managed queues I showed you, the fast 1:16:05 cold start, 1:16:07 you know, the the basically zero config 1:16:09 is launching next week. And then next 1:16:11 month we'll start shipping out some of 1:16:13 this go Python microservice support. So, 1:16:15 if you want to bring that and start 1:16:16 experimenting supplementing your Laravel 1:16:19 monolith, you can do that next month. 1:16:22 Hopefully that's fun to you. Hopefully 1:16:24 that invigorates you. I know that I 1:16:27 haven't been more excited to build than 1:16:29 I have been in a long time. 1:16:31 Um 1:16:32 You know, it it was never really like 1:16:34 about the keystrokes for me. You know, 1:16:36 like I think Aaron said this at a recent 1:16:37 event. 1:16:38 After AI, you know, like I realized like 1:16:40 I at first I was scared, but then I 1:16:42 realized it was never about like the 1:16:43 typing of the code. It was about 1:16:45 building great software and shipping it 1:16:48 to users. And we're now enabled to do 1:16:50 that faster, 1:16:52 better than ever. So, my parting words 1:16:54 to you as always are to go build 1:16:56 something amazing, share it with who you 1:16:58 work with, share it with me. I'd love to 1:17:00 hear about what you're building, and 1:17:01 I'll see you all at the after-party. 1:17:03 Thanks.