Nitro Coffee, ButcherBox AI, and Zen Browser

TJ Miller (00:00)
Hey, welcome back to the Slightly Caffeinated Podcast. I'm TJ Miller.

Chris Gmyr (00:03)
and I'm Chris Gmyr

TJ Miller (00:05)
Hey man, so what's new in your world?

Chris Gmyr (00:08)
Hey, so yeah, just lots of work stuff going on, lots of project things to look into, doing a lot of kickoff meetings with our integration team and the new service that we're interfacing with. So trying to dig into a little bit more of the technical details with that and try to continue to spec out the project on our side.

Everything is looking pretty good. I'm doing a lot of research on our side to improve some like dev tooling and some like API type work. So looking forward to getting some of that flushed out and put in our template repo and the service that we're going to be building out relatively soon. yeah, lots of exciting stuff that we're diving into. But yeah.

Then just getting ready to be out of town for a little while. So we're going to be heading out town next Thursday for about two and a half weeks going up to New York, visiting family and traveling around there a bit and seeing a bunch of people that we don't see very often. So staying up there for two and a half weeks, maybe we'll extend it for another week, but we'll see how it goes. Once we're actually up there, we might just be itching to come back.

TJ Miller (01:03)
Thanks

Chris Gmyr (01:14)
So yeah, unfortunately not going to be recording for a while. Take a little break hiatus for a little bit of the summer. But yeah, don't unsubscribe. We'll be back in a few weeks. But yeah, that's about it for me. How about you?

TJ Miller (01:21)
summer break.

Yeah, for sure.

Yeah,

cool, man. Yeah, the last couple of weeks, still kind of recovering from life drama, but doing a lot better there in definitely in like shipping mode with Prism right now. So just trying to like close out a ton of PRs and just like chug through some issues leading up to Leracon. But big news, cats out of the bag. I'm speaking at Laravel Live, Denmark.

Chris Gmyr (01:51)
Nice.

TJ Miller (01:51)
in August, so

very excited about that conference. The lineup is looking crazy. So I'm very excited about getting to go out there. First, outside of going to Canada, it's my first real international travel, so very excited about that.

Chris Gmyr (01:55)
Congrats.

Wow.

Nice. Very cool. That's awesome. Congrats.

TJ Miller (02:08)
Yeah, thanks, man. I'm really excited about it. So it's going to be, yeah, it's going to be a fun one. We're probably going to like riff a bit off of like the talk from Laracon and yeah, it'll be a blast. So that's mostly what I've got going on. Yeah, just like shipping with Prism and trying to like stack the kiddo up with things to do for the summer.

Chris Gmyr (02:28)
Yep, totally. We just sent our son up for three week long camps over the summer. doing it like every other week, like after we get back. So just split up the time, you know, a little bit more. So we'll have like a week off to just kind of chill, maybe like go to the pool, you know, with the family and some friends and stuff like that. And then, you know, kind of more at a scheduled pace, go into a camp, coming back like right before dinner and.

TJ Miller (02:34)
Dang.

Chris Gmyr (02:53)
All that, so hopefully have some sort of schedule over the summer and keep them a little bit busier than just hanging out at home, like just running around the house.

TJ Miller (03:03)
Yeah, yeah, yeah. Trying to keep him busy. just some like, we've been doing some bike riding. He's got a baseball, like a three day baseball camp coming up that I know he's super excited about. I think him and my wife are going to try to do like a trip a little later this summer. And then, my sister's, think trying to stack up some plans with him too. So he's, he's hopefully going to have like a, you know, pretty, a chill, but exciting summer still.

Yeah, man. So I want to talk coffee a little bit. So we were talking a little bit before we started recording and Claude had thrown a suggestion for coffee talking about pet peeves. And I don't know, I've got like, my son hit me with it. I was talking to my sister, she hit me with it. So like over the course of the last few days, this like this pet peeve has been brought up multiple times.

There's no X's in espresso. Like, I don't know why it's so hard, but there's no X's in espresso. and I don't know why it bothers me so deeply, but it just does.

Chris Gmyr (03:59)
Yeah, yeah, now that you say it that that's a big one for me too Because some of our family members say it with the X. I'm like there. There's no X. It's S There's multiple S's like it's okay Yeah, it's okay to have one more ass like that's how it's spelled. That's how you say it

TJ Miller (04:10)
There's like a dozen S's in there.

Yeah. Yeah. Stretch it out. It's espresso. Yep. Uh, so funny. I don't know. It just, drives me nuts and it was top of mind. Um, but dude, I had, uh, I went out, um, we had a few things going on. I dropped my wife off at an appointment and my son and I were kicking around in like some old stomping grounds. And I went to one of my old, like favorite coffee shops that I haven't been to in a long time. And, uh, they have like multiple.

multiple nitros. And so I was super excited as we've been like getting into summer. We've been talking a lot about like iced coffees. But man, I am such a sucker for like a really nice nitro. ⁓ Yeah, like I wish I wish I could have a keg of nitro on tap at the house. I actually I don't wish that that'd be dangerous. That'd be so dangerous. Like, that would be trouble. But no, they had they had both a

Chris Gmyr (04:52)
Mm-hmm.

Yeah, nitros are great.

TJ Miller (05:10)
like rotating seasonal. like every few days they're like rotating it out with like a different one of their like seasonal house blends. And then they've got like they're just consistent like regular nitro too. But man, I hit that seasonal and it was so smooth. Like, I don't know, man. I'm such a sucker for a good nitro. And that was, that was the best. It just hit the spot.

There's like another local coffee shop that also has some nitro, but it's not. It's good, but it's not as good. Like this place has just got it's the best. So I'm going to I think I think this weekend I'm going to try to convince my wife to head out that way so I can get another one.

