WEBVTT

1
00:00:05.160 --> 00:00:09.119
<v Speaker 1>Hello, everybody, Welcome to another exciting episode of JavaScript Shabber.

2
00:00:09.160 --> 00:00:11.400
<v Speaker 1>I am Steve Edwards, the host with the face for

3
00:00:11.480 --> 00:00:13.439
<v Speaker 1>radio and the voice for being in mine. But you're

4
00:00:13.480 --> 00:00:17.239
<v Speaker 1>stuck with me as your host today. With me on

5
00:00:17.399 --> 00:00:19.879
<v Speaker 1>our panel, we have mister Dan Shapiro.

6
00:00:19.879 --> 00:00:23.160
<v Speaker 2>How are you doing, Dan, I'm fine, Hello from Tel Aviv.

7
00:00:23.320 --> 00:00:25.760
<v Speaker 3>Where it's probably really warm, right, well.

8
00:00:25.760 --> 00:00:28.640
<v Speaker 2>Not super warm, but nice. You know, you can wear

9
00:00:28.640 --> 00:00:30.039
<v Speaker 2>a T shirt outside if you like.

10
00:00:31.000 --> 00:00:34.960
<v Speaker 1>Right, Yeah, I was just I'll diverge a little bit here.

11
00:00:34.960 --> 00:00:37.920
<v Speaker 1>I was just in Thailand, been gone for a couple

12
00:00:37.960 --> 00:00:42.240
<v Speaker 1>of weeks. Was visiting my daughter there. And in Thailand

13
00:00:42.280 --> 00:00:45.280
<v Speaker 1>it's really really warm. It barely gets below seventy fahrenheit

14
00:00:45.399 --> 00:00:47.799
<v Speaker 1>during the year, even at the lowest point in the year.

15
00:00:49.119 --> 00:00:51.000
<v Speaker 1>And on the way there we got so I dressed

16
00:00:51.039 --> 00:00:53.679
<v Speaker 1>for Thailand, right too close for Thailand. Well, on the

17
00:00:53.679 --> 00:00:57.920
<v Speaker 1>way there, we got delayed in twenty four hours in Soul, Korea,

18
00:00:58.799 --> 00:01:02.520
<v Speaker 1>And to say it was cold is the understatement of

19
00:01:02.560 --> 00:01:06.840
<v Speaker 1>the year. We went from I told when we left

20
00:01:06.879 --> 00:01:08.879
<v Speaker 1>Seoul and went to Chang Mai, we went from twenty

21
00:01:08.879 --> 00:01:13.079
<v Speaker 1>two fahrenheit to twenty two celsius because it was.

22
00:01:13.079 --> 00:01:14.719
<v Speaker 3>Like below zero cold.

23
00:01:14.719 --> 00:01:16.959
<v Speaker 1>It was so cold we tried to go for a

24
00:01:16.959 --> 00:01:19.200
<v Speaker 1>walk one day and lasted about three minutes and said, okay,

25
00:01:19.239 --> 00:01:22.760
<v Speaker 1>we're going back inside. So but yeah, chang Mi was

26
00:01:22.799 --> 00:01:26.200
<v Speaker 1>awesome because we had it was like in the eighties fahrenheit,

27
00:01:26.879 --> 00:01:29.079
<v Speaker 1>you know, no humidity. This is the coolest time of

28
00:01:29.120 --> 00:01:31.439
<v Speaker 1>the year, coolest in terms of temperature. Not because I

29
00:01:31.560 --> 00:01:36.480
<v Speaker 1>was there, but but yeah, it was perfect, perfect weather.

30
00:01:36.519 --> 00:01:38.480
<v Speaker 1>And then I came back from wearing shorts and no

31
00:01:38.560 --> 00:01:43.439
<v Speaker 1>code all week to bundling up and having multiple lets

32
00:01:43.480 --> 00:01:43.840
<v Speaker 1>on the bed.

33
00:01:44.519 --> 00:01:46.920
<v Speaker 2>So tel Aviv is not in the eighties, but it's

34
00:01:47.040 --> 00:01:49.959
<v Speaker 2>in the high sixties, low seventies.

35
00:01:50.079 --> 00:01:51.280
<v Speaker 3>That's still pretty nice.

36
00:01:51.239 --> 00:01:51.879
<v Speaker 2>During the day.

37
00:01:52.319 --> 00:01:53.120
<v Speaker 3>Yeah, that's nice.

38
00:01:53.200 --> 00:01:55.159
<v Speaker 2>Night night it gets a bit colder.

39
00:01:55.879 --> 00:01:58.959
<v Speaker 1>And then also on our panel, we have mister aj

40
00:01:59.079 --> 00:02:01.319
<v Speaker 1>how are you doing, aj Yo yo?

41
00:02:01.480 --> 00:02:05.239
<v Speaker 4>Coming at you live from the show room, So.

42
00:02:05.280 --> 00:02:08.319
<v Speaker 2>It's better than the alternative, Yes.

43
00:02:08.199 --> 00:02:10.280
<v Speaker 3>Coming out you dead? Yes, I agree.

44
00:02:11.000 --> 00:02:15.159
<v Speaker 1>So, and our very special guest today is mister Tanner's

45
00:02:15.199 --> 00:02:17.240
<v Speaker 1>Wensley of tan Stack fame.

46
00:02:17.280 --> 00:02:18.159
<v Speaker 3>How you doing Tanner?

47
00:02:19.560 --> 00:02:20.159
<v Speaker 5>I do you agree?

48
00:02:21.120 --> 00:02:22.759
<v Speaker 2>Yeah, I'm very excited.

49
00:02:22.479 --> 00:02:22.919
<v Speaker 5>To be here.

50
00:02:23.560 --> 00:02:24.759
<v Speaker 3>All right, it's good to have you back.

51
00:02:24.800 --> 00:02:27.680
<v Speaker 1>We had have had Tanner here in the past on

52
00:02:27.800 --> 00:02:30.000
<v Speaker 1>JavaScript Drabber on episode what was it Dan?

53
00:02:30.199 --> 00:02:31.000
<v Speaker 3>I forgot the number.

54
00:02:31.240 --> 00:02:34.599
<v Speaker 2>Oh I think it was episode five seventy eight.

55
00:02:34.680 --> 00:02:38.639
<v Speaker 1>Five seventy eight talking about the tan Stack. And for

56
00:02:38.719 --> 00:02:40.479
<v Speaker 1>those of you who might be wondering, this is a

57
00:02:40.560 --> 00:02:43.800
<v Speaker 1>question I asked on the previous episode. It is not

58
00:02:43.840 --> 00:02:46.560
<v Speaker 1>called Tanner tan Stack because he is tan, because if

59
00:02:46.599 --> 00:02:48.960
<v Speaker 1>you look at him, he is obviously not very tan

60
00:02:49.400 --> 00:02:49.599
<v Speaker 1>like me.

61
00:02:50.879 --> 00:02:52.560
<v Speaker 3>It is tan because of Tanner.

62
00:02:52.680 --> 00:02:55.400
<v Speaker 1>So for those of you unlike me who made that

63
00:02:55.560 --> 00:02:57.080
<v Speaker 1>logical jump, good for you.

64
00:02:57.159 --> 00:02:59.879
<v Speaker 3>But some of us aren't that smart anyway.

65
00:03:00.680 --> 00:03:04.120
<v Speaker 1>So we are here ten day to talk about Actually,

66
00:03:04.199 --> 00:03:07.439
<v Speaker 1>before we get into start, let's uh just give a

67
00:03:07.439 --> 00:03:10.560
<v Speaker 1>brief description of what the tan stack is overview for

68
00:03:10.599 --> 00:03:12.159
<v Speaker 1>those who might not have heard of it before.

69
00:03:14.080 --> 00:03:16.039
<v Speaker 5>You guys are gonna give that, right, not me.

70
00:03:18.639 --> 00:03:21.199
<v Speaker 3>Yeah, yeah sure. Let me pull up the about us.

71
00:03:21.080 --> 00:03:25.560
<v Speaker 2>Page and you'll do it. Thank you, So do it

72
00:03:25.560 --> 00:03:26.199
<v Speaker 2>if you want to.

73
00:03:26.319 --> 00:03:28.680
<v Speaker 5>But I appreciate it. I got it. I'm just playing

74
00:03:28.680 --> 00:03:34.199
<v Speaker 5>with you. No. I started tan stack as like an

75
00:03:34.199 --> 00:03:38.479
<v Speaker 5>open source GitHub organization a couple of years ago to

76
00:03:38.719 --> 00:03:41.080
<v Speaker 5>start collecting all of my libraries that I was building.

77
00:03:42.319 --> 00:03:47.360
<v Speaker 5>It started with uh React table and then React query

78
00:03:47.919 --> 00:03:50.120
<v Speaker 5>that we took both of those agnostics, so they became

79
00:03:50.199 --> 00:03:52.919
<v Speaker 5>something that I didn't want to have to like brand

80
00:03:53.719 --> 00:03:57.080
<v Speaker 5>you know, every framework times every library that I had.

81
00:03:58.159 --> 00:04:01.240
<v Speaker 5>So I decided to call it TAN stack, and so

82
00:04:01.280 --> 00:04:03.639
<v Speaker 5>I pulled all those libraries together and then we kept building.

83
00:04:03.800 --> 00:04:08.280
<v Speaker 5>So now there's a there's a virtualization library called tan

84
00:04:08.360 --> 00:04:12.319
<v Speaker 5>SAG Virtual. We have some libraries that are for like

85
00:04:12.520 --> 00:04:15.680
<v Speaker 5>helping you build open source packages. We have our own

86
00:04:15.800 --> 00:04:21.639
<v Speaker 5>store now or reactive store. Tan sac form is an

87
00:04:21.759 --> 00:04:26.160
<v Speaker 5>agnostic headless form library, which is pretty sweet. It's almost

88
00:04:26.240 --> 00:04:29.480
<v Speaker 5>one dot zero, which is pretty pretty cool. What is that?

89
00:04:29.600 --> 00:04:31.839
<v Speaker 1>Is that like a form rendering library where you provide

90
00:04:31.839 --> 00:04:34.560
<v Speaker 1>the underlying structure and it renders the form or what exactly.

91
00:04:35.920 --> 00:04:38.560
<v Speaker 5>Yeah, so it's more around just like the state management,

92
00:04:38.600 --> 00:04:42.759
<v Speaker 5>the validation and the form life cycles for forms, like

93
00:04:42.839 --> 00:04:47.279
<v Speaker 5>for doing client side and full sack forms, but it's headless,

94
00:04:47.319 --> 00:04:49.759
<v Speaker 5>so when it comes time to render those forms, you

95
00:04:50.560 --> 00:04:55.920
<v Speaker 5>attached the form logic to whatever you want, whether it's

96
00:04:55.959 --> 00:04:58.480
<v Speaker 5>like a component library or just a raw input something

97
00:04:58.600 --> 00:05:01.560
<v Speaker 5>like that. Yeah, So it gives you full control over

98
00:05:01.639 --> 00:05:04.199
<v Speaker 5>you over your UI, but gives you all of the

99
00:05:04.319 --> 00:05:09.160
<v Speaker 5>nice logic and validation and management of the form state

100
00:05:09.399 --> 00:05:10.279
<v Speaker 5>that you would expect.

101
00:05:11.199 --> 00:05:11.720
<v Speaker 2>That's cool.

102
00:05:12.120 --> 00:05:15.600
<v Speaker 5>Yeah, Corbyn correctly is the one who's kind of heading

103
00:05:15.639 --> 00:05:21.000
<v Speaker 5>that up. We combined our libraries together. He was building

104
00:05:23.519 --> 00:05:25.600
<v Speaker 5>I can't remember when he was it's been a while,

105
00:05:25.600 --> 00:05:27.920
<v Speaker 5>it's been about two years, but he was building a

106
00:05:27.920 --> 00:05:30.839
<v Speaker 5>form library that was supposed to kind of be the

107
00:05:30.879 --> 00:05:35.240
<v Speaker 5>next version of Formic, but it was React only. And

108
00:05:35.279 --> 00:05:37.240
<v Speaker 5>then I was building one that was really really type

109
00:05:37.279 --> 00:05:39.920
<v Speaker 5>safe and agnostic. So we put them together and that

110
00:05:39.920 --> 00:05:40.959
<v Speaker 5>became pan sac form.

111
00:05:42.639 --> 00:05:45.560
<v Speaker 1>The according to the description, it helps you, quote stop

112
00:05:45.639 --> 00:05:49.399
<v Speaker 1>crying over your forms. So obviously obviously you have experience

113
00:05:49.439 --> 00:05:50.519
<v Speaker 1>in working with forms.

114
00:05:50.680 --> 00:05:54.000
<v Speaker 5>I don't cry too much, but if there's something that

115
00:05:54.040 --> 00:05:56.399
<v Speaker 5>would make me cry, it would be building forms.

116
00:05:56.480 --> 00:05:57.639
<v Speaker 3>Yeah.

117
00:05:57.800 --> 00:06:00.839
<v Speaker 2>By the way, are you familiar with the VEST form validator?

118
00:06:02.160 --> 00:06:03.399
<v Speaker 5>So what validator? Sorry?

119
00:06:03.959 --> 00:06:04.680
<v Speaker 2>Vest?

120
00:06:04.959 --> 00:06:05.519
<v Speaker 5>No, I'm not.

121
00:06:07.000 --> 00:06:10.040
<v Speaker 2>It's greaty. We actually had the creator own of hotel.

122
00:06:10.319 --> 00:06:14.040
<v Speaker 2>He's uh, he works at Meta, but it's it's his

123
00:06:14.120 --> 00:06:18.519
<v Speaker 2>own project. It's it's interesting in that it does form

124
00:06:18.600 --> 00:06:22.199
<v Speaker 2>validation in a way that looks very much like unit testing.

125
00:06:23.360 --> 00:06:25.480
<v Speaker 5>Interesting. Yeah, I would love to look at it. That

126
00:06:25.560 --> 00:06:26.120
<v Speaker 5>sounds cool.

127
00:06:26.759 --> 00:06:29.000
<v Speaker 2>So it's called best Okay.

128
00:06:28.800 --> 00:06:32.040
<v Speaker 1>Needless to say, he's you hear this coming, very invested

129
00:06:32.040 --> 00:06:36.160
<v Speaker 1>in it. Sorry, that was just hanging out there. I

130
00:06:36.199 --> 00:06:37.120
<v Speaker 1>had to grab that one.

131
00:06:37.360 --> 00:06:43.319
<v Speaker 5>Oh yeah, months of all so that so form is

132
00:06:43.399 --> 00:06:46.120
<v Speaker 5>kind of another one we're working on. And then obviously

133
00:06:46.199 --> 00:06:50.199
<v Speaker 5>the last so a year ago we did one dot

134
00:06:50.240 --> 00:06:53.959
<v Speaker 5>zero for Tan sac Router, which I'd been working on

135
00:06:54.040 --> 00:06:57.360
<v Speaker 5>for several years before that as well. And now we're

136
00:06:57.360 --> 00:06:59.360
<v Speaker 5>here to talk about start, which is.

137
00:06:59.399 --> 00:07:02.079
<v Speaker 2>So before before we go there, I noticed that you

138
00:07:02.079 --> 00:07:04.519
<v Speaker 2>have a few more things on the ten stack site.

139
00:07:04.560 --> 00:07:06.560
<v Speaker 2>You've got ten stack ranger.

140
00:07:07.160 --> 00:07:13.399
<v Speaker 5>What is that ranger is? It's not used as much

141
00:07:13.480 --> 00:07:16.199
<v Speaker 5>in my opinion. It's a fun little library from my past.

142
00:07:16.240 --> 00:07:21.519
<v Speaker 5>But you can use it to create multi range sliders.

143
00:07:22.079 --> 00:07:24.480
<v Speaker 5>So if you ever use the range element, you've got

144
00:07:24.480 --> 00:07:29.000
<v Speaker 5>that single slider. Yeah, we needed some that had both

145
00:07:29.040 --> 00:07:33.639
<v Speaker 5>handles that you'll kind of see for range slider selectors,

146
00:07:33.720 --> 00:07:36.040
<v Speaker 5>and then we even had some that would create steps,

147
00:07:36.360 --> 00:07:39.120
<v Speaker 5>so we'd have like three or four different handles on

148
00:07:39.240 --> 00:07:43.160
<v Speaker 5>an individual range input and you'd be able to kind

149
00:07:43.199 --> 00:07:47.720
<v Speaker 5>of create different steps using different handles. So it's a

150
00:07:47.759 --> 00:07:50.560
<v Speaker 5>headless library to create those we wanted it to have

151
00:07:50.600 --> 00:07:55.079
<v Speaker 5>a very custom UI. I don't use it as much

152
00:07:55.240 --> 00:07:57.920
<v Speaker 5>anymore admittedly, but it's still a pretty cool library.

153
00:07:58.839 --> 00:08:00.519
<v Speaker 2>And also ten stack configure.

154
00:08:01.800 --> 00:08:06.920
<v Speaker 5>Yeah, the the config is what we use for publishing

155
00:08:07.199 --> 00:08:13.439
<v Speaker 5>all of our libraries. So it it helps us both

156
00:08:13.680 --> 00:08:18.959
<v Speaker 5>build all of the different versions like ESM and common JS,

157
00:08:19.000 --> 00:08:22.600
<v Speaker 5>like legacy and modern versions, and it helps us publish

158
00:08:22.639 --> 00:08:27.120
<v Speaker 5>those to tan SAC using or to NPM using kind

159
00:08:27.160 --> 00:08:31.680
<v Speaker 5>of our It's it's based on Angular semantic version ing,

160
00:08:32.200 --> 00:08:35.039
<v Speaker 5>but basically lets us do all of our pr automation

161
00:08:35.159 --> 00:08:36.919
<v Speaker 5>for releasing new versions and whatnot.

162
00:08:39.000 --> 00:08:44.240
<v Speaker 2>Cool. Okay, So now back to ten stack start.

163
00:08:46.279 --> 00:08:51.759
<v Speaker 5>So start is I'm going to be honest, it's like

164
00:08:52.039 --> 00:08:56.440
<v Speaker 5>ninety percent of start is just tan stack router. Because

165
00:08:56.679 --> 00:08:59.720
<v Speaker 5>routers are frameworks, there's not really any way around that.

166
00:09:00.879 --> 00:09:03.639
<v Speaker 5>But we decided, I decided to build the router first.

167
00:09:03.639 --> 00:09:07.159
<v Speaker 5>That's just like a client side router that would have

168
00:09:07.279 --> 00:09:11.960
<v Speaker 5>some SSR utilities on top of it. But then trying

169
00:09:12.039 --> 00:09:17.320
<v Speaker 5>to put together your own SSR environment really sucks, which

170
00:09:17.399 --> 00:09:21.159
<v Speaker 5>is why like meta frameworks as we call them exist.

171
00:09:21.799 --> 00:09:27.840
<v Speaker 5>So tansec start is like the official implementation of getting

172
00:09:28.120 --> 00:09:34.480
<v Speaker 5>server features into a tanseac router application that mostly includes

173
00:09:35.759 --> 00:09:38.519
<v Speaker 5>so you get SSR, which is the very first thing

174
00:09:38.519 --> 00:09:42.000
<v Speaker 5>which most people want. It gives you streaming on top

175
00:09:42.039 --> 00:09:44.919
<v Speaker 5>of that as well, so all the new streaming you

176
00:09:44.960 --> 00:09:48.559
<v Speaker 5>know APIs that React has for suspense and just being

177
00:09:48.559 --> 00:09:51.960
<v Speaker 5>able to stream data down in responses in general. And

178
00:09:52.000 --> 00:09:56.600
<v Speaker 5>then it gives you bundling for both, like for all

179
00:09:56.639 --> 00:09:59.720
<v Speaker 5>the environment, so it bundles the client side the server

180
00:09:59.799 --> 00:10:05.240
<v Speaker 5>SID and it also bundles for server functions, which is

181
00:10:07.039 --> 00:10:10.080
<v Speaker 5>it's our version of being able to access you know,

182
00:10:10.279 --> 00:10:13.279
<v Speaker 5>all of the server features that you would expect. But

183
00:10:13.600 --> 00:10:15.639
<v Speaker 5>so that's where it gets a little interesting. I think

184
00:10:15.639 --> 00:10:18.200
<v Speaker 5>we could discuss that a little bit more. But server

185
00:10:18.240 --> 00:10:19.159
<v Speaker 5>functions are really.

186
00:10:18.960 --> 00:10:22.879
<v Speaker 2>Cool before we get to server functions, which I would

187
00:10:22.919 --> 00:10:27.840
<v Speaker 2>definitely want to discuss. RPCS is a favorite topic of

