WEBVTT - This file was automatically generated by VIMEO and hand-edited by Aral Balkan.

0
00:00:00.135 --> 00:00:01.155
The stream seems to be fine.

1
00:00:01.205 --> 00:00:03.675
Hello, if you're joining us on the stream, um,

2
00:00:03.815 --> 00:00:05.675
I'm just going to go on Mastodon

3
00:00:05.775 --> 00:00:08.435
and just tell people that the stream is online.

4
00:00:09.375 --> 00:00:13.595
Uh, if you are around,

5
00:00:14.825 --> 00:00:18.075
join us for my talk at University

6
00:00:18.495 --> 00:00:20.315
of Gro…

7
00:00:20.975 --> 00:00:23.795
I'm gonna try and spell it correctly. There we go.

8
00:00:24.615 --> 00:00:27.075
Groningen? Kchronengen? There! I got it!

9
00:00:27.495 --> 00:00:31.855
Um, uh, on Small Web,

10
00:00:32.315 --> 00:00:35.455
and I'll just give the, there we go.

11
00:00:35.755 --> 00:00:36.855
Do you guys know the Fediverse?

12
00:00:36.915 --> 00:00:39.855
Do you know Mastodon at all?

13
00:00:39.925 --> 00:00:41.695
This looks like Twitter, right? It's not Twitter.

14
00:00:42.395 --> 00:00:44.015
Um, Twitter doesn't exist anyway.

15
00:00:44.675 --> 00:00:47.535
Um, Twitter is now the fascist place known as X.

16
00:00:48.075 --> 00:00:50.095
Um, if you're still on there, get off of there.

17
00:00:50.885 --> 00:00:55.255
It's called Shitter. Yes, exactly. Um, it was shit.

18
00:00:55.475 --> 00:00:57.615
It was never great, but now it is shitter.

19
00:00:58.155 --> 00:01:01.855
Um, so here we go: Small Web… Let me publish that…

20
00:01:01.855 --> 00:01:05.295
Maybe some people will join us. All right, great!

21
00:01:05.705 --> 00:01:09.575
Let's get outta the fediverse, there we go.

22
00:01:09.875 --> 00:01:11.655
Um, I, I mean, if you're, if you're not familiar

23
00:01:11.685 --> 00:01:14.375
with who's not familiar with Mastodon here?

24
00:01:14.955 --> 00:01:16.935
Anyone? You know of it?

25
00:01:16.965 --> 00:01:19.575
Okay. So it basically, I mean, it looks like Twitter, right?

26
00:01:20.195 --> 00:01:22.735
Um, but, uh, unlike Twitter,

27
00:01:23.085 --> 00:01:25.535
it's not centralised, it's federated.

28
00:01:25.795 --> 00:01:26.975
So there are thousands

29
00:01:26.995 --> 00:01:30.655
and thousands of, uh, well, maybe thousands, um,

30
00:01:30.995 --> 00:01:33.255
of Mastodon server, uh, owned

31
00:01:33.255 --> 00:01:34.575
and controlled by different people.

32
00:01:35.395 --> 00:01:37.615
And, uh, you can get an account on any one of them.

33
00:01:37.615 --> 00:01:40.255
They all have their own governance structures, etc.,

34
00:01:40.635 --> 00:01:42.615
um, and their own rules and regulations.

35
00:01:42.995 --> 00:01:44.935
Um, you can set one up yourself if you want to.

36
00:01:44.935 --> 00:01:46.895
It's free and open source. Uh,

37
00:01:47.235 --> 00:01:51.695
and, uh, the key thing is anyone with an account on any one

38
00:01:51.695 --> 00:01:53.495
of these servers can talk to

39
00:01:53.715 --> 00:01:56.375
and follow anyone else on any other server.

40
00:01:56.485 --> 00:01:58.855
That is the federated aspect of it.

41
00:01:59.115 --> 00:02:01.415
And the federation comes from, uh,

42
00:02:01.815 --> 00:02:05.505
a protocol called Activity Pub, which is a, uh,

43
00:02:05.785 --> 00:02:07.265
a W3C protocol.

44
00:02:07.565 --> 00:02:09.505
Hi there. Could you just get the door? Thank you.

45
00:02:10.205 --> 00:02:13.345
All right, for those of us joining us online as well, um,

46
00:02:14.265 --> 00:02:15.705
I am streaming this online.

47
00:02:15.835 --> 00:02:19.425
Where are we? I can't find my stream thing.

48
00:02:19.655 --> 00:02:21.425
Where's my stream thing? Oh, it's here.

49
00:02:21.455 --> 00:02:24.785
It's on the other tab. Uh, confusing myself. There we go.

50
00:02:25.085 --> 00:02:26.585
Um, for those of you joining us online,

51
00:02:26.585 --> 00:02:28.545
we're at the University of Groningen (Kchroningen!)

52
00:02:28.545 --> 00:02:29.745
in the Netherlands.

53
00:02:30.005 --> 00:02:31.505
And, uh, uh,

54
00:02:31.505 --> 00:02:33.785
there are actually people here listening to me talk.

55
00:02:33.845 --> 00:02:35.225
You can't see them, but they are here.

56
00:02:35.225 --> 00:02:39.305
Make some noise people. Hello. (Woo!) Yay. Okay. They exist. Great.

57
00:02:39.725 --> 00:02:41.545
Um, and, uh, I'm going

58
00:02:41.545 --> 00:02:43.465
to remove myself from the stream right now,

59
00:02:43.525 --> 00:02:44.905
so just share my screen.

60
00:02:45.125 --> 00:02:46.865
Um, and you're gonna get that lovely effect,

61
00:02:47.205 --> 00:02:48.905
uh, for a second.

62
00:02:49.685 --> 00:02:52.505
But, um, it's better than my photo, uh, my,

63
00:02:52.605 --> 00:02:53.785
my picture-in-picture

64
00:02:53.805 --> 00:02:58.305
or whatever, uh, uh, filling up the screen and,

65
00:02:58.325 --> 00:03:00.085
and screen, uh, the slides.

66
00:03:00.785 --> 00:03:04.565
So I am just going to share my screen here for the stream.

67
00:03:05.825 --> 00:03:07.365
And yep, let's share it.

68
00:03:08.555 --> 00:03:12.885
Allow… let's do the entire screen. There we go.

69
00:03:13.385 --> 00:03:14.925
And I will switch from this screen,

70
00:03:14.985 --> 00:03:17.085
now. You should still be able to hear me

71
00:03:17.745 --> 00:03:20.325
and welcome to my talk on the Small Web.

72
00:03:20.825 --> 00:03:24.445
Hi. Um, so my name's Aral Balkan

73
00:03:24.985 --> 00:03:28.445
and um, I'm co-founder of Small Technology Foundation,

74
00:03:28.445 --> 00:03:32.045
which is a tiny two person, not-for-profit, um, based in,

75
00:03:32.265 --> 00:03:33.725
uh, Ireland currently.

76
00:03:34.225 --> 00:03:37.885
Um, and we work on Small Technology, uh,

77
00:03:38.465 --> 00:03:40.805
and uh, what I've been working on building

78
00:03:40.865 --> 00:03:44.525
for the last six years, uh, is what I call the Small Web.

79
00:03:45.385 --> 00:03:48.885
So, um, what is the Small Web?

80
00:03:49.915 --> 00:03:53.915
I want you to imagine a web where each one of us

81
00:03:54.745 --> 00:03:57.635
owns and controls their own place.

82
00:03:58.615 --> 00:04:02.875
And these places are easy to find, they're very findable,

83
00:04:03.415 --> 00:04:05.915
um, because they are at domain names.

84
00:04:06.015 --> 00:04:09.155
And we own and control these domain names as well.

85
00:04:09.415 --> 00:04:12.915
So I might be me.small-web.org,

86
00:04:13.415 --> 00:04:17.635
You might be you.little-place.org,

87
00:04:18.455 --> 00:04:21.835
And, uh, they may be them dot

88
00:04:22.485 --> 00:04:23.595
tiny-space.org

89
00:04:24.415 --> 00:04:28.875
And, uh, very importantly, we also get to choose

90
00:04:29.655 --> 00:04:33.475
who we connect with and who we don't connect with.

91
00:04:33.975 --> 00:04:36.475
And we don't have to connect either.

92
00:04:36.575 --> 00:04:37.755
And that's very important.

93
00:04:38.535 --> 00:04:41.675
The goal here is not to connect everyone to everyone,

94
00:04:42.055 --> 00:04:45.115
or as we see in centralised systems, to connect everyone

95
00:04:45.135 --> 00:04:46.395
to a centralised system.

96
00:04:46.895 --> 00:04:51.555
So them.tiny-space.org maybe just isn't feeling

97
00:04:51.625 --> 00:04:52.755
very social right now.

98
00:04:53.095 --> 00:04:55.475
And that's okay. They can be off on their own.

99
00:04:55.485 --> 00:04:57.635
Maybe they're doing something in their own little space

100
00:04:57.655 --> 00:04:58.835
and that's fine, right?

101
00:04:59.375 --> 00:05:01.875
Um, but we get to choose who we connect with

102
00:05:01.895 --> 00:05:04.035
and we can connect directly with them.

103
00:05:04.215 --> 00:05:07.795
And that's key. And at these places, we can choose

104
00:05:07.855 --> 00:05:11.635
to be public if we want to be, but we can also,

105
00:05:11.735 --> 00:05:15.835
and this is very important, choose to be private if we want

106
00:05:15.835 --> 00:05:20.275
to be, and I mean actually private in the sense of privacy

107
00:05:20.925 --> 00:05:24.395
being the right to choose what you keep to yourself

108
00:05:24.535 --> 00:05:26.715
and what you choo- uh, what you share with others.

109
00:05:27.785 --> 00:05:30.715
Very simple definition of privacy, which the mainstream

110
00:05:31.525 --> 00:05:33.835
seems to be very confused about continuously.

111
00:05:34.615 --> 00:05:36.515
So, um, here we're seeing

112
00:05:36.515 --> 00:05:39.235
that me.small-web.org is talking to

113
00:05:39.235 --> 00:05:42.315
that other node up there and it's private.

114
00:05:42.375 --> 00:05:45.755
And how, how is it private? Well, it's end-to-end encrypted.

115
00:05:45.855 --> 00:05:49.155
So all of these nodes can talk to each other through end-

116
00:05:49.155 --> 00:05:50.635
-to-end encryption.

117
00:05:51.575 --> 00:05:53.755
Um, and, uh, you know, for those of you,

118
00:05:53.795 --> 00:05:55.595
I think we do have actually a cryptographer

119
00:05:55.595 --> 00:05:57.645
or two in the room, or at least one.

120
00:05:57.815 --> 00:06:00.045
There we go. Uh, the mechanism

121
00:06:00.065 --> 00:06:03.365
behind this in the Small Web protocol is we use public key

122
00:06:03.365 --> 00:06:06.885
encryption, and we're using ed 25519, uh,

123
00:06:07.145 --> 00:06:08.325
public and private keys.

124
00:06:08.665 --> 00:06:11.405
But importantly, you don't need to know about that in order

125
00:06:11.405 --> 00:06:14.485
to use this system, otherwise you wouldn't use this system.

126
00:06:15.145 --> 00:06:18.725
So, uh, in other words, the Small Web is

127
00:06:19.775 --> 00:06:21.455
a peer-to-peer web

128
00:06:23.175 --> 00:06:27.955
and more so it's a personal web of places owned

129
00:06:27.975 --> 00:06:31.995
and controlled by everyday people who use technology

130
00:06:32.175 --> 00:06:34.155
as an everyday thing.

131
00:06:35.385 --> 00:06:38.395
This is really important. Who is it not for?

132
00:06:39.105 --> 00:06:43.475
It's not for geeks. It's not for enthusiasts, right?

133
00:06:43.695 --> 00:06:45.715
We already have tools for geeks

134
00:06:45.715 --> 00:06:48.115
and enthusiasts to protect their privacy, to be able

135
00:06:48.115 --> 00:06:50.475
to publish publicly if they want to, right?

136
00:06:50.815 --> 00:06:54.275
Uh, those of us who spend an inordinate amount of time, uh,

137
00:06:54.495 --> 00:06:57.395
you know, recompiling the external and doing this

138
00:06:57.395 --> 00:07:01.675
and that, uh, we have less of a privacy problem we do

139
00:07:01.675 --> 00:07:03.875
because it's like secondhand smoke, right?

140
00:07:04.295 --> 00:07:07.315
Uh, when privacy is being violated

141
00:07:07.415 --> 00:07:10.915
and human rights are being violated en mass than of course

142
00:07:11.455 --> 00:07:12.595
we are being affected.

143
00:07:13.345 --> 00:07:15.795
Just like if we were living, we were sitting in a room

144
00:07:15.795 --> 00:07:18.825
where everyone was smoking, you are maybe not smoking

145
00:07:18.925 --> 00:07:20.145
and maybe you've got a good mask,

146
00:07:20.205 --> 00:07:23.545
but maybe some of it is still, you know, uh, seeping in.

147
00:07:24.245 --> 00:07:26.945
So, uh, it's very important that it is for everyday people

148
00:07:26.945 --> 00:07:28.665
who use technology as an everyday thing.

149
00:07:28.885 --> 00:07:30.105
And let me make it very clear.

150
00:07:30.385 --> 00:07:33.965
I don't mean dumb people, I don't mean stupid people.

151
00:07:34.285 --> 00:07:35.685
'cause we have an arrogance in the free

152
00:07:35.685 --> 00:07:37.085
and open source world, especially

153
00:07:37.215 --> 00:07:40.045
where we sometimes create very difficult to use things.

154
00:07:40.385 --> 00:07:41.725
And then we say, “try harder!”

155
00:07:42.185 --> 00:07:43.725
You know, “you're just not clever enough

156
00:07:44.225 --> 00:07:46.805
to use our ethical alternative that we've created

157
00:07:47.115 --> 00:07:49.845
that requires you to jump through 50,000 hoops

158
00:07:49.865 --> 00:07:51.765
and recompile the Linux kernel.”

159
00:07:52.225 --> 00:07:56.405
So, um, it's very important that these, uh,

160
00:07:56.435 --> 00:07:59.325
that the Small Web is easy, affordable,

161
00:07:59.325 --> 00:08:00.885
because we also don't want privacy

162
00:08:01.065 --> 00:08:02.965
and human rights to be something that only people

163
00:08:02.965 --> 00:08:04.485
with money can buy.

164
00:08:04.645 --> 00:08:07.445
'cause again, it's less of a problem, right?

165
00:08:08.025 --> 00:08:09.805
Um, if you're someone like Mark Zuckerberg,

166
00:08:09.805 --> 00:08:12.165
when you buy your house, you buy the two houses

167
00:08:12.185 --> 00:08:14.245
around your house as well to protect your privacy.

168
00:08:14.375 --> 00:08:16.805
While at the same time, the whole business model

169
00:08:16.825 --> 00:08:18.085
of your corporation is

170
00:08:18.085 --> 00:08:20.045
to violate everyone else's privacy, right?

171
00:08:20.665 --> 00:08:22.965
So, uh, they have to be easy, affordable,

172
00:08:23.065 --> 00:08:26.525
and useful, simple things, you would think.

173
00:08:27.225 --> 00:08:31.485
Um, so, uh, the goal that I gave myself about six years ago

174
00:08:32.105 --> 00:08:35.965
was, I wanna make owning your own place on the web require

175
00:08:36.025 --> 00:08:39.365
no technical knowledge to set up or to maintain.

176
00:08:39.985 --> 00:08:42.445
And I want you to be able to do this in under a minute.

177
00:08:42.945 --> 00:08:45.365
And again, this comes down to the experience, right?

178
00:08:46.025 --> 00:08:47.725
It takes you how long

179
00:08:47.785 --> 00:08:50.645
to get an account at a centralised service run

180
00:08:50.665 --> 00:08:53.525
by some Silicon Valley company somewhere, right?

181
00:08:53.905 --> 00:08:56.685
Uh, you're not, of course, owning and controlling that.

182
00:08:56.745 --> 00:08:59.365
You are renting that from them in exchange for

183
00:08:59.595 --> 00:09:04.205
what? Your data, your, you know, uh, insight into your life,

184
00:09:04.205 --> 00:09:06.845
which can be used against you then, uh,

185
00:09:07.745 --> 00:09:10.405
for their profit motive or whatever other motives they have.

186
00:09:11.585 --> 00:09:14.765
So this is the goal I gave myself about six years ago,

187
00:09:15.145 --> 00:09:16.405
and I've been working on it

188
00:09:16.425 --> 00:09:19.165
for about six years on this particular solution.

189
00:09:19.585 --> 00:09:21.565
Um, I've been working on the problem for about a decade,

190
00:09:22.465 --> 00:09:25.165
and, uh, as of last month, I was able

191
00:09:25.165 --> 00:09:26.485
to get it to 10 seconds.

192
00:09:27.665 --> 00:09:29.685
I'm okay with that. I'm not gonna keep optimizing that.

193
00:09:29.765 --> 00:09:31.085
I think 10 seconds is fine.

194
00:09:32.185 --> 00:09:35.455
Um, you know, few seconds faster would be great.

195
00:09:35.475 --> 00:09:38.535
But why is that important? Again, if we can make it so

196
00:09:38.535 --> 00:09:42.095
that it is not, it's not the hurdle, this is not

197
00:09:42.095 --> 00:09:43.415
what people get stuck at,

198
00:09:43.885 --> 00:09:46.975
then we have a chance at creating this topologically

199
00:09:47.005 --> 00:09:48.695
decentralised network.

200
00:09:48.725 --> 00:09:51.015
This is where a lot of peer-to-peer fails.

201
00:09:51.695 --> 00:09:52.935
A lot of peer-to-peer fails

202
00:09:52.935 --> 00:09:56.055
because of two large challenges with peer-to-peer.

203
00:09:56.635 --> 00:09:59.535
One is findability, the other is availability.

204
00:10:00.035 --> 00:10:02.535
And the third one is usability.

205
00:10:03.355 --> 00:10:06.535
So findability, it's, it's a hard problem, right?

206
00:10:06.875 --> 00:10:08.895
If we're doing peer-to-peer in the sense that I want

207
00:10:08.895 --> 00:10:11.295
to be able to go from my phone directly to your phone,

208
00:10:11.455 --> 00:10:13.875
I need to be able to find your phone, right?

209
00:10:14.575 --> 00:10:18.235
And, uh, or from my phone to your computer, I need

210
00:10:18.235 --> 00:10:19.675
to be able to find your computer.

211
00:10:20.535 --> 00:10:23.155
Uh, so we need some sort of, uh, addressing system.

212
00:10:23.215 --> 00:10:25.075
We could use gossip systems, etc.

213
00:10:25.075 --> 00:10:26.355
There, there are ways of doing it.

214
00:10:26.665 --> 00:10:30.675
Usually they involve some node that's always on and findable

215
00:10:30.675 --> 00:10:33.195
and well known that acts as an intermediary.

216
00:10:33.735 --> 00:10:37.035
So my thought was, okay, this is, we always end up having

217
00:10:37.055 --> 00:10:40.875
to use some centralised node to guarantee findability.

218
00:10:41.215 --> 00:10:44.195
We always end up having to use some centralised node

219
00:10:44.195 --> 00:10:47.715
that becomes a trusted node to guarantee, uh, availability.

220
00:10:48.315 --> 00:10:51.275
'cause your computer might be off, your phone might be off.

