Django Chat

Coding with LLMs - Frank Wiles

Episode Summary

Frank is a former President of the Django Software Foundation, a current Steering Council member, and the founder of RevSys. We discuss using LLMs daily, most notably Claude Code and Aider, and switching over entirely to uv for project management.

Episode Notes

Sponsor

This episode was brought to you by HackSoft, your development partner beyond code. From custom software development to consulting, team augmentation, or opening an office in Bulgaria, they’re ready to take your Django project to the next level!

Episode Transcription

Will Vincent 0:00
This episode is sponsored by HackSoft, your Django development partner beyond code, more in their services later in the show.

Hi. Welcome to Django Chat podcast on the Django web framework. I'm Will Vincent, joined as ever by Carlton Gibson. Hello, Carlton.

Carlton Gibson 0:21
Hello, Will.

Will Vincent 0:22
And we're very pleased to welcome back Frank Wiles, who should need no introduction. He is a partner at Rev. Says he was the boss of the Django creators, your former president of the Django Software Foundation. We could spend half the show talking about what you've done, but we're pleased that you're with us, Frank, thank you for being here.

Frank Wiles 0:40
Hey. Thanks for having me. Guys, one correction there, I was not their boss. Oh, well, I was their co worker. Yeah, I was their co worker. I actually worked in a different department,

Will Vincent 0:49
all right? Because you weren't working on Python. I thought you doing Lisp, right? No. Well, you take, you take a shot. Oh, okay, so not, not the direct man, but you were there, but you're older than they are.

Frank Wiles 1:02
I'm older than them, and I had more ops experience, and so they would rely on me to help with like, performance things and database backup things and stuff.

Will Vincent 1:13
And Jacob is still a partner. Jacob Kaplan moss still a partner in repsis. Yeah. Okay. Well, a lot to talk about, but maybe just we were just before we started filming, admiring your your setup, and you were mentioning, giving us a little bit of the history of the designers on Django. Because, you know, there's sort of three people who get credit, but there were a lot of people involved yourself included. What about on the design angle? Right? Is this more focused on the admin? Or could you the you mentioned a couple of names that may be worth a shout out in terms of, yeah,

Frank Wiles 1:44
and I talked about, like, a lot of this history in my last DjangoCon. Tom, yes, we will link to them. Yeah, that's a good one to link to, because it goes into much deeper detail. But yeah. So when Django was getting started, there was, you know, as most web shops had somebody who was kind of focused on the design, and that was Wilson minor, and he was pretty much responsible for designing the Django template system, like from the user API side of it, and then, you know, the initial website and the Django admin, all of that original design. And, you know, it's held up for 20 years. I mean, we've, we've, you know, touched it up a bit here and there, and, you know, modernized some things, but for the most part, it's still the way it was 20 years ago, you know. And then after that, Brian Veloso, and then Don gazet Both had roles in in kind of pushing design elements through, through Django in the early days. Yeah,

Carlton Gibson 2:51
when we were talking before you, you meant use the phrase design, bdfl, right? So the benevolent so

Frank Wiles 2:57
that was, there was a brief time, there was a brief time where there was, like, you know, Jacob and Adrian were bdfls of Django, and they sort of had, kind of, I think it was somewhat unofficial, but like that we sort of like, you're the design bdfl we're gonna, we're gonna defer to you on all design things. So

Carlton Gibson 3:14
the thing I wanted to pick up in that is, do you think we need that again, or something similar? Because I some, but when I was following, we'd get these design issues come in and we, and that was both on the website and on the admin, we'd be like, some of the bit paralysis, paralyzed because we, you know, we're back in these we've got this design neurosis, right? And no one could kind of make a decision. But do you feel that if we had, we could put one or two people or three people in that, that kind of role, it would help us drive forward

Frank Wiles 3:41
a bit. I think it wouldn't be a horrible idea, but I don't know that we have that many design issues that come up, you know, month to month. I think that if we had a group of designers who were involved in Django in any capacity, and that we could kind of point to and say, Hey, would you give us a couple of ideas, and maybe the steering Council could just pick up? Here's two ideas that, you know, steering Council picks, right? I don't know if we really need a design committee or anything, but it's not, it's not the worst idea for any, you know, by any means. Well,

Will Vincent 4:15
I would say we could use a design slash marketing PDF file. You know, because Django project.com we don't need to go on into all that, but there have been multiple attempts, with lots of time spent by very talented volunteers to update that. And, yeah, I mean, what, you know, because what is Django, it's, it's the admin, it's the land, it's the little rocket, and really, it's Django project.com and I think that's, that's what's kind of holding us back in terms of, you know, it looks like it hasn't been updated in a while, because it hasn't, well, it just got a bit of a refresh. Okay, I'm sorry, yeah, you know, yeah, people are working. But I hear you came in, right? 2025, or 2024, or 2023, you would? You. Uh, you know,

Frank Wiles 5:01
change it, yeah, I don't know. I mean, on one hand, that probably means that we're more focused on code and releases and features than than, you know, flash, but, and we're obviously succeeding despite it. But you know, that would like

Will Vincent 5:17
that uncalc Any Valley, right? It's not like, as ugly as Simon willison's website, where you go, Oh, this is either a noob or, like, a pro, right? It's like, somewhere in between. That's the problem. Don't be in between.

Frank Wiles 5:28
Yeah, no, I, I've often thought that I'm kind of surprised that, like, an up and coming designer has not approached Simon about data set and saying, Hey, like, I will, I will do this for you. But, like, I just want some credit, right? Like, I've always kind of wondered, because, I mean, data set works great. Like, it's fine, like, but it's very, you know, designed by program, right? And, and, you know, I don't think I do much better, right, but, you know, but it's, it's one of those things where, like, I'm kind of surprised somebody hasn't reached out. Maybe they have, and maybe he's like, you know, like, it's the features, not the look, right, but, but, yeah, no, I mean designs of obviously, obviously important. One of the things you know that we've as a community have gotten right is docs, and you know that they're readable, at least, right? Like, you know that they, they don't, you know, they look good. They're not just tech, you know, black text on on white background that are organized well and searchable, and all those kinds of things. And that's, that's huge for Django, ability to get picked up by people,

