Brought to you by Michael and Brian - take a Talk Python course or get Brian's pytest book

#466: PSF Lands $1.5 million

Published Mon, Jan 19, 2026, recorded Mon, Jan 19, 2026
Watch this episode on YouTube
Play on YouTube
Watch the live stream replay

About the show

Sponsored by us! Support our work through:

Connect with the hosts

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: Better Django management commands with django-click and django-typer

Michael #2: PSF Lands a $1.5 million sponsorship from Anthropic

  • Anthropic is partnering with the Python Software Foundation in a landmark funding commitment to support both security initiatives and the PSF's core work.
  • The funds will enable new automated tools for proactively reviewing all packages uploaded to PyPI, moving beyond the current reactive-only review process.
  • The PSF plans to build a new dataset of known malware for capability analysis
  • The investment will sustain programs like the Developer in Residence initiative, community grants, and infrastructure like PyPI.

Brian #3: How uv got so fast

  • Andrew Nesbitt
  • It’s not just be cause “it’s written in Rust”.
  • Recent-ish standards, PEPs 518 (2016), 517 (2017), 621 (2020), and 658 (2022) made many uv design decisions possible
  • And uv drops many backwards compatible decisions kept by pip.
  • Dropping functionality speeds things up.
    • “Speed comes from elimination. Every code path you don’t have is a code path you don’t wait for.”
  • Some of what uv does could be implemented in pip. Some cannot.
  • Andrew discusses different speedups, why they could be done in Python also, or why they cannot.
  • I read this article out of interest. But it gives me lots of ideas for tools that could be written faster just with Python by making design and support decisions that eliminate whole workflows.

Michael #4: PyView Web Framework

Extras

Brian:

  • Upgrade Django, has a great discussion of how to upgrade version by version and why you might want to do that instead of just jumping ahead to the latest version. And also who might want to save time by leapfrogging
    • Also has all the versions and dates of release and end of support.
  • The Lean TDD book 1st draft is done.
    • Now available through both pythontest and LeanPub
      • I set it as 80% done because of future drafts planned.
    • I’m working through a few submitted suggestions. Not much feedback, so the 2nd pass might be fast and mostly my own modifications. It’s possible.
    • I’m re-reading it myself and already am disappointed with page 1 of the introduction. I gotta make it pop more. I’ll work on that.
    • Trying to decide how many suggestions around using AI I should include.
      • It’s not mentioned in the book yet, but I think I need to incorporate some discussion around it.

Michael:

Joke: Reverse Superman

Episode Transcript

Collapse transcript

00:00 Hello and welcome to Python Bytes, where we deliver Python news and headlines directly to earbuds.

00:05 This is episode 466, recorded Monday, January 19th, 2026.

00:13 I'm Michael Kennedy.

00:14 And I'm Brian Okken.

00:15 This episode is brought to you by us, all of our things.

00:17 I know Brian is very lean these days with his TDD and would like to tell you about it more on that later,

00:22 but he's got his upcoming book and course.

00:26 I've got my Talk Python in production book, which is still going strong.

00:30 I love that.

00:31 Of course, all of our courses, things like that.

00:34 Also, connect with us on social media.

00:36 Links for most of the places that you might do so in the episode show notes to your podcast player and Sean.

00:43 And finally, subscribe to the newsletter.

00:45 We're putting awesome things in there.

00:47 Lots more than just the show notes.

00:50 So it's kind of a nice reinforcement, a few extra resources if you like them.

00:54 Yeah. Mostly put together by Brian. So we appreciate that, Brian.

00:57 Thanks.

00:58 Yeah, you bet. I also appreciate a good web framework with a solid community. What do you got in that realm?

01:06 Well, we're going to talk about Django. So put this up here. Django, I ran across this article about that's six months old from the revsys. It's from June of 2025. But I had it in my queue and I'm going to cover it.

01:22 So better Django management commands with Django click and Django typer.

01:27 And this is from Lacey Henschel.

01:30 And so let's look at the management commands.

01:34 If anybody that's used Django, you know, there's management commands.

01:37 There's a bunch of them.

01:38 So there's, there's, you just say like, man, you've got, if you're in the Django thing,

01:44 you can go manage.py command, or you can do Django admin command or Python dash M Django,

01:51 then the command, there's a bunch of built-in ones.

01:54 And since they're things like just the maintenance around your website stuff and other things,

02:00 but there's a lot of stuff there.

02:04 And it's so convenient that it'd be cool if you could add your own.

02:08 And there is built-in stuff.

02:10 You can create custom commands, but you do it by deriving.

02:14 you have to derive from a base command class and then have self everywhere.

02:21 And there's the object-oriented part of that that's weird.

02:26 But there's better ways to do, there are at least different ways.

02:30 If this doesn't jive with you, there's better ways.

02:32 And that's what we're talking about.

02:34 This is with Django Click and Django Typer.

02:37 So first off, one of the cool things is she runs down why you would want to add your own management commands.

02:43 And there's a lot of great reasons like data operations, importing.

02:47 Like she has an example of importing CSV file from clients, exporting data for reports.

02:53 Those are great things.

02:56 You're doing it on the system, but you can just go use the same internals of Django to be able to pull things out.

03:03 That's great.

03:04 Also, development and debugging, one of my favorite reasons.

03:07 Okay.

03:07 So first off, Django Click.

03:11 And Django Click is based on Click, of course.

03:17 And Click is a great way to do CLI tools too.

