WEBVTT

00:00:00.020 --> 00:00:05.060
<v Michael Kennedy>You love building web apps with Python, and HTMX got you excited about the hypermedia approach.

00:00:05.720 --> 00:00:10.220
<v Michael Kennedy>Let the server drive the HTML, skip the JavaScript build step, keep things simple, right?

00:00:11.020 --> 00:00:16.780
<v Michael Kennedy>But then you hit that last 10%. You need AlpineJS for interactivity, or your state gets out of sync,

00:00:16.810 --> 00:00:20.780
<v Michael Kennedy>and suddenly you're juggling two unrelated libraries that weren't really designed to work

00:00:20.960 --> 00:00:26.660
<v Michael Kennedy>together. What if there was a single 11-kilobyte framework that gave you everything HTMX and

00:00:26.680 --> 00:00:31.760
<v Michael Kennedy>AlpineJS did, and more with real-time updates, multiplayer collaboration out of the box,

00:00:31.760 --> 00:00:36.480
<v Michael Kennedy>and performance so fast, you're actually bottlenecked by your monitor's refresh rate.

00:00:37.120 --> 00:00:37.840
<v Michael Kennedy>That's Datastar.

00:00:38.420 --> 00:00:43.240
<v Michael Kennedy>On this episode, I sit down with its creator, Delany Galan, core maintainer, Ben Crocker,

00:00:43.780 --> 00:00:50.320
<v Michael Kennedy>and Datastar convert, Chris May, to help explore how this backend-driven, service-sent event-first

00:00:50.720 --> 00:00:55.160
<v Michael Kennedy>framework is changing the way full-stack developers think about the modern web.

00:00:55.820 --> 00:01:01.900
<v Michael Kennedy>This is Talk Python To Me, episode 537, recorded January 15th, 2026.

00:01:19.600 --> 00:01:24.360
<v Michael Kennedy>Welcome to Talk Python To Me, the number one Python podcast for developers and data scientists.

00:01:24.880 --> 00:01:26.280
<v Michael Kennedy>This is your host, Michael Kennedy.

00:01:26.720 --> 00:01:30.200
<v Michael Kennedy>I'm a PSF fellow who's been coding for over 25 years.

00:01:30.860 --> 00:01:31.960
<v Michael Kennedy>Let's connect on social media.

00:01:32.280 --> 00:01:35.440
<v Michael Kennedy>You'll find me and Talk Python on Mastodon, BlueSky, and X.

00:01:35.610 --> 00:01:37.560
<v Michael Kennedy>The social links are all in your show notes.

00:01:38.320 --> 00:01:41.840
<v Michael Kennedy>You can find over 10 years of past episodes at talkpython.fm.

00:01:42.020 --> 00:01:45.260
<v Michael Kennedy>And if you want to be part of the show, you can join our recording live streams.

00:01:45.560 --> 00:01:46.040
<v Michael Kennedy>That's right.

00:01:46.250 --> 00:01:49.500
<v Michael Kennedy>We live stream the raw uncut version of each episode on YouTube.

00:01:50.060 --> 00:01:54.500
<v Michael Kennedy>Just visit talkpython.fm/youtube to see the schedule of upcoming events.

00:01:54.730 --> 00:01:58.380
<v Michael Kennedy>Be sure to subscribe there and press the bell so you'll get notified anytime we're recording.

00:01:59.380 --> 00:02:01.000
<v Michael Kennedy>This episode is brought to you by Sentry.

00:02:01.380 --> 00:02:02.620
<v Michael Kennedy>Don't let those errors go unnoticed.

00:02:02.900 --> 00:02:04.420
<v Michael Kennedy>Use Sentry like we do here at Talk Python.

00:02:04.920 --> 00:02:07.780
<v Michael Kennedy>Sign up at talkpython.fm/sentry.

00:02:08.300 --> 00:02:13.600
<v Michael Kennedy>And it's brought to you by CommandBook, a native macOS app that I built that gives long-running

00:02:13.800 --> 00:02:15.240
<v Michael Kennedy>terminal commands a permanent home.

00:02:15.640 --> 00:02:17.640
<v Michael Kennedy>No more juggling six terminal tabs every morning.

00:02:18.020 --> 00:02:22.900
<v Michael Kennedy>Carefully craft a command once, run it forever with auto restart, URL detection, and a full CLI.

00:02:23.260 --> 00:02:26.380
<v Michael Kennedy>Download it for free at talkpython.fm/command book app.

00:02:27.180 --> 00:02:29.900
<v Michael Kennedy>Ben, Delaney, Chris, welcome to you all.

00:02:30.380 --> 00:02:31.560
<v Michael Kennedy>Thanks for being here on Talk Python To Me.

00:02:31.680 --> 00:02:32.120
<v Michael Kennedy>Thanks for having us.

00:02:32.320 --> 00:02:33.020
<v Michael Kennedy>Hey, how are you doing?

00:02:33.060 --> 00:02:34.060
<v Michael Kennedy>Doing well, doing well.

00:02:34.280 --> 00:02:42.040
<v Michael Kennedy>Very excited to talk about Datastar and some cool web frameworks for Python people and beyond, of course.

00:02:42.220 --> 00:02:44.940
<v Michael Kennedy>But, you know, most people listening doing Python web frameworks.

00:02:45.140 --> 00:02:46.980
<v Michael Kennedy>So talk about how that all integrates.

00:02:47.160 --> 00:02:52.400
<v Michael Kennedy>And if you like the HTMX vibe, which we've talked a lot about on the show, I think there's

00:02:52.500 --> 00:02:54.140
<v Michael Kennedy>going to be a lot to like here as well.

00:02:54.190 --> 00:02:54.960
<v Michael Kennedy>And maybe more.

00:02:55.140 --> 00:02:55.420
<v Michael Kennedy>We'll see.

00:02:55.530 --> 00:02:56.860
<v Michael Kennedy>A case to be made.

00:02:57.380 --> 00:03:02.280
<v Michael Kennedy>But, you know, before we get into all of that, though, let's just talk about a quick introduction

00:03:02.660 --> 00:03:06.840
<v Michael Kennedy>for everyone here and like go around the squares of Ben, I'll let you go first.

00:03:07.300 --> 00:03:07.760
<v Michael Kennedy>Who are you, Ben?

00:03:08.320 --> 00:03:09.920
<v Ben Crocker>Based in Costa Rica at the moment.

00:03:10.260 --> 00:03:14.140
<v Ben Crocker>I'm based in Europe most of the year, but half of the year my wife and I spend here.

00:03:14.640 --> 00:03:26.280
<v Ben Crocker>In terms of background, I've been primarily working with PHP for well over 20 years and got involved with Delaney and Datastar, been a core maintainer on that project ever since.

00:03:26.840 --> 00:03:37.320
<v Ben Crocker>And I looked at my commit history for last year, and it turns out now I write more Go code than PHP, so I don't want to call myself a PHP developer anymore.

00:03:37.320 --> 00:03:44.220
<v Ben Crocker>I'm just a web developer, a backend web developer, primarily that also writes TypeScript and maintains a front end.

00:03:44.560 --> 00:03:49.120
<v Michael Kennedy>framework. There's a lot of stuff going on and ways in which you can write code for the web these days.

00:03:50.420 --> 00:03:52.900
<v Michael Kennedy>Well, thanks. Awesome to have you here. Delaney, hello.

00:03:53.060 --> 00:03:58.180
<v Delaney Gillilan>Hi, how you doing? Yeah, I have kind of a weird checkered background into web development. I was

00:03:58.380 --> 00:04:04.280
<v Delaney Gillilan>originally in the circus, then I became a 3D artist, then I became an engineer. I've worked in

00:04:04.780 --> 00:04:10.720
<v Delaney Gillilan>games, video games, slot machines, military applications, all kinds of crazy things.

00:04:11.140 --> 00:04:13.880
<v Delaney Gillilan>I tend to work on really highly optimized, fast things.

00:04:14.480 --> 00:04:16.459
<v Delaney Gillilan>I love the ideas of the web,

00:04:16.820 --> 00:04:20.600
<v Delaney Gillilan>but I got really tired of how you actually implement things in that.

00:04:20.600 --> 00:04:24.420
<v Delaney Gillilan>And I was doing very large applications with millions of updates a second.

00:04:24.900 --> 00:04:27.120
<v Delaney Gillilan>And the tools that were out there just weren't good enough.

00:04:27.320 --> 00:04:29.580
<v Delaney Gillilan>So I ended up going down many, many rabbit holes

00:04:30.060 --> 00:04:32.920
<v Delaney Gillilan>and finally found something to make it better for everybody else.

00:04:33.470 --> 00:04:34.400
<v Michael Kennedy>So yeah, that's really cool.

00:04:34.480 --> 00:04:36.200
<v Michael Kennedy>And wow, what a really interesting issue.

00:04:36.300 --> 00:04:38.120
<v Michael Kennedy>I know you got some crazy stories.

00:04:38.420 --> 00:04:38.920
<v Delaney Gillilan>Yes, I do.

00:04:39.080 --> 00:04:42.400
<v Delaney Gillilan>I always have a funny, weird outcome of something.

00:04:42.820 --> 00:04:44.860
<v Delaney Gillilan>Ironically, people talk about things being a circus,

00:04:45.140 --> 00:04:47.500
<v Delaney Gillilan>but like circuses are very well run logistic machines

00:04:48.100 --> 00:04:50.020
<v Delaney Gillilan>compared to most developer situations.

00:04:50.090 --> 00:04:50.700
<v Delaney Gillilan>So it's kind of funny.

00:04:50.800 --> 00:04:52.060
<v Michael Kennedy>Yeah, it's an insult to circuses.

00:04:52.140 --> 00:04:52.640
<v Michael Kennedy>Yes, it is.

00:04:52.640 --> 00:04:53.260
<v Delaney Gillilan>It really is.

00:04:54.220 --> 00:04:54.560
<v Michael Kennedy>Amazing.

00:04:55.040 --> 00:04:55.200
<v Michael Kennedy>Okay.

00:04:55.540 --> 00:04:57.980
<v Michael Kennedy>And what we're going to talk about,

00:04:58.100 --> 00:05:02.220
<v Michael Kennedy>Datastar has this amazing ability to update many things

00:05:02.570 --> 00:05:05.020
<v Michael Kennedy>really quickly in real time, which we'll get into,

00:05:05.260 --> 00:05:06.980
<v Michael Kennedy>but yeah, sort of foreshadowing there.

00:05:07.160 --> 00:05:09.820
<v Michael Kennedy>And Chris May, welcome to the show.

00:05:10.380 --> 00:05:12.600
<v Michael Kennedy>I've known you for a long time and I'm really happy to have you here.

00:05:12.740 --> 00:05:13.980
<v Michael Kennedy>Great to be here. Thank you so much.

00:05:14.180 --> 00:05:14.380
<v Chris May>Yeah.

00:05:14.520 --> 00:05:25.120
<v Chris May>Yeah. So about me, I started writing websites back in 1995 and then picked up Python about 10 or so years later and just have really enjoyed the ride since then.

00:05:25.700 --> 00:05:30.220
<v Chris May>Picked along the way, became technical coach and just loved making single page applications.

00:05:30.560 --> 00:05:32.220
<v Chris May>I loved, I just love the web.

00:05:32.400 --> 00:05:36.340
<v Chris May>You know, I love that we can publish something from our computer and anybody around the world can see it.

00:05:36.620 --> 00:05:40.800
<v Chris May>And then what, maybe a little over a year ago, I, oh no, it was more than that.

00:05:40.860 --> 00:05:46.300
<v Chris May>I remember I was on a trip and I was listening to a podcast of HXPod, the HTMX podcast,

00:05:46.820 --> 00:05:50.220
<v Chris May>and heard about this crazy, cool tool, Datastar.

00:05:50.220 --> 00:05:54.520
<v Chris May>And I was like, I even put in my DjangoCon presentation, like you should, everybody else

00:05:54.640 --> 00:05:55.120
<v Chris May>should try it out.

00:05:55.150 --> 00:05:56.820
<v Chris May>And finally I did and I'm converted.

00:05:56.910 --> 00:05:57.560
<v Chris May>I love it.

00:05:57.770 --> 00:06:00.200
<v Chris May>So I'm excited that the three of us get to talk about it.

00:06:00.240 --> 00:06:05.919
<v Michael Kennedy>The reason that we're having this podcast is because I read your article about switching

00:06:05.940 --> 00:06:10.760
<v Michael Kennedy>to Datastar. And I'm like, okay, this is interesting. You made the case very well. Of

00:06:10.760 --> 00:06:18.000
<v Michael Kennedy>course, I'll link to the article. And so I thought, hey, I need to have Chris here as my Tony Romo to

00:06:18.120 --> 00:06:24.520
<v Michael Kennedy>my Al Michaels or Nico Rosberg to my Crofty or whatever, right? So I'm happy to have you here.

00:06:24.760 --> 00:06:30.380
<v Michael Kennedy>Exactly. Awesome to have you here. So let's just start with what is Datastar, right? I mean,

00:06:30.420 --> 00:06:37.220
<v Michael Kennedy>we've hinted that it has some similarities to htmx but also not so ben and delaney give us the

00:06:37.430 --> 00:06:41.920
<v Michael Kennedy>overview what is datastar so i can give a little bit of history and then ben's probably better at

00:06:42.140 --> 00:06:47.720
<v Delaney Gillilan>saying what it is now i have a background in like low-level stuff um even though i was a 3d artist

00:06:47.900 --> 00:06:52.660
<v Delaney Gillilan>first i'm much more comfortable in like shader development and that kind of thing like so glsl

00:06:52.770 --> 00:06:57.939
<v Delaney Gillilan>web thing like i'm a c guy that knows some other things but the thing is that i was working on

00:06:57.960 --> 00:07:03.140
<v Delaney Gillilan>some military applications where I needed really fast updates of a browser. And the reason why you

00:07:03.300 --> 00:07:09.240
<v Delaney Gillilan>in this military situation is that getting things approved is really hard, like executables to go

00:07:09.400 --> 00:07:13.060
<v Delaney Gillilan>into deployment. But having a browser means that you have this nice little sandbox that things can

00:07:13.070 --> 00:07:17.160
<v Delaney Gillilan>go in. So it's actually more of a deployment platform in my background than, you know, just

00:07:17.160 --> 00:07:21.700
<v Delaney Gillilan>the regular web. But I was doing things that were pushing the browser really, really far. I was using

00:07:21.840 --> 00:07:26.300
<v Delaney Gillilan>Vue and Spa. And I basically was like, well, these are the smartest people out here, but it's not

00:07:26.320 --> 00:07:31.160
<v Delaney Gillilan>fast enough. So I was using crazy WebSocket stuff, all this binary stuff. And then I tried doing,

00:07:31.620 --> 00:07:36.440
<v Delaney Gillilan>you had someone on last week talking about LiveView and like they have a Python version of that. I went

00:07:37.180 --> 00:07:40.820
<v Delaney Gillilan>hard in making a binary version of that, like going down to the protocol level, changing,

00:07:41.180 --> 00:07:44.600
<v Delaney Gillilan>optimizing that 10 different ways. I had an entire framework for doing this. And basically,

00:07:45.030 --> 00:07:48.840
<v Delaney Gillilan>in my opinion, that's a complete dead end. It is untenable. We can go into the reasons why,

00:07:49.080 --> 00:07:53.319
<v Delaney Gillilan>but the thing is, long story short, I ended up seeing what was happening in HTMLX in the hyper

00:07:53.340 --> 00:07:58.060
<v Delaney Gillilan>media space. And I completely discounted all of that because I said, like, I'm doing low level

00:07:58.200 --> 00:08:02.420
<v Delaney Gillilan>binary stuff. There's no way this other approach can be faster. And then my thing is always check

00:08:02.430 --> 00:08:07.000
<v Delaney Gillilan>the metrics, always don't take your assumptions and do the work. And the thing is, there's things

00:08:07.070 --> 00:08:11.080
<v Delaney Gillilan>that are wrong in the implementation, but there's things that are 100% right in the overall ideas of

00:08:11.360 --> 00:08:15.520
<v Delaney Gillilan>how to use that. So I went and I took a year and a half work and just threw it in the trash

00:08:16.100 --> 00:08:21.839
<v Delaney Gillilan>and said, okay, I'm starting over and like ended up doing some basic things would probably get into

00:08:22.160 --> 00:08:27.120
<v Delaney Gillilan>and ended up with this thing that is a backend diagnostic backend framework that has a 10

00:08:27.280 --> 00:08:33.140
<v Delaney Gillilan>kilobyte shim that is the fastest, smallest thing out there by orders of magnitude. So it's not just

00:08:33.190 --> 00:08:37.039
<v Delaney Gillilan>a slightly different thing. It is literally a different paradigm shift. It's a crazy shift.

00:08:37.070 --> 00:08:41.940
<v Delaney Gillilan>So the difference between reacts to something like HTMX is different from HTMX to the data

00:08:42.080 --> 00:08:46.620
<v Delaney Gillilan>start way. So I'll let Ben actually explain what that is. But the thing is from a low level C

00:08:46.680 --> 00:08:51.120
<v Delaney Gillilan>guys point of view, it is one of the fastest things in your stack now, which is crazy to think

00:08:51.120 --> 00:08:52.940
<v Delaney Gillilan>Yeah, like a 10K shim can do that.

00:08:53.000 --> 00:08:53.600
<v Michael Kennedy>That's incredible.

00:08:54.180 --> 00:08:58.340
<v Michael Kennedy>And also, it sounds like your advice comes from somebody who's done a lot of profiling.

00:08:59.120 --> 00:08:59.760
<v Delaney Gillilan>Very much so.

00:08:59.880 --> 00:09:00.660
<v Delaney Gillilan>Like, that's the only thing.

00:09:00.760 --> 00:09:02.900
<v Michael Kennedy>You got to measure, not guess.

00:09:03.160 --> 00:09:03.260
<v Delaney Gillilan>Yeah.

00:09:03.370 --> 00:09:06.940
<v Delaney Gillilan>In fact, there's funny things that we've had things on Twitter fighting with people and

00:09:06.940 --> 00:09:08.880
<v Delaney Gillilan>they're like, oh, this one situation was really slow.

00:09:09.350 --> 00:09:14.420
<v Delaney Gillilan>We actually looked at their flangraphs and it was a bug in the Safari GPU stuff.

00:09:14.770 --> 00:09:17.500
<v Delaney Gillilan>Because we were actually at the level where the JavaScript doesn't even show up.

00:09:17.580 --> 00:09:20.580
<v Delaney Gillilan>It's actually a GPU issue of it rendering fast stuff.

00:09:20.940 --> 00:09:22.640
<v Delaney Gillilan>in the browser, nothing to do with the JavaScript.

00:09:23.030 --> 00:09:25.320
<v Delaney Gillilan>Because the fastest JavaScript you can write is no JavaScript.

00:09:25.860 --> 00:09:28.140
<v Delaney Gillilan>So we really lean into what the browser can already do.

00:09:28.540 --> 00:09:30.220
<v Delaney Gillilan>And we're just making it so that that's easy to do

00:09:30.270 --> 00:09:32.380
<v Delaney Gillilan>so that the average person with the average website

00:09:32.960 --> 00:09:34.540
<v Delaney Gillilan>doesn't have to write any JavaScript at all.

00:09:34.810 --> 00:09:36.320
<v Delaney Gillilan>And they get to be a full stack developer

00:09:36.370 --> 00:09:37.340
<v Delaney Gillilan>in whatever language they choose.

00:09:37.780 --> 00:09:39.980
<v Delaney Gillilan>And I'll let everyone else talk from there.

00:09:40.040 --> 00:09:40.760
<v Ben Crocker>Awesome. Ben?

00:09:41.020 --> 00:09:43.560
<v Ben Crocker>Yeah, my version is going to be quite different to Delaney's

00:09:43.800 --> 00:09:45.800
<v Ben Crocker>because we care about different things.

00:09:45.980 --> 00:09:48.260
<v Ben Crocker>Fortunately, we do care about some of the same things.

00:09:49.000 --> 00:09:51.620
<v Ben Crocker>We work well together because I think we complement each other.

00:09:52.270 --> 00:09:57.280
<v Ben Crocker>But coming from a PHP background, I want the backend to be driving the front end.

00:09:57.290 --> 00:09:58.640
<v Ben Crocker>And it naturally does, right?

00:09:58.840 --> 00:10:02.580
<v Ben Crocker>Because even your HTML is being produced by your backend.

00:10:02.610 --> 00:10:04.280
<v Ben Crocker>And that's what's being served to the front end.

00:10:05.100 --> 00:10:08.420
<v Ben Crocker>I describe Datastar as a hypermedia framework.

00:10:09.240 --> 00:10:16.660
<v Ben Crocker>And some people get tripped up on what hypermedia is, but it's essentially hypertext with other media like images and CSS and that kind of thing.

00:10:16.740 --> 00:10:21.440
<v Ben Crocker>And everybody should know what hypertext is because it's the H in HTTP and HTML.

00:10:22.060 --> 00:10:33.840
<v Ben Crocker>There is an expectation for people coming into Datastar that you have a basic understanding of the web and web browsers and the web browser API because we lean as heavily as possible on the browser API.

00:10:34.340 --> 00:10:39.060
<v Ben Crocker>We get a lot of people coming into the Discord asking us, you know, how should I do this the Datastar way?

00:10:39.080 --> 00:10:44.860
<v Ben Crocker>And it got to the point where I'd heard that question so often I decided, OK, I'm going to write a page in the Datastar docs.

00:10:45.280 --> 00:10:46.940
<v Ben Crocker>We call it the tau of datastar.

00:10:47.110 --> 00:10:49.160
<v Ben Crocker>So it's kind of like the way of datastar.

00:10:49.520 --> 00:10:54.300
<v Ben Crocker>And if there's one thing to take from that, it's use as little datastar as possible.

00:10:54.720 --> 00:10:58.100
<v Ben Crocker>Like leverage the browser, because the browser is an incredible thing, right?