Will Vincent 6:31
and then, you know, we beat this dead horse. But, you know, the community is, I'd say, ultimately, what we got right. I don't, I'm not going to put myself as a we there, but that others have gotten right? You know, even looking around as much as it's nice to think, I wish we had a benevolent dictator kind of thing. You know, look at look at WordPress, look at material, right where you have, you know, one person can have whatever sort of mental health crisis they're having and just blow up an entire thing. And, absolutely, yeah, so that's a and I think that, yeah, that's the danger, right? Like, or even, not even blow it up, but just lose interest or lose focus, yeah, lose interest or, I mean, or alienate, yeah, right. There's you don't have to fully. I mean, the material thing is wild. I don't know if you followed that at all. Where the just, like, suddenly that

Frank Wiles 7:24
one, I followed the WordPress one with, yeah, and just like, you know, it's just like, everything you could do to shoot your community in the foot, right? Like, as, like, as a master class, and

Will Vincent 7:36
someone who, up until that point, had about as good a reputation as you can have, too, right? Which is why, partly why it's so strange. But, yeah,

Frank Wiles 7:46
I mean, I've never been a WordPress user really, you know, because early days, they had lots of security and update early days in cloaking there. Well, yeah, and I have to use it for some steak now, yeah, and I don't, you know, and it's gotten way, way, way better. Like, don't get me wrong, but you know, I just never got into that world, and all of my CMS needs, even with clients, have been, I've been able to do with Django, and it was obviously home, and so, like, I wouldn't look elsewhere, but, but, yeah, I don't, I don't understand how you know, well, really, anybody in a powerful tech position that is making really good money, for some definition of really good money, I don't understand when they go for the money grab, right? If you know just any pick large tech CEO. I don't understand when it's like, oh, okay, this means I'm going to make 1% less money, so I'm going to make this horrible decision. I just don't understand it. I don't understand why they don't just retire and have boat drinks. You know is

Carlton Gibson 8:54
that not because the sort of when you're so descent, desensitized to the world that all that's left is the graph. All you can see, is the graph going up or down? And down is not acceptable?

Frank Wiles 9:04
I guess I get that on some level, you know, like, I always wondered about, like, Bill Gates, right? Like, when he was at the height of things, I was like, why are you still doing this? Why aren't you, you know, playing golf or whatever it is you enjoy, right? And it turns out, like, you know, I watched a documentary and read a little more about him, kind of personally. And what he enjoys is that thinking through the problems and I and he basically structured his job and his role at Microsoft for years to he wasn't. He wasn't in HR meetings about 401, K bullshit, right? He was, he was just there talking about, like, what is the next, you know, what is the next focus, and what is the cool tech that we're doing in R and D and and helping steer that? And I could see that still being fun, right? But, yeah, I don't. I don't get when, when somebody's like, oh, well, I could make 1% more money and I'm already loaded. I

Will Vincent 9:55
just, I think you just go insane at a certain point with too much power and surrounding. By Yes, men and women. I mean, I think we've seen, this is the history of the world, right? I mean, so, Carlton, you're the philosopher. What do you Well, no, well,

Carlton Gibson 10:10
okay, well, I'm not going to answer that. That's just, that's just crazy. I want to bring it back now. Frank, so you've got as long as long a view of Django you have, and we were talking there about, you know, BDF sales and the BDL model perhaps going wrong at times. And Django community model is very strong, but sometimes we have not sometimes, quite often, we feel that we go too slowly because of it, and it feels like there's a trade off that, like you've got these two obvious models, and one of them, they've reached Google, have got their downsides. Are there obvious things that you think or not obvious thing? Are there things with your sort of long view of Django that you'd think, do you know, we can speed up there? We can change that. We should, we could perhaps do this? Yeah. I mean,

Frank Wiles 10:48
there's definitely been points over time where it's like, Oh, man. Like, like, you know, like, we've been discussing in the on the steering council about elevating the the visibility of third party packages. Anybody in the community knows that half of Django strength is the ability to grab third party packages to solve the problem that you're facing, or the the, you know, something like Django storages to store, you know, files in s3 for example, like, you know, that's one of those things that, you know, a lot of people are like, Why isn't this in core and it, you know, it's so that It doesn't have to move slow, right? Like, just the same kind of cores where things go to die, like, from the from the Python world. It's not quite true, but there's no good reason that it has to come in, right? And so it's better to be out. And, you know, fellows can only do so much and maintain so much, but there's so many times that I've run into people that they're like, they're unaware of, like, they're doing their own s3 File Handling from hand by hand with Boto, because they don't just, they just don't know Django storage has existed, and, and, and they they've never heard of Django packages, or awesome Django or jazz band, or any of the things that, like everybody who's really plugged into the community knows, and not even really plugged into the community. I just mean, like, you know, barely plugged into the community.

Will Vincent 12:03
It's in the, you know, it's in the official tutorial. Now, like, there's a link to finally, finally, but yeah, I agree. I mean, it's Yeah,

Frank Wiles 12:12
and so, so, yeah. So, like, one of the things the steering Council is doing, that carthon I are on, is trying to help elevate that a little bit and making it a little more acceptable. There was always this feeling like, well, we Django shouldn't pick winners here. And I still

Carlton Gibson 12:28
extend, right? I mean, like, we've got three or four CMS solutions. I don't want to say that CMS solution. I want to tell you

Frank Wiles 12:33
about right? My favorite I have, the one I steer clients towards. The others are fine. They're just, they're just not for me, right? Like, I like the certain features and of this versus that. I like, you know, the amount of work I have to do to achieve what it is I want to achieve with different libraries. You know, there's certain ones, like Carlton, you maintain some that are great that I don't use. You're not

Carlton Gibson 12:57
allowed to not use them,

Frank Wiles 13:00
but, but there's, but, there's a lot that, you know, I do use, right? And so, like, it just depends on, like, what, you know, what kind of thing I'm doing. I don't do a lot of form stuff, because most of our projects of late have been API stuff. So I don't have a lot of need for libraries related to forms, you know, right? And so, like, that's, you know, that doesn't mean that they're bad, like, and I that doesn't mean that everybody should do react front ends, you know, by any means, but, but, yeah, like, just the fact that, like, we, we all know that there's this handful of libraries that are the top for this category and this handful for the top for this category. And if anybody asked us, we would list them off, off the top of our head, the fact that they're not that visible to the wider community is, I think, holding Django back a little bit because, you know, like we talked about with WordPress, everybody's The thing about WordPress is you can get a plug in to do anything. Nobody necessarily knows that about Django, right, as when they walk in the door. Well, I've