03:21 And so it's just an integration of Click and Django to get these management commands.

03:27 And you end up just creating a file.

03:29 And it's a lot shorter with some click options and stuff.

03:34 And it's just that integration of Click.

03:37 And then, again, Typer is also built on click also.

03:42 But if you're used to Typer, grab Typer.

03:44 But one of the cool things about Typer is the coloring and the different, the output.

03:50 You can do more structured output.

03:52 So they have an example where you have better things like emoji support and tables and things like that.

04:00 So if you want to do cool, and the article goes in and says,

04:06 hey, well, which one should you use?

04:08 I'm not going to scroll to the bottom, but which one should you use?

04:11 And it's basically, she says, she usually reaches for click, Django click,

04:16 but when she wants to do nice reports and stuff, do Django type her.

04:21 And they're both, I wrote this down, they're both supported under, what is it?

04:28 The Django Commons group on GitHub supports both of these extra plugins or whatever.

04:38 So pretty cool.

04:39 Yeah, it was really nice.

04:40 Click and Typer are obviously super popular.

04:44 And if you're like, I know one of those, but I want to add a custom Django command,

04:48 like, let's just do it.

04:49 You know, I imagine I say this, as I say this, I'm sure it's out there,

04:53 but I have no awareness of its existence.

04:55 It would also be cool to have a textual sort of UI if you could just type manage pi-ish, manage tx or whatever, and you get like a UI for all these managed Django commands.

05:07 That'd be pretty neat, including your custom ones.

05:09 Probably out there.

05:10 I have no idea about it.

05:11 So maybe someone will send us a message where you can do a follow-up.

05:13 You know, it's the age-old question, Brian.

05:16 What would you do if you had a million dollars?

05:19 Think of a million dollars.

05:21 You never have to be subservient to society again.

05:25 Well, maybe it's not quite that way.

05:26 But we have really...

05:28 I think I'd need one and a half.

05:30 You would need one and a half because inflation.

05:31 You would actually need more than one and a half probably.

05:33 But you could sure make a dent with one and a half million dollars.

05:36 And that is really good news because Anthropic has just invested $1.5 million in the PSF and open source security.

05:45 That's awesome.

05:46 I want to take a minute and just, you know, thank you, Anthropic.

05:50 People hate on AI companies.

05:53 So I thought it was the folks that bring us Claude, right?

05:56 Yeah, Claude, Opus, Claude Sonnet, Claude Code.

05:59 And honestly, I've been using Claude, I think it's Claude AI,

06:04 as like the ChatGPT alternative.

06:06 Chat GPT has gotten really less good lately, and I don't understand.

06:09 It's weird.

06:10 Like I was just writing a blog post, which I'll talk about later,

06:13 and it's just doing super weird things, and I found like Claude is doing a lot.

06:16 So I think it's honestly one of the better AIs.

06:19 And if all these companies are going to make all this money

06:21 and exchange it around.

06:23 I really like to see Anthropic putting this money back into Python.

06:29 You know, they're, they're, it's not just Python too.

06:31 They just bought Bun, which is like, as far as I understand,

06:34 it kind of like a node alternative, certainly a JavaScript runtime thing

06:38 for a ton of money as well.

06:39 So they're, they're doing, I mean, they're not,

06:41 they didn't buy the PSF.

06:43 They just gave money.

06:44 So this is over two years.

06:46 So what is that?

06:47 PSF isn't for sale.

06:48 It's not like Greenland or anything.

06:51 Well, I mean, I think we know that because they're turning down of that, probably not a coincidence, $1.5 million offered by the recent U.S. government with strings attached.

07:03 This one comes without strings, more or less.

07:05 I'm sure there are strings, but not to the same degree.

07:07 But it's really $750,000 a year.

07:10 And it has, let me see, I took some notes on exactly the goals of this.

07:15 but it's basically mostly for Python security from YRSTM,

07:20 but also to fund things like the developer in residence initiative,

07:25 community grants, which remember there was a big kerfuffle

07:28 about grants being paused or canceled because they ran out of money, right?

07:32 I mean, it sucks, and maybe they promised it and then didn't deliver it.

07:35 I don't remember. I feel like there was something like that.

07:37 But even if you promised it, if the money's gone, it's not like,

07:41 well, you work for the PSF.

07:42 we have your 401k so we can keep our promise.

07:45 You know, at some point, if the money's not there, the money's not there.

07:48 So this is really awesome that this is back.

07:51 Infrastructure like PyPI, like I say this every now and then,

07:54 but I'm not sure how many people understand how expensive PyPI is to run.

07:59 If it were not for fast to leave the CDN giving free bandwidth,

08:04 it's $100,000 or more a month.

08:07 I mean, it's a lot of money, right?

08:10 Compared to the overall budget.

08:12 And this is a lot of money compared to the overall budget.

08:14 I feel like the budget of the PSF is around $7 million.

08:17 I mean, I haven't checked in the last couple of years,

08:18 but last time I heard it was something like that.

08:20 So this is a significant portion of that.

08:23 Anything else?

08:24 Yeah, the current CDN cost, last article I found, is $1.5 million a month.

08:29 A month?

08:30 That can't be right.

08:32 I feel like that's high.

08:33 I mean, I know it's high, but I feel like even that's high.

08:36 It might be a year.

08:38 But I don't know.

08:39 I could be wrong.

08:40 There's actually a really nice article written up somewhere that I didn't make any part of our news about the stats of the PSF.