221
00:10:51.295 --> 00:10:52.995
How do we get messages between them?

222
00:10:53.065 --> 00:10:54.995
Well, we have to store them somewhere, right?

223
00:10:55.025 --> 00:10:57.515
That becomes usually an always-on centralised node.

224
00:10:57.865 --> 00:11:00.635
What if we make it a network of always-on nodes

225
00:11:00.635 --> 00:11:01.915
that are owned and controlled by people?

226
00:11:02.055 --> 00:11:03.915
So that's the idea behind it.

227
00:11:05.055 --> 00:11:08.315
Um, and the way that I've been able to do this is

228
00:11:08.425 --> 00:11:11.355
through three interrelated apps, through controlling

229
00:11:12.275 --> 00:11:14.595
a large amount of the experience.

230
00:11:14.835 --> 00:11:18.595
I haven't rebuilt the whole stack. This is the web still.

231
00:11:18.825 --> 00:11:20.275
It's built on the web, on,

232
00:11:20.275 --> 00:11:22.795
on core web protocols and technologies.

233
00:11:23.815 --> 00:11:26.435
But I've had to rebuild parts of the stack

234
00:11:26.905 --> 00:11:30.835
because the stack is built for Big Tech, not for Small Tech.

235
00:11:31.625 --> 00:11:34.205
All of the free and open source frameworks that we have, all

236
00:11:34.205 --> 00:11:36.445
of the free and open source servers that we have

237
00:11:37.025 --> 00:11:39.325
are released by corporations like Google,

238
00:11:39.435 --> 00:11:40.845
like Facebook, etc.

239
00:11:41.265 --> 00:11:45.285
Why to enable people to be able to create similar tools

240
00:11:45.745 --> 00:11:49.365
or, you know, more so to work for them, uh,

241
00:11:49.395 --> 00:11:51.685
when they learn these open source tools so

242
00:11:51.685 --> 00:11:53.445
that they can get bigger, etc.

243
00:11:54.225 --> 00:11:56.765
So, um, I've had to rebuild parts of the stack

244
00:11:57.585 --> 00:12:01.525
and, uh, the apps are Kitten, Domain, and Yarn.

245
00:12:02.455 --> 00:12:04.315
So you're going to see two of those today.

246
00:12:04.375 --> 00:12:06.915
Kitten and Domain, Yarn, I'm just starting on.

247
00:12:07.375 --> 00:12:09.355
Kitten is a Small Web development kit.

248
00:12:10.465 --> 00:12:12.755
It's a little kit, get it? Kitten.

249
00:12:13.215 --> 00:12:17.035
Um, so, uh, it's aimed at developers.

250
00:12:17.575 --> 00:12:19.635
So this is not for everyday people

251
00:12:19.635 --> 00:12:20.995
who use technology as an everyday thing.

252
00:12:20.995 --> 00:12:23.155
It's for developers. It's for the programmers among us.

253
00:12:23.775 --> 00:12:25.195
And, uh, you can find out more about

254
00:12:25.195 --> 00:12:27.915
it at Kitten.small-web.org.

255
00:12:28.295 --> 00:12:30.155
All of these are of course, free and open source.

256
00:12:30.485 --> 00:12:32.915
Everything we do at Small Technology

257
00:12:32.915 --> 00:12:34.395
Foundation is free and open source.

258
00:12:34.935 --> 00:12:38.115
Um, and I don't mean open as an open for business.

259
00:12:38.475 --> 00:12:41.235
I mean free as in Freedom. So everything's under AGPL.

260
00:12:42.055 --> 00:12:45.755
Um, Domain is a Small Web hosting platform.

261
00:12:46.215 --> 00:12:47.955
So I said I got it down to 10 seconds

262
00:12:48.135 --> 00:12:50.115
to set up your own Small Web place.

263
00:12:50.255 --> 00:12:54.475
That's a combination of Domain and Kitten working together.

264
00:12:55.055 --> 00:12:58.555
Domain hosts Kitten Apps, apps created in Kitten.

265
00:12:58.975 --> 00:13:01.195
And the fact that they know about each other, the fact

266
00:13:01.195 --> 00:13:03.195
that they work together is why I've been able

267
00:13:03.195 --> 00:13:04.675
to get it down to 10 seconds.

268
00:13:05.345 --> 00:13:08.075
That, and things like Kitten has an in-process

269
00:13:08.395 --> 00:13:09.555
database that I wrote.

270
00:13:09.615 --> 00:13:10.995
So you don't have like some sort

271
00:13:10.995 --> 00:13:12.315
of centralised big database.

272
00:13:12.495 --> 00:13:15.075
Why? We don't need to farm everyone's data.

273
00:13:15.615 --> 00:13:17.355
We don't need to work with Big Data.

274
00:13:17.565 --> 00:13:20.515
We're just working with your data and you own

275
00:13:20.515 --> 00:13:22.155
and control all of that functionality.

276
00:13:23.055 --> 00:13:25.675
So that's aimed at organisations like us,

277
00:13:25.905 --> 00:13:27.435
like Small Technology Foundation.

278
00:13:27.885 --> 00:13:32.115
We're going to host an instance of domain at small-web.org

279
00:13:32.285 --> 00:13:33.635
where we'll be hosting people

280
00:13:34.215 --> 00:13:39.155
and how many people? At most, a couple of tens of thousand,

281
00:13:39.155 --> 00:13:41.075
like 20,000, 10,000 at most.

282
00:13:42.295 --> 00:13:44.955
Uh, why? Because we don't need to do more than

283
00:13:44.955 --> 00:13:45.995
that to be sustainable.

284
00:13:46.335 --> 00:13:47.395
And that's what we're aiming

285
00:13:47.395 --> 00:13:49.835
for sustainability within the current system.

286
00:13:50.535 --> 00:13:53.715
So maybe people there will pay us 10 Euros a month in order

287
00:13:53.715 --> 00:13:54.995
to have their Small Web place.

288
00:13:55.055 --> 00:13:57.595
And that's what will make our not-for-profit sustainable.

289
00:13:58.015 --> 00:13:59.675
And then we'll cut it off at one point

290
00:13:59.675 --> 00:14:01.635
because our goal is not to grow and scale

291
00:14:01.815 --> 00:14:03.115
and become a centre.

292
00:14:04.175 --> 00:14:05.835
And other organisations, hopefully

293
00:14:05.835 --> 00:14:07.995
around the world will host these Small

294
00:14:07.995 --> 00:14:09.355
Web sites using Domain.

295
00:14:09.915 --> 00:14:11.275
A big part of the challenge has been

296
00:14:11.275 --> 00:14:12.395
to make Domain very easy

297
00:14:12.455 --> 00:14:14.435
for other organisations to set up and use.

298
00:14:14.935 --> 00:14:16.515
It would've been much easier if we were

299
00:14:16.515 --> 00:14:17.555
gonna be the only hosts.

300
00:14:18.215 --> 00:14:22.475
So, um, you can find out more about that on, uh,

301
00:14:22.665 --> 00:14:25.075
codeberg.org/domain/app.

302
00:14:25.115 --> 00:14:26.795
I haven't got a separate site for it yet.

303
00:14:26.815 --> 00:14:28.435
In fact, Kitten didn't have its own site

304
00:14:28.435 --> 00:14:29.875
until last week, but it does now.

305
00:14:29.975 --> 00:14:31.835
So to go there, it's very nice

306
00:14:31.835 --> 00:14:33.435
and very welcoming to developers.

307
00:14:34.215 --> 00:14:38.235
Um, Yarn is a Small Web personal social network app.

308
00:14:38.735 --> 00:14:41.675
So this is an app created with Kitten

309
00:14:41.805 --> 00:14:43.715
where you can be public if you want to be private,

310
00:14:43.735 --> 00:14:44.835
if you want to be, right?

311
00:14:45.135 --> 00:14:47.635
And I'll show you what the private aspect is going

312
00:14:47.635 --> 00:14:50.635
to look like in a demonstration here, um, that I'm going

313
00:14:50.635 --> 00:14:51.805
to be helped on.

314
00:14:52.145 --> 00:14:56.165
Um, uh, so, uh, that's, that's the bit that's

315
00:14:56.165 --> 00:14:57.605
for everyday people who use

316
00:14:57.605 --> 00:14:58.845
technology as an everyday thing.

317
00:14:59.225 --> 00:15:01.485
And I'm just starting on that part.

318
00:15:02.425 --> 00:15:04.205
So, um, it's these three things.

319
00:15:04.265 --> 00:15:06.245
And I wanna start with a demonstration of Domain.

320
00:15:06.245 --> 00:15:09.125
So I said I got it down to 10 seconds to create a new site.

321
00:15:09.745 --> 00:15:11.245
Uh, I wanna give you an idea of

322
00:15:11.245 --> 00:15:12.805
what Domain looks like and how it works.

323
00:15:13.745 --> 00:15:17.765
So let me switch over here. Uh, great.

324
00:15:17.885 --> 00:15:20.565
I started this earlier. I just created some prewarmed domains

325
00:15:20.625 --> 00:15:22.525
for, uh, Domain to work with.

326
00:15:22.785 --> 00:15:26.925
Uh, do not worry about that. Let's, uh, let's go over here.

327
00:15:27.445 --> 00:15:30.565
I have Domain running on my own, uh, computer here.

328
00:15:30.585 --> 00:15:32.805
So I'm just gonna go to its settings now.

329
00:15:32.805 --> 00:15:37.405
You'll see that right now. Um, it says it's coming in 2024.

330
00:15:37.795 --> 00:15:41.285
This is the bit where actually, uh, people would use, um,

331
00:15:41.395 --> 00:15:43.645
outside of your organisation to sign up

332
00:15:43.645 --> 00:15:44.765
for its Small Web places.

333
00:15:45.425 --> 00:15:48.085
Um, the settings that I'm going to is

334
00:15:48.195 --> 00:15:50.885
what the organisation itself would use to set up places.

335
00:15:51.705 --> 00:15:53.685
Um, and again, if you are an organisation

336
00:15:53.685 --> 00:15:56.205
and you want to host Small Web sites, you would configure it.

337
00:15:56.205 --> 00:15:58.125
First of all, your setup of Domain.

338
00:15:58.145 --> 00:16:00.685
You would set your organisation details like the app here.

339
00:16:01.225 --> 00:16:02.325
Um, you would decide

340
00:16:02.325 --> 00:16:04.685
what applications you wanna support to be installed.

341
00:16:04.685 --> 00:16:06.205
From there. You can see, um,

342
00:16:06.205 --> 00:16:08.645
applications are installed from Git repositories.

343
00:16:08.825 --> 00:16:11.445
So everything, again, the whole ecosystem is built on free

344
00:16:11.445 --> 00:16:13.045
and open source, right?

345
00:16:13.225 --> 00:16:16.085
Uh, you don't, you wanna have like a, a private app that,

346
00:16:16.085 --> 00:16:17.285
that you wanna install through this?

347
00:16:17.285 --> 00:16:19.165
No, it's not built for that. This is the whole

348
00:16:19.165 --> 00:16:20.525
ecosystem is free and open source.

349
00:16:21.305 --> 00:16:23.645
Um, and you can configure it.

350
00:16:23.905 --> 00:16:27.765
Um, if you're running a public version of Domain, it has

351
00:16:27.765 --> 00:16:29.205
to be on the Public Suffix List.

352
00:16:29.445 --> 00:16:31.645
'cause what I did is I basically hacked the Public Suffix

353
00:16:31.645 --> 00:16:33.885
List in a way, um, to use it.

354
00:16:34.225 --> 00:16:37.725
So that small-web.org, for example, in my case,

355
00:16:37.725 --> 00:16:41.205
small-web.org, uh, if it's on the Public Suffix List,

356
00:16:41.305 --> 00:16:42.845
do you know what the Public Suffix List is?

357
00:16:44.035 --> 00:16:46.245
It's a list that all of your browsers has.

358
00:16:46.625 --> 00:16:49.565
So every browser on all of your computers, uh,

359
00:16:49.965 --> 00:16:52.205
downloads this list called the Public Suffix List

360
00:16:52.425 --> 00:16:53.965
that's maintained by Mozilla.

361
00:16:54.505 --> 00:16:56.645
And on it are listed these domains,

362
00:16:56.645 --> 00:16:58.605
like small-web.org is listed there.

363
00:16:59.025 --> 00:17:02.485
If the browser sees that domain in the Public Suffix List,

364
00:17:02.665 --> 00:17:04.565
it treats it like a top level domain.

365
00:17:05.145 --> 00:17:08.405
It treats it like dot org, it treats it like dot com.

366
00:17:09.145 --> 00:17:10.725
And that's really important. It's really important

367
00:17:10.725 --> 00:17:12.365
for security because it means

368
00:17:12.365 --> 00:17:14.445
that you don't have cross-contamination of cookies,

369
00:17:14.665 --> 00:17:17.085
etc., between which you would normally have, um,

370
00:17:17.085 --> 00:17:20.285
between sub-domains of a third level domain.

371
00:17:20.505 --> 00:17:24.045
Uh, and, um, it means that basically

372
00:17:24.865 --> 00:17:28.605
we are de-facto running our own domain name,

373
00:17:28.865 --> 00:17:30.165
our own top-level domain,

374
00:17:30.465 --> 00:17:31.765
but it doesn't have to be commercial.

375
00:17:32.185 --> 00:17:34.485
We don't have to go through the ICANN system, etc.

376
00:17:34.585 --> 00:17:36.245
So that's a little hack, right?

377
00:17:36.945 --> 00:17:40.445
Um, we, we make the most of what is… what exists, you know,

378
00:17:40.445 --> 00:17:42.685
the bits we can use within the kind of system

379
00:17:42.685 --> 00:17:44.485
that exists right now, even if it's mostly

380
00:17:44.545 --> 00:17:45.765
geared for Big Tech.

381
00:17:46.745 --> 00:17:51.205
Um, and, uh, you set up your Domain Name Service, uh,

382
00:17:51.205 --> 00:17:54.365
which you can do from, uh, uh, DNSimple.

383
00:17:54.985 --> 00:17:57.765
And you set up your Virtual Private Server service,

384
00:17:57.815 --> 00:18:00.445
which currently is, uh, supports Hetzner,

385
00:18:00.445 --> 00:18:02.445
but it can support different ones in the future.

386
00:18:02.625 --> 00:18:04.245
That's the goal. Um,

387
00:18:04.345 --> 00:18:06.365
and once you've done that, if you want to take payments,

388
00:18:06.365 --> 00:18:07.725
you can set up your payment system.

389
00:18:07.795 --> 00:18:09.445
It's not set up right now for this one.

390
00:18:09.945 --> 00:18:11.965
And then you can create places.

391
00:18:12.545 --> 00:18:13.885
Now, this could be for your organisation.

392
00:18:13.885 --> 00:18:15.685
This could actually be like, you know, the University

393
00:18:15.685 --> 00:18:18.405
of Groningen could run its own Domain instance

394
00:18:18.945 --> 00:18:21.365
and it could set up Small Web.

395
00:18:21.365 --> 00:18:23.285
So you could set up Small Web places for everyone

396
00:18:23.285 --> 00:18:25.805
who works here and, and who studies here, etc.

397
00:18:26.005 --> 00:18:28.205
So you could, we could build this system here if we wanted

398
00:18:28.205 --> 00:18:29.885
to, basically, right?

399
00:18:29.905 --> 00:18:32.965
We could kickstart it here, just like maybe, uh, uh,

400
00:18:33.285 --> 00:18:34.645
Facebook got kickstarted in Harvard.

401
00:18:35.225 --> 00:18:37.325
Uh, but it would be a non shit Facebook

402
00:18:37.325 --> 00:18:38.445
that we kickstart here.

403
00:18:38.505 --> 00:18:40.485
We could do that if we wanted to, um, and,

404
00:18:40.485 --> 00:18:41.525
and University of Groningen

405
00:18:41.545 --> 00:18:43.325
could actually run their own Domain instance.

406
00:18:43.865 --> 00:18:47.605
So, um, what I'm going to do is I'm going to install, um,

407
00:18:48.205 --> 00:18:49.885
a custom application, which just means

408
00:18:49.885 --> 00:18:52.005
that I haven't added it to my Domain instance yet.

409
00:18:52.665 --> 00:18:54.365
And it's called end-to-end…

410
00:18:54.395 --> 00:18:57.565
It's the end-to-end encrypted Kitten Chat example

411
00:18:58.275 --> 00:19:00.845
from the Kitten examples that we have.

412
00:19:01.265 --> 00:19:02.885
Um, so I have it on Codeberg.

413
00:19:03.085 --> 00:19:04.925
Do you guys know Codeberg at all?

414
00:19:06.135 --> 00:19:07.785
It's like GitHub, but it's not shit.

415
00:19:08.445 --> 00:19:10.665
Um, it's run by a not-for-profit.

416
00:19:10.815 --> 00:19:12.825
It's not run by Microsoft, etc.

417
00:19:12.885 --> 00:19:15.505
And otherwise it's like GitHub and it's a cooperative

418
00:19:15.525 --> 00:19:17.065
and it's based in, uh, Germany.

419
00:19:18.045 --> 00:19:22.705
So, um, here's the end-to-end encrypted Kitten Chat example.

420
00:19:22.815 --> 00:19:23.825
This is a Kitten app.

421
00:19:24.605 --> 00:19:25.985
Um, it, even though it's an,

422
00:19:26.775 --> 00:19:29.625
it's quite a sophisticated app in the sense of

423
00:19:29.625 --> 00:19:31.825
what it's doing, there's not much to it.

424
00:19:32.365 --> 00:19:33.705
Uh, as you'll see with Kitten apps,

425
00:19:33.785 --> 00:19:35.345
'cause I'm going to, whatever time we have at the end,

426
00:19:35.445 --> 00:19:36.545
I'm going to take you through Kitten.

427
00:19:36.545 --> 00:19:38.985
If, if you have your notebooks with you, you can install it

428
00:19:38.985 --> 00:19:40.665
and you can follow along with me later.

429
00:19:41.245 --> 00:19:43.025
Um, but we wanna just install this.

430
00:19:43.125 --> 00:19:47.025
So I'm just going to get the URL of the repository there

431
00:19:48.125 --> 00:19:52.185
and put it into my source and I'll put this on…

432
00:19:52.405 --> 00:19:55.565
Um, let's call this Groningen…

433
00:19:57.555 --> 00:19:59.325
just to make sure it doesn't exist… Aral.

434
00:20:00.385 --> 00:20:03.125
And, uh, I'm so sorry, what was your name again? [Tariq.]

435
00:20:03.745 --> 00:20:06.615
Tariq, of course. T-A-R-I-Q. Yeah?

436
00:20:06.765 --> 00:20:09.335
Alright, so I'll create one instance for myself.

437
00:20:09.335 --> 00:20:11.655
Now I'm gonna register this. Watch, watch this.

438
00:20:11.845 --> 00:20:13.255
This is the best… This is where it just blows

439
00:20:13.255 --> 00:20:14.295
up, of course, 'cause you're watching.

440
00:20:14.595 --> 00:20:16.055
Um, don't watch that intently!

441
00:20:16.715 --> 00:20:19.295
Um, so domain registered starting server

442
00:20:20.155 --> 00:20:22.075
provisioning security certificate.

443
00:20:23.055 --> 00:20:26.715
And there we go! Your new place is ready.

444
00:20:27.175 --> 00:20:29.115
All right, that was it. I'm gonna view the place…

445
00:20:30.335 --> 00:20:33.915
And that's at groningen-aral.small-web.org.

