Turbo Laravel with Tony Messias

Tony Messias (a programmer at Tighten) joins us this week to talk all about Hotwire & Turbo Laravel - what it is, why he thinks it's interesting, how it works, and more.

Transcript

Dave Hicking:
Welcome to Twenty Percent Time, a podcast from the team at Tighten, a web development consultancy that specializes in Laravel, Vue.js, React, sometimes Livewire and a whole lot more. My name is Dave Hicking and I'm here with my amazing co-host Zuzana. Zuzana, how are you doing today?

Zuzana Kunckova:
Oh all right, how are you doing Dave?

Dave Hicking:
I'm doing wonderful. It is a Friday afternoon, which is typical for Twenty Percent Time. If this is your first time listening, we call it that because that's the day that Tighten devotes to open source work, learning new things, trying to give back to community, trying to do interesting stuff. And that's kind of why we're here today. We're joined today by the one and only Tony Messias, who is a staff programmer at Tighten. Tony, how are you?

Tony Messias:
I'm good. Thanks for having me.

Dave Hicking:
Of course Tony, I've been trying to get you on this show for a long time. First of all, Tony's incredible, Tony, for folks who don't know you, where can they find you online?

Tony Messias:
Mostly on Twitter.

Dave Hicking:
Okay.

Tony Messias:
My handle is tonysmdev, I think

Dave Hicking:
We can put a link in the show note so people can see it. But yeah, Tony is a wonderful programmer, he is a wonderful teacher and learner as well, but he also... We were talking about giving back to open source community, tony has some interesting open source stuff that he has been working on. And that's why we have Tony on the show today, we're going to talk to him about Turbo Laravel, which is super interesting. I feel like enough people aren't talking about it. That's why we wanted to have Tony on the show today. But before we do that, Tony, I want to start with an icebreaker question. Since this is your first time on the show and obviously we all know each other here, but let's just get it started with this. What is the most interesting thing you've worked on or done recently? Doesn't have to be tighten it could be anywhere. Just what's the most interesting thing you've done recently?

Zuzana Kunckova:
Way to put him on a spot Dave.

Dave Hicking:
I'm sorry.

Tony Messias:
Yeah. I was totally on unprepared for... So I have to say, the import map stuff. So I have other packages besides Turbo Laravel and I've been spending some time with them lately. And the import map Laravel package, that's very interesting work um so..yeah I'm gonna go with that.

Dave Hicking:
And so for those who don't know, what does the import map package do?

Tony Messias:
Yeah, so-

Dave Hicking:
This just became a different podcast, apparently.

Zuzana Kunckova:
Yeah.

Tony Messias:
So the idea of the package is, it's a replacement for Webpack and Vite and all the JavaScript bundling. So you don't need any of that. You can write JavaScript and ship that same JavaScript that you wrote directly to the browser and using ECMAscripts modules to import stuff. And then you can configure where these modules come from. And that's the idea. So we don't need Node to run PHP applications using modern JavaScript stuff.

Zuzana Kunckova:
Oh, interesting.

Dave Hicking:
Tony, we might need to have you back to talk about that. We might need a Tighten talk or something about that, that sounds interesting.

Zuzana Kunckova:
Yeah.

Tony Messias:
Yeah. Sure.

Dave Hicking:
All right. So Turbo Laravel, I'm going to make sure... Hopefully I got this right. I'm the least technical person on this podcast today, so you all please keep me honest.

Zuzana Kunckova:
No, you're not.

Dave Hicking:
Turbo Laravel is a package, as I understand it, that lets devs get the most out of Hotwire, which is this open source tool that Basecamp built and Turbo Laravel itself is kind of inspired by a ruby gem. And parts of it are kind of an evolution of Turbolinks. So that's a lot to unpack. So let's start with Hotwire, for someone who doesn't know what Hotwire is, what is it? And this is my favorite phrase at Tighten, what problem is it trying to solve? What's the reason to use Hotwire?

Tony Messias:
So Hotwire is not actually tool, it's not something that you can use. Hotwire is more like an umbrella term for an approach to building multi-platform applications, driven via web application. It's a combination of some tools and libraries and techniques that allows you to build a web app and also bought that web app to other platforms like mobile apps and desktop applications and stuff like that. So that's the pitch for it I guess.

Dave Hicking:
That's the big umbrella pitch for Hotwire at least.

