Debounceable jobs, Pest sharding, and API starter kits

Laravel News| 01:03:41|May 14, 2026
Chapters15
Laravel 13.7.0 introduces interruptible jobs, allowing long-running tasks to respond to worker signals and clean up gracefully via an interrupted method. It also adds fonts rendering via a @fonts directive and improves testing with bulk JSON path assertions, plus various enum-related enhancements and a new worker interrupted event for observability.

A deep dive into Laravel News Episode 258: programmable visuals for podcasts, Laravel 13.x features, new packages, and tools shaping the PHP ecosystem in 2026.

Summary

Michael Dyrynda and Jacob Bennett explore Episode 258 of the Laravel News Podcast, spotlighting production-enhancements like Remotion-powered visualizations for YouTube chapters, plus a broad sweep of Laravel 13.x updates and ecosystem packages. They explain interruptible jobs in Laravel 13.7, new fonts rendering with Blade and Vite, and bulk test assertions, plus observability hooks like worker interrupted events. The discussion dives into the developer tooling that automates production workflows, including a Remotion-based automation pipeline Claude uses for transcript-driven visuals. They cover a wave of new features in Laravel 13.x (queue inspection, enum-backed sorting, lock status checks, on-delete/on-update foreign keys, and SQS improvements), and then move to a parade of packages from Laravel Schema Sentinel to Laravel Addressable—each with concrete use cases like drift detection, idempotent routes, web push channels, workflow orchestration, and auditable ledgers. The hosts also spotlight community signals like Polyscope’s Windows release and a Georgia Laravel meetup, and close with tutorials ranging from AI-powered recommendations to PDF search in Laravel. It’s a practical tour of modern Laravel tooling and how teams can ship faster with smarter tooling, better tests, and stronger observability.

Key Takeaways

  • Interruptible jobs in Laravel 13.7 let you handle sigterm and clean up before a worker exits via an interrupted() method on the job interface.
  • Font preload rendering is now easier with Blade @fonts and a Vite fonts manifest integration, enabling selective family loading and inlined font-face rules.
  • Bulk test assertions arrive in Laravel testing with assert JSON paths and assert JSON missing paths, allowing multiple JSON checks in a single assertion block.
  • Queue-wide inspection methods (all reserved/delayed/pending jobs) simplify cross-queue visibility, returning collections with UUID, name, attempts, and createdAt across database, Redis, and fake drivers.
  • Workloads like worker interrupted events improve observability by emitting signals when a worker receives a stop signal; you can hook logging, alerts, or external calls to these events.
  • A suite of Laravel ecosystem packages debuts or shines: Laravel Schema Sentinel detects migration drift; Laravel Idempotency guards POST/PUT/PATCH routes with idempotent keys; Laravel Shopper provides a headless admin panel; Laravel Chronicle creates tamper-evident audit logs with a SHA-256 hash chain.
  • Polyscope’s Windows release expands agent-based development experiences to Windows, with Linux support coming next and features like parallel branches and automated workspace bootstrapping.

Who Is This For?

Essential viewing for Laravel developers who want to stay current on Laravel 13.x upgrades, production tooling, and the broader ecosystem of packages that solve real-world problems from migrations drift to AI-assisted development workflows.

Notable Quotes

"Interruptible interface is what you put on the job that you want to be interruptible."
Explains how jobs can respond to worker signals like SIGTERM to clean up gracefully.
"Fonts directive... you just... @fonts. Very, very cool."
Highlights the new Blade directive for font loading tied to Vite manifests.
"The worker interrupted event will be dispatched when a worker receives a signal before it stops."
Notifies developers for observability and external integrations.
"Polyscope creates a checkpoint every time you send a message to the agent, and these snapshots make it easy to review exactly what changed."
Showcases how the agent workflow tool helps auditing and rollback.
"Web Push Channel. That’s all it is."
Notes a new Laravel Notifications channel for browser push without a native app.

Questions This Video Answers

  • How do interruptible jobs work in Laravel 13.7 and how can I clean up before a worker exits?
  • What is the new fonts blade directive in Laravel, and how does it integrate with Vite?
  • What are the best practices for using bulk JSON path assertions in Laravel tests?
  • What packages are recommended to extend Laravel with drift detection, idempotency, or workflow orchestration?
  • How can I run Laravel on Windows with Polyscope and what does the Windows release enable for AI agents?