Chris Gmyr (05:47)
There you go, yep. See what rotated into the seasonal. See if it's something different.

TJ Miller (05:52)
Yeah, let's,

yeah, plan a date and just make an excuse to stop by and get another nitro.

Chris Gmyr (05:59)
Yeah, totally. You don't find a good nitro around here. I there's some, but not in the closer, like, typical places that we go. Not that we go out and get coffee that much, but yeah, nitro sounds good right about now.

TJ Miller (06:11)
Yeah, and like, can't, it's like one of the things like I can't do at home, right? Like I don't have the equipment to like do a nitro. So like I can do iced coffee all day long. And like, I definitely prefer our iced coffee over a of other iced coffees, but yeah, nitro just can't, can't do that one on my own.

Chris Gmyr (06:27)
Yeah, think you can. I feel like I've seen Nitro kits that you just put the canister in, and then your coffee goes in. It almost looks like big Yeti or Thermos, and it just, as you pour it out, it gets injected with whatever it is, CO2 or something. ⁓ So it just goes in there, and it comes out as Nitro. So maybe something to look into. I don't have any direct.

TJ Miller (06:46)
Mm-hmm.

Chris Gmyr (06:52)
recommendations for it, but I feel like I've seen like at home like nitro kits for coffee.

TJ Miller (06:57)
I'm sure it exists. Like positive. There's like at home nitro stuff. I just don't know if I'm like willing to make that big of an investment into it. so, but, but on the other hand, this place is like, it's like a almost half hour drive with, with favorable traffic. So it's not like it's super close. and like the other place, like I said, is like maybe a 10 minute drive and it's decent nitro, but it's like,

Chris Gmyr (07:06)
Yeah.

TJ Miller (07:22)
This other stuff was on whole nother level. So we'll see. Yeah. Nitro, pastry, they have something to do. So moving on from coffee talk, man, I kind of wanted to talk browsers a little bit. I switched browsers a little while ago and I think Arc has been...

Chris Gmyr (07:26)
Going on an adventure, going to the farther one to get better nitro.

TJ Miller (07:42)
Like the people behind Arc, like the browser company have been starting to tease Dia, which is their, it's Dia, right? Is there like their new, new browser that they kind of shifted their focus over to? I haven't looked at it at all. I think the basis for it is it's like heavily AI injected, empowered. But I don't know, man, what do you use? And I think I know we were both using Arc for the longest time.

Chris Gmyr (07:49)
Mm-hmm.

TJ Miller (08:08)
But when they kind of moved their focus to Dia, I got a little weird about sticking on Ark. And there were some bugs and weird things too. So I kind of jumped ship. But what are you using these days?

Chris Gmyr (08:21)
So I was previously just using kind of raw Chrome a while ago. And then seeing like you and a bunch of other people like jump on Arc, I'm like, eh, Chrome was fine. Like, I'm just going to wait around. And then ended up just diving into it whenever I got my new personal computer, I don't know, year ago or something like that. And then I've just been like all into Arc, been able to pick up their workflow.

I also use their mobile app for mobile browsing instead of like Chrome or Safari on iOS. And that's been really cool because I can get to all my tabs. can share things back and forth, know, open something on, you know, mobile, and then it can save the tab for when I come back on the desktop. And I think the little bit of AI that they put into it on the mobile app as well.

TJ Miller (08:54)
Mm-hmm.

Chris Gmyr (09:15)
has been pretty decent. So I haven't had any issues with it. But yeah, I know we talked a handful of months ago when they stopped doing active development that they're still doing security releases and putting out the Chrome Engine updates behind the scenes. So I haven't seen any issues with it. I haven't had any problems. But I know the next big thing is Zen. So I looked into that a little bit.

TJ Miller (09:16)
Mm-hmm.

Chris Gmyr (09:40)
And it's like, I don't know. I don't know if it's worth jumping ship for something that looks and functions very similarly when I'm not really having problems, just to change the change. I know privacy is a big thing for people with Google. But I don't know. We have Gmail addresses. We have everything in Google Photos. We have Google Backup. We have Google Fiber here. So it's like,

And like, I don't know. Like, does it really make that much of a difference to switch to a different browser? Maybe, maybe not. So I don't know. I'm just rolling with it right now. And maybe I'm just like a late adopter to things once things settle down. Because like, I don't know. I've gotten used to my workflow with Arc, even though it's like very similar to Zen. But having to export everything, tweak everything again, I don't know.

TJ Miller (10:12)
Yep.

Chris Gmyr (10:31)
bigger lift, at least seemingly so.

TJ Miller (10:33)
Yep. No, I hear that man. I jumped ship over to Zen. man, like a little while ago now. and it was a rough transition at first cause like Zen wasn't super fleshed out at that point in time. So like, was definitely a rough transition. There were like a lot of things that I felt like I was missing from Arc. a lot of like short code, like key, keystroke stuff. but they've put in a

significant amount of development and now it's got, you know, pretty heavily feature parodied where it's got like the different work areas that are like sandboxed. You can like, like set up different sessions and everything. So I've got like a social tab, like a social work area that like is logged into all my social media. And the nice thing about that is like, that's all sandboxed to that work zone. So like, if I go to another work zone,

Chris Gmyr (11:07)
Mm-hmm.

TJ Miller (11:22)
I'm not getting social tracking and all of that stuff happening. So that feels really good for me. And then I've got a work one for Geocodeo, got a Prism one that's just for Prism. And the sessions for those, I've sandboxed for Geocodeo. The Prism one and my personal one are the same sandbox. But I've been really enjoying it.