00:10:58.100 --> 00:11:01.920
<v Ben Crocker>Like it's basically an operating system, our operating system as web developers.

00:11:02.580 --> 00:11:05.500
<v Ben Crocker>So, and everything happens at the C level, super optimized.

00:11:06.100 --> 00:11:08.120
<v Ben Crocker>We're not going to be able to build something faster.

00:11:08.400 --> 00:11:11.480
<v Ben Crocker>So leverage the browser as much as possible on the browser APIs.

00:11:12.280 --> 00:11:19.200
<v Ben Crocker>And where HTML kind of lacks or where there are some gaps, that's essentially what Datastar is trying to fill.

00:11:19.680 --> 00:11:21.380
<v Ben Crocker>So I did a lot of work.

00:11:21.580 --> 00:11:26.760
<v Ben Crocker>So just to relate this, I guess, to something that other people might be familiar with, which is HTMLX.

00:11:27.380 --> 00:11:33.440
<v Ben Crocker>I was an early contributor to HTMLX, actually, and I was sold on the idea of hypermedia from the very beginning.

00:11:33.800 --> 00:11:35.740
<v Ben Crocker>So HTML is the language of the web.

00:11:36.100 --> 00:11:38.340
<v Ben Crocker>Why are we trying to replace it with JavaScript?

00:11:39.000 --> 00:11:46.740
<v Ben Crocker>And the problem that I ran into after several years of thinking HTMX is all I need is that last 10%, right?

00:11:46.910 --> 00:11:49.980
<v Ben Crocker>Because it'll get you 90% of what you're trying to do.

00:11:50.290 --> 00:11:56.280
<v Ben Crocker>But that last 10%, which we all know is the hardest piece that takes the most work, just isn't covered.

00:11:56.680 --> 00:12:02.059
<v Ben Crocker>So with HTMX, for example, you will very often reach for another library like AlpineJS,

00:12:02.760 --> 00:12:09.300
<v Ben Crocker>or you'll start writing vanilla JS perhaps to fill in those gaps to interactivity to the page,

00:12:09.390 --> 00:12:12.860
<v Ben Crocker>because HTMX is really just going to the back end, replacing the DOM.

00:12:13.270 --> 00:12:15.240
<v Ben Crocker>But now you have two dependencies.

00:12:15.820 --> 00:12:19.920
<v Ben Crocker>Now you have HTMX and Alpine, for example, and you're trying to make those play well together.

00:12:20.420 --> 00:12:24.880
<v Michael Kennedy>And because I think that might be a little bit of the missing sauce from HTMX.

00:12:24.980 --> 00:12:28.200
<v Michael Kennedy>I've had Carson Gross on and I really admire HTMX.

00:12:28.700 --> 00:12:34.920
<v Michael Kennedy>But as I've worked with it over a couple of years, I feel like it's really good as salt or seasoning,

00:12:35.020 --> 00:12:38.200
<v Michael Kennedy>something you sprinkle on to really make a website better.

00:12:38.660 --> 00:12:41.300
<v Michael Kennedy>But if you try to make a meal out of salt, you're not going to want to eat it.

00:12:41.480 --> 00:12:46.940
<v Michael Kennedy>And what I mean is, you have three different disjointed parts of the page,

00:12:47.030 --> 00:12:51.280
<v Michael Kennedy>and you're like, this is so amazing to update this with HTML and partials, and so is that.

00:12:51.980 --> 00:12:55.940
<v Michael Kennedy>But then you start talking about AlpineJS and connecting different things,

00:12:56.140 --> 00:12:59.340
<v Michael Kennedy>and then the JavaScript gets out of sync with this server response.

00:12:59.590 --> 00:13:02.880
<v Michael Kennedy>And it just, you start to feel constrained by it.

00:13:03.260 --> 00:13:05.400
<v Michael Kennedy>And I think you all have a really nice solution.

00:13:05.560 --> 00:13:08.560
<v Michael Kennedy>It's something a little bit like how you, we're going to talk about it,

00:13:08.560 --> 00:13:13.040
<v Michael Kennedy>but sort of how you specify the HTML to be updated by the server,

00:13:13.580 --> 00:13:16.380
<v Michael Kennedy>but then also connecting different parts of the pages.

00:13:16.940 --> 00:13:20.900
<v Michael Kennedy>Chris put it in his article that like the problem is AlpineJS and HTMX

00:13:20.930 --> 00:13:24.220
<v Michael Kennedy>are just two unrelated different things that happen to go together a lot.

00:13:24.280 --> 00:13:26.600
<v Michael Kennedy>And so they're not cohesive in a sense, right?

00:13:26.760 --> 00:13:28.540
<v Delaney Gillilan>Well, and that's one thing that's definitely an issue.

00:13:28.880 --> 00:13:30.520
<v Delaney Gillilan>Like, for example, this was my thing

00:13:30.680 --> 00:13:33.500
<v Delaney Gillilan>because I actually tried to fix HTMX back in the day.

00:13:33.760 --> 00:13:35.040
<v Delaney Gillilan>And like the things that I wanted to fix

00:13:35.440 --> 00:13:37.280
<v Delaney Gillilan>were the problem that I see at least

00:13:37.400 --> 00:13:39.060
<v Delaney Gillilan>is that you have HTMX, you can add,

00:13:39.200 --> 00:13:41.340
<v Delaney Gillilan>it has extensions, so you can add stuff to it.

00:13:41.700 --> 00:13:43.900
<v Delaney Gillilan>But it fundamentally was built to be like,

00:13:44.200 --> 00:13:45.660
<v Delaney Gillilan>here's our way of doing it.

00:13:45.920 --> 00:13:47.540
<v Delaney Gillilan>And then you can do your own stuff on top of it.

00:13:47.740 --> 00:13:51.040
<v Delaney Gillilan>The problem is, is that I thought that's broken.

00:13:51.260 --> 00:13:52.180
<v Delaney Gillilan>I've done enough game development

00:13:52.240 --> 00:13:53.200
<v Delaney Gillilan>to know that you need to be agile.

00:13:53.300 --> 00:13:55.100
<v Delaney Gillilan>I need to be able to like be able to move quickly.

00:13:55.560 --> 00:14:01.180
<v Delaney Gillilan>So I wanted it so that nothing was basically like the core of data star is like 300 lines

00:14:01.270 --> 00:14:01.380
<v Delaney Gillilan>long.

00:14:01.670 --> 00:14:06.580
<v Delaney Gillilan>And it is basically setting up data dash star elements, hooking up plugins, and then everything

00:14:06.690 --> 00:14:07.220
<v Delaney Gillilan>else is a plugin.

00:14:07.530 --> 00:14:12.160
<v Delaney Gillilan>So if you don't agree with us, or if someone's better than I am, great, that's wonderful.

00:14:12.470 --> 00:14:15.120
<v Delaney Gillilan>We will be able to just pop that part out, put the new part in.

00:14:15.500 --> 00:14:17.060
<v Delaney Gillilan>But plugins can now depend on each other.

00:14:17.110 --> 00:14:17.520
<v Delaney Gillilan>They can understand.

00:14:17.800 --> 00:14:18.500
<v Delaney Gillilan>It's an ecosystem.

00:14:18.960 --> 00:14:20.660
<v Delaney Gillilan>Ironically, that's what happens under the hood.

00:14:21.080 --> 00:14:23.140
<v Delaney Gillilan>But the ideas of that make it so much more powerful.

00:14:23.200 --> 00:14:34.120
<v Delaney Gillilan>And the irony is that if you build it in that kind of plugin style way, in the more game developer style way, we are smaller than HTMLX and Alpine alone, let alone combined, let alone Hyperscript and all these other things.

00:14:34.320 --> 00:14:36.700
<v Delaney Gillilan>So it's just a different way of thinking about the problem.

00:14:36.840 --> 00:14:46.720
<v Ben Crocker>When I first encountered Datastar and looked at the source code, it looked very foreign to me because Delaney coming from game development, he built Datastar like a game engine.

00:14:47.160 --> 00:14:52.420
<v Ben Crocker>So you have this very thin core and then everything else pretty much is a plugin.

00:14:52.480 --> 00:14:58.680
<v Ben Crocker>And all Datastar core is a way for registering plugins and having Datastar attributes.

00:14:59.130 --> 00:15:00.380
<v Ben Crocker>And that's pretty much it.

00:15:00.600 --> 00:15:03.580
<v Ben Crocker>Everything else is an add-on that you, is a plugin that you can take away.

00:15:03.710 --> 00:15:08.020
<v Ben Crocker>So we even have a bundler on the site that allows you to just, well, you can just download

00:15:08.560 --> 00:15:11.660
<v Ben Crocker>Datastar core or you can just select what plugins you want.

00:15:12.060 --> 00:15:16.160
<v Ben Crocker>Now, that in and of itself is not that interesting because we're, at the end of the day, we're

00:15:16.200 --> 00:15:19.300
<v Ben Crocker>talking about a 10 kilobyte JavaScript file with all of the plugins.

00:15:19.840 --> 00:15:21.720
<v Ben Crocker>But it is open source, which we didn't mention.

00:15:21.760 --> 00:15:24.580
<v Ben Crocker>And so anybody can go just kind of look at it if you're interested.

00:15:25.080 --> 00:15:29.700
<v Ben Crocker>But that approach means that everything is modular and everything is there for a reason.

00:15:30.320 --> 00:15:32.180
<v Ben Crocker>And we'll get into this later, I guess.

00:15:32.230 --> 00:15:36.760
<v Ben Crocker>But like deciding what plugins go in and what stay out is one of the challenges.

00:15:36.890 --> 00:15:38.940
<v Ben Crocker>And we just try to keep it as lean as possible.

00:15:39.400 --> 00:15:43.860
<v Ben Crocker>My way of thinking about it is that Datastar gives you everything you need and nothing you don't.

00:15:44.240 --> 00:15:47.400
<v Ben Crocker>And that's how we try to kind of keep it lean and fast.

00:15:48.680 --> 00:15:51.060
<v Michael Kennedy>This portion of Talk Python Maze brought to you by Sentry.

00:15:51.400 --> 00:15:56.500
<v Michael Kennedy>I've been using Sentry personally on almost every application and API that I've built for

00:15:56.660 --> 00:15:59.120
<v Michael Kennedy>Talk Python and beyond over the last few years.

00:15:59.480 --> 00:16:02.400
<v Michael Kennedy>They're a core building block for keeping my infrastructure solid.

00:16:03.000 --> 00:16:04.300
<v Michael Kennedy>They should be for yours as well.

00:16:04.580 --> 00:16:04.960
<v Michael Kennedy>Here's why.

00:16:05.620 --> 00:16:07.060
<v Michael Kennedy>Sentry doesn't just catch errors.

00:16:07.140 --> 00:16:09.840
<v Michael Kennedy>It catches all the stuff that makes your app feel broken.

00:16:10.160 --> 00:16:14.580
<v Michael Kennedy>The random slowdown, the freeze you can't reproduce, that bug that only shows up once

00:16:14.880 --> 00:16:15.660
<v Michael Kennedy>real users hit it.

00:16:15.940 --> 00:16:19.440
<v Michael Kennedy>And when something goes wrong, Sentry gives you the whole chain of events in one place.

00:16:19.680 --> 00:16:22.640
<v Michael Kennedy>errors, traces, replays, logs, dots connected.

00:16:22.980 --> 00:16:24.860
<v Michael Kennedy>You can see what's led to the issue

00:16:25.100 --> 00:16:26.820
<v Michael Kennedy>without digging through five different dashboards.

00:16:27.640 --> 00:16:29.660
<v Michael Kennedy>Seer, Sentry's AI debugging agent,

00:16:30.180 --> 00:16:32.120
<v Michael Kennedy>builds on this data, taking the full context,

00:16:32.800 --> 00:16:34.840
<v Michael Kennedy>explaining why the issue happened,

00:16:35.360 --> 00:16:37.720
<v Michael Kennedy>pointing to the code responsible, drafts a fix,

00:16:37.800 --> 00:16:40.780
<v Michael Kennedy>and even flags if your PR is about to introduce a new problem.

00:16:41.620 --> 00:16:42.660
<v Michael Kennedy>The workflow stays simple.

00:16:43.100 --> 00:16:44.860
<v Michael Kennedy>Something breaks, Sentry alerts you,

00:16:45.020 --> 00:16:46.820
<v Michael Kennedy>the dashboard shows you the full context.

00:16:47.160 --> 00:16:49.640
<v Michael Kennedy>Seer helps you fix it and catch new issues

00:16:49.660 --> 00:16:55.400
<v Michael Kennedy>before they ship. It's totally reasonable to go from an error occurred to fixed in production in

00:16:55.600 --> 00:17:01.160
<v Michael Kennedy>just 10 minutes. I truly appreciate the support that Sentry has given me to help solve my bugs

00:17:01.320 --> 00:17:06.620
<v Michael Kennedy>and issues in my apps, especially those tricky ones that only appear in production. I know you will

00:17:06.640 --> 00:17:12.020
<v Michael Kennedy>too if you try them out. So get started today with Sentry. Just visit talkpython.fm/sentry

00:17:12.540 --> 00:17:19.620
<v Michael Kennedy>and get $100 in Sentry credits. Please use that link. It's in your podcast player show notes. If

00:17:19.640 --> 00:17:25.839
<v Michael Kennedy>our code talkpython26, all one word talkpython26 to get $100 in credits.

00:17:26.740 --> 00:17:28.300
<v Michael Kennedy>Thank you to Sentry for supporting the show.

00:17:29.600 --> 00:17:29.760
<v Michael Kennedy>Cool.

00:17:29.800 --> 00:17:33.240
<v Michael Kennedy>That's a super interesting philosophy to say you should be able to take, even take

00:17:33.310 --> 00:17:35.580
<v Michael Kennedy>stuff out of what we're giving you by default, right?

00:17:35.850 --> 00:17:42.100
<v Michael Kennedy>Now, before we move on from sort of introducing Datastar, I do want to point out at data-star.dev,

00:17:42.220 --> 00:17:45.420
<v Michael Kennedy>which of course I'll link this notes, there's some cool examples on here.

00:17:45.720 --> 00:17:53.260
<v Michael Kennedy>You've got a really nice space 2001 sort of theme with Hal and all that, which is great.

00:17:53.920 --> 00:17:56.260
<v Michael Kennedy>I like the aesthetic here, which is very fun.

00:17:56.800 --> 00:18:00.620
<v Michael Kennedy>It's got a little bit of a retro gaming feel, which is nice.

00:18:00.880 --> 00:18:03.400
<v Michael Kennedy>But what I want to point out is I want to encourage people to go watch your little video.

00:18:03.960 --> 00:18:04.800
<v Michael Kennedy>Your video is fun.

00:18:05.520 --> 00:18:06.360
<v Ben Crocker>It's really fun.

00:18:06.480 --> 00:18:11.160
<v Ben Crocker>This video is all about how Datastar fits in the world of SPAs.

00:18:11.920 --> 00:18:16.480
<v Ben Crocker>And one thing we didn't really mention is that Datastar is a full-fledged SPA replacement.

00:18:17.020 --> 00:18:26.140
<v Ben Crocker>So again, like that last 10%, often people will think, oh, well, I need to go to React or Vue.js or some single page application framework.

00:18:26.340 --> 00:18:34.640
<v Ben Crocker>Whereas we're saying that, no, no, no, Datastar will not only, it's not like a subset or like SPAs are not a superset.

00:18:34.680 --> 00:18:41.620
<v Ben Crocker>it's on the contrary. I think Datastark, we think Datastark can do more than SBAs because we are

00:18:42.180 --> 00:18:46.300
<v Ben Crocker>driven by the backend and we are focused on hypermedia, which is the language of the web.

00:18:46.640 --> 00:18:51.480
<v Ben Crocker>So this, yeah, so this video is kind of throwing, yeah, anyway, everybody should watch it.

00:18:51.800 --> 00:18:56.840
<v Chris May>I'd also like to, if you can scroll back up to the top of the page, the Starfield animation was

00:18:57.040 --> 00:19:02.460
<v Chris May>one of the things like when Delaney and when everybody who worked on this published it,

00:19:02.780 --> 00:19:04.700
<v Chris May>Like I didn't realize how amazing this was

00:19:04.810 --> 00:19:07.460
<v Chris May>because if you like right click and inspect that thing,

00:19:07.960 --> 00:19:08.740
<v Chris May>it's a web component.

00:19:09.230 --> 00:19:11.100
<v Chris May>And so all the JavaScript that's required

00:19:11.300 --> 00:19:13.540
<v Chris May>for making all the stars go faster and slower

00:19:13.760 --> 00:19:16.180
<v Chris May>and tracking your mouse where, you know, wherever you do it,

00:19:16.600 --> 00:19:18.280
<v Chris May>it's all within that web component.

00:19:18.520 --> 00:19:21.180
<v Chris May>And data star is essentially subscribing to like,

00:19:21.260 --> 00:19:22.020
<v Chris May>where's the mouse pointer

00:19:22.440 --> 00:19:24.120
<v Chris May>and passing it into the web component.

00:19:24.380 --> 00:19:26.520
<v Delaney Gillilan>Yeah, in fact, if you go to more examples,

00:19:27.220 --> 00:19:29.260
<v Delaney Gillilan>you will see that there's,

00:19:29.360 --> 00:19:31.240
<v Delaney Gillilan>and then go scroll down to,

00:19:31.720 --> 00:19:32.780
<v Delaney Gillilan>or use the hamburger thing.

00:19:32.850 --> 00:19:35.200
<v Delaney Gillilan>Yeah, go down to the rocket.

00:19:35.980 --> 00:19:37.740
<v Delaney Gillilan>There's the actual star field.

00:19:38.110 --> 00:19:39.940
<v Delaney Gillilan>So you can see the entire, the star field,

00:19:40.010 --> 00:19:41.700
<v Delaney Gillilan>the entire component is there.

00:19:41.790 --> 00:19:43.020
<v Delaney Gillilan>So if you scroll down from there,

00:19:43.320 --> 00:19:45.100
<v Delaney Gillilan>you'll see how it actually gets hooked up

00:19:45.460 --> 00:19:46.680
<v Delaney Gillilan>and the entire component,

00:19:46.900 --> 00:19:48.200
<v Delaney Gillilan>that's the whole thing, it's right there.

00:19:48.340 --> 00:19:48.840
<v Michael Kennedy>- That's incredible.

00:19:49.200 --> 00:19:50.580
<v Delaney Gillilan>- And the thing is if you start moving around,

00:19:51.060 --> 00:19:52.820
<v Delaney Gillilan>like if you scroll up just a little bit more,

00:19:52.870 --> 00:19:54.280
<v Delaney Gillilan>so you can see the sliders,

00:19:54.690 --> 00:19:56.160
<v Delaney Gillilan>you'll see that they're live, everything's,

00:19:56.360 --> 00:19:57.080
<v Delaney Gillilan>if you move it around,

00:19:57.540 --> 00:19:59.240
<v Delaney Gillilan>like you move your mouse around the canvas,

00:19:59.460 --> 00:20:00.860
<v Delaney Gillilan>you'll see everything's live editing,

00:20:01.040 --> 00:20:01.820
<v Delaney Gillilan>everything's thing.

00:20:02.040 --> 00:20:03.800
<v Delaney Gillilan>It's the irony of Datastar.

00:20:03.800 --> 00:20:05.840
<v Delaney Gillilan>And this is the part that I don't think people quite get.

00:20:06.260 --> 00:20:08.100
<v Delaney Gillilan>And it's not that you're trying to like,

00:20:08.500 --> 00:20:10.160
<v Delaney Gillilan>we love what Carson has done with HCMS.

00:20:10.320 --> 00:20:11.680
<v Delaney Gillilan>We love that all the things they've done,

00:20:11.800 --> 00:20:13.120
<v Delaney Gillilan>but it does not do everything.

00:20:13.460 --> 00:20:13.980
<v Delaney Gillilan>It doesn't do enough.

00:20:14.080 --> 00:20:15.140
<v Delaney Gillilan>It is a library, not a framework.

00:20:15.560 --> 00:20:16.120
<v Delaney Gillilan>And the thing is,

00:20:16.360 --> 00:20:18.180
<v Delaney Gillilan>the irony is that Datastar actually has

00:20:18.520 --> 00:20:19.880
<v Delaney Gillilan>the fastest reactive signal,

00:20:21.060 --> 00:20:21.860
<v Delaney Gillilan>like reactive signals.

00:20:22.200 --> 00:20:23.700
<v Delaney Gillilan>We are the fastest thing out there.

00:20:23.980 --> 00:20:25.420
<v Delaney Gillilan>So it's not just like we did something

00:20:25.520 --> 00:20:26.300
<v Delaney Gillilan>that's kind of like VDOM,

00:20:26.360 --> 00:20:26.980
<v Delaney Gillilan>or we are like,

00:20:27.180 --> 00:20:28.160
<v Delaney Gillilan>we can compete with React.

00:20:28.220 --> 00:20:30.220
<v Delaney Gillilan>We demolish them with actual numbers.

00:20:30.860 --> 00:20:35.160
<v Delaney Gillilan>So we have the fastest morphing strategy and we also have the fastest signals, which means doing these kinds of things.

00:20:35.420 --> 00:20:35.980
<v Delaney Gillilan>It's just a non-issue.

00:20:36.010 --> 00:20:37.960
<v Delaney Gillilan>Like this star field thing is 1K.

00:20:38.460 --> 00:20:42.740
<v Delaney Gillilan>Like it's just these are the kinds of things that are just a non-issue in this if you do things our way.

00:20:42.860 --> 00:20:52.320
<v Chris May>And you're leaning into the web ecosystem by leveraging web components instead of having to like build, have a build time pipeline to, you know, do all the custom JavaScript.

00:20:53.000 --> 00:20:57.380
<v Chris May>Like once I realized like you can do these things, it just made, it just clicked.

