WEBVTT

1
00:00:05.719 --> 00:00:10.439
Hey, welcome back to another episode
of the Ruby Rogues podcast. This week,

2
00:00:10.560 --> 00:00:14.320
I'm your host, Charles max Wood, and I am talking to Ayush

3
00:00:15.039 --> 00:00:21.480
Nuwatia. Did I get anywhere close
on your name? Yeah, coming to

4
00:00:21.600 --> 00:00:26.239
us all the way from London,
and yeah, I ran across i USh.

5
00:00:26.320 --> 00:00:30.199
I don't remember if we bumped into
each other over something else, or

6
00:00:30.199 --> 00:00:34.000
if I reached out about the rails
and hot Wire codex or something else.

7
00:00:34.479 --> 00:00:38.119
I've been getting into hot wire quite
a bit. Most of what I've done

8
00:00:38.200 --> 00:00:43.679
is uh, stimulus, but I'm
starting to pick up turbo and I'm definitely

9
00:00:43.759 --> 00:00:47.079
interested in seeing what strata can do
for me. But yeah, so the

10
00:00:47.159 --> 00:00:55.000
codex, it looks like is is
it a course or is it a book?

11
00:00:55.119 --> 00:00:57.439
It looks like it's a book.
It's a book. Yeah, it's

12
00:00:57.479 --> 00:01:03.119
an ebook. Yeah, it a
comprehensive ebook that I got it printed just

13
00:01:03.200 --> 00:01:07.719
for keepsake. And it's honestly more
like a brick than a book. Oh

14
00:01:07.760 --> 00:01:11.840
wow, it's that big. Huh
Yeah. Yeah, And it says it

15
00:01:11.879 --> 00:01:15.359
says written by human not by AI, which, well you did it,

16
00:01:15.560 --> 00:01:21.879
you did it in hard mode huh
oh yeah, I don't believe in shotcuts.

17
00:01:22.480 --> 00:01:26.519
Yeah. Well sometimes the shortcuts help. But yeah, I've seen people

18
00:01:26.560 --> 00:01:30.599
that yeah they do they do most
or they have AI do like ninety nine

19
00:01:30.599 --> 00:01:36.439
percent of the work, and yeah
they miss stuff, or the AI gets

20
00:01:36.439 --> 00:01:40.799
stuff wrong that they don't catch,
or any number of other issues. Yeah,

21
00:01:40.840 --> 00:01:45.599
so you got to write the book
you wanted, I guess, is

22
00:01:45.599 --> 00:01:49.400
what I'm meaning at. So,
yeah, pretty much like a lot of

23
00:01:49.439 --> 00:01:55.799
the stuff in the book, I
was actually learning while writing. And I

24
00:01:55.840 --> 00:02:00.680
find that the best way to learn
is to do it on what what you

25
00:02:00.840 --> 00:02:04.280
called hard mode, because you tend
to go you tend to go down dead

26
00:02:04.359 --> 00:02:07.520
ends, you go down other paths, and you make mistakes and you learn

27
00:02:07.639 --> 00:02:13.919
from all those things. You learn
things you didn't expect to learn. And

28
00:02:14.400 --> 00:02:16.400
for me, that's the right way
to go about it because that gives you

29
00:02:16.439 --> 00:02:22.599
a lot more context than just asking
an EI a question and getting an answer

30
00:02:22.639 --> 00:02:27.319
back that you can't actually be sure
is accurate. Right. Yeah, I

31
00:02:27.400 --> 00:02:30.479
like that too, the kind of
the idea of learning as you go.

32
00:02:30.560 --> 00:02:35.719
And I wrote a book about finding
a job. I feel like things are

33
00:02:35.759 --> 00:02:39.000
shifted some so I need to rewrite
it. But it was the way that

34
00:02:39.039 --> 00:02:45.439
I found jobs for the first fifteen
years of my career, and yeah,

35
00:02:45.800 --> 00:02:49.759
it was interesting, like going back
and seeing what was out there today and

36
00:02:49.800 --> 00:02:54.800
how that worked and stuff like that, and so yeah, I feel that

37
00:02:55.879 --> 00:02:59.960
quite a bit. But yeah,
it's tough writing books a ton of work.

38
00:03:00.360 --> 00:03:05.639
Yeah it was. I mean I
thought it was going to be pretty

39
00:03:05.680 --> 00:03:08.919
hard, and it was way harder
than I imagine it could be. It

40
00:03:08.960 --> 00:03:15.240
took about twice as long as I
had anticipated it to take. Yeah,

41
00:03:15.280 --> 00:03:21.439
it was quite an undertaking. It's
it's definitely the most challenging thing I've ever

42
00:03:21.479 --> 00:03:25.840
done in my professional career, but
so far it's it's also been the most

43
00:03:25.840 --> 00:03:32.400
rewarding. So I took eight months
completely off client work to write it,

44
00:03:32.479 --> 00:03:36.319
oh wow, because I'm a freelancer
and I was trying to do it side

45
00:03:36.319 --> 00:03:40.280
by side with client work and it
just wasn't working for me because it's quite

46
00:03:40.319 --> 00:03:46.879
a Writing is quite an intense mentally
intense task, and after spending like four

47
00:03:46.960 --> 00:03:52.439
or five hours a day on client
work, I just didn't have enough in

48
00:03:52.479 --> 00:03:57.439
the tank to then put in some
properles for writing. So I was like,

49
00:03:58.520 --> 00:04:01.199
while I'm still excited about the idea, let me try and see it

50
00:04:01.199 --> 00:04:05.199
through. I'll take three or four
months off surely that'll be enough to write

51
00:04:05.199 --> 00:04:11.599
it, And eight months later I
still hadn't finished it. So it was

52
00:04:11.639 --> 00:04:15.519
a bit of quite a big financial
hit. But in the long term,

53
00:04:15.560 --> 00:04:19.519
I think it's all been quite worth
it because it's really helped my freelancing career

54
00:04:19.560 --> 00:04:28.879
as well. That's awesome. So
the book goes into all kinds of stuff.

55
00:04:28.879 --> 00:04:31.920
I'm assuming it also does Turmo Native. It does. Yeah, so

56
00:04:32.439 --> 00:04:36.399
it's well, I mean I would
say this, but I think is the

57
00:04:36.439 --> 00:04:43.439
most comprehensive resource out there on rails
and hot wire because it covers all the

58
00:04:43.480 --> 00:04:46.920
bits. Like it is primarily a
book and how to build a rails app,

59
00:04:46.360 --> 00:04:53.199
but where it kind of does things
that other courses and books don't is

60
00:04:54.279 --> 00:04:57.759
it firstly does quite a lot from
ratch, so like I use very few

61
00:04:57.839 --> 00:05:00.360
gems, so like authentication, all
that stuff is from scratch. And the

62
00:05:00.399 --> 00:05:04.920
other thing is it teaches me.
It teaches native apps as well, so

63
00:05:05.600 --> 00:05:11.639
it's not just build a rail's website, it's build a rail's website, iOS

64
00:05:11.680 --> 00:05:16.439
app and Android app. Oh wow, that's awesome. Yeah. We had

65
00:05:16.519 --> 00:05:21.639
Joe Masilotti on a while back to
talk about Turbo Native and it looks really

66
00:05:21.720 --> 00:05:26.639
terrific as far as it goes,
and you know, I mean I've talked

67
00:05:26.639 --> 00:05:30.160
to some people and they just want
that native, full on native experience where

68
00:05:31.199 --> 00:05:33.920
you know, you load the data
onto the phone, you know, so

69
00:05:33.959 --> 00:05:40.639
you're hitting APIs and then you're you
know, loading native components and stuff like

70
00:05:40.680 --> 00:05:46.639
that. But some apps, So
the thing that I've been looking at is

71
00:05:46.639 --> 00:05:51.439
building like a media app for podcasts
and videos and stuff like that. I

72
00:05:51.480 --> 00:05:57.639
guess you can have your media downloadable, you know, to the point where

73
00:05:57.680 --> 00:06:01.120
you can watch it on the phone
on more I guess of app, But

74
00:06:01.160 --> 00:06:04.279
for the most part of people are
going to stream it. I don't see

75
00:06:04.279 --> 00:06:11.480
what the difference is, right,
Yeah, Honestly, I think there is

76
00:06:11.480 --> 00:06:20.240
a huge misunderstanding around the actual benefits
of native apps. Like for some use

77
00:06:20.319 --> 00:06:26.279
cases they are the best tool for
the job, but for a vast majority

78
00:06:26.319 --> 00:06:30.279
of use cases, a well executed
hybrid app will do the job really well

79
00:06:30.720 --> 00:06:35.040
because a lot of the arguments are
usually here for native apps, as things

80
00:06:35.199 --> 00:06:41.399
like offline use and just the fidelity
of the UI and things like that.

81
00:06:42.319 --> 00:06:46.399
But I used to be a native
app developer, so I only switched to

82
00:06:46.480 --> 00:06:51.480
rails in twenty twenty. Before that, I spent five years doing iOS and

83
00:06:51.480 --> 00:06:58.000
Android development, and I worked on
a few apps fort at an agency,

84
00:06:58.040 --> 00:07:02.439
and then I worked for a company
called answer Whys now known as YS and

85
00:07:03.199 --> 00:07:09.000
our dirty little secret was that the
apps were fully native, but they were

86
00:07:09.160 --> 00:07:15.839
useless offline. They were completely and
utterly useless offline. Like I can't comment

87
00:07:15.879 --> 00:07:17.480
on the state of the app now, obviously because I left the company five

88
00:07:17.560 --> 00:07:25.959
years ago, but when I worked
there, every screen made like a minimum

89
00:07:26.000 --> 00:07:30.160
of half a dozen API calls and
then rendered native views based on those API

90
00:07:30.240 --> 00:07:33.759
calls. Yeah, you got any
screen, you will see your loading spinner.

