WEBVTT
00:00:00.080 -->
00:00:04.720Hello and welcome to Python Bytes, where we deliver Python news and headlines directly to
00:00:04.750 -->
00:00:10.960your earbuds. This is episode 486, recorded June 30th, 2026. I'm Michael Kennedy.
00:00:11.400 -->
00:00:12.580And I'm Calvin Hendryx-Parker.
00:00:12.860 -->
00:00:18.120This episode is brought to you by us. Check out Six Feet Up if you want not just a consulting
00:00:18.370 -->
00:00:24.180partner, but an impactful consulting for good partner. And if you're looking to do better at
00:00:24.370 -->
00:00:29.980Python, data science, AI, check out Talk Python Training. I have three courses in the works right
00:00:30.000 -->
00:00:30.920which is interesting.
00:00:31.420 -->
00:00:33.160So there's going to be a lot of new stuff.
00:00:33.240 -->
00:00:36.060So be sure to either keep listening here
00:00:36.180 -->
00:00:37.880where I'll tell you about it or sign up over there.
00:00:38.260 -->
00:00:39.060And speaking of signing up,
00:00:39.400 -->
00:00:40.140pythonbytes.fm,
00:00:40.460 -->
00:00:41.040click on the newsletter.
00:00:41.380 -->
00:00:43.380You can sign up there and get notifications every week
00:00:43.660 -->
00:00:45.500as well as follow us on social media.
00:00:45.600 -->
00:00:46.900We got all the links for the show,
00:00:47.380 -->
00:00:48.120Calvin and me.
00:00:48.460 -->
00:00:49.980Now, Calvin, your first item
00:00:50.260 -->
00:00:51.320is something that has been sitting
00:00:51.960 -->
00:00:54.080in a browser tab on my computer
00:00:54.140 -->
00:00:55.040for at least three days.
00:00:55.140 -->
00:00:56.260I'm like, oh, I need to read this.
00:00:56.400 -->
00:00:56.860Come on now.
00:00:57.480 -->
00:00:58.300And I haven't gotten to it.
00:00:58.320 -->
00:00:59.940So I'm really happy you're going to take care of that for me.
00:01:00.080 -->
00:01:06.820Well, how could you not mention this? There was a talk at PyCon 2026, and it's a perennial talk
00:01:07.160 -->
00:01:11.760that has probably happened for the last two decades, starting with Larry Hastings. I didn't
00:01:11.760 -->
00:01:17.420go look up exactly what year he started doing the Gilectomy project, but the idea is find free
00:01:17.560 -->
00:01:22.380threading in Python, past, present, and future. So there's been a lot of discussion in the past.
00:01:22.400 -->
00:01:28.700Like I said, there's over two decades of history going into solving this problem. This gets back
00:01:28.720 -->
00:01:35.660into Python and the global interpreter lock and what we've done in the past to try and improve
00:01:35.980 -->
00:01:40.920performance. So for those who are kind of new to Python, that a global interpreter lock really
00:01:41.060 -->
00:01:46.020makes it difficult to run a single Python process and leverage multiple cores in your computers.
00:01:46.270 -->
00:01:52.340But every modern computer today has how many, even the Raspberry Pis have many cores in them. So this
00:01:52.340 -->
00:01:57.380would be a huge boost, we think, to Python to be able to take advantage of more computing power
00:01:57.400 -->
00:02:04.840going on inside those CPUs. So basically the GIL has prevented this true multi-threaded parallelism
00:02:04.840 -->
00:02:09.979in CPython since the very beginning. There's been multiple attempts. Many of them have failed on
00:02:10.100 -->
00:02:16.100performance grounds. Once you remove this global interpreter lock, that overhead of managing IO,
00:02:16.400 -->
00:02:23.680memory, etc., all the pieces going back and forth, usually adds in 100% or more additional
00:02:23.700 -->
00:02:28.260performance load than giving you the performance you'd think you'd get by leveraging multiple CPUs.
00:02:28.740 -->
00:02:36.040We got free threading in what Python 3.13 was experimental. And so it's still a 20 to 40%
00:02:36.310 -->
00:02:43.220single threaded slowdown. 3.14 brought that from kind of zero to 10%. So look for Python 3.15
00:02:43.820 -->
00:02:49.739coming in October to deliver basically a unified story here. They've made a huge amount of progress
00:02:49.760 -->
00:02:56.560here. During the talk, it's interesting because this always brings out the OG Pythonistas,
00:02:56.940 -->
00:03:00.720the core developers in the room for these kinds of talks. Actually, one of the members of our team
00:03:00.820 -->
00:03:06.140was in that talk at PyCon. Larry Hastings got up to the mic and Thomas Wooters, basically,
00:03:06.500 -->
00:03:11.840they both kind of played off each other on how this all came about. And the punchline was the
00:03:12.000 -->
00:03:17.440things that made this possible didn't exist when Larry was trying to do this. So there's been a ton
00:03:17.460 -->
00:03:23.480of development and innovation in the Python core to make this all go. The big part about this is now
00:03:23.580 -->
00:03:28.720that we're going to have a unified ABI. So like basically the interfaces into using this free
00:03:28.860 -->
00:03:33.000threading is going to be more unified, which means the same extension binaries, like if you're writing
00:03:33.160 -->
00:03:38.680C extensions, can work both on the gil and on free threaded builds. And looks like already greater
00:03:38.720 -->
00:03:43.980than 50% of the PyPy binary wheels support free threading. So that's a huge, well the top, sorry,
00:03:44.140 -->
00:03:48.780top PyPy binaries, not all of them, but of the major ones, we've already got half adoption.
00:03:49.480 -->
00:03:55.040I think that's a huge boost. I think there was a prediction made on from the stage that
00:03:55.490 -->
00:04:00.460free-threaded may become the default version of Python, but we'll see what happens.
00:04:00.590 -->
00:04:01.260Oh, excellent.
00:04:01.530 -->
00:04:04.540So have you followed along with this Gil story, Michael?
00:04:04.960 -->
00:04:06.240Yeah, everyone has.
00:04:06.790 -->
00:04:14.100I love at least having the capability to do threading. I would love to see this kind of
00:04:14.120 -->
00:04:20.480seamlessly integrated into async io i was just reading a reddit post about somebody who was
00:04:20.680 -->
00:04:26.480hating on async io async and await in particular and no it might not be the cleanest easiest
00:04:26.880 -->
00:04:30.780programming model in the world not python in particular but just in general but it's better
00:04:30.940 -->
00:04:36.920than managing a bunch of threads or processes or you know it's it's i think it's really quite neat
00:04:37.160 -->
00:04:43.440and lightweight but it's big limitation is as soon as you get anything computational boom
00:04:43.700 -->
00:04:49.280like the whole thing stops right yeah and so if you could just say you know put a decorator onto
00:04:49.360 -->
00:04:54.800a function like cpu bound or something or somehow you know kick it off with some kind of you know
00:04:54.980 -->
00:05:00.180computational thing but clearly like just await make that awaitable in the same event loop that
00:05:00.200 -->
00:05:05.260would be awesome yeah no this is a really good article from the Linux weekly news uh really in
00:05:05.340 -->
00:05:09.700depth coverage by jake on this site so i highly recommend folks who are interested in the history
00:05:09.720 -->
00:05:10.640and what the future is going to be,
00:05:11.000 -->
00:05:13.040check this out because we're finally going to have
00:05:13.400 -->
00:05:14.620free threading in Python.
00:05:14.980 -->
00:05:15.280Awesome.
00:05:15.600 -->
00:05:17.740So if you were running like a Django site,
00:05:17.790 -->
00:05:19.160I don't know, wouldn't it be cool?
00:05:19.600 -->
00:05:21.740Wouldn't it be cool to, I don't know,
00:05:22.240 -->
00:05:25.400search your admin site in the same way that you do?
00:05:25.420 -->
00:05:26.060No, Michael.
00:05:27.840 -->
00:05:31.100Like really nice, say, Visual Studio code.
00:05:31.230 -->
00:05:34.060You can hit shift command P for your command palette
00:05:34.320 -->
00:05:36.380or in Vivaldo, you can just hit command K
00:05:36.580 -->
00:05:38.900and you could say, I don't know,
00:05:39.120 -->
00:05:42.400copy all the links on the page by just typing a thing or two.
00:05:43.319 -->
00:05:48.520So thanks to Adam Parkin, I introduce Django admin site search.
00:05:48.720 -->
00:05:49.980And it's quite a slick thing.
00:05:50.080 -->
00:05:50.960It's fairly new.
00:05:51.000 -->
00:05:51.760It could use some more stars.
00:05:51.980 -->
00:05:52.840So there, it got one more.
00:05:53.460 -->
00:05:54.100In real time.
00:05:54.360 -->
00:05:54.820Real time update.
00:05:54.860 -->
00:05:55.100In real time.
00:05:55.700 -->
00:05:58.240Yeah, so you just hit command K like I just did in Vivaldi.
00:05:58.360 -->
00:06:02.060And by the way, if you do Vivaldi, you might need to remap one or the other, but whatever.
00:06:02.480 -->
00:06:04.740And then it brings up this nice search.
00:06:04.800 -->
00:06:08.640People probably familiar with this with some of the docs, like, the great
00:06:08.820 -->
00:06:13.020docs, docs have this and lots of others, but the idea is that it's really
00:06:13.220 -->
00:06:16.440deeply integrated into understanding what your, your Django needs.
00:06:17.260 -->
00:06:21.360So there's a little, little animated video here as by the way,
00:06:21.640 -->
00:06:24.540everyone out there building this, if you're building something specifically
00:06:24.740 -->
00:06:26.880to do with UI at a minimum needs a screenshot.
00:06:27.260 -->
00:06:32.220I've seen like entire, like web website design frameworks that have had like
00:06:32.240 -->
00:06:34.200zero, zero pictures.
00:06:34.330 -->
00:06:35.900I'm like, I have no idea what you're talking about.
00:06:36.020 -->
00:06:37.840Like the words sound good, but picture people.
00:06:38.120 -->
00:06:40.140They'll resort to interpretive dance before they'll
00:06:40.140 -->
00:06:41.020put a screencast in.
00:06:41.220 -->
00:06:42.080Yeah, exactly.
00:06:42.330 -->
00:06:42.460Exactly.
00:06:42.840 -->
00:06:46.540So the idea is it just works out of the box, basically very little config.
00:06:47.140 -->
00:06:51.340It's when you type something into it, it searches app labels, model labels
00:06:51.520 -->
00:06:53.440and fields and model instances.
00:06:54.140 -->
00:06:57.100And what's cool about it is it can search in two different ways.
00:06:57.540 -->
00:07:02.200So for smaller sites or sort of ad hoc searches, it will
00:07:02.200 -->
00:07:04.040and dunder, I can, not a dunder,
00:07:04.260 -->
00:07:05.160underscore underscore I contains,
00:07:05.840 -->
00:07:07.960which is, is any part of this text
00:07:08.120 -->
00:07:09.960I've typed contained within here
00:07:10.240 -->
00:07:12.580without regard to case, right?
00:07:12.800 -->
00:07:15.940That's cool, but that's not always indexed, right?
00:07:16.020 -->
00:07:18.040I mean, not every single field has an index
00:07:18.060 -->
00:07:18.800for these sorts of things.
00:07:19.260 -->
00:07:21.280So that can be slow on large projects.
00:07:21.320 -->
00:07:22.460So you can also tell it,
00:07:23.400 -->
00:07:26.180use the model admins get search results method,
00:07:26.620 -->
00:07:28.660which can be an indexed query.
00:07:29.000 -->
00:07:29.460That's cool, right?
00:07:29.680 -->
00:07:30.300That's super cool.
00:07:30.600 -->
00:07:31.580And this is super nice.
00:07:32.080 -->
00:07:34.280I've seen a couple of people doing work on the admin.
00:07:34.760 -->
00:07:35.740This is a much-needed feature.
00:07:36.220 -->
00:07:37.360Yeah, I think it's really neat.
00:07:37.680 -->
00:07:40.620It has a built-in auth, so users can only search apps and models
00:07:40.780 -->
00:07:41.840that they have permissions to view.
00:07:42.140 -->
00:07:43.900Results appear on type.
00:07:44.100 -->
00:07:47.120It's active search, I guess, is the way you would describe it.
00:07:48.080 -->
00:07:49.400And keyboard navigation.
00:07:49.860 -->
00:07:51.460So obviously Command K, like I said.
00:07:51.460 -->
00:07:51.960It's a must.
00:07:53.080 -->
00:07:55.000It's a good one.
00:07:55.220 -->
00:07:55.700You know what?
00:07:55.730 -->
00:07:56.600I think, no.
00:07:57.580 -->
00:07:59.920I think, yeah, I think that's the default on Chrome.
00:08:00.080 -->
00:08:04.800trying to figure out if that is, which one is it? I may have changed it. I think maybe command E is
00:08:04.840 -->
00:08:09.880the default on, I'm sorry, Vivaldi for its command palette, but you know, it's layers of command
00:08:10.000 -->
00:08:14.180palettes you might have to battle with. Anyway, it supports all the way back to 3.8. They don't even
00:08:14.360 -->
00:08:18.460care if Python's supported. They're going to support it. And Django 3.2 to 6. So yeah, that's
00:08:18.780 -->
00:08:23.240pretty much it. Super easy to add in. Not a lot, not a lot to do there, but it's customizable.
00:08:23.660 -->
00:08:27.979Yeah. No, I like that. I mean, as a Django developer, that's definitely a missing piece
00:08:28.000 -->
00:08:30.420because I feel like it's like the old days of the internet
00:08:30.530 -->
00:08:31.320where there was no search
00:08:31.320 -->
00:08:32.680and you had to always know where to browse to
00:08:32.690 -->
00:08:34.780to find the things in the admin console.
00:08:35.300 -->
00:08:35.479Yeah.
00:08:35.680 -->
00:08:37.740This is going to save a lot of people a lot of time,
00:08:37.820 -->
00:08:40.000especially if you've got a larger Django app
00:08:40.150 -->
00:08:42.000and you've got hundreds of models in there.
00:08:42.150 -->
00:08:43.780Like this is going to be a lifesaver.
00:08:44.120 -->
00:08:46.340And some people use the admin section
00:08:46.800 -->
00:08:49.840for like all the admin staff of the Django site.
00:08:50.060 -->
00:08:51.620I don't recommend that, but...
00:08:51.700 -->
00:08:52.160I don't know.
00:08:52.160 -->
00:08:53.900I don't know either, but people do.
00:08:54.030 -->
00:08:55.320And so having this to navigate it,
00:08:55.330 -->
00:08:56.100I think would be good, right?
00:08:56.170 -->
00:08:56.260True.
00:08:56.740 -->
00:09:00.400In a last minute crunch, when you're trying to triage something, that admin is indispensable.
00:09:00.920 -->
00:09:02.040I guess it depends, though.
00:09:02.420 -->
00:09:07.540You know, is this an internal company app that 20 people use and three people admin?
00:09:07.740 -->
00:09:07.860Yeah.
00:09:08.140 -->
00:09:11.120How serious you got to take that versus Instagram?
00:09:11.460 -->
00:09:11.920Right.
00:09:12.600 -->
00:09:13.920I bet it's not admin through the admin.
00:09:14.520 -->
00:09:15.800We should get some, we should find out.
00:09:15.860 -->
00:09:19.380We should get some inside news into whether they use the admin or not.
00:09:19.840 -->
00:09:20.860What if it is?
00:09:22.420 -->
00:09:23.760No, you should see ours.
00:09:23.760 -->
00:09:24.520Our is amazing.
00:09:24.640 -->
00:09:26.500Well, I can tell you right now, someone's going to mention it in the comments.
00:09:26.660 -->
00:09:27.420they're going to call us out.
00:09:27.660 -->
00:09:28.280Let's do it.
00:09:28.400 -->
00:09:28.720Let's do it.
00:09:29.400 -->
00:09:30.900We could ask an AI about it, probably.
00:09:31.230 -->
00:09:31.840A local AI.
00:09:32.100 -->
00:09:34.080And local AI, actually, this is really exciting.
00:09:34.680 -->
00:09:39.500I have been certainly on the bleeding edge of local AIs for quite some time,
00:09:39.720 -->
00:09:41.460running them on my framework desktop here.
00:09:41.660 -->
00:09:45.800And then I've always managed to try and buy a MacBook Pro with Apple Silicon
00:09:45.980 -->
00:09:47.300and then about as much memory as I can afford.
00:09:48.100 -->
00:09:51.760And so being able to run these local models has been mostly an experiment up to this date.
00:09:52.820 -->
00:09:54.080Gemma 4 has gotten really good.
00:09:54.220 -->
00:10:00.100Some of them, you know, Mistral, Dev, and Devstral have been really interesting for live coding agents.
00:10:01.379 -->
00:10:07.300But this article that came across my feed today, multiple people in the company actually posted this,
00:10:07.690 -->
00:10:12.900which is Quinn 3.627B is the sweet spot for local development.
00:10:13.220 -->
00:10:17.680So there's a couple models that just got released in the Quinn family of open weights models.
00:10:18.100 -->
00:10:27.280There's also a quantized version of it and a multi-token prediction version of this model out there, which gets some pretty blazing speed.
00:10:27.760 -->
00:10:35.020On his M5 MacBook Max, he was getting 32 tokens per second with the 8-bit quantized version of it.
00:10:35.640 -->
00:10:45.040But if you run the 4-bit quantization, you can actually run it on a 32 gigabyte or less MacBook machine, and you get pretty blazing speeds.
00:10:45.140 -->
00:10:48.360I think they put a chart in here on the bottom.
00:10:48.920 -->
00:10:50.100But the nice bit about this article
00:10:50.600 -->
00:10:52.260is he compares the various models,
00:10:52.420 -->
00:10:54.800what they're capable of inside the same family.
00:10:55.540 -->
00:10:57.200And it actually gives you a whole how-to
00:10:57.500 -->
00:11:00.960on how to hook this up using LLAMA CPP and OpenCode.
00:11:01.220 -->
00:11:03.400And so you can actually rebuild the demos
00:11:03.660 -->
00:11:05.500that the author wrote here.
00:11:05.660 -->
00:11:07.680So using OpenCode, hooked it up,
00:11:07.960 -->
00:11:10.100and then wrote up a Minesweeper app,
00:11:10.380 -->
00:11:12.680and then again went into some depth
00:11:12.840 -->
00:11:13.980on the performance metrics here.
00:11:14.140 -->
00:11:19.360So you can see the 3635B A3B model on the Apple MLX,
00:11:19.860 -->
00:11:22.66085 tokens per second running with that model.
00:11:22.820 -->
00:11:24.500That is incredibly usable.
00:11:24.800 -->
00:11:26.860But the real sweet spot for the development
00:11:27.300 -->
00:11:30.920was using Lama CPP and getting 32 tokens per second
00:11:31.120 -->
00:11:32.340using about 42 gig of RAM.
00:11:32.820 -->
00:11:34.640So if you've got a 64 gig machine,
00:11:34.920 -->
00:11:37.320this is absolutely doable for developers
00:11:37.400 -->
00:11:39.920that are out there today and felt like it was,
00:11:40.240 -->
00:11:43.139I mean, this is not gonna be like mind blowing
00:11:43.160 -->
00:11:48.740for anyone who's already using frontier level models like Opus and Sonnet and GPT-55 Codex to
00:11:48.800 -->
00:11:56.640do code, but this is local. Everything stays on your machine. The data never leaves. It's tool
00:11:56.820 -->
00:12:02.560using, so there's still risk. You're using models that have been trained by foreign nations and who
00:12:02.680 -->
00:12:06.000knows what's going on inside of these things, but this one seems to be gaining a lot of traction
00:12:06.440 -->
00:12:12.620and actually producing, you know, I don't think it's mythos level yet, but we're only, what, maybe
00:12:12.540 -->
00:12:17.420six, nine months behind on open waste models that I can run myself. So this looks really good.
00:12:17.820 -->
00:12:21.700The interesting thing he also pointed out in the article was, and I wasn't aware of it,
00:12:21.870 -->
00:12:26.560the, I've been an OLAMA user for quite some time. And I think I'm going to be switching to the
00:12:26.860 -->
00:12:34.000LAMA CPP version. There's, there's been some authorship and IP concerns between the two groups
00:12:34.460 -->
00:12:40.199that I wasn't aware of. And I think I feel like to be responsible, I should switch over to using
00:12:40.220 -->
00:12:45.720that or I'm considering VLLM on my framework desktop so that I can run multiple models
00:12:45.980 -->
00:12:49.920simultaneously and have multiple instances of the same model running so that, for example,
00:12:49.920 -->
00:12:53.620my home assistant can have multiple people in the house make requests simultaneously.
00:12:54.000 -->
00:12:58.760So this is pretty exciting. I can't, I've not tried 3.6. I have 3.5 currently running
00:12:59.380 -->
00:13:04.540on my desktop at the moment. And that has been impressive from a home assistant standpoint. I've
00:13:04.540 -->
00:13:10.180not used it for much of my coding agents, but I'm going to give 3.6.27b a real shot using
00:13:10.200 -->
00:13:12.600I've been using, again, Pi, still my daily driver.
00:13:13.220 -->
00:13:16.560There was a new release of Superpowers since our last episode
00:13:16.900 -->
00:13:21.140that has made the Pi experience a lot more user-friendly and smooth.
00:13:21.170 -->
00:13:22.960So check that out with Quinn36.
00:13:23.500 -->
00:13:23.940It's really neat.
00:13:24.460 -->
00:13:26.140One thing is, can you pull up that speed?
00:13:26.480 -->
00:13:26.700Yeah.
00:13:28.180 -->
00:13:30.760I love how they have like a heat picture.
00:13:31.840 -->
00:13:34.860It's definitely going to heat up your laptop if you're using these tools.
00:13:35.920 -->
00:13:40.080What surprises me on macOS is that MLX is the slowest.
00:13:40.340 -->
00:13:46.500i know i was surprised that too i think he mentions it down here in the text um rtx consumer rtx if
00:13:46.560 -->
00:13:51.240you've got enough vram on that card that is the way to go if you're serious about running these
00:13:51.340 -->
00:13:58.260models i believe but just the standard llama cpp plus mtp uh with that quantized version 105 tokens
00:13:58.300 -->
00:14:04.660per second that's but but 32 tokens per second is plenty fast for doing code dev where you're
00:14:05.140 -->
00:14:08.940you're in it you're reviewing you're using it as a true assistant and you're not trying to just
00:14:08.960 -->
00:14:14.520vibe code away an app. Another takeaway that when I see anything like this, definitely a cool topic,
00:14:14.820 -->
00:14:18.960is I don't know what percentage of people it is out there. Maybe I'd love to hear your thoughts
00:14:18.960 -->
00:14:25.820on this, but I think there's certainly a strong contingent of people out there who want AI to go
00:14:25.980 -->
00:14:30.480away or think the bubble's going to burst and it's just not worth getting into or paying attention to.
00:14:30.700 -->
00:14:36.380Like I know OpenAI or Anthropic or whatever, the whole thing is just going to go up like in a
00:14:36.640 -->
00:14:40.480smoking dumpster fire in six months so why would I change the way I work and
00:14:40.680 -->
00:14:44.260melt my brain and whatever else you leave people say about it this stuff is
00:14:44.320 -->
00:14:48.220not going away this is on this is here right this is on a hugging face the
00:14:48.260 -->
00:14:52.080models are published on hugging face this is open open source and published I
00:14:52.220 -->
00:14:55.420say open source I shouldn't say open source they're open weights some of the
00:14:55.460 -->
00:15:06.340models are fully open source but this is this is sustainable maintainable and a
00:15:06.360 -->
00:15:12.500sides of that equation, the answer lies in the middle. And the answer really is that these tools
00:15:12.550 -->
00:15:17.840are great amplifiers of your existing skills. So if you're already good at the software development
00:15:18.020 -->
00:15:22.040lifecycle, these things make you better. If you're not good at it, these things can make you worse.
00:15:22.820 -->
00:15:25.420Exactly. You have no idea? That's called vibe coding.
00:15:25.900 -->
00:15:29.780Right. Let's all be realistic about what this is all about.
00:15:30.380 -->
00:15:32.060Yeah. And I'm also jealous of your framework.
00:15:32.180 -->
00:15:38.720So, I mean, side note, Apple raised their prices this week on MacBook Pros.
00:15:39.110 -->
00:15:41.220I went and double checked and Framework had raised their prices too.
00:15:41.490 -->
00:15:48.720So the same 128 gigabyte machine is like about six or $700 more than it was a year ago.
00:15:49.160 -->
00:15:49.440Wow.
00:15:49.710 -->
00:15:49.840Yeah.
00:15:50.460 -->
00:15:50.820I don't know.
00:15:50.960 -->
00:15:52.279Maybe I'll have a...
00:15:52.890 -->
00:15:55.880I was going to start this episode with a good morning.
00:15:56.460 -->
00:15:57.440Good morning, everyone.
00:15:58.959 -->
00:16:06.820at apple we're so we've been so honored and proud to have pretty good fleeced you on ram and
00:16:07.100 -->
00:16:12.500on nvvm that today we're taking it to an entirely new level like
00:16:14.700 -->
00:16:19.860oh my goodness yeah so the price is like you're gonna be you're gonna be excited michael oh boy
00:16:20.380 -->
00:16:24.860let me tell you what we we're gonna bring on calvin to show you what we've built and boy is
00:16:24.780 -->
00:16:31.100expensive no like seriously just really quick follow-up to the sidebar like my i think my macbook
00:16:31.340 -->
00:16:36.540pro 16 inch which i just bought just received i bought it a little bit before because it took a
00:16:36.540 -->
00:16:41.760while but just got two weeks ago something like that i think it went up eight hundred dollars yeah
00:16:42.050 -->
00:16:47.820i i luckily i bought two in preparation for this prior to the rise in price so i just saved
00:16:47.920 -->
00:16:52.199myself sixteen hundred dollars that's awesome there's some guy math we could do there's totally
00:16:52.140 -->
00:16:57.040some guy math going on here all right what are we gonna spend it on let's let's exactly let's talk
00:16:57.160 -->
00:17:02.260about uh we're spinning on motorcycles calvin you know what we're gonna spend it we're absolutely
00:17:02.480 -->
00:17:07.980gonna spend our motorcycles so i would i would like to tell people about what might be the largest
00:17:08.900 -->
00:17:15.240single PEP except finalization in in one batch ever good go on that sounds like this sounds
00:17:15.260 -->
00:17:22.699exciting it sounds exciting it's more interest like oh that's weird interesting so all in one
00:17:23.959 -->
00:17:27.699one go i believe these are right perhaps i might be off by i think i might be off by one anyway
00:17:27.920 -->
00:17:33.460it's basically six six eight six eight seven six nine one there's like 10 peps or something that
00:17:33.580 -->
00:17:38.680got fine with the final just all at one shot then when you look at them carefully so i i linked to
00:17:38.800 -->
00:17:45.220the um 11 yeah it's 11 false chains i linked to the commit that did all this and so you'll see
00:17:45.240 -->
00:17:49.240like if we expand it here, the diff is not always perfect.
00:17:49.740 -->
00:17:53.640Pep 668 making Python based environments externally managed.
00:17:53.980 -->
00:18:01.320But if you go over and you check out Pep Pep 668, which is here, it was created.
00:18:01.380 -->
00:18:01.600Wow.
00:18:02.260 -->
00:18:03.940May 20, 2021.
00:18:04.500 -->
00:18:05.020House clean.
00:18:05.040 -->
00:18:06.580Others are like 2023 and so on.
00:18:06.920 -->
00:18:08.220So what had happened here?
00:18:08.400 -->
00:18:10.480Oh gosh, I forgot who, who did the switch.
00:18:10.680 -->
00:18:14.659I guess I could probably look at the commit zero intensity, which is
00:18:14.680 -->
00:18:21.060Peter, I didn't really need to click on that. In fact, that was useless. Peter Birma,
00:18:22.320 -->
00:18:28.140core developer, did all this. And what it really is, is there have been all these peps that were
00:18:28.360 -->
00:18:33.980sitting in accepted, but not final. And accepted means, well, accepted final means it's shipping.
00:18:34.400 -->
00:18:40.680But clearly the one that went, was out and accepted and final in 2021 is out. So there's
00:18:40.660 -->
00:18:46.480just a bunch of peps 11 in particular that were just hanging around and never ever got moved to
00:18:46.640 -->
00:18:52.220final for some reason you know reasons i don't know someone was not a completionist exactly yes
00:18:52.820 -->
00:18:59.260yeah exactly someone's like oh we're gonna get all the little badges baby all the badges that we put
00:18:59.260 -->
00:19:05.120on here yeah so for example this one is uh 2022 october 2022 and so on so i just think this
00:19:05.120 -->
00:19:09.480is kind of interesting and people have been looking at these these older peps and going like
00:19:09.740 -->
00:19:11.240Why is this not final?
00:19:11.340 -->
00:19:11.980Why is it just accepted?
00:19:12.380 -->
00:19:13.200Well, you called it out.
00:19:13.480 -->
00:19:14.200Not completionist.
00:19:14.560 -->
00:19:15.320Yeah, I'm glad.
00:19:15.460 -->
00:19:17.180Well, it's nice to see those all cleaned up
00:19:17.340 -->
00:19:19.840so that at least there's a canonical source of the truth here.
00:19:20.160 -->
00:19:20.720Yeah, absolutely.
00:19:20.780 -->
00:19:22.080I totally agree.
00:19:23.140 -->
00:19:25.200Bit of comment out in the audience here.
00:19:25.320 -->
00:19:26.360We've got Pixel.
00:19:26.680 -->
00:19:28.020It says, like the sentence,
00:19:28.360 -->
00:19:32.660it makes you worth if you don't know the software cycle.
00:19:32.700 -->
00:19:35.100Because I saw people during Vibe Coding, and they're happy,
00:19:35.480 -->
00:19:38.920but they didn't know what it actually makes them worth.
00:19:39.000 -->
00:19:39.520But yeah, it's interesting.
00:19:39.820 -->
00:19:40.540Very true statement.
00:19:41.040 -->
00:19:41.240Yeah.
00:19:41.500 -->
00:19:47.220And also, yes, also being a subject matter expert combined with some coding skills is absolutely.
00:19:47.920 -->
00:19:48.280100%.
00:19:48.340 -->
00:19:50.700It does make being a generalist a little more useful.
00:19:51.120 -->
00:19:51.660Yeah, actually.
00:19:51.860 -->
00:19:53.520Not exclusively, but also.
00:19:53.940 -->
00:19:56.200I finally come into my own being the generalist that I am.
00:19:56.280 -->
00:19:56.860Yes, exactly.
00:19:57.020 -->
00:19:57.180Me too.
00:19:57.360 -->
00:19:58.400My time is here.
00:19:58.960 -->
00:19:59.540It's incredible.
00:19:59.820 -->
00:20:00.640I can do all the things.
00:20:00.810 -->
00:20:03.660Well, I mean, I've just found myself building so much more stuff now.
00:20:03.910 -->
00:20:06.040Like I know the patterns I wanted to get done.
00:20:06.160 -->
00:20:07.980And it was just a lot of busy work that I didn't feel like doing.
00:20:08.140 -->
00:20:09.480but now I can make those tools super quick.
00:20:09.880 -->
00:20:10.220I love it.
00:20:10.660 -->
00:20:10.940Big fan.
00:20:11.600 -->
00:20:12.760Yeah, big fan, big fan.
00:20:12.960 -->
00:20:15.320And it's like, well, if it took me two hours, this is worth it.
00:20:15.440 -->
00:20:16.860If it took me two weeks, it's not worth it.
00:20:17.060 -->
00:20:17.320Totally.
00:20:17.900 -->
00:20:18.980Now it takes you two hours.
00:20:19.220 -->
00:20:20.100That's absolutely the math.
00:20:20.660 -->
00:20:21.020All right.
00:20:22.320 -->
00:20:24.640And you can power it over your framework in the basement.
00:20:24.940 -->
00:20:25.020Okay.
00:20:25.340 -->
00:20:25.720That's true.
00:20:25.780 -->
00:20:27.520So let's go and jump into extras.
00:20:27.580 -->
00:20:28.140Yes.
00:20:28.340 -->
00:20:30.980And I already got my screen up, so I'll just grab the first one here.
00:20:31.080 -->
00:20:31.420Go for it.
00:20:32.640 -->
00:20:37.420So I wrote a blog post inspired by a guy named Pito,
00:20:37.900 -->
00:20:42.020who had reached out to us because you and I both were a fan talking about how
00:20:42.380 -->
00:20:44.340ELS instead of LS is quite cool.
00:20:44.720 -->
00:20:45.280It is quite cool.
00:20:45.640 -->
00:20:46.380It is quite cool.
00:20:46.590 -->
00:20:50.420You can go and when you LS on something,
00:20:50.420 -->
00:20:51.380if you alias it,
00:20:51.660 -->
00:20:52.700although that has some drawbacks,
00:20:52.860 -->
00:20:54.760it uses color for like hidden file,
00:20:54.850 -->
00:20:55.280like GitHub.
00:20:55.720 -->
00:20:57.160.github is shown if you LS,
00:20:57.430 -->
00:20:58.860even though it's technically hidden,
00:20:59.320 -->
00:21:02.140but it uses color to show that it's like .gitignored.
00:21:03.140 -->
00:21:04.700It shows symlinks,
00:21:05.000 -->
00:21:05.740which is really cool.
00:21:05.980 -->
00:21:08.680I've learned how to create a symlink in Git.
00:21:08.870 -->
00:21:11.780So when you check it out, it's symlinks on the new machine, which is always fun.
00:21:12.280 -->
00:21:14.280Use this icon, all this stuff is super cool.
00:21:14.660 -->
00:21:18.480But Pito pointed out something is weird with installing this package.
00:21:19.020 -->
00:21:23.760If you click on the PyPI link, it says version six, some of the links
00:21:24.180 -->
00:21:25.440404, which is kind of weird.
00:21:25.680 -->
00:21:29.960But then if I actually go and click on say the repository, it takes me to
00:21:29.960 -->
00:21:33.340the rust based ones like, oh, this must be the rust one.
00:21:33.420 -->
00:21:37.220Because when I go to the PyPI and I click on the repo, it goes to the Rust one.
00:21:37.400 -->
00:21:39.420He points out, no, that's the Python one.
00:21:39.760 -->
00:21:42.840And I'm like, wait a minute, is there something sus going on with this thing?
00:21:43.360 -->
00:21:45.660And he inspired me to dig into it.
00:21:45.800 -->
00:21:51.900So what is going on is GitHub is redirecting to the newer version when you click on it.
00:21:52.200 -->
00:21:55.500But PyPI actually installs a frozen 2023 version.
00:21:56.000 -->
00:21:57.180So I wrote this really short article.
00:21:57.520 -->
00:21:58.040I didn't know that.
00:21:58.340 -->
00:21:58.820Yes, I know.
00:21:58.860 -->
00:22:04.480I didn't either because everything about it like redirects to the one that you think you're going to want, but it's not.
00:22:04.820 -->
00:22:09.380So anyway, it talks about like, okay, did you install this with uv or PIPX or somehow pip install?
00:22:09.880 -->
00:22:16.480If you did, you're getting the old frozen in place slower one that you think is not what you're getting, but that's what you're getting.
00:22:16.880 -->
00:22:18.340And here's how to actually install it.
00:22:18.620 -->
00:22:19.640Well, I'm going to go do that.
00:22:20.260 -->
00:22:20.780Yes, exactly.
00:22:20.900 -->
00:22:23.320So I wrote a really short write up about this.
00:22:23.600 -->
00:22:24.240What the PLS?
00:22:26.660 -->
00:22:27.780What the PLS, PLS?
00:22:27.820 -->
00:22:28.340Come on now.
00:22:29.160 -->
00:22:34.020all right kyle well if you think that makes your command line glamorous i've got something for you
00:22:34.220 -->
00:22:39.620you're gonna crush it they were gonna remember to your first crush this i mean because the command
00:22:39.650 -->
00:22:44.360line was probably my first crush if i'm gonna be honest out there and if you want your command line
00:22:44.360 -->
00:22:51.660to look absolutely beautiful and glamorous there's a library out here called charm that can do all
00:22:51.780 -->
00:22:58.400kinds of fun uh extensions so forms and uh it's got interfaces to build inside there with like
00:22:58.440 -->
00:23:04.620ssh animations physics based animations you know get the bubble tea component for your toolkit
00:23:05.210 -->
00:23:11.480so you should definitely check out uh crush or no sorry it's charm.land to add some fun bling
00:23:11.690 -->
00:23:17.600to your terminal so if you think that if pls was just the start uh oh my goodness charm is gonna
00:23:17.920 -->
00:23:23.420you're gonna be busy uh michael going down the rabbit hole dang it i was just starting to work
00:23:23.300 -->
00:23:25.020on some projects and now here I am.
00:23:25.440 -->
00:23:25.540Yeah.
00:23:25.700 -->
00:23:27.700Rebuilding my terminal prompt again.
00:23:28.160 -->
00:23:28.260Yep.
00:23:28.510 -->
00:23:29.280It looks pretty cool.
00:23:29.430 -->
00:23:30.460So I've not checked it out.
00:23:31.180 -->
00:23:33.420I think the open code folks may be using some of this.
00:23:34.450 -->
00:23:36.660But yeah, it looks like a lot of fun.
00:23:37.130 -->
00:23:40.500So if you want to go bling your terminal, this is a way to do it.
00:23:40.820 -->
00:23:42.200And it's not very popular, is it?
00:23:42.520 -->
00:23:43.220No, not at all.
00:23:43.380 -->
00:23:45.580213,000 stars over on GitHub.
00:23:46.030 -->
00:23:46.360Not bad.
00:23:46.660 -->
00:23:47.180Pretty cool.
00:23:47.470 -->
00:23:49.440Add some fun to your terminal.
00:23:50.080 -->
00:23:52.160The other bit, and I kind of already alluded to this,
00:23:52.540 -->
00:23:55.840was building a fully local voice assistant in 2026
00:23:56.900 -->
00:23:57.260using Python.
00:23:57.590 -->
00:23:59.760So this actually is a Raspberry Pi friendly version.
00:23:59.990 -->
00:24:01.660As for those of you who are following along at home,
00:24:01.840 -->
00:24:03.540I've been doing the more ridiculous version
00:24:03.700 -->
00:24:05.000with like a RTX 3070,
00:24:05.620 -->
00:24:08.400running my voice models on a giant graphics card.
00:24:08.840 -->
00:24:10.320This runs on a Raspberry Pi.
00:24:10.600 -->
00:24:11.620A couple of different models.
00:24:12.420 -->
00:24:13.880He mentions here in the article
00:24:14.080 -->
00:24:18.100with the full architecture and how to set it all up
00:24:18.200 -->
00:24:18.840and how to get it going.
00:24:19.470 -->
00:24:21.340And you can even run it on old Raspberry Pis.
00:24:22.040 -->
00:24:26.580So there's a 40 meg model, the small 015 version.
00:24:26.680 -->
00:24:27.000Meg.
00:24:27.460 -->
00:24:28.300Yeah, megabyte.
00:24:29.260 -->
00:24:29.620Megabyte.
00:24:29.930 -->
00:24:30.020Yeah.
00:24:30.050 -->
00:24:30.380Wow, okay.
00:24:31.140 -->
00:24:33.840Inaccurate, but we'll run all of those.
00:24:34.180 -->
00:24:34.960So if you've got a more
00:24:34.960 -->
00:24:36.060So it's like Siri, basically.
00:24:39.180 -->
00:24:39.440Yeah.
00:24:39.580 -->
00:24:41.720Wow, shots fired.
00:24:41.720 -->
00:24:42.920It's default failure mode.
00:24:42.920 -->
00:24:44.500This is what I found on the internet.
00:24:45.280 -->
00:24:45.640Yeah.
00:24:45.640 -->
00:24:48.560But you can see even the largest one, 1.8 gig,
00:24:48.560 -->
00:24:50.700you can even run that on probably the largest
00:24:50.720 -->
00:24:52.080just of Raspberry Pis that are out there,
00:24:52.480 -->
00:24:53.540or just on a CPU,
00:24:54.000 -->
00:24:55.780and not have to use a full blown GPU
00:24:56.540 -->
00:24:58.000to run your voice pipeline.
00:24:58.500 -->
00:25:00.840This is part of the Platypush platform,
00:25:01.320 -->
00:25:03.320which is not necessarily a competitive Home Assistant,
00:25:03.520 -->
00:25:04.500but is like Home Assistant,
00:25:04.780 -->
00:25:07.060in that you can glue together Zigbee
00:25:07.980 -->
00:25:09.820and Wi-Fi IoT devices
00:25:10.220 -->
00:25:11.760and all those kinds of things inside your house.
00:25:12.020 -->
00:25:13.580So I just thought that was really interesting
00:25:13.720 -->
00:25:17.260because it's on my list of things to keep up to date on,
00:25:17.480 -->
00:25:21.400which is I want to replace all the ladies in the box in my house,
00:25:21.900 -->
00:25:22.400if you know what I mean.
00:25:22.880 -->
00:25:23.000Yeah.
00:25:23.440 -->
00:25:24.080And that's what I got.
00:25:24.080 -->
00:25:25.800What about something?
00:25:26.300 -->
00:25:27.320You're a Docker person.
00:25:27.680 -->
00:25:27.900I am.
00:25:29.070 -->
00:25:30.440And you've done a lot of local Docker.
00:25:30.700 -->
00:25:32.000I'm more of a server Docker.
00:25:32.480 -->
00:25:33.920One of the things I think would be really cool,
00:25:34.000 -->
00:25:37.380it'd be so easy to set this into an always auto starting
00:25:37.620 -->
00:25:39.880and less stopped sort of Docker thing.
00:25:40.300 -->
00:25:41.860But at least on macOS,
00:25:42.520 -->
00:25:44.980can you give it access to the GPUs or NPUs?
00:25:45.720 -->
00:25:46.100You know what I mean?
00:25:46.180 -->
00:25:50.280because it's basically Linux within macOS,
00:25:50.470 -->
00:25:51.640which is not exactly the same.
00:25:51.640 -->
00:25:55.720I have not tried the GPU on Docker with macOS.
00:25:56.060 -->
00:25:57.160I am using this on,
00:25:57.300 -->
00:26:01.940I have installed Proxmox onto the AMD box downstairs
00:26:02.190 -->
00:26:05.660that has the CUDA card in it, the 3070 card.
00:26:06.280 -->
00:26:09.660And in that one, you absolutely can pass with Proxmox,
00:26:09.710 -->
00:26:10.660the GPU drivers.
00:26:10.750 -->
00:26:13.700And you just have to make sure you get the CUDA drivers installed.
00:26:14.480 -->
00:26:15.880Proxmox doesn't come with them out of the box.
00:26:16.200 -->
00:26:17.960but you can install them onto Proxmox.
00:26:18.030 -->
00:26:21.000And once you do, you can pass through either shared access
00:26:21.180 -->
00:26:22.760or dedicated access to the containers.
00:26:22.960 -->
00:26:26.860I'm using containers to run all my voice assistant stuff on the Proxmox.
00:26:27.040 -->
00:26:27.780Sweet. Okay.
00:26:28.080 -->
00:26:29.380So that is absolutely possible on Linux.
00:26:30.280 -->
00:26:32.720And Proxmox makes it just stupid easy to do.
00:26:33.040 -->
00:26:35.800Nice. Yeah, I have this nice Mac Mini M4 Pro sitting around.
00:26:35.900 -->
00:26:37.440I would love to just fire things up.
00:26:37.450 -->
00:26:39.380But all the stuff that requires sort of some acceleration,
00:26:39.720 -->
00:26:40.920it's like sometimes slower.
00:26:41.400 -->
00:26:42.800Maybe I don't really want it that much.
00:26:43.680 -->
00:26:48.680Well, since I had that RTX that was donated by my child to me, I was like, I'll use that
00:26:48.780 -->
00:26:52.220because it's going to be the fastest tokens per second, but it's only an eight gigabyte
00:26:52.600 -->
00:26:52.860VRAM.
00:26:53.060 -->
00:26:55.840So whatever I can fit into that eight gig goes very fast.
00:26:56.200 -->
00:26:56.620Yeah, perfect.
00:26:57.560 -->
00:26:57.920All right.
00:26:58.540 -->
00:27:00.660Let's finish this up with a joke.
00:27:01.350 -->
00:27:04.380So this one comes to us from Jeff Triplett.
00:27:04.480 -->
00:27:05.040This one's good.
00:27:05.340 -->
00:27:05.900Have you seen this?
00:27:06.060 -->
00:27:06.800I have seen this.
00:27:07.040 -->
00:27:08.580The team's been talking about it.
00:27:09.280 -->
00:27:12.560Yeah, it's well, I think you all should adopt this for your project.
00:27:12.800 -->
00:27:13.440We totally should.
00:27:13.660 -->
00:27:24.040You let me look. A lot of times people create this kind of little not so easy to understand thing as a way to like get creepy repeat business or to not.
00:27:24.260 -->
00:27:26.980You can't fire me. I'm the only one that knows how the what to do.
00:27:27.220 -->
00:27:31.620And CSS was already crystal clear with how to author it.
00:27:31.940 -->
00:27:36.580Indeed. So what we get here is a legit CSS framework called Bmoji.
00:27:36.960 -->
00:27:39.980It's the CSS framework that your team will actually argue about.
00:27:40.260 -->
00:27:52.700And so here's what's going on with this is why waste all the characters when you could have something much more discoverable or understandable with emojis?
00:27:53.180 -->
00:27:56.360Right. I mean, this totally makes sense. I'm here for it.
00:27:57.660 -->
00:28:04.940So if you don't even know. So, for example, you might want to talk about like a hero image and you want to stylize it.
00:28:05.360 -->
00:28:09.640So you would say joker emoji underscore underscore picture frame emoji.
00:28:10.140 -->
00:28:14.000And like a lot of the utility classes, you would need to like specialize that.
00:28:14.010 -->
00:28:19.700So you would say joker emoji underscore underscore picture emoji --star, because this is your hero.
00:28:19.950 -->
00:28:20.340The hero.
00:28:21.600 -->
00:28:26.780And then there's the editable part, which is joker emoji underscore underscore notepad editor.
00:28:27.110 -->
00:28:29.420If you want to have a little card, like a written card.
00:28:29.530 -->
00:28:33.000And then joker underscore underscore ABCD for the title.
00:28:33.440 -->
00:28:38.620and joker underscore underscore quote emoji for a description bit so on the footer is the best
00:28:39.160 -->
00:28:44.060okay the footer where's the footer oh right there the class is joker underscore underscore
00:28:44.660 -->
00:28:51.660foot emoji oh there it is yes it's literally the foot emoji what is the i guess the disabled is a
00:28:51.960 -->
00:28:57.400a ghost yeah it's perfect i mean it's obvious you read that you know you know exactly what's going
00:28:57.300 -->
00:29:04.160on michael yes i i guess you do once you learn to speak the emoji about the block the element
00:29:04.780 -->
00:29:10.280oh it's so good i want a link you just put a link emoji on it anyway i'm not sure that i'm
00:29:10.280 -->
00:29:16.060gonna be adopting this um i've already done a couple major framework remodels so i put it on
00:29:16.060 -->
00:29:20.400our tech radar yeah it's gonna be important i mean you gotta you gotta stay on top of what's coming
00:29:20.500 -->
00:29:25.780in the industry and sometimes yep sometimes it's a ghost emoji i think i think that's a good place
00:29:25.800 -->
00:29:26.280to leave it, Calvin.
00:29:26.450 -->
00:29:27.240That is a good place.
00:29:27.590 -->
00:29:27.980I love it.
00:29:28.560 -->
00:29:28.940Thank you all.
00:29:28.980 -->
00:29:29.600That was a lot of fun.
00:29:29.800 -->
00:29:30.300Yeah, thanks.
00:29:30.440 -->
00:29:30.700See you later.
00:29:30.960 -->
00:29:31.100See ya.