Tony Messias:
Yeah. Maybe it's easier if you compare that with something else, right?

Zuzana Kunckova:
Well...

Tony Messias:
Go ahead.

Zuzana Kunckova:
I was going to ask, what is it about Hotwire that made you want to... So I assume you worked with it, so what is it about that made it interesting for you?

Tony Messias:
I think this multi-platform aspect of building an application and serving that to different clients. That's when it all got my attention, actually. Because as Dave mentioned in his question, Hotwire is an evolution of Turbolinks. I've known Turbolinks for a while and to me it always sounded like something that would create more problems than it would solve, because basically what Turbolinks did was you get a traditional server side application, no JavaScript navigation or anything like that. Every time you click on a link to your application, the default behavior of the browser is send a request to the server and get the response and do a full page refresh, right?

Zuzana Kunckova:
Yeah.

Tony Messias:
What Turbolinks did was, it hijacked your links, hence Turbolinks and turned that into an Ajax request and sent that to the server via JavaScript and got the response and just replaced the body. That's the whole idea of Turbolinks. Turbo, which is one of the tools in the Hotwire umbrella is basically an evolution of that. So this idea of building multi-platforms applications driven by web apps, its really what made me interested in Hotwire. And one thing I want to say is Turbolinks didn't actually click for me until I watched Sam Stephenson's talk about... I think the talk is on YouTube, it's called Turbolinks, I can't believe it's not native.
That thing sold me to Turbolinks and stuff. So I started studying Turbolinks at that time, there was no Hotwire when I started studying it, and when Hotwire came live, it was an evolution of the things that I was already studying, so I felt right at home.

Zuzana Kunckova:
So what happened to Turbolinks then? You said Turbo is evolution of them. So I think the package is no longer maintained, is that right?

Tony Messias:
Yeah. Well Turbo kind of replaces Turbolinks. So it works pretty much the same way, but there's a few more things than Turbolinks used to do. So it's a replacement pretty much. The old one still works, but if you want the new stuff, got to switch to Turbo JS.

Zuzana Kunckova:
Okay.

Dave Hicking:
So this is kind of a side note before we get into more, so one thing that I know from working with you and following you on Twitter, which everybody should do as you already mentioned, because you're super interesting on Twitter, is that you keep your eye on what's happening elsewhere in programming, obviously. A lot of these tools that you're talking about, I know you especially keep your eye on the Ruby world and what's happening over there to see what's happening, to see frankly, if there's anything that the Laravel world could make use of. Is that something that you have always done as a dev? And I guess the sort of follow up question is, do you wish more folks were doing that too, to bring over interesting things from other platforms?

Tony Messias:
It's definitely something that I've always been doing. But to be honest, I don't know if anyone should do the same thing or not.

Dave Hicking:
Because it's your thing?

Tony Messias:
It's something-

Dave Hicking:
Just kidding.

Tony Messias:
It's something that I do because I enjoy. So people might enjoy different things.

Zuzana Kunckova:
I was going to ask, so because you keep an eye on the Ruby world, would you call yourself a Ruby developer as well? Or is it...

Tony Messias:
That's interesting. I know enough Ruby on Rails to be dangerous. That's how I say it. But I haven't actually written any Rails program for production or anything like that for our clients. I've only done bad projects and I can run and de-bug Rails applications and Ruby jams and stuff like that. But my knowledge there is actually kind of limited. I have the same thing with Elixir and Phoenix, because I keep an eye on that as well and some other communities. So it's like, I can run, I can understand some of the things that's happening there. And I try to bring some of the good stuff that I spot to the Laravel world basically.

Dave Hicking:
Yeah. I was going to say, because if other of communities are... We're all trying to solve similar problems, and so if other communities are coming up with cool ideas, why reinvent the wheel? Why struggle? Because I'm sure that there are... Laravel is wonderful, we use it every freaking day here at Tighten all the time, but there are always ways that it's growing and getting better. And I'm sure there are times where you're like, I want to do this thing, I want to pull this thing, I want this sort of pattern or I want this feature and it's like, well they've got it, how do we get it? I'm sure that's part of it.

Tony Messias:
Yeah, that actually happened a lot. I was giving an internal presentation at Tighten and I remember, one of the lines that I had was, I built Turbo Laravel because it was cool to see that happening in Rail, so I wanted to use it, so I wrote it, in PHP in Laravel.