Will Vincent 14:00
long thought since I need to do videos of, like, a third party Thursdays, because, I mean, part of it is, you know, those of us it's like, we're like, it's out there, like we're doing stuff, you know, like they're like, the awesome Django repo that I, you know, manage with Jeff triplet, your partner, we just hit 10,000 stars, You know, Jenga packages. Jeff now runs with help. Gets a lot of traffic, but yes, still a lot of traffic. Yeah. So people don't know about these things, or even if they do, they want some degree of curation, which makes sense, right? You can't just go, you can't just go by recency and stars. And if you don't have, you know, a podcast where you can allow these questions to guess. How do you well,

Frank Wiles 14:42
like, you just, you just mentioned, like, having a, you know, third party Thursdays. Like, when I first, you know, got involved in using Django as a developer, and not just friends of the founders, one of the things that I found really valuable was python module of the week. Yes, the and it exposed me very, you know, slowly but over time, to standard library modules that I didn't know that existed. And that's partly because I came from a Perl world where there wasn't that much of a standard library compared to Python, standard library is probably four or 5x the size of pearls, where, at the time, CPAN was way larger than the cheese shop way back then, right? And so you knew you always had a handful of third party packages in a Pearl Project, where that just wasn't as common with Django or with Python, which is why, like early Django had no dependencies, right? And still only has, what, just three or four tz, basically, yeah, it just, it's just a handle, yeah? Well,

Will Vincent 15:47
yeah, you just, I mean, you need that kind of, you need the interest, okay, you can't give someone the interest, but you need that drip function, right? Like I've, yeah, maybe I should do a newsletter, newsletter,

Frank Wiles 16:00
Django, yeah, yeah, Django app of the week, or whatever. Great. I thought about doing that a couple of times that I just sadly haven't had, yeah, well,

Will Vincent 16:07
because I think, and I we could link to it, you know, on the forum I put a post. I've done some posts, and Jeff has actually helped, you know, try to do some high pi statistics, which we can debate how accurate those are. But, you know, some version of, like, top 10s. I feel like that's a perennial thing, like, I'd love to get you know just the top 10s that people are using, because I invariably find stuff

Frank Wiles 16:31
that way. Well, Mike Carlton, I ended up talking about this couple of weeks ago. I've always had this idea of basically creating a FICO like score for software packages and libraries, where, go ahead, yeah, somebody you know, somebody me and a small group come up with, here are the factors that matter, but the factors are kept close hold so that you proprietary baby, right, yeah, and not Like, in a way, to make money off of it, but just in a here's the, you know, I don't know the Frank score for you know

that if you, over time, learn to trust the Frank score, then you can trust Future Frank scores on other on other things, right? And I think that could be a way, you know, like, I haven't had time to do it, obviously, but I have some ideas of things like, you know, around velocity, of of, you know, issues versus pull requests versus releases, like things that are a little deeper, you know, downloads obviously factor in there, not just stars, but like things that would be not impossible, but more difficult to gain. You have, like a

Will Vincent 17:44
six credit score, like a six, eight factor model, we could probably probably end up at the relatively the same place on that, but that would be what one would do,

Frank Wiles 17:54
right, and maybe expand it to other systems too, right? Like it doesn't not just Python or not just Django, but, you know, JavaScript and Debian packages and, you know, like rust greats or whatever. But,

Carlton Gibson 18:04
yeah, JavaScript packages is a nice one, because, as a Django developer, what you want is the sort of the recommendation for JavaScript packages which are kind of Django adjacent, rather than dropping you right into the, you know, the pickle bar,

Frank Wiles 18:17
yeah, well, and then, like, the other thing I think that happens too, is often, often there's a new, you know, kid on the block that is dramatically better than the, you know, the status quo. And many of us find it and use it and know and talk amongst ourselves. This is so much, you know, this is and it's ready. It's ready for prime time. It's, you know, and but people are slow to adjust to it. I think one of the things that we wanted to talk about, like, one, one good example of this is UV, right? Let's do it, you know, like, you know, tried out UV, like, you know, first couple of weeks, a little rocky. Couple of features I needed. Couldn't use it for all projects, but, like, very quickly, within a couple of months, we were switching most of our projects to it. And now I don't even know if we have a project where I fully get to decide what's used that isn't UV, and that's been in like, less than a year, right? Can

Will Vincent 19:19
you it's only been that, yeah, just a year. It was February, February, when it came out. I've been doing my research Carlton, because good weather pie charm has UV support, and so at Pycon us, I spent the morning. We're doing some stuff around that. Now, of course, you know, support, we can make it better, but we have built in tools, and I suspect other IDs will as well. But I wanted to ask you, Frank, so, so for a greenfield project, sure, one of the things is, how do you decide, you know, switching over to it from a more legacy project, you must have some battle stories on

Frank Wiles 19:56
that thing. Is it really? It. It takes me it, you know, 15 minutes, and we're switched over to UV and CI and everything. Wow, right? Like, we had one project where there was, like, a weird we were accidentally and didn't even know it, relying on kind of an old dependency resolution to get the packages we needed. And that might have taken me half an hour, an hour to sort out that I need to pin this one you know like to figure out, which is the one that I you know, the dependency of the dependency of the dependency that I needed to pin to not cause the test failure like that took me a little bit. But like most projects, it's been put UV in front of your PIP commands, in local stuff, and in your Docker file and in your CI and you're done well.

Will Vincent 20:41
And that's the thing is, it's, you know, Charlie Marsh, the creator, was making the point that it's, it's not just fast, it's so fast that changes how you do things like, for example, things that were written the CI, you can put into pre commit as like as one example. I'm curious, are there any other ones like that, that you found since you've, you know, been using it a bunch.

Frank Wiles 21:03
No, I mean, like,

Will Vincent 21:05
we are using that one, for example, are you I'm not using that

Frank Wiles 21:09
all over the place. Jeff just kind of tuned me into that a couple of months ago, and so I haven't gone back and done that to some some projects. But, yeah, it's so incredibly fast that, like, you know, like, I think it was Sebastian from fast API said he was, like, I had to double check that it actually ran right. Like, and that's, you know, that's, that might have been for rough. I might be getting that quote wrong. That might have been for rough, but, but like, you know, that's it, is? It changes your workflow, right? Like, I went from, you know, like rough on save, right? I run rough every time I save. And I save habitually,

Will Vincent 21:47
yeah, I use rough for every commit. And just Yeah. I don't even think about it,

