irl from greece (laravel meetup)

nunomaduro| 02:35:45|Jun 12, 2026
Chapters8
Host prepares for the Greece meetup, introduces participants, and confirms audio/visual setup before going live.

A lively, real-world look at an Athens Laravel meetup, showcasing Git work trees, AI-assisted coding, and hands-on tools like PHPStan, PHPStorm, Polycope, and Cloud Desktop.

Summary

Nunomaduro shares a vibrant, on-the-ground view of a Greece Laravel meetup, blending community warmth with practical tech demos. He dives into how attendees use Git work trees to manage multiple branches locally, demonstrating from PHPStorm and CLI workflows to how environments and databases can be isolated per work tree. The talk shifts to AI-assisted development, highlighting tools like Polycope and Cloud Desktop, and discusses how to plan, implement, and validate changes with features like built-in browsers and live previews. Nuno then pivots to quality and testing: he argues for “strict” Eloquent settings (should be strict) to catch missing attributes and lazy loading early, and demonstrates a robust linting/testing pipeline with Past PHP, PHPStan, and TypeScript checks. He demonstrates practical conventions for code organization (DTO-like patterns, typed migrations, final classes, and use of form requests and actions) and emphasizes that AI should augment, not replace, human review of code. The session also touches on front-end choices (Inertia, Livewire, React) and how to approach legacy code with gradual improvements and rigorous testing. Throughout, the vibe remains candid and collaborative, with lots of Greek food banter, audience Q&A, and live pizza breaks—culminating in a call to keep learning and building together. Finally, Nuno hints at ongoing starter kits, future content, and the ethical responsibilities that come with powerful AI-assisted tooling.

Key Takeaways

  • Git work trees let you work on multiple local branches at once, with separate env files and databases per tree for safe testing.
  • PHPStan and shouldBeStrict help catch undefined attributes and prevent lazy loading, dramatically reducing runtime SQL queries in large loops.
  • A solid Laravel setup includes a cohesive lint/format/test pipeline (composer lint, composer test type coverage, PHPStan, Pint) to guide AI-generated code and ensure quality.
  • Conventions (typed migrations, final classes, DTO-like data transfer, form requests and actions) make AI-generated code more predictable and reviewable.
  • Frontend choices (Inertia, Livewire, React) depend on project scale; for quick dashboards Livewire can be faster, while Inertia/React suits richer SPAs.
  • Legacy code can be improved gradually by starting with level-zero PHPStan checks, adding targeted tests, and upgrading PHP/Laravel step by step.
  • Tools like Polycope and Cloud Desktop bring AI-assisted coding into a single workflow, with browser previews and integrated terminals to minimize context switching.

Who Is This For?

Essential viewing for Laravel developers who want to modernize their local workflow with Git work trees, AI-assisted coding, and a disciplined testing culture. Great for teams exploring AI copilots and looking for practical patterns to apply tomorrow.

Notable Quotes

"Zoom would like to access your camera. I say yes."
Showcases the informal, hands-on nature of the meetup setup and testing during livestreams.
"Cuz Zoom sucks balls."
A candid, humorous moment reflecting the casual, real-world vibe of live events.
"Should be strict. I'm going to enable this directive."
Demonstrates the core Laravel quality tactic of enabling strict mode to catch issues early.
"One of the most important things is testing. Past PHP, PHPStan, TypeScript—the full pipeline."
Summarizes the emphasis on a comprehensive testing and quality workflow.
"With great power comes great responsibility."
A closing reminder about ethics and careful use of AI tooling.

Questions This Video Answers

  • How do Git work trees help with dependency management and PR reviews in Laravel projects?
  • What is PHPStan shouldBeStrict and how does it prevent lazy loading in Eloquent models?
  • Which AI-assisted tools work best for Laravel development: Polycope vs Cloud Desktop vs Cloud Code?
  • How can I set up a robust local testing pipeline (Past PHP, Pint, TypeScript) for AI-generated code?
  • What are the best frontend choices (Inertia, Livewire, React) for a Laravel app with real-time features?
