WEBVTT

1
00:00:06.679 --> 00:00:11.080
Hey, folks, welcome to another
episode of JavaScript Jabber. This week,

2
00:00:11.080 --> 00:00:16.079
on our panel we have Steve Edwards. I'm gonna stop in for aj and

3
00:00:16.079 --> 00:00:19.239
say yo yo yo, coming out
to you from his Sonny in Blue Portland.

4
00:00:20.120 --> 00:00:24.000
We also have Dan shapiir Hey from
a warm and sunny Tel Aviv.

5
00:00:24.399 --> 00:00:31.679
And here we lost Steve right nice
Sonny. There it goes Charles Maxwood from

6
00:00:31.719 --> 00:00:35.320
top Endevs. A couple of quick
things. One, I'm looking for work,

7
00:00:35.399 --> 00:00:38.439
so if you want to hire me
to help you with podcasting or with

8
00:00:38.679 --> 00:00:43.240
programming, let me know Chuck at
topendevs dot com. And then I'm also

9
00:00:43.280 --> 00:00:48.000
launching JavaScript Geniuses this week, so
go check that out at JavaScript Geniuses dot

10
00:00:48.039 --> 00:00:51.399
com. I usually hold that to
the end, but I anyway, we

11
00:00:51.439 --> 00:00:54.719
have a special guest this week,
and that is Rich Harris. Rich,

12
00:00:54.880 --> 00:00:58.960
do you want to say hello?
Hello from Brooklyn, which is not sunny

13
00:00:59.000 --> 00:01:03.079
at all today? It is in
fact quite gray out there. Yeah.

14
00:01:03.879 --> 00:01:11.159
So you know, I think everybody
knows you as the guy behind sveelt I

15
00:01:11.159 --> 00:01:12.799
think that's the big thing. Are
there any other things that people ought to

16
00:01:12.879 --> 00:01:22.200
know? Uh? Yeah, I
ow I was the original creator of roll

17
00:01:22.280 --> 00:01:26.680
up. Although I haven't been maintaining
it for many years. It was taken

18
00:01:26.719 --> 00:01:30.760
over by by Lucas who has been
a much better maintainer than I ever was.

19
00:01:30.959 --> 00:01:36.120
And it's really since then that it's
become this sort of essential piece of

20
00:01:36.120 --> 00:01:41.400
the Jilbdscriet ecosystem. Yeah, it's
part of FAT, isn't it on top

21
00:01:41.439 --> 00:01:45.920
of it? Although its amazing It
just came out that Beat is starting to

22
00:01:45.920 --> 00:01:49.480
write their own tool for that based
on Rust, so that they can sort

23
00:01:49.480 --> 00:01:53.319
of have complete control over that portion
of their process. But yeah, until

24
00:01:53.319 --> 00:01:57.280
now it has been part of BEAT. Dan invited you, and I don't

25
00:01:57.280 --> 00:02:00.719
know if he had something in particular
that he wanted to go to first,

26
00:02:00.840 --> 00:02:06.840
or I'll start with a story because
I know that's what you like, Chuck,

27
00:02:07.959 --> 00:02:12.759
and it's something were Yeah, it's
something we spoke about a little bit

28
00:02:12.800 --> 00:02:15.960
before the we started recording, which
is about the first time that I actually

29
00:02:16.199 --> 00:02:22.759
met Rich in person, and that
was at a conference called YGLF or you

30
00:02:22.840 --> 00:02:28.120
got a lot front end where Rich
gave what turned out to be like a

31
00:02:28.159 --> 00:02:31.319
seminal talk. Kind of blew my
mind at the time, And the name

32
00:02:31.560 --> 00:02:38.080
was Rethinking Reactivity, Right, that's
the name, and it was right when

33
00:02:38.080 --> 00:02:44.039
you introduce SWELT three, which kind
of turned everything on its head in a

34
00:02:44.360 --> 00:02:50.319
lot of ways. And now it
seems that you're about to do it all

35
00:02:50.360 --> 00:02:55.439
over again with the swelled five and
ruins, and you know, you tell

36
00:02:55.520 --> 00:03:00.000
us, so I thought it would
be a great opportunity to kind of speak

37
00:03:00.039 --> 00:03:05.280
with you again and listen to what
the new hotness is going to be.

38
00:03:06.400 --> 00:03:12.319
Yeah, you could say that we're
rethinking, rethinking reactivity. You know,

39
00:03:12.360 --> 00:03:16.520
we had a we had a lot
of really interesting ideas with felt free.

40
00:03:17.479 --> 00:03:23.560
The idea was to see how far
you can take a compiler centric framework design

41
00:03:23.240 --> 00:03:30.000
and push that in order to have
like this really idiomatic way of describing a

42
00:03:30.039 --> 00:03:35.680
reactive user interface, and a lot
of it really succeeded. Like people,

43
00:03:35.800 --> 00:03:39.960
it turns out, love this style
of authoring components, and we've got it

44
00:03:40.599 --> 00:03:46.199
to you know, to power some
really larger and complex applications, and people

45
00:03:46.280 --> 00:03:49.159
have had a great time working on
it. People have had a great time

46
00:03:49.199 --> 00:03:53.479
building stuff with it. But as
the years have gone on, we've started

47
00:03:53.520 --> 00:03:59.280
to like butt up against the limits
of what you can do with static analysis.

48
00:04:00.360 --> 00:04:05.960
And at the same time, there's
been this renaissance of the idea of

49
00:04:06.120 --> 00:04:15.080
Signal based reactivity really spearheaded by the
SOLID team, taking ideas that were like

50
00:04:15.280 --> 00:04:20.759
first being explored in the jovscript world
in like around two thousand and nine twenty

51
00:04:20.879 --> 00:04:26.120
ten, maybe with Knockout, and
bringing that into the modern era. Nowadays,

52
00:04:26.160 --> 00:04:30.480
most frameworks are using signals through their
reactivity. SPELT was really one of

53
00:04:30.480 --> 00:04:33.800
the two odd people out s Felt
and React, both doing things very differently

54
00:04:33.800 --> 00:04:39.720
to everyone else, and essentially we
decided to fall in line. We decided

55
00:04:39.759 --> 00:04:45.360
that it's it. Signals are the
right primitive to build a reactive framework on

56
00:04:45.439 --> 00:04:50.000
top of, but we have a
slightly different relationship with them than other frameworks,

57
00:04:50.680 --> 00:04:54.959
and so I guess we can get
into what I mean by that over

58
00:04:54.959 --> 00:04:59.639
the course of this podcast, but
essentially we are rewriting SPELT from the ground

59
00:04:59.759 --> 00:05:03.399
up. It's going to be the
same authoring experience that people are familiar with

60
00:05:03.399 --> 00:05:06.839
to a very large extent, but
it's going to get rid of the rough

61
00:05:06.959 --> 00:05:12.079
edges that people have found with the
old static analysis based reactivity. And I'm

62
00:05:12.079 --> 00:05:15.279
pretty excited about the things that we're
able to do now on top of this

63
00:05:15.319 --> 00:05:20.279
new foundation. I think a good
thing to do just for folks that aren't

64
00:05:20.279 --> 00:05:25.480
as familiar. Can you just give
people like a really short explanation of what

65
00:05:25.519 --> 00:05:29.360
signals are, and then you can
explain what's felt is doing and why you're

66
00:05:29.439 --> 00:05:33.240
changing it. Absolutely. So.
The idea of signals is that you have

67
00:05:34.000 --> 00:05:40.079
an object that represents some value that
is changing over time, and then you

68
00:05:40.199 --> 00:05:45.680
have other parts of your code base
that read those signals, and then you

69
00:05:45.759 --> 00:05:49.279
have a scheduler that is sort of
aware of which functions are running and which

70
00:05:49.279 --> 00:05:55.040
functions are reading these reactive values,
and so when those reactive values change,

71
00:05:55.839 --> 00:06:00.480
the scheduler is able to re execute
that code to for example, keep a

72
00:06:00.519 --> 00:06:03.639
text mode up to date with some
piece of state that has changed in your

73
00:06:03.639 --> 00:06:15.399
application. And where signals differ from
some other related primitives like observables is they're

74
00:06:15.519 --> 00:06:21.120
very effective making sure that your code
runs in a efficient and glitch free manner.

75
00:06:21.959 --> 00:06:27.879
The code that relies on these reactive
values doesn't overfire, It never fires

76
00:06:27.920 --> 00:06:31.120
prematurely. Everything just kind of flows
in a very natural way down from your

77
00:06:31.120 --> 00:06:35.560
reactive state down to what we call
the effects, which is the updating in

78
00:06:35.600 --> 00:06:42.839
response to that state changing. And
by building on top of signals, we're

79
00:06:42.879 --> 00:06:47.000
able to achieve this very surgical approach
to updating the page. Instead of having

80
00:06:47.000 --> 00:06:53.279
to re render things frequently or having
to do a lot of checking to see

81
00:06:53.480 --> 00:06:56.560
if things are dirty or not,
we can just sort of let the reactive

82
00:06:56.600 --> 00:07:01.879
graph do its thing and things naturally
at in the optimal fashion. So you

83
00:07:02.000 --> 00:07:08.199
mentioned Solid before, and of course
the guy who created Solid, Ryan Corneato.

84
00:07:08.319 --> 00:07:13.720
Sometimes people refer to him as the
CEO of Signals, and he we

85
00:07:13.800 --> 00:07:16.680
had him as a guest several time
on the podcast, and he likes to

86
00:07:16.720 --> 00:07:25.879
say about the Solid that Solid is
effectively a state management framework which happens to

87
00:07:26.000 --> 00:07:30.040
update the user interface or the door, that it's almost like a side effect

88
00:07:30.040 --> 00:07:39.319
of what it is. Is your
approach with the SVELT or swelt five kind

89
00:07:39.319 --> 00:07:45.839
of similar or is it more you're
just leveraging signals but still very much staying

90
00:07:46.600 --> 00:07:50.920
you know, front and framework.
So I think the outcome is essentially the

91
00:07:50.959 --> 00:07:56.279
same, but we are approaching it
from very different directions. Ryan and I

92
00:07:58.040 --> 00:08:01.040
we have almost opposing approach, which
is to a lot of a lot of

93
00:08:01.040 --> 00:08:07.120
problems. Ryan is really incredible at
thinking in terms of primitives and how those

94
00:08:07.160 --> 00:08:11.399
primitives fit together, and Solid is
just this really elegant example of that we

95
00:08:11.480 --> 00:08:16.720
have these primitives that represent these reactive
concepts and they tie together in a really

96
00:08:16.759 --> 00:08:20.439
beautiful way. Whereas on the Spelt
team, we tend to sort of work

97
00:08:20.600 --> 00:08:26.600
backwards from what we want the authoring
experience to be like, and so,

98
00:08:26.040 --> 00:08:31.480
you know, we have this idea
of what it should what should go into

99
00:08:31.519 --> 00:08:35.799
a web framework, like what features
are involved in creating a user interface,

100
00:08:35.720 --> 00:08:41.840
and from there we work backwards to
what do we need to implement for that

101
00:08:41.960 --> 00:08:46.159
to work, and they kind of
meet in the middle. These two approaches

102
00:08:46.200 --> 00:08:50.840
meet in the middle, but we
have these slightly different emphasies and it's actually,

103
00:08:50.879 --> 00:08:56.759
I think really healthy to have two
projects like these in the same sphere

104
00:08:56.799 --> 00:09:01.519
because we can sort of bound off
each other a little bit and learn from

105
00:09:01.519 --> 00:09:05.080
each other a little bit, but
also give people multiple options for how they

106
00:09:05.080 --> 00:09:11.159
want to build their applications based on
their preferences. I think one interesting way

107
00:09:11.240 --> 00:09:16.720
in which we have sort of converged
on that idea of it being a state

108
00:09:16.759 --> 00:09:22.000
management system with you know, domb
manipulation bolted on top is the previously Spelt

109
00:09:22.120 --> 00:09:28.080
was a component library essentially kind of
bills the same niche as react or view

110
00:09:28.159 --> 00:09:33.720
or something like that, but we're
Spelt five. We're introducing this idea of

111
00:09:33.919 --> 00:09:41.679
universal reactivity. And so whereas previously
you had this sort of magical reactive behavior

112
00:09:41.799 --> 00:09:43.440
inside your components, but then as
soon as you needed to write code in

113
00:09:43.480 --> 00:09:46.559
javascripts, you were sort of left
out in the in the boring, old

114
00:09:46.559 --> 00:09:52.480
black and white world of normal JavaScript. With Felt five, you can take

115
00:09:52.559 --> 00:09:58.919
your reactive constructs and you can bring
them into your JavaScript modules and your tuches

116
00:09:58.919 --> 00:10:05.320
withrop modules, so that we no
longer have this nice, exciting reactive world

117
00:10:05.399 --> 00:10:09.639
inside components and then the world outside. It's all one thing. And we've

118
00:10:09.639 --> 00:10:16.759
done that by kind of bringing reactivity
into the language itself rather than by exposing

119
00:10:16.159 --> 00:10:22.320
these primitives for people to use.
So functionally, then if your writings felt

120
00:10:22.360 --> 00:10:26.399
it's Felt four versus Felt five,
how is it going to feel different?

121
00:10:26.440 --> 00:10:31.480
How is it going to look different? So the most obvious example would be

122
00:10:31.360 --> 00:10:35.720
it would be how that you how
you represent state in a component in s

123
00:10:35.759 --> 00:10:41.000
Felt three and four. Somewhat famously, if you have a variable that needs