Frank Wiles 21:51
yeah, yeah. It's yeah. I save every time I stop to think right in my editor, five times a day, and yeah, we're like five times a minute, but, but, yeah. No, I, yeah, I, I over save for sure, but, but I lost. I lost two weeks of work once and 20 years ago. Oh, man,

Carlton Gibson 22:17
I still have my editor configured to create a timestamp backup of every save. And so there'll be, like, four minute, five a minute of them, but the number of times over the years that I've gone in found the, found the version that had the exact thing that I deleted and saved me. It's worth it's worth having. Well,

Frank Wiles 22:33
it's sort of like, like, you know, get branches being cheap changed how we all worked. Like subversion, creating a branch might be, go get a sandwich on a, you know, large legacy project, right? And, you know, and Git makes it instant, and so you create lots of small branches and UV changes, yeah, like, I'll just install stuff, you know, to play with it, and then get rid of it. And I'm not even concerned with how much time that's going to take?

Will Vincent 23:02
Well, in some ID sorry, one last point, you do yours. Thank you. Some IDs as well. You know, PyCharm is an example VS code has this, I'm sure others do have, you know, a local history kind of thing, which is basically like, you don't have to configure it yourself, but it will save a lot of things for you so that hopefully, broadly speaking, losing, just losing stuff, is a lot harder now than it was, you know, 20 years ago.

Frank Wiles 23:31
Yeah, absolutely. The The other aspect of that, I think, is that, like cycle time is super important to flow, right? I talk about this a lot, especially with clients that you know. You know, if your CI is two minutes, that's amazing, that's great. One minute, 30 seconds is even better. And and, and focusing in on that right, how long your tests run, right? That ability to just iterate and try. Let me try that. Nope, let me try that. Let me try that. If trying something means 30 minutes, you just, you start to debate your choices. You maybe pick the wrong one, right, instead of try all three, right? You lose flow. You lose your place. You, you know, naturally, our brains are, you know, you're on Reddit all of a sudden, and you're like, how the hell did I get here, right? You know, you're texting your wife, you're, you know, you're checking your total waste of time, whatever. Yeah, no, no, not waste of time. But like, you just get distracted because, you know, it's like, the oh, we're compiling. And so, like, let's go get coffee, right? Like that, that, that slows everything down. And so if I can, you know, construct the scenario and iterate on it in, you know, increments of, you know, single digit minutes, I can just plow through stuff. But if it's double digit minutes, I'm walking through stuff, right?

Carlton Gibson 24:58
Yeah, and getting in, like. When you're working on something and you've got exactly the test that you need, and you can just run it, run it, run it. Change run it. Yeah,

Frank Wiles 25:07
okay, problem solved in 15 minutes instead of all day. Yeah, right, yeah. No, absolutely.

Will Vincent 25:15
Hacksoft is your development partner beyond code, from custom software development to consulting team augmentation or opening an office in Bulgaria, they're ready to take your project to the next level. Well, and that was the in the UI, okay, I'm sorry, Carlton, I'll just this promised last one, I was just going to make the point that any UI UX stuff there was, this is back a number of years. They did the research on, I forget how many, like, hundreds of a second it was, but if the page took a little bit on amazon.com the percentage of people just, like, leaving went, you know. So, just a clear speed, you know. And it just, yeah, just if it pauses you at all, you know. And I think it's even worse, worse as a programmer, because you're trying to be in a flow state. You're trying to, like, have the tools take care of themselves, not get in the way.

Frank Wiles 26:03
Absolutely. And, yeah, I mean, I guess I spent, you know, a large part of yesterday shaving 100 milliseconds off an E commerce. That's all right, so, right, like, and, you know, and it's one of those things that, you know, people are like, Oh, it's fast enough. And it's like, it could be a little faster. Like, let me spend a couple hours here and shave that off. Because, yeah, the research has shown you can feel 100 milliseconds.

Will Vincent 26:23
Okay, I'm done. Carlton, go, Okay, no, I

Carlton Gibson 26:25
was just gonna swing back to the so the example you hit was one of these cases where UV doesn't handle the sort of legacy resolving algorithm. And what's interesting, you said you've only hit that once, and I wonder if, like PIP itself, could sort of use the much faster out, because yes, UV is written in Rust, but a lot of it is to do with the caching and the different algorithm that's used, not necessarily just the fact that it's in rust. And I wonder if PIP could sort of implement the more optimistic algorithm and only fall back to the legacy slow one if that failed, because I think there's performance being left. They did make a

Frank Wiles 27:02
change. Yeah, cool, yeah. But I do, I do think that, like, I think they did make a change, because there was a pip change where you could say, like, use the legacy resolver in PIP a while back. And I think I may have basically leapfrogged that problem with UV before, you know, before, like, I would have run into it with PIP but, but you're right there, they may be able to do that. And I would imagine, you know, they're going to strive for a little more performance parity with UV, but I don't think they're ever going to really get there because of rust, right and, and I don't know, you know, sure, I think we should always have some competition and tools, right, because it makes everything better. But I think that, you know, for the foreseeable future, you win, you know, and but the minute somebody comes up with something that's twice as fast and dark or whatever, like, I'm gonna, I'm gonna use that, you know that I don't quite understand people's concern about the switching cost on this, because I've yet to have the switch take more than an hour for large projects and microservice projects. And like, I mean, like, it does not take very long. And then the other argument I've heard people make is that, like, because it has some VC backing, like, what happens when they pull the rug? And I jokingly said on on social media, it's like, well, then we'll fork it and call it Vu and, you know, like, and run with it for a year before we really have issues. And somebody will come along and maintain that or, or or they'll come up with a new one, and we'll switch to it, and it'll take me another 15 minutes in years down the road. I mean, I don't, I don't expect Charlie and the astral team to do that, you know, I think that they've got other ways to make money. But even if they were, like, the switching cost is so small. You know, it's not like switching from Python to rust or something, right? Like, this is a pretty small piece of the puzzle of your stack. Like, it's a very important part, but it's a pretty small one to switch, really, right? Switching testing libraries would be weeks of work, right? Or switching from Django to something else would be weeks and months of work for most projects. But like, switching how you install your PIP packages, like, just like moving to Docker Right? Like, might take you a whole day if you don't know anything about Docker, right, might take you two or three days if you know nothing about Docker. But like, now I can move a project from not Docker to Docker and now, or

Carlton Gibson 29:37
that's finding your template Docker file to copy across.

