WEBVTT
00:00:00.000 -->
00:00:05.020Hello and welcome to Python Bytes, where we deliver Python news and headlines directly to your earbuds.
00:00:05.380 -->
00:00:11.260This is episode 474, recorded March 23rd, 2026. I'm Michael Kennedy.
00:00:11.560 -->
00:00:12.440And I'm Brian Okken.
00:00:12.700 -->
00:00:20.060This episode is brought to you by us, all the wide array of things that we're doing, courses, books, and so on.
00:00:20.140 -->
00:00:23.320Check them out. We have a lot of stuff on testing, a lot of stuff on Python.
00:00:23.680 -->
00:00:25.900Can you imagine, Brian? That's what we're working on.
00:00:26.020 -->
00:00:28.760I'm actually working on a brand new course. I'm super excited about it.
00:00:28.760 -->
00:00:31.580It's going to be a little bit different than the ones I've done before.
00:00:31.760 -->
00:00:34.640So it's going to be fun. Look for that in like two weeks.
00:00:34.980 -->
00:00:46.740Now, also look for, if you're wise, if you've done the right thing, look for a very cool email in your inbox after the show that talks about what we covered.
00:00:47.100 -->
00:00:49.240Extra info to make it more useful.
00:00:49.880 -->
00:00:53.280Background info if you don't know something about a topic we talked about and so on.
00:00:53.540 -->
00:00:56.560So that is subscribe to the newsletter, pythonbytes.fm.
00:00:56.560 -->
00:01:00.220Click newsletter. Put in your info and then you will be subscribed to the newsletter.
00:01:00.560 -->
00:01:05.080And we're gentle with it. We don't give it away to third parties or anything terrible like that.
00:01:05.160 -->
00:01:08.620We just send you stuff about the show and other things going on with us.
00:01:09.060 -->
00:01:13.080Wait, if it's them and me and you, is that three parties?
00:01:13.080 -->
00:01:15.920No, we're both in the same party.
00:01:16.120 -->
00:01:16.940Yeah, we're in the same party.
00:01:17.640 -->
00:01:20.540It's a star party. I would say it's a star party. Don't you think?
00:01:20.900 -->
00:01:26.040Yeah. So I want to kick this off with a little talk about Starlet.
00:01:26.040 -->
00:01:32.200Starlette is like 12,000 stars.
00:01:32.660 -->
00:01:38.240But also it is, if you're not, if you don't remember, you've heard this before, but you can't remember.
00:01:38.560 -->
00:01:41.200It's because this is what FastAPI is built on top of.
00:01:41.420 -->
00:01:44.540But the exciting news is that Starlette is 1.0.
00:01:44.800 -->
00:01:46.180It's no longer zero ver.
00:01:46.320 -->
00:01:47.820So congratulations, Starlet.
00:01:47.820 -->
00:01:50.480I was looking at the release notes.
00:01:50.800 -->
00:02:00.420The main thing is not necessarily, actually, there's a lot in the, there's not a lot in the actual 1.0.0, but the release candidate has a lot of information.
00:02:00.920 -->
00:02:09.680And as a summary, there is a, there's a blog post, a blog post that talks about really everything that's in here.
00:02:09.680 -->
00:02:20.240And mostly don't really, if you've been keeping up with Starlette releases, there's probably okay, but you should test anyway.
00:02:20.540 -->
00:02:23.400However, it's mostly a stability and versioning milestone.
00:02:24.420 -->
00:02:32.860We are told the changes were limited to removing old deprecated code that had been on the way out for years, along with a few bug fixes.
00:02:33.520 -->
00:02:36.260But, so it's not, not intent, not necessary.
00:02:36.780 -->
00:02:38.640The intent isn't a interface break.
00:02:38.640 -->
00:02:43.560However, if you were relying on deprecated features, you, you, you might break you.
00:02:43.680 -->
00:02:44.820So definitely test.
00:02:44.820 -->
00:02:52.600The, one of the things I, a couple of things I wanted to bring up with this though, is, is, is, it's pretty cool.
00:02:52.680 -->
00:02:54.260So if we, you know, Starlet's awesome.
00:02:54.260 -->
00:02:59.800And if you're unfamiliar with what it is, you can do, it is, it's a, like a whiskey.
00:02:59.800 -->
00:03:01.840It's the little ASCII framework.
00:03:01.840 -->
00:03:03.840So it's like whiskey, but asynchronous.
00:03:04.960 -->
00:03:06.340And it's awesome.
00:03:06.540 -->
00:03:09.000But there's a, there's been some cool changes.
00:03:09.000 -->
00:03:14.520One of the things I like at the, before we get off the release notes is at the end, what's next.
00:03:14.520 -->
00:03:21.180It says, oh, and Sebastian, Starlette is now 1.0.
00:03:21.300 -->
00:03:23.400So now FastAPI 1.0.
00:03:23.640 -->
00:03:25.940So FastAPI is still 0ver as well.
00:03:26.300 -->
00:03:29.260And, which also we've razzed him before also.
00:03:29.660 -->
00:03:33.920I think it's high time that we get a 1.0 release of FastAPI maybe.
00:03:33.920 -->
00:03:40.220I did want to bring up, I actually learned about this by looking at Simon Willison's blog.
00:03:41.080 -->
00:03:45.820And he is, he noted that also that Starlette 1.0 is out.
00:03:46.840 -->
00:03:53.920And one of the, and his, his article is really about experimenting with Claude's skills because this is a new release.
00:03:53.920 -->
00:04:00.140And that's one of the ideas is the model that Claude was built on probably doesn't have it, right?
00:04:00.140 -->
00:04:01.300Because it's a new release.
00:04:01.700 -->
00:04:03.800So how, how to deal with that.
00:04:03.920 -->
00:04:05.960So I'm not going to get into that article too much.
00:04:06.040 -->
00:04:17.340What I wanted to look at was this example, which I thought was cool because one of the, one of the, it's not really a chain recent, super recent change, but one of the newer
00:04:17.340 -->
00:04:21.940ways to do async context, there's an async context manager.
00:04:21.940 -->
00:04:29.020So if you want to handle startup code and teardown code, there used to be on startup and on shutdown parameters.
00:04:29.380 -->
00:04:42.580But now one of the, one of the better ways to do it is to use this lifespan model, which is an, is, it's kind of a generator and you can say you've got startup code and then tear down code after a yield.
00:04:42.580 -->
00:04:52.480And I just thought that was, was cool because it's, it very reminiscent of, high test fixtures that do the setup and tear down after a yield.
00:04:52.720 -->
00:04:55.740So interesting, interesting that that model gets around.
00:04:56.080 -->
00:04:58.880So, but yeah, the yield is, is quite interesting.
00:04:59.200 -->
00:05:01.820It's a bit mind bending, but it works well.
00:05:01.980 -->
00:05:02.500This is awesome.
00:05:02.700 -->
00:05:10.140You know, Starlet's one of the fastest web frameworks out there for Python and it definitely is battle tested being a foundation of FastAPI.
00:05:10.140 -->
00:05:11.720So good, good deal.
00:05:12.080 -->
00:05:13.580Sebastian, has it already shipped?
00:05:13.740 -->
00:05:14.480Where is 1.0?
00:05:14.520 -->
00:05:14.980What's going on?
00:05:15.500 -->
00:05:15.700Yeah.
00:05:16.400 -->
00:05:17.020That's cool.
00:05:17.300 -->
00:05:19.140very nice one.
00:05:19.320 -->
00:05:28.200I want to switch things over and talk about the news du jour astral to join OpenAI.
00:05:28.560 -->
00:05:31.180I don't know if you all have heard this, but big news.
00:05:31.360 -->
00:05:36.440It's certainly something that has set the internet, the Python internet on fire.
00:05:36.560 -->
00:05:38.940First of all, I would like to take a moment.
00:05:38.940 -->
00:05:41.840And, and well, first of all, thank you, John Hagen for sending this in.
00:05:41.840 -->
00:05:46.540It was news to me when he sent it in about 10 minutes later, everything exploded.
00:05:46.880 -->
00:05:50.820And, obviously it's, it's come to us from many directions, but thanks, John.
00:05:50.960 -->
00:05:54.980And I want to take a minute and say, congratulations, Charlie.
00:05:55.500 -->
00:05:56.800Congratulations, astral team.
00:05:56.920 -->
00:06:00.760They, they really stepped up and built something incredible for Python tooling.
00:06:00.760 -->
00:06:04.160And they were working for different ways to make this a business.
00:06:04.300 -->
00:06:09.620This is certainly one of the ways to make a successful business is just get lots of that sweet, sweet AI money.
00:06:10.040 -->
00:06:17.480Now with that out of the way, like, what does this mean for the people left without sweet, sweet AI money pools of AI money to swimming?
00:06:17.480 -->
00:06:20.020So there's, there's, we don't know.
00:06:20.080 -->
00:06:22.860There's a couple of interesting, a couple of interesting things.
00:06:22.940 -->
00:06:26.220I'm going to link to the blog posts from Charlie.
00:06:26.540 -->
00:06:31.340I think there's basically, it says the team is moving to OpenAI.
00:06:31.540 -->
00:06:33.300The projects are moving to OpenAI.
00:06:33.520 -->
00:06:37.500So why let's start with why, why does OpenAI want them?
00:06:37.580 -->
00:06:39.560I don't know exactly.
00:06:39.560 -->
00:06:49.480I think nobody has said so obviously rough and uv are super relevant for making agentic coding go faster.
00:06:49.480 -->
00:06:52.400And to be clear, they're joining the codex team.
00:06:52.400 -->
00:06:55.560So the agentic coding tools team of OpenAI, right?
00:06:55.560 -->
00:07:02.940So rough and uv are there as really awesome tools for codex to install things, to validate.
00:07:03.140 -->
00:07:06.280I think actually maybe the most important could be ty.
00:07:06.280 -->
00:07:11.460So ty, we've talked about ty before, which is their language server plus type checker.
00:07:11.520 -->
00:07:16.740And being a language server, you could point it at an entire project and say, I want to understand this.
00:07:16.740 -->
00:07:27.120Like one of the things that drives me crazy, I love Claude Code, but one of the things that drives me crazy is it runs in sort of this non IDE, non editor way.
00:07:27.280 -->
00:07:31.380And it does not understand the code base really as a whole.
00:07:31.500 -->
00:07:35.860It doesn't have a mechanism for saying like, tell me, just, just tell me about where is this function used?
00:07:35.860 -->
00:07:38.640It's just like grepping and searching constantly.
00:07:38.800 -->
00:07:40.120Like, why do you have to grep?
00:07:40.200 -->
00:07:44.140Can't you just use an abstract to text tree and just know the answer instantly?
00:07:44.180 -->
00:07:49.860So if codex deeply took ty in, it could know the answer instantly.
00:07:50.220 -->
00:07:50.400Right.
00:07:50.480 -->
00:07:51.020You know what I mean?
00:07:51.420 -->
00:07:53.340In like, I truly understand the project.
00:07:53.500 -->
00:07:58.260It's not a file of loose text files that I'm surprisingly good at just navigating them in that way.
00:07:58.500 -->
00:07:59.600This is an interesting take.
00:07:59.600 -->
00:08:10.360Cause I was thinking recently using cursor that one of the issues with cursor, I love cursor also, but one of the issues is they can't use Microsoft's language server.
00:08:10.360 -->
00:08:18.420And, and you feel that because the Microsoft's language server is, is, is tighter than the one that cursor uses.
00:08:18.640 -->
00:08:19.280Yeah, exactly.
00:08:19.400 -->
00:08:22.520It got kicked back a few years and work away back.
00:08:23.000 -->
00:08:23.440And tie it.
00:08:23.620 -->
00:08:28.420And ty has the potential to, to be as good or better than the Microsoft one.
00:08:28.420 -->
00:08:29.340So interesting.
00:08:29.340 -->
00:08:29.900I think it's better.
00:08:30.040 -->
00:08:30.140Yeah.
00:08:30.160 -->
00:08:30.660I think it's better.
00:08:30.760 -->
00:08:33.820I would say Pyrefly and ty are, are sort of cutting edge right now.
00:08:33.860 -->
00:08:38.420And certainly I'm, I'm using ty and, and my VS Code like things.
00:08:38.660 -->
00:08:38.920Okay.
00:08:39.120 -->
00:08:52.340So those are all good reasons why Astral might join open A, why the codex team might want Astral except Brian, I don't know if you've gone and looked at those projects, but the source code has been leaked on the internet all over the place.
00:08:52.340 -->
00:08:54.320Like they're just open source.
00:08:54.400 -->
00:08:55.180They're on GitHub.
00:08:55.180 -->
00:08:59.600So there's nothing preventing codex from just going, we're going all in on ty.
00:08:59.840 -->
00:09:01.840We're going to contribute some stuff back to ty.
00:09:02.300 -->
00:09:08.020We're going to create a fork and just keep that hanging around just in case and really make that our foundation.
00:09:08.280 -->
00:09:11.580And they could have done that with no work, with no people, right?
00:09:11.680 -->
00:09:14.320For no money, no acquisitions, no legal work.
00:09:14.560 -->
00:09:18.000So the question is what else is going on here, right?
00:09:18.340 -->
00:09:21.380Well, you got a handful of awesome engineers you just collected.
00:09:22.040 -->
00:09:22.520Exactly.
00:09:22.520 -->
00:09:27.800So is this an acquiring for technology or is this acquiring for AccuHire?
00:09:28.680 -->
00:09:36.320And is it like, I would like to have the Astral team actually doing that work to implement ty into codex or whatever.
00:09:36.680 -->
00:09:37.940This is my speculation, right?
00:09:37.940 -->
00:09:39.460Or whatever it is that they're doing there, right?
00:09:39.680 -->
00:09:41.900So I don't exactly know where it's going to go.
00:09:42.000 -->
00:09:46.060I do think that this probably means the death of pyx.
00:09:46.060 -->
00:09:50.440So pyx, I had Charlie on the show and...
00:09:50.440 -->
00:09:51.860I kind of forgot about it, actually.
00:09:52.000 -->
00:09:52.140Yeah.
00:09:52.640 -->
00:09:59.240PYX, it's the safe enterprise packaging solution that front ends PyPI.
00:09:59.580 -->
00:10:04.580It's not a separate package warehouse or place, right?
00:10:04.800 -->
00:10:07.640It's a front end to PyPI, right?
00:10:07.640 -->
00:10:12.960So if you upload to PyPI, it shows up here in this thing, but with lots more management and you can put your private packages, right?
00:10:12.980 -->
00:10:13.620That kind of thing.
00:10:13.620 -->
00:10:20.440That was going to be the way that Astral was looking to make money until pools of AI money showed up.
00:10:20.700 -->
00:10:23.580So people have thoughts here, very relevant.
00:10:23.820 -->
00:10:28.080Simon Willison has been writing so much about all of this AI stuff in the world.
00:10:28.080 -->
00:10:32.340So he obviously, as a Python expert, has deep thoughts on this.
00:10:32.600 -->
00:10:40.620And by the way, that comment I made, Simon points out, if you both look at the Astral announcement and the OpenAI announcement, they talk about Ruff, uv, ty.
00:10:41.020 -->
00:10:43.160Nobody mentions pyx at all.
00:10:43.360 -->
00:10:47.520In other words, those letters do not appear in the announcements, whereas the other tools do.
00:10:47.640 -->
00:10:48.960So that's notable, right?
00:10:49.040 -->
00:10:52.580So you can check out Simon Willison's thoughts on this as well.
00:10:52.820 -->
00:10:55.580He's got a pretty balanced view of it.
00:10:55.580 -->
00:10:57.760It's not completely like, oh, this is going to be amazing.
00:10:57.760 -->
00:10:59.940But he has a lot of different thoughts on it.
00:11:00.220 -->
00:11:05.800If you look at discuss.python.org, the thoughts are, well, the thoughts are strong.
00:11:06.120 -->
00:11:08.520They're not necessarily, I don't know, it's positive.
00:11:09.000 -->
00:11:19.680Bright Cannon has a lot of comments here, a lot of work on how he's doing stuff to sort of take some of these ideas from Astral and make them more part of the just core Python, which I think is great.
00:11:19.880 -->
00:11:20.800For example, what happens?
00:11:21.100 -->
00:11:25.080One of the biggest questions I had when I saw that was, oh, what happens to Python build standalone?
00:11:25.420 -->
00:11:27.460So there's the, oh, we can always fork it.
00:11:27.460 -->
00:11:28.220Take, right?
00:11:28.460 -->
00:11:29.240Which is true.
00:11:29.400 -->
00:11:34.600But when there's infrastructure and build tools and stuff happening on the backend.
00:11:34.900 -->
00:11:35.860I didn't think about that.
00:11:35.960 -->
00:11:36.080Yeah.
00:11:36.300 -->
00:11:41.020Then I forked it and it works fine up to Python 3.14 and it never works again.
00:11:41.100 -->
00:11:41.600You know what I mean?
00:11:41.840 -->
00:11:47.780And it didn't take the security patches because the Python build standalone is like not quite regular Python.
00:11:47.940 -->
00:11:50.080They have to do some tweaks to make it work weirdly.
00:11:50.080 -->
00:11:56.780So there's like in this whole discuss thread, there's like, could we just have Python build standalone kind of be there's like regular Python?
00:11:56.900 -->
00:12:04.800Like why, why do we have to have this like more portable version that works kind of better be maintained and patched by other people?
00:12:04.800 -->
00:12:05.040Right.
00:12:05.040 -->
00:12:09.380So Brett's actually talks a lot about that and there's some interesting things here.
00:12:09.660 -->
00:12:13.680There are not as many incredibly positive bits of feedback here.
00:12:14.220 -->
00:12:15.240There's a few, right?
00:12:15.320 -->
00:12:16.860Like Astral have earned a lot of trust.
00:12:17.060 -->
00:12:22.300As long as OpenAI doesn't insist on integrating their equivalent co-pilot into it, we'll probably be fine.
00:12:22.420 -->
00:12:23.400It's probably even good news.
00:12:23.740 -->
00:12:24.540So there's that.
00:12:24.540 -->
00:12:33.320Simon points out that like technically Codex could take uv away from the other coding agents in a way and make them like work with less good tools.
00:12:33.440 -->
00:12:35.140So that could be like a bad lever.
00:12:36.000 -->
00:12:37.760Mark says, hey, let's not jump to conclusions.
00:12:38.480 -->
00:12:38.920Yeah.
00:12:39.100 -->
00:12:44.360I'll tell you what the Twitter, the X thread is more serious.
00:12:44.860 -->
00:12:49.560But there's a pretty deep conversation here on discuss.python.org.
00:12:49.620 -->
00:12:51.280It also was covered on Ars Technica.
00:12:51.280 -->
00:12:53.120You go into the comments here.
00:12:53.360 -->
00:12:54.480I don't know how many comments there are.
00:12:54.620 -->
00:12:55.420Do I need to refresh it?
00:12:55.540 -->
00:13:01.340It's only 48, but this is probably the most concerned one.
00:13:01.740 -->
00:13:04.380Like, oh joy, I'm boarding the Titanic, dot, dot, dot.
00:13:05.100 -->
00:13:05.300Yeah.
00:13:06.240 -->
00:13:10.160Talk Python did get a shout out for the pyx angle, which is fun.
00:13:11.180 -->
00:13:12.080But yeah, I don't know.
00:13:12.400 -->
00:13:13.380I'm going to go ahead, Brian.
00:13:13.580 -->
00:13:17.960I want to be positive, but I got to say my first reaction was nuts.
00:13:18.260 -->
00:13:19.200This is not good.
00:13:19.200 -->
00:13:21.340But so I don't know.
00:13:21.960 -->
00:13:29.380I hope it can be good, but I'm still holding my breath as to whether Microsoft buying GitHub was a good idea.
00:13:30.320 -->
00:13:31.040You know what?
00:13:31.120 -->
00:13:37.620I hear you on the GitHub thing, but they were like on the verge of going out of business, which I don't think people realized at that time.
00:13:37.700 -->
00:13:39.760But it was the finances were bad.
00:13:40.080 -->
00:13:41.580And it was like they need saving.
00:13:41.740 -->
00:13:46.140So it wasn't like, well, either they just keep on their merry way doing their own good thing or Microsoft gets them.
00:13:46.140 -->
00:13:48.280It was like, or they kind of, you know what I mean?
00:13:48.320 -->
00:13:53.100Like it was, that was the, so in a sense, it's GitHub is still going pretty strong.
00:13:53.200 -->
00:13:55.520So it's better than it not being there, but I don't know.
00:13:55.660 -->
00:13:56.400But I agree with you.
00:13:56.460 -->
00:13:56.600Okay.
00:13:56.600 -->
00:13:57.160Back to the topic.
00:13:57.260 -->
00:14:01.620So with this, I trust Charlie and the Astral team.
00:14:01.880 -->
00:14:03.460I think their heart is in the right place.
00:14:03.780 -->
00:14:07.680And to be clear, it says they're still working on the three tools that were not pyx.
00:14:07.680 -->
00:14:15.540That said, once you're inside a large organization that has its own motivations and its own goals, who knows what happens?
00:14:15.620 -->
00:14:16.700It could be totally open.
00:14:17.020 -->
00:14:22.980One good outcome could be that it's a shock to the system and say the core development team goes, you know what?
00:14:23.020 -->
00:14:27.400We just need to like take Python build standalone inside of Python.
00:14:27.540 -->
00:14:28.940Like, why is this an external thing?
00:14:29.060 -->
00:14:32.540Why was a random dude maintaining it before Astral took it over?
00:14:32.900 -->
00:14:33.960You know, that was a lot of work.
00:14:34.060 -->
00:14:35.700We should, this is what we do.
00:14:35.700 -->
00:14:38.500So it could be, there's a lot of things that made.
00:14:38.880 -->
00:14:41.440That would totally make sense to be under the PSF umbrella.
00:14:41.580 -->
00:14:41.780Yeah.
00:14:41.880 -->
00:14:45.880Like, why do we have to keep patching every release of Python to make Python build standalone work?
00:14:46.140 -->
00:14:48.360Can we just upstream those fixes and just make that Python?
00:14:48.740 -->
00:14:48.960Yes.
00:14:49.080 -->
00:14:49.940That would be a good outcome.
00:14:50.260 -->
00:14:56.140Me as a bystander saying it makes sense, but I'm, you know, I don't know what's involved with that.
00:14:56.340 -->
00:14:56.560Yeah.
00:14:57.020 -->
00:14:57.460100%.
00:14:57.460 -->
00:15:00.660But Brett was sort of saying some things along those lines.
00:15:00.660 -->
00:15:07.980if you know, pip could easily adopt a lot of the things that uv did that make uv special.
00:15:08.120 -->
00:15:09.220I don't know why they didn't.
00:15:09.380 -->
00:15:12.500I mean, you look at, you look at the comments, it's like, well, we're too busy.
00:15:12.600 -->
00:15:14.840Like, this is like a volunteer thing for Pip.
00:15:14.840 -->
00:15:24.340And the reason, Paul, the guy who maintains pip is actually like, they've in a congratulatory way sort of said, look what Astral has shown as possible.
00:15:24.340 -->
00:15:27.580If you actually fund work on an open source problem.
00:15:27.580 -->
00:15:27.940Right.
00:15:28.000 -->
00:15:29.700But they didn't, it wasn't funded on Pip.
00:15:29.760 -->
00:15:35.180And so pip hasn't had those changes, but you could retrofit a lot of the things that make uv fast.
00:15:35.180 -->
00:15:38.960Cause it's not all just fast because of rust, although it is rust.
00:15:39.100 -->
00:15:43.960It's a lot of it's fast because of new algorithms and trade-offs and things like that.
00:15:43.960 -->
00:15:44.220Right.
00:15:44.220 -->
00:15:46.740So those could easily be written back.
00:15:46.980 -->
00:15:52.360Like there's also deprecating old features that like there's stuff that pip does that uv doesn't.
00:15:52.440 -->
00:15:52.560Yeah.
00:15:52.620 -->
00:15:55.800I just say, Hey, look, you pin pip to what it is now.
00:15:55.800 -->
00:15:57.720And we're going to get a new, better Pip.
00:15:57.980 -->
00:15:58.160Yeah.
00:15:58.160 -->
00:16:00.680If you need old Pip, use old Pip, like pip dash old.
00:16:00.780 -->
00:16:01.400I don't know, whatever.
00:16:01.740 -->
00:16:09.580So that, I mean, all those are positive influences and on the most possible positive thing, it's just rough uv and ty just keep on trucking.
00:16:09.860 -->
00:16:09.960Yeah.
00:16:10.540 -->
00:16:10.760Right.
00:16:10.920 -->
00:16:14.120So like, for example, the other thing I said is like, Hey, that ty.
00:16:14.380 -->
00:16:15.480And what did I say?
00:16:15.540 -->
00:16:17.140A project from meta, right?
00:16:17.180 -->
00:16:19.900It wasn't a other open source project that was a competitor to ty.
00:16:20.120 -->
00:16:23.320It was a sort of a similar type of company somewhat.
00:16:23.660 -->
00:16:27.660Henry brings up a great point comparing pip and uv.
00:16:28.200 -->
00:16:30.060UV has paid developers, pip does not.
00:16:31.580 -->
00:16:32.240Yes, absolutely.
00:16:32.460 -->
00:16:33.680A hundred percent Henry.
00:16:33.880 -->
00:16:38.100And Henry had a bunch of great comments and thoughts in that discuss thread as well.
00:16:38.720 -->
00:16:38.900Yeah.
00:16:38.900 -->
00:16:47.860I think we're all on the same boat of like, I get that they all want some payday, but also I hope it doesn't go down in flames.
00:16:49.600 -->
00:16:51.200Look, and I just want to put this out here.
00:16:51.240 -->
00:16:51.740I do.
00:16:51.740 -->
00:16:58.360I hope nobody has a bunch of negative hate that they're throwing out there for Charlie and team.
00:16:59.600 -->
00:17:03.820They've given us something and they haven't taken hardly anything from any of us.
00:17:03.900 -->
00:17:05.520And what they've shown is really awesome.
00:17:05.520 -->
00:17:06.860And we've all enjoyed the tools.
00:17:07.020 -->
00:17:10.540And even if they were to go away, there's a lot to carry forward from what they've done.
00:17:10.540 -->
00:17:18.440So I have no idea how much money they got, but it's probably life-changing amounts of money to some degree.
00:17:18.880 -->
00:17:26.060And if you've got just an open source project that you thought you could make install Python packages better, and then you've got life-changing amount of money, you should take it.
00:17:26.100 -->
00:17:27.100Unless you're already rich.
00:17:27.280 -->
00:17:27.820Really rich.
00:17:28.120 -->
00:17:30.760Well, there's also a couple of other aspects.
00:17:31.320 -->
00:17:34.620There's investors already in Astral.
00:17:34.620 -->
00:17:39.160And they have a non-zero say in what happens.
00:17:40.300 -->
00:17:42.480And then there's also the...
00:17:42.480 -->
00:17:45.860There have been comments of, well, it's open source, so you can just fork it.
00:17:46.020 -->
00:17:48.940That's not trivial to fork a large project.
00:17:49.320 -->
00:17:49.500Yeah.
00:17:49.700 -->
00:17:54.800I think if there were not infrastructure behind it, you actually could fork it pretty well and be okay.
00:17:54.900 -->
00:18:03.240There's something like 47 non-Astral employee contributors who have done five or more contributions to uv.
00:18:03.760 -->
00:18:04.160Yeah.
00:18:04.160 -->
00:18:05.380I mean, it's definitely doable.
00:18:05.580 -->
00:18:09.500It's just to fork it and get it to work once is one thing.
00:18:09.740 -->
00:18:13.140And then maintaining it for a long time is a completely different story.
00:18:13.340 -->
00:18:13.420Yeah.
00:18:13.580 -->
00:18:16.260And I mean, no new features.
00:18:16.400 -->
00:18:18.800It just keeps doing what it does now, which would still be awesome.
00:18:19.120 -->
00:18:27.180But when you're talking like Python built standalone and every new release of Python results and being patched and that is a whole different level of stuff there.
00:18:27.480 -->
00:18:28.020All right.
00:18:28.320 -->
00:18:30.400Enough talking about Astral.
00:18:30.500 -->
00:18:32.500You want to talk about Astral and stuff?
00:18:32.500 -->
00:18:32.800Yeah.
00:18:32.800 -->
00:18:36.460Let's stop talking about Astral and talk about uv.
00:18:39.040 -->
00:18:39.600Actually.
00:18:39.600 -->
00:18:43.780It's funny, but I am not kidding.
00:18:44.320 -->
00:18:46.680So uv has a new release.
00:18:47.020 -->
00:18:49.780And there's a new feature that I think is interesting.
00:18:49.780 -->
00:18:53.040That's kind of a secret preview feature.
00:18:53.040 -->
00:18:54.440And that's uv audit.
00:18:54.440 -->
00:18:56.220So that's what I want to talk about.
00:18:56.880 -->
00:19:04.620And in the release on the 19th, we got a 0.10.12.
00:19:04.860 -->
00:19:08.160We got uv audit is now as part of the CLI help.
00:19:08.260 -->
00:19:10.220And this was submitted by Owen Lamont.
00:19:10.220 -->
00:19:11.880So thanks for noticing this, Owen.
00:19:11.880 -->
00:19:13.240And I'm pretty curious about.
00:19:13.560 -->
00:19:15.340So I tried it out.
00:19:16.060 -->
00:19:19.920And so you can do uv self-update and you can get it.
00:19:20.000 -->
00:19:21.500And now you can use uv audit.
00:19:21.840 -->
00:19:23.600But it's interesting.
00:19:23.740 -->
00:19:25.580And there's also a link to the roadmap.
00:19:25.860 -->
00:19:27.580So it looks like almost everything's done.
00:19:27.680 -->
00:19:30.220There's some integrated tests that need to be done and whatever.
00:19:30.220 -->
00:19:33.560So it looks like they're heading forward to try to have this in place.
00:19:33.900 -->
00:19:35.580And it's pretty cool.
00:19:35.800 -->
00:19:41.360So uv audit is a dependency checker really on your project.
00:19:41.920 -->
00:19:49.560And I was a little bit, when I tried to run it, I didn't quite understand what happened.
00:19:49.900 -->
00:19:54.920It found some security vulnerabilities in one of my projects.
00:19:55.140 -->
00:19:56.980But it wasn't something I recognized.
00:19:56.980 -->
00:20:00.420And so I looked at it.
00:20:00.420 -->
00:20:05.020It was a dependency of a dependency of my test environment.
00:20:05.400 -->
00:20:12.980And what was even more confusing to me was that project, I looked at like a pip dep tree.
00:20:13.220 -->
00:20:15.280And I didn't have that version.
00:20:15.460 -->
00:20:16.540So what am I seeing?
00:20:16.660 -->
00:20:17.980Why is there vulnerability there?
00:20:18.700 -->
00:20:25.440One of the cool things of how this works is that in some part of the process, it creates a uv lock file.
00:20:25.440 -->
00:20:39.200So it can have in a uv lock file, which I kind of forgot about, it's not just all of the versions for your project pinned.
00:20:39.460 -->
00:20:44.040It's also on all operating systems that you support and all Python versions.
00:20:44.040 -->
00:20:48.080So that's a broad range of dependencies and versions.
00:20:48.480 -->
00:20:54.000And what happened was my project supports 3.9 still, or it did.
00:20:54.200 -->
00:20:57.260Wait, yeah, 3.10 is the lowest that I was supporting.
00:20:57.260 -->
00:21:09.700And even though I was running 3.14, in 3.10, one of the virtual env on 3.10, so it was talks, virtual env, and then file lock, I think, or something.
00:21:10.960 -->
00:21:16.200In version 3.10, there's a file lock vulnerability that got fixed later.
00:21:16.420 -->
00:21:18.000And they just went up new versions.
00:21:18.000 -->
00:21:21.160So it's kind of a neat idea.
00:21:21.380 -->
00:21:31.160I really like this idea, but it's a little bit hard to interpret, to go, oh, you have to look at all of the Python versions and all the operating systems you support.
00:21:31.360 -->
00:21:36.260Which, if you're doing a Python project that's usable, that's how it would work.
00:21:36.260 -->
00:21:40.340Anyway, I'm excited to have this get in place.
00:21:40.600 -->
00:21:49.020And I think it's kind of a neat thing to easily, if we're using uv tools already, to say uv audit for a PyProject Toml-based project.
00:21:49.280 -->
00:21:54.960And make sure you have not any vulnerabilities on any of the Python versions that you're supporting.
00:21:55.240 -->
00:21:55.900So that's cool.
00:21:55.900 -->
00:21:56.300Yeah.
00:21:56.560 -->
00:21:58.400When Owen said this, I thought, oh, this is awesome.
00:21:58.600 -->
00:22:05.920Because I've been using pip audit for both my local dev, but also for our Docker deploys.
00:22:06.420 -->
00:22:11.920So one of the Docker build steps is to do a pip audit against everything that had been installed.
00:22:12.000 -->
00:22:16.760And I set it up so that my pip audit, I can use uv to pip compile the requirements file.
00:22:16.760 -->
00:22:24.260And then use Docker to run pip audit so that if it has to install stuff and there is a vulnerability, it doesn't get installed.
00:22:24.420 -->
00:22:26.680I don't know, like crypto miners or whatever on my computer.
00:22:26.800 -->
00:22:30.080It installs it into this ephemeral Docker container, right?
00:22:30.280 -->
00:22:32.280Which is sweet, but it's kind of slowish.
00:22:32.700 -->
00:22:38.280It adds like 10 seconds to the build time of what otherwise was seconds.
00:22:38.600 -->
00:22:39.080A couple of seconds.
00:22:39.500 -->
00:22:41.840Doubled the Docker build time, at least, I would say.
00:22:41.840 -->
00:22:46.680So does pip audit must do something on the installed container?
00:22:46.760 -->
00:22:47.600Packages or?
00:22:47.860 -->
00:22:48.460Yeah, exactly.
00:22:48.760 -->
00:22:51.520So what you do is you install it, then it looks at the virtual environment.
00:22:51.660 -->
00:22:54.980So I have a Docker container I built, which is like the command I run.
00:22:55.060 -->
00:22:57.740And so what it does is it has pip audit already installed.
00:22:57.880 -->
00:23:00.380It maps in the requirements file.
00:23:00.800 -->
00:23:02.920It pip, uv pip installs them quickly.
00:23:02.920 -->
00:23:04.680And then it pip audits against them.
00:23:04.760 -->
00:23:05.200You know what I mean?
00:23:05.420 -->
00:23:05.580Yeah.
00:23:05.600 -->
00:23:07.060And so I'm hoping that this would be great.
00:23:07.060 -->
00:23:10.880And if you go to the bottom at the coming soon roadmap deal.
00:23:11.220 -->
00:23:11.500Oh, yeah.
00:23:11.500 -->
00:23:11.820Yeah.
00:23:12.420 -->
00:23:19.560You'll see at the, one of the unfinished things is support locked hashed requirements.txt files.
00:23:19.720 -->
00:23:20.120Yeah.
00:23:20.360 -->
00:23:21.680Which is the way I've been doing it.
00:23:21.680 -->
00:23:27.280I still, I'm just not a huge fan of the project management, like uv in it, add, so on.
00:23:27.520 -->
00:23:27.660Yeah.
00:23:27.660 -->
00:23:28.680For non-packages.
00:23:28.820 -->
00:23:31.700I like it for packages where it manages the piproject.tml.
00:23:31.840 -->
00:23:32.240And there's like all that.
00:23:32.400 -->
00:23:35.140But if I just have an app, I'd rather just have a requirements file.
00:23:35.400 -->
00:23:37.420So I pip, uv pip compile that thing.
00:23:37.420 -->
00:23:39.580But I can't uv audit it.
00:23:39.940 -->
00:23:40.700I have to pip audit.
00:23:40.860 -->
00:23:41.500So anyway.
00:23:41.900 -->
00:23:53.800I'm actually thinking about, because of, because of this and because of other, because uv sync is awesome, I'm thinking about projects that just are normal, like for my own, for work,
00:23:54.100 -->
00:23:59.000for requirements.txt-based projects, switching to PyProjectHمل so that I can get this.
00:23:59.060 -->
00:24:01.280But if they, if it supported this also, that'd be cool.
00:24:01.280 -->
00:24:10.400Yeah, I, it's, how much work can it be to translate the format of a requirements.txt file to a workable format of a uv lock file?
00:24:10.660 -->
00:24:12.640It's probably an hour of Claude Code, I bet you.
00:24:12.920 -->
00:24:13.100Anyway.
00:24:13.100 -->
00:24:13.700Oh, wait a minute.
00:24:13.780 -->
00:24:16.160Use converter to a PyProjectHمل and then write it.
00:24:16.300 -->
00:24:16.440Yeah.
00:24:16.700 -->
00:24:16.820So.
00:24:17.000 -->
00:24:17.560Yeah, exactly.
00:24:17.840 -->
00:24:18.240Exactly.
00:24:18.560 -->
00:24:18.820Okay.
00:24:18.980 -->
00:24:20.480So that looks really cool.
00:24:20.720 -->
00:24:25.360I would actually like to switch over and talk about something that I thought was pretty interesting.
00:24:25.560 -->
00:24:26.840And this is an article I wrote.
00:24:26.980 -->
00:24:28.900It's not so much about the article itself.
00:24:28.900 -->
00:24:31.960It's about what the article is covering thing.
00:24:32.080 -->
00:24:32.540Go away.
00:24:32.820 -->
00:24:33.360Here we go.
00:24:33.580 -->
00:24:40.380So this is the articles entitled fire and forget or never with Python's asyncio.
00:24:40.540 -->
00:24:41.460And so here's the deal.
00:24:41.460 -->
00:24:47.580This is, there's a couple of tasks on our web apps that have long running things.
00:24:47.720 -->
00:24:49.660So let me just give you one example.
00:24:49.960 -->
00:24:52.460The one example is, and there's different ways to do this.
00:24:52.520 -->
00:24:55.060One example is like, maybe I want to just send an email.
00:24:55.240 -->
00:24:58.100Now send an email usually is quick, but sometimes it's really slow.
00:24:58.100 -->
00:25:04.740And maybe somebody signs up for a course and I want to send them an email, but I want to be able to quickly just get right back to them.
00:25:04.740 -->
00:25:04.940Right.
00:25:05.020 -->
00:25:05.760Say, Hey, you're in.
00:25:06.020 -->
00:25:10.940So you could just say, start the send email async function and let it go.
00:25:11.100 -->
00:25:12.520What are you going to do if it can't be sent?
00:25:12.580 -->
00:25:13.340Like, I don't know.
00:25:13.380 -->
00:25:17.880Like, you know, you're not usually told it goes out and eventually it comes back five minutes later.
00:25:18.020 -->
00:25:20.880This email address was not found at this server or whatever.
00:25:20.880 -->
00:25:21.140Right.
00:25:21.140 -->
00:25:29.380It's not like you can wait for the call to say, it's like the wait is for the call, the email to start sending, not for the success of the email delivery.
00:25:29.380 -->
00:25:29.700Right.
00:25:29.940 -->
00:25:30.580So why wait?
00:25:30.860 -->
00:25:31.720So you just fire it off.
00:25:31.760 -->
00:25:33.600Like, okay, that task goes.
00:25:33.640 -->
00:25:35.940And then we tell them, Hey, welcome to your account or whatever.
00:25:36.060 -->
00:25:36.240Right.
00:25:36.400 -->
00:25:37.440Something along those lines.
00:25:37.580 -->
00:25:45.080Another one is I have all the data, all the transcripts for the various podcasts stored in the database.
00:25:45.080 -->
00:25:47.960In certain formats, really nice to get the, get them in and out.
00:25:48.040 -->
00:25:54.720And, and the transcript generation stuff is always, it's always fraught, like with acronyms and stuff, right?
00:25:54.880 -->
00:26:05.960Like PI PI without some work, it's getting better and better, but without some work, it'll come back as like PI, the food, the letter P or something, or maybe it's the number PI or like it's whatever it is.
00:26:06.040 -->
00:26:09.120It's not capital P, lowercase Y, capital P, capital I.
00:26:09.240 -->
00:26:09.540Right.
00:26:09.540 -->
00:26:13.980And so there's like this automation that I run that fixes it really bad as guest names.
00:26:14.100 -->
00:26:15.400It can wreck guest names.
00:26:15.400 -->
00:26:17.620And sometimes it's no big deal, but sometimes it's bad enough.
00:26:17.720 -->
00:26:19.620You're like, Oh, that's kind of offensive to the guests.
00:26:19.720 -->
00:26:21.960Let's see if we can not do that to them, you know?
00:26:22.020 -->
00:26:32.240And so I have this like post-processing that goes on with literally hundreds of changes and not just one word, but if you see these three words together, that actually means something
00:26:32.240 -->
00:26:38.500separate than if you heard them individually, like talk Python slash whatever, like that's supposed to actually be a URL.
00:26:38.500 -->
00:26:40.420So fix it or Python byte slash whatever.
00:26:40.860 -->
00:26:43.960And so there's this process that runs and fixes them.
00:26:44.040 -->
00:26:48.780But as I discover new problems, I go back and retroactively fix the last 10 years.
00:26:48.780 -->
00:26:53.600And that process takes forever in terms of web request time.
00:26:53.600 -->
00:26:53.900Right.
00:26:54.120 -->
00:26:56.020So I'll say there's an admin button.
00:26:56.100 -->
00:27:06.280I can go push and it'll go pull every transcript from the database, search through it for hundreds of phrases, each transcript for hours of transcripts, change them, put them back in the database.
00:27:06.280 -->
00:27:09.640So that's like 20, 30 seconds if it fans out of a cross-processes.
00:27:09.840 -->
00:27:13.200So that kind of stuff, like when I push the button, I don't really necessarily want to just wait.
00:27:13.280 -->
00:27:14.540I want to just have it go awesome.
00:27:14.800 -->
00:27:15.240We're working.
00:27:15.360 -->
00:27:19.820And we have a little JavaScript that'll tell you it's progress, but we're not going to await it.
00:27:19.880 -->
00:27:20.140Right.
00:27:20.140 -->
00:27:22.160So that's a long, long way to set up this.
00:27:22.460 -->
00:27:27.340And the reason I went into sort of that extra background is people, a couple, when I posted this, a couple people said, well, you should never do this.
00:27:27.380 -->
00:27:28.220It's an anti-pattern.
00:27:28.280 -->
00:27:30.120I'm like, you shouldn't do it most of the time.
00:27:30.200 -->
00:27:31.760But the alternative is what?
00:27:31.960 -->
00:27:35.220Set up an entire separate Redis server with a messaging queue.
00:27:35.320 -->
00:27:41.580Like that's a lot of overhead for just like, I just like the little process in the background to run and correct the transcripts, you know?
00:27:41.900 -->
00:27:42.260Anyway.
00:27:42.580 -->
00:27:43.620So here's the news.
00:27:43.700 -->
00:27:44.660Here's the story.
00:27:44.660 -->
00:27:48.480Is that a lot of times you would write simple code like this.
00:27:48.480 -->
00:27:51.720You would say, I'm going to do a little bit of work and it's maybe async or whatever.
00:27:51.900 -->
00:27:54.280And then you can't just call async functions.
00:27:54.360 -->
00:27:55.340You have to start them.
00:27:55.380 -->
00:27:55.540Right.
00:27:55.580 -->
00:27:59.260So you have to say asyncio create task, or you have to await it.
00:27:59.260 -->
00:28:01.760Because if you don't create a task or await it, it just doesn't run.
00:28:01.840 -->
00:28:03.700It's an unrun async coroutine.
00:28:03.820 -->
00:28:04.020Right.
00:28:04.220 -->
00:28:05.040So you got to await it.
00:28:05.040 -->
00:28:08.560And up to Python 3.11, this code was fine.
00:28:08.680 -->
00:28:18.340You would just say, okay, now it's on the background queue and it's going to do its async await run just as if you had awaited it, but you get to carry on and like, welcome the user or whatever you're doing.
00:28:18.600 -->
00:28:22.160Well, then this has been this way since 3.6, maybe 3.5.
00:28:22.360 -->
00:28:22.540Right.
00:28:22.580 -->
00:28:23.220So that's a lot.
00:28:23.280 -->
00:28:28.280It's like seven years, but now Python 3.12 onward, you can't do this anymore.
00:28:28.420 -->
00:28:36.940If you do this, that task that was just started, you say asyncio create task is eligible for garbage collection in the next line of code.
00:28:37.020 -->
00:28:38.260And it might not even start.
00:28:38.260 -->
00:28:40.200I wanted to put, I wanted to put that out there for people.
00:28:40.200 -->
00:28:43.780Like, you know, if you have this type of code, you, you had better look at it.
00:28:43.940 -->
00:28:52.460You would better make a change because for whatever reason, the async event loop now holds weak references to the tasks that it runs.
00:28:52.580 -->
00:28:54.500And that doesn't just apply to this pattern.
00:28:54.680 -->
00:29:05.540Anything that somehow put something into that task, that, that work queue, the loop needs to keep track of it explicitly or else it's potentially gets deleted out of memory.
00:29:05.540 -->
00:29:05.940Right.
00:29:06.060 -->
00:29:09.860So if you look at the documentation or what is it?
00:29:10.000 -->
00:29:18.000Create, create task in the docs, it says it's going to wrap a coroutine into a task and schedule its execution and return the task object.
00:29:18.140 -->
00:29:25.320However, in Python 3.12 onward, it's important that you save a reference to the result to avoid the task disappearing mid execution.
00:29:25.460 -->
00:29:26.000That's new.
00:29:26.240 -->
00:29:28.080So anyway, so what is the fix?
00:29:28.200 -->
00:29:31.760You create this weird set that holds all running tasks that you're not tracking.
00:29:31.760 -->
00:29:37.780You add it to that task, that, that set, then you kick it off as a, or you kick it off as background work and you add the task there.
00:29:37.920 -->
00:29:42.540And then you set up a callback that when the task is done, it takes it out of the set.
00:29:42.680 -->
00:29:43.620So I don't know.
00:29:43.840 -->
00:29:48.660Anyway, that could certainly be catching some people out in like super hard to debug race conditions.
00:29:48.660 -->
00:29:51.720So I wanted to, I wanted to bring that up and then I wrote up a way to do it.
00:29:51.920 -->
00:29:53.640So that's that fire and forget.
00:29:53.820 -->
00:29:55.960Maybe you might just forget what else we got.
00:29:56.200 -->
00:29:56.480Extras.
00:29:57.100 -->
00:29:57.460Yeah.
00:29:57.600 -->
00:29:57.720Yeah.
00:29:57.720 -->
00:30:05.200I mean, what's interesting is about that is it actually requires you understand memory management a lot better than we normally do in Python land.
00:30:05.380 -->
00:30:06.540Normally we just kind of ignore it.
00:30:06.680 -->
00:30:06.900Okay.
00:30:06.940 -->
00:30:11.740So your solution, does it, does it still, does the task still stick around then?
00:30:11.800 -->
00:30:12.300Or does this?
00:30:12.440 -->
00:30:12.700Yes.
00:30:12.980 -->
00:30:13.200Okay.
00:30:13.440 -->
00:30:20.000So it's, I basically, I just took my example and just stole the, what, what they suggested straight out of the docs.
00:30:20.000 -->
00:30:28.700You create a global set, you run the task, you put it in the set, and then you wire up the tasks when I'm done, call the discard myself button.
00:30:28.980 -->
00:30:30.780Oh, so the garbage collector doesn't grab it.
00:30:30.980 -->
00:30:31.320Okay.
00:30:31.480 -->
00:30:31.680Yeah.
00:30:31.740 -->
00:30:34.340You just need to upgrade your weak reference to a stronger.
00:30:34.700 -->
00:30:34.980Okay.
00:30:35.340 -->
00:30:35.780That works.
00:30:36.080 -->
00:30:36.200Cool.
00:30:36.200 -->
00:30:37.080Yeah, it works.
00:30:37.880 -->
00:30:39.240It's, but it's not obvious.
00:30:39.240 -->
00:30:41.220It's definitely not like, oh yeah, I know I had to do that.
00:30:41.420 -->
00:30:41.580All right.
00:30:41.600 -->
00:30:41.960Extras.
00:30:42.220 -->
00:30:42.780What do we got?
00:30:43.140 -->
00:30:43.500Extras.
00:30:43.660 -->
00:30:44.620I just got a couple.
00:30:44.840 -->
00:30:45.480Let's see.
00:30:45.560 -->
00:30:47.540go over here.
00:30:47.760 -->
00:30:49.080just a fun article.
00:30:49.080 -->
00:30:51.980I didn't want to talk about it too much, but, I found it interesting.
00:30:51.980 -->
00:30:54.400called, nobody gets permit.
00:30:54.680 -->
00:30:56.300Nobody gets promoted for simplicity.
00:30:56.540 -->
00:30:59.240and this is a blog by terrible.
00:30:59.380 -->
00:31:00.800It's a terrible software blog.
00:31:00.900 -->
00:31:02.420That's an awesome name for a blog.
00:31:02.920 -->
00:31:07.820so, it, there's a quote from Ed, from Dykstra.
00:31:07.980 -->
00:31:13.180Simplicity is a great virtue, but it requires hard work to achieve and education to appreciate.
00:31:13.180 -->
00:31:17.660and to make what matters worse, complexity sales better.
00:31:17.660 -->
00:31:22.980And, it's, it's just an interesting observation and I've observed it too.
00:31:23.100 -->
00:31:34.240People, people, and it's unfortunate that people with the complicated, it's like the guy that, that stayed, late nights and weekends to fix bugs, might get a, you know, free
00:31:34.240 -->
00:31:38.280pizza or something like that or a promotion, but it was their bugs that they were fixing.
00:31:38.280 -->
00:31:41.760And the person that just didn't write the bugs in the first place won't get those.
00:31:41.940 -->
00:31:44.260Anyway, just that person is not even that much of a hard worker.
00:31:44.360 -->
00:31:45.400Look, they went home on time.
00:31:45.400 -->
00:31:46.300I suck.
00:31:47.300 -->
00:31:54.480I bring this up also because, people using your, your, a lot of people are now in a management role.
00:31:54.480 -->
00:32:00.340If, even if they don't realize it, if they're letting AI generate a bunch of code for them, simplicity still matters.
00:32:00.720 -->
00:32:06.140don't, don't reward your, agent just because it gave you volumes of code.
00:32:06.140 -->
00:32:08.500It might be a simple solution.
00:32:08.740 -->
00:32:09.400It might be easier.
00:32:09.660 -->
00:32:11.180Anyway, set that aside.
00:32:11.260 -->
00:32:12.240It's just interesting read.
00:32:12.240 -->
00:32:17.280I've been working on over the weekend, catching up on, pytest check.
00:32:17.380 -->
00:32:28.820I brought this up, a while ago, a couple weeks ago as well, that I'm catching up on all the things because now we're at, let's see, zero issues, zero pull requests.
00:32:29.080 -->
00:32:29.800That's awesome.
00:32:30.180 -->
00:32:32.000I mean, it's a small project.
00:32:32.000 -->
00:32:39.680So the last one I just, cleaned up though has been, was, was a feature request from three years ago.
00:32:39.680 -->
00:32:42.680So I'm, I'm glad that I'm, I finally get it in place.
00:32:42.680 -->
00:32:48.620And so the thing is I've got a bunch of these helper functions like, like equal and not equal and stuff like that.
00:32:48.620 -->
00:32:58.800and, the addition is that even if a test is not marked as X fail, you can, mark an individual check as X failed now.
00:32:58.800 -->
00:33:08.320so, so that individual checks, some checks might be X fail, some checks might be not, and you can also still use an assert can still cause the test to fail.
00:33:08.320 -->
00:33:09.320So yeah, I like it.
00:33:09.320 -->
00:33:09.720That's cool.
00:33:09.980 -->
00:33:10.580very nice.
00:33:10.580 -->
00:33:10.720Yeah.
00:33:10.960 -->
00:33:11.920That's my extra.
00:33:12.160 -->
00:33:12.760All right.
00:33:12.980 -->
00:33:13.780I got a few.
00:33:13.780 -->
00:33:14.440I'll go quick though.
00:33:14.620 -->
00:33:21.020So I ran across this project called turbo API as a riff on FastAPI.
00:33:21.180 -->
00:33:24.360We started with starlet and FastAPI and here we are in extras with a bit more.
00:33:24.540 -->
00:33:26.840So there's a couple of interesting things from this.
00:33:26.960 -->
00:33:38.400This person said, what if all of the parts of code that actually were not the Python that you write, what if that was all rust or actually not rust zig, but it doesn't really matter.
00:33:38.460 -->
00:33:40.900Like you dress C++ zig, whatever this person likes it.
00:33:41.100 -->
00:33:44.680I don't even know what zig codes look like, but it, you know, natively compiled code, right?
00:33:44.840 -->
00:33:45.560Would it be faster?
00:33:45.720 -->
00:33:46.440Would it be cool?
00:33:46.720 -->
00:33:50.080Would it be like you could use the same decorator and the same model?
00:33:50.340 -->
00:33:52.120technically doesn't use Pydantic.
00:33:52.240 -->
00:33:59.840It uses some other thing, that is zig based instead of Pydantic as the foundation, but it understands the models the same and seven times faster.
00:34:00.360 -->
00:34:00.960So on.
00:34:01.220 -->
00:34:02.480So anyway, I thought this was cool.
00:34:02.600 -->
00:34:04.240It's like this kind of Twitter thread.
00:34:04.360 -->
00:34:07.320It got a lot of, it's got 325,000 views.
00:34:07.320 -->
00:34:08.700So, Hey, it caught some attention.
00:34:08.820 -->
00:34:09.320How about that?
00:34:09.560 -->
00:34:10.340And I don't know.
00:34:10.400 -->
00:34:11.680It, it was kind of interesting.
00:34:12.140 -->
00:34:18.500I looked at it a lot and like, ah, you know, I don't really care too much about that, but I just, the idea of it got me thinking about something.
00:34:18.620 -->
00:34:20.040So I wanted to throw that out there.
00:34:20.080 -->
00:34:22.080It's, it's kind of popular now.
00:34:22.080 -->
00:34:23.880It's got a lot of GitHub stars and so on.
00:34:24.120 -->
00:34:26.640I'm not suggesting people use this over FastAPI.
00:34:26.900 -->
00:34:30.620It's that's tried and true and all, and so on, but this is kind of an interesting idea.
00:34:30.620 -->
00:34:39.980Anytime you publish benchmarks, you, you will receive an inordinate, an abnormal amount of attention in not a good way.
00:34:40.180 -->
00:34:41.480So I'd follow a post.
00:34:41.580 -->
00:34:44.060I learned a lot from the turbo PG benchmark mess.
00:34:46.280 -->
00:34:46.800Interesting.
00:34:46.800 -->
00:34:54.780Also, there's a, there's a, some pushback that, oh, you used agentic coding tools to help do this transition or write this code.
00:34:54.780 -->
00:35:02.320I think this is, this is very interesting because a lot of the pushback to astral being acquired by OpenAI.
00:35:02.320 -->
00:35:04.980Wasn't that we think OpenAI is going to be bad.
00:35:04.980 -->
00:35:06.740It was, I hate AI.
00:35:06.740 -->
00:35:08.140I hate OpenAI.
00:35:08.140 -->
00:35:09.620And therefore I hate this.
00:35:09.880 -->
00:35:10.760You know what I mean?
00:35:10.760 -->
00:35:14.540And it wasn't an assessment of do I think this is better or worse for this project.
00:35:14.540 -->
00:35:17.320It was just like, I hate them because they're AI.
00:35:17.320 -->
00:35:18.500Cause I hate AI.
00:35:18.640 -->
00:35:20.800And so there's this really interesting tension.
00:35:20.800 -->
00:35:25.640And so if you want to like, kind of live in that moment, you can read, read this whole thing.
00:35:25.700 -->
00:35:26.740I think that's pretty interesting.
00:35:27.000 -->
00:35:28.120So anyway.
00:35:28.680 -->
00:35:29.280Yeah.
00:35:29.280 -->
00:35:37.060There's also like, we get sent projects all the time and I'm, I'm of, of like, oh, there's this new project.
00:35:37.180 -->
00:35:38.060Check, check this out.
00:35:38.060 -->
00:35:49.680And there's nothing behind it other than like two days worth of AI generated stuff that I don't think the person that wrote it even like read it or tried it or anything.
00:35:49.680 -->
00:35:52.020And, and I totally concur on that.
00:35:52.020 -->
00:35:52.880I agree with you on that.
00:35:53.080 -->
00:36:03.160If, if the thing solves a legitimate problem that wasn't there before, that wasn't solved before and it was generated with AI and it seems generated well, like, okay, it's still interesting.
00:36:03.160 -->
00:36:13.440but yeah, we definitely get stuff that's just like clearly just AI generated and like people are looking for promotion for it and that we're not looking necessarily to shine that, that sort of light.
00:36:13.440 -->
00:36:20.360But for example, in the, I think it was in the Ars Technica thing, literally one of the comments was, I hate OpenAI.
00:36:20.740 -->
00:36:21.800This should have never happened.
00:36:21.900 -->
00:36:26.860Or, you know, something like it was like, it was that explain, it was, you know, it was verbatim when I said, basically.
00:36:26.860 -->
00:36:30.680So I know you got some other extras, but I want to interrupt a little bit more.
00:36:31.100 -->
00:36:41.580I have a couple ideas then is next time I want to try to like hype up something, I think I'm going to put fake, fake timing, data in there then.
00:36:41.900 -->
00:36:42.580Yeah, exactly.
00:36:43.000 -->
00:36:46.660performance metrics just to, or even just bad performance.
00:36:46.820 -->
00:36:48.040They're not fake, but they're bad.
00:36:48.060 -->
00:36:50.040so that, you know, to get people.
00:36:50.040 -->
00:36:56.000And the other thing is, what do you think about like, you know, selling Python bytes to OpenAI?
00:36:56.860 -->
00:36:57.480You know what?
00:36:57.540 -->
00:36:59.900Hey, I love our listeners.
00:37:00.040 -->
00:37:05.580I love what we do, but I would not be against this if, if they come, if they come with the money.
00:37:05.660 -->
00:37:06.140All right.
00:37:06.380 -->
00:37:11.840So, chances very, very low, really quick pyramid pyramid, the web framework.
00:37:11.840 -->
00:37:12.240Yes.
00:37:12.540 -->
00:37:17.420Pyramid, which by the own bytes was originally based on from way, way back in the day has a release.
00:37:17.640 -->
00:37:20.080Now you might think, Michael, why are you so psyched about this?
00:37:20.080 -->
00:37:23.040Cause we're running it on court, async class, whatever, right?
00:37:23.120 -->
00:37:26.840These days, this is the first actual release of pyramid.
00:37:26.860 -->
00:37:27.980In five years.
00:37:28.200 -->
00:37:31.000So I'm like, wait, there's a new version of it.
00:37:31.040 -->
00:37:31.380What is that?
00:37:31.460 -->
00:37:32.260What's going on here?
00:37:32.740 -->
00:37:36.660Technically there was a release three years ago, but it was like a very minor thing.
00:37:36.780 -->
00:37:36.960Okay.
00:37:36.960 -->
00:37:38.840And so there's not a lot going on here.
00:37:39.560 -->
00:37:44.320Basically setup tools had some issue with the way that it was managing packages.
00:37:44.640 -->
00:37:53.920Like pyramid web apps are packages and setup tools was saying the way that you start your web app or install it is about to be no longer supported.
00:37:53.920 -->
00:37:58.640So the thing actually pins the setup tools to a version that will work.
00:37:58.760 -->
00:38:01.240But if you have something else that depends on setup tools, you can't use it.
00:38:01.320 -->
00:38:03.140So it's always a bit of an issue.
00:38:03.260 -->
00:38:11.360The other one is they literally, as part of this release added pyramid.acp exceptions.acp !imatpod exception.
00:38:11.800 -->
00:38:12.560I love it.
00:38:12.800 -->
00:38:13.160I love it.
00:38:13.560 -->
00:38:18.760So anyway, that's, that's that, Vivaldi.
00:38:19.160 -->
00:38:20.600We're both fans of Vivaldi.
00:38:20.680 -->
00:38:26.860I know a lot of Python people are fans of Vivaldi and the privacy angle and the not, not Chrome angle.
00:38:27.060 -->
00:38:34.260Just released this really cool, new sort of auto hiding style where you've got this like really minimal UI that feels very Arc-like.
00:38:34.440 -->
00:38:36.620People like that, like Arc browser a lot.
00:38:36.720 -->
00:38:40.760And so you, most people are listening to it or know, but you, you can't see my address bar.
00:38:40.840 -->
00:38:42.360You can't see all the Chrome around.
00:38:42.420 -->
00:38:44.140It's like just sort of very minimal.
00:38:44.140 -->
00:38:47.760You can like turn it into just like this, just the essence of the web.
00:38:47.760 -->
00:38:50.820You can even auto hide your tabs, but it's, it's a bit too much for me.
00:38:50.900 -->
00:38:56.720I like when I know like I've got 20 tabs open, how do I get back to the one I want more easily and sort of navigate that?
00:38:56.980 -->
00:38:59.560you can add a bunch of hotkeys that make this work better.
00:38:59.780 -->
00:39:05.700For example, like I used to go to the address bar and copy the URL cause I needed to use it in some sort of writing.
00:39:05.800 -->
00:39:07.420But if it's hidden now, then how do you do that?
00:39:07.480 -->
00:39:11.220So I had it a hotkey to like just copy whatever thing I am on.
00:39:11.220 -->
00:39:13.360So it's kind of encourages you to be a little more hotkey driven.
00:39:13.460 -->
00:39:13.840So that's fun.
00:39:14.060 -->
00:39:14.920People should check that out.
00:39:15.040 -->
00:39:16.220I saw you just turn that on Brian.
00:39:16.540 -->
00:39:17.300This is the show.
00:39:17.660 -->
00:39:17.740Yeah.
00:39:18.040 -->
00:39:18.240Yeah.
00:39:18.320 -->
00:39:22.520We'll see how it, how you take to it, but it took some getting used to, but I definitely like it.
00:39:22.660 -->
00:39:24.360You just got to be the more mellow around the edges.
00:39:24.440 -->
00:39:27.340If you get too quick, stuff pops over and covers the nav and that's kind of annoying.
00:39:27.560 -->
00:39:27.820Yeah.
00:39:27.820 -->
00:39:34.160When those stuff would pop down, it would like move the window, the actually, as if that thing existed in the UI.
00:39:34.300 -->
00:39:36.480So it didn't cover your elements, but whatever.
00:39:36.480 -->
00:39:48.240One of the places where I'm seeing, I'm, I'm using it the most is places like here, but, or at work during presentations where I don't, it's, I don't, I just want to show the thing that I'm showing.
00:39:48.560 -->
00:39:49.780so yeah.
00:39:50.000 -->
00:39:50.220Yeah.
00:39:50.340 -->
00:39:50.540Yeah.
00:39:50.600 -->
00:39:50.620Yeah.
00:39:50.620 -->
00:39:50.720Yeah.
00:39:50.880 -->
00:39:53.040And certainly on like small laptop screens and stuff.
00:39:53.080 -->
00:39:53.660It's super cool.
00:39:53.660 -->
00:39:54.100Okay.
00:39:54.100 -->
00:39:54.420Okay.
00:39:54.420 -->
00:40:05.680A couple of things, that the reason I even brought up turbo API is it got me thinking about, well, what if our code ran on pure rust, like all the way up until like where the code
00:40:05.680 -->
00:40:09.580that we write starts running, you know, not the framework stuff, but just that close.
00:40:09.580 -->
00:40:09.820Right.
00:40:09.820 -->
00:40:17.540So I looked around and found Robin, R O B Y N web framework, which is basically exactly that in an order to test it.
00:40:17.540 -->
00:40:24.080I wanted to do a spike and see if I could convert one of our apps like Python bytes to Robin.
00:40:24.080 -->
00:40:25.040Would it be a lot faster?
00:40:25.040 -->
00:40:25.580I don't know.
00:40:25.640 -->
00:40:29.220Well, there's a whole bunch of chameleon templates and only supports Jinja.
00:40:29.220 -->
00:40:33.640So I'm like, well, in order to do that, I'm going to have to create a chameleon Robin package.
00:40:33.640 -->
00:40:34.260So I did.
00:40:34.400 -->
00:40:37.900So I added chameleon support to the Robin language so I could see if it was any better.
00:40:38.060 -->
00:40:40.440turns out, no, not really.
00:40:40.560 -->
00:40:41.740Was it really worth it actually?
00:40:41.940 -->
00:40:45.740But now the world has this cool, chameleon Robin project.
00:40:45.740 -->
00:40:48.780So, chameleon is a little bit more out there.
00:40:49.020 -->
00:40:50.980And I was also playing around this week.
00:40:51.000 -->
00:40:52.300I was trying out ideas this weekend.
00:40:52.300 -->
00:41:05.080This raw plus DC, the, data classes pattern that I talked about that makes, you know, removes the dependency of your ORM library in terms of like, if it doesn't get updated, that makes it easier for AIs to understand.
00:41:05.080 -->
00:41:08.560Cause it knows raw, the raw query language of your database and so on.
00:41:08.640 -->
00:41:15.480I actually switched, talk Python and Python bytes over that this weekend, just playing around and it's like 10% faster, lower memory usage.
00:41:15.740 -->
00:41:16.040Why not?
00:41:16.040 -->
00:41:16.500Oh, wow.
00:41:16.740 -->
00:41:17.080Yeah.
00:41:17.320 -->
00:41:17.720Pretty sweet.
00:41:17.900 -->
00:41:20.400Have you considered raw plus Marvel?
00:41:21.400 -->
00:41:22.220No, I know.
00:41:22.220 -->
00:41:27.300It's a, it's, there's better stories over there, but no, I think that's it for our extras.
00:41:27.520 -->
00:41:28.520We got a joke though.
00:41:28.860 -->
00:41:31.840And this one, this one comes to you, comes from you.
00:41:31.960 -->
00:41:34.120This is a pretty, pretty good stuff.
00:41:34.720 -->
00:41:35.720I love this.
00:41:35.940 -->
00:41:37.140You want me to just see how my screen up here?
00:41:37.240 -->
00:41:38.460I'm going to put, we're going to start.
00:41:38.720 -->
00:41:40.220So, so set the stage for us.
00:41:40.220 -->
00:41:40.920What is going on here?
00:41:40.920 -->
00:41:43.260so do you, can you get the LinkedIn?
00:41:43.720 -->
00:41:44.080Oh yeah.
00:41:44.180 -->
00:41:44.520Oh yeah.
00:41:44.640 -->
00:41:48.640So I just like, there's the normal, like Google translate.
00:41:49.000 -->
00:41:50.620You just type in stuff or whatever.
00:41:50.760 -->
00:41:52.140All your translate tools are type.
00:41:52.280 -->
00:41:53.060It converts it.
00:41:53.300 -->
00:41:58.820somebody on Kagi wrote a, LinkedIn speak converter.
00:41:59.080 -->
00:42:02.700so you can convert English to, to LinkedIn or back.
00:42:02.700 -->
00:42:08.720So if you, if you're looking at somebody's bio and LinkedIn, you can, or any, it works for resume speak as well.
00:42:08.880 -->
00:42:09.880You can just finished it.
00:42:09.940 -->
00:42:12.120Like finished my last contract.
00:42:12.180 -->
00:42:12.840What are you writing?
00:42:12.920 -->
00:42:14.240I just finished my last contract.
00:42:14.240 -->
00:42:17.380I'm looking to move to AI programming.
00:42:17.380 -->
00:42:19.020okay.
00:42:19.280 -->
00:42:19.960Anyone interested?
00:42:20.260 -->
00:42:21.200So what do we get?
00:42:22.580 -->
00:42:24.580what are we going to get?
00:42:25.020 -->
00:42:26.920So I just finished my last contract.
00:42:27.100 -->
00:42:28.340This is what, this is the input.
00:42:28.560 -->
00:42:30.820I'm looking to move on to AI programming.
00:42:30.820 -->
00:42:33.980Anyone interested in someone who lives every day is day one.
00:42:34.060 -->
00:42:35.060Remember that like LinkedIn?
00:42:35.260 -->
00:42:35.660Oh yeah.
00:42:36.180 -->
00:42:36.400Yeah.
00:42:36.500 -->
00:42:37.700So here's, here's what we get.
00:42:38.000 -->
00:42:39.740Hashtag new beginnings, rocket ship pipe.
00:42:40.000 -->
00:42:43.380I'm thrilled to share that I'm officially wrapping up my last contract.
00:42:43.500 -->
00:42:51.160It's been an incredible journey, but I'm even more excited that for the next chapter, diving deeper into the world of AI programming, robot star emoji.
00:42:51.320 -->
00:42:55.600I'm looking for the next challenge with a team that values growth and innovation.
00:42:55.600 -->
00:43:01.400I'm someone who brings that day one mentality to everything I do every single day, hockey stick growth emoji.
00:43:01.560 -->
00:43:05.640If you're looking for a passionate developer, ready to push the boundaries of AI.
00:43:05.760 -->
00:43:06.400Let's connect.
00:43:06.540 -->
00:43:06.940Handshake.
00:43:07.200 -->
00:43:07.820Hashtag AI.
00:43:08.140 -->
00:43:08.880Hashtag machine learning.
00:43:09.020 -->
00:43:09.340So on.
00:43:09.400 -->
00:43:09.740So on.
00:43:09.980 -->
00:43:10.720That's funny.
00:43:10.980 -->
00:43:11.860That's pretty good, right?
00:43:12.120 -->
00:43:13.000You know, it's even better.
00:43:13.340 -->
00:43:13.520What?
00:43:13.740 -->
00:43:14.960You can type other stuff in here.
00:43:14.980 -->
00:43:15.860That's not in the list.
00:43:16.200 -->
00:43:16.740AI bro.
00:43:17.080 -->
00:43:17.420Custom.
00:43:17.780 -->
00:43:19.680Just sunset in my last gig rocket ship.
00:43:19.800 -->
00:43:22.760Ready to pivot into AI and scale some world changing models.
00:43:22.760 -->
00:43:25.520Who wants a builder who stays hungry and treats every day?
00:43:25.520 -->
00:43:29.740Like day one, let's disrupt robot emoji, fire emoji.
00:43:30.100 -->
00:43:31.260Hashtag built in public.
00:43:32.060 -->
00:43:32.400Okay.
00:43:32.560 -->
00:43:34.860So go back to the LinkedIn one though.
00:43:35.140 -->
00:43:35.640Hold on.
00:43:35.680 -->
00:43:35.960Hold on.
00:43:36.020 -->
00:43:36.340Hold on.
00:43:36.600 -->
00:43:37.120You got more?
00:43:37.440 -->
00:43:37.920Cobalt.
00:43:38.260 -->
00:43:38.880Cobalt programmer.
00:43:39.940 -->
00:43:41.420Oh my God.
00:43:41.940 -->
00:43:46.060It wrote a program that stated this.
00:43:46.640 -->
00:43:48.440It's like basically like printed.
00:43:48.620 -->
00:43:49.140Hello world.
00:43:49.600 -->
00:43:52.960To say the display day as mindset.
00:43:53.200 -->
00:43:53.660Question mark.
00:43:53.660 -->
00:43:54.700Stop running.
00:43:54.860 -->
00:43:56.320Oh, would you look at?
00:43:56.860 -->
00:43:59.040That was a little cat.
00:43:59.460 -->
00:44:01.360I has finished my last job.
00:44:02.360 -->
00:44:04.560Now I wants to do AI codes.
00:44:04.880 -->
00:44:07.040Who wants a kitten who lives every day?
00:44:07.120 -->
00:44:07.960Like day one.
00:44:08.100 -->
00:44:09.960You want me to go back to LinkedIn one?
00:44:10.120 -->
00:44:11.000I'm getting distracted.
00:44:11.180 -->
00:44:11.680I'm sorry.
00:44:11.780 -->
00:44:12.120I apologize.
00:44:12.180 -->
00:44:13.900Oh, and in the English, just type.
00:44:13.980 -->
00:44:14.620I'm a programmer.
00:44:14.900 -->
00:44:15.600This is pretty good.
00:44:15.840 -->
00:44:21.420I'm a passionate software engineer dedicated to building scalable solutions and solving complex problems through code.
00:44:21.640 -->
00:44:21.920Okay.
00:44:22.040 -->
00:44:23.280But what if you saw that?
00:44:23.280 -->
00:44:26.640So do that, like flip back and forth, like the little button in the middle.
00:44:26.960 -->
00:44:28.000Oh, I see.
00:44:28.320 -->
00:44:29.760So that translates.
00:44:30.000 -->
00:44:30.320I do.
00:44:30.460 -->
00:44:31.440I write code for a living.
00:44:31.600 -->
00:44:39.440I spend my days trying to fix things that shouldn't be broken in the first place and make sure the whole thing doesn't crash when more than 10 people use it.
00:44:41.480 -->
00:44:43.980That round tripping is incredible.
00:44:44.660 -->
00:44:45.700That is incredible.
00:44:45.700 -->
00:44:46.860Yeah, we did that.
00:44:47.300 -->
00:44:51.680My daughter and I did that with a few job descriptions and round tripped a few times.
00:44:51.880 -->
00:44:54.940And it's, it's, you get some crazy things.
00:44:56.020 -->
00:44:59.040Kind of want to put my LinkedIn page in here and see what happens.
00:44:59.200 -->
00:44:59.520Just see.
00:45:01.120 -->
00:45:01.940But yeah.
00:45:01.940 -->
00:45:10.120Anyway, I actually think it might be a useful tool for like, you know, depending on how brain dead you think your hiring manager is.
00:45:10.440 -->
00:45:10.600Yeah.
00:45:10.720 -->
00:45:15.680Or you could just de-buzzword it, put in what you see and then see, translate that to English.
00:45:16.300 -->
00:45:16.740Yeah.
00:45:17.140 -->
00:45:18.920Anyway, well done, Kaggy team.
00:45:18.980 -->
00:45:19.420That's awesome.
00:45:20.160 -->
00:45:21.140Cobalt is nice.
00:45:21.140 -->
00:45:21.700Yeah.
00:45:21.880 -->
00:45:22.280All right.
00:45:22.340 -->
00:45:28.040I know folks, we went a little bit long in this one, but the whole astral thing, I think, deserves some, some conversation around it.
00:45:28.380 -->
00:45:28.700Yeah.
00:45:29.340 -->
00:45:29.520Yeah.
00:45:29.720 -->
00:45:30.040We'll see.
00:45:30.260 -->
00:45:30.520We'll see.
00:45:30.620 -->
00:45:31.360Thanks for being here, everyone.
00:45:31.600 -->
00:45:31.960See you later.
00:45:32.200 -->
00:45:32.500Bye, Brian.