124
00:10:41.039 --> 00:10:46.000
to update and you want to have
your component update in response to that changing,

125
00:10:46.159 --> 00:10:48.519
then you would just declare it using
let va. So you might have

126
00:10:48.639 --> 00:10:52.639
let count equals zero, and then
inside a click handler you might do count

127
00:10:52.639 --> 00:10:56.080
plus equals one, So you click
on a button that invokes that handler,

128
00:10:56.399 --> 00:11:00.960
and then wherever count is referenced inside
your ten plate, it will update.

129
00:11:01.080 --> 00:11:07.759
And that's still true, but now
instead of that just being automatically reactive,

130
00:11:07.840 --> 00:11:15.440
you do let count equals dollar,
state parentheses zero. And what that is

131
00:11:15.440 --> 00:11:18.919
is an instruction to the compiler.
We call it a roun that is telling

132
00:11:18.919 --> 00:11:22.399
the compiler of this piece of state
right here, or this variable count is

133
00:11:22.440 --> 00:11:24.759
a reactive piece of state. It's
going to be part of the reactive graph

134
00:11:24.759 --> 00:11:30.080
that you need to track, and
when it updates, everything that depends on

135
00:11:30.120 --> 00:11:33.679
it is also going to need to
update. So we've made things a little

136
00:11:33.679 --> 00:11:39.639
bit more explicit, and in return, you now have code that is super

137
00:11:39.639 --> 00:11:45.440
easy to refactor. It can be
moved between components or outsider components, multiple

138
00:11:45.480 --> 00:11:50.480
things can reference the same reactive primitives
throughout your application, and it really gives

139
00:11:50.519 --> 00:11:56.200
you a lot of flexibility and power
in how you define the like which parts

140
00:11:56.240 --> 00:12:01.159
of your application are reactive and which
parts are not. So when you talk

141
00:12:01.200 --> 00:12:03.639
about state, you know, I'm
a primary view developer and haven't done a

142
00:12:03.639 --> 00:12:07.399
lot of Spelt. I'm thinking of, you know, view X or where

143
00:12:07.399 --> 00:12:09.759
you have a separate state you know, I think it's what does it react

144
00:12:09.840 --> 00:12:15.960
uses for state management? I forget
or yeah, reducts or something like that.

145
00:12:16.000 --> 00:12:20.960
Okay, so is this am I
understanding that this is as simple as

146
00:12:20.960 --> 00:12:26.279
if you declare a variable with your
your ruin inside a component. Is it

147
00:12:26.320 --> 00:12:31.919
automatically available in other components without having
a separate library like a redux or a

148
00:12:31.000 --> 00:12:35.600
view X to manage that or how
is that working? Yeah? So you

149
00:12:35.639 --> 00:12:39.360
can you just use that inside a
dot spelt file, which is where you

150
00:12:39.480 --> 00:12:43.759
all feel components. You can put
it inside a dot spelt dot JS file

151
00:12:43.840 --> 00:12:48.240
or dot spelt dot ts file and
then you can just export that and use

152
00:12:48.279 --> 00:12:50.519
it in the context of other components. It's pretty unlikely that you would need

153
00:12:50.559 --> 00:12:56.399
a full blown state management library because
it's all just kind of built in,

154
00:12:56.440 --> 00:13:00.240
and you can pass these things around
as component props, and you can you

155
00:13:00.240 --> 00:13:05.759
know, pass them into functions and
so on, and you know that that

156
00:13:05.919 --> 00:13:11.679
idea of state management just kind of
falls out naturally from the way that the

157
00:13:11.679 --> 00:13:15.519
way that Spelt is designed. It's
pretty unlikely that you're going to need to

158
00:13:15.559 --> 00:13:18.600
have a State Management library. On
top of that, the one exception that

159
00:13:18.679 --> 00:13:22.919
I would maybe consider worthwhile is if
you had some complicated logic that you wanted

160
00:13:22.919 --> 00:13:26.960
to model as a state machine.
Like we don't have a state machine primitive

161
00:13:26.960 --> 00:13:31.159
built into the framework, but it's
really easy to build those sorts of abstractions

162
00:13:31.440 --> 00:13:35.080
on top of the ruins that you
get with the framework. So how do

163
00:13:35.120 --> 00:13:39.799
you handle mutability issues then? So
you know, it seems to me if

164
00:13:39.840 --> 00:13:45.399
you're just you're declaring a state variable
in one of your spelt dot whatever files,

165
00:13:45.480 --> 00:13:48.279
right, and then you've got it
available somewhere else, maybe you mutate

166
00:13:48.279 --> 00:13:52.480
it in one place and it messes
up something somewhere else Whereas you know,

167
00:13:52.519 --> 00:13:58.039
I'm used to the viewx pattern where
you have state actions and where you commit

168
00:13:58.080 --> 00:14:03.399
your change. They cant believe on
blanking out on it. You can control

169
00:14:03.519 --> 00:14:07.279
where the mutability happens, where the
actual changes happen, so you're not accidentally

170
00:14:07.360 --> 00:14:09.360
you're mutating something somewhere else. And
it seems like if you just have a

171
00:14:09.440 --> 00:14:13.120
variable okay here, it is not
available over here, you could actually mutate

172
00:14:13.120 --> 00:14:16.840
it in another place and you're screwing
up where you really don't want to mute,

173
00:14:16.919 --> 00:14:22.559
you know, affect your person template. Yeah, so it's up to

174
00:14:22.559 --> 00:14:28.679
you how you expose the state that
you create other parts of your application.

175
00:14:28.159 --> 00:14:33.600
And there's a few ways that that
manifests. If you define some state inside

176
00:14:33.639 --> 00:14:37.840
a component and you pass it down
to another component as a property, then

177
00:14:37.919 --> 00:14:41.000
if that component tries to mutate that
state, we will actually say, hey,

178
00:14:43.080 --> 00:14:45.360
you shouldn't be doing this. And
the way that we do that is

179
00:14:45.360 --> 00:14:48.799
we have this concept of ownership validation. So if one component, say component

180
00:14:48.879 --> 00:14:52.679
A, owns a piece of state, and it passes it down to component

181
00:14:52.720 --> 00:14:56.679
B, component B then tries to
mutate it, it will say component B

182
00:14:56.919 --> 00:15:01.399
is trying to mutate some state that
it does not own. That state was

183
00:15:01.399 --> 00:15:05.759
created in component and if you want
component B to be able to mutate it,

184
00:15:05.840 --> 00:15:09.080
because actually it's very often quite useful, like if you're building something you

185
00:15:09.120 --> 00:15:13.600
want to break it up into multiple
components, then it's kind of useful if

186
00:15:13.639 --> 00:15:16.159
they can all share ownership of a
piece of state. And the way that

187
00:15:16.159 --> 00:15:20.159
we do that in SPELL is with
bindings. Instead of just passing a property

188
00:15:20.200 --> 00:15:24.960
down to a component, you can
pass it down as a binding and that

189
00:15:24.039 --> 00:15:28.879
effectively gives the child component read write
access to the original piece of state.

190
00:15:30.320 --> 00:15:33.559
So that's sort of like passing something
by reference, you know, like a

191
00:15:33.639 --> 00:15:37.039
PHP you talk about how you pass
something whereas just you can just see it

192
00:15:37.120 --> 00:15:41.440
versus you can actually mutate it,
you know, in terms of mechanics,

193
00:15:41.639 --> 00:15:43.960
no, but in terms of like
conceptually, yes, that's exactly what it

194
00:15:45.000 --> 00:15:50.240
is. You're literally passing ownership of
the same piece of state as opposed to

195
00:15:50.639 --> 00:15:54.799
giving someone else a read only view
of it. You have to specifically declare

196
00:15:54.879 --> 00:16:00.200
that possibility on both sides. Yeah, So the component needs to say this

197
00:16:00.279 --> 00:16:04.679
is something that I want to mutate. This needs to be a bindable property,

198
00:16:06.200 --> 00:16:11.759
and then the consuming component needs to
actually invoke the binding with the So

199
00:16:12.000 --> 00:16:15.720
where you pass in a proper you
do bind colon count equals count instead of

200
00:16:15.840 --> 00:16:22.080
just count equals count. So here's
the thing about it, and I've encountered

201
00:16:22.080 --> 00:16:27.440
it in the context of Solid,
where you know, Solid is kind of

202
00:16:27.480 --> 00:16:33.039
deceptively similar to React in the way
that it looks because it uses gsx and

203
00:16:33.360 --> 00:16:41.039
the syntax looks very, very similar. But then you realize that the concept

204
00:16:41.279 --> 00:16:48.600
of components in Solid is much more
diluted than it is in React because in

205
00:16:48.720 --> 00:16:55.559
React, components are really self contained, and you really need to be explicit

206
00:16:55.639 --> 00:17:00.279
about how you pass stuff into them
or out of them, whereas in solid

207
00:17:00.440 --> 00:17:07.279
you can share signals around or you
can put signals totally external to components.

208
00:17:07.920 --> 00:17:14.160
And and therefore components just kind of
become a unit of code rather than necessarily

209
00:17:14.240 --> 00:17:22.759
a unit of of of rendering or
of logic. How how does where it

210
00:17:22.759 --> 00:17:27.839
does svelt kind of stand in this
regard, if anything, we've taken that

211
00:17:27.880 --> 00:17:33.480
idea to its logical conclusion. So
some years ago I wrote a blog post

212
00:17:33.519 --> 00:17:37.000
called virtual dom is pure overhead.
Oh yeah, this is this is about

213
00:17:40.240 --> 00:17:44.440
people cry, I'm sure. Yeah, this is about trying to correct some

214
00:17:44.519 --> 00:17:48.839
misconceptions that people had about reacts rendering
model and whether it was faster than the

215
00:17:48.880 --> 00:17:52.640
real arm or whatever. The details
of that aren't so important. It was

216
00:17:52.680 --> 00:17:59.440
just that this X is the new
overhead became sort of a a theton that

217
00:17:59.559 --> 00:18:03.680
I could like to be head with
by Ryan who wrote an article called components

218
00:18:03.720 --> 00:18:07.759
are pure overhead, And so it's
become this this fun little meme. I

219
00:18:07.759 --> 00:18:11.920
think there's a quick blog post somewhere
called hydration is pure overhead and so on,

220
00:18:12.519 --> 00:18:17.599
and what components of pure overhead was
arguing was that you know, a

221
00:18:17.599 --> 00:18:21.079
lot of frameworks, as you say, have this idea that a lot of

222
00:18:21.079 --> 00:18:26.319
the stuff lives in the component.
In reaction, you don't qualifying as you

223
00:18:26.359 --> 00:18:29.519
do like React dot create component,
and then you pass in the component constructor,

224
00:18:29.839 --> 00:18:33.240
and then when that component is rendered, there's all of this book keeping

225
00:18:33.359 --> 00:18:37.559
that happens, so that like all
of your hooks belong together and you know,

226
00:18:37.599 --> 00:18:41.759
so on, whereas in solid it's
it's a lot more kind of transparent,

227
00:18:41.079 --> 00:18:45.680
Like a component can literally just return
the result of calling document dot create

228
00:18:45.720 --> 00:18:52.079
element and that's that's totally legitimate and
solid. And that was, you know,

229
00:18:52.359 --> 00:18:57.640
a really smart blog post and it's
spelt five. I think is probably

230
00:18:57.680 --> 00:19:03.359
the purest expression of that idea.
Because in spelled vive, components are literally

231
00:19:03.400 --> 00:19:07.119
just function calls. If you have
you know, angle brackets, capital left,

232
00:19:07.200 --> 00:19:11.759
foo to create a food component in
your inside another component. The compiler

233
00:19:11.799 --> 00:19:18.119
takes that and it turns it into
a function call whose carey is just the

234
00:19:18.160 --> 00:19:23.279
foo function and whose first argument is
the anchor node that it should be prepended

235
00:19:23.319 --> 00:19:27.519
to, followed by an object of
properties. And there is a little bit

236
00:19:27.559 --> 00:19:30.720
of book keeping that happens in side
components, you know, we push onto

237
00:19:30.839 --> 00:19:36.799
a stack so that we can have
a context API for example, and for

238
00:19:36.839 --> 00:19:40.960
some life cycle purposes, we keep
track of when effects are running so that

239
00:19:40.960 --> 00:19:45.160
we can control the timing of effects
because we think it's very important that things

240
00:19:45.240 --> 00:19:48.480
run in a certain predictable fashion.
But there's almost no work happening when you

241
00:19:48.559 --> 00:19:52.400
create a component. And it was
really Dominic Ganaway who opened my eyes to

242
00:19:52.880 --> 00:19:56.759
the power of this when he joined
the team and had been working on an

243
00:19:56.799 --> 00:20:03.119
experimental framework of his own called Optane, sort of showed that if that's what

244
00:20:03.160 --> 00:20:07.319
your components are, if they are
literally just function calls, then tooling can

245
00:20:07.359 --> 00:20:11.480
take that and it can inline some
of those function calls, and it can

246
00:20:11.519 --> 00:20:18.880
really be smart about minimizing the overhead
that is involved in composing multiple components together.

247
00:20:19.240 --> 00:20:23.119
And so, you know, Ryan
was right, and we have absolutely

248
00:20:23.160 --> 00:20:27.519
no shame about stealing the best ideas
from other frameworks, and that is no

249
00:20:27.559 --> 00:20:34.880
exception. So components are really just
a method of organizing code rather than having

250
00:20:36.039 --> 00:20:41.839
any runtime consequences. What you're saying, if I'm understanding you correctly or hardly

