WEBVTT

00:00:00.000 --> 00:00:05.020
Hello and welcome to Python Bytes, where we deliver Python news and headlines directly to your earbuds.

00:00:05.380 --> 00:00:11.260
This is episode 474, recorded March 23rd, 2026. I'm Michael Kennedy.

00:00:11.560 --> 00:00:12.440
And I'm Brian Okken.

00:00:12.700 --> 00:00:20.060
This 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.320
Check them out. We have a lot of stuff on testing, a lot of stuff on Python.

00:00:23.680 --> 00:00:25.900
Can you imagine, Brian? That's what we're working on.

00:00:26.020 --> 00:00:28.760
I'm actually working on a brand new course. I'm super excited about it.

00:00:28.760 --> 00:00:31.580
It's going to be a little bit different than the ones I've done before.

00:00:31.760 --> 00:00:34.640
So it's going to be fun. Look for that in like two weeks.

00:00:34.980 --> 00:00:46.740
Now, 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.240
Extra info to make it more useful.

00:00:49.880 --> 00:00:53.280
Background info if you don't know something about a topic we talked about and so on.

00:00:53.540 --> 00:00:56.560
So that is subscribe to the newsletter, pythonbytes.fm.

00:00:56.560 --> 00:01:00.220
Click newsletter. Put in your info and then you will be subscribed to the newsletter.

00:01:00.560 --> 00:01:05.080
And 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.620
We just send you stuff about the show and other things going on with us.

00:01:09.060 --> 00:01:13.080
Wait, if it's them and me and you, is that three parties?

00:01:13.080 --> 00:01:15.920
No, we're both in the same party.

00:01:16.120 --> 00:01:16.940
Yeah, we're in the same party.

00:01:17.640 --> 00:01:20.540
It's a star party. I would say it's a star party. Don't you think?

00:01:20.900 --> 00:01:26.040
Yeah. So I want to kick this off with a little talk about Starlet.

00:01:26.040 --> 00:01:32.200
Starlette is like 12,000 stars.

00:01:32.660 --> 00:01:38.240
But 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.200
It's because this is what FastAPI is built on top of.

00:01:41.420 --> 00:01:44.540
But the exciting news is that Starlette is 1.0.

00:01:44.800 --> 00:01:46.180
It's no longer zero ver.

00:01:46.320 --> 00:01:47.820
So congratulations, Starlet.

00:01:47.820 --> 00:01:50.480
I was looking at the release notes.

00:01:50.800 --> 00:02:00.420
The 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.680
And 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.240
And 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.400
However, it's mostly a stability and versioning milestone.

00:02:24.420 --> 00:02:32.860
We 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.260
But, so it's not, not intent, not necessary.

00:02:36.780 --> 00:02:38.640
The intent isn't a interface break.

00:02:38.640 --> 00:02:43.560
However, if you were relying on deprecated features, you, you, you might break you.

00:02:43.680 --> 00:02:44.820
So definitely test.

00:02:44.820 --> 00:02:52.600
The, 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.260
So if we, you know, Starlet's awesome.

00:02:54.260 --> 00:02:59.800
And 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.840
It's the little ASCII framework.

00:03:01.840 --> 00:03:03.840
So it's like whiskey, but asynchronous.

00:03:04.960 --> 00:03:06.340
And it's awesome.

00:03:06.540 --> 00:03:09.000
But there's a, there's been some cool changes.

00:03:09.000 --> 00:03:14.520
One 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.180
It says, oh, and Sebastian, Starlette is now 1.0.

00:03:21.300 --> 00:03:23.400
So now FastAPI 1.0.

00:03:23.640 --> 00:03:25.940
So FastAPI is still 0ver as well.

00:03:26.300 --> 00:03:29.260
And, which also we've razzed him before also.

00:03:29.660 --> 00:03:33.920
I think it's high time that we get a 1.0 release of FastAPI maybe.

00:03:33.920 --> 00:03:40.220
I did want to bring up, I actually learned about this by looking at Simon Wilson's blog.

00:03:41.080 --> 00:03:45.820
And he is, he noted that also that Starlette 1.0 is out.

00:03:46.840 --> 00:03:53.920
And 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.140
And 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.300
Because it's a new release.

00:04:01.700 --> 00:04:03.800
So how, how to deal with that.

00:04:03.920 --> 00:04:05.960
So I'm not going to get into that article too much.

00:04:06.040 --> 00:04:17.340
What 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.940
ways to do async context, there's an async context manager.

00:04:21.940 --> 00:04:29.020
So 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.580
But 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.480
And 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.740
So interesting, interesting that that model gets around.

00:04:56.080 --> 00:04:58.880
So, but yeah, the yield is, is quite interesting.

00:04:59.200 --> 00:05:01.820
It's a bit mind bending, but it works well.

00:05:01.980 --> 00:05:02.500
This is awesome.

00:05:02.700 --> 00:05:10.140
You 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.720
So good, good deal.

00:05:12.080 --> 00:05:13.580
Sebastian, has it already shipped?

00:05:13.740 --> 00:05:14.480
Where is 1.0?

00:05:14.520 --> 00:05:14.980
What's going on?

00:05:15.500 --> 00:05:15.700
Yeah.

00:05:16.400 --> 00:05:17.020
That's cool.

00:05:17.300 --> 00:05:19.140
very nice one.

00:05:19.320 --> 00:05:28.200
I want to switch things over and talk about the news du jour astral to join open AI.

00:05:28.560 --> 00:05:31.180
I don't know if you all have heard this, but big news.

00:05:31.360 --> 00:05:36.440
It's certainly something that has set the internet, the Python internet on fire.

00:05:36.560 --> 00:05:38.940
First of all, I would like to take a moment.

00:05:38.940 --> 00:05:41.840
And, and well, first of all, thank you, John Hagen for sending this in.

00:05:41.840 --> 00:05:46.540
It was news to me when he sent it in about 10 minutes later, everything exploded.

00:05:46.880 --> 00:05:50.820
And, obviously it's, it's come to us from many directions, but thanks, John.

00:05:50.960 --> 00:05:54.980
And I want to take a minute and say, congratulations, Charlie.

00:05:55.500 --> 00:05:56.800
Congratulations, astral team.

00:05:56.920 --> 00:06:00.760
They, they really stepped up and built something incredible for Python tooling.

00:06:00.760 --> 00:06:04.160
And they were working for different ways to make this a business.

00:06:04.300 --> 00:06:09.620
This 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.480
Now 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.020
So there's, there's, we don't know.

00:06:20.080 --> 00:06:22.860
There's a couple of interesting, a couple of interesting things.

00:06:22.940 --> 00:06:26.220
I'm going to link to the blog posts from Charlie.

00:06:26.540 --> 00:06:31.340
I think there's basically, it says the team is moving to open AI.

00:06:31.540 --> 00:06:33.300
The projects are moving to open AI.

00:06:33.520 --> 00:06:37.500
So why let's start with why, why does open AI want them?

00:06:37.580 --> 00:06:39.560
I don't know exactly.

00:06:39.560 --> 00:06:49.480
I 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.400
And to be clear, they're joining the codex team.

00:06:52.400 --> 00:06:55.560
So the agentic coding tools team of open AI, right?

00:06:55.560 --> 00:07:02.940
So rough and uv are there as really awesome tools for codex to install things, to validate.

00:07:03.140 --> 00:07:06.280
I think actually maybe the most important could be ty.

00:07:06.280 --> 00:07:11.460
So ty, we've talked about ty before, which is their language server plus type checker.

