Seasonal Coffee, Production Readiness, and Prism Updates

Chris Gmyr (00:00)
Hey, welcome back to the Slightly Caffeinated podcast. I'm Chris Gmyr

TJ (00:03)
I'm TJ Miller.

Chris Gmyr (00:05)
Hey TJ, so what's new in your world this week?

TJ (00:08)
man. well, we just had Labor Day weekend here in the States. So, had a like three day weekend with work and four day weekend with the kiddo. it was pretty, pretty chill weekend for the most part. my son's birthday was yesterday and he just turned 12. And so since he landed in his birthday, landed in the middle of the week, we took him out to an arcade, for his birthday. And it was a

It was the first time I've been to this arcade. My wife had been a few times. But it was like...

I'd say like 60 % arcade, 40 % like claw machines. And so you get your like, like most arcades now you get your like, your car, your like swipeable like token card, right? Which has all your like game plays and everything on it. And so like all the claw machines and everything like worked with the like your same card and everything. So it's cool. play it like my son's super into claw machines.

And we thought he'd be really into claw machines, but it turns out he was way more into the arcade games. but there was one claw machine he went at for like a good five, maybe 10 minutes trying to get something. And of course I walk over and I'm like, he's like frustrated and like moves on. And of course I walk over to it and like, get the crap, like first try. I'm like, man, but if you would have gone one more turn, he would have got it. But he was, he was just still stoked to like.

get it. Other than that, just like.

No, was like a mostly a chill weekend. had had some like interpersonal stuff pop up and it got kind of tough like Sunday, Monday, but bounced back, got some prison work done over the weekend. But yeah, felt pretty good, man. How about you?

Chris Gmyr (01:44)
Nice. Similar, so I took Friday off, kind of extended long weekend with also Monday off, it was my wife's birthday last Wednesday, and I asked her if she wanted me to take off on her birthday or like Friday to extend the weekend. She opted for Friday. We did go out to dinner on Wednesday for her, but took the four-day weekend, did a bunch of like lawn work outside, and it was...

TJ (02:04)
guys.

Chris Gmyr (02:09)
It's starting to cool off here, which is nice. And it's not like 90 degrees, 100 degrees. And just going door to door at NAAC. So it's nice getting a little cooler weather, doing some stuff outside. then did some grilling, did some smoking on Monday, did some ribs and cornbread and stuff like that. I shared some pictures with you guys and on Blue Sky. So yeah.

TJ (02:32)
Dude, I was drooling. That looked so good.

Chris Gmyr (02:37)
came out really well. And it's also a nice one. It's cooler to do that too. Yeah, I love doing ribs and wish you guys could be a little bit closer because we had tons of leftovers.

TJ (02:47)
Yeah, yeah, me

too. That looked phenomenal.

Chris Gmyr (02:50)
So yeah, then back into it on Tuesday and I'll talk about it a little bit more, but went through like kind of our go live process. Getting ready for that. Did some compliance and testing. Yeah, I can. I can circle back to that in a little bit. But yeah, pretty pretty good week so far. And then this weekend we decided to take off to the beach.

⁓ one of the NC beaches close to us, it's about like two and a half ish hours away. So really even when my son gets home from school and doing like a little outing, ⁓ out there and come back on Sunday, just taking advantage of the cooler weather. you know, after school starts, so it's like not peak season anymore. and then before like hurricane season, you know, really kind of kicks in and we're busy with school and scouts and stuff on the weekends. So, ⁓ yeah.

TJ (03:43)
Yeah.

Chris Gmyr (03:44)
That'll be fun this weekend, so looking forward to that tomorrow.

TJ (03:48)
That's sick, dude. That sounds like a ton of fun. I would I think I would kill for a beach day.

Chris Gmyr (03:52)
Yeah, so trying to sneak it in and like even though we've gone on trips and like family stuff, it's been with other parts of the family and this summer we haven't. Done like just a vacation or a trip for just the four of us like our little immediate family. So this is kind of like a nice like end of summer. You know, kind of trip celebration kickoff and you know the kids always love the beach and and playing out so we don't have any plans, but.

TJ (04:08)
Yeah.

Chris Gmyr (04:19)
going to the beach all day Saturday. So it'll be fun.

TJ (04:21)
Yeah, man, that's good plans.

That's good plans. Sick, dude. Well, ⁓ I figure since like you touched on it, weather's shifting over here and it's been like we had a I think a pretty hot summer, but it's been back down in the like low to mid 70s, kind of starting off the day in the mid 50s. So is where like we're into starting to get into fall weather and I.

Chris Gmyr (04:25)
Yeah.

TJ (04:47)
I love it. live for spring and fall personally. talking like coffee a little bit, do you, or like we've talked about it in the past too, like the seasonality of coffee selection and like what types of coffee you drink. ⁓ do you find yourself shifting in the fall to like this time of year to like anything different or are you still on your like summer, summer caffeine drip?