Chris Gmyr (11:38)
Mm-hmm.

TJ Miller (11:42)
You know, the shift over to Firefox and like the privacy focus has been really nice as well. But there are.

From the development side of things, like being a developer, using developer tools and everything, I still think Chrome's got the better experience. And there's some weird stuff with local SSL certificates that gets really weird in Firefox and is kind of a pain to work around. Once you get it situated, it's not so bad. But getting to that point was a bit of a bear. Because we use.

We use SSL, like self-signed SSL certificates for development work at Geocodeo. And getting that working inside of Firefox is just like kind of a pain. had to like, we were using like self-signed certs and like the only way for me to get it to work with Firefox was to like create a like a new root cert and create a root cert chain and then get that all registered. I don't know. It was.

It was definitely a rough experience. And the thing is, it just worked in Chrome. It just worked. things like that are kind of a little bit funky. But there's also this weird thing with LastPass that keeps making me sign into LastPass constantly, which is, I mean, it's not the worst thing in the world. But I don't know. I've been enjoying it so far.

felt the need to switch in the folks over at Zen have been doing a ton of active development. So there's always new like fixes and features rolling out tons of improvements. So I'm a big fan. Like I'm not going to twist your arm into switching. Like definitely, definitely do like what's working for you. And if it's not broke, don't fix it. For me, there were a few things that were a little funky with my workflow inside of Arc and just like on principle.

You're like, I don't know, I like trying new things. So I like tried Zen out and it stuck.

Chris Gmyr (13:31)
Yeah, I might just tinker with it like on the side and see you know if I do see any differences or maybe like my like personal space you know over there and just see how it goes just try it out and I don't if I make the switch then I'll let you know but I don't know

TJ Miller (13:47)
Yeah, it's very

similar. For me, one of the biggest workflow features from Arc that I loved was split tabs. So being able to split the window and have multiple tabs rendered side by side, that was a big thing for me. And then the sandboxing and tab sandboxing and everything for sessions, that was another big one. ⁓ And so they've got all the features for that too.

Chris Gmyr (14:00)
Yeah, I do like that.

Mm-hmm.

TJ Miller (14:12)
So yeah, definitely worth a shot checking out. But if you're in the market for a new browser, I'm definitely going to recommend Zend browser right now.

Chris Gmyr (14:20)
Yeah, if I was switching from something like raw Chrome or something like that, then yeah, I'd probably jump into Zend right out the pack. But we'll see. We'll see how it goes. I'll keep you updated.

TJ Miller (14:33)
Yeah.

Yeah,

So let's talk some AI stuff, man. think you had drawn a topic on our board for Claude and ButcherBox, and I am very curious.

Chris Gmyr (14:43)
Yeah. So I've been trying to get into the mindset of, I know we talked about like dev productivity and like personal productivity and like connecting all these systems together. And I feel like I have that kind of dialed in, but I'm like, I haven't really made the full jump to AI or thinking about like, how can AI like possibly help me?

fix this issue or time consuming activity or fill in some gaps that I might not be as good at. something that always comes up is we have this ButcherBox subscription service. So it's basically meat delivery service. And they have beef and chicken and pork and seafood and a whole bunch of stuff. We've been with them for years now, probably like four

five years or something like that. It's fantastic. I'll put my referral or link code in the notes. So if anyone is big into grilling or smoking or just want some better organic and grass-fed options, these guys are really great. Also, from the last I knew about it is they're also built on top of Laravel. So that's also a bonus too, because I feel like I've seen their

TJ Miller (15:36)
Yeah.

sick.

Chris Gmyr (15:53)
I like years ago on Lair jobs. So, you know, that is just like another little bonus there. ⁓ Yeah. But anyway, so we get this order from them every it's usually about like every month. It might be like six weeks or something like that. But essentially every month we have a base box that has six different cuts that you can choose.

TJ Miller (16:00)
That's pretty sick.

Chris Gmyr (16:15)
So you can choose anything in their catalog, basically, and fill up your six spots in your of like base box. And over the course of time, they've done these different intro offers or special offers. So we get some free things in our box as well. And then they do email deals or text message deals. So it's like, oh, here's this text for this flash sale for

I don't know, like ribeye steaks for 20 % off. So you got to go in, you add it to your next box, and they do these promotions throughout the whole month. So I'm just adding as many things as possible that we typically eat. But it'll all be different prices. It'll be different bundles. So it'll be either just like a two pack of steak, but this other one will be like a two pack of steak plus

a free like bacon and like all these different combos and packages and pricing differences and things like that. So over the course of this, four to six weeks, I have a box that's like $1,500. Right. If I just like let it order, which we do not. I try and get it down to about $500 because all of our meat comes from here. So like all we're doing at the grocery store is just getting like fresh produce, like staples, things like that.

TJ Miller (17:17)
Yeah.

Sure.

Yeah.

Chris Gmyr (17:30)
So

it cuts down the grocery shopping experience a lot too. So every month before the box charges at this like astronomical price, I have to go in there and pare down everything. So it's like, well, which is the best deal for these steaks versus chicken and like versus the bundles or like what's just like too expensive. Cause they also do these like blast deals. So they'll give you

like a chicken breast blast where it just has like 10 pounds of chicken breasts. Like sometimes like we might need that, but like typically not. But I just add them just in case like we might need those. like, you know, clearing out the things that are just way too expensive. So over the course of like month to month to month, like this is just a drag like, and I have to do it before, you know, it bills because it's just way too much money. So I'm like, OK, how can A.I. Claude help me with this?

TJ Miller (18:10)
Sure.