08:47 But I just heard it indirectly, so I don't have it to pull up.

08:51 Anyway, so one of the goals is to fund new automated tools for proactively reviewing all packages uploaded to PyPI, moving beyond a reactive only review process.

09:01 Remember a few weeks ago, I talked about, hey, here's how you set up like Python supply chain security.

09:07 And one of the main ways, honestly, is wait a little while to install it and then check if a problem has been reported.

09:15 It's kind of that reactive thing.

09:16 It's like, well, probably somebody, if something happens to a major package, will figure it out within a few days and react to it.

09:22 So wouldn't it be nice if that didn't have to happen that way?

09:26 It would.

09:26 You know, that is how it happens, right?

09:29 And the PSF plans to build a new data set of new malware for capabilities analysis.

09:35 So all sorts of good stuff.

09:36 I just wanted to shine a light on this, say thank you, Anthropic.

09:41 And yeah, it's really great for PSF and everyone, I think.

09:45 Well, I did notice this, but also a couple of people mentioned it to us.

09:51 An article by Andrew Nesbitt, how uv got so fast.

09:56 And there's a lot of reasons why I like this article.

10:01 First off, just right off the top of the bat, this says, says, hey, usual explanation is it's written in Rust.

10:08 And that's kind of what we think is, right?

10:10 Is like you can take Python tools, rewrite them in Rust, and they'll be faster.

10:14 But it's a lot more than that.

10:16 The Rust part is contributing, of course.

10:21 But there's some tweaks around it and also some design decisions that make it a lot faster.

10:28 And it's interesting to read.

10:30 So one of the things is around the standards.

10:33 So there's a bunch of standards that came in to make this possible.

10:36 There's 518 that created pyproject.toml.

10:40 So uv reads pyproject.toml.

10:43 It doesn't read setup.py.

10:44 You can't do any other stuff.

10:45 You have to do wheels.

10:46 That's what uv looks for.

10:50 Also, actually, I could be wrong.

10:52 I think I'm overstating that.

10:55 I think it does do backwards compatible stuff, and it just falls back to different modes.

11:00 Well, I'll have to double check that, but I think so.

11:03 Anyway, PEP 517 came in in 2017, which is a separate build front ends and back ends.

11:12 So now even PEP doesn't need to understand set of tools internals.

11:16 There's PEP 621 that standardized the bracket project table within the TOML file and reading

11:24 tables, TOMLs.

11:26 And then there's the PEP 658, which was a package metadata directly in the simple repository API.

11:35 Essentially, you don't the tools on the back when you do install something, they don't have to grab a whole bunch of data.

11:42 They just have to grab like this, this dependency information, which they used to have to.

11:47 There's more of a story here about how pip used to have to go out and just really download, try stuff, and then try to run it.

11:56 If it didn't work, try something else.

11:58 There's a bunch of stuff there.

11:59 There's more than that, though.

12:01 Having these in place, basically it says uv could not have shipped in 2020 because all these weren't in place.

12:09 So it relied on everything.

12:12 PIP-658 went live in PIP-I in May of 2023.

12:17 And uv launched February 2024.

12:20 So it's building on top of all those things.

12:23 Also, uv drops a bunch of stuff.

12:25 PIP still supports a lot of old stuff, which uv just doesn't, like egg support.

12:31 PIPConf doesn't support that.

12:34 There's no bytecode compilation by default.

12:36 I didn't realize this.

12:37 So yeah, when you pip install something, it by default goes through and does PYC,

12:42 It converts code to PYC bytecode objects.

12:48 UV doesn't do this.

12:50 Apparently, you can turn it on, but it doesn't do it by default.

12:54 Requires virtual environments.

12:55 It seems like it could be cached, you know?

12:58 Yeah.

12:59 But I guess I don't know how uv pairs that to Python versions,

13:03 and maybe it gets cached differently.

13:05 You run like Python 3.13 to compile them.

13:09 Maybe it's just like not worth it, you know?

13:10 Yeah.

13:12 I'll just run through these quick stricter spec enforcement,

13:17 ignoring the upper bound on Python because projects say, you know,

13:20 I haven't tested on 4.0, so don't do that.

13:23 But it usually works anyway.

13:25 So I didn't realize they ignored that.

13:27 Also, first index wins.

13:29 I don't know why pip checks all of the indices before it grabs one,

13:33 but uv stops.

13:36 So at the top, it talks about speed comes from elimination.

13:41 basically every code path you don't have to go down is code you don't have to wait for and also

13:47 it's a new project so you're not breaking backwards compatibility if uv doesn't work use pip um like

13:53 sempos mentioned uh there are many things a new project can afford to drop or work around when

13:58 building from ground up which is good it shows as it shows that we can uh what we can have yeah

14:04 basically um you you you could start from scratch which is great uh the other interesting things

14:10 is there's a bunch of optimizations that don't rely on Rust,

14:17 which are interesting.

14:18 Like there's using, because it's only looking at wheels, it can, wheels or zip archives,

14:27 it can look at the end of the wheel first to grab the directory list, things like that.

14:31 Parallel downloads, this is, you know, any language can do that.

14:35 Pip could do parallel downloads, but it doesn't.

14:37 The global clash, we've seen this with uv a lot, is when you download something or pip install something from uv with uv,

14:44 it caches it somewhere.

14:45 So if you create another virtual environment, it's going to be there already.

14:49 It doesn't have to download again, which is great.