Zuzana Kunckova:
Because why not? It's cool, It's good. Do you think your knowledge of Ruby was important for you to be able to build it in Laravel or would it be possible for you to just know about a feature and then make it up as you go along?

Tony Messias:
That's interesting, I haven't thought about that. When I first wrote the lib... By the way, let's go back to when they released it. It was 2020 or something, somewhere around that. And it was right on the week of Christmas. I'm not sure if it was on Christmas day or the day before that. And on the next day I had a proof of concept for the library already.

Dave Hicking:
You know, why not?

Tony Messias:
And I only tried to reproduce what I saw from DHH's video, where he was demoing Hotwire and stuff. But I actually rewrote this lib two or three times before the first release of it.

Dave Hicking:
Wow.

Tony Messias:
Because when I started reading the source code for the Turbo Rails gem, I noticed some things that they were doing were different than what I had. So I wanted to keep that in parity as much as I could. Actually, it's a bit fun for me. I tried to mimic the same code in PHP and Ruby. So if you open one of my libs, most of them are ports of Rail gems. So if you open one of my libs and go to a random class, chances are that this class actually exists in the Ruby gem and it's probably named the same. And there are the same methods with the same naming and signature.

Zuzana Kunckova:
Its really good, because then you don't have to worry about naming things, you don't have to worry about the names, you just take what they did.

Tony Messias:
It's also challenging because some of this stuff that exists in Ruby, the language doesn't exist in PHP. So it's like, now I have to work around this or something.

Dave Hicking:
Okay, so Turbo Laravel supports... I want to make sure I get... So Tony correct me if I'm wrong, but there's like four aspects, there's Turbo Drive, Turbo Frames, Turbo Streams and Turbo Native. Is that all right?

Tony Messias:
Yeah.

Dave Hicking:
Can you-

Tony Messias:
Before we-

Dave Hicking:
Yeah, go ahead.

Tony Messias:
...talk about this, maybe it's easy to talk about Hotwire as an umbrella term for this approach. And under the Hotwire umbrella, we have Turbo JS and we have Stimulus JS, which is front end framework. And we have Strata, which is a library that's going to bridge the mobile and web world a little bit. It's going to make that work easier, but we don't know much about it because it wasn't released yet. We only know what folks talk about on Twitter and on GitHub issues and stuff like that. So it's very little. And these things that you mentioned, they are under the Turbo lib. So in Turbo we have Turbo Drive, which is the successor of Turbolinks, it's the direct successor of that. It does pretty much what Turbolinks did, but remember that I mentioned that Turbolinks only worked with links?

Dave Hicking:
Yeah.

Tony Messias:
Therefore the name was Turbolinks?

Dave Hicking:
Two links-

Tony Messias:
Turbo Drive actually works with forms as well. So that's why it would be weird for them to call it Turbolinks, since it works with both forms and links.

Dave Hicking:
Okay.

Tony Messias:
So Turbo Drive, once you install Turbo JS on your application, Tubo Drive hijacks.... It's one step process, that Tubo process starts in the browser. It will hijack in any links and forms of emissions and will turn that into Ajax request and do the full body replacement instead of a page refresh entirely. On its own that gives you some performance, I should say perceived performance, because there is no actual performance on the server, benefit from this. But the users feel the application faster, because all of a sudden you don't have to download the assets again, you don't have to repaint the page again, it just swaps the body and merge the head, that's the idea. So they feel the application faster, even though it's actually the same speed over the wire. So you get that out of the box when you install Turbo and that's okay, that gets you maybe 60% benefits, let's put it like that.
But very soon you get into a situation where you want to replace just a small portion of the page, not the entire body. And that's where Turbo Frames come in.

Dave Hicking:
Makes sense.

Tony Messias:
When you start Turbo, you get two new custom HTML tags to enhance your HTML basically. And one of them is Turbo Frames, the other ones Turbo Streams, which we are going to talk? With Turbo Frames, you can essentially wrap a portion of your page around the Turbo Frames tag. And whenever there is a link click or a form submission inside that Turbo Frames, Turbo will do the same thing, convert that to an Ajax request, but instead of replacing the entire body, it tries to find a matching Turbo Framing, the response that it gets from the server and replace just the frame. And it does that by checking the DOM ID of the element. So that's Turbo Frames. There's a lot to talk about Turbo Frames, but I guess it's time for Turbo Streams, right?

Dave Hicking:
Yeah. Yeah.