91
00:07:33.759 --> 00:07:38.720
It's not going to load instantly.
There is no offline persistence or anything

92
00:07:38.759 --> 00:07:43.920
like that. So if you were
going to add all those things in a

93
00:07:44.000 --> 00:07:47.920
native app, in my opinion,
the level of complexity is about the same

94
00:07:47.959 --> 00:07:54.439
as doing it in like a web
context now because with things like service workers,

95
00:07:54.519 --> 00:08:01.560
you can make your web app and
a hybrid app work offline just using

96
00:08:01.560 --> 00:08:05.720
web technology, and I think the
challenges and complexities of doing it that way

97
00:08:07.279 --> 00:08:11.240
are very similar to the challenges and
complexities of doing it the native way.

98
00:08:11.879 --> 00:08:16.279
Now, there are great arguments for
using native apps, and if you're going

99
00:08:16.360 --> 00:08:20.720
to have like tight integration with stuff
like GPS and all that kind of thing,

100
00:08:22.319 --> 00:08:28.040
and you need like a really high
fidelity UI which is not properly serviced

101
00:08:28.040 --> 00:08:33.120
by web technology. Like my favorite
example to reach for is Uber. If

102
00:08:33.159 --> 00:08:37.360
you are building Uber which doesn't really
need a web app, but it needs

103
00:08:37.440 --> 00:08:41.440
top notch native apps because like there
is no use for Nuber website, but

104
00:08:41.480 --> 00:08:46.399
there like it's it's pretty much exclusively
going to be used through mobile just because

105
00:08:46.399 --> 00:08:50.639
of the nature of the app.
That is, when you go fully native,

106
00:08:50.679 --> 00:08:56.000
because your entire business depends on the
mobile app and you need the best

107
00:08:56.039 --> 00:09:01.240
possible experience on it. But if
you build like a a crowd app,

108
00:09:01.399 --> 00:09:03.159
which I think, like, I
mean, people won't like to admit it,

109
00:09:03.159 --> 00:09:09.480
but eighteen ninety percent of weare apps
are just crowd apps, then yeah,

110
00:09:09.679 --> 00:09:13.639
true, Yeah, then a well
executed hybrid app using something like the

111
00:09:13.840 --> 00:09:22.440
Turbative very similar philosophy will do absolutely
fine. Yeah that makes sense. That

112
00:09:22.440 --> 00:09:24.000
makes a lot of sense. I
kind of want to dive into more of

113
00:09:24.039 --> 00:09:30.960
the hot wire stuff here. So
the codex you actually build out an app.

114
00:09:31.360 --> 00:09:37.039
Yeah, that's right. So,
like you said, it's it's almost

115
00:09:37.039 --> 00:09:41.279
more. Here's how to build an
app with Rails. Yes, yeah,

116
00:09:41.320 --> 00:09:46.399
it is pretty much that. Like
the fact that it teaches native apps and

117
00:09:46.440 --> 00:09:50.480
the fact that hot wire is a
core part are all just kind of add

118
00:09:50.519 --> 00:09:56.440
ons to it. The core proposition
is, here are all the tools and

119
00:09:56.480 --> 00:10:05.200
techniques you need to build like modern
rails applications. Because my vision for it

120
00:10:05.440 --> 00:10:11.759
was to be the next step after
the Rails tutorial by Michael Hortel, so

121
00:10:11.639 --> 00:10:15.720
because that's how I learned Rails,
and I think it's a rite of passage

122
00:10:15.759 --> 00:10:20.519
pretty much for every Rails developer to
work through that book. But after I

123
00:10:20.639 --> 00:10:26.159
finished that book, I didn't know
where to go next because it teaches you

124
00:10:26.240 --> 00:10:31.120
the basics and it does that really
really well, but you need a next

125
00:10:31.120 --> 00:10:33.639
step, right, Like, I
didn't really know where to go from there,

126
00:10:35.320 --> 00:10:39.960
and I was learning quite a lot
when I was just starting with my

127
00:10:39.039 --> 00:10:46.600
freelancing career and stuff like that.
So I thought I'd put my slightly unique

128
00:10:46.679 --> 00:10:52.360
career trajectory of having specialized in mobile
apps and then having switched to web to

129
00:10:54.240 --> 00:11:01.320
some use and write a book on
how to build modern Rails applications and as

130
00:11:01.360 --> 00:11:11.200
a unique selling point throwing the native
side of things right. So yeah,

131
00:11:11.240 --> 00:11:13.360
so I guess I guess. One
of the other cases that I know some

132
00:11:13.360 --> 00:11:18.960
people have to make is why then
use hot Wire, Stimulus and friends instead

133
00:11:18.960 --> 00:11:26.639
of something like React or view or
Angular or one of these other heavier duty

134
00:11:26.679 --> 00:11:35.320
front end systems. It's I'm not
the best person to compare and contrast because

135
00:11:35.720 --> 00:11:45.399
I've never used React, So my
pitch for it would be React and stuff

136
00:11:45.440 --> 00:11:48.480
have a very different philosophy. They
kind of take away your apps front and

137
00:11:48.600 --> 00:11:54.360
you don't really write htble and CSS, you right react goud and true.

138
00:11:56.039 --> 00:12:03.519
I don't really see the point of
building model and web applications that way in

139
00:12:03.600 --> 00:12:09.759
like with an all in kind of
approach, because he just like, the

140
00:12:09.799 --> 00:12:15.399
web platform gives you so much out
of the box, and it just feels

141
00:12:15.399 --> 00:12:18.399
like React as the philosophy has said, you know, we're going to take

142
00:12:18.480 --> 00:12:20.519
everything to the web platform gives you, throw it out of the window and

143
00:12:20.559 --> 00:12:30.960
then build it back but worse so. So that's just not a philosophy that

144
00:12:31.000 --> 00:12:35.960
I kind of buy into. I
like writing HTML and CSS, and I

145
00:12:35.120 --> 00:12:45.000
like enhancing that with JavaScript. I
believe that HTML is a declarative UI programming

146
00:12:45.080 --> 00:12:48.240
language, which I know it's it's
a statement that could start fights on the

147
00:12:48.320 --> 00:12:56.120
Internet. But that's my stall and
the reason like the hot Wire approach kind

148
00:12:56.120 --> 00:13:03.360
of fits my brain so well is
that philosophically, it's exactly the same as

149
00:13:03.399 --> 00:13:07.600
it was building websites like fifteen years
ago, when it will all jQuery and

150
00:13:07.720 --> 00:13:13.879
jQuery UI, when you still wrote
HTML and CSS, but you had this

151
00:13:13.039 --> 00:13:18.120
crappy procedural JavaScript code on top of
that kind of doing all the dynamic stuff.

152
00:13:18.440 --> 00:13:22.799
So we moved away from that and
we have excuse me, much better

153
00:13:26.039 --> 00:13:31.279
way to kind of structure JavaScript now, so we still retain the philosophy of

154
00:13:31.759 --> 00:13:35.080
you build your core UI in HTM
and and CSS and then you enhance it

155
00:13:35.080 --> 00:13:41.519
with JavaScript with hot Wire. With
Turbo especially, you can get so far

156
00:13:41.639 --> 00:13:48.720
without writing any custom JavaScript at all. Just data attributes on HTML take you

157
00:13:48.960 --> 00:13:58.720
so far because Turbo Drive in itself
is just a huge performance boost because you're

158
00:13:58.720 --> 00:14:05.639
not doing full page realer gerony reloading
the body element. And now at Turbo

159
00:14:05.759 --> 00:14:11.679
eight you also get like prefetching,
so when the user hovers over a link,

160
00:14:11.080 --> 00:14:15.879
it'll prefetch and cash the response,
so when you click the link,

161
00:14:16.320 --> 00:14:22.600
it's almost instantaneous the transition. And
that's like without writing any JavaScript yourself.

162
00:14:22.759 --> 00:14:26.720
At all, and then you throw
in turbo frames into the mix, which

163
00:14:26.799 --> 00:14:33.480
kind of lets you break the page
down too smaller chunks and then update those

164
00:14:33.600 --> 00:14:37.799
chunks independently of the rest of the
page, again without writing any custom JavaScript

165
00:14:37.879 --> 00:14:46.279
at all. You just get so
so far with so so little. And

166
00:14:46.639 --> 00:14:52.519
let's say you have certain parts of
a page where it's really really interactive and

167
00:14:52.559 --> 00:14:56.840
you really need to build out something
complex, then you would probably just throw

168
00:14:56.879 --> 00:15:01.200
in a JavaScript framework for that little
a piece of like me, you're building

169
00:15:01.240 --> 00:15:05.720
like a car configurator, which is
a really complex piece of work, right

170
00:15:05.720 --> 00:15:11.200
because it is lots of logic,
lots of moving parts going about. So

171
00:15:11.240 --> 00:15:13.919
for that little island on the page, you'd probably throw in a framework.

172
00:15:13.960 --> 00:15:18.039
Like I couldn't tell you whether i'd
pick React of You or whatever, because

173
00:15:20.120 --> 00:15:22.240
I haven't used them, so I
couldn't tell you what I would use.

174
00:15:22.240 --> 00:15:26.080
I'd need to research it. But
you would choose a framework and throw it

175
00:15:26.080 --> 00:15:28.960
in for that tiny island and the
page, But the majority of your website

176
00:15:30.000 --> 00:15:35.759
would still just be using HTM and
cs as just the way I think the

177
00:15:35.799 --> 00:15:41.039
web platform was designed to be used, right. That's just my ty cents

178
00:15:41.039 --> 00:15:46.240
and the whole thing I think we've
gone down this rabbit hole of complexity that

179
00:15:46.279 --> 00:15:50.320
we just need to go back from
a little bit. Yeah, I'm just

180
00:15:50.320 --> 00:15:54.799
going to add a couple of things
because I've done some React and what I

