WEBVTT

1
00:00:05.360 --> 00:00:09.240
<v Speaker 1>Hey, folks, welcome back to another episode of JavaScript Jabber.

2
00:00:09.599 --> 00:00:12.800
<v Speaker 2>This week on our panel, we have a j O'Neill Yoh.

3
00:00:12.640 --> 00:00:18.160
<v Speaker 3>Yeah, coming at you live from the sickness. Oh no,

4
00:00:18.239 --> 00:00:20.800
<v Speaker 3>I'm feeling better today. Yesterday I was a little under

5
00:00:20.839 --> 00:00:23.000
<v Speaker 3>the weather. I just slept all day and I feel good.

6
00:00:23.000 --> 00:00:23.960
<v Speaker 3>I'm just a little groggy.

7
00:00:24.559 --> 00:00:27.480
<v Speaker 1>I still have some turkey soup from Thanksgiving. Maybe i'll

8
00:00:27.519 --> 00:00:27.960
<v Speaker 1>drop by.

9
00:00:28.760 --> 00:00:31.079
<v Speaker 3>I'm Charles Max from.

10
00:00:31.000 --> 00:00:34.920
<v Speaker 1>Top End Devs and this week where we have a

11
00:00:34.960 --> 00:00:36.200
<v Speaker 1>special guest, it's ONNSE.

12
00:00:37.520 --> 00:00:39.200
<v Speaker 2>Sorry I don't have your last name in front of me.

13
00:00:39.240 --> 00:00:41.880
<v Speaker 4>I usually my last name is Ko, but that's like

14
00:00:42.000 --> 00:00:45.119
<v Speaker 4>even more difficult. Don't worry about it. Nice toy. You

15
00:00:45.159 --> 00:00:46.719
<v Speaker 4>guys very happy to be here.

16
00:00:47.439 --> 00:00:50.119
<v Speaker 1>Yeah, the foreign names kind of throw us off. Sometimes

17
00:00:51.359 --> 00:00:53.920
<v Speaker 1>you want to introduce yourself real quick. I mean, I

18
00:00:53.960 --> 00:00:56.000
<v Speaker 1>have jazz dot tools is something you work on.

19
00:00:56.039 --> 00:01:00.880
<v Speaker 4>But yeah, sure, So I'm like, broadly speaking, a full

20
00:01:00.920 --> 00:01:03.880
<v Speaker 4>stex software engineer. Have worked kind of as a freelancer

21
00:01:03.960 --> 00:01:06.799
<v Speaker 4>most of my life. I'm originally from Germany. I live

22
00:01:06.840 --> 00:01:09.840
<v Speaker 4>in the UK now and I kind of just kept

23
00:01:10.040 --> 00:01:12.799
<v Speaker 4>building apps for different companies, always kind of taking them

24
00:01:12.799 --> 00:01:16.359
<v Speaker 4>from zero to one and just felt like I'm always

25
00:01:16.439 --> 00:01:19.359
<v Speaker 4>doing the same stuff and I never really had a

26
00:01:19.400 --> 00:01:21.879
<v Speaker 4>good answer to how to solve that problem until I

27
00:01:21.959 --> 00:01:24.680
<v Speaker 4>ran into what is now known as local First, and

28
00:01:24.719 --> 00:01:27.879
<v Speaker 4>that kind of became Jazz. That's like my mini origin

29
00:01:27.959 --> 00:01:28.680
<v Speaker 4>story on that.

30
00:01:30.200 --> 00:01:30.640
<v Speaker 2>Awesome.

31
00:01:30.799 --> 00:01:33.439
<v Speaker 3>So, so are you the main person behind Jazz.

32
00:01:34.040 --> 00:01:36.959
<v Speaker 4>Yeah. So I've been working on it for a bit

33
00:01:37.040 --> 00:01:40.200
<v Speaker 4>over four and a half years now, and then since

34
00:01:40.439 --> 00:01:43.439
<v Speaker 4>this summer it's a company and I raised some funding

35
00:01:43.480 --> 00:01:45.120
<v Speaker 4>and so on. But before that it was just like

36
00:01:45.680 --> 00:01:47.599
<v Speaker 4>my side main project.

37
00:01:48.439 --> 00:01:48.719
<v Speaker 3>Nice.

38
00:01:48.840 --> 00:01:49.159
<v Speaker 2>Nice.

39
00:01:50.480 --> 00:01:53.640
<v Speaker 1>So I just have to ask, just right off the bat,

40
00:01:53.680 --> 00:01:56.560
<v Speaker 1>because you said local first, you go to jazz dot

41
00:01:56.640 --> 00:02:00.760
<v Speaker 1>tools dot or jazz dot tools. I almost added to that,

42
00:02:00.799 --> 00:02:02.959
<v Speaker 1>but guys, there's no dot com. It's Jazz dot tools

43
00:02:03.439 --> 00:02:09.080
<v Speaker 1>on the internet, and it says local first, and of

44
00:02:09.120 --> 00:02:11.280
<v Speaker 1>course my brain goes through is it one of these

45
00:02:11.319 --> 00:02:12.280
<v Speaker 1>eighty different things?

46
00:02:12.319 --> 00:02:13.960
<v Speaker 2>So do you want to just kind.

47
00:02:13.840 --> 00:02:16.639
<v Speaker 1>Of explain give us some context of what kind of

48
00:02:16.639 --> 00:02:18.840
<v Speaker 1>apps we're looking at and what you mean by local

49
00:02:18.919 --> 00:02:23.159
<v Speaker 1>verst so that we're not talking about things different things

50
00:02:23.159 --> 00:02:24.960
<v Speaker 1>that people are thinking, oh it's this, and then we're

51
00:02:25.000 --> 00:02:25.960
<v Speaker 1>talking about this other thing.

52
00:02:26.840 --> 00:02:29.000
<v Speaker 4>Yeah. Sure, So, like local first is kind of a

53
00:02:29.080 --> 00:02:33.439
<v Speaker 4>new term and a new sphere, Like everyone who is

54
00:02:33.479 --> 00:02:36.240
<v Speaker 4>into it seems to have bumped into it their own way,

55
00:02:37.439 --> 00:02:40.240
<v Speaker 4>and it means because it's so early in the movement,

56
00:02:40.240 --> 00:02:42.680
<v Speaker 4>it means a lot of different things to different people, right,

57
00:02:43.039 --> 00:02:48.120
<v Speaker 4>And I think what everyone has in common in terms

58
00:02:48.159 --> 00:02:50.520
<v Speaker 4>of how they would define it as like you move

59
00:02:50.560 --> 00:02:53.319
<v Speaker 4>away from the traditional stack model where you have a

60
00:02:53.360 --> 00:02:56.120
<v Speaker 4>back end and a front end and most of the

61
00:02:56.120 --> 00:02:59.479
<v Speaker 4>authoritypive state lifts in your database and the beckend interacts

62
00:02:59.520 --> 00:03:01.960
<v Speaker 4>with that, and the front then kind of sense requests

63
00:03:02.000 --> 00:03:04.520
<v Speaker 4>to the back end. You move away from that to

64
00:03:04.560 --> 00:03:08.479
<v Speaker 4>a new model where you try to keep as much

65
00:03:08.560 --> 00:03:11.120
<v Speaker 4>state as possible or maybe even all state in the

66
00:03:11.199 --> 00:03:15.039
<v Speaker 4>client and you just write youI around that as if

67
00:03:15.039 --> 00:03:17.759
<v Speaker 4>you were building basically an old school offline app that

68
00:03:17.960 --> 00:03:21.560
<v Speaker 4>just writes to memory too disc but then that state

69
00:03:21.639 --> 00:03:24.479
<v Speaker 4>gets synced to other participants because of course you still

70
00:03:24.520 --> 00:03:27.400
<v Speaker 4>want to interact with other users, maybe even have real

71
00:03:27.400 --> 00:03:30.039
<v Speaker 4>time multiplayer that sort of stuff. So you kind of

72
00:03:30.560 --> 00:03:32.719
<v Speaker 4>the way I like to look at it is it

73
00:03:32.759 --> 00:03:35.599
<v Speaker 4>is that we're so used to the traditional stack as like,

74
00:03:35.680 --> 00:03:38.240
<v Speaker 4>obviously that's how you build web apps, but if you

75
00:03:38.240 --> 00:03:40.719
<v Speaker 4>think about it, what the stacks do is they just

76
00:03:40.919 --> 00:03:44.479
<v Speaker 4>facilitate sharing state between users, and the way they do

77
00:03:44.520 --> 00:03:49.000
<v Speaker 4>that traditionally is by having like centralized authoritative state. And

78
00:03:49.360 --> 00:03:51.879
<v Speaker 4>with local first, you just turn that problem around and

79
00:03:51.919 --> 00:03:55.560
<v Speaker 4>you like, what if everyone kept state locally and then

80
00:03:55.560 --> 00:03:57.400
<v Speaker 4>how do we sink between participants?

81
00:03:58.520 --> 00:04:03.719
<v Speaker 1>So this reminds me a little bit of how things

82
00:04:03.759 --> 00:04:08.080
<v Speaker 1>like web RTC works, right, where you can have a

83
00:04:08.080 --> 00:04:10.360
<v Speaker 1>lot of times there's a server that kind of coordinates,

84
00:04:10.360 --> 00:04:13.319
<v Speaker 1>so people will hit the server first and say.

85
00:04:13.199 --> 00:04:14.759
<v Speaker 2>You know who else can I connect to?

86
00:04:14.919 --> 00:04:17.639
<v Speaker 1>But then you can do peer to peer video, right,

87
00:04:18.000 --> 00:04:22.199
<v Speaker 1>Or you've got other peer to peer apps where kind

88
00:04:22.199 --> 00:04:25.360
<v Speaker 1>of like BitTorrent, I guess right, where if you know

89
00:04:25.480 --> 00:04:28.120
<v Speaker 1>where the other participants are, you can go ahead and

90
00:04:28.199 --> 00:04:31.079
<v Speaker 1>share in this case as parts of a file.

91
00:04:31.240 --> 00:04:33.160
<v Speaker 2>But it's the same idea, right.

92
00:04:33.800 --> 00:04:36.360
<v Speaker 4>Yeah, And like I really like this comparison because that

93
00:04:36.480 --> 00:04:39.600
<v Speaker 4>lets us get into more precisely what it is, because

94
00:04:40.000 --> 00:04:43.480
<v Speaker 4>something like web ARTC or BitTorrent that's mostly about the

95
00:04:43.519 --> 00:04:46.279
<v Speaker 4>transport mechanism, like how do you find the other peers?

96
00:04:46.839 --> 00:04:49.560
<v Speaker 4>Local first is kind of like almost orthogonal to that

97
00:04:49.639 --> 00:04:51.839
<v Speaker 4>you can do local first in a peer to peer way.

98
00:04:51.920 --> 00:04:55.000
<v Speaker 4>But you can also do it with some centralized sinking infrastructure,

99
00:04:55.040 --> 00:04:58.759
<v Speaker 4>which is what Jazz tools implements. For example, what local

100
00:04:58.800 --> 00:05:04.600
<v Speaker 4>first is about is mostly solving the problem of well,

101
00:05:04.959 --> 00:05:07.079
<v Speaker 4>if you write against the state as if it was

102
00:05:07.160 --> 00:05:11.120
<v Speaker 4>local state, what should happen if multiple people added the

103
00:05:11.160 --> 00:05:14.600
<v Speaker 4>same piece of content. Again, in the traditional stack model,

104
00:05:15.199 --> 00:05:18.519
<v Speaker 4>this problem doesn't really exist because it just depends whoever's

105
00:05:18.720 --> 00:05:22.160
<v Speaker 4>request comes first, and then there's one central state. In

106
00:05:22.160 --> 00:05:24.759
<v Speaker 4>this case, you have distributed state, and how do you

107
00:05:25.560 --> 00:05:28.120
<v Speaker 4>solve for conflicts and distributed state? And what you get

108
00:05:28.160 --> 00:05:32.759
<v Speaker 4>then is something that works very similarly to GIT. And again,

109
00:05:33.560 --> 00:05:38.399
<v Speaker 4>different local first frameworks or services do different things, but

110
00:05:38.759 --> 00:05:40.920
<v Speaker 4>what seems to be the most common is to rely

111
00:05:41.120 --> 00:05:45.360
<v Speaker 4>on a technology called conflict free replicated data Types or

112
00:05:45.399 --> 00:05:48.360
<v Speaker 4>CORDTS for short. That's the term that's starting to be

113
00:05:48.399 --> 00:05:52.480
<v Speaker 4>thrown around more. That's an idea that JAZZ is based

114
00:05:52.519 --> 00:05:54.519
<v Speaker 4>on that many others are based on. And the way

115
00:05:54.519 --> 00:05:57.279
<v Speaker 4>I like to illustrate that is that it's very much

116
00:05:57.560 --> 00:06:01.399
<v Speaker 4>like GIT in that have your local state that you

117
00:06:01.519 --> 00:06:04.480
<v Speaker 4>work with, and then you share your edits with other

118
00:06:04.560 --> 00:06:08.399
<v Speaker 4>people and there's something akin to merging and contract resolution.

119
00:06:09.439 --> 00:06:12.439
<v Speaker 4>The difference to get is that it's much more fine

120
00:06:12.480 --> 00:06:14.959
<v Speaker 4>grained well, and get you kind of do pretty large

121
00:06:15.000 --> 00:06:18.079
<v Speaker 4>commits right over, like maybe an hour's worth of time

122
00:06:18.160 --> 00:06:21.759
<v Speaker 4>or something for crdts. Imagine if you made these commits

123
00:06:21.759 --> 00:06:25.839
<v Speaker 4>smaller and smaller until like every single keystroke and every

124
00:06:25.879 --> 00:06:29.600
<v Speaker 4>single edit of an object property becomes a commit, and

125
00:06:29.639 --> 00:06:33.839
<v Speaker 4>then that's what you think to Actually, objects no longer

126
00:06:34.000 --> 00:06:36.759
<v Speaker 4>are like their current state, but they're just represented by

127
00:06:36.759 --> 00:06:39.120
<v Speaker 4>the entire history of everything that ever happened to them.

128
00:06:39.439 --> 00:06:41.240
<v Speaker 4>And again, I have to be careful here not to

129
00:06:41.279 --> 00:06:46.040
<v Speaker 4>get too specific to how jazz works, how jazz interpret crdts,

130
00:06:46.439 --> 00:06:50.560
<v Speaker 4>but this is like a common story. And what Jazz

131
00:06:50.560 --> 00:06:54.399
<v Speaker 4>does basically is you as the application developer. It gives

132
00:06:54.399 --> 00:06:56.839
<v Speaker 4>you an API that makes these objects look like simple,

133
00:06:56.920 --> 00:06:59.480
<v Speaker 4>mutable objects that you can write to and read from

134
00:07:00.160 --> 00:07:03.560
<v Speaker 4>the hood. It converts these edits into changes in the history,

135
00:07:03.639 --> 00:07:06.879
<v Speaker 4>and then kind of reconciles that history with everyone else

136
00:07:06.920 --> 00:07:09.399
<v Speaker 4>who's interested in the same object based on their edits.

137
00:07:09.519 --> 00:07:11.199
<v Speaker 4>Does that start to give you an idea?

138
00:07:12.040 --> 00:07:12.240
<v Speaker 2>Right?

139
00:07:12.319 --> 00:07:14.680
<v Speaker 1>It sounds a little bit more like Google docs, where

140
00:07:14.759 --> 00:07:17.639
<v Speaker 1>you might have multiple people editing the same file or

141
00:07:17.680 --> 00:07:21.680
<v Speaker 1>the same dock at the same time. And as they type,

142
00:07:21.800 --> 00:07:25.439
<v Speaker 1>shows up on my page, and as I type, it

143
00:07:25.439 --> 00:07:28.160
<v Speaker 1>shows up on their page. And if we're typing over

144
00:07:28.199 --> 00:07:31.959
<v Speaker 1>the same space, then yeah, it's got to figure out, Okay.

145
00:07:32.399 --> 00:07:35.319
<v Speaker 2>How do we figure out whose edits.

146
00:07:35.120 --> 00:07:38.800
<v Speaker 4>Or what exactly? And it's kind of clear how that's

147
00:07:38.879 --> 00:07:41.240
<v Speaker 4>useful in something like Google Docs where you have real

148
00:07:41.360 --> 00:07:45.199
<v Speaker 4>time communication. But the way I like to think about it,

149
00:07:45.279 --> 00:07:47.480
<v Speaker 4>and to get back to your original question of like

150
00:07:47.560 --> 00:07:50.319
<v Speaker 4>what kinds of app is that for? There are a

151
00:07:50.360 --> 00:07:52.000
<v Speaker 4>lot of people who are saying, like, look, there's this

152
00:07:52.120 --> 00:07:54.959
<v Speaker 4>new niche of local first apps where this kind of

153
00:07:55.040 --> 00:07:57.439
<v Speaker 4>way of building apps is particularly suited, and you can

154
00:07:57.480 --> 00:08:01.480
<v Speaker 4>see that with your Google Docs example. But my approach

155
00:08:01.519 --> 00:08:03.920
<v Speaker 4>there is to be like, no, this is actually a

156
00:08:03.959 --> 00:08:06.439
<v Speaker 4>better way to build any kind of app, and the

157
00:08:06.480 --> 00:08:09.120
<v Speaker 4>real time multiplayer is kind of just the extreme case,

158
00:08:09.160 --> 00:08:12.519
<v Speaker 4>and anything less interactive than that can still be solved

159
00:08:12.519 --> 00:08:15.519
<v Speaker 4>with the same pattern. And one of the major other

160
00:08:15.560 --> 00:08:17.879
<v Speaker 4>features that you get from local first is that it

161
00:08:17.959 --> 00:08:22.160
<v Speaker 4>is offline first, because you can write against you state locally.

162
00:08:22.199 --> 00:08:24.480
<v Speaker 4>Even if you don't have a connection, your app keeps working,

163
00:08:24.560 --> 00:08:28.040
<v Speaker 4>and you just think when you come back online, and

164
00:08:28.079 --> 00:08:30.800
<v Speaker 4>you can kind of imagine the spectrum of like really intense,

165
00:08:30.839 --> 00:08:34.519
<v Speaker 4>really interactive real time multiplayer on the one end, and

166
00:08:34.559 --> 00:08:38.399
<v Speaker 4>like being completely offline on the other hand, and then

167
00:08:38.519 --> 00:08:40.639
<v Speaker 4>in the middle you have something more like a traditional

168
00:08:40.679 --> 00:08:44.840
<v Speaker 4>app where you have like some multi user collaborative app

169
00:08:44.919 --> 00:08:47.559
<v Speaker 4>like a productivity app, or maybe a social network where

170
00:08:47.559 --> 00:08:51.360
<v Speaker 4>you have some frequency of interaction. And so far we

171
00:08:51.440 --> 00:08:55.360
<v Speaker 4>needed very different ways of building apps and frameworks for

172
00:08:55.440 --> 00:08:58.879
<v Speaker 4>each of these cases. But Cordts and the idea of

173
00:08:58.960 --> 00:09:01.519
<v Speaker 4>local first is actually something that lets you solve all

174
00:09:01.559 --> 00:09:05.240
<v Speaker 4>of these cases with one abstraction. And what's nice there

175
00:09:05.279 --> 00:09:08.200
<v Speaker 4>is that you don't have to choose what kind of

176
00:09:08.240 --> 00:09:10.440
<v Speaker 4>app you're going to build because some parts of your

177
00:09:10.440 --> 00:09:13.320
<v Speaker 4>app some features might be more real time, some features

178
00:09:13.399 --> 00:09:17.159
<v Speaker 4>might be like less frequent updates, less collaborative, more personal,

179
00:09:17.200 --> 00:09:19.960
<v Speaker 4>and so on. And that's kind of what really got

180
00:09:20.000 --> 00:09:22.200
<v Speaker 4>me into the idea and where I'm like, oh, this

181
00:09:22.679 --> 00:09:24.279
<v Speaker 4>can actually solve a lot of things.

182
00:09:25.519 --> 00:09:32.360
<v Speaker 3>So one thing I often ask is what is this

183
00:09:33.240 --> 00:09:36.480
<v Speaker 3>not a good use case for? Like when would I

184
00:09:36.679 --> 00:09:40.159
<v Speaker 3>not want to use this? Because I think hearing we

185
00:09:40.200 --> 00:09:44.879
<v Speaker 3>can use this for anything is a little bit it's

186
00:09:44.960 --> 00:09:48.000
<v Speaker 3>not helpful to know, like we can use it for anything.

187
00:09:48.039 --> 00:09:50.120
<v Speaker 3>So I think sometimes knowing what we shouldn't use it

188
00:09:50.159 --> 00:09:53.600
<v Speaker 3>for helps us to better understand why it's actually really useful.

189
00:09:53.639 --> 00:09:56.120
<v Speaker 3>So when would I not want to be using local

190
00:09:56.159 --> 00:09:57.559
<v Speaker 3>first or jazz?

191
00:09:58.600 --> 00:10:01.720
<v Speaker 4>So I'm going to give you a really annoying first answer,

192
00:10:01.759 --> 00:10:04.720
<v Speaker 4>which is nothing and and kind of like the counter question,

193
00:10:04.840 --> 00:10:09.360
<v Speaker 4>like what is React not good for? Within web? Absolutely?

194
00:10:09.440 --> 00:10:13.840
<v Speaker 1>Say, you know you are knowing the wrong man about that.

195
00:10:15.399 --> 00:10:16.799
<v Speaker 4>What's what's your favorite pick?

196
00:10:18.080 --> 00:10:18.279
<v Speaker 3>Yeah?

197
00:10:18.440 --> 00:10:22.320
<v Speaker 4>Mhmm, what's your favorite pick other than React? No?

198
00:10:22.440 --> 00:10:23.639
<v Speaker 3>I don't. I don't like React?

199
00:10:25.120 --> 00:10:25.720
<v Speaker 4>What what would you?

200
00:10:26.240 --> 00:10:26.399
<v Speaker 3>What?

201
00:10:26.399 --> 00:10:27.600
<v Speaker 4>What would what would you?

202
00:10:27.720 --> 00:10:30.519
<v Speaker 3>I just so, so, first of all, I mostly do

203
00:10:30.879 --> 00:10:34.039
<v Speaker 3>back end or library so I do. I do tons

204
00:10:34.080 --> 00:10:36.919
<v Speaker 3>of front end code, but my front end code is

205
00:10:36.919 --> 00:10:41.039
<v Speaker 3>is in libraries where your people are are used using