Tony Messias:
Otherwise it would be...

Dave Hicking:
This would be a very long podcast.

Tony Messias:
Yeah. With Turbo Drive, you replace the entire page with two frames, you replace only one portion of the page, but there are times where you need to update multiple sections of the page upon a user trigger action or something. Let's say the user's creating a comment in a post or something, you would want to append the new comments to the comments list, you would want to reset the form, maybe there's a counter, maybe message that you want the users to see, that's had to do with just Turbo Frames. And you also don't want to replace the entire body. So for those situations where you need to update multiple parts of the page, you can use Turbo Streams. A lot of folks seem to think that you need web sockets to use Turbo Streams and that's not true, you don't need that. You can return Turbo Streams from your controller to the front end directly as a response over request. And Turbo knows, Turbo understands that you're returning Turbo Streams and performs its actions because there are seven actions that you can do with Turbo Streams. You can append to something, prepend, update, replace, delete, or remove it should say. And then you can also insert before, insert after things in the page.

Zuzana Kunckova:
Can I just ask, just to make sure I'm clear, so Turbo in general, what it does, it hijacks the links and the forms and sends an Ajax request instead. And then in a return it doesn't receive JSON like we would expect with an API, it receives HTML back. So this is what makes it so fast, because all the rendering happens on the server, not on the client side, do I understand it correctly?

Tony Messias:
Yeah. That's also the main idea of Hotwire, Hotwire is on a acronym or it's a word that means HTML over the wire, that's Hotwire. So they send HTML back and forth, there's no JSON serialization or anything like that. So you're spot on there. So you can return Turbo Streams from request and update multiple parts of the page, and this is where it gets interesting. So you can use WebSockets or any other broadcasting mechanism that you want. For instance, if there are two users visiting the same page, one of them interacts with the page, you can actually get the same Turbo Stream that you are sending to this user, that is interacting with the page, and you can broadcast that HTML to all users that are visiting this page with WebSockets or Server-Sent Events or anything else. So the idea is you send the same HTML or the HTML that you want to send, I should say. That's why you use web sockets, but it's not a requirement.
And we also have Turbo Native, which is something very interesting. I don't think Turbo Native is talked that much. And it's the thing that actually got my attention in the first place. On the web Turbo will hijack links and form submissions and do this other things that we talked about, but on the mobile side, what you have is a web view mainly. So you have a shell application written in Kotlin or Swift and inside that the application, the most basic example is a web view. So the user will see a responsive version of your web application on the mobile applications. It would be weird, not weird, but it wasn't going to be that good if we just replaced the body in the same web view, because that's not how mobile navigation works.
So Turbo Native does something else. It like Turbo Drive will listen for links and forms submissions, and it will instruct Turbo Native that, hey, there's a navigation going on. So Turbo Native will intercept that and will do a mobile navigation. So it's like you'll see a new screen popping and stacking up on top of that screen, as a real native screen, even though it's good, probably going to open a new web view or you can actually do some more advanced stuff. So with Turbo Native, you can configure certain URLs from your screen, from your application, to actually open real native screens instead of web views. So this is the part that actually... It's super interesting to me, you can increase the fidelity of your application for specific mobile client and you can do that per URL.

Zuzana Kunckova:
That's really interesting. Fascinating.

Tony Messias:
That's the thing that got my attention in the first place. So let's say the first page of your application is a home application where you see the most recent activity or something. You probably want native screen on the mobile client, because that's the first screen that the user sees, and you want that to be fast. So that one you usually implement in fully native.

Zuzana Kunckova:
You mentioned that you found Tubo Native interesting. So when you are building Turbo Laravel, can you think of an interesting problem that you come up with, something that made you like, how am I going to solve that?

Tony Messias:
Yeah. Okay. It's something that was actually... I spotted it when I was exploring Turbo Native. So it has to do with the way that Laravel handles form validations. Usually a Laravel application, you can type in the form request in the controller action... This is getting too technical.

Dave Hicking:
No, no, this is totally fine.

Zuzana Kunckova:
Go for it.

Dave Hicking:
Go for it, its totally fine.

Tony Messias:
So you can type in the form request in a controller action. And in that form request, you have validation rules. If any of those rules fail, Laravel throws an exception. So it's like, before it actually enters the action, it throws an exception and redirects the user back to where the request came from. But because of Turbo Frames, we can inject forms in pages where the form doesn't exist. Maybe it's easier to picture if we are visualizing the same page. So let's say you have a post page and you have a add comment, link at the bottom of the page.