Chris Gmyr (18:23)
So I jumped into Claude, created a new project for specific to ButcherBox orders and said I extracted the order page in PDF, added it to the new Claude chat. But in the project, I'm just brain dumping all the things that I typically do for an order. So our preference is to have

at least like three orders of like beef and four orders of chicken and like one or two of pork and then like one or two of seafood and I'm trying to keep it under or around like $500 to keep it in budget and all these other preferences right so then I in a chat I upload the new potential order with all the stuff in there and said go through this order and make suggestions on what that

I can easily delete that. They're basically the same items, but one is a lot more expensive than the other. Or if a bundle is included of these other cuts and is a lot cheaper than just doing the one line item of the cut. So it came back. Yeah. Yeah. Yeah. Ddub everything and have preferences of.

TJ Miller (19:35)
Yeah, like D duplicate this order. Yeah.

Chris Gmyr (19:41)
like which should you keep or remove, like a quantity, because sometimes I just add a bunch of quantities, like two or three, because they're a lot cheaper than what some other ones were. So I do all that math for each line item and all that stuff. So I'm like, OK, Claude can more easily do this. So I went back and forth a couple of times, kind of refined the prompt. But it came up with a really good suggestion of which ones to delete.

which ones to think about. And I had to adjust that a little bit because I also didn't put in what we have in our freezer right now. So that's a change that I'm going to make later is based on what we have in our freezer right now also affect the order because maybe we already have enough salmon. So we don't need an order of salmon in the new box. Yep.

TJ Miller (20:26)
Yeah, like, here's our preferred inventory levels of things.

Also factor that into the stuff of like, you know, maybe at the end it goes like, by the way, you're also like, I didn't see any salmon in your order and you're below your preferred inventory count of salmon. Like, maybe consider ordering this stuff too.

Chris Gmyr (20:44)
Yep, yep, totally. So I went through like probably three iterations of it because I did like the main change that it suggested for the most part and then like re-uploaded the new screenshot of the order to the chat and said like I made changes but I didn't make a recommended change of X and Y because of ABC and we finally got down to a reasonable order and was like great. So save all this stuff.

to our base prompt or what can I update our base prompt to save this context for next time? And then I asked it, what could I do to make this process easier the next time through? Because we're going to be doing this every month. And it's like, you should save the extracted order to the project context. So over time, it can see what we've ordered for every month because we're just going to save the.

extracted order of items and the total amount like per month ⁓ in the project context. So it was really cool that we accomplished the goal of trimming down the order to the prices that we wanted and like the general like inventory that we wanted to buy. But also it was kind of like self-improving, self-healing almost to the process and also

TJ Miller (21:40)
Mm-hmm.

Chris Gmyr (22:00)
for usage on the next round. So I thought that was really cool that you could do that. I know, not sure if you mentioned it on here, but I know you've talked about that before, like, Claude, how can I help you better do this job the next time? Or like, what context updates? Yeah, help me help you. Because we're going to be in this together for a long time. So yeah, so that was kind of the whole process. And it went, it took.

TJ Miller (22:12)
Yeah, help me help you.

Chris Gmyr (22:22)
probably just as long to do it with Claude as it would have taken me to do it. But my hope is that the next time it'll be much quicker, and then the third time it'll be even quicker, and then go down to the fifth or sixth order throughout the year. And then it's going to be very quick. And just reiterating on updating feedback and the base context, and then filling in things like grabbing the current.

freezer inventory and things like that so it can help, you know, make those connections and choices a little bit better moving forward. So, I know, I just thought it was a cool little experiment and it actually worked out pretty well.

TJ Miller (22:56)
Dude.

No, man, that's super cool. And that's kind of somewhat of a similar workflow, I thinking, as you were kind of getting into it of providing the before and after of like, as context of like, was an order before we adjusted it, here's the order after we adjusted it. And then providing maybe some context around the decisions that were made. And as you build that up over month over month, it's going to start kind of.

learning what that before and after looks like. Because we're trying to narrow down the parameters in which it like, know, auto, I always talk about LLMs as like auto complete on steroids, right? It's just like probability machines. So we're trying to narrow down the scope of like what it thinks it should respond with. So yeah, giving it that like before and after.

even really just like the after of like, yeah, here's like month over month, here's what these orders continue to look like. But I think also maybe providing like the before and after and then like the reasoning. like almost at the end, come up with like a, like a report of like, here's what the order was before, here's the decisions that were made and like, here was the order after like the final order. And like, yeah, being able to provide kind of that like report for it to inspect month over month, I think is really going to help like guide that.

that response. So I think your approach is pretty spot on, man. I think that's a super awesome use case.

Chris Gmyr (24:20)
Yeah, I thought it was fun. So I was like excited to Share that with you. I like how TJ is gonna love this. This is awesome

TJ Miller (24:23)
Yeah, no, that's super cool. yeah,

no, this is awesome. Like I think one of the things that I've always wanted was like, I hate grocery shopping. I hate coming up with like meals and lists and like meal prepping. And so I've always wanted some sort of like AI system. I mean, it doesn't even have to be AI. Like you could probably build this like reasonably well, but like

Here's what's in my fridge, here's meals that I like, here's grocery stuff, put it all together for me. Give me a shopping list for what I need based on the stuff that I want to do. I don't know. Here's my inventory levels of things. Yeah, spit out a grocery shopping list for me. I don't want to have to think about this stuff. I don't want to have to think about meal prep either.

Chris Gmyr (25:05)
Yeah.

TJ Miller (25:08)
And so that's kind of like one of those things that I've always wanted to see. But I think this is such a great use case for AI. And I love your approach and the iterating and the self-improving prompt stuff of, yeah, how do we make this process easier next time? It's fantastic. And they're getting so much smarter about prompt engineering on their own, right, too, that like,