00:07:11.520 --> 00:07:16.740
And 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.120
Like one of the things that drives me crazy, I love cloud 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.380
And it does not understand the code base really as a whole.

00:07:31.500 --> 00:07:35.860
It 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.640
It's just like grepping and searching constantly.

00:07:38.800 --> 00:07:40.120
Like, why do you have to grep?

00:07:40.200 --> 00:07:44.140
Can't you just use an abstract to text tree and just know the answer instantly?

00:07:44.180 --> 00:07:49.860
So if codex deeply took ty in, it could know the answer instantly.

00:07:50.220 --> 00:07:50.400
Right.

00:07:50.480 --> 00:07:51.020
You know what I mean?

00:07:51.420 --> 00:07:53.340
In like, I truly understand the project.

00:07:53.500 --> 00:07:58.260
It'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.600
This is an interesting take.

00:07:59.600 --> 00:08:10.360
Cause 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.420
And, 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.280
Yeah, exactly.

00:08:19.400 --> 00:08:22.520
It got kicked back a few years and work away back.

00:08:23.000 --> 00:08:23.440
And tie it.

00:08:23.620 --> 00:08:28.420
And ty has the potential to, to be as good or better than the Microsoft one.

00:08:28.420 --> 00:08:29.340
So interesting.

00:08:29.340 --> 00:08:29.900
I think it's better.

00:08:30.040 --> 00:08:30.140
Yeah.

00:08:30.160 --> 00:08:30.660
I think it's better.

00:08:30.760 --> 00:08:33.820
I would say Powerfly and ty are, are sort of cutting edge right now.

00:08:33.860 --> 00:08:38.420
And certainly I'm, I'm using ty and, and my VS Code like things.

00:08:38.660 --> 00:08:38.920
Okay.

00:08:39.120 --> 00:08:52.340
So 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.320
Like they're just open source.

00:08:54.400 --> 00:08:55.180
They're on GitHub.

00:08:55.180 --> 00:08:59.600
So there's nothing preventing codex from just going, we're going all in on ty.

00:08:59.840 --> 00:09:01.840
We're going to contribute some stuff back to ty.

00:09:02.300 --> 00:09:08.020
We'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.580
And they could have done that with no work, with no people, right?

00:09:11.680 --> 00:09:14.320
For no money, no acquisitions, no legal work.

00:09:14.560 --> 00:09:18.000
So the question is what else is going on here, right?

00:09:18.340 --> 00:09:21.380
Well, you got a handful of awesome engineers you just collected.

00:09:22.040 --> 00:09:22.520
Exactly.

00:09:22.520 --> 00:09:27.800
So is this an acquiring for technology or is this acquiring for AccuHire?

00:09:28.680 --> 00:09:36.320
And 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.940
This is my speculation, right?

00:09:37.940 --> 00:09:39.460
Or whatever it is that they're doing there, right?

00:09:39.680 --> 00:09:41.900
So I don't exactly know where it's going to go.

00:09:42.000 --> 00:09:46.060
I do think that this probably means the death of pyx.

00:09:46.060 --> 00:09:50.440
So pyx, I had Charlie on the show and...

00:09:50.440 --> 00:09:51.860
I kind of forgot about it, actually.

00:09:52.000 --> 00:09:52.140
Yeah.

00:09:52.640 --> 00:09:59.240
PYX, it's the safe enterprise packaging solution that front ends PyPI.

00:09:59.580 --> 00:10:04.580
It's not a separate package warehouse or place, right?

00:10:04.800 --> 00:10:07.640
It's a front end to PyPI, right?

00:10:07.640 --> 00:10:12.960
So 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.620
That kind of thing.

00:10:13.620 --> 00:10:20.440
That 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.580
So people have thoughts here, very relevant.

00:10:23.820 --> 00:10:28.080
Simon Wilson has been writing so much about all of this AI stuff in the world.

00:10:28.080 --> 00:10:32.340
So he obviously, as a Python expert, has deep thoughts on this.

00:10:32.600 --> 00:10:40.620
And 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.160
Nobody mentions pyx at all.

00:10:43.360 --> 00:10:47.520
In other words, those letters do not appear in the announcements, whereas the other tools do.

00:10:47.640 --> 00:10:48.960
So that's notable, right?

00:10:49.040 --> 00:10:52.580
So you can check out Simon Wilson's thoughts on this as well.

00:10:52.820 --> 00:10:55.580
He's got a pretty balanced view of it.

00:10:55.580 --> 00:10:57.760
It's not completely like, oh, this is going to be amazing.

00:10:57.760 --> 00:10:59.940
But he has a lot of different thoughts on it.

00:11:00.220 --> 00:11:05.800
If you look at discuss.python.org, the thoughts are, well, the thoughts are strong.

00:11:06.120 --> 00:11:08.520
They're not necessarily, I don't know, it's positive.

00:11:09.000 --> 00:11:19.680
Bright 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.800
For example, what happens?

00:11:21.100 --> 00:11:25.080
One 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.460
So there's the, oh, we can always fork it.

00:11:27.460 --> 00:11:28.220
Take, right?

00:11:28.460 --> 00:11:29.240
Which is true.

00:11:29.400 --> 00:11:34.600
But when there's infrastructure and build tools and stuff happening on the backend.

00:11:34.900 --> 00:11:35.860
I didn't think about that.

00:11:35.960 --> 00:11:36.080
Yeah.

00:11:36.300 --> 00:11:41.020
Then I forked it and it works fine up to Python 3.14 and it never works again.

00:11:41.100 --> 00:11:41.600
You know what I mean?

00:11:41.840 --> 00:11:47.780
And 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.080
They have to do some tweaks to make it work weirdly.

00:11:50.080 --> 00:11:56.780
So 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.800
Like 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.040
Right.

00:12:05.040 --> 00:12:09.380
So Brett's actually talks a lot about that and there's some interesting things here.

00:12:09.660 --> 00:12:13.680
There are not as many incredibly positive bits of feedback here.

00:12:14.220 --> 00:12:15.240
There's a few, right?

00:12:15.320 --> 00:12:16.860
Like Astral have earned a lot of trust.

00:12:17.060 --> 00:12:22.300
As 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.400
It's probably even good news.

00:12:23.740 --> 00:12:24.540
So there's that.

00:12:24.540 --> 00:12:33.320
Simon points out that like technically codecs 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.140
So that could be like a bad lever.

00:12:36.000 --> 00:12:37.760
Mark says, hey, let's not jump to conclusions.

00:12:38.480 --> 00:12:38.920
Yeah.

00:12:39.100 --> 00:12:44.360
I'll tell you what the Twitter, the X thread is more serious.

00:12:44.860 --> 00:12:49.560
But there's a pretty deep conversation here on discuss.python.org.

00:12:49.620 --> 00:12:51.280
It also was covered on Ars Technica.

00:12:51.280 --> 00:12:53.120
You go into the comments here.

00:12:53.360 --> 00:12:54.480
I don't know how many comments there are.

00:12:54.620 --> 00:12:55.420
Do I need to refresh it?

00:12:55.540 --> 00:13:01.340
It's only 48, but this is probably the most concerned one.

00:13:01.740 --> 00:13:04.380
Like, oh joy, I'm boarding the Titanic, dot, dot, dot.

00:13:05.100 --> 00:13:05.300
Yeah.

00:13:06.240 --> 00:13:10.160
Talk Python did get a shout out for the pyx angle, which is fun.

00:13:11.180 --> 00:13:12.080
But yeah, I don't know.

00:13:12.400 --> 00:13:13.380
I'm going to go ahead, Brian.