251
00:20:41.880 --> 00:20:45.400
any runtime consequence that is, yeah, that is sort of the north star.

252
00:20:47.440 --> 00:20:51.440
There was the talk that you referenced
earlier in this podcast, rethinking reactivity,

253
00:20:51.440 --> 00:20:55.200
had a slide in which I say
frameworks are not a tool for organizing

254
00:20:55.200 --> 00:21:00.519
your code, they are a tool
for organizing your mind. And I don't

255
00:21:00.559 --> 00:21:06.400
think Spelt prior to version five really
lived up to that, But now I

256
00:21:06.440 --> 00:21:10.920
think we we really are. Like
how you offer your components and how that

257
00:21:11.039 --> 00:21:18.359
manifests in terms of the code that
gets actually executed in the browser, they

258
00:21:18.359 --> 00:21:22.279
don't need to be the same thing. You can you can optimize things by

259
00:21:25.039 --> 00:21:30.119
treating them as something other than than
how you wrote them, if that makes

260
00:21:30.160 --> 00:21:34.200
sense. So, going back to
the practicalities, you said that if I

261
00:21:34.279 --> 00:21:41.160
want to create a reactive value in
spelled five, instead of just doing let

262
00:21:41.359 --> 00:21:47.519
counter equals zero, I do let
counter equals dollar state zero. First of

263
00:21:47.519 --> 00:21:51.119
all, it's interesting that you put
dollar at the front rather than at the

264
00:21:51.240 --> 00:21:56.519
end like solid and quick. I
actually approve I like dollar in front because

265
00:21:56.559 --> 00:22:02.079
I think it makes it clearer you
don't need to be dollar key. And

266
00:22:02.079 --> 00:22:04.200
then you see a drop down list
of all of the ruins that are available

267
00:22:04.240 --> 00:22:08.680
to you. Yeah, there's that
obviously. Also the fact that just when

268
00:22:08.720 --> 00:22:12.000
you read the code. It's up
front. You don't need to read the

269
00:22:12.119 --> 00:22:19.519
entire word to realize that it's not, you know, just a regular function.

270
00:22:19.920 --> 00:22:25.759
And I'm guessing it even makes parsing
simpler because you see dollar upfront,

271
00:22:25.799 --> 00:22:29.279
and you know you don't need to
like but you know, put it aside.

272
00:22:29.640 --> 00:22:36.079
My question is actually different. What
happens if I have old Spelt code

273
00:22:36.440 --> 00:22:42.039
that just has let counter equals zero. Will my counter stop being reactive?

274
00:22:42.119 --> 00:22:47.160
Will I need to do a global
search and replace across my entire code base?

275
00:22:47.240 --> 00:22:49.039
What happens? This is an excellent
question, and I'm very happy that

276
00:22:49.079 --> 00:22:52.519
you asked it. The answer is, it will can seem to work.

277
00:22:52.200 --> 00:22:59.000
We have spent a lot of time
making sure that Spelt ve is as backwards

278
00:22:59.000 --> 00:23:02.079
compatible as it possibly can be.
In fact, the first thing that we

279
00:23:02.079 --> 00:23:06.160
did when we started working on this
code base was we ported over the Spelt

280
00:23:06.160 --> 00:23:10.319
for test suite. So as we've
been building Spelt five, we've been building

281
00:23:10.359 --> 00:23:14.440
it against that existing test suite.
So essentially there are two ways that you

282
00:23:14.440 --> 00:23:18.400
can write a Spelt component. Now, there's what we internally call legacy mode.

283
00:23:18.559 --> 00:23:22.440
I guess it would be nicer to
call it classic mode or something like

284
00:23:22.480 --> 00:23:26.680
that so that people don't feel like
their code is now technical debt. And

285
00:23:26.720 --> 00:23:32.079
then there is Rune's mode, and
you can opt into runs mode explicitly by

286
00:23:32.079 --> 00:23:34.440
setting a compiler flag. But really
the way to do it is just start

287
00:23:34.480 --> 00:23:38.839
writing runs. If you have a
roune in your component, then the compiler

288
00:23:38.880 --> 00:23:44.960
will opt you into runs mode and
then you'll get the new style of reactivity.

289
00:23:45.000 --> 00:23:47.279
But if you don't do that,
if you have an existing component,

290
00:23:47.359 --> 00:23:49.319
or if you're using a library that
was built for Spelt free and four,

291
00:23:49.920 --> 00:23:55.599
then even though the mechanics under the
hood it's still signal based, it's using

292
00:23:55.640 --> 00:24:03.799
this modern ultrafast system, the authoring
is exactly the same. And it's very

293
00:24:03.839 --> 00:24:08.640
important to us that people are able
to migrate their applications incrementally upgrade from Swelt

294
00:24:08.680 --> 00:24:14.319
part to five. Everything should in
theory keep working, and then as you

295
00:24:14.359 --> 00:24:17.799
have time, you know new components
will be runs mode, and you can

296
00:24:17.839 --> 00:24:22.200
gradually migrate your own components to runs
mode to take advantage of some of the

297
00:24:22.240 --> 00:24:26.200
new features. But it's a very
important question, and I'm very glad that

298
00:24:26.240 --> 00:24:27.519
you gave me the opportunity to answer
it. This is something that we take

299
00:24:27.599 --> 00:24:33.160
very seriously, so I now have
a new role for components in Swelt.

300
00:24:33.200 --> 00:24:37.920
There are a unit of versioning of
Swelt. Basically, if I'm understanding you

301
00:24:38.000 --> 00:24:41.200
correctly, you're saying, if I
in my component, I had let x

302
00:24:41.240 --> 00:24:47.200
equals one and let y equals two
or both of them are reactive. But

303
00:24:47.359 --> 00:24:52.759
now if I do let X change
just the x, let x equals state

304
00:24:52.000 --> 00:24:57.920
a dollar state one and leave the
wise it is X is still reactive.

305
00:24:59.000 --> 00:25:03.440
But why is no longer react?
That's right. You need to migrate the

306
00:25:03.599 --> 00:25:07.480
entire component to runs mode, otherwise
things will stop working. We plan to

307
00:25:07.559 --> 00:25:14.319
offer some automated migration tools to make
that a little bit easier for folks,

308
00:25:15.319 --> 00:25:19.759
although at our current stage of development
that's not our top priority. But before

309
00:25:19.759 --> 00:25:23.279
we have a stable then that will
be something that we offer. So who

310
00:25:23.319 --> 00:25:26.680
is the fantasy fan that named things
ruins? Is that you? Or is

311
00:25:26.680 --> 00:25:34.720
that so? I have one of
one of these guys? The this is

312
00:25:34.759 --> 00:25:41.880
the the meta Quest three and on
there there is a game called Ragnarok.

313
00:25:41.680 --> 00:25:47.799
Oh yes, and it is the
Drumming one. So the like I'm sure

314
00:25:47.839 --> 00:25:51.400
a lot of people are familiar with
games like Beat Saber, the rhythm games

315
00:25:51.400 --> 00:25:53.960
where you have sort of things flying
at you and you need to either bat

316
00:25:55.000 --> 00:25:57.559
them away or punch them away,
or like simulate playing some sort of musical

317
00:25:57.559 --> 00:26:03.640
instrument. The stick of Ragnarok is
that you are the drummer on a Viking

318
00:26:03.720 --> 00:26:08.480
ship and you need to motivate your
rowers to row faster to Valhalla by smashing

319
00:26:08.519 --> 00:26:11.160
the ruins as they come past you, and you have these drums in front

320
00:26:11.160 --> 00:26:15.119
of you. It is so I
don't play a lot of video games.

321
00:26:15.119 --> 00:26:18.079
I don't. I wish I had
enough time to, but I don't.

322
00:26:18.759 --> 00:26:22.559
I love this game so much.
It is incredibly fun and a really good

323
00:26:22.640 --> 00:26:26.480
workout. And so one day,
you know, we're thinking about what what

324
00:26:26.519 --> 00:26:30.559
can we call this concept? What
is a good name for something that is

325
00:26:32.039 --> 00:26:37.240
it's sort of like it's a magical
symbol. You're adding some you're invoking some

326
00:26:37.279 --> 00:26:41.480
magic within your code, and it's
it's changing the nature of its surroundings.

327
00:26:44.039 --> 00:26:48.599
We want a word that is memorable
that a lot of people would associate with

328
00:26:48.599 --> 00:26:56.039
with that sort of thing, ideally
a single syllable, and that is what

329
00:26:56.160 --> 00:27:00.599
we settled on. And the idea
very much came from this stupid game where

330
00:27:00.839 --> 00:27:03.440
you have to make your Viking rows
row faster. Well, funny story.

331
00:27:03.440 --> 00:27:06.599
I mean when I think of Elf
runs, I think a Lord of the

332
00:27:06.680 --> 00:27:11.440
Rings because they're mentioned quite a bit
and worn runs or ruins. Yeah,

333
00:27:11.440 --> 00:27:15.920
anyway, I thought it was Elf. Anyway, the Elphins have an Elvis

334
00:27:15.960 --> 00:27:19.240
script, right, okay, or
runs and Elvis scripts. Sorry I failed

335
00:27:19.279 --> 00:27:23.920
in my lot R terminology. But
you talk about Ragnarok. A couple of

336
00:27:25.000 --> 00:27:30.359
years ago, my company were remote
and we had a get together in Arlington

337
00:27:30.359 --> 00:27:33.680
and Washington, DC area and for
a fun activity, we went to a

338
00:27:33.759 --> 00:27:37.720
place that uses the quest metaquest had
said it was a whole br experience.

339
00:27:37.799 --> 00:27:41.319
This little is down in a basement
and we had a couple hours to play

340
00:27:41.400 --> 00:27:44.640
games and I came out of there
sweating like a pig and had a killer

341
00:27:44.680 --> 00:27:47.799
workout at the first game we played
for probably a half hour, was Ragnarok,

342
00:27:48.680 --> 00:27:52.039
and so yeah, I was that
was just crazy, just trying to

343
00:27:52.119 --> 00:27:56.319
keep up. There's like five different
levels. You know, when the first

344
00:27:56.359 --> 00:27:57.839
level was you know, pretty straightforward. You get to level five and it's

345
00:27:57.880 --> 00:28:02.000
like, you know, drummer for
a rock band is just some of the

346
00:28:02.039 --> 00:28:04.519
craziest rhythms that you have to try
to keep up with, and it has

347
00:28:06.279 --> 00:28:08.000
You're on the ship and you're racing
with each other, and the faster you

348
00:28:08.039 --> 00:28:11.599
go, the faster your ship goes
as compared to the other people. And

349
00:28:11.680 --> 00:28:15.279
there are circles coming at you,
and you have your you know, your

350
00:28:15.319 --> 00:28:19.039
actual it looks like drumsticks in the
video game, and you have to hit

351
00:28:19.079 --> 00:28:22.880
on the ones with the ex or
however they mark them to get the right

352
00:28:22.960 --> 00:28:25.519
rhythm. And so the more accurate
you are, the better your score is,

353
00:28:25.559 --> 00:28:26.680
and the faster your ship goes.
But man, it's a workout.

354
00:28:27.240 --> 00:28:30.799
It's really a ton of fun too. It's a lot of heavy rock type

355
00:28:30.920 --> 00:28:34.279
music. For sure. I actually
have a son who's a professional drummer,

356
00:28:34.400 --> 00:28:37.359
so maybe he would probably do well. Yeah, he would do well with

357
00:28:37.440 --> 00:28:41.799
that. Me not so much.
Does it play on the ocula or the

358
00:28:42.160 --> 00:28:45.480
ocular metic quests whatever? Does it
play it on the quest too, because

359
00:28:45.519 --> 00:28:52.440
that's the one I have? Yeah, it does it does. Going back

360
00:28:52.519 --> 00:28:57.079
to spell, this was directly relevant, you know that. Yeah, So

361
00:28:57.440 --> 00:29:03.240
we spoke about one room, which
is a dollar state. What are the

362
00:29:03.240 --> 00:29:10.039
other routes? So there's the three
runs that form the sort of holy trinity

363
00:29:10.079 --> 00:29:15.279
of reactivity, which is state derivations
and effects state creates the what are sometimes

364
00:29:15.319 --> 00:29:22.720
called the sources derived dollar derived is
the second run which creates a value that

365
00:29:22.880 --> 00:29:27.680
is derived from state. So you
know, obvious toy example would be you've

366
00:29:27.720 --> 00:29:33.519
got let count equals dollar state zero, let doubled equals dollar derived parentheses count

367
00:29:33.519 --> 00:29:41.640
times two. And it's a little
bit different to other frameworks. If they

368
00:29:41.680 --> 00:29:45.519
have a computer primitive, then typically
you'll pass in a function that returns a

369
00:29:45.599 --> 00:29:51.519
value. You can do that with
a roune called derived dot buy, but

370
00:29:51.720 --> 00:29:55.799
typically you'll just use derived by itself
and you pass in an expression and that

371
00:29:55.880 --> 00:30:00.799
expression becomes reactive. And we do
that to discover as people from writing side

372
00:30:00.799 --> 00:30:06.279
effects inside their derivations, which is
you know, bad news bears. But

373
00:30:06.359 --> 00:30:08.839
it's like a trap that people will
fall into quite often. And it's also

374
00:30:08.920 --> 00:30:15.640
just like more concise and nice little
look at and uh these derived To be

375
00:30:15.640 --> 00:30:18.599
a compiler, it is, it
is, it absolutely is. We say