446
00:20:33.915 --> 00:20:36.355
You can go there now. It exists, it's a server that exists.

447
00:20:36.465 --> 00:20:40.955
It's running a VPS server, um, uh, very tiny VPS server

448
00:20:40.975 --> 00:20:42.035
and it exists and it's running.

449
00:20:42.535 --> 00:20:46.595
Um, and then if I click this link, um, I can go to, uh,

450
00:20:46.855 --> 00:20:51.525
the private, uh, chat area, but it says I can't sign in

451
00:20:51.525 --> 00:20:54.045
because my identity and secret have not been created yet.

452
00:20:54.595 --> 00:20:57.965
Okay? So, um, I'm gonna go back here…

453
00:20:57.965 --> 00:20:59.365
where are my settings?

454
00:20:59.815 --> 00:21:01.685
There we go! It says “Create secret.”

455
00:21:02.345 --> 00:21:05.635
And I'm gonna go over there. It says, “Hello! Welcome

456
00:21:05.635 --> 00:21:06.835
to your new Small Web place.”

457
00:21:06.835 --> 00:21:08.715
Maybe I'll make that a little smaller so you guys can see it.

458
00:21:09.535 --> 00:21:11.435
That's Kitten, actually. A little kitten.

459
00:21:11.455 --> 00:21:12.515
Oh, I have Kitten stickers.

460
00:21:12.515 --> 00:21:15.235
By the way, if anyone wants Kitten stickers at the end,

461
00:21:15.545 --> 00:21:17.235
just come and pick up your Kitten sticker.

462
00:21:17.855 --> 00:21:20.355
Um, so it's created a secret for me.

463
00:21:20.355 --> 00:21:22.435
And my secret is a list of emoji

464
00:21:23.065 --> 00:21:27.925
that doesn't seem very secure, does it? Doesn't, it doesn't,

465
00:21:27.925 --> 00:21:29.885
doesn't, uh, exude a lot of confidence.

466
00:21:30.425 --> 00:21:31.685
Um, it is very secure.

467
00:21:31.755 --> 00:21:34.685
That is your ed25519 private key

468
00:21:35.195 --> 00:21:39.685
encoded in basically base-256, mapped to, uh, a list of emoji

469
00:21:39.685 --> 00:21:40.845
that I seem… that I like.

470
00:21:41.545 --> 00:21:44.445
Um, why is it emoji?

471
00:21:44.445 --> 00:21:45.765
Well write that down

472
00:21:45.905 --> 00:21:48.805
and post it on the monitor if you can, right?

473
00:21:48.805 --> 00:21:51.085
On a, on a sticky note and put it on your monitor.

474
00:21:51.225 --> 00:21:52.325
You can't, right?

475
00:21:52.865 --> 00:21:55.085
Um, so, uh, one of the things that I'm trying to do

476
00:21:55.085 --> 00:21:57.925
with this is to encourage good security, right?

477
00:21:57.925 --> 00:22:00.045
So it actually says, you know,

478
00:22:00.545 --> 00:22:03.725
put this in your password manager in the bit that's

479
00:22:03.725 --> 00:22:04.845
for everyday people for, uh,

480
00:22:04.875 --> 00:22:06.685
that use technology as an everyday thing.

481
00:22:07.345 --> 00:22:10.045
Um, it will actually tell you what a password manager is

482
00:22:10.045 --> 00:22:12.005
that you'll be able to find out if you don't know

483
00:22:12.065 --> 00:22:14.205
and lead you through that process, right?

484
00:22:14.865 --> 00:22:17.445
Um, so I, I'm just gonna copy this secret here.

485
00:22:18.425 --> 00:22:20.965
And since I'm running it here, I'm not even gonna save it

486
00:22:21.245 --> 00:22:22.925
'cause I'm… I like to live dangerously.

487
00:22:23.705 --> 00:22:25.725
Um, and I'll paste it in here now.

488
00:22:25.825 --> 00:22:27.005
So I went back here,

489
00:22:27.005 --> 00:22:28.965
lemme make this a bit smaller, that's too small.

490
00:22:29.425 --> 00:22:33.565
But anyway, um, and I'll sign in using that secret, okay?

491
00:22:34.385 --> 00:22:37.005
And, oops, I didn't wanna go into that settings.

492
00:22:37.215 --> 00:22:38.685
We'll look at what that means later.

493
00:22:39.345 --> 00:22:41.005
Um, I wanted to go into

494
00:22:41.635 --> 00:22:44.435
this settings, not settings…

495
00:22:44.675 --> 00:22:46.355
I don't, I just don't even want to go into settings.

496
00:22:46.595 --> 00:22:48.675
Actually, I wanna go into my en… encrypted chat. There we go.

497
00:22:49.335 --> 00:22:52.515
Um, there we go. End-to-End encrypted Kitten Chat.

498
00:22:52.575 --> 00:22:54.955
So there's my version of End-to-end encrypted Kitten Chat.

499
00:22:55.705 --> 00:22:58.355
This is kind of like the very seed of

500
00:22:58.355 --> 00:23:00.395
what Yarn is going to be, okay?

501
00:23:00.505 --> 00:23:03.715
Imagine if you had a blog attached to the means

502
00:23:03.815 --> 00:23:05.115
to privately communicate

503
00:23:05.295 --> 00:23:07.755
and you had those two things in a single app.

504
00:23:08.535 --> 00:23:11.995
Um, so this is kind of, this is great,

505
00:23:12.655 --> 00:23:14.595
but it's not a lot of fun if you want

506
00:23:14.595 --> 00:23:15.915
to chat just by yourself.

507
00:23:16.335 --> 00:23:18.715
So let's create another one. Let's create another server.

508
00:23:19.055 --> 00:23:22.115
So I'm gonna go back here and I'm going to go

509
00:23:22.295 --> 00:23:25.115
to, let's just view the places.

510
00:23:25.115 --> 00:23:27.875
There we go. We've created that one. Let's create a new one.

511
00:23:28.735 --> 00:23:33.315
And I'll call this groningen… tariq. There we go!

512
00:23:33.385 --> 00:23:36.755
Yeah, I got it right? Boom! Registering it…

513
00:23:36.755 --> 00:23:37.995
Look, it's working again!

514
00:23:38.535 --> 00:23:41.595
Can it work twice in a row in a demo? Maybe.

515
00:23:41.985 --> 00:23:43.155
This is still very young.

516
00:23:43.225 --> 00:23:44.995
This is, I mean, I've been working on it for a long time,

517
00:23:45.145 --> 00:23:47.365
but I mean, there's a lot behind the scenes.

518
00:23:48.025 --> 00:23:51.485
Um, there we go! “New place is ready.” Yeah, you have one too.

519
00:23:51.715 --> 00:23:53.805
Alright, so I'm just gonna create the secret,

520
00:23:55.225 --> 00:23:56.925
and now that I've created my secret,

521
00:23:57.065 --> 00:23:58.165
I'm gonna copy my secret.

522
00:23:58.775 --> 00:24:02.725
There we go. And I am going to send you this secret

523
00:24:03.625 --> 00:24:04.645
on Signal.

524
00:24:05.865 --> 00:24:10.815
So let me, uh, just launch Signal over here…

525
00:24:11.675 --> 00:24:13.015
Oh, gosh, no, I don't wanna actually

526
00:24:13.015 --> 00:24:14.375
show everyone my Signal, though,

527
00:24:14.375 --> 00:24:17.495
do I? Uh, how do we do this…? Damn it!

528
00:24:18.155 --> 00:24:22.015
Mirela is laughing at me in Signal. [Laughter] Great!

529
00:24:24.355 --> 00:24:26.455
All right, here we go. So we go to Tariq…

530
00:24:27.235 --> 00:24:29.175
and we paste the secret.

531
00:24:29.875 --> 00:24:31.335
And there you go. Nope,

532
00:24:31.435 --> 00:24:33.455
I'm not gonna send you an emoji, a sticker.

533
00:24:33.485 --> 00:24:37.375
Come on sticker. No sticker! There we go… Signal! Good!

534
00:24:38.195 --> 00:24:42.615
Did you get it, Tariq? Yes. Perfect.

535
00:24:43.195 --> 00:24:47.295
All right. Um, so, um, I need you to go to,

536
00:24:47.995 --> 00:24:51.095
uh, groningen-tariq.small-web.org

537
00:24:52.755 --> 00:24:56.135
and, uh, just to that domain, just there.

538
00:24:56.435 --> 00:25:00.015
Yes. And go to the link… click that link

539
00:25:00.015 --> 00:25:01.535
where… it's the private link.

540
00:25:02.035 --> 00:25:04.495
So this one, this end-to-end encrypted Kitten chat.

541
00:25:06.935 --> 00:25:10.905
Just, uh, can you see it? Lemme see what's going on…

542
00:25:11.125 --> 00:25:15.785
[Tariq] I'm seeing this now. [Aral] Uh, “this is currently a placeholder

543
00:25:15.925 --> 00:25:18.105
for…” Oh, that, you know why that is?

544
00:25:19.085 --> 00:25:21.985
We did set up a server. I just, uh,

545
00:25:22.045 --> 00:25:24.185
set up the wrong app on it.

546
00:25:24.885 --> 00:25:29.305
So let's create another server. Excellent! Look at that!

547
00:25:29.545 --> 00:25:31.825
I, I I installed Place there, which is, uh,

548
00:25:31.825 --> 00:25:32.985
currently a placeholder.

549
00:25:33.565 --> 00:25:35.785
All right, so instead, let's go to Custom again,

550
00:25:36.355 --> 00:25:37.705
let's put the source in there.

551
00:25:37.895 --> 00:25:39.945
It's a live demo. These things happen.

552
00:25:40.565 --> 00:25:42.265
Um, this was all my fault, by the way.

553
00:25:42.565 --> 00:25:47.235
And we'll say groningen… tariq… two

554
00:25:49.715 --> 00:25:51.315
Ta-dum! Register! Servers are cheap.

555
00:25:51.695 --> 00:25:53.515
We can just create as many servers as we want,

556
00:25:53.775 --> 00:25:54.875
and then I will delete them so

557
00:25:54.875 --> 00:25:55.955
that I don't pay too much for them.

558
00:25:56.495 --> 00:25:58.835
Um, all right, domain is registered. 

559
00:25:59.615 --> 00:26:01.035
Oh shit, this is where, this is

560
00:26:01.035 --> 00:26:02.635
where everything's gonna go wrong, isn't it?

561
00:26:03.815 --> 00:26:06.655
Dammit. Ah, it was going so well.

562
00:26:08.475 --> 00:26:10.615
All right, let's see what's happened. Gimme one second.

563
00:26:10.875 --> 00:26:11.895
I'm just gonna go in here

564
00:26:12.315 --> 00:26:15.945
and, uh, oh, what are you doing?

565
00:26:17.405 --> 00:26:20.475
Stuff is happening. All right. Forget that. Let's restart.

566
00:26:21.215 --> 00:26:23.795
If it doesn't work, you turn it off. You turn it on again.

567
00:26:23.795 --> 00:26:25.915
This is, this is what we do in tech.

568
00:26:26.655 --> 00:26:29.515
Um, all right, let's just see what state this is in.

569
00:26:32.425 --> 00:26:36.235
Um, ooh, what are you doing? Okay, cool.

570
00:26:36.235 --> 00:26:38.715
It's, it's doing, it's, it's setting up its prewarmed servers.

571
00:26:38.875 --> 00:26:41.795
That's good. Alright, let's try this one last time.

572
00:26:43.095 --> 00:26:46.795
So, so let's go to dev4.ar.al

573
00:26:46.885 --> 00:26:49.235
and to its settings.

574
00:26:49.615 --> 00:26:50.875
So again, we're in Domain

575
00:26:51.975 --> 00:26:53.835
and I am going to,

576
00:26:55.245 --> 00:26:57.715
let's just see if our prewarmed servers are there.

577
00:26:58.605 --> 00:27:02.195
We've got another server being prewarmed right now.

578
00:27:02.615 --> 00:27:04.035
So there we go.

579
00:27:04.035 --> 00:27:05.155
Let's just wait for that as well,

580
00:27:05.155 --> 00:27:06.555
because it is, it is pre-release.

581
00:27:06.555 --> 00:27:09.995
It is a bit temperamental right now, and, uh, the queue

582
00:27:10.215 --> 00:27:12.675
and stuff needs a little bit of work just to make sure

583
00:27:12.675 --> 00:27:14.475
that it's not temperamental… “servers ready.”

584
00:27:14.525 --> 00:27:17.915
Great. So we should have, if I look over here,

585
00:27:19.685 --> 00:27:21.985
all right, three prewarmed servers, we should be fine.

586
00:27:22.155 --> 00:27:25.425
Let's go and create this again, um, custom.

587
00:27:27.365 --> 00:27:29.585
And there's the Kitten chat,

588
00:27:30.245 --> 00:27:32.265
and we'll just make it a… groningen…

589
00:27:33.195 --> 00:27:37.285
Third time's a charm [nervous laugh]… tariq three… There we go.

590
00:27:38.505 --> 00:27:42.515
Okay, fingers crossed. “Registering domain…” “domain registered…”

591
00:27:42.775 --> 00:27:47.055
Get beyond that! Ah, nope!

592
00:27:47.875 --> 00:27:51.525
It is… I mean,

593
00:27:51.545 --> 00:27:54.945
unless what is happening?

594
00:27:57.765 --> 00:28:01.385
No, we're, we're, we're, something's gone wrong with the,

595
00:28:02.145 --> 00:28:05.035
with the internal state of this, um,

596
00:28:05.285 --> 00:28:09.595
which does suck in the middle of a… here's

597
00:28:09.595 --> 00:28:13.395
what we can do though, Tariq, here's what we can do…

598
00:28:13.905 --> 00:28:15.915
I've got your secret. That's fine. You know what?

599
00:28:16.035 --> 00:28:19.435
I can change that server into a Kitten Chat server.

600
00:28:19.975 --> 00:28:21.715
Um, that's exactly what I'm going to do…

601
00:28:22.855 --> 00:28:25.995
So, um, and you'll see a little bit of, uh, Kitten there.

602
00:28:26.135 --> 00:28:29.915
So groningen… what was it? tariq… right? Yes.

603
00:28:30.975 --> 00:28:32.755
Oh, live demos… Got a love them.

604
00:28:32.895 --> 00:28:34.235
So this is what's there right now.

605
00:28:34.895 --> 00:28:38.835
Um, what I can do is I can go into Kitten's own settings in

606
00:28:38.835 --> 00:28:42.995
there, and every Kitten app has this.

607
00:28:43.935 --> 00:28:47.875
And over here I can use, um,

608
00:28:48.225 --> 00:28:49.995
that, do I still have?

609
00:28:50.815 --> 00:28:53.145
This was Tariq’s, right? No, this is mine.

610
00:28:54.065 --> 00:28:58.765
Um, do I still have the… Sorry, in Signal?

611
00:28:59.105 --> 00:29:01.725
Ah, yes, that's right. I have it in Signal. There we go.

612
00:29:02.665 --> 00:29:03.895
Let's get your secret from there.

613
00:29:03.895 --> 00:29:05.735
That's my password manager right now.

614
00:29:06.665 --> 00:29:09.855
Don't use it as a password manager. Uh, here we go.

615
00:29:10.675 --> 00:29:13.935
And I'll copy that. There we go. So I can sign in.

616
00:29:16.025 --> 00:29:18.245
Now let's see if this works. So, these are the settings

617
00:29:18.245 --> 00:29:20.125
that are common to all Kitten apps

618
00:29:20.305 --> 00:29:21.725
and there's a lot of stuff in there.

619
00:29:22.145 --> 00:29:24.685
Um, but one of them is you can actually change the

620
00:29:24.685 --> 00:29:25.725
app that's on there.

621
00:29:25.865 --> 00:29:27.765
You can deploy a new app onto your server.

622
00:29:28.425 --> 00:29:30.365
So thank fuck I put that in there.

623
00:29:30.825 --> 00:29:32.685
Uh, it's always nice

624
00:29:32.685 --> 00:29:34.645
to have these little manual ways of doing things.

625
00:29:35.025 --> 00:29:37.805
Now, if this work- git, uh, does not end git,

626
00:29:37.825 --> 00:29:39.045
it should end in Git.

627
00:29:39.055 --> 00:29:42.045
There you go. Deploy! Yes, please. Deploy. It.

628
00:29:42.045 --> 00:29:45.555
Could not find domain upstairs. Oh, bullocks!

629
00:29:45.835 --> 00:29:47.355
I know what's happening, though. I can fix this!

630
00:29:47.565 --> 00:29:51.755
Gimme one seconds… Uh, we run Domain it, it's communicating

631
00:29:51.755 --> 00:29:53.755
with Domain, with the original Domain that set it up.

632
00:29:54.515 --> 00:29:56.975
Do it! Work?! Yes!

633
00:30:00.005 --> 00:30:01.645
I mean, this is fun for me. I don't know if it's fun

634
00:30:01.645 --> 00:30:02.925
for you, but here we go.

635
00:30:02.945 --> 00:30:05.165
We have a new Small Web place set up.

636
00:30:05.615 --> 00:30:08.365
Gonna copy your secret Tariq, like the last

637
00:30:08.515 --> 00:30:10.965
however many minutes, five minutes didn't happen.

638
00:30:11.295 --> 00:30:13.645
We're copying his secret. It was so smooth…

639
00:30:14.185 --> 00:30:16.165
It was just, um, wonderful.

640
00:30:16.665 --> 00:30:18.765
And we're going to go to Signal now

641
00:30:20.145 --> 00:30:21.845
and… come on,

642
00:30:21.845 --> 00:30:26.295
Signal… launch! Thank you!

643
00:30:28.395 --> 00:30:33.045
Um, and I'll send you this… and we close this.

644
00:30:34.105 --> 00:30:37.285
You have it? Yes? Now when you go there, Tariq, tell us,

645
00:30:37.425 --> 00:30:39.605
do you see the end-to-End encrypted chat?

646
00:30:41.485 --> 00:30:44.425
Please say yes! Alright! Excellent!

647
00:30:44.725 --> 00:30:46.905
You're in the end-to-end encrypted chat.

648
00:30:48.045 --> 00:30:49.785
And you need to sign in with your secret.

649
00:30:50.215 --> 00:30:52.185
He's signing in with a secret. You can all see this.

650
00:30:52.255 --> 00:30:55.385
This is good and it works. Now, here's how we're gonna chat.

651
00:30:56.335 --> 00:30:59.305
Bloody hell! Alright, um, here we go.

652
00:30:59.305 --> 00:31:00.345
Here's how we're gonna chat.

653
00:31:01.005 --> 00:31:02.865
I'm gonna send a message to you, okay?

654
00:31:02.915 --> 00:31:05.865
Where? Well, I know your address, right?

655
00:31:06.445 --> 00:31:09.025
You are groningen-tariq dot

656
00:31:10.155 --> 00:31:12.265
small-web.org, okay?

657
00:31:12.685 --> 00:31:16.675
And I'm gonna say, “Hey, Tariq, wasn't

658
00:31:17.445 --> 00:31:21.855
that entirely seamless and smooth?”

659
00:31:22.945 --> 00:31:24.935
There we go! And I'm gonna send that to you.

660
00:31:27.595 --> 00:31:30.855
Please work! groningen tariq dot small-web.org.

661
00:31:32.025 --> 00:31:34.645
“Hey, Tariq wasn’t that entirely seamless and smooth?” Send!