00:13:13.580 --> 00:13:17.960
I want to be positive, but I got to say my first reaction was nuts.

00:13:18.260 --> 00:13:19.200
This is not good.

00:13:19.200 --> 00:13:21.340
But so I don't know.

00:13:21.960 --> 00:13:29.380
I 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.040
You know what?

00:13:31.120 --> 00:13:37.620
I 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.760
But it was the finances were bad.

00:13:40.080 --> 00:13:41.580
And it was like they need saving.

00:13:41.740 --> 00:13:46.140
So 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.280
It was like, or they kind of, you know what I mean?

00:13:48.320 --> 00:13:53.100
Like it was, that was the, so in a sense, it's GitHub is still going pretty strong.

00:13:53.200 --> 00:13:55.520
So it's better than it not being there, but I don't know.

00:13:55.660 --> 00:13:56.400
But I agree with you.

00:13:56.460 --> 00:13:56.600
Okay.

00:13:56.600 --> 00:13:57.160
Back to the topic.

00:13:57.260 --> 00:14:01.620
So with this, I trust Charlie and the Astral team.

00:14:01.880 --> 00:14:03.460
I think their heart is in the right place.

00:14:03.780 --> 00:14:07.680
And to be clear, it says they're still working on the three tools that were not pyx.

00:14:07.680 --> 00:14:15.540
That 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.700
It could be totally open.

00:14:17.020 --> 00:14:22.980
One 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.400
We just need to like take Python build standalone inside of Python.

00:14:27.540 --> 00:14:28.940
Like, why is this an external thing?

00:14:29.060 --> 00:14:32.540
Why was a random dude maintaining it before Astral took it over?

00:14:32.900 --> 00:14:33.960
You know, that was a lot of work.

00:14:34.060 --> 00:14:35.700
We should, this is what we do.

00:14:35.700 --> 00:14:38.500
So it could be, there's a lot of things that made.

00:14:38.880 --> 00:14:41.440
That would totally make sense to be under the PSF umbrella.

00:14:41.580 --> 00:14:41.780
Yeah.

00:14:41.880 --> 00:14:45.880
Like, why do we have to keep patching every release of Python to make Python build standalone work?

00:14:46.140 --> 00:14:48.360
Can we just upstream those fixes and just make that Python?

00:14:48.740 --> 00:14:48.960
Yes.

00:14:49.080 --> 00:14:49.940
That would be a good outcome.

00:14:50.260 --> 00:14:56.140
Me 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.560
Yeah.

00:14:57.020 --> 00:14:57.460
100%.

00:14:57.460 --> 00:15:00.660
But Brett was sort of saying some things along those lines.

00:15:00.660 --> 00:15:07.980
if 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.220
I don't know why they didn't.

00:15:09.380 --> 00:15:12.500
I mean, you look at, you look at the comments, it's like, well, we're too busy.

00:15:12.600 --> 00:15:14.840
Like, this is like a volunteer thing for Pip.

00:15:14.840 --> 00:15:24.340
And 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.580
If you actually fund work on an open source problem.

00:15:27.580 --> 00:15:27.940
Right.

00:15:28.000 --> 00:15:29.700
But they didn't, it wasn't funded on Pip.

00:15:29.760 --> 00:15:35.180
And 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.960
Cause it's not all just fast because of rust, although it is rust.

00:15:39.100 --> 00:15:43.960
It'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.220
Right.

00:15:44.220 --> 00:15:46.740
So those could easily be written back.

00:15:46.980 --> 00:15:52.360
Like 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.560
Yeah.

00:15:52.620 --> 00:15:55.800
I just say, Hey, look, you pin pip to what it is now.

00:15:55.800 --> 00:15:57.720
And we're going to get a new, better Pip.

00:15:57.980 --> 00:15:58.160
Yeah.

00:15:58.160 --> 00:16:00.680
If you need old Pip, use old Pip, like pip dash old.

00:16:00.780 --> 00:16:01.400
I don't know, whatever.

00:16:01.740 --> 00:16:09.580
So 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.960
Yeah.

00:16:10.540 --> 00:16:10.760
Right.

00:16:10.920 --> 00:16:14.120
So like, for example, the other thing I said is like, Hey, that ty.

00:16:14.380 --> 00:16:15.480
And what did I say?

00:16:15.540 --> 00:16:17.140
A project from meta, right?

00:16:17.180 --> 00:16:19.900
It wasn't a other open source project that was a competitor to ty.

00:16:20.120 --> 00:16:23.320
It was a sort of a similar type of company somewhat.

00:16:23.660 --> 00:16:27.660
Henry brings up a great point comparing pip and uv.

00:16:28.200 --> 00:16:30.060
UV has paid developers, pip does not.

00:16:31.580 --> 00:16:32.240
Yes, absolutely.

00:16:32.460 --> 00:16:33.680
A hundred percent Henry.

00:16:33.880 --> 00:16:38.100
And Henry had a bunch of great comments and thoughts in that discuss thread as well.

00:16:38.720 --> 00:16:38.900
Yeah.

00:16:38.900 --> 00:16:47.860
I 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.200
Look, and I just want to put this out here.

00:16:51.240 --> 00:16:51.740
I do.

00:16:51.740 --> 00:16:58.360
I 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.820
They've given us something and they haven't taken hardly anything from any of us.

00:17:03.900 --> 00:17:05.520
And what they've shown is really awesome.

00:17:05.520 --> 00:17:06.860
And we've all enjoyed the tools.

00:17:07.020 --> 00:17:10.540
And 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.440
So 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.060
And 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.100
Unless you're already rich.

00:17:27.280 --> 00:17:27.820
Really rich.

00:17:28.120 --> 00:17:30.760
Well, there's also a couple of other aspects.

00:17:31.320 --> 00:17:34.620
There's investors already in Astral.

00:17:34.620 --> 00:17:39.160
And they have a non-zero say in what happens.

00:17:40.300 --> 00:17:42.480
And then there's also the...

00:17:42.480 --> 00:17:45.860
There have been comments of, well, it's open source, so you can just fork it.

00:17:46.020 --> 00:17:48.940
That's not trivial to fork a large project.

00:17:49.320 --> 00:17:49.500
Yeah.

00:17:49.700 --> 00:17:54.800
I 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.240
There's something like 47 non-Astral employee contributors who have done five or more contributions to uv.

00:18:03.760 --> 00:18:04.160
Yeah.

00:18:04.160 --> 00:18:05.380
I mean, it's definitely doable.

00:18:05.580 --> 00:18:09.500
It's just to fork it and get it to work once is one thing.

00:18:09.740 --> 00:18:13.140
And then maintaining it for a long time is a completely different story.

00:18:13.340 --> 00:18:13.420
Yeah.

00:18:13.580 --> 00:18:16.260
And I mean, no new features.

00:18:16.400 --> 00:18:18.800
It just keeps doing what it does now, which would still be awesome.

00:18:19.120 --> 00:18:27.180
But 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.020
All right.

00:18:28.320 --> 00:18:30.400
Enough talking about Astral.

00:18:30.500 --> 00:18:32.500
You want to talk about Astral and stuff?

00:18:32.500 --> 00:18:32.800
Yeah.

00:18:32.800 --> 00:18:36.460
Let's stop talking about Astral and talk about uv.

00:18:39.040 --> 00:18:39.600
Actually.

00:18:39.600 --> 00:18:43.780
It's funny, but I am not kidding.

00:18:44.320 --> 00:18:46.680
So uv has a new release.

00:18:47.020 --> 00:18:49.780
And there's a new feature that I think is interesting.