376
00:30:18.599 --> 00:30:23.200
this a lot. Every time we're
weighing up different designs. We're like,

377
00:30:23.240 --> 00:30:27.160
well, what what can we do
that everyone else can't because we don't have

378
00:30:27.200 --> 00:30:32.359
the same constraints And being a compiler, that's exactly true anymore. I mean,

379
00:30:32.400 --> 00:30:37.960
everybody is becoming a compiler these days. It's it's true, but a

380
00:30:38.000 --> 00:30:44.759
lot of a lot of frameworks are
using compilers as kind of like an optimization

381
00:30:44.880 --> 00:30:51.720
step. But ah, you know, they're religious about not allowing the compiler

382
00:30:51.799 --> 00:30:56.880
to change the semantics of the code. Whereas we sort of take this view

383
00:30:56.920 --> 00:31:03.039
that changing this romantics of code is
it's exactly what frameworks are for. Like,

384
00:31:03.119 --> 00:31:07.720
all frameworks are changing the semantics of
code. You know, hooks don't

385
00:31:07.759 --> 00:31:12.359
behave like normal functions, like these
sort of functions that remember what the value

386
00:31:12.400 --> 00:31:15.720
was the last time you call them. That's weird. Angela has these things

387
00:31:15.720 --> 00:31:19.359
called zones where like if you do
something inside a set time out, like

388
00:31:19.880 --> 00:31:23.400
it will track the stuff that happens
inside the set time out. That's weird.

389
00:31:23.440 --> 00:31:26.279
That's changing the semantics. You a
view does a lot of stuff with

390
00:31:26.759 --> 00:31:32.319
property assignments because everything is a proxy. That is also kind of weird.

391
00:31:32.799 --> 00:31:36.640
And we just draw the line in
a slightly different place. We say it's

392
00:31:36.799 --> 00:31:41.319
okay to change the semantics as long
as we're doing it in a clearly understandable

393
00:31:41.319 --> 00:31:48.400
way that improves the authoring experience without
sacrificing user experience. And so yeah,

394
00:31:48.480 --> 00:31:52.519
being a compiler just it gives us
this this broader design space, and it

395
00:31:52.559 --> 00:31:57.960
gives us a slightly different mentality when
when we're figuring out the best solutions to

396
00:31:59.039 --> 00:32:01.880
various problems, and so dollar arrived
is it is one example, it's just

397
00:32:01.920 --> 00:32:09.720
a nicer way of declaring derivations than
exists in other reactive systems. And the

398
00:32:09.759 --> 00:32:16.559
third one. The third one is
the effect room, which basically just defines

399
00:32:16.599 --> 00:32:24.440
a piece of work that happens when
some arbitrary dependencies change. A good example

400
00:32:24.519 --> 00:32:30.640
would be you have a canvas element
and you want to draw something to that

401
00:32:30.720 --> 00:32:36.920
canvas. You can't really do that
declaratively using using markup, because that's not

402
00:32:36.960 --> 00:32:39.640
how canvas works. So that is
a case where you would have to use

403
00:32:40.200 --> 00:32:45.880
the escape patch of being able to
write imperative code inside and effect. Anything

404
00:32:45.880 --> 00:32:47.400
that you reference inside the effect,
if it's a reactive piece of state,

405
00:32:47.480 --> 00:32:53.799
then when that changes, the effect
will rerun. So you know, inside

406
00:32:53.880 --> 00:33:00.480
that canvas effect you have canvas dot
fill style equals color, and then color

407
00:33:00.519 --> 00:33:04.119
is a piece of state that changes, or it's a property that's passed into

408
00:33:04.119 --> 00:33:07.880
the component and that changes, then
that effect will rerun. But what you

409
00:33:07.920 --> 00:33:14.319
don't have to do is explicitly tell
the system which things your effect depends on.

410
00:33:14.680 --> 00:33:16.920
Because this is the beauty of signal
based reactivity. It will just figure

411
00:33:16.920 --> 00:33:22.839
that out for you. That's the
whole purpose. So similarly with dollar derived

412
00:33:23.519 --> 00:33:31.920
exactly. Yeah, so you basically
analyze the code inside that rule, identify

413
00:33:32.480 --> 00:33:42.039
which signals it depends on, and
then automatically updated execute it whenever any of

414
00:33:42.079 --> 00:33:46.480
these signals changes. Yes, so
that this all happens when the application is

415
00:33:46.519 --> 00:33:50.480
running. And this is a big
difference with spelt free and four and steal

416
00:33:50.559 --> 00:33:52.480
three and four. We would actually
look at the code that you wrote,

417
00:33:52.720 --> 00:33:58.319
and if you had a reactive statement
that contained a reference to something, for

418
00:33:58.400 --> 00:34:01.400
example, your canvas dot feel style
cause color, we would look at the

419
00:34:01.440 --> 00:34:07.079
code itself and we would see that
that reference to a reactive piece of state,

420
00:34:07.599 --> 00:34:13.639
and the compiler would emit code that
depended specifically on that piece of state.

421
00:34:14.159 --> 00:34:16.239
But that doesn't scale very well because
if you want to take some part

422
00:34:16.239 --> 00:34:21.199
of that code and refractor it out
into a helper function, then you're sort

423
00:34:21.199 --> 00:34:23.760
of out of luck because the compiler
can no longer see it. And so

424
00:34:23.800 --> 00:34:30.400
the big difference was spelt five is
we're relying on the reactive dependency graph to

425
00:34:30.480 --> 00:34:35.599
figure that out at run time,
and that turns out to be a lot

426
00:34:35.639 --> 00:34:39.519
more scalable, a lot more efficient. Not quite as cool, honestly,

427
00:34:39.719 --> 00:34:44.159
like, there's something a little bit
fun about using static analysis for this stuff.

428
00:34:44.199 --> 00:34:46.920
But it turns out that there are
enough cases where that model falls apart

429
00:34:47.239 --> 00:34:52.079
the signal based approach is the right
one. Interesting. So in a lot

430
00:34:52.079 --> 00:34:59.119
of ways, even though you're very
much still a compiler base, they're actually

431
00:34:59.239 --> 00:35:05.320
much close to JavaScript than you previously
were in certain ways. We are,

432
00:35:05.519 --> 00:35:12.760
yes, we are still take in
this compiler centric mindset, but I think

433
00:35:12.760 --> 00:35:15.920
we're using it in a slightly more
responsible way than maybe we did in the

434
00:35:15.920 --> 00:35:21.840
past. But yes, we will. I have to say that previously this

435
00:35:22.119 --> 00:35:28.519
was one of my hang ups about
Sevelt. That I know that you put

436
00:35:28.559 --> 00:35:31.719
it in a cevelt file, which
really highlights the fact that this is not

437
00:35:31.800 --> 00:35:37.159
just a regular JavaScript file or a
typescript file. But in certain ways,

438
00:35:37.239 --> 00:35:44.639
I used to say that Sevelt was
deceptively like JavaScript in terms of syntax,

439
00:35:44.719 --> 00:35:51.760
but very different in terms of semantics, and that that's a problem and at

440
00:35:51.800 --> 00:35:57.719
least in my opinion, And I
really like the fact that you're able now

441
00:35:57.840 --> 00:36:04.519
to kind of to create the extend
to eliminate this semantic disconnect that existed before.

442
00:36:05.920 --> 00:36:08.360
Yeah, and it means that we
don't have to have two separate approaches

443
00:36:08.360 --> 00:36:13.639
to reactivity. Previously, we had
let count equals zero inside your component.

444
00:36:13.800 --> 00:36:16.079
But then if you wanted to have
some piece of reactive state that we shared

445
00:36:16.119 --> 00:36:21.400
between components, you couldn't then do
that. You had to use something that

446
00:36:21.400 --> 00:36:24.199
we called a store. Stores still
exist in Spelt five, but they are

447
00:36:24.239 --> 00:36:30.320
sort of de emphasized because now you
can create reactive state anywhere in your application,

448
00:36:30.360 --> 00:36:32.880
and you can share it between components
very easily, and so everything is

449
00:36:32.960 --> 00:36:37.559
just a lot more unified than it
ever has been before. But it still

450
00:36:37.639 --> 00:36:42.760
leads to be inside svelled files.
I mean, I can't just use one

451
00:36:42.800 --> 00:36:45.880
of them inside of a regular JavaScript
file because then the compiler won't see it,

452
00:36:46.400 --> 00:36:52.760
require my misunderstanding. Right. So, because we are essentially changing the

453
00:36:52.840 --> 00:36:59.119
language, we are adding something to
the language, we took the decision to

454
00:36:59.320 --> 00:37:04.119
only do that inside dot spelt dot
JS and dot spelt dot t S files.

455
00:37:04.360 --> 00:37:07.880
So you still have the entirety of
you know, everything that works with

456
00:37:07.960 --> 00:37:12.280
job scripts and types with it,
like all of the tooling works as you

457
00:37:12.280 --> 00:37:15.599
would expect, and these are just
normal modules, so you can import things,

458
00:37:15.960 --> 00:37:17.400
you can share things between them as
you would with any other module.

459
00:37:19.519 --> 00:37:23.679
But the spelt language extensions will only
apply to those dot sell dot s files.

460
00:37:23.800 --> 00:37:29.599
But it gives you a place to
put that shareable logic. So as

461
00:37:29.599 --> 00:37:35.079
opposed to previously in the past,
a dot svelt file would always be a

462
00:37:35.119 --> 00:37:38.880
component file by definition, and now
prom my understanding, it could be a

463
00:37:39.039 --> 00:37:45.480
utility file containing you know, just
ruine declarations or helper functions or stuff like

464
00:37:45.519 --> 00:37:51.519
that that just need to undergo the
compilation step in order to work with the

465
00:37:51.599 --> 00:37:58.239
rooms exactly. Yeah, that's really
cool. I really like that. Yeah,

466
00:37:58.280 --> 00:38:01.840
for a while, we considered just
doing it for every file in your

467
00:38:01.880 --> 00:38:07.239
code base, but we decided that
that was a little bit irresponsible. Firstly,

468
00:38:07.639 --> 00:38:10.360
it's going to mean that the compiler
has to look at a lot more

469
00:38:10.400 --> 00:38:14.559
files, and it means that in
any case of ambiguity, we're a little

470
00:38:14.599 --> 00:38:21.320
bit stuck. But it also means
that we're sort of squatting on on this

471
00:38:21.679 --> 00:38:24.239
room name space. And if other
frameworks were to come along and say,

472
00:38:24.239 --> 00:38:27.480
hey, you know what, that's
actually a pretty cool idea. We want

473
00:38:27.480 --> 00:38:30.039
to do some version of it ourselves, Well, that would be really difficult.

474
00:38:30.079 --> 00:38:32.960
But you know, if in the
future, say Preact wants to do

475
00:38:34.000 --> 00:38:37.119
some version of this, then you
could do dot Preact dot js and they

476
00:38:37.159 --> 00:38:43.280
could have their own runic name space
inside their own code. So it's mostly

477
00:38:43.280 --> 00:38:47.360
out of kind of being trying to
be a good citizen, but also some

478
00:38:47.480 --> 00:38:57.360
obviously practical considerations of are you thinking
about maybe trying to standardize or even spect

479
00:38:57.400 --> 00:39:06.400
the run signature so different implementations might
be interoperable. We have not because we're

480
00:39:06.440 --> 00:39:10.840
still in this kind of exploratory phase
where we're figuring out what needs to be

481
00:39:10.880 --> 00:39:17.280
a room and what is potentially just
a function that you can import from the

482
00:39:17.320 --> 00:39:24.159
library. And I think it makes
sense to start with a working implementation and

483
00:39:24.239 --> 00:39:29.639
then see what happens in the wild, see if it makes sense to collaborate

484
00:39:29.639 --> 00:39:34.480
with other frameworks on something that is
a little bit more standards flavored. It's

485
00:39:34.519 --> 00:39:38.960
interesting that at the moment we're having
this conversation the day after the signals proposal

486
00:39:39.079 --> 00:39:44.320
was made public. So for the
last several months a team has been working

487
00:39:44.320 --> 00:39:49.800
across framework team has been working on
designing a signal primitive that will exist in

488
00:39:49.840 --> 00:39:55.360
the language itself, and that was
released yesterday. So it has a concept

489
00:39:55.440 --> 00:39:59.920
of there's analogist to our dollar state, and it has a concept that's analogist

490
00:39:59.920 --> 00:40:04.119
to hour dollar derived. And then
on top of those two things, you

491
00:40:04.159 --> 00:40:08.880
can build effects and all of these
other things. And the idea is that

492
00:40:09.239 --> 00:40:13.920
all of these different frameworks are doing
their own signal implementations. Wouldn't it be

493
00:40:13.960 --> 00:40:20.039
great if a there was interoperability between
the frameworks. You know, if I

494
00:40:20.119 --> 00:40:22.920
had a library that was emitting some
sort of signal, then it could be

495
00:40:22.000 --> 00:40:30.800
used in all of these frameworks.
And b potentially these frameworks could get rid

496
00:40:30.840 --> 00:40:34.400
of some of their own runtime code
in favor of just using the platform.

497
00:40:35.760 --> 00:40:38.440
And so there's these two things.
Does the mechanics of signals themselves and having

498
00:40:38.519 --> 00:40:44.119
that primitive in the language, and
then there's the like how do you reference

499
00:40:44.159 --> 00:40:49.199
them in your code? And what
we're focusing on is like this idea that

500
00:40:50.840 --> 00:40:54.079
that signals should be essentially a part
of the language, not just a primitive

