Michael Kennedy: Hello and welcome to Python Bytes, where we deliver Python news and headlines directly to your earbuds.
Michael Kennedy: This is episode 460, recorded, unbelievably, December 1st.
Michael Kennedy: I'm Michael Kennedy.
Michael Kennedy: And I'm Brian Okken.
Michael Kennedy: And this episode is brought to you by us, especially Black Friday things that we have on offer.
Michael Kennedy: I don't know, it's been a great Black Friday for me.
Michael Kennedy: A lot of people really interested in the stuff that I put together, hopefully for you as well, Brian.
Brian Okken: Yeah, I kind of forgot about Black Friday.
Brian Okken: Well, the Black Friday has been going good.
Brian Okken: What I forgot about was Cyber Monday.
Brian Okken: So I did add today so people can use Cyber Monday code for the course today.
Brian Okken: But yeah, I just added that this morning.
Michael Kennedy: Well, people can look for an email from me if they're signed up to the newsletters.
Michael Kennedy: Is your stuff, what's yours through?
Michael Kennedy: Is it through today?
Michael Kennedy: I think I'm going to have it end just tomorrow morning.
Michael Kennedy: So in case people are like, oh, no, I always get emails like, I missed it by an hour.
Michael Kennedy: Or just let it go another day and then turn it off.
Brian Okken: So if you're not watching this live, you're kind of SOL.
Brian Okken: Sorry.
Michael Kennedy: No, I mean, they can listen today.
Michael Kennedy: Like, this is timely news.
Michael Kennedy: People have got to stay on top of Python by saying can't let it accumulate.
Michael Kennedy: No, it's fine if you listen backwards.
Michael Kennedy: There's a lot of stuff that's not that timely.
Michael Kennedy: But one of my topics certainly is.
Michael Kennedy: Anyway, yeah, that's going good.
Michael Kennedy: Subscribe to the newsletter.
Michael Kennedy: Follow us on the socials.
Michael Kennedy: Make sure to subscribe here on YouTube as well if you're interested in catching that.
Michael Kennedy: We intend the podcast to be an audio podcast.
Michael Kennedy: But while we're doing the live stream, we do put stuff up on the screen.
Michael Kennedy: And sometimes it helps to see it, you know, even though we do our best to keep it audio friendly.
Michael Kennedy: Yeah.
Michael Kennedy: Speaking of putting stuff on the screen, what do you got for us, Brian?
Brian Okken: Well, today is December 1st, and that means that it's the first day of Advent of Code.
Brian Okken: So I want to look to see how long this has been going on.
Brian Okken: And I guess I don't.
Brian Okken: I'll have to look harder.
Brian Okken: I don't know how long this has been going on.
Brian Okken: This is, so what this is, it's code puzzles that you can do in any language.
Brian Okken: The intent is to do them in any language.
Brian Okken: But of course, our listeners are probably doing them in Python.
Brian Okken: Maybe Rust this year.
Brian Okken: Who knows?
Brian Okken: But this is from Eric.
Michael Kennedy: Assembly as a stretch goal?
Michael Kennedy: Come on.
Brian Okken: Yeah.
Brian Okken: This is from Eric Wassel.
Brian Okken: And I really appreciate it.
Brian Okken: This year's a couple changes.
Brian Okken: There's no, let's see, there's 12 days.
Brian Okken: And actually, I'm kind of grateful because I've never actually gotten through all 25.
Brian Okken: And I might, or 24, or how many of them anywhere.
Brian Okken: But so I'm kind of grateful for a shorter one.
Brian Okken: So I can take a couple days to try them out.
Brian Okken: I might try this year.
Brian Okken: And there's, what are the other couple changes?
Brian Okken: There's the global leaderboard has gone away for maintenance reasons.
Brian Okken: So I do appreciate, it's one of the things is we should say thanks for people doing cool stuff.
Brian Okken: So Adventic culture is cool.
Brian Okken: It is sponsored.
Brian Okken: There are some sponsors that have helped keep this going.
Brian Okken: But one of the things I noticed this year, and maybe it's been there and I just haven't noticed,
Brian Okken: is there's a swag page.
Brian Okken: You can go look at some cool stuff and you can grab a mug or a shirt or something kind of fun.
Brian Okken: One of the things I kind of like about it is it's not,
Brian Okken: the year isn't on there.
Brian Okken: So this can be one that you can just,
Brian Okken: you can pull out and wear every year around Christmas.
Brian Okken: Evergreen swag.
Brian Okken: Yeah, I like it.
Brian Okken: So fun thing.
Brian Okken: I'd love to hear if other people are using
Brian Okken: or doing the Advent of Code this year.
Brian Okken: Yeah, I'd like to hear about how it's going.
Brian Okken: Another kind of associated with this,
Brian Okken: I saw this up on Reddit.
Brian Okken: Somebody wrote a, I know there's been other helpers out there, but there is a Python project that is called Elf, which is a modern advent of code helper that fetches inputs, submits answers and tracks your progress.
Brian Okken: So we're going to link to that as well.
Brian Okken: Just saw this.
Brian Okken: Oh, they've been working on it for a few months, getting ready for it.
Brian Okken: That's cool.
Brian Okken: So Elf is a command line interface to kind of play with the advent of code stuff.
Brian Okken: So we'll link to that as well.
Michael Kennedy: Yeah, very cool. The advent of code stuff is interesting, but I've never really put much time and energy into it personally. I just have so many projects that I have ideas for and I want to build and I can't even focus on them. So it's like, it is cool. I'm personally thankful for surviving Hocktoberfest without 10 PRs suggesting that I put a comma in my readme.
Michael Kennedy: Did you get any?
Michael Kennedy: No, I used to.
Michael Kennedy: I used to get a bunch.
Michael Kennedy: Like, hey, we've improved your readme.
Michael Kennedy: And it's like, you're looking to do a PR is what you're looking to do.
Michael Kennedy: You're just wasting my time.
Michael Kennedy: But actually, no, maybe people put up rules around it or they just put up admonishment.
Michael Kennedy: Like, please don't bother people like that.
Michael Kennedy: But yeah, not this year.
Michael Kennedy: Yeah, cool.
Michael Kennedy: Let's talk about Django, huh?
Michael Kennedy: That's what I want to cover next.
Michael Kennedy: Yeah, Django.
Michael Kennedy: And what's cool is Django is coming up with a major new release.
Michael Kennedy: They're knocking out the versions pretty quickly.
Michael Kennedy: And as I did point out at the opening, this is expected December 2025.
Michael Kennedy: So I'm expecting this any moment now, Brian.
Michael Kennedy: Okay.
Michael Kennedy: Seriously, Django 6 has some really cool features, actually some genuinely useful ones.
Michael Kennedy: The first thing I want to point out about it is how aggressive they are at saying no to older versions.
Michael Kennedy: Like no old Python.
Michael Kennedy: They only support Python 3.12 and above.
Michael Kennedy: That's pretty hardcore, honestly.
Brian Okken: Yeah, but it's an application.
Brian Okken: So you get to decide.
Brian Okken: It's not like if you're building on top of Django,
Brian Okken: you have to support backwards compatible stuff.
Michael Kennedy: Yeah, but you may have a five-year-old Django app
Michael Kennedy: you want to upgrade that has some weird dependency
Michael Kennedy: that goes up to 3.10.
Michael Kennedy: You know what I mean?
Michael Kennedy: And I'm not saying this is a bad thing.
Michael Kennedy: I think this is awesome.
Michael Kennedy: I think there's a lot of benefit that people are missing out.
Michael Kennedy: Like when I did the year in review sort of thing,
Michael Kennedy: article at JetBrains earlier this year,
Michael Kennedy: one of the areas I worked on and like sort of did a bunch of math
Michael Kennedy: and like predictions or stats on or whatever
Michael Kennedy: was this what version of Python are people running on?
Michael Kennedy: And a huge bunch of people are still running on 310 or older.
Michael Kennedy: And your code is so much faster and uses less memory
Michael Kennedy: and just so much better.
Michael Kennedy: Like forget the new features that you get to use.
Michael Kennedy: Just literally it's like 50% faster or something
Michael Kennedy: just by changing what version of Python you're running on.
Michael Kennedy: And this sort of encourages the Python people who also Django
Michael Kennedy: to ride at the further out on the edge of that wave, I suppose,
Michael Kennedy: which is really good because, yeah, it definitely helps.
Michael Kennedy: So 5.2 is the last one to support, 3.10 and 3.11.
Michael Kennedy: So they dropped two years worth of Python in one year.
Michael Kennedy: Pretty good.
Michael Kennedy: So features, content security policy.
Michael Kennedy: We all do not love our cross-site scripting and other badnesses.
Michael Kennedy: So it comes now with a built-in support for the content security policy standard.
Michael Kennedy: So that's cool.
Michael Kennedy: Avoid CSS or XSS and those kinds of things.
Michael Kennedy: Just install it and configure it.
Michael Kennedy: Basically, it sets some headers, which then tell the web browsers how they're allowed to behave, cross-site, and that kind of thing.
Michael Kennedy: Another one, I feel like this one probably has Carlton Gibson fingerprints on it here,
Michael Kennedy: is they now have template partials.
Michael Kennedy: This is super cool.
Michael Kennedy: So I'm really surprised how much HTMX, the JavaScript where you run in framework,
Michael Kennedy: where you write no JavaScript sort of thing, is how popular it has become in Django.
Michael Kennedy: It's featured in a lot of talks and stuff.
Michael Kennedy: And one of the things that you really, really need to focus on
Michael Kennedy: when you're doing that kind of programming is how do I take portions of my page and then return them
Michael Kennedy: from server-side code. And you can end up with lots of duplication or other weirdnesses. So this
Michael Kennedy: basically addresses that if you want to return a fragment of a page, then you can say, I know here's
Michael Kennedy: the whole page, the whole template of HTML markup with a Django syntax. But in this view, when somebody
Michael Kennedy: makes this request, I want to return just this portion of it.
Michael Kennedy: And you can even do things like, is the request coming in a regular request?
Michael Kennedy: We'll return the whole page.
Michael Kennedy: No, is it an HTMLX partial request?
Michael Kennedy: Then just return the partial.
Michael Kennedy: So this is really, really valuable and basically makes those kinds of frameworks that exchange
Michael Kennedy: partial bits of HTML, regardless of whether it's HTML, nicer.
Michael Kennedy: That's pretty cool.
Michael Kennedy: Yeah.
Michael Kennedy: Another really nice one is a background tasks.
Michael Kennedy: So just a thread that cruises around in the background that you can throw stuff at.
Michael Kennedy: way more useful than you would think.
Michael Kennedy: Sometimes you want to process something
Michael Kennedy: that takes a little bit longer,
Michael Kennedy: but you don't want to block up the request response.
Michael Kennedy: Like, hey, I want to sign up for your newsletter.
Michael Kennedy: If you want to send them a welcome to my newsletter
Michael Kennedy: or whatever email, you could on that request block
Michael Kennedy: and let it sit there and spin,
Michael Kennedy: fire up your email API, connect, send,
Michael Kennedy: wait for that actually to send, get a response back
Michael Kennedy: and then say, welcome, we've sent you an email, right?
Michael Kennedy: That's one way, but that makes your code potentially slow.
Michael Kennedy: It'd be nice to go instantly, hey, thanks for signing up.
Michael Kennedy: You're on the newsletter.
Michael Kennedy: And then kick off a task to the background, like send that person an email.
Michael Kennedy: For one email, it's not that big of a deal.
Michael Kennedy: If you've got to send a lot or do a bunch of stuff, it can time out your web requests.
Michael Kennedy: You get normally 20 seconds or something like that.
Michael Kennedy: And if it takes longer than that, it's a problem.
Michael Kennedy: Of course, people are going to be freaked out and reload or whatever as well.
Michael Kennedy: But anyway, this is like a real simple way
Michael Kennedy: so you don't have to run other servers and message queues
Michael Kennedy: and all that kind of stuff.
Michael Kennedy: You just put it in the background of your app and let it go.
Michael Kennedy: It's not as durable, but it's great.
Brian Okken: Almost every app needs some sort of background task.
Brian Okken: So this is awesome that it's included now.
Michael Kennedy: It's cool that it's included, absolutely.
Michael Kennedy: Speaking of email, email handling in Django
Michael Kennedy: now uses the Python's modern API introduced in 3.6
Michael Kennedy: using email.message.emailmessage.
Michael Kennedy: Super cool.
Michael Kennedy: Easier to send that way.
Michael Kennedy: and then a bunch of minor features that I'm not going to go into.
Michael Kennedy: Anyway, that's a pretty big set of releases or features for a year.
Brian Okken: Yeah.
Brian Okken: Yeah, so now we have to see how many people are going to update
Brian Okken: all of their Django books and tutorials and everything,
Brian Okken: Django 6.
Brian Okken: It's both an opportunity and a bit of a challenge.
Brian Okken: Yeah.
Brian Okken: So Django's not a-- that isn't just a year, though, is it?
Brian Okken: Doesn't there is the release cycle like a year and a half or two years or something like that?
Brian Okken: Let's see.
Michael Kennedy: I feel like, where's the release?
Michael Kennedy: Here we go.
Michael Kennedy: It's yearly.
Michael Kennedy: Yeah, it's yearly.
Michael Kennedy: Okay.
Michael Kennedy: Well, yeah.
Michael Kennedy: Hold on.
Michael Kennedy: It depends on what you call.
Michael Kennedy: Like, what is the version bump?
Michael Kennedy: There is a release every year, but it's not always a major version bump.
Michael Kennedy: Like, 6 is coming, but then 6.1 and 6.2 are planned.
Michael Kennedy: And I think 6.2 might be the LTS.
Michael Kennedy: Yeah.
Michael Kennedy: So it bumps between LTSs.
Michael Kennedy: And the LTSs are on a three-year cycle.
Michael Kennedy: long-term support so you're not forced to keep rolling to get security fixes and stuff yeah
Brian Okken: yeah and i think that's because of some deprecation uh stuff and everything so
Brian Okken: all right cool gotta love advancements in django yep um okay well i um i'm gonna look take a look
Brian Okken: at some typing stuff how's that sound i love typing let's do it um so there's a there's an article
Brian Okken: um called advanced overlooked python typing and there's some goodies in here that i didn't know
Brian Okken: about, which is cool.
Brian Okken: So I was slow to come on board with typing,
Brian Okken: but I like all of the extra.
Brian Okken: I'm kind of a fan now.
Brian Okken: Plus, it only takes having one package that's kind of popular
Brian Okken: that people will demand that you--
Brian Okken: so anyway, so some cool extra things
Brian Okken: if you possibly may not have known about.
Brian Okken: The first I'll jump into is--
Brian Okken: oh, there's a disclaimer here that it says
Brian Okken: that it's looking at modern stuff.
Brian Okken: So Python 312 or 313 or newer for some of this stuff.
Brian Okken: So assert never.
Brian Okken: I didn't know this was a thing.
Brian Okken: So let's say you've got a match case thing like switches.
Brian Okken: And you've got your catch all at the end.
Brian Okken: And you want to never hit that.
Brian Okken: Usually I'll throw an assert there or something just in case.
Brian Okken: But there's an assert never.
Brian Okken: That comes from typing.
Brian Okken: Didn't know that was there.
Brian Okken: that you can make sure that this default case has never hit,
Brian Okken: or if you have other cases that should never be hit.
Brian Okken: Throw that in there.
Brian Okken: That's cool.
Brian Okken: Didn't know that existed.
Brian Okken: There's getArgs.
Brian Okken: And the idea around getArgs is,
Brian Okken: oh, this is a little small,
Brian Okken: so I'm going to see if I can make this a little bigger.
Brian Okken: The idea around getArgs is,
Brian Okken: so if you've got,
Brian Okken: like here we've got frozen sets to have literals.
Brian Okken: There's literals before,
Brian Okken: but you kind of had to have a duplication of all the actual literals for typing for different things.
Brian Okken: And that's in a set of literals, and that's sort of a pain.
Brian Okken: So instead of that, you can do get args, which creates essentially a set of literals for types, for things that are in something.
Brian Okken: So you kind of have to see the code here to understand that.
Brian Okken: It helps with keeping it in line so that when you create an extra element in your set, it automatically gets an extra type.
Brian Okken: TypeGuard we've covered before.
Brian Okken: I think we've covered it.
Brian Okken: It gets you the exact type-narrowing logic.
Brian Okken: I haven't used TypeGuard a lot, but there's sort of a pickier version.
Brian Okken: Type is a stricter and more prophesied type-narrowing than TypeGuard.
Brian Okken: by enabling bidirectional narrowing.
Brian Okken: Okay, so kind of fun with type is.
Brian Okken: Anyway, some extra,
Brian Okken: oh, we've got unpacking and concatenation for callables.
Brian Okken: Oh, callable with dot, dot.
Brian Okken: Anyway, a lot of goodies for if you want to like
Brian Okken: really get into some of the nitty gritty
Brian Okken: and some of the extra fun things with typing.
Brian Okken: This is a fun article.
Michael Kennedy: Yeah, very nice.
Michael Kennedy: I actually have an interesting one to add to that
Michael Kennedy: is no return.
Michael Kennedy: Oh, really?
Michael Kennedy: Okay.
Michael Kennedy: So you can go to a function and you can say arrow, I mean, goes to int,
Michael Kennedy: goes to stir, goes to optional customer, whatever.
Michael Kennedy: You can even say it returns none, which is literally it returns none.
Michael Kennedy: But no return is, it's not like a void.
Michael Kennedy: It's different.
Michael Kennedy: It basically says the only way that this function exits is through an exception.
Michael Kennedy: There's no way out of it.
Michael Kennedy: So you might have a while application is still running.
Michael Kennedy: And then in some case, if it decides it needs to stop, it raises an aborted, task aborted exception.
Michael Kennedy: And it's like, while true, if exit, raise task aborted.
Michael Kennedy: Like there's no regular way out.
Michael Kennedy: The only way out is through an exception than this.
Michael Kennedy: So you might think, why would I ever do that?
Michael Kennedy: Well, some of the web frameworks, when you do a redirect, the way they do the redirect is they raise an HTTP redirect sort of exception type thing,
Michael Kennedy: which is more likely to just like make it get all the way out right away rather than if you forget
Michael Kennedy: to say return redirect, right? Something like that. So you'd put a no return there. Isn't that a weird
Brian Okken: one? Yeah. Yeah. So I would have expected like one of the commenters, I thought no return was
Brian Okken: equivalent to return none. So if you don't have a return, that's not what it means. I'm like, oh,
Michael Kennedy: this is a really cool way to say it only returns none ever, which is the case if you never, if you
Michael Kennedy: don't say the keyword return, it still returns none.
Michael Kennedy: But no, this says the only way it gets out
Michael Kennedy: is through exceptions.
Michael Kennedy: Yeah, it was weird, right?
Michael Kennedy: Timing module, annotate functions that never return normally.
Michael Kennedy: I wanted a void.
Michael Kennedy: Where's my void?
Michael Kennedy: You know what I mean?
Michael Kennedy: There's nothing coming out of this.
Michael Kennedy: This is not it, but this is something else in that realm
Michael Kennedy: of advanced type.
Brian Okken: Yeah, and those things do exist.
Brian Okken: So yeah, interesting.
Michael Kennedy: They sure do.
Michael Kennedy: So you know what else exists is misspellings.
Michael Kennedy: So I got on my Talk Python in production book,
Michael Kennedy: Christian Klaus was kind enough to send me a message saying,
Michael Kennedy: hey, you know, so you may have some misspellings.
Michael Kennedy: And he sent me this thing, right?
Michael Kennedy: As a PR.
Michael Kennedy: However, it says fixed typos discovered by code spell,
Michael Kennedy: all one word, code spell.
Michael Kennedy: - Okay. - Wait,
Michael Kennedy: what is this code spell?
Michael Kennedy: Well, code spell is a tool that checks
Michael Kennedy: for common misspellings in source code.
Michael Kennedy: It works on other files as well,
Michael Kennedy: but it especially works on different types of source files
Michael Kennedy: 'cause it ignores backslash escapes
Michael Kennedy: and other things that are common in code.
Michael Kennedy: But it's not a spell checker.
Michael Kennedy: It's a misspelling finder, let's say.
Michael Kennedy: So what it does is it goes and it says,
Michael Kennedy: I'm gonna look for words that are commonly misspelled.
Michael Kennedy: Like in my example, what two things had I misspelled.
Michael Kennedy: I had FOM instead of from, F-O-M.
Michael Kennedy: had plausible with able instead of able on it. Right. So it looks for common misspellings. It
Michael Kennedy: doesn't look for words. It doesn't know because those are super annoying. You're like, here's
Michael Kennedy: 723 misspellings. Like, no, those are acronyms. You know what I mean? Yeah. like that is a
Michael Kennedy: library I'm importing. It's not misspelled. If I change it, it doesn't work. Right. Like that
Michael Kennedy: kind of stuff. So what this does is it looks for like common misspellings, like ADN or, TEH
Michael Kennedy: or what, you know, stuff like that.
Michael Kennedy: Anyway, there's not a whole lot more to say about it
Michael Kennedy: other than it's pretty cool, it's configurable,
Michael Kennedy: you can like put words that are, you know,
Michael Kennedy: learn the spelling equivalents
Michael Kennedy: and put other types of config files and whatnot.
Michael Kennedy: Oh, this is cool.
Michael Kennedy: Yeah, you can even put it into a pyproject.toml
Michael Kennedy: in settings if you wish.
Michael Kennedy: Cool.
Michael Kennedy: Yeah, it's got 2.3,000, 2,300 GitHub stars.
Michael Kennedy: So yeah, pretty popular actually.
Brian Okken: As somebody that uses a code editor
Brian Okken: exclusively for all of my text writing needs.
Michael Kennedy: This will be good.
Michael Kennedy: Yeah, indeed.
Michael Kennedy: I think Christian even set it up as a pre-commit hook.
Michael Kennedy: Oh, that's a good idea.
Michael Kennedy: Which is kind of interesting
Michael Kennedy: because it's apparently pretty fast.
Michael Kennedy: I think this is the one we were talking about.
Michael Kennedy: Yeah, it has like, there's something about pre-commit
Michael Kennedy: like right there in the last commit.
Michael Kennedy: So I'm guessing it does something with that.
Michael Kennedy: All right.
Michael Kennedy: How are you feeling on your extras?
Michael Kennedy: I got a few extras.
Michael Kennedy: Okay.
Michael Kennedy: Yeah, go for it.
Brian Okken: Okay.
Brian Okken: Let's see.
Brian Okken: I'll start with Hatch.
Brian Okken: So Hatch 1.16 came out.
Brian Okken: So some exciting features of Hatch.
Brian Okken: So for Hatch backends and Hatch itself, what do we got?
Brian Okken: We got dependency groups and there are workspaces.
Brian Okken: So workspaces allow you to, like if you have a monorepo
Brian Okken: and you have a bunch of different projects within a monorepo,
Brian Okken: this might help with that.
Brian Okken: And then there's one, this is interesting.
Brian Okken: It supports software bill of materials now.
Brian Okken: So that's going to be, that's becoming a growing thing.
Brian Okken: So update to Hatch and another update on a different project we talked about last week.
Brian Okken: Was it last week?
Brian Okken: We talked about in one of the things we talked about was Zensicle.
Brian Okken: And a listener over on Mastodon, Fasodon said,
Brian Okken: one of the things we forgot to mention is Zensicle is a replacement for MakeDocs
Brian Okken: plus, what was it, material theme?
Brian Okken: And also one of the things they talked about
Brian Okken: was MakeDocs doesn't seem like it's been maintained
Brian Okken: since the middle of 2024.
Brian Okken: So there's a link in here to,
Brian Okken: is MakeDocs still maintained?
Brian Okken: And I scrolled.
Brian Okken: It's an interesting read,
Brian Okken: but I kind of think the answer is maybe-ish,
Brian Okken: but maybe not.
Brian Okken: So if you always have to,
Michael Kennedy: you always have to split that difference of like,
Michael Kennedy: it could just be done,
Michael Kennedy: you know,
Michael Kennedy: certain things are just,
Michael Kennedy: they really don't need more and they're supposed to be simple,
Michael Kennedy: but I feel like MK docs is something that could continually take on new
Michael Kennedy: variations and features and updates.
Brian Okken: Yeah.
Brian Okken: So not even to say no,
Brian Okken: we're not longer being maintained.
Brian Okken: Is this the,
Brian Okken: anyway,
Brian Okken: interesting read if you're curious and want to depend on that,
Brian Okken: but I think I'll be,
Brian Okken: I'll be checking out Zensicle as well.
Michael Kennedy: Right.
Michael Kennedy: And as you pointed out last week, you said,
Michael Kennedy: for sure that it's a rewrite.
Michael Kennedy: Zensicle is not just building on MKDocs.
Michael Kennedy: It's just the people that were working on material for MKDocs
Michael Kennedy: are now building a completely from scratch documentation thing, right?
Brian Okken: Yeah, it's backwards compatible if you used MKDocs before,
Brian Okken: but it is something completely different.
Michael Kennedy: All right.
Michael Kennedy: How about, do you have any extras?
Michael Kennedy: Or something completely different?
Michael Kennedy: I do.
Michael Kennedy: Let's go back to, was it last week or week before?
Michael Kennedy: I talked about TAC, T-A-C-H, and how it creates one of those basically architectural layered
Michael Kennedy: graphs that let you show which parts of your app depend upon which other parts of your app,
Michael Kennedy: that kind of thing.
Michael Kennedy: And it was pointed out that, hey, hey, that thing looks kind of unmaintained.
Michael Kennedy: Well, Gerber Decker sent me a message and says, TAC has been unmaintained for a bit,
Michael Kennedy: but it's not anymore.
Michael Kennedy: It was the main project of Gage, which is a Y Combinator startup that pivoted to something
Michael Kennedy: unrelated and based on AI, surprise, surprise. And they abandoned TAC. However, detached head from
Michael Kennedy: GitHub forked it and now has access to the main repo and has committed to maintaining it. So it's
Michael Kennedy: back. Also rough analyzed graph. It is fully independent of TAC. And they actually looked
Michael Kennedy: into using that as an alternative once it became unmaintained. But yeah, anyway, that's
Michael Kennedy: TAC is back. TAC is back. TAC is back. Also quick shout out to Doug Farrell and thanks. He wrote a
Michael Kennedy: Review my book and yeah, very nice. So I linked over to that if people are interested. Thank you, Doug for writing that
Michael Kennedy: TLDR says recommended so appreciate that. All right
Michael Kennedy: Are we ready to joke about something? Yeah. Okay, so you've heard of
Michael Kennedy: Platform as a service PA
Michael Kennedy: AS you've heard about infrastructure as a service IAS or IAAS DB as a service DB as
Michael Kennedy: A-A-S.
Michael Kennedy: Sometimes, though, your productivity just demands that you stay focused and you just say no.
Michael Kennedy: Right, Brian?
Brian Okken: Yeah.
Michael Kennedy: So I present to you no as a service.
Michael Kennedy: So this is an API that will simply return a random but realistic excuse for saying no.
Michael Kennedy: So you can turn it down and stop.
Michael Kennedy: Oh, nice.
Michael Kennedy: Yeah.
Michael Kennedy: Built by humans, excuses, and humor.
Michael Kennedy: This project is sponsored by Git Ads.
Michael Kennedy: Git Ads.
Michael Kennedy: I don't know what that is.
Michael Kennedy: but anyway so if you pull it up it's um n-a-a-s i think it's n-o-a-s but you know whatever it's
Michael Kennedy: that's not the domain they got and you just get a little bit of json reason i'm finding an invisible
Michael Kennedy: dragon at home it's taking longer than expected or not my circus not my monkey so definitely not
Michael Kennedy: my act to perform cinderella left one shoe here and i need to help her find it instead of going out
Michael Kennedy: I would come, but I'm trying this new thing where I just don't.
Michael Kennedy: So if you need to integrate no for whatever reason into your application,
Michael Kennedy: well, here's the API right here.
Michael Kennedy: You get a JSON response.
Brian Okken: It is built as an API.
Brian Okken: This is great.
Brian Okken: You can just query it.
Michael Kennedy: Yeah, we're going to get probably an MCP built over as well.
Michael Kennedy: So you can integrate into your AI workflow as well.
Michael Kennedy: I mean, it's going to be powerful.
Brian Okken: Why use a constant when you can call an API?
Michael Kennedy: guy exactly anyway I thought no as a service is a pretty good joke I I love this last one I would
Brian Okken: come but I'm trying this new thing where I just don't exactly I my favorite is I can't make it
Michael Kennedy: because I don't want to exactly no don't want to all right well uh fun episode as always thank
Michael Kennedy: you everyone for listening thanks thanks Brian thank you thanks all yeah bye