662
00:31:36.035 --> 00:31:39.295
Why are you not sending it to groningen tariq?

663
00:31:39.315 --> 00:31:40.615
Did I spell that? Spell that right.

664
00:31:41.685 --> 00:31:44.915
Maybe it doesn't need the, this is a small test demo… okay!

665
00:31:44.975 --> 00:31:48.755
Yes! You don't need the HTTPS. Do I know my own demo? No.

666
00:31:49.345 --> 00:31:51.035
Alright. How do you respond to me?

667
00:31:51.815 --> 00:31:53.555
I'm groningen-aral… say something!

668
00:31:54.375 --> 00:31:56.515
God, we have drawn this demo out far,

669
00:31:57.015 --> 00:31:59.515
far more than it should have gone for, uh,

670
00:31:59.865 --> 00:32:02.075
time-wise, but that's okay…

671
00:32:03.055 --> 00:32:04.835
Now what you're, what you're seeing here

672
00:32:05.855 --> 00:32:09.315
is end-to-end encrypted messages being… there you go!

673
00:32:09.735 --> 00:32:11.835
You have now experienced… one of the first people

674
00:32:11.835 --> 00:32:14.115
to experience the peer-to-peer web.

675
00:32:14.255 --> 00:32:18.195
We have just sent messages from one web server owned

676
00:32:18.255 --> 00:32:22.475
by Tariq to another web server owned by me, right?

677
00:32:22.505 --> 00:32:23.515
Tiny little web server.

678
00:32:24.175 --> 00:32:25.635
Um, there's a lot of work to do

679
00:32:25.735 --> 00:32:27.355
to make the whole process smoother.

680
00:32:27.495 --> 00:32:30.715
And Domain is not very close to, I mean, Domain is going

681
00:32:30.715 --> 00:32:32.875
to launch this year, but I have a few months

682
00:32:32.875 --> 00:32:34.115
of work to do on it.

683
00:32:34.735 --> 00:32:38.345
Um, but what you see there is something that

684
00:32:39.075 --> 00:32:41.205
doesn't currently exist, right?

685
00:32:41.865 --> 00:32:43.885
The ability to set up your own web place

686
00:32:44.425 --> 00:32:47.405
in about 10 seconds… when it works, um,

687
00:32:48.265 --> 00:32:50.485
and the ability to use that web space

688
00:32:50.505 --> 00:32:53.085
to communicate privately between one another.

689
00:32:53.505 --> 00:32:56.165
The animation that you see is just BC that's just like,

690
00:32:56.595 --> 00:32:57.805
it's on the client side.

691
00:32:57.805 --> 00:33:00.005
It's just making it look like it's doing something.

692
00:33:00.425 --> 00:33:04.405
Um, the actual, you know, encryption/decryption is, is not

693
00:33:04.405 --> 00:33:05.525
as exciting necessarily.

694
00:33:06.225 --> 00:33:07.405
Um, but there we go.

695
00:33:08.065 --> 00:33:11.805
So that is a… that is a demonstration of domain.

696
00:33:13.775 --> 00:33:16.715
The other thing that Domain, I mean, uh, what you saw there,

697
00:33:16.775 --> 00:33:19.555
Domain itself is written in Kitten, uh,

698
00:33:19.695 --> 00:33:21.675
the end-to-End encrypted example

699
00:33:21.675 --> 00:33:23.355
that you saw is written in Kitten.

700
00:33:24.175 --> 00:33:28.035
Um, so, uh, let's take a look in the remaining time,

701
00:33:29.055 --> 00:33:30.875
uh, at Kitten itself.

702
00:33:31.815 --> 00:33:34.275
So for one thing, like, why Kitten?

703
00:33:34.295 --> 00:33:38.075
Why did I have to create my own server, my own kind

704
00:33:38.075 --> 00:33:40.195
of framework, basically, uh,

705
00:33:40.255 --> 00:33:42.035
why not just use one of the Big Tech ones?

706
00:33:42.895 --> 00:33:44.855
I touched upon this earlier… they’re

707
00:33:44.875 --> 00:33:47.015
for building Big Tech, right?

708
00:33:47.875 --> 00:33:49.215
Our needs are much simpler.

709
00:33:49.835 --> 00:33:52.255
And at the same time, all of that complexity means

710
00:33:52.285 --> 00:33:55.015
that I couldn't possibly set up a server in 10 seconds

711
00:33:55.045 --> 00:33:56.215
like that, right?

712
00:33:56.615 --> 00:33:58.015
I couldn't possibly make it so

713
00:33:58.015 --> 00:34:00.135
that it requires no technical knowledge

714
00:34:00.135 --> 00:34:01.175
to update, etc.

715
00:34:01.475 --> 00:34:02.695
Or it would be much harder

716
00:34:03.035 --> 00:34:05.215
and there would be so much overhead… Why?

717
00:34:06.205 --> 00:34:09.485
I would be running an out-of-process database like PostgeSQL

718
00:34:09.505 --> 00:34:10.925
or, or, or MySQL

719
00:34:10.925 --> 00:34:13.445
or whatever they’re MariaDB as we're calling it.

720
00:34:13.565 --> 00:34:17.285
I think now, um, these databases are built for Big Tech

721
00:34:17.305 --> 00:34:18.805
for Big Data, right?

722
00:34:19.405 --> 00:34:22.285
I would have to run, uh, maybe, uh,

723
00:34:22.345 --> 00:34:24.365
an external queuing system, etc.

724
00:34:25.205 --> 00:34:28.125
Mastodon, for example, which you saw my Fediverse site,

725
00:34:28.125 --> 00:34:30.645
my Mastodon site… is built with these technologies.

726
00:34:31.505 --> 00:34:34.845
And, you know, I've seen accomplished engineers spend hours

727
00:34:34.955 --> 00:34:37.285
kind of and rip up their hair, uh, trying

728
00:34:37.285 --> 00:34:39.005
to install it properly.

729
00:34:39.395 --> 00:34:42.325
Yeah? Um, so we can't do

730
00:34:42.325 --> 00:34:44.845
that if we want our success criteria to be,

731
00:34:44.845 --> 00:34:46.565
everybody can have this easily.

732
00:34:47.745 --> 00:34:50.645
So let me show you, um, what Kitten is.

733
00:34:51.105 --> 00:34:53.845
Uh, those of you that have your laptops with you, um,

734
00:34:53.865 --> 00:34:57.245
if you want to, uh, play along, you can.

735
00:34:58.025 --> 00:35:01.485
Um, I'm just gonna take you through the basics of it just

736
00:35:01.485 --> 00:35:04.005
to show you how many of you have com- like programming

737
00:35:04.005 --> 00:35:07.375
knowledge? How many of you have created stuff for the web?

738
00:35:08.845 --> 00:35:10.575
Okay, so that's about half of you

739
00:35:10.575 --> 00:35:12.335
or more than half of you for both of those.

740
00:35:12.745 --> 00:35:15.175
Maybe a few hands less for the web.

741
00:35:15.755 --> 00:35:20.435
Um, so you probably have gone through some of the struggles.

742
00:35:21.015 --> 00:35:23.995
Uh, you probably know some of the challenges of it.

743
00:35:24.175 --> 00:35:27.275
So I'd really like you to kind of compare it to, well,

744
00:35:27.275 --> 00:35:30.395
what's a Small Web approach look like? Where our goal isn't

745
00:35:30.395 --> 00:35:34.915
to scale some node as as large as we can… to cluster to,

746
00:35:34.975 --> 00:35:37.570
you know, farm as many people as we can for their data.

747
00:35:37.625 --> 00:35:40.645
If that's not our goal, if our goal is just to create a tool

748
00:35:41.225 --> 00:35:42.845
for a person that they themselves own

749
00:35:42.905 --> 00:35:45.565
and can use, how does it look

750
00:35:45.565 --> 00:35:47.925
as a developer, from the development side of it?

751
00:35:48.585 --> 00:35:52.525
So let's take a look… Alright, I am going to move this here.

752
00:35:53.335 --> 00:35:54.845
Let's, we don't need Domain anymore.

753
00:35:55.715 --> 00:35:58.805
I'll just go to my demo folder. There we go.

754
00:35:59.585 --> 00:36:02.165
And we'll make a new folder for Groningen.

755
00:36:02.665 --> 00:36:04.125
Yes, I did prep for this, believe it

756
00:36:04.125 --> 00:36:06.165
or not, I did have a prep folder there.

757
00:36:06.905 --> 00:36:08.525
Um, and, uh,

758
00:36:08.525 --> 00:36:11.765
let's just take a look at Kitten, what it's like…

759
00:36:11.765 --> 00:36:14.885
So first of all, um, how do you get it?

760
00:36:15.355 --> 00:36:20.005
Well, you go to kitten.small-web.org.

761
00:36:21.435 --> 00:36:23.615
Kitten itself was… the Kitten website is

762
00:36:23.615 --> 00:36:26.095
of course written in Kitten and deployed using Domain.

763
00:36:26.955 --> 00:36:28.215
Um, and, uh,

764
00:36:28.275 --> 00:36:29.895
if you scroll down here, it tells you what it is.

765
00:36:31.135 --> 00:36:32.645
First and foremost, it's a server.

766
00:36:33.465 --> 00:36:36.325
If you give it HTML from 1993, it will serve it.

767
00:36:36.625 --> 00:36:38.805
And that's by design. It should do that.

768
00:36:39.505 --> 00:36:41.445
But then you can progressively enhance it

769
00:36:41.795 --> 00:36:42.965
with modern technology.

770
00:36:43.075 --> 00:36:47.005
It's got things like built-in support for, uh, cryptography,

771
00:36:47.345 --> 00:36:50.525
uh, for public-key, uh, uh, encryption and decryption.

772
00:36:51.185 --> 00:36:55.525
Um, and you can create peer-to-peer Small Web apps with it.

773
00:36:55.985 --> 00:36:58.485
Um, it's got a really neat workflow.

774
00:36:58.945 --> 00:37:02.005
Um, I mean, I, I made it so I have to think it's neat,

775
00:37:02.085 --> 00:37:04.685
I guess called Streaming HTML, which I'll show you as well.

776
00:37:05.025 --> 00:37:08.045
So to get started, if any of you wanna follow along, uh,

777
00:37:08.045 --> 00:37:10.125
you should hopefully have gotten the tab

778
00:37:10.185 --> 00:37:11.205
for your operating system.

779
00:37:11.465 --> 00:37:15.325
Now, if you're on Windows… let's not do this. Okay?

780
00:37:16.545 --> 00:37:18.365
If you're on Windows, there we go.

781
00:37:18.365 --> 00:37:22.085
If you're on Windows, it says “Windows is an ad infested

782
00:37:22.085 --> 00:37:24.005
and surveillance-ridden dumpster fire

783
00:37:24.025 --> 00:37:26.285
of an operating system, and you're putting both yourself

784
00:37:26.285 --> 00:37:27.845
and others at risk by using it.”

785
00:37:29.745 --> 00:37:32.165
And that's even without Recall. Yeah, exactly.

786
00:37:32.705 --> 00:37:36.365
It does also say, “if you are not forced to use it

787
00:37:36.365 --> 00:37:39.765
for reasons outside of your control, please do not use it.”

788
00:37:40.065 --> 00:37:41.965
If you are… if you're forced to use it

789
00:37:42.155 --> 00:37:44.405
because of reasons outside of your control, I get it.

790
00:37:45.025 --> 00:37:46.605
You know, that might be, you can't afford a

791
00:37:46.605 --> 00:37:47.685
new computer right now.

792
00:37:47.705 --> 00:37:51.205
You, you can't afford the time to, to mess with Linux.

793
00:37:51.225 --> 00:37:53.085
Or maybe, I don't know, uh,

794
00:37:53.865 --> 00:37:56.325
or it might be that work mandates that you use this.

795
00:37:57.605 --> 00:37:58.725
Anything outside of that, though,

796
00:38:00.005 --> 00:38:02.085
I have zero sympathy for you at this point.

797
00:38:02.625 --> 00:38:06.005
Um, I was on DOS as a 7-year-old,

798
00:38:06.425 --> 00:38:07.645
so I, I'm also stubborn.

799
00:38:07.785 --> 00:38:09.485
So I moved on to Windows and stayed on

800
00:38:09.485 --> 00:38:10.845
for far longer than I should have.

801
00:38:11.265 --> 00:38:13.925
Um, don't make the same mistakes I did kids. Okay?

802
00:38:13.925 --> 00:38:17.805
Just say no! Um, so if you're on Windows, don't follow along

803
00:38:17.805 --> 00:38:20.285
because the installation instructions are are much more

804
00:38:20.285 --> 00:38:21.285
complicated as well.

805
00:38:21.705 --> 00:38:24.005
Uh, if you're on Linux or macOS, you just copy

806
00:38:24.025 --> 00:38:26.805
and paste this into your terminal, um,

807
00:38:26.825 --> 00:38:28.125
and you will install Kitten.

808
00:38:28.285 --> 00:38:30.045
I mean, I've got, I've got Kitten installed,

809
00:38:30.045 --> 00:38:31.525
but I can just do it here to show you.

810
00:38:31.945 --> 00:38:34.045
Um, as long as my Internet connection works…

811
00:38:34.595 --> 00:38:36.085
Boom! Kitten is installed.

812
00:38:36.635 --> 00:38:39.045
Okay? Uh, it's a bit faster on mine, um,

813
00:38:39.045 --> 00:38:41.165
because it already downloaded the runtime.

814
00:38:41.265 --> 00:38:42.845
The runtime is NodeJS.

815
00:38:42.865 --> 00:38:45.725
So those of you who've done web, uh, programming

816
00:38:46.265 --> 00:38:48.245
Kitten uses NodeJS as a runtime.

817
00:38:48.845 --> 00:38:51.365
I call it a runtime because I might change my mind later.

818
00:38:51.685 --> 00:38:55.045
I might move on to something else, but probably not.

819
00:38:55.455 --> 00:38:57.885
Still, I want keep that option open.

820
00:38:58.625 --> 00:39:02.445
Um, so we have installed Kitten, so let's run it. Okay?

821
00:39:03.145 --> 00:39:04.285
Um, the way you run it,

822
00:39:04.465 --> 00:39:06.325
and I'm on an empty directory right now,

823
00:39:06.345 --> 00:39:07.405
is I'm just gonna say “kitten”.

824
00:39:08.715 --> 00:39:12.895
We have not created anything yet. Kitten is running, okay.

825
00:39:12.895 --> 00:39:15.575
Server's running and waiting for, uh, connections.

826
00:39:15.575 --> 00:39:17.095
There's a little kitten. There you go.

827
00:39:17.915 --> 00:39:21.715
Um, and, uh, I'm just gonna go to localhost

828
00:39:21.765 --> 00:39:24.945
where it's running and it says 404 page,

829
00:39:24.965 --> 00:39:27.305
not found… exactly what's expected, right?

830
00:39:27.645 --> 00:39:28.665
We haven't created anything.

831
00:39:29.285 --> 00:39:32.825
So this is the most basic Kitten website that you can build.

832
00:39:33.565 --> 00:39:36.465
Um, let's go ahead and make it a bit more interesting.

833
00:39:36.765 --> 00:39:39.065
So let's close this. There we go.

834
00:39:39.525 --> 00:39:44.185
And I'm going to just, uh, create a file called index.html.

835
00:39:44.525 --> 00:39:46.345
All right? So we're going back to 1993 now,

836
00:39:47.165 --> 00:39:51.665
and in my index html, oh, the moment I created it,

837
00:39:51.665 --> 00:39:53.345
did you see? It just went blank.

838
00:39:54.265 --> 00:39:58.095
So now it's found it, but there's nothing in it. Okay?

839
00:39:58.245 --> 00:40:00.655
Alright. I can live with blank. Blank is good.

840
00:40:01.195 --> 00:40:03.815
Um, so there, I'm going to say “hello”.

841
00:40:04.405 --> 00:40:06.775
Well, let's, let's, let's make it some HTML at least.

842
00:40:07.275 --> 00:40:09.655
Um, let's say “hello world”. All right?

843
00:40:09.675 --> 00:40:10.775
Our very first example,

844
00:40:11.635 --> 00:40:15.735
and this is just an HTML file, um, it actually, uh,

845
00:40:15.805 --> 00:40:18.855
does not have a reload for HTML files.

846
00:40:19.275 --> 00:40:21.375
Um, but there we go. “Hello, world!”

847
00:40:21.725 --> 00:40:23.175
Okay, this is not very exciting,

848
00:40:23.175 --> 00:40:24.815
but it means that if you give it something from

849
00:40:25.095 --> 00:40:26.535
1993, it will render it.

850
00:40:27.105 --> 00:40:28.335
Let's make it a bit more exciting.

851
00:40:28.625 --> 00:40:31.215
Let's create a dynamic page. Alright?

852
00:40:31.275 --> 00:40:33.695
So I'm going to… not exit my browser…

853
00:40:34.415 --> 00:40:37.795
although I could, I mean, it's just, um, not

854
00:40:37.795 --> 00:40:39.795
what I was planning on doing, uh, over here.

855
00:40:39.985 --> 00:40:43.035
Exit the editor instead. Just… far better.

856
00:40:43.895 --> 00:40:46.955
Um, and I'm just going to move that index html

857
00:40:46.955 --> 00:40:50.005
to an index.page.js, okay?

858
00:40:50.905 --> 00:40:52.885
And, uh, let, let me go back into my editor.

859
00:40:54.385 --> 00:40:57.645
So now, if I just save this

860
00:40:58.225 --> 00:41:00.965
and go to localhost, I'm not gonna get an empty page,

861
00:41:00.965 --> 00:41:04.005
I'm gonna get an error because it says, “oh,

862
00:41:04.865 --> 00:41:09.085
the page route at index.page.js is missing a handler.”

863
00:41:09.345 --> 00:41:11.285
Uh, what's a handler? Oh, it's this…

864
00:41:11.905 --> 00:41:15.185
So part of my goal for Kitten is

865
00:41:15.185 --> 00:41:17.985
that hopefully it will be really useful for education,

866
00:41:18.445 --> 00:41:20.225
for actually teaching people how

867
00:41:20.225 --> 00:41:21.985
to build things for the web.

868
00:41:22.445 --> 00:41:25.145
So it tries to be as helpful as it can

869
00:41:25.325 --> 00:41:28.145
to guide you along in the process, even if you're just kind

870
00:41:28.145 --> 00:41:29.185
of stumbling along with it.

871
00:41:29.605 --> 00:41:32.065
Oh, that looks like a a, an export default.

872
00:41:32.325 --> 00:41:35.365
So you export a default function that returns some Kitten,

873
00:41:35.405 --> 00:41:38.005
HTML, which is a tagged template in JavaScript that has

874
00:41:38.005 --> 00:41:42.045
that “Hello, world!”, okay, seems like a lot more code

875
00:41:42.045 --> 00:41:43.885
to do the same thing, but let's see if it works.

876
00:41:43.895 --> 00:41:45.165
First of all. Um,

877
00:41:45.225 --> 00:41:46.925
so I just did that and it says “Hello, world!“

878
00:41:47.035 --> 00:41:49.445
Okay, great, but we don't have to say “Hello, world!” now,

879
00:41:49.905 --> 00:41:50.965
so we can evolve this.

880
00:41:51.055 --> 00:41:52.245
Let's start evolving it.

881
00:41:52.245 --> 00:41:57.205
Can you all read the code? From the back as well? Yeah?