188
00:10:27.879 --> 00:10:30.360
<v Speaker 2>mind and I actually had an episode on jobscript Jabber

189
00:10:30.360 --> 00:10:33.919
<v Speaker 2>when I spoke about our PCs. I don't even I

190
00:10:33.960 --> 00:10:36.360
<v Speaker 2>don't remember the number off the top of my head.

191
00:10:37.279 --> 00:10:40.000
<v Speaker 3>What about it? I would check both places.

192
00:10:40.279 --> 00:10:45.840
<v Speaker 2>Yeah, that's true. I think it's worth mentioning though, because

193
00:10:45.960 --> 00:10:48.279
<v Speaker 2>I think we kind of skipped it that all of

194
00:10:48.320 --> 00:10:52.519
<v Speaker 2>your libraries, utilities, frameworks, whatever, they're all built on top

195
00:10:52.600 --> 00:10:56.679
<v Speaker 2>of React. Right, there's nothing like that. You don't you

196
00:10:56.759 --> 00:11:03.279
<v Speaker 2>haven't implemented your own view framework or whatever it's supposed

197
00:11:03.279 --> 00:11:03.759
<v Speaker 2>to be called.

198
00:11:04.879 --> 00:11:08.200
<v Speaker 5>No, they're not built on top of React. We have

199
00:11:08.320 --> 00:11:13.360
<v Speaker 5>React adapters for all of them. So every single one

200
00:11:13.399 --> 00:11:18.120
<v Speaker 5>of these libraries is in fact called tanstak something because

201
00:11:18.639 --> 00:11:23.679
<v Speaker 5>it's no longer just React. So, for instance, tan sac

202
00:11:23.759 --> 00:11:27.799
<v Speaker 5>query has adapters for React and view and spelt and

203
00:11:27.879 --> 00:11:33.000
<v Speaker 5>solid tan sac Virtual has adapters for all of those,

204
00:11:33.039 --> 00:11:37.039
<v Speaker 5>and SODA's tan sac form and table. Tan sac router

205
00:11:37.360 --> 00:11:41.600
<v Speaker 5>is the only one that is currently React only, and

206
00:11:41.639 --> 00:11:46.240
<v Speaker 5>that's mostly just for our own sanity's sake right now,

207
00:11:48.600 --> 00:11:51.960
<v Speaker 5>basically because we just wanted to get all the way

208
00:11:52.000 --> 00:11:54.759
<v Speaker 5>finished from you know, zero to one dot zero on

209
00:11:54.759 --> 00:11:59.519
<v Speaker 5>one framework. We're still preparing the code base and writing

210
00:11:59.559 --> 00:12:03.279
<v Speaker 5>it to the agnostic but we're just not trying to,

211
00:12:04.399 --> 00:12:05.879
<v Speaker 5>you know, do too much at once.

212
00:12:06.600 --> 00:12:09.559
<v Speaker 2>You think it's really doable. I think I spoke with

213
00:12:09.960 --> 00:12:14.360
<v Speaker 2>Ryan Carneiato while back where he told me that I

214
00:12:14.399 --> 00:12:16.720
<v Speaker 2>think it might have been him. Maybe I'm confusing him

215
00:12:16.720 --> 00:12:19.840
<v Speaker 2>with somebody else, but I think was probably him, and

216
00:12:19.879 --> 00:12:22.840
<v Speaker 2>he probably said something along the lines that he came

217
00:12:22.879 --> 00:12:27.679
<v Speaker 2>to the conclusion that writing a true multi framework router

218
00:12:28.159 --> 00:12:30.919
<v Speaker 2>is bordering on impossible or something.

219
00:12:32.120 --> 00:12:38.519
<v Speaker 5>I've recently changed his mind. So he had some concerns

220
00:12:38.639 --> 00:12:41.840
<v Speaker 5>and so did I honestly, and we got together and

221
00:12:41.879 --> 00:12:45.799
<v Speaker 5>we we've been talking for I mean years, we go

222
00:12:45.879 --> 00:12:48.120
<v Speaker 5>back a long time, and we've been chatting a lot

223
00:12:48.159 --> 00:12:51.480
<v Speaker 5>about this, and recently he he's like, oh, you know what,

224
00:12:51.519 --> 00:12:54.159
<v Speaker 5>with our new Solid two point zero stuff they're working

225
00:12:54.200 --> 00:12:57.559
<v Speaker 5>on in the new async data primitives, there's really no

226
00:12:57.679 --> 00:13:03.080
<v Speaker 5>concerns anymore. It's just opinions on top of routing and

227
00:13:03.399 --> 00:13:07.720
<v Speaker 5>life cycles for navigation. So really what we're going to

228
00:13:07.799 --> 00:13:11.559
<v Speaker 5>do is actually I'll let you in on some fun news.

229
00:13:11.600 --> 00:13:15.200
<v Speaker 5>So it's nothing. It's something official and it might might

230
00:13:15.240 --> 00:13:18.960
<v Speaker 5>never become something official, but behind the scenes, So the

231
00:13:19.039 --> 00:13:23.679
<v Speaker 5>Tanstack Start and the Solid start team we're working very

232
00:13:23.799 --> 00:13:28.039
<v Speaker 5>very closely now on a lot of things. So mainly

233
00:13:28.120 --> 00:13:31.000
<v Speaker 5>one is that tansec Start and Solid have both been

234
00:13:31.039 --> 00:13:34.279
<v Speaker 5>based on Vinci up to this point, which is awesome.

235
00:13:34.360 --> 00:13:36.519
<v Speaker 5>It helped us get to where we are today.

236
00:13:37.039 --> 00:13:37.639
<v Speaker 2>But to.

237
00:13:39.200 --> 00:13:43.919
<v Speaker 5>Better consume Nitro and to even further align our architectures,

238
00:13:44.399 --> 00:13:47.360
<v Speaker 5>we are we are moving away from Vincy to just

239
00:13:47.440 --> 00:13:51.600
<v Speaker 5>a unified layer for start essentially, and it's just going

240
00:13:51.679 --> 00:13:58.120
<v Speaker 5>to have some server function plugins on Nitro coordinator and

241
00:13:58.840 --> 00:14:03.720
<v Speaker 5>that's going to set this stage four tan stack router

242
00:14:04.000 --> 00:14:08.440
<v Speaker 5>for solid, so solid router, and that's that's not nice

243
00:14:09.519 --> 00:14:12.159
<v Speaker 5>that that is a semi active development. We have some

244
00:14:12.240 --> 00:14:15.519
<v Speaker 5>people who are you know, we're separating some of the utilities.

245
00:14:15.559 --> 00:14:18.120
<v Speaker 5>We're making sure that you know, we're not mixing up

246
00:14:18.320 --> 00:14:21.240
<v Speaker 5>framework types and getting ready to build these adapters. But

247
00:14:22.080 --> 00:14:25.840
<v Speaker 5>essentially there's nothing blocking us now if we want. If

248
00:14:25.879 --> 00:14:28.120
<v Speaker 5>I wanted to divert all my attention to solid router

249
00:14:28.240 --> 00:14:31.000
<v Speaker 5>and solid you know, getting that working and solid, I

250
00:14:31.000 --> 00:14:32.759
<v Speaker 5>could do that today, but I'm not going to do

251
00:14:32.799 --> 00:14:35.000
<v Speaker 5>that till we get the REACT when done.

252
00:14:35.600 --> 00:14:38.080
<v Speaker 2>So question about that. You threw out a whole bunch

253
00:14:38.120 --> 00:14:41.200
<v Speaker 2>of project names, some of which are familiar with, some

254
00:14:41.279 --> 00:14:46.799
<v Speaker 2>of which less. So Vincy Nitro also as I recalled,

255
00:14:46.879 --> 00:14:51.480
<v Speaker 2>Vinci is built on VAT. Yeah, so can you tell

256
00:14:51.559 --> 00:14:53.399
<v Speaker 2>us a little bit about all these projects?

257
00:14:53.519 --> 00:14:58.080
<v Speaker 5>I would love to. So let's start at the let's

258
00:14:58.080 --> 00:15:00.240
<v Speaker 5>start the bottom level. So all of this is based

259
00:15:00.279 --> 00:15:03.720
<v Speaker 5>on beat where one hundred percent bought into the VAT ecosystem.

260
00:15:03.879 --> 00:15:06.919
<v Speaker 5>I believe it's I believe it's the future. So we

261
00:15:06.960 --> 00:15:08.679
<v Speaker 5>wouldn't be able to do any of this without Beat.

262
00:15:08.720 --> 00:15:09.840
<v Speaker 5>And at the end of the day, a lot of

263
00:15:09.840 --> 00:15:14.879
<v Speaker 5>this boils down to just VEAT and Beat plugins, and

264
00:15:15.320 --> 00:15:18.360
<v Speaker 5>some of it is going to use the new VAT

265
00:15:18.480 --> 00:15:21.960
<v Speaker 5>six environment APIs, and some of it we can just

266
00:15:22.000 --> 00:15:26.440
<v Speaker 5>do today already just by building multiple environments ourselves. So

267
00:15:26.919 --> 00:15:30.279
<v Speaker 5>then on top of VEAT there's Nitro. So Nitro is

268
00:15:30.360 --> 00:15:36.480
<v Speaker 5>this toolkit that it uses Beat, but it helps you

269
00:15:36.559 --> 00:15:40.360
<v Speaker 5>build your back end code to work basically anywhere you

270
00:15:40.399 --> 00:15:43.159
<v Speaker 5>want to deploy it. So you can use Nitro as

271
00:15:43.159 --> 00:15:47.600
<v Speaker 5>this unified layer. Nitro is by the UNJS team and

272
00:15:48.120 --> 00:15:51.639
<v Speaker 5>it has this unified layer for pretty much everything you'd

273
00:15:51.679 --> 00:15:54.120
<v Speaker 5>want to do on the back end. You can write

274
00:15:54.120 --> 00:15:59.120
<v Speaker 5>your code mostly one way and deploy it to basically

275
00:15:59.200 --> 00:16:01.480
<v Speaker 5>anywhere that they may maintain an adapter for and it

276
00:16:01.519 --> 00:16:02.159
<v Speaker 5>will just work.

277
00:16:03.600 --> 00:16:09.080
<v Speaker 2>So they handle the deployment part of building a framework

278
00:16:09.120 --> 00:16:12.240
<v Speaker 2>Slash Metal framework for you, because that's obviously a big

279
00:16:12.320 --> 00:16:15.399
<v Speaker 2>challenge having to deploy to all the different platforms.

280
00:16:15.840 --> 00:16:20.799
<v Speaker 5>Well, like to put it into perspective if you so, so,

281
00:16:21.039 --> 00:16:25.720
<v Speaker 5>like next JS and Remix, they have to maintain their

282
00:16:25.759 --> 00:16:31.159
<v Speaker 5>own adapters to build their projects into the right formats

283
00:16:31.159 --> 00:16:37.480
<v Speaker 5>for all these different deployment destinations. Nitro does that. That's

284
00:16:37.600 --> 00:16:40.759
<v Speaker 5>Nitro's job, and so if you just use Nitro, you

285
00:16:40.799 --> 00:16:43.320
<v Speaker 5>don't have to worry about that and duplicate all that effort.

286
00:16:43.440 --> 00:16:47.519
<v Speaker 5>You just get to use what Nitro has built. So literally,

287
00:16:47.600 --> 00:16:53.039
<v Speaker 5>for me, I recently migrated a site from Versell over

288
00:16:53.200 --> 00:16:57.360
<v Speaker 5>to Netlify, and it was literally the difference of me

289
00:16:57.519 --> 00:17:03.000
<v Speaker 5>going into my config and saying deployment you know, I

290
00:17:03.000 --> 00:17:06.880
<v Speaker 5>think deployment preset, I think is what it's called. I

291
00:17:07.000 --> 00:17:09.000
<v Speaker 5>just changed it. It's a string, and just changed it

292
00:17:09.039 --> 00:17:13.319
<v Speaker 5>from Vercell to Netlafi. And when I rebuilt it, it

293
00:17:13.480 --> 00:17:17.640
<v Speaker 5>just rebuilt everything for Netlify instead. I didn't have to

294
00:17:17.720 --> 00:17:18.319
<v Speaker 5>change anything.

295
00:17:18.680 --> 00:17:23.279
<v Speaker 2>And it also assumes supports as cloud Flare whatever and

296
00:17:23.319 --> 00:17:24.279
<v Speaker 2>so on and so forth.

297
00:17:24.640 --> 00:17:29.240
<v Speaker 5>Yeah, and so Nitro is built on top of VEAT

298
00:17:29.240 --> 00:17:31.519
<v Speaker 5>and they're upgrading to the new VAT APIs as well.

299
00:17:31.599 --> 00:17:37.119
<v Speaker 5>So it's the clearest path for no duplicated effort. Really

300
00:17:37.160 --> 00:17:42.119
<v Speaker 5>whatsoever is they're going to maintain these adapters and we're

301
00:17:42.160 --> 00:17:44.559
<v Speaker 5>going to use Nitro directly, and you get to use

302
00:17:44.599 --> 00:17:48.759
<v Speaker 5>the Nitro APIs in your apps as well, so they

303
00:17:48.799 --> 00:17:52.359
<v Speaker 5>have wonderful products like un storage where you just kind

304
00:17:52.359 --> 00:17:55.599
<v Speaker 5>of have this unified storage API and you supply the

305
00:17:55.720 --> 00:18:01.480
<v Speaker 5>drivers and that driver may map to, you know, one

306
00:18:01.519 --> 00:18:03.519
<v Speaker 5>type of memory on this host, or you could map

307
00:18:03.559 --> 00:18:05.480
<v Speaker 5>it to another one. If you're using cloud flair, you

308
00:18:05.480 --> 00:18:07.319
<v Speaker 5>could map it to D one or something like that.

309
00:18:08.000 --> 00:18:13.599
<v Speaker 5>So they have a really great like abstraction for all

310
00:18:13.640 --> 00:18:17.960
<v Speaker 5>of these different implementations of features that we like to

311
00:18:18.039 --> 00:18:19.160
<v Speaker 5>use on servers.

312
00:18:19.799 --> 00:18:24.519
<v Speaker 2>I'm curious aside from you guys, you and Ryan and

313
00:18:25.240 --> 00:18:27.680
<v Speaker 2>who else is using them for what.

314
00:18:28.599 --> 00:18:31.960
<v Speaker 5>It actually came out of the view and the Next ecosystem.

315
00:18:32.160 --> 00:18:38.119
<v Speaker 5>So Next is built on top of UJS essentially like

316
00:18:38.319 --> 00:18:43.480
<v Speaker 5>all of it, and that's what they use. So UNJS

317
00:18:43.720 --> 00:18:47.519
<v Speaker 5>and Nitro is kind of like the lower level server

318
00:18:47.680 --> 00:18:50.680
<v Speaker 5>toolkit and the primitives that came out of the Next project.

319
00:18:51.079 --> 00:18:52.960
<v Speaker 1>I was wondering if there was a relationship because I

320
00:18:53.000 --> 00:18:55.519
<v Speaker 1>remember talking with Daniel Rowe about Nitro when that first

321
00:18:55.519 --> 00:18:58.079
<v Speaker 1>came in, when they first started using that, and the

322
00:18:58.160 --> 00:19:01.119
<v Speaker 1>speed increase was supposedly real phenomenal.

323
00:19:01.559 --> 00:19:04.759
<v Speaker 5>And you know who else uses it is Brandon who

324
00:19:04.759 --> 00:19:09.400
<v Speaker 5>built analog JS. So that's it's the it's kind of

325
00:19:09.400 --> 00:19:12.279
<v Speaker 5>the same approach, like, hey, let's build a framework that

326
00:19:12.680 --> 00:19:17.000
<v Speaker 5>uses Nitro, but for Angular. So he built his own

327
00:19:17.240 --> 00:19:20.559
<v Speaker 5>Angular meta framework and it uses Nitro under the hood.

328
00:19:21.000 --> 00:19:24.799
<v Speaker 5>Very very cool. That's that's how powerful and portable it is.

329
00:19:25.200 --> 00:19:27.640
<v Speaker 2>So it's certainly interesting that vit came out of you

330
00:19:28.279 --> 00:19:30.839
<v Speaker 2>and now Nitro came out of you. So if he

331
00:19:31.000 --> 00:19:35.839
<v Speaker 2>was contributing a lot to the framework space way beyond

332
00:19:35.920 --> 00:19:36.920
<v Speaker 2>View itself.

333
00:19:37.119 --> 00:19:42.279
<v Speaker 5>Yeah, absolutely, There's there's a lot of things about Next

334
00:19:42.440 --> 00:19:46.119
<v Speaker 5>that have been pushing forward what we've been able to

335
00:19:46.160 --> 00:19:52.359
<v Speaker 5>do outside of like Next itself. It's pretty sweet. So

336
00:19:52.920 --> 00:19:59.079
<v Speaker 5>Vinchi Vinci is built by Nikhil Serov, and Nikiel was

337
00:19:59.119 --> 00:20:01.279
<v Speaker 5>working on a Solid team for a little while. I

338
00:20:01.319 --> 00:20:03.680
<v Speaker 5>think he still is technically started the part of the

339
00:20:03.720 --> 00:20:09.960
<v Speaker 5>Solid team. But before VT six came out, there wasn't

340
00:20:10.079 --> 00:20:13.960
<v Speaker 5>really a way for you to do kind of a

341
00:20:14.240 --> 00:20:18.480
<v Speaker 5>unified Hey I'm building a full stack application, like a

342
00:20:18.599 --> 00:20:22.240
<v Speaker 5>unified config you would have to have had like one

343
00:20:22.319 --> 00:20:26.359
<v Speaker 5>VAT configuration and build setup for your client, and then

344
00:20:26.400 --> 00:20:29.000
<v Speaker 5>you'd have to have another setup with Nitro or something

345
00:20:29.079 --> 00:20:31.359
<v Speaker 5>else for your back end, and you kind of merge

346
00:20:31.400 --> 00:20:35.000
<v Speaker 5>those together or you end up building something that something

347
00:20:35.039 --> 00:20:38.680
<v Speaker 5>like that on your own, like Remix has done. But

348
00:20:39.160 --> 00:20:43.240
<v Speaker 5>Nikkio wanted kind of this unified layer, and we also

349
00:20:43.279 --> 00:20:47.759
<v Speaker 5>needed to do some multi environment things before VAT six

350
00:20:48.200 --> 00:20:53.720
<v Speaker 5>came out, so he built Vinchi vin XI and Vinci

351
00:20:54.079 --> 00:20:58.839
<v Speaker 5>is essentially a wrapper around that experience. So it uses

352
00:20:58.960 --> 00:21:04.240
<v Speaker 5>Nitro directly and Beat directly to coordinate this full stack

353
00:21:05.079 --> 00:21:11.079
<v Speaker 5>dev and broad build experience. And it was phenomenal, Like

354
00:21:11.119 --> 00:21:14.000
<v Speaker 5>it helped me get off the ground really quickly and

355
00:21:14.039 --> 00:21:17.400
<v Speaker 5>just start focusing on building like the run time and

356
00:21:17.440 --> 00:21:22.119
<v Speaker 5>my framework APIs. Now that we're getting closer to one

357
00:21:22.160 --> 00:21:26.720
<v Speaker 5>dot zero for Tanstak Start, we want I want more

358
00:21:26.759 --> 00:21:30.599
<v Speaker 5>control over what we're doing with Nitro and what we're

359
00:21:30.640 --> 00:21:35.440
<v Speaker 5>doing with VAT, and Nikkiel is also just very busy

360
00:21:35.599 --> 00:21:39.440
<v Speaker 5>with other things, in my opinion, more important things for him,

361
00:21:39.799 --> 00:21:42.680
<v Speaker 5>and that's totally fine. So Ryan and I have decided

362
00:21:42.720 --> 00:21:46.400
<v Speaker 5>that we're going to kind of slowly start to supplant

363
00:21:47.000 --> 00:21:52.720
<v Speaker 5>this Vinci logic with just a shared layer that we

364
00:21:52.960 --> 00:21:56.039
<v Speaker 5>that we use between all the start projects implemented in

365
00:21:56.160 --> 00:21:59.759
<v Speaker 5>what by the way, Well, sorry, what do you mean?

366
00:22:00.960 --> 00:22:04.039
<v Speaker 2>What are you Well, of course, I of course I

367
00:22:04.079 --> 00:22:08.960
<v Speaker 2>assume it's job Well typescript, but like, what libraries are

368
00:22:09.000 --> 00:22:11.480
<v Speaker 2>you using there? Is it like based on signals because