you know, the more content that they're trained on on prompt engineering, the better they're going to be at it. they're getting to a point where they're pretty good at being able to come up with prompts and improve prompts. So that's sick, man. I love it.

Chris Gmyr (25:44)
Yeah, so I'll keep you posted, you know, in future months as we work through it a little bit more. But I think putting in my own feedback into those orders, I like, here's the reasoning of like why we went this way or like with this past order, I wanted to get like more like leaner like protein options. So like the ground chicken, Turkey, more seafood heavy compared to a lot of the beef and pork, which we've been like heavier in the past, but it kind of

shifts as we like keep things in the freezer versus like eat things down. So it kind of bounces back and forth every few months anyways. So I think that would be like also interesting to track or put in the feedback of these orders. And this is why we made these choices this time. So maybe it could allow like patterns or something like that, or even like seasonality, you know, to it.

TJ Miller (26:35)
Mm for sure. For sure. I think it'll be able to pick up on all that. And I think I think adding the like the decision making process to the context is is key because you're kind of guiding it to start making those decisions more similarly to you in like way like those those like Wayne pros and cons of stuff like. Yeah, yeah, you're you're guiding it to make decisions similar to the way you're you're making decisions, so that adding that like reasoning and like that kind of like report afterwards, I think would be.

pretty awesome. you could do some cool stuff, I'm sure, with Prism and structured outputs on that too, being able to generate that report in a very structured manner, so you're getting a real consistent thing. I mean, you could do that through Cloud Desktop too, just giving it a template, fill out the template this way. That's sick, man. So I think we had another AI topic on here that you added for

Chris Gmyr (27:12)
Hmm.

TJ Miller (27:25)
image tagging and analysis. I'm also fascinated on this one too. Like you're, you're, you've got bangers this week. I'm very excited.

Chris Gmyr (27:31)
Yeah,

finally got some cool topics. ⁓ Anyway, so yeah, so since my son was born, so almost like nine years ago now, before he was born, we said that like, we don't really like the idea of uploading photos to social media, like even though they're like quote deleted, they're not actually deleted, there's privacy things, there's all this crazy stuff. So like we just

TJ Miller (27:34)
Yeah.

Chris Gmyr (27:55)
made the decision of like as much as possible like we are not posting photos to Facebook or Instagram any of the socials you know out there. Over the course of time you know relatives and stuff like that take pictures stuff like that gets up there we just try not to like have them tagged or tag us to minimize the connection but you know things things fall through the cracks. But anyway so I wanted to still share a bunch of pictures and videos and

things like that that were happening with us, because we don't have any family around here. Everyone lives other places, and not everyone also uses social media. So my mom isn't on Facebook or anything like that. it wasn't a fail-proof way of just, just use social media, because not still everyone is going to see it. So before he was born, I started working on this family website. And it was just super basic, but we have the ability to post

TJ Miller (28:38)
Yeah.

Chris Gmyr (28:46)
blogs, photo albums, videos, and then we do daily pictures of both of the kids on there since they've been born. And then each day that you upload and then you can click on it, it gives you a whole view of the pictures from the month before and the month before that and the month before that, of all the way back to when they were born. So as you're clicking on a day, you can just roll through the whatever.

30 to 50 pictures and be like, what happened on this day three years ago? Yeah, ⁓ so it's a lot of fun. All built in, Laravel. If we don't upload the daily pictures for the kids, it sends us a text message through Twilio. Like, hey, you haven't uploaded the picture for a son or a daughter. And just reminds us to do it before they go to bed. But anyways, so it's all separate.

TJ Miller (29:15)
That's cool.

Chris Gmyr (29:36)
plugged into anything public or Google Photos or anything like that. The images are uploaded to Cloudinary, which is a really good service, but it's a private instance and everything is... The IDs and stuff like that aren't very easy to guess or...

get to and Cloudinary has its own perks of being able to size the photos and optimize things for desktop versus mobile and things like that. And just not a free plan, but there's some options in there that makes it really easy to use. So been using that since day one and they have like a couple of kind of like tagging options, like you can add your own tags in there. They have plugins for different like analysis.

But I'm like, I really want better search capabilities in this website where you can say, put in my son's name and put in, I don't know, pool or park or camping or something like that. And it brings up all the things that are tagged as him and then in whatever this context is. like camping context or with scouts or.

TJ Miller (30:29)
Mm-hmm.

Chris Gmyr (30:38)
even like a date, like what happened on this date. So instead of having to page through all these pages or try and guess the page, I don't really have any search capabilities built in there now. But it would be cool to be like, what did we upload or what happened or find this photo on this date or in this specific context. So my question is, is there anything

either in Claw directly that I can do via API or to essentially tag this and start to build context on people, places, and things, dates, things like that? Or is this totally out of Claw's wheelhouse and I would need a different service to do AI tagging, analysis, things like that? Because Google Photos does a really good job with this.

search engine is great for these things. these two entities are disconnected from that. So I'd have to upload the picture from the website to Google Photos, for example, if I can even do that, and then get back the data, and then store that and do whatever I need to do on the website side instead of like, just want to build a contact somewhere, send an image, get data back, and then store the data that I can search on.

TJ Miller (31:33)
Yeah.

Chris Gmyr (31:52)
So I didn't know what our capabilities were with that. I've looked into some plugins that kind of do that within Cloudinary. So they have some tagging ability with that. It's all paid for options. I've looked at, I think there's an open source project called Photo Prism. It's basically a self-hosted ML photo gallery. So you can put like,