181
00:15:54.960 --> 00:16:00.399
found is, yeah, I mean
you talked about the complexity, and you've

182
00:16:00.399 --> 00:16:06.279
talked about how it kind of takes
over your page or takes over you know,

183
00:16:06.519 --> 00:16:11.120
whatever you put it into. One
thing that I found is that so

184
00:16:11.240 --> 00:16:15.919
typically when I see people building a
React application, what they're doing is they

185
00:16:15.960 --> 00:16:25.200
are essentially working off of something like
Prisma or you know, some back end

186
00:16:25.799 --> 00:16:30.480
API system that just delivers an API
and then they build everything else on React.

187
00:16:32.159 --> 00:16:37.120
And that makes sense from the standpoint
of right, you're only learning one

188
00:16:37.200 --> 00:16:41.440
system and so then you're building it
out. I found the whole process of

189
00:16:41.480 --> 00:16:48.120
putting together React components just to be
really, really clunky. And you know,

190
00:16:48.159 --> 00:16:52.279
there are things I like about the
idea of JSX where you're putting your

191
00:16:52.600 --> 00:16:59.440
effectively from the rail standpoint, you're
putting your view, controller and model in

192
00:16:59.519 --> 00:17:03.440
one file file. But what I
found is that people tend to still complicate

193
00:17:03.519 --> 00:17:07.000
that way more than it needs to
be. And then the other issue is

194
00:17:07.000 --> 00:17:12.200
is that, yeah, like you
said, you're not really working in the

195
00:17:12.240 --> 00:17:18.319
web medium anymore. You're working in
the React medium. And what I've gotten

196
00:17:18.319 --> 00:17:26.039
to love about Ruby and Rails and
hot wire is that I just add stuff

197
00:17:26.039 --> 00:17:27.640
in where I need it, I
kind of enhance it where it makes sense,

198
00:17:27.640 --> 00:17:30.880
and then you know, just kind
of pull in the pieces where they

199
00:17:32.799 --> 00:17:34.799
they tend to work well, and
then I get to work in the web

200
00:17:34.839 --> 00:17:41.039
medium. So exactly. Something that
I kind of learned back when I was

201
00:17:41.079 --> 00:17:48.319
a native app developer is that if
you fight against the platform you're working with,

202
00:17:48.720 --> 00:17:52.920
it's never going to go well.
So especially like on iOS, which

203
00:17:52.920 --> 00:17:57.200
I specialized in towards the back end
of my stint as a mobile developer,

204
00:17:57.200 --> 00:18:02.319
because and roads just too Leanna,
I can't be bothered with this anymore.

205
00:18:03.720 --> 00:18:10.279
An iOS, there was a proliferation
of really complicated patterns, Like you know

206
00:18:10.319 --> 00:18:12.240
how tech goers, right, things
come in and out of fashion, so

207
00:18:14.359 --> 00:18:18.880
there were it was just becoming fashionable
to use these really complicated patterns, like

208
00:18:18.960 --> 00:18:23.440
there's one called viper, which I
load with an unbridled passion. Uh.

209
00:18:23.880 --> 00:18:30.799
And all those things did was they
fought against what the iOS platform gave you.

210
00:18:30.400 --> 00:18:36.720
So like the iOS runtime has a
lot of similar philosophies to Ruby,

211
00:18:36.799 --> 00:18:45.039
like in terms of things like metaprogramming
and quote unquote magic provided by metaprogramming and

212
00:18:45.319 --> 00:18:48.039
all these patterns came in and said
that, you know, we're going to

213
00:18:48.160 --> 00:18:52.160
fight against a platform that gives you
all these things and rebuild all of these

214
00:18:52.440 --> 00:18:59.319
ourselves by with these patterns and things
like that. And it did my head

215
00:18:59.359 --> 00:19:03.039
in because it just made simple codes
so much more complex. And I've kind

216
00:19:03.039 --> 00:19:08.400
of taken that learning into web development
and said that if I ever find myself

217
00:19:08.480 --> 00:19:12.599
fighting against the browser, I'm probably
not doing something right. I need to

218
00:19:12.640 --> 00:19:18.720
rethink my entire approach. And that's
kind of where I am with the whole

219
00:19:18.880 --> 00:19:22.119
reacting. I just feel that it
fights the platform instead of working with it.

220
00:19:23.160 --> 00:19:27.920
Yeah, that tension is definitely there. I agree with you. So

221
00:19:29.359 --> 00:19:34.599
let's dive into what Rails and hot
wire give you here, since I'm assuming

222
00:19:34.599 --> 00:19:37.839
that's why most people who are listening
are listening. By the way, we

223
00:19:37.920 --> 00:19:42.519
have like sixty people on Twitter right
now. I never say X because I

224
00:19:42.519 --> 00:19:47.839
feel dumb saying X. So yeah, I still call it twitter as well,

225
00:19:48.759 --> 00:19:52.680
so anyway, and everybody knows what
I mean when I say Twitter.

226
00:19:52.799 --> 00:20:00.359
So anyway, So in essence,
I think the thing we've talked about the

227
00:20:00.359 --> 00:20:06.079
most is stimulus right on this show, just because I think it's kind of

228
00:20:06.119 --> 00:20:11.759
the I don't know if it's necessarily
the easiest to understand, but it's usually

229
00:20:11.759 --> 00:20:17.400
what we're reaching for when we're trying
to have some kind of custom thing on

230
00:20:17.440 --> 00:20:22.440
our web page. Right, Yeah, exactly. Stimulus is the thing for

231
00:20:22.480 --> 00:20:27.079
which you'll actually write JavaScript code yourself, because turbo is more just to something

232
00:20:27.079 --> 00:20:32.880
you drop in and then you kind
of call using data attributes in HTML.

233
00:20:33.119 --> 00:20:36.559
Yeah, unless you want to customize
something. So yeah, stimulus is where

234
00:20:36.599 --> 00:20:41.799
you actually write JavaScript. Right.
So I was going to say, let's

235
00:20:41.880 --> 00:20:45.000
let's talk about Turbo here for a
minute. So do you want to just

236
00:20:45.039 --> 00:20:48.160
give people an idea of what turbo
is and how it works? Yeah?

237
00:20:48.200 --> 00:20:55.000
Sure. So Turbo's actually made up
of three parts itself, turbot drive,

238
00:20:55.400 --> 00:21:03.119
Turbo frames, and Turbo streams.
So turbot is like a natural successor to

239
00:21:03.559 --> 00:21:08.000
the library turbo links, which if
anyone has worked with reels for a number

240
00:21:08.000 --> 00:21:12.880
of years would be familiar with.
It kind of builds on a concept called

241
00:21:14.000 --> 00:21:19.480
p jacks, which was I think
pioneered by GitHub way back when So the

242
00:21:21.079 --> 00:21:26.359
core of turboat drive is that when
you click a link, instead of like

243
00:21:26.480 --> 00:21:30.880
letting the browser do what it do, it does which is goes and gets

244
00:21:30.920 --> 00:21:37.319
the response, throws away the entire
existing document, and then renders the response

245
00:21:37.359 --> 00:21:45.000
that it got from the server.
Turboat drive will intercept that link click and

246
00:21:45.200 --> 00:21:52.319
it'll make a fetch request to the
path, get the response, and then

247
00:21:52.759 --> 00:21:57.880
just swap out the body element on
the existing document for the one that it

248
00:21:59.000 --> 00:22:03.319
got from the response, and it'll
merge ahead. So you still your your

249
00:22:03.359 --> 00:22:07.400
document still stays intact. If you're
on a store some state on it,

250
00:22:07.599 --> 00:22:14.240
you can. And it also helps
with performance because you're not like throwing away

251
00:22:14.279 --> 00:22:18.279
the entire page and then downloading less
and stuff again, although I mean that

252
00:22:18.319 --> 00:22:22.960
problem is a lot less obvious now
with caching and HGTP too, but it's

253
00:22:22.960 --> 00:22:29.359
still it's still there visually, it
does make a difference when the entire page

254
00:22:29.440 --> 00:22:33.440
isn't thrown away. And I think
the biggest difference between turbot Drive and the

255
00:22:33.480 --> 00:22:40.079
predeceassor turble links is that turbot Drive
works with forms as well. So turbo

256
00:22:40.119 --> 00:22:45.880
Links was exclusively for link clicks,
but for turbot Drive, it does the

257
00:22:47.000 --> 00:22:52.480
exact same thing for form submissions as
well. Right, And the one thing

258
00:22:52.599 --> 00:22:59.359
that when I've found myself in discussions
with people who only ever used React is

259
00:23:00.200 --> 00:23:03.759
they say, oh, what if
you want a persistent element on the page.

260
00:23:03.799 --> 00:23:06.519
You can't do that with this approach
because it's still a multipage app.

261
00:23:07.039 --> 00:23:11.039
And Turbo actually has an attribute called
data Turbo permanent, so if you put

262
00:23:11.079 --> 00:23:17.400
that on an element, that particular
element will be persisted across page loads.

263
00:23:18.319 --> 00:23:22.160
So like, so let's say you
are you had like audio player or something

264
00:23:22.160 --> 00:23:26.119
that was playing sound, but you
wanted the user to be able to browse

265
00:23:26.160 --> 00:23:30.160
your website while that was still playing. You just set this attribute on that

266
00:23:30.279 --> 00:23:36.720
element and it would just be retained. It would still be there across all

267
00:23:36.759 --> 00:23:40.960
those multiple page loads. So you
still have like a multipage architecture, but

268
00:23:41.119 --> 00:23:45.799
you have the behavior of a single
page application. So I think that's a

269
00:23:45.839 --> 00:23:52.519
great, great approach to kind of
just simplify your architecture. So that's like,

270
00:23:53.000 --> 00:23:57.079
yeah, so that's like Turbo Drive. Turbo Frames kind of takes a