14:51 Anyway, a bunch of cool things here.

14:54 So one of the reasons why I like the article, but also I like the idea of thinking I can't speed it up

15:01 because I'm going to stick with Python for now.

15:04 There are trade-offs that you can do.

15:06 You can make some changes in projects, especially ones you completely control,

15:10 that you can say, well, you know what?

15:12 I'm going to take away some of the assumptions and some of the use models that I used to support

15:16 and just to make it faster.

15:19 Henry points out there, makes the first import slower for not having PYC, I think.

15:26 It's an actual savings if you don't use the entire package.

15:29 Though, I guess it depends when this is happening, right?

15:32 Like if this is happening on VNV on your machine, like, yeah, it doesn't really matter.

15:36 Like after the first run, it's fast.

15:38 If it's happening on startup on a Docker thing where every time it starts, it uses the new Docker container.

15:44 Well, then it happens every time and it's not great.

15:46 Yeah, it's making me wonder if maybe I can get better startup speed by running a script to pre-compile everything installed in the VNV if uv is not doing it.

15:55 I'll let you know.

15:56 Interesting.

15:57 I didn't understand why pip looks at all of the indices.

16:00 Henry Schreiner says, looking at all the indices is important when you have a newer version on a different index, which sometimes you need to do.

16:09 Sometimes you do need to, but it is slower to look at all of them.

16:13 So, yeah, you can when you have multiple.

16:15 Yeah, this is sort of like inside baseball, but you can set up your your pip configuration.

16:20 So you have multiple places where you're grabbing things like an internal and stuff.

16:25 Yeah. There are opportunities though for pip to speed up without breaking any of its historical compatibility.

16:33 Like it theoretically could say, you asked me to install 10 things when you said -r requirements or high project.tomlin or whatever.

16:40 Let's go get those in parallel. Let's run the install in parallel, right?

16:44 Like we all have 10, 14, 20, whatever cores, right?

16:49 Like don't run it on one and we probably have faster than that.

16:52 Don't just run it on one connection. So on.

16:54 Yeah, also the caching, I love that part of just caching it,

17:00 having a machine local cache.

17:04 For people like me, I create virtual environments all the time.

17:07 So do I.

17:08 They just seem free.

17:10 Yeah, especially with uv.

17:11 And finally, Henry out in the audience throws out --compile dash bytecode.

17:15 I'm assuming that's a command to uv.

17:17 And if it is, it's getting set on some of my installs here soon.

17:21 Awesome.

17:21 All right, let's switch gears here to the PyView web framework.

17:27 Okay, so PyView, now there have been other things like this recently out there.

17:34 Something called PyWebView, not that.

17:37 PyWebView was a thing where you could embed basically a browser, kind of like Electron would.

17:44 So this is not that.

17:46 This is a totally separate web framework that's super interesting.

17:50 I just interviewed Larry, who's behind the project over on Talk Python.

17:55 It's on YouTube as a live stream.

17:57 It is not yet out as a podcast episode.

18:01 So coming soon to a podcast player near you.

18:05 It's based on this thing called Phoenix Live View, which is written in Elixir of all things.

18:09 But the idea is we wanna have very reactive front-end code, right?

18:14 Kind of like React, the name, or Vue or something like that.

18:18 But we would rather have Python code controlling it and have it more done on the server,

18:24 a little bit like an HTMX vibe, okay?

18:26 So what this does is it's based on this more popular,

18:29 'cause it's been around a lot longer, Phoenix Live View, which people may have heard.

18:33 So what you do is you write code on the server as if it could update the front end directly.

18:42 When you launch your app, what happens is it actually,

18:46 this whole framework sets up a WebSocket connection from the backend and sends events to you that happen

18:52 they were JavaScript events, but they happen on the server.

18:55 When those events happen, you just re-render the page,

18:58 and there's a diffing engine that figures out, okay, you sent the whole page,

19:02 but actually it's just this div and that div that need to go down, and it sends them over.

19:08 So let me show you an example, Brian, before you're like, I don't know, Michael, this sounds weird.

19:12 It does sound weird. It's cool.

19:14 So check this out.

19:16 I linked to these examples, examples.pyview.rocks.

19:19 There's a bunch of them, but there's a maps example.

19:22 I'm going to show you the example, then I'm going to show you the code, and I want your reaction, okay?

19:25 And I'll narrate for listeners.

19:27 So if I zoom out, what we have is on the left, we've got a list of U.S. national parks.

19:32 And on the right, we have a OpenStreetMaps map, right?

19:36 So you see on the left, it has the selected park selected.

19:40 And if I click on one over here in the map, it then updates the thing on the left, right?

19:46 To say like, okay, this is a JavaScript map component that's loaded here.

19:51 And as you interact with it, you can see the details view, or the list view rather.

19:57 Oh no, I lost my window.

19:59 Is updating, right?

20:00 They're staying in sync.

20:00 That's cool.

20:01 It's cool.

20:02 Now, also, when I click on the left, it moves the map.

20:04 So if I click on Yellowstone, the map jumps over there.

20:06 If I click the Joshua tree, it's over there.

20:08 If I bring something closer to home, like Olympic National Park, National Forest, that pops up.

20:15 This is a pretty neat app, and it's clearly interactive, right?

20:19 It's not refreshing the page.

20:20 Feels complicated.

20:21 But if I go back here and I go to the maps and I show you the code, I'll describe this for everyone.

20:25 There's a CSS file, that's fine.