Chris Gmyr (05:09)
Day to day, it's mostly the same. Pretty boring, unfortunately. But yeah, when we go out occasionally to cafes, there's one right by us that does a lot of seasonal type drinks and they make their own syrups and stuff. So they'll have a seasonal menu out. So sometimes I like trying some of them.

⁓ so it really depends on what they have on the menu. ⁓ and since I don't do anything super special at home, when I go out, I'll try something new and they don't have always like the, the best like straight espresso. Like sometimes I'll get that, but sometimes I'll just try whatever seasonal item, that they have usually not like a PSL or anything like that, but usually they'll have some sort of, I don't know, it's cinnamon or.

honey or fall type flavors that I'll try once in a while. But we also don't go out to cafes all that much either. So it's kind of like, I don't know, maybe once or twice, you know, for the season. So yeah, how about you?

TJ (06:10)
Yeah, I definitely have found myself, like, I think we're done brewing iced coffee for the season.

or at least like big batches. I'll probably go down to like the small batches and everything. I will do a single seasonal PSL just cause I can't help myself. but I'm holding out for a little while until we get into like a little bit more fall weather. Like once I start rocking a flannel every day or something like that, that's, that's what I'll do. Do my, my one PSL. and my wife always gives me a hard time about it and it's great. I love it.

so other than that, like I'm back to like mostly, warm drinks, but my day to day doesn't change much. Still just like standard fresh press in the morning and roll with that. yeah, nothing too crazy. Like looking forward to cider though. ⁓ I, I am a hot cider. I like cold cider too, but like give me a like 60 degree day and some hot cider.

Chris Gmyr (06:59)
Yes.

Yep.

TJ (07:09)
Yeah, I'll take that.

Chris Gmyr (07:10)
Yeah. I do like some hot cider, too. It's good. Good stuff.

TJ (07:12)
Yeah, yes. Like, especially

with like, you add some fresh cinnamon to it. I think that's like, I think that's the real ticket you do. this is where I miss working at coffee shops because if you like steam wand heat some, like it works really well. like steam wand heat some cider and then like just add some like fresh cinnamon on top. So good. Like.

follow with some donuts and then everything's happy.

Chris Gmyr (07:40)
Yep, totally. Yeah, unfortunately, like we don't have a ton of, like apple orchards around here, cause it just gets too hot. You have to travel a little while to get closer to the mountains where you have a little bit more elevation and cooler temperatures. ⁓ so it's very different from probably where you guys are and where we used to live in upstate New York. Cause there was just like apple orchards everywhere. Like you could get like closest like 20 minutes and you could go for

TJ (08:01)
everywhere.

Chris Gmyr (08:05)
as many hours as you want to get to different areas. But down here, you got to travel for probably at least an hour and a half to two hours to get to an orchard, or at least like a decent one. So yeah, we haven't gone down here yet. Maybe we'll take the trip if we get a chance this fall. But yeah, it takes a little while to get there, unfortunately.

TJ (08:16)
Dang.

Yeah, yeah, we're within like 3040 minutes of us, you can go to like five different orchards. They've all got stuff going on. Yeah, they're all over the place here. He's got to like, I just I'm I'm

I used to live like five minutes from all of these orchards when I like was growing up. So I used to like ride out to them all the time. but yeah, now living where we're at, they're like half an hour, 40 minutes away, but yeah, then there's like a ton of them like all in one spot. So, ⁓ we'll definitely be hitting up that. Yeah. We've got a couple like roadside places like nearby that like get

Chris Gmyr (08:56)
Yeah, at least that's not too bad.

TJ (09:05)
apples from the orchards too. like we've got a couple like they're not stands. They're like they're whole buildings, but they're and they've got like pumpkins and like during the summer they'll have like corn and stuff, but it's like a permanent building. So it's like almost like cider mill market kind of thing, but not by water and they don't. Yeah, it's kind of weird.

But anyhow, they'll get stuff from the local orchards and everything. So within a couple minute drive, I can get fresh apples and pretty fresh donuts too, which is nice.

Chris Gmyr (09:40)
That's cool. It's good to be relatively close to those things.

TJ (09:44)
Yeah, for sure, So yeah, we touched on it a little bit during your update. Go Live Week and a bunch of Terraform and nice to be shipping. So I'd love to hear a bit about that.

Chris Gmyr (09:58)
Yeah. So Tuesday when we came back, we had a pretty big test fest. ⁓ So we have those four big launches coming up, especially when multiple teams are involved. So what we did was worked up a big Google Sheet doc for the different milestones that we worked on, different functionality, both internal to our service, because we're just the API service.

interacting with this third party. And then we had other teams working on top of our work to do the UI updates, changes, things like that on multiple applications, multiple teams, things like that. So we got everyone in this sheet and running through this in the same two-hour time block for this test fast. And it came up with a few little tweaks and changes that we needed to make, but generally all good and green to go.

⁓ and then like right after that meeting, had, the compliance and testing with the third party. So because we're dealing with like a bunch of HIPAA information and, ⁓ prescriptions and medications and sensitive info, they basically go through their own sort of like test cases to kind of live test, ⁓ all the things that they, want to see, like us being compliant about.