00:20:57.540 --> 00:21:03.900
<v Chris May>And I just make it's I feel like it's so much more fun now to work on the web now that I understand these things.

00:21:04.180 --> 00:21:06.200
<v Michael Kennedy>Let's talk through some of the core examples.

00:21:06.450 --> 00:21:11.600
<v Michael Kennedy>I feel like there's some similarities to the example section of the HTMX place.

00:21:11.700 --> 00:21:14.520
<v Michael Kennedy>But, you know, HTMX doesn't have a star field, certainly.

00:21:14.880 --> 00:21:16.840
<v Michael Kennedy>Best place to start is on the homepage.

00:21:17.470 --> 00:21:26.720
<v Ben Crocker>Before we get into those examples, just just to kind of take a step back and say, OK, we've mentioned HTMX a few times and we don't we don't even like to compare ourselves to HTMX.

00:21:26.880 --> 00:21:29.100
<v Ben Crocker>but it is a good maybe starting point for some people.

00:21:29.370 --> 00:21:31.220
<v Ben Crocker>We have a hello world example there,

00:21:31.640 --> 00:21:32.300
<v Ben Crocker>if you could find that.

00:21:32.360 --> 00:21:33.680
<v Ben Crocker>Yeah, let's scroll down just a little bit more.

00:21:33.840 --> 00:21:34.520
<v Ben Crocker>Yeah, you got it.

00:21:34.820 --> 00:21:38.200
<v Ben Crocker>One of the maybe differences between HTMX and Datastar

00:21:38.200 --> 00:21:40.900
<v Ben Crocker>is that Datastar can receive HTML responses,

00:21:41.050 --> 00:21:42.400
<v Ben Crocker>but it also by default,

00:21:42.720 --> 00:21:45.520
<v Ben Crocker>or the recommendation is to use server sent events.

00:21:46.020 --> 00:21:47.260
<v Ben Crocker>So if you hit start there,

00:21:47.660 --> 00:21:50.240
<v Ben Crocker>you're going to see kind of the network response tab,

00:21:50.310 --> 00:21:51.580
<v Ben Crocker>and those are server sent events.

00:21:51.840 --> 00:21:55.179
<v Ben Crocker>And SSE server sent events are an old technology

00:21:55.200 --> 00:21:56.740
<v Ben Crocker>that work just over HTTP.

00:21:57.480 --> 00:22:00.120
<v Ben Crocker>And essentially what happens is that the server

00:22:00.360 --> 00:22:01.960
<v Ben Crocker>holds a connection open to the browser

00:22:02.140 --> 00:22:03.520
<v Ben Crocker>and it's unidirectional.

00:22:03.820 --> 00:22:05.720
<v Ben Crocker>So you send a request to the server

00:22:05.960 --> 00:22:08.820
<v Ben Crocker>and then the server can stream events back down,

00:22:08.980 --> 00:22:09.980
<v Ben Crocker>which is what you're seeing here.

00:22:10.300 --> 00:22:12.160
<v Ben Crocker>Now, this is obviously a trivial example, right?

00:22:12.240 --> 00:22:12.900
<v Ben Crocker>We're sending one,

00:22:13.360 --> 00:22:16.040
<v Ben Crocker>or we're updating the message one character at a time.

00:22:16.600 --> 00:22:19.300
<v Ben Crocker>But when you see how simple this is,

00:22:19.320 --> 00:22:22.600
<v Ben Crocker>then you can perhaps see potential for this, right?

00:22:22.660 --> 00:22:29.720
<v Ben Crocker>And SSE or service end events have had kind of a renaissance in recent years with all of the LLMs, right?

00:22:29.750 --> 00:22:33.740
<v Ben Crocker>All the chatbots are streaming the responses back to you.

00:22:33.970 --> 00:22:42.680
<v Ben Crocker>So this type of technology, while it's not old, sorry, it's not new, it's actually been around a long time, has kind of been underused.

00:22:43.660 --> 00:22:50.940
<v Ben Crocker>And Delaney kind of tapped into that and said, well, because I also always thought, well, if I want pure reactivity or true reactivity,

00:22:50.960 --> 00:22:52.840
<v Ben Crocker>I need two-way communication.

00:22:53.020 --> 00:22:53.720
<v Ben Crocker>So I need web sockets.

00:22:53.720 --> 00:22:54.560
<v Michael Kennedy>You need web sockets.

00:22:54.650 --> 00:22:56.660
<v Ben Crocker>You need binary and all that kind of stuff.

00:22:56.820 --> 00:22:56.940
<v Ben Crocker>Yeah.

00:22:57.120 --> 00:22:57.220
<v Ben Crocker>Yeah.

00:22:57.460 --> 00:22:59.440
<v Ben Crocker>There's problems with those, which we can get into.

00:23:00.200 --> 00:23:01.240
<v Ben Crocker>SSE is much simpler.

00:23:01.470 --> 00:23:04.300
<v Ben Crocker>It works over HTTP 1, 2, and 3.

00:23:05.120 --> 00:23:06.620
<v Ben Crocker>And as you can see, it's just plain text.

00:23:06.780 --> 00:23:08.280
<v Ben Crocker>There is no complicated handshake.

00:23:08.700 --> 00:23:12.480
<v Ben Crocker>If you change the interval to zero and hit start,

00:23:13.260 --> 00:23:15.740
<v Ben Crocker>you're going to see a different type of response, which is,

00:23:16.060 --> 00:23:17.860
<v Ben Crocker>and I don't know if you saw the content type change,

00:23:18.160 --> 00:23:19.820
<v Ben Crocker>but content type now is text HTML.

00:23:20.210 --> 00:23:20.580
<v Michael Kennedy>Oh, intro.

00:23:20.700 --> 00:23:21.320
<v Michael Kennedy>Oh, interesting.

00:23:21.520 --> 00:23:21.620
<v Ben Crocker>Yeah.

00:23:22.070 --> 00:23:24.300
<v Ben Crocker>So this is what HTMLX would do by default.

00:23:24.410 --> 00:23:28.140
<v Ben Crocker>You send back HTML responses, whereas here the content type

00:23:28.320 --> 00:23:29.620
<v Ben Crocker>is text event stream.

00:23:30.250 --> 00:23:32.900
<v Ben Crocker>And this allows you to hold that connection open

00:23:33.370 --> 00:23:34.300
<v Ben Crocker>for as long as you want.

00:23:34.300 --> 00:23:39.400
<v Ben Crocker>It can be open and closed, or it can stay open until the words

00:23:39.540 --> 00:23:41.420
<v Ben Crocker>hello world have been spelled out.

00:23:41.940 --> 00:23:43.660
<v Ben Crocker>Or you can keep it open indefinitely.

00:23:44.100 --> 00:23:46.720
<v Ben Crocker>So we're going to see some more advanced examples

00:23:46.740 --> 00:23:50.400
<v Ben Crocker>where the SSE connection is held open for longer.

00:23:50.680 --> 00:23:53.880
<v Ben Crocker>So I think wrapping your head around this example

00:23:55.260 --> 00:23:57.600
<v Ben Crocker>taps you into the potential of Datastar.

00:23:57.620 --> 00:23:57.980
<v Michael Kennedy>MARK MANDEL: Yeah.

00:23:58.280 --> 00:23:59.880
<v Michael Kennedy>And one of the things that--

00:24:00.020 --> 00:24:03.040
<v Michael Kennedy>well, when I looked at Datastar, I'm like, OK,

00:24:03.740 --> 00:24:05.320
<v Michael Kennedy>there's some interesting aspects here.

00:24:05.320 --> 00:24:08.220
<v Michael Kennedy>And we'll get into them, how you can set up--

00:24:08.660 --> 00:24:10.860
<v Michael Kennedy>when I click the Start button, it might replace

00:24:10.960 --> 00:24:12.900
<v Michael Kennedy>a piece of the page-- hey, that sounds familiar--

00:24:13.280 --> 00:24:15.460
<v Michael Kennedy>with HTML, not through JavaScript, right?

00:24:15.900 --> 00:24:21.140
<v Michael Kennedy>but it didn't specify anywhere what part of the page to replace or not.

00:24:21.180 --> 00:24:22.480
<v Michael Kennedy>Like, how does it know?

00:24:22.940 --> 00:24:26.960
<v Michael Kennedy>And so with Datastar, you lean more on the server for many things,

00:24:28.000 --> 00:24:32.220
<v Michael Kennedy>including deciding what part of the page that the server created in the first place to update.

00:24:32.300 --> 00:24:33.420
<v Michael Kennedy>I really like that.

00:24:33.480 --> 00:24:35.220
<v Michael Kennedy>I think that that's super neat.

00:24:35.580 --> 00:24:39.440
<v Michael Kennedy>It lets you not just have sort of closer to one source of truth,

00:24:39.660 --> 00:24:43.400
<v Michael Kennedy>but also just you can pass down multiple things.

00:24:43.480 --> 00:24:45.720
<v Michael Kennedy>is like, we need to update this pane on the right,

00:24:46.280 --> 00:24:50.100
<v Michael Kennedy>this text, and this element all in one response.

00:24:50.640 --> 00:24:52.240
<v Michael Kennedy>There's a lot of interesting aspects

00:24:52.480 --> 00:24:54.520
<v Michael Kennedy>to what you're talking about here.

00:24:54.560 --> 00:24:56.860
<v Ben Crocker>JOHN MCWHORTER: Anyone who's familiar with out-of-band swaps

00:24:56.920 --> 00:24:59.000
<v Ben Crocker>in HTMX, well, guess what?

00:24:59.160 --> 00:25:00.640
<v Ben Crocker>Datastar is out-of-band by default.

00:25:01.480 --> 00:25:03.880
<v Ben Crocker>So it's matching currently based on the ID.

00:25:04.600 --> 00:25:06.920
<v Ben Crocker>So you see h3 id equals message.

00:25:07.280 --> 00:25:10.300
<v Ben Crocker>And every event that's coming back has an ID of message.

00:25:10.940 --> 00:25:11.820
<v Ben Crocker>But guess what?

00:25:11.960 --> 00:25:13.680
<v Ben Crocker>you can use any ID you want, right?

00:25:13.790 --> 00:25:16.760
<v Ben Crocker>So you can use actually any CSS selector you want.

00:25:16.790 --> 00:25:19.700
<v Ben Crocker>But yes, we put the onus more on the backend

00:25:20.120 --> 00:25:23.160
<v Ben Crocker>because that is where we believe state should live

00:25:23.500 --> 00:25:26.720
<v Ben Crocker>or that's the source of truth for state.

00:25:27.300 --> 00:25:30.320
<v Ben Crocker>And you send and you work with state on the front end

00:25:30.660 --> 00:25:32.680
<v Ben Crocker>only when and where it makes sense to,

00:25:33.040 --> 00:25:34.840
<v Ben Crocker>which is more the web component aspect.

00:25:35.080 --> 00:25:36.920
<v Delaney Gillilan>And I'll caveat what Ben said there

00:25:36.970 --> 00:25:39.960
<v Delaney Gillilan>in that like state mostly lives in the backend.

00:25:40.460 --> 00:25:43.380
<v Delaney Gillilan>And that's the problem is that like state lives where it lives.

00:25:43.500 --> 00:25:46.280
<v Delaney Gillilan>Like if the user is actively able to move their mouse cursor,

00:25:46.540 --> 00:25:48.420
<v Delaney Gillilan>they own that state of the mouse cursor.

00:25:48.560 --> 00:25:49.340
<v Delaney Gillilan>You don't own that,

00:25:49.620 --> 00:25:52.240
<v Delaney Gillilan>but most of the state from your database should be in the backend.

00:25:52.780 --> 00:25:56.660
<v Delaney Gillilan>The one thing that's interesting about the SSE compared to how most people

00:25:56.700 --> 00:25:59.060
<v Delaney Gillilan>think this stuff, I will say I fell into this trap too, right?

00:25:59.060 --> 00:26:03.500
<v Delaney Gillilan>Cause I did the live view crazy stuff is that your job as a web developer is to

00:26:03.560 --> 00:26:06.700
<v Delaney Gillilan>get strings to the browser as efficiently, as fast as possible.

00:26:06.840 --> 00:26:09.160
<v Delaney Gillilan>Cause like the browser is going to deal with that,

00:26:09.340 --> 00:26:14.640
<v Delaney Gillilan>that into html and all that there's nothing faster than giving it html right so the thing that i i

00:26:14.690 --> 00:26:20.440
<v Delaney Gillilan>know i lost for a long time is that sse i thought oh it's this big string thing how is that better

00:26:20.580 --> 00:26:24.900
<v Delaney Gillilan>than binary but the irony is that because it's so regular because there's already things like

00:26:25.000 --> 00:26:28.560
<v Delaney Gillilan>compression built into the browser there's streaming things there's things that are so

00:26:28.660 --> 00:26:33.720
<v Delaney Gillilan>much easier to do here in an efficient way that the irony is if you if you you don't have to care

00:26:33.800 --> 00:26:38.520
<v Delaney Gillilan>about all these things but if you just follow our way of doing it your python app will be faster

00:26:38.540 --> 00:26:40.200
<v Delaney Gillilan>than most people's like compiled,

00:26:40.660 --> 00:26:42.080
<v Delaney Gillilan>you know, like low level language thing

00:26:42.200 --> 00:26:43.800
<v Delaney Gillilan>because you're getting orders of magnitude

00:26:44.030 --> 00:26:44.640
<v Delaney Gillilan>in the algorithms

00:26:44.770 --> 00:26:46.280
<v Delaney Gillilan>and how we're doing stuff from the hood.

00:26:46.420 --> 00:26:47.620
<v Delaney Gillilan>So I don't know if you're interested

00:26:47.710 --> 00:26:48.980
<v Delaney Gillilan>in like the deep down stuff

00:26:49.180 --> 00:26:51.000
<v Delaney Gillilan>or just like how you use it as a Python developer.

00:26:51.030 --> 00:26:53.540
<v Delaney Gillilan>But the irony is that you now have tapped into this.

00:26:53.670 --> 00:26:54.420
<v Delaney Gillilan>It seems so simple.

00:26:54.580 --> 00:26:56.260
<v Delaney Gillilan>You're like, oh, this is just a different text response.

00:26:56.880 --> 00:26:58.480
<v Delaney Gillilan>How can this be orders of magnitude faster?

00:26:58.860 --> 00:26:59.960
<v Delaney Gillilan>Like, again, I don't know how much

00:26:59.970 --> 00:27:00.920
<v Delaney Gillilan>you want to get into the weeds of that

00:27:01.280 --> 00:27:03.180
<v Delaney Gillilan>compared to just it's fun to use, right?

00:27:03.340 --> 00:27:05.440
<v Michael Kennedy>Yeah, I really like the philosophy

00:27:05.580 --> 00:27:07.780
<v Michael Kennedy>of having so much of it controlled by the server.

00:27:08.280 --> 00:27:09.920
<v Michael Kennedy>It just felt disheartening.

00:27:10.160 --> 00:27:11.480
<v Michael Kennedy>It's like, okay, so what you're going to do

00:27:11.480 --> 00:27:13.780
<v Michael Kennedy>is you're just going to create some JSON responses

00:27:14.780 --> 00:27:15.620
<v Michael Kennedy>on your server,

00:27:15.730 --> 00:27:18.880
<v Michael Kennedy>and then everything is some crazy build series of steps

00:27:19.420 --> 00:27:21.120
<v Michael Kennedy>to end up with, I don't know,

00:27:21.400 --> 00:27:23.160
<v Michael Kennedy>Vue or React or something on the front end.

00:27:23.250 --> 00:27:26.420
<v Michael Kennedy>And there's just so much power and flexibility

00:27:26.900 --> 00:27:29.060
<v Michael Kennedy>to write really cool server code.

00:27:29.260 --> 00:27:31.140
<v Michael Kennedy>But, you know, like a lot of the trends have been,

00:27:31.680 --> 00:27:34.680
<v Michael Kennedy>yeah, that's kind of just there to support the rest of it,

00:27:34.750 --> 00:27:37.120
<v Michael Kennedy>you know, and so I don't know, this really appeals to me.

00:27:37.500 --> 00:27:43.600
<v Ben Crocker>question that comes up often is like, OK, well, how do I format this? Because it has its own syntax.

00:27:44.040 --> 00:27:48.620
<v Ben Crocker>Very simple to read, obviously, right? An event name and then these data lines. And you can just

00:27:48.670 --> 00:27:54.460
<v Ben Crocker>have as many data lines as you want. And that's your HTML. If you scroll up, though, we do have...

00:27:54.730 --> 00:28:01.240
<v Ben Crocker>So you do need to format this, but we essentially have all of these SDKs, including Python, you'll

00:28:01.320 --> 00:28:06.660
<v Ben Crocker>see there. And the Python SDK is actually, I would say, one of the most intricate ones we have.

00:28:07.240 --> 00:28:12.900
<v Ben Crocker>Spatuel King, he's a member of the community, or Chase, I believe is his first name, his real first

00:28:13.020 --> 00:28:18.340
<v Ben Crocker>name, and many other contributors did an amazing job on that. So lots and lots of Python frameworks

00:28:18.520 --> 00:28:24.120
<v Ben Crocker>are supported. You can maybe speak more to this, Chris. And really, the SDKs are very simple,

00:28:24.360 --> 00:28:29.780
<v Ben Crocker>because all they do is they take a function, a patch elements or patch signals function,

00:28:30.160 --> 00:28:34.840
<v Ben Crocker>and you just dump in the HTML that you want swapped into the DOM or the signals you want

00:28:34.820 --> 00:28:39.680
<v Ben Crocker>output on the page and it just does the formatting for you so so it's really just there's three

00:28:39.900 --> 00:28:45.120
<v Chris May>functions i think in total that every sdk has to implement and it's such a time saver you know um

00:28:45.620 --> 00:28:52.260
<v Chris May>i doved into service and events a lot with htmx and when you get the syntax wrong it is so painful

00:28:52.680 --> 00:28:58.840
<v Chris May>to debug because pretty much can't it just doesn't work you know or whatever it's harder to debug and

00:28:58.920 --> 00:29:04.780
<v Chris May>so to have the helper syntax it's just a dream well and also just so people are aware i like

00:29:04.800 --> 00:29:06.060
<v Delaney Gillilan>because I was originally going to try,

00:29:06.270 --> 00:29:07.980
<v Delaney Gillilan>the irony is I was trying to get server sent events

00:29:08.320 --> 00:29:10.760
<v Delaney Gillilan>like their plugin up to snuff like years ago.

00:29:11.240 --> 00:29:14.580
<v Delaney Gillilan>Like I would highly recommend not using SSE with HTMLX

00:29:14.860 --> 00:29:16.800
<v Delaney Gillilan>because the problem is that the entire model

00:29:16.830 --> 00:29:18.260
<v Delaney Gillilan>of how you build things is very poll based

00:29:18.720 --> 00:29:19.940
<v Delaney Gillilan>and it's built out of band.

00:29:19.970 --> 00:29:20.900
<v Delaney Gillilan>It's like a weird concept,

00:29:21.010 --> 00:29:21.940
<v Delaney Gillilan>like the idea of updating,

00:29:22.050 --> 00:29:23.800
<v Delaney Gillilan>like it is not built with that in mind.

00:29:24.130 --> 00:29:25.680
<v Delaney Gillilan>So I know that they're trying to move towards that

00:29:25.770 --> 00:29:26.180
<v Delaney Gillilan>in the future,

00:29:26.440 --> 00:29:28.800
<v Delaney Gillilan>but the whole way that you interact with it

00:29:28.900 --> 00:29:29.700
<v Delaney Gillilan>is based on polling.

00:29:30.180 --> 00:29:31.780
<v Delaney Gillilan>And the thing about our way

00:29:31.900 --> 00:29:33.300
<v Delaney Gillilan>is that not only are you doing push events,

00:29:33.540 --> 00:29:36.700
<v Delaney Gillilan>But the thing is that really does change the semantics of the language.

00:29:36.900 --> 00:29:40.020
<v Delaney Gillilan>So first of all, you get like 40X compression by doing our way.

00:29:40.230 --> 00:29:43.040
<v Delaney Gillilan>But also you only send data when you need to instead of polling.

00:29:43.330 --> 00:29:44.600
<v Delaney Gillilan>So now you're using less resources.

00:29:45.060 --> 00:29:45.960
<v Delaney Gillilan>You're using less network.

00:29:46.520 --> 00:29:54.620
<v Delaney Gillilan>It changes the whole dynamic in a deeper way that you can literally save 5,000X in your network bandwidth.

00:29:54.900 --> 00:29:57.300
<v Delaney Gillilan>It sounds crazy, but it's just a reality.

00:29:57.540 --> 00:29:57.640
<v Michael Kennedy>Right.

00:29:57.900 --> 00:30:00.200
<v Michael Kennedy>Another thing, Delaney, that's really nice about that is the latency.

00:30:00.900 --> 00:30:03.060
<v Michael Kennedy>That's something that drives me crazy about polling.

00:30:03.400 --> 00:30:09.060
<v Michael Kennedy>general is just like okay well we don't want to hammer the server too hard so let's make this you

00:30:09.060 --> 00:30:13.420
<v Michael Kennedy>know one second two second but then it's like well i click this button and then it updates and you're

00:30:13.460 --> 00:30:18.000
<v Michael Kennedy>like ah if if something happens on the server it's sent right if it wants to one of the things that

00:30:18.120 --> 00:30:23.040
<v Delaney Gillilan>ironically because i do a lot of like go or low level language stuff is that i tend to put a debounce

00:30:23.380 --> 00:30:29.780
<v Delaney Gillilan>in my server to like five milliseconds so that i get i'm not updating more than you know 200 times

00:30:30.100 --> 00:30:36.500
<v Delaney Gillilan>a second even on a monitor because the browser actually break after 500 fps so like the

00:30:36.700 --> 00:30:40.380
<v Delaney Gillilan>interesting thing is not that it's basically data starts no longer the issue in your thing if you