20:28 There's a, hold on, let's do it this way.

20:30 There's a parks py file, and it literally is just a list of dictionaries

20:34 of like, here's the name of the parks, here's the latitude, here's the description,

20:37 here's the icon, it's just like a flat data file, yeah?

20:39 Go back, the map.py, it says, we're gonna create a data class.

20:45 And the data class has a list of parks and a selected park, okay?

20:49 When somebody clicks on it, it just does a dictionary comprehension or sort of thing to search for the park that matches.

20:57 It sets the selected park name on its data class, and it says there's an event to highlight the park.

21:02 That's the entire application.

21:04 That's pretty amazing.

21:05 Is that nuts?

21:06 Right?

21:06 And if you look at the HTML, it's just a bunch of Jinja with Tailwind that just says, you know, bind to this value.

21:16 Instead of just saying the value equals, you say Phoenix value equals, and you just pull out the context from the name.

21:22 So this is a super interesting web framework that has not got a lot of light shined on it yet.

21:27 It's got 63 stars.

21:29 So it's basically a reimplementation of the Phoenix live view.

21:32 And I think it's pretty neat.

21:34 Larry says he's been using it for some projects at work and just starting to get it out in the public.

21:39 So it's probably more tested than it feels.

21:42 And finally, if you want to understand, I'll link to this in the show notes.

21:44 If you want to understand, like, how is this even possible, you need to read the LiveView life cycle section of the docs.

21:52 And it talks about, okay, how it first renders the template.

21:55 And then once it's done that, it's connected a WebSocket.

21:57 Then it listens for events.

21:58 And then the diffing engine and all that kind of stuff.

22:00 And how real-time events, real-time updates happen and so on.

22:04 Anyway, what do you think?

22:05 Neat, right?

22:06 I think it's pretty cool, yeah.

22:08 Yeah.

22:08 Yeah.

22:09 Cool.

22:09 Well, that is that.

22:12 I think we're out of topics.

22:14 Yeah.

22:14 Any extras?

22:17 Yeah, I got a couple extras.

22:18 All right, let's throw it over to you to check out the extras you got.

22:22 Okay, so we did, I was just talking about the article I talked about earlier about the Django management commands.

22:30 That was on the RevSys blog, and there's another cool thing that RevSys has that I want to show.

22:36 So first off, we did, I'm pretty sure we announced this, but Django 6 was released on December 3rd,

22:43 And there was a bug fix 601, which came out on January 6th.

22:49 Oh, my birthday.

22:50 You gave me a birthday present.

22:52 And then, but so should you upgrade and how to upgrade?

22:58 And that's what I want to talk about is there's a website called upgradejango.com.

23:04 And this is put out by RevSys.

23:06 And it's pretty cool.

23:07 It has all the LTS versions, and it has basically the current supported version of Django.

23:15 We've got latest version and initial release and support dates.

23:20 Then they have future versions scheduled so far.

23:24 There's only 6.1 planned so far in August.

23:27 And then a whole bunch of old unsupported releases.

23:30 Now, if you're on an unsupported version, you probably ought to upgrade.

23:34 But how do you do that?

23:35 And that's one of the things I like is they have a section on why to upgrade and they also have how to upgrade.

23:43 And I actually was not expecting this.

23:46 Their recommendation is unless you really know what's in all the Django releases, you probably ought to do it version by version.

23:55 Luckily, there's usually just one or two big versions that come out a year.

24:00 So you're probably not behind too much.

24:02 But so it discusses doing it one release at a time or a few at a time or just jumping all the way.

24:09 And then, of course, you know, it's from ResSys.

24:12 And it's fine that they say you could pay somebody to do it, like maybe us, which is cool.

24:17 But I do like I like the discussion around it.

24:20 The discussion about going one release at a time, if you really you can go by the release notes then of like what changed.

24:28 And you could just, you know, try to run it and run your test suite and see if everything's working.

24:32 and if it's not then you can check the release notes to figure out why and um it might be the

24:36 slower way to do it but it might not be that bad you could just sort of chug through it in a day or

24:41 so maybe i don't know it depends on how many of the features you're using that have been um changed

24:47 so yeah uh but that's cool you you might even be able to say hey claude i'm on this version of

24:53 django i want to be on that version here's the release notes uh help yeah yeah and also you

24:59 You could even tell this stuff.

25:01 You run my test, bump up one version at a time, run the test.

25:04 RICK VISCOMI: Read this guide, sketch it out, and let's figure it out.

25:08 Yeah, I think it's more important-- before we move on this top

25:11 of the road, Brian, really quickly--

25:11 BRIAN DORSEY: Yeah.

25:12 RICK VISCOMI: --is more important than perhaps some people

25:14 realize to upgrade Django.

25:16 Django does much more than most Python web frameworks.

25:22 It's got admin sections and all sorts of things, and every now and then, there's some kind of security issue

25:27 we should fix around x, y, and z.

25:29 You don't see that as much as Flask or FastAPI because the security problems are the one you write adding those features to your app yourself.

25:37 There's no CVEs for those, right?

25:40 But because Django comes with all that functionality, there's more of a surface area.

25:44 And sometimes you want to be on top of it.

25:45 So don't sleep on it.

25:46 Stay ahead.

25:47 That's also another reason to choose Django as well because it's used by so many people.

25:53 The security fixes get fixed pretty fast.

25:56 Yeah. The way your one-off web app gets security tested is not fun.