206
00:10:41.039 --> 00:10:42.720
<v Speaker 3>it as a as a library. It doesn't matter whether

207
00:10:42.759 --> 00:10:47.159
<v Speaker 3>it's back in the front But when I do JavaScript

208
00:10:47.200 --> 00:10:49.639
<v Speaker 3>on the front end, I just use JavaScript. Now, like

209
00:10:49.679 --> 00:10:52.879
<v Speaker 3>the dom is so good good, I'm not. I'm not

210
00:10:53.000 --> 00:10:56.639
<v Speaker 3>building things that are large enough or I don't even

211
00:10:56.679 --> 00:10:59.960
<v Speaker 3>know things exist that are large enough that just JavaScript

212
00:11:00.039 --> 00:11:02.240
<v Speaker 3>as it is isn't good enough these days?

213
00:11:02.399 --> 00:11:04.200
<v Speaker 4>Fair fair enough, fair enough? Okay.

214
00:11:04.519 --> 00:11:08.240
<v Speaker 1>It's very similar to AJS where I use a framework

215
00:11:08.279 --> 00:11:11.759
<v Speaker 1>called Stimulus, and then I use another library called Turbo,

216
00:11:11.879 --> 00:11:14.159
<v Speaker 1>which is a lot like HTMX and.

217
00:11:15.759 --> 00:11:18.759
<v Speaker 2>So interesting. So it very gives me a way to

218
00:11:18.879 --> 00:11:24.480
<v Speaker 2>organize my dom calls.

219
00:11:23.200 --> 00:11:25.639
<v Speaker 4>Cool Okay, So yeah, my comparison there would have gone

220
00:11:25.720 --> 00:11:28.360
<v Speaker 4>nowhere because I'm used to to talking to very different

221
00:11:28.360 --> 00:11:30.360
<v Speaker 4>people who are very into React. So I would ask

222
00:11:30.399 --> 00:11:32.200
<v Speaker 4>them back, like, well, what is React good for? And

223
00:11:32.279 --> 00:11:34.840
<v Speaker 4>they would say, well, any kind of That's kind of

224
00:11:34.840 --> 00:11:36.279
<v Speaker 4>what I was saying at.

225
00:11:36.240 --> 00:11:39.240
<v Speaker 3>To React is really good for things that have infinite scrolls.

226
00:11:39.840 --> 00:11:42.360
<v Speaker 3>That's what React was designed for. That's what it's really

227
00:11:42.360 --> 00:11:42.799
<v Speaker 3>great at.

228
00:11:43.720 --> 00:11:46.879
<v Speaker 1>It it so my my thing, and maybe this will

229
00:11:46.879 --> 00:11:49.240
<v Speaker 1>give you a better way to answer this, right, is

230
00:11:49.279 --> 00:11:50.759
<v Speaker 1>I feel like there are trade offs?

231
00:11:51.000 --> 00:11:51.919
<v Speaker 2>Right of course?

232
00:11:52.240 --> 00:11:55.600
<v Speaker 4>Sorry, that was the first like annoying part of my answer.

233
00:11:55.639 --> 00:11:58.240
<v Speaker 4>To be more precise, like, I think a better way

234
00:11:58.320 --> 00:12:00.919
<v Speaker 4>to say it is that events should. I want it

235
00:12:00.960 --> 00:12:02.519
<v Speaker 4>to be good for any kind of app.

236
00:12:02.799 --> 00:12:02.919
<v Speaker 2>Right.

237
00:12:04.080 --> 00:12:06.360
<v Speaker 4>The reason it might not be right now is because

238
00:12:06.360 --> 00:12:09.799
<v Speaker 4>we're early, and because specifically for Jazz tools, we decided

239
00:12:09.840 --> 00:12:15.159
<v Speaker 4>to prior tie certain features over others. So, for example,

240
00:12:16.519 --> 00:12:20.679
<v Speaker 4>if you have an app where you definitely need authoritative

241
00:12:20.799 --> 00:12:24.799
<v Speaker 4>centralized state, like you're building a bank or something like that,

242
00:12:25.000 --> 00:12:28.279
<v Speaker 4>and there can only be one balance of your account

243
00:12:28.320 --> 00:12:31.480
<v Speaker 4>at any time. You you could actually build us on

244
00:12:31.519 --> 00:12:34.600
<v Speaker 4>top of jazz that you can implement authoritative state with

245
00:12:35.559 --> 00:12:37.720
<v Speaker 4>a local first framework, but it's going to be more

246
00:12:37.759 --> 00:12:39.480
<v Speaker 4>awkward than the traditional.

247
00:12:39.000 --> 00:12:42.840
<v Speaker 1>Thing because you have you have a tighter constraint. You

248
00:12:42.879 --> 00:12:44.519
<v Speaker 1>have to make sure that everything lines up on the

249
00:12:44.519 --> 00:12:45.519
<v Speaker 1>front end back end.

250
00:12:46.879 --> 00:12:51.000
<v Speaker 4>It's it's basically like what you do then, is you

251
00:12:51.159 --> 00:12:54.480
<v Speaker 4>re implement something like requests on top of the local

252
00:12:54.559 --> 00:12:58.759
<v Speaker 4>first state, which sounds elaborate but actually has some nice

253
00:12:58.840 --> 00:13:02.240
<v Speaker 4>drawbacks because you're basic get optimistic updates on the front

254
00:13:02.320 --> 00:13:04.279
<v Speaker 4>end for free. But that's kind of that's a way

255
00:13:04.320 --> 00:13:06.039
<v Speaker 4>more advanced topic that I want to get into at

256
00:13:06.039 --> 00:13:11.399
<v Speaker 4>this point. Another thing is like if you need some

257
00:13:11.480 --> 00:13:14.440
<v Speaker 4>of the more advanced bread and butter database features like

258
00:13:15.039 --> 00:13:18.399
<v Speaker 4>in DCS over huge amounts of data, full text search,

259
00:13:18.519 --> 00:13:21.120
<v Speaker 4>that's something that we haven't implemented as features yet, but

260
00:13:21.159 --> 00:13:24.960
<v Speaker 4>they're not like impossible to do with local first. So

261
00:13:25.000 --> 00:13:27.600
<v Speaker 4>this is an interesting example to kind of start giving

262
00:13:27.600 --> 00:13:30.960
<v Speaker 4>you an idea of what kind of apps it's already

263
00:13:30.960 --> 00:13:33.120
<v Speaker 4>really good for. Maybe where the boundary is like.

264
00:13:35.559 --> 00:13:37.000
<v Speaker 3>Using index dB.

265
00:13:37.840 --> 00:13:40.600
<v Speaker 4>Yes, that's what we use for in browser persistence. We're

266
00:13:40.639 --> 00:13:44.480
<v Speaker 4>currently moving to OPFs, which lets us write directly to

267
00:13:45.000 --> 00:13:47.639
<v Speaker 4>like an isolated file system on the client where we

268
00:13:47.679 --> 00:13:49.120
<v Speaker 4>implement and storyteller.

269
00:13:50.120 --> 00:13:52.080
<v Speaker 3>Is that implemented in browsers.

270
00:13:51.639 --> 00:13:54.159
<v Speaker 4>Out Yes, that's widely supported. Not a lot of people

271
00:13:54.200 --> 00:13:56.360
<v Speaker 4>know about it. The nice thing is if you use

272
00:13:56.399 --> 00:13:59.639
<v Speaker 4>something like Jazz, that's like, I guess that's a major

273
00:13:59.679 --> 00:14:01.600
<v Speaker 4>important point. If you use something like Jazz, you don't

274
00:14:01.600 --> 00:14:04.120
<v Speaker 4>need to worry about the persistence and about the networking.

275
00:14:04.200 --> 00:14:08.120
<v Speaker 4>You just manipulate objects basically, right, and it can have

276
00:14:08.159 --> 00:14:11.480
<v Speaker 4>different storage implementations under the hood. It could communicate over

277
00:14:11.519 --> 00:14:14.360
<v Speaker 4>web sockets, web party see in the future maybe something

278
00:14:14.440 --> 00:14:20.120
<v Speaker 4>like quick and what that lets you do is like

279
00:14:20.279 --> 00:14:23.360
<v Speaker 4>really quickly build apps on the abstraction level of like

280
00:14:25.080 --> 00:14:27.039
<v Speaker 4>what do users do in my app and what kind

281
00:14:27.080 --> 00:14:29.240
<v Speaker 4>of objects do they interact with? That's kind of all

282
00:14:29.279 --> 00:14:32.919
<v Speaker 4>you have to think about and what you like. Because

283
00:14:32.960 --> 00:14:37.080
<v Speaker 4>of the performance characteristics of local first, what you get

284
00:14:37.120 --> 00:14:39.720
<v Speaker 4>away with very often if you have apps with like

285
00:14:39.759 --> 00:14:43.399
<v Speaker 4>small teams where a couple people interact, you can literally

286
00:14:43.519 --> 00:14:47.639
<v Speaker 4>keep all the data belonging to that team locally on

287
00:14:47.639 --> 00:14:52.519
<v Speaker 4>each device. The only reason it's hard to scale, for example,

288
00:14:52.559 --> 00:14:56.399
<v Speaker 4>productivity apps is because in a traditional model, the central

289
00:14:56.480 --> 00:14:58.919
<v Speaker 4>database kind of needs to keep the data for every

290
00:14:58.919 --> 00:15:02.279
<v Speaker 4>single team, which might be millions of them. With local first,

291
00:15:03.799 --> 00:15:05.799
<v Speaker 4>each of the team's devices just needs to keep the

292
00:15:05.840 --> 00:15:08.399
<v Speaker 4>state for the whole team. And Linear is actually a

293
00:15:08.399 --> 00:15:10.440
<v Speaker 4>good example of an app they build their whole own

294
00:15:10.639 --> 00:15:14.679
<v Speaker 4>local first technology and infrastructure. They keep all of your

295
00:15:14.759 --> 00:15:17.840
<v Speaker 4>team's issues locally on the clent, and that gives you

296
00:15:18.000 --> 00:15:22.960
<v Speaker 4>incredibly fast you X interaction on the client. We see

297
00:15:23.000 --> 00:15:25.399
<v Speaker 4>with a lot of Jazz apps where people ask us like, look,

298
00:15:25.399 --> 00:15:27.440
<v Speaker 4>I want to implement search in my app, so for that,

299
00:15:27.559 --> 00:15:30.320
<v Speaker 4>I need an index, right and so far in every

300
00:15:30.360 --> 00:15:34.320
<v Speaker 4>case you can literally just brute force your way over

301
00:15:34.360 --> 00:15:37.399
<v Speaker 4>every single object in memory, and it's way faster than

302
00:15:37.440 --> 00:15:40.159
<v Speaker 4>any like search feature against an API that that you've

303
00:15:40.159 --> 00:15:42.080
<v Speaker 4>seen in any other app. That's that's kind of what

304
00:15:42.120 --> 00:15:44.399
<v Speaker 4>it's already really good at. Obviously.

305
00:15:44.480 --> 00:15:48.279
<v Speaker 3>Yeah, I've noticed that, like so many times, people you know,

306
00:15:48.320 --> 00:15:51.320
<v Speaker 3>they're thinking too much about optimization and they don't realize

307
00:15:52.080 --> 00:15:54.879
<v Speaker 3>if you don't optimize this, like optimizing it in many

308
00:15:54.879 --> 00:15:57.559
<v Speaker 3>cases makes it slower because then you're adding all the

309
00:15:57.600 --> 00:16:01.480
<v Speaker 3>overhead of the algorithm in the sifting, and like if

310
00:16:01.480 --> 00:16:04.080
<v Speaker 3>it's less than ten thousand items, if maybe one hundred

311
00:16:04.080 --> 00:16:07.879
<v Speaker 3>thousand items, just like brute force it it's the fastest way.

312
00:16:08.799 --> 00:16:13.559
<v Speaker 1>Well, where we start talking about trade offs, right, yeah, hey,

313
00:16:13.600 --> 00:16:16.000
<v Speaker 1>this is really good up to this point and then

314
00:16:17.000 --> 00:16:20.360
<v Speaker 1>not so great or in the other case, it's you know,

315
00:16:20.679 --> 00:16:24.240
<v Speaker 1>now you're over this threshold, so now your optimal case

316
00:16:24.879 --> 00:16:26.960
<v Speaker 1>is to use the tool, right.

317
00:16:26.840 --> 00:16:29.679
<v Speaker 4>So so so let me draw the picture a bit

318
00:16:29.720 --> 00:16:32.120
<v Speaker 4>further than so, what if you start having data sets

319
00:16:32.159 --> 00:16:35.519
<v Speaker 4>that don't fit on a single client's device anymore. And

320
00:16:36.240 --> 00:16:39.799
<v Speaker 4>that's also where we start seeing differences between Jazz tools

321
00:16:39.799 --> 00:16:42.679
<v Speaker 4>and some of the other local first solutions because they

322
00:16:42.679 --> 00:16:45.320
<v Speaker 4>are very much what I would call like sink the world,

323
00:16:45.399 --> 00:16:47.480
<v Speaker 4>like you actually have to keep the entire state and

324
00:16:47.559 --> 00:16:50.720
<v Speaker 4>the client, whereas Jazz from the beginning was built to

325
00:16:50.879 --> 00:16:54.559
<v Speaker 4>support granular sync, where what it does by default that

326
00:16:54.639 --> 00:16:57.679
<v Speaker 4>it just thinks whatever objects you're trying to display right now,

327
00:16:57.919 --> 00:17:00.559
<v Speaker 4>and then over time you kind of accumulate everything that's

328
00:17:00.720 --> 00:17:04.880
<v Speaker 4>important to that user, and you can like a big

329
00:17:05.000 --> 00:17:06.799
<v Speaker 4>things again if you don't need them anymore. But that

330
00:17:06.920 --> 00:17:09.559
<v Speaker 4>means that you can now have like a local first

331
00:17:09.599 --> 00:17:12.400
<v Speaker 4>experience for the data that you're actually interested in, but

332
00:17:12.519 --> 00:17:15.799
<v Speaker 4>you can still work with potentially infinite data sets, and

333
00:17:15.839 --> 00:17:21.119
<v Speaker 4>then you can build You can build indices against tens

334
00:17:21.119 --> 00:17:23.400
<v Speaker 4>of millions of objects, for example on a server work

335
00:17:23.440 --> 00:17:26.359
<v Speaker 4>and then the index itself again becomes a sinkable object,

336
00:17:26.400 --> 00:17:30.240
<v Speaker 4>so the client can create the index locally, see which

337
00:17:30.279 --> 00:17:32.519
<v Speaker 4>objects it might need to load, and all of that

338
00:17:32.640 --> 00:17:37.359
<v Speaker 4>is it's like not one extreme or the other. If

339
00:17:37.359 --> 00:17:41.720
<v Speaker 4>you make local first granularly sinkable, you can actually create

340
00:17:43.119 --> 00:17:45.720
<v Speaker 4>request and networking patterns under the hood that are very

341
00:17:45.759 --> 00:17:50.240
<v Speaker 4>similar to traditional stacks with APIs. But again, you as

342
00:17:50.240 --> 00:17:52.279
<v Speaker 4>a developer don't have to think about that. You just

343
00:17:52.319 --> 00:17:54.640
<v Speaker 4>think about which objects do you want to have and

344
00:17:55.119 --> 00:17:57.880
<v Speaker 4>kind of request them as needed, and it loads whatever

345
00:17:57.920 --> 00:17:58.319
<v Speaker 4>you need.

346
00:18:00.920 --> 00:18:05.440
<v Speaker 3>So personally, I just like to work with JSON and

347
00:18:05.640 --> 00:18:11.319
<v Speaker 3>functions like I don't ever use I literally have never

348
00:18:11.519 --> 00:18:17.319
<v Speaker 3>used JavaScript classes except for experimentally to learn about them.

349
00:18:17.359 --> 00:18:21.680
<v Speaker 3>I have never shipped code with a JavaScript class because

350
00:18:21.720 --> 00:18:26.279
<v Speaker 3>I just find that and I mean, to some degree

351
00:18:26.279 --> 00:18:29.119
<v Speaker 3>it's the concept of functional programming, like the less state

352
00:18:29.200 --> 00:18:31.920
<v Speaker 3>you have to deal with, the better off you are

353
00:18:31.960 --> 00:18:33.759
<v Speaker 3>the easier it is to test. If I can just

354
00:18:33.799 --> 00:18:37.119
<v Speaker 3>take here's a plane object, here's a plane function. I

355
00:18:37.200 --> 00:18:40.759
<v Speaker 3>put the object and some options into the function. I

356
00:18:40.759 --> 00:18:43.799
<v Speaker 3>get the same result out every time. You know, it's

357
00:18:43.880 --> 00:18:45.960
<v Speaker 3>very grug brain dev type stuff.

358
00:18:48.039 --> 00:18:50.160
<v Speaker 4>And I like.

359
00:18:51.440 --> 00:18:57.079
<v Speaker 3>The rest ish APIs. I like rest ish APIs because

360
00:18:57.079 --> 00:18:59.960
<v Speaker 3>they're very very simple to reason about. Like if I

361
00:19:00.000 --> 00:19:03.559
<v Speaker 3>I open up my network console, I can see what's happening.

362
00:19:03.599 --> 00:19:06.680
<v Speaker 3>I know what's going on. I like SQL databases because

363
00:19:06.720 --> 00:19:12.160
<v Speaker 3>they're very simple and proven. And I personally am am

364
00:19:12.200 --> 00:19:15.400
<v Speaker 3>pretty resistant to things that require a lot of state

365
00:19:15.480 --> 00:19:21.960
<v Speaker 3>management or require a lot of bespoke code structure. So

366
00:19:23.200 --> 00:19:27.519
<v Speaker 3>is this something I mean, it sounds like it sounds

367
00:19:27.559 --> 00:19:31.599
<v Speaker 3>like from what I'm hearing, this is very opinionated. It's

368
00:19:31.640 --> 00:19:34.240
<v Speaker 3>like you buy into this way of doing it and

369
00:19:34.279 --> 00:19:36.680
<v Speaker 3>you're going to adopt it, which I think is great.

370
00:19:38.880 --> 00:19:42.400
<v Speaker 3>It's probably not something that I personally latch onto. But

371
00:19:42.440 --> 00:19:45.079
<v Speaker 3>I do really really believe that, you know, if you're

372
00:19:45.079 --> 00:19:48.599
<v Speaker 3>gonna if you're gonna make something really great, yeah, integrate

373
00:19:48.680 --> 00:19:50.359
<v Speaker 3>it and just tell people they have to buy in.

374
00:19:51.920 --> 00:19:55.640
<v Speaker 3>But I'm I'm not sure if I'm representing that correctly.

375
00:19:55.799 --> 00:19:58.920
<v Speaker 3>Is this like a very streamlined, top to bottom solution.

376
00:19:59.519 --> 00:20:02.000
<v Speaker 3>Or is this something where I can kind of take

377
00:20:02.680 --> 00:20:06.119
<v Speaker 3>the approach of just plain objects and plain functions and

378
00:20:06.799 --> 00:20:11.920
<v Speaker 3>build an application where I'm essentially replacing my res diish

379
00:20:12.640 --> 00:20:15.039
<v Speaker 3>calls with jazz Ish calls.

380
00:20:16.119 --> 00:20:18.839
<v Speaker 4>Right, so you're mentioning a bunch of important things there,

381
00:20:18.839 --> 00:20:24.200
<v Speaker 4>and let me maybe start from what jazz consists of.

382
00:20:24.240 --> 00:20:26.519
<v Speaker 4>It's kind of two layers. It's Jazz, which is like

383
00:20:26.799 --> 00:20:30.200
<v Speaker 4>the opinionated framework, and then below that a protocol which

384
00:20:30.839 --> 00:20:33.279
<v Speaker 4>is called CO Jason. I haven't written much about that yet.

385
00:20:33.319 --> 00:20:35.559
<v Speaker 4>It's because it's so far it's just like internals of

386
00:20:35.640 --> 00:20:38.799
<v Speaker 4>the framework, but it will be an open standard which

387
00:20:38.920 --> 00:20:44.319
<v Speaker 4>defines how what I'm calling CO values work. Which these

388
00:20:44.359 --> 00:20:47.799
<v Speaker 4>are your new primitives, and they are very much like

389
00:20:47.880 --> 00:20:52.599
<v Speaker 4>they're supposed to be, just like collaborative Jason. You have objects,

390
00:20:52.640 --> 00:20:56.200
<v Speaker 4>you have lists, and a bunch of other things for

391
00:20:56.359 --> 00:20:59.480
<v Speaker 4>like text and rich text. But it's basically what if

392
00:21:00.079 --> 00:21:02.880
<v Speaker 4>what if? Yeah, what if Jason was just collaborative? And

393
00:21:02.960 --> 00:21:06.240
<v Speaker 4>that's your abstraction. It like, if you read it, it

394
00:21:06.279 --> 00:21:09.000
<v Speaker 4>looks just like Plaine Jason. If you write to it,

395
00:21:09.039 --> 00:21:12.319
<v Speaker 4>you kind of have the choice between two different APIs,

396
00:21:12.599 --> 00:21:15.200
<v Speaker 4>and that's where we get into the higher level opinionated thing.

397
00:21:15.640 --> 00:21:20.640
<v Speaker 4>What Jazz implements is something very similar to and like react.

398
00:21:20.640 --> 00:21:23.039
<v Speaker 4>People with no libraries like mobs, where like you know

399
00:21:23.119 --> 00:21:26.799
<v Speaker 4>and React, even with like just used with use state,

400
00:21:26.920 --> 00:21:30.319
<v Speaker 4>you get like the current readable version of the state

401
00:21:30.359 --> 00:21:34.720
<v Speaker 4>and an update the function. And that's basically what using

402
00:21:34.839 --> 00:21:40.279
<v Speaker 4>Jazz is like currently. It even exposes a mutable API

403
00:21:40.319 --> 00:21:43.400
<v Speaker 4>where you can literally just do like object dot property

404
00:21:43.440 --> 00:21:45.680
<v Speaker 4>equals something and it will update it under the hood.

405
00:21:45.680 --> 00:21:47.799
<v Speaker 4>But we'll probably move to something more. React is where

406
00:21:47.799 --> 00:21:51.839
<v Speaker 4>it's like you get you subscribe to a collaborative value,

407
00:21:52.839 --> 00:21:55.880
<v Speaker 4>you get a readable version of that every time something

408
00:21:55.880 --> 00:21:57.680
<v Speaker 4>happens to it, and if you want to mutate it,

409
00:21:58.119 --> 00:22:00.759
<v Speaker 4>use this update your function in which you can mutated.