501
00:40:54.119 --> 00:40:58.440
that you interact with like any other
object. It's a part of the language

502
00:40:58.519 --> 00:41:01.679
because reactivity is so fun mental to
the task of describing a user interface that

503
00:41:01.760 --> 00:41:06.920
it deserves to be a language level
concept, and so that those two things,

504
00:41:07.000 --> 00:41:12.960
I think are like separate but parallel
conversations that are worth having. So

505
00:41:13.519 --> 00:41:16.519
you keep saying, like the language
and the platform, right, And I

506
00:41:16.559 --> 00:41:21.920
think when I talk to people about
Spelt usually they're just kind of referring to

507
00:41:21.960 --> 00:41:25.360
it as a framework. Can you
kind of explain the different concepts here,

508
00:41:27.880 --> 00:41:31.880
Yeah, it's difficult because Spelt sort
of spans a lot of different categories and

509
00:41:31.960 --> 00:41:37.840
it's not it's not a traditional UI
library, and in the manner of what

510
00:41:37.960 --> 00:41:43.800
came before, it is a compiler, but it is also a language.

511
00:41:43.800 --> 00:41:46.880
It's a super set of HTML.
Compiler takes that language and it compiles it

512
00:41:46.920 --> 00:41:53.960
down to JavaScript. That JavaScript imports
code from the Spelt runtime library. That's

513
00:41:54.000 --> 00:41:59.320
how it it, you know,
does it's, it's it's updating, and

514
00:41:59.360 --> 00:42:02.440
it's it's rendering and everything. And
then on top of that, we have

515
00:42:02.480 --> 00:42:07.159
an application framework called spelt Kit.
And the boundaries of all of these things

516
00:42:07.159 --> 00:42:09.840
are a little bit fuzzy. When
I talk about the language, what I

517
00:42:09.960 --> 00:42:16.960
essentially mean is in the same way
that you have things in the language like

518
00:42:17.039 --> 00:42:22.199
dynamic import looks like a function,
but it's not a function. Wouldn't it

519
00:42:22.239 --> 00:42:28.119
be great if there was something akin
to that that described reactive values and that's

520
00:42:28.159 --> 00:42:32.960
what we're trying to do with runs. Okay, the other question I have

521
00:42:34.119 --> 00:42:39.159
is it seems like a lot of
this is focused around sort of developer ergonomics

522
00:42:39.199 --> 00:42:45.400
and you know, a good developer
experience. And I guess you probably won't

523
00:42:45.440 --> 00:42:50.920
know completely the answer to this question, but when people are talking about web

524
00:42:50.960 --> 00:42:55.800
applications, they're also then talking about
performance and you know how well it works

525
00:42:55.840 --> 00:43:00.320
in scales and things like that.
You know, can I have you know,

526
00:43:00.679 --> 00:43:06.280
fifteen signals or eighty signals or two
million signals? You know, how

527
00:43:06.360 --> 00:43:09.880
do the ruins play into all of
this as far as you know the capabilities

528
00:43:09.880 --> 00:43:15.280
of the application, but also you
know how it's going to perform if I

529
00:43:15.360 --> 00:43:22.079
go and build out some application on
it. The performance, honestly is breathtaking.

530
00:43:22.039 --> 00:43:25.440
There is a framework that's very widely
recognize, the JASS Framework Benchmark,

531
00:43:25.480 --> 00:43:32.079
which is a really good sanity check
for how well your framework does, and

532
00:43:34.639 --> 00:43:38.440
it fluctuates a little bit as we
add and remove things. But spelt is

533
00:43:39.679 --> 00:43:45.079
it's basically the fast Felt five is
basically the fastest mainstream framework. There's like

534
00:43:45.239 --> 00:43:49.679
a couple of other like very small
ones that are very very focused on on

535
00:43:49.920 --> 00:43:52.840
the sorts of tasks that this benchmark
tests for. But you know, SPELL

536
00:43:52.920 --> 00:43:58.239
five, it looks like it's probably
going to be a little faster than Solid,

537
00:43:58.239 --> 00:44:00.920
which is sort of the gold standard
for this thing. Okay, and

538
00:44:00.960 --> 00:44:07.000
you know publicism is that sorry go
ahead, no, and oh go on,

539
00:44:07.159 --> 00:44:08.880
you were saying, part of the
reason for that, I'm really interested.

540
00:44:10.079 --> 00:44:15.679
Well, again, because we're a
compiler, we have luxuries that other

541
00:44:15.760 --> 00:44:19.159
frameworks don't. So you know,
for example, in Solid, if you

542
00:44:19.239 --> 00:44:23.440
create a signal and a function that
updates that signal, you're creating a pair

543
00:44:23.480 --> 00:44:30.960
of closures, and closures aren't expensive, but they're also not free. And

544
00:44:30.039 --> 00:44:36.719
Spell when you create a source signal, it's just a very simple object.

545
00:44:36.840 --> 00:44:39.280
And when you read that signal,
and when you write that signal, you're

546
00:44:39.400 --> 00:44:45.320
using these get and set functions which
are shared by all of these sources.

547
00:44:45.679 --> 00:44:52.519
So that's just like one small example
of how having the ability to transform your

548
00:44:52.719 --> 00:44:59.480
code allows us to use a slightly
more efficient way of reading and writing state

549
00:44:59.599 --> 00:45:04.960
without any ergonomic compromises. You know
what this kind of reminds me of.

550
00:45:05.320 --> 00:45:10.800
I'm old enough to remember compilers for
languages like C and C plus plus,

551
00:45:12.440 --> 00:45:16.679
and back in the day we are
usually for these compilers we had a developer

552
00:45:16.719 --> 00:45:23.960
mode and release mode, where in
the developer mode it optimized for compilation time,

553
00:45:24.599 --> 00:45:30.519
whereas in you know, release mode
or production mode, it optimized for

554
00:45:30.800 --> 00:45:37.000
execution time, so it would run
the compiler much longer, but generate much

555
00:45:37.000 --> 00:45:42.159
more optimized code. And I'm starting
to think that that might start being relevant

556
00:45:42.920 --> 00:45:45.800
for you know, some of the
stuff that you're doing that maybe during development

557
00:45:45.960 --> 00:45:52.320
you might you know, be willing
to generate less optimal code but just compile

558
00:45:52.360 --> 00:45:55.880
as quickly as possible so that the
development environment would be nice and friendly.

559
00:45:57.440 --> 00:46:02.079
But then you know, in a
release mode you could theoretically like do really

560
00:46:02.159 --> 00:46:08.480
significant compilation, maybe even looking across
components and stuff like that one hundred percent

561
00:46:08.480 --> 00:46:13.519
of the case. So we already
do a lot of developer time checks.

562
00:46:15.039 --> 00:46:17.360
So earlier I talked about the ownership
validation, you know, the mutates state

563
00:46:17.400 --> 00:46:21.320
owned by A then spelt will yell
at you, well, we actually only

564
00:46:21.360 --> 00:46:24.119
do that in development, because in
production that's just overhead which no one is

565
00:46:24.880 --> 00:46:30.119
really going to benefit from. And
so there are certainly cases where we do

566
00:46:30.159 --> 00:46:34.639
the slightly slow but more helpful thing
in development mode. But the kinds of

567
00:46:34.639 --> 00:46:39.360
things that you're talking about, like
cross component analysis is very much where we

568
00:46:39.400 --> 00:46:45.000
want to take a lot of these
ideas. We actually had some experimentation early

569
00:46:45.039 --> 00:46:49.480
on Dominic. It had like a
whole trench of work that was looking at

570
00:46:49.599 --> 00:46:53.599
this exact thing, but it was
difficult to keep up to date with the

571
00:46:53.599 --> 00:46:58.199
rest of the framework when it was
all so very much in flux. But

572
00:46:58.280 --> 00:47:02.239
that is something that we're at the
bit to revisit once Spelt five goes stable.

573
00:47:02.519 --> 00:47:07.679
We think there's huge upside here.
Yeah. Well, premature optimization is

574
00:47:07.679 --> 00:47:15.760
the root of all evil, you
know, son he is. So it's

575
00:47:15.880 --> 00:47:20.679
interesting though again I kind of mentioned
it before, but you know, so

576
00:47:20.760 --> 00:47:27.039
obviously you were probably maybe I wouldn't
say that you were necessarily the first framework

577
00:47:27.119 --> 00:47:31.000
to use a compiler. I wouldn't
be surprised if that's Marco, because Marco

578
00:47:31.119 --> 00:47:36.679
is at first that everything turns out. But you were certainly, I think,

579
00:47:36.719 --> 00:47:40.760
the first one to really promote it
in popularize it. But now it

580
00:47:40.880 --> 00:47:45.920
seems like, as I said before, that all frameworks are kind of to

581
00:47:45.960 --> 00:47:53.960
a lesser greater degree embracing compilers.
Even React with React forget is embracing compilers.

582
00:47:54.320 --> 00:48:00.840
So how do you see the different
compiler the different approaches in this context,

583
00:48:00.920 --> 00:48:07.840
or all of the frameworks effectively converging
on the same place. It's a

584
00:48:07.840 --> 00:48:10.519
great question. There's definitely been a
lot of convergence just in general in the

585
00:48:10.559 --> 00:48:15.760
space over the last few years.
And what I think tends to happen is

586
00:48:15.760 --> 00:48:19.440
there's there's sort of compression as everyone
converged on the same ideas, followed by

587
00:48:19.480 --> 00:48:22.480
a period of innovation in which people
sort of go off. And you know

588
00:48:22.519 --> 00:48:27.400
now that we've centralized on a course
set of ideas, like how do we

589
00:48:27.440 --> 00:48:32.039
differentiate ourselves from one another? And
I think we're probably entering into that period

590
00:48:32.599 --> 00:48:38.840
right now when we start to see, you know what, what our different

591
00:48:38.880 --> 00:48:45.840
foundations allow us to do differently,
and for us, the kinds of things

592
00:48:45.880 --> 00:48:52.280
that we're thinking about are you know, as everyone else is thinking about a

593
00:48:52.320 --> 00:48:55.719
server first mentality, like everyone is
sort of retreating from client side javascripts in

594
00:48:55.800 --> 00:49:00.440
general, we're thinking, well,
you know a lot of people still want

595
00:49:00.440 --> 00:49:05.800
to build these richly interactive client side
applications, and yes, it's very essential

596
00:49:05.840 --> 00:49:09.920
that you have really tight integration with
a back end, like, no one's

597
00:49:09.960 --> 00:49:15.639
disputing the importance of progressive enhancement and
service sign rendering and all of these other

598
00:49:15.679 --> 00:49:19.760
things. But at the same time, are we forgetting that there is a

599
00:49:19.840 --> 00:49:25.559
place for local first thinking and for
you know, on device computation thinking and

600
00:49:25.599 --> 00:49:30.159
all of these other things that some
frameworks candidly are starting to deprioritize in a

601
00:49:30.159 --> 00:49:35.599
way that worries me a little bit. So no spelled server components in the

602
00:49:35.639 --> 00:49:43.400
near future. We do not have
a plan right now to make spelt server

603
00:49:43.480 --> 00:49:52.400
components. So rsses are obviously this
fascinating, brilliant idea, and they've sort

604
00:49:52.440 --> 00:49:55.239
of shaken up how everyone thinks about
a lot of things. Yet again,

605
00:49:55.360 --> 00:49:59.239
because you know, this is what
the reacting does, they'll sort of sit

606
00:49:59.320 --> 00:50:04.079
quietly three years and then just blow
everyone's minds with some new radical innovation.

607
00:50:04.960 --> 00:50:08.440
But to my mind, there are
the good parts of reacts server components,

608
00:50:08.480 --> 00:50:14.000
and there are the bad parts of
React server components. And I think a

609
00:50:14.000 --> 00:50:19.480
lot of the proponents of r scs
would probably say that the good parts are

610
00:50:19.480 --> 00:50:22.840
different, But in my experience,
just seeing people struggle with the concept,

611
00:50:23.320 --> 00:50:27.880
I would say the good parts of
reacts over components are the ability to do

612
00:50:27.920 --> 00:50:30.760
asynchronous data loading. You know,
the fact that you can have acyn components

613
00:50:30.880 --> 00:50:36.360
and that just sort of works is
very cool. But the bad parts are

614
00:50:36.440 --> 00:50:39.760
the idea that you have these these
two separate things running in two separate environments

615
00:50:39.760 --> 00:50:45.000
and the ways that you can combine
them the subject to certain constraints, and

616
00:50:45.119 --> 00:50:46.400
like the things that you can use
in one environment that you can't use in

617
00:50:46.440 --> 00:50:51.400
another environment is like super hard for
a lot of people who don't do this

618
00:50:51.559 --> 00:50:53.480
day and day out all the time
to get their heads around. And so,

619
00:50:53.599 --> 00:50:57.039
you know, the kinds of things
that we're thinking about are can we

620
00:50:57.199 --> 00:51:02.880
have the benefits of this asynchronic state
loading approach, Like can we have a

621
00:51:02.920 --> 00:51:09.119
weight in components in a way that
is really orchestrable and and and and and

622
00:51:09.199 --> 00:51:16.199
makes sense from the point of hydration
throughout the application life cycle without any of

623
00:51:16.559 --> 00:51:23.079
those sort of offering drawbacks and the
confusion that arises from having these two worlds

624
00:51:23.119 --> 00:51:28.079
sort of interleaved like that. And
you know, we we have some we

625
00:51:28.119 --> 00:51:30.679
have some ideas, but a lot
of it is unfortunately going to have to