TJ (10:53)
Nice.

Chris Gmyr (11:19)
So it could be like input validation. could be like SSO security concerns, making sure that we're blocking things appropriately or letting things through or showing specific error messages when they need to come up. And all that went really smoothly. So it was really great to see us getting through like test fast basically unscathed. then the compliance and

TJ (11:44)
Yeah.

Chris Gmyr (11:46)
official kind of sign off with that unscathed as well. So it was kind of a I was kind of worried about it coming into it because you never really know like how these things are going to go live when you do them. Even though we've done like a bunch of testing and prep for it. So it was really good to kind of take like a deep breath after both of these sessions and be like, OK, we actually like really did a good job and we tested and validated everything and

really did our due diligence around the whole project and all the other functionality that we had to work with other teams on. So it was really good to get at end of that day and be like, OK, we did it. ⁓ So now, a little bit later today into tomorrow, we'll get the production info because they don't give that to you until you're actually compliant on their platform. So we'll get that info today.

TJ (12:24)
Yeah.

Chris Gmyr (12:39)
We'll clear out all the test data and everything that we need to do for that, then pull the trigger to go live and start funneling some people into the new service. we'll ⁓ hopefully be getting some traffic later today into tomorrow and then start ramping it up earlier next week.

TJ (12:58)
That's sick, man. Like that's a big milestone for sure. And, what a cool thing to like get through all of that, like being rather unscathed and, you know, nothing, nothing major coming of it. That's, that's a pretty big accomplishment, especially for a new team, like coming together. so are you guys, I'm assuming like y'all feature flag all of this stuff, right? To like be able to handle like rollouts and testing and everything, right?

Chris Gmyr (13:24)
Yep, exactly. So we have different rules in our testing and AB rollout service. So we have that turned on and all these different services. Even listening for Kafka events, things like that, all that stuff is capped for AB testing and feature flagging. And then

Yeah, we have a couple other safeguards here and there. So we'll be flipping all those on, clearing out accounts that we don't need ⁓ anymore, and kind of resetting the stage for production traffic. So yeah, it'll be nice. And it's also good that it was a brand new kind Greenfield service. So we didn't have really a lot of places to put the A-B testing or feature flagging in because like,

A lot of the traffic is just from the API, like brand new calls. A lot of things we were able to test kind of like on the side as well. So it just made things a little bit easier instead of doing high traffic cut over on a service that's been around for a handful of years. So it was a little bit easier.

TJ (14:25)
Yeah,

I'm assuming the feature flagging that is just like heavier on the consuming app side of things. And then like, it's just you're the backend service for all of that.

Chris Gmyr (14:37)
Yep, yep, totally. So yeah, went really well. But one of the things that we came across was we use a lot of Terraform and a lot of AWS services. And we were seeing that one of our scheduled tasks wasn't refreshing correctly. So when we push out a new Terraform update, it's supposed to generate all these new assets in AWS.

⁓ update to the latest tag essentially and pull in that newer code and do whatever it needs to do, right? So in one of these scheduled tasks, we noticed that the latest version wasn't being picked up. So as I was looking at it more, I couldn't really figure out what's going on. Everything is like looking okay. And so I fire up

Cloud Code session and was like, hey, this is going on. This is what's supposed to happen. It's not happening. Here's maybe some errors from the AWS console. What's going on? And at first, it's like, well, everything looks good, but it could be something in a shared module. So we have a bunch of shared Terraform modules and GitHub actions and stuff like that that SRE and DevOps have made over the years. And it's like, maybe it's something in this shared

module. So I point it to the repo of the shared module and because it has GitHub access it just like went through and checked out this shared Terraform module and it's like I found the issue and it's actually this and it could be affecting not only yours but anyone who's using the shared module. So I wrote up this big doc on what the issue was

some options to either fix it or work around it depending on how big of a change that we wanted to do. Posted it in our DevOps channel and they're like, yeah, this is a pretty big issue. I get just like uncovered this and spark like a whole conversation on doing these updates and fixing this and that and notifying like different teams and it's not.

TJ (16:31)
Hahaha

Chris Gmyr (16:42)
super huge, it's just like one of those things that has just gone like unnoticed for a while. And it's like, it was just super interesting that like the AI code session could pick that up within minutes, you know?

TJ (16:56)
Yeah. Yeah. I just had a really cool Cloud Code debugging moment the other day. We'll talk about it either later today or in the next episode or something, but the ClickHouse project has come full circle and it's time to work on that again. And I was having some data issues where I couldn't see... The data pipeline is like Laravel to Kafka, then Vector pulls from Kafka and pushes to ClickHouse. And I was seeing events land in...

Kafka, but they weren't getting to ClickHouse. And I could not figure out what the heck was going on. And so I just launched like Cloud Code. And our development environment has all of those pieces configured and everything to work. So it was able to like just debug its way through it. And like, we figured out what the issues were. But God, it was like, it was crazy how quick it got to that point and like how long it would have probably taken me to figure out what was going on. And it figured it out like within a couple of minutes.