Frank Wiles 29:40
Yeah, exactly, and knowing kind of, you know, like, I already understand how layers work and what I need to do. And that one time I ran into the lib, G, Dow problem, but that, you know, that kind of stuff that like that is, you know, that is because I do this a lot, right? And I do this a lot for lots of projects where most people have a project. Or two that they change once or twice a year. So it probably feels harder, but honestly, like it's really not, it's really not that big a deal. Most of these, these sorts of changes, right?

Carlton Gibson 30:13
So go. So you said you're still mainly doing rust, rest, APIs, and you know, react front ends. In front of that is that that's still the case. You haven't swung into the HTML world, and not

Frank Wiles 30:27
as much. The rest of my team does that more, mostly because most of my team doesn't, doesn't know JavaScript very well, and so it's much easier, and it depends on the project. Obviously, like, you know, we've talked about this, like, we have some projects where, you know, there's, you know, it's a large site, 100,000 lines of code. There's seven elements that kind of need, that reactive slickness to it, that HTML can provide. And so, hmx, perfect for that sort of thing, or even just a little bit of vanilla JavaScript, right? Like, that's perfectly acceptable for those kinds of projects. And it's the sort of project, sort of projects that members of my team that don't know JavaScript can do, or I can jump in and do those little bits right. But then we have other ones where it's like, I've got, you know, it's a, it's a full flow, full fledged desktop app, but in a browser. And those, you know, and so far in my experience, are easier for me to do in React at this point. And, you know, I'm sad to say that I'm almost faster with JSX these days than I am Django templates, which really surprises me. But I still occasionally get tripped up on something in a Django template that years like I remember from years ago. Oh yeah. And then, like, but it'll trip me up for it'll trip me up for five minutes, right? And where, like, I just, I'm in flow with JSX these days. So, like, I've moved my personal blog to Astra, yeah, simply because it's a it supports MDX, which is marked down with JSX components in it, and that seems to be the sweet spot for me, and, like, simple blog, like website. So from

Carlton Gibson 32:05
that perspective, what? Because, you know, one thing that always comes up as well is Django front end story, or lack of front end story. And you know, if you're just using it with sort of the old fashioned Django way, static files, does everything you maybe got Django compressor to, you know, compile, combine your JavaScript files or whatever, from a react as from a React kind of point of view, what integrations or what things would you like to see that you know, help Django integrate with the more you know next js, Astro, react worlds.

Frank Wiles 32:35
I think we've already got it really, you know, Django, Webpack, loader, Django V basically take care of it. You know, if you're starting a new project, definitely use vite. Vite J S, it's a bundler and transpire and does all the all those pieces for you. That's much, much simpler than web pack, but just as powerful and quite a bit faster. Honestly, most of our projects have moved from webpack to V as the next time we need to touch them, and it's install a Django app, toss it in installed apps, load a Django template tag in your base template, and that you're integrated. Like, that's it, like, there's no there's other more to do. So I don't know that we need any tighter integration than that, except maybe, you know, if five years down the line, vite is the de facto only way to do that in the JavaScript world, which I would find hard to believe any one thing to be the de facto way, maybe that gets pulled into core just because it, you know, it's a small project, right? It's not, it's not gonna be a large lift to maintain. But I think that we really dodged a bullet as a framework not picking one because the JavaScript ecosystem has moved so fast, right? Like if we had to pick what was before react that started the CSS. No, that's CSS. Oh, start me nuts. Keep on.

Carlton Gibson 34:09
Bootstrap. It's

Frank Wiles 34:12
yeah, but I just had to move somebody off of it a couple years ago. But

Will Vincent 34:18
backbone, yeah. Thank you.

Frank Wiles 34:23
Backbone was, was the hotness around the time this kind of started talk, you know, at a jQuery and like, let's bundle these, let's make a better front end story. And we'd still be having to support backbone, which basically no one uses. And then moving off of it would be, oh, well, now I've broken, you know, like I can't upgrade to Django, you know, 2.2 because it doesn't support backbone anymore, you know. And we'd be playing that game every couple of LTS releases as JavaScript changes, right? And even. As much as, I think, you know, there's merit to bringing htm x in. I think that we might look in 10 years, assuming Django is still around, you know, knock on wood, but that we'd be, we'd regret that decision, right? And, like I said, the integration is small. It's like, I don't know. It's sort of like, Should we bring UV into Jenga like it, you know, we're only going to work with this like, I don't think we need that. I think that, you know, a couple of good blog posts, a couple of good doc posts, you know, pages in the documentation of how to do this and show that it's 15 minutes and you're running, I don't know that we need to again.

Carlton Gibson 35:36
It's that lack of messaging more than the what's actually there. All

Will Vincent 35:43
right, I'm gonna give you some messaging. Tell me about Kube any pod, because you just released this. Go,

Frank Wiles 35:51
yes, it's my second real Kubernetes related COI tool, written in rust. The other one is called Kube secrets. It's a little tool that removes an annoyance I have with working with Kubernetes all day, and that is, you know, one of the benefits of Kubernetes is that your your pods, which are one or more containers that run together, have very randomized ish names and so, but you often want to just pop into one of them and check is the Django setting set to what I think it is, right? Like I've set the environment variable, I'm pretty sure that you know that. I want to pop in and double you just hit

Carlton Gibson 36:39
a URL that doesn't exist, right?

Frank Wiles 36:43
Well, yeah, that's one way, but, yeah, but like, you know, that's the sort of thing I'm talking about, is like, I just need to pop in. I need to run this, this management command that, you know, resets of some some situation, or does some batch processing, or something that I need to do. And so the first thing I have to do is say, tell me the list of the current pods, and then I have to cut and paste one of those to pop into it. We also have a pattern we use with just the command runner to exec into a pod, take a snapshot of the database, copy it local and restore it into our local compose environment, because often it's very convenient to grab a copy of production, bring it local to debug a certain situation, instead of trying to scaffold that situation's data correctly to debug it. And that also I need to know a pod name to exec into it, to take the backup and bring it down and so that finally annoyed me enough that I built a little tool that just you give it a string prefix of the deployment or staple set that you've got there, and it comes back with any one of like, the first pod name it finds, and or execs you into the first pod that it finds. And so it's a little bitty tool, but it's one of those that I probably do that 10 times a day. And so it's, you know, now that it's one easy command and not two or three commands, is very nice. You know, there's other tools that make some of that a little easier sometimes, like canine s. If you're doing Kubernetes and you don't know about canine s, definitely look that up. It's like top for Kubernetes gives you a super easy access to getting a shell in a container, or getting the logs, or seeing the definition of the pods, yaml, seeing memory and CPU, you should statistics and things this great little window into your Kube cluster. But yeah, that's one of those. It's also a Claude success story. I know enough rust, but it would have probably taken me all afternoon, if not all day, to get it right. And then I thought, you know, I'm going to do this in Python, but like, let me just try Claude with rust. And about 30 minutes later, I was working, and about 30 more minutes I had it polished. And then I spent about an hour on, you know, the Read Me and the docs and and then Claude helped me set up the GitHub actions to do the multi architecture build for Linux, Intel and arm, Mac and Windows, and just automate that as part of the release process. So if I push a tag, it builds and releases binaries for everybody, which was great. And so yeah, two hours I had my tool, and that's just amazing.