369
00:22:11.480 --> 00:22:13.720
<v Speaker 2>it's Ryan or no.

370
00:22:14.039 --> 00:22:16.960
<v Speaker 5>So so this layer is mostly going to be a

371
00:22:17.000 --> 00:22:23.200
<v Speaker 5>collection of veat plugins that are very configurable and they'll

372
00:22:23.319 --> 00:22:28.240
<v Speaker 5>use Babel under the hood, and really it will all

373
00:22:28.240 --> 00:22:31.279
<v Speaker 5>come together in hopefully what's going to be a very

374
00:22:31.319 --> 00:22:36.200
<v Speaker 5>thin layer on top of Nitro. So essentially just feeding

375
00:22:36.319 --> 00:22:41.640
<v Speaker 5>Nitro a unified config to say, here's here's what I

376
00:22:41.720 --> 00:22:44.119
<v Speaker 5>want you to build for my server environment, for my

377
00:22:44.279 --> 00:22:49.759
<v Speaker 5>SSR environment, and for my client environment, those the bundles particularly,

378
00:22:50.640 --> 00:22:53.519
<v Speaker 5>and just to kind of make all that cohesive.

379
00:22:55.240 --> 00:22:55.599
<v Speaker 2>Mm.

380
00:22:56.759 --> 00:22:59.599
<v Speaker 5>Yeah, it'll just be typescript at the end of the day.

381
00:22:59.720 --> 00:23:01.440
<v Speaker 5>What I would like to have it be is just

382
00:23:01.759 --> 00:23:05.039
<v Speaker 5>a veat plug in itself, which kind of sounds weird.

383
00:23:05.680 --> 00:23:08.960
<v Speaker 5>It's a beat plug in that would call into Nitro

384
00:23:09.279 --> 00:23:14.119
<v Speaker 5>to produce many different environments and build even more veat

385
00:23:14.720 --> 00:23:19.880
<v Speaker 5>the bundles. So but that's I think that's the beautiful

386
00:23:19.880 --> 00:23:21.519
<v Speaker 5>part about it is that if we can boil it

387
00:23:21.559 --> 00:23:23.119
<v Speaker 5>down to just Beat plugins, I think it's going to

388
00:23:23.200 --> 00:23:23.960
<v Speaker 5>be really powerful.

389
00:23:25.359 --> 00:23:28.400
<v Speaker 2>And that's basically going to be like under some sort

390
00:23:28.440 --> 00:23:29.480
<v Speaker 2>of a start moniker.

391
00:23:30.640 --> 00:23:35.200
<v Speaker 5>Yeah, most likely we'll probably just share internal packages privately

392
00:23:35.279 --> 00:23:38.039
<v Speaker 5>for now, and each one of us will just export

393
00:23:38.079 --> 00:23:41.160
<v Speaker 5>our own builders for it, so you'll still you know,

394
00:23:41.200 --> 00:23:45.960
<v Speaker 5>you'll probably build something like create tan stacks start. VAT

395
00:23:47.559 --> 00:23:50.319
<v Speaker 5>will be like one of our packages, and you'll call

396
00:23:50.359 --> 00:23:52.440
<v Speaker 5>that function and it will produce all the VAT plugins

397
00:23:52.440 --> 00:23:54.799
<v Speaker 5>that you need to add to your build essentially.

398
00:23:56.119 --> 00:23:59.400
<v Speaker 2>And the way, by the way, one thing that you

399
00:23:59.440 --> 00:24:05.359
<v Speaker 2>said before, or that the ten stack router was ninety

400
00:24:05.759 --> 00:24:08.839
<v Speaker 2>percent of the way towards tenstack start in terms of

401
00:24:08.880 --> 00:24:12.200
<v Speaker 2>being a framework, I think Ryan Florence more or less

402
00:24:12.200 --> 00:24:18.480
<v Speaker 2>said the same thing about remix and React router. I

403
00:24:18.519 --> 00:24:21.119
<v Speaker 2>think they even kind of merged the two projects together

404
00:24:21.200 --> 00:24:21.920
<v Speaker 2>for that reason.

405
00:24:23.039 --> 00:24:29.000
<v Speaker 5>Yeah, I yeah, I don't. I wish that maybe that

406
00:24:29.359 --> 00:24:31.759
<v Speaker 5>had been recognized sooner so that they didn't have to

407
00:24:31.799 --> 00:24:36.039
<v Speaker 5>go through kind of a snip snap, snip snap kind

408
00:24:36.039 --> 00:24:41.880
<v Speaker 5>of a pattern, because it's always been apparent that the

409
00:24:42.039 --> 00:24:47.000
<v Speaker 5>router is what drives much of what you do. That's

410
00:24:47.039 --> 00:24:52.279
<v Speaker 5>where all the opinions are and where you're feeding you know,

411
00:24:52.359 --> 00:24:55.240
<v Speaker 5>it's calling into your code and scheduling its own things

412
00:24:55.279 --> 00:24:58.039
<v Speaker 5>and doing something, so it very much is the framework.

413
00:25:00.240 --> 00:25:03.799
<v Speaker 5>I yeah, I don't have a whole lot to say there,

414
00:25:03.880 --> 00:25:07.599
<v Speaker 5>other than I just wish that they had maybe it

415
00:25:07.599 --> 00:25:09.680
<v Speaker 5>would have been better for their branding. I think if

416
00:25:09.680 --> 00:25:13.200
<v Speaker 5>they hadn't have done like, oh, it's remix and then

417
00:25:13.200 --> 00:25:14.920
<v Speaker 5>they took react router and put it into remix, and

418
00:25:14.960 --> 00:25:17.119
<v Speaker 5>now it's React router and putting Remix back in there,

419
00:25:17.400 --> 00:25:21.480
<v Speaker 5>it's very confusing. It should have just been incremental from

420
00:25:21.519 --> 00:25:24.160
<v Speaker 5>the beginning. They should have built remix as an add

421
00:25:24.160 --> 00:25:29.519
<v Speaker 5>on to react router. But I do everybody has their reasons.

422
00:25:28.960 --> 00:25:32.200
<v Speaker 2>Well the reasons, and also, like you said, people realize

423
00:25:32.240 --> 00:25:33.559
<v Speaker 2>things as they built them.

424
00:25:34.319 --> 00:25:39.480
<v Speaker 5>Yeah, and you know, that was merely an idea that

425
00:25:39.559 --> 00:25:42.240
<v Speaker 5>I had. I just wanted to build my own router,

426
00:25:42.319 --> 00:25:44.319
<v Speaker 5>and I knew that I wanted it to be client

427
00:25:44.359 --> 00:25:46.359
<v Speaker 5>side only and that server side features were going to

428
00:25:46.440 --> 00:25:51.720
<v Speaker 5>come later. I'm very very grateful that they were willing

429
00:25:51.799 --> 00:25:56.759
<v Speaker 5>to go guinea pig that process and probably find out

430
00:25:56.799 --> 00:25:59.559
<v Speaker 5>the hard way that it should have just been React

431
00:25:59.599 --> 00:26:04.480
<v Speaker 5>router all along. So I'm not complaining they they have.

432
00:26:05.039 --> 00:26:06.920
<v Speaker 5>They've done me a great favor in research.

433
00:26:06.960 --> 00:26:12.559
<v Speaker 6>And yeah, by the way, I'm curious, do you think

434
00:26:12.680 --> 00:26:16.119
<v Speaker 6>that maybe routing client side routing, I mean, should have

435
00:26:16.200 --> 00:26:18.640
<v Speaker 6>been part of the platform in some.

436
00:26:18.559 --> 00:26:22.960
<v Speaker 5>Way, which platform, like the web platform.

437
00:26:23.079 --> 00:26:28.799
<v Speaker 2>Yeah, like dome APIs for client side routing beyond the

438
00:26:28.880 --> 00:26:32.680
<v Speaker 2>basic history APIs or.

439
00:26:33.319 --> 00:26:36.559
<v Speaker 5>I don't know. I mean it's easy to say, yeah,

440
00:26:36.599 --> 00:26:40.400
<v Speaker 5>that would be great, but uh, where would those opinions

441
00:26:40.440 --> 00:26:44.279
<v Speaker 5>come from that would serve everyone? I don't I don't know,

442
00:26:45.200 --> 00:26:48.799
<v Speaker 5>because even for projects that look that look a lot alike,

443
00:26:48.920 --> 00:26:53.039
<v Speaker 5>even for like like react router and tan sac router,

444
00:26:53.759 --> 00:26:56.960
<v Speaker 5>like I took good ideas from react router, I took

445
00:26:56.960 --> 00:27:01.160
<v Speaker 5>the loader pattern and you know a couple of other

446
00:27:01.240 --> 00:27:02.839
<v Speaker 5>patterns that I just thought, you know what, these guys

447
00:27:02.880 --> 00:27:05.960
<v Speaker 5>really nailed these APIs, and then for other things I

448
00:27:06.079 --> 00:27:07.640
<v Speaker 5>just did things completely different.

449
00:27:09.440 --> 00:27:11.559
<v Speaker 2>So can you maybe talk a little bit about that.

450
00:27:11.680 --> 00:27:13.759
<v Speaker 2>Can you elaborate a little bit about what is the

451
00:27:13.880 --> 00:27:16.799
<v Speaker 2>loader pattern and also about some of the things that

452
00:27:16.839 --> 00:27:17.720
<v Speaker 2>you've done differently?

453
00:27:18.480 --> 00:27:22.119
<v Speaker 5>For sure? So the loader pattern is just a really

454
00:27:22.160 --> 00:27:29.359
<v Speaker 5>fancy way of saying like life cycle management for navigation, Basically,

455
00:27:29.400 --> 00:27:33.359
<v Speaker 5>you click a link and we know, hey, you're about

456
00:27:33.400 --> 00:27:37.880
<v Speaker 5>to go to this next page, and before you even navigate,

457
00:27:37.920 --> 00:27:41.559
<v Speaker 5>before we try and render, before do anything about showing

458
00:27:41.599 --> 00:27:45.799
<v Speaker 5>the next content, you have life cycle methods that will fire.

459
00:27:46.599 --> 00:27:51.720
<v Speaker 5>This goes way way back even to like knockout and older,

460
00:27:51.799 --> 00:27:54.680
<v Speaker 5>older frameworks that were just like, oh yeah, they're about

461
00:27:54.680 --> 00:27:58.359
<v Speaker 5>to navigate to this new page. Here's a function that

462
00:27:58.400 --> 00:28:02.119
<v Speaker 5>you can run before that happened and potentially do some

463
00:28:02.279 --> 00:28:08.799
<v Speaker 5>asynchronous work. So that concept, that's the core concept, and

464
00:28:08.839 --> 00:28:12.480
<v Speaker 5>then the loader pattern is just applying that life cycle

465
00:28:12.559 --> 00:28:17.480
<v Speaker 5>method to data loading, specifically to say, before we navigate

466
00:28:17.519 --> 00:28:19.240
<v Speaker 5>to this route, we need to make sure that we

467
00:28:19.319 --> 00:28:24.160
<v Speaker 5>have this data. So when you hear people talk about loaders,

468
00:28:24.759 --> 00:28:26.960
<v Speaker 5>that's generally what they're talking about. It's just a life

469
00:28:26.960 --> 00:28:29.880
<v Speaker 5>cycle method to ensure that data is present.

470
00:28:30.400 --> 00:28:32.720
<v Speaker 2>By a synchronous By the way, in this context, you

471
00:28:32.839 --> 00:28:35.759
<v Speaker 2>mean it's a synchronous to the operation of the browser,

472
00:28:35.839 --> 00:28:39.119
<v Speaker 2>but it's not a synchronous to the actual navigation. I mean,

473
00:28:39.200 --> 00:28:41.599
<v Speaker 2>you do need the data in order to display the

474
00:28:41.680 --> 00:28:44.039
<v Speaker 2>quote unquote new page.

475
00:28:43.839 --> 00:28:47.759
<v Speaker 5>Right, yeah you might. And again here's another reason why

476
00:28:48.200 --> 00:28:51.720
<v Speaker 5>it doesn't really work to just have some universal web standards.

477
00:28:52.160 --> 00:28:57.200
<v Speaker 5>Some frameworks will even wait to change the URL before,

478
00:28:57.920 --> 00:29:01.319
<v Speaker 5>like until the data is loaded. And for me, for instance,

479
00:29:01.359 --> 00:29:03.839
<v Speaker 5>I like as soon as they navigate, the URL changes

480
00:29:04.799 --> 00:29:08.720
<v Speaker 5>synchronously and then the side effect of rendering what the

481
00:29:08.799 --> 00:29:13.839
<v Speaker 5>user wants to see is asynchronous. So yeah, there's lots

482
00:29:13.839 --> 00:29:14.680
<v Speaker 5>of opinions there.

483
00:29:17.200 --> 00:29:22.519
<v Speaker 2>Interesting. So that's what is similar about about what you've

484
00:29:22.519 --> 00:29:24.799
<v Speaker 2>done and react route. Can you talk a little bit

485
00:29:24.839 --> 00:29:27.640
<v Speaker 2>about what is different because I also think that informs

486
00:29:27.640 --> 00:29:31.319
<v Speaker 2>some of the differences between tintac and other frameworks.

487
00:29:31.960 --> 00:29:36.279
<v Speaker 5>Yeah, so yeah, they both have loaders, they both support

488
00:29:36.799 --> 00:29:39.519
<v Speaker 5>I mean, it's not even limited to remix. But let's

489
00:29:39.519 --> 00:29:43.519
<v Speaker 5>just say, like modern routers, kind of the expectations for

490
00:29:43.559 --> 00:29:47.799
<v Speaker 5>all modern routers is that they have nested routing, the

491
00:29:47.839 --> 00:29:52.720
<v Speaker 5>ability to like nest route matching segments inside of each other,

492
00:29:52.759 --> 00:29:53.920
<v Speaker 5>to do shared layouts.

493
00:29:54.680 --> 00:29:58.519
<v Speaker 2>So I apologize for interrupting you. Just to clarify, nested

494
00:29:58.599 --> 00:30:02.480
<v Speaker 2>routing means that you click a link and you go

495
00:30:02.599 --> 00:30:05.559
<v Speaker 2>into uh, let's say call it a sub page or

496
00:30:05.640 --> 00:30:09.519
<v Speaker 2>sub resource in a sense, or like and part of

497
00:30:09.559 --> 00:30:11.599
<v Speaker 2>the page stays the same, and then part of the

498
00:30:11.640 --> 00:30:15.279
<v Speaker 2>page changes or is that something else and I'm explaining

499
00:30:15.319 --> 00:30:15.680
<v Speaker 2>it wrong.

500
00:30:16.400 --> 00:30:20.400
<v Speaker 5>No, that's that's exactly right, And it's the difference of

501
00:30:22.240 --> 00:30:25.920
<v Speaker 5>it's just encapsulation and reuse is what it is. You

502
00:30:25.960 --> 00:30:29.480
<v Speaker 5>could write your entire router as a flat map to

503
00:30:29.559 --> 00:30:34.680
<v Speaker 5>say this exact URL matches this exact component. And if

504
00:30:34.720 --> 00:30:37.920
<v Speaker 5>you have components that share the same layout, like a

505
00:30:38.039 --> 00:30:41.759
<v Speaker 5>nav bar or a sidebar, and this is back like

506
00:30:41.880 --> 00:30:44.119
<v Speaker 5>with older versions of next JS, you would have to

507
00:30:44.160 --> 00:30:46.880
<v Speaker 5>render that nav bar and sidebar on every single page

508
00:30:46.880 --> 00:30:49.440
<v Speaker 5>that you wanted it to be on, right, and that

509
00:30:49.519 --> 00:30:53.440
<v Speaker 5>has implications depending on the framework you're using that sometimes

510
00:30:53.480 --> 00:30:57.079
<v Speaker 5>those components would unmount and remount even though they look

511
00:30:57.160 --> 00:31:02.200
<v Speaker 5>like they're still there, you know they haven't changed. So yeah,

512
00:31:02.279 --> 00:31:04.880
<v Speaker 5>that's that's one of the things too. Yeah, there's lots

513
00:31:04.880 --> 00:31:08.000
<v Speaker 5>of these shared things. Nested routing is one of those things,

514
00:31:08.000 --> 00:31:11.920
<v Speaker 5>but instead of having this flat list of URLs to components,

515
00:31:12.400 --> 00:31:15.440
<v Speaker 5>you get to share those r l roots. So say

516
00:31:15.480 --> 00:31:19.759
<v Speaker 5>you have you have an admin slash admin right, you

517
00:31:19.839 --> 00:31:21.960
<v Speaker 5>might have a lot of sub pages on that slash

518
00:31:22.000 --> 00:31:26.480
<v Speaker 5>admin slash admin, slash users or whatever. And instead of

519
00:31:26.519 --> 00:31:30.440
<v Speaker 5>having to render like the admin sidebar for every single

520
00:31:30.519 --> 00:31:32.960
<v Speaker 5>one of those sub pages, you just render at once

521
00:31:33.079 --> 00:31:37.319
<v Speaker 5>in the admin layout component, and then every single sub

522
00:31:37.319 --> 00:31:41.079
<v Speaker 5>admin page below that will get inserted into that layout

523
00:31:41.160 --> 00:31:44.839
<v Speaker 5>wherever you render an outlet or rendered children essentially.

524
00:31:44.920 --> 00:31:47.119
<v Speaker 2>So you got you have this sort of a slot

525
00:31:47.519 --> 00:31:51.880
<v Speaker 2>where the sub page is like, well slotted.

526
00:31:51.480 --> 00:31:56.279
<v Speaker 5>In yep, and that slot works for index pages, which means, hey,

527
00:31:56.279 --> 00:31:58.200
<v Speaker 5>we didn't match anything, so we're just on the index

528
00:31:58.279 --> 00:32:00.000
<v Speaker 5>and you can slot something in there or you can

529
00:32:00.079 --> 00:32:05.000
<v Speaker 5>slot in subpages. Yeah, so nested routing is a big one.

530
00:32:05.440 --> 00:32:10.039
<v Speaker 5>That's that was kind of that's that's one where react

531
00:32:10.079 --> 00:32:14.799
<v Speaker 5>router really nailed it. You know, next js didn't have

532
00:32:14.839 --> 00:32:16.920
<v Speaker 5>that for a while and it was really enraging and

533
00:32:17.279 --> 00:32:20.960
<v Speaker 5>React router has had that for a long time. When

534
00:32:21.000 --> 00:32:23.240
<v Speaker 5>next gs finally added that, it was like, oh, well,

535
00:32:23.279 --> 00:32:25.079
<v Speaker 5>this is wonderful, and it's like, yeah, why didn't you

536
00:32:25.119 --> 00:32:28.559
<v Speaker 5>do that sooner? And and that was a no brainer

537
00:32:28.599 --> 00:32:30.319
<v Speaker 5>for us. It's like, yeah, we're going to support that.

538
00:32:30.519 --> 00:32:33.880
<v Speaker 5>We're going to do nested routes, things like file based

539
00:32:33.960 --> 00:32:38.400
<v Speaker 5>routing where you can you know, create that tree using

540
00:32:38.400 --> 00:32:41.799
<v Speaker 5>a file structure, just to kind of have maintenance be

541
00:32:41.920 --> 00:32:45.440
<v Speaker 5>nice and have some opinions and convention around just moving

542
00:32:45.519 --> 00:32:52.640
<v Speaker 5>quickly loaders. We talked about kind of just your basic

543
00:32:52.720 --> 00:32:56.279
<v Speaker 5>navigation APIs being able to have links and you know,

544
00:32:56.359 --> 00:32:59.039
<v Speaker 5>imperative navigate calls to kind of move around your app.

545
00:32:59.599 --> 00:33:02.039
<v Speaker 5>That all that stuff is pretty much the same where

546
00:33:02.039 --> 00:33:05.240
<v Speaker 5>it starts to get different from both next JS and

547
00:33:05.559 --> 00:33:12.559
<v Speaker 5>remix is so tanstack router basically was. I rewrote it

548
00:33:12.720 --> 00:33:17.240
<v Speaker 5>from the ground up with type safety at the forefront.

549
00:33:17.680 --> 00:33:22.359
<v Speaker 5>So every single decision that I made when I rewrote

550
00:33:22.400 --> 00:33:25.359
<v Speaker 5>this router was so that we could have one hundred

551
00:33:25.359 --> 00:33:30.000
<v Speaker 5>percent inferred type safety. Essentially, the goal was I don't

552
00:33:30.000 --> 00:33:34.480
<v Speaker 5>want to have to write typescript zintax in my routing,

553
00:33:35.200 --> 00:33:37.519
<v Speaker 5>but I want it all to be extremely type safe.