626
00:51:30.719 --> 00:51:35.519
wait until after we ship spelt five
point oh, because otherwise otherwise we'll never

627
00:51:35.519 --> 00:51:39.199
ships spelt five point zero, so
no so for speled five point zher no

628
00:51:39.400 --> 00:51:47.239
innovations associated with hydration. Uh So, our our approach to hydration is it's

629
00:51:47.440 --> 00:51:54.400
pretty efficient. It's it's certainly faster
than it was in spelt for because we

630
00:51:54.480 --> 00:52:01.159
have decided that it's acceptable to assume
the structure of your application on the client

631
00:52:01.199 --> 00:52:05.880
side is the same as it was
on the service side, like you're rendering

632
00:52:05.920 --> 00:52:10.760
the same components, and so as
soon as you have that constraint as part

633
00:52:10.800 --> 00:52:14.880
of your model, you can make
your hydration a lot faster than if you

634
00:52:15.119 --> 00:52:21.760
try to like gracefully repair every piece
of slightly mouthformed done that you encounter.

635
00:52:22.840 --> 00:52:27.159
So right out of the gate,
hydration is really fast and spelt five.

636
00:52:28.119 --> 00:52:30.679
Because we're a compiler, we're able
to do things that might be a little

637
00:52:30.719 --> 00:52:34.719
bit trickier if you're using say JSX, we can do you know, if

638
00:52:34.719 --> 00:52:38.280
you have I don't know, and
if browser block and then you have some

639
00:52:38.440 --> 00:52:42.360
code in there, and then in
the else bit you have some other code.

640
00:52:43.800 --> 00:52:45.079
A lot of hydration algorithms will choke
on that. They'll be like,

641
00:52:45.159 --> 00:52:49.559
hey, we've got a mismatch here. We might need to throw away some

642
00:52:49.639 --> 00:52:52.159
work and start again. Well,
Spelt handles that just fine because the compiler

643
00:52:52.199 --> 00:52:55.519
can can just drop in a little
annotation that the run time then knows how

644
00:52:55.559 --> 00:53:00.280
to deal with. So I wouldn't
say there are a hug genovations around hydration.

645
00:53:00.559 --> 00:53:05.519
But it's fast, and it's reliable, and it's it's flexible, it's

646
00:53:05.880 --> 00:53:09.239
robust to things changing between the server
render and the client render. Yeah,

647
00:53:09.239 --> 00:53:17.320
but you're not trying to avoid let's
say, sending down certain code. You're

648
00:53:17.360 --> 00:53:23.239
basically just saying my code is smaller
because it's it's generated by compiler. But

649
00:53:23.400 --> 00:53:30.039
I'm going to download the code for
for components for client for components because they

650
00:53:30.119 --> 00:53:32.920
might be re rendered on the client. Yeah, because it's a waste of

651
00:53:34.000 --> 00:53:37.880
time. Honestly, there's I know
a lot of focus is paid to the

652
00:53:37.920 --> 00:53:43.719
cost of hydrating and application, and
that is not where the problem is.

653
00:53:43.719 --> 00:53:51.280
That is not why the performance of
websites is sometimes not great. I mean,

654
00:53:51.320 --> 00:53:52.679
it might be if you have like
a really slow framework that is slow

655
00:53:52.719 --> 00:54:00.760
to hydrate, but generally speaking,
the problems lie elsewhere. And so I

656
00:54:00.800 --> 00:54:05.559
know that there are some frameworks whose
whole deal is avoiding hydration cost quick but

657
00:54:06.239 --> 00:54:08.079
I was going to say, you
should talk to me because he tells a

658
00:54:08.119 --> 00:54:13.079
little bit different story. Yeah,
I mean, of course he does,

659
00:54:13.119 --> 00:54:17.039
because that's like, that's why that
framework exists. But you know, every

660
00:54:17.079 --> 00:54:22.199
time we profile SPELT sites that we
see in the wild, the problems are

661
00:54:22.239 --> 00:54:25.519
things like, well, they've disabled
SSR, so they have a waterfall and

662
00:54:25.519 --> 00:54:30.559
they disabled SSR because of some business
requirement, or it's because they've got big

663
00:54:30.599 --> 00:54:34.639
images and we didn't do a good
enough job of providing them with the tools

664
00:54:34.679 --> 00:54:38.800
to make sure that images are tightly
optimized. It's pretty rare. The hydration

665
00:54:39.199 --> 00:54:45.320
moves the needle in our experience,
and so our position is make it as

666
00:54:45.360 --> 00:54:50.639
fast as possible. If there are
opportunities to skip hydration in some cases,

667
00:54:50.719 --> 00:54:53.119
then take them. And there are
some places where we do that in Spelt

668
00:54:53.159 --> 00:54:57.119
five, like if we have a
big blob of HML from a markdown post

669
00:54:57.199 --> 00:55:00.719
or something like that. Just assume
that it was the same between Severn client

670
00:55:00.760 --> 00:55:05.039
render. But by and large,
I don't worry about it. It's not

671
00:55:05.079 --> 00:55:07.960
where the problems lie. You were
also, as I recall, one of

672
00:55:08.000 --> 00:55:14.480
the first frameworks, if not the
first, to introduce the concept of progressive

673
00:55:14.840 --> 00:55:21.519
enhancement as related to hydration or am
I mistaken? So I mean we've been

674
00:55:21.559 --> 00:55:27.079
on the progressive enhancement bandwagon for some
time now. I think the first release

675
00:55:27.199 --> 00:55:31.000
of spelt Kit's predecessor, SAPA was
in twenty seventeen and the twenty seventeen and

676
00:55:31.559 --> 00:55:36.360
you know, we launched with service
side rendering, but I wouldn't say that

677
00:55:36.400 --> 00:55:40.559
we were the first people to do
that. We were essentially copying Next and

678
00:55:40.760 --> 00:55:46.119
Next and even they were copying other
prior up Remix was maybe one of the

679
00:55:46.159 --> 00:55:52.280
first. No No Remix was actually
pretty late to the game. Oh yeah,

680
00:55:52.440 --> 00:55:55.480
because it was a big thing with
Remix, as I recall, like

681
00:55:55.599 --> 00:56:01.239
their first demo where they showed everything
effectively running to police server side without anybody

682
00:56:01.320 --> 00:56:06.840
noticing, or something along these lines. Maybe it's worthwhile to quickly explain,

683
00:56:07.000 --> 00:56:09.760
like this is not the point of
this podcast, but maybe it's worthwhile to

684
00:56:09.800 --> 00:56:15.559
really quickly explain what progressive enhancement means
in this context. Yeah, I mean,

685
00:56:15.559 --> 00:56:19.239
it's possible that we're even talking slightly
past each other by using it to

686
00:56:19.320 --> 00:56:22.960
mean different things. But essentially the
idea of progressive enhancement is or take the

687
00:56:22.960 --> 00:56:30.719
analogy of an escalator when it's running. When the electricity is on the escalator,

688
00:56:30.760 --> 00:56:32.519
you stand on it and it takes
you to the top or it takes

689
00:56:32.519 --> 00:56:37.719
to the bottom. But if the
electricity fails, or if there's a mechanical

690
00:56:37.719 --> 00:56:42.599
failure or something, it becomes a
staircase and you can still use it.

691
00:56:43.320 --> 00:56:47.440
So we say, yeah, so
the escalator is progressively enhanced from a staircase.

692
00:56:47.440 --> 00:56:52.079
You can still use it, but
it's just nicer if you have the

693
00:56:52.119 --> 00:56:55.679
things running as as you're using them. And in the context of a website,

694
00:56:55.719 --> 00:57:01.599
what that means is that if you
have a page that doesn't have JavaScript

695
00:57:01.679 --> 00:57:06.920
for whatever reason, maybe you're on
the subway and the JavaScript failed to load

696
00:57:06.960 --> 00:57:12.000
before you lost connectivity, or maybe
you're on a browser that doesn't support some

697
00:57:12.079 --> 00:57:15.480
new JavaScript feature that is being used
by that website, or one of the

698
00:57:15.920 --> 00:57:20.760
hundred possible reasons why someone might not
be running JavaScript, that website should continue

699
00:57:20.760 --> 00:57:23.719
to work. And that means that
links should still take you to their destination.

700
00:57:23.880 --> 00:57:27.239
It means that you should still be
able to interact with form elements.

701
00:57:27.320 --> 00:57:30.519
It means that you should be able
to submit a form and send data back

702
00:57:30.519 --> 00:57:36.000
to the server. And it's that
latter part where Remix added some innovation.

703
00:57:37.360 --> 00:57:43.320
They really prioritized form submissions in a
way that other frameworks had kind of said,

704
00:57:43.880 --> 00:57:47.119
you know, this is a problem
that is solvable in Newserland, whereas

705
00:57:47.199 --> 00:57:51.079
Remix said, no, no,
we're going to make this like a core

706
00:57:51.119 --> 00:57:53.280
part of the framework's offering. And
that was a very welcome change. Like

707
00:57:53.480 --> 00:58:00.039
other frameworks certainly sat up and took
notice and started doing the same thing progressive

708
00:58:00.079 --> 00:58:04.679
enhancement. More broadly, this idea
that if you have a website it should

709
00:58:04.719 --> 00:58:09.280
work without jobs is something that I
think frameworks have been prioritizing for many,

710
00:58:09.280 --> 00:58:15.960
many years at this point. Oh
and there was one more thing I wanted

711
00:58:15.960 --> 00:58:21.440
to ask. Oh yeah, one
of my last questions. A lot of

712
00:58:21.480 --> 00:58:24.679
frameworks, it seems to me,
are kind of embracing in certain ways in

713
00:58:24.800 --> 00:58:31.280
very different ways. Concept of RPC
as a means of communicating between the front

714
00:58:31.320 --> 00:58:36.039
and the back end. Now this
is more a meta framework question than a

715
00:58:36.079 --> 00:58:40.920
framework question, but basically it means
that you invoke code on the server side

716
00:58:40.960 --> 00:58:45.599
in a way that's kind of that
looks semantically like calling a function. Is

717
00:58:45.639 --> 00:58:51.360
that something that you're also looking at, or thinking about or considering. I

718
00:58:51.360 --> 00:58:58.400
have some real qualms about RPC as
it's being implemented by by frameworks today.

719
00:58:59.239 --> 00:59:04.159
I think there is a real value
and at least having to switch between different

720
00:59:04.199 --> 00:59:08.440
files if you're crossing a network boundary. There are too many ways in which

721
00:59:08.599 --> 00:59:13.039
it can go wrong. If you
have some code that access a database directly

722
00:59:13.119 --> 00:59:16.400
and you just put that inside some
code that is running on the front end,

723
00:59:16.800 --> 00:59:20.599
then even though the compiler is going
to get rid of it, you

724
00:59:20.639 --> 00:59:25.599
know there is a non zero chance
that you are going to have some sensitive

725
00:59:25.639 --> 00:59:32.159
information in a source map or something
like that. And in general, any

726
00:59:32.239 --> 00:59:37.800
type safety that you get across the
network boundary is fictional, and I don't

727
00:59:37.840 --> 00:59:43.400
think that these RPC systems give you
as much type safety as they as they

728
00:59:43.440 --> 00:59:49.480
purport to. So all typescript type
safety is effectively fictional because it's all it

729
00:59:49.559 --> 00:59:52.960
never happens at rue time, and
so in a lot of ways it's no

730
00:59:53.119 --> 01:00:00.400
different than whatever other type safety you
get from typescript. But it's really funny

731
01:00:00.400 --> 01:00:05.239
because we actually had Sam Salukov on
one of the episodes talking exactly about the

732
01:00:05.320 --> 01:00:10.000
scenario just described, because he's the
one that did that presentation with a slide

733
01:00:10.000 --> 01:00:16.199
that became a meme about the terrific
presentation. Yes, it was embedding some

734
01:00:16.440 --> 01:00:22.360
SQL in line inside the React component, which was yeah, a lot of

735
01:00:22.440 --> 01:00:30.400
people didn't like that. Yes,
a lot of people were on one of

736
01:00:30.480 --> 01:00:34.159
two sides of that screenshot. There
were the people who were like, oh

737
01:00:34.199 --> 01:00:37.559
my god, this is a giant
security hold because they didn't understand that the

738
01:00:37.599 --> 01:00:42.760
sequel in that screen shop was being
escaped by the library. And then there

739
01:00:42.760 --> 01:00:45.400
were all of these other people on
the other side of the spectrum being you

740
01:00:45.519 --> 01:00:49.199
idiots, it's being escaped, there's
no problem here. But the reality is,

741
01:00:49.559 --> 01:00:52.559
yes, that code was being escaped, but it would be so easy

742
01:00:52.599 --> 01:00:57.559
for someone to write a sequel querid
that was not being escaped, and by

743
01:00:57.639 --> 01:01:02.280
creating these arbitrary mini end points throughout
your application and just like exposing this massive

744
01:01:02.320 --> 01:01:08.599
surface area to you know, to
would be evildoers. I think there is

745
01:01:10.000 --> 01:01:15.679
you know, there are some security
questions that arise from this way of thinking

746
01:01:15.719 --> 01:01:19.079
about things, and like, look, smart people are thinking about all of

747
01:01:19.119 --> 01:01:22.000
these things, and I don't expect
that we're about to experience, you know,

748
01:01:22.320 --> 01:01:30.039
a security apocalypse of RPC causing like
all manner of new attacks. But