00:30:40.520 --> 00:30:47.460
<v Delaney Gillilan>are on a low low powered battery device like a mobile on a 3g this is it will just work like it's

00:30:47.700 --> 00:30:52.560
<v Delaney Gillilan>stuff that you just don't have to worry about so it does change the semantics of how you build things

00:30:52.980 --> 00:30:57.140
<v Delaney Gillilan>just so that you're aware because even things like for example built into the htmx they don't do

00:30:57.220 --> 00:30:59.300
<v Delaney Gillilan>automatic exponential back off.

00:30:59.500 --> 00:31:00.920
<v Delaney Gillilan>It doesn't have all the verbs.

00:31:01.320 --> 00:31:03.180
<v Delaney Gillilan>There's caveats there that I would recommend

00:31:03.250 --> 00:31:04.960
<v Delaney Gillilan>not doing it, honestly, if you're going to do it.

00:31:05.000 --> 00:31:07.260
<v Michael Kennedy>It's crazy that you're talking about going below

00:31:07.330 --> 00:31:08.720
<v Michael Kennedy>the monitor refresh rate.

00:31:09.020 --> 00:31:11.020
<v Michael Kennedy>You're not going to see it. This is only

00:31:11.710 --> 00:31:12.160
<v Michael Kennedy>120 hertz.

00:31:13.740 --> 00:31:14.800
<v Michael Kennedy>120 times a second.

00:31:15.150 --> 00:31:16.700
<v Michael Kennedy>So why would you pull

00:31:17.020 --> 00:31:18.700
<v Michael Kennedy>faster than that? That's wild.

00:31:20.480 --> 00:31:20.960
<v Michael Kennedy>This portion

00:31:21.010 --> 00:31:22.980
<v Michael Kennedy>of Talk Python To Me is brought to you by us.

00:31:23.320 --> 00:31:24.920
<v Michael Kennedy>I'm thrilled to announce a brand

00:31:25.020 --> 00:31:26.560
<v Michael Kennedy>new app built for developers

00:31:26.580 --> 00:31:27.840
<v Michael Kennedy>created by yours truly.

00:31:28.260 --> 00:31:29.460
<v Michael Kennedy>It's called Command Book.

00:31:30.280 --> 00:31:31.520
<v Michael Kennedy>You know that thing you do every morning?

00:31:32.020 --> 00:31:33.460
<v Michael Kennedy>Open up six terminal tabs,

00:31:33.860 --> 00:31:34.700
<v Michael Kennedy>CD into this directory,

00:31:35.300 --> 00:31:36.340
<v Michael Kennedy>activate that virtual environment,

00:31:36.820 --> 00:31:38.280
<v Michael Kennedy>run the server with --reload.

00:31:38.580 --> 00:31:39.620
<v Michael Kennedy>Now, CD somewhere else,

00:31:40.280 --> 00:31:41.280
<v Michael Kennedy>start the background worker,

00:31:41.820 --> 00:31:42.540
<v Michael Kennedy>another tab for Docker,

00:31:42.900 --> 00:31:44.260
<v Michael Kennedy>another one to tail production logs.

00:31:44.720 --> 00:31:46.740
<v Michael Kennedy>Every tab just says Python, Python, Python,

00:31:47.020 --> 00:31:47.440
<v Michael Kennedy>Docker tail.

00:31:48.600 --> 00:31:49.480
<v Michael Kennedy>And you're clicking through them going,

00:31:49.940 --> 00:31:51.100
<v Michael Kennedy>which Python was that again?

00:31:51.660 --> 00:31:52.360
<v Michael Kennedy>Where my app is running?

00:31:52.920 --> 00:31:53.860
<v Michael Kennedy>Then sometime later,

00:31:54.140 --> 00:31:55.960
<v Michael Kennedy>your dev server silently dies

00:31:55.980 --> 00:31:58.660
<v Michael Kennedy>because it tried to reload while you're in the middle of a code edit,

00:31:59.320 --> 00:32:01.880
<v Michael Kennedy>unmatched brace, a half-written import, or something.

00:32:02.640 --> 00:32:05.180
<v Michael Kennedy>Now you're hunting through tabs to figure out which process crashed

00:32:05.270 --> 00:32:06.120
<v Michael Kennedy>and how to restart it.

00:32:06.600 --> 00:32:11.140
<v Michael Kennedy>My app, CommandBook, gives all of these long-running commands a permanent home.

00:32:11.700 --> 00:32:14.500
<v Michael Kennedy>You save a command once, the working directory, the environment,

00:32:14.860 --> 00:32:17.940
<v Michael Kennedy>free commands like git pull, and from then on, you just click run.

00:32:18.500 --> 00:32:21.260
<v Michael Kennedy>You can even group commands together to start and stop everything

00:32:21.370 --> 00:32:22.840
<v Michael Kennedy>for a project with a single click.

00:32:23.360 --> 00:32:26.960
<v Michael Kennedy>It also has what I call Honey Badger Mode, auto restart on crash.

00:32:27.540 --> 00:32:30.060
<v Michael Kennedy>So when your dev server goes down mid-reload,

00:32:30.520 --> 00:32:34.720
<v Michael Kennedy>Command Book just brings it right back up and does so over and over until the code is fixed.

00:32:35.340 --> 00:32:37.140
<v Michael Kennedy>It also detects URLs from your output,

00:32:37.400 --> 00:32:39.720
<v Michael Kennedy>so you're never scrolling through thousands of lines of logs

00:32:39.810 --> 00:32:41.860
<v Michael Kennedy>just to figure out how to reopen your web app.

00:32:42.400 --> 00:32:46.280
<v Michael Kennedy>And it shows you uptime, memory usage, and all sorts of cool things about your process.

00:32:46.980 --> 00:32:48.960
<v Michael Kennedy>The whole thing is a native macOS app.

00:32:49.160 --> 00:32:51.520
<v Michael Kennedy>No electron, no Chromium, just 21 megs.

00:32:51.900 --> 00:32:53.280
<v Michael Kennedy>And it comes with a full CLI.

00:32:53.520 --> 00:32:55.360
<v Michael Kennedy>So anything you've configured in the UI,

00:32:55.680 --> 00:32:58.220
<v Michael Kennedy>you can fire off from your terminal with just a single command.

00:32:58.760 --> 00:33:01.900
<v Michael Kennedy>Right now it's macOS only, but if there's enough interest,

00:33:02.140 --> 00:33:03.200
<v Michael Kennedy>I'll build a Windows version too.

00:33:03.460 --> 00:33:04.160
<v Michael Kennedy>So let me know.

00:33:05.000 --> 00:33:08.980
<v Michael Kennedy>Please check it out at talkpython.fm/command book app,

00:33:09.460 --> 00:33:11.980
<v Michael Kennedy>download it for free, level up your developer workflow.

00:33:12.440 --> 00:33:14.040
<v Michael Kennedy>The link is in your podcast player show notes.

00:33:14.640 --> 00:33:16.620
<v Michael Kennedy>That's talkpython.fm/command book.

00:33:16.980 --> 00:33:18.820
<v Michael Kennedy>I really hope you enjoy this new app that I built.

00:33:20.180 --> 00:33:28.140
<v Ben Crocker>Yeah, on the topic of latency and all that, if you go to the examples, there's some we could look at that I think really demonstrate this.

00:33:28.180 --> 00:33:32.740
<v Ben Crocker>Well, maybe start with bad Apple just because we're talking about refresh rates.

00:33:33.120 --> 00:33:33.180
<v Ben Crocker>OK.

00:33:33.600 --> 00:33:39.140
<v Ben Crocker>What's happening is that the back end is streaming down just a bunch of symbols, but it creates this animation.

00:33:39.520 --> 00:33:44.020
<v Ben Crocker>And if you were to open the network tab, you would see it actually would be interesting to see.

00:33:44.220 --> 00:33:46.100
<v Ben Crocker>You probably have to refresh the page just to.

00:33:46.880 --> 00:33:47.000
<v Ben Crocker>Yeah.

00:33:47.660 --> 00:33:48.660
<v Ben Crocker>And you're going to see updates.

00:33:49.160 --> 00:33:49.680
<v Ben Crocker>That one there.

00:33:49.980 --> 00:33:51.060
<v Ben Crocker>Yeah, if you click that--

00:33:51.100 --> 00:33:51.600
<v Ben Crocker>This one?

00:33:52.160 --> 00:33:52.880
<v Ben Crocker>Yeah, that's the one.

00:33:53.100 --> 00:33:53.960
<v Ben Crocker>You click Event Stream.

00:33:54.500 --> 00:33:56.780
<v Ben Crocker>There's an Event Stream tab for Event Stream responses.

00:33:57.540 --> 00:33:58.500
<v Ben Crocker>You're going to see these streaming.

00:33:58.610 --> 00:34:01.800
<v Ben Crocker>I don't know what frames per second we have this set to,

00:34:01.920 --> 00:34:03.160
<v Ben Crocker>but you see it streaming past, right?

00:34:03.340 --> 00:34:03.460
<v Ben Crocker>Right.

00:34:03.640 --> 00:34:05.920
<v Ben Crocker>The first time many people see this,

00:34:05.980 --> 00:34:09.360
<v Ben Crocker>this is a surprise that the browser is capable of this.

00:34:09.460 --> 00:34:11.179
<v Ben Crocker>But the browser can stream video, so why

00:34:11.320 --> 00:34:12.659
<v Ben Crocker>can't it stream a bunch of text?

00:34:12.860 --> 00:34:14.679
<v Ben Crocker>I mean, it's not that big of a leap of faith.

00:34:15.060 --> 00:34:18.280
<v Ben Crocker>But you can see, it looks like it's about every 10, 20

00:34:18.500 --> 00:34:18.740
<v Ben Crocker>milliseconds.

00:34:19.100 --> 00:34:23.720
<v Delaney Gillilan>I think we're doing like 30 frames a second, but again, we can do like, we're doing this on a,

00:34:24.040 --> 00:34:28.419
<v Delaney Gillilan>basically a free tier server. So like, this is just a non-issue and it's doing all the compression

00:34:28.550 --> 00:34:32.620
<v Delaney Gillilan>stuff. So if you notice that your update, even though we're doing like full ASCII development at,

00:34:32.820 --> 00:34:36.820
<v Delaney Gillilan>you know, thousands of characters, your updates are actually not updating that. Like you see how

00:34:37.040 --> 00:34:41.200
<v Delaney Gillilan>it's transferring, but it's not transferring that much compared to how much it's actually coming out.

00:34:41.460 --> 00:34:46.420
<v Michael Kennedy>I can see we got 1.9 megs for the whole page. Yeah. But do you see next to it? What, what was

00:34:46.440 --> 00:34:51.580
<v Ben Crocker>actually like the resources so you see the compression well yeah we're probably not seeing

00:34:51.580 --> 00:34:55.780
<v Ben Crocker>it there but in the bottom you'll see two two megabytes have been transferred but 10 megabytes

00:34:55.980 --> 00:35:01.080
<v Ben Crocker>of resources and so that's oh yeah yeah so it's a 5x compression yeah it's going to be much more

00:35:01.320 --> 00:35:06.760
<v Ben Crocker>on the stream i think because it's streaming uh normally you can hover over the size

00:35:07.520 --> 00:35:13.380
<v Ben Crocker>and you'll see the uncompressed but i guess it's changing too fast that's pretty wild and you know

00:35:13.240 --> 00:35:19.020
<v Chris May>in practical usage, like I have a status screen that I have from my production app at work. And

00:35:19.100 --> 00:35:24.660
<v Chris May>it's just amazing to just constantly be seeing these things update. And I'm doing that by having

00:35:24.860 --> 00:35:31.140
<v Chris May>the database tell my Python code, hey, refresh. I actually ask it to get all the entries from the

00:35:31.220 --> 00:35:35.520
<v Chris May>database and send it down the pipe. And so it's not like I'm doing the optimized thing. I'm doing

00:35:35.640 --> 00:35:40.660
<v Chris May>the simple thing and I get all these cool things just updating all the time. And it's just such a

00:35:40.720 --> 00:35:44.060
<v Chris May>useful thing, especially for status screens, dashboards, stuff like that.

00:35:44.140 --> 00:35:49.880
<v Delaney Gillilan>Speaking of that, go to the DB Mon example. This is one of my favorites because when React

00:35:50.340 --> 00:35:54.680
<v Delaney Gillilan>first had their first conference, they said, look at what we're doing. We're able to update at a rate

00:35:54.760 --> 00:35:59.640
<v Delaney Gillilan>that no one else can compete with us in how fast they could update the browser, right? If we

00:35:59.760 --> 00:36:03.460
<v Delaney Gillilan>actually, yeah, you're still there. So the thing is, if you actually set the FPS to something like

00:36:03.840 --> 00:36:10.360
<v Delaney Gillilan>80, whatever. So that is how fast it's coming from the backend to you. So go ahead. Yeah,

00:36:10.520 --> 00:36:12.620
<v Delaney Gillilan>because we just don't want people blasting the server.

00:36:12.740 --> 00:36:13.760
<v Michael Kennedy>Yeah, you don't want to walk away.

00:36:14.240 --> 00:36:16.400
<v Delaney Gillilan>Yeah, but the point is that this is coming.

00:36:16.820 --> 00:36:19.520
<v Delaney Gillilan>See, we're doing stuff in microseconds on a potato.

00:36:19.780 --> 00:36:21.800
<v Michael Kennedy>Yeah, let me just describe this a little bit for people listening.

00:36:22.000 --> 00:36:25.180
<v Michael Kennedy>So it's like a database monitoring table

00:36:25.360 --> 00:36:29.200
<v Michael Kennedy>that shows you how many transactions are the database overloads.

00:36:29.580 --> 00:36:33.600
<v Michael Kennedy>So it's updating a grid of maybe 10 or 12 databases

00:36:34.180 --> 00:36:35.880
<v Michael Kennedy>with five or six elements,

00:36:36.280 --> 00:36:38.860
<v Michael Kennedy>and it's doing that in microseconds, 80 times a second.

00:36:38.960 --> 00:36:43.480
<v Ben Crocker>A lot of people see these examples and they think, well, I'm not building this kind of stuff.

00:36:43.880 --> 00:36:44.800
<v Ben Crocker>And me included.

00:36:44.960 --> 00:36:46.560
<v Ben Crocker>I build crud apps most of the time.

00:36:47.400 --> 00:36:51.500
<v Ben Crocker>And there are plenty of examples here that are just cruddy things.

00:36:51.940 --> 00:36:53.480
<v Ben Crocker>They're kind of the more boring examples.

00:36:53.940 --> 00:36:57.640
<v Ben Crocker>But one example that might be worth looking at is the to-do MVC.

00:36:58.000 --> 00:37:01.520
<v Ben Crocker>And if you can figure out how to open that in split screen.

00:37:01.960 --> 00:37:02.120
<v Michael Kennedy>Okay.

00:37:02.560 --> 00:37:04.560
<v Michael Kennedy>What part do you want me to open up in split?

00:37:04.660 --> 00:37:05.680
<v Michael Kennedy>Oh, just this, the example.

00:37:05.880 --> 00:37:09.560
<v Michael Kennedy>Yeah, so I can do these two and then I can tile them.

00:37:09.820 --> 00:37:10.140
<v Ben Crocker>How's that?

00:37:10.320 --> 00:37:15.440
<v Ben Crocker>So this is a CRUD app, but what Datastar gives you is the ability to do multiplayer out of the box.

00:37:15.710 --> 00:37:22.320
<v Ben Crocker>And that is like real-time collaborative apps are not easy to do and not easy to scale as well.

00:37:22.570 --> 00:37:27.620
<v Ben Crocker>But as you'll see here, when you have like two sessions open, it's going to be near instant.

00:37:27.820 --> 00:37:31.340
<v Ben Crocker>You're going to basically be observing the latency on your network connection,

00:37:31.620 --> 00:37:35.680
<v Ben Crocker>which is going to be 50 milliseconds to 100, but barely perceivable.

00:37:35.860 --> 00:37:40.360
<v Michael Kennedy>So just to describe to people, we've got this 2D MVC, which allows you to, well, it's like a

00:37:40.440 --> 00:37:46.200
<v Michael Kennedy>to-do example, which is required to be a legitimate JavaScript framework. But I've opened it in two

00:37:46.360 --> 00:37:51.000
<v Michael Kennedy>tabs and I've used Vivaldi's tile. So these are legitimately two browsers. They just appear to be

00:37:51.140 --> 00:37:57.060
<v Michael Kennedy>kind of in the same window. And when I enter stuff into it, it literally looks like they update in

00:37:57.280 --> 00:38:00.320
<v Ben Crocker>parallel, which is crazy. If you check a few of them, you'll see,

00:38:00.420 --> 00:38:02.920
<v Ben Crocker>You can barely tell which one's updating which.

00:38:03.110 --> 00:38:04.520
<v Ben Crocker>It happens almost instantly.

00:38:04.920 --> 00:38:07.380
<v Michael Kennedy>Yeah, if I look at the other one and I click on one,

00:38:07.600 --> 00:38:09.980
<v Michael Kennedy>it feels like that's responding to my click.

00:38:10.420 --> 00:38:13.000
<v Ben Crocker>I need to correct myself that it is happening instantly

00:38:13.230 --> 00:38:15.500
<v Ben Crocker>because when you click, when you check one of those,

00:38:15.700 --> 00:38:19.420
<v Ben Crocker>it's not, and this is an interesting thing we can get into.

00:38:19.620 --> 00:38:21.260
<v Ben Crocker>We're not doing optimistic updates.

00:38:21.700 --> 00:38:23.680
<v Ben Crocker>It's actually sending a request to the server

00:38:24.160 --> 00:38:26.560
<v Ben Crocker>and the server is simultaneously updating

00:38:27.200 --> 00:38:29.400
<v Ben Crocker>both of your tabs at the same time.

00:38:29.480 --> 00:38:31.000
<v Michael Kennedy>Even if I had just one open,

00:38:31.500 --> 00:38:33.140
<v Michael Kennedy>it's still going round trip to the server.

00:38:33.480 --> 00:38:34.780
<v Michael Kennedy>That's why it looks like it's simultaneous

00:38:34.990 --> 00:38:35.820
<v Michael Kennedy>because it's effectively.

00:38:35.980 --> 00:38:36.940
<v Delaney Gillilan>This is a thing that you can,

00:38:37.360 --> 00:38:38.540
<v Delaney Gillilan>we can talk for like three hours

00:38:38.840 --> 00:38:40.640
<v Delaney Gillilan>and I will yell at most spa developers

00:38:41.439 --> 00:38:43.020
<v Delaney Gillilan>because there's this weird thing

00:38:43.030 --> 00:38:43.980
<v Delaney Gillilan>that because it's easy,

00:38:44.460 --> 00:38:47.340
<v Delaney Gillilan>people will actively lie to users in the spa world

00:38:47.590 --> 00:38:48.920
<v Delaney Gillilan>and they'll do optimistic updates,

00:38:49.030 --> 00:38:50.640
<v Delaney Gillilan>which means I'm going to make it

00:38:50.650 --> 00:38:52.020
<v Delaney Gillilan>so that I'm making this change.

00:38:52.200 --> 00:38:54.300
<v Delaney Gillilan>And then if there's a problem, then fix it.

00:38:54.660 --> 00:38:56.700
<v Delaney Gillilan>Whereas we say you should do indicator saying,

00:38:56.880 --> 00:38:58.400
<v Delaney Gillilan>I'm trying to make a change to this

00:38:58.840 --> 00:38:59.280
<v Delaney Gillilan>and then fix it.

00:38:59.360 --> 00:39:02.600
<v Delaney Gillilan>Because you don't want, like when you're playing a video game, you can do what's called dead

00:39:02.780 --> 00:39:05.400
<v Delaney Gillilan>reckoning and you can do some stuff to net rollback code.

00:39:05.620 --> 00:39:10.540
<v Delaney Gillilan>You can do some clever things to hide latency, but you don't want to hide latency when it

00:39:10.540 --> 00:39:14.060
<v Delaney Gillilan>comes to like a bank transfer or did I buy that thing or did I get that theater ticket

00:39:14.280 --> 00:39:15.220
<v Delaney Gillilan>or any of that stuff.

00:39:15.620 --> 00:39:18.680
<v Delaney Gillilan>Like people just have the wrong mental model of how the web should work.

00:39:19.080 --> 00:39:23.360
<v Delaney Gillilan>I'm actually going to send you another thing that this might blow your mind even more because

00:39:23.640 --> 00:39:25.240
<v Delaney Gillilan>the three of us basically can play.

00:39:25.480 --> 00:39:35.060
<v Delaney Gillilan>This is an example where all of us could be playing live with each other right now in an active shared state that's been at the top of the Hacker News and again, runs on a potato.

00:39:35.170 --> 00:39:37.160
<v Delaney Gillilan>I don't know if you just put that in your...

00:39:37.180 --> 00:39:38.080
<v Michael Kennedy>Yeah, let me drop it over.

00:39:38.190 --> 00:39:38.440
<v Michael Kennedy>Hold on.

00:39:38.720 --> 00:39:39.620
<v Michael Kennedy>I'm going to put it in the other tab.

00:39:39.860 --> 00:39:41.800
<v Delaney Gillilan>So right now, don't touch anything.

00:39:42.240 --> 00:39:43.180
<v Delaney Gillilan>I'm going to actively start.

00:39:43.240 --> 00:39:43.680
<v Delaney Gillilan>I am purple.

00:39:43.950 --> 00:39:45.740
<v Delaney Gillilan>I am literally starting to click right now.

00:39:45.840 --> 00:39:45.980
<v Michael Kennedy>All right.

00:39:46.030 --> 00:39:48.740
<v Michael Kennedy>So we're looking at a multiplayer game of life here.

00:39:48.940 --> 00:39:50.100
<v Delaney Gillilan>I'm seeing that live here.

00:39:50.340 --> 00:39:54.500
<v Delaney Gillilan>And if you open up that in the other tab, you would actively see the exact same state.