554
00:33:38.400 --> 00:33:42.000
<v Speaker 2>Type safe means that if I put in an invalid route,

555
00:33:42.039 --> 00:33:44.880
<v Speaker 2>I get read squigglyes. Is that what type safe means

556
00:33:44.880 --> 00:33:45.720
<v Speaker 2>in this context?

557
00:33:46.000 --> 00:33:48.039
<v Speaker 5>Yeah, I mean it means a lot of things. That's

558
00:33:48.119 --> 00:33:51.400
<v Speaker 5>one of them, and that's what I like to call that.

559
00:33:51.000 --> 00:33:55.240
<v Speaker 5>The That is the basic level one type safety that

560
00:33:55.279 --> 00:33:57.279
<v Speaker 5>I would expect out of a router is that, yeah,

561
00:33:57.319 --> 00:34:01.519
<v Speaker 5>you don't let me navigate static warn me that, hey,

562
00:34:01.519 --> 00:34:05.000
<v Speaker 5>you're trying to navigate somewhere that doesn't exist. That's that's

563
00:34:05.079 --> 00:34:09.280
<v Speaker 5>just the basic bear bones. There's a lot more to it,

564
00:34:09.320 --> 00:34:10.679
<v Speaker 5>though I don't know how much you want to go

565
00:34:10.719 --> 00:34:11.400
<v Speaker 5>into that, but.

566
00:34:12.599 --> 00:34:14.639
<v Speaker 2>I think we talked about it actually in the last

567
00:34:14.639 --> 00:34:16.800
<v Speaker 2>time you were here. So I don't want to go

568
00:34:16.880 --> 00:34:19.719
<v Speaker 2>too deep because I want to talk about the ten

569
00:34:19.800 --> 00:34:23.639
<v Speaker 2>stack framework and some of the RPC work is really

570
00:34:23.639 --> 00:34:26.000
<v Speaker 2>interesting for me. I'd love to talk about that too,

571
00:34:26.440 --> 00:34:28.920
<v Speaker 2>so just in a few words, just to mention it.

572
00:34:28.960 --> 00:34:32.400
<v Speaker 2>As I recall, it's also type safety about r L parameters,

573
00:34:32.440 --> 00:34:34.639
<v Speaker 2>so you can specify the type of a r L

574
00:34:34.719 --> 00:34:39.119
<v Speaker 2>parameter and the value has to match that.

575
00:34:39.079 --> 00:34:42.920
<v Speaker 5>Type, right, and that that applies to a lot of

576
00:34:43.079 --> 00:34:48.840
<v Speaker 5>different areas of the API. So search perands is a big,

577
00:34:49.280 --> 00:34:51.559
<v Speaker 5>a big piece of tan Stack router. All of our

578
00:34:51.599 --> 00:34:56.840
<v Speaker 5>search parameters are validated and type safe and have first

579
00:34:56.840 --> 00:35:01.159
<v Speaker 5>class APIs built in to manage search parameters like you

580
00:35:01.199 --> 00:35:04.679
<v Speaker 5>would like use state essentially, like you're just managing state.

581
00:35:05.960 --> 00:35:10.400
<v Speaker 5>That's that's a really big difference and something that really

582
00:35:10.400 --> 00:35:12.719
<v Speaker 5>not many other routers, if any that I know have.

583
00:35:14.679 --> 00:35:16.599
<v Speaker 5>That's a that's a big reason of why I wrote

584
00:35:16.599 --> 00:35:19.360
<v Speaker 5>it as well. On top of that, there's there's type

585
00:35:19.360 --> 00:35:21.920
<v Speaker 5>safety throughout all the other APIs that we have in there,

586
00:35:22.000 --> 00:35:25.400
<v Speaker 5>So there's things like route context and middleware, all of

587
00:35:25.400 --> 00:35:31.199
<v Speaker 5>that stuff is type safe as well. There's the configuration itself,

588
00:35:31.400 --> 00:35:36.239
<v Speaker 5>like being able to use loader data inside of your

589
00:35:36.239 --> 00:35:40.559
<v Speaker 5>components or use data from other routes, from different files.

590
00:35:41.440 --> 00:35:44.079
<v Speaker 5>It's all type safe, it all works, it's all very magical.

591
00:35:44.320 --> 00:35:45.719
<v Speaker 5>I don't know what else to say there other than

592
00:35:45.719 --> 00:35:48.400
<v Speaker 5>you should try it because you're you're probably missing out

593
00:35:48.400 --> 00:35:49.639
<v Speaker 5>if you haven't tried it yet.

594
00:35:50.119 --> 00:35:53.280
<v Speaker 2>Let me put it this way, we are starting a

595
00:35:53.360 --> 00:35:58.599
<v Speaker 2>new project. I basically made it part of our standard

596
00:35:58.760 --> 00:36:04.880
<v Speaker 2>starter kit at Sisense, so you know, we might it's

597
00:36:04.880 --> 00:36:09.119
<v Speaker 2>if it's a project that needs a full framework, like

598
00:36:09.360 --> 00:36:14.239
<v Speaker 2>we might debate between that's a next JS or something else.

599
00:36:15.000 --> 00:36:18.679
<v Speaker 2>But if it's a project that's mostly going to be

600
00:36:18.800 --> 00:36:22.880
<v Speaker 2>client side rendered, then I've made ten stack like part

601
00:36:22.920 --> 00:36:24.280
<v Speaker 2>of our standard config.

602
00:36:24.599 --> 00:36:29.199
<v Speaker 5>I would agree, all right. So before we move on

603
00:36:29.360 --> 00:36:32.480
<v Speaker 5>to start, there's another one more thing I want to mention.

604
00:36:32.599 --> 00:36:38.239
<v Speaker 5>So tan stack router has caching built into it, which

605
00:36:38.280 --> 00:36:41.719
<v Speaker 5>is like a really really lightweight version of React Query

606
00:36:41.840 --> 00:36:44.599
<v Speaker 5>or tan stack Query built right into the router. So

607
00:36:44.679 --> 00:36:47.480
<v Speaker 5>for very so for simple use cases, you may not

608
00:36:47.559 --> 00:36:50.719
<v Speaker 5>even need tan sack Query. You just load the data

609
00:36:50.719 --> 00:36:53.760
<v Speaker 5>you need in your routes and it's managed for you there,

610
00:36:53.760 --> 00:36:56.639
<v Speaker 5>and you have things like stale time, s w R

611
00:36:56.800 --> 00:36:59.519
<v Speaker 5>background refetching. It's all just built into the router. So

612
00:36:59.559 --> 00:37:06.639
<v Speaker 5>that's very important, a very important distinction. And yeah, just

613
00:37:06.760 --> 00:37:09.840
<v Speaker 5>generally managing state in the URL. If you're going to

614
00:37:09.960 --> 00:37:12.840
<v Speaker 5>use search parameters like at all. If you're going to

615
00:37:12.920 --> 00:37:15.000
<v Speaker 5>use search parameters, you should use dandsack router.

616
00:37:15.239 --> 00:37:15.400
<v Speaker 6>Well.

617
00:37:15.519 --> 00:37:20.760
<v Speaker 2>I love it when as many as possible configuration values

618
00:37:20.840 --> 00:37:24.199
<v Speaker 2>are in the URL, So, for example, I use gfana.

619
00:37:24.440 --> 00:37:28.639
<v Speaker 2>I've even spoken about it here on JavaScript Jabber, and

620
00:37:28.760 --> 00:37:31.039
<v Speaker 2>one of the things I love about grafana is that

621
00:37:31.480 --> 00:37:35.000
<v Speaker 2>most of their configurations are your parameters, which makes it

622
00:37:35.199 --> 00:37:37.159
<v Speaker 2>very easy to share grafts.

623
00:37:37.519 --> 00:37:41.920
<v Speaker 5>Yep. More state should be in the URL, not all state,

624
00:37:42.119 --> 00:37:44.159
<v Speaker 5>but more of our state should be in the r L.

625
00:37:44.400 --> 00:37:46.840
<v Speaker 5>And as soon as you want to start doing that,

626
00:37:47.119 --> 00:37:49.840
<v Speaker 5>you'll realize that the tools you have at your disposal

627
00:37:50.440 --> 00:37:53.519
<v Speaker 5>are not that great. So come use dan sack router

628
00:37:53.599 --> 00:37:54.679
<v Speaker 5>and you'll be much happier.

629
00:37:57.039 --> 00:38:01.639
<v Speaker 2>Okay, then can stack the framework ten sax start.

630
00:38:01.960 --> 00:38:07.519
<v Speaker 5>Tan stacks start yep. So I wasn't planning on building

631
00:38:07.519 --> 00:38:11.800
<v Speaker 5>it initially, you know.

632
00:38:11.800 --> 00:38:15.199
<v Speaker 2>What I'm I'm not surprised. I mean, one person kind

633
00:38:15.239 --> 00:38:19.320
<v Speaker 2>of taking on the whole next JS ecosystem. In a sense,

634
00:38:21.480 --> 00:38:23.400
<v Speaker 2>it's a lot.

635
00:38:23.719 --> 00:38:26.000
<v Speaker 5>It is a lot. I was I wasn't planning on

636
00:38:26.039 --> 00:38:30.320
<v Speaker 5>building it initially because one I didn't need it personally,

637
00:38:30.480 --> 00:38:34.360
<v Speaker 5>just building a lot of spas. But I'll be honest,

638
00:38:34.400 --> 00:38:37.760
<v Speaker 5>I nerd sniped myself on this one really really bad.

639
00:38:38.519 --> 00:38:45.360
<v Speaker 5>So I had this idea about a year basically a

640
00:38:45.440 --> 00:38:47.559
<v Speaker 5>year ago, and I was like, you know what, I

641
00:38:47.679 --> 00:38:51.280
<v Speaker 5>wonder if I could rewrite tan stack dot com and

642
00:38:51.360 --> 00:38:55.079
<v Speaker 5>migrate it from Remix to just use tan stack router

643
00:38:55.760 --> 00:39:00.559
<v Speaker 5>with a custom SSR setup. And I did that. It

644
00:39:00.599 --> 00:39:03.920
<v Speaker 5>was really hard, and I was like, man, that was.

645
00:39:03.920 --> 00:39:04.639
<v Speaker 7>Really by the way.

646
00:39:04.719 --> 00:39:07.960
<v Speaker 2>As an aside, when I worked at WIS, I used

647
00:39:08.000 --> 00:39:10.280
<v Speaker 2>to work at WIS up to about five years ago

648
00:39:10.639 --> 00:39:14.320
<v Speaker 2>time flies four or five, yeah, four, four years ago,

649
00:39:14.360 --> 00:39:18.400
<v Speaker 2>five years ago, something like that. Wicks. Actually, when I

650
00:39:18.480 --> 00:39:22.800
<v Speaker 2>was there, we built our own SSR framework platform, and

651
00:39:22.880 --> 00:39:25.880
<v Speaker 2>we did it for first of all, because none existed

652
00:39:25.920 --> 00:39:31.519
<v Speaker 2>at the time. We predated next JS. I think also

653
00:39:31.559 --> 00:39:33.519
<v Speaker 2>the use case was very different. I mean, you know,

654
00:39:33.679 --> 00:39:38.360
<v Speaker 2>hosting millions of websites on on one platform is a different,

655
00:39:39.719 --> 00:39:43.920
<v Speaker 2>you know, use case. So I know for a fact

656
00:39:43.960 --> 00:39:48.719
<v Speaker 2>how difficult that can be, very challenging to do it efficiently.

657
00:39:49.159 --> 00:39:51.519
<v Speaker 5>It's enraging a lot of the time to be honest,

658
00:39:51.559 --> 00:39:53.920
<v Speaker 5>because I mean, the first thing you're going to realize

659
00:39:53.960 --> 00:39:59.079
<v Speaker 5>is now you have hydration problems. Anytime you're trying to

660
00:39:59.079 --> 00:40:01.559
<v Speaker 5>do SSR with ACT, you just have to get really

661
00:40:01.559 --> 00:40:06.320
<v Speaker 5>strict about hydration. But yeah, it was it was difficult,

662
00:40:06.360 --> 00:40:09.119
<v Speaker 5>and that's kind of what started tanstac Start because I

663
00:40:09.159 --> 00:40:10.960
<v Speaker 5>was like, Okay, I just did this manually and it

664
00:40:11.000 --> 00:40:13.760
<v Speaker 5>really really sucked. How can I make that better? And

665
00:40:13.800 --> 00:40:16.159
<v Speaker 5>I started talking to Ryan Carniato and I was like, hey,

666
00:40:16.159 --> 00:40:18.599
<v Speaker 5>what are you using for solid Start? And he said, well,

667
00:40:18.599 --> 00:40:21.719
<v Speaker 5>I'm using Vinci to kind of put all this together

668
00:40:21.800 --> 00:40:24.000
<v Speaker 5>to make my life a little easier. And I tried

669
00:40:24.039 --> 00:40:26.360
<v Speaker 5>Vinci out and I just kind of again just built

670
00:40:26.400 --> 00:40:29.639
<v Speaker 5>it manually, but using Vinci, and it made my life easier.

671
00:40:30.159 --> 00:40:32.159
<v Speaker 5>And so you could see it's sort of snowball at

672
00:40:32.159 --> 00:40:35.159
<v Speaker 5>that point. Then I decided, you know what this is.

673
00:40:35.320 --> 00:40:36.840
<v Speaker 5>This is going to be pretty cool. And I showed

674
00:40:36.840 --> 00:40:39.199
<v Speaker 5>it to some people that I trusted and they said,

675
00:40:39.960 --> 00:40:45.159
<v Speaker 5>this is amazing. But I really wish it had server

676
00:40:45.679 --> 00:40:50.400
<v Speaker 5>like like server loaders. How do I only do something

677
00:40:50.440 --> 00:40:54.039
<v Speaker 5>on the server, And because in remix you have you know,

678
00:40:54.119 --> 00:40:58.559
<v Speaker 5>server side loaders, and even in next days pages router

679
00:40:58.760 --> 00:41:02.599
<v Speaker 5>you have get service props and stuff like that, and

680
00:41:02.639 --> 00:41:05.480
<v Speaker 5>so I was like, okay, so it's not really complete yet.

681
00:41:05.880 --> 00:41:08.159
<v Speaker 5>How can I how can I make this better? And

682
00:41:08.199 --> 00:41:12.320
<v Speaker 5>that's when I started diving into server functions. Then initially

683
00:41:12.320 --> 00:41:19.440
<v Speaker 5>those were implemented with Vinci, but designing a proper API

684
00:41:19.599 --> 00:41:24.599
<v Speaker 5>around server function rpcs has been like my last six

685
00:41:24.719 --> 00:41:25.760
<v Speaker 5>months of work.

686
00:41:27.679 --> 00:41:30.360
<v Speaker 2>So let's talk a little bit about r PC because

687
00:41:30.400 --> 00:41:33.360
<v Speaker 2>apparently it's a subject that's close to your heart, and

688
00:41:33.440 --> 00:41:35.119
<v Speaker 2>I know for a fact that it's goes to mine.

689
00:41:35.159 --> 00:41:37.519
<v Speaker 2>As I mentioned, we even had an episode about it.

690
00:41:38.719 --> 00:41:41.239
<v Speaker 2>Can you talk a little bit about first of all,

691
00:41:41.239 --> 00:41:42.960
<v Speaker 2>about what is RPC?

692
00:41:44.440 --> 00:41:48.480
<v Speaker 5>Yeah? Pretty sure? It stands for Remote Procedure call, right,

693
00:41:48.960 --> 00:41:49.480
<v Speaker 5>Am I wrong?

694
00:41:50.119 --> 00:41:52.519
<v Speaker 2>No, you're you're absolutely correct. And by the way, I

695
00:41:52.639 --> 00:41:56.360
<v Speaker 2>used rpc's by the way, as an aside back in

696
00:41:56.400 --> 00:42:00.800
<v Speaker 2>the early nineties. Yeah, nothing nothing to do with weblogies. Yeah,

697
00:42:01.000 --> 00:42:04.239
<v Speaker 2>things like COREBA or d coom mm hmm.

698
00:42:04.559 --> 00:42:06.559
<v Speaker 5>Yeah, they have a they have a really like rich

699
00:42:06.719 --> 00:42:12.440
<v Speaker 5>history in in computer programming, and uh, I've read a

700
00:42:12.440 --> 00:42:14.960
<v Speaker 5>little bit about that. Ryan has sent me Ryan Carneat

701
00:42:14.960 --> 00:42:16.880
<v Speaker 5>has sent me some stuff about them as well, and

702
00:42:16.920 --> 00:42:19.920
<v Speaker 5>I just I love when we can like find old

703
00:42:19.920 --> 00:42:22.639
<v Speaker 5>tech and make it feel new and great. But this

704
00:42:22.719 --> 00:42:24.159
<v Speaker 5>is one of those things where it's like, yeah, we've

705
00:42:24.159 --> 00:42:27.079
<v Speaker 5>been doing this for a really long time. But the

706
00:42:27.119 --> 00:42:30.880
<v Speaker 5>idea behind the RPC is that you know, you get

707
00:42:30.920 --> 00:42:35.639
<v Speaker 5>to uh, you get to create this function. Uh. In

708
00:42:35.679 --> 00:42:38.480
<v Speaker 5>a very generic sense talking about rpcs, this this function

709
00:42:38.639 --> 00:42:43.480
<v Speaker 5>that can be called remotely, and when it's called remotely,

710
00:42:43.559 --> 00:42:48.199
<v Speaker 5>it has you know, an underlying protocol implementation and messaging

711
00:42:48.199 --> 00:42:52.840
<v Speaker 5>implementation that sends those messages back and forth. But it

712
00:42:53.039 --> 00:43:00.559
<v Speaker 5>creates a very like a very opaque interaction where you

713
00:43:00.599 --> 00:43:03.320
<v Speaker 5>can just say, I need to call this function. It

714
00:43:03.360 --> 00:43:05.440
<v Speaker 5>may happen on your machine, or it may happen on

715
00:43:05.480 --> 00:43:08.440
<v Speaker 5>another machine, right, but it's a remote procedure call. It's

716
00:43:08.440 --> 00:43:13.280
<v Speaker 5>going to happen remotely, and it feels very different than

717
00:43:14.000 --> 00:43:18.000
<v Speaker 5>calling into say arrest API or graph QL or something

718
00:43:18.079 --> 00:43:24.159
<v Speaker 5>like that. Well, just to know because similarities, Yeah.

719
00:43:24.039 --> 00:43:26.760
<v Speaker 2>Yeah, because putting a side yeah, putting a side graph

720
00:43:26.880 --> 00:43:30.000
<v Speaker 2>QL for a second. Yeah, if we're talking about RESTful

721
00:43:30.000 --> 00:43:32.599
<v Speaker 2>APIs rest for API is to some extent, you know

722
00:43:32.679 --> 00:43:36.920
<v Speaker 2>their requests response, which is the basic prerequisite for something

723
00:43:36.960 --> 00:43:42.159
<v Speaker 2>that looks like function that you send the message and

724
00:43:42.239 --> 00:43:44.400
<v Speaker 2>you wait until you get the response.

725
00:43:44.920 --> 00:43:48.880
<v Speaker 5>Yeah, basically yeah, And you know, graph Ql even has

726
00:43:49.000 --> 00:43:51.320
<v Speaker 5>a little bit of RPC vibes in it as well,

727
00:43:51.679 --> 00:43:53.599
<v Speaker 5>where you kind of you can you can and do

728
00:43:53.840 --> 00:43:57.039
<v Speaker 5>kind of create these functions that you that you call

729
00:43:57.159 --> 00:44:00.559
<v Speaker 5>through the graph Ql like zintax and proto call. Right.

730
00:44:01.079 --> 00:44:04.199
<v Speaker 5>So RPC is kind of in a lot of different things,

731
00:44:04.239 --> 00:44:09.320
<v Speaker 5>and we even kind of implicitly create rpcs in rest

732
00:44:09.599 --> 00:44:11.519
<v Speaker 5>environments all the time as well. You know, you have

733
00:44:11.559 --> 00:44:13.880
<v Speaker 5>a rest API and you just kind of need this

734
00:44:13.920 --> 00:44:18.519
<v Speaker 5>one off, like hey, you know, slash generate whatever, and

735
00:44:18.840 --> 00:44:20.920
<v Speaker 5>you call it and it's going to do something and

736
00:44:20.960 --> 00:44:24.280
<v Speaker 5>it's going to come back. I think in the modern

737
00:44:24.880 --> 00:44:28.559
<v Speaker 5>in our modern definition of our PCs, though, I think

738
00:44:28.599 --> 00:44:32.079
<v Speaker 5>a lot of it comes down to how you compose

