#474: Astral to join OpenAI
About the show
Sponsored by us! Support our work through:
- Our courses at Talk Python Training
- The Complete pytest Course
- Patreon Supporters Connect with the hosts
- Michael: @mkennedy@fosstodon.org / @mkennedy.codes (bsky)
- Brian: @brianokken@fosstodon.org / @brianokken.bsky.social
- Show: @pythonbytes@fosstodon.org / @pythonbytes.fm (bsky) Join us on YouTube at pythonbytes.fm/live to be part of the audience. Usually Monday at 11am PT. Older video versions available there too. Finally, if you want an artisanal, hand-crafted digest of every week of the show notes in email form? Add your name and email to our friends of the show list, we'll never share it.
Brian #1: Starlette 1.0.0
- As a reminder, Starlette is the foundation for FastAPI
- Starlette 1.0 is here! - fun blog post from Marcello Trylesinski
- “The changes in 1.0 were limited to removing old deprecated code that had been on the way out for years, along with a few bug fixes. From now on we'll follow SemVer strictly.”
- Fun comment in the “What’s next?” section:
- “Oh, and Sebastián, Starlette is now out of your way to release FastAPI 1.0. 😉”
- Related: Experimenting with Starlette 1.0 with Claude skills
- Simon Willison
- example of the new lifespan mechanism, very pytest fixture-like
@contextlib.asynccontextmanager async def lifespan(app): async with some_async_resource(): print("Run at startup!") yield print("Run on shutdown!") app = Starlette( routes=routes, lifespan=lifespan )
Michael #2: Astral to join OpenAI
- via John Hagen, thanks
- Astral has agreed to join OpenAI as part of the Codex team
- Congrats Charlie and team
- Seems like **Ruff** and uv play an important roll.
- Perhaps ty holds the most value to directly boost Codex (understanding codebases for the AI)
- All that said, these were open source so there is way more to the motivations than just using the tools.
- After joining the Codex team, we'll continue building our open source tools.
- Simon Willison has thoughts
- discuss.python.org also has thoughts
- The Ars Technica article has interesting comments too
- It’s probably the death pyx
- Simon points out “pyx is notably absent from both the Astral and OpenAI announcement posts.”
Brian #3: uv audit
- Submitted by Owen Lemont
- Pieces of
uv audithave been trickling in. uv 0.10.12 exposes it to the cli help - Here’s the roadmap for uv audit
- I tried it out on a package and found a security issue with a dependency
- not of the project, but of the testing dependencies
- but only if using Python < 3.10, even though I’m using 3.14
- Kinda cool
- Looks like it generates a uv.lock file, which includes dependencies for all project supported versions of Python and systems, which is a very thorough way to check for vulnerabilities.
- But also, maybe some pointers on how to fix the problem would be good. No
--fixyet.
Michael #4: Fire and forget (or never) with Python’s asyncio
- Python’s
asyncio.create_task()can silently garbage collect your fire-and-forget tasks starting in Python 3.12 - Formerly fine async code can now stop working, so heads up
- The fix? Use a set to upgrade to a strong ref and a callback to remove it
- Is there a chance of task-based memory leaks? Yeah, maybe.
Extras
Brian:
- Nobody Gets Promoted for Simplicity - interesting read and unfortunate truth in too many places.
- pytest-check - All built-in check helper functions in this list also accept an optional
xfailreason.- example:
check.equal(actual, expected, xfail="known issue #123") - Allows some checks to still cause a failure to happen because you no longer have to mark the whole test as xfail Michael:
- example:
- TurboAPI - FastAPI + Pydantic compatible framework in Zig (see follow up)
- Pyramid 2.1 is out (yes really! :) first release in 3 years)
- Vivaldi 7.9 adds minimalist hide mode.
- Migrated pythonbytes.fm and talkpython.fm to Raw+DC design pattern
- Robyn + Chameleon package
Joke: We now have translation services
Episode Transcript
Collapse transcript
00:00 Hello and welcome to Python Bytes, where we deliver Python news and headlines directly to your earbuds.
00:05 This is episode 474, recorded March 23rd, 2026. I'm Michael Kennedy.
00:11 And I'm Brian Okken.
00:12 This episode is brought to you by us, all the wide array of things that we're doing, courses, books, and so on.
00:20 Check them out. We have a lot of stuff on testing, a lot of stuff on Python.
00:23 Can you imagine, Brian? That's what we're working on.
00:26 I'm actually working on a brand new course. I'm super excited about it.
00:28 It's going to be a little bit different than the ones I've done before.
00:31 So it's going to be fun. Look for that in like two weeks.
00:34 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:47 Extra info to make it more useful.
00:49 Background info if you don't know something about a topic we talked about and so on.
00:53 So that is subscribe to the newsletter, pythonbytes.fm.
00:56 Click newsletter. Put in your info and then you will be subscribed to the newsletter.
01:00 And we're gentle with it. We don't give it away to third parties or anything terrible like that.
01:05 We just send you stuff about the show and other things going on with us.
01:09 Wait, if it's them and me and you, is that three parties?
01:13 No, we're both in the same party.
01:16 Yeah, we're in the same party.
01:17 It's a star party. I would say it's a star party. Don't you think?
01:20 Yeah. So I want to kick this off with a little talk about Starlet.
01:26 Starlette is like 12,000 stars.
01:32 But also it is, if you're not, if you don't remember, you've heard this before, but you can't remember.
01:38 It's because this is what FastAPI is built on top of.
01:41 But the exciting news is that Starlette is 1.0.
01:44 It's no longer zero ver.
01:46 So congratulations, Starlet.
01:47 I was looking at the release notes.
01:50 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.
02:00 And as a summary, there is a, there's a blog post, a blog post that talks about really everything that's in here.
02:09 And mostly don't really, if you've been keeping up with Starlette releases, there's probably okay, but you should test anyway.
02:20 However, it's mostly a stability and versioning milestone.
02:24 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.
02:33 But, so it's not, not intent, not necessary.
02:36 The intent isn't a interface break.
02:38 However, if you were relying on deprecated features, you, you, you might break you.
02:43 So definitely test.
02:44 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.
02:52 So if we, you know, Starlet's awesome.
02:54 And if you're unfamiliar with what it is, you can do, it is, it's a, like a whiskey.
02:59 It's the little ASCII framework.
03:01 So it's like whiskey, but asynchronous.
03:04 And it's awesome.
03:06 But there's a, there's been some cool changes.
03:09 One of the things I like at the, before we get off the release notes is at the end, what's next.
03:14 It says, oh, and Sebastian, Starlette is now 1.0.
03:21 So now FastAPI 1.0.
03:23 So FastAPI is still 0ver as well.
03:26 And, which also we've razzed him before also.
03:29 I think it's high time that we get a 1.0 release of FastAPI maybe.
03:33 I did want to bring up, I actually learned about this by looking at Simon Wilson's blog.
03:41 And he is, he noted that also that Starlette 1.0 is out.
03:46 And one of the, and his, his article is really about experimenting with Claude's skills because this is a new release.
03:53 And that's one of the ideas is the model that Claude was built on probably doesn't have it, right?
04:00 Because it's a new release.
04:01 So how, how to deal with that.
04:03 So I'm not going to get into that article too much.
04:06 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
04:17 ways to do async context, there's an async context manager.
04:21 So if you want to handle startup code and teardown code, there used to be on startup and on shutdown parameters.
04:29 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.
04:42 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.
04:52 So interesting, interesting that that model gets around.
04:56 So, but yeah, the yield is, is quite interesting.
04:59 It's a bit mind bending, but it works well.
05:01 This is awesome.
05:02 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.
05:10 So good, good deal.
05:12 Sebastian, has it already shipped?
05:13 Where is 1.0?
05:14 What's going on?
05:15 Yeah.
05:16 That's cool.
05:17 very nice one.
05:19 I want to switch things over and talk about the news du jour astral to join open AI.
05:28 I don't know if you all have heard this, but big news.
05:31 It's certainly something that has set the internet, the Python internet on fire.
05:36 First of all, I would like to take a moment.
05:38 And, and well, first of all, thank you, John Hagen for sending this in.
05:41 It was news to me when he sent it in about 10 minutes later, everything exploded.
05:46 And, obviously it's, it's come to us from many directions, but thanks, John.
05:50 And I want to take a minute and say, congratulations, Charlie.
05:55 Congratulations, astral team.
05:56 They, they really stepped up and built something incredible for Python tooling.
06:00 And they were working for different ways to make this a business.
06:04 This is certainly one of the ways to make a successful business is just get lots of that sweet, sweet AI money.
06:10 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?
06:17 So there's, there's, we don't know.
06:20 There's a couple of interesting, a couple of interesting things.
06:22 I'm going to link to the blog posts from Charlie.
06:26 I think there's basically, it says the team is moving to open AI.
06:31 The projects are moving to open AI.
06:33 So why let's start with why, why does open AI want them?
06:37 I don't know exactly.
06:39 I think nobody has said so obviously rough and uv are super relevant for making agentic coding go faster.
06:49 And to be clear, they're joining the codex team.
06:52 So the agentic coding tools team of open AI, right?
06:55 So rough and uv are there as really awesome tools for codex to install things, to validate.
07:03 I think actually maybe the most important could be ty.
07:06 So ty, we've talked about ty before, which is their language server plus type checker.
07:11 And being a language server, you could point it at an entire project and say, I want to understand this.
07:16 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.
07:27 And it does not understand the code base really as a whole.
07:31 It doesn't have a mechanism for saying like, tell me, just, just tell me about where is this function used?
07:35 It's just like grepping and searching constantly.
07:38 Like, why do you have to grep?
07:40 Can't you just use an abstract to text tree and just know the answer instantly?
07:44 So if codex deeply took ty in, it could know the answer instantly.
07:50 Right.
07:50 You know what I mean?
07:51 In like, I truly understand the project.
07:53 It's not a file of loose text files that I'm surprisingly good at just navigating them in that way.
07:58 This is an interesting take.
07:59 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.
08:10 And, and you feel that because the Microsoft's language server is, is, is tighter than the one that cursor uses.
08:18 Yeah, exactly.
08:19 It got kicked back a few years and work away back.
08:23 And tie it.
08:23 And ty has the potential to, to be as good or better than the Microsoft one.
08:28 So interesting.
08:29 I think it's better.
08:30 Yeah.
08:30 I think it's better.
08:30 I would say Powerfly and ty are, are sort of cutting edge right now.
08:33 And certainly I'm, I'm using ty and, and my VS Code like things.
08:38 Okay.
08:39 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.
08:52 Like they're just open source.
08:54 They're on GitHub.
08:55 So there's nothing preventing codex from just going, we're going all in on ty.
08:59 We're going to contribute some stuff back to ty.
09:02 We're going to create a fork and just keep that hanging around just in case and really make that our foundation.
09:08 And they could have done that with no work, with no people, right?
09:11 For no money, no acquisitions, no legal work.
09:14 So the question is what else is going on here, right?
09:18 Well, you got a handful of awesome engineers you just collected.
09:22 Exactly.
09:22 So is this an acquiring for technology or is this acquiring for AccuHire?
09:28 And is it like, I would like to have the Astral team actually doing that work to implement ty into codex or whatever.
09:36 This is my speculation, right?
09:37 Or whatever it is that they're doing there, right?
09:39 So I don't exactly know where it's going to go.
09:42 I do think that this probably means the death of pyx.
09:46 So pyx, I had Charlie on the show and...
09:50 I kind of forgot about it, actually.
09:52 Yeah.
09:52 pyx, it's the safe enterprise packaging solution that front ends PyPI.
09:59 It's not a separate package warehouse or place, right?
10:04 It's a front end to PyPI, right?
10:07 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?
10:12 That kind of thing.
10:13 That was going to be the way that Astral was looking to make money until pools of AI money showed up.
10:20 So people have thoughts here, very relevant.
10:23 Simon Wilson has been writing so much about all of this AI stuff in the world.
10:28 So he obviously, as a Python expert, has deep thoughts on this.
10:32 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.
10:41 Nobody mentions pyx at all.
10:43 In other words, those letters do not appear in the announcements, whereas the other tools do.
10:47 So that's notable, right?
10:49 So you can check out Simon Wilson's thoughts on this as well.
10:52 He's got a pretty balanced view of it.
10:55 It's not completely like, oh, this is going to be amazing.
10:57 But he has a lot of different thoughts on it.
11:00 If you look at discuss.python.org, the thoughts are, well, the thoughts are strong.
11:06 They're not necessarily, I don't know, it's positive.
11:09 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.
11:19 For example, what happens?
11:21 One of the biggest questions I had when I saw that was, oh, what happens to Python build standalone?
11:25 So there's the, oh, we can always fork it.
11:27 Take, right?
11:28 Which is true.
11:29 But when there's infrastructure and build tools and stuff happening on the backend.
11:34 I didn't think about that.
11:35 Yeah.
11:36 Then I forked it and it works fine up to Python 3.14 and it never works again.
11:41 You know what I mean?
11:41 And it didn't take the security patches because the Python build standalone is like not quite regular Python.
11:47 They have to do some tweaks to make it work weirdly.
11:50 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?
11:56 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?
12:04 Right.
12:05 So Brett's actually talks a lot about that and there's some interesting things here.
12:09 There are not as many incredibly positive bits of feedback here.
12:14 There's a few, right?
12:15 Like Astral have earned a lot of trust.
12:17 As long as OpenAI doesn't insist on integrating their equivalent co-pilot into it, we'll probably be fine.
12:22 It's probably even good news.
12:23 So there's that.
12:24 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.
12:33 So that could be like a bad lever.
12:36 Mark says, hey, let's not jump to conclusions.
12:38 Yeah.
12:39 I'll tell you what the Twitter, the X thread is more serious.
12:44 But there's a pretty deep conversation here on discuss.python.org.
12:49 It also was covered on Ars Technica.
12:51 You go into the comments here.
12:53 I don't know how many comments there are.
12:54 Do I need to refresh it?
12:55 It's only 48, but this is probably the most concerned one.
13:01 Like, oh joy, I'm boarding the Titanic, dot, dot, dot.
13:05 Yeah.
13:06 Talk Python did get a shout out for the pyx angle, which is fun.
13:11 But yeah, I don't know.
13:12 I'm going to go ahead, Brian.
13:13 I want to be positive, but I got to say my first reaction was nuts.
13:18 This is not good.
13:19 But so I don't know.
13:21 I hope it can be good, but I'm still holding my breath as to whether Microsoft buying GitHub was a good idea.
13:30 You know what?
13:31 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.
13:37 But it was the finances were bad.
13:40 And it was like they need saving.
13:41 So it wasn't like, well, either they just keep on their merry way doing their own good thing or Microsoft gets them.
13:46 It was like, or they kind of, you know what I mean?
13:48 Like it was, that was the, so in a sense, it's GitHub is still going pretty strong.
13:53 So it's better than it not being there, but I don't know.
13:55 But I agree with you.
13:56 Okay.
13:56 Back to the topic.
13:57 So with this, I trust Charlie and the Astral team.
14:01 I think their heart is in the right place.
14:03 And to be clear, it says they're still working on the three tools that were not pyx.
14:07 That said, once you're inside a large organization that has its own motivations and its own goals, who knows what happens?
14:15 It could be totally open.
14:17 One good outcome could be that it's a shock to the system and say the core development team goes, you know what?
14:23 We just need to like take Python build standalone inside of Python.
14:27 Like, why is this an external thing?
14:29 Why was a random dude maintaining it before Astral took it over?
14:32 You know, that was a lot of work.
14:34 We should, this is what we do.
14:35 So it could be, there's a lot of things that made.
14:38 That would totally make sense to be under the PSF umbrella.
14:41 Yeah.
14:41 Like, why do we have to keep patching every release of Python to make Python build standalone work?
14:46 Can we just upstream those fixes and just make that Python?
14:48 Yes.
14:49 That would be a good outcome.
14:50 Me as a bystander saying it makes sense, but I'm, you know, I don't know what's involved with that.
14:56 Yeah.
14:57 100%.
14:57 But Brett was sort of saying some things along those lines.
15:00 if you know, pip could easily adopt a lot of the things that uv did that make uv special.
15:08 I don't know why they didn't.
15:09 I mean, you look at, you look at the comments, it's like, well, we're too busy.
15:12 Like, this is like a volunteer thing for Pip.
15:14 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.
15:24 If you actually fund work on an open source problem.
15:27 Right.
15:28 But they didn't, it wasn't funded on Pip.
15:29 And so pip hasn't had those changes, but you could retrofit a lot of the things that make uv fast.
15:35 Cause it's not all just fast because of rust, although it is rust.
15:39 It's a lot of it's fast because of new algorithms and trade-offs and things like that.
15:43 Right.
15:44 So those could easily be written back.
15:46 Like there's also deprecating old features that like there's stuff that pip does that uv doesn't.
15:52 Yeah.
15:52 I just say, Hey, look, you pin pip to what it is now.
15:55 And we're going to get a new, better Pip.
15:57 Yeah.
15:58 If you need old Pip, use old Pip, like pip dash old.
16:00 I don't know, whatever.
16:01 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.
16:09 Yeah.
16:10 Right.
16:10 So like, for example, the other thing I said is like, Hey, that ty.
16:14 And what did I say?
16:15 A project from meta, right?
16:17 It wasn't a other open source project that was a competitor to ty.
16:20 It was a sort of a similar type of company somewhat.
16:23 Henry brings up a great point comparing pip and uv.
16:28 uv has paid developers, pip does not.
16:31 Yes, absolutely.
16:32 A hundred percent Henry.
16:33 And Henry had a bunch of great comments and thoughts in that discuss thread as well.
16:38 Yeah.
16:38 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.
16:49 Look, and I just want to put this out here.
16:51 I do.
16:51 I hope nobody has a bunch of negative hate that they're throwing out there for Charlie and team.
16:59 They've given us something and they haven't taken hardly anything from any of us.
17:03 And what they've shown is really awesome.
17:05 And we've all enjoyed the tools.
17:07 And even if they were to go away, there's a lot to carry forward from what they've done.
17:10 So I have no idea how much money they got, but it's probably life-changing amounts of money to some degree.
17:18 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.
17:26 Unless you're already rich.
17:27 Really rich.
17:28 Well, there's also a couple of other aspects.
17:31 There's investors already in Astral.
17:34 And they have a non-zero say in what happens.
17:40 And then there's also the...
17:42 There have been comments of, well, it's open source, so you can just fork it.
17:46 That's not trivial to fork a large project.
17:49 Yeah.
17:49 I think if there were not infrastructure behind it, you actually could fork it pretty well and be okay.
17:54 There's something like 47 non-Astral employee contributors who have done five or more contributions to uv.
18:03 Yeah.
18:04 I mean, it's definitely doable.
18:05 It's just to fork it and get it to work once is one thing.
18:09 And then maintaining it for a long time is a completely different story.
18:13 Yeah.
18:13 And I mean, no new features.
18:16 It just keeps doing what it does now, which would still be awesome.
18:19 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.
18:27 All right.
18:28 Enough talking about Astral.
18:30 You want to talk about Astral and stuff?
18:32 Yeah.
18:32 Let's stop talking about Astral and talk about uv.
18:39 Actually.
18:39 It's funny, but I am not kidding.
18:44 So uv has a new release.
18:47 And there's a new feature that I think is interesting.
18:49 That's kind of a secret preview feature.
18:53 And that's uv audit.
18:54 So that's what I want to talk about.
18:56 And in the release on the 19th, we got a 0.10.12.
19:04 We got uv audit is now as part of the CLI help.
19:08 And this was submitted by Owen Lamont.
19:10 So thanks for noticing this, Owen.
19:11 And I'm pretty curious about.
19:13 So I tried it out.
19:16 And so you can do uv self-update and you can get it.
19:20 And now you can use uv audit.
19:21 But it's interesting.
19:23 And there's also a link to the roadmap.
19:25 So it looks like almost everything's done.
19:27 There's some integrated tests that need to be done and whatever.
19:30 So it looks like they're heading forward to try to have this in place.
19:33 And it's pretty cool.
19:35 So uv audit is a dependency checker really on your project.
19:41 And I was a little bit, when I tried to run it, I didn't quite understand what happened.
19:49 It found some security vulnerabilities in one of my projects.
19:55 But it wasn't something I recognized.
19:56 And so I looked at it.
20:00 It was a dependency of a dependency of my test environment.
20:05 And what was even more confusing to me was that project, I looked at like a pip dep tree.
20:13 And I didn't have that version.
20:15 So what am I seeing?
20:16 Why is there vulnerability there?
20:18 One of the cool things of how this works is that in some part of the process, it creates a uv lock file.
20:25 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.
20:39 It's also on all operating systems that you support and all Python versions.
20:44 So that's a broad range of dependencies and versions.
20:48 And what happened was my project supports 3.9 still, or it did.
20:54 Wait, yeah, 3.10 is the lowest that I was supporting.
20:57 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.
21:10 In version 3.10, there's a file lock vulnerability that got fixed later.
21:16 And they just went up new versions.
21:18 So it's kind of a neat idea.
21:21 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.
21:31 Which, if you're doing a Python project that's usable, that's how it would work.
21:36 Anyway, I'm excited to have this get in place.
21:40 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.
21:49 And make sure you have not any vulnerabilities on any of the Python versions that you're supporting.
21:55 So that's cool.
21:55 Yeah.
21:56 When Owen said this, I thought, oh, this is awesome.
21:58 Because I've been using pip audit for both my local dev, but also for our Docker deploys.
22:06 So one of the Docker build steps is to do a pip audit against everything that had been installed.
22:12 And I set it up so that my pip audit, I can use uv to pip compile the requirements file.
22:16 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.
22:24 I don't know, like crypto miners or whatever on my computer.
22:26 It installs it into this ephemeral Docker container, right?
22:30 Which is sweet, but it's kind of slowish.
22:32 It adds like 10 seconds to the build time of what otherwise was seconds.
22:38 A couple of seconds.
22:39 Doubled the Docker build time, at least, I would say.
22:41 So does pip audit must do something on the installed container?
22:46 Packages or?
22:47 Yeah, exactly.
22:48 So what you do is you install it, then it looks at the virtual environment.
22:51 So I have a Docker container I built, which is like the command I run.
22:55 And so what it does is it has pip audit already installed.
22:57 It maps in the requirements file.
23:00 It pip, uv pip installs them quickly.
23:02 And then it pip audits against them.
23:04 You know what I mean?
23:05 Yeah.
23:05 And so I'm hoping that this would be great.
23:07 And if you go to the bottom at the coming soon roadmap deal.
23:11 Oh, yeah.
23:11 Yeah.
23:12 You'll see at the, one of the unfinished things is support locked hashed requirements.txt files.
23:19 Yeah.
23:20 Which is the way I've been doing it.
23:21 I still, I'm just not a huge fan of the project management, like uv in it, add, so on.
23:27 Yeah.
23:27 For non-packages.
23:28 I like it for packages where it manages the piproject.tml.
23:31 And there's like all that.
23:32 But if I just have an app, I'd rather just have a requirements file.
23:35 So I pip, uv pip compile that thing.
23:37 But I can't uv audit it.
23:39 I have to pip audit.
23:40 So anyway.
23:41 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,
23:54 for requirements.txt-based projects, switching to PyProjectHمل so that I can get this.
23:59 But if they, if it supported this also, that'd be cool.
24:01 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?
24:10 It's probably an hour of cloud code, I bet you.
24:12 Anyway.
24:13 Oh, wait a minute.
24:13 Use converter to a PyProjectHمل and then write it.
24:16 Yeah.
24:16 So.
24:17 Yeah, exactly.
24:17 Exactly.
24:18 Okay.
24:18 So that looks really cool.
24:20 I would actually like to switch over and talk about something that I thought was pretty interesting.
24:25 And this is an article I wrote.
24:26 It's not so much about the article itself.
24:28 It's about what the article is covering thing.
24:32 Go away.
24:32 Here we go.
24:33 So this is the articles entitled fire and forget or never with Python's asyncio.
24:40 And so here's the deal.
24:41 This is, there's a couple of tasks on our web apps that have long running things.
24:47 So let me just give you one example.
24:49 The one example is, and there's different ways to do this.
24:52 One example is like, maybe I want to just send an email.
24:55 Now send an email usually is quick, but sometimes it's really slow.
24:58 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.
25:04 Right.
25:05 Say, Hey, you're in.
25:06 So you could just say, start the send email async function and let it go.
25:11 What are you going to do if it can't be sent?
25:12 Like, I don't know.
25:13 Like, you know, you're not usually told it goes out and eventually it comes back five minutes later.
25:18 This email address was not found at this server or whatever.
25:20 Right.
25:21 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.
25:29 Right.
25:29 So why wait?
25:30 So you just fire it off.
25:31 Like, okay, that task goes.
25:33 And then we tell them, Hey, welcome to your account or whatever.
25:36 Right.
25:36 Something along those lines.
25:37 Another one is I have all the data, all the transcripts for the various podcasts stored in the database.
25:45 In certain formats, really nice to get the, get them in and out.
25:48 And, and the transcript generation stuff is always, it's always fraught, like with acronyms and stuff, right?
25:54 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.
26:06 It's not capital P, lowercase Y, capital P, capital I.
26:09 Right.
26:09 And so there's like this automation that I run that fixes it really bad as guest names.
26:14 It can wreck guest names.
26:15 And sometimes it's no big deal, but sometimes it's bad enough.
26:17 You're like, Oh, that's kind of offensive to the guests.
26:19 Let's see if we can not do that to them, you know?
26:22 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
26:32 separate than if you heard them individually, like talk Python slash whatever, like that's supposed to actually be a URL.
26:38 So fix it or Python byte slash whatever.
26:40 And so there's this process that runs and fixes them.
26:44 But as I discover new problems, I go back and retroactively fix the last 10 years.
26:48 And that process takes forever in terms of web request time.
26:53 Right.
26:54 So I'll say there's an admin button.
26:56 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.
27:06 So that's like 20, 30 seconds if it fans out of a cross-processes.
27:09 So that kind of stuff, like when I push the button, I don't really necessarily want to just wait.
27:13 I want to just have it go awesome.
27:14 We're working.
27:15 And we have a little JavaScript that'll tell you it's progress, but we're not going to await it.
27:19 Right.
27:20 So that's a long, long way to set up this.
27:22 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.
27:27 It's an anti-pattern.
27:28 I'm like, you shouldn't do it most of the time.
27:30 But the alternative is what?
27:31 Set up an entire separate Redis server with a messaging queue.
27:35 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?
27:41 Anyway.
27:42 So here's the news.
27:43 Here's the story.
27:44 Is that a lot of times you would write simple code like this.
27:48 You would say, I'm going to do a little bit of work and it's maybe async or whatever.
27:51 And then you can't just call async functions.
27:54 You have to start them.
27:55 Right.
27:55 So you have to say asyncio create task, or you have to await it.
27:59 Because if you don't create a task or await it, it just doesn't run.
28:01 It's an unrun async coroutine.
28:03 Right.
28:04 So you got to await it.
28:05 And up to Python 3.11, this code was fine.
28:08 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.
28:18 Well, then this has been this way since 3.6, maybe 3.5.
28:22 Right.
28:22 So that's a lot.
28:23 It's like seven years, but now Python 3.12 onward, you can't do this anymore.
28:28 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.
28:37 And it might not even start.
28:38 I wanted to put, I wanted to put that out there for people.
28:40 Like, you know, if you have this type of code, you, you had better look at it.
28:43 You would better make a change because for whatever reason, the async event loop now holds weak references to the tasks that it runs.
28:52 And that doesn't just apply to this pattern.
28:54 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.
29:05 Right.
29:06 So if you look at the documentation or what is it?
29:10 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.
29:18 However, in Python 3.12 onward, it's important that you save a reference to the result to avoid the task disappearing mid execution.
29:25 That's new.
29:26 So anyway, so what is the fix?
29:28 You create this weird set that holds all running tasks that you're not tracking.
29:31 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.
29:37 And then you set up a callback that when the task is done, it takes it out of the set.
29:42 So I don't know.
29:43 Anyway, that could certainly be catching some people out in like super hard to debug race conditions.
29:48 So I wanted to, I wanted to bring that up and then I wrote up a way to do it.
29:51 So that's that fire and forget.
29:53 Maybe you might just forget what else we got.
29:56 Extras.
29:57 Yeah.
29:57 Yeah.
29:57 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.
30:05 Normally we just kind of ignore it.
30:06 Okay.
30:06 So your solution, does it, does it still, does the task still stick around then?
30:11 Or does this?
30:12 Yes.
30:12 Okay.
30:13 So it's, I basically, I just took my example and just stole the, what, what they suggested straight out of the docs.
30:20 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.
30:28 Oh, so the garbage collector doesn't grab it.
30:30 Okay.
30:31 Yeah.
30:31 You just need to upgrade your weak reference to a stronger.
30:34 Okay.
30:35 That works.
30:36 Cool.
30:36 Yeah, it works.
30:37 It's, but it's not obvious.
30:39 It's definitely not like, oh yeah, I know I had to do that.
30:41 All right.
30:41 Extras.
30:42 What do we got?
30:43 Extras.
30:43 I just got a couple.
30:44 Let's see.
30:45 go over here.
30:47 just a fun article.
30:49 I didn't want to talk about it too much, but, I found it interesting.
30:51 called, nobody gets permit.
30:54 Nobody gets promoted for simplicity.
30:56 and this is a blog by terrible.
30:59 It's a terrible software blog.
31:00 That's an awesome name for a blog.
31:02 so, it, there's a quote from Ed, from Dykstra.
31:07 Simplicity is a great virtue, but it requires hard work to achieve and education to appreciate.
31:13 and to make what matters worse, complexity sales better.
31:17 And, it's, it's just an interesting observation and I've observed it too.
31:23 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
31:34 pizza or something like that or a promotion, but it was their bugs that they were fixing.
31:38 And the person that just didn't write the bugs in the first place won't get those.
31:41 Anyway, just that person is not even that much of a hard worker.
31:44 Look, they went home on time.
31:45 I suck.
31:47 I bring this up also because, people using your, your, a lot of people are now in a management role.
31:54 If, even if they don't realize it, if they're letting AI generate a bunch of code for them, simplicity still matters.
32:00 don't, don't reward your, agent just because it gave you volumes of code.
32:06 It might be a simple solution.
32:08 It might be easier.
32:09 Anyway, set that aside.
32:11 It's just interesting read.
32:12 I've been working on over the weekend, catching up on, pytest check.
32:17 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.
32:29 That's awesome.
32:30 I mean, it's a small project.
32:32 So the last one I just, cleaned up though has been, was, was a feature request from three years ago.
32:39 So I'm, I'm glad that I'm, I finally get it in place.
32:42 And so the thing is I've got a bunch of these helper functions like, like equal and not equal and stuff like that.
32:48 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.
32:58 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.
33:08 So yeah, I like it.
33:09 That's cool.
33:09 very nice.
33:10 Yeah.
33:10 That's my extra.
33:12 All right.
33:12 I got a few.
33:13 I'll go quick though.
33:14 So I ran across this project called turbo API as a riff on FastAPI.
33:21 We started with starlet and FastAPI and here we are in extras with a bit more.
33:24 So there's a couple of interesting things from this.
33:26 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.
33:38 Like you dress C++ zig, whatever this person likes it.
33:41 I don't even know what zig codes look like, but it, you know, natively compiled code, right?
33:44 Would it be faster?
33:45 Would it be cool?
33:46 Would it be like you could use the same decorator and the same model?
33:50 technically doesn't use Pydantic.
33:52 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.
34:00 So on.
34:01 So anyway, I thought this was cool.
34:02 It's like this kind of Twitter thread.
34:04 It got a lot of, it's got 325,000 views.
34:07 So, Hey, it caught some attention.
34:08 How about that?
34:09 And I don't know.
34:10 It, it was kind of interesting.
34:12 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.
34:18 So I wanted to throw that out there.
34:20 It's, it's kind of popular now.
34:22 It's got a lot of GitHub stars and so on.
34:24 I'm not suggesting people use this over FastAPI.
34:26 It's that's tried and true and all, and so on, but this is kind of an interesting idea.
34:30 Anytime you publish benchmarks, you, you will receive an inordinate, an abnormal amount of attention in not a good way.
34:40 So I'd follow a post.
34:41 I learned a lot from the turbo PG benchmark mess.
34:46 Interesting.
34:46 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.
34:54 I think this is, this is very interesting because a lot of the pushback to astral being acquired by open AI.
35:02 Wasn't that we think open AI is going to be bad.
35:04 It was, I hate AI.
35:06 I hate open AI.
35:08 And therefore I hate this.
35:09 You know what I mean?
35:10 And it wasn't an assessment of do I think this is better or worse for this project.
35:14 It was just like, I hate them because they're AI.
35:17 Cause I hate AI.
35:18 And so there's this really interesting tension.
35:20 And so if you want to like, kind of live in that moment, you can read, read this whole thing.
35:25 I think that's pretty interesting.
35:27 So anyway.
35:28 Yeah.
35:29 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.
35:37 Check, check this out.
35:38 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.
35:49 And, and I totally concur on that.
35:52 I agree with you on that.
35:53 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.
36:03 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.
36:13 But for example, in the, I think it was in the Ars Technica thing, literally one of the comments was, I hate open AI.
36:20 This should have never happened.
36:21 Or, you know, something like it was like, it was that explain, it was, you know, it was verbatim when I said, basically.
36:26 So I know you got some other extras, but I want to interrupt a little bit more.
36:31 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.
36:41 Yeah, exactly.
36:43 performance metrics just to, or even just bad performance.
36:46 They're not fake, but they're bad.
36:48 so that, you know, to get people.
36:50 And the other thing is, what do you think about like, you know, selling Python bytes to open AI?
36:56 You know what?
36:57 Hey, I love our listeners.
37:00 I love what we do, but I would not be against this if, if they come, if they come with the money.
37:05 All right.
37:06 So, chances very, very low, really quick pyramid pyramid, the web framework.
37:11 Yes.
37:12 Pyramid, which by the own bytes was originally based on from way, way back in the day has a release.
37:17 Now you might think, Michael, why are you so psyched about this?
37:20 Cause we're running it on court, async class, whatever, right?
37:23 These days, this is the first actual release of pyramid.
37:26 In five years.
37:28 So I'm like, wait, there's a new version of it.
37:31 What is that?
37:31 What's going on here?
37:32 Technically there was a release three years ago, but it was like a very minor thing.
37:36 Okay.
37:36 And so there's not a lot going on here.
37:39 Basically setup tools had some issue with the way that it was managing packages.
37:44 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.
37:53 So the thing actually pins the setup tools to a version that will work.
37:58 But if you have something else that depends on setup tools, you can't use it.
38:01 So it's always a bit of an issue.
38:03 The other one is they literally, as part of this release added pyramid.acp exceptions.acp !imatpod exception.
38:11 I love it.
38:12 I love it.
38:13 So anyway, that's, that's that, Vivaldi.
38:19 We're both fans of Vivaldi.
38:20 I know a lot of Python people are fans of Vivaldi and the privacy angle and the not, not Chrome angle.
38:27 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.
38:34 People like that, like Arc browser a lot.
38:36 And so you, most people are listening to it or know, but you, you can't see my address bar.
38:40 You can't see all the Chrome around.
38:42 It's like just sort of very minimal.
38:44 You can like turn it into just like this, just the essence of the web.
38:47 You can even auto hide your tabs, but it's, it's a bit too much for me.
38:50 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?
38:56 you can add a bunch of hotkeys that make this work better.
38:59 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.
39:05 But if it's hidden now, then how do you do that?
39:07 So I had it a hotkey to like just copy whatever thing I am on.
39:11 So it's kind of encourages you to be a little more hotkey driven.
39:13 So that's fun.
39:14 People should check that out.
39:15 I saw you just turn that on Brian.
39:16 This is the show.
39:17 Yeah.
39:18 Yeah.
39:18 We'll see how it, how you take to it, but it took some getting used to, but I definitely like it.
39:22 You just got to be the more mellow around the edges.
39:24 If you get too quick, stuff pops over and covers the nav and that's kind of annoying.
39:27 Yeah.
39:27 When those stuff would pop down, it would like move the window, the actually, as if that thing existed in the UI.
39:34 So it didn't cover your elements, but whatever.
39:36 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.
39:48 so yeah.
39:50 Yeah.
39:50 Yeah.
39:50 Yeah.
39:50 Yeah.
39:50 And certainly on like small laptop screens and stuff.
39:53 It's super cool.
39:53 Okay.
39:54 Okay.
39:54 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
40:05 that we write starts running, you know, not the framework stuff, but just that close.
40:09 Right.
40:09 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.
40:17 I wanted to do a spike and see if I could convert one of our apps like Python bytes to Robin.
40:24 Would it be a lot faster?
40:25 I don't know.
40:25 Well, there's a whole bunch of chameleon templates and only supports Jinja.
40:29 So I'm like, well, in order to do that, I'm going to have to create a chameleon Robin package.
40:33 So I did.
40:34 So I added chameleon support to the Robin language so I could see if it was any better.
40:38 turns out, no, not really.
40:40 Was it really worth it actually?
40:41 But now the world has this cool, chameleon Robin project.
40:45 So, chameleon is a little bit more out there.
40:49 And I was also playing around this week.
40:51 I was trying out ideas this weekend.
40:52 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.
41:05 Cause it knows raw, the raw query language of your database and so on.
41:08 I actually switched, talk Python and Python bytes over that this weekend, just playing around and it's like 10% faster, lower memory usage.
41:15 Why not?
41:16 Oh, wow.
41:16 Yeah.
41:17 Pretty sweet.
41:17 Have you considered raw plus Marvel?
41:21 No, I know.
41:22 It's a, it's, there's better stories over there, but no, I think that's it for our extras.
41:27 We got a joke though.
41:28 And this one, this one comes to you, comes from you.
41:31 This is a pretty, pretty good stuff.
41:34 I love this.
41:35 You want me to just see how my screen up here?
41:37 I'm going to put, we're going to start.
41:38 So, so set the stage for us.
41:40 What is going on here?
41:40 so do you, can you get the LinkedIn?
41:43 Oh yeah.
41:44 Oh yeah.
41:44 So I just like, there's the normal, like Google translate.
41:49 You just type in stuff or whatever.
41:50 All your translate tools are type.
41:52 It converts it.
41:53 somebody on Kagi wrote a, LinkedIn speak converter.
41:59 so you can convert English to, to LinkedIn or back.
42:02 So if you, if you're looking at somebody's bio and LinkedIn, you can, or any, it works for resume speak as well.
42:08 You can just finished it.
42:09 Like finished my last contract.
42:12 What are you writing?
42:12 I just finished my last contract.
42:14 I'm looking to move to AI programming.
42:17 okay.
42:19 Anyone interested?
42:20 So what do we get?
42:22 what are we going to get?
42:25 So I just finished my last contract.
42:27 This is what, this is the input.
42:28 I'm looking to move on to AI programming.
42:30 Anyone interested in someone who lives every day is day one.
42:34 Remember that like LinkedIn?
42:35 Oh yeah.
42:36 Yeah.
42:36 So here's, here's what we get.
42:38 Hashtag new beginnings, rocket ship pipe.
42:40 I'm thrilled to share that I'm officially wrapping up my last contract.
42:43 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.
42:51 I'm looking for the next challenge with a team that values growth and innovation.
42:55 I'm someone who brings that day one mentality to everything I do every single day, hockey stick growth emoji.
43:01 If you're looking for a passionate developer, ready to push the boundaries of AI.
43:05 Let's connect.
43:06 Handshake.
43:07 Hashtag AI.
43:08 Hashtag machine learning.
43:09 So on.
43:09 So on.
43:09 That's funny.
43:10 That's pretty good, right?
43:12 You know, it's even better.
43:13 What?
43:13 You can type other stuff in here.
43:14 That's not in the list.
43:16 AI bro.
43:17 Custom.
43:17 Just sunset in my last gig rocket ship.
43:19 Ready to pivot into AI and scale some world changing models.
43:22 Who wants a builder who stays hungry and treats every day?
43:25 Like day one, let's disrupt robot emoji, fire emoji.
43:30 Hashtag built in public.
43:32 Okay.
43:32 So go back to the LinkedIn one though.
43:35 Hold on.
43:35 Hold on.
43:36 Hold on.
43:36 You got more?
43:37 Cobalt.
43:38 Cobalt programmer.
43:39 Oh my God.
43:41 It wrote a program that stated this.
43:46 It's like basically like printed.
43:48 Hello world.
43:49 To say the display day as mindset.
43:53 Question mark.
43:53 Stop running.
43:54 Oh, would you look at?
43:56 That was a little cat.
43:59 I has finished my last job.
44:02 Now I wants to do AI codes.
44:04 Who wants a kitten who lives every day?
44:07 Like day one.
44:08 You want me to go back to LinkedIn one?
44:10 I'm getting distracted.
44:11 I'm sorry.
44:11 I apologize.
44:12 Oh, and in the English, just type.
44:13 I'm a programmer.
44:14 This is pretty good.
44:15 I'm a passionate software engineer dedicated to building scalable solutions and solving complex problems through code.
44:21 Okay.
44:22 But what if you saw that?
44:23 So do that, like flip back and forth, like the little button in the middle.
44:26 Oh, I see.
44:28 So that translates.
44:30 I do.
44:30 I write code for a living.
44:31 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.
44:41 That round tripping is incredible.
44:44 That is incredible.
44:45 Yeah, we did that.
44:47 My daughter and I did that with a few job descriptions and round tripped a few times.
44:51 And it's, it's, you get some crazy things.
44:56 Kind of want to put my LinkedIn page in here and see what happens.
44:59 Just see.
45:01 But yeah.
45:01 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.
45:10 Yeah.
45:10 Or you could just de-buzzword it, put in what you see and then see, translate that to English.
45:16 Yeah.
45:17 Anyway, well done, Kaggy team.
45:18 That's awesome.
45:20 Cobalt is nice.
45:21 Yeah.
45:21 All right.
45:22 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.
45:28 Yeah.
45:29 Yeah.
45:29 We'll see.
45:30 We'll see.
45:30 Thanks for being here, everyone.
45:31 See you later.
45:32 Bye, Brian.