00:39:54.880 --> 00:39:57.960
<v Delaney Gillilan>So everyone in the world, like if you open that up in the other tab,

00:39:58.360 --> 00:39:59.860
<v Delaney Gillilan>you cannot get out of sync.

00:40:00.020 --> 00:40:01.280
<v Delaney Gillilan>It's not faking it in the front end.

00:40:01.320 --> 00:40:02.300
<v Delaney Gillilan>This is literally sending in.

00:40:02.520 --> 00:40:04.700
<v Delaney Gillilan>What's even crazier about this, here's the crazy part.

00:40:04.760 --> 00:40:05.960
<v Delaney Gillilan>It's actually a rendering demo.

00:40:06.360 --> 00:40:09.000
<v Delaney Gillilan>The guy who wrote it is writing in a scripting language, Clojure,

00:40:09.400 --> 00:40:14.500
<v Delaney Gillilan>and he's sending down 2,500 divs per frame styled, inline styled.

00:40:14.840 --> 00:40:17.480
<v Delaney Gillilan>Now go to your network tab now and look at what's actually,

00:40:17.580 --> 00:40:21.720
<v Delaney Gillilan>like look at your network tab and you'll see how little data we're actually sending over.

00:40:21.860 --> 00:40:24.420
<v Delaney Gillilan>even though he's updating 2,500 divs per frame,

00:40:24.880 --> 00:40:26.380
<v Delaney Gillilan>like if you go to wherever it's updated,

00:40:26.600 --> 00:40:28.400
<v Delaney Gillilan>yeah, whichever one's the one that's updated,

00:40:28.450 --> 00:40:29.180
<v Delaney Gillilan>there you go, yeah.

00:40:29.540 --> 00:40:31.940
<v Delaney Gillilan>So if you look here and look at how much is being sent

00:40:32.070 --> 00:40:33.260
<v Delaney Gillilan>versus how many is actually,

00:40:33.870 --> 00:40:36.380
<v Delaney Gillilan>like try to, like, this is just a different paradigm

00:40:36.700 --> 00:40:37.380
<v Delaney Gillilan>for how you build.

00:40:37.440 --> 00:40:38.040
<v Delaney Gillilan>And the thing is, again,

00:40:38.600 --> 00:40:40.380
<v Delaney Gillilan>not everybody has to care about these low level things,

00:40:40.430 --> 00:40:42.240
<v Delaney Gillilan>but the thing is, is that once you do this,

00:40:42.450 --> 00:40:43.980
<v Delaney Gillilan>the idea of CRUD kind of goes away

00:40:44.110 --> 00:40:46.520
<v Delaney Gillilan>because in our opinion, you go to a multi,

00:40:46.600 --> 00:40:49.240
<v Delaney Gillilan>you make a multi-page app like you would normally do

00:40:49.360 --> 00:40:50.220
<v Delaney Gillilan>in HTMX or anything else,

00:40:50.440 --> 00:40:51.620
<v Delaney Gillilan>but you keep an open stream

00:40:52.180 --> 00:40:54.360
<v Delaney Gillilan>and you just update whatever's happening in your backend

00:40:54.840 --> 00:40:55.400
<v Delaney Gillilan>as it's happening.

00:40:55.940 --> 00:40:56.980
<v Delaney Gillilan>And it simplifies the world.

00:40:57.080 --> 00:40:58.020
<v Delaney Gillilan>And what's also interesting

00:40:58.520 --> 00:40:59.880
<v Delaney Gillilan>is because of how we do compression and all that,

00:41:00.160 --> 00:41:01.480
<v Delaney Gillilan>you just send your entire page.

00:41:01.820 --> 00:41:03.100
<v Delaney Gillilan>You don't need like out of band.

00:41:03.360 --> 00:41:04.420
<v Delaney Gillilan>It doesn't even really make sense

00:41:04.680 --> 00:41:06.220
<v Delaney Gillilan>because we're so fast that you can just,

00:41:06.560 --> 00:41:07.680
<v Delaney Gillilan>you as a Python developer,

00:41:08.140 --> 00:41:09.300
<v Delaney Gillilan>you just give us your entire page

00:41:09.480 --> 00:41:10.420
<v Delaney Gillilan>and let us deal with it.

00:41:10.600 --> 00:41:11.900
<v Delaney Gillilan>And we will come up with the fast stuff.

00:41:12.320 --> 00:41:14.540
<v Delaney Gillilan>So Chris should probably talk a lot more to that

00:41:14.620 --> 00:41:15.620
<v Delaney Gillilan>because the fat morpher stuff,

00:41:15.720 --> 00:41:18.520
<v Delaney Gillilan>it's a fundamental change in how you build web apps, I think.

00:41:18.640 --> 00:41:18.980
<v Chris May>Yeah, yeah.

00:41:19.180 --> 00:41:21.960
<v Chris May>especially the kind of the mental shift of like,

00:41:22.270 --> 00:41:25.360
<v Chris May>because I kept thinking, okay, I need to like send one row at a time.

00:41:25.840 --> 00:41:27.680
<v Chris May>And I actually have one status screen that does that

00:41:27.810 --> 00:41:32.180
<v Chris May>because we use a Firestore, Google's Firestore as our backend for this app.

00:41:32.700 --> 00:41:35.600
<v Chris May>But for some reason, sometimes it just doesn't send every update.

00:41:36.040 --> 00:41:38.040
<v Chris May>And so on another status screen, I actually, you know,

00:41:38.320 --> 00:41:41.960
<v Chris May>query the whole database table or collection and send it down to Pipe.

00:41:42.180 --> 00:41:45.640
<v Chris May>And because sometimes it doesn't send from Firestore,

00:41:45.840 --> 00:41:50.760
<v Chris May>I get the entire latest state of all the things that are in flight and updated on my screen.

00:41:51.200 --> 00:41:52.400
<v Michael Kennedy>And it just makes things easier.

00:41:52.580 --> 00:41:53.220
<v Michael Kennedy>Yeah, it's amazing.

00:41:53.680 --> 00:41:57.540
<v Michael Kennedy>Sounds like a good opportunity to subscribe to database query changes.

00:41:57.780 --> 00:42:03.280
<v Michael Kennedy>I know some databases you can say, if this query updates, you know, trigger this event and then keep it flowing,

00:42:03.600 --> 00:42:06.640
<v Michael Kennedy>like straight from events on the database, straight to your front end.

00:42:06.980 --> 00:42:07.220
<v Michael Kennedy>Pretty cool.

00:42:07.500 --> 00:42:12.060
<v Michael Kennedy>I do want to go back and just put a little bit of commentary, Delaney.

00:42:12.240 --> 00:42:14.160
<v Michael Kennedy>Well, you said optimistic updates.

00:42:15.040 --> 00:42:19.940
<v Michael Kennedy>So one of the things that's really common in JavaScript is I click this thing, it changes.

00:42:20.310 --> 00:42:21.860
<v Michael Kennedy>I want to mark it as changed.

00:42:21.990 --> 00:42:24.500
<v Michael Kennedy>And then I'm going to tell the server, hey, we made this change.

00:42:25.060 --> 00:42:28.860
<v Michael Kennedy>It's very possible the server died, that you're not allowed to make that change or whatever.

00:42:29.050 --> 00:42:30.800
<v Michael Kennedy>And then you've got to come back and go actually undo that.

00:42:30.880 --> 00:42:32.760
<v Michael Kennedy>That really, you know, there's like a weird.

00:42:33.240 --> 00:42:35.400
<v Michael Kennedy>So what you're saying is you don't have to worry about that kind of stuff.

00:42:35.540 --> 00:42:36.920
<v Delaney Gillilan>We're a framework, not just a library.

00:42:37.340 --> 00:42:41.700
<v Delaney Gillilan>The idea is that you have these indicators that not only basically your indicators drive a signal.

00:42:41.850 --> 00:42:43.660
<v Delaney Gillilan>Like, again, the details don't really matter.

00:42:43.760 --> 00:42:45.720
<v Delaney Gillilan>But the idea is that you have instantaneous,

00:42:46.320 --> 00:42:48.460
<v Delaney Gillilan>like within the same frame updates of,

00:42:48.760 --> 00:42:49.860
<v Delaney Gillilan>hey, I'm going off to do something.

00:42:50.020 --> 00:42:52.040
<v Delaney Gillilan>Like usually you make a spinner or you say,

00:42:52.360 --> 00:42:53.680
<v Delaney Gillilan>I'm going to do this to gray out the field

00:42:53.960 --> 00:42:54.420
<v Delaney Gillilan>or I'm going to do,

00:42:54.620 --> 00:42:55.800
<v Delaney Gillilan>like there's all kinds of things you can drive.

00:42:55.980 --> 00:42:59.240
<v Delaney Gillilan>Because again, the state of what the local stuff is

00:42:59.600 --> 00:43:02.060
<v Delaney Gillilan>while the change is there, that lives in the client.

00:43:02.360 --> 00:43:03.960
<v Delaney Gillilan>Like that is part of Datastar.

00:43:04.360 --> 00:43:06.180
<v Delaney Gillilan>It has all the right tools to make it

00:43:06.180 --> 00:43:08.080
<v Delaney Gillilan>so that you can disable it or gray it out

00:43:08.280 --> 00:43:10.200
<v Delaney Gillilan>or say, I'm going to put a spinner next to it.

00:43:10.280 --> 00:43:11.400
<v Delaney Gillilan>Like you can do all those things.

00:43:11.900 --> 00:43:13.320
<v Delaney Gillilan>But the thing is you're not lying to your user.

00:43:13.700 --> 00:43:14.340
<v Delaney Gillilan>That's my whole thing.

00:43:14.380 --> 00:43:15.780
<v Delaney Gillilan>And people say, well, that's not really a lie.

00:43:15.860 --> 00:43:16.440
<v Delaney Gillilan>It's like, yes, it is.

00:43:16.560 --> 00:43:17.560
<v Delaney Gillilan>You're literally lying to people.

00:43:18.060 --> 00:43:18.740
<v Delaney Gillilan>Like, please stop.

00:43:18.920 --> 00:43:20.240
<v Delaney Gillilan>It's a DX issue.

00:43:20.720 --> 00:43:23.780
<v Delaney Gillilan>The reason why people do it is because it's convenient, not because it's correct.

00:43:24.020 --> 00:43:26.020
<v Ben Crocker>And again, like you can do optimistic updates.

00:43:26.200 --> 00:43:29.120
<v Ben Crocker>You can do SBA-like things using Datastar.

00:43:29.220 --> 00:43:34.500
<v Ben Crocker>We don't recommend it because Datastar is more than just this tech.

00:43:34.760 --> 00:43:36.300
<v Ben Crocker>It's also like a way of doing things.

00:43:37.060 --> 00:43:42.860
<v Ben Crocker>What I wanted to point out here is that you might imagine that, you know, this is something that when you click edit,

00:43:43.120 --> 00:43:44.520
<v Ben Crocker>it turns it into a form.

00:43:44.520 --> 00:43:47.240
<v Ben Crocker>So you might like load the form into the page, hide the form,

00:43:47.460 --> 00:43:48.880
<v Ben Crocker>and then just do a show hide approach.

00:43:49.920 --> 00:43:53.060
<v Ben Crocker>But the hypermedia approach is kind of like the REST approach

00:43:53.400 --> 00:43:56.380
<v Ben Crocker>where you can only take the next action at any given time.

00:43:57.060 --> 00:43:58.300
<v Ben Crocker>So if you open the network tab,

00:43:58.500 --> 00:44:00.480
<v Ben Crocker>I just want to kind of walk you through this briefly.

00:44:00.480 --> 00:44:02.280
<v Ben Crocker>If you cancel that, when you hit edit,

00:44:02.820 --> 00:44:04.680
<v Ben Crocker>you will see a network request to the server.

00:44:04.840 --> 00:44:06.900
<v Ben Crocker>And what comes back is that form.

00:44:07.220 --> 00:44:10.380
<v Ben Crocker>So it's real time as in like what you're seeing now

00:44:10.400 --> 00:44:12.960
<v Ben Crocker>is the actual state reflected on the backend.

00:44:13.570 --> 00:44:16.120
<v Ben Crocker>And when you save, you're also going to see the same thing.

00:44:16.480 --> 00:44:18.340
<v Ben Crocker>You're going to see a network request to the server

00:44:18.730 --> 00:44:21.440
<v Ben Crocker>and it gets the true current state

00:44:22.010 --> 00:44:24.340
<v Ben Crocker>as it has been saved is now all comes back down.

00:44:24.800 --> 00:44:27.620
<v Ben Crocker>So it's like you don't even need optimistic updates

00:44:28.060 --> 00:44:28.600
<v Ben Crocker>most of the time.

00:44:28.880 --> 00:44:30.820
<v Ben Crocker>And when you do use it,

00:44:30.880 --> 00:44:33.000
<v Ben Crocker>it's because you're trying to cover up poor performance.

00:44:33.620 --> 00:44:35.520
<v Ben Crocker>You're favoring perceived performance

00:44:36.070 --> 00:44:36.980
<v Ben Crocker>over true performance.

00:44:37.280 --> 00:44:39.480
<v Chris May>One of the things I hear a lot is people saying,

00:44:39.760 --> 00:44:40.820
<v Chris May>but it's so much slower.

00:44:41.350 --> 00:44:43.160
<v Chris May>But I think people are used to

00:44:43.250 --> 00:44:45.160
<v Chris May>or think it's much slower than it is

00:44:45.420 --> 00:44:47.680
<v Chris May>because the web, the spa life

00:44:47.880 --> 00:44:50.440
<v Chris May>that we see around us feels so slow.

00:44:51.020 --> 00:44:53.640
<v Chris May>But anytime I've seen people try to lean

00:44:53.900 --> 00:44:55.160
<v Chris May>into just using the network,

00:44:55.660 --> 00:44:57.120
<v Chris May>it's so much faster than you expect.

00:44:57.340 --> 00:44:59.520
<v Delaney Gillilan>Well, and also you have so much less our way.

00:45:00.000 --> 00:45:02.860
<v Delaney Gillilan>Your usage of network can be easily 100x less,

00:45:03.360 --> 00:45:04.460
<v Delaney Gillilan>which means you have less contention,

00:45:04.900 --> 00:45:06.160
<v Delaney Gillilan>which means when you do send something,

00:45:06.600 --> 00:45:07.460
<v Delaney Gillilan>it's there immediately.

00:45:07.490 --> 00:45:09.140
<v Delaney Gillilan>And also because you're not doing polling

00:45:09.420 --> 00:45:13.280
<v Delaney Gillilan>with polling, you have to send to the server and the server sends back. If you just send from server

00:45:13.600 --> 00:45:18.880
<v Delaney Gillilan>when something updates, now you've just halved your RTT, right? Your round trip has just halved.

00:45:19.060 --> 00:45:23.640
<v Delaney Gillilan>So you half it and you're doing like a thousand less of something. All of a sudden, things opened

00:45:23.760 --> 00:45:28.780
<v Delaney Gillilan>up for you in weird ways, right? It's a fundamentally different way of thinking about the problem.

00:45:29.259 --> 00:45:33.660
<v Delaney Gillilan>Another example that we like to bring up a lot is there was a while back, someone did a million

00:45:33.820 --> 00:45:37.980
<v Delaney Gillilan>checkbox demo and they had a whole write-up on it, right? And they basically had to take it down

00:45:38.000 --> 00:45:39.220
<v Delaney Gillilan>because it was just too expensive to run.

00:45:39.720 --> 00:45:41.720
<v Delaney Gillilan>We have a version that's not just checkboxes,

00:45:41.840 --> 00:45:43.060
<v Delaney Gillilan>but color checkboxes.

00:45:43.060 --> 00:45:44.660
<v Delaney Gillilan>So you can actually make ASCII art and stuff like that.

00:45:45.020 --> 00:45:45.680
<v Delaney Gillilan>And it's a billion.

00:45:46.160 --> 00:45:47.220
<v Delaney Gillilan>And it runs on the same server

00:45:47.600 --> 00:45:48.940
<v Delaney Gillilan>that was running that Game of Life demo.

00:45:49.280 --> 00:45:49.860
<v Delaney Gillilan>It's on the same server.

00:45:50.300 --> 00:45:52.380
<v Delaney Gillilan>It's actively, and it's been on top of Hacker News.

00:45:52.460 --> 00:45:54.640
<v Ben Crocker>It's a $5 VPS as far as I know.

00:45:54.700 --> 00:45:55.700
<v Delaney Gillilan>Yeah, it's a $5 one.

00:45:56.020 --> 00:45:57.760
<v Delaney Gillilan>It runs all these demos all the time,

00:45:58.020 --> 00:45:59.220
<v Delaney Gillilan>active, top of Hacker News,

00:45:59.680 --> 00:46:01.180
<v Delaney Gillilan>and it's never gone down.

00:46:01.300 --> 00:46:02.780
<v Ben Crocker>What's really interesting about that demo

00:46:03.020 --> 00:46:06.740
<v Ben Crocker>is that it becomes a backend optimization challenge, right?

00:46:07.040 --> 00:46:09.060
<v Ben Crocker>You're no longer trying to optimize the front end.

00:46:09.220 --> 00:46:14.100
<v Ben Crocker>You rely on the browser and the browser API to take care of that for you.

00:46:14.340 --> 00:46:17.460
<v Ben Crocker>And now you're doing, I don't know, you're optimizing your database.

00:46:17.740 --> 00:46:19.020
<v Ben Crocker>You're optimizing your queries.

00:46:20.420 --> 00:46:22.360
<v Ben Crocker>I actually threw the link to that in there.

00:46:22.740 --> 00:46:30.380
<v Ben Crocker>Because it's a nice demo to look at when you realize there are a billion of these being stored in a SQLite database somewhere.

00:46:31.060 --> 00:46:32.700
<v Ben Crocker>So you can scroll anywhere on the board.

00:46:33.080 --> 00:46:37.180
<v Ben Crocker>And it's like a 30,000 by 30,000 something grid

00:46:37.500 --> 00:46:39.040
<v Ben Crocker>because the square root of a billion

00:46:39.580 --> 00:46:41.580
<v Ben Crocker>is some weird number, as it turns out.

00:46:42.240 --> 00:46:44.200
<v Ben Crocker>And obviously this is, or not obviously,

00:46:44.340 --> 00:46:45.220
<v Ben Crocker>but this is multiplayer.

00:46:45.540 --> 00:46:47.060
<v Ben Crocker>So if I was to view this

00:46:47.160 --> 00:46:49.020
<v Ben Crocker>or you were to open a different browser tab,

00:46:49.320 --> 00:46:50.980
<v Ben Crocker>then you would see the exact same thing.

00:46:51.060 --> 00:46:52.500
<v Ben Crocker>The board is the same everywhere.

00:46:52.820 --> 00:46:53.780
<v Ben Crocker>That is crazy.

00:46:54.120 --> 00:46:55.660
<v Delaney Gillilan>The one thing that I will say that's hard,

00:46:56.280 --> 00:46:58.720
<v Delaney Gillilan>I don't know, Chris can really probably speak to this more

00:46:58.820 --> 00:47:00.060
<v Delaney Gillilan>and it sounds like a weird thing,

00:47:00.280 --> 00:47:05.560
<v Delaney Gillilan>Like, Datastar ends up in reality being like five or six things on your page, and it just

00:47:05.760 --> 00:47:06.220
<v Delaney Gillilan>gets out of the way.

00:47:06.290 --> 00:47:09.720
<v Delaney Gillilan>All of a sudden, like, most Datastar, you're going to get to a point where you try it,

00:47:09.780 --> 00:47:10.600
<v Delaney Gillilan>and you're like, that's it?

00:47:10.910 --> 00:47:14.880
<v Delaney Gillilan>Like, you will feel weird about every other approach once you really try it.

00:47:14.890 --> 00:47:18.000
<v Delaney Gillilan>Like, just try it, and you will see every other approach is wrong.

00:47:18.290 --> 00:47:19.920
<v Delaney Gillilan>Like, it's not because I made it.

00:47:20.050 --> 00:47:23.280
<v Delaney Gillilan>Like, I wish someone would have made this because it just, it's so simple.

00:47:23.880 --> 00:47:26.060
<v Delaney Gillilan>It feels like cheating in a weird way.

00:47:26.540 --> 00:47:27.320
<v Delaney Gillilan>That's hard to explain.

00:47:27.400 --> 00:47:31.680
<v Delaney Gillilan>it really it's a weird like i don't know what we all were doing i was part of the problem like right

00:47:31.860 --> 00:47:35.940
<v Delaney Gillilan>like i was like oh well google and everyone facebook and all the other guys have this figured

00:47:36.120 --> 00:47:41.280
<v Delaney Gillilan>out like this has to be the best approach so that's the weird thing is it's so simple i don't know what

00:47:41.460 --> 00:47:45.000
<v Delaney Gillilan>like crystal probably it sounds like i'm selling it but it's just i don't know it's weird it's so

00:47:45.180 --> 00:47:50.500
<v Chris May>exciting it's so amazing and yet it's it's using all these boring technologies and like yeah like

00:47:50.700 --> 00:47:55.619
<v Chris May>i remember i showed my wife this my status board and she's like oh yeah that looks really cool and

00:47:55.640 --> 00:47:59.220
<v Chris May>I'm like, oh yeah, because you don't understand what everything is going on behind it, you know?

00:47:59.460 --> 00:48:00.180
<v Michael Kennedy>Yeah, exactly.

00:48:00.660 --> 00:48:02.900
<v Michael Kennedy>It's like, it used to be so complicated.

00:48:03.620 --> 00:48:05.780
<v Michael Kennedy>So let's do, we got a little bit of time left.

00:48:05.960 --> 00:48:06.280
<v Michael Kennedy>Let's do this.

00:48:06.330 --> 00:48:12.580
<v Michael Kennedy>I think it might be fun to talk through kind of some of the attributes and what it looks like,