739
00:44:32.159 --> 00:44:39.000
<v Speaker 5>that logic, right, because generally when we're talking about graph

740
00:44:39.119 --> 00:44:45.360
<v Speaker 5>Ql procedures and functions and and HTTP like rest APIs,

741
00:44:46.119 --> 00:44:48.599
<v Speaker 5>these are APIs that you you kind of have to

742
00:44:48.639 --> 00:44:52.119
<v Speaker 5>design in separate places. You say, Okay, I'm building an API,

743
00:44:52.320 --> 00:44:55.239
<v Speaker 5>I'm building a graph Ql endpoint, and I'm going to

744
00:44:55.239 --> 00:44:58.800
<v Speaker 5>build this function in this place and then in a

745
00:44:58.880 --> 00:45:03.719
<v Speaker 5>completely separate location, either whether it's in your mono repo

746
00:45:03.840 --> 00:45:08.599
<v Speaker 5>or a completely separate application. You're then constructing a way

747
00:45:08.639 --> 00:45:13.400
<v Speaker 5>to call into that function through you know, URL schema

748
00:45:13.599 --> 00:45:16.840
<v Speaker 5>or graph QL client that's been generated or something like that.

749
00:45:17.199 --> 00:45:22.960
<v Speaker 5>So you creating that function and authoring that function and

750
00:45:23.000 --> 00:45:28.599
<v Speaker 5>calling it are seemingly very separate places with an RPC,

751
00:45:28.760 --> 00:45:30.000
<v Speaker 5>at least in our mod.

752
00:45:29.960 --> 00:45:32.719
<v Speaker 2>Often, by the way, implemented by separate people. It might

753
00:45:32.760 --> 00:45:37.320
<v Speaker 2>be the back end team that's creating the RESTful end

754
00:45:37.360 --> 00:45:40.280
<v Speaker 2>points and then the front end teams that are putting

755
00:45:40.320 --> 00:45:41.719
<v Speaker 2>some sort of facade on top of.

756
00:45:41.719 --> 00:45:46.599
<v Speaker 5>Them, and possibly in separate languages too, right, often separate, yeah, often,

757
00:45:47.320 --> 00:45:50.760
<v Speaker 5>And so our PCs, at least the modern way we're

758
00:45:50.760 --> 00:45:54.360
<v Speaker 5>thinking about our PCs is more it's more of like

759
00:45:54.400 --> 00:45:59.559
<v Speaker 5>an integrated approach to creating that messaging layer. So for

760
00:45:59.559 --> 00:46:04.639
<v Speaker 5>anybody listening, who who could imagine you, I'm just going

761
00:46:04.679 --> 00:46:06.320
<v Speaker 5>to tell you how we do it in ten six start.

762
00:46:06.960 --> 00:46:11.159
<v Speaker 5>But basically, in any file you want in your application,

763
00:46:11.400 --> 00:46:16.119
<v Speaker 5>you can call a function called create server function, and

764
00:46:16.280 --> 00:46:22.079
<v Speaker 5>you pass that call a function, and everything inside of

765
00:46:22.079 --> 00:46:24.599
<v Speaker 5>that function is going to only run on the.

766
00:46:24.599 --> 00:46:27.360
<v Speaker 2>Server, even only exist on the server.

767
00:46:27.599 --> 00:46:30.599
<v Speaker 5>It's only yeah, it's only going to exist on the server.

768
00:46:30.760 --> 00:46:34.239
<v Speaker 5>So it like when we bundle your application, we literally

769
00:46:34.280 --> 00:46:37.159
<v Speaker 5>take that function that's inside of there and we strip

770
00:46:37.199 --> 00:46:40.800
<v Speaker 5>it away from the client, and what we do is

771
00:46:40.880 --> 00:46:45.280
<v Speaker 5>we replace it with a fetch call. It's a fetch

772
00:46:45.360 --> 00:46:49.800
<v Speaker 5>to to you know, an HTTP endpoint.

773
00:46:50.039 --> 00:46:51.760
<v Speaker 2>Which is the sub.

774
00:46:53.159 --> 00:46:57.760
<v Speaker 5>Yeah stub, right, you stub it, and we implement that

775
00:46:57.800 --> 00:47:01.840
<v Speaker 5>stub we have with fet and with an httpn point,

776
00:47:02.280 --> 00:47:05.480
<v Speaker 5>and then we extract that function into the server bundle,

777
00:47:06.119 --> 00:47:09.320
<v Speaker 5>and on the server, we're listening to that same endpoint

778
00:47:09.400 --> 00:47:12.599
<v Speaker 5>for that stub for that fetch call. And when we

779
00:47:12.639 --> 00:47:16.719
<v Speaker 5>receive that call, we take their request and we pipe

780
00:47:16.760 --> 00:47:20.320
<v Speaker 5>it through to the function that we extracted, And so

781
00:47:20.960 --> 00:47:26.039
<v Speaker 5>they execute in completely different environments, but you author them

782
00:47:26.519 --> 00:47:29.239
<v Speaker 5>in a full stack way. So I mean, these functions

783
00:47:29.280 --> 00:47:32.639
<v Speaker 5>can live right next to a React component that renders

784
00:47:32.639 --> 00:47:36.039
<v Speaker 5>on the client, and they could even live next to

785
00:47:36.119 --> 00:47:38.159
<v Speaker 5>things that are client only in the same file.

786
00:47:39.039 --> 00:47:41.840
<v Speaker 2>I think that's kind of the key. I think that

787
00:47:42.880 --> 00:47:48.400
<v Speaker 2>three things I think enabled RPC for the modern Web

788
00:47:48.800 --> 00:47:51.800
<v Speaker 2>because RPC has existed on the back end like forever,

789
00:47:52.000 --> 00:47:55.280
<v Speaker 2>so you know, you obviously I mentioned the old technologies

790
00:47:55.320 --> 00:47:58.280
<v Speaker 2>at Corbo and dcom. Now you have gRPC, so all

791
00:47:58.320 --> 00:48:00.880
<v Speaker 2>this stuff on the back end is always been there

792
00:48:01.400 --> 00:48:05.519
<v Speaker 2>on the web. I think three things that happened in

793
00:48:05.599 --> 00:48:08.760
<v Speaker 2>recent years that's called it this way kind of enabled it.

794
00:48:08.840 --> 00:48:13.079
<v Speaker 2>So one was the full stack frameworks. Yeah, because you

795
00:48:13.239 --> 00:48:17.920
<v Speaker 2>needed to be able to write code that builds or

796
00:48:17.920 --> 00:48:21.599
<v Speaker 2>compiles to both sides for this mechanism to be truly seamless.

797
00:48:21.639 --> 00:48:23.679
<v Speaker 2>And you kind of said it it's intended for the

798
00:48:23.719 --> 00:48:28.480
<v Speaker 2>full stack scenario. So that's number one. Another one is typescript.

799
00:48:28.679 --> 00:48:33.519
<v Speaker 2>Without typing, this whole thing would have been moot because

800
00:48:33.559 --> 00:48:36.119
<v Speaker 2>you need to be able to specify the types of

801
00:48:36.159 --> 00:48:39.159
<v Speaker 2>parameters that you're sending over the wire. Now you could

802
00:48:39.199 --> 00:48:42.760
<v Speaker 2>have done it explicitly using something that kind of looks

803
00:48:42.800 --> 00:48:44.840
<v Speaker 2>like ZOD or something, but it would have been really

804
00:48:45.280 --> 00:48:51.000
<v Speaker 2>uncomfortable or you know, the old component props that we

805
00:48:51.119 --> 00:48:53.519
<v Speaker 2>used to have and react. It would have been really

806
00:48:53.599 --> 00:48:57.400
<v Speaker 2>uncomfortable to do it that way. And the third thing

807
00:48:57.440 --> 00:48:59.800
<v Speaker 2>that in my opinion, and I wonder if you have

808
00:49:00.239 --> 00:49:03.159
<v Speaker 2>that kind of enabled it are is a weight a

809
00:49:03.199 --> 00:49:07.079
<v Speaker 2>sink a weight The fact that you can call a

810
00:49:07.119 --> 00:49:11.480
<v Speaker 2>function and have it execute a synchronously, but with the

811
00:49:11.519 --> 00:49:13.920
<v Speaker 2>function called semantics.

812
00:49:15.000 --> 00:49:18.320
<v Speaker 5>Yeah, I don't know about the third. I feel like

813
00:49:19.039 --> 00:49:23.159
<v Speaker 5>it definitely helps. It definitely helps. We could have done

814
00:49:23.199 --> 00:49:25.199
<v Speaker 5>it with callback functions. It wouldn't have been fun.

815
00:49:26.159 --> 00:49:27.960
<v Speaker 2>Yeah, it would have been fun, and it would have

816
00:49:28.039 --> 00:49:32.519
<v Speaker 2>broken the function called semantics. I mean, yeah, one of

817
00:49:32.559 --> 00:49:35.559
<v Speaker 2>the big things about RPC is that it feels like

818
00:49:35.599 --> 00:49:39.599
<v Speaker 2>a function call, and when it doesn't, then then you're

819
00:49:39.639 --> 00:49:41.280
<v Speaker 2>missing out on most of the fun.

820
00:49:42.480 --> 00:49:46.159
<v Speaker 5>Yeah, I would agree. It definitely a sinklewaight elevates the

821
00:49:46.239 --> 00:49:50.280
<v Speaker 5>experience to more of the traditional RPC feel that definitely,

822
00:49:51.800 --> 00:49:52.320
<v Speaker 5>But how.

823
00:49:52.159 --> 00:49:54.119
<v Speaker 2>Do you do that in React client side? I mean

824
00:49:54.159 --> 00:49:56.719
<v Speaker 2>you can't really do a sincle weight in in client

825
00:49:56.760 --> 00:49:59.000
<v Speaker 2>side React. No.

826
00:50:00.000 --> 00:50:03.239
<v Speaker 5>I mean they would like to make you think that

827
00:50:03.320 --> 00:50:07.000
<v Speaker 5>you can with then you use API, but I mean

828
00:50:07.039 --> 00:50:10.519
<v Speaker 5>it's not. It's not really intended for like end user usage.

829
00:50:11.159 --> 00:50:14.920
<v Speaker 5>So again that kind of falls back to like that's

830
00:50:14.960 --> 00:50:20.159
<v Speaker 5>why I built tanstat query is because React lacked and

831
00:50:20.840 --> 00:50:25.920
<v Speaker 5>honestly to this day still lacks a really well vetted,

832
00:50:26.000 --> 00:50:32.920
<v Speaker 5>good client side asynchronous primitive And maybe they don't add

833
00:50:32.920 --> 00:50:35.679
<v Speaker 5>it because React query is there and it's good enough,

834
00:50:37.400 --> 00:50:39.679
<v Speaker 5>or they don't or they just decided to skip it.

835
00:50:39.760 --> 00:50:43.320
<v Speaker 5>But really, if you ask somebody today from from React

836
00:50:43.360 --> 00:50:46.239
<v Speaker 5>purist Land or core Land, I'll say, oh, well, you know,

837
00:50:46.320 --> 00:50:50.519
<v Speaker 5>you're just supposed to use server components for data fetching

838
00:50:52.199 --> 00:50:54.639
<v Speaker 5>and and just pass promises and then you call the

839
00:50:54.760 --> 00:50:58.000
<v Speaker 5>use or whatever to that, I say, that's making big

840
00:50:58.039 --> 00:51:00.840
<v Speaker 5>assumptions about the way your author in your application.

841
00:51:01.440 --> 00:51:07.480
<v Speaker 2>So yeah, well, to be fair, it's part of their

842
00:51:07.519 --> 00:51:12.400
<v Speaker 2>their vision of the how do they call it the

843
00:51:12.480 --> 00:51:18.480
<v Speaker 2>Uni directional data flow That RPC kind of kind of

844
00:51:18.960 --> 00:51:22.440
<v Speaker 2>somewhat breaks that in a sense because with the Uni

845
00:51:22.519 --> 00:51:26.400
<v Speaker 2>directional data flow model, you've got the data flowing down

846
00:51:26.440 --> 00:51:30.639
<v Speaker 2>as props and you've got interactions flowing up as you know,

847
00:51:31.039 --> 00:51:34.760
<v Speaker 2>let's say, server actions. I don't know do they still

848
00:51:34.760 --> 00:51:36.760
<v Speaker 2>call it server actions or do they also call it

849
00:51:36.800 --> 00:51:37.559
<v Speaker 2>server functions?

850
00:51:37.559 --> 00:51:40.800
<v Speaker 5>Now, yeah, they call it server functions, which is kind

851
00:51:40.800 --> 00:51:42.760
<v Speaker 5>of annoying, but that's fine.

852
00:51:43.000 --> 00:51:45.960
<v Speaker 2>Yeah, it's it's functions that are not supposed to return

853
00:51:45.960 --> 00:51:46.679
<v Speaker 2>a value though.

854
00:51:48.239 --> 00:51:52.000
<v Speaker 5>Yeah, And see that's where that's where things differ. For me.

855
00:51:52.039 --> 00:51:55.719
<v Speaker 5>I don't really think it breaks the React methodology, and

856
00:51:55.760 --> 00:51:57.559
<v Speaker 5>most of that just comes down to how you're handling

857
00:51:57.559 --> 00:52:03.719
<v Speaker 5>the responses in my opinion. But you know, for rpcs

858
00:52:03.760 --> 00:52:06.920
<v Speaker 5>that just aren't doing anything. I mean, look at the

859
00:52:06.920 --> 00:52:10.239
<v Speaker 5>way next JS handles server functions. Right now, you call

860
00:52:10.280 --> 00:52:13.519
<v Speaker 5>a server function and they basically just indolidate everything they

861
00:52:14.719 --> 00:52:18.400
<v Speaker 5>call back into the route on the server and they

862
00:52:18.440 --> 00:52:22.360
<v Speaker 5>can re render your whole app. Now, there's a ways you.

863
00:52:22.400 --> 00:52:26.239
<v Speaker 2>Need directional data flow. The events flow bubble up, the

864
00:52:26.360 --> 00:52:27.800
<v Speaker 2>data flows down.

865
00:52:28.760 --> 00:52:33.239
<v Speaker 5>It's just really not great for performance though, especially the

866
00:52:33.239 --> 00:52:36.480
<v Speaker 5>way the React is even designed. It's it's kind of

867
00:52:36.519 --> 00:52:39.440
<v Speaker 5>sucks to render your entire application from the top down.

868
00:52:40.199 --> 00:52:42.199
<v Speaker 2>Let's put it this way. It's not surprising that you

869
00:52:42.400 --> 00:52:44.840
<v Speaker 2>created React query rather than they.

870
00:52:46.159 --> 00:52:49.880
<v Speaker 5>Yeah, no, I agree, Like I really like React, and

871
00:52:49.920 --> 00:52:52.159
<v Speaker 5>I like this intact. I like the framework. It's it's

872
00:52:52.280 --> 00:52:56.039
<v Speaker 5>really wonderful. If I had if I had a magic

873
00:52:56.079 --> 00:53:00.079
<v Speaker 5>wand that I could wave, it would be that that

874
00:53:00.199 --> 00:53:04.199
<v Speaker 5>we just use solid. But that's not going to happen.

875
00:53:04.880 --> 00:53:09.000
<v Speaker 5>So for now, you know, I have to ride on

876
00:53:09.320 --> 00:53:12.239
<v Speaker 5>the on the shoulders of this giant that has React.

877
00:53:12.239 --> 00:53:15.719
<v Speaker 5>And that's fine because it's it's really good, and it's

878
00:53:15.719 --> 00:53:19.840
<v Speaker 5>good enough and and and it's decent to work in.

879
00:53:20.360 --> 00:53:23.119
<v Speaker 2>And No, but I'm not fired for using React.

880
00:53:23.199 --> 00:53:26.960
<v Speaker 5>No exactly. But you know, It kind of goes back

881
00:53:26.960 --> 00:53:28.559
<v Speaker 5>to the way that we're trying to build things with

882
00:53:28.599 --> 00:53:31.000
<v Speaker 5>Tan SAC libraries is that it shouldn't matter really where

883
00:53:31.039 --> 00:53:34.159
<v Speaker 5>you go. We just want to We just want to

884
00:53:34.159 --> 00:53:37.760
<v Speaker 5>build great core functionality and bring it to all the frameworks.

885
00:53:38.360 --> 00:53:44.440
<v Speaker 5>And yeah, I worry a little bit about reacts future

886
00:53:44.679 --> 00:53:50.719
<v Speaker 5>with pushing server components so much because it's a wonderful

887
00:53:50.760 --> 00:53:56.119
<v Speaker 5>technology that is kind of derailing a lot of people.

888
00:53:56.519 --> 00:53:59.360
<v Speaker 5>And from where I'm standing this, it's very confusing for

889
00:53:59.400 --> 00:54:01.920
<v Speaker 5>a lot of people. Well, it's very difficult to implement

890
00:54:01.960 --> 00:54:04.920
<v Speaker 5>as a framework, and it comes with a lot of

891
00:54:05.000 --> 00:54:09.800
<v Speaker 5>new rules and overhead that just don't really apply to

892
00:54:10.719 --> 00:54:12.800
<v Speaker 5>I'm going to call it the more traditional way of

893
00:54:12.800 --> 00:54:16.719
<v Speaker 5>building an SSR application that's just isomorphic and fully hydrated.

894
00:54:16.800 --> 00:54:19.079
<v Speaker 2>So I'll derail us a little bit because I do

895
00:54:19.159 --> 00:54:21.880
<v Speaker 2>want to talk a little bit about that. From what so,

896
00:54:22.000 --> 00:54:25.920
<v Speaker 2>I've been looking at some statistics about the React usage

897
00:54:26.280 --> 00:54:30.840
<v Speaker 2>and Metal framework usage. For those who don't know, more

898
00:54:30.840 --> 00:54:35.239
<v Speaker 2>people are using reacts and all the other view frameworks

899
00:54:35.280 --> 00:54:39.119
<v Speaker 2>put together. So React is number one, View is number two,

900
00:54:39.239 --> 00:54:41.960
<v Speaker 2>but views less and half of React and everything else

901
00:54:42.039 --> 00:54:43.719
<v Speaker 2>is less than the remaining part.

902
00:54:44.159 --> 00:54:46.400
<v Speaker 3>Those stats are wrong. I know it. I can feel it.

903
00:54:48.800 --> 00:54:54.320
<v Speaker 2>And in react Land, approximately almost twenty percent are using

904
00:54:54.440 --> 00:55:00.280
<v Speaker 2>NEXTGS and the rest are not. They're not using any

905
00:55:00.559 --> 00:55:04.480
<v Speaker 2>meta framework. But if you look at new websites, it

906
00:55:04.599 --> 00:55:08.039
<v Speaker 2>seems that almost all of them are being built using NEXTGS.

907
00:55:09.360 --> 00:55:12.599
<v Speaker 2>So any project, there's a good chance at any project

908
00:55:12.639 --> 00:55:14.719
<v Speaker 2>older than two or three years that started two or

909
00:55:14.760 --> 00:55:17.280
<v Speaker 2>three years ago is probably not using NEXTGS and may

910
00:55:17.280 --> 00:55:21.039
<v Speaker 2>never use NEXTJS. But any project that's being started right now,

911
00:55:21.039 --> 00:55:23.400
<v Speaker 2>there's a good chance that they're using NEXTJS.

912
00:55:24.760 --> 00:55:25.599
<v Speaker 5>It's a fair assumption.

913
00:55:26.639 --> 00:55:30.480
<v Speaker 2>The interesting question though, when they're using nextgs, are they

914
00:55:30.559 --> 00:55:35.000
<v Speaker 2>also using server components and that I have no way

915
00:55:35.039 --> 00:55:38.000
<v Speaker 2>to know, And I'm kind of curious about that, Like

916
00:55:38.079 --> 00:55:40.679
<v Speaker 2>what is the buy in for server components.

917
00:55:40.960 --> 00:55:43.280
<v Speaker 5>I don't know if it's easy to know the buy in.

918
00:55:43.320 --> 00:55:45.440
<v Speaker 5>I mean, I we could we go back and look.

919
00:55:45.480 --> 00:55:48.159
<v Speaker 5>I've done tons of polls. I mean, it's obviously biased

920
00:55:48.199 --> 00:55:51.719
<v Speaker 5>off of my audience, but I've done a lot of

921
00:55:51.760 --> 00:55:56.360
<v Speaker 5>polls on Twitter about people, how people feel about server

922
00:55:56.880 --> 00:56:00.679
<v Speaker 5>components and NEXTJS and and if they want to use

923
00:56:00.719 --> 00:56:03.440
<v Speaker 5>them or not, which framework they would use, and for