spotted like both problems I was experiencing.

Chris Gmyr (17:54)
Nice. Yeah, I just, don't know, first things like that, it's like so quick and has so much access to, you know, Google searches and everything else. it's like general context where like, I don't even know if I would have found that, let alone, you know, within minutes or even hours, you know, so just the fact that it can go through this and raise this as an issue that

like that we can look into and see if it's actually an issue or like how big of it an issue it is. Like, I don't know. It's just been super cool to see. So it's good to have like some nice wins like that, where other times it can be like completely frustrating and going off the rails and not valid at all. So that's been like an interesting learning experience of like seeing.

Kind of like the good days versus the bad days of AI and using these like code agents and helpers on a more like daily basis. Because some days it feels like, does this thing even work? like other things, going through the Terraform issue, it's like, wow, OK, you actually did a good job today. Thanks.

TJ (18:55)
you

Yeah,

right. It feels like this day to day experience, but, uh, that's so funny. Yep. Yeah. I've been using Claude so much with Prism in this like giant streaming output refactor. Uh, or at least I've been trying to use it a lot because it's mostly a bunch of grunt work, uh, at this point, but I'm still, I'm still having days with it where, this felt great or no, this didn't feel great or.

Like we get all the way through it, all the tests pass, but I'm like, mm, I don't know something about this doesn't feel well. It's just like.

reset all the changes and have another crack at it.

Chris Gmyr (19:38)
Definitely done that more than a handful of times. Let's go in a different direction, or just try again tomorrow, and then tomorrow it comes up with a totally different solution for it. It's like, OK, why didn't you think of this yesterday?

TJ (19:40)
Yeah.

Yeah, so in plan mode, I've been asking it to give me like three options. So doing some of these bigger refactors, it's like, give me like three options for how to refactor this to try and get ahead of that. Tomorrow it just comes up with a better way of doing things and it's so frustrating. It's like, me three options up front. And if I don't like any of those three options, let's just go back to the drawing board and come up with three different options.

And just kind of like cycling through that until it gives me an option that I'm like mostly into or completely into and then like make some tweaks from there. But yeah, just kind of like trying to front load that because it has bit me so many times. ⁓ Just trying to front load that with like, me some options upfront, you know.

Chris Gmyr (20:29)
Mm-hmm.

Yeah, yeah. And I've. Then putting all those options and other plan files, especially if I it's like later in the day, or if I'm not going to be able to like execute it. In that same moment, I'll just add all those options to separate plan files and then tomorrow or like the next session I'll come back and say like hey yesterday or in a little while ago we.

planned on plan one, two, three, here's the Markdown files. Please review them, see which one might be more viable given maybe this new context or information. So that's been really helpful too. So I think the tip of just saving all those plan files to Markdown to easily re-reference later or even have the AI bot update them as you go has been a really

Great tip.

TJ (21:25)
Yeah, yup, yeah, dumping this stuff out to Markdown files is like a state for later. Huge hack, like, I don't know, I'm constantly doing it. Now, for me, it's been like...

try to figure out where to keep these files and make them easy to search and reference. Because I'm definitely building up some stateful stuff that I want to keep around like Maybe we get three quarters of the way through the refactor and I don't like it anymore. So we got to go back to the original plan and I don't want to play that guessing game of, it going to generate the same plan again? So trying to keep a lot of state around for later as we iterate really hard.

Yeah, definitely something worth doing.

Chris Gmyr (22:04)
Yeah, I've been putting them, I think I mentioned it before, but in the dot-clawed directory, I made a sub-directory for plans and then like a underscore archive within that. active plans go in dot-clawed slash plans, things that I'm either like thinking about or actively working on, or maybe, you know, different options for some sort of task. And then when I'm done with them, I'll just move them into the underscore archive.

TJ (22:17)
nice.

Chris Gmyr (22:34)
in the plan directory that if I need to reference, can just type in the path directly to the chat and I can easily find it.

TJ (22:42)
I like that man. That's a really good idea. Maybe I'll start storing them in there too. I've been using, I've been just using like bare, like bare notes for now.

Chris Gmyr (22:49)
Gotcha. Yeah. At least with the Cloud directory, I just have that globally getting ignored anyway. So then I don't have to worry about all this stuff in the root directory or wherever kind of cluttering up the repo. So it's been a nice little hack to get them in there. Unfortunately, you can't use the at file callout in Cloud code. So if you do the at sign, you can

TJ (22:55)
same.

Chris Gmyr (23:14)
it brings up like a file prompt so that you could easily like search for a specific file. But it doesn't do that within any dot directories, which is unfortunate for like GitHub files and cloud files and stuff like that. So kind of annoying. I couldn't find a workaround as of yet. But if anyone has any tips to get that to work, that would be great. So I usually have to like type them out by hand or just

TJ (23:24)
Really?

Chris Gmyr (23:38)
copy from a different command line.