271
00:23:57.119 --> 00:24:04.279
similar concept but localize it to like
smaller parts of the page. So let's

272
00:24:04.319 --> 00:24:07.240
say you have a page with a
lot of content. And then you have

273
00:24:07.319 --> 00:24:12.039
a turbo frame on one small part
of the page, so that turboframe is

274
00:24:12.039 --> 00:24:18.880
basically just a turbo dash frame htmltag
which is implemented as a custom element.

275
00:24:19.119 --> 00:24:26.160
And then any link clicks or form
submissions in that turbo frame will expect a

276
00:24:26.200 --> 00:24:30.000
corresponding turbo frame. So the I
D of the of the frame that the

277
00:24:30.039 --> 00:24:34.640
call is made from, it would
expect an I D a turbo frame with

278
00:24:34.720 --> 00:24:40.960
that same I D in the response. And then instead of replacing the entire

279
00:24:41.000 --> 00:24:45.240
body element, it would just replace
the contents of that one frame. So

280
00:24:45.319 --> 00:24:52.240
you can make very like uh,
you can decompose your entire page into smaller

281
00:24:52.279 --> 00:24:59.079
parts using turbo frames and then update
just those parts. So that's just taking

282
00:24:59.279 --> 00:25:04.400
the whole turbo drive concept and making
it a bit more powerful. And just

283
00:25:04.480 --> 00:25:11.440
these two things I think takes you
so unbelievably far without writing any custom JavaScript,

284
00:25:12.000 --> 00:25:18.680
right. Can I ask a couple
of questions here on this because well,

285
00:25:18.720 --> 00:25:22.240
for one, so turbo you said
turbo drive, and I guess turbo

286
00:25:22.279 --> 00:25:27.519
frames as well work on both link
clicks and form subeditions. Yes, so

287
00:25:30.039 --> 00:25:32.920
I'm looking at the turbo page.
So for example, it has like an

288
00:25:33.039 --> 00:25:36.759
edit this message link, so if
you click that link, it would just

289
00:25:36.799 --> 00:25:41.519
replace the contents of that frame with
I'm assuming your rails just renders a partial

290
00:25:41.559 --> 00:25:47.359
with no layout and it just drops
it in there. Yes, exactly,

291
00:25:48.400 --> 00:25:52.519
So you can either yeah, just
render the partial with no layout, which

292
00:25:52.880 --> 00:25:56.720
would be the more performing thing to
do. And I think I think there

293
00:25:56.799 --> 00:26:07.119
is a help in the Turbo rails
gem that does set the layout to falls

294
00:26:07.319 --> 00:26:11.440
if it's a Turbo frame request,
but I could be wrong there. But

295
00:26:11.559 --> 00:26:17.079
you don't have to do that because
all the Turbo really wants in the response

296
00:26:17.200 --> 00:26:19.559
is a Turbo frame with the with
the matching I D. So you can

297
00:26:19.640 --> 00:26:26.200
have a full HTML document that you
send back, but Turbo will only remove

298
00:26:26.519 --> 00:26:33.119
the corresponding Turbo frame and then replace
that, so you can be right,

299
00:26:33.640 --> 00:26:34.720
Yeah, you just got to get
the idea, or you can sign whatever

300
00:26:34.799 --> 00:26:37.519
back from the server as long as
it has a Turble frame with the I

301
00:26:37.599 --> 00:26:41.839
D. Okay, that makes sense. So one other thing, and we

302
00:26:41.920 --> 00:26:45.640
might dive into turbos streams here a
little bit with it. But and I

303
00:26:45.680 --> 00:26:49.960
have to admit, like like I
said, I've done I've done a bunch

304
00:26:51.000 --> 00:26:56.960
of stimulus freaking love it. It
feels so easy to follow along with when

305
00:26:56.000 --> 00:27:00.200
I'm doing stuff. But yeah,
Turbo's kind of new to me. But

306
00:27:00.240 --> 00:27:03.920
I'm looking at this and I'm going
this seems like I think I've done some

307
00:27:04.000 --> 00:27:07.759
of this stuff with stimulus, not
realizing that Turbo did it for me.

308
00:27:08.880 --> 00:27:11.240
So one other thing that I have
a question about, and this is something

309
00:27:11.240 --> 00:27:17.440
I ran into last week. So
I've kind of been looking for work lately.

310
00:27:18.519 --> 00:27:22.039
The contract I was working just slowed
way way way way way down,

311
00:27:22.559 --> 00:27:27.839
and so I applied to this other
It was kind of a contract and they

312
00:27:29.039 --> 00:27:33.200
sent me basically I'm rambling, I'm
talking way too long about this. Anyway,

313
00:27:33.119 --> 00:27:37.799
they told me to build them a
sample app, and I spent I

314
00:27:37.799 --> 00:27:44.680
think three hours debugging rails, sending
a Turbo stream request back when I submitted

315
00:27:44.720 --> 00:27:51.240
a form, and then not actually
loading the page right when it got a

316
00:27:51.279 --> 00:27:55.599
response. Like I could see in
the rail server that it was hitting that

317
00:27:55.720 --> 00:28:00.880
back end endpoint and that it was
doing the work to you know, render

318
00:28:00.920 --> 00:28:07.000
the other page, but it was
right, it wasn't rendering the page.

319
00:28:07.400 --> 00:28:11.400
And so I'm curious, is there
something fundamental with like just maybe I had

320
00:28:11.400 --> 00:28:17.640
the wrong idea on something or didn't
understand something fundamental about how rails works with

321
00:28:17.720 --> 00:28:25.680
Turbo to manage forms that I did
wrong, because eventually I just found I

322
00:28:25.720 --> 00:28:27.359
found the key word. I can't
remember which one it is, but the

323
00:28:27.440 --> 00:28:30.640
keyword to just turn it off.
I think it was remote false or something.

324
00:28:33.039 --> 00:28:37.640
Okay, Yeah, So were you
sending a turbo stream back from the

325
00:28:37.680 --> 00:28:44.359
server or were you sending a full
page? I don't remember it was requesting

326
00:28:44.400 --> 00:28:48.559
a turbo stream. It was showing
up in the log as turbostream. Okay,

327
00:28:48.119 --> 00:28:53.039
I don't remember if it was it
was sending back. Because so Turbo

328
00:28:53.119 --> 00:29:00.319
has a requirement that on a firm
submission you either render a turbot streams that

329
00:29:00.440 --> 00:29:07.079
has to have a mind type of
turbous stream or I or you have to

330
00:29:07.119 --> 00:29:15.000
redirect. You cannot you cannot render
HTM and okay, so that that's a

331
00:29:15.000 --> 00:29:19.160
feature of turbo streams. It's a
it's a requirement of Turbo. So if

332
00:29:19.160 --> 00:29:22.880
you look at the Turbo docks,
somewhere there is an explanation for it.

333
00:29:22.880 --> 00:29:26.839
I can't remember. It's something to
do with clicking back. I can't remember

334
00:29:26.880 --> 00:29:30.079
the exact experts in it's in the
docks. But yeah, you have to

335
00:29:30.200 --> 00:29:34.319
either render a turbot stream or redirect
on a farm of submission. That's a

336
00:29:34.359 --> 00:29:38.799
requirement of turbot drive. Okay,
so what is the turbo stream then,

337
00:29:40.599 --> 00:29:48.640
So turbo stream is also a custom
elements or just turbo dash stream and it

338
00:29:48.279 --> 00:29:52.039
okay, hang on time out for
a second. So when you're saying I

339
00:29:52.079 --> 00:29:56.359
needed to render return turbostream, I
was still returning HTML. I was just

340
00:29:56.559 --> 00:30:00.200
it needed to be in a turbo
stream element. It needed to be in

341
00:30:00.240 --> 00:30:03.920
a turbo stream element. I needed
to have a mind type of whatever the

342
00:30:03.960 --> 00:30:10.759
thing is, VND turbo stream whatever
it is. The actual Yes, a

343
00:30:11.240 --> 00:30:15.599
turbo stream has to be in a
turbot stream tag. That's what makes it

344
00:30:15.720 --> 00:30:18.680
a turbo stream. And that kind
of gives you what I what I describe

345
00:30:18.680 --> 00:30:23.119
in my book as a scalpel to
make fine grained adjustments to your page.

346
00:30:23.559 --> 00:30:30.000
So, uh, turbot drive and
turbo frames both have quite like general approaches

347
00:30:30.079 --> 00:30:34.400
to making updates. So you like
either change the entire page or a whole

348
00:30:34.440 --> 00:30:38.640
portion of the peature. Let's say
you want to target one tiny thing like

349
00:30:38.680 --> 00:30:44.079
a counter or something somewhere, and
you want to change just that, So

350
00:30:44.440 --> 00:30:48.359
you would render a turbo stream with
a replace action, and then in the

351
00:30:48.400 --> 00:30:53.880
content of the turbostream targe you put
the new content and then turbo would I

352
00:30:55.640 --> 00:31:03.160
would use the target attribute of the
term stream tag define the element you wanted

353
00:31:03.240 --> 00:31:07.960
to change, and then the action
you define is replace. It will replace

354
00:31:07.400 --> 00:31:15.400
the targeted element with the contents of
the turbostream tag. Now there are I

355
00:31:15.400 --> 00:31:19.279
think got seven or eight crowd actions
that turbo streams give you out of the

356
00:31:19.279 --> 00:31:25.680
box. I think like a pend
and replace and update. Can't remember all

357
00:31:25.680 --> 00:31:29.720
of them, it's in the docks. So those kind of those are the

358
00:31:29.799 --> 00:31:33.960
updates you can make using turbo streams
to very specific elements that you target using

359
00:31:34.480 --> 00:31:41.119
either an ID or a CSS selector. So you can make like really targeted

360
00:31:41.440 --> 00:31:48.759
adjustments to your page. But it's
quite easy to let things get out of