410
00:22:00.960 --> 00:22:04.559
<v Speaker 4>That's what replaces either your rest calls or what replaces

411
00:22:04.559 --> 00:22:07.720
<v Speaker 4>your local state updates. That all just becomes one. And

412
00:22:07.920 --> 00:22:11.440
<v Speaker 4>the nice thing is you just subscribe to updates, whether

413
00:22:11.599 --> 00:22:14.400
<v Speaker 4>they come from locally because you edited the object, or

414
00:22:14.480 --> 00:22:17.160
<v Speaker 4>whether they come from other users who are like remotely

415
00:22:17.279 --> 00:22:20.559
<v Speaker 4>changing that same object. And in new subscription you can

416
00:22:20.640 --> 00:22:24.279
<v Speaker 4>update your UI. Obviously, again with something like React, that

417
00:22:24.319 --> 00:22:27.240
<v Speaker 4>ties directly into the render loop like it just rerenders

418
00:22:27.279 --> 00:22:30.319
<v Speaker 4>your component. But there's also Jazz Browser if you want

419
00:22:30.319 --> 00:22:32.200
<v Speaker 4>to use it and plain JavaScript. You just have a

420
00:22:32.240 --> 00:22:34.519
<v Speaker 4>subscribe callback in there. You can do to the dorm

421
00:22:34.599 --> 00:22:37.519
<v Speaker 4>whatever you want based on the newest version of that value.

422
00:22:37.880 --> 00:22:42.200
<v Speaker 4>That's as simple as it is. What Jazz as a

423
00:22:42.240 --> 00:22:48.240
<v Speaker 4>framework introduces to kind of structure your applications more almost

424
00:22:48.279 --> 00:22:50.200
<v Speaker 4>in like a rail sense, is that it has this

425
00:22:50.400 --> 00:22:53.440
<v Speaker 4>notion of schemas, which are similar to database schemas, where

426
00:22:53.480 --> 00:22:55.920
<v Speaker 4>you say, like, look, these are the kinds of objects

427
00:22:55.920 --> 00:22:58.359
<v Speaker 4>that I have in my app. They have these properties

428
00:22:58.359 --> 00:23:03.319
<v Speaker 4>with these types. Jazz has chosen to represent these schemas

429
00:23:03.440 --> 00:23:08.880
<v Speaker 4>using classes because it's way easier in Typescript to have

430
00:23:08.920 --> 00:23:11.440
<v Speaker 4>classes because you can refer to them as a type

431
00:23:11.440 --> 00:23:14.359
<v Speaker 4>and as a value. So we can kind of use

432
00:23:14.440 --> 00:23:17.799
<v Speaker 4>this schema information both at typing time so we can

433
00:23:17.799 --> 00:23:20.039
<v Speaker 4>give you nice type inference for your apps objects, as

434
00:23:20.039 --> 00:23:23.519
<v Speaker 4>well as at run time to do validation and stuff

435
00:23:23.559 --> 00:23:28.160
<v Speaker 4>like that. We've noticed that even just seeing the class

436
00:23:28.160 --> 00:23:31.319
<v Speaker 4>syntex throws a lot of people off, So in the

437
00:23:31.359 --> 00:23:35.039
<v Speaker 4>next version of the API will probably move to something

438
00:23:35.079 --> 00:23:37.519
<v Speaker 4>that makes it look even more like the plane data

439
00:23:37.559 --> 00:23:41.720
<v Speaker 4>that it is really but yeah, under the hood, it

440
00:23:41.799 --> 00:23:44.839
<v Speaker 4>is really like collaborative Jason like objects that just have

441
00:23:44.960 --> 00:23:49.359
<v Speaker 4>this editing and merging implemented. And my hope is with

442
00:23:49.440 --> 00:23:53.880
<v Speaker 4>the protocol becoming open that not only might there be

443
00:23:54.039 --> 00:23:57.240
<v Speaker 4>other frameworks on top of it that might different API

444
00:23:57.319 --> 00:24:01.799
<v Speaker 4>designed choices but are still like wire compatable, but it

445
00:24:02.000 --> 00:24:04.839
<v Speaker 4>can also be it would also be really easy to

446
00:24:04.920 --> 00:24:07.799
<v Speaker 4>port it to other programming languages and environments, because one

447
00:24:07.920 --> 00:24:10.720
<v Speaker 4>very interesting thing you can do is you cannot just

448
00:24:10.759 --> 00:24:14.160
<v Speaker 4>write client applications with Jazz. You can write server workers. Said, well,

449
00:24:14.200 --> 00:24:17.480
<v Speaker 4>that's also just listen to these co values can do

450
00:24:17.640 --> 00:24:20.599
<v Speaker 4>some external side effects to talk to third party APIs,

451
00:24:21.079 --> 00:24:23.559
<v Speaker 4>or they could receive a web hook request and in

452
00:24:23.640 --> 00:24:27.440
<v Speaker 4>response mutator co value which done some cliency. And right

453
00:24:27.480 --> 00:24:29.480
<v Speaker 4>now you can kind of only write them a note

454
00:24:29.519 --> 00:24:33.519
<v Speaker 4>Jazz because right now Jazz is only implemented in Typescript.

455
00:24:34.200 --> 00:24:36.480
<v Speaker 4>But if the protocol is open, there could then be

456
00:24:36.599 --> 00:24:39.519
<v Speaker 4>like cojacent for Go or for Rust or for like

457
00:24:39.839 --> 00:24:42.359
<v Speaker 4>whatever language you want, and you could write these complex

458
00:24:42.400 --> 00:24:47.359
<v Speaker 4>systems that all use this really nice model of collaborative

459
00:24:47.440 --> 00:24:50.920
<v Speaker 4>values and no one has to think about transport or persistems.

460
00:24:52.000 --> 00:24:54.440
<v Speaker 2>Yeah, Sevin.

461
00:24:55.240 --> 00:24:57.279
<v Speaker 3>I've been wondering about the back end part of this.

462
00:24:57.839 --> 00:25:02.440
<v Speaker 3>Do I run a Jazz surve or can I can

463
00:25:02.480 --> 00:25:06.079
<v Speaker 3>I use my SQL database and there's a Jazz adapter

464
00:25:06.319 --> 00:25:10.480
<v Speaker 3>for the CRDT stuff to to get things in line,

465
00:25:10.559 --> 00:25:13.079
<v Speaker 3>or what what does that look like? What's the what

466
00:25:13.119 --> 00:25:14.400
<v Speaker 3>does my server side look like?

467
00:25:15.160 --> 00:25:18.799
<v Speaker 4>Yeah? So yeah, it's important to be precisely and this

468
00:25:18.880 --> 00:25:21.480
<v Speaker 4>is not going to be very Jazz specific because not

469
00:25:21.599 --> 00:25:24.359
<v Speaker 4>a lot of the other local first solutions have a

470
00:25:24.400 --> 00:25:28.119
<v Speaker 4>back end story. Obviously, everyone needs to have some kind

471
00:25:28.160 --> 00:25:30.920
<v Speaker 4>of back end to to sync the co values and

472
00:25:30.920 --> 00:25:36.200
<v Speaker 4>to persist them in the cloud. And in Jazz, this

473
00:25:36.240 --> 00:25:39.440
<v Speaker 4>is what I call the sink and Storage server. That

474
00:25:39.599 --> 00:25:42.680
<v Speaker 4>is a process that you can run yourself right now.

475
00:25:42.720 --> 00:25:45.960
<v Speaker 4>It's implemented and not Jazz. It's open source. It persists

476
00:25:46.079 --> 00:25:49.839
<v Speaker 4>the history of the co values into esculate and the future.

477
00:25:49.839 --> 00:25:52.000
<v Speaker 4>It will persist it directly onto the disk. But that's

478
00:25:52.039 --> 00:25:54.480
<v Speaker 4>not really a format that you can interact with it like,

479
00:25:54.799 --> 00:25:59.359
<v Speaker 4>it's just like primitive internal data basically. So that's one thing.

480
00:25:59.400 --> 00:26:04.279
<v Speaker 4>And like Jazz tools, my company, Garden Computing, is running

481
00:26:04.319 --> 00:26:07.119
<v Speaker 4>the sink and Storage Server as a service like as

482
00:26:07.200 --> 00:26:11.079
<v Speaker 4>infrastructure that you can subscribe to, has a free tier

483
00:26:11.079 --> 00:26:14.680
<v Speaker 4>and so on. What's nice about that is if you

484
00:26:14.799 --> 00:26:16.680
<v Speaker 4>use that, you can just start building an app and

485
00:26:16.680 --> 00:26:20.400
<v Speaker 4>basically only write front end code and it sinks and persists.

486
00:26:20.400 --> 00:26:22.240
<v Speaker 4>Do that and you have a whole functioning app with

487
00:26:22.319 --> 00:26:25.880
<v Speaker 4>multiplayer and everything. But again you're not locked in. It's

488
00:26:25.880 --> 00:26:26.880
<v Speaker 4>open source and so on.

489
00:26:27.720 --> 00:26:31.079
<v Speaker 3>Separately from that, yeah, oh no, go ahead, you finish.

490
00:26:31.759 --> 00:26:35.319
<v Speaker 4>Yeah, So that's just for like sinking the co values

491
00:26:35.319 --> 00:26:37.160
<v Speaker 4>to everyone who needs them and making sure that they're

492
00:26:37.200 --> 00:26:40.880
<v Speaker 4>persisted in the cloud. Right. What you might want to

493
00:26:40.960 --> 00:26:43.119
<v Speaker 4>do is to have what I call a back end

494
00:26:43.200 --> 00:26:47.079
<v Speaker 4>worker in Jazz, which is actually also a client to

495
00:26:47.160 --> 00:26:50.440
<v Speaker 4>the sink and storage infrastructure that just happens to run

496
00:26:50.480 --> 00:26:52.799
<v Speaker 4>on a server. So that could be a little note

497
00:26:52.839 --> 00:26:55.960
<v Speaker 4>jazz script for example. And what that lets you do is,

498
00:26:56.960 --> 00:26:59.880
<v Speaker 4>like I said earlier, you can do server side things

499
00:27:00.079 --> 00:27:03.079
<v Speaker 4>in reaction to CO values changing, or you can create

500
00:27:03.119 --> 00:27:07.000
<v Speaker 4>co values in reaction to getting something like HGTP requests.

501
00:27:07.160 --> 00:27:10.079
<v Speaker 4>And that's kind of one way in which you can

502
00:27:10.160 --> 00:27:13.480
<v Speaker 4>connect jazz date to the external world. One thing you

503
00:27:13.519 --> 00:27:15.559
<v Speaker 4>might want to do in a server worker, for example,

504
00:27:15.680 --> 00:27:19.799
<v Speaker 4>is to take jazz state and it's like high level

505
00:27:19.839 --> 00:27:23.400
<v Speaker 4>structured form and replicate it the current state into like

506
00:27:23.480 --> 00:27:28.480
<v Speaker 4>a traditional scale database, either because you want to connect

507
00:27:28.519 --> 00:27:30.680
<v Speaker 4>it to an old part of your app that uses

508
00:27:30.799 --> 00:27:33.839
<v Speaker 4>JAS and you want the jazz state to be integrated

509
00:27:33.880 --> 00:27:36.440
<v Speaker 4>with that, or you might want to run some queries

510
00:27:36.440 --> 00:27:39.480
<v Speaker 4>that like that particular database is very good at. For example,

511
00:27:41.279 --> 00:27:44.960
<v Speaker 4>one app someone is building with jazz right now, they

512
00:27:45.039 --> 00:27:47.680
<v Speaker 4>use Jazz for like ninety nine percent of it, but

513
00:27:47.759 --> 00:27:50.400
<v Speaker 4>then they want to do some really deep analytics on

514
00:27:50.519 --> 00:27:53.039
<v Speaker 4>all the user interactions that ever happen, and that's just

515
00:27:53.079 --> 00:27:55.640
<v Speaker 4>not something that Jazz is very good or fasted yet.

516
00:27:55.880 --> 00:27:57.839
<v Speaker 4>So what they do is they have this like background

517
00:27:57.920 --> 00:28:02.079
<v Speaker 4>process that sings jazz state in DUCTV, which is really

518
00:28:02.079 --> 00:28:03.960
<v Speaker 4>good at these kinds of curse. So that's stuff that

519
00:28:04.039 --> 00:28:05.799
<v Speaker 4>you can do that that's kind of your adapter to

520
00:28:05.920 --> 00:28:06.359
<v Speaker 4>the XCEL.

521
00:28:06.519 --> 00:28:15.480
<v Speaker 1>Well there, that's that's really interesting. Yeah, I'm just I

522
00:28:15.519 --> 00:28:17.599
<v Speaker 1>was gonna ask about the back end too. So that's interesting,

523
00:28:17.599 --> 00:28:21.680
<v Speaker 1>and I like the idea of possibly having some driver

524
00:28:21.799 --> 00:28:24.440
<v Speaker 1>for other systems, right, I mean, you know, people on

525
00:28:24.480 --> 00:28:26.000
<v Speaker 1>the show know that a lot of the back end

526
00:28:26.000 --> 00:28:28.559
<v Speaker 1>I do is Ruby on rails, and so it's interesting

527
00:28:28.640 --> 00:28:31.359
<v Speaker 1>just to kind of have that, you know, I you know,

528
00:28:31.480 --> 00:28:34.319
<v Speaker 1>eventually being able to feed it into my Rails app

529
00:28:34.400 --> 00:28:37.880
<v Speaker 1>or whatever else exactly just be able to process it there.

530
00:28:38.960 --> 00:28:41.119
<v Speaker 1>One of the things that I'm getting more into these

531
00:28:41.200 --> 00:28:43.400
<v Speaker 1>days is running things over a web socket and so

532
00:28:44.079 --> 00:28:46.960
<v Speaker 1>instead of having the worker kind of send these updates

533
00:28:46.960 --> 00:28:50.039
<v Speaker 1>over ar rest API or whatever, also being able to

534
00:28:50.240 --> 00:28:52.279
<v Speaker 1>you know, kind of stream them over the socket and

535
00:28:52.359 --> 00:28:57.519
<v Speaker 1>get responses over the socket. And I'm assuming that that's

536
00:28:57.559 --> 00:28:59.599
<v Speaker 1>either something you've got or something you're working on.

537
00:29:00.759 --> 00:29:04.880
<v Speaker 4>So that part is like, for example, let's take the

538
00:29:04.920 --> 00:29:07.160
<v Speaker 4>example of a Rails app, like, this is something that

539
00:29:07.200 --> 00:29:09.880
<v Speaker 4>I want to have really good libraries and patterns for

540
00:29:10.279 --> 00:29:12.359
<v Speaker 4>which we don't have yet, but it is something that

541
00:29:12.400 --> 00:29:14.640
<v Speaker 4>you could build by hand right now, and it wouldn't

542
00:29:14.640 --> 00:29:16.359
<v Speaker 4>be that right, and obviously we would help you. So

543
00:29:16.440 --> 00:29:18.920
<v Speaker 4>for your Rails at probably what would be the best

544
00:29:19.640 --> 00:29:22.359
<v Speaker 4>example is, Okay, you're pretty happy with your app. It

545
00:29:22.400 --> 00:29:24.839
<v Speaker 4>works great, but you want to add something that's like

546
00:29:24.960 --> 00:29:27.640
<v Speaker 4>really really real time where you're like, oh, do I

547
00:29:27.680 --> 00:29:30.240
<v Speaker 4>need a web socket now, how does that integrate with Rails.

548
00:29:30.559 --> 00:29:33.480
<v Speaker 4>What you could do is basically just build this feature

549
00:29:33.519 --> 00:29:37.799
<v Speaker 4>with Jazz and that will work. Perfectly internally for that feature,

550
00:29:37.839 --> 00:29:39.680
<v Speaker 4>but there might be some parts of the state that

551
00:29:39.759 --> 00:29:42.640
<v Speaker 4>the rest of your existing app is interested in. Right,

552
00:29:43.759 --> 00:29:46.759
<v Speaker 4>So what you can do then is, since we don't

553
00:29:46.759 --> 00:29:49.559
<v Speaker 4>have cojacent for rubiat, you could run a little note

554
00:29:49.640 --> 00:29:52.640
<v Speaker 4>jazz server that subscribes to the Jazz state and at

555
00:29:52.720 --> 00:29:55.920
<v Speaker 4>least puts like the current version of the state into

556
00:29:55.960 --> 00:30:00.000
<v Speaker 4>your SKL database, where then rails can pick it up

557
00:30:00.079 --> 00:30:03.039
<v Speaker 4>and render it and existing out and that that should

558
00:30:03.039 --> 00:30:04.759
<v Speaker 4>work quite well.

559
00:30:04.960 --> 00:30:07.799
<v Speaker 2>So one other thing that I'm looking at here is.

560
00:30:10.519 --> 00:30:14.799
<v Speaker 1>It sounds like there are advantages that are sort of obvious,

561
00:30:14.839 --> 00:30:16.880
<v Speaker 1>I guess with this kind of a setup, right, I mean,

562
00:30:16.920 --> 00:30:20.319
<v Speaker 1>if if I'm just mostly managing stuff like it's a

563
00:30:20.359 --> 00:30:26.319
<v Speaker 1>local setup, then I essentially eliminate all of the network stuff. Right,

564
00:30:26.359 --> 00:30:29.839
<v Speaker 1>So if if I'm on a slow network, or if

565
00:30:29.920 --> 00:30:34.440
<v Speaker 1>my connection dies, or if even if I'm not on

566
00:30:34.480 --> 00:30:36.759
<v Speaker 1>a slow network, and I just don't want to wait

567
00:30:37.039 --> 00:30:39.599
<v Speaker 1>to get a response from the server and I don't

568
00:30:39.640 --> 00:30:42.839
<v Speaker 1>need one per se, right because it's just sinking stuff

569
00:30:42.880 --> 00:30:47.480
<v Speaker 1>back and forth, you know, it seems like it kind

570
00:30:47.519 --> 00:30:50.839
<v Speaker 1>of gives me some resiliency and speed and performance.

571
00:30:50.759 --> 00:30:52.880
<v Speaker 2>On top of everything else that I might be doing.

572
00:30:55.119 --> 00:31:01.319
<v Speaker 4>That's a that's like the funny thing is like everyone

573
00:31:01.359 --> 00:31:04.359
<v Speaker 4>in the local first sphere kind of came to it

574
00:31:04.400 --> 00:31:13.720
<v Speaker 4>from that like user experience promises it obviously has, but

575
00:31:13.839 --> 00:31:16.720
<v Speaker 4>then starting to build apps with it, you realize that

576
00:31:17.400 --> 00:31:20.519
<v Speaker 4>the big thing about it is really the different developer experience.

577
00:31:20.519 --> 00:31:23.000
<v Speaker 4>Because sure, it's great that the app is snappier, works

578
00:31:23.000 --> 00:31:25.359
<v Speaker 4>off line and so on or over sketchy connections, which

579
00:31:25.359 --> 00:31:30.440
<v Speaker 4>is often even trickier than offline. But the main thing

580
00:31:30.519 --> 00:31:33.400
<v Speaker 4>is that by not having to worry about requests or

581
00:31:33.519 --> 00:31:36.160
<v Speaker 4>back end or like making sure the back end now

582
00:31:36.240 --> 00:31:39.359
<v Speaker 4>supports an endpoint that gives you the data that you

583
00:31:39.359 --> 00:31:42.079
<v Speaker 4>need to render this thing, you're just like in one context,

584
00:31:42.119 --> 00:31:44.480
<v Speaker 4>you build your front then and the data model right

585
00:31:44.519 --> 00:31:47.000
<v Speaker 4>next to each other, and you can iterate really really quickly,

586
00:31:47.000 --> 00:31:49.440
<v Speaker 4>and you just think about what objects do they need

587
00:31:49.480 --> 00:31:52.640
<v Speaker 4>to create or delete or I mean, if you're coming

588
00:31:52.680 --> 00:31:55.440
<v Speaker 4>from like a Ruby on rails background, that's actually what

589
00:31:55.480 --> 00:31:59.720
<v Speaker 4>I started cutting my teeth. As a developer. You kind

590
00:31:59.720 --> 00:32:01.680
<v Speaker 4>of have have that experience there, but on the back

591
00:32:01.799 --> 00:32:04.559
<v Speaker 4>end and the back and also does the rendering, so

592
00:32:05.279 --> 00:32:07.839
<v Speaker 4>local first lets you have that on the client, you

593
00:32:08.000 --> 00:32:12.640
<v Speaker 4>meaningfully can create modified objects, and often what that looks

594
00:32:12.680 --> 00:32:15.599
<v Speaker 4>like is like it looks almost illegal, like in a

595
00:32:15.720 --> 00:32:18.400
<v Speaker 4>in a in a button on clickhandle, you create like

596
00:32:18.480 --> 00:32:21.319
<v Speaker 4>a whole team and like documents and then whatever you

597
00:32:21.400 --> 00:32:25.720
<v Speaker 4>might have in your app. That's that's the developer experience

598
00:32:25.759 --> 00:32:28.200
<v Speaker 4>it gives you. And it's hard to understate before you've

599
00:32:28.240 --> 00:32:30.640
<v Speaker 4>tried to help yourself just how quickly that lets you

600
00:32:30.680 --> 00:32:35.240
<v Speaker 4>build apps. However, one component that enables that really that

601
00:32:35.319 --> 00:32:38.400
<v Speaker 4>we haven't really talked about yet, that I can go

602
00:32:38.440 --> 00:32:42.519
<v Speaker 4>into more detail if you if you want this, it's

603
00:32:42.599 --> 00:32:45.519
<v Speaker 4>really it's a really tricky question. How do you do

604
00:32:45.680 --> 00:32:51.880
<v Speaker 4>user identity and permissions in a local first way, because

605
00:32:52.119 --> 00:32:54.759
<v Speaker 4>that's not really answered by like just the simple way

606
00:32:54.799 --> 00:32:56.440
<v Speaker 4>of light it out so far. Let me know if

607
00:32:56.440 --> 00:32:57.599
<v Speaker 4>you want to go into that or if you have

608
00:32:57.680 --> 00:32:58.119
<v Speaker 4>some other.

609
00:32:58.279 --> 00:33:02.599
<v Speaker 1>That is interesting because you know, as you're saying, right,

610
00:33:04.400 --> 00:33:07.440
<v Speaker 1>if you have that kind of centralized back end system,

611
00:33:08.279 --> 00:33:12.519
<v Speaker 1>right then it can kind of know who's sending it stuff, right, But.