Carlton Gibson 39:33
We got to ask you, then about LLN jobs, enjoying using Claude. And you know, they make a big difference, right?

Frank Wiles 39:40
Yeah, they do in, you know, used smartly. They're not perfect, right? You gotta, you know, you need to have tests. You need to, you need to kind of understand what it is you're trying to accomplish. They do hallucinate things, but often it's very apparent, you know, they're, you know, they're. Trying to pip install a library that doesn't exist, something like that, you know, like and you can quickly say, oh, no, no, use this library. And then it's no longer confused, right? I find them super useful 90% of the time, about 10% of the time, I'm just like, I get frustrated. I know what I need to do, and I've tried to prompt twice, and it's, you know what? It's going to take me 15 minutes, but I'm just going to, I'm just going to code this part, because I know what needs to happen, right? But where I found it be super useful at quad desktop for I am confused about this situation, like I see this. I'm getting this error message. I think that's this, but blah, blah, blah, and it comes back with an answer, usually in an area that I'm not super familiar with, like I had an FM M peg issue converting some video for a client, that I was getting this weird header error out of FM M peg and and then I had no idea was going wrong, and what it ended up being was the file named suffix was telling me it was one codec, but the file was actually a different codec. So somewhere in my code or my stack, it was appending a suffix that didn't match, and so I was telling it to convert from A to B, and it really wasn't a and that and, you know, and it just didn't give me a good error message saying, Hey, you said this was web M, but it's actually MP four, right? Instead, it just said, you know, header error at byte zero, you know, something, something. And I'm like, what? And it worked for 300 of the 306 users that had done it that day. But those six had a problem, and I just was sure it was something deeper than that, right? And so I overlooked it, but it quickly said, like, double check the file type. And I'm like, yeah, let me do that. I pulled it down. It's like, oh, this is an MP four. You know, probably saved me two hours of debugging by,

Carlton Gibson 41:59
like, a perfect example, because there's the API on that, or the user interface on that is so big that no human could ever master it was, you know, an LLM can be like, No, you need these options.

Frank Wiles 42:10
Well, I find it. I find it really great for, like, these tools, like any pod, that thing I've always wanted, but I haven't found a Saturday afternoon free enough, you know that I felt like spending building it. I can often build it in 30 minutes, a really rough version, not one I would release to others, but something that does what I need real quick in a virtual environment on my laptop. Maybe that, maybe never even makes it to GitHub, right? Like just a throwaway tool. And, you know, I get a lot of situations with clients where they're like, they'll give me an email that says, hey, we noticed there's this problem with these 93 records. Here are the UU ID primary keys of them, and I have to, like, cut and paste them into something, turn them into a Python list to fix them, right? And I can take the whole email, Select All, paste it into Claude, say, Hey, see those UU IDs, turn them into a Python list for me. And two seconds later, I've got a Python list. And then I can cut and paste that into my shell, or whatever, you know, into my code, and take care of it from there. And if nothing else, it's it's saving me some car, right? Like, you know, like, I just, just put in quotes, you know, I can do it with my editor. I can do the regex that'll put quotes on the front and quotes in the comments on the end. And, like, I can do it pretty quick. I've done it for years, but I can't do it as quick as an

Carlton Gibson 43:34
LLM, yeah, no good. In mythical man month, there's this graph where it's like, works on my machine, and then to get it into a product, it's like times three. And to get it into something, you can actually sell times three again, whereas, if you just want that down the bottom, you can get it. You don't need all those requirements. Oh yeah. Well, you've been just thinking about,

Frank Wiles 43:52
thinking about, like, I know what options I want. I know what defaults I want. I don't have to think through or provide a way for you to do your defaults. Carlton, like, I can just do what I want the way I need it, only taking into consideration my scenario, you know, like I can hard code things to a Kubernetes cluster name that you could never do in a tool, in a real tool, in the real world, right? In a real tool, yeah,

Carlton Gibson 44:16
yeah. I was just gonna

Will Vincent 44:20
say I find them fantastically useful for those, you know, finding a missed comma or dumping in a whole bunch of stuff. And I guess, yeah, I was trying to think about it. It's sort of error checking that, for whatever reason, other error tools that we have don't pick up, you know, the framework doesn't pick up, or Python doesn't pick up, and and so hopefully that's something where I remember back when I was way back getting started, you know, if I missed a comma or something, that could be days of my life. And now, you know, even for a beginner, I think that's a very appropriate use case to just dump it in and see what it spits out, because it's there, they are so good at spotting those things

Frank Wiles 44:57
well, and as a rubber ducking debugger, right? Like we have. All had that experience where, like, we're just not sure what's going wrong, and we end up talking to a colleague about the problem, and maybe even they don't even say anything. About halfway through our conversation, we come up with what the possible answer is. But this is somebody I can talk to about it at two o'clock in the morning if I'm up with some insomnia, right? And, yeah, yeah. Hey, Claude, you know, what are you doing?

Carlton Gibson 45:23
But select chatty vote,

Frank Wiles 45:28
yeah, yeah, exactly, but you know, and you know, and then tools like aider. I'm a big fan of aider at this point, because I can really control what context goes to Claude That helps focus the answer I get back right? Like, here's the model you need, here's the view you need, here's the test you need. Like, write me another test, but that checks these two scenarios. Do it in the style of the existing tests that are there, and it basically spits out a test like I would write it using the fixtures that I've provided and everything, and I don't have to do much to it, and it's great, and it costs you one cent sometimes. Yeah,