00:18:49.780 --> 00:18:53.040
That's kind of a secret preview feature.

00:18:53.040 --> 00:18:54.440
And that's uv audit.

00:18:54.440 --> 00:18:56.220
So that's what I want to talk about.

00:18:56.880 --> 00:19:04.620
And in the release on the 19th, we got a 0.10.12.

00:19:04.860 --> 00:19:08.160
We got uv audit is now as part of the CLI help.

00:19:08.260 --> 00:19:10.220
And this was submitted by Owen Lamont.

00:19:10.220 --> 00:19:11.880
So thanks for noticing this, Owen.

00:19:11.880 --> 00:19:13.240
And I'm pretty curious about.

00:19:13.560 --> 00:19:15.340
So I tried it out.

00:19:16.060 --> 00:19:19.920
And so you can do uv self-update and you can get it.

00:19:20.000 --> 00:19:21.500
And now you can use uv audit.

00:19:21.840 --> 00:19:23.600
But it's interesting.

00:19:23.740 --> 00:19:25.580
And there's also a link to the roadmap.

00:19:25.860 --> 00:19:27.580
So it looks like almost everything's done.

00:19:27.680 --> 00:19:30.220
There's some integrated tests that need to be done and whatever.

00:19:30.220 --> 00:19:33.560
So it looks like they're heading forward to try to have this in place.

00:19:33.900 --> 00:19:35.580
And it's pretty cool.

00:19:35.800 --> 00:19:41.360
So uv audit is a dependency checker really on your project.

00:19:41.920 --> 00:19:49.560
And 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.920
It found some security vulnerabilities in one of my projects.

00:19:55.140 --> 00:19:56.980
But it wasn't something I recognized.

00:19:56.980 --> 00:20:00.420
And so I looked at it.

00:20:00.420 --> 00:20:05.020
It was a dependency of a dependency of my test environment.

00:20:05.400 --> 00:20:12.980
And 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.280
And I didn't have that version.

00:20:15.460 --> 00:20:16.540
So what am I seeing?

00:20:16.660 --> 00:20:17.980
Why is there vulnerability there?

00:20:18.700 --> 00:20:25.440
One 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.200
So 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.040
It's also on all operating systems that you support and all Python versions.

00:20:44.040 --> 00:20:48.080
So that's a broad range of dependencies and versions.

00:20:48.480 --> 00:20:54.000
And what happened was my project supports 3.9 still, or it did.

00:20:54.200 --> 00:20:57.260
Wait, yeah, 3.10 is the lowest that I was supporting.

00:20:57.260 --> 00:21:09.700
And 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.200
In version 3.10, there's a file lock vulnerability that got fixed later.

00:21:16.420 --> 00:21:18.000
And they just went up new versions.

00:21:18.000 --> 00:21:21.160
So it's kind of a neat idea.

00:21:21.380 --> 00:21:31.160
I 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.260
Which, if you're doing a Python project that's usable, that's how it would work.

00:21:36.260 --> 00:21:40.340
Anyway, I'm excited to have this get in place.

00:21:40.600 --> 00:21:49.020
And 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.960
And make sure you have not any vulnerabilities on any of the Python versions that you're supporting.

00:21:55.240 --> 00:21:55.900
So that's cool.

00:21:55.900 --> 00:21:56.300
Yeah.

00:21:56.560 --> 00:21:58.400
When Owen said this, I thought, oh, this is awesome.

00:21:58.600 --> 00:22:05.920
Because I've been using pip audit for both my local dev, but also for our Docker deploys.

00:22:06.420 --> 00:22:11.920
So 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.760
And 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.260
And 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.680
I don't know, like crypto miners or whatever on my computer.

00:22:26.800 --> 00:22:30.080
It installs it into this ephemeral Docker container, right?

00:22:30.280 --> 00:22:32.280
Which is sweet, but it's kind of slowish.

00:22:32.700 --> 00:22:38.280
It adds like 10 seconds to the build time of what otherwise was seconds.

00:22:38.600 --> 00:22:39.080
A couple of seconds.

00:22:39.500 --> 00:22:41.840
Doubled the Docker build time, at least, I would say.

00:22:41.840 --> 00:22:46.680
So does pip audit must do something on the installed container?

00:22:46.760 --> 00:22:47.600
Packages or?

00:22:47.860 --> 00:22:48.460
Yeah, exactly.

00:22:48.760 --> 00:22:51.520
So what you do is you install it, then it looks at the virtual environment.

00:22:51.660 --> 00:22:54.980
So I have a Docker container I built, which is like the command I run.

00:22:55.060 --> 00:22:57.740
And so what it does is it has pip audit already installed.

00:22:57.880 --> 00:23:00.380
It maps in the requirements file.

00:23:00.800 --> 00:23:02.920
It pip, uv pip installs them quickly.

00:23:02.920 --> 00:23:04.680
And then it pip audits against them.

00:23:04.760 --> 00:23:05.200
You know what I mean?

00:23:05.420 --> 00:23:05.580
Yeah.

00:23:05.600 --> 00:23:07.060
And so I'm hoping that this would be great.

00:23:07.060 --> 00:23:10.880
And if you go to the bottom at the coming soon roadmap deal.

00:23:11.220 --> 00:23:11.500
Oh, yeah.

00:23:11.500 --> 00:23:11.820
Yeah.

00:23:12.420 --> 00:23:19.560
You'll see at the, one of the unfinished things is support locked hashed requirements.txt files.

00:23:19.720 --> 00:23:20.120
Yeah.

00:23:20.360 --> 00:23:21.680
Which is the way I've been doing it.

00:23:21.680 --> 00:23:27.280
I 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.660
Yeah.

00:23:27.660 --> 00:23:28.680
For non-packages.

00:23:28.820 --> 00:23:31.700
I like it for packages where it manages the piproject.tml.

00:23:31.840 --> 00:23:32.240
And there's like all that.

00:23:32.400 --> 00:23:35.140
But if I just have an app, I'd rather just have a requirements file.

00:23:35.400 --> 00:23:37.420
So I pip, uv pip compile that thing.

00:23:37.420 --> 00:23:39.580
But I can't uv audit it.

00:23:39.940 --> 00:23:40.700
I have to pip audit.

00:23:40.860 --> 00:23:41.500
So anyway.

00:23:41.900 --> 00:23:53.800
I'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.000
for requirements.txt-based projects, switching to PyProjectHمل so that I can get this.

00:23:59.060 --> 00:24:01.280
But if they, if it supported this also, that'd be cool.

00:24:01.280 --> 00:24:10.400
Yeah, 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.640
It's probably an hour of cloud code, I bet you.

00:24:12.920 --> 00:24:13.100
Anyway.

00:24:13.100 --> 00:24:13.700
Oh, wait a minute.

00:24:13.780 --> 00:24:16.160
Use converter to a PyProjectHمل and then write it.

00:24:16.300 --> 00:24:16.440
Yeah.

00:24:16.700 --> 00:24:16.820
So.

00:24:17.000 --> 00:24:17.560
Yeah, exactly.

00:24:17.840 --> 00:24:18.240
Exactly.

00:24:18.560 --> 00:24:18.820
Okay.

00:24:18.980 --> 00:24:20.480
So that looks really cool.

00:24:20.720 --> 00:24:25.360
I would actually like to switch over and talk about something that I thought was pretty interesting.

00:24:25.560 --> 00:24:26.840
And this is an article I wrote.

00:24:26.980 --> 00:24:28.900
It's not so much about the article itself.

00:24:28.900 --> 00:24:31.960
It's about what the article is covering thing.