Zuzana Kunckova:
Yeah.

Tony Messias:
You click on it, the form shows up. That form, it's now showing in the post show page. It's not showing the post ID/comments/create, which is where the form lives. So if the user submits an invalid form and when we get to the Laravel validation handling and Laravel redirects back, it redirects back to the post show page, it doesn't have the form. So it's like the users would see the form disappearing, that's the idea, which is not very...

Zuzana Kunckova:
Not a great user experience I have to say, if the form disappears on you.

Tony Messias:
Yeah, you probably don't want that.

Zuzana Kunckova:
No.

Tony Messias:
And it was actually very tricky to work around this problem because as I said, this happens right before it enters the controller action, which is where you would have more control over where you redirect the users too. So what I ended up doing was we have a middleware that we prepend to your application and we catch validation exceptions inside the application. And we try to figure out where the form for this request lifts from. And we do that because Laravel has this naming convention for resources. So if you have a, comments.store route, if the request was to this comments.store route., the form probably renders enough comments.create route.

Zuzana Kunckova:
So as long as you stick to the naming conventions... Yep.

Tony Messias:
Yeah, exactly. Exactly. And then we check for that so if there is this route and we do all those checks and that only happens if you are actually using the convention. So if that's the case, then we dispatch another request internally. So the user sends one request that gets validation, a validation exception thrown that goes back to the middleware which checks for that. And we see that, oh, the form actually lives in this page, don't redirect back. We can dispatch another request back to the application internally. And then we return whatever the form, the HTML, returned from that action so that's like-

Zuzana Kunckova:
This is fascinating. Wow. Was it way of a trial and error? How long did it take you to figure it out? Where there different approaches you tried?

Tony Messias:
I actually had some troubles with it because I wasn't aware that I needed to.... There's a certain place in the middleware stack that you have to put your middleware if you want to do something like that. I didn't know that. So I was having issues because my cookies were being encrypted and I needed to encrypt the cookies again and send it to the application and I was lost, but then Taylor reached out and he actually... pretty much gave me the code I wanted to write. It was fun.

Zuzana Kunckova:
That's the magic of the Laravel community. We help each other. It's amazing.

Dave Hicking:
Tony, is there something that you'd love to add to Turbo Laravel that you haven't had time to build yet? Or maybe something you want to fix from something that you've implemented already? Is there something that you just wish you could get to?

Tony Messias:
Nothing in particular. Because the thing is I try to keep this library in pair with the Rails gem. So I try to keep them as close as I can to feature parity and all that. But I also want... There are some buttons and stuff that only exist or that are common in the Laravel world, that they are not so common in the Rails world. And I wanted to support that. So we have that in the package already, there is a different way to return Turbo Streams from the controllers because this path and this way of building things in the Laravel community is more common. So we actually have that, one area that I would like to explore more is in the native side, but that doesn't actually have much to do with the Turbo Laravel package. It's more like I need to spend some time working with native applications using Turbo Laravel and see which problems are happening there.

Dave Hicking:
Do you find it challenging at all to... because as you said, Turbo Laravel, you're trying to keep it basically up to date as much as possible with something that somebody else is doing and building. Has that been a challenge at all?

Tony Messias:
Yeah.

Dave Hicking:
I was going to say, I can see... because this is an auditory experience, you all can't see the look on Tony's face, but Tony was like, yeah, yeah.

Tony Messias:
At the beginning I was on top of the issues on the Hotwire repository, but then I spent some weeks away and then when I got back, it's like I have 500 issues that I have to check, but they are not to my application, but they are to the Hotwire application and I try to keep parity with stuff, so I guess I should read them.

Dave Hicking:
So every time they make a fix, you have to make a... you're like a shadow team member at this point.

Tony Messias:
Yeah, I'm trying to.

Zuzana Kunckova:
He is. Are you anyone working on Turbo Laravel or have you got anyone else to help you?

Tony Messias:
Well, there are some folks sending contributions, yeah.

Zuzana Kunckova:
Okay.

Tony Messias:
But we don't have actually have a team working on this or anything. It's pretty much me and other folks using the lib that wants to contribute to it.

Zuzana Kunckova:
And would you say that its... I mean it's finished, currently you have it where you want it to be, the package, and you're just going to improve or keep an eye on Hotwire and go with that. But for now do you feel like Turbo Laravel is finished?