882
00:41:57.555 --> 00:41:59.125
Okay! All right.

883
00:41:59.345 --> 00:42:02.965
So instead of “Hello, world!”, what can we make it say?

884
00:42:03.025 --> 00:42:04.645
So let's just, uh, indent it nicely.

885
00:42:05.585 --> 00:42:10.025
Um, how about we, um, put a little cat on there.

886
00:42:11.055 --> 00:42:15.825
Okay, that's still a static, um, static, uh,

887
00:42:15.925 --> 00:42:19.345
string, but this is JavaScript, so it doesn't have

888
00:42:19.345 --> 00:42:20.665
to be a static string.

889
00:42:21.335 --> 00:42:22.825
This is a tagged template string.

890
00:42:23.165 --> 00:42:24.825
So what I can do, I'll make it a bit bigger

891
00:42:24.825 --> 00:42:26.985
for you guys just in case it helps.

892
00:42:27.485 --> 00:42:31.185
Um, what I can do is I can repeat that maybe 10 times.

893
00:42:32.265 --> 00:42:35.545
'cause I can actually include JavaScript code in this

894
00:42:35.545 --> 00:42:37.985
because this is a JavaScript file now, right?

895
00:42:37.985 --> 00:42:39.585
So now if I save it, we get 10 kittens,

896
00:42:40.245 --> 00:42:41.825
way better than one kitten, right?

897
00:42:42.405 --> 00:42:45.185
Um, but again, quite static. It's always 10 Kittens.

898
00:42:45.565 --> 00:42:47.185
So why don't we make it so

899
00:42:47.185 --> 00:42:50.265
that every time you reload the page, you get another kitten.

900
00:42:50.535 --> 00:42:51.985
Does that sound good? Yeah?

901
00:42:52.485 --> 00:42:54.025
So, I'm going to go over here

902
00:42:54.885 --> 00:42:58.705
and create a variable called count, and I'll set it to zero

903
00:42:59.645 --> 00:43:00.785
and over here, instead

904
00:43:00.785 --> 00:43:04.185
of repeating it 10 times all the time, um, what I'm going

905
00:43:04.185 --> 00:43:07.745
to do is I'm going to say, uh, plus, plus count.

906
00:43:08.205 --> 00:43:09.265
So I'm putting the plus plus

907
00:43:09.265 --> 00:43:11.465
before it so that it's gonna be one the first time,

908
00:43:11.565 --> 00:43:13.425
two the second time, etc., right?

909
00:43:13.525 --> 00:43:15.385
So here we are. Now, if I go into my browser

910
00:43:16.045 --> 00:43:19.425
and I refresh, you get a Kitten every time, that's pretty cool!

911
00:43:19.715 --> 00:43:23.065
There we go. Um, but here's the thing.

912
00:43:24.215 --> 00:43:26.105
This is happening in memory, right?

913
00:43:26.135 --> 00:43:29.105
I've just created a variable and the variable’s in memory.

914
00:43:29.805 --> 00:43:32.425
So what's the problem with this? Maybe nothing.

915
00:43:32.715 --> 00:43:34.545
Maybe you wanna have an ephemeral website

916
00:43:34.695 --> 00:43:35.705
that forgets things.

917
00:43:36.325 --> 00:43:40.225
That's okay. Maybe you wanna have statistics for the website

918
00:43:40.225 --> 00:43:41.505
that you're building, but you don't want this

919
00:43:41.505 --> 00:43:43.545
to be something that's held onto and stored.

920
00:43:44.045 --> 00:43:46.545
You want it to disappear every time the server restarts.

921
00:43:46.545 --> 00:43:49.585
That's cool. That's privacy-respecting. That's kind of nice.

922
00:43:49.965 --> 00:43:52.665
So, you know, we've been taught by Silicon Valley

923
00:43:52.975 --> 00:43:55.065
that the only thing that matters is storing

924
00:43:55.085 --> 00:43:56.505
as much data as we can.

925
00:43:57.085 --> 00:43:59.225
Not necessarily, you know, there… there's,

926
00:43:59.225 --> 00:44:01.905
there's something cool about things being ephemeral as well.

927
00:44:02.805 --> 00:44:05.625
So, um, but in this case, if I go

928
00:44:05.625 --> 00:44:07.865
and turn off the server, there we go.

929
00:44:08.645 --> 00:44:11.105
And I go back and I restart it. Look at what happens.

930
00:44:12.205 --> 00:44:16.585
We get one kitten. Damn, we lost all those kittens. Sad.

931
00:44:16.925 --> 00:44:19.865
Um, how do we keep the kittens? We need to persist it.

932
00:44:20.365 --> 00:44:22.825
We need a scary database, right?

933
00:44:22.825 --> 00:44:24.145
This is where normally you would go

934
00:44:24.145 --> 00:44:26.465
and you would, you know, install your out-

935
00:44:26.465 --> 00:44:29.265
of-process database, you’d install your library

936
00:44:29.525 --> 00:44:31.405
for object mapping between your database

937
00:44:31.425 --> 00:44:32.885
or if you're even geekier,

938
00:44:32.885 --> 00:44:35.085
you’d just write your SQL statements and all of that, right?

939
00:44:35.535 --> 00:44:37.445
We're gonna approach it a little differently.

940
00:44:38.265 --> 00:44:42.205
So we want to persist this count. So here's what we do.

941
00:44:42.615 --> 00:44:44.045
First of all, we need

942
00:44:44.045 --> 00:44:46.365
to create a database table for this, right?

943
00:44:46.905 --> 00:44:51.205
And, uh, Kitten comes with a JavaScript database.

944
00:44:51.205 --> 00:44:55.005
This is an in-process in-memory database that I wrote, um,

945
00:44:55.115 --> 00:44:56.165
that persists

946
00:44:56.385 --> 00:45:00.805
to append-only JavaScript files, not JSON files.

947
00:45:01.465 --> 00:45:05.165
It actually outputs JavaScript code in an append-only log

948
00:45:05.665 --> 00:45:07.125
and then loads that back in.

949
00:45:07.125 --> 00:45:09.845
So you're actually working with native objects.

950
00:45:10.185 --> 00:45:13.565
You can, you can, uh, persist basic objects…

951
00:45:13.865 --> 00:45:16.925
You can also persist custom, uh, instances

952
00:45:16.945 --> 00:45:18.445
of custom classes, uh,

953
00:45:18.825 --> 00:45:20.885
and get them back as that instance of a class.

954
00:45:20.905 --> 00:45:22.205
So it's a pretty cool little thing.

955
00:45:22.705 --> 00:45:24.725
Um, so how do we use it though?

956
00:45:25.185 --> 00:45:26.245
We can use it very basically.

957
00:45:26.545 --> 00:45:31.285
So I'm going to say if kitten.db, every app gets a database

958
00:45:31.835 --> 00:45:34.695
kitten.db, so it's very easy to use.

959
00:45:34.915 --> 00:45:37.575
You don't have to set it up dot kittens

960
00:45:38.775 --> 00:45:40.315
equals undefined.

961
00:45:40.615 --> 00:45:42.915
If it doesn't exist, let's create it, right?

962
00:45:43.205 --> 00:45:47.475
We'll say, uh, kitten.db.kittens

963
00:45:48.135 --> 00:45:51.475
equals, we'll set the count to zero, okay?

964
00:45:52.255 --> 00:45:55.275
Now all we have to do here is instead of plus plus count,

965
00:45:55.375 --> 00:45:57.635
we just say plus plus kitten

966
00:45:58.255 --> 00:46:01.365
dot db dot kittens

967
00:46:02.415 --> 00:46:04.805
dot count… kittens is just an object,

968
00:46:05.875 --> 00:46:09.045
basically a table if you think in traditional database

969
00:46:09.045 --> 00:46:10.885
parlance, but it's a JavaScript object

970
00:46:11.065 --> 00:46:14.285
and every time it changes, it is being persisted to disk.

971
00:46:15.105 --> 00:46:18.245
So, um, let's see. That's what I'm telling you. Is it true?

972
00:46:18.615 --> 00:46:20.765
Let's refresh. So this time we've got,

973
00:46:20.885 --> 00:46:22.045
I dunno, five kittens.

974
00:46:22.425 --> 00:46:24.765
So I'm gonna go over here, turn off the server,

975
00:46:25.155 --> 00:46:27.805
turn on the server, and when the server comes back,

976
00:46:28.795 --> 00:46:30.135
we have six kittens.

977
00:46:31.075 --> 00:46:33.465
So it's persisted. That's a database.

978
00:46:34.685 --> 00:46:36.825
So, um, the Kitten Chat example

979
00:46:36.825 --> 00:46:40.185
that you saw stores its data using the Kitten database

980
00:46:40.565 --> 00:46:42.945
Domain uses the Kitten database internally.

981
00:46:43.565 --> 00:46:45.705
And, uh, you can do far more complicated things

982
00:46:45.705 --> 00:46:46.745
with it as well.

983
00:46:46.765 --> 00:46:47.905
You know, you can actually have,

984
00:46:47.905 --> 00:46:50.865
you can have type safety all through that process

985
00:46:51.045 --> 00:46:53.625
of persisting to disk and getting your custom objects back.

986
00:46:54.405 --> 00:46:57.145
Um, but, so this is cool, I guess.

987
00:46:57.765 --> 00:47:00.305
Um, it shows you how easy it is to work with a database,

988
00:47:02.335 --> 00:47:04.715
but this is not how we normally build apps, right?

989
00:47:05.065 --> 00:47:07.795
Like this… like refreshing a page to do something.

990
00:47:08.335 --> 00:47:11.475
You would normally, if this was a real production-quality

991
00:47:11.615 --> 00:47:14.275
Kitten count app, uh, you would have like a button

992
00:47:14.785 --> 00:47:16.755
that you press and you'd get more kittens, right?

993
00:47:17.295 --> 00:47:19.955
So let's take a look at the Streaming HTML workflow

994
00:47:20.265 --> 00:47:21.795
that you can include on this.

995
00:47:21.815 --> 00:47:23.315
And this is probably the last thing I'm gonna

996
00:47:23.385 --> 00:47:24.435
show you about Kitten.

997
00:47:24.575 --> 00:47:26.755
And then maybe we can have like in the remaining 10 minutes

998
00:47:26.775 --> 00:47:28.475
or so, a a little Q&A.

999
00:47:28.735 --> 00:47:30.045
Um, I don't know if we can overrun

1000
00:47:30.045 --> 00:47:31.485
by five minutes with a Q&A.

1001
00:47:31.485 --> 00:47:35.805
If not, that's fine. Um, alright, so we wanna have a button,

1002
00:47:35.945 --> 00:47:38.525
and when we press the button, we want, um,

1003
00:47:38.785 --> 00:47:40.965
our kittens to, to appear.

1004
00:47:41.705 --> 00:47:45.205
So, um, before I do this, I want to, uh,

1005
00:47:45.875 --> 00:47:48.285
show you a concept in Kitten, which is components.

1006
00:47:48.825 --> 00:47:53.325
In order to do that, I wanna show you Kitten’s new, uh, as

1007
00:47:53.325 --> 00:47:56.045
of like several weeks ago, interactive shell.

1008
00:47:56.385 --> 00:47:58.805
So Kitten is running in my terminal right now here,

1009
00:47:58.985 --> 00:48:00.605
and it says to launch the interactive,

1010
00:48:00.605 --> 00:48:01.725
shell press the S key.

1011
00:48:02.345 --> 00:48:04.445
So Kitten itself has an interactive shell.

1012
00:48:05.265 --> 00:48:07.685
If you press the S key, you're now inside

1013
00:48:07.685 --> 00:48:10.605
of the running Kitten instance of your site, right?

1014
00:48:11.445 --> 00:48:12.905
And you can see what, uh,

1015
00:48:12.905 --> 00:48:15.745
properties there are in the Kitten, the global object.

1016
00:48:16.125 --> 00:48:18.785
So, um, we have a database at kitten.db, right?

1017
00:48:19.795 --> 00:48:24.255
So if I look at kitten.db.kittens, I can see that, um,

1018
00:48:24.255 --> 00:48:27.655
there's my, that's what it looks like internally, right?

1019
00:48:27.685 --> 00:48:29.575
There's my object with the count of six.

1020
00:48:29.605 --> 00:48:32.015
It's actually a proxy. That's how the magic is happening.

1021
00:48:32.395 --> 00:48:36.095
Um, because that object is being pro… is wrapped around, uh,

1022
00:48:36.155 --> 00:48:39.175
has functionality wrapped around it that's capturing changes

1023
00:48:39.275 --> 00:48:41.495
to it and persisting it to them… doing all of those things.

1024
00:48:42.555 --> 00:48:46.695
Um, so, uh, and it's kind of cool

1025
00:48:46.695 --> 00:48:48.135
because you can change it here as well.

1026
00:48:48.135 --> 00:48:50.375
Like if I wanted to have lots more kittens

1027
00:48:50.915 --> 00:48:53.295
and I didn't wanna have to press reload, um,

1028
00:48:53.415 --> 00:48:54.695
I could just set it to a hundred.

1029
00:48:55.275 --> 00:48:57.495
And when I refresh, I have a hundred kittens.

1030
00:48:57.875 --> 00:49:01.455
So you're actually working with the state of the, uh, the,

1031
00:49:01.475 --> 00:49:02.855
the current app that's running.

1032
00:49:03.195 --> 00:49:05.335
Um, this is really useful if like you wanna mess with things

1033
00:49:05.335 --> 00:49:08.735
as that's deployed as well, you could mess things up

1034
00:49:08.735 --> 00:49:11.095
of course, but, um, it's, it's quite powerful.

1035
00:49:11.395 --> 00:49:12.495
So we're back to one.

1036
00:49:12.725 --> 00:49:16.215
What we can also do is, so this is, this is kind of cool.

1037
00:49:16.475 --> 00:49:18.895
Um, I can actually listen for changes, uh,

1038
00:49:18.895 --> 00:49:20.055
on the database as well.

1039
00:49:20.315 --> 00:49:23.855
So if I created, for example, a, a persist listener,

1040
00:49:25.115 --> 00:49:27.815
and that's a, uh, that's a function

1041
00:49:28.315 --> 00:49:32.495
and it will get, um, the target and the change.

1042
00:49:33.755 --> 00:49:38.095
Um, and if we just console log that for now, we say,

1043
00:49:38.755 --> 00:49:43.285
uh, target, changed,

1044
00:49:44.145 --> 00:49:45.805
and we'll just put the change there just

1045
00:49:45.805 --> 00:49:46.925
so you can see what's happening.

1046
00:49:47.175 --> 00:49:49.925
It'll give you a good idea of how Kitten works in terms,

1047
00:49:49.945 --> 00:49:51.485
in terms of an append-only log.

1048
00:49:52.065 --> 00:49:54.645
Um, so, um, I can just add

1049
00:49:54.645 --> 00:49:56.645
that now I can say kitten.db.kittens dot table

1050
00:49:56.645 --> 00:49:57.725
That's my table.

1051
00:49:58.265 --> 00:50:02.205
It has a private property called table where I can actually,

1052
00:50:02.505 --> 00:50:04.645
uh, add listeners and, and do other things.

1053
00:50:05.065 --> 00:50:07.885
Um, and I can listen for the persist event on there.

1054
00:50:07.885 --> 00:50:11.125
And I can just add my persist, oh, perist, perist listener.

1055
00:50:11.125 --> 00:50:14.725
Okay, sure. I’m a developer. Can I, can I spell no?

1056
00:50:15.425 --> 00:50:18.525
Um, now if I refresh, look at what happens…

1057
00:50:19.065 --> 00:50:21.605
Um, you're saying… it says JSTable changed

1058
00:50:21.945 --> 00:50:23.645
and then count ID equals zero.

1059
00:50:24.065 --> 00:50:28.405
Um, in fact, if I do this, um, if I go over here

1060
00:50:28.705 --> 00:50:32.965
and remove listener, first of all, listener,

1061
00:50:33.235 --> 00:50:38.095
persist, perist, listener, um,

1062
00:50:38.715 --> 00:50:40.335
oh, of course it's not, that's a string.

1063
00:50:40.995 --> 00:50:42.025
Lemme just remove it so

1064
00:50:42.025 --> 00:50:43.305
that it doesn't get called all the time.

1065
00:50:43.805 --> 00:50:44.825
And if I go over here

1066
00:50:45.445 --> 00:50:48.385
and, uh, both fix my spelling error,

1067
00:50:48.955 --> 00:50:50.505
let's call it a persist listener,

1068
00:50:50.925 --> 00:50:52.145
and also just instead

1069
00:50:52.145 --> 00:50:54.745
of the whole target, uh, this is the table.

1070
00:50:54.885 --> 00:50:58.505
So I can say table name and then I can go back here

1071
00:50:58.605 --> 00:51:02.945
and add a listener, uh, the persist listener this time.

1072
00:51:03.525 --> 00:51:05.825
And now if I do this, it'll be easier for you to see.

1073
00:51:06.725 --> 00:51:09.705
Um, table is not defined, eh, all right.

1074
00:51:09.705 --> 00:51:14.255
Anyway, you get the idea. Um, I'm gonna have to,

1075
00:51:14.595 --> 00:51:15.615
oh, go back in there.

1076
00:51:16.745 --> 00:51:19.575
Lemme see what I did wrong… Oh, here's the other thing.

1077
00:51:19.995 --> 00:51:22.615
You have full history when you're doing that as well.

1078
00:51:23.275 --> 00:51:25.575
Um, okay, I didn't change this

1079
00:51:25.575 --> 00:51:26.815
to table, that's what happened.

1080
00:51:27.715 --> 00:51:31.645
And let me just add that again. Persist listener. Finally.

1081
00:51:32.145 --> 00:51:34.045
Now, if I change it, Kittens changed.

1082
00:51:34.175 --> 00:51:37.485
Count six, count seven, count eight. This is JavaScript.

1083
00:51:38.105 --> 00:51:40.835
This is what's being stored in a file, append-only,

1084
00:51:41.135 --> 00:51:42.595
and then it's being loaded into memory

1085
00:51:42.975 --> 00:51:44.475
and those changes are being applied.

1086
00:51:45.175 --> 00:51:47.675
So, uh, and in its very basic form.

1087
00:51:48.335 --> 00:51:51.355
Um, you have other things here that you can play with.

1088
00:51:51.655 --> 00:51:53.875
So one of those is the Kitten HTML

1089
00:51:53.975 --> 00:51:55.435
tagged template that you had.

1090
00:51:55.895 --> 00:51:57.955
Um, so I just wanna show you how to build a component

1091
00:51:58.495 --> 00:52:01.005
in Kitten in the, in the terminal.

1092
00:52:01.545 --> 00:52:03.365
So I'm gonna say, uh,

1093
00:52:03.695 --> 00:52:06.245
let's call it a Hello component, just to keep it simple.

1094
00:52:07.105 --> 00:52:10.005
And I'm going to say, okay, well this can take a name

1095
00:52:10.985 --> 00:52:12.605
as a prop- a property,

1096
00:52:13.145 --> 00:52:17.325
and it will return some Kitten HTML, uh,

1097
00:52:17.625 --> 00:52:20.245
and the Kitten HTML will be maybe H1.

1098
00:52:20.335 --> 00:52:24.035
Hello, uh, name. Okay.

1099
00:52:24.035 --> 00:52:26.515
And then we'll close that H1 tag over here.

1100
00:52:27.255 --> 00:52:29.275
Uh, and here, um,