361
00:31:48.799 --> 00:31:55.359
hand with turbot streams because if you
find yourself making quite a few updates,

362
00:31:55.839 --> 00:32:00.279
you're probably doing something wrong. It's
really stuff that's really targeted, really fine

363
00:32:00.279 --> 00:32:04.640
grained, really one off that you
kind of want to be making with turbo

364
00:32:04.640 --> 00:32:09.240
streams because especially now with Turbo eight. So I'm going to segue into Turbo

365
00:32:09.319 --> 00:32:13.839
eight a little bit, because everything
we've spoken about so far has been in

366
00:32:14.039 --> 00:32:19.039
Turbo in some form or the other
since Day one, which was Turbo Turbo

367
00:32:19.119 --> 00:32:22.519
came out with the version seven to
match Rails's version, So that's a bit

368
00:32:22.599 --> 00:32:28.960
of counterintuitive, but I digress.
A. Turbo eight has this new feature

369
00:32:29.039 --> 00:32:36.759
called page of fresh is using morphing. So a common pattern in Rails is

370
00:32:37.039 --> 00:32:43.200
you kind of make a change to
an entity and then redirect back to where

371
00:32:43.200 --> 00:32:47.799
the user was. So let's say
the user is on forward slash posts and

372
00:32:49.000 --> 00:32:53.640
you have an index of posts with
like delete buttons, and the user clicks

373
00:32:53.680 --> 00:32:59.119
delete and then the controller action will
redirect the user back to posts where they

374
00:32:59.160 --> 00:33:05.039
already were. But obviously what they'll
see is that one post that they deleted

375
00:33:05.880 --> 00:33:08.640
it should now be missing because it's
been deleted. That's like it's a very

376
00:33:08.680 --> 00:33:15.000
small change on the page. So
in the past, you would probably render

377
00:33:15.079 --> 00:33:20.599
a turbo stream that targets that particular
posts entry. It will probably be like

378
00:33:20.599 --> 00:33:25.160
an ALI element or something, and
it removes it from the dome, or

379
00:33:25.240 --> 00:33:30.759
you would do like a full page
load, which is obviously more expensive and

380
00:33:30.839 --> 00:33:35.279
it's a bit jarring for the user
as well, because like let's say it's

381
00:33:35.279 --> 00:33:37.119
a long list of posts, and
the scroll like halfway down and then they

382
00:33:37.119 --> 00:33:40.039
click delete and you do a full
page load, it will take you way

383
00:33:40.079 --> 00:33:46.039
back, right back up to the
page right. So eight kind of attempted

384
00:33:46.119 --> 00:33:52.440
to solve this problem without adding any
back end complexity, because if you use

385
00:33:52.440 --> 00:33:55.920
a turbo frame, you're adding more
logic on the back end. So it

386
00:33:57.079 --> 00:34:04.920
uses a library called idiomorph and it
uses that to just morph the new page

387
00:34:05.000 --> 00:34:07.920
into the old page. So by
that what I mean is it kind of

388
00:34:07.920 --> 00:34:14.320
makes it diff of the two domes
and it only makes updates for the things

389
00:34:14.320 --> 00:34:17.440
that have changed. Right, So
you can opt into this on a page

390
00:34:17.480 --> 00:34:22.360
by page basis with a meta tag. So now, if let's take the

391
00:34:22.400 --> 00:34:28.119
same use case and you've opted into
morphing page refreshes using the meta tag,

392
00:34:29.280 --> 00:34:31.480
you do the exact same thing on
the server in the in the destroy action,

393
00:34:31.599 --> 00:34:36.159
you delete the post and you redirag
back to the to the post index.

394
00:34:37.119 --> 00:34:43.000
H but on and on the server
obviously you render the entire posts index.

395
00:34:43.559 --> 00:34:45.760
But now what turbo will do is
because you've opted into morphing, is

396
00:34:45.800 --> 00:34:51.519
that it will diff the current dorm
with the dormant gets from the server and

397
00:34:51.559 --> 00:34:55.079
then just morph the two so as
a user, your scroll position will be

398
00:34:55.119 --> 00:35:00.719
retained and all you'll see is that
that one post that you de it has

399
00:35:00.760 --> 00:35:09.320
been removed. So after this new
edition, the use cases for turbo streams,

400
00:35:09.360 --> 00:35:14.559
I think, just drops down significantly, and you already really want to

401
00:35:14.559 --> 00:35:20.119
be using it very sparingly when there
is no other option, because it's the

402
00:35:20.239 --> 00:35:23.199
kind of thing. It's the kind
of thing that I think you'd refer to

403
00:35:23.239 --> 00:35:27.000
as a sharp knife in rails.
I know that it's a phrase that you

404
00:35:27.079 --> 00:35:31.559
used quite a lot with both Ruby
and rails, and you want to be

405
00:35:31.679 --> 00:35:36.599
using them when the time is right, and not just across the boat,

406
00:35:36.639 --> 00:35:39.320
because it's quite easy to make a
mess, right, that makes sense.

407
00:35:40.000 --> 00:35:45.280
Yeah, I was at Rails World
last year when David I don't know why

408
00:35:45.280 --> 00:35:52.679
I was calling David instead of DH
but when David was showing us Turbo eight

409
00:35:52.800 --> 00:35:57.000
with that feature where I think what
he did was he had like a conbind

410
00:35:57.039 --> 00:36:01.400
board and yes, and so he
you know, he dropped in a new

411
00:36:01.440 --> 00:36:06.199
column and then removed it, and
he showed the old behavior where when you

412
00:36:06.239 --> 00:36:07.199
would do that, it would,
yeah, would jump to the top.

413
00:36:07.840 --> 00:36:12.320
And then afterward he said, now
it doesn't do that basically, so yeah,

414
00:36:12.400 --> 00:36:15.760
I think I think that was from
horz Talk. Actually, he's the

415
00:36:16.320 --> 00:36:22.440
guy who I think spearheaded the whole
morphing effort, and I think that was

416
00:36:22.559 --> 00:36:27.800
the the use case for which it
was developed and then extracted into turbos.

417
00:36:27.880 --> 00:36:31.679
I think that can band style interface
in base Camp. And I think probably

418
00:36:31.800 --> 00:36:37.440
hate calendar as well, So I
might have been hate calendar actually, but

419
00:36:37.159 --> 00:36:42.880
yeah, it was. It was
That's the reason for which it was developed.

420
00:36:43.639 --> 00:36:47.000
So turbo links is or yeah,
not turble links, turbome Turbo native.

421
00:36:47.800 --> 00:36:55.679
It's a wrapper around your web application
essentially. Yes, So okay,

422
00:36:55.719 --> 00:37:02.000
let me zoom out a bit and
explain exactly how debonative works. So there

423
00:37:02.000 --> 00:37:10.000
are a few approaches to hybrid apps, because hybrid basically means you're mixing web

424
00:37:10.039 --> 00:37:15.239
technology with native technology and using both
together. That's where the term hybrid comes

425
00:37:15.239 --> 00:37:20.000
from. A lot of apps do
that. Though. We had an iOS

426
00:37:20.039 --> 00:37:24.239
show on this network for a long, long long time, went on hiatus

427
00:37:24.239 --> 00:37:29.519
in November of twenty nineteen, but
that was one of the tricks if you

428
00:37:29.599 --> 00:37:35.400
had some UI that wasn't how do
I put it, It wasn't exactly what

429
00:37:35.519 --> 00:37:40.920
Apple gives you in their UI kit, then yeah, a lot of people

430
00:37:40.920 --> 00:37:45.840
would pull in web technology and just
seamlessly lay it in there to get what

431
00:37:45.880 --> 00:37:51.760
they wanted. So this isn't a
new idea by any means. It's not

432
00:37:51.840 --> 00:37:57.960
a new idea. I think what
derbonative does is just standardize, standardizes it

433
00:37:58.079 --> 00:38:01.760
a little bit. So actually gave
a talk on this at a couple of

434
00:38:01.760 --> 00:38:08.840
conferences last year called native apps are
dead, long lived native apps because it's

435
00:38:09.159 --> 00:38:16.000
I'm honestly astonished that the determinative approach
isn't more widely used because what it does

436
00:38:16.320 --> 00:38:22.719
is it builds the backbone of your
app natively, so all your the navigation

437
00:38:23.440 --> 00:38:25.960
and stuff like that. And let's
like, let's say you have a tap

438
00:38:27.039 --> 00:38:31.239
bar, which most apps do.
Those are all built natively. You're not

439
00:38:31.239 --> 00:38:36.119
gonna get You're not going to get
away from having to write swift cotlan.

440
00:38:36.199 --> 00:38:39.559
You're going to have to write some
native code. You're going to have to

441
00:38:39.639 --> 00:38:46.840
have an excurt project and an Android
Studia project. But what turbinative does is

442
00:38:46.880 --> 00:38:53.920
that instead of like rendering uh,
instead of you recreating each view in native

443
00:38:54.000 --> 00:39:01.239
code within that kind of backbone that
of the native elements, it renders web

444
00:39:01.280 --> 00:39:05.800
content, So you have your navigation
bar at the top, you have your

445
00:39:05.840 --> 00:39:08.039
tap bar at the bottom, but
in the middle where a content is,

446
00:39:08.440 --> 00:39:14.320
it's just a web view with HTML
in it. And that I think is

447
00:39:14.440 --> 00:39:21.840
really powerful because stuff that's kind of
just users expect out of a platform is

448
00:39:21.960 --> 00:39:27.199
just there. Like on iOS,
when you kind of go forward through pages,

449
00:39:27.840 --> 00:39:30.880
you can just swipe from left to
right to go back. Stuff like

450
00:39:30.920 --> 00:39:34.599
that just works out of the box. iOS just gives you that kind of