Tony Messias:
It is finished, but there are some areas that I want to improve on, which is, basically on the huge job that we send when we broadcast things. As I mentioned earlier, the job is actually getting larger than I wanted it to be, because we have to serialize. Ah, there's...a whole issue there. We have to serialize. Basically you tell the huge job, when you're broadcasting a triple stream, you say render this view with this data and you're sending that to the backend, but the data is an array and it can be many different things. So depending on what you send as the data, the background job message can get actually really large, because that's going to be serialized and sent to the queue, which depending on the queue driver that you're working on, if you're using SQS or something, there's actually a limit to the size of the message. So folks might face some issues there, but I still haven't found an efficient way to serialize these jobs yet. There are some things that I wanted to explore, but I'm still digesting this problem.

Zuzana Kunckova:
I was going to say, before we go, this seems to be a very typical cheesy question, but has anyone ever asked you, how does Hotwire compared to Livewire?

Tony Messias:
Actually I get some questions on Twitter and the YouTube videos that I put as well. Honestly, I don't have a good answer for it, but I can try to come up with one.

Zuzana Kunckova:
Yeah, go on.

Tony Messias:
I would say the problem that both of these libraries are trying to solve is similar, so the idea is that you write reactive applications, only writing server side code. So you don't actually write front end code that much, even though you are actually doing both of them, but it's not that much. It's minimal JavaScript, that's the idea. But the way they do this is different, Livewire is more on the component side of things and Hotwire is more on the REST and resources side of things. So it's actually a bit challenging to explain, but I think for instance, in Livewire, you tend to think more in terms of stateful components, even though I know that Livewire is actually stateless, there's no state for process running the backend or anything like that. It's like you send state back and forth between the client and server. In Livewire you have to think in terms of stateful components and in Hotwire, we embrace this stateless approach of building web applications, which might make sense to some folks, or not. What's interesting about this is that you can actually use both of them in the same application and they work just fine. You don't have to choose one or the other.

Zuzana Kunckova:
So it's not one or the other, it's just two packages that kind of work on the same principle I would think.

Tony Messias:
So the whole idea of Hotwire is, your progressive enhance your application, towards more interactivity, more dynamic-ness, on the client side and you could have Livewire... To achieve that you use the tools that we talked so far, like Turbo Drive, Turbo Frame, Turbo Streams and then you also can use Stimulus when you actually need to write some client side code. What you could do there is, have Livewire as an option to write some of the reactive code as well. So we don't actually need Stimulus until you need something more on the client side of things. So you could have Livewire as an option there as well. And Alpine of course, Alpine also works with this thing. At that time, it gets a lot of things on the same app, which might be confusing to some folks. So that's why I've been avoiding this question.

Zuzana Kunckova:
I'm sorry, when you say that-

Tony Messias:
That's fine.

Zuzana Kunckova:
People ask you that, so I said, well, people want to know, so let's ask and let's see.

Tony Messias:
Yeah.

Dave Hicking:
Okay Tony, one last question and then we'll let you go. Is there one thing that you wished we would've asked you about Turbo Laravel? Is there something that we didn't get a chance to talk about today?

Tony Messias:
No, I think we actually covered a lot of ground.

Dave Hicking:
Yeah. I learned a ton, I don't know about Zuzana.

Zuzana Kunckova:
Oh definitely.

Dave Hicking:
I knew a little bit going in, but Tony, this has been super interesting, super fascinating to learn more. And so you gave us your Twitter handle, where can people find the actual repo or website for Turbo Laravel?

Tony Messias:
It's under my GitHub profile, it's github/tonysm/turbo-laravel. But you can also just Google Turbo Laravel and that would get you to the repository.

Dave Hicking:
All right. Well Tony, this has been great, thank you so much. Zuzana, do you have anything else you want to say before we go?

Zuzana Kunckova:
No, I think, like Tony said, we've covered a lot of ground and I found it very interesting an I can't wait to give it a go.

Dave Hicking:
Yeah. Thanks so much, Tony. Really appreciate it.

Tony Messias:
Thanks for having me.

Dave Hicking:
All right.

Zuzana Kunckova:
Thank you Tony.

Get our latest insights in your inbox:

By submitting this form, you acknowledge our Privacy Notice.

Hey, let’s talk.
©2024 Tighten Co.
· Privacy Policy