albums and images and things like that and I'll do some like internal like ML stuff to it you can add your own tags, but it's a little wonky for my use cases because I'd still have to like upload all the photos in there and I don't know it's just not ideal. So I don't know again looking for any sort of like ideas or things that I could look into for that use case.

TJ Miller (32:39)
Yeah, yeah. mean, the it's sort of like the classic build versus buy problem, right? Like there's going to be solutions out there. Like you're to be like hard pressed to build something that's going to be as good as some of these other things that are like exist out there. I mean, this is like a really good space for ML, but you're also like training at that point. You have to do like some initial training for that model then to be able to like pick up and be like, oh, OK, this is a picture of Chris.

or this is a picture of like son, daughter, like, you know, or this is like scouts. Like you're to have to like train all of that stuff in there. So you're going to have to like go through and do a bunch of manual tagging first. And then it'll like learn from that manual tagging how to do everything. At least like I'm not super strong in machine learning. So like that's my like understanding of it. Cause I did enough with like Pokemon card stuff that like I have a

Chris Gmyr (33:33)
in

TJ Miller (33:35)
general idea of it. So like you'd have to do a bunch of manual tagging first and then like train it and then your model will like work and then you're going to want to like continue training it to like continue to keep refining things. However, I think this is like a really interesting place to get into Prism and like we have support for sending media to any provider that supports it that we support. So like OpenAI, Claude,

all that they support sending images. we support sending images. So I think you could probably come up with some creative prompting around things that you feel are important for it to tag. I think that's going to be pretty key, is that prompt and calling out, these are the types of things that I want tagged. Here's a big list of examples, things like scouts or pool or stuff that you're going to be wanting to search on. And you might even be able to use that.

prompt. Like, yeah, like the whole point is like we're going to be doing like sort of tag searching stuff. You know, that's that's the kind of stuff you're going to want to call out and then using structured outputs to like define what a tag is getting like a list of tags and everything from the image. So like you'd upload the image and be like, yeah, all right, here's the prompt for like defining what the tags are. And I'm expecting this structured output back.

of this is an array of tags, and this is what a tag consists of, and then just letting it tag all that stuff, and then associating those tags to that image. And you could do something probably similar with text content, too. So you can send text content or images with a similar prompt and get similar assortment of tags back to be able to search through those sort of tag stuff.

I don't know, that's like my initial thought on it, but I definitely think it's something that's buildable.

Chris Gmyr (35:21)
Yeah, I'll have look into that a little bit more, because yeah, it's definitely more of like a ML type thing. But yeah, if we can get, I don't know, even 80 % there with Claude in Prism and kind of doing all that work kind of behind the scenes would be ideal.

TJ Miller (35:33)
Yeah.

Yeah. Yeah. I think it's something that's buildable. You'd have to figure out then like how searching works for tags. Are you like going to try like auto completing tags? Are you going to let it do like, cause you could go into using Claude to do some of the search functionality too of like, all right, here's the plain text search. Like turn this into tags. Right. And you can use like a vector database to like store tags and information and then.

you know, have have an LLM like go out and like build a query for here's a plain text search. Here's like our database of tags, like figure out what tags are relevant to this search and then plug those tags into the query. So I think that's that's kind of how you could approach the search side of things too. Because eventually what you're going to try to want to do is like match that query, like that search query up with the tags.

Chris Gmyr (36:23)
Mm.

Yeah.

TJ Miller (36:36)
And

I think an LLM could be pretty good at doing that. And again, that could be an ML thing too that you train up. I think it's interesting to think about the solution without having to train an ML model, because that's definitely a work to do. Whereas I think you could do this. I think you do a lot of this with LLMs.

Chris Gmyr (36:53)
Yeah, and I think whatever solution that like I implement like moving forward, it's going to be a lot easier. It's just all the backfilling of stuff that we already have in there because we have like thousands of photos that need to be backfilled with searchable information and tagging and and things like that. So I'm not like as worried about whatever it could be like in the future, because.

Maybe it would be just to tags based on contacts. It doesn't even have to know about the person, because I can do the person as I'm uploading it to the site. ⁓ Or whichever album or bucket that we're putting the individual media asset in would maybe even auto tag that. yeah, there's a couple different facets to it of how do we backfill thousands of images as well.

TJ Miller (37:27)
Mm-hmm.

Chris Gmyr (37:41)
And how do we get through that in a timely and hopefully as cheap as possible manner to do that, which might be a bigger ask than is actually possible.

TJ Miller (37:41)
Yeah.

Yeah, yeah, I mean, and there's like...

I'm sure there's like ML models and systems out there for doing like different, you know, entity recognition and, you know, things that make it easy to train. Cause this is like a pretty, a pretty common problem to solve in like the ML space. So there, there, there might be things out there that make that whole like training experience a lot easier. and you might even be able to, you know, have Claude like

come up with a list of tags for all these existing images. And that kind of helps inform the ML models on the training side of things, too. So you can kind of use the LLM to help prep the data for the ML training. And that's an approach I you could take, too, that would make the ML training a little bit easier.

Chris Gmyr (38:31)
and

Yeah, totally. Yeah, so I'll have to look into it a little bit more. But maybe, I don't know, that self-hosted PhotoPrism app that I mentioned. I'll make sure I put a link into it, to the show notes. Might be a good thing. And it has a one button DigitalOcean install, which is pretty nice.

TJ Miller (38:53)
Mm. Yeah,

I would look into that, man, because this seems like there's probably things out there to solve this without you having to build it.

Chris Gmyr (39:02)
Yeah, ideally I wouldn't have to build the whole thing. It's just the integration points and inputs and outputs that I would have to manage. So yeah, that would be ideal. And if it wasn't super expensive either, because like it's just a personal family website, so it's not making any money. Like, you know, only our family and friends, you know, use it and it's super basic. So I don't want to break the bank with that either, but it would be cool to tinker with ⁓ something like that, too.