924
00:56:03.480 --> 00:56:06.559
<v Speaker 5>the most part, what I've the conclusion that I've come

925
00:56:06.599 --> 00:56:08.559
<v Speaker 5>to is that there are a lot of people coming

926
00:56:08.559 --> 00:56:12.519
<v Speaker 5>into next JS who are who are using server components

927
00:56:12.599 --> 00:56:15.599
<v Speaker 5>just because that is the happy path that they have

928
00:56:15.719 --> 00:56:17.480
<v Speaker 5>designed for next JS.

929
00:56:17.840 --> 00:56:22.000
<v Speaker 2>It's also the default unless you put client it's a

930
00:56:22.039 --> 00:56:22.800
<v Speaker 2>server component.

931
00:56:23.119 --> 00:56:30.800
<v Speaker 5>Yeah, and for me it's it's not interesting for me personally. Many,

932
00:56:30.880 --> 00:56:34.440
<v Speaker 5>if not almost all the apps that I've ever built,

933
00:56:34.880 --> 00:56:39.960
<v Speaker 5>I don't know if they would really directly benefit from

934
00:56:40.559 --> 00:56:45.199
<v Speaker 5>from the capabilities of server components at this time. I mean, yes,

935
00:56:45.400 --> 00:56:50.679
<v Speaker 5>they could benefit in terms of some bundle size, but

936
00:56:51.039 --> 00:56:55.800
<v Speaker 5>the trade offs for me just are not worth it. One,

937
00:56:56.360 --> 00:56:59.280
<v Speaker 5>I don't want to have to reason about this new

938
00:56:59.360 --> 00:57:03.639
<v Speaker 5>mental model of you know, interweaving client and server components

939
00:57:03.679 --> 00:57:08.079
<v Speaker 5>almost at every level of the component tree just to

940
00:57:08.159 --> 00:57:11.239
<v Speaker 5>get you know, trade offs that don't matter for me

941
00:57:11.519 --> 00:57:13.800
<v Speaker 5>or really won't matter much for my users at this point.

942
00:57:13.840 --> 00:57:16.320
<v Speaker 2>But by the way, I'm going to interrupt because I

943
00:57:16.360 --> 00:57:18.360
<v Speaker 2>need to. I think I always like to give a

944
00:57:18.400 --> 00:57:20.920
<v Speaker 2>bit more context to our listeners. So first of all,

945
00:57:21.000 --> 00:57:27.400
<v Speaker 2>we had two episodes with Dan Abramov and Jose Savona

946
00:57:27.559 --> 00:57:31.159
<v Speaker 2>talking about server components. So if anybody is really interesting

947
00:57:31.199 --> 00:57:33.840
<v Speaker 2>in the nitty gritty of what they are, I highly

948
00:57:33.880 --> 00:57:38.280
<v Speaker 2>recommend listening to those episodes that were excellent. The key

949
00:57:38.360 --> 00:57:44.079
<v Speaker 2>aspect about server components is that they are components that

950
00:57:44.320 --> 00:57:49.480
<v Speaker 2>only run on the server, versus client components which run

951
00:57:49.719 --> 00:57:52.239
<v Speaker 2>which can run both on the client and on the server,

952
00:57:53.239 --> 00:57:55.320
<v Speaker 2>which is interesting.

953
00:57:55.840 --> 00:57:58.000
<v Speaker 5>I'm even going to extend that to say that server

954
00:57:58.079 --> 00:58:01.320
<v Speaker 5>components have the worst name ever. They should not be

955
00:58:01.360 --> 00:58:06.280
<v Speaker 5>called server components. They should be called like static components

956
00:58:06.280 --> 00:58:12.519
<v Speaker 5>are serializables, I mean, because you can technically generate server

957
00:58:12.599 --> 00:58:16.119
<v Speaker 5>components at build time too, at bundle time. Really, really,

958
00:58:16.159 --> 00:58:21.000
<v Speaker 5>all it is is you're just pre rendering a component

959
00:58:21.119 --> 00:58:27.079
<v Speaker 5>and producing uh this output that is like stringified JSX,

960
00:58:27.920 --> 00:58:32.400
<v Speaker 5>and then you're shipping that to the client from either

961
00:58:32.480 --> 00:58:37.199
<v Speaker 5>the static build or dynamically during from the server during runtime,

962
00:58:37.519 --> 00:58:42.920
<v Speaker 5>and then you're you're rendering that JSX stringified version. You're

963
00:58:42.960 --> 00:58:44.719
<v Speaker 5>turning that into something you can I.

964
00:58:44.679 --> 00:58:48.599
<v Speaker 2>Prefer to think about it as serialized virtual dome.

965
00:58:49.320 --> 00:58:53.360
<v Speaker 5>Exactly what it is, it's serialized virtual dome. And when

966
00:58:53.440 --> 00:58:57.440
<v Speaker 5>you talk about it like that, it becomes much easier

967
00:58:57.440 --> 00:59:02.519
<v Speaker 5>to reason about what you would actually get from using them,

968
00:59:03.000 --> 00:59:05.760
<v Speaker 5>which for me, out of the box, the things that

969
00:59:05.800 --> 00:59:09.039
<v Speaker 5>I think, what are that are interesting about server components

970
00:59:09.199 --> 00:59:15.320
<v Speaker 5>is that you could you could import and render and

971
00:59:15.360 --> 00:59:18.760
<v Speaker 5>do a lot of complex work with using really large

972
00:59:18.760 --> 00:59:21.880
<v Speaker 5>bundles and libraries on the back end that produce a

973
00:59:22.000 --> 00:59:26.480
<v Speaker 5>really small uh jsx output and you would only have

974
00:59:26.519 --> 00:59:28.760
<v Speaker 5>to ship that to the client. And that's something that's

975
00:59:28.840 --> 00:59:32.280
<v Speaker 5>that actually is very useful, uh thinking about it from

976
00:59:32.320 --> 00:59:34.639
<v Speaker 5>that way, and that's something where like it would be

977
00:59:34.719 --> 00:59:37.400
<v Speaker 5>useful for like Meta. You know that that's the whole

978
00:59:37.400 --> 00:59:41.320
<v Speaker 5>reason they built relay and the ability for relay to

979
00:59:41.480 --> 00:59:45.920
<v Speaker 5>send components down in chunks with certain grapht QL responses

980
00:59:46.360 --> 00:59:49.280
<v Speaker 5>was so that they could only send down the code

981
00:59:49.320 --> 00:59:51.719
<v Speaker 5>that they needed to render the thing at that exact moment.

982
00:59:52.320 --> 00:59:56.880
<v Speaker 5>So it's very much like the next generation of that idea,

983
00:59:56.960 --> 01:00:01.639
<v Speaker 5>even though Meta is not using it, which is another topic,

984
01:00:02.239 --> 01:00:05.599
<v Speaker 5>but that's this is the next generation of that idea

985
01:00:05.719 --> 01:00:08.559
<v Speaker 5>is only sending the code that's needed to run on

986
01:00:08.559 --> 01:00:13.719
<v Speaker 5>the client to produce that things. It doesn't really have

987
01:00:14.199 --> 01:00:17.559
<v Speaker 5>a whole lot to do with data loading other than

988
01:00:18.320 --> 01:00:20.480
<v Speaker 5>you can load the data on the server and then

989
01:00:20.519 --> 01:00:23.000
<v Speaker 5>produce the HTML and the server and send the htmail

990
01:00:23.000 --> 01:00:25.480
<v Speaker 5>down to the client. So it's very much like using

991
01:00:25.480 --> 01:00:30.800
<v Speaker 5>a traditional rendering framework from like old back end days.

992
01:00:31.679 --> 01:00:36.119
<v Speaker 5>You produce the HTML I'm air quoting here, but it's

993
01:00:36.199 --> 01:00:38.480
<v Speaker 5>JSX and you ship that down to the user instead

994
01:00:38.480 --> 01:00:40.639
<v Speaker 5>of having to ship all of your data fetching logic

995
01:00:41.159 --> 01:00:42.920
<v Speaker 5>and you're rendering logic down to the client.

996
01:00:43.880 --> 01:00:48.679
<v Speaker 2>So does ten stack actually support server components or do

997
01:00:48.760 --> 01:00:51.559
<v Speaker 2>you solely rely on server functions.

998
01:00:52.480 --> 01:00:56.440
<v Speaker 5>I will support them, so I've actually written all the

999
01:00:56.480 --> 01:01:00.519
<v Speaker 5>code to proof of concept this out. It works. We're

1000
01:01:00.519 --> 01:01:06.760
<v Speaker 5>going to support them in a very safe way. I

1001
01:01:06.800 --> 01:01:08.400
<v Speaker 5>can go into depth and that actually I think it's

1002
01:01:08.440 --> 01:01:12.480
<v Speaker 5>worth talking about that. So server components. People look at

1003
01:01:12.480 --> 01:01:15.039
<v Speaker 5>server components through the lens of next JS right now,

1004
01:01:15.079 --> 01:01:15.639
<v Speaker 5>because that's.

1005
01:01:15.480 --> 01:01:19.800
<v Speaker 7>The only thing that we know and the implementation I think, yeah,

1006
01:01:20.000 --> 01:01:25.320
<v Speaker 7>next JS, their entire router, like the entire experience from

1007
01:01:25.360 --> 01:01:29.840
<v Speaker 7>the root of the of the application down, is a large.

1008
01:01:31.280 --> 01:01:35.320
<v Speaker 5>Server component. Essentially, it starts at the route and it

1009
01:01:35.400 --> 01:01:38.320
<v Speaker 5>starts on the server, and it interweaves between client and

1010
01:01:38.360 --> 01:01:42.719
<v Speaker 5>server going all the way down. That has kind of

1011
01:01:42.719 --> 01:01:45.440
<v Speaker 5>skewed the way that people look at server components. I

1012
01:01:45.440 --> 01:01:47.400
<v Speaker 5>think they think that that's the only way that it

1013
01:01:47.440 --> 01:01:51.000
<v Speaker 5>can happen, and that all of their routing files and

1014
01:01:51.039 --> 01:01:53.400
<v Speaker 5>their layout files and all these other things are going

1015
01:01:53.440 --> 01:01:56.199
<v Speaker 5>to be written in this like us server used client

1016
01:01:56.320 --> 01:02:01.679
<v Speaker 5>kind of handoff thinking about these rules well, similar to

1017
01:02:02.199 --> 01:02:05.440
<v Speaker 5>so if you caught next JS comp this last year

1018
01:02:07.000 --> 01:02:11.719
<v Speaker 5>Ryan Florence, they demoed how it could be different, and

1019
01:02:11.840 --> 01:02:15.360
<v Speaker 5>it aligns, it almost aligns exactly with how I was

1020
01:02:15.920 --> 01:02:20.519
<v Speaker 5>thinking about them as well, is that server components are

1021
01:02:20.639 --> 01:02:26.119
<v Speaker 5>really just another form of asynchronous state or data that

1022
01:02:26.159 --> 01:02:30.280
<v Speaker 5>you're getting from an API endpoint or some embedded static

1023
01:02:30.440 --> 01:02:34.519
<v Speaker 5>data that you have in your application, and so really

1024
01:02:34.599 --> 01:02:39.400
<v Speaker 5>it can happen at network io boundaries. Next JS has

1025
01:02:39.400 --> 01:02:42.199
<v Speaker 5>those built into the entire system, so it's just kind

1026
01:02:42.239 --> 01:02:44.599
<v Speaker 5>of that's just what's happening all the time. But for

1027
01:02:44.760 --> 01:02:47.480
<v Speaker 5>tansecs start, the way that we're going to do it

1028
01:02:47.519 --> 01:02:51.880
<v Speaker 5>is if you want to use a server component, you

1029
01:02:51.960 --> 01:02:57.920
<v Speaker 5>simply return jsx or react in a server function in

1030
01:02:57.960 --> 01:02:58.519
<v Speaker 5>an RPC.

1031
01:02:58.960 --> 01:03:01.199
<v Speaker 2>That's I felt that that was where you were going.

1032
01:03:01.719 --> 01:03:04.119
<v Speaker 5>That's it, And you know that fits right in with

1033
01:03:04.239 --> 01:03:08.519
<v Speaker 5>Remix too, because so they don't really have rpcs, but

1034
01:03:08.599 --> 01:03:10.559
<v Speaker 5>they do have loaders, which is kind of like they're

1035
01:03:11.360 --> 01:03:17.239
<v Speaker 5>hard coded rest their kind of rest flavor of an RPC,

1036
01:03:17.559 --> 01:03:20.039
<v Speaker 5>right and they're doing the same things. You just return

1037
01:03:20.159 --> 01:03:22.880
<v Speaker 5>jobs or you just return react on JSX inside of

1038
01:03:22.880 --> 01:03:27.920
<v Speaker 5>a loader. So server functions are really going to be

1039
01:03:28.519 --> 01:03:29.480
<v Speaker 5>the place.

1040
01:03:29.239 --> 01:03:32.280
<v Speaker 2>Where you can use server So a question about that. So,

1041
01:03:32.360 --> 01:03:35.440
<v Speaker 2>first of all, it seems kind of almost like you

1042
01:03:35.519 --> 01:03:38.360
<v Speaker 2>might be returning a string and then injecting it to

1043
01:03:38.440 --> 01:03:45.480
<v Speaker 2>be using what's it called unsafe in dangerously unsafe insert

1044
01:03:45.599 --> 01:03:49.719
<v Speaker 2>HTML or whatever a little bit. But the question that

1045
01:03:49.760 --> 01:03:54.880
<v Speaker 2>I have about that, what prevents that server function from

1046
01:03:54.960 --> 01:04:00.599
<v Speaker 2>returning JSX or virtual dome that the client doesn't know

1047
01:04:00.639 --> 01:04:03.599
<v Speaker 2>what to do with, like using components that don't exist

1048
01:04:03.760 --> 01:04:04.360
<v Speaker 2>or whatever.

1049
01:04:05.119 --> 01:04:07.440
<v Speaker 5>A lot of that just comes down to how it

1050
01:04:07.480 --> 01:04:11.360
<v Speaker 5>gets bundled. So the real feature, if you ever listen

1051
01:04:11.360 --> 01:04:14.920
<v Speaker 5>to Andrew from the React court is Andrew Clark. I can't.

1052
01:04:15.159 --> 01:04:18.119
<v Speaker 5>I think it's his name, right, Andrew, Yeah, I think so. Yeah.

1053
01:04:18.480 --> 01:04:20.159
<v Speaker 5>I like the way Andrew talks about it. He says,

1054
01:04:20.159 --> 01:04:25.960
<v Speaker 5>the real feature of server components is not a framework feature.

1055
01:04:26.440 --> 01:04:27.320
<v Speaker 2>It's a bundler.

1056
01:04:27.480 --> 01:04:30.840
<v Speaker 5>It's a bundler feature, and it allows you to basically

1057
01:04:30.960 --> 01:04:35.280
<v Speaker 5>render a component and only bundle up the things that

1058
01:04:35.360 --> 01:04:40.679
<v Speaker 5>it needs to render with with it. And so when

1059
01:04:40.719 --> 01:04:45.079
<v Speaker 5>you serialize that component, everything that ran on the server

1060
01:04:45.320 --> 01:04:48.119
<v Speaker 5>is going to turn into JSX markup. That's right there

1061
01:04:48.159 --> 01:04:51.760
<v Speaker 5>in that representation, and everything that can't run on the

1062
01:04:51.760 --> 01:04:54.760
<v Speaker 5>server that needs to run on a client is referenced

1063
01:04:55.199 --> 01:04:59.639
<v Speaker 5>through a manifest, and it gets a little tricky with

1064
01:04:59.679 --> 01:05:02.719
<v Speaker 5>how that that works, but that manifest is just a

1065
01:05:02.840 --> 01:05:09.079
<v Speaker 5>mapping of client component references that can come down through

1066
01:05:09.679 --> 01:05:15.320
<v Speaker 5>server components to the actual modules and bundler modules that

1067
01:05:15.440 --> 01:05:17.960
<v Speaker 5>it can go out and grab if it needs to

1068
01:05:18.039 --> 01:05:21.840
<v Speaker 5>grab them. So when you render something on the server,

1069
01:05:22.000 --> 01:05:24.400
<v Speaker 5>it comes down with this responses is here's all this

1070
01:05:24.480 --> 01:05:28.079
<v Speaker 5>server function or the server component markup, and there might

1071
01:05:28.119 --> 01:05:31.199
<v Speaker 5>be some client components in there, and if they're already

1072
01:05:31.239 --> 01:05:35.119
<v Speaker 5>loaded into your app on the client, then they'll just render,

1073
01:05:35.159 --> 01:05:38.119
<v Speaker 5>and if they're not, then they will suspend while they

1074
01:05:38.159 --> 01:05:41.840
<v Speaker 5>go and pull that client side bundle chunk that they

1075
01:05:41.920 --> 01:05:44.480
<v Speaker 5>need to render, and then they will finally render.

1076
01:05:44.880 --> 01:05:47.800
<v Speaker 2>So a key difference, it seems to me, and again

1077
01:05:47.920 --> 01:05:51.280
<v Speaker 2>correct me if I'm wrong, between the next GS way

1078
01:05:51.639 --> 01:05:57.639
<v Speaker 2>and your approach, is that with NEXTGS the root is,

1079
01:05:58.000 --> 01:06:02.639
<v Speaker 2>like you said, a server compon, whereas in your case,

1080
01:06:03.199 --> 01:06:07.239
<v Speaker 2>the route is a quote unquote client component, even though

1081
01:06:07.280 --> 01:06:08.800
<v Speaker 2>it actually might run on the server.

1082
01:06:10.239 --> 01:06:14.000
<v Speaker 5>Yeah, I think that's a good distinction, is that with

1083
01:06:14.159 --> 01:06:16.800
<v Speaker 5>next JS, everything's going to be server first all the time,

1084
01:06:16.840 --> 01:06:22.079
<v Speaker 5>no matter what well ver so, right of course. And

1085
01:06:22.119 --> 01:06:25.039
<v Speaker 5>then with tan SAX start even down to the way

1086
01:06:25.039 --> 01:06:29.280
<v Speaker 5>that the APIs are designed, everything's written to be isomorphic first.

1087
01:06:29.519 --> 01:06:33.000
<v Speaker 5>So if you don't do anything inside of a server function,

1088
01:06:33.719 --> 01:06:36.880
<v Speaker 5>what you write is just going to happen during SSR,

1089
01:06:37.119 --> 01:06:38.480
<v Speaker 5>and it's going to happen on the client.

1090
01:06:39.960 --> 01:06:42.159
<v Speaker 2>You know what I really like about your approach now

1091
01:06:42.280 --> 01:06:45.480
<v Speaker 2>that I'm thinking about it. So I have this presentation,

1092
01:06:45.639 --> 01:06:49.559
<v Speaker 2>this talk that I gave about different ways to overcome

1093
01:06:49.599 --> 01:06:53.760
<v Speaker 2>the cost of hydration, the performance cost of hydration, and

1094
01:06:53.840 --> 01:06:56.800
<v Speaker 2>I show the different ways, and I for each such

1095
01:06:57.440 --> 01:07:00.840
<v Speaker 2>method like this, something like six or seven approach and

1096
01:07:00.880 --> 01:07:03.039
<v Speaker 2>for each one of them, I give both the upsides

1097
01:07:03.039 --> 01:07:06.079
<v Speaker 2>and the downsides of each approach. And one of the

1098
01:07:06.079 --> 01:07:10.199
<v Speaker 2>approaches that I mentioned towards the end are server components.

1099
01:07:10.840 --> 01:07:13.599
<v Speaker 2>And one of the downside of server components that I

1100
01:07:13.679 --> 01:07:16.480
<v Speaker 2>presented in my talk is that they require you to

1101
01:07:16.760 --> 01:07:21.400
<v Speaker 2>basically re architecture application. You can take an existing application

1102
01:07:21.519 --> 01:07:24.480
<v Speaker 2>and just throw in server components into it. You need

1103
01:07:24.559 --> 01:07:28.280
<v Speaker 2>to rethink your entire architecture. You need to learn this,

1104
01:07:29.960 --> 01:07:33.440
<v Speaker 2>not even new technology, but new approach and then architecture

1105
01:07:33.480 --> 01:07:37.280
<v Speaker 2>application accordingly. And what I really like, Sorry go on.

1106
01:07:37.719 --> 01:07:40.199
<v Speaker 5>I was going to say, I agree, but I think

1107
01:07:40.239 --> 01:07:46.280
<v Speaker 5>there's some nuance there where with server But with server components,

1108
01:07:46.440 --> 01:07:49.039
<v Speaker 5>you can migrate incrementally, but you have to do it