00:24:32.080 --> 00:24:32.540
Go away.

00:24:32.820 --> 00:24:33.360
Here we go.

00:24:33.580 --> 00:24:40.380
So this is the articles entitled fire and forget or never with Python's asyncio.

00:24:40.540 --> 00:24:41.460
And so here's the deal.

00:24:41.460 --> 00:24:47.580
This is, there's a couple of tasks on our web apps that have long running things.

00:24:47.720 --> 00:24:49.660
So let me just give you one example.

00:24:49.960 --> 00:24:52.460
The one example is, and there's different ways to do this.

00:24:52.520 --> 00:24:55.060
One example is like, maybe I want to just send an email.

00:24:55.240 --> 00:24:58.100
Now send an email usually is quick, but sometimes it's really slow.

00:24:58.100 --> 00:25:04.740
And 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.940
Right.

00:25:05.020 --> 00:25:05.760
Say, Hey, you're in.

00:25:06.020 --> 00:25:10.940
So you could just say, start the send email async function and let it go.

00:25:11.100 --> 00:25:12.520
What are you going to do if it can't be sent?

00:25:12.580 --> 00:25:13.340
Like, I don't know.

00:25:13.380 --> 00:25:17.880
Like, 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.880
This email address was not found at this server or whatever.

00:25:20.880 --> 00:25:21.140
Right.

00:25:21.140 --> 00:25:29.380
It'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.700
Right.

00:25:29.940 --> 00:25:30.580
So why wait?

00:25:30.860 --> 00:25:31.720
So you just fire it off.

00:25:31.760 --> 00:25:33.600
Like, okay, that task goes.

00:25:33.640 --> 00:25:35.940
And then we tell them, Hey, welcome to your account or whatever.

00:25:36.060 --> 00:25:36.240
Right.

00:25:36.400 --> 00:25:37.440
Something along those lines.

00:25:37.580 --> 00:25:45.080
Another 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.960
In certain formats, really nice to get the, get them in and out.

00:25:48.040 --> 00:25:54.720
And, and the transcript generation stuff is always, it's always fraught, like with acronyms and stuff, right?

00:25:54.880 --> 00:26:05.960
Like 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.120
It's not capital P, lowercase Y, capital P, capital I.

00:26:09.240 --> 00:26:09.540
Right.

00:26:09.540 --> 00:26:13.980
And so there's like this automation that I run that fixes it really bad as guest names.

00:26:14.100 --> 00:26:15.400
It can wreck guest names.

00:26:15.400 --> 00:26:17.620
And sometimes it's no big deal, but sometimes it's bad enough.

00:26:17.720 --> 00:26:19.620
You're like, Oh, that's kind of offensive to the guests.

00:26:19.720 --> 00:26:21.960
Let's see if we can not do that to them, you know?

00:26:22.020 --> 00:26:32.240
And 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.500
separate 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.420
So fix it or Python byte slash whatever.

00:26:40.860 --> 00:26:43.960
And so there's this process that runs and fixes them.

00:26:44.040 --> 00:26:48.780
But as I discover new problems, I go back and retroactively fix the last 10 years.

00:26:48.780 --> 00:26:53.600
And that process takes forever in terms of web request time.

00:26:53.600 --> 00:26:53.900
Right.

00:26:54.120 --> 00:26:56.020
So I'll say there's an admin button.

00:26:56.100 --> 00:27:06.280
I 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.640
So that's like 20, 30 seconds if it fans out of a cross-processes.

00:27:09.840 --> 00:27:13.200
So 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.540
I want to just have it go awesome.

00:27:14.800 --> 00:27:15.240
We're working.

00:27:15.360 --> 00:27:19.820
And 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.140
Right.

00:27:20.140 --> 00:27:22.160
So that's a long, long way to set up this.

00:27:22.460 --> 00:27:27.340
And 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.220
It's an anti-pattern.

00:27:28.280 --> 00:27:30.120
I'm like, you shouldn't do it most of the time.

00:27:30.200 --> 00:27:31.760
But the alternative is what?

00:27:31.960 --> 00:27:35.220
Set up an entire separate Redis server with a messaging queue.

00:27:35.320 --> 00:27:41.580
Like 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.260
Anyway.

00:27:42.580 --> 00:27:43.620
So here's the news.

00:27:43.700 --> 00:27:44.660
Here's the story.

00:27:44.660 --> 00:27:48.480
Is that a lot of times you would write simple code like this.

00:27:48.480 --> 00:27:51.720
You 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.280
And then you can't just call async functions.

00:27:54.360 --> 00:27:55.340
You have to start them.

00:27:55.380 --> 00:27:55.540
Right.

00:27:55.580 --> 00:27:59.260
So you have to say asyncio create task, or you have to await it.

00:27:59.260 --> 00:28:01.760
Because if you don't create a task or await it, it just doesn't run.

00:28:01.840 --> 00:28:03.700
It's an unrun async coroutine.

00:28:03.820 --> 00:28:04.020
Right.

00:28:04.220 --> 00:28:05.040
So you got to await it.

00:28:05.040 --> 00:28:08.560
And up to Python 3.11, this code was fine.

00:28:08.680 --> 00:28:18.340
You 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.160
Well, then this has been this way since 3.6, maybe 3.5.

00:28:22.360 --> 00:28:22.540
Right.

00:28:22.580 --> 00:28:23.220
So that's a lot.

00:28:23.280 --> 00:28:28.280
It's like seven years, but now Python 3.12 onward, you can't do this anymore.

00:28:28.420 --> 00:28:36.940
If 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.260
And it might not even start.

00:28:38.260 --> 00:28:40.200
I wanted to put, I wanted to put that out there for people.

00:28:40.200 --> 00:28:43.780
Like, you know, if you have this type of code, you, you had better look at it.

00:28:43.940 --> 00:28:52.460
You 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.500
And that doesn't just apply to this pattern.

00:28:54.680 --> 00:29:05.540
Anything 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.940
Right.

00:29:06.060 --> 00:29:09.860
So if you look at the documentation or what is it?

00:29:10.000 --> 00:29:18.000
Create, 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.320
However, 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.000
That's new.

00:29:26.240 --> 00:29:28.080
So anyway, so what is the fix?

00:29:28.200 --> 00:29:31.760
You create this weird set that holds all running tasks that you're not tracking.

00:29:31.760 --> 00:29:37.780
You 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.540
And 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.620
So I don't know.

00:29:43.840 --> 00:29:48.660
Anyway, that could certainly be catching some people out in like super hard to debug race conditions.

00:29:48.660 --> 00:29:51.720
So 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.640
So that's that fire and forget.

00:29:53.820 --> 00:29:55.960
Maybe you might just forget what else we got.

00:29:56.200 --> 00:29:56.480
Extras.

00:29:57.100 --> 00:29:57.460
Yeah.

00:29:57.600 --> 00:29:57.720
Yeah.

00:29:57.720 --> 00:30:05.200
I 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.540
Normally we just kind of ignore it.

00:30:06.680 --> 00:30:06.900
Okay.

00:30:06.940 --> 00:30:11.740
So your solution, does it, does it still, does the task still stick around then?

00:30:11.800 --> 00:30:12.300
Or does this?

00:30:12.440 --> 00:30:12.700
Yes.

00:30:12.980 --> 00:30:13.200
Okay.

00:30:13.440 --> 00:30:20.000
So 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.700
You 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.780
Oh, so the garbage collector doesn't grab it.

00:30:30.980 --> 00:30:31.320
Okay.

00:30:31.480 --> 00:30:31.680
Yeah.