612
00:33:13.000 --> 00:33:15.880
<v Speaker 2>On the front end, yeah, that's that's a little bit different.

613
00:33:15.960 --> 00:33:19.359
<v Speaker 1>And then I'd also like to talk a little bit about,

614
00:33:19.519 --> 00:33:21.599
<v Speaker 1>you know, maybe doing peer to peer where you don't

615
00:33:21.599 --> 00:33:25.279
<v Speaker 1>even need that centralized server beyond hey, who else is

616
00:33:25.799 --> 00:33:28.680
<v Speaker 1>working with the documents? And so if you're doing that,

617
00:33:28.759 --> 00:33:32.000
<v Speaker 1>then it gets even more tricky because then it who

618
00:33:32.039 --> 00:33:35.000
<v Speaker 1>do I trust it coming from from across the internet

619
00:33:35.839 --> 00:33:39.640
<v Speaker 1>right without even having it, you know, a clear identity

620
00:33:39.720 --> 00:33:43.839
<v Speaker 1>I attached from that centralized server. So yeah, how do

621
00:33:43.880 --> 00:33:45.200
<v Speaker 1>you think about those issues?

622
00:33:46.480 --> 00:33:49.960
<v Speaker 4>So jazz implements something and again that's also part of

623
00:33:50.000 --> 00:33:54.039
<v Speaker 4>the online protocol cojacent, which I call local first permissions,

624
00:33:54.079 --> 00:33:56.319
<v Speaker 4>and this is maybe beyond all the other details of

625
00:33:56.359 --> 00:34:00.200
<v Speaker 4>FOG exectly, it's implemented the biggest difference between jazz as

626
00:34:00.359 --> 00:34:04.839
<v Speaker 4>and other local first things because the approach that many

627
00:34:04.880 --> 00:34:08.079
<v Speaker 4>others take is either look, the author and permissions question

628
00:34:08.199 --> 00:34:10.400
<v Speaker 4>is out of scope. We just give you the shared state,

629
00:34:10.440 --> 00:34:13.760
<v Speaker 4>you figure it out yourself, or in many of the

630
00:34:13.800 --> 00:34:16.159
<v Speaker 4>other cases where they also have folset services, they kind

631
00:34:16.159 --> 00:34:19.280
<v Speaker 4>of they do the local first state. But then identity

632
00:34:19.280 --> 00:34:22.599
<v Speaker 4>and auth is still traditional in a centralized way, which

633
00:34:22.800 --> 00:34:25.119
<v Speaker 4>works okay for a lot of things, but it kind

634
00:34:25.199 --> 00:34:28.280
<v Speaker 4>of makes you trade off some of the local first

635
00:34:28.320 --> 00:34:32.760
<v Speaker 4>properties you could otherwise have, and it's tricky to do, like, well,

636
00:34:33.320 --> 00:34:35.159
<v Speaker 4>how do you do offline them? Because then you're not

637
00:34:35.199 --> 00:34:37.679
<v Speaker 4>really authenticated against the back end that at least checks

638
00:34:37.679 --> 00:34:40.679
<v Speaker 4>the permissions and so on. So that's tricky. So for

639
00:34:40.760 --> 00:34:44.360
<v Speaker 4>that reason, what I decided to do when I build

640
00:34:44.400 --> 00:34:46.800
<v Speaker 4>Jazz is like I saw the crdts that give you

641
00:34:46.840 --> 00:34:49.559
<v Speaker 4>the shared sit I was like, damn, this is amazing.

642
00:34:49.599 --> 00:34:51.440
<v Speaker 4>I want to build everything like that, but it feels

643
00:34:51.480 --> 00:34:53.559
<v Speaker 4>like only part of the puzzle. You also need to

644
00:34:53.679 --> 00:34:57.480
<v Speaker 4>solve user identity and permissions in a similar way. So

645
00:34:57.519 --> 00:35:00.960
<v Speaker 4>what I've done there is to couple cred keys with

646
00:35:01.159 --> 00:35:06.119
<v Speaker 4>basically good old public key cryptography, where a user in

647
00:35:06.239 --> 00:35:09.880
<v Speaker 4>Jazz is just the cryptographic keyper and we'll talk in

648
00:35:09.920 --> 00:35:13.079
<v Speaker 4>a second about where that comes from. And when you

649
00:35:13.159 --> 00:35:17.280
<v Speaker 4>make changes to an object, you actually sign those changes

650
00:35:17.480 --> 00:35:20.639
<v Speaker 4>with your public key, which means that everyone else who

651
00:35:20.679 --> 00:35:23.559
<v Speaker 4>gets your changes, no matter how they got hold of them,

652
00:35:23.599 --> 00:35:26.360
<v Speaker 4>whether it was to a centralized infrastructure or peer to

653
00:35:26.480 --> 00:35:29.360
<v Speaker 4>pe or whatever, they see the signature and they know, okay,

654
00:35:29.639 --> 00:35:32.440
<v Speaker 4>this was definitely Charles who made that at it. That's

655
00:35:32.519 --> 00:35:36.559
<v Speaker 4>kind of the right access part. And for the read access,

656
00:35:36.599 --> 00:35:39.760
<v Speaker 4>what you do is you encrypt your changes and then

657
00:35:39.840 --> 00:35:42.480
<v Speaker 4>you only give the key to people who you want

658
00:35:42.519 --> 00:35:45.039
<v Speaker 4>to see that object. Right. That means that you can

659
00:35:45.079 --> 00:35:47.719
<v Speaker 4>now actually in a local first way, so on the

660
00:35:47.800 --> 00:35:50.320
<v Speaker 4>client synchronously when you create objects and when you write

661
00:35:50.360 --> 00:35:54.239
<v Speaker 4>to them by signing and encrypting them, you know for

662
00:35:54.360 --> 00:35:56.800
<v Speaker 4>sure that the permissions have been set up correctly and

663
00:35:56.880 --> 00:35:58.840
<v Speaker 4>you don't need to trust the sinking back end to

664
00:35:58.880 --> 00:36:03.280
<v Speaker 4>do that for you. That just needs to exchange the edits,

665
00:36:03.360 --> 00:36:05.960
<v Speaker 4>or you might send them peer to peer, and all

666
00:36:05.960 --> 00:36:08.800
<v Speaker 4>the edits that you receive you can verify who did them.

667
00:36:09.320 --> 00:36:13.960
<v Speaker 4>It gets a bit more complicated then, because you might

668
00:36:14.000 --> 00:36:17.159
<v Speaker 4>want to have complex permission structures, like teams of certain

669
00:36:17.199 --> 00:36:20.840
<v Speaker 4>people with different roles. So what Jazz implements there is

670
00:36:20.880 --> 00:36:24.079
<v Speaker 4>something called groups, which is basically a scope for permissions

671
00:36:24.119 --> 00:36:26.679
<v Speaker 4>where you can say, like, look, this person with this

672
00:36:26.800 --> 00:36:29.480
<v Speaker 4>key pair is the admin. They added someone who is

673
00:36:29.519 --> 00:36:33.320
<v Speaker 4>a writer and someone who is a reader, and Jazz

674
00:36:33.400 --> 00:36:35.800
<v Speaker 4>under the hood make sure that when you receive edits,

675
00:36:35.840 --> 00:36:38.559
<v Speaker 4>for example, not only is it check that they have

676
00:36:38.599 --> 00:36:41.159
<v Speaker 4>a valid signature, but that they have a valid signature

677
00:36:41.199 --> 00:36:43.840
<v Speaker 4>by someone who has the correct role in that team.

678
00:36:44.400 --> 00:36:47.639
<v Speaker 4>The teams themselves are also like CRDT CO values, so

679
00:36:47.679 --> 00:36:50.400
<v Speaker 4>they get sing together with everything else, and you can

680
00:36:50.480 --> 00:36:53.199
<v Speaker 4>even nest groups so like they can inherit from each other,

681
00:36:53.239 --> 00:36:58.400
<v Speaker 4>and with that abstraction you can build basically arbitrarily complex

682
00:36:58.440 --> 00:37:02.519
<v Speaker 4>setups like in no For example, you might have a

683
00:37:02.559 --> 00:37:05.199
<v Speaker 4>team and you want everyone on the team to be

684
00:37:05.199 --> 00:37:08.280
<v Speaker 4>able to read and addit every page by default, but

685
00:37:08.360 --> 00:37:10.760
<v Speaker 4>then you might want to add hoc invite someone just

686
00:37:10.800 --> 00:37:13.280
<v Speaker 4>to that page to also write it who's not otherwise

687
00:37:13.320 --> 00:37:17.360
<v Speaker 4>in your team. And by using that structure of inheriting groups,

688
00:37:17.679 --> 00:37:20.400
<v Speaker 4>you can build all of that in a completely local

689
00:37:20.440 --> 00:37:23.119
<v Speaker 4>first way without having to trust any back end, and

690
00:37:23.679 --> 00:37:28.360
<v Speaker 4>you can even verify every single edit yourself locally. That's

691
00:37:28.519 --> 00:37:31.079
<v Speaker 4>very unique, and like one of the hardest parts of

692
00:37:31.119 --> 00:37:34.440
<v Speaker 4>that was to make that fast enough to be able

693
00:37:34.440 --> 00:37:36.639
<v Speaker 4>to compete with a traditional trusted back end.

694
00:37:37.239 --> 00:37:38.079
<v Speaker 2>Yeah, I'm trying to.

695
00:37:38.599 --> 00:37:40.239
<v Speaker 1>I don't want to like get into the weeds of

696
00:37:40.239 --> 00:37:41.280
<v Speaker 1>how it's all implemented.

697
00:37:42.519 --> 00:37:44.199
<v Speaker 2>You know, the the idea.

698
00:37:43.880 --> 00:37:49.320
<v Speaker 1>Of cryptogaphic, cryptographic you know, asynchronous public private key pairs.

699
00:37:49.840 --> 00:37:52.679
<v Speaker 1>I mean people use them all the time, they just

700
00:37:52.679 --> 00:37:54.280
<v Speaker 1>don't know it a lot of the times. You know,

701
00:37:54.280 --> 00:37:59.079
<v Speaker 1>whether it's your HTTPS connection back to the server that's

702
00:37:59.559 --> 00:38:03.800
<v Speaker 1>using the same ideas, the same technology essentially when you

703
00:38:04.400 --> 00:38:06.119
<v Speaker 1>in yeah.

704
00:38:06.000 --> 00:38:07.559
<v Speaker 3>It's all in web crypto and everything.

705
00:38:07.599 --> 00:38:10.039
<v Speaker 2>I mean aspect the people use.

706
00:38:10.199 --> 00:38:15.079
<v Speaker 1>So yeah, I mean, and I like the idea in

707
00:38:15.119 --> 00:38:19.360
<v Speaker 1>these completely yeah.

708
00:38:19.360 --> 00:38:22.239
<v Speaker 4>So it's completely abstracted away from you. That's the nice thing.

709
00:38:22.280 --> 00:38:24.239
<v Speaker 4>I'm just telling you this as in like, this is

710
00:38:24.239 --> 00:38:25.960
<v Speaker 4>how it works. This is how you can make the

711
00:38:25.960 --> 00:38:29.519
<v Speaker 4>permissions local. First, but to you as a developer, you

712
00:38:29.519 --> 00:38:31.719
<v Speaker 4>you basically you define your groups and it feels like

713
00:38:31.760 --> 00:38:34.519
<v Speaker 4>you're said like drop Box like permissions and you're saying, oh,

714
00:38:34.559 --> 00:38:37.400
<v Speaker 4>this acne has this role. The other thing that I

715
00:38:37.400 --> 00:38:39.920
<v Speaker 4>didn't mention is like, yeah.

716
00:38:40.559 --> 00:38:44.599
<v Speaker 1>So I guess the other question is, I mean, is

717
00:38:44.639 --> 00:38:46.320
<v Speaker 1>there permissions around time?

718
00:38:46.480 --> 00:38:46.639
<v Speaker 2>Right?

719
00:38:46.760 --> 00:38:49.440
<v Speaker 1>So I add somebody temporarily to a group and then

720
00:38:49.480 --> 00:38:52.039
<v Speaker 1>I pull them back out. All the changes during that

721
00:38:52.119 --> 00:38:56.840
<v Speaker 1>time period are legal right to apply those, But now

722
00:38:56.880 --> 00:38:58.920
<v Speaker 1>I've pulled them back out of the group, so if

723
00:38:58.920 --> 00:39:01.199
<v Speaker 1>they send another update, I don't want it added.

724
00:39:01.679 --> 00:39:03.000
<v Speaker 2>And so it handles all that too.

725
00:39:03.119 --> 00:39:05.920
<v Speaker 4>Over time, it and handles all that because the groups

726
00:39:05.960 --> 00:39:09.280
<v Speaker 4>themselves are cerdts, so they are full histories of whatever

727
00:39:09.320 --> 00:39:11.280
<v Speaker 4>happened to them. So everyone can be like, oh, they

728
00:39:11.280 --> 00:39:13.440
<v Speaker 4>were a member until then and then they got kicked out,

729
00:39:13.480 --> 00:39:15.559
<v Speaker 4>and for the read access. What happens is you just

730
00:39:15.639 --> 00:39:17.559
<v Speaker 4>you rotate the key and give the new key to

731
00:39:17.599 --> 00:39:19.639
<v Speaker 4>everyone except the person who get kicked out.

732
00:39:19.719 --> 00:39:19.840
<v Speaker 3>Right.

733
00:39:20.519 --> 00:39:22.920
<v Speaker 4>But again, like this is getting into details, you as

734
00:39:22.920 --> 00:39:25.559
<v Speaker 4>a developer don't really need to carry You just use Dropbox,

735
00:39:25.679 --> 00:39:28.760
<v Speaker 4>like at this account as a writer, at this account,

736
00:39:28.760 --> 00:39:30.880
<v Speaker 4>as a reader, it's really easy to build you you

737
00:39:30.960 --> 00:39:33.599
<v Speaker 4>I around that to have like your little team thing.

738
00:39:34.760 --> 00:39:37.079
<v Speaker 4>And in terms of because I kind of glanced over that,

739
00:39:37.199 --> 00:39:40.400
<v Speaker 4>where the key pairs come from, because obviously you don't

740
00:39:40.440 --> 00:39:42.920
<v Speaker 4>want your users to be handling key pairs, like no

741
00:39:42.960 --> 00:39:46.599
<v Speaker 4>one uses crypto wallets for that reason. So Jazz kind

742
00:39:46.599 --> 00:39:50.280
<v Speaker 4>of lets you have pluggable what it calls off providers,

743
00:39:50.320 --> 00:39:53.079
<v Speaker 4>where it has a couple of native ones that are

744
00:39:53.119 --> 00:39:56.320
<v Speaker 4>really nice. My favorite one is passkey off, where we're

745
00:39:56.400 --> 00:39:59.280
<v Speaker 4>using the past key feature to actually store the key pair.

746
00:39:59.719 --> 00:40:01.920
<v Speaker 4>So the user experience to the user is like it

747
00:40:02.039 --> 00:40:04.199
<v Speaker 4>just prompts you for like touch ID or face ID,

748
00:40:04.840 --> 00:40:07.480
<v Speaker 4>but then actually stores the key on your device and

749
00:40:07.559 --> 00:40:09.920
<v Speaker 4>only you have that. But it still gets If you're

750
00:40:10.000 --> 00:40:12.400
<v Speaker 4>using Apple devices, it gets sync between them. If you're

751
00:40:12.440 --> 00:40:15.159
<v Speaker 4>using Chrome and Endry, it gets SYNCD between them. So

752
00:40:15.199 --> 00:40:17.360
<v Speaker 4>you actually have like an end to end encrypted app

753
00:40:17.400 --> 00:40:20.400
<v Speaker 4>at that point. But you can also do something more traditional,

754
00:40:20.400 --> 00:40:22.159
<v Speaker 4>where like if you want to use something like Clerk

755
00:40:22.599 --> 00:40:25.760
<v Speaker 4>or Zero, we have an adapter for that where the

756
00:40:25.880 --> 00:40:28.960
<v Speaker 4>key pair gets stored and the user's private metadata, so

757
00:40:29.000 --> 00:40:33.360
<v Speaker 4>after they look in Clerk, for example, gives that to

758
00:40:33.360 --> 00:40:35.239
<v Speaker 4>the front and the front can then give that to

759
00:40:35.360 --> 00:40:38.840
<v Speaker 4>Jazz as the key pair. That means that basically Clerk

760
00:40:39.000 --> 00:40:41.599
<v Speaker 4>and any admins you might have in Clerk are trusted

761
00:40:41.639 --> 00:40:44.119
<v Speaker 4>with the keypairs for all the users. But that's kind

762
00:40:44.159 --> 00:40:46.639
<v Speaker 4>of the case for any traditional web app already anyway,

763
00:40:46.719 --> 00:40:48.880
<v Speaker 4>So you kind of you have the choice, like how

764
00:40:49.199 --> 00:40:51.159
<v Speaker 4>deep you want to go there. The nice thing is

765
00:40:51.199 --> 00:40:54.679
<v Speaker 4>that even in this setup, neither the app developer nor

766
00:40:54.719 --> 00:40:57.000
<v Speaker 4>the users have to trust me running the sink and

767
00:40:57.039 --> 00:41:00.159
<v Speaker 4>storage infrastructure. Like I still never see your data and

768
00:41:00.199 --> 00:41:02.480
<v Speaker 4>plain text, I don't have your keys, but I can

769
00:41:02.519 --> 00:41:03.679
<v Speaker 4>still do the sinking for you.

770
00:41:05.719 --> 00:41:06.000
<v Speaker 2>Cool.

771
00:41:06.119 --> 00:41:14.159
<v Speaker 3>Yeah, that's that's one issue that Uh, losing private keys

772
00:41:14.199 --> 00:41:18.360
<v Speaker 3>means losing data permanently because there is no email recovery

773
00:41:18.360 --> 00:41:21.280
<v Speaker 3>for that. Now, if you're storing it in Clerk, then

774
00:41:21.320 --> 00:41:25.400
<v Speaker 3>you have a reasonably high assurance that that is going

775
00:41:25.440 --> 00:41:29.440
<v Speaker 3>to be there. Tomorrow. But that's that's something that's a

776
00:41:29.480 --> 00:41:37.000
<v Speaker 3>little bit yeah, but I think I think, I mean, obviously,

777
00:41:37.000 --> 00:41:39.440
<v Speaker 3>if you're trusting clerk for your users, you're already trusting

778
00:41:39.480 --> 00:41:43.119
<v Speaker 3>clerk for your users, So I wouldn't I wouldn't lay

779
00:41:43.159 --> 00:41:48.599
<v Speaker 3>anything additional there, but I would I would seriously warn

780
00:41:48.679 --> 00:41:53.320
<v Speaker 3>anyone from trusting past keys as a primary source, because

781
00:41:53.599 --> 00:41:55.840
<v Speaker 3>I've done quite a bit of experimentation with it. As

782
00:41:55.920 --> 00:41:58.800
<v Speaker 3>I imagine you're well aware of the the drawbacks of

783
00:41:58.840 --> 00:42:01.800
<v Speaker 3>it and the way that browsers implement it differently, the

784
00:42:01.840 --> 00:42:07.440
<v Speaker 3>differences between the iCloud ID versus the browser ID. And

785
00:42:07.519 --> 00:42:14.079
<v Speaker 3>you could very very easily overwrite your private key, for example,

786
00:42:14.119 --> 00:42:20.000
<v Speaker 3>for iCloud and not not knowingly, and and perhaps you're

787
00:42:20.039 --> 00:42:22.760
<v Speaker 3>taking I know that there's certain measures that you can

788
00:42:22.920 --> 00:42:26.559
<v Speaker 3>take that will prevent the private key from being overwritten

789
00:42:26.599 --> 00:42:31.280
<v Speaker 3>and produce an error instead. But that's one I'm not

790
00:42:31.480 --> 00:42:33.280
<v Speaker 3>I'm not yet comfortable with that. I don't feel like

791
00:42:33.320 --> 00:42:35.719
<v Speaker 3>that one's sure for that use, cause I think it's

792
00:42:35.760 --> 00:42:39.480
<v Speaker 3>excellent as it's a built in password manager. Pass keys

793
00:42:39.559 --> 00:42:42.159
<v Speaker 3>as a password manager built in. I'm one hundred percent

794
00:42:42.199 --> 00:42:45.559
<v Speaker 3>on board. It's mature, it's good it's ready, use it go.

795
00:42:46.079 --> 00:42:49.519
<v Speaker 3>But as something for storing, you know, you've got what

796
00:42:49.639 --> 00:42:53.719
<v Speaker 3>sixty four bytes of arbitrary data you can store, and yeah,

797
00:42:53.760 --> 00:42:54.880
<v Speaker 3>it's easy to overwrite that.

798
00:42:56.360 --> 00:42:58.800
<v Speaker 4>Yeah, I mean to be honest, I've not encountered a

799
00:42:58.840 --> 00:43:01.760
<v Speaker 4>situation where that happened, but it's it's good to know

800
00:43:01.840 --> 00:43:04.880
<v Speaker 4>about that, and for that reason, it like, I think

801
00:43:04.920 --> 00:43:06.960
<v Speaker 4>the bigger issue is actually still that a lot of

802
00:43:07.039 --> 00:43:10.679
<v Speaker 4>people just aren't familiar with them, and for that reason alone,

803
00:43:10.800 --> 00:43:13.000
<v Speaker 4>it's it's like an ago for a lot of apps.

804
00:43:13.400 --> 00:43:15.159
<v Speaker 4>I think there is a bit of an overlap here

805
00:43:15.159 --> 00:43:17.719
<v Speaker 4>where like if someone really wants to build an end

806
00:43:17.760 --> 00:43:20.840
<v Speaker 4>to and encrypted app, probably they could. That's the kind

807
00:43:20.880 --> 00:43:23.599
<v Speaker 4>of app where the users would know how to use passkeys.

808
00:43:24.079 --> 00:43:28.400
<v Speaker 4>But right now, yeah, that's that's just something that we offer.

809
00:43:28.960 --> 00:43:31.239
<v Speaker 4>Most people want like a more traditional method.

810
00:43:31.280 --> 00:43:34.719
<v Speaker 3>Anyways, Well, I think it's great and I love the

811
00:43:34.760 --> 00:43:36.880
<v Speaker 3>way that it's being implemented and rolled out across the

812
00:43:36.920 --> 00:43:39.400
<v Speaker 3>industry right now. It's very seamless. I mean typically the

813
00:43:39.440 --> 00:43:41.840
<v Speaker 3>way that it's happening is you just do your normal