749
01:01:30.440 --> 01:01:36.320
I do think that just at a
conceptual level, as you're writing the code,

750
01:01:36.719 --> 01:01:40.400
it's much easier to understand what's happening
if there is a just a tiny

751
01:01:40.400 --> 01:01:45.440
bit of friction between what's happening in
the client side and what's happening on the

752
01:01:45.440 --> 01:01:49.519
server side. And for me,
like a file boundary is a good place

753
01:01:49.519 --> 01:01:54.440
to express that distinction. In the
context of a VT application and spelt get

754
01:01:54.440 --> 01:01:59.840
applications of VAT applications, you can
use something like telefunk, which will allow

755
01:01:59.880 --> 01:02:07.960
you to do our PC by importing
quote unquote a function from a service side

756
01:02:07.039 --> 01:02:15.920
module and in the client that is
essentially, you know, an RPC interface

757
01:02:15.400 --> 01:02:20.400
which allows you to call that function
on and stuff, but it's not inside

758
01:02:20.599 --> 01:02:25.159
the same file that is running client
side. And this is you know,

759
01:02:25.199 --> 01:02:29.480
maybe a matter of preference. And
maybe I'm being overly paranoid about this sort

760
01:02:29.519 --> 01:02:36.760
of thing, but I think there's
too much Your scientists are so preoccupied with

761
01:02:36.840 --> 01:02:39.360
whether or not they could they didn't
think about whether or not they're not they

762
01:02:39.400 --> 01:02:45.800
should. Everyone's trying to be the
like the slickest and most convenient thing,

763
01:02:46.519 --> 01:02:51.880
and sometimes that's right. I mean, I s felt certainly tries to be

764
01:02:51.880 --> 01:02:54.880
slick and convenient in a lot of
places, but sometimes friction exists for a

765
01:02:54.960 --> 01:03:00.280
reason and we forget that at our
peril. So just final question on my

766
01:03:00.440 --> 01:03:07.639
part because you mentioned sveld Kit,
is sweld Kit staying the same in this

767
01:03:07.760 --> 01:03:10.599
release? I mean, the swelt
Kit that runs with Spelt five is effectively

768
01:03:10.599 --> 01:03:15.519
going to be essentially the same as
swelt Kit that's running with Swelled four.

769
01:03:15.760 --> 01:03:20.960
Is there some are there some changes
on that front as well? It's going

770
01:03:21.000 --> 01:03:24.639
to be exactly the same at release, I believe. I don't think we're

771
01:03:24.679 --> 01:03:29.559
going to introduce any new things that
you know, use the new state primitives

772
01:03:29.599 --> 01:03:31.760
for for example, straight away,
because everything is just going to continue to

773
01:03:31.800 --> 01:03:36.159
work. It should just be like
a Seams's upgrade. You can take your

774
01:03:36.159 --> 01:03:38.960
existing spelt Kit two app and upgrade
Spelt four to Spell five. Everything's going

775
01:03:39.039 --> 01:03:43.760
to be fine. That said,
once we do get Spelled five out the

776
01:03:43.800 --> 01:03:46.119
door, there are certain ways that
we're going to be able to capitalize on

777
01:03:46.159 --> 01:03:54.400
it within spelt Kit and longer term, I think we have some some ideas

778
01:03:54.480 --> 01:04:00.360
of where we want to take spelt
Kit that are going to be easier because

779
01:04:00.400 --> 01:04:03.679
Felt five exists. So do you
have do you have a date. I

780
01:04:03.719 --> 01:04:09.719
know people are wondering, Come on, Charles, don't do me like that.

781
01:04:10.159 --> 01:04:14.840
Oh somebody was going to ask it. Okay, let me ask a

782
01:04:14.840 --> 01:04:19.239
different way then. So I'm figuring
you have the roadmap pretty clear. It

783
01:04:19.280 --> 01:04:23.840
sounds like you know what you're putting
in, how this is going together.

784
01:04:23.920 --> 01:04:27.159
It looks like you've got a lot
of this kind of you know, bolted

785
01:04:27.199 --> 01:04:31.840
in. You know, are are
you still bolting pieces in? Are you

786
01:04:32.440 --> 01:04:35.960
polishing? Are you i mean,
where are you at? And the life

787
01:04:36.000 --> 01:04:40.519
cycle of releasing something like this.
So, in terms of the design of

788
01:04:40.559 --> 01:04:44.960
the framework, I think we're pretty
much done. There might still be one

789
01:04:45.000 --> 01:04:47.280
or two little API design questions that
needs to be resolved, but it's at

790
01:04:47.280 --> 01:04:51.320
this point it is mostly implementing the
things that we said we're going to implement

791
01:04:51.760 --> 01:04:57.320
and fixing bugs. I wouldn't say
that we're on the glide path yet,

792
01:04:57.639 --> 01:05:02.480
okay, but we are pretty close. I think we're going to have a

793
01:05:02.559 --> 01:05:08.039
release candidate in the not too distant
future and a stable release not too long

794
01:05:08.079 --> 01:05:12.679
after that. I'm just very hesitant
to commit to specific things because in the

795
01:05:12.719 --> 01:05:16.519
past, whenever I've done that,
people have got mad at me. Makes

796
01:05:16.559 --> 01:05:26.519
sense, It looks like from the
comments on YouTube that some folks have been

797
01:05:26.559 --> 01:05:31.679
able to try out Spelt five right, So whatever state it's in and then

798
01:05:31.719 --> 01:05:35.639
able to get you feedback. So
let's say that I'm thinking, oh,

799
01:05:35.679 --> 01:05:40.480
I want to try it out,
right, whether I'm an experienced Felt for

800
01:05:40.679 --> 01:05:43.320
developer, whether I'm just you know, I'm trying it out, and I'm

801
01:05:43.320 --> 01:05:46.159
like, I may as well just
try the cutting edge thing. Where do

802
01:05:46.239 --> 01:05:49.840
I go pick that up? And
how do I give you feedback? So

803
01:05:49.880 --> 01:05:55.119
the beach is available on MPM,
the NPM installs felt at next you will

804
01:05:55.159 --> 01:06:00.079
get the most indevelopment of version,
the most cussing edge stuff. If you

805
01:06:00.159 --> 01:06:02.599
have an existing spelt Kit app,
you can do that and hopefully things will

806
01:06:02.599 --> 01:06:05.159
continue to work. If you're creating
a new application and you want to try

807
01:06:05.199 --> 01:06:11.199
it out, then when you create
your spelt Kit application with MPM create Spelt,

808
01:06:12.039 --> 01:06:15.400
it will present you an option to
try out Spelt five and if you

809
01:06:15.480 --> 01:06:20.880
accept that, then you'll be opted
into the new stuff. If people have

810
01:06:20.920 --> 01:06:26.199
feedback, it is extremely welcome.
Come to get hub dot com, slash

811
01:06:26.199 --> 01:06:29.599
felt JS, slash spelt and there
is an issue track of there. When

812
01:06:29.639 --> 01:06:31.760
we are accepting issues and pull requests
for Spelt five. A lot of people

813
01:06:31.800 --> 01:06:36.920
have already contributed, and it's been
super helpful, really great to have like

814
01:06:36.960 --> 01:06:43.679
an enthusiastic community who will take this
very unfinished product and actually start putting it

815
01:06:43.719 --> 01:06:45.920
through its paces. It's helped us
find a lot of things that might have

816
01:06:45.960 --> 01:06:48.760
slipped under the radar otherwise. And
if you want to be one of those

817
01:06:48.760 --> 01:06:54.840
people, then please come on by. I have to say that I really

818
01:06:54.880 --> 01:07:00.719
admire how brave, very brave you
are in the scope of changes that you're

819
01:07:00.719 --> 01:07:04.360
making in this version. I mean, it's not totally not a trivial thing

820
01:07:04.840 --> 01:07:12.559
to take a framework that's already at
version five or approaching version five and literally

821
01:07:12.639 --> 01:07:15.880
turning it on its head in a
lot of ways. It's like it's a

822
01:07:15.920 --> 01:07:21.400
big gamble, and and I really
appreciate you for doing it well, thank

823
01:07:21.440 --> 01:07:27.199
you. And you know, it's
a testament to the spoke community that this

824
01:07:27.239 --> 01:07:32.119
has been met with by and large, a lot of excitement and enthusiasm and

825
01:07:32.920 --> 01:07:39.679
not too much grumbling and why did
you have to change it? You know,

826
01:07:39.679 --> 01:07:44.039
we have this really great community that
I'm very appreciative of, and they've

827
01:07:44.039 --> 01:07:49.599
been super encouraging and helpful throughout this
whole process. Yeah, I guess one

828
01:07:49.639 --> 01:07:53.360
other thing that I'm just curious about. Do you do you have some idea

829
01:07:53.480 --> 01:07:59.800
how large the community is out there
using spell Let me see the I guess

830
01:07:59.840 --> 01:08:04.920
the best proxy acting give for that
is, let's see how many people are

831
01:08:04.920 --> 01:08:11.519
in our discord server right now?
I think solo dev slash chat. So

832
01:08:11.559 --> 01:08:15.199
there's eight and forty five members online
in our discord right now. I have

833
01:08:15.600 --> 01:08:20.720
sixty five, one hundred and four
members. So it is, you know,

834
01:08:21.039 --> 01:08:24.760
next to React and View and Angler
and these other things, we are

835
01:08:25.000 --> 01:08:30.279
ten hands product projects. But that's
not a small number of people. No,

836
01:08:30.399 --> 01:08:33.520
I'm not exactly sure by the way. I mean, obviously React is

837
01:08:33.840 --> 01:08:40.640
the biggest and and it's effectively as
big as all the other frameworks put together.

838
01:08:41.600 --> 01:08:47.600
But once you go beyond React,
the order is not as as trivial

839
01:08:47.640 --> 01:08:53.199
as you might expect. From what
I've seen. I've been kind of using

840
01:08:53.760 --> 01:08:59.600
the Crux, the Google Crux database
as a reference. Now, obviously,

841
01:09:00.199 --> 01:09:03.520
you know, it only shows a
certain subset, you know, effectively just

842
01:09:03.840 --> 01:09:11.479
sites that certain sites at Google ranks. But it's better than nothing. And

843
01:09:10.319 --> 01:09:14.760
uh, and then I'll try to
look up to see what the current situation

844
01:09:15.079 --> 01:09:18.520
is, but I'm not sure it's
it's quite as linear as as you might

845
01:09:18.600 --> 01:09:23.960
think. That's you know, that's
what I'm thinking. Well, we're growing,

846
01:09:24.079 --> 01:09:30.039
but you know it's it's mostly upside
as far as we're consented. Awesome.

847
01:09:30.119 --> 01:09:33.960
Well, I'm gonna go ahead and
slide us into the wrap up of

848
01:09:34.000 --> 01:09:39.520
the show. Rich, you kind
of talked about people giving your feedback,

849
01:09:39.520 --> 01:09:43.520
but if they want to follow you
or see what you're working on, or

850
01:09:43.560 --> 01:09:47.000
connect in some way, where do
people find you on the internet? For

851
01:09:47.119 --> 01:09:53.239
my sins, I still hang out
on twister dot com, slash rich underscore

852
01:09:53.279 --> 01:10:00.279
Harris H Yeah, I guess that's
where I do most of my opinion thing.

853
01:10:00.960 --> 01:10:06.800
But most of my time is Spelt
is spent on getthub. So it

854
01:10:06.800 --> 01:10:13.279
comes to the Spelt organization on GitHub
and and joined the join the threads there,

855
01:10:14.279 --> 01:10:17.760
and I thought discortical spelt dev slash
chat. Yeah, that seems like

856
01:10:17.800 --> 01:10:21.760
an awesome thing. I just joined
the discord. Sorry, I love Discord.

857
01:10:23.520 --> 01:10:26.399
All right, Well, let's go
ahead and do some picks, Steve,

858
01:10:26.439 --> 01:10:28.760
do you want to start us off
with the picks? All right,

859
01:10:28.800 --> 01:10:30.039
so you want to get to the
high point of the episode, first,

860
01:10:30.079 --> 01:10:36.079
I get that, I get that
speak early, right, So I didn't

861
01:10:36.119 --> 01:10:41.119
really have any other picks here other
than the dad jokes of the week,

862
01:10:41.159 --> 01:10:43.840
which are the high point. Rich. I'm not sure if you're aware of

863
01:10:43.880 --> 01:10:51.720
this, but anyway, uh So, recently I found this diet diary that

864
01:10:51.800 --> 01:10:55.119
I was keeping when I was losing
weight, and it says day one,

865
01:10:55.600 --> 01:10:59.000
I removed all of the fattening food
from the house. It was delicious.

866
01:11:04.239 --> 01:11:08.439
Side note, I found another diary
I kept when I was first born and

867
01:11:08.479 --> 01:11:11.960
said day one, still recovering from
the move. In day two, everybody

868
01:11:11.960 --> 01:11:16.680
talks to me like an idiot.
I borrowed that one from Stephen Wright.

869
01:11:18.279 --> 01:11:23.680
Continuing along with the food theme,
a lot of French words have actually crept

870
01:11:23.680 --> 01:11:29.359
into the English language over the years, or durs for starters, right,

871
01:11:30.000 --> 01:11:35.199
and then you know, I've never
really had pets because I'm just not good

872
01:11:35.199 --> 01:11:39.359
with pets. For instance, once
I had a fish that could break dance,

873
01:11:39.840 --> 01:11:48.119
but only for twenty seconds and only
once. Those are my picks of

874
01:11:48.119 --> 01:11:54.800
the week, all right, Dan, what are your picks? Okay?