Will Vincent 46:05
Jeff, Jeff is going on and on about this to me and on the socials. I just, sorry, Carlton, one last one. I just so what? How exactly do you have it set up? Because, right, like you, people can use these within IDEs. You can use the desktop app, you can use the web app. You can CLI it up, you know, with Simon's tools, like, what's your particular poison?

Frank Wiles 46:28
So a little bit of all of it. So if it's the random question, like that, FF, MPEG thing I'm called desktop, I just paste the error in and say, This is what I'm trying to do. This is, this is the error I'm getting. Can you give me some hints as to what maybe the problem might be? And, you know, it spits back some stuff, and maybe there's a follow up question or two, right? And I just kind of have a thread about that. Sometimes it's just, I forget the the best way to iterate through a list of lists. Can you show me an example, and it will spit out a little example that I can basically cut and paste into my code. If it's I'm writing a test or I'm wanting you to add a feature to, you know, some code I'm probably using aider to do that, and then a little bit of like, pydantic ai, or something like, like Simon's LLM tool, if I'm building something that's a little more reusable, right? Like, one of the things that I often when I write a blog post, for whatever reason, it'll take me an hour to write the blog post, and then I'll spend an hour agonizing about how to summarize it for the tweet and for the for the meta description tag, like, what's the Yeah, like, it'll take me almost as much time to do that as to write the post. And so now I ask Claude or chat GPT, here's the post. Give me 10 headlines, 10 tweets, 10 summaries of this, and I kind of pick and choose from there. Oh, I like that wording, but maybe not that whole sentence. Like, let me put those two and then I'm done in five minutes or 10 minutes, instead of an hour and and so I have that it's

Carlton Gibson 48:14
worth it to avoid the agony, right, right?

Will Vincent 48:18
Well it is interesting? Like the cutoff for when, you know, so we have, you have a monthly subscription, and then, when are you willing to pay, you know, pennies, dollars. Yeah, I,

Frank Wiles 48:32
I think, I think people would be very surprised how little it costs. So when I first started using aider, you know, and Claude, they gave me $5 of free credit or whatever. And I thought, Okay, well, I'm probably gonna burn through that really quickly. So I threw 20 bucks in, and then I was using aider, and it even shows you, like, how much was this last prompt? How much have you spent this session? So you can kind of keep track of what's happening. And then I ran into an API limit, and I saw something Simon had said that basically, people who spend more get a little bit higher API limits. So I threw another 100 bucks in. That was in December, and Mike, so 125 total from December. And I think I'm down to like $118 of credit right. Like now, I'm not using it eight hours a day or anything, but I'm probably using it at least 30 minutes a day, if not an hour, on the eight or API side, where you're paying right? And like, I'll have you know, any pod cost, it

Carlton Gibson 49:35
was worth it, right,

Frank Wiles 49:37
right? It was $1 I got the tool I wanted in an hour for $1 right? Now? Is it the best rust in the world? Absolutely not, right. Could I dry it up a little bit? Absolutely I even had it go through and because it was really not dry the first version, and so I had it dry itself up a little bit, and I. Still, I see some stuff in there that I'm like, oh, okay, like, this should really be a function that just takes a workload and, like, you know, but like, I'm just gonna leave it like, it's, it's like, 600 lines of rust, like, I don't really care, right? It does the job. And also, I had to get home to dinner, right? And so, you know, maybe, maybe someday I'll, I'll pick that back up, but, but, yeah, like, some of the things you know, like, we're, we're really approaching a time where you can build real software in a day for 10 bucks, right? If you had a screen program. I'm not starting to say that in a way that, like, right? That's, that's me prompting along, right, knowing exactly what I want, how I want it, architected. It's just, it's saving me from the, oh, I missed a comma, the agonizing of, what am I going to name this function, you know, like, it just puts it there. And then I look, I'm like, you know, that's a perfectly appropriate name, right? Or it's not, and I change it, right? That variable message, you know, that that comment is confusing. Let me change it or it's wrong, you know, I can focus on the parts that the higher value stuff, right? Just like we don't. I don't write code in assembly, right? I could, like, you know, I learned it at one point enough to build a little dumb calculator, right? But I wouldn't want to work in that all day. I'd be doing something else. I'd be a lawyer or something I don't know, but that, you know, that's the low level and but the higher, the higher level stuff still takes thought and effort and experience and everything. And, you know, my I don't care if Claude gets three times as good as it is, right now, my wife is not going to build great software with it, right? Perfectly capable of building those throwaway tools that work for me, right? But, but for you know, you, you know the the idea that anytime in the next 10 years, Amazon is going to have, you know, 10 high school kids, and they're going to maintain Amazon where is just insane. We have it in the

Will Vincent 52:01
US government at the moment.

Frank Wiles 52:04
Well, it's working really well, so far as we can see.

Carlton Gibson 52:08
Just jokingly here they it seems like there's a good empirical experiment going on. For years, they've said less government, well, they're testing that, and everyone else just going to sit back and see it's the name of science, yeah.

Frank Wiles 52:21
I mean, it is, it is an experiment. This may be one that we look back on and think should have been an illegal experiment, but like, you know, like, we've experimented on people, you know, in ways that weren't ethical in the past, and have learned from it. And I think this is going to be one of those case studies in the future of how now to do things like,

Carlton Gibson 52:43
the thing that I'm hopeful for these llms is to is that, you know, they open up kind of, let's call it, automate the boring stuff with pythons, or build a job blog with Django level skills to almost everyone. Like is, you know, they're not quite there yet. And, you know, the blog won't quite work, or the script won't quite work first out the thing, but there'll be an awful lot of people that have access to basic software skills which currently don't. That's going to be a major change.

Frank Wiles 53:12
I mean, you know, I've been around for a while. I'm kind of old for a techie at this point. And you know, when I was in middle school, I was the computer nerd because I knew how to use a word processor. And in high school, I was the Uber nerd because I knew about the internet and I had an email, right? And those things are my my kids have that stuff now, right? And it like, you know, they're doing it on an iPad, and it's second nature. Like, those are just day to day tools for 98% of just downloading

Carlton Gibson 53:49
VPN, yeah, they're doing all this stuff.