TJ (23:40)
Yeah, I was just testing it because I had Claude code up and my terminal and yeah, yeah, you can't like you can mention the directory like the dot folder directory, but you can't it's like not auto completing anything inside of it. So yeah, you have to like path on from there. But yeah, it's not a ton of path to write. So doable. But yeah, I'd love to see that in Claude code. They're like just being able to like auto complete through that. At least like the Claude directory would be great.

Chris Gmyr (24:06)
Yeah, yeah, that would be nice. But like I said, even the GitHub directory of, hey, investigate this GitHub action or read in the PR template file to write a PR. It doesn't do any dot directories for them.

TJ (24:23)
So that

works, actually. It does list out the .github directory. So I wonder if it's not auto completing, actually, because we have it gitignored. it's like honoring the gitignore file. And so if you have that globally gitignored, it won't let you access it, because I can add into the .github directory and pull up pull request templates or CI stuff.

⁓ cause I had it fixed some workflow stuff before and I just tested it. Like that works, but yeah, the dot cloud directory does not work. which leads me to believe that it's like honoring get ignores.

Chris Gmyr (25:02)
Yeah, I'll have to check that again, because I know, at least a few weeks ago when I tried to do a .github file, it didn't work. But I know they've been pushing out a ton of updates, too. It feels like every day or even during a session, it's like auto-updating. It's like a little flag. So hard to keep up with all the changes. I don't even think they publish all them all the time. At least that, from what I've seen, or at least the emails that they send out, they might just be.

out tweaks and changes and bug fixes.

TJ (25:32)
Yeah, I'm sure there's like GitHub, get really like releases and stuff where you can go find notes if you want to. But yeah, what they're like publishing through email is in like full change logs of everything.

Chris Gmyr (25:43)
Yeah, yeah, totally.

TJ (25:45)
So you want to know what's something crazy? We've been doing this podcast for a year now.

Chris Gmyr (25:47)
That's crazy.

I

know. It's been awesome. I can't believe it's been a year. So we both got that email through Transistor, think like last week or a week before, something like that. And yeah, end of August last year was the first episode. And this is episode 38 today. So yeah, happy one year plus.

TJ (26:01)
Yeah.

Yeah,

happy one year, man. That's crazy. Yeah, we made it. We're going to keep going, too.

Chris Gmyr (26:17)
We made it.

Yeah, keep it going. Still like doing it. Even when schedules get crazy, we try and keep it to a weekly schedule. But holidays, travel schedules, things like that, yeah, it's totally fine. I know a bunch of other people just try and make it work or record more remotely or wherever they're going. I'm like, let's just take the week or a couple weeks off and just relax. It's like, I don't know.

Still a hobby-like side project and just a nice thing to do, but I don't think we need to kill ourselves to keep that weekly schedule and just keep it fun. Yeah, yeah. No one's paying us to be here. We just like being here.

TJ (26:56)
Yeah, we're not professionals.

Yeah. If you

wanted to pay us to be here, please do.

Chris Gmyr (27:04)
Yes, we will always accept running.

TJ (27:06)
Yeah. Sick dude. Yeah, that's crazy. So in part of this like giant prism refactor, I've been building a couple Laravel apps because I need to test out different like pieces of functionality. So with the big streaming output refactor, one of the things I'm doing, well, there's several things I'm doing.

⁓ We're gonna like have a new method called as broadcast which is going to broadcast Laravel events instead of like outputting text or anything, so it'll just be like all broadcasted events which Work well for building web socket chats so you could like cue a job That's a prism call and then end that prism call in as broadcast and then on the front end you can be like listening through like Laravel echo

and listen to WebSockets and then build your chat interface that way. And my JavaScript is super weak right now. I'm very rusty. It's been a while since I've done anything of substance. And I've not ever worked with Laravel's broadcasting system too much. So I wanted to build a chat interface to make sure that the solution worked, right? It was like a viable solution to like

cue a job with Prism and then listen to WebSockets. I wanted to build all of that. And I didn't want to build all of that. I wanted Claude to build it for me. Especially because I'm like, I am so rusty in the JavaScript. It's going to take me forever to do it. And so I tried Laravel Boost finally. I've been meaning to try it. I just haven't had an excuse to use it. And it's like,

Chris Gmyr (28:23)
Yeah.

TJ (28:36)
not super useful in package development, especially when we're supporting multiple versions of Laravel. It's kind of tricky. It just doesn't work that way. But using it to build this Laravel app was so sick because I've tried building with Echo before with Claude, and it was not so great. But now with it having access to the docs via MCP,

Gosh, it went really smooth. I was pretty impressed by the whole thing. then letting it like, having the MCP tool in there to get browser logs was great. So as it was building the WebSocket chat, like it could go debug itself looking at browser logs. I've had it do that before through the Playwright MCP, but it was really nice to have it all just like nice and tightly integrated.

with with Laravel. So I was I was really impressed with it. I think Boost is like a massive asset to like working with AI coding.

Chris Gmyr (29:31)
Yeah, that is really cool. I just watched a couple of videos on the level YouTube channel the last couple nights and it's just super impressive like everything that's built into boost and just having access or yeah, having access and like a direct link to active. Up to date docs for the version of level that you're developing on is awesome because like just then like a regular.