1109
01:07:49.079 --> 01:07:52.480
<v Speaker 5>from the top down. You have to slowly move the

1110
01:07:52.519 --> 01:07:54.320
<v Speaker 5>server bound So at the top if you just say

1111
01:07:54.360 --> 01:07:56.559
<v Speaker 5>I want to render my whole app as a client component,

1112
01:07:56.920 --> 01:07:59.159
<v Speaker 5>you can do that in next JS. You can even

1113
01:07:59.159 --> 01:08:02.320
<v Speaker 5>do that, I think help you can render your entire

1114
01:08:02.360 --> 01:08:03.519
<v Speaker 5>app as a client component.

1115
01:08:03.599 --> 01:08:07.559
<v Speaker 2>Well, you can have a really thin server component that basically.

1116
01:08:07.199 --> 01:08:11.880
<v Speaker 5>Just right, and and then migration path is to slowly

1117
01:08:11.960 --> 01:08:15.360
<v Speaker 5>push that server boundary down through your component structure as

1118
01:08:15.400 --> 01:08:18.800
<v Speaker 5>far down as you can. That's the incremental migration strategy.

1119
01:08:19.319 --> 01:08:22.760
<v Speaker 5>And I don't like doing refactors from the root down.

1120
01:08:23.600 --> 01:08:23.720
<v Speaker 2>Uh.

1121
01:08:24.359 --> 01:08:28.199
<v Speaker 5>In fact, I like to my my leaf node up.

1122
01:08:28.640 --> 01:08:32.399
<v Speaker 2>Yeah, but you're absolutely correct. But if you if you

1123
01:08:32.520 --> 01:08:36.800
<v Speaker 2>basically do that, then you've not Again, my presentation was

1124
01:08:36.840 --> 01:08:40.520
<v Speaker 2>in the context of improving the reducing the cost of vibration,

1125
01:08:41.079 --> 01:08:44.000
<v Speaker 2>and if you just do that, you basically not elimit

1126
01:08:44.319 --> 01:08:50.359
<v Speaker 2>not reduce the cost of vibration at all. And yeah, slowly,

1127
01:08:50.520 --> 01:08:53.840
<v Speaker 2>but all it means is that you've slowly re architected

1128
01:08:53.880 --> 01:08:59.880
<v Speaker 2>your application exactly. But and what I like about Europe,

1129
01:09:00.279 --> 01:09:03.239
<v Speaker 2>it seems to me, is that you can get these

1130
01:09:03.439 --> 01:09:07.520
<v Speaker 2>this value without re architecting your application you want to,

1131
01:09:08.840 --> 01:09:11.760
<v Speaker 2>you can you think you have some components somewhere in

1132
01:09:11.760 --> 01:09:14.960
<v Speaker 2>the tree that could benefit from being a server rendered

1133
01:09:15.000 --> 01:09:19.159
<v Speaker 2>component because I don't know, it uses some d date

1134
01:09:19.199 --> 01:09:22.520
<v Speaker 2>and time functionality that would require you to download moment jas.

1135
01:09:23.359 --> 01:09:26.520
<v Speaker 2>Well you just turned that into a server function that

1136
01:09:26.600 --> 01:09:27.680
<v Speaker 2>returns gsx.

1137
01:09:28.199 --> 01:09:31.680
<v Speaker 5>Yeah, and you know you bring up you and you

1138
01:09:31.880 --> 01:09:35.159
<v Speaker 5>brought a cool thought into my head? Is that talking

1139
01:09:35.199 --> 01:09:36.279
<v Speaker 5>about refactoring?

1140
01:09:36.399 --> 01:09:36.560
<v Speaker 4>Right?

1141
01:09:36.720 --> 01:09:38.520
<v Speaker 5>Let's imagine a lot a lot of people are on

1142
01:09:38.640 --> 01:09:42.520
<v Speaker 5>create react app. At the very least, it's it's not

1143
01:09:42.560 --> 01:09:45.159
<v Speaker 5>too difficult to get into VAT at the very least,

1144
01:09:45.239 --> 01:09:49.119
<v Speaker 5>just saying hey, I want to use veat. But to

1145
01:09:49.159 --> 01:09:50.880
<v Speaker 5>be able to use what would it take for somebody

1146
01:09:50.960 --> 01:09:53.600
<v Speaker 5>at that point then to use server components?

1147
01:09:53.800 --> 01:09:54.000
<v Speaker 2>Right?

1148
01:09:54.920 --> 01:09:56.920
<v Speaker 5>Telling them that they would need to adopt an entirely

1149
01:09:56.960 --> 01:10:00.479
<v Speaker 5>new framework is a big pill to sw swallow if

1150
01:10:00.520 --> 01:10:05.600
<v Speaker 5>they just want to consume this new server component pattern,

1151
01:10:05.640 --> 01:10:08.960
<v Speaker 5>this new technology. It's a hard pill for them to swallow,

1152
01:10:09.000 --> 01:10:10.680
<v Speaker 5>and I would wager that a lot of people wouldn't

1153
01:10:10.720 --> 01:10:15.239
<v Speaker 5>do that. But what if you could say, Hey, all

1154
01:10:15.239 --> 01:10:17.319
<v Speaker 5>you need to do is just get off of create

1155
01:10:17.359 --> 01:10:20.279
<v Speaker 5>React app, which you should do anyway, get into beat right.

1156
01:10:20.880 --> 01:10:22.560
<v Speaker 5>All you need to do is get into VAT, and

1157
01:10:22.600 --> 01:10:25.119
<v Speaker 5>if you can do that, we can give you a

1158
01:10:25.199 --> 01:10:29.960
<v Speaker 5>VAT plug in that will let you call server functions

1159
01:10:30.880 --> 01:10:33.840
<v Speaker 5>and then let you return server components, and then you

1160
01:10:33.840 --> 01:10:38.159
<v Speaker 5>can just render those server components even without refactoring really

1161
01:10:38.239 --> 01:10:41.439
<v Speaker 5>any other part of your application. Even if you're still

1162
01:10:41.520 --> 01:10:45.119
<v Speaker 5>using React router version four or five, you could still

1163
01:10:45.199 --> 01:10:48.760
<v Speaker 5>make an API call using whatever you want using React

1164
01:10:48.800 --> 01:10:52.920
<v Speaker 5>query even and call into a server function, get back

1165
01:10:52.960 --> 01:10:55.920
<v Speaker 5>a server component, and render it. You would just need

1166
01:10:55.960 --> 01:11:00.840
<v Speaker 5>to migrate to VAT and be using real act nineteen.

1167
01:11:01.840 --> 01:11:06.560
<v Speaker 5>So that that's probably the path of least resistance if

1168
01:11:06.640 --> 01:11:08.600
<v Speaker 5>like you're, if you just want to get your hands

1169
01:11:08.600 --> 01:11:11.720
<v Speaker 5>on server components, that's the path of least resistance that

1170
01:11:11.840 --> 01:11:15.279
<v Speaker 5>I'm trying to make possible. So I know I said

1171
01:11:15.319 --> 01:11:18.079
<v Speaker 5>that start is ninety percent router. That's if you're consuming

1172
01:11:18.079 --> 01:11:21.560
<v Speaker 5>the whole the whole framework. But really at the end

1173
01:11:21.560 --> 01:11:25.199
<v Speaker 5>of the day, what Start is is just the ability

1174
01:11:25.239 --> 01:11:32.199
<v Speaker 5>to do SSR if you want and server functions. That's right.

1175
01:11:32.239 --> 01:11:35.359
<v Speaker 2>I love that. And and by the way, I told

1176
01:11:35.479 --> 01:11:39.399
<v Speaker 2>Dan Abramov when he was on the show that the

1177
01:11:40.119 --> 01:11:43.760
<v Speaker 2>because you know, they were they were getting huge pushback

1178
01:11:43.840 --> 01:11:48.880
<v Speaker 2>against React server components, and you know, and I know

1179
01:11:49.000 --> 01:11:54.960
<v Speaker 2>that it. The React team got a lot of pushback

1180
01:11:55.000 --> 01:11:59.119
<v Speaker 2>that they weren't used to get. That's put it this way.

1181
01:11:59.159 --> 01:12:03.840
<v Speaker 2>They were always The last time they got such pushback

1182
01:12:03.880 --> 01:12:05.720
<v Speaker 2>from the community was I think more or less when

1183
01:12:05.720 --> 01:12:12.319
<v Speaker 2>they introduced x and they had hoped that the reaction

1184
01:12:12.439 --> 01:12:14.680
<v Speaker 2>would have been similar to the reaction that they got

1185
01:12:14.760 --> 01:12:19.000
<v Speaker 2>when they introduced hooks, which were really quickly adopted by

1186
01:12:19.000 --> 01:12:23.840
<v Speaker 2>the creatity. And the key difference was that hooks you

1187
01:12:23.840 --> 01:12:26.159
<v Speaker 2>could basically take it or leave it. You could use

1188
01:12:26.199 --> 01:12:30.079
<v Speaker 2>it on a per component basis. So when you could

1189
01:12:30.520 --> 01:12:33.760
<v Speaker 2>take an existing React application and decide that I'm not

1190
01:12:33.760 --> 01:12:38.359
<v Speaker 2>going to touch any of the existing code, but new

1191
01:12:38.439 --> 01:12:41.600
<v Speaker 2>components that I'm adding would use hooks and everything would

1192
01:12:41.640 --> 01:12:42.319
<v Speaker 2>just work.

1193
01:12:43.479 --> 01:12:45.720
<v Speaker 5>Andiquire an architectural overhaul.

1194
01:12:46.560 --> 01:12:50.960
<v Speaker 2>Exactly. It was at the component level, and if you

1195
01:12:51.000 --> 01:12:56.479
<v Speaker 2>can do that for React server components. That would be amazing.

1196
01:12:57.000 --> 01:13:01.319
<v Speaker 5>In my opinion, it's fine that it requires an architectural overhaul.

1197
01:13:01.319 --> 01:13:03.560
<v Speaker 5>It's going to require something. If it involves a server,

1198
01:13:03.680 --> 01:13:07.079
<v Speaker 5>you're going to have to do something architecturally. I just

1199
01:13:07.119 --> 01:13:11.239
<v Speaker 5>think that rolling up that architecture change into hey, you

1200
01:13:11.359 --> 01:13:14.560
<v Speaker 5>have to adopt this entirely new framework, that's a hard

1201
01:13:14.560 --> 01:13:18.600
<v Speaker 5>pill to swallow. And you know that's both next JS

1202
01:13:18.680 --> 01:13:21.279
<v Speaker 5>is in and I think React routers hope is that hey,

1203
01:13:21.720 --> 01:13:25.760
<v Speaker 5>just buy into our router and will take care of

1204
01:13:25.760 --> 01:13:31.840
<v Speaker 5>the rest, right And unfortunately for me, that's that's the heart.

1205
01:13:31.880 --> 01:13:34.359
<v Speaker 5>That's an even harder pill for me to swallows because

1206
01:13:34.439 --> 01:13:38.239
<v Speaker 5>I don't really like the routers that I see out there.

1207
01:13:38.239 --> 01:13:42.039
<v Speaker 5>I don't like next JSS router, and I moderately enjoy

1208
01:13:42.800 --> 01:13:45.640
<v Speaker 5>React router, but it lacks a lot of things. For me,

1209
01:13:45.720 --> 01:13:49.960
<v Speaker 5>I'm definitely not happy using it anymore. And so knowing

1210
01:13:49.960 --> 01:13:51.600
<v Speaker 5>that other people are going to have to make that

1211
01:13:51.640 --> 01:13:54.000
<v Speaker 5>same sacrifice to say, oh, yes, I have to buy

1212
01:13:54.039 --> 01:13:57.840
<v Speaker 5>into next JS all of it, or I have to

1213
01:13:57.840 --> 01:14:00.880
<v Speaker 5>buy into React router at least if I want to

1214
01:14:00.880 --> 01:14:03.960
<v Speaker 5>get on a path to use these latest React features

1215
01:14:04.479 --> 01:14:06.239
<v Speaker 5>That's not something that I want to have to do

1216
01:14:06.359 --> 01:14:07.960
<v Speaker 5>even myself, and I don't want to have to make

1217
01:14:08.000 --> 01:14:11.079
<v Speaker 5>other people do that as well. So I'm trying my

1218
01:14:11.159 --> 01:14:13.359
<v Speaker 5>hardest to build start in a way that can be

1219
01:14:13.439 --> 01:14:18.159
<v Speaker 5>consumed without having to just turn your entire application upside down.

1220
01:14:18.520 --> 01:14:20.119
<v Speaker 5>There's always going to be a little bit of buy in,

1221
01:14:20.840 --> 01:14:23.720
<v Speaker 5>you know, you have to buy in a beat. You're

1222
01:14:23.760 --> 01:14:27.439
<v Speaker 5>going to have to buy into servers in general, Like

1223
01:14:27.479 --> 01:14:30.840
<v Speaker 5>I hope your company lets you run server code, because

1224
01:14:30.840 --> 01:14:32.840
<v Speaker 5>a lot of a lot of front end devs are

1225
01:14:32.840 --> 01:14:35.079
<v Speaker 5>not allowed to provision servers.

1226
01:14:35.479 --> 01:14:41.520
<v Speaker 2>So I'll put it this way. When a while not

1227
01:14:41.640 --> 01:14:44.760
<v Speaker 2>so long ago, I was interviewing at a couple of companies,

1228
01:14:45.319 --> 01:14:51.960
<v Speaker 2>and I was interviewing at senior technical rank. So one

1229
01:14:52.000 --> 01:14:54.640
<v Speaker 2>of the things that I was looking at during the

1230
01:14:54.640 --> 01:14:58.720
<v Speaker 2>interview process was actually the technologies and architectures that they

1231
01:14:58.760 --> 01:15:02.359
<v Speaker 2>were using for the front end. And what I saw

1232
01:15:02.960 --> 01:15:07.199
<v Speaker 2>is that all of them were using React, and almost

1233
01:15:07.199 --> 01:15:11.560
<v Speaker 2>none of them was using SSR or any other any

1234
01:15:11.720 --> 01:15:17.640
<v Speaker 2>consequently any meta framework. And if you could provide the

1235
01:15:17.720 --> 01:15:23.520
<v Speaker 2>ability for such companies to start leveraging the benefits of

1236
01:15:24.119 --> 01:15:26.760
<v Speaker 2>React on the server side in a way that does

1237
01:15:26.840 --> 01:15:31.880
<v Speaker 2>not disrupt their existing architecture and their existing code base.

1238
01:15:32.199 --> 01:15:33.800
<v Speaker 2>That that's a huge benefit.

1239
01:15:35.119 --> 01:15:37.920
<v Speaker 5>Yeah, I agree, And you know, I came from that

1240
01:15:38.000 --> 01:15:41.640
<v Speaker 5>world where like I wasn't going to start even on

1241
01:15:41.680 --> 01:15:44.000
<v Speaker 5>my small team, I didn't want to have to provision servers.

1242
01:15:44.399 --> 01:15:48.000
<v Speaker 5>My team. We had our APIs written in a different language,

1243
01:15:48.960 --> 01:15:51.279
<v Speaker 5>you know, distributed through a very different means, Like I

1244
01:15:51.319 --> 01:15:54.319
<v Speaker 5>wasn't going to touch server code anytime soon. I mean,

1245
01:15:54.520 --> 01:15:58.479
<v Speaker 5>a lot a lot of very successful applications and enterprise

1246
01:15:58.520 --> 01:16:03.039
<v Speaker 5>companies like to even think about, oh yeah, our front

1247
01:16:03.119 --> 01:16:05.520
<v Speaker 5>end developers are going to start running server side code.

1248
01:16:05.760 --> 01:16:11.000
<v Speaker 5>Is a big leap because just the way that you know,

1249
01:16:11.840 --> 01:16:14.000
<v Speaker 5>APIs need to scale, they get their own teams, they

1250
01:16:14.000 --> 01:16:18.880
<v Speaker 5>turn into different languages. I just think that there's so

1251
01:16:19.039 --> 01:16:22.680
<v Speaker 5>many more benefits that we should be looking to give

1252
01:16:22.800 --> 01:16:26.359
<v Speaker 5>front end developers right now who work on these kinds

1253
01:16:26.359 --> 01:16:30.680
<v Speaker 5>of applications and large enterprise applications, who you know, so

1254
01:16:30.800 --> 01:16:32.880
<v Speaker 5>many of them won't even be able to touch server

1255
01:16:32.960 --> 01:16:37.640
<v Speaker 5>components until their company finally decides years from now to

1256
01:16:37.880 --> 01:16:42.319
<v Speaker 5>let them run server side code. So yes, I'm excited

1257
01:16:42.319 --> 01:16:45.880
<v Speaker 5>about you know, the server and I'm trying to go

1258
01:16:45.960 --> 01:16:48.439
<v Speaker 5>down that path as much as I can, but I'm

1259
01:16:48.479 --> 01:16:53.479
<v Speaker 5>still so heavily invested in the client side tooling space.

1260
01:16:55.199 --> 01:16:58.239
<v Speaker 5>I think Query has been phenomenal for the industry. I

1261
01:16:58.239 --> 01:17:01.600
<v Speaker 5>think Table is great. I think tan SAK router is

1262
01:17:01.680 --> 01:17:06.760
<v Speaker 5>still the most underrated part of what I'm building, because

1263
01:17:06.840 --> 01:17:08.960
<v Speaker 5>if you're if you're a client, if you're a client

1264
01:17:09.000 --> 01:17:12.279
<v Speaker 5>side application, and you're going to stay a client side application,

1265
01:17:13.159 --> 01:17:16.239
<v Speaker 5>I really don't understand why you would even consider using

1266
01:17:16.279 --> 01:17:19.239
<v Speaker 5>next JS or React router at this point. There there's

1267
01:17:19.399 --> 01:17:24.000
<v Speaker 5>just if you if you're questioning that, then you should

1268
01:17:24.039 --> 01:17:27.159
<v Speaker 5>DM me and I'll talk to you about it. Because

1269
01:17:27.479 --> 01:17:32.680
<v Speaker 5>I built Tansac router for enterprise routing use cases and

1270
01:17:33.079 --> 01:17:38.079
<v Speaker 5>it truly shines. So yeah, those that in that part

1271
01:17:38.119 --> 01:17:42.319
<v Speaker 5>of our industry is very underrepresented and soft spoken, especially

1272
01:17:42.319 --> 01:17:46.119
<v Speaker 5>on places like social media and Twitter. There's very very big,

1273
01:17:46.199 --> 01:17:50.079
<v Speaker 5>successful applications being maintained by very smart people that we

1274
01:17:50.319 --> 01:17:53.560
<v Speaker 5>never hear from on Twitter or x or anywhere like that.

1275
01:17:54.119 --> 01:17:56.359
<v Speaker 5>So I know they exist though, and I talk to

1276
01:17:56.399 --> 01:17:59.439
<v Speaker 5>them offline, I talk to them in DMS, and I'm

1277
01:17:59.520 --> 01:18:01.520
<v Speaker 5>trying to represent them as well.

1278
01:18:02.439 --> 01:18:05.239
<v Speaker 1>Oh, Dan, we need to get wrapped up here because

1279
01:18:05.239 --> 01:18:07.479
<v Speaker 1>it's been a long time here, so let's do some

1280
01:18:07.560 --> 01:18:09.199
<v Speaker 1>last words from both of you guys, and we'll move

1281
01:18:09.199 --> 01:18:09.920
<v Speaker 1>on to picks.

1282
01:18:10.039 --> 01:18:13.439
<v Speaker 2>Now. One thing that I wanted to talk about, but

1283
01:18:13.520 --> 01:18:17.479
<v Speaker 2>I don't think we have time, so we can do

1284
01:18:17.520 --> 01:18:21.199
<v Speaker 2>it in the future time is but like some of

1285
01:18:21.239 --> 01:18:25.119
<v Speaker 2>the downsides of our PCs that existed again way back

1286
01:18:25.119 --> 01:18:30.000
<v Speaker 2>in the nineties, rpc's, for example, tended to be chatty protocols.

1287
01:18:30.399 --> 01:18:34.600
<v Speaker 2>They also tended to introduce a lot of endpoints and

1288
01:18:34.960 --> 01:18:40.520
<v Speaker 2>generally introduce various maintenance issues. But I don't think we

1289
01:18:40.600 --> 01:18:42.960
<v Speaker 2>really have time to delve into this this time, so

1290
01:18:43.319 --> 01:18:45.880
<v Speaker 2>maybe we should bring you on to talk about RPC

1291
01:18:46.039 --> 01:18:46.479
<v Speaker 2>in depth.