00:30:31.740 --> 00:30:34.340
You just need to upgrade your weak reference to a stronger.

00:30:34.700 --> 00:30:34.980
Okay.

00:30:35.340 --> 00:30:35.780
That works.

00:30:36.080 --> 00:30:36.200
Cool.

00:30:36.200 --> 00:30:37.080
Yeah, it works.

00:30:37.880 --> 00:30:39.240
It's, but it's not obvious.

00:30:39.240 --> 00:30:41.220
It's definitely not like, oh yeah, I know I had to do that.

00:30:41.420 --> 00:30:41.580
All right.

00:30:41.600 --> 00:30:41.960
Extras.

00:30:42.220 --> 00:30:42.780
What do we got?

00:30:43.140 --> 00:30:43.500
Extras.

00:30:43.660 --> 00:30:44.620
I just got a couple.

00:30:44.840 --> 00:30:45.480
Let's see.

00:30:45.560 --> 00:30:47.540
go over here.

00:30:47.760 --> 00:30:49.080
just a fun article.

00:30:49.080 --> 00:30:51.980
I didn't want to talk about it too much, but, I found it interesting.

00:30:51.980 --> 00:30:54.400
called, nobody gets permit.

00:30:54.680 --> 00:30:56.300
Nobody gets promoted for simplicity.

00:30:56.540 --> 00:30:59.240
and this is a blog by terrible.

00:30:59.380 --> 00:31:00.800
It's a terrible software blog.

00:31:00.900 --> 00:31:02.420
That's an awesome name for a blog.

00:31:02.920 --> 00:31:07.820
so, it, there's a quote from Ed, from Dykstra.

00:31:07.980 --> 00:31:13.180
Simplicity is a great virtue, but it requires hard work to achieve and education to appreciate.

00:31:13.180 --> 00:31:17.660
and to make what matters worse, complexity sales better.

00:31:17.660 --> 00:31:22.980
And, it's, it's just an interesting observation and I've observed it too.

00:31:23.100 --> 00:31:34.240
People, 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.280
pizza or something like that or a promotion, but it was their bugs that they were fixing.

00:31:38.280 --> 00:31:41.760
And the person that just didn't write the bugs in the first place won't get those.

00:31:41.940 --> 00:31:44.260
Anyway, just that person is not even that much of a hard worker.

00:31:44.360 --> 00:31:45.400
Look, they went home on time.

00:31:45.400 --> 00:31:46.300
I suck.

00:31:47.300 --> 00:31:54.480
I 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.340
If, 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.140
don't, don't reward your, agent just because it gave you volumes of code.

00:32:06.140 --> 00:32:08.500
It might be a simple solution.

00:32:08.740 --> 00:32:09.400
It might be easier.

00:32:09.660 --> 00:32:11.180
Anyway, set that aside.

00:32:11.260 --> 00:32:12.240
It's just interesting read.

00:32:12.240 --> 00:32:17.280
I've been working on over the weekend, catching up on, pytest check.

00:32:17.380 --> 00:32:28.820
I 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.800
That's awesome.

00:32:30.180 --> 00:32:32.000
I mean, it's a small project.

00:32:32.000 --> 00:32:39.680
So 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.680
So I'm, I'm glad that I'm, I finally get it in place.

00:32:42.680 --> 00:32:48.620
And 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.800
and, 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.320
so, 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.320
So yeah, I like it.

00:33:09.320 --> 00:33:09.720
That's cool.

00:33:09.980 --> 00:33:10.580
very nice.

00:33:10.580 --> 00:33:10.720
Yeah.

00:33:10.960 --> 00:33:11.920
That's my extra.

00:33:12.160 --> 00:33:12.760
All right.

00:33:12.980 --> 00:33:13.780
I got a few.

00:33:13.780 --> 00:33:14.440
I'll go quick though.

00:33:14.620 --> 00:33:21.020
So I ran across this project called turbo API as a riff on FastAPI.

00:33:21.180 --> 00:33:24.360
We started with starlet and FastAPI and here we are in extras with a bit more.

00:33:24.540 --> 00:33:26.840
So there's a couple of interesting things from this.

00:33:26.960 --> 00:33:38.400
This 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.900
Like you dress C++ zig, whatever this person likes it.

00:33:41.100 --> 00:33:44.680
I don't even know what zig codes look like, but it, you know, natively compiled code, right?

00:33:44.840 --> 00:33:45.560
Would it be faster?

00:33:45.720 --> 00:33:46.440
Would it be cool?

00:33:46.720 --> 00:33:50.080
Would it be like you could use the same decorator and the same model?

00:33:50.340 --> 00:33:52.120
technically doesn't use Pydantic.

00:33:52.240 --> 00:33:59.840
It 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.960
So on.

00:34:01.220 --> 00:34:02.480
So anyway, I thought this was cool.

00:34:02.600 --> 00:34:04.240
It's like this kind of Twitter thread.

00:34:04.360 --> 00:34:07.320
It got a lot of, it's got 325,000 views.

00:34:07.320 --> 00:34:08.700
So, Hey, it caught some attention.

00:34:08.820 --> 00:34:09.320
How about that?

00:34:09.560 --> 00:34:10.340
And I don't know.

00:34:10.400 --> 00:34:11.680
It, it was kind of interesting.

00:34:12.140 --> 00:34:18.500
I 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.040
So I wanted to throw that out there.

00:34:20.080 --> 00:34:22.080
It's, it's kind of popular now.

00:34:22.080 --> 00:34:23.880
It's got a lot of GitHub stars and so on.

00:34:24.120 --> 00:34:26.640
I'm not suggesting people use this over FastAPI.

00:34:26.900 --> 00:34:30.620
It'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.980
Anytime 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.480
So I'd follow a post.

00:34:41.580 --> 00:34:44.060
I learned a lot from the turbo PG benchmark mess.

00:34:46.280 --> 00:34:46.800
Interesting.

00:34:46.800 --> 00:34:54.780
Also, 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.320
I think this is, this is very interesting because a lot of the pushback to astral being acquired by open AI.

00:35:02.320 --> 00:35:04.980
Wasn't that we think open AI is going to be bad.

00:35:04.980 --> 00:35:06.740
It was, I hate AI.

00:35:06.740 --> 00:35:08.140
I hate open AI.

00:35:08.140 --> 00:35:09.620
And therefore I hate this.

00:35:09.880 --> 00:35:10.760
You know what I mean?

00:35:10.760 --> 00:35:14.540
And it wasn't an assessment of do I think this is better or worse for this project.

00:35:14.540 --> 00:35:17.320
It was just like, I hate them because they're AI.

00:35:17.320 --> 00:35:18.500
Cause I hate AI.

00:35:18.640 --> 00:35:20.800
And so there's this really interesting tension.

00:35:20.800 --> 00:35:25.640
And 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.740
I think that's pretty interesting.

00:35:27.000 --> 00:35:28.120
So anyway.

00:35:28.680 --> 00:35:29.280
Yeah.

00:35:29.280 --> 00:35:37.060
There'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.060
Check, check this out.

00:35:38.060 --> 00:35:49.680
And 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.020
And, and I totally concur on that.

00:35:52.020 --> 00:35:52.880
I agree with you on that.

00:35:53.080 --> 00:36:03.160
If, 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.440
but 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.360
But for example, in the, I think it was in the Ars Technica thing, literally one of the comments was, I hate open AI.

00:36:20.740 --> 00:36:21.800
This should have never happened.

00:36:21.900 --> 00:36:26.860
Or, 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.680
So I know you got some other extras, but I want to interrupt a little bit more.