TJ Miller (39:07)
Mm-hmm. Yeah.

Yeah, right.

for sure. Yeah,

especially if you wanted like an excuse to learn some of this stuff, like this ML stuff. I think this is like a perfect use case to like fuel some learning. Yeah, man. So before we wrap up, I figure I could like rip through a few Prism updates. ⁓ So we've been, I've been just in like big time shipping mode. So we have been like jamming through a bunch of fixes. There's been a lot of contributions.

Chris Gmyr (39:39)
Yeah, sounds great. Let's do it.

TJ Miller (39:49)
You know, one of the things that I did somewhat recently was spin up a like a chat demo app. And that's kind of been fueling a bunch of inspiration for like improvements around people building chat experiences. So I've been starting to sneak in a lot of things in the streaming side of things to make building like chat user interfaces a little bit easier. So introducing like different chunks for so as you go through the stream.

we use generator, like PHP generators. And we yield out these chunk objects. And so there's chunks with different types. There's text type. There's a meta type, where we yield out meta information about the request. And now I just released tool chunks. So we get a chunk for tool calls and the chunk for tool results. So it makes it really easy to render those out separately from the text chat and everything.

Chris Gmyr (40:16)
Mm-hmm.

TJ Miller (40:39)
There's been some like doc updates and like this morning I just shipped a big refactor that was contributed moving from OpenAI's chat completions endpoint over to the responses API. So far that contribution was only for text completion so I still have to implement it for streaming but that brings like a whole set of affordances around new functionality and that's I think the API that they're trying to move forward.

with. that was a, definitely like a really big refactor that I was kind of scared of approaching on my own. So I was super glad to see that someone had a contribution for that. ⁓ yeah. And like following up on the, from our last episode, talking about the internal HTTP client, that's, that's turned into a

Chris Gmyr (41:16)
Nice, that's awesome.

TJ Miller (41:26)
massive PR. I think it's like a 2600 line edition with like 600 line deletion. it's been, it touched 112 files. Like it's a doozy, man. So, cause part of that, have to go through and like update everywhere we make HTTP requests with the new client. I've got the new client in there. And then in order to really feel

Chris Gmyr (41:32)
wow.

That's a good one.

TJ Miller (41:56)
good about that integration. blew away all of the fixtures. like

If you've ever worked with PHP VCR, I kind of built something similar to that, where we make the request to the large language model, and then we store the response as a fixture. And then in that test moving forward, we just load up that fixture and make the assertions against the test. And so the nice thing is that we're actually testing against real responses from these APIs. And so at any point in time, we can go and delete these fixtures, and they'll re-record as the test.

as it goes through each test. So that way we have the ability to re-record them and then replay them without having to make actual API requests all the time. So I blew away all the anthropic fixtures and re-recorded all of them. Luckily, it didn't introduce any new bugs. Really, it was just going around updating tests that were testing against fixture data, because now the responses are different.

So I made the tests a little bit more generic so they're not necessarily testing content that's coming from the fixture, but more about the shape and making sure that strings aren't empty and that there's actually content being fulfilled. Just as a sanity check to make sure I didn't break functionality, at least for Anthropic. And that gave me a lot of confidence moving forward for a lot of other things.

But I think I'm going to be rolling forward with this change probably this weekend. I kind of like left it open for some feedback, I had Claude, like basically the way that this worked out is I had Claude look at and research Laravel's HTTP client and like its API and the kind of the way it handles things and then implement a similar clone to that HTTP client.

and tried to have it match the interface as much as possible so that I'm changing as little code as possible to make this work. mostly, there were a couple methods that got renamed that I went around and had to change. But for the most part, most of this PR was going around and just updating namespaces in a ton of classes, moving from illuminates HTTP client to our HTTP client.

So that made the migration so much easier. Let's just try to match up this API as close as possible so that it does just become namespace changes. One downside is if you're using... Because we were using Laravel's HTTP client, you could use HTTP client affordances in your tests instead of using...

like Prism's test fixtures. I know at least one integration that was doing that. So that's going to kind of be a breaking change for them. But as long as you were using Prism's affordances for everything, you shouldn't notice anything change behind the scenes or have to make any changes for this. So that was pretty big of like, I'm going to end up in the release notes being like, hey, I hope this doesn't introduce any breaking changes. like,

Chris Gmyr (44:42)
Yeah, nice.

TJ Miller (44:51)
It definitely could, but for the most part, it should just be drop in, plug and play. And now that we're using our own HTTP client, I think it's going to be easier to introduce consistent telemetry for everything, because I can add those telemetry calls directly to our client. so that'll automatically happen without having to go implement something like wrapping every HTTP request for every provider.

I may still have to do that, we'll see. feeling pretty good about it, but it's a massive change. I'm definitely a little scared to merge it just for regression purposes, but there's a reason why I haven't gone 1.0 yet on the package. And this is one of those reasons why I haven't. But there's a big push for me right now of trying to round out features so that we can be 1.0 by the time.

by the time LaraCon happens. So yeah, big push to try to round out anything that's going to alter the API or introduce significant regression issues. And this could, but I'm hoping it doesn't. Tests are passing. I feel pretty confident about it. Another large contributor is feeling pretty confident about it now that we reran all the anthropic fixtures.

And then ultimately, as a reminder, this is resolving an issue many people have had with streaming responses. There's a couple of different issues that have cropped up. One of them is that the stream of data is getting consumed before we iterate through the chunks. So like I said, we yield these chunks of content when we do streaming responses. So what's happening with the layer of LHTP client