Cloud Code session. just generally does sometimes like Google searches or looks at docs, but maybe not the specific page. And I've even tried to point it to a specific page for a doc or framework or package or something like that. And it just doesn't find what I want it to.

TJ (30:15)
Yeah, it starts making up URLs and try to navigate to things that don't exist and yeah.

Chris Gmyr (30:17)
Yeah. Yeah.

Yeah, it's weird. like just having that in Boost and the MCP server and specifically telling the AI to use this and here's what you want. It's just like amazing. So that looks awesome. I wish I could use it in the stuff that we're doing, but unfortunately it's not Laravel at the moment.

TJ (30:40)
Yeah, it's all like...

It was, was all super cohesive. I was really impressed with it. Um, I think I, didn't, I didn't expect it to like not be useful, but like, I was just still like really impressed at how, how smooth it worked, how useful it was, um, made such quick work of like building out this web socket chat. Um, I've got another one I think I'm going to build this weekend using just the server send events. Cause we've got three new methods that I'm introducing for streaming output. There's.

⁓ as broadcast, then there will be as event stream response, which is just a web standard for server-side events using all of our custom Prism events. And then there's as data stream response, which is actually Vercell's protocol, which will allow you to build with their AISDK UI components and interacts with all of that stuff. So you can get real... That was something else I was like,

crazy impressed with. I built a small chat UI using that. Very powerful stuff. was shocked at how quick I was able to get up and building with Vercell's AISDK UI kit, which was something I thought about because Vercell's AISDK has been such a big inspiration for Prism's functionality.

I thought about the potential of introducing something similar, but they have a whole team of people on this that are way smarter than me. So I figured at least introducing a compatibility layer would kind of replace the need for me to make something of our own. yeah, it makes building chat interfaces so trivial. I was blown away.

Chris Gmyr (32:19)
Yeah, that's really awesome. I think it'd be interesting to, I don't know, build out a Laravel Boost MCP for other frameworks. I wonder what that would be involved doing and picking out the framework or maybe some packages. Because I know in Boost, you can not only have the Laravel version, but it will pull in

you know, like Tailwind Core and Tailwind V4, if you're using that, and a few other ones. yeah, Pest. Yep, yep, all those. So I wonder how someone else in a different tech stack would be able to come up with something similar, maybe not like as polished, maybe doesn't need to be like as polished, but just being able to spin up like an MCP on latest, even just like the latest docs.

TJ (32:47)
You know, like Pestox and Livewire and Filament.

Chris Gmyr (33:08)
for the tech stack and packages that you have installed and things like that. I wonder what the process would be for that.

TJ (33:14)
Yeah, so they're working on, I think they're working on polishing up their MCP framework, which is like a framework to like create MCP servers and tools and everything using Laravel. And so that's totally something that like you could introduce is like building, like once they're done with that, like you could build an MCP server using Laravel and then go through the process of like,

ragging the docs basically. So your MCP, like your Laravel app would, like what JS framework are you guys using? Just like give me one of them.

Chris Gmyr (33:49)
We're using just Node, TypeScript, Fastify is like the API framework. And just like a lot of, yeah.

TJ (33:56)
Great. like, Fastify.

Perfect. So like, what you would do is you would chop the Fastify docs up. And like, you could use Prism for this too. Well, you'd have to use Prism for like part of this. So what you would do is you would like chop the Fastify docs up into chunks. And then you would use like Prism to turn them into embeddings and then like store those embeddings in PG Vector. And then when you get like the incoming queries,

you turn those into embeddings. And so you could use Prism for that. Then you query PGVector with those embeddings, and then you get your results back out, which are the relevant chunks of documentation. So you could use Prism and Laravel's MCP server to basically build out an MCP server that could have docs for Fastify in this very similar way that

Boost provides docs for Laravel.

Chris Gmyr (34:50)
Yeah, that's really cool. I'll have look into that.

So I think that'd be pretty sweet, even if I just had it set up locally or something. Loading in the docs or Fastify in a bunch of tools and other packages that we have would be fantastic.

TJ (34:53)
to

Yeah.

like node standard library docs, like for the version of node that you're using, like Fastify docs, like different core libraries. Yeah, for sure.

Chris Gmyr (35:12)
Mm-hmm.

Yep. Yeah, because there's a lot of them in like, you know, best practices for like all these things. So being able to pull in all that stuff and for code base would be, yeah, that'd be amazing.

TJ (35:28)
Yeah, I mean, you could use Laravel 0.2 and turn it into a little CLI. And so that should work. And then the cool thing about it being the CLI is you can add all sorts of other little helper commands. So you could also build a helper command to build out the guidelines for a Cloud Code using like.

whatever your internal standard stuff is to you, because I'm sure you guys have like standard ways of working with Fastify and like doing stuff like that. So you could you could build out an AI guidelines generator sort of similar to what Laravel does using that like CLI. So lots of possibilities.