875
01:11:54.920 --> 01:12:01.479
So we saw this movie on Netflix
which I well, I really enjoyed,

876
01:12:02.920 --> 01:12:10.720
which is called I Care a Lot
It's described as an American satirical black comedy

877
01:12:10.760 --> 01:12:15.239
thriller film. It's with Rosamund Pike
and Peter Dinklage, and like I said,

878
01:12:15.279 --> 01:12:23.199
we really enjoyed it. It's kind
of gritty, dark comedy and it

879
01:12:23.239 --> 01:12:28.439
has a certain message. So yeah, I recommend that. And the other

880
01:12:28.560 --> 01:12:33.680
thing is we've kind of been clearing
out our library at home, Like we've

881
01:12:33.680 --> 01:12:36.720
got, like our library got to
the point where we had three or four

882
01:12:36.800 --> 01:12:43.159
rows of books, so we thought
that we needed to make some space.

883
01:12:44.039 --> 01:12:50.600
And I've been looking through my collection
of science fiction and fantasy books and trying

884
01:12:50.640 --> 01:12:55.520
to see which ones I like to
keep and which one I toss away,

885
01:12:56.119 --> 01:13:00.239
and some of the ones that I've
decided to keep, I'm kind of reviewing

886
01:13:00.359 --> 01:13:05.920
or rereading and thinking about also maybe
recommending for our listeners. So an interesting

887
01:13:06.039 --> 01:13:11.319
series that I recall enjoying very very
much when I read them, so I'm

888
01:13:11.359 --> 01:13:15.720
now going to reread them and see
if I still enjoy them is a series

889
01:13:15.760 --> 01:13:19.680
of books by a woman author.
Her name is Julian May. It's called

890
01:13:20.000 --> 01:13:28.439
Saga of Leosen Exile. It's kind
of a cross between science fiction and fantasy

891
01:13:28.520 --> 01:13:32.039
in the sense that everything is kind
of described in a sciencey sort of a

892
01:13:32.079 --> 01:13:40.199
way, but the settings is actually
more similar to a fantasy series. Now,

893
01:13:40.760 --> 01:13:46.319
I will make a certain caveat in
some reviews have stated that it has

894
01:13:46.680 --> 01:13:53.399
transformed some transphobic views in it,
So if you might find that triggering,

895
01:13:53.600 --> 01:13:57.520
maybe this is not for you.
I'm not sure that's the case or not,

896
01:13:57.680 --> 01:14:00.199
because as I said, it's been
a really long time since I've read

897
01:14:00.239 --> 01:14:03.640
it, so now I'll reread it
again and see if that's indeed the case.

898
01:14:05.600 --> 01:14:10.279
But so that that would be a
series of books that I reco that

899
01:14:10.359 --> 01:14:15.920
I'll recommend based on my recollection of
it being just an excellent series of books

900
01:14:15.920 --> 01:14:19.560
that I enjoyed reading like a few
decades ago, and those would be my

901
01:14:19.640 --> 01:14:26.800
picks for today. Awesome. I'm
going to jump in with some picks here.

902
01:14:27.359 --> 01:14:31.600
And I probably picked this board game
in the past, but we were

903
01:14:31.680 --> 01:14:35.000
playing it and my eight year old
wanted to play games, and so we

904
01:14:35.159 --> 01:14:40.479
pulled out some of the board games, but she wanted to play an adult

905
01:14:40.560 --> 01:14:45.640
game, and so you know,
we were pulling out off the kiddie games

906
01:14:45.760 --> 01:14:49.760
right right. And you know,
for those of you who haven't listened for

907
01:14:49.800 --> 01:14:54.640
a while, are new I pick
a board game every week, so this

908
01:14:54.680 --> 01:14:57.680
one is actually a card game,
not a board game. This week it's

909
01:14:57.680 --> 01:15:01.359
Sushi Go Party, and it does
have a little board, but it's just

910
01:15:01.439 --> 01:15:08.039
kind of for keeping track of your
points, and you have the different sushi

911
01:15:08.159 --> 01:15:11.920
options, right, or sometimes you
have other things like a spoon or chopsticks

912
01:15:12.000 --> 01:15:15.239
or something, and so what you
do is it's a drafting game. So

913
01:15:15.319 --> 01:15:17.239
you have the cards in your hand. You keep one and you put it

914
01:15:17.239 --> 01:15:21.079
down face down, You pass the
left, and then you reveal your card,

915
01:15:21.079 --> 01:15:26.600
and then you pick from the hand
that was just handed to you and

916
01:15:26.920 --> 01:15:30.760
do it all over again until all
of the cards are exhausted, and then

917
01:15:31.079 --> 01:15:41.439
you score, and the scoring is
based on the whatever the different sushi options

918
01:15:41.479 --> 01:15:47.000
are, right, So the nagiri
are just straight up the points that they

919
01:15:47.720 --> 01:15:51.520
you know, that are on their
face. You've got like miso soup.

920
01:15:51.560 --> 01:15:58.479
Whoever has the most of those I
think it's a certain number points. Anyway,

921
01:15:58.479 --> 01:16:00.359
there are a whole bunch of different
things and you can trade them out

922
01:16:00.399 --> 01:16:03.600
right, So there are different kinds
of sushi that you can swap in,

923
01:16:03.680 --> 01:16:10.199
right, and then you score the
desserts at the end, and whoever has

924
01:16:10.239 --> 01:16:14.840
the most points wins. Board game
geek has a weight of one point three

925
01:16:15.000 --> 01:16:21.800
zero, so you know, really
simple game. She could pick it up

926
01:16:21.800 --> 01:16:29.680
and play it. She actually won
the second game we played, but it's

927
01:16:29.680 --> 01:16:32.800
mostly on sheer luck because you know, she's not quite to the point where

928
01:16:32.840 --> 01:16:38.800
she can look at all of the
options and put them together in the right

929
01:16:38.800 --> 01:16:42.199
way that works right. But she
happened to collect enough of the right cards

930
01:16:42.239 --> 01:16:45.359
to make it happen for her the
second time, which is kind of nice

931
01:16:45.359 --> 01:16:49.359
because you know, then she can
play it and win. So that Sushi

932
01:16:49.359 --> 01:16:55.199
Go Party. I think it takes
twenty minutes half hour to play around of

933
01:16:55.199 --> 01:16:59.680
it so and it'll play up to
eight people. So if you have a

934
01:16:59.760 --> 01:17:02.159
big group and you're wanting a game
that will play all those people, then

935
01:17:02.239 --> 01:17:06.760
that sometimes that's the issue, and
you can definitely do it Sushi Go Party

936
01:17:08.880 --> 01:17:13.960
at home. And I've yet to
win. Oh really, that makes me

937
01:17:14.079 --> 01:17:18.319
sad. We don't play Settlers anymore. We have it. I think it's

938
01:17:18.359 --> 01:17:23.680
called Katan now. I think they
dropped the Settlers off. Could be and

939
01:17:23.720 --> 01:17:27.159
they have a bunch of variants of
that too, which are fun. So

940
01:17:30.319 --> 01:17:32.600
anyway, I'll put an Amazon affiliate
Lincoln there too. If you click it,

941
01:17:32.640 --> 01:17:35.800
I get kicked back, but you
can just buy it wherever. It's

942
01:17:35.840 --> 01:17:41.760
been around for quite a while,
so it's not it's not like a hot

943
01:17:41.800 --> 01:17:47.399
game that's hard to track down.
But yeah, if I do it this

944
01:17:47.439 --> 01:17:53.800
way, then people just click and
buy it. So other picks. I've

945
01:17:53.800 --> 01:17:58.239
been connecting with people a lot on
LinkedIn, which I'm really liking, so

946
01:17:58.279 --> 01:18:01.840
I'm gonna pick that. Mostly what
I've been doing is I've either been reaching

947
01:18:01.880 --> 01:18:05.640
out to people that I've worked with
in the past or have some connection to

948
01:18:05.760 --> 01:18:09.960
us, like, oh, I'd
like to connect with them again. You

949
01:18:10.000 --> 01:18:12.119
know. As I mentioned at the
start of the show, I'm looking for

950
01:18:12.159 --> 01:18:16.640
work, and so you know,
sometimes people will throw me a connection or

951
01:18:16.640 --> 01:18:19.159
something. You know, they're like, hey, connect with this person because

952
01:18:19.159 --> 01:18:21.760
they may be able to help you. But for the most part, it's

953
01:18:21.800 --> 01:18:26.119
just been nice to connect with people
while I'm trying to figure out my work

954
01:18:26.119 --> 01:18:30.640
situation. And then the other two
things are going to be the things that

955
01:18:30.640 --> 01:18:33.720
I'm putting together. So I'm I'm
putting together JavaScript geniuses and Ruby geniuses.

956
01:18:34.039 --> 01:18:36.720
I think I've mentioned it on the
show before, but I've finally got kind

957
01:18:36.720 --> 01:18:40.720
of all the platforms put together and
everything, so you can sign up and

958
01:18:40.760 --> 01:18:43.800
do it. It's going to be
a weekly call. We talk about JavaScript

959
01:18:43.840 --> 01:18:46.840
stuff. You know, we may
invite people like Rich or Dan or you

960
01:18:46.840 --> 01:18:49.920
know whoever else that we've had on
the show to come in and just chat

961
01:18:49.960 --> 01:18:55.840
with us about what they're working on. Right, so maybe we'll hit Rich

962
01:18:55.920 --> 01:18:59.000
up when Spelt five comes out and
you can talk to us about what's involved

963
01:18:59.000 --> 01:19:03.359
there, or you know whatever when
people are available, and then yeah,

964
01:19:03.800 --> 01:19:09.920
just kind of do some coaching,
some career connecting. But it's kind of

965
01:19:09.920 --> 01:19:14.520
that weekly meet up vibe that you
get. And so if you're into Ruby

966
01:19:14.960 --> 01:19:19.039
or JavaScript, I have basically one
for each, and then I just the

967
01:19:19.079 --> 01:19:23.479
other thing is I just barely set
up on spreaker. I set up the

968
01:19:23.520 --> 01:19:28.039
premium podcast, so you know,
we do insert ads into the audio of

969
01:19:28.079 --> 01:19:31.520
the podcast, and so if you
want the version without the ads, or

970
01:19:32.279 --> 01:19:35.960
if you are just you just want
to support the show at nine bucks a

971
01:19:35.960 --> 01:19:44.960
month, that really helps because anyway, yeah, I'd like to eventually not

972
01:19:45.000 --> 01:19:47.399
have sponsors, but in the meantime, if you want to help us out,

973
01:19:47.399 --> 01:19:49.680
that'd be great, and you can
just get that at JavaScript jabber dot

974
01:19:49.680 --> 01:19:55.079
com. Slash premium. All right, Rich, what are your picks?

975
01:19:56.199 --> 01:19:59.479
Well, after being reminded about it
during this conversation, my pick has to

976
01:19:59.479 --> 01:20:04.720
be Ragnaro, go get yourself a
quest three down O Ragnarok, You're going

977
01:20:04.760 --> 01:20:08.279
to have a great time. So
the reason that we have a quest three

978
01:20:08.880 --> 01:20:13.119
is because I was able to convince
my wife that if I spent five hundred

979
01:20:13.159 --> 01:20:15.800
dollars on one of these, I
was much less likely to spend three and

980
01:20:15.800 --> 01:20:18.920
a half thousand dollars plus tax on
a vision pro And so far that's how

981
01:20:19.000 --> 01:20:28.000
true. Yet to yield to temptation. Can't you get it for cheap now

982
01:20:28.039 --> 01:20:32.000
that everybody is trying to return them? Maybe? Maybe? Honestly, I

983
01:20:32.239 --> 01:20:36.079
haven't even tried one yet, and
I'm scared to do so in case I

984
01:20:36.119 --> 01:20:40.600
am then compelled to drop all that
money on something that I will end up

985
01:20:40.640 --> 01:20:43.520
probably not using very often. But
you know what, I think people are

986
01:20:43.520 --> 01:20:48.119
sleeping on virtual reality generally. I
think that it's obviously early and there's a

987
01:20:48.119 --> 01:20:53.840
lot of things that has yet to
be figured out. But if I had

988
01:20:54.039 --> 01:20:58.159
more time to spend on hobby projects
and I wasn't working every hour that ends

989
01:20:58.199 --> 01:21:02.159
on spelt, then you know,
forget about all this AI nonsense. VRS.

990
01:21:02.600 --> 01:21:06.920
Where's it's going to be? I
have to mention this. So that's

991
01:21:06.920 --> 01:21:11.239
something like fifteen years ago, I
think, more or less. I gave

992
01:21:11.279 --> 01:21:15.720
a talk at a conference where I
said that if in a decade from now,

993
01:21:15.840 --> 01:21:19.159
we are still using the same old
laptop form factor, I'd be extremely

994
01:21:19.199 --> 01:21:27.319
disappointed with humanity. And here we
are still waiting on VR. We're so

995
01:21:27.479 --> 01:21:33.479
close, We're so close. Yeah, all right, well this was really

996
01:21:33.640 --> 01:21:39.239
really interesting, and we do these
episodes and then I'm always like I want

997
01:21:39.239 --> 01:21:43.680
to go fry it right now.
So anyway, thanks for coming rich,

998
01:21:43.720 --> 01:21:46.000
This was a lot of fun.
Yeah, thanks having me. All Right,

999
01:21:46.039 --> 01:21:49.039
folks, we're gonna end it here. Until next time. Max out