26:02 Yeah. Also performance and just keeping up with newer versions. There's good reasons.

26:11 Next up, I wanted to talk about the book. We recorded last Monday and on Tuesday, I was like,

26:18 I just want to get the first release done. So I spent a lot of time Monday night just writing

26:23 and finished up the first edition. And, and I, there's, there's a bunch of downloads. There's

26:30 six because I've had people ask about it. So there's, there's really the full book. And,

26:35 and then there's part two and part three are individual downloads, if you've already read

26:40 part of it. Anyway, I think there's, what do we got? 17 chapters or something like that now.

26:47 But I am, so now what I'm doing, what am I doing now is I'm, I'm going through and,

26:53 cleaning it up. There's some people that have submitted issues to my page, which is cool.

27:00 Some things to think about. So I am looking at feedback, but there's not that many. So I think

27:04 I might get the second edition pretty good quickly. And then I'm going to go through and read it all

27:10 and do the third edition or the third, not additions, third, I guess, the third pass through

27:16 it the third draft by reading it. So that's my process. I also put it up for, it's available

27:24 on pythontest.com, but you can also get it at leanpub.com now. I made it available there.

27:30 And I haven't, I don't think I've gotten anybody buy it from LeanPub yet. So yeah, you can,

27:36 you can, it's got like the cool set your own price slider.

27:39 Yeah, the UI is fun. Yeah, I like it.

27:42 So those are my extras.

27:44 Sweet.

27:45 All right.

27:46 I have a few, actually.

27:48 Nice article over at the New Stack.

27:50 They wrote up a long article on a recent podcast episode I did called Python.

27:55 What's coming in 2026?

27:57 So I did a nice episode of where are we going with Python with a bunch of folks, three core developers, steering council members, other celebrities and professors and so on.

28:11 And so they wrote this up and it's just, I thought it was really nice.

28:14 Like they really put together a, like, here's, here's what Brett Cannon said.

28:18 Here's what Barry Warsaw or Thomas Werther's wrote.

28:23 Jody virtual and so on.

28:25 So really nice.

28:26 And people can check that out.

28:27 So I'm just going to link to that going this way.

28:30 So Brian, you didn't even know this, this happened.

28:32 And to my knowledge, it is not a problem, which is miraculous.

28:36 I completely rewrote Python bytes over the weekend.

28:40 It was in Pyramid and using all synchronous code.

28:43 And I rewrote it in the same way that I did Talk Python into Quart, which is async flask,

28:48 and converted it all to async database queries and API calls and stuff like that.

28:53 Nice.

28:54 And guess what?

28:56 It seems to still be working.

28:58 Hooray.

29:01 Big changes like that make me nervous.

29:03 I mean, it was like 5,000 lines of code or change.

29:06 But anyway, that's really good.

29:07 So what was the reason?

29:09 Is it with just to try to get it faster or?

29:12 No, no, it's not a performance thing.

29:13 It's a, everything that I'm building these days, I'm building in Quart or FastAPI,

29:20 some async framework that supports types and that is actually being used.

29:24 And if you read this blog post that I like too for Talk Python, basically that was why.

29:27 Like I don't want it just hanging around on a framework that hasn't had a release

29:32 in like four years and just getting older.

29:35 You know what I mean?

29:35 Because what if something does come up with it?

29:37 They say, oh, there's a security vulnerability.

29:39 Well, how well do you think that's going to get fixed?

29:42 You know what I mean?

29:42 Maybe, but maybe not, right?

29:44 It just makes me nervous to have like old, not abandoned is a bit of a harsh word,

29:49 but basically no longer maintained code.

29:52 And so I was just sitting there on Saturday and like,

29:54 well, it's kind of hanging out here on the couch.

29:55 What can I do?

29:57 Let me see if I can just, I only have a few more apps to move over

30:02 to something more modern.

30:03 So I thought I'd give it a go and it went pretty well.

30:06 So there it is.

30:06 It eases up on your mental load, too, if you don't have to think about lots of different frameworks.

30:12 Exactly.

30:12 If I write some cool little library that works on one, I'm like, that would actually be cool to use on all these things.

30:17 If I want to add a new feature or something, I'm like, yeah, but it's not the same.

30:20 You know what I mean?

30:21 It is exactly.

30:22 It's nice to have it basically the same as well.

30:25 Once I kind of had my head around pytest, I was like, should I go try to become an expert at unit test also?

30:31 Nah, I don't want to.

30:32 Yeah, I mean, the equivalent would be like, you've got 2,000 tests and unit tests,

30:38 and you'd like, it's gonna be so much easier to do this feature in pytest because fixtures,

30:43 but it's not, right?

30:44 Like, you don't have to rewrite it.

30:46 It's not like it would make it run that much better, but if you're gonna continue to work on it,

30:50 on add features, you're like, I would rather not write against a thing

30:53 that is kind of done in a non-list.

30:55 Well, actually, that's one of the things I would totally throw Claude at, too,

30:58 to be able to say, you know, just rewrite these.

31:01 because I've already got the logic there.

31:03 I just want it different.

31:05 Yeah, that's what I did.

31:06 For rewriting Talk Python, I did it by hand, and I wrote about it, and it took weeks.

31:11 So what I did is I loaded a project with both Talk Python and Python Bytes,

31:15 and I said, I want to do this transformation.

31:17 Here's the docs for Quart, and here's Talk Python, which is a very similar code base

31:22 that has been migrated over.