Chris Gmyr (36:05)
Yeah, that's really cool. I'll have to see how much time I have for that. Might be just a pipe dream, but yeah. I think I'll have to keep an eye on how fast LiraVolk gets the MCP server stuff standardized and ready to go. I can take a look after that, but yeah.

TJ (36:08)
Yeah, right?

Yeah, the MCP

existing frameworks for like node and stuff, the like building MCP servers is like pretty straightforward. built a like Claude and I built a prototype one for Geocodeo stuff, like mostly just wrapping our API using our node library. And we knocked that out in an afternoon. It was like pretty effective. like, if you wanted to start building something similar to boost, like you could start building that in like node in JS like now. And it's like not.

It's painful for me because my JavaScript is very rusty right now. But like, if you're fluent in JavaScript at the moment, it's really not that painful.

Chris Gmyr (36:59)
Yeah, I'll have to check that out then. Because even if I put something together as a starting point for an MCP template or something like that, and then other teams could pull it down and input their specific versions or packages or whatever, and then can run locally on the side of their app locally. don't know. That might be a cool little side project.

to work on, so I'd have to look into that.

TJ (37:29)
Yeah, no, that sounds like a really fun, like, hackable project, for sure.

Chris Gmyr (37:32)
Yeah, totally.

TJ (37:34)
So before we wrap up, you want to rapid fire through some Prism stuff? Yeah, man. So we touched a little bit on it. I'm in the midst of a probably the most ambitious Prism refactor I've gone down yet, mostly because it's grown so much since my last major refactor that there is a lot to touch.

Chris Gmyr (37:39)
Yeah. Yeah, let's hear it.

TJ (38:02)
The big refactor is because...

The current implementation of streaming output is very naive. And I mostly just slapped it together to get something out there. And up until this point, I've not really worked much with streaming output. So I didn't really know what the pain points were. And honestly, I still don't really know where the pain points are. I'm just kind of hoping that this makes things better. And I've been trying to like.

document and share. Like on the Prism repo, there's a discussion where I like kind of proposed sort of an RFC before I started working on it. And then now that I've started working on it more heavily, I've like published like an initial set of future docs for the implementation, or at least like, here's docs for the implementation as it stands right now as I'm like working on it.

Chris Gmyr (38:48)
Mm-hmm.

TJ (38:53)
And the feedback's been pretty positive, so I hope that it's solving problems. But really the solution is like, right now we return, like you say, as stream, and that returns an iterator, like a generator of like these chunks. And like the chunks can have metadata information, text information, tool call information.

But it's all just kind of like this amorphous value object that can have all of these different properties on it. And then we slap on a chunk type enum. But this doesn't really work well for asynchronous workflows. You have to build. If you wanted to support server-sent events, all the consumers would have to build their own server-sent event implementation. And so I figured we could just make life really easy and return some of these

standard things as responses. we have like, as stream will stay the same. But we're introducing instead of these chunks, we're introducing dedicated events for everything. So there's like, there's still basically chunks, but we're calling them events now. So there's like an event for like text start, and then there's like text delta event, which is like all the different chunks of text that come through over text end event, tool call event, tool result event.

Chris Gmyr (39:55)
Mm-hmm.

TJ (40:06)
So we have all these like fine grain events and with the asStream method, it'll be a generator that returns all of those. And so that's like your like raw access to the stream data so you can build whatever you want. Then we have like three new response methods, which we touched on a little bit. There's like asBroadcast, which broadcasts Laravel events for each of these different like model provider events, right? So like

a text delta event inside of the provider will end up firing a text delta broadcast event. And then that gets like broadcasted through pusher or reverb or whatever you're using for web sockets. Like that gets published, like it gets broadcasted on whatever channel you pass in. And so

That's our web socket layer. Then we have as data stream response, which, like I said, was Vercell's data protocol for their UIs. And then we have ⁓ as event stream response, which is a standard service and event response using all of our provider events. So that's basically a one-to-one mapping of our provider events just as a service and event stream.

We're making it super easy to return these different response types. And then you can build kind of whatever you want as far as the front end goes. And I'm just trying to like.

either solve the problems or make the problems solvable. Like I think that's kind of my hope with this is that like I'm offering enough flexibility that whatever pain points you're experiencing, like are a solvable problem, at least in user land. And then I can always circle back after, cause like this is all holding up V1. It's like, once I figure this out, I can tag V1 and then, I can circle back and like try to make life easier for

the pain points that do pop back up with it.

I figured initially that the bulk of this work was going to be in like taking care of these like streaming output types, but come to find out that's like, that was the easiest part. And now I am in the slog of having to like every provider that we support streaming for, I basically have to go rewrite all the stream handlers for with like adding in all the new events, making sure the events are fired in the right order. I'm finding out that like,

events aren't necessarily firing in the right order. So.

And then like the anthropic provider has gotten kind of crazy and gnarly. So like that really needs a refactor. And so I like, now I am deep in the weeds of having to touch every streaming implementation we have for every provider and like more or less rewrite it. And Claude has been helpful, but it's not been doing the best job.