451
00:39:34.599 --> 00:39:37.840
stuff out of the box, and
since you're working again, you're working with

452
00:39:37.039 --> 00:39:44.760
the platform, you get all that
stuff for free. So Turbonative just standardizes

453
00:39:45.000 --> 00:39:51.519
that kind of architecture so it when
you start up a Terminative app, it

454
00:39:51.599 --> 00:39:59.480
will install itself that it's the Turboonative
part of the library will install itself as

455
00:39:59.519 --> 00:40:04.239
an adapt on Turbo itself, which
is the web part of things, and

456
00:40:05.800 --> 00:40:12.320
it kind of hooks into that whole
mechanism to kind of trigger native code.

457
00:40:12.360 --> 00:40:15.280
So like let's say, when you
tap a link in a Turbinative app,

458
00:40:15.840 --> 00:40:22.760
instead of just making a fetcher question
and replacing the current body, Turbonative will

459
00:40:22.639 --> 00:40:29.280
now get the response, create another
screen like a view controller, an ioas

460
00:40:29.239 --> 00:40:32.360
sort of fragment or Android and it
will slide it onto the screen from right

461
00:40:32.400 --> 00:40:37.519
to left, So that's like turbinative. The library does that for you,

462
00:40:37.920 --> 00:40:43.119
So that's kind of where it comes
in. It's just kind of like adapter

463
00:40:43.960 --> 00:40:52.119
to help you build apps which render
web content within this native frame, which

464
00:40:52.159 --> 00:40:55.000
I sometimes refer to as a custom
web browser. So you're kind of just

465
00:40:55.079 --> 00:41:00.519
running your web app within a custom
web browser that you've built yourself using native

466
00:41:00.519 --> 00:41:07.360
app technologies. Gotcha, So I
guess a couple of other questions I have

467
00:41:07.639 --> 00:41:13.079
are you know, just kind of
the things that don't that aren't built into

468
00:41:13.079 --> 00:41:16.480
your application. So for example,
what if you want it in in app

469
00:41:16.480 --> 00:41:22.679
purchases or well, let's just talk
about in a purchase for a minute,

470
00:41:22.440 --> 00:41:29.639
right, So, because you have
a native project, your app is basically

471
00:41:29.800 --> 00:41:32.599
still an expert project or an andro
Studio project, and you are writing some

472
00:41:32.960 --> 00:41:38.920
Swift code or coughtland code, you
have access to all the native APIs,

473
00:41:38.320 --> 00:41:45.719
right, so you can just write
native code to do that. So like

474
00:41:45.719 --> 00:41:50.960
like in AP purchases, for example, Apple would have APIs for that,

475
00:41:51.599 --> 00:41:53.800
so you just write swift code and
then you'd have some kind of way to

476
00:41:54.079 --> 00:42:00.360
communicate that web app, either you're
hitting an API or some of that.

477
00:42:00.519 --> 00:42:06.239
Like obviously the exact architecture would depend
on your use case. But because like

478
00:42:07.000 --> 00:42:10.280
the native side of things has not
been like hidden away or abstracted away,

479
00:42:10.400 --> 00:42:15.480
you can do anything native that you
want. I got you. So let's

480
00:42:15.480 --> 00:42:19.599
say that I have a button on
my application, and when you tap the

481
00:42:19.639 --> 00:42:23.400
button on the web page, it
takes you to the stripe form. But

482
00:42:23.480 --> 00:42:28.880
on the on the native app,
there's some way for me to trigger the

483
00:42:29.320 --> 00:42:34.159
native API that says this isn't in
that purchase. So that's why Strata comes

484
00:42:34.239 --> 00:42:43.840
under the picture. So both iOS
and Android have native APIs that let you

485
00:42:43.960 --> 00:42:53.039
communicate to and from JavaScript. So
you can from JavaScript you can post messages

486
00:42:53.039 --> 00:43:00.719
a quote unquote post messages that are
received in native code. So you can

487
00:43:00.840 --> 00:43:05.639
like call like whatever the method signature
is dot post and send some Jason and

488
00:43:05.679 --> 00:43:12.280
then uh, a fully native native
method in Swift or Cortland will be called

489
00:43:12.960 --> 00:43:16.360
with that Jason message that you that
that you sent from JavaScript. And to

490
00:43:16.440 --> 00:43:21.800
go the other way, you can
evaluate JavaScript within a web views from native

491
00:43:21.840 --> 00:43:25.159
code. You can like literally call
like web you' thatt evaluate JavaScript and pass

492
00:43:25.199 --> 00:43:30.079
in a JavaScript string which will be
executed in your web page. So Strata

493
00:43:30.239 --> 00:43:37.880
takes this pathway and gives you an
abstraction layer to communicate from web to native

494
00:43:37.920 --> 00:43:45.400
and vice versa. So it's built
on top of Stimulus, So it's basically

495
00:43:46.079 --> 00:43:51.000
it gives you a concept of components. I think it's called a bridge component,

496
00:43:51.079 --> 00:43:57.599
which is which is a subclass of
a Stimulus controller, and it gives

497
00:43:57.599 --> 00:44:05.639
you just some standard methods to send
messages to native apps. So you would

498
00:44:05.639 --> 00:44:09.079
have a component. So you need
to subclass bridge component and create a component

499
00:44:09.119 --> 00:44:14.760
for yourself on the web and then
create a counterpart component in your native app

500
00:44:14.880 --> 00:44:20.039
using native code, okay, and
then that using Strata. The two would

501
00:44:20.119 --> 00:44:22.800
communicate with each other like on a
Podcast's kind of hard to go into the

502
00:44:22.800 --> 00:44:29.440
details because it's all get Curry,
Curry, but that's basically the gist of

503
00:44:29.480 --> 00:44:32.920
it is you have fully native components
and then the same thing on the web

504
00:44:34.000 --> 00:44:37.480
and then they communicate with each other. And that's how you can send messages

505
00:44:37.960 --> 00:44:42.440
from the web to native and back. So your exact use case, we

506
00:44:42.480 --> 00:44:49.400
can accomplish that with Strata. I
gotcha. What about push notifications? So

507
00:44:50.039 --> 00:44:53.480
you would have to write some native
code for that. You need to like

508
00:44:53.559 --> 00:44:59.920
register push notification token with your server
and stuff like that. That's what it's

509
00:45:00.079 --> 00:45:02.760
it is fully native territories. I
wanted to write about that in my book,

510
00:45:04.119 --> 00:45:08.000
but as I dug into it,
we were going too far into fully

511
00:45:08.079 --> 00:45:15.119
native world and I wanted to stick
to like just like Web in the book.

512
00:45:15.280 --> 00:45:22.440
So it's the same kind of technique
as you would use in a native

513
00:45:22.440 --> 00:45:25.360
app. You do it the same
way on the back end. Again,

514
00:45:25.480 --> 00:45:30.079
you just need to google, like
how do I send Apple Push notifications from

515
00:45:30.079 --> 00:45:34.199
a Rails app and follow the instructions. And I think Rails eight is actually

516
00:45:34.199 --> 00:45:39.559
going to have a framework called Action
Notifier, which kind of healthy sid push

517
00:45:39.639 --> 00:45:45.760
notifications, I think, both on
the web platform and on iOS and Android,

518
00:45:46.079 --> 00:45:51.280
So that should hopefully make life a
lot easier. I feel like I

519
00:45:51.360 --> 00:45:52.639
lucked out that the other guys didn't
show up, because now I can ask

520
00:45:52.760 --> 00:46:00.119
I got to ask all my dumb
questions. So because yeah, I mean,

521
00:46:00.119 --> 00:46:02.559
this is all stuff that I've wanted
to do for a long time that

522
00:46:02.639 --> 00:46:06.400
I just haven't done. Yeah,
I'm not sure that there's a whole lot

523
00:46:06.480 --> 00:46:14.079
more necessarily that I need to dive
into. Rails uses a lot of the

524
00:46:14.199 --> 00:46:17.400
at least Turbo by default. I
don't know if it pulls in strata for

525
00:46:17.519 --> 00:46:24.679
anything, since it's a native bridge. But yeah, so let's say that

526
00:46:24.719 --> 00:46:30.000
you were going to build like a
complete ecosystem on your Rails app, right,

527
00:46:30.039 --> 00:46:34.119
So you were gonna and the thing
that I keep dreaming of is kind

528
00:46:34.159 --> 00:46:37.599
of a Netflix for developers, right, so it's, hey, you know,

529
00:46:37.960 --> 00:46:43.880
you've got all this content from all
these series, shows, podcasts,

530
00:46:44.119 --> 00:46:46.239
whatever, right, and so you
can come in and you can get any

531
00:46:46.440 --> 00:46:51.519
content that we've either created or licensed, right, And so you know,

532
00:46:51.559 --> 00:46:55.000
building the Rails app, and then
you know, I can totally see doing

533
00:46:55.000 --> 00:47:00.159
something with say Turbo where you know, it's like you click the play this

534
00:47:00.320 --> 00:47:04.840
video button, right, and then
it just you know, replaces parts of

535
00:47:04.880 --> 00:47:07.760
the screen with relevant stuff, or
if it reloads it, right, maybe

536
00:47:07.800 --> 00:47:12.559
it just does Turbo drive and just
you know, replaces the body. However

537
00:47:12.599 --> 00:47:15.320
I want to do that, you
know, So I can see a lot

538
00:47:15.400 --> 00:47:20.639
of ways that I can make that
do what I want. I'm pretty familiar

539
00:47:20.679 --> 00:47:25.039
with Stimulus, but I could build
the native app right and just do Turbo

540
00:47:25.119 --> 00:47:30.719
Native and have it load up the
video library. I guess one question I

541
00:47:30.760 --> 00:47:34.519
have is is, yeah, is
there a way to do how would I

542
00:47:34.559 --> 00:47:38.639
do the offline mode? If somebody
wanted to watch one of those videos they