1101
00:52:29.675 --> 00:52:31.915
actually you can set a default for the name.

1102
00:52:31.915 --> 00:52:34.355
Maybe default is Aral if you don't provide a prop

1103
00:52:34.575 --> 00:52:36.475
and a default for that object itself,

1104
00:52:36.805 --> 00:52:38.715
we've just created a component and I can use it.

1105
00:52:38.915 --> 00:52:42.955
I can say kitten.html… Um, there we go.

1106
00:52:43.495 --> 00:52:48.265
And I include it almost like a HTML tag. Hello.

1107
00:52:49.765 --> 00:52:50.825
And it'll say hello

1108
00:52:50.825 --> 00:52:53.945
Aral, okay, if I actually pass a name,

1109
00:52:54.835 --> 00:52:59.585
so I say Mirela, then it will say Hello, Mirela.

1110
00:53:00.365 --> 00:53:01.545
Um, that's a component.

1111
00:53:01.545 --> 00:53:04.305
That's how components work in, uh, Kitten.

1112
00:53:04.885 --> 00:53:07.505
So let's go back into, um,

1113
00:53:07.645 --> 00:53:09.945
the editor over here.

1114
00:53:10.845 --> 00:53:13.865
And let's very quickly make a component, uh, make, make a,

1115
00:53:14.125 --> 00:53:15.985
uh, this have an interface.

1116
00:53:16.645 --> 00:53:20.865
So I'm gonna say button Moar Kittens. Okay?

1117
00:53:20.965 --> 00:53:23.145
We want more kittens when this is clicked.

1118
00:53:24.005 --> 00:53:27.445
Um, and uh, so something has to happen when it's clicked.

1119
00:53:28.225 --> 00:53:29.645
So, um, it's going

1120
00:53:29.645 --> 00:53:32.205
to broadcast an event if I give it a name,

1121
00:53:32.625 --> 00:53:35.485
so I'll call it moarKittens, okay?

1122
00:53:35.705 --> 00:53:37.685
And we need to connect it to our backend.

1123
00:53:38.105 --> 00:53:41.805
So I just do that by providing a connect attribute to it.

1124
00:53:42.385 --> 00:53:43.845
Now, if I do that, I need

1125
00:53:43.845 --> 00:53:46.565
to export a function from here called onConnect.

1126
00:53:46.565 --> 00:53:50.085
That will get called when the page connects with a reference

1127
00:53:50.085 --> 00:53:51.605
to the page that's connecting.

1128
00:53:52.025 --> 00:53:56.605
And on that page, I can actually, uh, listen for

1129
00:53:57.145 --> 00:54:00.705
the, uh, moarKittens event

1130
00:54:01.565 --> 00:54:04.345
and then do something when the moarKittens,

1131
00:54:04.605 --> 00:54:05.665
uh, event happens.

1132
00:54:06.125 --> 00:54:07.385
Uh, what do I want to do here?

1133
00:54:07.505 --> 00:54:09.305
I want to increase the Kitten count.

1134
00:54:09.805 --> 00:54:14.765
So I'll say kitten.db.kittens.count. Okay?

1135
00:54:15.225 --> 00:54:17.085
Um, and then I want to send,

1136
00:54:17.645 --> 00:54:20.325
I don't wanna refresh the whole page, I just want

1137
00:54:20.325 --> 00:54:24.405
to send this H1 with the right amount of kittens, just

1138
00:54:24.435 --> 00:54:27.485
that bit, almost like a component, right?

1139
00:54:27.505 --> 00:54:30.605
So let me pull that out into a component which you just saw.

1140
00:54:31.305 --> 00:54:33.845
So we'll say const Kittens,

1141
00:54:34.795 --> 00:54:36.175
and we'll make a component there.

1142
00:54:37.515 --> 00:54:39.935
And that'll just return Kitten HTML again.

1143
00:54:40.835 --> 00:54:43.375
And I'm just going to take, this is a refactor…

1144
00:54:43.515 --> 00:54:45.055
So I'm not changing the functionality.

1145
00:54:45.275 --> 00:54:48.815
I'm just, um, removing redundancy

1146
00:54:48.815 --> 00:54:49.935
that we're about to implement.

1147
00:54:50.395 --> 00:54:52.135
And I don't need to increment it now

1148
00:54:52.135 --> 00:54:54.415
because I'm incrementing it when the button is pressed.

1149
00:54:54.655 --> 00:54:56.335
I just need to send this back.

1150
00:54:56.755 --> 00:55:01.175
Now, what I do need is a way for it to know which H1,

1151
00:55:01.175 --> 00:55:02.535
which tag is being sent.

1152
00:55:02.915 --> 00:55:07.615
So I'll give this an ID of kittens so that it knows,

1153
00:55:08.035 --> 00:55:09.695
and I'll also tell it to morph it in there.

1154
00:55:09.775 --> 00:55:11.655
I don't have to do this, but it means that it's going

1155
00:55:11.655 --> 00:55:15.495
to actually just change what's changed in the HTML, not,

1156
00:55:15.515 --> 00:55:17.695
not a larger portion than it needs to.

1157
00:55:17.725 --> 00:55:18.975
It's gonna be more optimised.

1158
00:55:19.955 --> 00:55:23.375
And here I'll just say page.send

1159
00:55:24.845 --> 00:55:26.345
and I will send, um,

1160
00:55:26.645 --> 00:55:31.025
my Kittens… component.

1161
00:55:31.425 --> 00:55:34.065
Remember we did it in the, um, in the, um,

1162
00:55:35.845 --> 00:55:36.905
in the terminal earlier.

1163
00:55:37.455 --> 00:55:40.265
What I also need to do is at the beginning,

1164
00:55:41.015 --> 00:55:43.505
send the initial Kittens, right?

1165
00:55:44.745 --> 00:55:45.815
Batch… batch of Kittens.

1166
00:55:45.815 --> 00:55:47.375
And that's, this is why components are great.

1167
00:55:47.475 --> 00:55:49.695
Now I can just use that component in both places.

1168
00:55:50.145 --> 00:55:54.045
Let's see what this looks like. Oh, yes.

1169
00:55:54.545 --> 00:55:56.085
And it's telling me that as well. Thank you.

1170
00:55:56.345 --> 00:55:58.525
You are faster, um, than Kitten.

1171
00:55:59.305 --> 00:56:03.125
Um, and if I save that, now, let's see if it works.

1172
00:56:03.425 --> 00:56:05.125
So we've got this, this is this, this.

1173
00:56:05.125 --> 00:56:08.965
If I press Moar Kittens, oh, oh, oh, oh, no,

1174
00:56:10.265 --> 00:56:11.275
bad stuff has happened.

1175
00:56:11.275 --> 00:56:14.115
What has happened? We are returning Kitten HTML.

1176
00:56:14.535 --> 00:56:18.595
Um, there's an H1 here. We're repeating it by this count.

1177
00:56:19.815 --> 00:56:24.245
And, uh, la la, la, la, la. What am I doing wrong?

1178
00:56:24.895 --> 00:56:28.405
Let's see. Uh, kitten db count, page dot send.

1179
00:56:28.705 --> 00:56:33.005
Oh, here we go. This is actually just a regular string.

1180
00:56:33.085 --> 00:56:35.045
I need to be sending Kitten HTML back.

1181
00:56:35.555 --> 00:56:37.205
Okay, that's what I did wrong.

1182
00:56:37.365 --> 00:56:39.085
'cause Kitten HTML is what does all the magic.

1183
00:56:39.185 --> 00:56:43.375
So if I say Moar Kittens, now, I have more kittens, yay.

1184
00:56:43.835 --> 00:56:48.575
But also notice what we've built, okay, in about 24 lines

1185
00:56:48.575 --> 00:56:51.415
of code, which I can almost show on my tiny little screen

1186
00:56:51.415 --> 00:56:52.695
that I have here, here, there you go.

1187
00:56:53.435 --> 00:56:58.015
Um, we've basically built a Streaming HTML interface,

1188
00:56:58.665 --> 00:57:01.095
right? When that button gets clicked.

1189
00:57:01.195 --> 00:57:03.575
So what's happening behind the scenes, in case you're

1190
00:57:03.575 --> 00:57:07.015
interested, is an automatic web socket connection is being

1191
00:57:07.045 --> 00:57:09.015
made between your client and the server.

1192
00:57:09.555 --> 00:57:12.455
Uh, an automatic web socket route is being created for you.

1193
00:57:13.635 --> 00:57:15.375
We are creating a system where we're using

1194
00:57:15.395 --> 00:57:16.655
naming conventions…

1195
00:57:16.795 --> 00:57:20.975
So you can see here we named the button moarKittens

1196
00:57:21.275 --> 00:57:22.615
and we told it to connect,

1197
00:57:23.075 --> 00:57:26.175
and Kitten’s clever enough to go in there and go, okay.

1198
00:57:26.435 --> 00:57:28.015
So more connect… Whenever, um,

1199
00:57:28.455 --> 00:57:30.335
whenever this button is clicked on the client, I'm going

1200
00:57:30.335 --> 00:57:33.215
to let the server know that that event has happened.

1201
00:57:33.475 --> 00:57:35.495
And on the server we're listening for that event,

1202
00:57:35.525 --> 00:57:38.615
moarKittens, and we're actually updating a

1203
00:57:38.615 --> 00:57:39.815
value in the database.

1204
00:57:40.935 --> 00:57:44.155
And that's then, and then we are streaming HTML.

1205
00:57:44.215 --> 00:57:46.435
That's the, that's why it's called Streaming HTML.

1206
00:57:46.435 --> 00:57:49.315
We're streaming HTML through that web socket onto the page.

1207
00:57:49.575 --> 00:57:51.315
And it's being replaced in exactly

1208
00:57:51.765 --> 00:57:53.355
where, um, it needs to be.

1209
00:57:53.735 --> 00:57:57.155
The whole page isn't refreshing, only that little tiny bit.

1210
00:57:57.155 --> 00:57:59.675
So if I was to open the inspector here, um,

1211
00:57:59.775 --> 00:58:02.595
and show you what happens, look at the, uh, structure

1212
00:58:03.525 --> 00:58:06.345
and only, oh gosh, I'm refreshing, sorry,

1213
00:58:06.385 --> 00:58:07.625
I was, press the button.

1214
00:58:07.775 --> 00:58:10.465
Look at what's changing. Just that little tag.

1215
00:58:10.465 --> 00:58:13.105
That's what the morph does on there.

1216
00:58:13.805 --> 00:58:18.215
So, um, that should hopefully give you an idea of, I mean,

1217
00:58:18.215 --> 00:58:21.895
this is actually really complex stuff in very few lines

1218
00:58:21.915 --> 00:58:23.895
of code, um, that we're doing.

1219
00:58:23.915 --> 00:58:25.135
In terms of conceptually, yes,

1220
00:58:25.135 --> 00:58:26.815
we're putting kittens on a page,

1221
00:58:27.115 --> 00:58:28.695
but what we're doing is we're doing

1222
00:58:28.925 --> 00:58:30.175
persistence to a database.

1223
00:58:30.175 --> 00:58:33.135
We're doing, uh, live streaming of HTML.

1224
00:58:33.755 --> 00:58:34.975
And, you know, we're doing that

1225
00:58:34.975 --> 00:58:37.495
with very little code in a way that if you've built web apps

1226
00:58:37.495 --> 00:58:39.775
before, hopefully, it's kind of cool.

1227
00:58:40.315 --> 00:58:41.615
It, it's kind of nice.

1228
00:58:42.475 --> 00:58:44.455
Um, and again, part of it is

1229
00:58:44.455 --> 00:58:45.775
because there is no bullshit here.

1230
00:58:46.595 --> 00:58:49.375
You know, there is not, we're not trying to build something

1231
00:58:49.375 --> 00:58:51.735
that farms people for their data, etc.,

1232
00:58:51.795 --> 00:58:53.095
etc., etc., etc.

1233
00:58:53.795 --> 00:58:55.055
And that's it! That's a Small Web.

1234
00:58:55.725 --> 00:58:57.225
Um, I hope I've given you some idea

1235
00:58:57.845 --> 00:58:59.785
of kind of what I've been working on.

1236
00:59:00.405 --> 00:59:04.305
Um, hopefully you understand why without me

1237
00:59:04.305 --> 00:59:05.425
going into too much detail.

1238
00:59:05.485 --> 00:59:07.985
If you don't understand why this is important, uh,

1239
00:59:08.335 --> 00:59:09.465
look at any one

1240
00:59:09.465 --> 00:59:11.465
of my talks I've given over the last 10

1241
00:59:11.465 --> 00:59:12.505
years about the problem.

1242
00:59:12.985 --> 00:59:17.265
There'll be talks with, uh, titles like Free is a Lie, um,

1243
00:59:17.925 --> 00:59:20.145
uh, Excuse me, but your unicorn keeps

1244
00:59:20.145 --> 00:59:21.245
shitting in my backyard,

1245
00:59:21.465 --> 00:59:24.925
can he please not? Uh, stuff like that, uh,

1246
00:59:24.925 --> 00:59:27.125
where you will find out what is exactly wrong

1247
00:59:27.125 --> 00:59:29.325
with surveillance capitalism, with People Farming,

1248
00:59:29.385 --> 00:59:31.365
as I call it, with the Silicon Valley model,

1249
00:59:31.365 --> 00:59:33.325
with venture capital and all of this bullshit.

1250
00:59:33.825 --> 00:59:36.085
Um, and then maybe compare it better if, if

1251
00:59:36.085 --> 00:59:37.285
that's not evident.

1252
00:59:38.025 --> 00:59:39.285
Um, but otherwise, that's it.

1253
00:59:39.525 --> 00:59:41.365
Really, this is an introduction to the Small Web.

1254
00:59:41.445 --> 00:59:44.635
I hope you enjoyed it. And if you have any questions, let's,

1255
00:59:44.645 --> 00:59:46.075
let's take 'em until we're thrown out. [Applause]

1256
00:59:52.375 --> 00:59:55.315
And also, let me just go back, sorry, Mirela, uh, Mirela,

1257
00:59:55.315 --> 00:59:56.435
I know you want to say something,

1258
00:59:56.535 --> 01:00:01.315
but, um, I am just going to go back here, um,

1259
01:00:01.385 --> 01:00:03.355
because there might actually be

1260
01:00:03.355 --> 01:00:04.435
people watching on the stream.

1261
01:00:04.495 --> 01:00:05.675
Did I just close the stream?

1262
01:00:06.805 --> 01:00:08.335
Tell me I didn't just close the stream.

1263
01:00:08.725 --> 01:00:11.095
What have I been doing? Wait a minute. Okay.

1264
01:00:12.355 --> 01:00:14.295
Uh, nope, the stream is there. Yay.

1265
01:00:14.715 --> 01:00:18.495
I'm gonna switch back to my, uh,

1266
01:00:19.675 --> 01:00:23.815
to my camera, but also I'm going to go to owncast

1267
01:00:23.915 --> 01:00:27.135
dot small-web.org. Oh, I remember now.

1268
01:00:27.355 --> 01:00:30.775
Uh, if it's on your own computer, it does that by default so

1269
01:00:30.775 --> 01:00:32.175
that your computer's not bogged down

1270
01:00:32.175 --> 01:00:33.775
by having the stream downloaded again.

1271
01:00:33.875 --> 01:00:36.695
Oh, look, we have people here! We're still here! Yay!

1272
01:00:37.475 --> 01:00:39.335
Um, lemme see if I can change my username.

1273
01:00:40.445 --> 01:00:41.555
It'll probably tell me no.

1274
01:00:42.255 --> 01:00:46.675
Um, on Owncast, let's say, let's say Aral Balkan, it is me.

1275
01:00:47.375 --> 01:00:50.915
Uh, see if it does that. Um, yes.

1276
01:00:51.165 --> 01:00:55.235
Hello everybody. Uh, let's see what everyone's saying…

1277
01:00:55.615 --> 01:00:59.195
Um, da da da. Oh, look, we've got questions there as well.

1278
01:01:00.055 --> 01:01:02.635
Um, cool. Perfect stream out there. Great.

1279
01:01:02.975 --> 01:01:05.035
Uh, perfect stream in Berlin, people were joining.

1280
01:01:05.695 --> 01:01:09.875
Um, nice says Kitten. Yes. Um, hello Hyde.

1281
01:01:10.455 --> 01:01:12.755
Uh, graphics are gorgeous. Thank you so much!

1282
01:01:13.495 --> 01:01:17.555
Um, meow back at you. Uh, nice.

1283
01:01:18.145 --> 01:01:20.635
Very cool. Oh, this is nice people were watching.

1284
01:01:21.015 --> 01:01:22.195
Um, oh, okay.

1285
01:01:22.795 --> 01:01:24.275
Adel says, I already have Node installed,

1286
01:01:24.275 --> 01:01:26.315
so wondering if Kitten's runtime might interfere

1287
01:01:26.315 --> 01:01:27.475
with my local node installation.

1288
01:01:27.695 --> 01:01:31.195
It will not. Um, it installs it into its own folder.

1289
01:01:32.015 --> 01:01:35.275
And the reason it does that is so that it doesn't, um,

1290
01:01:35.545 --> 01:01:37.275
interfere with whatever you have

1291
01:01:37.415 --> 01:01:39.915
or force you to upgrade Node or whatever.

1292
01:01:40.175 --> 01:01:43.075
You shouldn't have to care, um, about the runtime.

1293
01:01:43.435 --> 01:01:44.755
I mean, it's good to know that it's Node

1294
01:01:44.755 --> 01:01:47.195
because it means that you can use all of your Node modules,

1295
01:01:47.415 --> 01:01:50.475
etc., but otherwise, um, it should just work.

1296
01:01:50.495 --> 01:01:52.075
If it doesn't just work, let me know.

1297
01:01:52.775 --> 01:01:56.435
Um, Hopeful Nightingale says Nice. Martin says, Hey.

1298
01:01:58.525 --> 01:02:00.705
Oh, there was? Sorry, did I miss a question? Where was it?

1299
01:02:01.115 --> 01:02:05.505
Where is the runtime? Uh, where is the runtime installed?

1300
01:02:05.535 --> 01:02:10.505
Okay, uh, well, uh, it is in, uh, your home folder

1301
01:02:11.235 --> 01:02:14.745
forward slash dot local, uh, forward slash uh,

1302
01:02:14.995 --> 01:02:18.025
small-tech.org forward slash, uh,

1303
01:02:18.905 --> 01:02:21.205
kitten forward slash runtime…

1304
01:02:21.625 --> 01:02:24.685
And then, uh, in there you see npm and node, etc.

1305
01:02:24.685 --> 01:02:26.125
And there might be a bin folder as well.

1306
01:02:26.185 --> 01:02:27.685
I'm just, uh, I'm not looking at it right now

1307
01:02:27.885 --> 01:02:30.525
'cause I, I'm not streaming my, my, uh, screen.

1308
01:02:31.265 --> 01:02:33.565
Um, but, uh, yeah, it's, it's installed

1309
01:02:33.565 --> 01:02:35.085
where it should be installed according

1310
01:02:35.085 --> 01:02:36.845
to the Free Desktop specification.

1311
01:02:37.985 --> 01:02:40.125
Um, alright, any, any questions locally?

1312
01:02:41.115 --> 01:02:43.615
And by the way, guys, if you don't know about Owncast,

1313
01:02:43.965 --> 01:02:46.175
what I've been streaming with, I've been streaming

1314
01:02:46.175 --> 01:02:48.775
through StreamYard into Owncast, uh,