814
00:43:41.920 --> 00:43:43.920
<v Speaker 3>sign in and then it pops up and says, you know,

815
00:43:44.599 --> 00:43:48.039
<v Speaker 3>use Windows Hello, or use face ID and so a

816
00:43:48.039 --> 00:43:50.559
<v Speaker 3>lot of people are using passkeys without even knowing that

817
00:43:50.599 --> 00:43:53.920
<v Speaker 3>they're using passkeys because they've already been seeing it on

818
00:43:53.960 --> 00:43:56.159
<v Speaker 3>their phone, they've already been seen it on the Windows computer,

819
00:43:56.639 --> 00:43:58.760
<v Speaker 3>and then it just pops up in their browser like, oh, okay,

820
00:43:58.760 --> 00:44:00.360
<v Speaker 3>it's the same thing I've been doing for the last

821
00:44:00.400 --> 00:44:01.480
<v Speaker 3>five years on my phone.

822
00:44:02.079 --> 00:44:06.760
<v Speaker 4>Totally. Maybe that's what's nice, yeah, exactly, but people are

823
00:44:06.800 --> 00:44:09.719
<v Speaker 4>getting familiar with it. What's nice about Jazz is like

824
00:44:09.719 --> 00:44:12.760
<v Speaker 4>I mentioned that the ofth providers are pluggable and jazz,

825
00:44:12.800 --> 00:44:16.360
<v Speaker 4>and therefore your app really only cares about the account

826
00:44:16.360 --> 00:44:19.400
<v Speaker 4>and the keypair. So you can totally start building your

827
00:44:19.440 --> 00:44:23.000
<v Speaker 4>app against Like with one off provider, later on switch

828
00:44:23.039 --> 00:44:26.320
<v Speaker 4>them and change absolutely nothing inside your app. You can

829
00:44:26.360 --> 00:44:30.440
<v Speaker 4>also offer your app to like enterprises with weird custom

830
00:44:30.480 --> 00:44:32.719
<v Speaker 4>as his own needs or whatever, and nothing about your

831
00:44:32.760 --> 00:44:36.239
<v Speaker 4>app's logic around how accounts work, how teams and permissions

832
00:44:36.239 --> 00:44:40.199
<v Speaker 4>work has to change, which is something really nice because

833
00:44:40.760 --> 00:44:43.960
<v Speaker 4>usually this is a huge topic and your like permission

834
00:44:43.960 --> 00:44:46.199
<v Speaker 4>model in your back end is very tightly coupled to

835
00:44:46.320 --> 00:44:48.679
<v Speaker 4>kind of the off provider that you choose to use.

836
00:44:50.079 --> 00:44:52.239
<v Speaker 3>So do you have a back office for this to

837
00:44:52.400 --> 00:44:56.320
<v Speaker 3>manage things like a UI by which a person who's

838
00:44:56.360 --> 00:45:01.440
<v Speaker 3>administrating an application can get access to what permissions exist

839
00:45:01.519 --> 00:45:03.199
<v Speaker 3>and what groups exist and such.

840
00:45:06.159 --> 00:45:08.280
<v Speaker 4>Kind of. But we want to do a lot better there.

841
00:45:08.360 --> 00:45:10.800
<v Speaker 4>So there is something called the Jazz inspector, which is

842
00:45:12.000 --> 00:45:14.400
<v Speaker 4>if you have to keep it for an account, you

843
00:45:14.480 --> 00:45:16.679
<v Speaker 4>can kind of remotely look into all of the state

844
00:45:16.760 --> 00:45:19.480
<v Speaker 4>that's in that account. Again, because of all permissions work

845
00:45:20.880 --> 00:45:23.800
<v Speaker 4>as opposed to traditional database where admins can just see

846
00:45:23.840 --> 00:45:26.880
<v Speaker 4>all the data. Ever, by default, in Jazz the user

847
00:45:26.960 --> 00:45:29.119
<v Speaker 4>kind of has to opt into letting you look into

848
00:45:29.159 --> 00:45:31.840
<v Speaker 4>their account. But if they do that, and you might

849
00:45:31.880 --> 00:45:34.599
<v Speaker 4>even hardcode into your app that that happens by default.

850
00:45:35.119 --> 00:45:37.960
<v Speaker 4>A typical pattern in apps that want the more traditional

851
00:45:38.039 --> 00:45:41.320
<v Speaker 4>permission model is that they just create an admin account

852
00:45:41.320 --> 00:45:44.360
<v Speaker 4>that admins have, that the server worker has, and every

853
00:45:44.639 --> 00:45:48.159
<v Speaker 4>user automatically invites that to all of their groups and

854
00:45:48.199 --> 00:45:50.559
<v Speaker 4>then you get like this access pattern that's very similar

855
00:45:50.599 --> 00:45:54.039
<v Speaker 4>where you can just see all your users data. But

856
00:45:54.800 --> 00:45:57.559
<v Speaker 4>we yeah, so that's kind of the mechanics of it.

857
00:45:57.639 --> 00:45:59.960
<v Speaker 4>What we're working on right now is kind of make

858
00:46:00.199 --> 00:46:02.480
<v Speaker 4>that a more full fledged browser. For example, if you

859
00:46:02.599 --> 00:46:05.400
<v Speaker 4>use jazz cloud as a service and you create an

860
00:46:05.400 --> 00:46:07.599
<v Speaker 4>app in there, and people start creating objects on their

861
00:46:07.639 --> 00:46:10.599
<v Speaker 4>clients that like if they opt in, or if you

862
00:46:10.760 --> 00:46:13.320
<v Speaker 4>enable the default opt in, you can very nicely browse

863
00:46:13.360 --> 00:46:15.199
<v Speaker 4>that as if you were looking at like a database

864
00:46:15.239 --> 00:46:16.519
<v Speaker 4>you high basically.

865
00:46:18.280 --> 00:46:23.039
<v Speaker 3>So that's that's actually really interesting. I mean, I think

866
00:46:23.079 --> 00:46:25.960
<v Speaker 3>that the reason most people develop apps is because they

867
00:46:26.039 --> 00:46:29.960
<v Speaker 3>want to aggregate user data so that they can manipulate

868
00:46:30.000 --> 00:46:33.159
<v Speaker 3>it or sell it in some way. So the idea

869
00:46:33.280 --> 00:46:37.360
<v Speaker 3>that by default the user data is private, I mean

870
00:46:37.360 --> 00:46:40.960
<v Speaker 3>that seems like that appeals to a very niche set

871
00:46:41.000 --> 00:46:45.719
<v Speaker 3>of applications, you know, like Telegram, some maybe some cryptocurrency wallets.

872
00:46:46.719 --> 00:46:50.320
<v Speaker 3>But I mean, don't don't most people that build apps

873
00:46:50.400 --> 00:46:53.280
<v Speaker 3>don't they want you know, like even Slack right in Discord,

874
00:46:53.400 --> 00:46:55.760
<v Speaker 3>like they get to see all the messages, you know,

875
00:46:55.920 --> 00:46:59.199
<v Speaker 3>Like with Discord, all the messages are visible by the

876
00:46:59.239 --> 00:47:02.119
<v Speaker 3>Discord admins. They get to train AI on them that

877
00:47:02.239 --> 00:47:05.880
<v Speaker 3>you know, and say, like with Slack, anybody on the

878
00:47:05.920 --> 00:47:08.159
<v Speaker 3>Slack team can look at any of the messages. Anybody

879
00:47:08.159 --> 00:47:11.079
<v Speaker 3>who is an admin of your Slack group can look

880
00:47:11.079 --> 00:47:13.880
<v Speaker 3>at all the messages. And that's I mean, that's generally

881
00:47:13.880 --> 00:47:17.519
<v Speaker 3>considered a feature, not a bug. Although i personally like

882
00:47:17.599 --> 00:47:20.719
<v Speaker 3>what you're saying, I personally am on board with, yeah,

883
00:47:21.039 --> 00:47:25.239
<v Speaker 3>encrypt my data, but you know, like, is this what

884
00:47:25.320 --> 00:47:26.519
<v Speaker 3>you think the market wants?

885
00:47:27.639 --> 00:47:30.960
<v Speaker 4>So like, pessimistically, I agree with your statement that you

886
00:47:31.119 --> 00:47:33.599
<v Speaker 4>just made, and this is why. Like again, to be precise,

887
00:47:33.679 --> 00:47:37.400
<v Speaker 4>it's like it's the default on a protocol level that

888
00:47:37.519 --> 00:47:40.840
<v Speaker 4>everything is encrypted, and what that means is that you

889
00:47:40.920 --> 00:47:44.760
<v Speaker 4>can just as easily build that the same trusted model

890
00:47:44.800 --> 00:47:47.039
<v Speaker 4>where the a provider can see all the data you

891
00:47:47.079 --> 00:47:49.840
<v Speaker 4>put in there. The only difference is that this trust

892
00:47:49.880 --> 00:47:54.960
<v Speaker 4>relationship is now explicit and verifiable, if that makes sense.

893
00:47:55.519 --> 00:47:57.519
<v Speaker 4>And in this case, even like you would be like

894
00:47:57.559 --> 00:48:00.880
<v Speaker 4>sure like Slack, if Slack to or decided to use

895
00:48:00.960 --> 00:48:04.119
<v Speaker 4>Jazz for whatever reason, you'd be like, sure, Jazz, Slack

896
00:48:04.199 --> 00:48:06.840
<v Speaker 4>admins can see all the data in my team. But

897
00:48:07.039 --> 00:48:10.519
<v Speaker 4>like Garden Computing, who's running the Jazz service count that's

898
00:48:10.519 --> 00:48:12.679
<v Speaker 4>already an improvement, right, and it still gives you, as

899
00:48:12.719 --> 00:48:15.599
<v Speaker 4>the app developer, all the freedoms and flexibility that you

900
00:48:15.719 --> 00:48:21.440
<v Speaker 4>had before. Interestingly, if you care about analytics type data,

901
00:48:23.199 --> 00:48:26.480
<v Speaker 4>you get much more high fidelity analytics out of Jazz

902
00:48:26.800 --> 00:48:30.480
<v Speaker 4>by default, because everything, every object has the full history,

903
00:48:30.880 --> 00:48:34.480
<v Speaker 4>so without instrumenting your app in anyway or registering any

904
00:48:34.519 --> 00:48:38.280
<v Speaker 4>custom events. Just in the in the dashboard is the

905
00:48:38.320 --> 00:48:40.559
<v Speaker 4>way we'll expose it to is you can see like, oh,

906
00:48:40.599 --> 00:48:43.280
<v Speaker 4>these five users from like these cities are working together

907
00:48:43.320 --> 00:48:45.960
<v Speaker 4>on this object right now, or like this has been

908
00:48:46.000 --> 00:48:49.360
<v Speaker 4>really hot over the last week, and these teams are

909
00:48:49.360 --> 00:48:53.159
<v Speaker 4>collaborating like that in a like way that that schema

910
00:48:53.239 --> 00:48:55.800
<v Speaker 4>aware of what the objects in your app are, and

911
00:48:55.920 --> 00:48:57.920
<v Speaker 4>you get that for free just by like writing to

912
00:48:57.960 --> 00:49:01.840
<v Speaker 4>the objects basically, So in that sense, it's almost gives

913
00:49:01.880 --> 00:49:04.440
<v Speaker 4>you more data that you can exploit as an app developer.

914
00:49:04.719 --> 00:49:07.719
<v Speaker 4>It's again just that the trust relationship is now explicit.

915
00:49:09.800 --> 00:49:12.440
<v Speaker 3>So one thing you mentioned there the schema is how

916
00:49:12.480 --> 00:49:14.079
<v Speaker 3>do you handle the migrations?

917
00:49:15.320 --> 00:49:18.840
<v Speaker 4>This is literally the hardest question of local first, and

918
00:49:18.920 --> 00:49:22.440
<v Speaker 4>anyone who's building a local first framework or something like

919
00:49:22.480 --> 00:49:27.039
<v Speaker 4>that will tell you that. And that's like local first

920
00:49:27.119 --> 00:49:29.119
<v Speaker 4>in general is like it makes a lot of things

921
00:49:29.119 --> 00:49:31.599
<v Speaker 4>that used to be really hard really simple, and it

922
00:49:31.679 --> 00:49:33.840
<v Speaker 4>makes some things that used to be really simple a

923
00:49:33.840 --> 00:49:37.079
<v Speaker 4>bit awkward. And migrations is maybe the most awkward thing

924
00:49:37.119 --> 00:49:42.480
<v Speaker 4>because you're now basically confronted with distributed migrations like different

925
00:49:42.519 --> 00:49:45.840
<v Speaker 4>clients might update you up at different times but still

926
00:49:45.840 --> 00:49:49.440
<v Speaker 4>interact with each other at the same time. It's a

927
00:49:49.440 --> 00:49:51.920
<v Speaker 4>tricky problem. In what we've found so far is the

928
00:49:52.280 --> 00:49:54.920
<v Speaker 4>best thing to do is to just change your mindset

929
00:49:54.960 --> 00:49:58.679
<v Speaker 4>a little bit where you can't treat migrations anymore as

930
00:49:58.760 --> 00:50:01.800
<v Speaker 4>does like stop the world, will change everything to this

931
00:50:01.880 --> 00:50:04.960
<v Speaker 4>new thing and then continue the database. You have to

932
00:50:05.000 --> 00:50:08.519
<v Speaker 4>treat it more as like protocol evolution, where you can

933
00:50:08.559 --> 00:50:12.280
<v Speaker 4>only ever add new fields basically, and if you've built

934
00:50:13.719 --> 00:50:16.519
<v Speaker 4>graph ql APIs that should be familiar to you. If

935
00:50:16.559 --> 00:50:19.440
<v Speaker 4>you've done anything with proto buffs, that's kind of best

936
00:50:19.480 --> 00:50:24.280
<v Speaker 4>practices there where in these cases you also expect clients

937
00:50:25.239 --> 00:50:27.960
<v Speaker 4>with the old schemer interacting with you, So if you

938
00:50:28.039 --> 00:50:32.599
<v Speaker 4>follow that same model, you'll be fine. And because it.

939
00:50:35.039 --> 00:50:37.239
<v Speaker 3>Is there a way to expire data that's too old,

940
00:50:37.239 --> 00:50:39.199
<v Speaker 3>like if the data is more than three months old,

941
00:50:39.360 --> 00:50:40.159
<v Speaker 3>just expire it.

942
00:50:41.800 --> 00:50:44.519
<v Speaker 4>That's that's a separate topic, which is deletion, which is

943
00:50:44.559 --> 00:50:48.440
<v Speaker 4>also interesting because it local first, and I think jazz

944
00:50:48.440 --> 00:50:51.360
<v Speaker 4>in particularly kind of takes a like soft delete stance

945
00:50:51.400 --> 00:50:55.159
<v Speaker 4>by default because you keep all the history. Anyways, most

946
00:50:55.199 --> 00:50:56.760
<v Speaker 4>of the time you just want to soft the lead.

947
00:50:57.199 --> 00:51:01.719
<v Speaker 4>Now there are cases where, for regulary reasons or because

948
00:51:01.760 --> 00:51:04.320
<v Speaker 4>it's really a lot of data, you want to delete

949
00:51:04.360 --> 00:51:06.760
<v Speaker 4>things permanently, and you are able to do that. You

950
00:51:06.800 --> 00:51:09.840
<v Speaker 4>basically you mark the object as deleted, and every client

951
00:51:09.840 --> 00:51:11.840
<v Speaker 4>and the sinking back will actually delete it.

952
00:51:12.679 --> 00:51:16.239
<v Speaker 3>That's not what I meant, Okay, although I'm glad you

953
00:51:16.280 --> 00:51:20.360
<v Speaker 3>answered that question too. What I mean is, like all

954
00:51:20.400 --> 00:51:22.800
<v Speaker 3>of us that are developing web apps, we all come

955
00:51:22.840 --> 00:51:27.760
<v Speaker 3>into this case where we change some property that's you know,

956
00:51:27.840 --> 00:51:30.039
<v Speaker 3>I think one of the one of the probably more

957
00:51:30.079 --> 00:51:32.199
<v Speaker 3>common ones is if you change anything that's in a

958
00:51:32.199 --> 00:51:35.800
<v Speaker 3>cookie because cookies last forever, right, or you change you

959
00:51:35.960 --> 00:51:39.639
<v Speaker 3>change some object that can exist out in the wild

960
00:51:39.679 --> 00:51:41.400
<v Speaker 3>that's maybe not part of the scheme, as just an

961
00:51:41.440 --> 00:51:44.840
<v Speaker 3>ad hoc object, and then you get this problem where

962
00:51:44.960 --> 00:51:48.559
<v Speaker 3>this user calls in and they can't log in, or

963
00:51:49.239 --> 00:51:51.920
<v Speaker 3>at least they don't have the experience of logging. Maybe

964
00:51:51.920 --> 00:51:55.000
<v Speaker 3>the authentication process succeeds, but their app is just like

965
00:51:55.079 --> 00:51:57.880
<v Speaker 3>stuck in this error state. And then the only way

966
00:51:57.920 --> 00:51:59.639
<v Speaker 3>to solve it is that you have to clear out

967
00:51:59.679 --> 00:52:03.079
<v Speaker 3>the cab because there's some little property where it's triggering

968
00:52:03.079 --> 00:52:05.960
<v Speaker 3>an education your app where it's like if this, then

969
00:52:06.000 --> 00:52:08.159
<v Speaker 3>do that, and so it passes the first check, and

970
00:52:08.159 --> 00:52:10.800
<v Speaker 3>then it's you know, if that, then do this, and

971
00:52:10.800 --> 00:52:12.840
<v Speaker 3>then it fails and it's in this limbo state that

972
00:52:12.880 --> 00:52:15.800
<v Speaker 3>you didn't expect because some user that logged in three

973
00:52:15.840 --> 00:52:18.360
<v Speaker 3>months ago that still has some local object in local

974
00:52:18.400 --> 00:52:21.480
<v Speaker 3>storage related to how the off object used to look

975
00:52:21.559 --> 00:52:23.719
<v Speaker 3>like or how their profile object used to look like.

976
00:52:24.639 --> 00:52:27.079
<v Speaker 3>It's the new version of the application code, and it

977
00:52:27.119 --> 00:52:30.119
<v Speaker 3>can't like it can't regulate itself, right, like you know

978
00:52:30.159 --> 00:52:31.280
<v Speaker 3>what I'm talking about.

979
00:52:31.800 --> 00:52:34.760
<v Speaker 4>I think so, But I think if you follow that

980
00:52:34.960 --> 00:52:39.880
<v Speaker 4>principle strictly of only adding stuff that shouldn't happen, you

981
00:52:39.960 --> 00:52:43.800
<v Speaker 4>might make mistakes. Obviously, you might make mistakes. And so

982
00:52:44.159 --> 00:52:47.280
<v Speaker 4>your question is mostly like what if a migration is broken?

983
00:52:47.599 --> 00:52:47.800
<v Speaker 2>Right?

984
00:52:49.119 --> 00:52:53.960
<v Speaker 3>Yeah, like is there a well it more it's it's like,

985
00:52:54.000 --> 00:52:56.480
<v Speaker 3>I want to fail safe, right, So so one of

986
00:52:56.559 --> 00:52:59.400
<v Speaker 3>the things, you know, Yes, it would be great if

987
00:52:59.679 --> 00:53:02.480
<v Speaker 3>if we were more perfect coders, and I want that,

988
00:53:02.599 --> 00:53:04.639
<v Speaker 3>and I want people to be more delivered in their

989
00:53:04.679 --> 00:53:08.480
<v Speaker 3>decisions and to be more mindful of you know, what

990
00:53:08.599 --> 00:53:11.480
<v Speaker 3>state they're storing in local storage or INDEXDB or their

991
00:53:11.559 --> 00:53:14.320
<v Speaker 3>database or whatever. It is the reality of the situation

992
00:53:14.400 --> 00:53:17.960
<v Speaker 3>is most people are not that mindful, and everyone makes mistakes,

993
00:53:18.760 --> 00:53:22.760
<v Speaker 3>and so when when like one fails safe to have that,

994
00:53:22.920 --> 00:53:24.559
<v Speaker 3>Like I just working with a buddy on a project,

995
00:53:24.599 --> 00:53:27.039
<v Speaker 3>I said, okay, if you get a four to oh one,

996
00:53:28.159 --> 00:53:31.039
<v Speaker 3>clear out all the data and log the user out.

997
00:53:31.199 --> 00:53:33.960
<v Speaker 3>If you get a five hundred, clear out all the

998
00:53:34.039 --> 00:53:36.599
<v Speaker 3>data and log the user out. Because we're trying to

999
00:53:36.639 --> 00:53:39.000
<v Speaker 3>build this in a way that we actually don't have errors.

1000
00:53:39.400 --> 00:53:42.159
<v Speaker 3>But if we do encounter an error, we just want

1001
00:53:42.159 --> 00:53:44.840
<v Speaker 3>to say, okay, wipe out all of the local state

1002
00:53:45.039 --> 00:53:46.760
<v Speaker 3>so that we don't end up in a loop where

1003
00:53:46.800 --> 00:53:48.920
<v Speaker 3>the person's trying to log in but because they had

1004
00:53:48.920 --> 00:53:51.039
<v Speaker 3>a you know, that's the kind of thing I'm saying

1005
00:53:51.159 --> 00:53:53.639
<v Speaker 3>is providing a fail safe to say, hey, if the

1006
00:53:53.760 --> 00:53:58.480
<v Speaker 3>version has triggered from three to twenty seven, that's more

1007
00:53:58.519 --> 00:54:01.480
<v Speaker 3>than three version changes, So just wipe out all the

1008
00:54:01.519 --> 00:54:02.079
<v Speaker 3>local state.

1009
00:54:03.320 --> 00:54:05.679
<v Speaker 4>So that's actually like a move that you would be

1010
00:54:05.719 --> 00:54:11.199
<v Speaker 4>able to do in a migration, where like and again

1011
00:54:11.239 --> 00:54:14.760
<v Speaker 4>to be precise here, the migrations are a framework feature,

1012
00:54:15.079 --> 00:54:18.800
<v Speaker 4>not a protocol feature. Right, the protocol just gives you

1013
00:54:18.920 --> 00:54:24.360
<v Speaker 4>persistent arbitrary jason. Basically that you can collaborate on the

1014
00:54:24.480 --> 00:54:27.800
<v Speaker 4>migrations is just one part where you can modify, like

1015
00:54:27.920 --> 00:54:33.639
<v Speaker 4>one place where you can modify these objects. So and

1016
00:54:33.760 --> 00:54:36.360
<v Speaker 4>right now we take this wild West approach where we're like,