543
00:47:38.760 --> 00:47:43.599
say this for later, right I'm
getting on an airplane. Yeah, the

544
00:47:43.639 --> 00:47:47.000
best way to do it would be
service workers, because you're kind of already

545
00:47:47.119 --> 00:47:54.800
in the web world, so like
building out a full like native persistence architecture

546
00:47:54.880 --> 00:48:00.960
would be just a bit much,
I think, right of service workers,

547
00:48:00.079 --> 00:48:07.440
That's how I'd do it. You
have service workers go basically download the video

548
00:48:07.559 --> 00:48:13.559
and yeah, I want it.
I can't comment on exactly how that would

549
00:48:13.599 --> 00:48:16.840
work because I have a basic understanding
of service workers. I don't have actually

550
00:48:16.840 --> 00:48:22.639
built anything with it myself, but
like ninety nine percent show that kind of

551
00:48:22.679 --> 00:48:31.559
use case is perfect for service workers. Fair enough. I'm also curious,

552
00:48:31.599 --> 00:48:36.480
and I think I think the answer
to this is going to be You're going

553
00:48:36.559 --> 00:48:38.639
to have to ask the Turbo team
because what I'd like. The other thing

554
00:48:38.679 --> 00:48:44.719
I'd like to do is expand it
to other parts of the ecosystem that's out

555
00:48:44.760 --> 00:48:47.639
there. So lately I've been looking
at I have like six or seven fire

556
00:48:47.760 --> 00:48:53.599
TVs in my house, right,
firestick TVs, and so i'd like to,

557
00:48:53.920 --> 00:48:58.639
and you can load a web app
in as your app, And so

558
00:48:58.719 --> 00:49:02.719
I'm wondering if Turbo or Turbative.
I'm assuming turbonative doesn't apply there, but

559
00:49:04.039 --> 00:49:07.000
I guess maybe it does because you
can also run it as an Android app.

560
00:49:07.360 --> 00:49:09.639
You build it an Android studio.
So do you know much about that

561
00:49:09.960 --> 00:49:14.920
or uh? No, I couldn't
tell you off the top of my head.

562
00:49:14.920 --> 00:49:19.039
But if it kind of works as
an Android app, maybe you could

563
00:49:19.119 --> 00:49:23.559
adapt it. I don't know the
APIs well enough, because I mean,

564
00:49:23.679 --> 00:49:28.119
Terminative is very much built I think
with the adoption, that's going to be

565
00:49:28.159 --> 00:49:30.320
a mobile app. So if the
APIs, if the native apps, the

566
00:49:30.400 --> 00:49:36.440
native APIs are the same, like
it's still using like an Android we have

567
00:49:36.519 --> 00:49:39.320
an activity and a fragment and stuff. If it's still using those same APIs,

568
00:49:39.800 --> 00:49:45.440
then it probably would work, But
if it's different, then probably not.

569
00:49:46.159 --> 00:49:49.960
Okay, is there anything else that
I didn't ask about? Do you

570
00:49:50.000 --> 00:49:52.599
think people are going to want to
know about? No? I think we've

571
00:49:52.960 --> 00:49:58.519
covered Turbo quite well. We could
talk about stimulus if you want, but

572
00:49:59.119 --> 00:50:02.360
if you've covered that before, then
I think we have. And we're getting

573
00:50:02.360 --> 00:50:06.199
toward the end of our time anyway, we've already been talking for fifty three

574
00:50:06.239 --> 00:50:12.559
minutes. So yeah, I'm also
looking at bringing David or not David Nate

575
00:50:12.599 --> 00:50:15.280
Hopkins on to talk about some of
the stuff that he just released, so,

576
00:50:15.000 --> 00:50:22.440
oh nice, the other stuff.
Let's talk about the codex here for

577
00:50:22.480 --> 00:50:25.000
just another minute. So you talked
about you know, you basically took eight

578
00:50:25.039 --> 00:50:30.480
months off to write it. If
people want to buy it, they just

579
00:50:30.519 --> 00:50:37.400
got railsand hot wirecodex dot com.
That's right, and it's it's ninety nine

580
00:50:37.440 --> 00:50:40.800
dollars. But it'll write you through. It'll walk you through writing the whole

581
00:50:43.519 --> 00:50:50.159
the whole mess. Yeah, so
it teaches you all the rails, constitution

582
00:50:50.239 --> 00:50:53.840
frameworks are like active storage, auction, railbox, action, cable, everything,

583
00:50:54.000 --> 00:50:58.199
And it doesn't just teach you how
to use them. It gives you

584
00:50:58.199 --> 00:51:01.800
an understanding of how they work.
So what kind of really annoyed me.

585
00:51:04.320 --> 00:51:07.320
In most tutorials it will say that, okay, you want to get this

586
00:51:07.440 --> 00:51:10.320
working, write this code and it'll
do what you want, and like,

587
00:51:12.039 --> 00:51:14.960
yeah, well, I don't understand. You haven't given me any understanding of

588
00:51:15.000 --> 00:51:19.119
that code you just said, right
this, So I wanted to make sure

589
00:51:19.159 --> 00:51:22.880
that every tiny bit of code that
I teach in the book has an explanation

590
00:51:22.960 --> 00:51:30.079
of what it does and why I
choose that approach, and if there are

591
00:51:30.119 --> 00:51:34.639
any alternative alternatives what they are.
So like, when you read the book,

592
00:51:34.719 --> 00:51:38.519
you should have not only a really
good understanding of like the entire rail

593
00:51:38.599 --> 00:51:43.119
stack, how it works, and
the different ways in which you can use

594
00:51:43.159 --> 00:51:47.280
it, but also like certain alternatives
that are not covered in the book are

595
00:51:47.360 --> 00:51:55.280
signposted. So like have a chapter
on search which teaches search using Postgress's native

596
00:51:55.280 --> 00:51:59.960
full tech search, and there's an
entire discussion at the end of that chapter

597
00:52:00.159 --> 00:52:05.960
about the different kinds of searches that
Postgress off offers but that I didn't cover

598
00:52:06.000 --> 00:52:08.679
in the book when you would use
those kind of searches. And then it

599
00:52:08.719 --> 00:52:13.039
also has a discussion on like mainly
search and elastic search and when you want

600
00:52:13.079 --> 00:52:17.800
to use those. So like all
the questions that I kind of come up

601
00:52:17.800 --> 00:52:22.719
with in my head when I'm trying
to learn, I've tried to answer all

602
00:52:22.719 --> 00:52:28.440
those questions, because, like it's
I always find it quite frustrating when people

603
00:52:28.559 --> 00:52:34.159
don't cover things from all angles and
editorial, so I kind of wanted to

604
00:52:35.000 --> 00:52:37.360
I know it's a cliche, but
I wanted to write the book that I

605
00:52:37.360 --> 00:52:42.199
wish I had, So I've just
tried to be as comprehensive as I could.

606
00:52:42.239 --> 00:52:47.280
I know that's kind of made the
book quite large and maybe not quite

607
00:52:47.320 --> 00:52:52.920
as easily accessible just because of the
size. But I kind of on the

608
00:52:52.960 --> 00:52:59.599
size side of being comprehensive over the
side of being succinct. All right,

609
00:52:59.639 --> 00:53:07.280
well, I'm gonna go ahead and
pick push us into the the last part

610
00:53:07.400 --> 00:53:12.159
of our show, and that is
picks, and then we'll wrap up.

611
00:53:13.159 --> 00:53:15.719
I'll go ahead and go first,
and you can kind of get an idea

612
00:53:15.880 --> 00:53:21.800
of what's involved, so picks or
just shout outs about stuff that you like.

613
00:53:22.239 --> 00:53:24.480
I mean that that's essentially it.
So some people show up and they

614
00:53:24.480 --> 00:53:29.199
pick a bunch of tech stuff.
Other people show up and pick other stuff.

615
00:53:29.239 --> 00:53:31.280
I'm gonna go ahead and throw out
some picks on my own. So

616
00:53:31.320 --> 00:53:35.119
the first pick that I have always
do a board game pick, and I'm

617
00:53:35.119 --> 00:53:46.000
gonna pick a dice forge. So
it's kind of an interesting take on deck

618
00:53:46.039 --> 00:53:52.920
building, except your building dice instead
of instead of building a deck or a

619
00:53:52.960 --> 00:53:59.519
hand. And so what you wind
up doing is every turn you get an

620
00:53:59.559 --> 00:54:06.039
option of either grabbing a die face
or you know, taking a card that

621
00:54:06.079 --> 00:54:13.159
gives you victory points and special abilities, and then you and you buy either

622
00:54:13.239 --> 00:54:15.800
one, so you either spend goal
or you spend Sun or Moon tokens to

623
00:54:15.800 --> 00:54:21.280
get them. And then you when
you buy die faces, you pull the

624
00:54:21.360 --> 00:54:27.199
face off of your dice and put
the new face on and they're kind of

625
00:54:27.239 --> 00:54:31.559
like legos that way, a very
fun game. Played it last night with

626
00:54:31.599 --> 00:54:37.519
some friends of mine, and yeah, it has a Board Game Geek weight

627
00:54:37.599 --> 00:54:42.920
of one point ninety seven, which
means it's fairly approachable for casual players.

628
00:54:43.880 --> 00:54:45.559
It went kind of fast too.
I think we played it in forty five

629
00:54:45.559 --> 00:54:51.360
minutes, maybe maybe a little longer
than that, pretty close, and we

630
00:54:51.360 --> 00:54:57.280
were teaching our friends how to play
it. So anyway, really enjoyed Dice

631
00:54:57.320 --> 00:55:01.079
Forge, and so yeah, if
you want kind of a different take on

632
00:55:04.119 --> 00:55:06.920
yeah, on how that works,
then that's awesome. I'm going to post

