Python Bytes - #440 Can't Register for VibeCon
Episode Date: July 15, 2025Topics covered in this episode: * Switching to direnv, Starship, and uv* * rqlite - Distributed SQLite DB* * Some Markdown Stuff* Extras Joke Watch on YouTube About the show Sponsored by PropelA...uth: pythonbytes.fm/propelauth77 Connect with the hosts Michael: @mkennedy@fosstodon.org / @mkennedy.codes (bsky) Brian: @brianokken@fosstodon.org / @brianokken.bsky.social Show: @pythonbytes@fosstodon.org / @pythonbytes.fm (bsky) Join us on YouTube at pythonbytes.fm/live to be part of the audience. Usually Monday at 10am 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: Switching to direnv, Starship, and uv Last week I mentioned that I’m ready to try direnv again, but secretly, I still had some worries about the process. Thankfully, Trey has a tutorial to walk me past the troublesome parts. direnv - an extension for your shell. It augments existing shells with a new feature that can load and unload environment variables depending on the current directory. Switching from virtualenvwrapper to direnv, Starship, and uv - Trey Hunner** Trey has solved a bunch of the problems I had when I tried direnv before Show the virtual environment name in the prompt Place new virtual environments in local .venv instead of in .direnv/python3.12 Silence all of the “loading”, “unloading” statements every time you enter a directory Have a script called venv to create an environment, activate it, create a .envrc file I’m more used to a create script, so I’ll stick with that name and Trey’s contents A workon script to be able to switch around to different projects. This is a carry over from “virtualenvwrapper’, but seems cool. I’ll take it. Adding uv to the mix for creating virtual environments. Interestingly including --seed which, for one, installs pip in the new environment. (Some tools need it, even if you don’t) Starship Trey also has some setup for Starship. But I’ll get through the above first, then MAYBE try Starship again. Some motivation Trey’s setup is pretty simple. Maybe I was trying to get too fancy before Starship config in toml files that can be loaded with direnv and be different for different projects. Neato Also, Trey mentions his dotfiles repo. This is a cool idea that I’ve been meaning to do for a long time. See also: It's Terminal - Bootstrapping With Starship, Just, Direnv, and UV - Mario Munoz Michael #2: rqlite - Distributed SQLite DB via themlu, thanks! rqlite is a lightweight, user-friendly, distributed relational database built on SQLite. Built on SQLite, the world’s most popular database Supports full-text search, Vector Search, and JSON documents Access controls and encryption for secure deployments Michael #3: A Python dict that can report which keys you did not use by Peter Bengtsson Very cool for testing that a dictionary has been used as expected (e.g. all data has been sent out via an API or report). Note: It does NOT track d.get(), but it’s easy to just add it to the class in the post. Maybe someone should polish it up and put it on pypi (that person is not me :) ). Brian #4: Some Markdown Stuff Textual 4.0.0 adds Markdown.append which can be used to efficiently stream markdown content The reason for the major bump is due to an interface change to Widget.anchor Refreshing to see a symantic change cause a major version bump. html-to-markdown Converts html to markdown A complete rewrite fork of markdownify Lots of fun features like “streaming support” Curious if it can stream to Textual’s Markdown.append method. hmmm. Joke: Vibecon is hard to attend
Transcript
Discussion (0)
Hello and welcome to Python Bites, where we deliver Python news and
headlines directly to your earbuds.
This is episode 440 recorded July 15th, 2025.
I am Michael Kennedy.
And I am Brian Ocken.
And this episode is brought to you by Propel Auth.
I'm going to tell you more about them later, but make Auth easy for your app
and don't spend time on things that are not your core value proposition.
Get off of your apps with them.
Links to the top of your podcast player show notes.
If you want to connect with us, Brian, I don't even know where people should connect with
us anymore.
We're on Macedon.
We're on Blue Sky.
We're here on YouTube.
People can comment on the YouTube channel, on the YouTube video.
That actually is a place that a lot of the feedback happens.
So any of those places, and if you want to be part of the live show,
Python bites.fm slash live, usually Monday is at 10 AM today.
We're 25 hours later, I guess, I don't know Tuesday because sometimes life
intervenes, but generally Monday at 10 AM.
And if you want a really nice summary and a little bit of extra information
around the episode, not just rehash of the show notes, but something different.
Be sure to sign up for the friends of the show.
Just visit pythonbice.fm newsletter button right in the front.
Enter your email.
We'll treat it kindly.
We won't share it or sell it, but we will send you cool stuff.
Brian puts together for you. Speaking of cool things, Brian,
let's switch over to you and see what we're talking about.
Okay. Well, I want to, uh, let's see.
First I want to add something to my, to the screen. How do I do? Uh, there we go.
Um, I want to bring up a rehash an old episode. Uh, so in episode four
38, so just a couple episodes ago, we, one of the things we talked about was, was I talked about Durin.
Where was that at? Was there's a lot of stuff on the show notes. Anyway, my CLI world from Frank Wiles.
And one of the things was Durin. And, and so I've been thinking about it.
Also, while we're here, I'll just go ahead and show people that you can see the cool
stuff like my book, your course, and where do people subscribe again?
People subscribe right at the top.
Oh, be part of the live show and scroll down and there's newsletter right there.
It was like, yeah.
Anyway, so I wanted to talk about the Durand a little bit again, and I think I may have said what it's not before.
So dir env is just a tool.
It says unclutter your.profile.
And the main thing people use it for is these.envrc files
or optionally.env files that basically use that
to load up environmental variables when you go into a directory. That's
really mostly it. But in Python world, we use that also to do other work. Like I guess
everybody else uses it to do other work as well. But one of the things we do is invoke
a virtual environments when you go in. And that's really what I will be, I'll be using it for. So I really want to talk about, where is this? Trey Hunter's, there it is. Trey
Hunter's blog post called, and this is an older one from, oh, not too old, last year,
switching from Virtual Inv wrapper to Durin, Starship and UV. Well, I don't really care
about the from Virtual Inv wrapper because I don't really care about the from virtual in
wrapper because I didn't use it before. So I'm thinking this is just switching to
Durinv and UV. And it's and I when reading this and I can't remember who
brought this up but when reading this it brings up a lot of the things that I
didn't like about Durinv the first time I tried it and Trey fixes all of those things. So let's,
let's look at a few of the things that he fixes. So he does talk about, uh,
doing, uh, making it work with Z shell. I've made it work with bash as well.
So it works fine with most of the least all the Linux type shells that I've used.
Um, so the first off,
the default doesn't show you the virtual environment prompt
because Durand doesn't allow you to modify the shell prompt.
So how do you get around that?
And there's just a short script that Trey wrote
to put in your Z shell RC or in your bash RC file.
And then now your prompt is back
where it shows your virtual environment.
So that's cool.
Also, apparently the default is to put
the virtual environments replaced in a different directory
like a.durinv python 312.
And that's not, I mean, I don't know about most people,
but at least me, I've always just stuck
my virtual environment right in the project directory
that I'm working on.
So he has some
switches for that. Also Durr-Env when you enter and exit it like is very verbose about telling you that it's loading stuff.
You can turn that off, shows you how to turn that off. And then that's just the
Durr-Env setup and he's with virtual environments, but he's set it up so that with UV next. So after that,
it's UV and showing how to use all of this with UV. The thing that I think is kind of one of the
things I wanted to point out that's pretty cool that I don't know if we've talked about is when
you're creating a virtual environment with UV, you don't get pip with it because you're going to use, you're going
to use pip or UV pip install instead of pip install. However, some tools, some extra tools
need it to be there for some reason. And so you can say dash dash seed, which it probably does
other stuff too, but it adds pip to your virtual environment. So be kind of cool if it just said
dash dash pip or something seed works. You just have to know that. Anyway,
that's as far as I'm gonna get so far. He's also talking about
Starship. And I guess I think I will follow the Starship
tutorial too, because one of the things I like is he is he likes
he teaches people a lot. So he doesn't want his his his shell
prompt to be too crazy.
Um, and, uh, and so he's going to have a fairly bare, boring Starship
configuration. And I'm glad, cause I'd like to see how to do a boring first.
And then, um, and then like, look at his other stuff.
Yeah. Those things can be overwhelming, but I really like having some of these
things like a prompt that shows you which virtual environments active
Which version of Python you're using it's it's really neat. Yeah. Yeah
Anyway, so if if you've tried during the before and it sort of annoyed you
Maybe this this tutorial might be for you. So it might be for me as well. I haven't I'm not entirely sure
I am I recently updated I use oh my Z shell plus warp
sure I, um, I recently updated, I use, Oh, my Z shell plus warp, which warp is a
super cool terminal thing. And for some reason things weren't working quite the way that I was expecting.
And with some of my Python virtual environment stuff installed versus system
Python, it was really, it was odd.
I think I was running PI test from the wrong place or something like that.
And it was driving me nuts and I didn't realize, I don't know, I think I had
pi test extensions installed into plugins installed into a different place than
I was trying to run it from.
And that was the challenge.
But yeah, I recently added to my profile, this thing will automatically activate
virtual environments.
If you go into a place that's got somewhere in the directory tree, a virtual
environment, and if you see the out of it, it'll automatically deactivate it, which
is pretty dirty and V, but I ended up doing that just with like a simple bash.
Cool.
So anyway, I, however you go about it, I totally, totally recommend it because I
could see here exactly all the get status, all the, you know, the branch,
everything is great.
That's not what I want to talk about.
That was just a fun little followup.
Um, what I want to talk about is something from them Lou and they say, Hey
there, here's a cool topic for Python.
So we've all heard of SQLite and almost all of us have SQLite installed knowingly
or unknowingly because Python itself ships with SQLite, it bills itself as
the world's most popular database. I think Excel itself as the world's most popular database.
I think Excel might be the world's most popular database, but you know, pretty close, right?
Yeah.
They can, they're definitely tightens.
But the story you're told is I'm using SQLite for development or like a local storage, like
a local settings file for an app, but it's not appropriate for production. This thing I'm about to talk about called R RQL light instead of SQL light is
pretty neat and that's what Demi recommended a distributed SQL light.
Read and go, but who cares?
You can use it however you want.
Right.
So come down here and let's, let me open up their main website here.
So RQL, RLite.io.
And if you go over here, you can see that it's got a couple of things.
Vault tolerance, high availability, SQLite.
How crazy is that?
So basically what it is, is it's a data access layer on top of SQLite, but it
also sets up distributed, a distributed version of SQLite with replication.
Oh, wow.
I'm not crazy.
Yeah, that's awesome.
Yeah.
I think it's super cool.
So yeah.
Um, replacing Postgres with RQLite has simplified the software we
ship to customers says Mark Campbell.
Yeah.
So you come down there and see some other things it does is deploy in seconds.
Nothing complex to run.
And then it gives you basically an HTTP API to talk to the database because it
might live somewhere else in a cluster.
Right.
But that really routes just internally to SQLite and it integrates with Docker
Kubernetes super easily, full tech search, vector search, JSON documents,
lots of different things.
So if you go up here to, I think getting started, yeah, quick start.
Yeah.
It talks about you just, there's different ways you can install it.
You could brew install the thing or this is the way I've been doing all
of my database servers lately.
All my server type things, you know, Nginx, MongoDB, et cetera, Postgres is
to just run a local version using Docker.
So I don't have to install it or have it mess with my machine.
So instead of brew install, I would just Docker run this thing and give it a volume.
And it's good to go, right?
Persistent volume.
So you don't lose the data.
And then you just talk to it a lot like Cipollite, but you can create a cluster of
them, which is what's wild.
And in the example they show, it's like, look, this is all local hosts, but you probably would set them up to be running in different places, which is,
it's pretty wild.
So you also have got, um, like all the rules around eventual versus strong
consistency and everything you do with clusters.
So they've got a nice little writeup on trade offs you can make for like
reliability, performance, staleness, etc client libraries I've done ones I
RQL RQ light and so on one for SQL alchemy
Yeah, a lot of neat stuff here if you're looking for a distributed database and you're using SQL light
I think people should look at this and thanks to them you for them Lou for sending this in actually a hook into the SQL alchemy
for them Lou for sending this in.
Actually a hook into the SQL alchemy to RQ light is pretty cool.
That's yeah, it's pretty neat.
All right. Yeah.
You got read only nodes and all sorts of different things about how you can set up
the clusters, you don't have to do clusters by the way, if you want to just run a
single instance of it, it says plenty of people do that.
But if you want to have like the fault tolerance, high availability, then you
know, set up a cluster.
Cool.
Neat.
Do you want to do something else that's awesome? I we need to set up a cluster. Cool. Neat. Do you know what else is awesome?
I would guess that it's our sponsor.
Yes.
PropelAuth.
This episode is sponsored by PropelAuth.
PropelAuth is the easiest way to turn authentication
into your advantage.
For B2B SaaS companies, great authentication
is non-negotiable.
But it can often be a hassle.
With PropelAuth, it's more than just functional.
It's powerful.
PropelAuth comes with tools like managed UIs,
enterprise SSO, robust user management features,
and actionable insights.
As your product grows, PropelAuth adapts with it,
supporting more advanced authentication features.
And the best part, PropelAuth has native support
for major Python libraries like FastAPI, Flask, and Django. You can easily
integrate them into your product. When Auth is effortless, your team can focus on scaling,
not troubleshooting. That means more releases, happier customers, and more growth for your
business. Check them out to get started today. The link is in your podcast player show notes.
It's a clickable chapter URL as you're hearing this segment. And it's at the top of the episode page at PythonBytes.fm.
Thank you to PropelAuth for supporting PythonBytes.
Yeah, it's definitely.
Thank you, thank you.
Now, Brian, I feel like I've snuck this out one
out from under you.
This next one I wanna talk about.
Okay.
We have a Python dictionary that can report
which keys you used and which ones you did not use.
Why do I feel like I got this from you?
This is like perfect for testing.
Okay.
Okay.
So imagine I'm working with an API or some kind of data reporting library and you
send it some kind of dictionary, right?
And you want to make sure like, I want to make sure that it uses these three
important pieces of information that are contained in the dictionary.
And if you run your code run either through a tester, however you want to,
but probably through a test, then you could ask which keys were used
and which ones were not used.
And if one you're like, nope, it's really important that they take this
piece of information into account and you see that it's not used.
Well, that's a pretty big hint that something's going on.
And you might say, Mike, we'll just mock it out and we can check, but it's not that the function is called.
It's that the function is called with a certain combination of different
parameters over time, which I think is where it gets tricky, right?
It's not like get item was called or get is called.
It's that get was called with these seven values, but not this eighth value.
Right.
And that's kind of like where I think this has at least as far as I
know, kind of a unique idea.
Yeah, that's pretty neat.
Now what I'm pointing at is this, um, blog post by Peter Benson and it's very
nice, but it's also very short and it's not like exactly a Python package.
You just UV pip install and then run with it.
Instead, it's more of just a simple little dictionary that people wrote and then you
can just access like what keys were accessed, which keys were not accessed.
And it's got some sweet step operations for that, right?
Like the difference of a set and so on.
So you might want to extend this a little bit, right? Like the difference of a set and so on. So you might want to, you might want to extend this a little bit, right?
Like copy this in, for example, one of the things they note, um, and there's some
nice comment, a comment conversation at the bottom, one of the things missing is
this works for square bracket access, which calls it under get item, but not.get.
Access.
But you know what?
If you look at the way that get item is implemented and you rewrite the one that
does get, I'll tell you what it's like three lines of code and it's
super easy, right?
Like there's, it basically just captures a key that was used into a, a set and
then, uh, delegates to the underlying dictionary implementation.
So there's not a lot going on there.
Right.
So you can add that out.
Another thing that's nice is, uh, there was a conversation about what would this
look like if it was a typed tracking dictionary. And so someone in the comments provided a
typed version with multiple generics. How about that?
Okay. Yeah, sure. Yeah. Yeah. So I think you would definitely
want to add the dot get function to this. But like I said, it's like three lines of
Python and it's not hard. So check that out.
But yeah, I think this is a neat idea.
If you're looking to test how a dictionary is being used on a key by key basis.
Yeah.
It seems like it's ripe for a small tracking dictionary package.
Yeah, exactly.
I think this is going to be like a sweet kernel of an idea for somebody who wants to
put something on PyPI.
And I put this in the show notes. Maybe someone wants for somebody who wants to put something on PyPI.
And I put this in the show notes.
Maybe someone wants to polish it up and put it on PyPI.
That person is not me.
Yeah.
Yeah.
Or maybe that person is Brian.
Exactly.
I don't, but maybe someone else does.
Yeah.
Okay.
Well, we are streaming this episode and I would also like to talk about streaming Markdown.
It's a transition there, yeah. Anyway, so Will McGoogan reported a few days ago that
the Textual that he and his team are working on, I guess, I'm not sure if there's a team
there anymore, but anyway, Textual has a new version out 4.0.0. So what's the what's the
big change? The big change is markdown append. So this is
kind of a neat thing I thought of school to have to be able to
see if we can get this to run. The gist of it is you've got
markdown, you can report to a markdown widget that as you
append to it, it just keeps going. So you can,
in real time, add stuff to it and it just sort of scrolls down. Anyway, that's the big thing.
The other, the one that's, maybe you don't care about this, but I brought this up. That's like
all of our topics, but I brought this up because I really like the thing that he did in bumping the major version.
So he says why?
The reason for the major version bump is because while he was implementing this, there was
a different another part of the interface, widget anchor that already existed and that
has changed semantics.
So he, and it works better also, but the semantics change caused the major version bump.
I wish more people did this.
I think that a lot of people only change the major version
if they change the actual signature, the API signature.
And I think that behavior changes are completely,
they're even more important to change the version
because it's
going to sort of run fine.
It's just going to do something different.
And that's a, that's something you really want to point out to users.
So applaud him for doing that.
Yeah, Brian, I remember when I first learned C plus plus, and I had some for me at the
time complicated program.
I was so proud of myself when I got it to compile.
Yeah, then it's behavior.
I've had to figure out Yeah. It's behavior.
I had to figure out all the bugs.
And this is kind of like that, right?
It's like it technically still has the same API signature,
but it's down to the harder things
to detect that are breaking changes, right,
which is semantics and behavior.
Yeah.
And that's the real one that gets you is,
if it seems like it runs fine right away,
but there's a major version bump, you got to it seems like it runs fine right away, but there's a major
version bump, you had to check a look at your test to make sure that and probably it's just that
you're not using widget anchor. And if you're not using it, you don't have to worry about it. But
anyway, so there's that. And I was like, what, what can we stream with this? What would I want
to stream into Markdown? Well, I've got another, another project that I wanted to highlight
called HTML to Markdown.
So this is a HTML converter that apparently
there was another tool which I think I ran across before
called Markdownify that converts web pages
or HTML stuff to Markdown.
So I thought, and one of the features of it,
okay, so they completely rewrote the fork, but why?
There's a bunch of extra features like HTML5 support,
type safety, metadata extraction, and look at this,
streaming support, memory efficient processing
for large documents with progress callbacks.
I'm curious if you could take a web scraper or something or somehow take something that's
streaming HTML or use this to grab something large and have it reported to a textual widget.
That'd be kind of fun.
That's very fun.
Yeah.
Nice.
I can also see if you are doing some kind of chat chat bot or LLM
type of thing on the textual side.
Yeah.
And you wanted to output the responses in markdown.
Like that's a real common exchange for even brings that up.
Like the efficiently stream markdown content, like you might get from an LLM.
Like you might.
Yeah.
Okay.
Makes a lot of sense.
So cool.
All right.
Hey, I want to jump back to your first item real quick.
Okay.
Did you give this article a shout out as well?
Cause I know that you were thinking about it.
Oh yeah.
I just didn't highlight it.
So I didn't bring it up yet.
So yeah, there's, yeah.
You want to talk about it?
Yeah, sure.
I don't know a whole lot about, but it is very neat.
So, um, Mario Python by night also did a, it's the terminal bootstrapping Starship
just during the NUV and talks about how you can sort of get things set up with
that as well. So just, it's already in the show notes.
Just one more thing to throw out there.
Yeah. And so that's, that's what's causing me to say, maybe I should take
another look at Durinv and Starship because
other people that I admire are using it.
So yeah, maybe it's worth looking at.
Not like me who just vibe my way to a turn it on, turn it off automatically sort of bash
function.
Yeah.
You ready?
Yeah.
Actually, you got any extras before we jump to the vibe? Well, the only extra I wanted to bring up is the reason why I'm wearing an annoyingly
bright t-shirt today.
Usually I do a darker color because it shows up better on the better.
But this is my Oregon Country Fair shirt that I got last Friday.
So I'm going to stand up so you guys can see it.
And it's awesome.
Lovely Oregon Country Fair shirt.
It was a blast. but I'm definitely feeling
my age a little bit.
We got there, it's 11 to seven,
and we got there right before 11
to get a decent parking spot.
But you probably should, usually we get there earlier
to get a decent parking spot.
Anyway, a lot of people, it was pretty hot this weekend.
So it's till seven o'clock, but like, I dunno,
like three or four o'clock, we were like,
I think we're fried enough, let's go home.
So we reacted.
It has been very warm and very sunny
in the Pacific Northwest, contrary to what people think
about the rain and the clouds.
Yeah, no, I think, I think there's other parts
of the country getting more rain than us right now.
Oh, indeed.
All right.
You ready for the joke?
Yes.
Okay.
So let me set the stage.
I know many of you out there already know this.
We've had several jokes.
So if you've been progressing along the joke timeline with us, you will
know what vibe coding is just for the folks who don't though.
Vibe coding is when you go to an agentic programming model like cursor windsurf Juni for the jet brains IDEs
that kind of thing and you just just tell it what to do you don't need to
touch the keyboard you use text to speech you just like build me this app
now I do it this way now make it that and the joke is that it comes up with a
bunch of mistakes or it works on your machine,
but you're not enough of a programmer to actually know.
Okay.
That like this might work here, but it's not really going to work.
So that's the joke.
And the joke is switch back.
There's an announcement for this new conference.
Very exciting vibe con introducing vibe con the world's largest vibe coding conference.
Make sure you register today.
http 127.0.0.1 colon 8080 slash register.
It says Vibe coding is hard to attend.
VibeCon is hard to attend.
That's already funny.
This is on Reddit.
But if you scroll down into the comments, so good.
Someone just says C colon backslash Vibe dot html.
Someone's no, no, that's wrong.
File colon triple slash C colon forward slash and vibe.hcl.
What boomer posted this modern vibe coders gather up at HEP bracket,
colon, colon one, you know, the IPV six.
That's funny.
Oh my goodness.
Is this sweet?
Isn't it?
Can someone give me the prompt to generate the registration
for him so I can sign up?
That's funny.
Yeah.
Somebody said tried to register and they took a screenshot that local, the page, you know,
connection refutes as it tried to register for ViveCon.
I guess my vibes weren't local enough.
Yeah, that's funny.
Yeah.
Okay.
So let's say I'm dense.
Why is, what is that URL that 127 001?
If you're doing web development locally, that's where it will run.
Okay, so I don't know what server typically picks 8080.
Maybe this is node JS.
Probably it is because like flask is 5000.
Some of them are 8000.
Yeah, so but it's definitely like if you ran it locally, you said build me this thing, it
would work perfectly locally because this is like the dev address, but obviously it's
listening on the local loop back.
It's not a real server.
I love it.
Yeah.
Yeah.
I haven't done a lot of vibing lately, but yeah.
No, definitely.
VibeCon is definitely hard, hard to, uh, to attend and Pat on the honest says
they, they run a lot of local APIs on 80 80 and like internal.
All right.
Well, fun as always.
Yes.
Thanks for being here, Brian.
Thanks everyone.
Let's see.
And if you're not subscribed to the podcast, please click follow or the subscribe for
free, whatever your podcast app button says to,
you know, keep getting automatic downloads to our free podcasts.
And if you're not subscribed on YouTube and you want to get notified, you want to
catch the older things and all the stuff we're doing here, go over there and
subscribe as well.
Thanks and bye all.
Bye.