31:23 So anytime you see an issue, see how we handle it over there, and it went well.

31:27 Oh, wow.

31:28 Yeah.

31:28 That's a good one.

31:29 Yeah.

31:30 Cool.

31:30 So anyway, hopefully we never speak of that again, because if I do, that probably means something broke.

31:35 All right.

31:36 Another thing I did over the weekend is I created an MCP server for Talk Python.

31:41 And maybe I'll do this for Python Bytes if people want as well.

31:44 So, I mean, we just talked about Tailwind, right?

31:47 and how basically the concept of making AIs more friendly

31:52 for your app or your project was the match that got struck within the tinderbox

31:59 of what was going on at tail end, right?

32:01 So this is kind of the opposite.

32:03 I'm like, hey, let's make it easier for people who are asking questions about Talk Python

32:08 to get good answers, not hallucinated junk answers or out of date answers about our podcast, right?

32:14 People are already asking, hey, chat, tell me about this for Talk Python.

32:18 Or they'll just ask a question about Python.

32:20 It'll give them an episode and tell them about it, right?

32:23 So what this does is it lets AIs access fast, real-time information at the time of asking,

32:30 not at the time of training, right?

32:31 So that's really cool.

32:32 So you can say like, well, what are the last, I'll even check this out.

32:36 I did this on Claude.

32:37 Hey, I have a question.

32:38 What are the last five episodes on Talk Python?

32:40 Let me use Talk Python's MCP server for this retrieval.

32:43 Getting recent episodes, boom.

32:45 Here they are, Disc Cash, January 12th.

32:47 Web Frameworks and Prod by their creators, January 5th.

32:50 You're in review, this is the article they just wrote up,

32:52 the one they wrote up.

32:53 And it's that, if I publish a new episode, wait 10 seconds and ask this question again,

32:58 it will put that episode in there 10 seconds later.

33:01 - So do you have to, okay, so maybe I missed this and you said it, do you have to like,

33:05 once you do an MCP server, do you have to like register it somewhere or do you?

33:08 - I can't figure, yeah, I can't figure out a great place.

33:11 So what I've done is I have a page up here MCP that says, hey, if you want to integrate this,

33:19 and LLMs will read this, right?

33:21 There's two things I've done.

33:22 So there's a full documentation on how this works, right, and so on.

33:26 And that's for the LLM, the AI agents to read and use.

33:30 You can then take that, take this URL here, talkbythunded.fm.com slash API slash MCP,

33:36 and put that in Claude, Claude Code, Cursor, and other places.

33:40 But ChatGPT won't work with it.

33:42 Don't know why.

33:43 They just don't.

33:44 It's really weird.

33:45 I can follow up on that later.

33:47 So like a user could say, hey, look at this.

33:51 Yes, exactly.

33:52 And then the other thing I did, well, hold on.

33:55 Let me just show you one more thing really quick while we're on the MCP side.

33:58 So you can ask more complicated questions like, let's zoom out a little.

34:02 Which episodes did Sebastian Ramirez appear on and which was the latest?

34:06 You can see it's like, oh, Claude goes and uses the MCP to search for guests.

34:11 Then it found Sebastian and that guest tells him what episodes are on.

34:14 So then it searched for the episodes based on the IDs of the episodes it found.

34:19 It's great.

34:19 I found it.

34:20 Here's, let me get all the episode details.

34:21 Okay.

34:22 I found this and it goes through and it says, here, Sebastian Ramirez appeared on five episodes of Talk Python To Me

34:27 and it lists out all five of them and their dates.

34:29 The most recent one was just a couple of weeks ago where he joined to talk about Django, Flask,

34:33 Quartlightstar, and FastAPI and so on.

34:35 Isn't that cool?

34:36 That is cool.

34:37 I think actually guests might use this to say, like, when was I on Talk Python?

34:43 - Yeah, actually one of the, this is crazy, one of the long ago guests from like eight years ago,

34:48 Sergio, when I announced this on one of the social medias,

34:51 he said, "I just asked, what did Sergio say?" You know, put his whole name, "What did Sergio say?"

34:57 And it actually said, he appeared on this episode, here's what he, you know, pulled up the transcripts

35:02 and analyzed it and said, "Here's what he said," and this was his main thesis of his appearance and so on.

35:08 I'm like, geez, so it's pretty cool.

35:10 So you asked like, well, if you don't have an MCP support

35:13 for your AI, what do you do?

35:14 Well, this other thing I did is I added something called

35:19 LLMs.txt, which is a idea by Jeremy Howard of Fast AI,

35:24 Fast Mail, many other things, I think also Fast HTML.

35:28 Anyway, bunch of stuff he's doing.

35:30 And the idea is it's kind of like robots.txt.

35:32 It's a place where you put stuff.

35:35 I think I just loaded it up here, don't have to type.

35:37 It's like a robots.txt, but it's there for what to do for LLMs.

35:42 So it gives you a little bit of background information

35:44 and so on that says, actually, here's how you can use our LLM API

35:50 or MCP server, even if you didn't register it,

35:52 long as the thing knows to look for this.

35:55 So I'm actually writing a blog post about all this soon.

35:56 So cool.

35:57 Yeah, pretty wild, right?

35:59 Yeah.

35:59 I think it'd be nice for Python bytes.

36:01 And also really quickly, probably come back to this

36:04 and I know this is going long.

36:05 There's a lot of, there's a lot of pushback to say,