is it emits events. so there's for sure in Laravel Telescope, there is an event, Telescope listens to this client event from the HTTP client, and then it consumes the stream to add it to Telescope's debugging. Well, once that stream is consumed, I don't have any stream to iterate over anymore in the chunks. So you're getting the logging, but now you don't have any content coming out the end of your iterator.

So that was something that we discovered through an open issue and just discussions on the issue is like telescopes causing that. Pulse may be doing something similar, or you could be doing something similar with pulse. also, intermixed with this issue has also been some exceptions that are cropping up, saying that when you're using Laravel's stream functionality to iterate over these chunks and yield all that stuff out,

that there is like this exception for like can't modify header information after it's already been sent. And it turns out this was a, I think a regression in Symfony's HTTP foundation. And if you pin it to a specific version, like a newer version, like after this like regression thing had been fixed, then that exception goes away. But there's been a lot of people that have been running into that. And so,

Chris Gmyr (47:41)
Mm.

TJ Miller (47:47)
I'm just super thankful for a lot of contributor discussion going on in an issue over on Prism to get to the bottom of this because I couldn't recreate any of this. I still can't. I still can't recreate this stream consumption issue outside of telescope. The Symphony Foundation version pinning, I couldn't recreate that.

So I was just kind of like shooting in the dark and I'm like, well, look, if I implement our own client, then this all goes away. mean, like this all goes away and I now have the affordance to do whatever I need to do to like fix the stream if it does have issues in the future. So, that was kind of like the root cause for doing all of this. So this is kind of a, like, a hail Mary on trying to resolve any potential issues with.

with streaming outputs because that's been not something I use very much, but I know a lot of people have been really hungry for. So that's actually been like something interesting about working on open source and Prism is like there's functionality in Prism that I provide that other people use that I don't use at all. And so it gets really difficult, like trying to figure out these issues or like spot this stuff when it's like I don't.

I don't use this functionality, which was kind of the catalyst for spinning up this like example chat app. Now I've got a playground to play in. Now I've got like a reason to go and like do improvements and find like better, smoother ways of doing things. That's just been like an interesting thing that I've been learning and wrestling with, like maintaining open source is like, yeah, people are using stuff that I don't use. So.

difficult, especially like some providers. Like don't have API keys for all providers, so if there's like a provider-specific issue, that can be kind of difficult trying to either like, I need to go sign up for this provider and figure it out, or I need to find somebody who, you know, does use this provider and get them to, you know, try to help me out a little bit. But yeah.

Chris Gmyr (49:43)
Yeah,

it is challenging for sure. Yeah. Yeah, it's great that the community is building around it so much and just adding back to not only the package, but just the knowledge and the usage of it too.

TJ Miller (49:46)
Yeah, there's been like a lot of contributions lately and so I've been really happy with that.

Yeah, let's see. I'm a little curious.

We are, I forgot the reorg. like, packages stats are weird because I reorg'd from Echo Labs to Prism PHP and like the installs didn't follow over. But what's crazy is after the reorg, it's got 85,000, almost 86,000 installs, which is wild. And I think if I go back and check the Echo Labs one,

Chris Gmyr (50:15)
⁓ yeah. That's right.

TJ Miller (50:28)
that's tracking at like 109,000. like.

A lot of installs, man, which is wild to me. Absolutely wild.

Chris Gmyr (50:36)
That's awesome.

TJ Miller (50:38)
Well, cool, man. On that note, you want to wrap up?

Chris Gmyr (50:40)
Yeah, just wanted to mention one quick thing that we were talking about off the show the other day is Raycast did a new release of Bring Your Own Key for AI. Awesome. So from our quick recap of our Raycast discussion, Raycast has an AI option, but you need to use Pro. It uses its own kind of

TJ Miller (50:47)
Yeah!

I saw that. Yes.

Chris Gmyr (51:02)
layer on top of all these different models, but it basically opens up all models to you via Raycast AI, which you have to pay for. So now they introduced a bring your own key. So like for us, we use Claude and Anthropic a lot. So you can pop your own key in there, and then it will open up all of the respective models for you. So once I put in the Claude AI, it opened up all the different models. You can use all the built-in Raycast AI

prompts, plugins, extensions, things like that, and doesn't force you to upgrade to a Pro plan or with their 50 message free limit. It totally gets rid of all that. So huge update. Installed it right away, got it set up, and been playing with it a little bit. And it's been so much nicer than bouncing back and forth. So still have to reel in.

the workflow a little bit, see what, you know, if Oregon says the recast AI plugin option gets and, you know, just tinker with it a little bit more, but it's huge that we're able to use our own keys now. So that's been awesome.

TJ Miller (52:08)
Yeah, that's something I want to dive into and play with a little bit more, is what affordances like Raycast has for AI because I don't use Pro, so I don't even know what it can do with AI. I've always ignored it because I didn't have access to it. Now that I've got access to it, I want to start playing around with it a little bit more. So yeah, big update, man. I'm glad you snuck that one in.

Chris Gmyr (52:33)
Yeah, no problem. So yeah, now we can wrap up. I know this has been a long one, but it's been a good one.

TJ Miller (52:38)
Yeah, it's been

a good one, man. And then just as a reminder, we're going to be out for the next couple of weeks, but we will be back. So thank you everyone for listening to the Slightly Caffeinated podcast. Show notes, including all the links of things we've talked about and social channels are down below, as well as available at slightlycaffeinated.fm. Thank you all so much for listening. We will catch you in a couple of weeks.

Chris Gmyr (53:00)
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!
Nitro Coffee, ButcherBox AI, and Zen Browser
Broadcast by