1017
00:54:36.400 --> 00:54:38.960
<v Speaker 4>you can literally do whatever in a migration. You can

1018
00:54:39.079 --> 00:54:41.760
<v Speaker 4>mutate the objects any way you want, and it's up

1019
00:54:41.800 --> 00:54:44.920
<v Speaker 4>to you to follow these best principles. But that also

1020
00:54:44.960 --> 00:54:48.639
<v Speaker 4>means that if you botch something or there's some weird

1021
00:54:48.920 --> 00:54:51.920
<v Speaker 4>unexpected edge case that you didn't think about, you can

1022
00:54:51.960 --> 00:54:55.119
<v Speaker 4>after the fact just be like, look, if the state

1023
00:54:55.280 --> 00:54:57.760
<v Speaker 4>that we're getting at the beginning of the migration doesn't

1024
00:54:57.760 --> 00:55:01.440
<v Speaker 4>look like any of these standard steps that we take

1025
00:55:01.440 --> 00:55:04.559
<v Speaker 4>in the happy path, just you know, just throw it away,

1026
00:55:04.639 --> 00:55:07.039
<v Speaker 4>like whatever, that's something that you can do in a

1027
00:55:07.159 --> 00:55:07.920
<v Speaker 4>jazz migration.

1028
00:55:09.320 --> 00:55:12.159
<v Speaker 1>Yeah, I was thinking something more along the lines of,

1029
00:55:12.840 --> 00:55:17.840
<v Speaker 1>you know, let's say that I was putting some data

1030
00:55:17.920 --> 00:55:20.119
<v Speaker 1>into these data objects that I.

1031
00:55:20.159 --> 00:55:22.800
<v Speaker 2>Found out, Oh, under.

1032
00:55:22.599 --> 00:55:26.719
<v Speaker 1>This regulation for the field I'm in, right, I'm not

1033
00:55:26.760 --> 00:55:29.639
<v Speaker 1>supposed to store the credit card number, right. I think

1034
00:55:29.760 --> 00:55:32.679
<v Speaker 1>I think we all generally know this, but yeah, you know,

1035
00:55:33.280 --> 00:55:36.119
<v Speaker 1>or you know, I have some you know under HIPPA

1036
00:55:36.239 --> 00:55:39.960
<v Speaker 1>or some of the other GDPR or whatever. Right this

1037
00:55:39.960 --> 00:55:43.960
<v Speaker 1>this is the kind of personally identifiable information that I've

1038
00:55:43.960 --> 00:55:47.280
<v Speaker 1>got to be like extra and especially careful with, and

1039
00:55:47.320 --> 00:55:51.239
<v Speaker 1>so having it on a local storage, you know, maybe

1040
00:55:51.280 --> 00:55:53.559
<v Speaker 1>maybe that you know, for whatever reason, I have to

1041
00:55:53.599 --> 00:55:56.400
<v Speaker 1>have in some kind of controlled back end, and so

1042
00:55:56.519 --> 00:55:58.480
<v Speaker 1>I'm just gonna have to, you know, do end runs

1043
00:55:58.519 --> 00:56:00.400
<v Speaker 1>to the server for that kind of a thing. Everything

1044
00:56:00.400 --> 00:56:05.679
<v Speaker 1>else I can run local first, right, And so yeah,

1045
00:56:05.760 --> 00:56:06.719
<v Speaker 1>I'm thinking in that.

1046
00:56:06.599 --> 00:56:10.039
<v Speaker 2>Case, I may have a migration that says, hey, wipe

1047
00:56:10.119 --> 00:56:12.480
<v Speaker 2>out all of this, right, and it'd be nice.

1048
00:56:12.320 --> 00:56:14.800
<v Speaker 1>If I could do it on like a you know,

1049
00:56:14.840 --> 00:56:17.320
<v Speaker 1>it's like this object is migrating to this new version,

1050
00:56:17.320 --> 00:56:19.679
<v Speaker 1>and so therefore just forget all of the credit card

1051
00:56:19.760 --> 00:56:22.119
<v Speaker 1>numbers rather than wipe out all of.

1052
00:56:22.039 --> 00:56:23.880
<v Speaker 4>The oh yeah, yeah, sure.

1053
00:56:23.920 --> 00:56:25.719
<v Speaker 2>Or whatever outlet, right, something like that.

1054
00:56:28.360 --> 00:56:30.920
<v Speaker 4>Okay, this is going to be a bit confusing because

1055
00:56:30.920 --> 00:56:33.280
<v Speaker 4>I wanted to talk about something related, but yours is

1056
00:56:33.360 --> 00:56:35.639
<v Speaker 4>kind of like almost the worst case. And then your case,

1057
00:56:35.679 --> 00:56:38.559
<v Speaker 4>what you would do is exactly like you would do

1058
00:56:38.639 --> 00:56:43.079
<v Speaker 4>like a patch up migration that actually does hard deletes, right, yeah,

1059
00:56:43.119 --> 00:56:45.800
<v Speaker 4>and that's something that you'll be able to do as well.

1060
00:56:46.880 --> 00:56:50.519
<v Speaker 4>Most of the times you would do a patch up

1061
00:56:50.559 --> 00:56:55.239
<v Speaker 4>migration that does soft deletes, right. And what's nice about that,

1062
00:56:55.320 --> 00:56:57.519
<v Speaker 4>by the way, is that if if you mess up

1063
00:56:57.519 --> 00:57:00.480
<v Speaker 4>the patch migration as well, which trust me I've done

1064
00:57:00.559 --> 00:57:05.719
<v Speaker 4>many times, and you can unsoft deleted and you can

1065
00:57:05.760 --> 00:57:08.920
<v Speaker 4>look at the whole history of botch patch migrations that

1066
00:57:09.000 --> 00:57:11.440
<v Speaker 4>happen to it and find something useful somewhere in there,

1067
00:57:11.639 --> 00:57:14.079
<v Speaker 4>because that's what you do with the traditional database, right,

1068
00:57:14.320 --> 00:57:16.599
<v Speaker 4>You try your best to write reasonable migrations. If they

1069
00:57:16.679 --> 00:57:20.440
<v Speaker 4>utterly fail, you roll back or you write more migrations

1070
00:57:20.440 --> 00:57:23.239
<v Speaker 4>against it, and you do the same on a local level.

1071
00:57:25.280 --> 00:57:29.000
<v Speaker 4>But yeah, I mean so far, I'm always honest, and

1072
00:57:29.039 --> 00:57:30.960
<v Speaker 4>I'm like, look, this is the trickiest part. This is

1073
00:57:31.000 --> 00:57:33.920
<v Speaker 4>the scariest part. So far, everyone who has built apps

1074
00:57:34.320 --> 00:57:38.320
<v Speaker 4>which jazz has been able to write these migrations correctly,

1075
00:57:38.360 --> 00:57:40.840
<v Speaker 4>even though we provide no guardrails. Yet. We're kind of

1076
00:57:40.840 --> 00:57:42.760
<v Speaker 4>in a stage where we're like, we give you all

1077
00:57:42.800 --> 00:57:44.559
<v Speaker 4>the tools and we wait for, like, what are the

1078
00:57:44.599 --> 00:57:47.360
<v Speaker 4>best practices around how to do migrations, and then introduce

1079
00:57:47.440 --> 00:57:50.360
<v Speaker 4>guardrails on a framework level. But so far it hasn't

1080
00:57:50.360 --> 00:57:52.880
<v Speaker 4>been an issue, despite these people changing their apps around

1081
00:57:52.960 --> 00:57:54.519
<v Speaker 4>quite a lot as they iterate on them.

1082
00:57:55.440 --> 00:57:59.639
<v Speaker 1>Right, Yeah, I wanted to because we're already almost at

1083
00:57:59.639 --> 00:58:04.719
<v Speaker 1>an hour. We try and keep these to an hour

1084
00:58:04.840 --> 00:58:07.239
<v Speaker 1>maybe a little more. We tend to go over the network.

1085
00:58:07.840 --> 00:58:12.039
<v Speaker 1>But anyway, one thing that I'm curious about then is

1086
00:58:12.480 --> 00:58:14.559
<v Speaker 1>AJ asked you, okay, you know, where is this.

1087
00:58:14.639 --> 00:58:16.800
<v Speaker 2>Not super well suited?

1088
00:58:17.119 --> 00:58:20.920
<v Speaker 1>What I'm curious about is, okay, so what kind of

1089
00:58:21.159 --> 00:58:25.199
<v Speaker 1>apps are people writing where you know, if they haven't

1090
00:58:25.199 --> 00:58:28.440
<v Speaker 1>figured it out already, they're going to be really well

1091
00:58:28.440 --> 00:58:30.239
<v Speaker 1>suited for this kind of a thing where they're going

1092
00:58:30.320 --> 00:58:32.960
<v Speaker 1>to look at it and go, oh, this solves a

1093
00:58:32.960 --> 00:58:35.960
<v Speaker 1>whole bunch of problems and makes my life easier as

1094
00:58:36.000 --> 00:58:37.239
<v Speaker 1>I developed this in the future.

1095
00:58:38.280 --> 00:58:41.400
<v Speaker 4>Right. So, what's fun about our current adults is that

1096
00:58:41.440 --> 00:58:44.039
<v Speaker 4>they're actually super diverse, and they're a good mix of

1097
00:58:44.079 --> 00:58:47.000
<v Speaker 4>like things that are obviously very good ideas local first too,

1098
00:58:47.119 --> 00:58:49.679
<v Speaker 4>like this is almost not local first at all. I

1099
00:58:49.679 --> 00:58:52.719
<v Speaker 4>can maybe very quickly mention some examples, but what it's

1100
00:58:52.800 --> 00:58:56.400
<v Speaker 4>best for right now is if you really care about

1101
00:58:56.440 --> 00:59:01.119
<v Speaker 4>a good offline first experience, if you want to build

1102
00:59:01.159 --> 00:59:04.519
<v Speaker 4>any kind of app that has collaboration, particularly if it's

1103
00:59:04.599 --> 00:59:07.400
<v Speaker 4>real time, but also if it's not real time, just

1104
00:59:07.519 --> 00:59:10.960
<v Speaker 4>like team abstractions, permissions, that sort of stuff way easier

1105
00:59:10.960 --> 00:59:14.519
<v Speaker 4>to express. Yeah, I think these are the ones where

1106
00:59:14.519 --> 00:59:18.519
<v Speaker 4>people get the most value out of jazz right now.

1107
00:59:18.719 --> 00:59:21.800
<v Speaker 4>And again, like what is jazz not good at? Honestly,

1108
00:59:21.840 --> 00:59:23.920
<v Speaker 4>the biggest thing right now is just like we're early

1109
00:59:24.920 --> 00:59:27.960
<v Speaker 4>documentation is lacking horribly. We're working on it. We're trying

1110
00:59:28.000 --> 00:59:31.599
<v Speaker 4>to patch that up by just providing good discord support basically,

1111
00:59:31.639 --> 00:59:35.519
<v Speaker 4>So that's the biggest thing. Like, if you really need it,

1112
00:59:35.880 --> 00:59:38.519
<v Speaker 4>you'll probably want to use it despite it having bad

1113
00:59:38.559 --> 00:59:41.760
<v Speaker 4>documentation for everything else, you probably only want to use

1114
00:59:41.760 --> 00:59:43.760
<v Speaker 4>it for an experiment to get familiar with it. That's

1115
00:59:43.840 --> 00:59:47.880
<v Speaker 4>kind of the main bottleneck right now. So in terms

1116
00:59:47.920 --> 00:59:49.880
<v Speaker 4>of the adopt is just to paint a picture. One

1117
00:59:49.880 --> 00:59:52.320
<v Speaker 4>of our earliest ones. They're building like an app for

1118
00:59:52.480 --> 00:59:56.400
<v Speaker 4>freelancers to collect invoices out of your cloud Flare, your

1119
00:59:56.400 --> 00:59:59.599
<v Speaker 4>AWS to then submit to tax authorities. But what they

1120
00:59:59.679 --> 01:00:02.719
<v Speaker 4>a is that actually locks into your AWS and your

1121
01:00:02.719 --> 01:00:04.679
<v Speaker 4>cloud Flare with you use the name of passwords, so

1122
01:00:04.719 --> 01:00:06.679
<v Speaker 4>you kind of you need to be able to trust

1123
01:00:06.679 --> 01:00:09.280
<v Speaker 4>that app as much as you would trust the password manager,

1124
01:00:09.840 --> 01:00:12.920
<v Speaker 4>and for them, obviously the whole permission and encryption thing

1125
01:00:14.119 --> 01:00:16.559
<v Speaker 4>was a godsend because they got all of that for free,

1126
01:00:17.039 --> 01:00:19.840
<v Speaker 4>and they wanted to just make it a single player

1127
01:00:19.880 --> 01:00:23.159
<v Speaker 4>experience in the beginning, just for individual freelancers. But because

1128
01:00:23.199 --> 01:00:25.559
<v Speaker 4>they build it with Jazz, they got like org features

1129
01:00:25.559 --> 01:00:27.599
<v Speaker 4>where you can invite someone from your team to also

1130
01:00:27.599 --> 01:00:30.559
<v Speaker 4>submit invoices by just adding a button basically, so this

1131
01:00:30.719 --> 01:00:36.079
<v Speaker 4>was like a very obvious fit. Maybe the most unobvious

1132
01:00:36.159 --> 01:00:41.320
<v Speaker 4>fit was a guy who's building a kind of social

1133
01:00:41.320 --> 01:00:43.880
<v Speaker 4>network with his team. It's called learn Anything, like a

1134
01:00:44.079 --> 01:00:46.639
<v Speaker 4>learn minus anything that xyz I think is the domain.

1135
01:00:47.320 --> 01:00:49.840
<v Speaker 4>It's like a mix between Reddit and quorra, kind of

1136
01:00:49.880 --> 01:00:52.800
<v Speaker 4>like a learning social network where you can be like, oh,

1137
01:00:52.840 --> 01:00:55.039
<v Speaker 4>I want to learn how to play the guitar or

1138
01:00:55.079 --> 01:00:56.760
<v Speaker 4>I want to learn rust, and it will have like

1139
01:00:56.800 --> 01:01:01.039
<v Speaker 4>a community curated list of like tutorials, polls, videos, and

1140
01:01:01.079 --> 01:01:04.199
<v Speaker 4>so on. So that's still like very much like a

1141
01:01:04.239 --> 01:01:07.599
<v Speaker 4>social network part and they decided to base their entire

1142
01:01:07.679 --> 01:01:10.719
<v Speaker 4>app as Jazz. That's the only database. So in their case,

1143
01:01:11.280 --> 01:01:18.000
<v Speaker 4>Jazz actually serves these initially static pages of content, and

1144
01:01:18.039 --> 01:01:21.079
<v Speaker 4>they already get like millions of visitors per week because

1145
01:01:21.079 --> 01:01:24.679
<v Speaker 4>they've got good SEO, so it's really stressing Jazz in

1146
01:01:24.719 --> 01:01:26.880
<v Speaker 4>a way that's not local firsts at all. It just

1147
01:01:26.920 --> 01:01:30.079
<v Speaker 4>takes a traditional back end database role. But then as

1148
01:01:30.079 --> 01:01:32.599
<v Speaker 4>a user, like probably in the beginning, you're just passive,

1149
01:01:32.639 --> 01:01:34.199
<v Speaker 4>but then you're like, oh, I want to start learning

1150
01:01:34.239 --> 01:01:37.239
<v Speaker 4>this and then track your progress as you read different articles.

1151
01:01:37.519 --> 01:01:39.079
<v Speaker 4>You can take your own notes in there, and then

1152
01:01:39.119 --> 01:01:44.440
<v Speaker 4>it magically transforms into this local first experience where you

1153
01:01:44.519 --> 01:01:47.119
<v Speaker 4>start having your own personal data that's local and really

1154
01:01:47.159 --> 01:01:50.800
<v Speaker 4>fast to interact with. But because they build it with Jazz,

1155
01:01:50.840 --> 01:01:53.800
<v Speaker 4>they didn't have to glue together different systems that are

1156
01:01:53.840 --> 01:01:56.280
<v Speaker 4>good at either of these. They could just use Jazz

1157
01:01:56.320 --> 01:01:58.400
<v Speaker 4>to represent all the data they have, whether it's like

1158
01:01:58.400 --> 01:02:02.840
<v Speaker 4>this global data across US or individual user data. Okay,

1159
01:02:03.480 --> 01:02:05.639
<v Speaker 4>these are kind of the two best examples I can

1160
01:02:05.679 --> 01:02:08.519
<v Speaker 4>think of. If people are really interested, you can check

1161
01:02:08.519 --> 01:02:10.320
<v Speaker 4>out some of my other podcasts where I list a

1162
01:02:10.360 --> 01:02:12.800
<v Speaker 4>couple more. But for the sake of time, I think

1163
01:02:12.800 --> 01:02:14.679
<v Speaker 4>that that gives us a good contrast.

1164
01:02:16.880 --> 01:02:17.199
<v Speaker 2>Cool.

1165
01:02:20.320 --> 01:02:23.960
<v Speaker 1>So, if people want to start building apps with Jazz themselves,

1166
01:02:24.880 --> 01:02:26.719
<v Speaker 1>I mean, what's the best way to do it? Just

1167
01:02:26.960 --> 01:02:30.079
<v Speaker 1>NPM install it and then spin up an app?

1168
01:02:30.199 --> 01:02:31.239
<v Speaker 2>Or is there more to it?

1169
01:02:32.039 --> 01:02:36.280
<v Speaker 4>So? What would recommend Yeah, basically, but because there's so

1170
01:02:36.360 --> 01:02:39.719
<v Speaker 4>many new concepts, I would really encourage people go check

1171
01:02:39.760 --> 01:02:42.360
<v Speaker 4>out the homepage that kind of gives you a quick overview,

1172
01:02:42.960 --> 01:02:45.199
<v Speaker 4>have a look at the documentation that exists, but most

1173
01:02:45.199 --> 01:02:48.000
<v Speaker 4>importantly check out the example apps because these should cover

1174
01:02:48.199 --> 01:02:50.199
<v Speaker 4>a good ground of stuff that you can do with

1175
01:02:50.320 --> 01:02:53.119
<v Speaker 4>jazz and just explain the best way possible how to

1176
01:02:53.199 --> 01:02:55.559
<v Speaker 4>set it up, how to define your schema, how do

1177
01:02:55.599 --> 01:02:58.559
<v Speaker 4>you do stuff like image uploads and lots of fun

1178
01:02:58.599 --> 01:03:01.000
<v Speaker 4>stuff like that, and then if you have any questions,

1179
01:03:01.079 --> 01:03:04.000
<v Speaker 4>hop on the discord, because right now we're in a face,

1180
01:03:04.079 --> 01:03:05.960
<v Speaker 4>like I said, where we just we sit down together

1181
01:03:06.039 --> 01:03:09.719
<v Speaker 4>with people trying things with jazz, answer their questions or

1182
01:03:09.719 --> 01:03:12.679
<v Speaker 4>even help them build their apps because we learn a

1183
01:03:12.679 --> 01:03:16.039
<v Speaker 4>lot from that and it is kind of it works,

1184
01:03:16.079 --> 01:03:17.760
<v Speaker 4>and it works right away. The nice thing is it

1185
01:03:17.760 --> 01:03:19.400
<v Speaker 4>is quite a little set up if you decide to

1186
01:03:19.480 --> 01:03:22.639
<v Speaker 4>use jazz Cloud, because you just start a front end

1187
01:03:22.639 --> 01:03:26.920
<v Speaker 4>project essentially, and then for whenever you get stuck or

1188
01:03:26.960 --> 01:03:29.199
<v Speaker 4>you have questions how to best build something, just just

1189
01:03:29.280 --> 01:03:30.679
<v Speaker 4>coming ask us on the discord.

1190
01:03:31.880 --> 01:03:32.119
<v Speaker 2>Yeah.

1191
01:03:32.159 --> 01:03:34.440
<v Speaker 1>One other thing related to that is a lot of

1192
01:03:34.440 --> 01:03:39.199
<v Speaker 1>our listeners are already working in existing apps. Right, It's

1193
01:03:39.239 --> 01:03:42.239
<v Speaker 1>not like, oh, I've got the perfect greenfield project for this, right,

1194
01:03:42.800 --> 01:03:44.039
<v Speaker 1>I'm building this other thing.

1195
01:03:44.599 --> 01:03:45.519
<v Speaker 2>I'm already using.

1196
01:03:45.400 --> 01:03:48.599
<v Speaker 1>React or View or Angular or you know, just do

1197
01:03:48.880 --> 01:03:51.039
<v Speaker 1>APIs like AJU.

1198
01:03:51.280 --> 01:03:52.400
<v Speaker 2>You know, we're web APIs.

1199
01:03:52.440 --> 01:03:55.960
<v Speaker 1>And so if I'm looking at this and thinking, well,

1200
01:03:56.079 --> 01:03:58.199
<v Speaker 1>some of this sounds really nice for some of the

1201
01:03:58.239 --> 01:03:59.920
<v Speaker 1>features in my app, and then some of the other

1202
01:04:00.039 --> 01:04:01.679
<v Speaker 1>features in my app, yeah, I'm going to use the

1203
01:04:01.679 --> 01:04:05.800
<v Speaker 1>traditional back end because you know, it either already works

1204
01:04:06.000 --> 01:04:08.639
<v Speaker 1>or it seems like this is a clear win for

1205
01:04:08.760 --> 01:04:10.800
<v Speaker 1>just some of these other things. I want to add.

1206
01:04:11.760 --> 01:04:16.559
<v Speaker 1>My question is can you bring this in alongside the

1207
01:04:16.639 --> 01:04:20.159
<v Speaker 1>other stuff? Right, So let's say in an existing React

1208
01:04:20.159 --> 01:04:24.280
<v Speaker 1>app or view app and go, Okay, these components are

1209
01:04:24.320 --> 01:04:27.079
<v Speaker 1>going to use Jazz, these components are going to use

1210
01:04:27.119 --> 01:04:30.000
<v Speaker 1>my existing back end, and some of these components are

1211
01:04:30.039 --> 01:04:31.760
<v Speaker 1>going to do both, and maybe I have that server

1212
01:04:31.880 --> 01:04:33.199
<v Speaker 1>process running on the side.

1213
01:04:34.159 --> 01:04:36.800
<v Speaker 4>Yes, yes you can. In principle, and in terms of

1214
01:04:36.840 --> 01:04:39.599
<v Speaker 4>front end bindings, React a kind of first class. We