36:08 I want to block AI from getting my content is AI is just stealing my copyrighted content.

36:13 And I have a lot of sympathy for that feeling.

36:16 But if you are not going so far as to block it, you probably should make the AI experience

36:20 as good as possible, right?

36:22 Rather than having, when I asked what was that episode about Sebastian,

36:26 if it could have said, well, my training data goes back to summer 2025.

36:31 So from that information I have, like a year ago,

36:35 he was on the show or something, right?

36:36 Rather than up to the minute information.

36:39 So either you block it completely or try to make it as good as possible.

36:43 And I have no intention of blocking it.

36:44 I feel like these might be the new search engines of five years in the future.

36:48 And I'm concerned that if you block it, you will just vanish.

36:51 You know what I mean?

36:52 So make it as good as possible.

36:53 That's my thinking.

36:54 And that's why I put those there.

36:56 I think there's valid choices on both ends of it.

37:00 And even in the middle of just like not doing anything.

37:03 Yeah, yeah.

37:03 You don't have to do anything.

37:04 But I mean, if you care about getting people coming and finding it, right?

37:07 Yeah.

37:07 I do think it's a valid point to say, I don't want it.

37:10 I'm going to block all the AIs.

37:11 I just think that is a, for something that needs to be publicly well-known, it's going

37:16 to be a risky bet.

37:18 Yeah.

37:19 I see the both sides of it.

37:21 I agree with you.

37:22 Yeah.

37:22 I mean, we as creators and people like content creators, writers, et cetera, it's a tough

37:29 place to be, right?

37:30 But my bet is that it's better to not be invisible, even if it's detracting from people visiting

37:37 our content.

37:38 I'm not going to say someone else is wrong if they choose otherwise.

37:39 All right.

37:41 Let's see.

37:42 Just because it's long, I'm going to skip that last one.

37:43 Let's just go straight to the joke.

37:45 How about that?

37:46 Yeah, I could use some levity.

37:50 And I think this is a good follow-up for this AI thing we just talked about.

37:54 So, God, it's on LinkedIn.

37:56 LinkedIn is so cringe, just all of it.

37:58 I mean, I have some-

37:59 It's mostly AI articles right now.

38:01 Yes, I was just listening to this guy who's on an entrepreneur podcast.

38:07 It's like how he built something like a podcast player or something like that.

38:11 And it's like, I'm a really, I got such a good idea.

38:14 I'm like, we're going to completely revolutionize things and it's going to be so much better.

38:18 So what I'm going to do is I'm creating a really smart AI system that will automatically

38:25 write LinkedIn posts for all of my clients.

38:27 And you can just pay a hundred dollars a month for like automated LinkedIn.

38:29 I'm like, God, it's so bad.

38:31 Anyway, I don't know.

38:33 I feel like though, this, this joke.

38:35 But why bother? Because all the readers are AI bots also. Most of the comments obviously didn't read it.

38:41 I know. It's so bad. But this still, there's a funny joke here, and it has to do with AI and vibe coding, okay?

38:47 Okay.

38:47 So everyone's a vibe coder these days, right? And you don't need to have real developers anymore. Developers are useless. We could just vibe our way. Look, our project manager has now written everything. It's all good.

38:58 And so this is like, I named this joke reverse Superman.

39:01 So there's a vibe coder walking around dressed in a Superman outfit, sees production on fire, runs into the phone booth, puts regular clothes on, goes, nothing for me to solve here.

39:16 Reverse Superman or vibe coding.

39:17 How about that?

39:18 Yeah.

39:18 Yeah, exactly.

39:19 Yeah.

39:20 Well.

39:21 Yeah.

39:24 Speaking of, yeah, I was talking, bringing up Rebsus.

39:27 I think it was the dude from Repsys that mentioned that vibe coding is awesome because he gets a lot of work of people building an MVP and then they scale and then it crashes and then they need to pay somebody to fix it.

39:43 Honestly, we're talking negative about it.

39:45 If you've got an idea and you can't code and you can get AI to make something that looks pretty much like you want, you could give that to a professional and say,

39:54 I want this, but nice. So it lasts. That is so much farther than here's my idea on a napkin.

40:00 Can we build this? You know what I mean? Like that, that is an accelerant and that's useful.

40:04 But the problem is when you're like, and we'll put it in production.

40:07 But well, yeah, but also just, I can see both sides. The, you, if you have scaling problems,

40:13 that means you've got customers and that's a good thing. You validated your idea. Um,

40:18 exactly. So yeah, it's so easy as a developer to think the hard part is to build the thing. Oh no.

40:24 no no no the hard part is to get anyone to care anyone to use it anyone to validate it to find

40:30 an idea that is good and then even if it is to get attention for it like yeah if you can solve that

40:35 problem then the coding part is like you know it's an automatable process and automate i mean like

40:41 you know you grind this way until code comes out and it works and it's got to look kind of like

40:45 that i hope that writing software becomes uh such that um that we get more problems solved that that

40:52 It used to be problems that aren't large enough to have a market.

40:57 And now hopefully with single or two developer teams or something,

41:00 we can get things done quicker and solve some of these small problems for people.

41:05 100%. That's going to happen.

41:07 It's absolutely going to happen. Probably.

41:10 Probably maybe.

41:11 Well, it's good talking to you again.

41:13 Thanks, everybody that showed up.

41:15 Lots of great conversations in the chat this week.

41:17 Indeed. Bye.

41:18 Bye.


Want to go deeper? Check our projects