And so I have a feeling that I'm gonna like, as much as I'd like to use Claude for heavy lifting, I think there's gonna be a fair amount of like heavy lifting that I'm gonna have to do. And I have to like, what I may need to do is like,

go rewrite all the tests and then basically tell Claude to go fix, like go, like here's the project file for this like major refactor. Here's all the tests, the tests are correct. Like go refactor the implementation. And like that way I can make sure that at the very least I have like super solid test coverage. And then I can let Claude do the heavy lifting of

reworking the implementations.

Because that's something else I'm finding out is that I'm not super confident in the streaming test suite either. So boy, did I just like uncover.

So much more work than I expected. Like so much more work. but the only way is through. So like that's, that's where I'm at with it is like, just picking away at it. I think, I think once I get the anthropic provider done, what I'm going to do is spin up issues for the rest of the providers.

and call on the community for some help refactoring some of the other providers. like, figure if I create issues for them and have like an example provider that's like already done that like, then maybe it makes it easier for people to be able to hop in and contribute. Like maybe somebody does work with Gemini way more than I do. Like, and they're probably better suited to refactor that provider instead of me.

Chris Gmyr (44:35)
Yeah, yeah, I like that. That makes a lot of sense, especially if you get like the gnarly one. If that's Claude and anthropic setting up the. Almost like pathway forward, you know, setting up the tests as you would and then you know backfill the functionality to to make it fit. And getting that more out in the public and getting some help with it like for the providers that you don't have as much experience with. So I think.

Yeah, that makes a lot of sense.

TJ (45:05)
Yeah, and that's something I just recently did too, as far as open source maintenance goes. I went through every outstanding issue and just about every outstanding PR. And with all the issues, I went and tagged ones that I want help with as the help wanted or help wanted tag or something like that. I went through and tagged all of those as help wanted. I tagged some of the easy ones as good first issues also. And then went to socials and just posted that like, hey,

I went through all the issues. There's a bunch of these that are prime for contributions. So if you want to contribute to open source, here's some ones that are like, there's a couple easy ones sprinkled in here. But I woke up to a really nice message this morning from someone who their first open source contribution ever was to Prism Docs based on me making that post and saying, hey, here's some good first issues. Here's ones I would like some help with.

Chris Gmyr (45:48)
wow.

TJ (45:54)
Yes, someone came in as their first open source contribution and updated the docs, is huge. They're like, it might not be that big of a deal. I'm like, no, it's a huge deal. Not only was this your first open source pull request, which I'm very honored to have in the Prism code base, but you also contributed to the docs, which is something that's very important to me. So like.

Chris Gmyr (46:00)
That's super awesome.

TJ (46:20)
It was just kind of like an extra special exchange. that was, that meant a lot to me, like waking up this morning and be like, yeah, hey, that was my, this, PR you merged was actually my first one. I'm like, that's so, that's so fucking sick. Like I was just, I still am like so tickled about it. So.

Chris Gmyr (46:33)
Yeah.

That's really cool. Yeah, I'm on the repo right now and saw that you put a bunch of tags on here. I wonder if it would help also to tag the individual providers, so like OpenAI, Anthropic, Gemini, et cetera. I know some of them are prefixed in the names, but I think maybe adding labels for the different providers would get people more searchability for things that they can help with.

So give me help wanted for Gemini, because I work with that, for example. So it be a nice little repo upgrade for those things. And maybe discussions too. Just update labels for all the providers, or just have an all provider if it's something more global, or just leave the tag off for something like that. But I think individual providers, especially for help wanted stuff, would make sense.

TJ (47:08)
Yeah.

I can see.

No, I think it's a great idea. That's something I'll maybe go through and do this afternoon is just like, yeah, add some provider tags to things. So it makes it little easier to like discern what providers for what things. And that maybe helps me organize a little bit more too for myself. I'm like in, if I'm in the space of like working on Anthropics API, like maybe I go through and like work on other issues that deal with Anthropic because I have that like built up context, you know? So that, that, that'll even help me a little bit in the long run.

Chris Gmyr (47:54)
Yep, totally. Yeah.

TJ (47:56)
Sick dude,

will you want to wrap on that?

Chris Gmyr (47:59)
Yeah, let's wrap on that. So thank you for listening to the Slightly Caffeinated podcast over a year now. Show notes and all the links and social channels are down below and also available at slightlycaffeinated.fm. Thank you for listening and we'll catch you all next week.

TJ (48:06)
Yeah.

Thank you all.

Creators and Guests

Chris Gmyr
Host
Chris Gmyr
Husband, dad, & grilling aficionado. Loves Laravel & coffee. Staff Engineer @ Rula | TrianglePHP Co-Organizer
TJ Miller
Host
TJ Miller
Dreamer ⋅ ADHD advocate ⋅ Laravel astronaut ⋅ Building Prism ⋅ Principal at Geocodio ⋅ Thoughts are mine!
Seasonal Coffee, Production Readiness, and Prism Updates
Broadcast by