1215
01:04:39.800 --> 01:04:43.360
<v Speaker 4>just launched View and very fresh than experimental spelled as well,

1216
01:04:43.480 --> 01:04:45.360
<v Speaker 4>so that's not an issue and you can use it.

1217
01:04:45.400 --> 01:04:49.480
<v Speaker 4>From Plaine Jellascoop as well. Like I mentioned earlier, the

1218
01:04:49.559 --> 01:04:52.719
<v Speaker 4>biggest challenges in terms of like how does it interact

1219
01:04:52.719 --> 01:04:55.519
<v Speaker 4>with your potentially existing back in the state that you have.

1220
01:04:56.840 --> 01:04:59.719
<v Speaker 4>Easiest case is probably if the Jazz state and you'

1221
01:05:00.000 --> 01:05:02.519
<v Speaker 4>listing state is completely separate and you kind of only

1222
01:05:02.559 --> 01:05:06.559
<v Speaker 4>need to make it up just for the user identity,

1223
01:05:06.639 --> 01:05:10.119
<v Speaker 4>so you're existing all works with Jazz. It gets more

1224
01:05:10.159 --> 01:05:13.920
<v Speaker 4>tricky when it does need to put stuff into existing databases,

1225
01:05:14.199 --> 01:05:16.840
<v Speaker 4>which is possible, but again no documentation for it. We

1226
01:05:16.880 --> 01:05:19.480
<v Speaker 4>would need to help you with it. So to be honest,

1227
01:05:19.639 --> 01:05:21.960
<v Speaker 4>like right now, the people getting the most value out

1228
01:05:21.960 --> 01:05:25.079
<v Speaker 4>of Jazz are green field apps, but it is possible

1229
01:05:25.119 --> 01:05:27.519
<v Speaker 4>to build more complex stuff, and over time we'll have

1230
01:05:27.639 --> 01:05:30.719
<v Speaker 4>more patterns and examples of that for you to do

1231
01:05:30.800 --> 01:05:31.960
<v Speaker 4>that without any of our.

1232
01:05:31.840 --> 01:05:35.119
<v Speaker 1>Help, right, I mean, just to give you an example

1233
01:05:35.159 --> 01:05:37.760
<v Speaker 1>of something that I'm thinking about. So top end evs

1234
01:05:38.239 --> 01:05:41.920
<v Speaker 1>I'm building Essentially, I'm trying to take it from podcast

1235
01:05:41.960 --> 01:05:47.199
<v Speaker 1>network to you know, learning guided learning system, right, and

1236
01:05:47.239 --> 01:05:49.320
<v Speaker 1>so one of the things that I want to add

1237
01:05:49.440 --> 01:05:52.639
<v Speaker 1>is a community section where people can actually like chat

1238
01:05:52.760 --> 01:05:55.199
<v Speaker 1>or interact, you know something, but kind of like a

1239
01:05:55.239 --> 01:05:57.360
<v Speaker 1>forum or a chat room or something like that. And

1240
01:05:57.400 --> 01:06:00.079
<v Speaker 1>so I'm looking at Jazz and thinking, hey, you know this,

1241
01:06:00.079 --> 01:06:02.079
<v Speaker 1>this might be really nice. I don't have to figure

1242
01:06:02.079 --> 01:06:04.519
<v Speaker 1>out how to you know, web socket the thing through

1243
01:06:04.599 --> 01:06:07.639
<v Speaker 1>action cable on my rails back end, right, I can

1244
01:06:07.760 --> 01:06:10.199
<v Speaker 1>just you know, I can just put Jazz in on

1245
01:06:10.280 --> 01:06:16.280
<v Speaker 1>that piece, right, and it just kind of exists outside

1246
01:06:16.400 --> 01:06:19.440
<v Speaker 1>of the you know, the rest of the app, because

1247
01:06:19.440 --> 01:06:21.119
<v Speaker 1>the rest of the app, when I search, I don't

1248
01:06:21.159 --> 01:06:23.039
<v Speaker 1>need it to search the chat log. I just needed

1249
01:06:23.119 --> 01:06:27.039
<v Speaker 1>to search, you know, the other learning resources that I'm

1250
01:06:27.039 --> 01:06:28.039
<v Speaker 1>providing people.

1251
01:06:27.719 --> 01:06:30.920
<v Speaker 2>And so I couldn't conceivably do that.

1252
01:06:31.000 --> 01:06:33.840
<v Speaker 4>Right, Yeah, And that sounds like something that I'd love

1253
01:06:33.960 --> 01:06:36.360
<v Speaker 4>to help you build. And that's almost the ideal case

1254
01:06:36.400 --> 01:06:39.320
<v Speaker 4>of like a green field feature within an existing app

1255
01:06:39.320 --> 01:06:41.679
<v Speaker 4>that doesn't really interact too much with the app. So

1256
01:06:41.800 --> 01:06:44.360
<v Speaker 4>I think that that would be a very good case.

1257
01:06:45.000 --> 01:06:50.960
<v Speaker 1>Right, Okay, if people want to connect with you or

1258
01:06:51.079 --> 01:06:54.880
<v Speaker 1>learn more about you or Jazz, Jazz dot tools seems

1259
01:06:54.920 --> 01:06:59.360
<v Speaker 1>like a good place social media or something or GitHub.

1260
01:06:59.519 --> 01:07:02.480
<v Speaker 4>Yeah, I'm I'm a Anselm. I aw on Twitter and

1261
01:07:02.519 --> 01:07:05.280
<v Speaker 4>blue Sky and otherwise. If you want to know more

1262
01:07:05.320 --> 01:07:10.239
<v Speaker 4>about our company, check out garden dot com. Trying to

1263
01:07:10.239 --> 01:07:13.039
<v Speaker 4>be more active on Blue Sky with everything that seems

1264
01:07:13.079 --> 01:07:16.000
<v Speaker 4>like lots of developers are kind of congregating there, which

1265
01:07:16.000 --> 01:07:19.719
<v Speaker 4>I'm very happy about. And soon we'll start putting out

1266
01:07:19.760 --> 01:07:21.800
<v Speaker 4>blog posts and newsletters and so on.

1267
01:07:21.880 --> 01:07:22.840
<v Speaker 2>That's kind of where we're at.

1268
01:07:24.119 --> 01:07:27.760
<v Speaker 1>Yeah, yeah, it's it'll be interesting to see how that

1269
01:07:27.800 --> 01:07:28.320
<v Speaker 1>all goes.

1270
01:07:28.360 --> 01:07:32.199
<v Speaker 2>But yeah, I am seeing some movement that way, so yeah,

1271
01:07:32.320 --> 01:07:32.840
<v Speaker 2>makes sense.

1272
01:07:33.119 --> 01:07:35.920
<v Speaker 1>All right, Well, we're gonna go ahead and head into

1273
01:07:35.960 --> 01:07:37.480
<v Speaker 1>our picks section of the show.

1274
01:07:38.559 --> 01:07:41.079
<v Speaker 2>I'm gonna let AJ go first.

1275
01:07:42.440 --> 01:07:46.679
<v Speaker 3>All right, Well, I did not think that my wife

1276
01:07:46.679 --> 01:07:49.440
<v Speaker 3>would like Dune, but I loved it so much that

1277
01:07:49.480 --> 01:07:52.159
<v Speaker 3>I said, hey, honey, watch the show with me. You

1278
01:07:52.320 --> 01:07:55.400
<v Speaker 3>might not like it. She loved it. I couldn't believe

1279
01:07:55.400 --> 01:07:58.960
<v Speaker 3>it blew my mind. Of course, what she's talking about

1280
01:07:59.039 --> 01:08:01.960
<v Speaker 3>is not the story, like oh the sex were so beautiful,

1281
01:08:02.239 --> 01:08:05.239
<v Speaker 3>and oh that the camera angles were so nice. I'm like,

1282
01:08:06.800 --> 01:08:11.440
<v Speaker 3>what about like the army and like, I don't know,

1283
01:08:11.559 --> 01:08:13.320
<v Speaker 3>I don't know if she got anything out of the

1284
01:08:13.400 --> 01:08:15.320
<v Speaker 3>out of the movie like the rest of us did.

1285
01:08:15.400 --> 01:08:19.880
<v Speaker 3>But but yeah, so we're gonna we're gonna maybe watch

1286
01:08:20.359 --> 01:08:24.000
<v Speaker 3>part two together. I'm I'm thinking she might get the

1287
01:08:24.079 --> 01:08:27.600
<v Speaker 3>two film collection for me for for Christmas. So I'm

1288
01:08:27.680 --> 01:08:33.640
<v Speaker 3>I'm waiting to find out that before we do. But yeah,

1289
01:08:33.680 --> 01:08:36.399
<v Speaker 3>so all the dudes out there that uh, you know,

1290
01:08:36.600 --> 01:08:39.399
<v Speaker 3>you thought, yeah, I would never be able to get

1291
01:08:39.399 --> 01:08:42.119
<v Speaker 3>my wife to watch us with me. My wife is

1292
01:08:42.159 --> 01:08:44.720
<v Speaker 3>one of those wives. Okay, she wants me to watch

1293
01:08:44.720 --> 01:08:49.520
<v Speaker 3>Pride and Prejudice with her, and she I played Portal

1294
01:08:49.600 --> 01:08:53.800
<v Speaker 3>and she couldn't bother to watch that, and Star Wars

1295
01:08:53.920 --> 01:08:58.119
<v Speaker 3>is right out, so I was super super surprised, but

1296
01:08:58.199 --> 01:09:04.359
<v Speaker 3>she enthusiastic loved dude. So I will I will pick

1297
01:09:04.439 --> 01:09:06.920
<v Speaker 3>Dune and maybe I'll throw up a link here to

1298
01:09:07.000 --> 01:09:13.000
<v Speaker 3>the two discs set. And so last week we I

1299
01:09:13.039 --> 01:09:14.479
<v Speaker 3>think it was last week that we talked a bit

1300
01:09:14.479 --> 01:09:17.119
<v Speaker 3>about Blue Sky. I was able to get it installed

1301
01:09:17.159 --> 01:09:20.319
<v Speaker 3>and running. I left an issue open, so anybody who

1302
01:09:20.359 --> 01:09:25.680
<v Speaker 3>wants to know, yeah, I I did. Uh yeah, I

1303
01:09:25.720 --> 01:09:29.760
<v Speaker 3>figured that out. They they used Docker, but the use

1304
01:09:29.800 --> 01:09:32.720
<v Speaker 3>of docer just makes it more complicated and more difficult

1305
01:09:32.760 --> 01:09:35.720
<v Speaker 3>to install because you can just create you know, you

1306
01:09:35.760 --> 01:09:38.600
<v Speaker 3>could just get cloned the repo and then node install

1307
01:09:38.800 --> 01:09:42.119
<v Speaker 3>and then set up your reverse proxy with Caddy. And

1308
01:09:42.199 --> 01:09:46.840
<v Speaker 3>so I just gave those instructions along with some additional

1309
01:09:46.880 --> 01:09:50.199
<v Speaker 3>detail for some optional stuff. So when you see the

1310
01:09:50.199 --> 01:09:52.640
<v Speaker 3>instructions that you know you don't have to do all

1311
01:09:52.640 --> 01:09:55.159
<v Speaker 3>of the things. It's just there's a couple of steps.

1312
01:09:55.319 --> 01:09:58.760
<v Speaker 3>It's like you set up the environment variables. That's like

1313
01:09:59.399 --> 01:10:03.199
<v Speaker 3>one half of the instructions is you know, copy and

1314
01:10:03.239 --> 01:10:09.079
<v Speaker 3>paste this big, huge, long list of environment variables. And

1315
01:10:09.119 --> 01:10:13.600
<v Speaker 3>then you know, optionally set up caddy for SSL if

1316
01:10:13.640 --> 01:10:16.840
<v Speaker 3>you're not already using something else to reverse proxy for you,

1317
01:10:17.199 --> 01:10:20.119
<v Speaker 3>and then you need to have a it's a well

1318
01:10:20.159 --> 01:10:23.920
<v Speaker 3>known file you need to have reverse proxy to in particular,

1319
01:10:24.039 --> 01:10:28.399
<v Speaker 3>apart from the slash x RPC or whatever it is.

1320
01:10:29.239 --> 01:10:32.680
<v Speaker 3>I didn't My experience with it was kind of man

1321
01:10:32.680 --> 01:10:35.680
<v Speaker 3>because it's like, this is literally a Twitter clone. And

1322
01:10:35.760 --> 01:10:40.079
<v Speaker 3>of course, of course my first ten seconds of blue

1323
01:10:40.119 --> 01:10:44.720
<v Speaker 3>Sky were the same as anybody's first ten seconds of Twitter.

1324
01:10:45.079 --> 01:10:52.079
<v Speaker 3>I immediately was followed by bots with you know, pictures

1325
01:10:52.119 --> 01:10:58.039
<v Speaker 3>of women from the chin down claiming to want to

1326
01:10:58.079 --> 01:11:01.880
<v Speaker 3>be my friend. So I I just I don't know,

1327
01:11:02.399 --> 01:11:05.680
<v Speaker 3>I guess joined it if you want to. I've kind

1328
01:11:05.720 --> 01:11:09.600
<v Speaker 3>of I don't see the allure of it because it's

1329
01:11:09.760 --> 01:11:14.439
<v Speaker 3>it's literally just a clone of Twitter with I mean,

1330
01:11:14.479 --> 01:11:16.520
<v Speaker 3>you can you can run a local server and you

1331
01:11:16.560 --> 01:11:18.840
<v Speaker 3>can set up your data server and that's cool. And

1332
01:11:18.920 --> 01:11:20.840
<v Speaker 3>you can set it up so that your data server

1333
01:11:21.039 --> 01:11:25.760
<v Speaker 3>is your domain name. So for example, if you're beyond

1334
01:11:25.800 --> 01:11:28.720
<v Speaker 3>code boot camp dot com, then your handle can literally

1335
01:11:28.720 --> 01:11:30.680
<v Speaker 3>be at beyond code boot camp dot com. Mine is

1336
01:11:30.720 --> 01:11:34.479
<v Speaker 3>not I didn't. I played around with a little bit,

1337
01:11:34.520 --> 01:11:38.319
<v Speaker 3>but I just I was a little I just wasn't that.

1338
01:11:39.439 --> 01:11:43.079
<v Speaker 3>I wasn't that into it because it's it's just it's

1339
01:11:43.239 --> 01:11:47.279
<v Speaker 3>literally Twitter with the logo changed and maybe a few

1340
01:11:47.399 --> 01:11:50.239
<v Speaker 3>features less, and you know, you got the local data

1341
01:11:50.319 --> 01:11:53.560
<v Speaker 3>stor as a feature more. But I mean, I guess cool, good,

1342
01:11:53.680 --> 01:11:56.399
<v Speaker 3>you know, go good them. But yeah, if you want to,

1343
01:11:56.439 --> 01:11:58.119
<v Speaker 3>if you want to install it, there's an issue up

1344
01:11:58.119 --> 01:12:00.520
<v Speaker 3>that's called it's called something like how to win stall

1345
01:12:00.880 --> 01:12:05.000
<v Speaker 3>with Node no Docker and it's very very simple, So

1346
01:12:05.199 --> 01:12:07.520
<v Speaker 3>if you want to do it, I'd recommend it. If

1347
01:12:07.560 --> 01:12:09.279
<v Speaker 3>you're going to join blue Sky, I think that you

1348
01:12:09.279 --> 01:12:12.199
<v Speaker 3>have a moral obligation to run a personal data server,

1349
01:12:12.399 --> 01:12:14.560
<v Speaker 3>because otherwise what are you joining it for. You're like

1350
01:12:15.399 --> 01:12:18.319
<v Speaker 3>throwing out the baby and keeping the bathwater.

1351
01:12:19.560 --> 01:12:23.520
<v Speaker 1>Yeah, well, they're all of the stupid silly politics of

1352
01:12:23.600 --> 01:12:27.479
<v Speaker 1>people blah, blah blah, Elon Musk something something Blue Sky.

1353
01:12:28.159 --> 01:12:31.800
<v Speaker 2>So that's why I'm seeing people move. I think it's

1354
01:12:31.840 --> 01:12:33.880
<v Speaker 2>all people.

1355
01:12:34.119 --> 01:12:37.399
<v Speaker 3>I mean, yeah, if you're really interested in following information

1356
01:12:37.479 --> 01:12:40.079
<v Speaker 3>about Elon Musk, then Blue Sky's a great place to

1357
01:12:40.119 --> 01:12:42.439
<v Speaker 3>get yeah, Cause I mean, like, I think eighty percent

1358
01:12:42.479 --> 01:12:44.800
<v Speaker 3>of the posts or that. So if you really love

1359
01:12:44.840 --> 01:12:47.000
<v Speaker 3>Elon Musk, you just got to know every detail about

1360
01:12:47.000 --> 01:12:51.439
<v Speaker 3>his life. Yeah, I'm sorry, I'm sorry, I'm being a

1361
01:12:51.439 --> 01:12:54.920
<v Speaker 3>bit of a jerk, but I'm.

1362
01:12:54.199 --> 01:12:57.680
<v Speaker 2>Like people, okay, but yeah, but.

1363
01:12:57.720 --> 01:12:59.640
<v Speaker 1>If that's where people are, I'll go there and I'll

1364
01:12:59.640 --> 01:13:02.920
<v Speaker 1>talk too. And if they're somewhere else, then I'll go

1365
01:13:02.960 --> 01:13:03.920
<v Speaker 1>there and talk to people.

1366
01:13:04.319 --> 01:13:08.079
<v Speaker 3>I was just I was expecting something more. I was,

1367
01:13:08.680 --> 01:13:12.159
<v Speaker 3>I was, I was genuinely excited to try it out.

1368
01:13:12.199 --> 01:13:17.560
<v Speaker 3>I was expecting something more. And it's Pixel for pixel.

1369
01:13:17.840 --> 01:13:22.279
<v Speaker 3>It's Twitter with a butterfly logo and an option to

1370
01:13:22.399 --> 01:13:26.319
<v Speaker 3>run a personal data server. Well, it's and a lot,

1371
01:13:27.039 --> 01:13:31.279
<v Speaker 3>a lot, a lot. Like I will say, I think

1372
01:13:31.279 --> 01:13:33.880
<v Speaker 3>the politics are heavier on Blue Sky, probably because I

1373
01:13:33.880 --> 01:13:36.520
<v Speaker 3>haven't followed anybody yet, but like, I.

1374
01:13:36.479 --> 01:13:39.600
<v Speaker 4>Think that's the big thing. Like it. I tried it

1375
01:13:39.600 --> 01:13:41.439
<v Speaker 4>a while ago and gave up on it, and then

1376
01:13:41.640 --> 01:13:44.119
<v Speaker 4>with the wave of people coming and that that the

1377
01:13:44.159 --> 01:13:48.720
<v Speaker 4>Star depects like kind of regreen knitting communities, especially among

1378
01:13:48.800 --> 01:13:52.119
<v Speaker 4>like deaf tools. It's actually not at a point where

1379
01:13:52.159 --> 01:13:54.680
<v Speaker 4>I missed some of the most interesting people from Twitter,

1380
01:13:55.199 --> 01:13:59.279
<v Speaker 4>but it is quite high like value to noise like

1381
01:13:59.319 --> 01:14:02.359
<v Speaker 4>no ads. But that only was the case after followed

1382
01:14:02.399 --> 01:14:04.239
<v Speaker 4>a bunch of people. So I think that's always the

1383
01:14:04.479 --> 01:14:09.720
<v Speaker 4>caved with social networks. Yeah, you have your personal.

1384
01:14:11.399 --> 01:14:13.199
<v Speaker 1>I connected with a bunch of people there too, but

1385
01:14:14.319 --> 01:14:17.439
<v Speaker 1>I got kind of dragged kicking and screaming into some

1386
01:14:17.479 --> 01:14:20.520
<v Speaker 1>of the dev community politics a few years back, and

1387
01:14:20.880 --> 01:14:23.119
<v Speaker 1>hm that that came right back to the surface the

1388
01:14:23.159 --> 01:14:25.920
<v Speaker 1>second I was in there. So I think it really

1389
01:14:25.960 --> 01:14:28.920
<v Speaker 1>just depends on what your experience is and who you

1390
01:14:28.960 --> 01:14:32.039
<v Speaker 1>wind up running into. But I mean, I did have

1391
01:14:32.079 --> 01:14:34.880
<v Speaker 1>a couple of great conversations with some people on there too, so.

1392
01:14:36.720 --> 01:14:39.279
<v Speaker 3>But the whole thing about like there's no ads and

1393
01:14:39.399 --> 01:14:41.520
<v Speaker 3>you know, a small community ball, all of that's gonna

1394
01:14:41.560 --> 01:14:43.840
<v Speaker 3>go away because the the investors are gonna go from

1395
01:14:43.880 --> 01:14:46.640
<v Speaker 3>a round to b round and then they're gonna need

1396
01:14:46.680 --> 01:14:48.439
<v Speaker 3>their kickback and then they're gonna have to figure well,

1397
01:14:48.479 --> 01:14:50.680
<v Speaker 3>are we gonna do ads, We're gonna charge people money.

1398
01:14:50.960 --> 01:14:55.279
<v Speaker 3>I mean, I just there's no unique value proposition. It's

1399
01:14:55.319 --> 01:14:58.840
<v Speaker 3>purely it seems to be purely a moral proposition, right.

1400
01:14:58.960 --> 01:15:02.319
<v Speaker 3>It's it's like there's more what church are you going

1401
01:15:02.359 --> 01:15:04.600
<v Speaker 3>to join? Rather than what technology are you going to use?

1402
01:15:04.640 --> 01:15:06.640
<v Speaker 3>And so that's where I don't unless they have a

1403
01:15:06.760 --> 01:15:09.000
<v Speaker 3>unique value proposition where it's like I can do this

1404
01:15:09.079 --> 01:15:11.359
<v Speaker 3>here that I can't do there, I have a hard

1405
01:15:11.399 --> 01:15:15.479
<v Speaker 3>time believing that it's going to really bloom, especially because

1406
01:15:15.479 --> 01:15:19.079
<v Speaker 3>they're investor backed and investors don't care about personal data servers,

1407
01:15:19.159 --> 01:15:20.039
<v Speaker 3>that stuff's going to go.

1408
01:15:21.680 --> 01:15:23.960
<v Speaker 4>Yeah, I mean, I agree with you, And it's honestly

1409
01:15:24.000 --> 01:15:26.279
<v Speaker 4>the part that I'm most nervous about that it's not

1410
01:15:26.760 --> 01:15:29.479
<v Speaker 4>apparent yet what their business model is going to be exactly,