1315
01:02:48.835 --> 01:02:52.895
and Owncast is a free and open source streaming, uh, tool.

1316
01:02:53.355 --> 01:02:54.695
Um, like, kind of like the free

1317
01:02:54.695 --> 01:02:55.935
and open source version of Twitch,

1318
01:02:55.935 --> 01:02:57.615
which again, again, just for you.

1319
01:02:58.155 --> 01:03:00.775
Um, and it's installed, uh, for like, uh,

1320
01:03:01.015 --> 01:03:02.615
a single organisation or a single person.

1321
01:03:03.195 --> 01:03:05.895
Um, and, uh, it's also federated.

1322
01:03:06.835 --> 01:03:10.215
So, um, people can follow your Owncast.

1323
01:03:10.395 --> 01:03:12.055
Let me see if I can show you on here.

1324
01:03:12.595 --> 01:03:14.335
Uh, not while a stream is going on. Okay.

1325
01:03:14.375 --> 01:03:16.535
I can't show you, but we have about like a thousand

1326
01:03:16.535 --> 01:03:18.535
something people following, like,

1327
01:03:18.555 --> 01:03:22.815
and if we go live… on their Mastodon feeds, that you saw,

1328
01:03:22.885 --> 01:03:24.295
they actually see that we've gone live.

1329
01:03:24.835 --> 01:03:27.135
So that's pretty cool. Um, alright,

1330
01:03:27.275 --> 01:03:29.215
any questions from the local audience?

1331
01:03:29.955 --> 01:03:30.955
Yes.

1332
01:03:31.985 --> 01:03:34.325
[Unintelligible] Yes.

1333
01:03:37.385 --> 01:03:40.965
[Unintelligible]

1334
01:03:41.165 --> 01:03:42.165
Uh, just

1335
01:03:42.165 --> 01:03:42.885
like your phone number.

1336
01:03:43.425 --> 01:03:45.125
So what's your phone number? Gimme your phone number

1337
01:03:45.145 --> 01:03:46.165
so I can give you a text.

1338
01:03:47.255 --> 01:03:49.905
That's it. So, uh, it's exactly that.

1339
01:03:50.645 --> 01:03:53.305
Um, and, uh, in the future,

1340
01:03:53.845 --> 01:03:55.385
do people want to create directories?

1341
01:03:55.705 --> 01:03:57.825
Whatever… may be, as long as it's opt-in. Sure.

1342
01:03:57.825 --> 01:04:01.905
But is it necessary? No, the idea here is, again, not

1343
01:04:01.905 --> 01:04:05.585
for this thing to grow, you know, virally or, or,

1344
01:04:05.645 --> 01:04:09.625
or, um, you know, exponentially, hopefully it will grow, uh,

1345
01:04:10.165 --> 01:04:12.425
you know, sustainably and slowly.

1346
01:04:13.005 --> 01:04:14.465
Um, it'll hopefully be you

1347
01:04:14.525 --> 01:04:17.265
and, you know, using it with some of your friends, uh,

1348
01:04:17.295 --> 01:04:20.585
with a local, uh, organisation, maybe at your university.

1349
01:04:21.165 --> 01:04:24.585
Um, and, but all of these nodes will then be able

1350
01:04:24.585 --> 01:04:26.345
to follow each other as well as we go.

1351
01:04:26.965 --> 01:04:30.465
So, um, again, basically you just give someone your domain,

1352
01:04:31.175 --> 01:04:34.625
uh, as you would give them your phone number, um,

1353
01:04:34.685 --> 01:04:36.985
or, you know, your Messenger handle or whatever.

1354
01:04:37.725 --> 01:04:41.285
That's it. Um, and of course that's

1355
01:04:41.285 --> 01:04:43.645
because it's online on a VPS running somewhere,

1356
01:04:43.645 --> 01:04:44.685
it's always available as well.

1357
01:04:47.235 --> 01:04:48.335
Any other questions? [Question: What

1358
01:04:48.335 --> 01:04:49.335
About the, the hosting? Because

1359
01:04:49.335 --> 01:04:51.655
now you have this domain where you…]

1360
01:04:52.045 --> 01:04:54.815
Yeah [Question: This is still like an organisation

1361
01:04:54.845 --> 01:04:57.215
that takes care… their responsibility…

1362
01:04:58.505 --> 01:04:59.505
Right?] So the question

1363
01:04:59.505 --> 01:04:59.975
was, sorry,

1364
01:05:00.015 --> 01:05:01.215
I didn't repeat the first question.

1365
01:05:01.235 --> 01:05:04.695
The first question was, um, uh, whatever…

1366
01:05:04.695 --> 01:05:08.335
what was the first question? [Audience: Um, about Findability?]

1367
01:05:08.595 --> 01:05:09.975
The first question was about Findability.

1368
01:05:10.275 --> 01:05:14.495
Um, the second question is, uh, so what about the hosting?

1369
01:05:15.195 --> 01:05:17.845
So small-web.org, when we are,

1370
01:05:17.915 --> 01:05:21.165
when we have Domain there is going to be owned by, uh,

1371
01:05:21.785 --> 01:05:23.605
is owned by Small Technology Foundation.

1372
01:05:23.945 --> 01:05:26.125
If some other organisation sets up a Domain,

1373
01:05:26.195 --> 01:05:28.125
it's gonna be owned by them, right?

1374
01:05:28.465 --> 01:05:31.885
Uh, so of course, uh, they get to curate

1375
01:05:32.145 --> 01:05:35.245
who they allow there, what their rules are, etc.

1376
01:05:36.065 --> 01:05:37.725
Domain itself is free and open source.

1377
01:05:37.725 --> 01:05:39.805
So if you wanna host it yourself, sure.

1378
01:05:40.265 --> 01:05:42.125
Kitten can be installed on any server.

1379
01:05:42.665 --> 01:05:44.325
So you could take a Raspberry Pi.

1380
01:05:44.695 --> 01:05:46.205
Don't take a Raspberry Pi though,

1381
01:05:46.205 --> 01:05:48.205
because they, they hire spy cops

1382
01:05:48.205 --> 01:05:50.445
and now they're working with like, you know, they're,

1383
01:05:50.445 --> 01:05:53.525
they're, they're, uh, working with Israeli companies that,

1384
01:05:53.585 --> 01:05:56.445
uh, work on AI, and AI is being used in Gaza.

1385
01:05:56.705 --> 01:06:00.085
Uh, so, you know, um, Raspberry Pi,

1386
01:06:00.435 --> 01:06:01.925
find a clone if you can.

1387
01:06:01.935 --> 01:06:04.645
Don't give them your money, uh, BDS and all that.

1388
01:06:05.145 --> 01:06:09.085
Um, so, uh, yeah, um, I,

1389
01:06:09.785 --> 01:06:13.525
you can install it on a single board computer, um,

1390
01:06:13.825 --> 01:06:16.245
and plug it into your router and you can run it there.

1391
01:06:16.305 --> 01:06:18.045
You can set up your own VPS very easily.

1392
01:06:18.595 --> 01:06:21.045
What Domain does is, again, the whole idea is

1393
01:06:21.045 --> 01:06:22.405
that it's going to make it very simple

1394
01:06:22.425 --> 01:06:23.925
for people without technical knowledge,

1395
01:06:24.105 --> 01:06:28.245
but yes, on small-web.org for example, if some Nazi,

1396
01:06:28.275 --> 01:06:32.005
decides to set up a, a, a domain for themselves,

1397
01:06:32.105 --> 01:06:34.805
and we see that it's a Nazi domain, we go fuck off.

1398
01:06:35.895 --> 01:06:38.355
No Nazis allowed on small-web.org.

1399
01:06:38.935 --> 01:06:43.115
Um, someone might set up nazis-allowed.org, then at

1400
01:06:43.115 --> 01:06:44.795
that point, I can't do anything about it.

1401
01:06:44.795 --> 01:06:47.995
Then we have other means, uh, hopefully of, uh, you know,

1402
01:06:47.995 --> 01:06:52.035
combating that, uh, in, in, in, in general in society.

1403
01:06:52.575 --> 01:06:56.075
Uh, but yes, of course, if you are running, uh,

1404
01:06:56.465 --> 01:06:58.875
something like, uh, an instance of Domain,

1405
01:06:58.875 --> 01:07:00.675
then you are responsible and hopefully you will have

1406
01:07:00.675 --> 01:07:03.315
responsible policies for that. [Question: And

1407
01:07:03.315 --> 01:07:08.165
If you deleted…] I mean, if you deleted it, yes,

1408
01:07:08.185 --> 01:07:09.325
the data would be lost.

1409
01:07:10.765 --> 01:07:12.865
Um, and again, uh,

1410
01:07:13.005 --> 01:07:16.145
but there's nothing that also… if somebody sets up their

1411
01:07:17.055 --> 01:07:20.765
Small Web place using small-web.org, um,

1412
01:07:21.155 --> 01:07:24.445
they can very easily go and buy a commercial domain

1413
01:07:25.145 --> 01:07:26.485
and have that point there.

1414
01:07:26.515 --> 01:07:30.645
Instead, they could very easily port it from one, uh,

1415
01:07:31.615 --> 01:07:33.845
Small Web, uh, host to another.

1416
01:07:34.225 --> 01:07:36.085
And, and this is how easy it is actually…

1417
01:07:36.875 --> 01:07:39.085
Here, let me just go back here, um,

1418
01:07:39.505 --> 01:07:41.845
and, uh, go back to sharing my screen.

1419
01:07:42.045 --> 01:07:43.245
'cause this is important. Um,

1420
01:07:43.485 --> 01:07:45.645
'cause that data portability aspect is

1421
01:07:45.645 --> 01:07:46.765
really, really important.

1422
01:07:47.305 --> 01:07:49.485
So I'm just gonna go back, um, here,

1423
01:07:49.745 --> 01:07:52.885
and we're just running this localhost, um, app, right?

1424
01:07:53.665 --> 01:07:54.885
Um, and I'll show it on that.

1425
01:07:55.495 --> 01:07:57.035
So we haven't created a secret for that.

1426
01:07:57.035 --> 01:07:59.155
Let's create our secret for that little localhost app,

1427
01:07:59.155 --> 01:08:00.315
the Kitten count that we had.

1428
01:08:00.895 --> 01:08:03.755
And then just because it's like any other Kitten, um,

1429
01:08:04.585 --> 01:08:05.835
site, we can go to settings.

1430
01:08:06.815 --> 01:08:08.955
And over here I can sign in, remember the,

1431
01:08:09.095 --> 01:08:10.515
the Kitten settings that we had.

1432
01:08:11.755 --> 01:08:12.895
So I'm gonna make

1433
01:08:12.895 --> 01:08:14.615
that a little smaller so that we can see it.

1434
01:08:15.185 --> 01:08:17.765
Um, and if I scroll down here in data,

1435
01:08:18.155 --> 01:08:19.445
I've got backup and restore.

1436
01:08:20.405 --> 01:08:22.985
So I can just go to backup and restore, download a backup,

1437
01:08:23.485 --> 01:08:25.545
and I've just downloaded the, the backup

1438
01:08:25.655 --> 01:08:30.025
that will restore any site to this, um, to prove that,

1439
01:08:30.805 --> 01:08:34.505
uh, that's where it is, um, to prove that, um,

1440
01:08:34.785 --> 01:08:38.905
I can go ahead and in my, uh,

1441
01:08:40.715 --> 01:08:45.255
in my, um, whatchamacallit, uh,

1442
01:08:47.335 --> 01:08:49.095
terminal, I can say kitten dot db,

1443
01:08:49.395 --> 01:08:52.015
dot kittens dot count equals zero.

1444
01:08:53.075 --> 01:08:56.095
So, oops. Oh no, we've lost all the Kittens.

1445
01:08:56.095 --> 01:08:57.855
What are we going to do? Um,

1446
01:08:57.955 --> 01:09:00.855
and then I can go back to where I was,

1447
01:09:01.175 --> 01:09:03.095
I think it was here, and I can restore.

1448
01:09:03.555 --> 01:09:06.455
So I can say, browse, let's get that kittens database,

1449
01:09:06.955 --> 01:09:09.855
and I can say, restore, okay, I want to do it.

1450
01:09:10.515 --> 01:09:13.455
And if I go back now to here

1451
01:09:13.515 --> 01:09:17.325
and I refresh, oh, what happened?

1452
01:09:18.335 --> 01:09:20.765
Did it work? Did I click restore?

1453
01:09:23.955 --> 01:09:26.565
What is it doing? Maybe you can't do it locally?

1454
01:09:27.615 --> 01:09:27.835
Um,

1455
01:09:32.145 --> 01:09:33.115
Okay, restore complete.

1456
01:09:33.155 --> 01:09:34.835
I don't know what happened there. Um,

1457
01:09:35.215 --> 01:09:38.315
but if I go over here, we've got our kittens back,

1458
01:09:38.695 --> 01:09:40.195
so it just recreated from scratch.

1459
01:09:40.415 --> 01:09:42.995
So imagine you use some other domain,

1460
01:09:43.015 --> 01:09:45.875
or you set up another server, you just downloaded your data

1461
01:09:46.055 --> 01:09:47.195
and then you uploaded it there

1462
01:09:47.195 --> 01:09:49.765
and you have data portability, basically.

1463
01:09:49.765 --> 01:09:52.845
Does that answer your question? Yes. Excellent. Great.

1464
01:09:53.865 --> 01:09:57.125
Um, any other questions? I okay, just one second.

1465
01:09:57.305 --> 01:10:00.765
I'm gonna switch my stream back into just

1466
01:10:01.505 --> 01:10:02.765
me. There we go. Okay.

1467
01:10:02.855 --> 01:10:05.005
[Question: Maybe a bit more technical,] But Sure.

1468
01:10:05.145 --> 01:10:08.925
[Question: You generate this. Yes. Use your private key to sign. Why,]

1469
01:10:09.855 --> 01:10:10.925
Sorry? [Question: Why do you

1470
01:10:10.925 --> 01:10:13.725
Use your, so you generate a private key to put the key.

1471
01:10:14.505 --> 01:10:16.245
Why do you use your private key to sign

1472
01:10:16.245 --> 01:10:17.245
in?] Um, you

1473
01:10:17.245 --> 01:10:18.925
don't use your private key to sign in.

1474
01:10:19.425 --> 01:10:22.645
Uh, wait, no, you do use your private key to sign in.

1475
01:10:22.875 --> 01:10:24.285
Yeah. Um, that is your secret.

1476
01:10:24.795 --> 01:10:28.245
[Yeah. But usually, say ssh we don't actually

1477
01:10:29.165 --> 01:10:31.885
*unintelligible*]

1478
01:10:32.665 --> 01:10:34.325
You do put your private, well, I mean,

1479
01:10:34.425 --> 01:10:36.845
you don't put your private key into a place you don't own.

1480
01:10:37.105 --> 01:10:39.805
Yes. But, uh, in this case, all of

1481
01:10:39.805 --> 01:10:41.165
that information stays on the client

1482
01:10:41.225 --> 01:10:42.685
unless the server's been hacked.

1483
01:10:43.265 --> 01:10:47.045
Now that is, that is a limitation of the web in general.

1484
01:10:47.505 --> 01:10:51.295
So if your server's been hacked, um, if you have a,

1485
01:10:51.295 --> 01:10:52.895
and again, this comes back to the threat model.

1486
01:10:53.675 --> 01:10:55.855
If you are, this is not for people

1487
01:10:55.915 --> 01:10:59.405
who have state-level actors interested in them, um,

1488
01:10:59.625 --> 01:11:01.765
use Signal if that's what you're going to do.

1489
01:11:02.465 --> 01:11:05.565
Uh, this is basically a best effort of

1490
01:11:05.565 --> 01:11:06.565
what can be done on the web.

1491
01:11:07.105 --> 01:11:09.685
So if your server is compromised, sure,

1492
01:11:09.685 --> 01:11:10.725
it could be serving you anything

1493
01:11:10.725 --> 01:11:12.605
that looks like… you could be phished for that.

1494
01:11:13.425 --> 01:11:15.565
Um, but otherwise that is your secret.

1495
01:11:15.705 --> 01:11:17.485
So what happens is, on the client,

1496
01:11:18.345 --> 01:11:21.485
you are authenticated on the client on your own device,

1497
01:11:22.515 --> 01:11:27.455
and then, uh, you tell the server basically, uh, that the,

1498
01:11:27.455 --> 01:11:29.415
the server basically then says, okay, uh,

1499
01:11:30.045 --> 01:11:31.055
they've been authenticated,

1500
01:11:31.115 --> 01:11:33.815
but the the private key never goes to the server

1501
01:11:34.765 --> 01:11:36.265
unless your server's been hacked.

1502
01:11:39.305 --> 01:11:41.405
But does that make sense? It only stays on the client.

1503
01:11:41.905 --> 01:11:43.845
All of the cryptography happens on the

1504
01:11:43.845 --> 01:11:45.165
client for the private key.

1505
01:11:45.545 --> 01:11:46.965
The private key never touches the server.

1506
01:11:47.435 --> 01:11:51.515
[Question: Is the key generated

1507
01:11:51.885 --> 01:11:53.155
in JavaScript or in the browser…]

1508
01:11:53.335 --> 01:11:56.595
The key is generated in, in JavaScript in the browser.

1509
01:11:57.185 --> 01:11:58.185
Yeah,

1510
01:11:59.655 --> 01:12:00.655
[Question: unintelligible]

1511
01:12:00.965 --> 01:12:02.435
[Question: unintelligible]

1512
01:12:04.135 --> 01:12:06.675
No, I mean, what you could do, uh,

1513
01:12:06.815 --> 01:12:09.755
is you could have an extension, a browser extension

1514
01:12:09.815 --> 01:12:12.875
for example, and then you could use the browser extension

1515
01:12:12.935 --> 01:12:14.395
to have it generated, etc.

1516
01:12:14.395 --> 01:12:16.585
But then you've lost people, you know,

1517
01:12:16.585 --> 01:12:18.185
and again, it's about threat models.

1518
01:12:19.235 --> 01:12:21.855
Is this, if this was widely deployed, would this be,

1519
01:12:22.375 --> 01:12:23.175
'cause again, remember it's

1520
01:12:23.175 --> 01:12:24.655
topologically decentralised as well…

1521
01:12:25.065 --> 01:12:27.975
Would this make it hard for mass surveillance?

1522
01:12:27.975 --> 01:12:30.775
Would this make it hard for arbitrary surveillance?

1523
01:12:30.835 --> 01:12:33.555
Yes, it would increase the cost of that.

1524
01:12:34.735 --> 01:12:36.595
Um, if I was the United States government

1525
01:12:36.655 --> 01:12:38.715
and I wanted to hack into your little Kitten site,

1526
01:12:38.715 --> 01:12:40.635
your Small Web site, could I do it?

1527
01:12:40.815 --> 01:12:43.915
Yes, of course. I could do it in 10 different ways.

1528
01:12:44.965 --> 01:12:48.985
Um, I would compromise your, your ISP… I would, you know.

1529
01:12:49.015 --> 01:12:52.825
Yeah, exactly. Um, so it's all about threat models.

1530
01:12:53.575 --> 01:12:57.425
This is for general use, basically, general use

1531
01:12:57.595 --> 01:13:00.345
where currently our… the best that we have is

1532
01:13:00.345 --> 01:13:01.865
that Facebook knows everything about us.

1533
01:13:02.155 --> 01:13:03.185
Where the best that we have is