00:36:31.100 --> 00:36:41.580
I 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.580
Yeah, exactly.

00:36:43.000 --> 00:36:46.660
performance metrics just to, or even just bad performance.

00:36:46.820 --> 00:36:48.040
They're not fake, but they're bad.

00:36:48.060 --> 00:36:50.040
so that, you know, to get people.

00:36:50.040 --> 00:36:56.000
And the other thing is, what do you think about like, you know, selling Python bytes to open AI?

00:36:56.860 --> 00:36:57.480
You know what?

00:36:57.540 --> 00:36:59.900
Hey, I love our listeners.

00:37:00.040 --> 00:37:05.580
I 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.140
All right.

00:37:06.380 --> 00:37:11.840
So, chances very, very low, really quick pyramid pyramid, the web framework.

00:37:11.840 --> 00:37:12.240
Yes.

00:37:12.540 --> 00:37:17.420
Pyramid, 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.080
Now you might think, Michael, why are you so psyched about this?

00:37:20.080 --> 00:37:23.040
Cause we're running it on court, async class, whatever, right?

00:37:23.120 --> 00:37:26.840
These days, this is the first actual release of pyramid.

00:37:26.860 --> 00:37:27.980
In five years.

00:37:28.200 --> 00:37:31.000
So I'm like, wait, there's a new version of it.

00:37:31.040 --> 00:37:31.380
What is that?

00:37:31.460 --> 00:37:32.260
What's going on here?

00:37:32.740 --> 00:37:36.660
Technically there was a release three years ago, but it was like a very minor thing.

00:37:36.780 --> 00:37:36.960
Okay.

00:37:36.960 --> 00:37:38.840
And so there's not a lot going on here.

00:37:39.560 --> 00:37:44.320
Basically setup tools had some issue with the way that it was managing packages.

00:37:44.640 --> 00:37:53.920
Like 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.640
So the thing actually pins the setup tools to a version that will work.

00:37:58.760 --> 00:38:01.240
But if you have something else that depends on setup tools, you can't use it.

00:38:01.320 --> 00:38:03.140
So it's always a bit of an issue.

00:38:03.260 --> 00:38:11.360
The other one is they literally, as part of this release added pyramid.acp exceptions.acp !imatpod exception.

00:38:11.800 --> 00:38:12.560
I love it.

00:38:12.800 --> 00:38:13.160
I love it.

00:38:13.560 --> 00:38:18.760
So anyway, that's, that's that, Vivaldi.

00:38:19.160 --> 00:38:20.600
We're both fans of Vivaldi.

00:38:20.680 --> 00:38:26.860
I 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.260
Just 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.620
People like that, like Arc browser a lot.

00:38:36.720 --> 00:38:40.760
And 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.360
You can't see all the Chrome around.

00:38:42.420 --> 00:38:44.140
It's like just sort of very minimal.

00:38:44.140 --> 00:38:47.760
You can like turn it into just like this, just the essence of the web.

00:38:47.760 --> 00:38:50.820
You can even auto hide your tabs, but it's, it's a bit too much for me.

00:38:50.900 --> 00:38:56.720
I 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.560
you can add a bunch of hotkeys that make this work better.

00:38:59.780 --> 00:39:05.700
For 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.420
But if it's hidden now, then how do you do that?

00:39:07.480 --> 00:39:11.220
So I had it a hotkey to like just copy whatever thing I am on.

00:39:11.220 --> 00:39:13.360
So it's kind of encourages you to be a little more hotkey driven.

00:39:13.460 --> 00:39:13.840
So that's fun.

00:39:14.060 --> 00:39:14.920
People should check that out.

00:39:15.040 --> 00:39:16.220
I saw you just turn that on Brian.

00:39:16.540 --> 00:39:17.300
This is the show.

00:39:17.660 --> 00:39:17.740
Yeah.

00:39:18.040 --> 00:39:18.240
Yeah.

00:39:18.320 --> 00:39:22.520
We'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.360
You just got to be the more mellow around the edges.

00:39:24.440 --> 00:39:27.340
If you get too quick, stuff pops over and covers the nav and that's kind of annoying.

00:39:27.560 --> 00:39:27.820
Yeah.

00:39:27.820 --> 00:39:34.160
When 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.480
So it didn't cover your elements, but whatever.

00:39:36.480 --> 00:39:48.240
One 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.780
so yeah.

00:39:50.000 --> 00:39:50.220
Yeah.

00:39:50.340 --> 00:39:50.540
Yeah.

00:39:50.600 --> 00:39:50.620
Yeah.

00:39:50.620 --> 00:39:50.720
Yeah.

00:39:50.880 --> 00:39:53.040
And certainly on like small laptop screens and stuff.

00:39:53.080 --> 00:39:53.660
It's super cool.

00:39:53.660 --> 00:39:54.100
Okay.

00:39:54.100 --> 00:39:54.420
Okay.

00:39:54.420 --> 00:40:05.680
A 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.580
that we write starts running, you know, not the framework stuff, but just that close.

00:40:09.580 --> 00:40:09.820
Right.

00:40:09.820 --> 00:40:17.540
So 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.080
I 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.040
Would it be a lot faster?

00:40:25.040 --> 00:40:25.580
I don't know.

00:40:25.640 --> 00:40:29.220
Well, there's a whole bunch of chameleon templates and only supports Jinja.

00:40:29.220 --> 00:40:33.640
So 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.260
So I did.

00:40:34.400 --> 00:40:37.900
So I added chameleon support to the Robin language so I could see if it was any better.

00:40:38.060 --> 00:40:40.440
turns out, no, not really.

00:40:40.560 --> 00:40:41.740
Was it really worth it actually?

00:40:41.940 --> 00:40:45.740
But now the world has this cool, chameleon Robin project.

00:40:45.740 --> 00:40:48.780
So, chameleon is a little bit more out there.

00:40:49.020 --> 00:40:50.980
And I was also playing around this week.

00:40:51.000 --> 00:40:52.300
I was trying out ideas this weekend.

00:40:52.300 --> 00:41:05.080
This 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.560
Cause it knows raw, the raw query language of your database and so on.

00:41:08.640 --> 00:41:15.480
I 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.040
Why not?

00:41:16.040 --> 00:41:16.500
Oh, wow.

00:41:16.740 --> 00:41:17.080
Yeah.

00:41:17.320 --> 00:41:17.720
Pretty sweet.

00:41:17.900 --> 00:41:20.400
Have you considered raw plus Marvel?

00:41:21.400 --> 00:41:22.220
No, I know.

00:41:22.220 --> 00:41:27.300
It'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.520
We got a joke though.

00:41:28.860 --> 00:41:31.840
And this one, this one comes to you, comes from you.

00:41:31.960 --> 00:41:34.120
This is a pretty, pretty good stuff.

00:41:34.720 --> 00:41:35.720
I love this.

00:41:35.940 --> 00:41:37.140
You want me to just see how my screen up here?

00:41:37.240 --> 00:41:38.460
I'm going to put, we're going to start.

00:41:38.720 --> 00:41:40.220
So, so set the stage for us.

00:41:40.220 --> 00:41:40.920
What is going on here?

00:41:40.920 --> 00:41:43.260
so do you, can you get the LinkedIn?

00:41:43.720 --> 00:41:44.080
Oh yeah.

00:41:44.180 --> 00:41:44.520
Oh yeah.

00:41:44.640 --> 00:41:48.640
So I just like, there's the normal, like Google translate.

00:41:49.000 --> 00:41:50.620
You just type in stuff or whatever.

00:41:50.760 --> 00:41:52.140
All your translate tools are type.