Frank Wiles 53:53
Well, maybe, you know, but that, I mean, that's a that's a little more advanced, but like, you know, you know, word processing, email searching, Google, using, using basic internet things is, is just table stakes for most jobs at this point, right? And I do, I think you're right. I think in five or 10 years, you know, or maybe even faster than that, a little bit things like, I'm going to build a little bit of software to generate that report, because I want to show my boss this report in this fashion, much like people have gotten really good at Excel, they're going to be able to do that. But against, you know, the data warehouse, without necessarily having to have somebody like us give them the data or massage it in some way, there's just going to be they have a read only connection to the data warehouse, and they're going to play with Claude until they get the answers they want. And I think that's going to become day to day business, which

Carlton Gibson 54:43
unlocks, you know, who knows what, but, yeah, good stuff, yeah, well,

Frank Wiles 54:48
and also it frees us up to do higher value stuff, right? Like, I mean, there's a lot of times where I'm spending 30 minutes to just get somebody data in a CSV, in the way they need to consume it. Uh, that's a one off that. That's not a, this is now a feature in the product, and I never have to do it again. But it's this one weird scenario where they need, you know, this certain data for this certain time range because of this certain bug or situation or whatever happened. And, you know, I'm the one with the quick, easy access, and I can do

Carlton Gibson 55:19
it's an expensive way to generate a bit of CSV, right? If you look at it, objective,

Frank Wiles 55:25
exactly. Yeah,

Will Vincent 55:26
yeah. Well, Frank, we're close to that time in the show where I have to hand you the magic wand and tell you change something in Django. What would it be?

Frank Wiles 55:37
Oh, I probably should have thought about this. Anything?

Will Vincent 55:40
Anything goes this. This is something and, I mean, we'll just anything put aside, your steering Council hat, your all of the hats that you've worn. It could be something trivial, but

Frank Wiles 55:52
I this is an idea I've had for a long time, and I think that we may want to spend a bit of time focused on a couple of very specific performance use case things, and specifically caching the user model as part of the sessions and auth system, not just caching the Session, but caching the whole user model, because in a in most businessy apps, you're always logged in and you are doing that database query on every single page, every single API view, and removing that sometimes removes a third of the database queries on that page, right? And it's fast and it's fine, but like, I think if we had a back end that was the off back end that was more like cash DB for sessions, I think we would gain, you know, 10% closer parity to faster web frameworks with that one little bit.

Will Vincent 56:58
It'd be nice if Jenkins could brag about a performance win for a change too, right? As everyone else does with synthetic benchmarks and all the rest. I'm sorry, Carlton, but it's

Carlton Gibson 57:07
true. It would be nice, like, Okay, so let's, let's compare the bit the bed Django example, where you haven't optimized at all and you've not brought in caching, and you're pulling the user model everywhere. And let's strip it out so it's equivalent to the others. And then let's see how fast base handler is compared to your whatever handle you've got. Oh, they're more or less the same. Why? Because they're doing the same thing. Oh, sorry, get so cross. I

Frank Wiles 57:32
mean, yeah, plus or minus a couple of function calls, like, they're very, very similar in the in the core. Yeah, no, absolutely, and, and. But I'm also obviously, you know, often surprised at, like, the performance differences between things. It's really hard. Like, I would like to think I have a really great kind of sense for such things, but I would not have guessed the the level of impact that pedantic for serialization would have had to your average Django recipe, right? I mean, that's, that's the that's ninjas secret sauce there for me is nested serializers in Ninja are damn near free, right, where they're terribly expensive in DRF, and so we avoid them in most of our projects, because they're fairly expensive. And, you know, it's like your API goes from 100 milliseconds to 600 milliseconds. And just doing something nested, and that's with select related, prefetch related, all taken care of, like just as best as I can optimize it. It's still slower, and you just switch over to use pydantic for your serializer, and it you gain hundreds of milliseconds. And that, you know, users feel that, and it scales better, and you save on Cloud costs, and there's knock on, I

Carlton Gibson 58:47
mean, it's the modern serialization. It's paid anti gatters and caters message spec like these options, they're just a world apart from, you know, the field space approach that we had a decade ago.

Will Vincent 58:59
I'm just shedding a quiet tier, because I just finished, finally, the 5x update to my Django for APIs book, which is focused on Django rest framework. And I'm well aware that the next update for six whatever will have to include ninja, or maybe just do it all in Ninja, because that is where things are going. Yeah. I mean,

Frank Wiles 59:20
I don't think anybody really goes wrong using DRF right, like, but I don't think that like for me often, and it's, it's my situation, it's not everybody's situation, but for me, performance often matters, right? Like, a lot of this stuff that we do is at pretty high scale, and so I have not started an API project with not ninja after I started one with Ninja, right? And so I don't think I'll be starting a new DRF project. But there are situations where I would right if we're working with a team that has long and deep DRF experience. And. Don't have a huge performance concern. It's internal tooling or something like, they have modest performance needs, and they're very comfortable with DRF. I'm not going to make that whole team learn a new thing unless they want to. Right? Like, I'm not going to be like, no, no, you must. Like, there's, you know, this is the only acceptable answer. It's, it's, it's more nuanced than that. And that's, I think, true of everything, right? Like, if I, if I consult with a company and they have deep, deep JavaScript expertise, and everything's built and express, and everything's pretty much working, I don't try to switch them over to Django. I help them with their performance issue, and we move on. And, you know, we might, you know, rip each other a little bit about our choices of frameworks and, you know, and all good and all good fun. But, like you know, the right tool for me is not always the right tool for you, especially when it's a large company.

Carlton Gibson 1:00:48
I can't think of wiser words to finish on than those

Will Vincent 1:00:52
Absolutely So Frank, thank you again for coming on. Thank you. We've had a run here of steering council people. We've had Emma Lily, Frank, the only one, the only one we're missing is Tim recently that we've had, yeah,

Carlton Gibson 1:01:04
we had Tim just before Christmas. So, you know that's true. I mean, Frank hasn't been on five years, so we're allowed to get him back.

Will Vincent 1:01:12
We've been doing this for six we've been doing this for six years. So, yeah, wow. Well, thank you for thank you for thank you for taking the time Frank. We will have links to all those things people should try out your

Frank Wiles 1:01:23
projects. Absolutely. Thanks, guys, and I'll see you again in five years. You'll see

Will Vincent 1:01:28
five years to see Carlton in a month for his or a week for the steering Council. Yeah, but Django chat.com and see you ever next time bye, bye.

Carlton Gibson 1:01:39
Bye, bye.

Will Vincent 1:01:41
This episode was sponsored by hack soft, your jank development partner beyond code. Learn more about their services and the link in the description you.