Laravel News PodcastLaravel 13.7 featuresinterruptible jobsfonts Blade directiveRemotionCLI and observabilityqueue inspectionenum sort directionLaravel 13.8 queue APIsLaravel Installer and Agent Detector
Full Transcript
Hello, everybody. Welcome to episode 258 of the Laravel News Podcast. Today is Monday, May 11th, 2026. Mr. Dyrynda, I was just looking at some of the YouTube version- Mm. ... of our podcast, and if you, dear listener, have not watched the YouTube versions of our podcast, like I have not watched the versions of our podcast on YouTube, you should definitely check them out. Dude, you've been doing some solid work on this. There's, like, chapter markers and all the things, so if you only wanted to hear about a particular piece, it's really easy to jump around. And then also, there's, like, these title overlays. And then the newest thing that you've added, which is really cool, which is I think a thing that people have been asking about for some time is- ... visualizations. So in this last episode, Mm you put maybe two or three of them. Um, they look really cool. So one of the ones was, like, flaky test retries. We were talking about that in Pest 4.5. And so sometimes it's a big challenge to talk about these things on air and try and explain them without being able to have an editor or any sort of visualization in front of us. Mm. Mm. But this does a really good job of visualizing some of that. So that is really cool stuff. So what are you using to build those? Yeah. So I mean, to contextualize it a little bit, we've... Usually, the only comments we get on the podcast episodes is that they would be better if there was some visual aid, which I agree with. Yeah. It makes sense. Um- It does, yeah. It is, it is kind of a tedious thing to go back and do after the fact, especially if it's not your forte. So th- there have been episodes in the past where I've cracked open an editor, and I've, like, typed as, as I've been watching the video back to make sure that what we're talking about is kind of in line with what's being shown on the screen. And it's just when, when we record these episodes on Monday and we release them on Thursday, it's a compressed window, especially 'cause I'm not doing this full time. It's, it's kind of like an out of hours thing. So over Christmas, I built some tooling that will go and ingest the articles that we need to talk about. It puts together our show notes. So basically prepares, it, it acts as a producer for our episodes, you know, and gets everything ready. Right. Right. And then on the back of that, I then had it go and generate chapter markers and title markers for the videos and all of this kind of stuff, and then provide summaries and, and show notes and, and things like that that we put on YouTube and into Transistor. But the, the one missing piece was still the, the visualizations, and there was, probably a couple of months ago now, Remotion, which is, like, a tool that you can use to programmatically generate video- Was released. Now, who makes that? I don't even know what... I've heard of it, but I don't know who makes that. Yeah. I, I, I mean, I think it's just Remotion- Remotion. I'll have to check that out. Okay ... is the name of the tool. I think that, like- ... I don't know the company. Um, but there's, there's a skill that they've published that you can use in Claude. And so for last episode, I said to Claude, "Here is our transcript. These are all of our chapters. This is what we've spoken about. Go and find out of the transcript the things that we talk about that would be most interesting. Reference the articles on Laravel News to kind of figure out, you know, what are the actual code blocks and, and the examples that we're talking about, and then, and then create some visualizations." So it's come up with a, a nice style that kind of fits with the Laravel News site and the podcast and all that kind of stuff, and I've now codified that as a skill. So in theory, when I do this episode, I can say, "Here is our transcript. Go and, you know, generate," and it'll generate me some, um, basically transparent videos that we can just overlay onto the, the timeline when we're editing and then exporting. So yeah, it's, um, it's something that, that, that I've wanted to do for a long time, but it's just been, uh, you know, a tedious exercise and something that I didn't really have the skill to do or the time to learn to do it well. And so it was just, you know, we didn't do it. But now, um, the kind of content that we have, it's easy to kind of generate that video with the tools that are available now. And so, you know, it's, it's done a, a pretty good job. So the, the whole production process of the podcast, I think the, the longest time now, um, the most time-consuming aspect of putting these episodes out is sitting down and recording them. Yeah. Yeah. Well, as it should be. I f- So it's like you have saved us the job of a producer. So if, uh, you know, if we were having to hire somebody to do that, that would be an expensive thing, but you have just figured out how to do it, and this Remotion looks really pretty incredible, honestly. I'm gonna have to use this. Um- Yeah ... there's pretty cool stuff on there. So very neat. Folks, again, if you have not checked it out, you should definitely check it out on YouTube under the Laravel News, um, channel. There we have it. Michael, should we jump into it? Yeah. Jump in. Let's jump into it. Laravel 13.7.0, let's talk about it. What's new? Jobs can now react to worker signals, so we're calling this in-interruptible jobs. So Laravel 13.7 introduces this idea of interruptible jobs. So this allows the interface to respond. This interruptible interface is what you put on the job that you want to be interruptible. This will respond when a worker receives a signal like sig term. This lets long-running jobs clean up or set a stop flag before their work, before the worker exits. So now what you get is you have a method that you put on there called interrupted, and when you get interrupted, you will get that signal, and then you can do something for the job to cleanly terminate before the process shuts down. And so really cool. Uh, I love that. That's a great idea. There is a new... This is a cool one. I actually have never thought about this, but now that you see it, you can't unsee it sort of thing. A new fonts blade directive and a Vite fonts method for rendering font preload links in inloads-- inline styles. Of course, we needed this. Of course. We had script, we had styles, now we have-Fonts. So the feature reads font manifests that are generated by the Vite plugin and supports selective family loading. So there's a basic usage in your layout that looks like @fonts, and that's it. You just... Anything that's gonna be rendered by that Vite plugin is going to get rendered into that @fonts directive there, and then you just load your Vite resources, JS app.js underneath there. Uh, this renders preload link tags and an inline style block with all the font face rules and CSS variables from that font man- manifest that it's going to generate for you. You can also just filter down to a specific set of font families that you're wanting to load in. So you could say, "Hey, this is a, there's a bunch of different font files that I might need, but on this particular page or on these particular pages, I only need a single font, fan- uh, font family. I want the Sans family." Or you can load in multiples by, uh, s- passing in an array with the different sets of families that you're interested in loading in there. That is really powerful, very cool, and I feel like this is one of those things I have to look up every time I have to do it. Mm-hmm. And so now I don't have to. It's just @fonts. Very, very cool. Bulk JSON path assertions in test response. So the testing layer now includes this assert JSON paths and assert JSON missing paths method, methods for asserting multiple JSON values at once. I feel like this is a trend we've been seeing happening recently, where things like does the database contain, and then not just a single value, but I wanna check for all of these values, and do it, does it contain something that has all of these, right? And this assert JSON paths and assert JSON missing paths, now they, uh, allow you to put in multiple things rather than having to chain on assert JSON path, assert JSON path, assert JSON path. You can just do it in one block, one array there, and it will check to see if all of those things are present. And of course, similarly, the assert JSON mithing, missing paths, you can say, "I'm looking for these keys to be absent," and you just pass in an array there, and Bob's your uncle, as they say in Australia. Do they say that in Australia? We sure do. Do... Okay. Bob's your uncle. There we go. So, uh, sort direction enum support for collections. Another trend we've been seeing here recently, uh, is that, um, we are getting enum support all over the place, right? Which is a wonderful thing, and I am here for it. So what you can now do is in a collection, you say sort by, you pass the value that you're wanting to sort by, and then you can say sort direction descending, which is the sort direction is the enum there. And so you can use an enum to specify sort order, uh, that will provide better type safety when you're doing your sorting. Uh, introducing the worker interrupted event. So this kind of is a companion piece to go along with that, uh, that we talked about at the top of this one. A new worker interrupted event will be dispatched when a worker receives a signal before it stops. This is used for, uh, for observability. So you can log on those things, you can alert it, you can call an external service when that signal arrives. Uh, even if the individual job doesn't implement that interruptible, you have a global event that you can listen to, so you can do any of those things as well. All right. IsLocked method has been added to the lock class. If you've not looked into the lock class, might wanna check that one out. The isLocked method is a new one that will allow you to check the current lock status. I know that I feel like I've had to write lock logic in my, in my past, right? I've had to do it myself. And so this lock class is available for you. Uh, one of those things you can look at there. LazyCollection keyBy now accepts, guess what, a backed enum, as we have seen in a lot of other things. There's o- of course, other miscellaneous fixes and improvements. Uh, thankful to the team for not only handling the new features, but also making sure that we stay nice and safe and, uh, fixing anything that might be broken across the stack there. That's thirteen.seven. This sort direction enum. Is, is this a- Mm-hmm ... a PHP native thing? I've never seen this before. I don't know. Is it? Looks, looks like it. I mean, I don't- Really? ... see it anywhere else. Oh, cool. Yeah. I mean, I can't find the docs for it in, uh, PHP either, but that doesn't- It looks like- Interesting ... there's... Yeah, sort direction is an enum added to PHP 8.6. Um- There's a polyfill for it- Oh, nice ... for 8.1 as well. Yeah. Um... Gotcha. So yeah. There you go. Meant to be used in user land PHP, uh, and core PHP alike. Very cool. Hmm. Looks like it got merged into the, uh, PHP 8.6 though. Right. It's coming, coming soon. When did this... I don't know. Nice. Great. Love to see it. Very cool. User land enums. Uh, queue wide inspection methods in Laravel 13.8. The existing Queue::reserveJobs, delayedJobs, and pendingJobs methods require a specific queue name, which means checking multiple queues requires chaining calls. This release, Laravel 13.8, adds all reserved jobs, all delayed jobs, and all pending jobs to retrieve jobs across every queue in a single call. So as I said previously, you would have to merge the results of one onto the next, onto the next. Now you can just say, "Give me all reserve jobs, delayed jobs, or pending jobs." Each method returns a collection of inspected job instances with UUID, name, attempts, and createdAt properties. This is useful during deployments when you need to confirm no jobs are actively running before stopping workers. The methods work with the database, Redis, and fake queue drivers. Two new events, worker pausing and walker, worker resuming, are now dispatched when a queue worker receives SIGUSR2 or SIGCONT signals respectively. These events give applications visibil- visibility into worker state transitions, useful for logging or alerting when workers pause and resume during deployments. These, um, SIG-S- control signal, um, changes that we've seen in the last two releases look a bit like there's some observability work going on behind the scenes within the framework. Wonder if- ... we'll see that come to light as anything else, uh, in the coming couple of months. I wonder if it's a Nightwatch thing. I wonder if- ... like there's interest in Nightwatch knowing Hmm when those things are happening. And, um, I mean, I would wanna know those things. Actually, it'd be really handy- ... to know that. Mm-hmm. Mm-hmm. Uh, the test response class now includes assert session missing input as the counterpart to the existing assert session has input. It accepts both or either a single field name or an array of field names. Following the sort direction enum support added to collections in 13.7, query builder methods like order by, order by descending, and order by raw now also accept the native PHP sort direction enum, which is to be introduced in PHP 8.6, as we previously discovered. The schedule list artisan command now accepts a dash dash environment option to filter schedule tasks by the environment they run in. This is helpful when running schedule list on production to see only the commands that will actually execute in that environment rather than seeing commands restricted to local or staging. Custom on delete and on update actions for foreign keys. The foreign key definition class now accepts custom strings for on delete and on update beyond the standard cascade restrict no action and set null. This resolves a PHP Stan conflict when using Postgres, s- Postgres partial set null syntax for composite foreign keys. Previously, the middleware attribute on a controller or method was ignored if the route also had middleware defined through other means. Attribute-provided middleware now merges with the middleware from other sources instead of being discarded. SQS QConnections now support named AWS credential providers, which allows using specific credential profiles or chains defined in the AWS SDK rather than only environment variables or instant, instance metadata. And last one here, the Mail Manager dot op set default driver method now accepts backed enums in addition to strings matching the enum support already available in mailer and driver methods. This release, in case you couldn't tell from all of the talking, includes a large set of type annotation and docblock improvements from several, uh, contributors covering schema builders, cache, factory collections, and more. Additional fixes include expired locks in, now excluded from the database lock is lock, fixes for macros with static closures, model not found exception, unit enum support, and infinite rate limiter TTL on custom increments, and callable type corrections for freeze time and travel to. If you wanted to see the official changelog, they keep a... I think I saw Joe T, Joe Tannenbaum, post about- ... the open source changelog that Laravel keeps now, uh, and is kept up to date. We'll have links to the official changelog and all of the changes for you in the show notes. Nice. Very cool. We've got Laravel Installer. Speaking of Joe T, Joe Tannenbaum, uh, he has made an update to the Laravel Installer that will return JSON when it is running inside an AI agent. So, what actually is interesting to me about this is I was like, "Okay, how are we detecting that it's an AI agent?" Um, and if fi... come to find out, there is a new Laravel library called Agent Detector, which is a lightweight PHP utility to detect if your code is running inside an AI agent or an automated development environment. The way that it does that is it uses all these different detection methods that is spelled out in the README file to detect things like Gemini or Codex or Amp or OpenCode or Claude or Cowork or Copilot. So it has all the different ways that it is doing that, that is detecting if it in fact is running inside of one of those things completely separate from this pull request. Did not know this existed, but if you're needing to do something similar in your own project and you're using PHP 8.2 or above, you can use this Laravel Agent Detector as well. But what this will do is it will detect if it's running inside an agent. It will suppress those interactive prompts, uh, so that your agent doesn't have to deal with those, and instead it will decorate the output with a single line of structured JSON, uh, to standard out instead. And when I say decorate, what I mean is it wraps that method and then, uh, spits out JSON instead. Um, and so again, the changes come from Joe Tannenbaum. The, it really, it's, it's covering the two things that an agent actually needs to know. Number one, did it work? And if not, why did it not work, right? So that's what it's gonna provide in that JSON output. Success is true. Here's the directory where it's located, and here's the name of the app. That's what you get back in the JSON in the fact, or in the case that it was successful. On failure, it will include an error message, a path to the full installer log, and a tail of that log. So which is enough context really for an agent to understand what's going on, what went wrong, and can report back or give suggested solutions for what, you know, what you need to do next. Um, so pretty cool one for agentic workflows that, uh, the agent runs the command, reads the JSON result, and then either continues or handles the error. So there you go. Pretty cool. Excellent. Uh, on to the news. Headline item here that Polyscope, the agent-first development environment, is now available for Windows, bringing the same app and architecture as the macOS version to Windows users. Polyscope is designed for Laravel developers who want to work with AI agents across multiple workspaces, branches, and projects without constantly switching context. With the Windows release, developers can now use Polyscope on their operating system of choice with Linux support next in the pipeline.Polyscope will detect if you have Laravel Herd installed and will wire Herd commands directly into your workspace. One of the standout features of Polyscope is support for parallel branches. This lets you keep multiple workspaces alive at the same time, each with its own test domain. For example, you can work on a large billing feature at feature-billing.test, while also reviewing a teammate's pull request at review-pr-482.test without switching branches, stashing changes, or disrupting your current work. Now, we've spoken about, uh, Git worktrees in the past. Uh, Polyscope uses Copy on Write on supported, um, file systems, which is a much more, um, data, uh, data file size, data consumption-friendly approach. So it will, it will basically link to the same physical storage blocks on your disk and will only track and modify, you know, copy files that have actually changed as part of that. More technical than what I've laid it out, but on supported operating systems, it's basically a great way to spin up multiple branches simultaneously without, you know, if you've got a gig worth of node modules there, you're not copying a gig every single time. It will only, um, basically seem like what you're, you're using and copy what you've changed. Yeah. So much more convenient. Yeah. For sure. Uh, Polyscope creates a checkpoint every time you send a message to the agent, and these snapshots make it easy to review exactly what changed and roll back with a single click if needed. After an agent completes a task, you can expect the diff, continue working or revert the changes before moving forward. Polyscope also includes a process runner that can boot your project stack when a workspace opens. You can define run scripts in the polyscope.json configuration file and enable auto start true to automatically start services like queue workers, the sched-scheduler, npm run dev, and any other project-specific commands. This removes the need for manually opening multiple terminal tabs or remembering to start background processes while debugging. Polyscope's workspace UI also works on mobile. You can leave your development machine running, check on the, an agent from your phone, review diffs, send follow-up prompts, or revert changes through Polyscope's end-to-end encrypted relay. And as I mentioned at the top of this section, with Windows now available, the Polyscope team say that Linux support is coming next. You can download Polyscope from the official website. We'll have links to all of that for you in the show notes. Very good. Okay, folks. Um, if you have wanted to try Laravel Cloud, but you've been concerned that maybe you're not sure if your app is ready for Laravel Cloud, meaning, is there anything I need to change about my code base that would be required before I could jump in? Or maybe you've already tried it once, and, like, something didn't work quite right, and you're like, "Ah, man, I just don't know exactly where to start on that." This is one of the biggest questions that developers are asking before they migrate. Will my app just work? And until recently, the only way to do that was to read the docs yourselves, audit your dependencies by hand, reach out to support. Those were sort of your methods. This is changing because Laravel is partnering with JMac, Jason McCreary, Laravel's garbage man, the author and creator of Laravel Shift, and what has launched now is the Laravel Cloud Pre-check. So what this is, it's a free static analysis shift that will scan your repo and will give you a clear... Couple things, right? Number one, a compatibility report. But then number two, not only something that says like, "Hey, you're good to go," but also some suggestions if you're not, like some warning items, which would be minor items to review, uh, with specific guidance on what you might do to solve these problems, or things that are going to let you know, hey, there's a blocker here. There's something that's incompatible you're gonna need, you're gonna need to address, and again, actionable feedback on what to fix. So there's a quick three-minute video here between Eric Barnes and Jason talking about, you know, what was the sort of impetus of this partnership. I think what it ended up coming down to is Laravel's like, "Eh, we would like to have something where we could tell people in advance before they migrate to cloud that they're gonna have some problems. How could we get access to their repos and run something that automatically checks that?" And Jace is like, "I got that. Like, I've been doing that for quite, quite some time," right? And I was looking at the stat, I didn't realize this, over one hundred and seventy thousand upgrades, uh, Laravel Shift has handled. So tons of domain knowledge baked into these checks. What are the things that it's checking? Here we are. It's gonna do some simple checks like Laravel framework version. Do you have the minimum version required? Do you have the minimum PHP version required? Uh, do you have the PHP extensions that are required? Then it's gonna look into things like, how about your Laravel Octane configuration? Is that going to be working well with cloud? How about your database configuration? 'Cause that might be a little bit different too, right? Maybe you have something that's not yet supported in cloud. Well, you need to be aware of that. So it's gonna look at read/write connections. Uh, how about calls to system commands or hard-coded system paths? Those are things you're also going to need to know about, and they're gonna get specific guidance on how to mitigate those in the case that you want to actually move to cloud. So you can try it for free. It's free. You don't have to pay anything for it. If you've been on the fence about Laravel Cloud, this is a really easy way to find out where your app actually stands and to see if cloud is something that's relatively easy to get to, uh, for you. And again, it's going to come with specific guidance. If you've never done a Laravel shift before, you are in for a treat, because the way that Jason does these pull requests is very nice. It's not one big pull request with a, you know, just a list of things to do. Every suggestion is its own comment. For me, that's nice because I can say, "Hey, developer, um, on my team, I wanna know kind of where you're at in the process." And so as each discrete comment has been handled, we just give a little emoji reaction, thumbs up, or, you know, like a warning, like stop symbol, like, "I need help on this. I'm blocked on this. I'm not sure exactly what to do." So the pull requests themselves are delightful. Jason always does a very great... A, a very good job on this. If you've been waiting tosee if you could get your app ready for cloud, this is the way to do it. Check it out. I'm going to talk about this one, which is Redberry, who is a Laravel partner, will host or has hosted by the time this episode comes out, Georgia's first Laravel meetup in Tbilisi. The Laravel community continues to expand globally, and now it's reaching the South... Oh, Caucasus. It's reaching the South Caucasus. Caucasus? Caucasus. There you go. The South Caucasus. On the 14th of May, which is the same day that this episode will come out, the first official Laravel meetup in Tbilisi, Georgia will take place, hosted by Laravel partner Redberry. Our fearless leader, Eric Barnes, got together with Gaga Dasalia, the co-founder and CEO of Redberry, and Nika Georgoliani, the agency's engineering director, about how the meetup came together, why Laravel has such strong adoption in Georgia, and what they hope to build going forward. You can watch and listen to the full interview on YouTube. We'll have links to that for you on the show notes. But why Georgia and why now? Redberry themselves have been deeply involved in the Laravel ecosystem for years as an official partner a- as a, as an official partner agency with a team of around 100 engineers serving clients across more than 15 countries. Despite that, a local meetup has never quite materialized until recently. The turning point came after moving into a new office in Radio City, which finally gave them the space to host community events. The demand, however, had already been there. According to Nika, much of Georgia's Laravel adoption dates back to, uh, or traces back to timing. Many developers in the region began their careers around 2015 and 2016, right as Laravel was gaining momentum, and that early adoption stuck. Laravel is a framework that if you start to develop on Laravel, you're going to stay on Laravel, and that long-term stickiness has helped to create a surprisingly strong Laravel community in a relatively small country. So whilst this is the first official meetup, the goal is to make it a recurring event, and the team is currently considering a cadence somewhere between twice a year and quarterly. Long term, there is a possibility of growing into a larger regional event with neighboring countries in the South Caucus- Caucasus. The audience could expand beyond Georgia itself, and for now, the focus is on consistency and creating a space where local developers can connect and share their work. So unfortunately, by the time you hear this, you will probably have missed this first event, um, but that will be listed on the official Laravel community page, which you can find at laravel.com/community. And so keep an eye on that if you live, uh, in or near Tbilisi and work with Laravel and want to attend a future meetup. Uh, the meetup itself is a strong signal that the local community is growing and worth being part of. And shout out to Gaga and the, uh, Redberry team for all that they're doing. 150 people is no joke. I mean, that's a lot of- That's a lot of work, a lot of effort, and a lot of interest, uh, for 150 people. So good on them. That's, that's wonderful. Glad to hear it. Love to see it. Okay, we are gonna shift down to packages. We've got 10 different packages to go over here today. I'm gonna start with one called Laravel Sentinel... Sorry, Laravel Schema Senti- Sentinel. This is by, uh, Atesham at Broadway Web Services, and what this is suppo- supposed to do is it will detect when your database is not up to date with your migrations, right? So if your database schema has drifted away from what your migrations are, it's going to help you identify that, and then it's going to generate a corrective migration to get those things back into sync. So when might this happen? Well, we've all been there, like we're troubleshooting this slow query, and you're like, "Ooh, uh, we need an index on that thing. Let's throw an index on there quick." And so you throw an index on there. Or I don't know, maybe you're trying to generate some one-off report, and you need to do some stupid virtual column or something, and so you check that in there, whatever. Like, I would never do that in production database. That has never actually happened. Never. Never. Mm-mm. But if you happen to be the type of person who maybe accidentally did that once, or even like, you know, I've seen it happen where like, oops, we shipped something that should have actually been a Boolean instead of a, uh, you know, an, I don't know, integer or something like that, whatever. You, you've changed the migrate or you just change it sort of in production. It does happen, right? Um, in that case, this is going to be really helpful, helpful. So, um, detecting drift happens with a artisan command. I know the question that you're thinking in your head, you're like, "Yes, but my local environment, environment is not gonna be out of date with my migrations because I just ran my migrations on my local, so I don't know if it's out of date with production." Okay, we've got a solution. Hang tight. PHP artisan schema:drift is going to check tables, columns, data types, nullability, defaults, indexes, foreign keys, all those things I just talked about that you might have added after the fact. It's going to run with a strict flag, uh, to check that the database is up to date with your migrations. Okay. Once it detects that, you're going to run PHP artisan schema:drift fix. Uh, there's a couple options, fix and interactive. Um, those will walk you through each detected difference with a flag that asks you, "Do you want to do something about this?" And if you do, great. Now, here's where we come to the magic, cross-environment comparison. So you can point your diff command at a different environment's database connection instead of your local one, right? Because you might have been thinking in your head, "Well, I'll just go pull the schema from the production database, run it in locally. You know, if I just get the schema, run it in, then I can do the detection." You can do that, and that works fine. But you can also just say compare ENV equals staging. Use this database connection using my staging database connection and see if there's anything that went sideways there so that you can compare those without actually leaving your local development environment. Uh, there is also a programmatic API. The Sentinel facade exposes that same diff as a DTO, so you can use this in other places. Uh, one of the places in which it's used is this Livewire Sentinel database health component, where you canHave something that will tell you, "Hey, these are the things that are out of date. Here are the diffs," uh, and stuff like that. It only works locally, that Sentinel Database Health, but there you have that. It is a support-- It's supported between Laravel 13 and Laravel 11, all the way back to Laravel 11. Uh, so you can check that out on GitHub, Laravel Senti- Laravel Schema Sentinel. Wendell Adriel relate- released Laravel Idempotency, a package that adds HTTP idempotency to write-oriented Laravel routes. When a POST, PUT, or PATCH request is retried with the same idempotency key and the same payload, the package replays the original cached response instead of running the route handler again, a common requirement for payment endpoints, order creation, and any API where clients may retry on a network failure. The package provides two ways to attach idempotency to a route. The first is a standard route middleware. The middleware expects an idempotency key header, and when the same key is sent again with identical request data, the original response is returned with an idempotency replayed true header added to the response. Per route configuration is available via the idempotent dot op using method. The second option is a PHP attribute which works at the class or method level and accepts the same options. Since the attribute extends Laravel's built-in controller middleware attribute only and accept work as expected. Idempotency keys can be scoped in three different ways, configured globally in the config idempotency.php file or overwritten per route. Keys can be segmented by authenticated user. Guest requests will fall back to client IP. So this is the user scope. There is the IP scope, where keys are segmented by client IP address, and the global scope, where the same key applies across all users and IP addresses. The package handles two conflict scenarios. If a request arrives with the same key but a different payload, it returns a 422, so a validation error. And if a second matching request re-arrives while the first is still being processed, a true in-flight duplicate, it returns a 409 conflict header with a retry after one header in the response. Both behaviors work through Laravel's cache atomic locks, so a cache driver with lock support like Redis or Memcached is required. And two artisan commands let you inspect and clear cached entries without touching the cache directly. So the idempotency list renders a table of active entries with scope, identifier, key, route, status code, and expiry. And the idempotency forget removes entries by scope, identifier, or key. Destructive calls prompt for confirmation unless the force flag is passed. You can find the package on GitHub. We'll have links to all of Very good. Okay. Have you ever used Laravel Notifications, Mr. Dorinda? Yes. They are- Almost exclusively these days. They are a pretty amazing piece of infrastructure. Infrastructure? No. And they're a nice abstraction, as g- I guess what I'll get to, right? Um, we've all had these situations where you have a single notification that you want to send, and you wanna send it via one or multiple channels, and you have to wire up the integration yourself. Wouldn't it be nice if you could just write a notification, and then you could say, "These are the types of channels I wanna send it to," and there was drivers already written for that? That's exactly what Laravel Notifications are. And then there is this Laravel Notifications Channel project, which is a community collection of these different notification drivers for Laravel. There's tons of them on there, right? You can think of all the main ones. There's, um, Slack, there's Telegram, there's X, there is whatever. List them off. There's a bunch of them, right? But this is a new one. It is web push notifications. And so this uses underneath the browser's push API and VAPID, V-A-P-I-D, keys. I was trying to, in the short period of time I had between my last little segment and the segment that you had, trying to understand what these are. The, the interesting part about this is a lot of times it requires, like, this, like, service worker sort of stuff in the past when I've done this. But I think this VAPID keys, it doesn't actually require that. There's something about being able to do, like, server-to-server communication with no third-party push service in between. Uh, so Chrome, Firefox, Edge, and Safari are all, are all supported. Um, I need to do a little bit more reading about this, but it seems very interesting. So you pull in the package via Composer. Uh, you add the HasPushSubscriptions trait to your user model. That is what gives users their push subscription methods. And then the package itself needs a database table to store subscriptions and publish and run its migrations. So you're gonna do that. You will generate a VAPID key pair. So you have a public key and a private key. And, uh, this gets shared with the browser when a user subscribes. The private key will sign those outgoing push messages, so the browsers can verify that it did in fact come from you. Uh, you of course treat these like you would with any other secret. Don't rotate them. Every existing subscription that you have is tied to that key pair that created it. So if you switch those, you're gonna need to get a subscription again. If you are targeting Safari or iOS, you need to add a VAPID subject, uh, a URL, or a mailto address that identifies your app. Apple requires that and will return a bad JWT token error without it. Uh, it looks like, uh, I might have been incorrect on this. There is a little bit of client-side setup. It requires two things, a service worker, eh, and a call to push manager subscribe. But they explain how to do all of that right here. It's very simple. There is a basically two steps on how to do this. And then here's how you actually set up the subscription. Um, so there you have it. There's managing subscriptions written in here, and then there's of course, uh, information about how you actually go about sending that notification. It's just another channel called Web Push Channel. That's all it is.And it's beautiful. Looks great. I'm actually super excited to check this out for all of our internal applications that we have- ... and see how this is different than what I've had in the past. Um, I feel like I've tried some of these things before, but it is not this. It was not this. And so I'm interested to see exactly, uh, what the difference is. But, you know, what's written on the tin here is that you can make push notifications reach your users even when they don't have your browser tab open. That's the big selling point here. They do not have to be on your website in order to receive a push notification. No native app required. It just goes to their, um, you know, to their desktop. So pretty cool. Great selling point if you can get it to work. So check this one out if that's something you'd like to add to your project. Chevere Workflow is a declarative PHP workflow engine with async job ep- execution. Just the word escaped my brain. When your application needs to run a sequence of steps, some dependent on each other, others that could run at the same time, it's tempting to stuff everything into a single class or chain method calls together. The Chevere Workflow package offers a cleaner approa- approach. Declare your jobs, wire up their dependencies, and let the engine automatically determine execution order. I feel like 10 years ago, we were building workflow engines. Well, I, I know I certainly was. Um- ... so it's nice to see that there's a package that is, that is here for me now. Uh, consider a user registration flow that needs to create the user account, send a welcome email, set up a free trial subscription, and notify your team on Slack. Some of these steps depend on the account being created first, while others can run in parallel once it has. Managing this manually means tracking shared state, writing glue code, and handling partial failures yourself. Workflow handles all of that declaratively. You can define a workflow using a global workflow helper function, which allows you to then specify create account as a method, run sync, send welcome email, run async, create trial, run sync with a run if condition, and notify team, which also runs async. A few things worth noting here. Sync will block until the job completes, whilst async runs concurrently once its dependencies are met. Variable, uh, is a placeholder for a value you supply at runtime. You can specify a response referencing an ID field from a previous, um, workflow task's response or from its output. And then, as I mentioned, you've got the with run if method, which makes the, um, corresponding variable job conditional, and it is skipped entirely if the value passed is falsy. The engine builds a dependency graph from the declarations. Because send welcome email and notify team both depend only on create account, they will run concurrently once the account is ready. None of that will have made sense. Maybe there will be a visualization in the, uh, the, the YouTube video. I'm sure that our wonderful editors will get out a short with more coherent information onto socials as well. Each job can be a closure, it can be an invokable class, or a class extending Chevere's action. A straightforward invokable is just a plain action that it... uh, a plain class that extends an action. You give it an invoke method, and it does whatever it needs to do, kind of like a job class in Laravel anyway. To run the, the workflow, you pass your variables directly to the run function and access any job's outputs from the results. If any job throws, Workflow wraps it in a workflow exception that tells you exactly which job failed and why. And for jobs that call external services prone to occasional hiccups, you can attach a retry policy using the with retry method. A dedicated package brings first-class Laravel support, adding artisan commands, an abstract workflow base class, and a facade for running workflows anywhere in your application. Uh, if you use VS Code, the package has an official extension that renders your workflows as a Mermaid flowchart, and this diagram shows each job as a node, draws edges between dependent jobs, and annotates those edges with the data flowing between them, so you can see at a glance what send we- welcome email waits on, um, or that create trial will only run when enable trial is truthy. Because the graph is derived directly from your code, it stays accurate as you add or rearrange jobs with nothing to maintain separately. Chevere Workflow provides structure for multi-step processes that would otherwise scatter logic across multiple classes or make a single method unwieldy. And the declarative style makes it easy to see what runs when, and the automatic dependency graph means parallel execution happens with no extra configuration. You can check out the repository on GitHub for the full feature set, including action classes, workflow providers, and the VS Code extension. We'll have that and a link to the article which will explain this in greater detail with examples in the show notes. I gotta say, this one probably could have been almost like in the tutorial realm. It was really comprehensive. But I will say this i- it's a, this is an, a bit, a bit of, a bit of an advanced package, I think. This isn't one of those ones you just sort of like sprinkle on top. You know, a lot of- ... the stuff that we talk about No here, it's like, "Hey, if you want just this extra little thing, you know, here it is." No, this is more like, this is gonna handle the business and domain logic of your application. It might be, I don't know, maybe for some people it would be a really welcome refactor. Maybe there's a lot of things that they don't have built that they kinda need to do some of this with, and this would kind of just bring some sanity to that. I could see that being the case, and it does seem like a very nicely done package. It is not specific to Laravel. It's a Laravel adapter, but it also is just av- available to be used with, with, you know, straight up just PHP as well. So really, really cool stuff there. Uh, that is a great one, although it is a difficult one to explain. So I would read that one as well. Um, speaking of something that's really foundational here, Laravel Shopper is a headless e-commerce admin panel for Laravel. So the thing that's interesting about this one is that it's, number one, it's built on the tall stack. So if that's your jam, you're in luck, right?Oh man, I used to use the word tall and jam in the same one, and they're not, they're completely opposite stacks. Rather than shipping a pre-built storefront though, this thing focuses entirely on the back office side of things. So we're talking about the product catalog, the orders that are coming in, managing your customers, discount codes, managing your team, who can get in and manage these products, and things like that. Then it leaves you to build that customer-facing front end with whatever technology fits your project. So React, Vue, Svelte, you wanna use, whatever those are fine. You wanna use server rendered Blade files, that's fine too, right? You can do all that. This just doesn't concern itself with that, which I think is a huge benefit because AI is great at developing front ends, right? That's wonderful. But a lot of times, like the difficult decisions you need to make about how the back end should be structured and the hard-fought logic that lives in your app after lots of, like, injuries and scar tissue, right, to teach you how to do it the right way, that's the sort of stuff that is a little bit harder to develop with AI, and this gives you a super solid foundation to work with. So what's in the box? We have products and catalog items, so you got things like inventory tracking, image galleries and collections, things like that. It will do your order management and fulfillment, shipping details, things like that. Store admins can process orders, update tracking information, manage refunds. It's all in one dashboard there. Customers, as we talked about, with things like purchase history, their saved addresses, contact information for them, discount codes, like we talked about, roles and permissions for your team. Double factor, two-factor authentication is available for admin accounts, adding that second layer of security. Of course, we have to think about payment gateways. It ships with Stripe out of the box. It does have a manual driver f- uh, for cash on delivery or pay in person scenarios. So the Stripe driver handles the full payment life cycle, inc- including like initiating that payment intent all the way through, authorizing it, capturing it, refunding, canceling, processing. So that is the one to use if you can, but it does have other options you can build in. There's, of course, configuration and things like that. You can extend the control panel because it is just tall stack. And I did say this, it doesn't ship with a front end. However, if you'd rather not build the f- storefront from scratch, they do have like a starter kit that will give you a bolted on storefront to get started. The Livewire starter kit is available now. It's built with Livewire 3, Flux UI, Tailwind, CSS4, um, uh, sorry, Tailwind CSS version four, and it covers all the, all the things that were talked about already, like browsing the products, cart management, multi-step checkouts, et cetera. Lastly, but not leastly, it is also AI ready. It has Laravel Boost support out of the box. So it has three specialized skills that help AI agents understand the code base from the first time you install this. And when it's, it's installed, Boost will detect those guidelines and skills automatically. No extra configuration needed. Um, really great package here. Really, really good stuff. And you can see a demo, I believe, at laravelshopper.dev, docs.laravelshopper.dev. Great stuff there. Laravel Brain is a package that scans your Laravel application and renders an interactive graph of how requests flow through it. You can install it, run the scan, and get a visual map of your routes, controllers, services, repositories, models, jobs, events, artisan commands, scheduled tasks, and broadcast, broadcast channels all in one place. There is a video from the, uh, package creator that is just a minute twenty, goes through showing you how it all works. Our fearless leader, Erik Barnes, has put together a three-minute video talking through how this all works. Um, there is an interactive life cycle graph which visualizes every route through your application. Uh, there's AI context export, which is a one-click copy, a structured markdown snapshot of any node's call chain, database operations, and source snippets for pasting into any LLM. There is a rules file generation that generates context and rules for seven different AI coding assistants. There is route stress testing. You can run concurrent HTTP load tests against any route node with configurable concurrency headers and body. And you can watch mode and fat class detection, which auto re-scans on PHP file changes and flags controllers or services exceeding three hundred lines or ten methods as complexity hotspots. There is, uh, the interactive graph, the AI context export. All of these things are available to you. Each supporter tool gets its own rules file populated with your project's actual architecture, routes, packages, and code health data rather than generic boilerplate. You can find full installation instructions and the source code on GitHub. We'll link to all of that, including these videos, in the show notes. I am doing that tonight. I literally cannot wait. It's gonna be awesome. I've needed this, and that is super cool. So definitely check that one out. Okay, the next one is almost just as cool. It is pretty darn cool, though. Um, Laravel Chronicle is the next one, and it's talking about audit logs. A lot of us have this need to have these audit logs. But our solution is sort of a lot of times like Spatie activity log. Hit throw that in there, and now we have a database, uh, table full of activity records. So, so it's easy to query, right? But it's also just as easy to quietly delete or edit a row, and there's nothing in a typical Laravel package like that that's gonna tell you that that happened. Laravel Chronicle approaches this a little bit differently. So here's the clever bit about it. Rather than just writing those rows to a table, it builds a cryptographic hash chain, it almost sounds like blockchain- ... uh, for every entry using SHA-256. So each new record incorporates a hash of the previous one, so the entire ledger is interconnected. So if you remove an entry, that chain breaks, and then Chronicle's gonna tell you about it. Like, "Hey, somebody modified a previous record." That's so cool to me. I love that. And so the rest of the, the rest of thePackage, uh, right up here. It's just how to use it, right? It's the API. It's simple enough. There's really not anything I need to explain a lot. I'll talk about high level here. You can put in the record an actor, an action, a subject, metadata, tags, and then you commit that thing. And every entry needs an actor, an action, and a subject at the very least. Those metadata and tag fields are just for extra stuff that you might wanna attach, uh, attach context, uh, that would make sense for your domain. Then for querying these entries, it's similar, right? It, it looks like a model. It's just entry:: for actor, for subject, look for an action, look for something with this tag. And for large ledgers, Chronicle supports streaming of those entries one at a time using a database cursor. So it's not loaded all into memory. It's going to, uh, keep that memory constant no matter how many entries there are, because it's going to stream those things out. Handles paginated browsing, uh, without loading the entire table. Again, you can prove the ledger hasn't changed by doing a Chronicle export. You can verify that export. It's a really good fit for applications that require these audit trails, compliance workflows, financial records, security logging. Um, you know, anything where, like, if you were getting a forensic analysis because something went wrong, it's gonna hold up to something like that. Uh, so you can find the full source and documentation for this on GitHub. Super cool. Love this idea. Laravel Clickhouse is a database driver that integrates Clickhouse with Laravel, including Eloquent, the query builder, the schema builder, and more. Package features include Eloquent models with non-incrementing ID support, a query builder with Clickhouse specific clauses like final, array join, and sample, a schema builder with engine partitioned by order by and low cardinality column types, migration support via Artisan Migrate, concurrency query execution using Guzzle's AsyncHttpPool, and dual HTTP transport options supporting both Guzzle and Curl/PHP Clickhouse. Clickhouse is an open source column-oriented database built for analytical workloads, workloads. It stores data by column rather than by row, making aggregations over large data sets fast, and it is capable of querying billions of rows in seconds. It is a common choice for event tracking, time series data, and analytics dashboards where read performance at scale is the priority. If you didn't know, just, uh, just Archer gave a talk about, um, these types of databases, OLAP, I think they are called, um, at Laracon Nashville a couple of years ago. Clickhouse sits behind, um, Nightwatch, Laravel Nightwatch, and powers- ... a lot of the functionality in there. So we talked about the features that are, are available. Uh, it supports concurrent query execution as well, so you can do parallel fetches from different tables. Um, for example, if you wanted to query both users and events concurrently, you can do that, and the results are returned as a keyed array once all the queries are resolved. You can find the full documentation and, uh, source on GitHub. Links, of course, always every time in the show notes. Very cool. Okay, this next one is equally awesome. This one is called Wire Bones. It is by Felipe Martins, and I'm trying to remember what these are called. Uh, it's like a skeleton file, right? So if you've ever been on Facebook or, um, like Airbnb, and you click through to something- ... and while it's loading, you get this placeholder template where it looks very similar to what the content is that's gonna be loaded on the page. There's sort of placeholders in all the spots. Where an avatar would be, there's like a little circle, and there's a panel like a, you know, an outline of a panel, and maybe a, a square where there's gonna be a picture of the property that you're gonna be looking at renting. But it's just sort of a placeholder there that gives you a clue, a hint as to what's gonna be loading into the page. Well, that, as you might imagine, is a bit of a chore to undertake. A lot of people don't end up doing it, right? Or if they do it, they do it poorly. It's just generic, and it doesn't really match your layout because it's just a pain in the neck. This solves that problem completely. It's really cool. It takes in, uh, your page, it loads it into headless Chromium, it traces that rendered layout, and then it writes a matching skeleton blade file that Livewire will serve while that lazy component boots. So I have to say this, it is for Livewire, right? So this is not a solution for everybody. It is a solution for Livewire. So because the source of truth is the rendered component rather than this parallel template, you don't, like, get this design rot where you make a new change to the template and then your corresponding change doesn't make it into that other template. You just rebuild it. And so this will rebuild any files that are a part of the Vite serve. So it'll automatically rebuild those affected skeletons. Uh, it also... This was the thing that blew my mind. Number one, there's a demo. You should go check it out. It's at wirebones.laravel.cloud. The demo is responsive. That was my first question, is like, "Is this responsive?" Right? "How do you handle that?" It is. It will capture those multiple viewport breakpoints in one build and then build them all for you. So it scales. It's really quite incredible. Um, it also has authenticated routes supported. So sometimes this can be challenging if you've got, like, that Vite serve, but the page that you're looking at is behind a guarded route. Sometimes it won't... You know, you can't get that. Well, this handles that. It will, uh, use browser cookies, headers, or playwright storage state to get to those things. Uh, and then you just drop this into Li- Livewire using the lazy defer or lazy bundle. It also, as we've discussed with some of these other packages, has Laravel Boost skills included. Uh, it picks up those conventions automatically. And as I said previously, the rest of this is just how you implement this. I'm not here to tell you how it works exactly. I'm here to get you excited about the package, and then you can go look at it. It's very simple. Of course, as all these Laravel packages are, there's a nice little Livewire component that ships with it. There's a PHP Artisan command, wire bones build.That's, that's all you need to know. The rest of it is details. So very cool. Check this one out. Nice. The last package we have for you this episode is the ability to attach addresses to any eloquent model with Laravel Addressable. Laravel Addressable is a package by Luca Longo and gives any eloquent model a polymorphic addresses relation, dedicated billing and shipping traits, a freeform JSON meta column, and geospatial distance queries, all wired up through a single migration and a trait. Features include it being polymorphic by default, allowing you to attach addresses to any model without extra join tables, billing and shipping traits that provide shorthand relations and helper methods scoped per address type. There is primary address toggling with mark primary and unmark primary, with scoped events dispatched on change, geospatial support storing a point column, and query by radius, distance, or nearest neighbors, which requires MySQL 8 plus, MariaDB 10.5 plus, or Postgres with PostGIS, uh, extension. The JSON meta column allows you to attach arbitrary extra data like phone, floor, delivery notes to any address, and a configurable display mormat- format accessor built from a template you control in config. You can install the package using Composer and the appropriate trait, add the appropriate trait to your model, and this will give you a general purpose addresses relation on any, any model. So this is the HasAddresses trait. The HasBillingAddresses and HasShippingAddresses traits each add typed relations and scoped helpers for models that need to distinguish between address types. And with those traits in place, you get specific methods, billing address, billing addresses, and the shipping equivalents. Adding an address to a, uh, adding an address to a method, uh, adding an address to a model is a single method call. So you give it a label, uh, street address one, a zip or postcode, a city, a state, and a country, and the meta JSON column lets you store anything that doesn't fit the standard fields without touching the schema. Uh, the display address accessor formats an address using a template from the addressable configuration, and the default produces strings like, I don't know, like an address on one line that you wouldn't expect. And you can swap the template for anything that your UI expects. And for applications that need location-aware queries, the package stores coordinates as a spatial point column backed by- ... a Laravel Eloquent spatial package, and adds scopes for radius filtering and nearest neighbor sorting. There are query scopes for primary- That's really nice actually. Yeah, it's, it's handy. DM kind of That's, that's like the top level point stuff. for me right there. Like that's really, really nice to be able to see like- I wonder, I wonder how it handles the geocoding of the address to- ... to coordinates. So that'd be an interesting one. Um, but yeah, it has query scopes for primary billing and shipping methods. It is fully composable. You can mix them freely. You can use address query billing primary first, does exactly what it says. Give me the primary, the first primary billing address. You can learn more about the package via the source code on GitHub, links in the show notes. We're gonna wrap it up because we are right up against one hour today. You want me to hit tutorials? I read them real quick. Tutorials. You want me to hit them real quick? Do it. Okay. Hit them. So the first one is written by Moses Anumadu, and this one is about delivering personalized content to your users. So you can think about something like Netflix or Amazon or something like that, how they look at what you're looking at, and they find other similar products. Now in the past, this would've been done using like tags and randomizing a suggested post. It, it works, it's just not precise, um, that prediction isn't. And so really what this is building is this AI-powered recommendation engine. How is it working under the ca- under the hood? It is basically converting your posts into vector embeddings, which doesn't only get the words, it gets the intent of the post, right? The meaning of that post rather than just keywords or tags. And then we store them in a Mongo database, and then we use vector similarity searches to find related content and present those to the user. So that's, that's basically what this one is. You have to have a working knowledge of Laravel, uh, have a Laravel development setup, uh, environment set up, a MongoDB cluster, and then have some blog data sets for seeding our post collection. That's kind of what we're looking at here. So if that seems interesting to you, definitely read through this one. It is comprehensive. It looks really good. Similarly, on that AI front, what about shipping AI with Laravel? This is a, uh, course that Harris Reftopoulos has been working on. I think this is like episode six, maybe something like that. Uh, but the thing that he's tackling in this one is searching entire PDFs with zero search logic. So in episode five, the one just before this, we built semantic search from scratch with embeddings in pgvector. So if you're interested in knowing kinda how it works under the hood, that's a good one. It's great for like FAQ articles and full control over the data. But if you have a documentation that is expansive, it's, it's bigger than hundreds of pages of policies, product manuals, full PDFs, you're gonna need a different approach. And so this is where you can, hey, we're gonna partner with an AI provider, let them handle the chunking and bedding, and then we're just gonna use the SDK's file search tool to query it. There's no similarity math on our side. We just upload and search it. How do we do that? And so in this episode, he builds an artisan command that creates those vector stores, uh, uploads those markdown files, and then he goes through how you can test that and ship it to production. Really, really cool stuff there. Uh, so definitely check that one out as well. Okay, folks, that wraps us up on episode 258. Find show notes for this episode at Laravel, or sorry, podcast.laravel-news.com/258. If you liked the show, rate us up in your podcatcher of choice. That would be incredible. And, uh, if you have any questions, feel free to reach out to us on X at Michael Dyrynda, at Jacob Bennett, or at Laravel News. Whoo. It's been a good one, Mr. Dyrynda. It's been a lot of fun. If you, if you haven't got tickets for Laracon US- ... in Boston at the end of July, time is running out. They are expecting- Yes ... a sellout.So I would imagine that there are not- Wow, seriously ... very many tickets left. So get on that if you are still on the fence or waiting for approvals or just haven't gotten around to it yet. Time is- Yep ... running short. Sell it to your boss. I feel like I got a, a email from the team- The letter. ... that was like a sell it, sell it to your boss sort of thing. Um, and so I th- It's a bit tongue in cheek, I thought. What's that now? It was a bit tongue in cheek, I, I thought. Oh, was it? I didn't read it. I just saw the email come through. So what was... Did I... What was it? Was it a joke? I, I don't think it was a joke. I think it was serious. I just- ... I think it was a bit tongue in cheek the way that it was, uh- ... written. I can't find where I, where I saw this now, but, uh... Oh, I remember. Here we go. Here we go, here we go, here we go. "Dear Sir/Madam, I kindly request funds to attend this year's Laracon US in Boston, Massachusetts. While my work has been satisfactory, I believe I could deliver even more shareholder value by learning and networking with the esteemed artisans of the Laravel community. I must impress upon you that failure to attend would be a grave misfortune, not only for myself but for the company, the code base, and indeed the broader trajectory of software development as we know it." Mm, boy. "Furthermore, if I go with my colleagues, we can secure Laravel's finest discount. To neglect such a discount would be, I believe, a dereliction of fiscal responsibility." Oh, boy. They're really pulling it out "As the great Taylor Otwell himself once there. said, 'Elegant code is not born, it is forged,' preferably-" "... in Boston in July. With the highest of regards, Aspiring Laravel Artisan. P.S. There will be a dodgeball tournament. This is not relevant to the business case." Love this. Wow, what a great email. That's lovely. I, I would, I would send that. I would send that. Just enough humor to, uh, kind of get them engaged and continue reading, but enough seriousness- ... to actually sell it, so. Hopefully we can see you there, folks. It has been a fun time. Until next time, we'll see ya. Bye.

Get daily recaps from
Laravel News

AI-powered summaries delivered to your inbox. Save hours every week while staying fully informed.