1411
01:15:29.640 --> 01:15:32.079
<v Speaker 4>or if they're doing ads, how they're doing them, Because

1412
01:15:32.279 --> 01:15:34.680
<v Speaker 4>I would love for Blue Sky to succeed just on

1413
01:15:34.720 --> 01:15:37.239
<v Speaker 4>the basis of it being an open protocol and hackable

1414
01:15:37.239 --> 01:15:39.880
<v Speaker 4>and so on. But until I see that, I kind

1415
01:15:39.880 --> 01:15:44.079
<v Speaker 4>of can't fully believe in it. But yeah, I'm routing

1416
01:15:44.520 --> 01:15:47.560
<v Speaker 4>on that basis, and so far, the indication seems to

1417
01:15:47.560 --> 01:15:50.359
<v Speaker 4>be that the people behind it are deeply aware of

1418
01:15:50.359 --> 01:15:52.720
<v Speaker 4>this conflict and are thinking about it in good ways.

1419
01:15:52.800 --> 01:15:55.560
<v Speaker 4>But I don't trust the fact that the introducing the

1420
01:15:55.640 --> 01:15:57.279
<v Speaker 4>monetization part so slowly.

1421
01:15:58.520 --> 01:16:01.079
<v Speaker 3>Yeah, Microsoft's going to come in and buy it and

1422
01:16:01.159 --> 01:16:02.039
<v Speaker 3>add co pilot.

1423
01:16:04.359 --> 01:16:04.560
<v Speaker 2>Yeah.

1424
01:16:04.560 --> 01:16:08.319
<v Speaker 1>If you're following along on YouTube, Owen Buckley's posted a

1425
01:16:08.319 --> 01:16:12.720
<v Speaker 1>couple of comments as well, you know about you know,

1426
01:16:12.800 --> 01:16:15.640
<v Speaker 1>the algorithm or lack of algorithm and things like that.

1427
01:16:15.720 --> 01:16:20.359
<v Speaker 1>But it's anyway, it's there's an interesting discussion to be had.

1428
01:16:21.399 --> 01:16:23.520
<v Speaker 1>Mostly I went over there because there were people that

1429
01:16:23.520 --> 01:16:26.840
<v Speaker 1>had left Twitter that I wanted to interact with, and so,

1430
01:16:27.119 --> 01:16:29.399
<v Speaker 1>you know, as far as that goes, you know, maybe

1431
01:16:29.840 --> 01:16:32.800
<v Speaker 1>maybe Blue Sky just doesn't get traction and they come back,

1432
01:16:32.880 --> 01:16:35.560
<v Speaker 1>or maybe they don't or I don't know, but for now,

1433
01:16:35.640 --> 01:16:37.039
<v Speaker 1>that's where some of the folks I want to be

1434
01:16:37.079 --> 01:16:39.439
<v Speaker 1>around are and so I'm there, and there are a

1435
01:16:39.439 --> 01:16:42.159
<v Speaker 1>whole bunch of people on x Twitter that I want

1436
01:16:42.159 --> 01:16:43.840
<v Speaker 1>to be around, and so I'm there too, And.

1437
01:16:46.439 --> 01:16:48.159
<v Speaker 2>Yeah, anyway, so.

1438
01:16:49.720 --> 01:16:54.840
<v Speaker 3>Yeah, I apologize for my trolling. Now, No, I'm I

1439
01:16:55.359 --> 01:16:57.640
<v Speaker 3>apologize for my for my trolling.

1440
01:16:58.239 --> 01:17:01.319
<v Speaker 1>No, there's I mean, it's it's it's a discussion that's

1441
01:17:01.319 --> 01:17:03.560
<v Speaker 1>happening in the community one way or the other.

1442
01:17:04.479 --> 01:17:04.920
<v Speaker 2>And so.

1443
01:17:07.199 --> 01:17:10.800
<v Speaker 3>You know, I like what Owen says. It's all just

1444
01:17:10.840 --> 01:17:14.159
<v Speaker 3>a bunch of yapping wherever you go for the lulls.

1445
01:17:15.000 --> 01:17:15.720
<v Speaker 2>Yep, true.

1446
01:17:16.279 --> 01:17:18.159
<v Speaker 1>All right, I'm gonna throw in some picks, so I

1447
01:17:18.159 --> 01:17:21.520
<v Speaker 1>always do a board game pick. I was at the

1448
01:17:22.399 --> 01:17:25.680
<v Speaker 1>Timpcon a couple of weeks ago teaching games. One of

1449
01:17:25.680 --> 01:17:31.359
<v Speaker 1>the games we taught was Imperial Miners, and I just

1450
01:17:31.439 --> 01:17:36.399
<v Speaker 1>posted the board game geek link. So Imperial Miners it

1451
01:17:36.439 --> 01:17:38.920
<v Speaker 1>comes in is at a weight of two point oh oh,

1452
01:17:39.000 --> 01:17:44.239
<v Speaker 1>so it's exactly two two is casual gamer friendly. It's

1453
01:17:44.319 --> 01:17:47.399
<v Speaker 1>it's got enough complexity to where it's interesting and fun,

1454
01:17:47.920 --> 01:17:52.439
<v Speaker 1>but it's not so overwhelmingly complicated that people can't figure.

1455
01:17:52.520 --> 01:17:54.279
<v Speaker 1>Like I've picked some games on here that have a

1456
01:17:54.319 --> 01:17:57.319
<v Speaker 1>board game geek weight of like four four and a half,

1457
01:17:57.560 --> 01:17:59.399
<v Speaker 1>and it's like, look, this game's going to take you

1458
01:17:59.439 --> 01:18:02.600
<v Speaker 1>five hours and you're gonna get way into all of

1459
01:18:02.640 --> 01:18:04.239
<v Speaker 1>the ins and outs of how it's played.

1460
01:18:04.600 --> 01:18:05.560
<v Speaker 2>This is not that game.

1461
01:18:05.600 --> 01:18:08.760
<v Speaker 1>This game plays in I think we've usually play it

1462
01:18:08.760 --> 01:18:09.520
<v Speaker 1>in like a half hour.

1463
01:18:11.479 --> 01:18:14.399
<v Speaker 2>It says age ten plus. That's probably about right.

1464
01:18:14.439 --> 01:18:19.239
<v Speaker 1>You can play it up to five players, I've always

1465
01:18:19.239 --> 01:18:22.279
<v Speaker 1>played it with three or four players there.

1466
01:18:22.319 --> 01:18:25.079
<v Speaker 2>So this game is a little.

1467
01:18:24.760 --> 01:18:26.840
<v Speaker 1>Different from some of the other games that I've picked,

1468
01:18:27.279 --> 01:18:30.239
<v Speaker 1>where you know, it's like, hey, you know, you're all

1469
01:18:30.319 --> 01:18:34.399
<v Speaker 1>interacting in this specific way. Imperial Miners is like playing

1470
01:18:34.439 --> 01:18:39.760
<v Speaker 1>solitaire with other people, all right, So essentially in the

1471
01:18:39.800 --> 01:18:42.000
<v Speaker 1>sense of you you're you're playing on your own board

1472
01:18:42.920 --> 01:18:45.720
<v Speaker 1>and there really isn't anything else that anybody else can

1473
01:18:45.760 --> 01:18:46.159
<v Speaker 1>do to.

1474
01:18:47.840 --> 01:18:49.680
<v Speaker 2>Mess with you, right, So.

1475
01:18:51.119 --> 01:18:54.399
<v Speaker 1>Essentially the way it works is you're building a mine,

1476
01:18:54.520 --> 01:18:56.760
<v Speaker 1>and so you start with the top level of the mine,

1477
01:18:57.560 --> 01:19:01.359
<v Speaker 1>and you at cards, so you get a level. You

1478
01:19:01.479 --> 01:19:03.600
<v Speaker 1>have level one cards, Level two cards, Level three cards,

1479
01:19:03.600 --> 01:19:05.920
<v Speaker 1>and level four cards. All the level four cards are

1480
01:19:05.920 --> 01:19:08.359
<v Speaker 1>the same. They give you two points. I think I

1481
01:19:08.439 --> 01:19:09.800
<v Speaker 1>don't remember exactly.

1482
01:19:09.439 --> 01:19:10.199
<v Speaker 2>But they're all the same.

1483
01:19:11.159 --> 01:19:14.159
<v Speaker 1>So anyway, you start with two of each card, and

1484
01:19:14.760 --> 01:19:17.279
<v Speaker 1>so you play one of your level one cards because

1485
01:19:17.279 --> 01:19:19.840
<v Speaker 1>that's all you can do, right, and then your next turn,

1486
01:19:19.880 --> 01:19:21.359
<v Speaker 1>if you want to, you can play a level two

1487
01:19:21.359 --> 01:19:24.880
<v Speaker 1>card that connects to your level one card, right, So

1488
01:19:24.920 --> 01:19:28.039
<v Speaker 1>you can't ever play cards that don't connect back to

1489
01:19:28.079 --> 01:19:31.640
<v Speaker 1>the surface. And they each do different things. They have

1490
01:19:31.720 --> 01:19:36.239
<v Speaker 1>different teams or icons or however you want to classify

1491
01:19:36.279 --> 01:19:39.920
<v Speaker 1>it categories, and so I think their guilds actually is

1492
01:19:39.920 --> 01:19:42.199
<v Speaker 1>what they are. But anyway, so they all kind of

1493
01:19:42.279 --> 01:19:44.600
<v Speaker 1>some of them playing together, right, So it's like if

1494
01:19:44.640 --> 01:19:47.199
<v Speaker 1>you have other cards that are of this same kind,

1495
01:19:47.319 --> 01:19:51.520
<v Speaker 1>then you get mine cards or diamonds which are the

1496
01:19:51.520 --> 01:19:55.479
<v Speaker 1>points or you know whatever, or coins, and you can

1497
01:19:55.680 --> 01:19:57.760
<v Speaker 1>you can spend the coins to do other things, like

1498
01:19:58.399 --> 01:20:04.880
<v Speaker 1>you can buy essentially moving your their technology tracks. You

1499
01:20:04.920 --> 01:20:08.560
<v Speaker 1>can move your marker up the technology track, or you can.

1500
01:20:10.079 --> 01:20:11.000
<v Speaker 2>You can buy.

1501
01:20:10.960 --> 01:20:15.560
<v Speaker 1>More cards that are more things you can put into

1502
01:20:15.560 --> 01:20:18.520
<v Speaker 1>your mind, right, because there are like four slots for

1503
01:20:18.600 --> 01:20:22.399
<v Speaker 1>level one and so you can put in more level ones.

1504
01:20:22.680 --> 01:20:25.239
<v Speaker 1>But what happens is when you play a card, you

1505
01:20:25.359 --> 01:20:27.800
<v Speaker 1>get that card and then you get to choose one

1506
01:20:27.800 --> 01:20:29.720
<v Speaker 1>of the cards that it connects to above it, and

1507
01:20:30.039 --> 01:20:32.960
<v Speaker 1>they're offset, so you can pick between two if there

1508
01:20:32.960 --> 01:20:34.920
<v Speaker 1>are two cards above it. Otherwise you just go to

1509
01:20:34.920 --> 01:20:37.920
<v Speaker 1>the one that is above it, and then you you know,

1510
01:20:37.960 --> 01:20:39.720
<v Speaker 1>you just chain all the way up to the surface,

1511
01:20:40.319 --> 01:20:43.399
<v Speaker 1>and so you do what each card says, right, And

1512
01:20:43.439 --> 01:20:45.520
<v Speaker 1>then there's some other complications, like you can have a

1513
01:20:45.560 --> 01:20:47.800
<v Speaker 1>cave in and so if there's a cave in instead

1514
01:20:47.800 --> 01:20:50.960
<v Speaker 1>of getting that reward you clear the cave in, right, But.

1515
01:20:52.880 --> 01:20:53.680
<v Speaker 2>But there are rewards.

1516
01:20:53.720 --> 01:20:55.800
<v Speaker 1>There are cards that say if you have for every

1517
01:20:55.800 --> 01:20:57.640
<v Speaker 1>cave in you have, you get so much money or

1518
01:20:57.680 --> 01:21:01.000
<v Speaker 1>so many points, and so sometimes that.

1519
01:21:00.920 --> 01:21:04.399
<v Speaker 3>Game emergency stop and somehow has to go. I don't

1520
01:21:04.399 --> 01:21:05.680
<v Speaker 3>think you saw the message in the chat.

1521
01:21:06.079 --> 01:21:08.680
<v Speaker 2>Oh okay, do you have some picks and some before

1522
01:21:08.680 --> 01:21:08.960
<v Speaker 2>we go?

1523
01:21:10.279 --> 01:21:12.720
<v Speaker 4>Yeah, quick one you talked about doing aj I can

1524
01:21:12.760 --> 01:21:16.199
<v Speaker 4>really recommend the Silo series on Apple TV. It's one

1525
01:21:16.199 --> 01:21:19.239
<v Speaker 4>of the most fun sci fi things I've seen recently.

1526
01:21:19.640 --> 01:21:20.600
<v Speaker 3>But yeah, thank you.

1527
01:21:21.319 --> 01:21:23.880
<v Speaker 4>Was the pleasure talking to you guys. Nice to meet you. Yeah,

1528
01:21:24.279 --> 01:21:27.680
<v Speaker 4>very nice to talk about local first, thanks so much

1529
01:21:27.720 --> 01:21:28.840
<v Speaker 4>for having me take care.

1530
01:21:29.359 --> 01:21:33.600
<v Speaker 2>All right, so sorry, I was on a roll. So anyway,

1531
01:21:33.640 --> 01:21:35.439
<v Speaker 2>it's a super fun game. Like I said, it takes

1532
01:21:35.439 --> 01:21:36.960
<v Speaker 2>about a half hour. It's pretty simple.

1533
01:21:38.079 --> 01:21:40.800
<v Speaker 1>Everybody just goes at the same time and then gets

1534
01:21:40.840 --> 01:21:42.720
<v Speaker 1>whatever rewards, and then you do it again for the

1535
01:21:42.720 --> 01:21:47.000
<v Speaker 1>next round, and you play ten rounds I think, and

1536
01:21:47.039 --> 01:21:49.359
<v Speaker 1>then you're done. And at the beginning of each round

1537
01:21:49.359 --> 01:21:51.800
<v Speaker 1>you flip over a card that gives everybody a reward

1538
01:21:51.880 --> 01:21:52.560
<v Speaker 1>or a complication.

1539
01:21:52.880 --> 01:21:55.079
<v Speaker 2>That's it. So I'm gonna pick that.

1540
01:21:58.000 --> 01:22:01.439
<v Speaker 1>I am finishing up putting together all the stuff for

1541
01:22:01.520 --> 01:22:03.520
<v Speaker 1>the AI dev boot Camp. You'll be able to get

1542
01:22:03.520 --> 01:22:07.239
<v Speaker 1>that at aidevbootcamp dot com when that comes out. I'm

1543
01:22:07.279 --> 01:22:10.800
<v Speaker 1>hoping to have everything together for that by tonight or

1544
01:22:10.800 --> 01:22:13.760
<v Speaker 1>tomorrow so you can sign up. We're going to start

1545
01:22:13.800 --> 01:22:16.239
<v Speaker 1>in the middle of January will be the first week.

1546
01:22:16.239 --> 01:22:18.960
<v Speaker 1>We're going to run for three months. We're gonna have calls,

1547
01:22:18.960 --> 01:22:21.880
<v Speaker 1>at least a couple of calls every week and just

1548
01:22:22.000 --> 01:22:24.800
<v Speaker 1>kind of walk you through anything that you're running into,

1549
01:22:24.920 --> 01:22:29.239
<v Speaker 1>answer questions, things like that, just so that you can

1550
01:22:29.319 --> 01:22:33.159
<v Speaker 1>build AI features into your applications. And that's everything from

1551
01:22:33.920 --> 01:22:36.800
<v Speaker 1>help bots and stuff like that all the way up

1552
01:22:36.840 --> 01:22:40.720
<v Speaker 1>through just sort of the I've got this text field

1553
01:22:40.720 --> 01:22:42.840
<v Speaker 1>and I click a button and it writes a summary

1554
01:22:42.920 --> 01:22:47.239
<v Speaker 1>for my podcast episode kind of thing. I mean, I'm

1555
01:22:47.239 --> 01:22:50.560
<v Speaker 1>looking to build something for the top end dev system

1556
01:22:50.640 --> 01:22:54.199
<v Speaker 1>that I just barely converted over to a SAS where

1557
01:22:54.319 --> 01:22:56.439
<v Speaker 1>people can come in and instead of having to know

1558
01:22:57.159 --> 01:23:00.640
<v Speaker 1>which form to go edit the podcast, whatever whatever field in,

1559
01:23:01.439 --> 01:23:06.439
<v Speaker 1>they can essentially tell the bot, hey move the episode

1560
01:23:06.479 --> 01:23:11.920
<v Speaker 1>with ONSELM from Monday the eighth or ninth, or whenever

1561
01:23:11.920 --> 01:23:13.079
<v Speaker 1>this is going to come out to.

1562
01:23:14.760 --> 01:23:15.159
<v Speaker 2>Monday.

1563
01:23:16.399 --> 01:23:18.600
<v Speaker 1>You move it a week later and it'll be smart

1564
01:23:18.680 --> 01:23:20.279
<v Speaker 1>enough to go in and change the published date.

1565
01:23:21.039 --> 01:23:22.800
<v Speaker 2>Or we have an.

1566
01:23:22.760 --> 01:23:24.960
<v Speaker 1>Episode scheduled with so and so to record on this

1567
01:23:25.079 --> 01:23:26.600
<v Speaker 1>date and they say they can't do it. Can you

1568
01:23:26.600 --> 01:23:28.600
<v Speaker 1>move it back two weeks and it's smart enough to

1569
01:23:28.680 --> 01:23:32.359
<v Speaker 1>change the schedule and update all of the guests and

1570
01:23:32.439 --> 01:23:35.680
<v Speaker 1>hosts that are planning on showing up and stuff like that.

1571
01:23:36.000 --> 01:23:39.359
<v Speaker 1>Or if somebody schedules an episode for Christmas, right, I

1572
01:23:39.399 --> 01:23:41.359
<v Speaker 1>can say, hey, can you block out Christmas and move

1573
01:23:41.359 --> 01:23:46.279
<v Speaker 1>the episode there a couple of weeks, Or Hey, the

1574
01:23:46.800 --> 01:23:48.960
<v Speaker 1>title that you have for this episode isn't great. Can

1575
01:23:49.000 --> 01:23:51.760
<v Speaker 1>you generate three more? So I can pick one and

1576
01:23:51.800 --> 01:23:54.600
<v Speaker 1>it'll be smart enough to do that. So that's kind

1577
01:23:54.600 --> 01:23:57.399
<v Speaker 1>of the thing we're looking for. The system that we've

1578
01:23:57.399 --> 01:23:59.520
<v Speaker 1>been using to have the show notes written doesn't always

1579
01:23:59.520 --> 01:24:02.199
<v Speaker 1>get it right, and so it'll pick up on exactly

1580
01:24:02.239 --> 01:24:04.319
<v Speaker 1>the wrong thing and write a summary that we talked

1581
01:24:04.319 --> 01:24:08.800
<v Speaker 1>about Lord of the Rings instead of JavaScript. That happened

1582
01:24:08.840 --> 01:24:12.600
<v Speaker 1>once because Dan told a story about how The Lord

1583
01:24:12.600 --> 01:24:15.880
<v Speaker 1>of the Rings got translated into Hebrew, and so it said, hey,

1584
01:24:15.920 --> 01:24:18.039
<v Speaker 1>they talked about literature. And it was like, well, technically,

1585
01:24:18.199 --> 01:24:22.399
<v Speaker 1>but anyway, So that's the kind of thing. So I'll

1586
01:24:22.439 --> 01:24:23.960
<v Speaker 1>be teaching you how to do all that kind of

1587
01:24:23.960 --> 01:24:26.840
<v Speaker 1>stuff and how to choose the right llms to do that,

1588
01:24:27.119 --> 01:24:30.439
<v Speaker 1>and how to connect to those services. I'm hoping to

1589
01:24:30.479 --> 01:24:36.000
<v Speaker 1>have examples in JavaScript and Ruby. If you're doing some

1590
01:24:36.079 --> 01:24:38.880
<v Speaker 1>other language, you know, we'll give you enough tools to

1591
01:24:38.880 --> 01:24:40.880
<v Speaker 1>where you can figure out how to talk to the

1592
01:24:40.920 --> 01:24:43.439
<v Speaker 1>APIs and get authenticated and all that stuff, but you'll

1593
01:24:43.439 --> 01:24:45.800
<v Speaker 1>have to use whatever libraries in whatever language you're doing.

1594
01:24:45.800 --> 01:24:51.520
<v Speaker 1>So if that's Go or Alixer or something. I'm just

1595
01:24:51.560 --> 01:24:58.239
<v Speaker 1>trying to think what other picks I have. I could

1596
01:24:58.239 --> 01:25:00.119
<v Speaker 1>pick one that would piss everybody off, but I think

1597
01:25:00.119 --> 01:25:03.720
<v Speaker 1>I'll save that for next week. And yeah, I guess,

1598
01:25:03.760 --> 01:25:06.119
<v Speaker 1>I guess I'll just wrap it up there. I have

1599
01:25:06.359 --> 01:25:12.960
<v Speaker 1>redone the top end Dev's website. I'm currently working through

1600
01:25:13.000 --> 01:25:15.000
<v Speaker 1>some issues, but if you point out an issue that

1601
01:25:15.039 --> 01:25:18.279
<v Speaker 1>I'm not aware of yet, I am totally willing to

1602
01:25:18.279 --> 01:25:20.119
<v Speaker 1>give you a discount or a free month to the

1603
01:25:20.199 --> 01:25:23.199
<v Speaker 1>JavaScript Geniuses group or something like that.

1604
01:25:23.760 --> 01:25:26.319
<v Speaker 2>So just email me Chuck at top endevs dot com.

1605
01:25:26.680 --> 01:25:29.079
<v Speaker 1>And if it's not something I'm already working on or fixing,

1606
01:25:29.720 --> 01:25:33.039
<v Speaker 1>then you know I'll make it worth your while. So anyway,

1607
01:25:34.199 --> 01:25:37.359
<v Speaker 1>those are my picks, and I guess we'll just wrap

1608
01:25:37.399 --> 01:25:38.119
<v Speaker 1>it up till next time.

1609
01:25:38.199 --> 01:25:38.640
<v Speaker 2>Max out