633
00:55:07.000 --> 00:55:14.639
to the YouTube and Facebook and stuff
links to Board Game Geek and to Amazon

634
00:55:14.719 --> 00:55:19.639
where you can buy it. The
Amazon link is going to be an affiliate

635
00:55:19.679 --> 00:55:22.239
link, just so you know,
so if you buy it there, I

636
00:55:22.239 --> 00:55:23.760
get a little piece of the action. It doesn't cost you anything extra,

637
00:55:23.800 --> 00:55:30.360
it's just anyway. And then other
picks. So I am on the tail

638
00:55:30.559 --> 00:55:39.280
end of a book series, and
the book series the let me look it

639
00:55:39.360 --> 00:55:44.880
up on my phone. So I've
been listening to it and it's I picked

640
00:55:44.920 --> 00:55:51.800
other books by Brent Weeks in the
past. This one's called Beyond the Shadows.

641
00:55:52.400 --> 00:55:59.079
The book is it's the third book
in the series. I'm trying to

642
00:55:59.079 --> 00:56:02.960
remember the name of the book series
itself. Title details, there we go.

643
00:56:06.239 --> 00:56:08.559
It's the Night Angel series. This
is the third book in the series.

644
00:56:08.960 --> 00:56:15.920
Anyway, I'm really enjoying it.
It's about this kid who basically becomes

645
00:56:15.920 --> 00:56:22.320
an assassin, and there's magic and
politics and anyway, it's been really really

646
00:56:22.320 --> 00:56:24.880
good so far, so I'm going
to pick that the Night Angel series.

647
00:56:25.679 --> 00:56:32.400
The first book in the series,
if you're interested, is called The Way

648
00:56:32.400 --> 00:56:37.800
of Shadows, and it looks like
there's a prequel that's two hours long too

649
00:56:37.880 --> 00:56:42.119
that I haven't read. So anyway, it's The Way of Shadows and then

650
00:56:43.000 --> 00:56:50.000
Shadows Edge, and then the last
one is Beyond the Shadows. So yeah,

651
00:56:50.719 --> 00:56:54.800
really really enjoying that. Looks like
there might be another series that's a

652
00:56:54.840 --> 00:57:00.320
sequel to it, because it says
book one Kyler Chronicles and Kyler's the main

653
00:57:00.440 --> 00:57:06.079
protagonists. So anyway, terrific book. Really enjoying that, and then of

654
00:57:06.119 --> 00:57:09.559
course, just a couple of shout
outs about Rails geniuses. I'm gonna start

655
00:57:09.559 --> 00:57:14.599
inviting experts to come in and talk
to us in May. If you sign

656
00:57:14.639 --> 00:57:16.760
up before May, it's gonna be
me, and we're just gonna chat about

657
00:57:16.760 --> 00:57:22.239
what you want to learn and who
I can get on to be experts to

658
00:57:22.280 --> 00:57:24.840
show up to some of our calls
and make sure that we're providing you kind

659
00:57:24.840 --> 00:57:30.079
of the value you want. I'm
also gonna let everyone know I'm still looking

660
00:57:30.159 --> 00:57:36.119
for, you know, freelance contract
or a full time job if I have

661
00:57:36.239 --> 00:57:40.760
to, so that you know,
I got to pay the bills. And

662
00:57:40.840 --> 00:57:47.480
finally I got this set up when
Monday. So if you go to Ruby

663
00:57:47.559 --> 00:57:52.519
Rogues dot com slash Premium and you
sign up, it's nine dollars a month.

664
00:57:52.920 --> 00:57:57.199
You get all the shows without the
ads, and I'm planning on putting

665
00:57:57.239 --> 00:58:01.599
extra content in there as well.
So I was supporting the shows off of

666
00:58:01.599 --> 00:58:05.800
my contract income, and so I'm
trying to find another way to do that

667
00:58:05.840 --> 00:58:07.719
too, and this seems like a
good way. So you know, if

668
00:58:07.760 --> 00:58:12.159
we have one hundred or so people
sign up, then it should cover most

669
00:58:12.159 --> 00:58:16.880
of the costs of producing podcasts.
So anyway, that's that's everything I've got.

670
00:58:17.360 --> 00:58:21.800
I USh, what are your picks? Right? So I think I'm

671
00:58:21.800 --> 00:58:25.119
going to start with a music pick
because if you're watching on the YouTube and

672
00:58:25.159 --> 00:58:30.320
stuff, you can see a massive
the case a CD is behind me because

673
00:58:30.400 --> 00:58:37.039
I am still that rare breed that
buys CDs and exclusively listens to music on

674
00:58:37.119 --> 00:58:43.360
CDs rather than streaming sentences. So
I'm gonna start at the past. Weird,

675
00:58:45.960 --> 00:58:52.159
yeah, and in my friend group
we find people who don't buy CDs.

676
00:58:52.199 --> 00:58:54.920
We had I'm like part of a
it's definitely not a cult. Not

677
00:58:54.960 --> 00:58:59.280
a cult. We never call it
a cult. That's what I say about

678
00:58:59.320 --> 00:59:07.599
my board game group. So I'm
gonna start with a band called Life Signs,

679
00:59:07.639 --> 00:59:15.079
who actually are actually oh nice.
So yeah, They're a band I've

680
00:59:15.119 --> 00:59:20.800
been following for a couple of years
and they are just absolutely fantastic, and

681
00:59:20.840 --> 00:59:28.199
I'm constantly astonished that they are still
playing in pubs two hundred people rather than

682
00:59:28.239 --> 00:59:34.000
theaters to a few thousand, because
the level of the music is just unbelievable.

683
00:59:34.039 --> 00:59:37.840
It's just yeah, they struggle to
get the support of the industry,

684
00:59:37.880 --> 00:59:40.599
so I want to give them a
shout out. So that's life Signs.

685
00:59:42.199 --> 00:59:45.880
Highly recommend it to anyone who's into
like rock music of any kind of description.

686
00:59:46.079 --> 00:59:51.719
I'm sure you like it. And
I'll make a tech pic as well.

687
00:59:51.880 --> 01:00:04.079
So there's a reals dashboard library called
AVO made Adrian Maren who also before

688
01:00:04.760 --> 01:00:13.360
have you. Yeah, it's also
he also Yeah, he's the nicest guy

689
01:00:13.400 --> 01:00:21.039
and he also runs a friendly that
RB conference in Bucharest. And I got

690
01:00:21.039 --> 01:00:24.880
to use AVO for the first time
on my current client project where we were

691
01:00:24.920 --> 01:00:31.559
shopping around for a few different admin
dashboards and I was just kind of just

692
01:00:31.559 --> 01:00:35.400
blew the others out of the water, to be honest, Like I played

693
01:00:35.400 --> 01:00:39.280
around with some others and this was
just the docs were unbelievably good. The

694
01:00:39.400 --> 01:00:45.079
UI is really good out of the
box. Pretty much any question I had

695
01:00:45.119 --> 01:00:47.440
I could put into the docks search
and I got an answer for it.

696
01:00:50.679 --> 01:00:53.440
Yeah, highly recommendative. There is
an open source free version and if you

697
01:00:53.519 --> 01:00:59.840
need something more involved, that are
like paid versions as well. And yeah,

698
01:01:00.119 --> 01:01:02.800
AVO, AVO, dot, AVO, HQ dot io or something of

699
01:01:02.840 --> 01:01:07.599
that. I think is the u
r L. You highly recommend it.

700
01:01:07.840 --> 01:01:14.719
For admund dashboards because I'm using it
right now. Yeah, the U r

701
01:01:14.840 --> 01:01:17.400
L that I have is avo dot
cool, but it redirects to avo hq

702
01:01:17.559 --> 01:01:23.800
dot IOK. Nice, that's a
good r L. So yeah, I'll

703
01:01:23.880 --> 01:01:28.639
drop that in the comments. If
you're on Twitter or YouTube or Facebook,

704
01:01:28.639 --> 01:01:32.079
you'll see it show up in the
comments. Unfortunately, Twitter, which is

705
01:01:32.079 --> 01:01:37.880
where most people are watching this,
doesn't do the comments. So anyway,

706
01:01:37.920 --> 01:01:42.559
go find us on YouTube and you
can get you can get it on the

707
01:01:42.599 --> 01:01:49.320
recording of the live stream and that's
at YouTube dot com, slash at topendevs

708
01:01:50.400 --> 01:01:54.559
cool deal. If people want to
connect with you Ayush, they have questions

709
01:01:54.559 --> 01:01:58.880
for you, anything like that,
where do they find you? So best

710
01:01:58.920 --> 01:02:06.400
ways probably email or masterdon So my
email is a us A y U s

711
01:02:06.639 --> 01:02:15.000
h at radioactivetoy dot tech. That's
my business website as well. Cheers.

712
01:02:15.320 --> 01:02:19.840
Yeah, that's my business website as
well, Radioactive Toy dot tech. And

713
01:02:19.880 --> 01:02:25.920
I'm on masterdon at ayush at Ruby
dot social. Those are probably the best

714
01:02:25.920 --> 01:02:29.320
ways. I do have Twitter,
but I honestly don't use it a whole

715
01:02:29.360 --> 01:02:32.199
lot these days, so you may
or may not get a response if you

716
01:02:32.239 --> 01:02:37.280
ping me on there, so email
a master on is the best? All

717
01:02:37.400 --> 01:02:39.159
right? Good deal. Well we'll
go ahead and wrap it up here.

718
01:02:39.639 --> 01:02:43.599
Thanks for coming. This was fun. Thanks for having me. Yeah,

719
01:02:43.599 --> 01:02:45.679
I'd love to chat about Bridgetown some
at the time as well. Yeah.

720
01:02:45.679 --> 01:02:51.079
Absolutely, well we'll get you on
for sure. Sounds good. Thanks very

721
01:02:51.199 --> 01:02:52.679
much. Until next time, folks, max out