00:48:13.080 --> 00:48:15.520
<v Michael Kennedy>kind of program with this a little bit and then what it looks like on the server.

00:48:15.940 --> 00:48:16.420
<v Michael Kennedy>How's that sound?

00:48:16.680 --> 00:48:17.220
<v Delaney Gillilan>Would it make sense?

00:48:17.380 --> 00:48:21.240
<v Delaney Gillilan>Like there's a good example of a kind of a meta framework for Python called Stario,

00:48:21.740 --> 00:48:23.240
<v Delaney Gillilan>which they just got their V2.

00:48:23.480 --> 00:48:23.620
<v Michael Kennedy>Okay.

00:48:23.860 --> 00:48:24.440
<v Delaney Gillilan>Just launched.

00:48:24.600 --> 00:48:27.320
<v Delaney Gillilan>I don't know if that is a more Python-esque way of doing it.

00:48:27.560 --> 00:48:28.680
<v Delaney Gillilan>It depends on how you want to.

00:48:28.820 --> 00:48:31.260
<v Michael Kennedy>Let's start with some of the Datastar attributes,

00:48:31.530 --> 00:48:32.680
<v Michael Kennedy>and then we could talk about that.

00:48:32.800 --> 00:48:33.160
<v Michael Kennedy>How's that sound?

00:48:33.580 --> 00:48:36.360
<v Michael Kennedy>Like, just, you know, what does it look like to say to,

00:48:36.870 --> 00:48:40.960
<v Michael Kennedy>you know, I want to connect a button to Datastar actions

00:48:41.130 --> 00:48:43.380
<v Michael Kennedy>on the back end or wired up and so on?

00:48:43.460 --> 00:48:45.380
<v Michael Kennedy>We've talked about a lot about, you know,

00:48:45.430 --> 00:48:48.340
<v Ben Crocker>the back end driving the front end through patching elements,

00:48:48.570 --> 00:48:51.080
<v Ben Crocker>which is kind of the lower half of what you're looking at.

00:48:51.720 --> 00:48:57.380
<v Ben Crocker>To access that, you need to have a click listener or some sort of event listener to trigger that.

00:48:58.080 --> 00:49:05.180
<v Ben Crocker>And datastar, as the name suggests, uses data-star or asterisk attributes.

00:49:05.820 --> 00:49:09.120
<v Ben Crocker>So these are part of the HTML spec data set.

00:49:09.680 --> 00:49:10.800
<v Ben Crocker>And we just leverage that.

00:49:10.940 --> 00:49:18.920
<v Ben Crocker>And we have a small grammar that you'd find on the reference page with all of the data-attributes.

00:49:19.160 --> 00:49:23.400
<v Ben Crocker>And data on is just registering an event listener on the current element.

00:49:23.820 --> 00:49:29.900
<v Ben Crocker>So data on colon click is just obviously registering a click event handler on the button.

00:49:30.520 --> 00:49:34.220
<v Ben Crocker>And what's happening is that then Datasar also gives you actions.

00:49:34.440 --> 00:49:38.340
<v Ben Crocker>So that at get is an action to send a get request to the server.

00:49:38.680 --> 00:49:41.540
<v Ben Crocker>You pass in the path, which is slash endpoint there.

00:49:42.320 --> 00:49:44.620
<v Ben Crocker>And then the server takes care of the rest.

00:49:44.640 --> 00:49:47.520
<v Ben Crocker>So what you're seeing is a div underneath with an ID.

00:49:48.100 --> 00:49:50.940
<v Ben Crocker>IDs are obviously unique in HTML, so they're ideal.

00:49:51.470 --> 00:49:54.320
<v Ben Crocker>And Datastar just uses that fact.

00:49:55.020 --> 00:50:03.200
<v Ben Crocker>And what Datastar is going to do from the backend is it's going to, yeah, just send back down that div with some text content inside of it.

00:50:03.640 --> 00:50:09.860
<v Ben Crocker>And then what Datastar does is it mutates the incoming DOM into the existing DOM.

00:50:10.220 --> 00:50:11.300
<v Ben Crocker>I'm sorry, it morphs.

00:50:11.820 --> 00:50:13.740
<v Ben Crocker>So it uses a morphing strategy.

00:50:14.440 --> 00:50:22.580
<v Ben Crocker>So rather than doing a straight swap, which is what HTMLX does, it will actually morph the incoming HTML into what's currently on the page.

00:50:23.160 --> 00:50:30.840
<v Ben Crocker>That's kind of what opens up the door to these kind of broad, like where you send the entire document down, but only what changes get swapped in.

00:50:30.860 --> 00:50:33.060
<v Ben Crocker>But in this case, it's more of a fine grained thing.

00:50:34.000 --> 00:50:35.960
<v Ben Crocker>So only that div is going to get swapped out.

00:50:36.120 --> 00:50:40.920
<v Delaney Gillilan>And the reason why that morph matters is because you, since you aren't replacing it, things like

00:50:41.110 --> 00:50:46.260
<v Delaney Gillilan>focus and like where your input is and all that stays the same. So when you, even though you update

00:50:46.370 --> 00:50:51.260
<v Delaney Gillilan>the whole page, you're actually not actually changing the state and that's really important.

00:50:51.370 --> 00:50:56.120
<v Delaney Gillilan>So you do declarative development. You just say, I want it to look this way and it just does the

00:50:56.130 --> 00:50:59.840
<v Delaney Gillilan>right things to do it. It's from a mental ball. It's almost like having the BDOM in the backend.

00:51:00.010 --> 00:51:03.940
<v Delaney Gillilan>You just say, here's what I want this page to look like. And it does all the work, but we don't do

00:51:03.920 --> 00:51:08.720
<v Ben Crocker>BDOM. We don't do any of that stuff. We do the fast thing. So in terms of what your backend would

00:51:08.920 --> 00:51:13.980
<v Ben Crocker>send, if you can just scroll back up, it's that text that you were looking at. Let's look at the

00:51:14.040 --> 00:51:19.780
<v Ben Crocker>raw version because, yeah, so that's the HTML. If you scroll down to the next text, it's a code

00:51:19.880 --> 00:51:24.260
<v Michael Kennedy>field. Yeah. There's a section that has like event, data star, patch elements, and then what the

00:51:24.500 --> 00:51:29.880
<v Michael Kennedy>elements are and so on, right? This is like the SSE stream. Yeah. And that would be the raw events

00:51:29.900 --> 00:51:30.720
<v Ben Crocker>that you would send down.

00:51:31.140 --> 00:51:32.860
<v Ben Crocker>But if you look at the next one

00:51:33.040 --> 00:51:34.980
<v Ben Crocker>where we have a Python example,

00:51:35.300 --> 00:51:35.940
<v Ben Crocker>you would see like,

00:51:36.340 --> 00:51:37.420
<v Ben Crocker>well, how do you do that in Python

00:51:38.260 --> 00:51:39.240
<v Ben Crocker>without actually writing,

00:51:39.720 --> 00:51:40.980
<v Ben Crocker>you know, the raw format out?

00:51:41.560 --> 00:51:43.000
<v Ben Crocker>And that's how you would do it there

00:51:43.200 --> 00:51:44.520
<v Ben Crocker>using the Python SDK.

00:51:44.660 --> 00:51:45.640
<v Ben Crocker>Let's dive in a little bit

00:51:45.760 --> 00:51:47.860
<v Michael Kennedy>to the SDK itself.

00:51:48.260 --> 00:51:49.980
<v Michael Kennedy>So I got so many things open.

00:51:51.820 --> 00:51:52.260
<v Michael Kennedy>Hold on.

00:51:52.440 --> 00:51:53.240
<v Michael Kennedy>We got another link for you.

00:51:53.360 --> 00:51:53.700
<v Michael Kennedy>No, I'm kidding.

00:51:54.740 --> 00:51:54.980
<v Michael Kennedy>You know what?

00:51:55.020 --> 00:51:55.640
<v Michael Kennedy>I'm just going to go.

00:51:55.800 --> 00:51:56.500
<v Michael Kennedy>I'm going from the homepage.

00:51:56.940 --> 00:51:57.260
<v Michael Kennedy>There we go.

00:51:57.400 --> 00:51:57.640
<v Michael Kennedy>There you go.

00:51:57.820 --> 00:51:59.240
<v Michael Kennedy>Chris, maybe you could talk us through this.

00:51:59.360 --> 00:52:03.480
<v Michael Kennedy>I think before I throw it to you, though, yeah, there's a lot of framework support here.

00:52:03.540 --> 00:52:08.020
<v Michael Kennedy>So if you're a Django person, a FastAPI person, even fast HTML, it's interesting,

00:52:08.360 --> 00:52:10.240
<v Michael Kennedy>LightSar, Quartz, SanEck, or Starlet.

00:52:10.800 --> 00:52:15.520
<v Michael Kennedy>There's a bunch of different ones here, but maybe just talk us through this, if you'll, Chris.

00:52:16.000 --> 00:52:16.540
<v Chris May>I'm trying to remember.

00:52:16.680 --> 00:52:20.180
<v Chris May>I'm not as familiar with the example, but as you can see,

00:52:20.480 --> 00:52:22.560
<v Chris May>this one method is, I think, where the magic happens.

00:52:22.940 --> 00:52:24.600
<v Chris May>I'm trying to remember which tool.

00:52:24.780 --> 00:52:25.680
<v Chris May>This is a Quartz.

00:52:25.900 --> 00:52:27.720
<v Chris May>Yeah, the Quartz is the examples in Quartz.

00:52:27.900 --> 00:52:34.860
<v Chris May>So, you know, they first define a route, a home route slash, and it returns HTML and it's just in the string there.

00:52:34.970 --> 00:52:35.740
<v Chris May>Right. And then that.

00:52:35.890 --> 00:52:37.940
<v Chris May>This could be a Ginget or Chameleon or whatever template.

00:52:38.010 --> 00:52:39.220
<v Chris May>Like it's just whatever. It doesn't matter.

00:52:39.480 --> 00:52:40.380
<v Chris May>But somehow they get it. Yeah.

00:52:40.580 --> 00:52:42.340
<v Chris May>Makes the example easier to see in one go.

00:52:42.820 --> 00:52:54.280
<v Chris May>And obviously you see that it's pulling Datastar from the CDN and then it on the load, it gets it sends a request to the slash updates endpoint.

00:52:54.840 --> 00:52:56.360
<v Chris May>See what comes from that.

00:52:56.980 --> 00:53:02.840
<v Chris May>And so down below that, you have the slash updates endpoint, which has a decorator called data, data star underscore response.

00:53:03.420 --> 00:53:10.260
<v Chris May>And that just does a couple of nice things like sets the HTTP headers and whatnot to be the service and event protocol.

00:53:10.720 --> 00:53:15.880
<v Chris May>And then what I like to the first line says signals equals await read signals.

00:53:16.440 --> 00:53:21.140
<v Chris May>And so that's another helper that essentially says when I have a request coming in,

00:53:21.580 --> 00:53:25.260
<v Chris May>data star has a specific way of sending the state of the front end to the back end.

00:53:25.280 --> 00:53:26.780
<v Chris May>So the back end can do whatever it needs.

00:53:26.940 --> 00:53:35.460
<v Michael Kennedy>Right. We haven't even talked about signals yet. They're like kind of a data binding set of JavaScript data that loads, you know, reactive data loads on the front end, right?

00:53:35.500 --> 00:53:37.680
<v Chris May>In some ways, the Alpine JS kind of,

00:53:38.470 --> 00:53:39.160
<v Chris May>I don't want to say equivalent,

00:53:39.390 --> 00:53:41.580
<v Chris May>but it covers similar functionality.

00:53:41.990 --> 00:53:43.660
<v Chris May>And so if you have data on the front end

00:53:44.100 --> 00:53:45.480
<v Chris May>that the backend would like to know,

00:53:45.520 --> 00:53:47.260
<v Chris May>that's an easy way to get it.

00:53:47.530 --> 00:53:48.940
<v Chris May>And then essentially what happens

00:53:49.010 --> 00:53:50.940
<v Chris May>is we get into this loop, this while true loop,

00:53:51.160 --> 00:53:53.300
<v Chris May>and Datastar will just start sending down

00:53:53.410 --> 00:53:55.800
<v Chris May>server sent events in text

00:53:56.080 --> 00:53:59.460
<v Chris May>by using the sse.patchElements function,

00:53:59.680 --> 00:54:00.840
<v Chris May>or I guess it's a method technically.

00:54:01.580 --> 00:54:03.880
<v Chris May>And all it's doing is sending a string

00:54:03.880 --> 00:54:07.320
<v Chris May>that has the current date time dot now in ISO format down.

00:54:07.730 --> 00:54:10.280
<v Chris May>And then we wait, we sleep for a second,

00:54:10.460 --> 00:54:11.160
<v Chris May>or is it a second?

00:54:11.470 --> 00:54:12.380
<v Chris May>I guess it's a microsecond.

00:54:12.450 --> 00:54:13.100
<v Chris May>I keep forgetting which one.

00:54:13.100 --> 00:54:14.400
<v Chris May>Yeah, that's a millisecond.

00:54:14.540 --> 00:54:15.300
<v Michael Kennedy>No, no, it's second.

00:54:15.440 --> 00:54:16.180
<v Michael Kennedy>And sleep is seconds.

00:54:16.340 --> 00:54:16.880
<v Michael Kennedy>Sleep is seconds.

00:54:17.280 --> 00:54:18.180
<v Michael Kennedy>It takes a float.

00:54:18.320 --> 00:54:20.880
<v Chris May>So once it sleeps, it sends another server sign event.

00:54:21.640 --> 00:54:24.600
<v Chris May>With this time, it's instead of sending the HTML down,

00:54:24.980 --> 00:54:26.680
<v Chris May>we're sending a signal.

00:54:27.030 --> 00:54:28.520
<v Chris May>So essentially changing, say, you can say,

00:54:28.660 --> 00:54:31.320
<v Chris May>like the JavaScript value or script data

00:54:31.830 --> 00:54:32.620
<v Chris May>onto the front of the page.

00:54:32.780 --> 00:54:33.080
<v Michael Kennedy>Right, right.

00:54:33.200 --> 00:54:37.800
<v Michael Kennedy>So it's showing that you can send the HTML and let Datastar patch it, or you can basically

00:54:38.240 --> 00:54:43.200
<v Michael Kennedy>from the server set one of these signal things that will be reactive on the front end, right?

00:54:43.390 --> 00:54:43.520
<v Ben Crocker>Yeah.

00:54:43.520 --> 00:54:44.480
<v Ben Crocker>You said it much better than I did.

00:54:45.760 --> 00:54:45.900
<v Ben Crocker>Thanks.

00:54:45.900 --> 00:54:47.940
<v Ben Crocker>It's a long way of saying it's a clock, right?

00:54:48.120 --> 00:54:48.220
<v Ben Crocker>Yeah.

00:54:48.440 --> 00:54:51.720
<v Delaney Gillilan>Also the thing, just for people that aren't used to thinking about this way, especially

00:54:51.900 --> 00:54:56.100
<v Delaney Gillilan>if you're doing Python, like all a signal is, is instead of saying that here's, I'm

00:54:56.210 --> 00:55:00.099
<v Delaney Gillilan>setting a variable, you're saying I'm setting a relationship that says like, kind of like

00:55:00.120 --> 00:55:03.660
<v Delaney Gillilan>in an Excel document when you set a formula for a cell,

00:55:04.000 --> 00:55:04.540
<v Delaney Gillilan>it's the same idea.

00:55:04.590 --> 00:55:05.700
<v Delaney Gillilan>You're setting up a relationship saying,

00:55:05.770 --> 00:55:08.080
<v Delaney Gillilan>when this thing and this thing changes, update this.

00:55:08.170 --> 00:55:10.520
<v Delaney Gillilan>And it does smart things to do that efficiently.

00:55:10.890 --> 00:55:12.280
<v Delaney Gillilan>But the idea is it's a relationship.

00:55:12.580 --> 00:55:13.220
<v Delaney Gillilan>It's declarative.

00:55:13.670 --> 00:55:14.700
<v Delaney Gillilan>So kind of like with SQL,

00:55:15.280 --> 00:55:17.600
<v Delaney Gillilan>you think of SQL as a declarative language, right?

00:55:17.680 --> 00:55:18.980
<v Delaney Gillilan>You don't care how it creates an index.

00:55:19.070 --> 00:55:20.120
<v Delaney Gillilan>You just say, create index.

00:55:20.620 --> 00:55:21.500
<v Delaney Gillilan>Same thing happens here.

00:55:21.570 --> 00:55:23.880
<v Delaney Gillilan>You just say, hey, I want when this thing changes,

00:55:24.110 --> 00:55:24.820
<v Delaney Gillilan>this other thing to change.

00:55:25.250 --> 00:55:26.880
<v Delaney Gillilan>And the problem is that declarativeness

00:55:27.040 --> 00:55:28.100
<v Delaney Gillilan>is not built into JavaScript.

00:55:28.400 --> 00:55:29.380
<v Delaney Gillilan>It's not built into the browser,

00:55:29.440 --> 00:55:32.380
<v Delaney Gillilan>but we just made the web a little bit more declarative.

00:55:32.800 --> 00:55:33.580
<v Delaney Gillilan>That's all we did, basically.

00:55:33.700 --> 00:55:33.780
<v Michael Kennedy>Right.

00:55:34.320 --> 00:55:36.020
<v Michael Kennedy>Declarative is generally pretty good.

00:55:36.260 --> 00:55:37.160
<v Michael Kennedy>It's a good way to work.

00:55:37.300 --> 00:55:38.040
<v Michael Kennedy>It keeps things simple

00:55:38.240 --> 00:55:40.280
<v Michael Kennedy>and lets the underlying system have at it.

00:55:40.760 --> 00:55:42.140
<v Michael Kennedy>So a couple of things,

00:55:42.880 --> 00:55:44.260
<v Michael Kennedy>well, we still got a little bit of time,

00:55:44.440 --> 00:55:46.260
<v Michael Kennedy>but to wrap things up a little bit.

00:55:46.560 --> 00:55:46.800
<v Michael Kennedy>Editors.

00:55:47.200 --> 00:55:49.080
<v Michael Kennedy>I think having good editor support

00:55:49.840 --> 00:55:51.840
<v Michael Kennedy>is really important for adoption.

00:55:52.100 --> 00:55:53.220
<v Michael Kennedy>You know, drives me crazy

00:55:53.720 --> 00:55:56.220
<v Michael Kennedy>when I go and try to work with JavaScript, CSS,

00:55:56.800 --> 00:55:57.520
<v Michael Kennedy>attributes or whatever,

00:55:57.720 --> 00:55:59.120
<v Michael Kennedy>and I'm like, they're not here.

00:55:59.200 --> 00:55:59.720
<v Michael Kennedy>No help.

00:56:00.260 --> 00:56:06.760
<v Michael Kennedy>So you all have nice extensions and plugins for common editors Python people might use, right?

00:56:06.860 --> 00:56:12.040
<v Ben Crocker>Yeah, we have VS Code, which you're seeing here, and PHP Storm.

00:56:12.560 --> 00:56:16.140
<v Ben Crocker>Or sorry, I use PHP Storm, but all JetBrains editors.

00:56:16.580 --> 00:56:19.580
<v Ben Crocker>PHP Storm, PyToram, WebStorm, all of them things.

00:56:19.740 --> 00:56:25.180
<v Ben Crocker>So it's in the JetBrains marketplace, so it'll work for, I believe, all JetBrains IDEs.

00:56:25.360 --> 00:56:25.740
<v Ben Crocker>I believe so.

00:56:25.850 --> 00:56:28.440
<v Michael Kennedy>You also have the AI editors covered.

00:56:28.770 --> 00:56:29.000
<v Michael Kennedy>Do we?

00:56:29.180 --> 00:56:37.620
<v Michael Kennedy>In the OpenVSX registry, all the ones that have been kicked out from VS Code, this is where they all have to go to get their installs, right?

00:56:37.740 --> 00:56:40.060
<v Michael Kennedy>That explains why people requested this from me.

00:56:41.519 --> 00:56:49.060
<v Michael Kennedy>Yeah, if you're doing cursor, anti-gravity, windsurf, like all those things, they were all kicked out of the VS Code registry.

00:56:50.640 --> 00:56:51.480
<v Michael Kennedy>That's not a complaint.

00:56:51.570 --> 00:56:53.060
<v Michael Kennedy>I mean, it's a Microsoft product.

00:56:53.070 --> 00:56:53.560
<v Michael Kennedy>They built it.

00:56:54.050 --> 00:56:55.880
<v Michael Kennedy>They don't have to build all the other ones.

00:56:56.020 --> 00:56:57.460
<v Michael Kennedy>But that's why they're here, right?

00:56:57.560 --> 00:56:58.580
<v Ben Crocker>We keep those up to date.

00:56:58.980 --> 00:57:01.320
<v Ben Crocker>We do those ourselves, the SDKs.

00:57:01.330 --> 00:57:04.080
<v Ben Crocker>I mean, Delaney wrote the Go one, I wrote the PHP one,

00:57:04.110 --> 00:57:06.660
<v Ben Crocker>and the rest are just community contributions.

00:57:07.280 --> 00:57:11.040
<v Ben Crocker>We've had contributions to these too, to the IDE extensions.

00:57:11.680 --> 00:57:13.340
<v Ben Crocker>We maintain these primarily.

00:57:13.760 --> 00:57:14.360
<v Ben Crocker>Yeah, and these are great.

00:57:14.590 --> 00:57:19.480
<v Ben Crocker>These just, you know, save on typing, but more importantly, save on making typos.

00:57:20.100 --> 00:57:22.760
<v Ben Crocker>You know, they show you all of the available data attributes.

00:57:23.120 --> 00:57:26.120
<v Delaney Gillilan>Maybe Chris can speak more to is that the irony is, though,

00:57:26.300 --> 00:57:29.220
<v Delaney Gillilan>you won't need that many tags to actually do your work.