1534
01:13:03.185 --> 01:13:04.345
TikTok knows everything about us.

1535
01:13:04.925 --> 01:13:07.545
Um, so I think we can do better than that.

1536
01:13:08.345 --> 01:13:11.045
Um, is it gonna be perfect? No. Is anything entirely secure?

1537
01:13:11.225 --> 01:13:13.405
No. Is anything entirely private? No.

1538
01:13:15.105 --> 01:13:16.565
Um, and if anyone tells you

1539
01:13:16.565 --> 01:13:19.835
otherwise they're lying to you. Does that,

1540
01:13:20.145 --> 01:13:21.435
[Audience member: Yeah, I was just curious.]

1541
01:13:21.545 --> 01:13:24.515
Cool. And if you wanna look into the cryptography, actually,

1542
01:13:25.015 --> 01:13:28.675
um, and, and, uh, if you have any thoughts, please do.

1543
01:13:28.675 --> 01:13:31.695
The source is all out there. The source is out there.

1544
01:13:32.755 --> 01:13:34.735
Um, it's on, you can find it from the Kitten site. Good.

1545
01:13:35.005 --> 01:13:36.335
Yeah. And I would, well,

1546
01:13:36.335 --> 01:13:38.335
I would welcome any feedback that you have on that.

1547
01:13:38.615 --> 01:13:40.495
I haven't touched the cryptography stuff for a while,

1548
01:13:40.495 --> 01:13:41.695
because that was one of the first things

1549
01:13:41.725 --> 01:13:43.015
that, um, went into it.

1550
01:13:43.635 --> 01:13:44.735
Um, but yeah.

1551
01:13:47.855 --> 01:13:52.155
Any other questions? No. Are we good? Yeah.

1552
01:13:52.155 --> 01:13:57.075
Should we wrap this up? Great. Sure.

1553
01:13:57.165 --> 01:14:00.155
[Mirela: About Windows?] Mirela, yes. About Windows.

1554
01:14:02.985 --> 01:14:06.325
[Mirela: *unintelligible* … The goal… many people can you work it…

1555
01:14:06.425 --> 01:14:09.205
So why not … with Windows? Because…]

1556
01:14:09.425 --> 01:14:10.425
Are you on Windows? [Mirela: Yes.]

1557
01:14:10.425 --> 01:14:11.605
I, I see. All right.

1558
01:14:11.645 --> 01:14:13.565
I see where the question's coming from. Mirela.

1559
01:14:14.025 --> 01:14:15.965
Um, all right, so the question is, you know,

1560
01:14:16.355 --> 01:14:17.525
lots of people [Mirela: *unintelligible*

1561
01:14:17.725 --> 01:14:19.285
… actually here, but I'm just asking…]

1562
01:14:19.825 --> 01:14:21.005
So lots of people are on Windows…

1563
01:14:22.435 --> 01:14:24.135
Why do you say such nasty things about Windows,

1564
01:14:24.135 --> 01:14:26.255
you horrible person? I think was a para-

1565
01:14:26.255 --> 01:14:27.655
paraphrasing of the, of the question.

1566
01:14:28.195 --> 01:14:30.615
Um, and the reason is this,

1567
01:14:32.865 --> 01:14:35.555
what I don't want to do is to encourage the use

1568
01:14:35.555 --> 01:14:37.035
of unsafe platforms.

1569
01:14:38.395 --> 01:14:41.295
Um, if someone is using Windows

1570
01:14:42.885 --> 01:14:45.425
and they're like, “Hey, I wanna set up my own Small Web site

1571
01:14:45.545 --> 01:14:49.905
'cause I want privacy”, they've already lost, right?

1572
01:14:50.215 --> 01:14:52.145
Because Recall is taking a photo

1573
01:14:52.165 --> 01:14:55.785
of their screen. Recall has their emoji secret if they're not

1574
01:14:55.785 --> 01:14:58.665
using Edge, if they're using Firefox to sign in,

1575
01:14:58.665 --> 01:15:01.065
because apparently they don't take passwords…

1576
01:15:01.295 --> 01:15:02.865
screenshots of passwords in Edge

1577
01:15:02.965 --> 01:15:04.785
but not for pa-, not for Firefox.

1578
01:15:05.605 --> 01:15:10.445
Um, if you, if… if your own computer

1579
01:15:11.865 --> 01:15:16.255
is an unsafe space, there's nothing we can do

1580
01:15:16.965 --> 01:15:18.935
kind of to help you at that point.

1581
01:15:19.275 --> 01:15:22.215
So maybe the best thing we can tell you to do is to leave

1582
01:15:22.215 --> 01:15:24.295
that abusive relationship, right?

1583
01:15:24.945 --> 01:15:28.535
Leave your abuser, um, get out of that house,

1584
01:15:29.515 --> 01:15:32.865
go somewhere safe, and then here are some other

1585
01:15:32.865 --> 01:15:34.065
tools that maybe you can use.

1586
01:15:34.175 --> 01:15:35.175
Does that make sense?

1587
01:15:36.065 --> 01:15:38.565
[Mirela: And have you thought also how to go on further…

1588
01:15:42.145 --> 01:15:45.455
other than talk of how to put it up?]

1589
01:15:46.205 --> 01:15:48.695
Okay, so the question is like, have you thought about how

1590
01:15:49.235 --> 01:15:51.055
people are going to know about this?

1591
01:15:51.635 --> 01:15:54.255
Um, I'm, I'm far less concerned about that.

1592
01:15:54.315 --> 01:15:58.055
I'm far more concerned initially at this point about it's…

1593
01:15:58.155 --> 01:15:59.255
you know, um,

1594
01:15:59.675 --> 01:16:02.455
not stumbling like it did when I was doing the Domain things…

1595
01:16:02.455 --> 01:16:03.535
that there's some work to do there.

1596
01:16:04.235 --> 01:16:08.215
Um, and again, you know, you can,

1597
01:16:08.235 --> 01:16:09.935
you can take it to the extreme

1598
01:16:09.935 --> 01:16:11.135
where you never release anything.

1599
01:16:11.365 --> 01:16:13.695
Part of the reason I'm working in the open… anyone can

1600
01:16:13.855 --> 01:16:16.055
download and play with, and they've been able to do

1601
01:16:16.055 --> 01:16:19.335
that when it was far less than it is right now, um, is

1602
01:16:19.335 --> 01:16:21.455
to force myself to, you know, not go for that sort

1603
01:16:21.455 --> 01:16:23.175
of perfectionism where you never release anything.

1604
01:16:24.235 --> 01:16:26.255
Um, but, uh,

1605
01:16:26.835 --> 01:16:29.575
Domain – fingers crossed – will be available this year

1606
01:16:30.275 --> 01:16:31.695
to developers at least,

1607
01:16:31.695 --> 01:16:32.855
or to a wider audience

1608
01:16:32.855 --> 01:16:35.695
that's maybe a bit more technical initially to be able

1609
01:16:35.695 --> 01:16:37.055
to set up their own Small Web places.

1610
01:16:37.635 --> 01:16:40.135
Um, I want it to grow very slowly, right?

1611
01:16:40.135 --> 01:16:42.935
The last thing you want in a system that's so new that has,

1612
01:16:43.525 --> 01:16:47.975
that has so little, um, in terms of resources,

1613
01:16:48.445 --> 01:16:53.255
like me, mostly, working on it, uh, the last thing you want is

1614
01:16:53.765 --> 01:16:55.375
tens of thousands of people to use it at the same

1615
01:16:55.375 --> 01:16:56.575
time, right?

1616
01:16:57.155 --> 01:16:58.495
Um, that's when it'll just crash.

1617
01:16:59.095 --> 01:17:02.175
I want a very slow sort of progression.

1618
01:17:02.855 --> 01:17:05.815
A handful of people initially, you know, let's, let's hit,

1619
01:17:05.825 --> 01:17:08.015
we'll hit all of the issues, most of the issues

1620
01:17:08.045 --> 01:17:10.285
with the handful of people, and then another handful,

1621
01:17:10.825 --> 01:17:12.285
and then maybe we'll grow from there.

1622
01:17:12.905 --> 01:17:17.605
Um, my goal is not the same as Silicon Valley's goal, right?

1623
01:17:17.605 --> 01:17:20.045
Silicon Valley's goal is infinite growth

1624
01:17:20.045 --> 01:17:22.645
with finite resources, which if you think about it,

1625
01:17:22.825 --> 01:17:26.565
is basically, uh, you know, the ideology of the cancer cell,

1626
01:17:27.105 --> 01:17:31.855
uh, they, their, their, um, goal is, uh,

1627
01:17:32.235 --> 01:17:33.455
to get as large as they can.

1628
01:17:34.325 --> 01:17:36.985
And, uh, that's not my goal at all. It's quite the opposite.

1629
01:17:36.985 --> 01:17:38.425
That would be my failure mode.

1630
01:17:38.965 --> 01:17:41.745
If we scaled alongside the Small Web,

1631
01:17:41.745 --> 01:17:44.145
getting more successful, if Small Technology Foundation

1632
01:17:44.145 --> 01:17:45.385
start growing as well,

1633
01:17:46.255 --> 01:17:48.985
then we failed fundamentally at something, right?

1634
01:17:49.365 --> 01:17:52.785
And that's why Kitten has its own in-process database

1635
01:17:52.785 --> 01:17:54.545
that will only scale to a certain level.

1636
01:17:54.725 --> 01:17:57.305
It scales more than I would like it to, to be honest,

1637
01:17:57.805 --> 01:17:59.265
but it'll only scale to a certain level.

1638
01:17:59.405 --> 01:18:02.265
Do we need it to scale beyond a certain level to support

1639
01:18:02.805 --> 01:18:06.225
10,000, maybe even 20,000, uh, servers,

1640
01:18:06.605 --> 01:18:09.545
20,000 servers at 10 euros?

1641
01:18:09.685 --> 01:18:11.505
You know, we're not gonna get the whole of 10 euros.

1642
01:18:11.585 --> 01:18:13.105
'cause we'll be paying the DNS people,

1643
01:18:13.105 --> 01:18:14.345
we'll be paying the VPS people.

1644
01:18:14.645 --> 01:18:16.585
So maybe we'll get less than half of that,

1645
01:18:17.085 --> 01:18:18.825
but still 10,000, 20,000…

1646
01:18:18.995 --> 01:18:22.305
Would that actually, uh, make us sustainable so

1647
01:18:22.305 --> 01:18:25.025
that we could actually maybe hire some people to work on it,

1648
01:18:25.045 --> 01:18:26.905
to keep this work running?

1649
01:18:27.445 --> 01:18:32.025
Um, maybe, you know, go on vacation for a change? Uh, yes.

1650
01:18:33.095 --> 01:18:34.435
Do we need more than that? No.

1651
01:18:36.215 --> 01:18:37.875
Do I need to become a billionaire? Fuck no!

1652
01:18:38.325 --> 01:18:39.935
That is my failure mode. [Mirela: So I

1653
01:18:40.065 --> 01:18:42.135
Dunno how many people dunno here,

1654
01:18:42.275 --> 01:18:45.935
but you mentioned that you… something like in Belgium, which

1655
01:18:46.755 --> 01:18:48.855
I'm interested now, how did, what did you do…

1656
01:18:48.855 --> 01:18:50.455
with … one city… Belgium?]

1657
01:18:51.355 --> 01:18:53.095
So this was a project that we did about six,

1658
01:18:53.315 --> 01:18:54.535
uh, six or seven years ago.

1659
01:18:55.275 --> 01:18:57.015
Um, it was, no, it was right before this.

1660
01:18:57.035 --> 01:18:58.815
So that was the germ of this.

1661
01:18:59.795 --> 01:19:04.215
Um, and we were working with the City of Ghent, uh,

1662
01:19:04.835 --> 01:19:06.095
uh, with Stad Gent.

1663
01:19:06.315 --> 01:19:09.215
And, um, I basically, I did a talk there…

1664
01:19:09.375 --> 01:19:11.175
I, I gave a keynote about these issues

1665
01:19:11.195 --> 01:19:12.815
and I was like, we need to build an,

1666
01:19:12.815 --> 01:19:15.135
and I was calling it an Internet of People, you know,

1667
01:19:15.155 --> 01:19:17.975
not corporations, not not for governments, for people, uh,

1668
01:19:17.975 --> 01:19:19.855
where everyone has their own place, etc..

1669
01:19:20.395 --> 01:19:23.135
And, uh, I, I remember it was, uh, Karl-Filip, uh,

1670
01:19:23.635 --> 01:19:28.415
who was the, he was heading up, uh, their technology

1671
01:19:28.515 --> 01:19:31.215
or, or, or, or I don't know if he was heading up the whole

1672
01:19:31.215 --> 01:19:33.375
thing, but he basically came up to me, uh,

1673
01:19:33.375 --> 01:19:34.495
and we had a chat afterwards

1674
01:19:34.495 --> 01:19:37.415
and we're like, well, what if we use the city of Ghent

1675
01:19:37.875 --> 01:19:39.255
as kind of a prototype?

1676
01:19:39.875 --> 01:19:42.975
You know, what if everyone in the city of Ghent, like

1677
01:19:43.355 --> 01:19:45.495
for Small Web, you might have to pay us 10 euros

1678
01:19:45.495 --> 01:19:48.175
because we need to be sustainable in this messed up system

1679
01:19:48.175 --> 01:19:50.295
that we have until we can build a better one

1680
01:19:50.295 --> 01:19:53.375
or kind of build that bridge to a better one where maybe

1681
01:19:54.065 --> 01:19:55.775
those places are supported from the

1682
01:19:55.775 --> 01:19:56.895
commons for the common good.

1683
01:19:57.315 --> 01:20:01.535
So what if in that spirit, the city of Ghent sent everyone,

1684
01:20:01.795 --> 01:20:04.095
uh, a letter with a token that they could use

1685
01:20:04.095 --> 01:20:07.215
to have their own place and they supported it from the commons,

1686
01:20:07.705 --> 01:20:09.845
and the people could speak to one another,

1687
01:20:09.845 --> 01:20:11.725
but they could also speak to the municipality.

1688
01:20:11.825 --> 01:20:13.925
So we built a prototype of that

1689
01:20:14.545 --> 01:20:16.645
and, um, it was very well received.

1690
01:20:17.465 --> 01:20:19.565
Uh, it was just a prototype, but it was very well received.

1691
01:20:19.625 --> 01:20:21.285
And then they had local elections,

1692
01:20:21.285 --> 01:20:22.525
and the conservatives got into power

1693
01:20:22.745 --> 01:20:24.285
and our funding was cut.

1694
01:20:25.415 --> 01:20:27.115
Um, our funding wasn't much anyway.

1695
01:20:27.935 --> 01:20:31.235
We got paid less than the contractors that we were able

1696
01:20:31.235 --> 01:20:32.955
to hire, uh, to work on it.

1697
01:20:33.135 --> 01:20:35.875
So, you know, uh, it wasn't that much to begin with,

1698
01:20:36.295 --> 01:20:40.235
but, um, this is why, this is why with the Small Web,

1699
01:20:40.375 --> 01:20:42.075
I'm building it so that we can be sustainable

1700
01:20:42.365 --> 01:20:43.635
under this current system.

1701
01:20:43.895 --> 01:20:46.395
So we don't have to go begging for, you know,

1702
01:20:46.395 --> 01:20:47.955
money from the EU…

1703
01:20:48.675 --> 01:20:50.195
'cause we haven't gotten a single cent,

1704
01:20:50.955 --> 01:20:54.515
a single Euro cent from NGI or NLNet or whatever.

1705
01:20:54.565 --> 01:20:55.875
We've applied. We've been rejected.

1706
01:20:56.455 --> 01:20:57.995
Um, maybe if I put AI

1707
01:20:57.995 --> 01:21:00.035
and, uh, I don't know, uh, blockchain in there,

1708
01:21:00.035 --> 01:21:01.755
we would've gotten in, you know, some bullshit.

1709
01:21:02.175 --> 01:21:05.395
Um, but, uh, yeah.

1710
01:21:05.535 --> 01:21:07.675
So, um, we don't have to go begging for that.

1711
01:21:08.175 --> 01:21:11.955
And, uh, that we don't have to rely on the shifting winds

1712
01:21:11.955 --> 01:21:13.355
of politics, you know?

1713
01:21:15.495 --> 01:21:17.645
[Mirela: Thank you.] Great! Well, thank you so much.

1714
01:21:17.865 --> 01:21:22.205
Um, thank you to the folks who have joined in on, uh,

1715
01:21:22.775 --> 01:21:25.165
where is the Owncast.

1716
01:21:25.165 --> 01:21:26.405
There we go. Thank you all.

1717
01:21:26.825 --> 01:21:31.525
Um, we are going to be ending the, uh, uh, “the crypto

1718
01:21:31.585 --> 01:21:33.085
to emoji graphics idea is neat…

1719
01:21:33.085 --> 01:21:35.125
Is it portable to other programming languages?”

1720
01:21:35.345 --> 01:21:36.445
Uh, sure, of course it is.

1721
01:21:36.465 --> 01:21:37.845
Um, and if you port it, let me know.

1722
01:21:38.265 --> 01:21:40.045
Um, I mean, I'm not gonna do it,

1723
01:21:40.105 --> 01:21:41.285
but the source code is there.

1724
01:21:41.515 --> 01:21:42.925
Just take it. It's not, it's not…

1725
01:21:42.955 --> 01:21:46.685
it's just base-256 encoding with a custom set of emoji.

1726
01:21:47.385 --> 01:21:48.725
Um, that's really all it is.

1727
01:21:49.425 --> 01:21:52.005
So you could probably, like, write that in one line of code.

1728
01:21:52.305 --> 01:21:55.125
Um, I don't know if it was one line in what I wrote.

1729
01:21:55.825 --> 01:21:58.525
Um, “Deno is a money grabber.” Yes, they are.

1730
01:21:58.675 --> 01:22:02.685
Deno is an alternative to NodeJS. They're startup.

1731
01:22:03.505 --> 01:22:05.035
Um, yeah.

1732
01:22:05.055 --> 01:22:06.475
So basically if anything's a startup

1733
01:22:06.775 --> 01:22:10.475
or they’re venture capital backed, just back away slowly, um,

1734
01:22:11.065 --> 01:22:12.155
it's never gonna end.

1735
01:22:12.155 --> 01:22:14.555
Well. Uh, “nice recovery!” Thank you so much.

1736
01:22:14.555 --> 01:22:15.795
I don't know which one you were talking about,

1737
01:22:15.855 --> 01:22:19.475
but, uh, I've had several, um, excellent guys.

1738
01:22:19.675 --> 01:22:22.635
I, I, I think we've gone like 25 minutes over.

1739
01:22:23.215 --> 01:22:25.155
Uh, thankfully no one's thrown us out of the room,

1740
01:22:25.215 --> 01:22:26.395
and thankfully you've stayed.

1741
01:22:26.615 --> 01:22:28.915
But, uh, thank you all for watching on the stream,

1742
01:22:29.095 --> 01:22:31.475
and thank you all for watching in-world

1743
01:22:31.475 --> 01:22:32.675
here, and thank you for having me.

1744
01:22:32.685 --> 01:22:34.405
Thank you. Take care.

1745
01:22:43.465 --> 01:22:44.525
All right. I am ending this stream,

1746
01:22:44.545 --> 01:22:46.605
but I will make this recording available online

1747
01:22:46.665 --> 01:22:47.605
and I'll let you all know.