LaravelPHPPHPStanGit work treesPHPStormPolycopeCloud DesktopInertiaLivewireReact vs. Inertia vs. Livewire
Full Transcript
How are you guys doing? So, I'm currently getting myself ready for a lot of uh Greece meetup. It might take a little bit. Open the chat real quick for you all. One second. Let me know how the sound is though. It should be okay, but you guys let me know. What's up? What's up, Belings? No, this is for This is actually for you. The one you will be giving to the other speakers for yourself as well. Okay. Are you ready? Come over to the Yeah. Yeah. Yeah. All right. Sh. I will back. I will set up my stuff first. Okay. So, I do have Zoom. Uh, do I need to click on a Telegram link? You said I don't need to sign up to Zoom, do I? I don't think you need to sign up. No, no, you just need to have it installed. Okay, nice. So, Zoom would like to access your camera. I say yes. Yeah. Yeah, but we don't care. Close all of this. No camera, no audio. Your name here? Doesn't matter here. No, no, it's fine. Uh join join. Do you have a MacBook charger though? Cuz I uh I have one for sure. But this is okay. I might find another one. So this is the other uh [ __ ] How are you guys doing? Sounds great. Thank you, Janito. Thank I need to share your full screen. Thank you. Share my phone screen. Okay. So share Yeah, the entire screen. Yeah, this one. This one? Yeah. Oh, security stuff. You need to allow it. So, I'm going to allow Zoom. Yeah. Can I restart again? Yeah, it's fine. Okay. So, I've quitted Zoom. I'm going to reopen Zoom. Click again on the Zoom link. All right. Done. No video, no audio. Join. Share full screen. Share. No need to be full full screen actually because you're going to share the app. Doesn't really matter. Yeah, this one. This this is the one. I share. Okay. It should be done. Can you let open up your slides? And uh full screen then. Let me just close a few things here. I'm going to close this. I'm going to close my Telegram. To record a screen in audio is do I need to even do this? Yes. Yeah, you need to allow it. Oh, okay. I think it is allowed already. I don't know. Well, we are going to find out if it's working or not, right? Yes. All right. Let me know. I need to put you up. Is that okay? Yep. Welcome to Greece. Thank you. Jaz Jazoo. There's a lot of people here today. Oh, now I'm watching what you guys are watching. There's literally a lot of people today, which is awesome. The YouTube thumbnail got got screwed, I think. But I guess it's fine. So we good? Uh, so but just by the way, I will be walking a bunch like this. Yeah, it's fine. I can see it's fine. Yeah, it is. Okay, let me check. It is a weird yellow thing. I don't know why we have this though. You see this yellow thing? It's fine for my side. This one here. Uh, plus that. Yeah. Let me see. Looks like looks like this drag situation. Can I remove it? Yeah, this one here. Click on that. Clear all drawings. Top. Okay, I think that's fine now. Okay, we still see this though. Can I Can I check? Yeah. Yeah. I don't use Zoom myself. So, chat, does any of you use a Zoom? Cuz Zoom sucks balls. Just between me and you guys. Okay. You got it. All right. Do you need to test anything or we good? Yeah, we're good. This is where I'll be speaking. Like right here? Can I move this chair or the guy will be use it. You can not use it. It's fine. You can put it on the side. Who is speaking first? Uh Pet 10 minutes 10 15 minutes uh between And then all right, I think I'm ready on my side. Do I leave my laptop here? If you don't want Yeah. No. Yeah. Yeah. I do need the charger though cuz I lost my charger. Okay. We're going to find a laptop. I'm going to find you one. Okay. Thank What's up? Uh yeah, I guess. Yeah, it's all good. fun. Excuse me. What's your number? What is my phone? Or this one? Oh, you're so nice. Thank you. Yeah, I think so. Just check if it's starting because Was Oh, yeah. Nobody should be using Zoom. Ashley saying that nobody should be using Zoom. What's up? Ashley saying that nobody should be using Zoom. Yeah, I know. Does it work that one? Okay, Chad, here's the plan. And for those who just arrived um I'm basically right now at Greece and on this place right now this is happening a lot of Elme and I will be one of the speakers actually the second speaker and we are going to live stream the entire event. So you guys are going to hear the presenter of the event are going to hear the first speaker. You won't be able to see super well the speaker slides but I think it's okay but uh you know it'll be fun. So contact with you guys. By the way, I will be paying attention to the chat all the time. So, if you guys want to interact with me with the chat all the time, just let me know. Okay. What's up, TMP? How you doing? Chico, what's up, dude? I'm going to ask Harry's when this is starting. You are free to just stay here if you want to. Okay. What's up, push back? What time are we starting in uh 3 minutes? Okay. Oh, it's 6:30. Okay. I thought 6:30 was open doors local time. No, we we said Yeah, maybe some people still think that actually, but we explicitly said 6:30 this time, so we have more time for both of you. Nice. Good stuff. What's up? 1479. How you doing? All right. Sh. If you guys enjoy some agentic development, you guys are going to enjoy my talk today. Okay. It will be awesome. And dope. Is the AI following working good? Nope. And if I do this, now it is following. And I do again. And it's following someone else. There we go. How do I remove it? I just do this, right? Not just screw it over now. Never heard of it. How you doing, Ashley? How was PHP verse for you? Good. Seat button 99. How you doing, dude? Welcome to the live stream. Sharp as [ __ ] dude. Thank you. Thank He's getting [ __ ] up though. Should I go for a coffee? Is this coffee? You know, did you learn any Greek or not? What's up? Greek. Did you learn any Greek? Uh, you mean in Greece? Uh, I don't think so, though. But the food is good. I heard you at zaka. Yeah, that that one was probably my favorite so far. My brother's favorite as well. Um, and uh we got that. We got the chicken kind of barbecue thing. Yeah. Yeah, exactly. That that was solid as well. Uh what else we got? Um yeah, meatballs. Meatballs. Yeah, but the meatballs are Italian, I think. Not exactly a Greek thing, I think. So, we got that. Yeah, it's Mediterranean. Yeah. Yeah. Yeah. Uh we got the beer. The How was it called though? Mitos. Yeah. Yeah, that one. Mitos. Like Mitos. Yeah, that was We like it actually. We got two just because we like it so much. Yes. Very today. Uh yesterday night. Yesterday. Yeah. Will you stay? Will you stay? Yeah, we're going to stay until tomorrow in the Yeah. So, we're traveling tomorrow. First time in Greece or you First time in Greece. Yeah. That's great. You have a nice spot here though. I like it. I like it. Amamos. Mamos. Oh, it was not the one you guys were talking about. But these two are very famous. That's a good one though, right? Right. It's from Pat. It's another city. Okay. It's it's mainstream mainstream beer. There are a lot of local breweries that you can try. If you see something that is okay more pretty in the label, you can try it. Yeah. Is do you have a huge community here of what developers? Yeah. Yeah. Yeah. Yeah. The guys are doing a great job and uh Wow. Yeah. Yeah. We have a lot of meetups community alike. How how often do you do meetups here? I think once per two months more once per two months. Okay. For six per year. Yeah. In Portugal we do once per four months I would say but sometimes it depends. Sometimes we do like every two months when we are like in a mood but more recently it's just a one per four months I would say. Are the same people around the number of people in Port? Uh if it's in Lisbon it's just packed up. Yeah. If it's in Lisbon, if it's uh not around Lisbon, it won't be as packed up as Great job. Great job, by the way. Great job, by the way. Can you hold this? Yeah. Yeah. Just by the way, uh from this point, if you have the mic, everything you say will be recorded. Okay, got it. So, just keep that in keep that in mind. Hey, Chad. Okay, I'm going to keep it for now and then after Yeah. Yeah, exactly. Things are warming up. Warming up hardcore at the minute. It seems to be more bigger than Oh, you think that I'm a small guy? Yeah. No, no, no. It's just Yeah. I don't know, man. Sometimes people have the perception like uh on my size but also my in the way that I act in real life is just a little bit different from cameras. I expected that maybe taller like Aries more more okay. Congratulations. You have a huge community here. It's awesome. I love it. That's because of this man. Oh, Aries does does a lot, right? Aries is awesome. That's right. That's right. Musaka for the win. Musaka for the win. You say Musaka. Musaka. Yeah. That's one of the most well-known dishes in Greece. Yep. Yep. Yep. Yep. Yep. You got a cameraman now. It's my brother, dude. That W brother. If you're enjoying the the the recording. I love some. What is this? Shaw. Shaw. That's not Greek. That's a Lebanese. Oh, Lebanese. Okay. This is a Finn. That's a chicken with Oh, my brother really enjoyed the alumi cheese. Alumi? Yeah, that's from Cyprus. Hi, Adrian. How you doing today? Okay, I think we're ready. Okay, I stay here if you don't mind. Is that okay? Oh, wow. The stream is like almost real time at the minute. There we go. How this is even possible? Oh, he's on Twitch is on real time. Okay. Wow. I would expect some delay, which is crazy. What's up, Amit? How you doing? Yeah, this is the thinner. How much do you bench? Uh, not a lot. Well, we went to the gym today and yesterday as well. So, did we yesterday? Every day. Every day. Yeah. Giros. What is girros, dude? Is that like food or drinks here in Greece? Right. Sh. They are miked up. You are going to listen everything. Okay. Tell Aries. Tell what? Oh, Tro captis. Okay, I will tell him once I am with him again. He's like starting the presentation. I think there is some delay on YouTube. Well, that's the expected though. It's expected to have delay and Twitches does not have any delay at the minute. I don't know why Greek food. Oh, I see. El Nielson, how you doing? Welcome to the live stream, dude. Nice to see you today. By the way, chef, don't forget, go all the way down and subscribe to the channel. The last live stream I did, we have more than a thousand 1,500 people watching it across the entire Here's my brother Sh. Uh, we had to cross 1,500 people and we didn't have that number of subscribers. So, make sure you go all the way down and subscribe to the channel. Okay, double brother. Yes. Yes. Yes. Yes. Show the hat. Show the hat. Yeah, you can show them. Actually, you can grab them in in the store. So, this is the new hat we have. We have a store for that. Okay. Hi everyone. Okay, we started here. We are really grateful for each and every one of you for being here. This this year marks year 11 for our meetup, which is great. I mean we we cannot express how thankful we are because this is all because of you because you show up and because you like to give talks because you like to connect and network with other people other developers other developers h thank you so much for building this community with us and we would also like to thank the space that host us. It's a great space. We found it like three or four meetups ago. And we also like we have some more sponsors. The first one is Hack the Bons. We also have Epignoses. We have Tense and of course the partnership Laravel Incorporation themselves. So we couldn't do it without Enough beer. I'm not having beer today. So what do you what do you mean? Without further ado, I'd like to introduce the first speaker. Shut up and take this now. Are you ready? Yes, I am. Can you guys see the presentation? Is the presentation clear? All right. So, I'm Petros. I'm the warm-up guy. So, please raise your hand if you're ready to begin. I can see your hands. Come on. Come on. Let's go. Yes. That's perfect. All right, I will start backwards. I want to introduce myself. I want to learn a little bit about you. So, how many of you raise your hands are a daily Laravel artisan? Please. All right. The advertisement welcome. How many of you are first timers here? Nice. People raised the end one time only. Two. More. All right. That's good. Very good. That's nice. How many daily AI arts? You You guys can hear. We're getting there. Right. You should be able to just give it a quick hear the presentation, but let me and raise your hand if you relate. Not only now if you're related in the past or whatever. Uh I'm just going to walk it through. Switching context, commit, branch out, hot fix, push, branch out, go back to work, another hot fix, and stuff like that. How about this? Can I see some hands? Get work trees. Nice. The less I see today, the better for me. before AI gores. Less hands better. How about now? All right, we are ready, I think. So, let me introduce myself. My name is Ephra Pedros. I'm 41 years old. I currently work at Nord Health as a senior fullstack engineer. There we build products that redefine healthcare. I'm in the PHP world for more than 20 years and in Laravel itself for more than seven. And this is the work part. But my main driver is not this, but this is the people that surround me, my family, my fiance, my friends, and of course my hobbies. I play music, I run, and this is what gives me energy to move on day if everything is okay. And that's it. Let's start. I won't do any introductions about what you will see. So, we'll see how this goes. Happy birthday to Is it today? Today. 31 years. Yes. real quick. I have already created uh new fresh project. Nothing fancy. It's already there. Let me also open Chrome and let's visit. I have already created one repository here for this uh presentation Athens Laravel meetup. So the idea for today is how we can utilize work trees and I will give some bits. Is it better? All right. So the idea for today is how we can utilize gorgees and how we can use them in different tools. I will give you like an idea of how you can use it simply with PHP storm. then we can switch to polycope and then see a lot cloud desktop maybe at the end. So let's start. I guess you already know this. So the idea is how we can utilize git workers and why. So let's start. Let me open this and for example let's begin our day. We already have a pull request simple pull request uh that we need to review. So this is one thing that we need to do and the other thing to do is like create a new exciting feature for today or maybe solve a hot fix bug during the day but we'll see. So from within PHP storm if it opens in the newest version they have a dedicated place for work trees. So work trees give us the opportunity to have locally different branches that we can operate on top of them at the same time without committing changes. branch out, check out and stuff like that. It's easy from within the PHP storm. So from here you can easily go and create a new work tree and let's say that this is for a PR review. We start. Very good. Let me try again. All right. And here we can operate with cloud with manually or whatever we need in order to do our work. So a quick presentation here can open cloud. But before I do that, let's see what's happened here inside workers. We can see that we have two different work workers at the same time. And let's see how this translates into the browser as well. I'm using herd locally. So here we have this is the main work tree and here this is the new newly created work tree. I will open it. It's with an error and let's discuss a little bit about this. When you are creating new work trees not everything is moved around. So you have to manually configure it or create something that can move the necessary files in order for this to work. So let's do this manually. This is part of the presentation. So here we need the ENV file to start. So if we go here, let's grab this and let's move this here. Let's open a terminal. Let's try this. Pull the dependencies. Migrate maybe. Let's go back and we're good to go. And let's see now if I go back the idea is that I can work in both. So here is what I would like this to do. And at at the same time while this is thinking or working I can go back to the other work tree and do something else. For example, I can do a manual work here. Uh it's welcome. Yes. So once again this is one setup and this is the other one. You can quickly switch from these two back and forth. Let me see if this is done. Let me allow this. I think it's done. Any questions so far? I can have them now. So like like I said before, we have two different branches at the same time. Two different URLs on head. I can do everything I want on this that doesn't affect the other one. I can view review another PR. I can create a bug fix without having the need to stash commit change everything I need. And this comes to the next idea that I can leverage this in order to not wait for claude to think. I can have it in one work tree and do planning or execution or implementation and of the other branch I can work on something else while I can wait instead of waiting for the other to finish up. So when this is done, we can push this And this is done. How many you can create? You can create as many as you can handle. This is the idea. So this is another problem that we are facing currently. uh when github uh work trees were introduced like many years ago I think they are in place like more than 10 years now the idea was like to niece down in a specific thing that we are doing but now it's the only reasonable thing that you can do in order to move forward so you can spin up any work trees you need so this is simply working no command line for now you can do this by via command line by g commands and uh etc. But this is the simplest way I can think. PHP Storm is fully integrated with work trees. Now they have a dedicated window like we saw before. Here you can have it here. So you can quickly switch around between work trees. Create new work trees. In order to create a new work tree, it's already there for you. You can go here on the main branch. You can click here. And now they have the new work tree for main. You can create work trees from any base branch you would like. It's not only the main branch. You might be working in a PR train situation. So you might want to create a new branch from an existing branch. So you can add it here. You can create a new branch and everything is on the go. So any questions regarding G3 and PHP storm? Yeah. Go on. Multiple like in Yes, this is the idea. Every work tree has its own env. Let me show you real quick. So this is the main work tree. Let's name this main. Does it make sense? All right. So hopefully if I refresh here, this is main. I know it's small. I'm sorry, but it's here. It's main. Oh yeah. Okay. And if I go back, go to the other. Let me close this up. This is the work tree. Let me save it. Refresh the other. Yeah, I stopped the builder, but uh the NV is there. This is the initial step that I did. I had to copy the NV from my main file into the G work tree. run all the dependencies composer install front end npm install and stuff like that in order to spin it up and view it in the browser. But you can automate this. You can create a bus command that whenever you create a G work tree, everything is copied around and you can quickly reduce this steps. Yeah, that's what I wanted to ask. different everything is different. I will say yes. But some tools do this differently. Some use the copy on file method. Some of them just copy the entire project and but the idea is that you have two different branches at the same time. Anything please how you handle larger application applications with a lot of assets or a large database if I get right everything in the file system is right not always gorge I work in large projects as well so creating a work is like a matter of seconds yeah you have a large uh large code base the global database. Yes. Regarding database, it's up to you. You can have a different database in your env file. If you want to test different migrations, for example, in or have a different schema or creating a feature that has migrations to run and you don't want to run this in your main local database, but you want to create like a work tree database, you can do Large applications should have a way to quickly fresh the database from start. You have zero migrate fresh with some data inside. So you can start playing around hopefully. So yeah, it needs a little bit of organization platform team involving there in order to set this up for larger projects with isolated work trees database in order for this to work. In my day-to-day, I don't use it too much for database to be honest. I use just the main database. I go back and forth. We have a quick script to delete everything, create it from scratch. So, it's part of the uh bus command that we are running, installs on the compon uh the dependencies, front end, back end, runs the database either and it's part of the work three spin up if that makes sense. You can wait 1 minute, one and a half, I don't know. It depends on the scale, please. I guess you can run a work, right? You can do whatever you want. This is the idea. You can have different cloud instances into each work tree. So, it's like a fresh new context window for you. If you want to spin up sub agents in each work tree, then buy a good machine and you're good to go. Should I go on? we're going to see the same things but with a different tool. In the beginning, I used Polycope and this was the idea when I signed up for this. So, I will preview this. This is from Beyond Code. So, this is a different application that does the same thing. the idea in modern editors. I didn't ask that question. I don't know why. How many of you do you use cursor and okay not so much so the idea is to drop the classic editors so far. No hand coding just use your AI app in order to spin up herd which has some advantages here. So here it is. I didn't want this. I wanted this. So uh it gives you some tools that I find very useful. So if you use GitHub for your day-to-day issue tracking and stuff like that, you can click this. It's already linked with my GitHub account and linked with that specific project. I have already two issues in my GitHub repository for this. So I can quickly manage everything. It's on top of the code. I can have the description and everything I want prepared or someone else in the team, product manager, team engineer, stuff like that. So, I can build this up. It prepopulates me a small prompt to begin with and I can choose if I want to plan or execute depend on your let's plan and at the same time I will spin another work tree to do the same thing. Let's do blue now. I know it's small. I'm sorry for that. Let's do this as well. And I think yeah, it does this for you as well. Since it's connected to your GitHub, it can see your open pull requests. So you can start from there. I'm doing command plus but no let me just quickly if it's easy here maybe I can go. Is it good now? have old people here. So, let's see how this works. It's already pulled in the GitHub issue. Uh the idea is that we have a bug. I don't know if anyone noticed. Let's see that super bug. Yeah, that's it. Can you see it? It's good. So, I had an issue to resolve this uh bug. So, I have a specific work tree that it can start working on that. I approve the uh plan here. Let's switch out to another work tree. It says it's changed. So, let's see this in action. So, here in Polycope, it has a built-in browser. Hopefully, this works. All right. Let me do this. So, Polcope has a built-in browser. So, you can see that the bug is now fixed. It says deploy now. And one good thing that we can do here is that they have this target. So I can directly interact inside here and let's say I can target each element that is populated here directly in my window. So I can target for example this button again. It's already there. While this is working, I can switch to another work tree. So this is a better tool for me because I don't have to go back and forth to the browser at all. I can stay here if the settings are properly uh adjusted. So no need to go to the browser. Well, most of the things that I need, I can do them directly from this tool. So what was this about? This is another thing. You can rename your work trees because I don't remember why I opened this work tree. Uh this is a PR review. Let's rename it. Okay. Okay. And here you can see an overview of what this is. Do you get the idea? Here is my blue background and here is is it fixed? Let me check. Refresh. and where would go. Just for a proof of concept, if I open the terminal here, you can see that it creates like a work tree and it gives it like a random name. And if I open her, hopefully I can see that it's lick pigeon or whatever. Let's let's see where we are. It's under my account. Polycope/clones. So if I open her and import that directory here, it's here. We can see polycope clones. This is all the work trees that I just created and some existing ones. So if I go back, hopefully now this works. Let's see. No, it's not. I'm sorry. It was S. Yep. So, let's move on. This is another one. There you go. Any questions? Have you tried any other tools besides post? I tried cloud desktop and to be honest when I submitted this uh talk I was using polycope day by day I was super happy and then I reinstalled cloud desktop and never changed back. So this is my last one. Yes. Can you use polish provider? You I think you can use it with any uh um AI agent because it it's it's using behind the scenes the command line or whatever uh subscription you have. So you first have to login. I skipped all of this. It's prepared for scope. It was already linked to a cloud instance that I have a subscription for. So yeah, you can also one more question. Do you know when you have the dockerized environment local environment and you are not working with her is it so easy to I cannot answer I'm using her so I I I have colleagues that they use dockerized environment for example in our uh in north health work git work they don't go well inside the container at least in the container we have they struggle a little it. So this is like a local setup environment. It seems to go smoothly. So if we have everything installed, this is better. Also, Polycope, if anyone has um noticed, I didn't have to copy paste invariables composer dependencies and stuff like that. The only thing I need to boot up is the npm rundev just to build the any assets and see any UI uh elements as well. Any other questions? What does it do at some point? Let's see. I don't know. It's Should we keep that blue or no? I don't know what I don't know what the client request was, but okay. The client is always right. So, let's stick with that blue uh from Polycope. Let me close this assuming we are done. It was that. I think it was. I don't remember. I think it was ready, but I can't find it now. It's somewhere here that it has also a button. I stop. Okay. Yeah. I'm sorry. Maybe here. in those words there. It's here. So yeah, you have it here. Let's create a pull request for both of them and see what happens. So yeah, the idea is that it's when you create the pull request, no work is there. Simple process, new branch review and the process is like known from there. Does this cover your question? Any other questions? Yes, please. The work does work copying all the G repositor to a new file. new folder. Polycope is advertising this a lot. It doesn't copy the entire directory. It just copies only what you changed from the branch you created the work tree. So only the changed files just want to check because I didn't How much time do we have Harris? Um, you can keep not a lot but okay just we'll do that quicker. Let's delete everything here. So same idea different tool cloud desktop. From here you can choose your if you work on multiple projects the same as polycope. I will use Athens Laravel meetup. The idea is exactly the same. Here you have the option to create or not create a work tree. If you want to work on your main directory, you can still do that. In polycope, you can still do that. Let's create a new work tree. The same give me a color. Green. Green again. No other color. Dark green. Dark green. I like it. uh I guess there is no need to demonstrate g works again I can start a new session I can create a new work tree etc but I'm mainly focused on give you how the idea of how cloud does the same thing as polycope so here they have a window and these have these options they have also preview so you can still preview your application inside cloud desktop without leaving the application and go to Chrome and back and forth and back and forth. You can still have a dedicated terminal on your work tree. You saw that in Polcope again which is very handy. You don't have to CD anywhere. It's already targeting your work tree. Uh you can see all the T files that are changing. You can see the plan that it will create here. I didn't demonstrate that on uh Polycope, but here's your project. You can still search and find your project. So, I can go hopefully Yeah, I can still open that here. Let me close that up. This is the file. I know it's not PH PHP Storm, VS Code, or whatever editor you are happy with, but you can still edit things here. save quickly if you want to do some manual things on your code without your AI agent and still be good. And to be honest, let me create one more and let's plan this. I want the red background. This is a nice feature that I love. Let me plan this. I think this is ready. No, but this is the idea. How many of you go back and forth and see if Claude is finished and continue working? Let's wait a little bit. I just want to demonstrate one last thing that I enjoy on planning and I'm done. It takes a while. I can have some questions before we close up so we don't have a Q&A afterwards. Are you more stressed now or less stressed compared to a it's you know you have to evaluate many things in this is a good question. This is addictive but it's also I am to the core of my bone not a multitasker fan. So I need to focus on a single task and nail it. I leverage work threes daily to minimize a little bit the waiting of things. So and not switching context which is still weight because you have to do manual things. Let's test this. Let's do this. Let's rebuild this. Let's run migrations. Let's whatever do what this means. And yeah, so the plan is ready. So this is the plan that cloud created and you can interact directly with this document which I feel this is amazing. So if this is not the color that I like here, you can double click and let's go with this. You just press it. It does not um run but it gathers all your comments first. So let's change that one as well. Let's go with DC DC. So now I have two comments. So you document the entire plan and when you have your comments for your plan, you can let it work a little bit again. So this is a cool feature for me. I always plan before let cloud execute. So this is a quick review before we start because if you do more coding, you will have more changes in more files and some of them might not match your I don't know styling or your structure or your whatever. It gives you comments right away. You can answer them. You can move on and stuff like that. So yeah, I guess you get the idea. I will switch back here. Any more questions? Harris. So you're now using uh cloud lm with polycope. Is it the mode you use cloud or you use I use I use cloud. I think I'm retired from polycope. So I use cloud desktop as a as an environment. And so you use cloud code only cloud desktop. Yes. I I started with cloud code experimenting on PHP storm open new windows for each work tree have uh the terminal follow my lead but then switching back the which which g is now open it it's a little bit messy in PHP storm yet so I left the terminal then I used another tool I don't know how it's pronounced smok that you can have like terminals but they have also yeah I I don't know cmax. Yeah. So this was better because the focus was there and you were switching windows still using cloud terminal there but then everything in cloud desktop it feels like more natural more in the place. No more switching around just one window focus there. I'm guessing they will improve as well. So yeah does it work? And like you find like always. Yes. Let me real quick go back. So here when you create a new session, you have these options here. So here you can create from which branch to begin and here you can with a simple check box if you want to create a new work tree or if you don't and if you want like the for session how do if when the when the work tree is created so here for example like a work was created so you can close the plan you can open the files You can find your env. I think claude like polycope as well is not copying. So you have to copy if you want to override like we did. It depends on your setup. Like I said the idea here was just to scratch the surface give the idea of what tools did I use so far. Uh PHP Storm, Polycope, Cloud. I'm still trying to figure this out. Any other questions? Okay, so before I leave you, a big applause please everyone to Mr. Patty for you. One last comment, Harris, and I'm gone. I don't know who watches Marvel and stuff but this is something like food for thought before I close because we can see a lot of power like in our hands currently with AI with cloud and like monthto month uh a lot is happening. I never opened the discussion about ethics or whatever comes with that but please be aware that with great power comes great responsibility as well. Thank you so much now and then we'll continue the next one. Okay. All right. Sh. I'm going to get myself ready for you. Yes. Thank you. Congrats. This is mine and the other one is from Thank you. store. Can I hold this? Is this for you or you have your own? Uh, so we don't need this anymore. I think we need to give it to my brother. Hey little um wasn't here. Yeah. Uh, do I have like 30 minutes? Is that okay? Do I have 30 minutes? I calculated extra time. I knew you don't have Well, uh, yeah, it's fine. It's fine. Uh, can I open this up? Let me know when you uh, yeah, you can put it up. So, that's for Oh, for HDMI. So, we have the zoom. We have the HDMI. Okay. Do I need to do anything on Zoom? Right. Okay. Um, can you film that way, please? I'm opening Telegram, so can you film that? No. Thinking about getting that partner. Uh, that one. Can I help you? Uh, yeah. No. Share. Oh, yeah. Share the screen. That's fine. Is it good? You need to Oh, yeah. I can hear you from my earphone. It's going to be here. All good. Do I want to stop video, too? Okay. How about now? Use this one which is the smallest one and put it on the side. You know where you carry. Yeah. Check. You good? Okay. All right. Chef, you guys ready? Everyone type in double presentation. Okay. I'm I'm going to spice things a little bit here. Good luck, sir. Hey, thank you, man. Appreciate it. about getting the camera because I have a camera here. No, no, no. Yeah, you won't see it. He won't be on camera. So, he will put like right there. Next to me. And I will stay behind next to me. Next to you. Is that okay? Should I get this outside? You need a chair? Stay here. Yeah, we'll stay up, I think. All right, [ __ ] You guys ready? Good luck. Thank you. Thank you. You will like it. Okay. Cuban Federal is saying, "Hope you have a nice time in our country." No. No. Oh, I I will for 100% sure. Hey, nice to meet you. How you doing? Nice to meet you. I'm Nuno. What's your name? Limit. Nice to meet you. Laval person as well. Yes, we we met a long time ago in Madrid in the last uh Oh, that was what like 5 years ago. You might have been You might have been Yeah, 5 years ago. I know. I know. Did you enjoy it at Lakon in Madrid? Yes, it was my first talk at Lakon. I was a speaker. You you gave a talk. Oh, nice. Good stuff. Yeah. So, it was a nice Still using Laravel since then. I never stopped. Nice. That's good. That's good. Well, your tools like paint, pasta. Oh, he was all that stuff. I will talk a bunch about that today. So, talk about that. I will talk about other stuff. It will be awesome. What do you So, thank you. Thank you for the contribution. I appreciate you saying that. Thank you. Uh, you know, I do you know, I have to say thanks to the community too, you know, because because of them, I'm able to travel, which is awesome. Visit your beautiful country, you know. You have very nice food here. So, I love So, how long are you staying in Athens? I'm staying here until tomorrow. So, tomorrow I'm flying back. So, I love traveling tomorrow. But I got the chance to try some good food, so I'm very happy. Yeah, good food, good beer as well. So, you're from Portugal, right? I'm from Portugal. Sorry. I was in Portugal last year. It was one of the best trips. Yeah. When it's sunny, it's beautiful, but on winter, not really. So, food is amazing. Yeah. Yeah. Yeah. We have good seafood. You guys have good seafood as well here, right? Yes. But, you know, it's it's a different kind, right? I was and also very good prices. I was having a all you can eat. It's a simple city which is the time you know with the big coast an expensive city. Porto Nazarek. Okay. So, so Kashk was the So we went to Kashkai and then we went to in the middle of Yeah. Yeah. Yeah. But I mean Kashkai is beautiful. Is actually one of the best ones in Portugal, I would say. So that was a nice that was a nice visit. I was trying to see if I can actually, you know, recognize some faces here, but I don't think I've seen anyone, you know. Um I know obviously I know Aries right from Label news but also from from conferences but I think that's it and I mean yeah Madrid it was like long time ago so so you forgive me that I don't remember right no worries. So you always come to these meetups? Yes. I'm one of the founders but I quit the staffing. Yeah. A lot of work, right? We have a big audience here. It'll be awesome. I cannot wait to start speaking. One moment. Um I don't think so. I think you just turn it off. Yeah. Yeah. Chad, how are we doing? How we doing, Chad? Almost time to be on. Very excited to speak to this audience today. Very excited. Double presentation. Thank you. Thank you. Thank you, Shad. Thank you. Appreciate you guys being on that side. All right. I'm going to try to say thanks to you all during the presentation itself. Doing my best but I cannot promise. Okay. Okay. We're about 50 people today watching the stream which is awesome. Laval Japan presentation. Oh, it is the same. Yeah. But I'm going to try to make it like a workshop I think because just because you know looks like informal meetup. So I'm going to do my best to make it a little bit more a little bit different basically. All right, Shad. I'm going to turn the the phone off. So, I'm going to check the chat afterwards. Make sure you leave your questions on the on the chat message. I'm gonna I'm gonna answer to every single one of you after the presentation. Okay? Every single one of you. So, stay on that side. I'm going to answer to every single one of you. I'm going to do my best to make this really interactive. Catch you guys in a bit. Okay? I love you all. Oh, the turn whatever. We don't We haven't swapped m uh DJI's microphones, haven't we? I think I added them here. Oh, okay. Your yours is the right one, right? Mine is the left one. The one with without this uh thing here. So, you you know which one. Okay, cool. Gather everyone. Seven. How many people do you think use PHP here? Everyone. Yeah. Everyone besides one that I know that does sign. Everyone else. So, it's going to be nice. around 80 people. Yeah, it's awesome. Beautiful crowd here. So, congratulations. It's just to you. Let's sit down so we can start. And two chairs on the front yet. Two chairs. Two chairs on the front. Yeah. Anyone inside? No. Okay. You want to introduce me or should I just go? Uh give me one sec just so okay we're live now the second speaker I don't think he needs too much introduction you maybe heard of Nuno Nuno Maduro guy that's the guy here he created almost so I'm gonna give it to him so he can say what he created and everything. Yeah, you are too awesome. Thank you so much for that applause. Uh super happy to be here in Greece. Do we have an audience? PHP Laravel audience. Everyone uses PHP here. Raise your hand. Who uses PHP? Pretty much everyone. How about Laravel? Everyone as well. Okay, that's awesome. Okay, so you might be using some of the stuff I build pretty much every single day, which is awesome. For those who don't know me, uh my name is Nuno. Here we go. My name is Nunu Madur. I'm this dude right here and uh I'm a staff engineer at Laravel. I have created multiple open source tools like past php, pint, uh now pow and a few others. I'm also trying to become a YouTuber a little bit. So I love content especially I love to create PHP and lot content. Okay, that's what I do uh pretty much on my free time. However, indeed uh today we are here to speak about strict engineering and because we are in 2026 my friends this is more like strict AI engineering. My goal today is that I want to every single one of you to have really practical stuff for tomorrow. Okay? So you guys can arrive to the work tomorrow at 9:00 a.m. have a nice coffee here in Greece and then you jump into some of the good practices which hopefully I will share with you all today. Okay. And the very first one I want to share with you is just use better defaults for AI. You just said all of you use Laravel uses Laravel pretty much every single day. And there is a few things that I always do to keep sure my app is a little bit more prepared for this area of AI and I'm going to share a little bit of that with you all. And hopefully you guys find this useful today. Okay. Now, this contains a little bit of live coding. I wasn't prepared to be like this all the time, but I'm going to do my best here. Okay, so I'm going to jump here into one of my favorite editors ever, which is Sublime Text. Do you guys know Sublime Text? Anyone raise your hand if you use Sublime Text? All right, we have four hands, which which is absolutely awesome. How about PHP Storm? Here we go. PHP Storm for the win. We all love PHP Storm. However, I like this theme of being a background white with some color. So, I'm going to just use Sublime Text today. Okay. W PHP Storm though. It's awesome. I love it. All right. So, I'm going to go jo I'm going to jump here into my app service provider. We all love a beautiful app service provider. And then I'm going to jump all the way down until to until into my boot method. Okay. Now, what my boot method, there is a few things that I always add to make my app a little bit more strict and therefore a little bit more ready for AI will fail first and fail fast. The first thing I do is configure my eloquent models to do something a little bit different. Now, typically this talk is kind of super formal. I'm going to make it informal today just because I love the grease food. Um, do you guys know what is should be strict? Raise your hand if you are using should be strict. Okay, nobody knows. Okay, this will be awesome because this is the first thing you guys are going to enable tomorrow morning at 9:00 a.m. Now, what this does? Well, should be streak does two things. Number one, prevents accessing missing attributes in your eloquent models, which is absolutely awesome. Number two, prevents lazy loading, which is the biggest degradation of performance ever in the planet. Okay, now I'm going to show you these two examples real quick. I'm going to jump into my console.php and I have this beautiful example right here. What it does is quite simple, normal code. I'm going to go to my database, fetch a user, and then I'm going to access this mail property. Now, this mail property does not exist. Okay, it should have been email with a E. Okay, so it's incorrect. Now, what is the value returned by default on the fresh Laravel application? I'm going to jump into my Ghostly terminal. Do you guys know Ghostly? Ghostly. Oh, yeah. I turn two. Anyone? One user. That's awesome. Okay. iTunturn 2 used to be my default terminal as well. I love it. And now I'm I'm now I'm using a ghostly terminal because it just feels good. Now let's execute that piece of code we had and let's see what happens with Laravel when the attribute does not exist. I'm going to type PHP artisan missing attribute and Laravel does not tell me at any point that this value does not this attribute does not exist. Now we can improve things by using the things you guys don't know but are going to use tomorrow morning which is should be strict. I'm going to enable this directive. Go back to my ghostly terminal. Run the same command. And now Laravel tells me this beautiful exception that attribute mail does not exist. As such fix your mistakes. Okay. And we are going to do that real quick. Go and jump into my console.php. Fix this attribute that does not exist. And obviously things work as expected and we do have a valid email. Now this is one of the things he does. Second thing is prevent lazy loading. Why that is useful? Well, let's find out. I'm going to jump into my console.php and I have an example here which is quite simple that logs all the SQL queries. Okay, DB listener for the win. Now all the way down I'm doing this for each loop which many of you have every single day. Now on this for each loop I'm doing something really simple which is fetching all the users and then for each one of the users I'm counting all the notifications. Now what is the problem with this? Let's see. I'm going to go to my terminal once again. Execute this strict lazy loading real quick and let's see what we have on the console. We are going to see all of the SQL queries performed. And I do need to disable that uh thing before. Let's actually do that. Kind of spoiling already. No good. Nuno. Okay, here we go. We have 12 queries because we have 10 users uh 10 users on the database. What happens if you have a 100 users? Well, you have a 100 queries. If you have a million, you have 1 million queries. This is called lazy loading because for each one of the users you have in your database, you have one and plus one query. Okay, 1 million users means 1 million SQL queries. Now we can prevent this from happening which is by enabling this should be strict once again and now Laravel will tell me that well do not even try that code because you just attempted to lazy load notifications and this is true. So it can go back to my console.php and fix the issue originally on the query itself just by doing this. I'm going to load the users in the notifications for those users every single time. Now just watch this beauty. Okay, just watch this beauty. Cleaning my terminal, running the same command, and now I have only two queries. Do you know the fun part about this is that if I have a 100 users, we still have two queries. And if you have a million, how many queries do you have? Here we go. Which is absolutely awesome. And I love this one. So tomorrow morning at 9:00 a.m., this is what you guys are going to do. Okay, this is one I have more a hundred like this. Are you guys ready? The next one is configure commands. How many tabs you guys have open on your laptop right now? 8, 10, 20, right? And now with AI coding agents, you have like a 100 perhaps. Now what is what something that may happen is that you may are you may have a tab which is accessing production another one accessing potentially your dev environment and suddenly you think that you are on the dev environment and maybe you run something like this thinking that you are on the dev environment and then maybe you just lost your job perhaps right we just nuke the database in production and suddenly we don't have anything else and we are going to be out of jobs and the backups are now working because we thought it would be working but they are not well would be nice if we prevent this from happening and it's actually quite easy you can prevent this from happening by implementing something called a defensive on depth which is even if my mistake I run this command in production laval does not even allow me it's super easy to implement this which is by using this db prohibit destructive commands do you guys know this one raise your hand if you know this on H. Did you really know this one? Okay. Well, okay, it's fine. So, prohibit the shy commands will literally prevent Lavl from running destructive commands in production. Let me show you. I'm going to go back to my terminal. Run exactly the same command. And now Lavel, tell me don't do not even try it. Okay, it's not possible. Will not work. Now, this is DB uh prohibit commands. It really just works. I'm going to be honest with you. There's a bunch of stuff that I always do in my apps. There is this too, but I also use immutable carbon dates. I work with money on my Laravel apps and the last thing I want is be charging users an incorrect date for uh their money. So, carbon immutable dates. I use different password defaults. I like to make sure that my passwords are uncompromised. making sure that every single password inserted on my system is a valid and uncompromised one all the way down. I like to make sure my testing is super sandboxed using this beautiful thing prevent processes but also prevent stray requests. I use this stuff literally all the time and much more. And because I love you all, what I have done is I have compacted all this stuff so you guys can do tomorrow composer require a lot of essentials and you just get it. Okay, everything just comes by default. You don't have to type a single line of code and all those little things that I always do just get activated in your app. Now, one very important thing, you may not actually enable this on existing applications. Why is that? Because that may introduce breaking changes in your existing behavior. However, if you're starting a new Laravel project using the Laravel new, you can actually use this Nuno Maduro essentials a million downloads already by the way, which is pretty cool. Now, enough of Label. Today, I want to talk with you about some of the good practices in the PHP world. We love PHP, right? So, let's talk about PHP a little bit. How many of you know PHP stand? Raise your hand if you know PHP stand. Okay, that's awesome. PHP stand is probably the best project that ever happened to PHP since its incarnation. Okay, it's literally TypeScript for the PHP land and everyone should be using it by now otherwise they're not using modern PHP. Now for those who are not familiar with PHP stand, I'm going to just quickly demo to you. So hopefully we'll understand the value and start using it tomorrow. Going back into my be, beautiful sublime text. And I think I'm going to open this update uh user action. Now on this update user action, I'm going to do a mistake. The same mistake as before. Actually, I'm going to just remove this E right here. Okay, this does not exist. We know that already. So I'm going to go back into my terminal and run now vendor bean PHP stand. in PHP stand will show me this beautiful error message which tells me that I need to scroll all the way down. Here we go. Let's do it. Here we go. Access to an undefined property user mail. The property does not exist in PHP stand is telling me that. Why this is useful? It's obvious. We have PHP stand going through all the codebase and telling me what is wrong. Why this is even more important now because we have AI coding agents who don't have all of the context of your codebase but with PHP stand they will be moved to the right direction and tell them exactly what is wrong. This is the best stuff that happened to PHP since PHP itself. Okay, I love PHP stand and there is something else I always love. Let me actually just fix the issue real quick because I do have a demo at the end of this and I want to make sure it works. Here we go. Running PHP and again obviously working as expected. Now how about TypeScript? Raise your hands if you use TypeScript. Let's actually make a test here. How many of you use Live Wire? Okay, let's say 10% inertia with React. Wow, that's 1%. How about inertia with Vue? Okay, that's like 10% to How about the others? What are you guys doing? Okay, no front end, just the API perhaps. ideas with NBA. Oh, okay. All right. So, for those who are using any kind of JavaScript, just scratch that and go with TypeScript. Okay. Super useful. Just like PHP stand. Let me show you real quick. Jumping into this resources folder, I have this beautiful inertia page right here, which is called user profile edit. I have a couple of imports, which are the use cases on PHP. And I can just go here real quick and do a mistake. I'm going to import page instead of use page. Now, what happens if I run TypeScript on the terminal? Super obvious. TypeScript will just tell me that thing you try to import, call it page, does not even exist. However, the use page I was using before does not exist either now. So, we can just go back, fix the issue, run TypeScript, and now it works again. This stuff was important one year ago. Now with cloth code and chat GPT 5.5 or whatever you guys are using this becomes a mandatory thing. Okay, if you guys want to be top level engineers this is a must. Cleaning my terminal going back to my beautiful deck set slides that is something really important to keep in mind in 2026 which is I love patterns but AI loves them too. What is this about? And I want you guys to just think a little bit with me. Okay, what is the first thing that AI does when you request a feature? The first thing is that AI gets familiar with your codebase. We'll see this dude is using PHP, is using lot of ll is using some TypeScript. And then we'll get familiar with a codebase you guys have. Is he using street typing? Is like super type safety fanatic? Is using TypeScript? How how controllers are coded. This is the first thing AI does. understand your codebase. If you guys have a messy codebase, the generated code will be equally massive um bad. Let me just show you this. So, I'm going to go back into my Sublime Text and I'm going to show you how I implement this thing uh of conventions. I'm going to open my database migrations. Now, if you look at my database migrations, all of them are equal. They are super similar. The first thing they have all the way top declares streak types one. I'm gonna go all the way down and I see my code fully typed all the way through. I don't use PHP docs because they are useless and then I have this super strict way of writing my migrations and of course I don't have any DOM method. Do you guys know why should we have done methods? Anyone here uses down methods here? Okay, I don't use D methods because I do think migration should move forward and not backwards. Anyways, I don't use dog methods and that's my convention. Now, why this is important? Because if I jump to another migration, they look exactly like the previous one, the same conventions. Another migration, the same stuff. This one, the same stuff too. They are all the same all the time. Guess what? If I ask AI to generate the migration, we'll get inspired by this one. It will be exactly like this. Same goes with models. If I jump into my Laravel eloquent models which is right here, streak types all the way top. I have property reads to make my code a little bit more type safe. I use carbon immutable for dates, final classes. My code is using PHP generics. Everything is the same across all my models. They all look equal. And guess what? If I jump into my controllers, they also are exactly the same all over the place. I always use a form request. I always use actions and then I proxy the validated information from my form request to the actions itself. This is super important and at the end of this presentation I'm going to do a demo to you so you guys can see all of the stuff I'm talking about in practice. So this is conventions and why they are important. Now let's jump into my favorite topic of the planet which is testing pipeline. Are anyone here using past PHP? Okay, let's say 40%. The others use PHPUnit. Raise your hand if you use PHP unit. That's not half of the room either. So, how about the others? What are you guys doing? Users you okay? Manual test. I see. All right. A lot of people think that testing is about unit testing, but it's not. It's about unit testing. It's about type testing. It's about type coverage. It's about code coverage. It's about styling. It's about formatting. It's about the entire spectrum of testing and ensure that you have quality. Why this topic is important right now? Well, it was already important but with AI is literally the last safeguard you have. AI generates this code and then you have the strong testing pipeline which will verify everything AI generated. Okay, super important. And I'm going to show you exactly how do I configure all of this and make sure that AI generates perfect code. I'm going to jump into my app once again and I'm going to open my composer.json again. My composer.json. All the way down I have something I like to call my scripts section. It does a couple of things, but the first thing it does is composer lint, meaning that I can go to my bash terminal right now, type composer lint, and a few things are going to happen. The first one is going to run PHP, a tool that will modernize your code instantly. Meaning that if you have PHP 7.4 or PHP 8.0, Recctor PHP will bump it to PHP 8.5 instantly and you can take the day off after that. All right, then we have Laravel Pint because who doesn't love a good pint, especially in Greece, right? So, Laravel Pint, what he does is format your code, make sure the code is clean and just nice and I run it in parallel to make it even more fast. Now, all the way down I run npm run lint. Okay, and this is exactly the same stuff for the JavaScript runs eslint and printer or oxint or whatever they're doing today. Okay, on JavaScript they changing tools all the time. Regardless, I run linting as well on the JavaScript. Now, all of this stuff is a script, meaning the following. Meaning, if I jump back into my Ghostly terminal and I run composer lint, it will run all those four scripts in the same execution. Okay, the new developer doesn't need to know which tool do I have. We'll just run composer lint and that will run the full ling pipeline. Now, if I go back into my composer.json and I scroll a little bit down, I see this test linked, which is effectively the same thing as the script on top, but will execute this in dry run, meaning that it will not format, but check instead if the format is clean in okay. Now jumping a little bit down, I see this test type coverage which is in my opinion one of the mis one of the most um underrated features on past PHP. By the way, past PHP have so many features that probably today make past the most complete testing framework in the world. Okay, not only in PHP, literally across all languages. And this feature is one of them. Now this is called type coverage. executes executes past PHP with a d-ash coverage flag with minimum 100%. Let's see on the terminal what this is about exactly. I'm going to copy this script, go to my ghostly terminal once again and type composer test type coverage. Now passph will go through all my codebase and tell me if I am if I have 100% types everywhere. Meaning the following. If I go back into my update user action right here and I'm going to just remove a type which is no good. Now what happens if I run past PHP with a test type coverage will tell me wait a second this is not going to production because we are missing a return type on a line 22. Isn't this thing awesome? Come on I want a round of applausees for this one. literally points me you are missing a return type on a line 22 with some colors and greens which is awesome. I can just go back edit again run again the same script and now it's obviously working as expected just literally points you in the right direction now this is type coverage but we have more if I go to my composer.json JSON. We also have test types which will execute what we just talked about PHP stand and TypeScript. Now then we have the famous taste uh test unit which will be effectively running unit test. Now this unit test will be a little bit special won't be just simple uh running past. We'll run past and parallel because they have expensive laptops. We may as well use them. And then we run dash coverage with exactly 100%. Now this is a hot topic right code coverage. Why is important? Because basically you are testing all the code you have. But then we have people saying code coverage is not important. It is super important especially now on the area of AI. It's really the only thing you are going to have to guarantee that the new code is tested. Now important to keep in mind 100% test coverage. it it must be of good code quality tests basically. Okay. And for that if your existing tests are good AI will equally generate good tests uh for the new code. Okay. Now all the way down we finally arrive to the thing that will aggregate this thing entirely which is composer test. Now composer test will run everything we talked about in a single script. Let me show you this beauty on the terminal. Okay, clearing my terminal and running now composer test. This will run the entire testing pipeline right here. Linting types code coverage, type coverage, the full drill is happening right here on the terminal with a single script. Now you may ask, which is a very good question by the way. Why this is important? Three reasons. Number one, if a new teammate arrives to your team, he know he doesn't know it doesn't need to know where the things are placed on vendor or npm. It just runs composer test. That's it. That's the only thing it has to do. Number two, you probably are using GitHub actions which is down pretty much every day. But if you are using GitHub actions, something really important is that the GitHub actions will execute composer tests instead. So instead of having a bazillion scripts right here, you just run composer test and you are mimicating on CI exactly your compo your CI locally basically. Okay, super important. Now even more important and that's why I just wrote here I think super important. Let me just double confirm. Here we go. Super important. Super important. We have guidelines for our coding agents. So we want to tell them this super important. at the very end. Always, but always run composer test. Do not even ask the user. Just run it at the end. This means the following. You go to AI, you ask for a feature, and the feature won't be delivered back to you unless the test suite is passing. And we have 100% code coverage. We have the full drill right there.Oop. That being said, I love testing in general. If you guys love that topic too, go to my YouTube channel, youtube.com/nunaduro. I talk about PHP, but I talk about other stuff as well. And this talk is a 30 minutes talk just about testing. And I go even deeper on this topic of testing, which I do love so much. Now my friends, we talked about streak typing, strictly ifouts, streak patterns in strong testing pipeline. I kind of want to show you all of this stuff in practice with AI. So, we are going to build a feature together. If and only if cloud code is not down. Okay, let's see. I'm going to go to my Safari browser and I'm going to log in. I'm going to make zoom in a second. Chill. Okay. All right. Here we go. I'm going to go to my settings page. This is a Laravel starter kit. Okay. Now, on my on my settings page, I have my profile. And what we are going to build together is a simple notes form. Basically, I want to be able to tell my users how can a add notes. Okay, so we are going to build a text box here where users can add notes and then check them out later. Okay, a simple to-do app basically. Now to do this, I'm going to go to my ghostly terminal. This is the moment that we pray. Cloud code, don't be down. And I'm going to run cloud code, but I'm going to run it with my favorite flag ever, which is just do not ask me stuff. Okay. Okay, here we go. Cloud code does not seem to be down. So, let's actually prompt it to do the following. Build a new feature. Under profile settings, right below profile information, allow the user to add random notes about anything, but just do not make it editable or deletable. This is something that I typically recommend to people is scope the feature the minimum as possible. So, you move slowly with AI instead of fast and you don't know what's happening. Okay? and then do not do sub agents so we can actually follow what's happening in the terminal. Now pay very close attention because everything we talked about will be applied on the next 30 seconds. Okay, I'm going to click on enter and let's just follow all of this stuff together. Okay, so right now the first thing AI will do is getting familiar with my codebase. is is using PHP Laravel is using actions or models or whatever is getting familiar with my entire codebase understanding what's happening looking closely at all my files controllers models understanding my coding conventions after doing this we'll start generating code and you will see that the code generated will be exactly like we want hopefully okay last time I did this it wasn't like this because AI is not deterministic but it will work right now okay now we has enough context is starting building the models in the migration. So let's take a close look. The migration is being generated as we speak and let's see what it does with the migration. Guess what? Removing the down method. We don't like down methods. Remember that one. Then we go all the way top. We see that he's removing PHP docs right there. It's also remove making sure everything is fully typed and we have the best thing ever. Declare streak types. Now moving all the way down, we see my beautiful models with declar types as well. Carbon immutable being used. Note factory for our tests. Type safety with property read literally oneshotting oneshotting the feature as we speak. Building relations as well and casting super safe. All the way down we see a note factory being built. So tests are being prepared because we do have tests in place. We keep going a little bit is literally oneshotting the feature because we have implemented everything we talked about. We see generics being used because PHP does have generics in case you don't know. We go all the way down. What else? We see uh try to use a make action which is not available. That's actually a good feature we could contribute by the way. But we see an action being created call it create note. The note action will simply just start a new a new note for the user on database kind of expected. We see a form request being used as well. And this form request will hopefully be super strict. Required string minimum amount and a max a thousand. We go all the way down. We see our controller which guesses what is exactly like my my old one form request. We see the current user attribute which injects the current loged in user and we also see the action being used. We see also the request sending the validated information to our action itself. Super important validated as well. Okay, make sure you know this. Okay, validated. Then we go all the way down. We see the web thing being added. Easy peasy lemon squeezy. We know this. We go all the way down. What else we see? We see front end. Okay. Front end, TypeScript types. Let's see what we have here. Of course, we have user nodes. We have an interface being created. Literally oneshotting this feature. Okay. Now, at some point, it should be done and should start jumping into the test suite. While it does that, what I will do is check if the UI is working. This is the moment we clap. Wait a second. Let's see. Here we go. Notes being added. I'm going to type love you grease. And hopefully this is working. And here we go. Okay. Literally working in a working as expected. Thank Now my friends, because we are not vibe coding, we actually want tests. So let's make sure this is working. Let's go all the way down. We see tests being created. The existing tests have quality. So the new ones will have quality, too. And super important after making sure this tests are just perfect. It's important to keep in mind that AI will run the most famous command in the planet which hopefully uh is going to do real soon which is composer test. So after running all these tests I do expect to see a beautiful composer test at the very end. We kind of highlight it with super important. So let's make sure you run it. Okay. Pint being run. Running the relevant tests. Okay. Just doing some smoke test. Composer test needs to needs to appear right now. Please. Composer test. Here we go. Being run as we speak. Making sure the quality of the entire new code will just be perfect. Now, my friends, what do I want to say? I want to kind of give you a very important message. And this message I'm about to give you is probably the best and the most important message in 2026. Okay? I want every single one of you to be top level engineers, the best ones in the market. Okay? And the difference between being a top level engineer in the miducer one is this one right here in 2026 being a miducer engineer right here. Okay. And be top of the class. This one right here. Now what this means exactly means the following. Back in the days when AI wasn't a thing all of you used to review code but also all of you used to understand what the code is doing as well. This is your job as well in 2026 even if you are using agents. Meaning that we look at the code that got generated and we review it like if it was ours. So we just look at it line by line exactly like back in the days. You review every single bit and you understand every single bit of the code being generated. And this is my message to you again. My name is Nuno. Um, I cannot wait for the mingle and just be with all of you. So, if you guys have questions or just want to know my name again, my name is Nuno. Uh, yeah, I love you all. Thank you so much. Any questions? Anyone? Just by the way, if anyone is shy to make questions, you can make them afterwards as well, which is clearly not the case here. So, let's go. So starting from fresh like a new project that's the easy easy part like when you are in a big project that has bad patterns developers that have departed the project and are no longer with the company has bad practices and like you have also like data that it's needed for the back office to operate so this like the function can operate. How would you tackle that in a way that it's like not being a ticket that takes Yeah, that's a week. That's a very good question. Very good question. Probably the one that comes more often when I give this talk is what's happening with my existing legacy codebase. It's difficult. I don't know how to actually take time to tackle the legacy code. So, this is what I would do if it was me. I would clone the project and make sure PHP stand is passing at level zero. Okay, PHP stand unlike people may think you don't have to start like super strict mode. You can literally start on level zero and level zero will tell you basic stuff like do you do you have any die leftovers or a DD left over will tell you that if a class does not even gets used anymore so we literally tell you all of the basics from that every single week you jump a level from to level one to level two you go step by step but making sure things are still working as expected. I would equally add a small u a small test suite. You know people think that test suite need to have 100% test coverage like I think but you don't have to go that way immediately. You can use something like browser testing to make sure that well at least my website renders to begin with okay I can log in I can log out as a basic test suite on top of the most interesting functionalities you have log in log out create an article all of the basic stuff. So this is what I would do at a small test suite and then I would potentially when I'm comfortable with the test suite I would potentially implement a little bit of recctor PHP making sure I can bump a little bit my numbers at least to a safe version of PHP because PHP 8.1 is no longer maintained is insecure but you want to make sure you want to be on the at least still secure base of PHP. Same goes with Laravel and all the other dependencies. So you don't have to be like instantly like this on legacy projects but uh take an hour per week. If you do this like taking an hour per week with your team you will ensure that slowly but surely the project gets there with good quality. This is what I would do at least not like one hour per person per team or one person. It depends on the project. Depends what we're talking about you know. Um but I would you know I would at least make sure that one hour per week depends on a project then you know depends on the project requirements but but yeah a little bit every week let's put it that way anyone else. So do you think that in 20 years from now all these frameworks the next frame all the MVC framework will be merged into one matters now the fundamentals I guess the doesn't matter that much the fundamentals how do you say the community so the question was um how people think uh if within 20 years are we going to see a single framework work or um or things will continue like this I've been a net guy and a PSP guy for 20 years but now I can write things in nextJS or in Java I mean I understand the I need to spend more time understand but I couldn't do this three years ago something in I couldn't do this I couldn't spend the time 10 years ago but now I can with AI you mean teaching you yeah because I have someone teaching and doing it for me and then I I these tools and make sure that pretty much it works. So I do think that technology have stabilized a little bit. I don't know if you guys remember but like back in 2010 2008 frameworks were like come and go every year right we had zen code ignite and then symfony and laval and I do think that in the last 10 years since 2015 especially things have stabilized on php they have we see symfony we see a lot that's it unless you guys are doing something else now we also see on the front end a little bit of stabilization we see react being you know well known as being the front-end framework to go you can be EP and use other stuff. But if you really want the market, React just won the war over there. So I do see a stabilization in technology. Now all the AI we know was trained on existing frameworks, existing libraries and I do think that AI in the future will be just based on this stuff. So everything that you know about Laravel, about React code will be continue to be used on the next years to come. Now what's happening in 20 years? That's a lot. Especially in technology, that's a lot. Now, if I were you or anyone in this room, I would do my best to master the principles, master the patterns, and just be ready for the future instead of doing the opposite, which is, oh, this will be all gone anyway, so I'm going to just, you know, chill and just have nice grease food or whatever. So, I would still continue to, you know, do my best to be as much prepared as possible for the changes. Something I have noticed about this is the following. The people who were building stuff before AI are the same people who are building stuff with AI, right? So, which tells me the same thing. If you just put the effort every single day, you will be rewarded in the future. I guess that test agent, right? Correct. First question, do you prefer test development or not? And second question, do you review your test line by line as well. So, so I got the second question which is one is the first again the first question is if you prefer test driven yeah the second one how much you trust your test driven by the review them also line by line. Yeah. So the first question was if I use TDD. I'm going to be honest. I don't like TDD. Uh for some I do understand why do people love TDD? The fact that you write the test first and then you make it pass. That's a good theory, but for me it doesn't work. So I like to write the test the the feature first. Making sure I'm comfortable with what I'm building. Making sure I align with the UI as well because UIs are weird. And you know make sure I build entire thing and then I write tests for it. That's just my way to go. Now, nothing nothing against TDD. I think like if TDD works for you, that's a perfect, you know, it's just perfect. Now, regardless if you use TDD or not, just write tests. All right, that's the most important thing. And then you can use the methodology you want for building them. Now, if I review my tests, which is the second question I do, meaning that…

Transcript truncated. Watch the full video for the complete content.

Get daily recaps from
nunomaduro

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