00:41:52.280 --> 00:41:53.060
It converts it.

00:41:53.300 --> 00:41:58.820
somebody on Kagi wrote a, LinkedIn speak converter.

00:41:59.080 --> 00:42:02.700
so you can convert English to, to LinkedIn or back.

00:42:02.700 --> 00:42:08.720
So 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.880
You can just finished it.

00:42:09.940 --> 00:42:12.120
Like finished my last contract.

00:42:12.180 --> 00:42:12.840
What are you writing?

00:42:12.920 --> 00:42:14.240
I just finished my last contract.

00:42:14.240 --> 00:42:17.380
I'm looking to move to AI programming.

00:42:17.380 --> 00:42:19.020
okay.

00:42:19.280 --> 00:42:19.960
Anyone interested?

00:42:20.260 --> 00:42:21.200
So what do we get?

00:42:22.580 --> 00:42:24.580
what are we going to get?

00:42:25.020 --> 00:42:26.920
So I just finished my last contract.

00:42:27.100 --> 00:42:28.340
This is what, this is the input.

00:42:28.560 --> 00:42:30.820
I'm looking to move on to AI programming.

00:42:30.820 --> 00:42:33.980
Anyone interested in someone who lives every day is day one.

00:42:34.060 --> 00:42:35.060
Remember that like LinkedIn?

00:42:35.260 --> 00:42:35.660
Oh yeah.

00:42:36.180 --> 00:42:36.400
Yeah.

00:42:36.500 --> 00:42:37.700
So here's, here's what we get.

00:42:38.000 --> 00:42:39.740
Hashtag new beginnings, rocket ship pipe.

00:42:40.000 --> 00:42:43.380
I'm thrilled to share that I'm officially wrapping up my last contract.

00:42:43.500 --> 00:42:51.160
It'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.600
I'm looking for the next challenge with a team that values growth and innovation.

00:42:55.600 --> 00:43:01.400
I'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.640
If you're looking for a passionate developer, ready to push the boundaries of AI.

00:43:05.760 --> 00:43:06.400
Let's connect.

00:43:06.540 --> 00:43:06.940
Handshake.

00:43:07.200 --> 00:43:07.820
Hashtag AI.

00:43:08.140 --> 00:43:08.880
Hashtag machine learning.

00:43:09.020 --> 00:43:09.340
So on.

00:43:09.400 --> 00:43:09.740
So on.

00:43:09.980 --> 00:43:10.720
That's funny.

00:43:10.980 --> 00:43:11.860
That's pretty good, right?

00:43:12.120 --> 00:43:13.000
You know, it's even better.

00:43:13.340 --> 00:43:13.520
What?

00:43:13.740 --> 00:43:14.960
You can type other stuff in here.

00:43:14.980 --> 00:43:15.860
That's not in the list.

00:43:16.200 --> 00:43:16.740
AI bro.

00:43:17.080 --> 00:43:17.420
Custom.

00:43:17.780 --> 00:43:19.680
Just sunset in my last gig rocket ship.

00:43:19.800 --> 00:43:22.760
Ready to pivot into AI and scale some world changing models.

00:43:22.760 --> 00:43:25.520
Who wants a builder who stays hungry and treats every day?

00:43:25.520 --> 00:43:29.740
Like day one, let's disrupt robot emoji, fire emoji.

00:43:30.100 --> 00:43:31.260
Hashtag built in public.

00:43:32.060 --> 00:43:32.400
Okay.

00:43:32.560 --> 00:43:34.860
So go back to the LinkedIn one though.

00:43:35.140 --> 00:43:35.640
Hold on.

00:43:35.680 --> 00:43:35.960
Hold on.

00:43:36.020 --> 00:43:36.340
Hold on.

00:43:36.600 --> 00:43:37.120
You got more?

00:43:37.440 --> 00:43:37.920
Cobalt.

00:43:38.260 --> 00:43:38.880
Cobalt programmer.

00:43:39.940 --> 00:43:41.420
Oh my God.

00:43:41.940 --> 00:43:46.060
It wrote a program that stated this.

00:43:46.640 --> 00:43:48.440
It's like basically like printed.

00:43:48.620 --> 00:43:49.140
Hello world.

00:43:49.600 --> 00:43:52.960
To say the display day as mindset.

00:43:53.200 --> 00:43:53.660
Question mark.

00:43:53.660 --> 00:43:54.700
Stop running.

00:43:54.860 --> 00:43:56.320
Oh, would you look at?

00:43:56.860 --> 00:43:59.040
That was a little cat.

00:43:59.460 --> 00:44:01.360
I has finished my last job.

00:44:02.360 --> 00:44:04.560
Now I wants to do AI codes.

00:44:04.880 --> 00:44:07.040
Who wants a kitten who lives every day?

00:44:07.120 --> 00:44:07.960
Like day one.

00:44:08.100 --> 00:44:09.960
You want me to go back to LinkedIn one?

00:44:10.120 --> 00:44:11.000
I'm getting distracted.

00:44:11.180 --> 00:44:11.680
I'm sorry.

00:44:11.780 --> 00:44:12.120
I apologize.

00:44:12.180 --> 00:44:13.900
Oh, and in the English, just type.

00:44:13.980 --> 00:44:14.620
I'm a programmer.

00:44:14.900 --> 00:44:15.600
This is pretty good.

00:44:15.840 --> 00:44:21.420
I'm a passionate software engineer dedicated to building scalable solutions and solving complex problems through code.

00:44:21.640 --> 00:44:21.920
Okay.

00:44:22.040 --> 00:44:23.280
But what if you saw that?

00:44:23.280 --> 00:44:26.640
So do that, like flip back and forth, like the little button in the middle.

00:44:26.960 --> 00:44:28.000
Oh, I see.

00:44:28.320 --> 00:44:29.760
So that translates.

00:44:30.000 --> 00:44:30.320
I do.

00:44:30.460 --> 00:44:31.440
I write code for a living.

00:44:31.600 --> 00:44:39.440
I 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.980
That round tripping is incredible.

00:44:44.660 --> 00:44:45.700
That is incredible.

00:44:45.700 --> 00:44:46.860
Yeah, we did that.

00:44:47.300 --> 00:44:51.680
My daughter and I did that with a few job descriptions and round tripped a few times.

00:44:51.880 --> 00:44:54.940
And it's, it's, you get some crazy things.

00:44:56.020 --> 00:44:59.040
Kind of want to put my LinkedIn page in here and see what happens.

00:44:59.200 --> 00:44:59.520
Just see.

00:45:01.120 --> 00:45:01.940
But yeah.

00:45:01.940 --> 00:45:10.120
Anyway, 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.600
Yeah.

00:45:10.720 --> 00:45:15.680
Or 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.740
Yeah.

00:45:17.140 --> 00:45:18.920
Anyway, well done, Kaggy team.

00:45:18.980 --> 00:45:19.420
That's awesome.

00:45:20.160 --> 00:45:21.140
Cobalt is nice.

00:45:21.140 --> 00:45:21.700
Yeah.

00:45:21.880 --> 00:45:22.280
All right.

00:45:22.340 --> 00:45:28.040
I 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.700
Yeah.

00:45:29.340 --> 00:45:29.520
Yeah.

00:45:29.720 --> 00:45:30.040
We'll see.

00:45:30.260 --> 00:45:30.520
We'll see.

00:45:30.620 --> 00:45:31.360
Thanks for being here, everyone.

00:45:31.600 --> 00:45:31.960
See you later.

00:45:32.200 --> 00:45:32.500
Bye, Brian.