00:57:29.330 --> 00:57:30.960
<v Delaney Gillilan>So it's not like a tailwind thing where you're like,

00:57:31.140 --> 00:57:33.320
<v Delaney Gillilan>oh, I rely on it to autocomplete.

00:57:33.520 --> 00:57:33.860
<v Delaney Gillilan>It's just...

00:57:33.860 --> 00:57:34.220
<v Chris May>Yeah, absolutely.

00:57:34.540 --> 00:57:35.800
<v Chris May>In fact, it's one of those things

00:57:35.890 --> 00:57:38.140
<v Chris May>where I discover more things I can do with Datastar

00:57:38.280 --> 00:57:40.500
<v Chris May>because as I'm typing data dash and I'm like,

00:57:40.710 --> 00:57:42.600
<v Chris May>oh, I didn't actually remember

00:57:42.780 --> 00:57:45.800
<v Chris May>that there's a attribute to do whatever it is.

00:57:45.800 --> 00:57:46.240
<v Chris May>I don't remember.

00:57:46.440 --> 00:57:47.620
<v Chris May>Like, I can't remember at this point.

00:57:48.000 --> 00:57:49.860
<v Chris May>And then I went to the documentation like,

00:57:49.960 --> 00:57:50.640
<v Chris May>oh, check this out.

00:57:50.760 --> 00:57:51.740
<v Chris May>This is so much more I can do.

00:57:52.100 --> 00:57:54.080
<v Chris May>But yeah, I find I love the plugin,

00:57:54.280 --> 00:57:55.460
<v Chris May>but I find I don't use it too much

00:57:55.480 --> 00:57:58.160
<v Chris May>just because I'm not writing as much HTML with it.

00:57:58.280 --> 00:58:01.680
<v Michael Kennedy>While I'm sitting here on this open VSX registry,

00:58:02.000 --> 00:58:05.420
<v Michael Kennedy>do you all have advice for making Datastar work well

00:58:05.580 --> 00:58:08.500
<v Michael Kennedy>with Identic AI and Claude Code, Cursor, et cetera?

00:58:08.740 --> 00:58:10.280
<v Delaney Gillilan>There's some active research going on

00:58:10.440 --> 00:58:13.300
<v Delaney Gillilan>like in Oslo at a college

00:58:13.840 --> 00:58:15.900
<v Delaney Gillilan>that's doing, ironically, using Datastar

00:58:16.720 --> 00:58:21.940
<v Delaney Gillilan>to do some stuff around like how LLMs work with code bases.

00:58:22.120 --> 00:58:24.440
<v Delaney Gillilan>And the reason why is because the entire code base

00:58:24.380 --> 00:58:28.320
<v Delaney Gillilan>fits in basically every context, even the nano ones, like the entire code base fits there.

00:58:28.620 --> 00:58:33.340
<v Delaney Gillilan>And what they found, we've gone back and forth a bit, is that almost all of them are completely

00:58:33.540 --> 00:58:37.840
<v Delaney Gillilan>overfitted. So if you just want to make a website with agentic stuff, go do React,

00:58:38.260 --> 00:58:43.020
<v Delaney Gillilan>because that's what it's built for. And it's overfitted to such a degree that if you try to

00:58:43.420 --> 00:58:49.160
<v Delaney Gillilan>use the spec correctly and to say, here's all the sorts of data star, go use it to build websites,

00:58:49.380 --> 00:58:51.500
<v Delaney Gillilan>it will fall over almost in every regard.

00:58:51.840 --> 00:58:54.760
<v Delaney Gillilan>So it's one of those things where you don't need that much,

00:58:54.940 --> 00:58:59.420
<v Delaney Gillilan>but it will ironically show you how bad things like Clawed and Codex and stuff

00:58:59.600 --> 00:59:02.680
<v Delaney Gillilan>are at just using the current context to solve things.

00:59:03.080 --> 00:59:05.480
<v Delaney Gillilan>Hopefully that gets better, but we have something around,

00:59:05.840 --> 00:59:08.440
<v Delaney Gillilan>like we have a slash docs page that you can feed into your LLM,

00:59:08.680 --> 00:59:11.500
<v Delaney Gillilan>but I'll say that we do not focus on that at all

00:59:11.740 --> 00:59:14.900
<v Delaney Gillilan>because you're basically fighting against what the training already happened.

00:59:15.160 --> 00:59:17.820
<v Delaney Gillilan>So you're better off, like if you want to use,

00:59:18.140 --> 00:59:19.060
<v Delaney Gillilan>if you want to make better size,

00:59:19.100 --> 00:59:20.080
<v Delaney Gillilan>you want to be fast and efficient

00:59:20.140 --> 00:59:20.720
<v Delaney Gillilan>and all that stuff,

00:59:21.120 --> 00:59:22.200
<v Delaney Gillilan>we're 100% the right thing to do.

00:59:22.380 --> 00:59:24.360
<v Delaney Gillilan>If you just want to like one shot something,

00:59:24.780 --> 00:59:26.880
<v Delaney Gillilan>go use React and stay in that world.

00:59:26.940 --> 00:59:27.820
<v Michael Kennedy>You want to vibe code it?

00:59:28.340 --> 00:59:29.120
<v Michael Kennedy>Hey, I've got something.

00:59:29.220 --> 00:59:32.200
<v Michael Kennedy>I feel like this might resonate with you, Delaney,

00:59:32.420 --> 00:59:33.640
<v Michael Kennedy>especially the way you just described it.

00:59:34.040 --> 00:59:37.740
<v Michael Kennedy>Have you all seen the Kai Lintit Senior Engineer

00:59:37.980 --> 00:59:38.660
<v Michael Kennedy>Tries Vibe Coding?

00:59:39.080 --> 00:59:41.280
<v Michael Kennedy>This is an amazing video.

00:59:41.660 --> 00:59:43.060
<v Michael Kennedy>And like half of the video is like,

00:59:43.480 --> 00:59:45.400
<v Michael Kennedy>no, no, no, not in being installed.

00:59:46.100 --> 00:59:46.520
<v Michael Kennedy>What are you doing?

00:59:47.180 --> 00:59:52.600
<v Michael Kennedy>It reminds me very much of like, it's just like, nope, that's not what I told you to do.

00:59:52.660 --> 00:59:54.740
<v Michael Kennedy>I know that's what you think the most common thing is, please stop.

00:59:54.860 --> 00:59:54.940
<v Delaney Gillilan>Yeah.

00:59:55.080 --> 00:59:58.880
<v Delaney Gillilan>And the thing is that it's not that I actually like a lot of the stuff, but I treat it as

00:59:58.900 --> 01:00:03.500
<v Delaney Gillilan>an autocomplete or like it can write code faster than I can when it comes to like, hey, change

01:00:03.500 --> 01:00:04.920
<v Delaney Gillilan>this in 27 different places.

01:00:05.400 --> 01:00:06.580
<v Delaney Gillilan>And I forget which files I did it like.

01:00:06.960 --> 01:00:10.080
<v Delaney Gillilan>There's value to it, but people are trying to use it to learn.

01:00:10.620 --> 01:00:12.800
<v Delaney Gillilan>It's a complete, it actively is working against you.

01:00:13.180 --> 01:00:15.300
<v Delaney Gillilan>Ben has done an amazing job with the guide.

01:00:15.780 --> 01:00:20.180
<v Delaney Gillilan>Like, please, like, it's fine to use the LLMs to help, like, guide your process and to, like,

01:00:20.660 --> 01:00:22.120
<v Delaney Gillilan>knock stuff out quickly once you have a baseline.

01:00:22.640 --> 01:00:24.160
<v Delaney Gillilan>But you have to know when to say no.

01:00:24.720 --> 01:00:25.580
<v Delaney Gillilan>And he has done it.

01:00:25.770 --> 01:00:29.760
<v Delaney Gillilan>The guide takes half an hour, less than a half, like, probably 15, 20 minutes to read

01:00:29.940 --> 01:00:31.840
<v Delaney Gillilan>and then, like, an hour to actually work through.

01:00:32.320 --> 01:00:35.580
<v Delaney Gillilan>Please try it first before you try to throw it at the LLMs.

01:00:35.680 --> 01:00:36.960
<v Delaney Gillilan>It's not because I hate them.

01:00:37.080 --> 01:00:42.300
<v Delaney Gillilan>It's more that they are just overfit to the, like, the sea of badly written SPA code.

01:00:42.700 --> 01:00:44.820
<v Delaney Gillilan>That's, unfortunately, that's the situation we're in.

01:00:45.020 --> 01:00:49.260
<v Michael Kennedy>Yeah, especially with JavaScript, the agentic AI is very trained.

01:00:49.700 --> 01:00:50.600
<v Michael Kennedy>It wants what it wants.

01:00:51.280 --> 01:00:51.560
<v Michael Kennedy>All right.

01:00:52.220 --> 01:00:55.760
<v Michael Kennedy>Let's talk, speaking of being near the guy,

01:00:55.760 --> 01:00:59.460
<v Michael Kennedy>if I go over here to more, there's a pro section.

01:00:59.980 --> 01:01:01.740
<v Michael Kennedy>I'll let you all give a shout out to pro.

01:01:02.300 --> 01:01:04.440
<v Michael Kennedy>I know you have a really strong sales pitch here.

01:01:04.980 --> 01:01:06.440
<v Michael Kennedy>You were talking about earlier.

01:01:06.940 --> 01:01:08.380
<v Michael Kennedy>Now, what is this data, Datastar Pro?

01:01:08.840 --> 01:01:13.800
<v Ben Crocker>It's been about a year since we released the beta one of Datastar.

01:01:14.420 --> 01:01:23.180
<v Ben Crocker>We are taking our sweet ass time for a very good reason, which is that we want version one to be the last version or like the last major version.

01:01:23.820 --> 01:01:30.460
<v Ben Crocker>We don't really want to force people through breaking changes and major updates because that's really just a pain.

01:01:30.630 --> 01:01:35.820
<v Ben Crocker>And I think like Python has done a great job with that and Go as well.

01:01:36.060 --> 01:01:39.240
<v Ben Crocker>And like there are some ecosystems where you just don't make breaking changes.

01:01:39.560 --> 01:01:41.320
<v Ben Crocker>That's the norm. And that's what we want to be.

01:01:41.440 --> 01:01:44.840
<v Ben Crocker>And the JavaScript ecosystem is, you know, the antithesis to that.

01:01:45.800 --> 01:01:46.980
<v Michael Kennedy>They're like, here, hold my beer.

01:01:47.100 --> 01:01:48.020
<v Michael Kennedy>I'll show you breaking changes.

01:01:48.300 --> 01:01:48.520
<v Michael Kennedy>Yeah.

01:01:48.660 --> 01:01:49.560
<v Michael Kennedy>Have you heard of LeftPad?

01:01:49.700 --> 01:01:53.240
<v Delaney Gillilan>To give you an idea of how far we take that, we don't have npm.

01:01:53.740 --> 01:01:55.680
<v Delaney Gillilan>Like we don't actually even submit to npm.

01:01:55.810 --> 01:01:59.380
<v Delaney Gillilan>We have no package.json in our JavaScript framework.

01:01:59.840 --> 01:02:01.900
<v Delaney Gillilan>We actually, like, there's none of that stuff.

01:02:02.090 --> 01:02:03.480
<v Delaney Gillilan>It does not exist in our ecosystem.

01:02:03.480 --> 01:02:07.460
<v Delaney Gillilan>So we take it very seriously when we say it's funny to have a JavaScript framework that

01:02:07.800 --> 01:02:09.560
<v Delaney Gillilan>actively hates the JavaScript ecosystem.

01:02:09.940 --> 01:02:11.620
<v Michael Kennedy>And you guys, I think also it's worth pointing out

01:02:11.720 --> 01:02:13.540
<v Michael Kennedy>that you don't have a strong build step,

01:02:14.120 --> 01:02:17.080
<v Michael Kennedy>tree shaking, web packing story, right?

01:02:17.080 --> 01:02:17.840
<v Michael Kennedy>You just dropped-

01:02:17.860 --> 01:02:18.940
<v Delaney Gillilan>No, we do.

01:02:18.940 --> 01:02:21.740
<v Delaney Gillilan>The thing is that, like for example,

01:02:21.740 --> 01:02:25.280
<v Delaney Gillilan>beat is kind of the well-known way to do this stuff.

01:02:25.280 --> 01:02:25.820
<v Delaney Gillilan>But guess what?

01:02:25.820 --> 01:02:27.400
<v Delaney Gillilan>Under the hood, it uses ES build.

01:02:27.400 --> 01:02:29.280
<v Delaney Gillilan>And ES build is a go thing.

01:02:29.280 --> 01:02:30.400
<v Delaney Gillilan>We build a lot of our stuff in go.

01:02:30.400 --> 01:02:32.100
<v Delaney Gillilan>So it's literally embedded in our,

01:02:32.100 --> 01:02:33.960
<v Delaney Gillilan>like we just use the ES build directly.

01:02:33.960 --> 01:02:36.620
<v Delaney Gillilan>We don't need 20,000 things from npm.

01:02:36.620 --> 01:02:38.559
<v Delaney Gillilan>We just use the go tools inside of our binary

01:02:38.580 --> 01:02:40.020
<v Delaney Gillilan>because that's the fast thing to do.

01:02:40.440 --> 01:02:41.860
<v Delaney Gillilan>So we don't need all of that.

01:02:41.870 --> 01:02:43.420
<v Delaney Gillilan>So we have no dependencies, nothing,

01:02:43.690 --> 01:02:46.360
<v Delaney Gillilan>and we don't even use npm or any of that at all.

01:02:46.720 --> 01:02:48.300
<v Ben Crocker>Yeah, so the reason I mentioned the beta

01:02:48.560 --> 01:02:51.200
<v Ben Crocker>is during the beta phase, which lasted about six months,

01:02:51.640 --> 01:02:53.920
<v Ben Crocker>we, Datastar gained a lot of traction,

01:02:54.250 --> 01:02:56.500
<v Ben Crocker>a lot of interest, and people had a lot of requests.

01:02:56.800 --> 01:02:58.520
<v Ben Crocker>And we were like, yeah, we see,

01:02:58.960 --> 01:02:59.960
<v Ben Crocker>and because it's plugin-based,

01:03:00.170 --> 01:03:01.660
<v Ben Crocker>you can always just add another plugin.

01:03:01.730 --> 01:03:02.600
<v Ben Crocker>You can add it yourself,

01:03:03.080 --> 01:03:05.520
<v Ben Crocker>or we can build a plugin and add it to Datastar.

01:03:05.960 --> 01:03:15.260
<v Ben Crocker>But we were very adamant about keeping the open source Datastar framework as tight as possible.

01:03:15.560 --> 01:03:18.280
<v Ben Crocker>Like I said, it should do everything you need, but nothing you don't.

01:03:18.420 --> 01:03:20.860
<v Ben Crocker>So how do we do that while adding plugins?

01:03:21.540 --> 01:03:26.720
<v Ben Crocker>So during that beta phase, we started thinking about, well, do we have multiple versions of Datastar?

01:03:26.780 --> 01:03:28.260
<v Ben Crocker>Do we have a marketplace of plugins?

01:03:28.470 --> 01:03:29.480
<v Ben Crocker>Or how do we manage that?

01:03:30.080 --> 01:03:35.880
<v Ben Crocker>And at the same time, we were also asking ourselves, because Delaney and I both, we have full-time things that we're doing.

01:03:35.920 --> 01:04:05.680
<v Ben Crocker>And this is a side project, but we're almost doing it full time alongside our other full time things. So how do we make this project sustainable? Because it doesn't stop at Datastar. You probably see Rocket and Stellar CSS on that page in the navigation sidebar. Those are like projects that build on top of Datastar. So Datastar is just the foundation. And Rocket kind of takes it to web components and Stellar CSS is a CSS framework that builds on top of these concepts.

01:04:05.820 --> 01:04:09.800
<v Ben Crocker>So we're trying to fix not only JavaScript web components, but also CSS.

01:04:10.560 --> 01:04:12.160
<v Ben Crocker>So we have a long-term vision.

01:04:12.820 --> 01:04:18.380
<v Ben Crocker>How do we make that sustainable when we're both busy people anyway, and this just takes

01:04:18.920 --> 01:04:21.900
<v Ben Crocker>so much of our time and the project appears to be growing?

01:04:22.600 --> 01:04:25.720
<v Ben Crocker>So at that point, we decided, well, how do we want to even run this?

01:04:25.880 --> 01:04:31.360
<v Ben Crocker>So we decided we don't want to found some company and do VC like we're, if anything,

01:04:31.830 --> 01:04:32.840
<v Ben Crocker>anti-VC funding.

01:04:32.920 --> 01:04:43.700
<v Ben Crocker>So we founded a nonprofit organization in the U.S. called Star Federation, and that's what backs this project, including Rocket and Stellar CSS.

01:04:44.780 --> 01:04:57.680
<v Ben Crocker>To help fund that organization, we decided let's have Datastar be the open source framework, but then something called Datastar Pro, which is like all those plugins that we think are good ideas, but that most people don't need.

01:04:58.010 --> 01:05:01.460
<v Ben Crocker>We'll put those into Datastar Pro, and that can kind of grow over time.

01:05:01.740 --> 01:05:07.120
<v Ben Crocker>It's a collection of plugins that you might want if you're using Datastar in a professional setting.

01:05:07.520 --> 01:05:11.280
<v Ben Crocker>But, you know, if you're just using Datastar, you don't actually need it.

01:05:11.580 --> 01:05:12.520
<v Ben Crocker>And so that's what we tell people.

01:05:12.680 --> 01:05:13.700
<v Ben Crocker>Most people don't need it.

01:05:13.860 --> 01:05:19.380
<v Ben Crocker>It's a collection of plugins and it's a Datastar inspector, which sits on your page.

01:05:19.900 --> 01:05:25.840
<v Ben Crocker>You get access to the bundler and now you get access to Rocket and StadrCSS, which is a work in progress.

01:05:26.720 --> 01:05:28.220
<v Ben Crocker>Yeah, that was, I think, a good decision.

01:05:28.520 --> 01:05:35.400
<v Ben Crocker>Like there was definitely some uproar initially that, you know, some plugins were taken away, but those plugins were never taken away.

01:05:35.480 --> 01:05:38.080
<v Ben Crocker>They still exist in the repo if anybody needs them.

01:05:38.540 --> 01:05:46.040
<v Ben Crocker>What the result is, is that we have like some money coming into a bank account, which is not even used to pay maintainers.

01:05:46.760 --> 01:05:52.500
<v Ben Crocker>We use that for running costs and like for, you know, podcasting software.

01:05:53.000 --> 01:05:55.940
<v Ben Crocker>And if we need to travel to conferences, which we've yet to do.

01:05:56.120 --> 01:06:05.400
<v Ben Crocker>But essentially, it's like a way of having some money into the bank so that we can justify all of the work that we do in maintaining Datastar and pushing that forward.

01:06:06.300 --> 01:06:07.300
<v Michael Kennedy>But the V1 thing.

01:06:07.600 --> 01:06:14.440
<v Michael Kennedy>100% free sounds great until that means it becomes abandoned where, you know, and like people can't work on it anymore.

01:06:14.740 --> 01:06:16.660
<v Michael Kennedy>And I think it's fair.

01:06:16.860 --> 01:06:21.380
<v Delaney Gillilan>There's one thing that's kind of interesting about the model, because especially with the tailwind stuff that's been going on lately.

01:06:21.840 --> 01:06:26.260
<v Delaney Gillilan>One of the things that we talked about, and people get very angry about this, but for example,

01:06:26.660 --> 01:06:30.820
<v Delaney Gillilan>Rocket is a web component layer that you basically just write Datastar in a declarative way,

01:06:31.320 --> 01:06:34.300
<v Delaney Gillilan>and it dynamically generates web components for you on the fly.

01:06:34.370 --> 01:06:36.460
<v Delaney Gillilan>And it's a great way to build web components.

01:06:36.620 --> 01:06:38.080
<v Delaney Gillilan>It'll save you tons of hours.

01:06:38.540 --> 01:06:39.560
<v Delaney Gillilan>And people won't pay for features.

01:06:39.630 --> 01:06:40.320
<v Delaney Gillilan>They pay for convenience.

01:06:40.920 --> 01:06:45.860
<v Delaney Gillilan>So the thing is, people said, well, I want you to generate out the content and make that

01:06:46.060 --> 01:06:46.620
<v Delaney Gillilan>open and available.

01:06:46.960 --> 01:06:51.580
<v Delaney Gillilan>And we said no, because basically the way we look at it is that almost like Pico 8,

01:06:51.780 --> 01:06:54.000
<v Delaney Gillilan>or any kind of game engine, you pay for the game

01:06:54.140 --> 01:06:55.140
<v Delaney Gillilan>and then all the mods are free.

01:06:55.180 --> 01:06:57.940
<v Delaney Gillilan>So all the rocket components and all this stuff

01:06:58.000 --> 01:07:01.060
<v Delaney Gillilan>is gonna be free, but the core engine is not free.

01:07:01.520 --> 01:07:02.340
<v Delaney Gillilan>It's a paid thing.

01:07:02.380 --> 01:07:04.340
<v Delaney Gillilan>And the reason why is if it becomes successful,

01:07:04.580 --> 01:07:06.820
<v Delaney Gillilan>if we do our job and we make it so it's easy for everybody,

01:07:07.300 --> 01:07:09.980
<v Delaney Gillilan>the Star Federation will do better over time.

01:07:10.100 --> 01:07:12.340
<v Delaney Gillilan>Whereas Tailwind's model of they're competing

01:07:12.480 --> 01:07:14.580
<v Delaney Gillilan>against every other person in that space,

01:07:15.240 --> 01:07:16.680
<v Delaney Gillilan>whereas it just does not work.

01:07:16.800 --> 01:07:18.480
<v Delaney Gillilan>So our thing is if we do get successful

01:07:18.980 --> 01:07:20.340
<v Delaney Gillilan>and we do get more people,

