Stimulus and Turbo in Web Development - JSJ 656
Dive into the dynamic world of JavaScript frameworks with this week's episode of JavaScript Jabber! Join Charles, AJ, Dan and Steve as they explore Hotwire, Stimulus, and Turbo—tools that are transforming how developers build fast, responsive web applications. They discover the evolution from Turbo Links to Turbo Drive, learn how these technologies enhance page rendering speeds by updating only changed elements, and understand their seamless integration in Rails applications. The discussion also touches on practical implementations using Turbo frames and streams for efficient DOM manipulation. Additionally, they dive into the benefits of partial page updates for improved performance and talk about the insights into integrating Stimulus for fine-grained control over client-side interactions. They also explore the parallels between modern frameworks like React or Angular with traditional approaches.
Show Notes
Tune in to uncover how you can leverage these tools to optimize your development workflow!
Socials
Picks
Transcript
Hey, folks. Welcome back to another episode of JavaScript Jabber. This week on our panel, we have Dan Shapiro. Hey. From a still warm Tel Aviv.
We also have Steve. Edwards. Hello from Oregon where it is finally officially fall. And AJ O'Neil. Yo yo yo coming at you live from now the 4th straight day of 247 Vertigo.
Well, that sounds fun. My mom went through something like that. She actually went to the ER, but they just told her that, yeah, she had some kind of vertigo. Anyway, I'm Charles Max Wood from Top End Devs. And, this week, we are talking about higher, stimulus and turbo.
If you're if you can't guess, this is something that I put forward, and, I decided that I would just come on and talk about it myself since I use this every day. And, I'm I'm loving it. So, anyway, I'm I'm kinda curious. Have you guys heard much about Hotwire Stimulus or Turbo? Oh, yeah.
I use it for to find plane tickets all the time. I've kind of heard about it. I know that it's big in the rails world where I am not, present. I know that it's kinda like HTMX in a way, but that's more or less Yeah. That's more or less all that I know about it.
Yeah. Yeah. It it looks like they all go together. I'm looking at the web page. You can use them together.
You don't have to. So so I'll give a little bit of, history on this. So David I always call him David. Everybody else calls him DHH, and I don't know why. But, anyway, so, DHH, way back in the day, he created a system for Java in JavaScript for Rails apps called Turbolinks.
And, effectively, what it did was, it would reload initially, I think it just reloaded the body of the page. So if you click the link, then, Turbolynx would intercept the click, and then it would load just the body of the page or just certain sections of the page so that it would load faster. Right? Because it it didn't have to rerender the entire page. Turbo is kind of the successor to that.
Just before before we go into the successor, I want to better understand that aspect. So, basically, it did an HTTP request to the back end, presumably with a slightly different header, and then it would get the response back. Would it be like HTMLX? Would it be like basically HTML in the response? It was HTML in the results.
And then and then it would basically do in, like, an A diff. A diff. Like an inner HTML equal whatever the response was or something along the lines? Yeah. Basically.
And and I don't know all the internals on that, but, yeah, basically, that's what it would do. And I assume that it would also, like, work with the history API so that back and forward would work properly. Yep. So it's just similar to HDMX in the sense that it would it was a mechanism that allowed you to replace portions of the page rather than the the page in its entirety. Right.
But Turbolinks, when it was out, was kind of a a blunt tool, and so you couldn't target specific areas of your app or different specific DOM elements. It would it was literally just the whole page, and so it would effectively figure out what changed and then just update the changes. Mhmm. But it would get the HTML from the back end, as opposed to, I guess, some of the shadow DOM stuff that we see in JavaScript where, you know No. Not shadow DOM, virtual DOM.
Or virtual DOM where it, yeah, where it manipulates it it calculates and then manipulates the the DOM. And this is Shadow DOM is is that is that also a thing, but it's a different Yeah. Yeah. Fair enough. But but, anyway, so that's that's generally the idea behind Turbolinks.
And, you know, it did. It it sped up, you know, rendering on on Rails apps in particular, and that's that's almost exclusively where it was used. And then we started to see this proliferation of other Again, a question before you move on. Uh-huh. You said that it was mostly used in the rails world, and I assume DHH created it for rails.
Yes. For those who don't know, DHH also created rails. Yes. But was there anything specific in the technology that kind of precluded it from being used No. With other back end systems?
I don't know. PHP, whatever. In other words, if someone uses it without Ruby, you could say that they went off the rails. Mhmm. Yep.
You could take Turbolinks off the rails. Yes. Yep. So so, in more recent, applications, they moved to turbo. And so turbo does more what you're thinking of with HTMX, right, where you can target specific, areas of your app and, you can you can replace, items.
You can delete items. It Turbo has a number of different pieces to it, and this is probably I don't know. I guess, stimulus is probably interesting to, more traditional folks as well. But turbo turbo has, four pieces to it. We're not gonna talk about turbo native because turbo native is effectively a a wrapper around your web app that you can use to deploy and, put up native iOS and Android apps.
Right? And so, it's it's a completely different technology from from the other. So so it's basically a way for me again, without you know, we won't discuss in detail, but just to to generally understand, it's a way to implement a native app using a web component essentially with the rails back end driving the system. You can use any website. It it just wraps around the website.
And so it turns your website into your web app or into your native app. And so it's just a native shell that loads without the Chrome your browser or a browser with your web application. Cool. And it has a bit more so you can provide some native functionality to it, but it's fairly limited. And, anyway, if if you wanna just keep the same experience across your web and native apps, it's actually a pretty good option.
And, you know, it does, like I said, have some tie ins to native things that make it kind of a nice seamless experience. It's definitely not the right solution for everybody. But, anyway, I've I'm still learning about Turbonative, so I'm not I'm not using it myself. But the the other three elements of turbo are turbo drive. And what what turbo drive does is essentially what we talked about with Turbolinks.
Right? And so if if you have a link and you've loaded turbo into your web page and you click the link, then it will go and it will retrieve the the page, the the new page from the server, and it'll bring it back. And then it'll diff it against what's already there, and it'll only change the pieces that have actually changed. I'm I'm kind of curious about this diffing mechanism. Like, you know, how sophisticated is it?
I mean, you know, all of the the the v dom kind of exists to do all the sorts of a diffing. So, like like, any parts that of the page that haven't changed will not be touched or, you know, how does it reconcile how does it you know, the reconciliation is is, you know, is the is the challenge, especially if you've got sophisticated pages. Yeah. It uses another library. I think it's called ideomorph.
And and so ideomorph is what does a lot of the changes, under the hood for turbo. But, basically, it kind of it retrieves the new version, but does diffing in order to not replace stuff that hasn't changed. Right. So let's say you have, like, a menu bar all along the top or down the side. Mhmm.
You know? Maybe you're clicking a link and it only changes one small part of the page. When it does the end run to the back end and you when you click the link, it may give back the HTML for the entire page, but ideomorph is smart enough to look at the 2 and say, I need to merge these, right, and and get the stuff from the new page into the the old page. And so when you do that, it just replaces that one piece of the page instead of rerendering the entire page. No.
I'm not obviously, I'm not familiar with it because I'm basically learning about it from you right now, but there are, like, 3 big advantages to this type of an approach. One is, of course, that you avoid unnecessary flashing. Like you said, if you've got the menu on the side and the menu at the top, if they haven't changed, you don't want them rerendered. You just want them to stay where they are and and, you know, stay put and avoid the flash of them being erased and then rerendered. Another, advantage is that if you've got various, form elements that you've already put stuff in as a user, you don't want them reloading and and losing their content.
So, for example, if you type something into a text box, if the text box rerenders, then effectively it can lose whatever was in it. If you've not taken special steps for preserving that stuff. So, again, if you avoid rerendering those stuff that stuff, that makes it easier not losing, the contents of of, you know, form data just because, I don't know, you updated some counter on at the top of the page or whatever. And another reason is to avoid videos from jumping to the start. If you reload the video element, the video will, you know, go back to the beginning and which is often not what you want if the effect that you want to create is the user just staying where where they are.
Yeah. One there are a couple of other things. 1 is, your scroll position. Well, those browsers can kinda handle it, but yeah. Yeah.
But but if you if you click to the next page, a lot of times, it'll take you to the top of that Yeah. Page. And in this case, it doesn't because all all it does is, again, it just merges the page in where you want. I could I could see where maybe you don't want that all the time, but, it's it's a pretty nice feature. And I I I think that was the only other benefit that you didn't bring up, but that yeah.
Essentially, that's that's how that goes together. And, anyway, it's it's pretty nice. It's it's, I found that it has sped up, the the rendering and and work on my web pages where I use it. And, you just install turbo, and it just kinda does its thing. Now that it does have an API, so you can tell it how you want it to operate.
But for the most part, it just is kind of an automatic thing. So so a few questions about it. Again, as somebody who's really not so familiar with the the technology, and it kind of, it's related to some concerns that I had when we spoke with Carson about HTMX, is how it works with the browser's history, like, when you back and forward, how smart it is. Is it about things? How well does it work with the address bar, which kind of goes together with the history?
And, also, how well does it work with browser caching? Yeah. Honestly, I haven't had any problems with the the history back and forward, with that. Now we get into turbo, turbo frames to turbo streams. Yeah.
That that's a little bit different. But, with with turbo drive itself, I haven't had any issues. So you know? And and in rails, nearly every page loads using turbo drive, you know, once you click a link. And so, that that's worked pretty seamlessly, and I do weird stuff in rails sometimes and it seems to work.
So, I'm curious for that is it called kind of curious. Why is it called turbo drive? Like, is it the drive related to turbo? The fact that it drives faster or it's somehow related to I have no idea. This drive.
DHH is a race car driver. Okay. Oh, okay. He is. Okay.
But yeah, I don't know I don't know why they called it turbo turbo drive. I thought I thought the I thought the PHP guys were supposed to have the Lambos. Well, Lambos Never. You know, there's a lot of join a Lambo group. There's a lot of problems with Lambos.
Nah. Not They're pretty. Let's put it this way. It's probably not not the sort of problems that I need to contend with. So you probably shouldn't get a Lambo.
You can afford a Lambo is a problem I would like to have. Okay. Alright. For for me, cars are for me, cars are mostly ways to get from point a to point b. So I'm gonna jump in here real quick, and, obviously, you you guys are talking about Taylor Otwell and his orange Lambo.
But being a devoted, Inertia JS fanboy has been well documented here. I'm gonna say a lot of this is very similar. I think it's maybe the same thing with just slightly different implementations in terms of what I see in inertia and what I use in inertia on a regular basis in terms of, only loading certain parts of the page, you know, being able to make a query and get specific information, preventing or controlling, where the page rolls to after a change is updated, just the general speed of it in terms of how that it works. So it's just from listening to to Chuck and reading through the documentation, it's it's sort of just a diplomat implementation of the same, idea. I'm really not surprised that there's a sort of a convergent evolution.
I mean, if you want to drive more dynamic web pages and a more dynamic experience for web users, but don't want to build, like, react application on the front end Mhmm. It kind of they kind of all pushes you in the same direction, I guess. Yeah. And that's that's where a lot of this came out of both with stimulus and turbo is yeah. The the feeling is, in a lot of communities that I talked to outside of this one where, you know, people generally embrace React is, that, yeah, we we don't necessarily need a framework that, takes over the entire page.
We don't need, you know, we don't need the heavy handed approach that React has. You know, DHH calls them JavaScript sprinkles. Right? So you just put in what you need, where you need it. And I I have to admit, I I really like that approach as as far as it goes.
And so, you know, look at the way that we used to build things with, say, jQuery. Right? And so you would have a jQuery plugin. You would tell it to act or react on a specific DOM element, and, you know, you would get what you wanted where you wanted it, and that would kind of be the entire story. And so, you know, it's it's not necessarily an approach that is unfamiliar to people, at least in principle.
But a lot of the ideas behind how it's put together and why it works the way it works are are definitely not new. Is it also like HMX driven by attributes that you put on the HTML elements? Yes. Yes. Stimulus much more than turbo, but yes.
Yeah. You can see it on the very front page of the stimulus docs. So so what is stimulus versus turbo? Are you still talking about turbo? I I still wanted to cover a couple more things with turbo.
So turbo has a couple of other features. Again, if you're familiar with HTMX, these are gonna sound fairly familiar. So one other thing you could do with turbo is you can break your page up into turbo frames. And so, the different turbo frames are effectively DOM elements in your application that you can target for specific things. And, typically, what you do is you use them in conjunction with Turbo Streams, and Turbo Stream is, where you send the request back to the server with a specific header saying this is a Turbo Stream, and then the Turbo Stream responds with new turbo frames that either say delete this element or, replace the contents of this element.
Or, there are a whole bunch of different ones that you can do that that have different actions. So you, yeah, replace, update, append, prepend. You can add something before. You can add something after. You can just tell it to refresh the the turbo frame.
So these are kinda like iframes in a logical sense that they represents parts of the page that update separately, but they're not implemented, I would guess, as actual iframes. No. They're not. Rather rather, they're just DOM placeholders, I guess, that you can update the content of in various different ways. Right.
So for example, if I filled in a form and when it did the post, it sent the post as a turbo stream instead of a an an h you know, the the return header, it's saying give me a turbo stream back instead of an HTML header, or an HTML page. What you what you would get back is you could you would get back a series of turbo frames in your turbo stream, and the turbo frames might say, replace the user's name, turbo frame, with the new name and replace the user's avatar, turbo frame. Right? You put a turbo frame around that. And so you can tell it to replace all of those or update all of those.
And, you know or if you're doing you're using, turbo, turbo streams for comments, right, you have a turbo frame around your series of comments, and then when you submit the comment form, instead of making, an end run to the server and getting back a full new page with the comment added, it just sends back the HTML snippet with the comment, and it's inside of a turbo frame that says append this to the comments element or to the comments turbo frame. Now, again, obviously, I'm not really familiar with it as I've never used it, and I'm mostly learning about it listening to you right now. But it does seem on the face of it that it would be a good candidate to be to use in conjunction with the web components. I don't know if that's maybe what they're doing or not. If they're not, maybe it's something to consider because that would really create strong separation between, the various, turbo frames.
Like, for example, be thanks to the shadow DOM, it would mean that CSS from 1 would not impact the other unless, you know, you specifically want to and stuff like that. It it would create an interesting, like, clean separation between the various frames. But, again, I'm just saying this as as a thought that occurs to me off the top of my head. By the way, I don't know if just as an aside, and we won't go there, but there's been all this spruh about web components all over again. So, you know, we were due.
Yeah. We were due. Ryan Carniato, a friend of the show, wrote a scathing commentary about it, and it got all the brouhaha, started all over again. Anyway Yeah. I that kind of stuff.
I honestly I haven't looked at the code base for, turbo, so I don't know if they're using web components or not. But, yeah, you do put in a turbo frame tag, You know? And and when you respond think is yeah. Sorry. Go on.
I apologize. You respond again, you you you respond with a turbo frame tag. So That's an interesting difference from HTMX where they Carson Gross kind of intentionally did not create special elements as targets and rather made it possible to use any DOM, element as a target for for updates. Yeah. So it's an interesting distinction, between the the turbo drive philosophy and HDMX.
Yep. I believe you can work around things without the frame, but it's much it's much easier to just go with the frames. That's how it's designed to work. But, yeah, I mean, that's that's effectively the ins and outs of of turbo. And so, yeah, I I gave some examples.
I've updated menus and menu items. I've updated, you know, other thing I I mean, one one place that I've used it is I've loaded a model and so, effectively used, stimulus with turbo to update the model contents and then use stimulus to make it appear. So so, again, now can you now explain what stimulus is? Right. So stimulus is it's a model view controller approach to HTML or or to to manipulating your DOM.
And so, effectively, the way that it works is you assign a controller to a section of your code. So, you know, usually, what you'll see is you'll see a div that's placed around the area that you want your your controller to work on. And then, you can define there are a number of different elements you can use within stimulus, to to make a lot of this work. So, the kind of the big ones are, actions and targets. Mhmm.
And what what what you do is you have, date you use a data element, so data dash whatever. Right? So let's say your controller is, you want drop down menu. So you have a drop down menu controller. So your on your menu where you have the drop down menu, you would have a data dash controller attribute, and you would assign it a menu dash drop down.
Right? And so that tells it this area is all operating under a single instance of the menu drop down controller. And then and then from there, you can assign actions, and that's usually on links and buttons where if you click it, you can also put it on other elements. So so you can have it on forms. You can have them, actions on all kinds of other things.
And so what you have there is then you have a data dash action, element. And So it's kind of like it's it sounds kinda like an Angular style templating approach to doing things. But instead of creating your own templating language on top of the HTML syntax, you're just making do mostly with HTML standard data elements data Yeah. Basically. So so then the targets are effectively, you're telling the controller you need to know where this DOM element is.
Right? And so then in the action, you tell it, on a click, call this function in your controller. And the function is what? Is it JavaScript on the front end? Is it JavaScript on the front end.
Is JavaScript on the front end? So all the stimulus controllers are written in JavaScript. So it's again, I'm I'm not familiar with it, so I'm kind of guessing it sounds a little bit like in sort of angular light in in the sense. I guess I guess in some ways, you could look at it that way. I think it has I think it has more in common with Angular JS or Angular 1 than Angular 2, but it has a lot of those ideas in the sense that, yeah, you you put the the directives and the elements into into your HTML, and then Stimulus is able to pick it up when it when the page loads and it initializes.
I see that it's specifically called a modest JavaScript framework. Yeah. So for the HTML, you already have. So, basically, it's a way to add framework light on top of the static HTML you already have by sprinkling in some data attributes and adding some JavaScript business. Well, business logic, I guess, you could call it.
Yeah. Effectively. Chuck, are you familiar with Alpine JS? I have not looked into it as much as I would like. But Okay.
So, AJ, you remember when we interviewed it's been a couple years where we talked to the guy from Alpine. Js? I'm brain farting on his name right now. Starts with a c, but, it's sort of the same thing where it uses data attributes, and you just sort of sprinkle a little bit within your, HTML to add, add functionality, you know, some JavaScript functionality to your forms without having to take over the whole thing with the Vue or React or Angular, you know, template structure. Yeah.
Caleb? Was it Caleb? Yeah. Caleb Porzio? Yeah.
Yeah. Yeah. Yeah. It it's not by any means the only sort of, modest. I like the word modest JavaScript framework.
And and I wouldn't be shocked if, yeah, some of the other ones work in similar ways. But, again, it was this idea that and and Angular does this too, or I think React does it to a a a larger degree. I'm not sure where Vue fits in on the spectrum. But if you declare an Angular component to work on a particular part of the DOM, it it tends to sort of take over that part of the DOM. And stimulus in, in contrast, simply reacts to whatever the HTML is.
So the state of the stimulus controller, if you inspect the, the HTML, on the page, you can see the state of the stimulus. Yeah. So so the state, yeah, it's done before. It's been done before. Some you know, obviously, one place you put state is in in the in data, attributes.
Another place you can put state is in comments. I guess, this one. And another option is to create a JSON, embeds within the HTML, but then you kind of lose association with particular, elements on the page. The the yeah. The only the the only real downside of of doing that is effectively everything gets, serialized into strings.
Yeah. Essentially, yes. So, you you know, if it's manipulating, say, a form, you know, then yeah. I mean, it may be pulling values out of the form, or it may have value attributes on some of the on some of the elements. Right?
And and that's all done with data elements. And then like I said, you have the targets, and the targets are basically just elements that you're probably gonna wind up manipulating within your controller. From what I gather, the main motivation for stimulus is that if you just use turbo, then everything becomes a round trip to the back end. And sometimes that's just you can't do that, in terms of responsiveness or, some sophisticated types of interactions. And then you and then you do need some JavaScript on the client side for more fine grained control.
Yes. I would add that, there are some things that are strictly DOM manipulations that don't require a back end run. Like, if if you're managing data and stuff like that, and you can, make, you know, HTML calls to the back end and then, manipulate the DOM. In fact, I've seen people do essentially what Turbo does with stimulus, where, you know, they go call the back end and then they come back and they replace parts of the Yeah. But then but then why does that, and Turbo does it better.
Yeah. Exactly. So, you know, typically, those people just weren't aware that Turbo had the capability. Right? It's like, okay.
I'm gonna select an element here, and I want the next subset. You know, I select a country, and I want the states or provinces or regions to show up in the next thing. Turbo is terrific for that. Right? But let's say you you want it to that you want that element to appear as well, you know, you can use turbo to insert it into the page or you can use, stimulus to make it visible depending on which way you want to Now, again, looking at the really simple example on the stimulus website, I see that the name of the file actually specifies the name of the quote unquote component.
Of the controller. Yes. Yep. Okay. If you call it, menu dash drop down dash controller or or menu underscore drop down underscore controller, either one, then it's gonna be the menu dash drop down controller, and that's what you're gonna put in your HTML.
Okay. Cool. And rather than rely on the standard DOM events, it it mechanism, it again, it well, basically, all the frameworks are kinda going this way, but it it uses an a, a click arrow, the name of the controller, for example. So okay. Yep.
And so it has, for the different elements, if you look in the documentation, it's there. But, you can click. There's a a toggle for, like, a details element. If you have an input, you can put an input element on it. Right?
And so you you can use it to do things like like a search, you know, where you're typing in and it it does the lookup and then gives you the options that it found when it searched. Right? So it may do a run to the back end on that, as you're typing. Mhmm. That's an input event.
Submit event on a form, change event on a select. But, yeah, you you just yeah. You do the name of the event and then an arrow, and then it's, controller, what, hash number sign, and then the the method. I'm kinda curious why that you chose hash rather than, dot. I'm I'm assuming that's straight out of rails.
That's the way the rails and Ruby, specifies, hey. This is a this is a call on this method of this class. Okay. Yeah. Another way we do that.
Keyboard events. Right? So you can tell it, if you hit escape or enter or type a letter or type a number, You can you can have it react to those kinds of events as well. Interesting. I'm would you actually put any data in the controller object itself, or all the data should reside on the elements in the HTML?
So control, so stimulus doesn't really give you a good mechanism to store any of the data in the controller object itself. And so you would that's where a model or a value, data attribute comes in. And so you would actually store any of those. So most of the time, it's it's gonna be in some attribute on your, HTML anyway. But let's say that you want some specific value for, you know, kind of a a global setting within your controller, you would set that up on your dom element.
And so, often, you put those on so you have the div and then you have the data dash controller attribute. And then after that, you have the data dash, whatever the controller name is, dash value, attribute for kind of that global setting. And you can manipulate that if you would like. You can also, you know, do do all kinds of other things with it. And those values actually support a number of things.
You can have arrays, booleans, numbers, objects, which are basically JSON objects. Yeah. But the I guess screens. I guess that, really, it's it's mostly for local transient state anyway. Yes.
Like, if if you've got, like, more persistent state, that would resign. You're gonna push that to the back end. Yeah. Within the within rails, obviously. Yeah.
Or whatever else. Right? Stimulus and turbo were both completely independent rails. But, again, I assume they're mostly used in the rails community. Probably.
Yeah. Again, looking looking at the page, I'm I'm actually, I actually don't see the word rails on the stimulus, website. So so a home page, please. So so, yeah, it's it's meant to be, like you know, it might be used in conjunction with, but it's meant to be independent. And and Hotwired is like what?
The the It's kind of the wrap on the whole the overall term. Is it an actual technology or just like a moniker? From what I understand, it's just a moniker. There's nothing, that's independently part of Hotwire that's not part of Sturm, Turbo Stimulus or TurboNative. Okay.
Cool. Got it. And and you've been using it, extensively, I assume. Yeah. I've been using it quite a bit.
It's it's a really, really convenient way to write applications that you I guess, for 1, you know, you don't want the heavy handed approach that you get from, say, a React, and it's also a really convenient way to write your applications if you just want really clean and quick ways to manipulate the DOM. So in other words, this is sort of like where if you wanna have a statically generated set for the most part and just sprinkle a little bit of functionality on the top of it, then you can do that. So you get your speed and your prerendering with with minimal functionality that you need. Yep. Basically.
So and and, again, DHH calls it JavaScript sprinkles. So, and that that's the idea. Right? So you just sprinkle in what you need, where you need it. And, you know, you don't have this big app managing a whole bunch of state and other things.
Yeah. Very often when I see significant state management on the front end I mean, sometimes it's in it's in inescapable, but very often, it's just wrong. Yeah. Well, I I think in a lot of cases, what you see is you see people that basically say, hey. Look.
I've worked at 4 different companies. They all had significant state that they had to manage on the front end, or they felt like they had to manage on the front end. I'm I'm not convinced that you necessarily have to do that. But, anyway, so what they do is when they they basically adopt the same stack and use the same approaches and, you know, maybe you don't need that. Maybe you just need a tiny bit of state management or no state management, and you can find other ways to work around it.
Basically, if you if you're building dashboards, then like, sophisticated interactive dashboards, then then you you probably can't escape the need. Mhmm. Like, it's a it's it's an app that happens to be running on the web. And then you can't really get away from the need for a sophisticated, front end. Again, if you're building, like, an editor for something, also the same.
For most other things, like, if it's, for example, an ecommerce website, more often than not, you you're gonna need to do a lot of your state management on the back end anyway for persistence sake. So why not push as much as you can there and avoid doing it on both sides as much as you can. Yeah. I would also push back just a little bit on the idea of maybe an editor or a dashboard. I've I've seen plenty of that kind of a thing done with an Alpine or a a stimulus where, you know, you pull in some third party library like a Chart JS or something, and then, let it do a lot of that stuff.
And so, and then if you're building it on your own, the other thing is is you can set up how each of the elements, react to the different things you do. Right? So, you know, you can control what happens when you hover or things like that, and then effectively, you know, you use something like stimulus if you need some kind of animation or something like that. You can trigger that. And so, like, some of the some of the things I've got or that I've built.
So, again, going back to the idea of a menu with drop down, you know, submenus, you know, I I just used an, a transition, animation library, and I just called it in my stimulus controller. And so it it did a lot of that stuff. And so I I think there are ways to do this without it being onerous that you could do it without having to have kind of the full level data control stuff that that a lot of times you reach for in React app. But that said, I mean, if that's a technology you're familiar with and and you're comfortable doing it, I'm not telling you you're doing it wrong. I I but if you're trying to find a a road would be telling you that you're doing it wrong.
My my point is is that there there there are other ways to do it. And in this case, in my experience, at least, there's a lot less overhead to doing it this way as opposed to doing it the other way. Another interesting thing in this context is a lot of developers may not be aware, but HTML and CSS are getting a lot of features that make it possible to build quite sophisticated user interfaces, without a sophisticated framework. Like, if you want the pop ups, pull down menus, right click menus, etcetera, all these things which used to require fairly sophisticated coding can now be achieved fairly cleanly with HTML, CSS, and minimal JavaScript. Mhmm.
And that's especially attractive in the context of, a minimal framework like stimulus. Yeah. And that's that's kind of the approach that, that that I've been hitting. Right? So the library so, again, you know, kind of that, that transition where you bring the menu in and things.
I mean, effectively, what I'm doing is I'm using using a library that uses CSS classes and just swaps the classes out. Right? And so it you know? You should definitely be looking at, pop ups on the MDN. Read about it.
A lot of that out. Yeah. A lot of this more sophisticate so so that could provide a lot of the sophisticated user interface capabilities that you would like to to implement with minimal JavaScript, like and and it works across quite a number of browsers. I need to check compatibility with Safari, etcetera, but, overall, it's it's pretty well supported. And another one that's really interesting in this context is, the view transitions API.
Mhmm. Making it possible to create sophisticated animations when transitioning between things. Yeah. Between states. We should do an episode on those anyway.
We actually we actually did on a couple of them. We had, we we had, we had Norm Ozanthal to talk about, the view transitions, for example. Yeah. Yeah. Yeah.
You talk about stuff that's in HTML that, you know, used to require a lot of stuff. There's a my inertia site that I work on quite a bit has, you know, a bunch of date fields. And, you know, it used to be you you had your date pickers you had to import from various JavaScript. Oh, yeah. I just used an native HTML once before.
Right? You know, they're not and people will complain about them. Oh, they're pretty bare bones, and they don't do this and that. Well, yeah. I mean, I don't know how much you expect.
But, from my, you know, functionality where all I need somebody is all I need is for somebody to be able to click, select a date, get rights to do the field, and I'm off and running. It's great. And I didn't have to import any JavaScript. I mean, that's the whole thing about JavaScript performance. Right, Dan?
The the less JavaScript that you're downloading to your browser, the faster you're gonna be. So, actually, it well, it's not just about performance. It's also about, performance is one important aspect. Obviously, the less JavaScript, the better, but in that regard but it's in in general, I I'd say that anything that can be done sufficiently well without with just HTML and CSS and without JavaScript should be done just with HTML and CSS without JavaScript. Yeah.
Leveraging the platform is all you're doing. Leveraging the platform is all you're doing. Leveraging what's already there. Exactly. For example, Jake Now y'all need to go watch DHH's Rails World from a couple weeks ago, because this is this is more or less what he's preaching.
I know. I I I started watching it. There there are a few issues, but we'll get to that in a second. I just want to mention that Jake Archibald, for example, recently posted, an article in which they, talk he talks about various proposals or ideas that they have around, styling, or stylized, drop down menus that will be built into the platform. So for if you want more sophisticated, drop down menus, like, instead of just the regular unstyable select, you know, fields.
So they're working on that sort of thing. And, again, once you you've got it as part of the platform, it becomes very easy to use it from within any framework. But the thing is, if you're you if it makes the framework code minimal, you start asking yourself, well, why do what do I need the framework for? Like, if if my framework stuff is just really thin wrappers around the the platform features. Now, obviously, we're not we're not really quite there yet, obviously, before I get a lot of hate about, yeah, our our design system does a whole lot more than that.
And I get it. It's it's the same for us. But, you know, we're we're getting there belately, probably, like, 10 years too late in a lot of ways, but we're getting there. Mhmm. And and and it does make this type of approach, the the approach that you're saying that d s DHH is espousing a lot more attractive and and reasonable.
I don't necessarily agree with everything he says. For example, his stance on on bundling, it seems he's slightly backtracked. Again, I might be wrong, but off of his off of his extreme stance that you should unbundle everywhere. Now it's more about unbundling during development, which I'm totally cool with. I don't know if he's also opposed to bundling in production.
That's that's still problematic or can be problematic? And yeah. And so if if we wanna get into that so that's now now we're getting into more of the weeds of, how Rails works. Of course, it's still using, you know, an open standard that you can use in other apps. But, the way that Rails works with its, components or with its JavaScript stuff is it uses import maps.
And so, you can use a bundler for a lot of that stuff. You know, I've also seen people adopting the Vite, Ruby or Vite Rails, gems to get their stuff done. But, you you know, instead of using import maps. But import maps, the idea is is that there's there's no build step. And so you the I mean, that's that's the big feature that he's touting is that you don't you don't have to go and learn Vite.
You don't have to go learn, Webpack. You don't have to go learn whatever the the the next, bundler is. Effectively, you put your files into the import map, and then, you know, you can tell it to preload the ones that you need preloaded, and then you're you're good to go and off to the races. And, I mean, the approach has worked fairly well in in every app that I've used, but but, yeah, you know, you get this list of and if you're using Stimulus, you you basically have an import map entry for every single one of your controllers. But, again, it it's it's worked fine on anything that I've worked on in production.
Well, to do a little bit of pedantic devil's advocate here, Veed is pretty one of the things about Veed is that it's pretty plug and play. I mean, you come in, you said a couple things. It ain't webpack. You know, that's the thing about webpack is the config files. You know, the Vite is pretty plug and play.
Yeah. I've done Vite on a couple of Rails apps, and I think you have to put in a config file, but it's I I mean, you can use the default one. You can use Deepgram 1, and it works Right. Pretty much out of the box. Yep.
Look. We've had people on our on on the show in the past, talking about, you know, like, bundling the consequences or not. So, obviously, getting rid of of a build step, if you can achieve it, is is great. It's obviously totally undoable if you're using a front end framework like React or any other or most of the frame front end frameworks that require some sort of a build slash compilation step. It also means getting rid of TypeScript unless you're using JSDoc.
So so that's also a significant consequence. Like, you know, I think we we may have spoken about it with Gil Tayal. I think about the fact that, you know, if you're doing front end, you're going to be using any of the major frameworks, then you're gonna have a build step Yeah. Regardless, and then you might as well just do every all the stuff that, you know, leverage all the benefits that it can provide if you're gonna have to have it anyway. I get that DHH really wants to avoid it.
And if you can, that's definitely an advantage, but it's advantage that comes at a price. For example, DHH doesn't use TypeScript. He doesn't want to use TypeScript. Nope. He doesn't.
In fact, I have some words to eat on that. So last time when we talked to oh, what's his name? Now I'm drawing a blank. Last week, it was it was Dan. It was you and I.
Tomel Cabell. Yeah. So I I said, I I don't know if he's directly opposed to static types. I went and watched some of the talks from Rails World. He is definitely not on board with static types.
So I I will eat those words, because I I said I didn't know, but it turns out that yeah. Absolutely. He yeah. He was talking to, Toby from Shopify, CEO of Shopify, and, Mats, the guy who created Ruby. And, they asked him, so if you 2 could swap places, what would you do?
And David said no static types ever I I wanna hear the argument for dynamic types because that I don't get it. The argue look. First first of all, you know, if if you're coming from from a dynamic inherently dynamic language like Ruby or like JavaScript or like Python, then, you know, there's a certain reason you picked that language. There's a certain reason, like, the h ages, you know, loves working in Ruby, and and and the and Ruby is inherently dynamically typed. So what I meant was loose types.
I I like dynamic types. I don't like loose types. I'm not sure what you mean. What Yeah. Mean.
So dynamic typing, meaning the types are assigned at runtime. Strict typing, meaning that types don't change. Once something's a number, it's a number. So if you like, TypeScript is strict typing. The types are still dynamic, but they're well, I guess they're not as dynamic as Go.
Like, Go has dynamic typing. TypeScript is probably less dynamic than Go, but JavaScript is generally I'm not totally following I'm look. TypeScript basically is a layer above JavaScript that gets totally stripped at at build slash compile time. Right. As, you know, we discussed it with Thomas last week.
If if our listeners are interested in more details about it. But but, basically, TypeScript enforces types at development slash build time. Once you it has zero impact on the actual generated code. And in this regard, it's different from Go or from Java Well where where the where the types that you specify actually impacted the type of code that gets generated. If That's not entirely true, though, because if you once you declare an object in JavaScript, if you never delete and you never add an inconsistent property to it, it is optimized as that struct type.
Yeah. There's a lot of optimizations going on. The optimizations are pretty much dependent on the JavaScript engine figuring out that something has a certain type and then optimizing according to that type. But there's nothing in the language preventing you from doing something else, in in so it's it's kind of the it's kind of like an AI like approach of the runtime inferring that something will always be an int, and therefore, we can put it, in in an int type, you know, register, whatever, or or memory address. But, I'll give an I'll give an example.
Okay? In a language like, c plus plus, you've got overloading, which means that you can specify the same function, 2 2, like, implementations of the same function based on the type of argument on the that it receives. So you can have a function called add, which takes two numbers and returns the sum of the numbers, and you can have a function called add, which takes 2 strings and returns the strings concatenated, and the internal implementation would be different. There would be 2 different functions that are the the difference between them is just the types of their arguments. That's not something you can do with JavaScript.
And because TypeScript is just like a a build layer on top of JavaScript, that's not not something you can do in TypeScript either. You you understand what I'm trying to say? Yeah. I think My question was what why is it why would it be valuable? In what case would you want something that was a number to now be a string or something that was a string to now be a number?
Why would you want to be inconsistent in the way that you handle your objects? Oh, I don't think any anybody wants to be inconsistent in the way that they handle their objects. What they want is not to have to think about, about not have to explicitly specify types at development time. Anybody who's you know, once you have to specify types at development time, sooner or later, you're gonna have to do generics, and that's just hard. And if you if you can be more fast and loose with types and rely on duck typing and and and stuff stuff like that.
You don't need to deal with inner with explicit interfaces. There's a lot of of beauty in that. The world I love. Yes. And that's the way Zig is, by the way.
Zig is all duck typed. So it's it's interesting too. And, I I know we've kind of gone off on a tangent, but I I don't know that I have a whole lot more to present on stimulus and turbo anyway. But I guess the other piece of this is is, knowing the the Ruby community in particular the way that I do, if there was an implementation that gave people some level of benefit the way that people see benefit from TypeScript, whether it's perceived or real, I think people would adopt it. But the the implementations that have come out and the way that they've approached it, it just it it just feels like busy work that you're adding to the system.
Look. The other thing though is that If I can just interject on that for a second because from my experience, TypeScript is is the value of TypeScript increases as your code size increases, even not linearly, like exponentially or or at least polynomially. So if your code base size is small, which is kind of the goal with the things that we that we've been talking about today with Turbo Drive, with Stimulus, you want to keep your JavaScript kinda minimal, then, indeed, there's relatively little value or benefit in using, TypeScript. And Yeah. And and that's that's essentially it.
I'm currently seeing a lot of value with TypeScript. I'm I'm putting TypeScript into some large legacy systems at, the place where I'm I'm working at Sisense, systems that were built several years ago in just straight on JavaScript. And I'm finding a lot of bugs of of, you know, people using the wrong field on the wrong object. And, you know, and, obviously, the system worked. You know, JavaScript is really forgiving.
You read the wrong thing, you get back undefined. It doesn't crash. You know, that that's both good and bad. It it you know, they they had tests in place, so so things pass test. But, definitely, there were bugs in the code.
Like I'm saying that the the biggest challenge for me in adding TypeScript into this code base is dealing with all the bugs that get uncovered. Yeah. One one thing that, I was just gonna point out because you you you started out saying, hey. With a larger code base, does it make sense? And that's effectively so Toby Toby Lutke, he's the CEO of Shopify.
Right? He he was one of the initial developers. It's all written in rails. They created a type system called Sorbet, and they use it in all of their code. And when DHH spoke up and said, hey.
You know, don't ever add static types. Toby pointed out, yeah. I can see where you're coming from. And in a lot of cases, you don't need it. But at Shopify, we have to have it.
I I'm not Their code base is gigantic. So I think the yeah. It it seems like the the way that everybody would be happy is if we had strong dynamic types. If we had types where once you define an object, if you have a typo somewhere later in the code, that should surface. Again, that's you're talking about safety at runtime.
I'm I'm talking all safety is a dev time. There's no such thing as safety at runtime except for, like, null checks and Java and You're talking about doing you're talking about doing static analysis on the code to try to figure out that you're not reassigning a different type value to the same variable. Like Yeah. That which is what yeah. Well TypeScript checker can help with that if you enable if you just enable it in a JavaScript project.
It's not perfect yet, but it's pretty good. And if you wanna add something intentionally, if you want to create a polymorphic object, you use object dot assign. Yeah. Which basically type that does does something called type inference, which basically means it figures out the type of a variable based on, let's say, the initial assignment. And then if you assign something that's incompatible with that type inference, it will complain.
Yeah. This is good. This is like I this seems like the happy medium. Everybody should hopefully be able to be on board with with that. Like, we shouldn't we want to prevent mistakes.
We don't wanna add boilerplate and overhead. We wanna prevent mistakes. And that's what strong dynamic typing duct type strong dynamic duct typing types are. I I will add that especially when you're developing APIs, whether it be for, like, you're building a library or you're just working on a complex systems that has APIs between different parts of it, and I'm talking about encode APIs, like function calls, not or, or interfaces, not over the wire APIs, then, having static typing strong typing on that that enables the, system, the even the editor to help you along and make sure that you're passing in the correct parameters and that you're getting back the correct value is is valuable from my experience. Alright.
I'm gonna push this to PIX. Don't we have anything else just to to say in the context of turbo and stimulus? I think we've covered, the basics. I mean, there are some other things that you can get into. We didn't talk about, like, outlets for, stimulus, which is effectively how you call methods on one controller instance from another controller instance.
Yeah. Those are getting in the weeds. You're getting way into the weeds. But, I mean, it you know, it like I said, it's it's been able to do everything I need. So I I have read I have read somewhere that, that turbo drive is also able to leverage WebSockets?
Yes. Turbo drive can and so can stimulus. There's actually a library that was written by some friends of mine that live here in Utah, called, Stimulus Reflex. There's also a stimulus has cable in the name somewhere that specifically works with action cable in Rails. But, yeah, I I I believe both of them work fine with WebSockets.
I know turbo does. K. Cool. I guess that's if you're really streaming a lot of data back and forth Mhmm. It makes, life, easier that way.
Yep. Okay. Alright. Well, let's let's get to picks. Dan, why don't you why don't we start with you?
Put me on the spot. So last so I've got 2 picks. First of all, last week, my pick was the vacation that we had in in Italy, and it occurred to me, that the way that we tour places has really changed over the years. Like, now when I plan I like to be planned in my trip because, unfortunately, we can't take really long trips, which means that we kinda need to be efficient. For example, we move, hotels almost every night because we we get to some place.
You know, we do it without the kids, so it's easier. And we just get to somewhere, and we don't want to need to drive back at the end, so we just keep on driving forward all the time. But it does mean that we change hotels almost every day or 2. And, so a couple of things. First of all, with with, you know, with things like, booking.com or or Airbnb or what or, you know, all the other various services, it's really easy to, you know, find interesting hotels, book your trip in advance.
You don't need to think about getting somewhere and starting to look, which might be an interesting experience if you're there for a week, but not really efficient if you're only there for a night. The other way in which technology has kind of shifted the way that we're touring. So, obviously, everybody now uses, GPS while driving, and it makes driving a lot less stressful. I still I'm old enough to remember the days of using maps. And the biggest challenge was that if you strayed from your plan, then you were really worried about how you you might find your way back.
And now with GPS, it's, you know, it's no concern. You don't have to worry about it. You make a wrong turn, it'll get you back on the on your route. But the interesting thing is that now we do the same thing when we walk around. So what I I like to do again when I know that we'll be in a certain place for a limited amount of time, then I like to kind of check-in advance what are the sites that we wanna see, the places we wanna go.
And I do kind of a traveling salesman optimization of of find finding a good route that goes to all these points, a walking route. And I just have the phone in my pocket with the Google map and in in walking mode, and it just tells me, you know, turn right here, turn left there, and I can just walk around and see the sites and not look like a tourist holding the map, trying to figure out which way is up, and, and, you know, where where do I need to go and and and and whatnot. It just makes It's almost like having this kind of a virtual tour guide, and it's it's actually once you get used to it, it's a great way to turn this to tour a place, especially, again, if you've got a more limited amount of time. Because, again, if you've got a lot of time, just wander around and and experience the sights and sounds and smells and what have not and what have you. But but, again, if you've more limited for time, it's I found it to be a really efficient way of touring places.
So that would be my kind of nontechnical pick. My technical pick is a funny kind of joke library that I ran into. It's called let me quickly find it. Steve, you taking notes? Absolutely.
It's called Did you notice me perk up right there? It's called, set big time out. Turns out that, set time out is limited to about almost 25 days because it, the time out duration is specified in milliseconds, and it only uses 32 bit values for that. So that turns out to be something like 24.9 days. And what happens if you want us to set time out for 40 days or 60 days or half a year or something like that?
You can't use set time out for that. So now you've got set big time out, which can even take big ints, and you can specify really lengthy durations for your set time outs if you need it. Sounds really useful for to me. I'm obviously being sarcastic, but it's kind of a joke. Libraries presented as such.
What they what it does, it actually creates a series of set timeouts. So, obviously, that's not very accurate, but it's it's amusing. Let's put it this way. So that would be my my second pick, and those are my picks for today. Awesome.
Alright. Steve, what are your picks? Before we get to the high point of the episode, I do have one sort of legit pick, and I touched on it earlier in the episode. I think, Inertia JS, their, version 2 is out in beta. And, so I'll put a link here to the upgrade guide for version 2.0, and it's got some pretty cool stuff.
It's, pulling, prefetching, deferred props, which is sort of like props that don't load right away. You can say, hey. Defer this till the page loads. Some infinite scrolling capabilities and so on. So I'll put the link in the, in the guide in the show notes.
It's, b2.inertiajs.com. I first heard about it, I think, on Laravel podcast or seen it coming from the Laravel world. So but if you just do some quick googling, you'll see all kinds of info. Now, for the dad jokes of the week, let's see. So question, did you hear about the guy who got a 100% discount on his plastic surgery?
Look on his face was priceless. Nice. Oh, it's wrong now. Sorry. There we go.
Alright. So what do you call a Spanish guy being discharged from the hospital? Manuel? Although, technically, yeah, just don't stretch that too far. And then, finally, I had a conversation.
I was having a conversation with my wife the other day, and I said, hey. I know you're busy, but can you say wonton backwards? She said, not now. I said, that's right. Alright.
AJ's laughing. AJ, what are your picks? For the 15th time, I have to pick the fall guy yet again. I got the 4 k Blu ray with the extended cut, and I wanna read one of the negative reviews. Chris Paladino says, one of the dumbest movies in a long time.
Agreed. Writing was terrible. Agreed. Tried to be cute and referential, but was hack and cliche. Agreed.
Plot makes zero sense. Agreed. All over. They mainly just blow a bunch of things up and have over the top unrealistic action sequences. Nonstop.
Yes. It's an excellent movie. I don't know how this person will eat. Like, this, we agree on it, and he only gave it 2 stars. No.
It is an action romance comedy, which is kind of, I don't know how many movies I can say have pulled off all three things well, but I think this one does great. The plot doesn't make any sense. But I don't know. When's the last time you watched a James Bond movie? Does the plot make any sense in that?
I mean, when is the last time you watched a movie where the plot makes sense? This one, you know, it's there's no nuance to the to the, you know, the the good guy, bad guy thing. You know? It it's very it's there's it's just, like, the the person who has evil motives has straight evil motives. The person who has good motives has straight good mode.
You know? Whatever. But it's just fun. It is it is, my wife loved it. You know, I walk away and said one of the positive reviews basically said this.
I walk away and I'm like, man, that was such a fun and funny action movie. And my wife walks away with, that was such a fun and funny romance movie. And I don't know how, like, you know, she and I talked about it the very first time. And our like, we're like, did we watch the same movie? Because and she's like, oh, the dialogue between her and him was so sweet.
And I'm like, no. The part where he's jumping over dumpsters and, like, got the 4 by 4 going over the ridge. You know, like anyway. So I just I I totally agree. It's a it's a stupid, dumb movie, but it's it's just so good.
It's so good. So, the one thing that I will say about the 4 k movie is the extended cut is not on the plain Blu ray. The extended cut is only on the 4 k. So I but I I have one of those, defective, Blu ray players that happens to accidentally read 4 k. It's the LG.
Let's see what's and you can still get these on Amazon, and you can downgrade the firmware. It's the LG WH16 NS40. So it's, it's it accidentally reads 4 k disks, and then they patch it in the firmware that ships currently. But you can downgrade the firmware, and then you can just read 4 k disks without any problem whatsoever on it. I can't tell you the last time that I actually held a disk in my hand or a memory key.
You know, that's fine. I it it's it's for people that want to have movies next year as well. You know? It's because all these movies are gonna get pulled from all the services, and we've already had that happen a few times. You know, Disney has done the vault thing a few times, whatever.
But, obviously, the digital movies are not going to stick around already. What was what was the service used to be called? Ultraviolet that went down? Like, the entire service went down? Everybody had a collection there.
Owning the concept of owning your media. That's really strange. Right. Yeah. But it I I I I run Plex and and all of the best movies we have, the Super Mario movie, all that, it's all on Plex.
So, anyway, other thing that I was Before you move on, AJ, did you ever see the TV show, the original TV show, the fall guy? I watched one of the episodes, and I it does not seem to be in any way related to this movie. No. It's not related to So for what it's worth, 2 of the the main characters had cameos in your movie. Yeah.
Yeah. I know one at the end. Like, one, I could tell by the camera angle and the guy's smile. I could tell, like, okay. This is a reference to something.
I just don't get it. And then I found out that it was it was Lee Majors. Right. And then Heather Thomas was also in the original TV show. Yeah.
She made a cameo as well. For any of you who are too young to remember Lee Majors, he was probably more more well known as the $6,000,000 man. Mhmm. Yeah. That that's really funny because these days, you can't buy anything with just $6,000,000.
Yeah. No. You know, if if if they were to do that show again, it would have to be, like, the 6 $1,000,000,000,000 man. There you go. Right.
Yeah. This this Blu ray player was About $6,000,000,000. Yeah. Anyway, the other thing the other thing I was gonna pick is, passkeys. So WebAuthn has had a very sad history, and there's a lot of backwards compatibility that people try to keep that makes it really complicated.
And over some work that I've done, I have I have found that if you just focus on the pass keys aspect, the the the baseline stuff that works everywhere, basically, it's just a fancy replacement for a password manager, and and not you know, there's there's not really any extra security than that. Because, essentially, trusted platform computing, I I think they were thinking it was gonna take off when they made the WebAuthn spec, and then, you know, reality of physics and the physical world we live in hit. And we know that, like, that just can't happen. It's physically not possible. But, anyway, so if you just focus on the baseline passkeys, you can have a really good experience.
And I I got a demo up on passkeys.js.org. And then third thing, not a pick, just a question. If anybody has experienced vertigo for multiple days in a row, please comment or tweet at me with what the what if you've had success with some sort of solution, let me know because I am now on 4 days straight of 247 feeling dizzy. I don't know why. And I cannot find a remedy to it, and it's making life, difficult as you can imagine if you felt dizzy 4 days a day.
I would check if you don't have some problem in your ear canal or something. Yeah. That's that's, I I'm I'm I yeah. I'm go I'm gonna go I'm gonna go, see someone about doing the Eppley maneuver, which is supposed to if the crystal gets dislodged, supposed to, like, you move your head in certain ways and you get the fluid back. But, yeah, I'm I'm 4 days into a I don't know why I'm feeling like I I basically, I feel like I have the flu, but only in the sense of dizziness and disorientation.
You you might want to see an ear doctor or something. Maybe you've got some sort of inflammation or something. I don't know. Yeah. But it's it's yeah.
I'm gonna, I'm gonna try a few things and then, and then take that route if I can find someone who'll get me in this week. Yeah. Because, yeah, it's it's very it's very frustrating, and I'm having a hard time focusing because the world feels swimmy. Yeah. With my mom, it's it's interesting you're talking about this because it was literally this weekend my mom had similar issues, and it got so bad that they went to the emergency room.
But, apparently, hers gets aggravated if she lays on one side versus the other when she's sleeping, and, I don't know that they they gave her anything that would help. Yeah. Probably, she creates a vacuum or something in in one ear, and and that causes a problem or something. Yep. I wonder I wonder if maybe it wasn't when I I was riding my motorcycle without earplugs the other day.
I don't think that was it, though. I because sometimes I just could do a short ride without earplugs because it's just nice to feel the full sensation and everything. But, usually, I have earplugs. And some well, then sometimes when I take the earplugs out, I kinda pop them, you know, because they they, you know, they're jammed in there with the ear wax and everything. You pull them out, and they're like, and I try to twist them so it's not so dramatic.
But I don't know. Maybe it was one of those things. But it it I can't pinpoint when it started happening. It just I think it was Thursday night or Friday morning, I just noticed I was a little dizzy. And then I thought, oh, whatever.
It'll go away, and then it hasn't. Oh, I I, sorry to interrupt after I finished my picks, but I just saw a really amusing headline. I just remembered that I saw it. Can you guess what the total global debt is in the world in dollars? I mean, I guess, 150,000,000,000,000.
317,000,000,000,000. That's more than the GDPs of all the nations combined, isn't it? I just, I don't know, but I would guess so. That's good. That's a good place to be.
Yeah. We're not headed for economic collapse. This is fine. Yeah. It says it says, as of 2022, the global GDP amounted to over a 100,000,000,000,000.
So Oh, good. So we're only over the yeah. 2 times. How is that possible? I mean Three times.
There that's a that's Because we we don't we don't we don't need to print the money anymore. It used to be gold, then it used to be printed money. Now it's just digits in a computer. Right. Alright.
I'm gonna go ahead and throw in some pics. I'm also when I'm done with this call, I'm gonna go downstairs and tell my kids that dad feels dizzy and that they need to be quiet and leave me alone for a little. I'm just gonna lay here on the couch and quietly watch a show. You all need to leave. Anyway, Yeah.
So picks, games, my things have been kinda nuts. In lieu of a game pick, I'm just gonna put out there, so my latest contract, they unexpectedly lost a customer, one of their bigger customers, and so then they unexpectedly let all of their contractors go. Mhmm. So if you are looking for somebody who can, help you with I'm I'm into the stimulus turbo stuff or rails if you're if you have a rail system. Obviously, I'm qualified on that.
I'm also getting into, AI, like, chat chatbot agent stuff. And so if you're looking at that, let me know. I'm yeah. And then I think I'm just gonna do the the other stuff, like, my stuff picks instead of whatever else stuff picks. So javascript, javascript geniuses.com.
What I'm looking to do is put together a group of people who are interested in kind of pushing each other to stay current and learn new things and stuff like that in the JavaScript space. And so if you if you go there, I'm running, it it's the same deal I've had, and I'm gonna keep it up until Black Friday. It's $39 a month. There's also yearly and lifetime options. If you wanna join the group, we have weekly calls.
We do accountability calls on Monday Friday. Monday is here's what I'm gonna do. Friday is what you did, and then, you know, we as a group will help you stay on top of and accountable on the stuff that's gonna get you where you wanna go. And and it could it could be, I just wanna learn more JavaScript stuff or get better react. Some of or it could be, I wanna speak at more conferences or write a book or start a podcast or whatever, related to JavaScript, all comers welcome.
Also includes the book club, and I'm gonna be putting out videos on how to do stuff. I'm probably gonna start with Remix, on the JavaScript series. So if you're interested in any of that stuff, you're definitely welcome to join in. I'm also doing it for Ruby, and I'm eventually gonna start one for AI. The other one is with the AI stuff that I am picking up, I'm gonna be doing an AI boot camp next year.
It's gonna start in January. So if you're interested, I I will have a website up for that here within the next day or so so you can go, sign up or jump on a call with me, and we can discuss whether or not it's a good fit for you. Because, honestly, I want everybody who goes through the boot camp to come out of it and go, I'm I'm set up to do this, and, you know, I know what the next steps are to, you know, either go find work or add this to what I'm doing at work, with it. So, if I don't think you're gonna get that out of it, I won't sell it to you. So, anyway, yeah, that that's that's pretty much the stuff I've got going on.
As far as movies go, dumb movies, I'll just throw the this one in. So and I don't know what possessed me to do it, but I started watching the Transformers movies, like, starting with movies. That's that's that's less than dumb. That's less than dumb. It's like negative IQ stuff, man.
Yeah. There no. It makes total sense that Canadian culture would build a robot that looks like a Dune buggy. No. No.
They're they're anyway. No. It's just they they they ruined it with the, like, the soft core and all that and the Romeo and Juliet laws, the pedo stuff. Like, it's so cool. Anyway, it's it's nice mindless entertainment.
So, anyway, I've watched the first three. I'll probably get around to watching the rest of them. But anyway, those are my picks. I made AJ cry. Yeah.
Okay. I so I'm gonna pick, that you get yourself on the pirate bay and hit up the original transformers. The one where the transformers are actually the good guys rather than just anti heroes that are not that are a different set of bad than the bad guys. What's the original transformers? The original the first movie.
Cartoons? The cartoons. Yeah. The cartoons. It's like it's like Captain Planet, GI Joe, Ninja Turtles.
The cartoons when I was a kid. Yeah. I I like well, the car in the cartoons, the transformers are actually good guys. In the movies, they're antiheroes. There's, like, Optimus Prime is mostly good, but the other ones are literally just gangsters.
Okay. I'm laughing. It's like blood versus Chris. Okay. I don't care.
Yeah. Anyway, let's just go ahead and wrap it up. Oh. If if you all wanna reach out to me about, stimulus or turbo or anything else related to that, I am totally open to that. Twitter, c maxw.
You can email me chuck@topendevs.com. And, Yeah. Till next time, Max out. Adios. Bye.