1292
01:18:46.520 --> 01:18:49.039
<v Speaker 5>Sometimes I can give you a thirty second teaser on

1293
01:18:49.119 --> 01:18:52.760
<v Speaker 5>that if you want. I think that there's some chattiness

1294
01:18:52.760 --> 01:18:56.239
<v Speaker 5>that can happen. But I think if you're using them

1295
01:18:56.520 --> 01:18:59.359
<v Speaker 5>for your actual source of truth on full stack stuff,

1296
01:19:00.159 --> 01:19:04.079
<v Speaker 5>some interesting things there, like actually building full stack APIs.

1297
01:19:05.399 --> 01:19:07.600
<v Speaker 5>But if you're just using them to then you know,

1298
01:19:07.720 --> 01:19:10.520
<v Speaker 5>do secure things on the server that communicate externally with

1299
01:19:10.560 --> 01:19:13.239
<v Speaker 5>your other API or back in, I mean, I think

1300
01:19:13.840 --> 01:19:18.479
<v Speaker 5>that some of that chattiness can be justified. And then

1301
01:19:18.560 --> 01:19:22.159
<v Speaker 5>also there's there's fun things about server functions that we

1302
01:19:22.159 --> 01:19:25.279
<v Speaker 5>didn't even get to talk about, but we've added validation

1303
01:19:25.920 --> 01:19:29.399
<v Speaker 5>to our server functions strategies. We've added type safe middleware

1304
01:19:29.439 --> 01:19:32.800
<v Speaker 5>to our server functions, which is very very powerful where

1305
01:19:32.840 --> 01:19:37.000
<v Speaker 5>you can wrap up client side and server side transactions

1306
01:19:37.079 --> 01:19:40.640
<v Speaker 5>through server functions and do really really cool things. And

1307
01:19:40.720 --> 01:19:47.119
<v Speaker 5>then also being able to do public rpcs in the

1308
01:19:47.159 --> 01:19:51.359
<v Speaker 5>future is something that we're considering. So once you've written

1309
01:19:51.399 --> 01:19:54.960
<v Speaker 5>an RPC in Tanstak, the only thing keeping it from

1310
01:19:55.000 --> 01:19:59.560
<v Speaker 5>becoming a fully blown rest like httpn point that's public

1311
01:20:00.199 --> 01:20:04.520
<v Speaker 5>just supplying a path, a static path. So we're we're

1312
01:20:04.560 --> 01:20:10.279
<v Speaker 5>considering allowing people to even build public rests and points

1313
01:20:10.359 --> 01:20:13.239
<v Speaker 5>like static paths that they'll be able to use not

1314
01:20:13.399 --> 01:20:16.239
<v Speaker 5>just in their application side by side as an RPC,

1315
01:20:16.479 --> 01:20:20.000
<v Speaker 5>but even call into with say an RPC client that's

1316
01:20:20.079 --> 01:20:23.479
<v Speaker 5>generated for their React native app or for a bunch

1317
01:20:23.520 --> 01:20:27.239
<v Speaker 5>of different projects and kind of create some tooling around that.

1318
01:20:27.880 --> 01:20:30.039
<v Speaker 2>You know what would be awesome if we brought both

1319
01:20:30.079 --> 01:20:32.600
<v Speaker 2>you and Ryan on the show to talk about our PCs.

1320
01:20:32.680 --> 01:20:33.960
<v Speaker 2>I think that would be amazing.

1321
01:20:34.359 --> 01:20:36.720
<v Speaker 5>Anytime you get me and Ryan together, it's going to

1322
01:20:36.720 --> 01:20:39.159
<v Speaker 5>be a party. So I would love to I would

1323
01:20:39.159 --> 01:20:40.039
<v Speaker 5>love to come on with Ryan.

1324
01:20:40.760 --> 01:20:44.279
<v Speaker 2>Okay, right right, friends, I'll try to organize it.

1325
01:20:44.640 --> 01:20:48.920
<v Speaker 1>Okay, all right, well, thanks thanks Tanner. If you wanted

1326
01:20:48.920 --> 01:20:52.560
<v Speaker 1>to learn more about canstackcanstack dot com is the place

1327
01:20:52.640 --> 01:20:56.479
<v Speaker 1>to go docs and demos and all kinds of goodies.

1328
01:20:57.239 --> 01:20:59.279
<v Speaker 1>So with that, we'll move on to Picks Picks, to

1329
01:20:59.279 --> 01:21:00.800
<v Speaker 1>the part of the show we get to talk about

1330
01:21:00.880 --> 01:21:03.600
<v Speaker 1>things that we want to talk about that maybe aren't

1331
01:21:03.800 --> 01:21:04.439
<v Speaker 1>tech related.

1332
01:21:05.079 --> 01:21:05.800
<v Speaker 3>Oh could be.

1333
01:21:06.520 --> 01:21:08.479
<v Speaker 1>Let's see, Aja, you've been quiet, what do you got

1334
01:21:08.479 --> 01:21:10.520
<v Speaker 1>for us for picks?

1335
01:21:11.199 --> 01:21:15.199
<v Speaker 8>So I was looking for something to play just I

1336
01:21:15.279 --> 01:21:19.560
<v Speaker 8>was in a video game mood, and I was very,

1337
01:21:21.159 --> 01:21:22.800
<v Speaker 8>very kind of disheartened that a lot of the games

1338
01:21:22.800 --> 01:21:24.960
<v Speaker 8>I really loved as a kid, they have not been

1339
01:21:25.000 --> 01:21:28.239
<v Speaker 8>recreated in a similar form like GoldenEye. I figured, there's

1340
01:21:28.279 --> 01:21:30.760
<v Speaker 8>got to be something like GoldenEye, but there aren't really

1341
01:21:30.760 --> 01:21:33.479
<v Speaker 8>any other games other than GoldenEye in Perfect Dark where

1342
01:21:33.520 --> 01:21:38.760
<v Speaker 8>you sneak around and assassinate people through a maze to

1343
01:21:38.880 --> 01:21:44.600
<v Speaker 8>accomplish some goal. And I ended up trying out something new.

1344
01:21:45.000 --> 01:21:48.039
<v Speaker 8>I've never even heard of the genre of four x

1345
01:21:48.119 --> 01:21:53.399
<v Speaker 8>but it's explore, extend, exploit, extinguish, something like that.

1346
01:21:53.479 --> 01:21:55.479
<v Speaker 4>It's like the Microsoft strategy.

1347
01:21:55.840 --> 01:21:57.000
<v Speaker 3>It sounds like Microsoft.

1348
01:21:58.119 --> 01:22:03.920
<v Speaker 8>Yeah, so Civilization six is kind of like Age of

1349
01:22:03.960 --> 01:22:08.199
<v Speaker 8>Empires or Command and Conquer mixed with SimCity. And it

1350
01:22:08.279 --> 01:22:13.800
<v Speaker 8>is heavily, heavily heavily discounted right now because SIM or

1351
01:22:13.880 --> 01:22:17.680
<v Speaker 8>Civilization seven is about to come out, And so for

1352
01:22:17.760 --> 01:22:21.079
<v Speaker 8>all the different platforms for Nintendo Switch, you can check

1353
01:22:21.119 --> 01:22:24.680
<v Speaker 8>on GG dot Deals GG as in Good Game GG

1354
01:22:24.800 --> 01:22:29.119
<v Speaker 8>dot Deals, or decu deals dot Com deku as in Decotry,

1355
01:22:30.520 --> 01:22:34.880
<v Speaker 8>and you can get either the premium package or just

1356
01:22:34.960 --> 01:22:39.800
<v Speaker 8>the base game for two three, four five dollars. And

1357
01:22:40.039 --> 01:22:44.039
<v Speaker 8>it's my warning is that it's addictive if you have

1358
01:22:44.079 --> 01:22:47.800
<v Speaker 8>an addictive personality, if you like things where you have

1359
01:22:47.840 --> 01:22:51.840
<v Speaker 8>to mind max and strategize to figure out the best route.

1360
01:22:53.319 --> 01:22:55.600
<v Speaker 8>It's every every time you play the game. The map

1361
01:22:55.680 --> 01:22:59.319
<v Speaker 8>is randomized, and but you have a civilization that has

1362
01:22:59.359 --> 01:23:03.039
<v Speaker 8>certain been fits like what it can build earlier or whatever.

1363
01:23:03.119 --> 01:23:06.720
<v Speaker 8>And you you get a couple hours into the game

1364
01:23:06.760 --> 01:23:11.159
<v Speaker 8>and then you're past or I guess past. You get

1365
01:23:11.159 --> 01:23:14.159
<v Speaker 8>into your next age and new things unlock and you

1366
01:23:14.760 --> 01:23:17.279
<v Speaker 8>have other civilizations on the board. It's like it's also

1367
01:23:17.359 --> 01:23:20.680
<v Speaker 8>kind of like Risk and that there's different civilizations on

1368
01:23:20.720 --> 01:23:23.319
<v Speaker 8>the board. And you're trying to basically gather more land

1369
01:23:23.399 --> 01:23:26.319
<v Speaker 8>before they do and and mass more points to some

1370
01:23:26.399 --> 01:23:28.159
<v Speaker 8>of the AJM.

1371
01:23:28.359 --> 01:23:31.880
<v Speaker 2>I'm looking at the GG deals page right now and

1372
01:23:32.000 --> 01:23:34.520
<v Speaker 2>they're selling them for under three bucks.

1373
01:23:35.199 --> 01:23:42.600
<v Speaker 8>Yeah, sont for the next one. My one caution would

1374
01:23:42.600 --> 01:23:46.560
<v Speaker 8>be don't buy it for Mac, because after I got

1375
01:23:46.600 --> 01:23:50.960
<v Speaker 8>it for Switch, I also got it for Mac. Basically,

1376
01:23:51.199 --> 01:23:54.039
<v Speaker 8>my it doesn't work. It doesn't work. The game opens,

1377
01:23:54.159 --> 01:23:57.880
<v Speaker 8>it crashes if you can keep it open long enough,

1378
01:23:59.399 --> 01:23:59.880
<v Speaker 8>you can't.

1379
01:24:00.079 --> 01:24:02.479
<v Speaker 4>You can't move it from one monitor to another. All

1380
01:24:02.520 --> 01:24:05.159
<v Speaker 4>of the key bindings or Windows key bindings like with

1381
01:24:05.319 --> 01:24:09.359
<v Speaker 4>numb pad and f F six and all that sort

1382
01:24:09.359 --> 01:24:11.439
<v Speaker 4>of stuff. You can change those key bindings, of course.

1383
01:24:11.479 --> 01:24:15.680
<v Speaker 4>But my assumption is that they never tested it on

1384
01:24:15.800 --> 01:24:19.640
<v Speaker 4>Mac whatsoever, that they use some sort of framework that

1385
01:24:19.720 --> 01:24:23.039
<v Speaker 4>allows it to compile on different operating systems, and they

1386
01:24:23.079 --> 01:24:25.600
<v Speaker 4>just hit the compile button and they said, oh, the

1387
01:24:25.680 --> 01:24:29.399
<v Speaker 4>Mac build finished, okay, uh, put up the digital code.

1388
01:24:29.439 --> 01:24:31.840
<v Speaker 4>But I don't think that anyone. I don't think any

1389
01:24:31.920 --> 01:24:34.680
<v Speaker 4>of the developers of the game have ever tested it

1390
01:24:34.720 --> 01:24:37.239
<v Speaker 4>on a Mac. And if you look at any of

1391
01:24:37.279 --> 01:24:40.319
<v Speaker 4>the reviews that are one star reviews, they're all mentioning Mac.

1392
01:24:40.359 --> 01:24:43.319
<v Speaker 4>It doesn't run on Mac. It doesn't actually like it

1393
01:24:43.399 --> 01:24:46.319
<v Speaker 4>will install, it will open, you can click two or

1394
01:24:46.359 --> 01:24:49.800
<v Speaker 4>three buttons and then it crashes, so don't do that.

1395
01:24:50.279 --> 01:24:53.199
<v Speaker 2>So you're basically saying, if you've got the computer at home,

1396
01:24:53.640 --> 01:24:55.439
<v Speaker 2>get it for ecne on Farmac.

1397
01:24:57.279 --> 01:24:57.520
<v Speaker 6>Yeah.

1398
01:24:57.720 --> 01:24:59.479
<v Speaker 8>I might even run on Linux. I don't remember if

1399
01:24:59.520 --> 01:25:03.520
<v Speaker 8>that was on there, but yeah, Windows or Xbox or PlayStation.

1400
01:25:03.720 --> 01:25:09.359
<v Speaker 8>You the consoles are good because Microsoft and Nintendo and

1401
01:25:09.399 --> 01:25:11.159
<v Speaker 8>Sony will rip you a new one if your game

1402
01:25:11.239 --> 01:25:14.560
<v Speaker 8>just crashes when you start it, whereas Steam doesn't care.

1403
01:25:14.680 --> 01:25:18.319
<v Speaker 8>Steam's like, oh, game just crashes when you start it? Uh,

1404
01:25:18.359 --> 01:25:19.359
<v Speaker 8>contact the publisher.

1405
01:25:19.399 --> 01:25:23.000
<v Speaker 4>We don't care. We just take the money, all right.

1406
01:25:23.760 --> 01:25:24.520
<v Speaker 4>That's my one thing.

1407
01:25:24.840 --> 01:25:27.239
<v Speaker 3>Thank you, Dan. You got any picks for us?

1408
01:25:27.760 --> 01:25:29.399
<v Speaker 2>Yeah, not a lot.

1409
01:25:29.960 --> 01:25:33.239
<v Speaker 5>I have a I have a hard stop right now,

1410
01:25:33.600 --> 01:25:35.520
<v Speaker 5>and I don't don't how many picks, So I'd be

1411
01:25:35.520 --> 01:25:37.439
<v Speaker 5>happy to do my sign off, but I gotta run.

1412
01:25:38.039 --> 01:25:39.880
<v Speaker 3>Okay, Thanks for coming, Tanner.

1413
01:25:39.880 --> 01:25:41.640
<v Speaker 5>Thanks guys for having me. I do want to come

1414
01:25:41.640 --> 01:25:44.319
<v Speaker 5>back on and talk about server stuff with Ryan Carneado,

1415
01:25:44.479 --> 01:25:45.119
<v Speaker 5>so let me know.

1416
01:25:45.720 --> 01:25:48.720
<v Speaker 2>Make sure to organize that. Now. You've given me extra

1417
01:25:48.760 --> 01:25:51.640
<v Speaker 2>incentive that would be so awesome.

1418
01:25:52.880 --> 01:25:56.279
<v Speaker 5>Thank you so much. Good to see you guys.

1419
01:25:56.279 --> 01:26:01.920
<v Speaker 2>Awesome, thank you. So my pick is I've been an

1420
01:26:01.960 --> 01:26:06.199
<v Speaker 2>Anthony justiniic fan for a long time. You guys know

1421
01:26:06.239 --> 01:26:10.039
<v Speaker 2>who he is. He's like this edgy stand up comic

1422
01:26:12.000 --> 01:26:16.199
<v Speaker 2>and I really have enjoyed his material over the years.

1423
01:26:18.439 --> 01:26:21.720
<v Speaker 2>We even had this one really pleasant surprise where when

1424
01:26:22.039 --> 01:26:25.880
<v Speaker 2>we went to this stand up club in LA and

1425
01:26:25.920 --> 01:26:29.119
<v Speaker 2>he made a surprise appearance there to try out new stuff,

1426
01:26:29.880 --> 01:26:33.760
<v Speaker 2>new material, So that was really awesome. And I really

1427
01:26:33.800 --> 01:26:37.199
<v Speaker 2>loved his shows that he did in the past, Thoughts

1428
01:26:37.279 --> 01:26:43.119
<v Speaker 2>and Prayers and Fire in the Maternity Ward. And now

1429
01:26:43.159 --> 01:26:46.039
<v Speaker 2>he's recently come out with a new show called Bones

1430
01:26:46.079 --> 01:26:52.720
<v Speaker 2>and All and it's okay. I watched it and I

1431
01:26:52.840 --> 01:26:56.920
<v Speaker 2>enjoyed it, but it wasn't as good as his old shows.

1432
01:26:57.039 --> 01:27:02.319
<v Speaker 2>So if you're an Anthony Justinic and you haven't watched

1433
01:27:02.359 --> 01:27:06.000
<v Speaker 2>it yet, you know you should. But don't expect it

1434
01:27:06.039 --> 01:27:08.640
<v Speaker 2>to be as great as his previous his past stuff.

1435
01:27:08.760 --> 01:27:12.760
<v Speaker 2>I don't know why that's that's just my take on it.

1436
01:27:12.920 --> 01:27:15.399
<v Speaker 2>But anyway, that would be my pick for today.

1437
01:27:17.520 --> 01:27:20.720
<v Speaker 1>Alrighty, I will go last year. Since I'm the my

1438
01:27:20.760 --> 01:27:24.079
<v Speaker 1>picks are always the high point. First pick is a

1439
01:27:24.119 --> 01:27:29.359
<v Speaker 1>reference to something that Tanner said during the when he

1440
01:27:29.439 --> 01:27:31.359
<v Speaker 1>was talking earlier and he talked about how we got

1441
01:27:31.399 --> 01:27:35.600
<v Speaker 1>Nerd Sniped reminds me of one of my favorite XKCD

1442
01:27:35.840 --> 01:27:40.439
<v Speaker 1>cartoons called Nerd Sniping. It's number three, five six, So

1443
01:27:41.520 --> 01:27:45.319
<v Speaker 1>considering where things are right now, it's a very early,

1444
01:27:45.600 --> 01:27:50.680
<v Speaker 1>early one and it's called nerd Sniping, and it's it

1445
01:27:50.760 --> 01:27:55.600
<v Speaker 1>describes it perfectly. Makes me laugh every time I read

1446
01:27:55.640 --> 01:27:59.359
<v Speaker 1>this cartoon. But yeah, I go check it out Nerds

1447
01:27:59.720 --> 01:28:04.119
<v Speaker 1>x k CD number three, five six. And for the

1448
01:28:04.199 --> 01:28:07.920
<v Speaker 1>dad jokes of the week, it's been a while so

1449
01:28:07.920 --> 01:28:09.520
<v Speaker 1>so I have a.

1450
01:28:09.199 --> 01:28:10.720
<v Speaker 3>Plethora to choose from.

1451
01:28:11.319 --> 01:28:12.880
<v Speaker 1>The other day, I was talking to a friend of

1452
01:28:12.920 --> 01:28:14.520
<v Speaker 1>mine and I told him, hey, I took my wife

1453
01:28:14.520 --> 01:28:16.760
<v Speaker 1>to the Caribbean last month, and he said Jamaica.

1454
01:28:17.279 --> 01:28:18.560
<v Speaker 3>I said, no, she wanted to go.

1455
01:28:22.359 --> 01:28:26.039
<v Speaker 1>Also, did you know that you're actually born with four

1456
01:28:26.119 --> 01:28:28.600
<v Speaker 1>kidneys when you grow up, two of.

1457
01:28:28.560 --> 01:28:30.479
<v Speaker 3>Them become adult nies.

1458
01:28:32.199 --> 01:28:36.439
<v Speaker 1>And finally, it really annoys me when people get well

1459
01:28:36.479 --> 01:28:38.920
<v Speaker 1>known phrases wrong. I mean, seriously, it's not like his

1460
01:28:39.119 --> 01:28:45.520
<v Speaker 1>rocket surgery. Anyway, those are the dad jokes of the week,

1461
01:28:46.520 --> 01:28:49.319
<v Speaker 1>We'll say thanks to Tanner for coming on and talking

1462
01:28:49.359 --> 01:28:51.720
<v Speaker 1>about tan Stack. Sounds like we're going to get another

1463
01:28:51.800 --> 01:28:54.199
<v Speaker 1>episode scheduled with him and Ryan Carneatto.

1464
01:28:55.479 --> 01:28:57.760
<v Speaker 2>I really hope, so I'll do my I can only

1465
01:28:57.800 --> 01:28:58.880
<v Speaker 2>promise to do my best.

1466
01:28:59.279 --> 01:29:02.520
<v Speaker 1>Dan has connect everywhere. Man, if we want to get

1467
01:29:02.520 --> 01:29:03.680
<v Speaker 1>somebody on, just talk to Dan.

1468
01:29:03.760 --> 01:29:06.319
<v Speaker 3>He knows more. Thanks guys for

1469
01:29:06.359 --> 01:29:10.159
<v Speaker 1>Coming on, Thanks to Tanner for coming on, and we'll

1470
01:29:10.239 --> 01:29:12.199
<v Speaker 1>talk with you all next time on Jobs Hit Gebor