01:07:20.740 --> 01:07:23.600
<v Delaney Gillilan>then it's self-sustaining as in you paid for this little engine

01:07:24.100 --> 01:07:27.400
<v Delaney Gillilan>and now you get all the ecosystem around it of open source.

01:07:27.710 --> 01:07:28.940
<v Delaney Gillilan>So you can do open source in a way,

01:07:29.040 --> 01:07:32.320
<v Delaney Gillilan>but you have to find a core engine that is not open source.

01:07:32.520 --> 01:07:34.420
<v Delaney Gillilan>Otherwise it will fail in the modern world.

01:07:34.620 --> 01:07:37.500
<v Michael Kennedy>Let's close this thing out with two super quick things

01:07:37.640 --> 01:07:38.360
<v Michael Kennedy>because I know we're over time.

01:07:38.800 --> 01:07:39.140
<v Michael Kennedy>Roadmap.

01:07:39.700 --> 01:07:42.400
<v Michael Kennedy>Ben, you talked about taking your sweet time to 1.0.

01:07:42.880 --> 01:07:44.400
<v Michael Kennedy>Is there a forward-looking roadmap?

01:07:44.740 --> 01:07:46.400
<v Michael Kennedy>Are you guys done or what are things?

01:07:46.740 --> 01:07:50.380
<v Ben Crocker>The release counted RC1, I think it was about six months ago.

01:07:51.200 --> 01:07:54.240
<v Ben Crocker>and like the release has just been slowing down, slowing down.

01:07:54.240 --> 01:07:57.360
<v Ben Crocker>So that stagnation in like just releases with fixes

01:07:57.960 --> 01:08:00.380
<v Ben Crocker>is a good sign to me that we're very, very close.

01:08:00.800 --> 01:08:04.760
<v Ben Crocker>At this point, like the switch from release candidate to stable

01:08:05.000 --> 01:08:08.360
<v Ben Crocker>is just literally like just, you know, dropping the RC.

01:08:09.040 --> 01:08:11.520
<v Ben Crocker>There's no like features that are going into it.

01:08:11.640 --> 01:08:12.640
<v Ben Crocker>There's no big changes.

01:08:13.240 --> 01:08:15.060
<v Ben Crocker>We're taking our time because like I said,

01:08:15.320 --> 01:08:18.580
<v Ben Crocker>it's easy to put something up slightly prematurely

01:08:18.720 --> 01:08:19.839
<v Ben Crocker>and get some defaults wrong.

01:08:20.160 --> 01:08:27.160
<v Ben Crocker>I mean, that's what happened with HMX 2 was just like fixing some defaults that they decided they got wrong in version one.

01:08:27.359 --> 01:08:29.980
<v Ben Crocker>So we're trying to avoid a situation like that.

01:08:30.380 --> 01:08:35.500
<v Ben Crocker>And the only way to do that is to just let it simmer, let people use it, let people dog food it.

01:08:35.740 --> 01:08:46.359
<v Ben Crocker>And us, too, we're actively using for many projects using data ourselves and discovering every now and then, oh, this default is probably we're trying to avoid foot guns.

01:08:46.660 --> 01:08:55.480
<v Ben Crocker>So we're trying to make it so that the defaults give you the best possible experience that you need zero configuration, ideally, but you can configure as needed.

01:08:55.910 --> 01:09:05.440
<v Ben Crocker>But getting those defaults right is really the only thing stopping us from, not right, but locked down is the only thing stopping us from a V1 stable.

01:09:05.960 --> 01:09:07.020
<v Ben Crocker>I don't like to give timelines.

01:09:07.380 --> 01:09:12.160
<v Ben Crocker>In fact, it's one of our things that I tell Delaney, never promise a timeline.

01:09:12.759 --> 01:09:16.160
<v Ben Crocker>But I could see us in the first half of this year,

01:09:16.540 --> 01:09:17.859
<v Ben Crocker>just flipping the switch.

01:09:18.040 --> 01:09:20.060
<v Michael Kennedy>But it sounds like you might be able to use the RC

01:09:20.279 --> 01:09:22.299
<v Michael Kennedy>and you might more or less be safe, yeah.

01:09:22.380 --> 01:09:25.200
<v Delaney Gillilan>In fact, we recommend people rename the RC

01:09:25.440 --> 01:09:28.480
<v Delaney Gillilan>and they change the name to React-Foo

01:09:28.880 --> 01:09:30.560
<v Delaney Gillilan>so that they just drop it in their React projects

01:09:30.920 --> 01:09:34.060
<v Delaney Gillilan>because the entire framework is smaller than most components.

01:09:34.580 --> 01:09:36.160
<v Delaney Gillilan>Just start hiding it places.

01:09:36.700 --> 01:09:37.900
<v Delaney Gillilan>Yeah, don't even name it Datastar.

01:09:38.180 --> 01:09:40.339
<v Michael Kennedy>A stealth takeover of the spa world.

01:09:41.000 --> 01:09:42.020
<v Michael Kennedy>Awesome. I love it.

01:09:42.380 --> 01:09:45.980
<v Michael Kennedy>All right, let's wrap up the show with a final call to action

01:09:46.860 --> 01:09:50.259
<v Michael Kennedy>for people who want to use Datastar, learn more, get started.

01:09:50.799 --> 01:09:54.460
<v Michael Kennedy>Chris, I'll let you go first so Ben and Delaney can have the final word.

01:09:54.500 --> 01:09:58.460
<v Chris May>The first thing I was thinking of is because I get asked so much about

01:09:59.420 --> 01:10:02.840
<v Chris May>how long it takes to connect to the server and things like that,

01:10:03.240 --> 01:10:07.920
<v Chris May>there is a portion in the DjangoCon talk I gave in, I think it was 2023,

01:10:08.480 --> 01:10:14.180
<v Chris May>where I showed a video of five phones, five Android phones, trying to do the same thing,

01:10:14.380 --> 01:10:20.060
<v Chris May>shopping for eggs, I believe it was. And essentially one of them is an HTML driven

01:10:20.740 --> 01:10:25.540
<v Chris May>multi-page app and it smokes the single page applications, the native apps and everything.

01:10:25.920 --> 01:10:30.400
<v Chris May>And so I put a link in our chat. Maybe you'll be a part of the show notes. It's a deep link to go

01:10:30.560 --> 01:10:36.639
<v Chris May>straight to that portion of the talk because it is like that video reminded me like, this is what

01:10:36.660 --> 01:10:43.520
<v Chris May>I want to build. I want to build websites that are fun for people to use. And, you know, Datastar

01:10:43.980 --> 01:10:50.260
<v Chris May>enables me to use real-time interactions with way less complexity than I ever thought

01:10:50.680 --> 01:10:55.060
<v Chris May>possible. So I guess the two things I would say is, one, check out the deep link if you're at all

01:10:55.220 --> 01:11:00.600
<v Chris May>interested. And number two, definitely try out something, you know, just even clone the Python

01:11:00.920 --> 01:11:05.060
<v Chris May>repo and just try some of the examples and see what it's like. Yeah, I'll definitely link to that.

01:11:05.240 --> 01:11:05.980
<v Chris May>Cool. Thanks, Ben.

01:11:06.080 --> 01:11:08.120
<v Ben Crocker>I also gave a conference talk last year.

01:11:08.380 --> 01:11:10.160
<v Ben Crocker>There's a recording, so I'll send you the link to that,

01:11:10.340 --> 01:11:13.760
<v Ben Crocker>which really walks through my journey of Datastar

01:11:13.770 --> 01:11:18.440
<v Ben Crocker>and how Datastar has truly opened my eyes to what's possible.

01:11:18.740 --> 01:11:23.120
<v Ben Crocker>I feel like I talk a lot about how Datastar is a journey of unlearning

01:11:23.800 --> 01:11:29.060
<v Ben Crocker>old and bad patterns, deeply rooted ones in what I think web development is.

01:11:29.300 --> 01:11:31.780
<v Ben Crocker>And these days, as I mentioned,

01:11:32.060 --> 01:11:34.880
<v Ben Crocker>I never would have thought that I'd be developing in Go,

01:11:35.160 --> 01:11:37.120
<v Ben Crocker>but I see like all like the,

01:11:37.580 --> 01:11:39.060
<v Ben Crocker>like I think even Python

01:11:39.240 --> 01:11:41.220
<v Ben Crocker>is getting better concurrency support, right?

01:11:41.360 --> 01:11:44.400
<v Ben Crocker>So I think you talked about that recently, Michael, here.

01:11:44.620 --> 01:11:47.220
<v Ben Crocker>So now I'm seeing with Datastar,

01:11:47.360 --> 01:11:49.280
<v Ben Crocker>I can do so much more on the backend.

01:11:49.420 --> 01:11:51.720
<v Ben Crocker>I can be so much more creative on the backend

01:11:51.840 --> 01:11:53.200
<v Ben Crocker>and that's what interests me.

01:11:53.960 --> 01:11:55.120
<v Ben Crocker>So it's just fun.

01:11:55.420 --> 01:11:56.180
<v Ben Crocker>What can I say?

01:11:56.500 --> 01:11:57.080
<v Ben Crocker>It's fun.

01:11:57.220 --> 01:11:59.160
<v Chris May>I'm still really jealous of that presentation too.

01:11:59.420 --> 01:12:00.000
<v Chris May>Well done with it.

01:12:00.080 --> 01:12:01.100
<v Michael Kennedy>Yeah, certainly send me the link.

01:12:01.100 --> 01:12:03.120
<v Michael Kennedy>I'll put it in the show notes and well done.

01:12:03.600 --> 01:12:03.900
<v Michael Kennedy>Delaney.

01:12:04.140 --> 01:12:07.080
<v Delaney Gillilan>The irony is that like, I don't consider myself a web dev at all.

01:12:07.410 --> 01:12:09.380
<v Delaney Gillilan>It just happens to be something I do a little bit of.

01:12:09.650 --> 01:12:13.940
<v Delaney Gillilan>The thing that is the, when I first started making this public, I was like, Hey, I think

01:12:14.000 --> 01:12:16.180
<v Delaney Gillilan>I'm onto something like someone proved me wrong.

01:12:16.670 --> 01:12:21.380
<v Delaney Gillilan>I was, I'm a little bit more like kind of, I always say like in the jujitsu world type

01:12:21.490 --> 01:12:24.880
<v Delaney Gillilan>stuff, like you want someone to roll with you, not because you're trying to up them.

01:12:24.980 --> 01:12:27.240
<v Delaney Gillilan>It's that like, they're trying to help you find weaknesses in your game.

01:12:27.520 --> 01:12:27.580
<v Delaney Gillilan>Right.

01:12:27.780 --> 01:12:30.780
<v Delaney Gillilan>So I want there to be an active, like someone proved me wrong.

01:12:31.080 --> 01:12:33.840
<v Delaney Gillilan>And I'm at the point now where I feel so confident.

01:12:34.240 --> 01:12:35.420
<v Delaney Gillilan>I will put money on it.

01:12:35.500 --> 01:12:38.440
<v Delaney Gillilan>I've tried going out to people out in the dev Twitter and all that.

01:12:38.760 --> 01:12:41.680
<v Delaney Gillilan>I guarantee you, and I'm happy to put money up on this,

01:12:41.980 --> 01:12:43.140
<v Delaney Gillilan>if you could do it the Datastar way,

01:12:43.500 --> 01:12:45.800
<v Delaney Gillilan>whether you're using React or HTMLX or any other approach,

01:12:46.140 --> 01:12:47.020
<v Delaney Gillilan>it will be less code.

01:12:47.300 --> 01:12:47.940
<v Delaney Gillilan>It'll be faster.

01:12:48.360 --> 01:12:48.940
<v Delaney Gillilan>It'll be cheaper.

01:12:49.460 --> 01:12:51.620
<v Delaney Gillilan>And it'll be simpler to understand.

01:12:52.060 --> 01:12:54.640
<v Delaney Gillilan>I will take up anybody anywhere on that thing.

01:12:55.100 --> 01:12:56.580
<v Delaney Gillilan>Basically, it's not a boast.

01:12:56.840 --> 01:12:58.860
<v Delaney Gillilan>It's just the facts on the table.

01:12:59.220 --> 01:13:02.480
<v Delaney Gillilan>And it's a paradigm shift that I want the world to know about

01:13:02.900 --> 01:13:03.940
<v Delaney Gillilan>just so that people understand,

01:13:04.280 --> 01:13:05.220
<v Delaney Gillilan>hey, there's going to be someone

01:13:05.240 --> 01:13:06.760
<v Delaney Gillilan>that comes up with something better than I did, right?

01:13:06.880 --> 01:13:07.520
<v Delaney Gillilan>Like I'm standing,

01:13:07.800 --> 01:13:10.280
<v Delaney Gillilan>the reason why we have the fastest signal library in the world

01:13:10.420 --> 01:13:11.620
<v Delaney Gillilan>is because we listen to the people

01:13:11.640 --> 01:13:12.360
<v Delaney Gillilan>that are really good at that.

01:13:12.460 --> 01:13:13.400
<v Delaney Gillilan>We use alien signals.

01:13:13.800 --> 01:13:15.440
<v Delaney Gillilan>The reason why we have the fastest morphing library

01:13:15.640 --> 01:13:16.900
<v Delaney Gillilan>is that we listen to people and said,

01:13:16.960 --> 01:13:18.900
<v Delaney Gillilan>hey, there's people that care about this stuff

01:13:18.920 --> 01:13:19.880
<v Delaney Gillilan>and are working towards it.

01:13:20.140 --> 01:13:21.700
<v Delaney Gillilan>It's not that there's anything special here.

01:13:22.080 --> 01:13:23.900
<v Delaney Gillilan>It's that it's trying to build an ecosystem

01:13:24.180 --> 01:13:25.500
<v Delaney Gillilan>of like people that care about performance

01:13:25.560 --> 01:13:27.160
<v Delaney Gillilan>and people care about the details.

01:13:27.600 --> 01:13:28.240
<v Delaney Gillilan>And if you do that,

01:13:28.560 --> 01:13:29.840
<v Delaney Gillilan>then everything gets better.

01:13:30.200 --> 01:13:32.340
<v Delaney Gillilan>So it's not just where are we at now,

01:13:32.440 --> 01:13:33.900
<v Delaney Gillilan>but if anyone thinks they can do better,

01:13:34.320 --> 01:13:34.900
<v Delaney Gillilan>please join us.

01:13:34.910 --> 01:13:35.660
<v Delaney Gillilan>We want to hear it.

01:13:35.960 --> 01:13:38.500
<v Delaney Gillilan>But like, I'm done having the vibe code,

01:13:38.660 --> 01:13:39.500
<v Delaney Gillilan>or not the vibe code,

01:13:39.560 --> 01:13:41.160
<v Delaney Gillilan>but like the vibes around like,

01:13:41.580 --> 01:13:42.620
<v Delaney Gillilan>well, this doesn't feel like a spa

01:13:42.710 --> 01:13:43.780
<v Delaney Gillilan>or like a spa has its place.

01:13:44.220 --> 01:13:45.300
<v Delaney Gillilan>A couple of episodes ago,

01:13:45.880 --> 01:13:47.880
<v Delaney Gillilan>there was a Cody from the Litestar stuff said,

01:13:48.160 --> 01:13:50.020
<v Delaney Gillilan>there's a time and place for HTMX or Datastar.

01:13:50.350 --> 01:13:52.000
<v Delaney Gillilan>And he's just, that's just not true.

01:13:52.400 --> 01:13:55.200
<v Delaney Gillilan>It's just like hypermedia is the way to build things

01:13:55.360 --> 01:13:57.160
<v Delaney Gillilan>for a hypermedia client, which is the browser.

01:13:57.600 --> 01:14:00.700
<v Delaney Gillilan>So I will, anyone that can show that it's wrong,

01:14:01.020 --> 01:14:01.640
<v Delaney Gillilan>please let us know.

01:14:01.980 --> 01:14:02.760
<v Delaney Gillilan>Like we're here to help.

01:14:02.860 --> 01:14:06.400
<v Michael Kennedy>I would love to see this paired with some Electron JS apps

01:14:06.440 --> 01:14:08.120
<v Michael Kennedy>to make your desktop apps a little better too.

01:14:08.280 --> 01:14:08.920
<v Michael Kennedy>So anyway.

01:14:09.220 --> 01:14:10.320
<v Chris May>Seriously, oh my God.

01:14:10.500 --> 01:14:11.500
<v Michael Kennedy>That's a different episode.

01:14:11.740 --> 01:14:15.000
<v Michael Kennedy>So I just want to say thank you, Delaney, Ben and Chris.

01:14:15.200 --> 01:14:15.940
<v Michael Kennedy>Thank you all for being here.

01:14:16.480 --> 01:14:17.500
<v Michael Kennedy>And congrats on Datastar.

01:14:17.500 --> 01:14:18.680
<v Michael Kennedy>It looks like a super project.

01:14:18.940 --> 01:14:22.700
<v Michael Kennedy>I'm looking at some projects or an app running right over there

01:14:23.160 --> 01:14:25.500
<v Michael Kennedy>on my left that I kind of wish I'd built Datastar.

01:14:25.800 --> 01:14:29.220
<v Delaney Gillilan>Well, and the thing is to make sure to not think that it's just used, like, yes, we talk

01:14:29.260 --> 01:14:32.180
<v Delaney Gillilan>about the real-time stuff, but it's better for even just normal crud stuff.

01:14:32.260 --> 01:14:35.920
<v Delaney Gillilan>And that's kind of hard to, like, it's not as sexy to talk about, but it's better at

01:14:36.020 --> 01:14:36.280
<v Delaney Gillilan>that too.

01:14:36.400 --> 01:14:38.200
<v Michael Kennedy>Well, it's also 80% of what gets built.

01:14:38.320 --> 01:14:40.180
<v Michael Kennedy>So it's important to like point it out, right?

01:14:40.560 --> 01:14:40.640
<v Michael Kennedy>Yeah.

01:14:41.080 --> 01:14:41.220
<v Michael Kennedy>All right.

01:14:41.640 --> 01:14:41.920
<v Michael Kennedy>Bye everyone.

01:14:42.260 --> 01:14:42.580
<v Michael Kennedy>Thanks for being here.

01:14:42.740 --> 01:14:42.980
<v Michael Kennedy>Thank you.

01:14:44.180 --> 01:14:46.320
<v Michael Kennedy>This has been another episode of Talk Python To Me.

01:14:46.700 --> 01:14:47.420
<v Michael Kennedy>Thank you to our sponsors.

01:14:47.640 --> 01:14:48.960
<v Michael Kennedy>Be sure to check out what they're offering.

01:14:49.140 --> 01:14:50.480
<v Michael Kennedy>It really helps support the show.

01:14:50.940 --> 01:14:52.320
<v Michael Kennedy>Take some stress out of your life.

01:14:52.540 --> 01:14:58.120
<v Michael Kennedy>Get notified immediately about errors and performance issues in your web or mobile applications with Sentry.

01:14:58.620 --> 01:15:03.060
<v Michael Kennedy>Just visit talkpython.fm/sentry and get started for free.

01:15:03.560 --> 01:15:06.020
<v Michael Kennedy>Be sure to use our code talkpython26.

01:15:06.720 --> 01:15:10.340
<v Michael Kennedy>That's Talk Python, the numbers two, six, all one word.

01:15:11.020 --> 01:15:18.240
<v Michael Kennedy>This episode is brought to you by CommandBook, a native macOS app that I built that gives long-running terminal commands a permanent home.

01:15:18.640 --> 01:15:20.640
<v Michael Kennedy>No more juggling six terminal tabs every morning.

01:15:21.240 --> 01:15:24.040
<v Michael Kennedy>Carefully craft a command once, run it forever with auto restart,

01:15:24.360 --> 01:15:25.900
<v Michael Kennedy>URL detection, and a full CLI.

01:15:26.400 --> 01:15:29.380
<v Michael Kennedy>Download it for free at talkpython.fm/command book app.

01:15:30.140 --> 01:15:32.020
<v Michael Kennedy>If you or your team needs to learn Python,

01:15:32.240 --> 01:15:35.640
<v Michael Kennedy>we have over 270 hours of beginner and advanced courses

01:15:35.960 --> 01:15:39.380
<v Michael Kennedy>on topics ranging from complete beginners to async code,

01:15:39.520 --> 01:15:42.300
<v Michael Kennedy>Flask, Django, HTMX, and even LLMs.

01:15:42.520 --> 01:15:44.800
<v Michael Kennedy>Best of all, there's no subscription in sight.

01:15:45.340 --> 01:15:47.120
<v Michael Kennedy>Browse the catalog at talkpython.fm.

01:15:47.860 --> 01:15:49.839
<v Michael Kennedy>And if you're not already subscribed to the show

01:15:49.900 --> 01:15:51.200
<v Michael Kennedy>on your favorite podcast player,

01:15:51.840 --> 01:15:52.480
<v Michael Kennedy>what are you waiting for?

01:15:53.160 --> 01:15:54.900
<v Michael Kennedy>Just search for Python in your podcast player.

01:15:55.080 --> 01:15:55.900
<v Michael Kennedy>We should be right at the top.

01:15:56.340 --> 01:15:57.860
<v Michael Kennedy>If you enjoyed that geeky rap song,

01:15:57.970 --> 01:15:59.140
<v Michael Kennedy>you can download the full track.

01:15:59.310 --> 01:16:01.200
<v Michael Kennedy>The link is actually in your podcast blur show notes.

01:16:02.040 --> 01:16:03.360
<v Michael Kennedy>This is your host, Michael Kennedy.

01:16:03.760 --> 01:16:04.820
<v Michael Kennedy>Thank you so much for listening.

01:16:05.050 --> 01:16:05.820
<v Michael Kennedy>I really appreciate it.

01:16:06.260 --> 01:16:06.960
<v Michael Kennedy>I'll see you next time.

01:16:18.840 --> 01:16:21.640
<v Chris May>I'm out.