1
00:00:00,046 --> 00:00:02,336
And so it's because it's
local-first, we can synchronize

2
00:00:02,356 --> 00:00:03,676
it across all the hardware, right?

3
00:00:03,706 --> 00:00:06,336
And we can back it up on a
central computer somewhere.

4
00:00:06,531 --> 00:00:08,931
And that means  if you lose
your laptop you go and buy a new

5
00:00:08,931 --> 00:00:10,591
laptop and you sign into Playbit.

6
00:00:10,871 --> 00:00:11,821
Everything is back there.

7
00:00:12,021 --> 00:00:14,091
Like the window position, text selection.

8
00:00:14,241 --> 00:00:16,781
And that also means that you
can  have many of these computers.

9
00:00:16,821 --> 00:00:20,101
And so we have this concept of workspaces,
they're basically virtual machines.

10
00:00:20,501 --> 00:00:23,761
And one of these computers you can share
with your friends or with other people.

11
00:00:23,761 --> 00:00:23,821
Yeah.

12
00:00:24,001 --> 00:00:26,611
And then you have essentially  Figma
multiplayer, but like on the

13
00:00:26,611 --> 00:00:30,111
operating system level and these
facilities like this data syncing  is

14
00:00:30,111 --> 00:00:34,251
available , as a first party API,
like for  application developers.

15
00:00:34,658 --> 00:00:36,808
Welcome to the local-first FM podcast.

16
00:00:37,098 --> 00:00:39,958
I'm your host, Johannes Schickling,
and I'm a web developer, a

17
00:00:39,958 --> 00:00:43,018
startup founder, and love the
craft of software engineering.

18
00:00:43,508 --> 00:00:47,108
For the past few years, I've been on a
journey to build a modern, high quality

19
00:00:47,108 --> 00:00:48,778
music app using web technologies.

20
00:00:49,213 --> 00:00:53,123
And in doing so, I've been falling down
the rabbit hole of local-first software.

21
00:00:53,563 --> 00:00:56,583
This podcast is your invitation
to join me in the journey.

22
00:00:57,073 --> 00:01:00,823
In this episode, I'm speaking to
Rasmus Andersen, who helped to build

23
00:01:00,883 --> 00:01:05,103
many monumental products, such as
Spotify, Dropbox, and Figma, and is

24
00:01:05,113 --> 00:01:09,423
now working on Playbit, a local-first
operating system built from scratch.

25
00:01:10,013 --> 00:01:14,333
In this extended conversation, we go deep
on software quality, the trade offs of

26
00:01:14,333 --> 00:01:17,953
different data models, and the importance
of the web for modern applications.

27
00:01:18,973 --> 00:01:22,083
Before getting started, also a
big thank you to Expo and Crab

28
00:01:22,083 --> 00:01:23,913
Nebula for supporting this podcast.

29
00:01:24,463 --> 00:01:26,403
And now my interview with Rasmus.

30
00:01:27,322 --> 00:01:29,772
Hey Rasmus, so nice to
have you on the show.

31
00:01:29,792 --> 00:01:30,422
How are you doing?

32
00:01:31,182 --> 00:01:32,732
Hey Johannes, good to be here.

33
00:01:32,732 --> 00:01:33,582
I'm doing well.

34
00:01:33,732 --> 00:01:34,772
How are you doing yourself?

35
00:01:35,202 --> 00:01:36,012
I'm doing great.

36
00:01:36,072 --> 00:01:38,012
I couldn't be more excited
to have you on the show.

37
00:01:38,312 --> 00:01:43,282
I'm like a huge fan of so many products
that you've worked on in the past.

38
00:01:43,602 --> 00:01:45,782
So really delighted to
have you on the show.

39
00:01:46,052 --> 00:01:49,602
But for folks who don't know
you, uh, could you give a quick

40
00:01:49,632 --> 00:01:52,132
background on what led you to today?

41
00:01:53,407 --> 00:01:54,057
Sure.

42
00:01:54,137 --> 00:01:54,567
Oh, God.

43
00:01:54,577 --> 00:01:55,647
What led me to today?

44
00:01:55,647 --> 00:01:57,427
It's almost like we should go backwards.

45
00:01:57,557 --> 00:02:01,497
I think I've found myself through
various ways working on local-first

46
00:02:01,517 --> 00:02:03,147
software for quite a while.

47
00:02:03,557 --> 00:02:07,257
And we didn't really have vocabulary
for it until pretty recently.

48
00:02:07,857 --> 00:02:11,197
And so in the last couple of
years, as you know, yourself,

49
00:02:11,227 --> 00:02:13,697
and Ink & Switch, you know, uh.

50
00:02:13,797 --> 00:02:15,477
Adam and Muse and so on.

51
00:02:15,487 --> 00:02:18,217
There's, there's like a whole group
of people who have sort of like

52
00:02:18,227 --> 00:02:21,287
started questioning, you know, like,
is this way we're building things?

53
00:02:21,287 --> 00:02:23,507
Is this, this is sound,
this is like healthy?

54
00:02:23,567 --> 00:02:27,057
And sort of the idea of local-first
kind of grow out is to become

55
00:02:27,057 --> 00:02:30,637
more of a vocabulary as well as
sort of like the sort of handmade

56
00:02:30,647 --> 00:02:31,887
movement and stuff like that.

57
00:02:32,057 --> 00:02:35,107
I've started realizing that these
were values that I've had for a

58
00:02:35,107 --> 00:02:36,947
long time, but I wasn't aware of.

59
00:02:37,247 --> 00:02:43,007
I started programming when I was a kid
and I had my first job as a designer at

60
00:02:43,007 --> 00:02:45,747
an automotive company when I was like 15.

61
00:02:45,747 --> 00:02:47,097
I think it was something like that.

62
00:02:47,387 --> 00:02:52,127
I started my own company when
I was 17, maybe something,

63
00:02:52,157 --> 00:02:53,087
perhaps something like that.

64
00:02:53,347 --> 00:02:56,137
So, you know, very early in my
life, I started working and I,

65
00:02:56,137 --> 00:03:00,027
you know, I skipped video games
and I got gotten into those later.

66
00:03:00,027 --> 00:03:00,457
Don't worry.

67
00:03:00,817 --> 00:03:01,462
Um, but yeah.

68
00:03:01,932 --> 00:03:06,602
But yeah, so, uh, here I am, you know,
a couple, a couple of years later.

69
00:03:07,252 --> 00:03:08,012
That's awesome.

70
00:03:08,022 --> 00:03:11,362
Well, you're, you're very, uh,
humbly skipping a whole bunch

71
00:03:11,362 --> 00:03:15,522
of really monumental chapters
where you've like helped to start

72
00:03:15,522 --> 00:03:18,142
Spotify as a first designer there.

73
00:03:18,142 --> 00:03:21,662
And like, built a lot of the foundation
there and later also worked at

74
00:03:21,682 --> 00:03:23,792
the Figma and Facebook, et cetera.

75
00:03:24,072 --> 00:03:27,202
So I'm really curious to learn
more about those chapters.

76
00:03:27,542 --> 00:03:30,562
As you've already mentioned, I
think you've already been on a path

77
00:03:30,612 --> 00:03:35,192
to build local-first software way
before the local-first essay was

78
00:03:35,202 --> 00:03:39,407
out there, but you still arrived at
many, uh, Um, similar conclusions.

79
00:03:39,637 --> 00:03:43,917
So maybe starting with Spotify, as
there is also this really interesting

80
00:03:43,917 --> 00:03:49,077
parallel to me working on Overtone,
not trying to suggest I'm anywhere

81
00:03:49,327 --> 00:03:55,517
close to your level of polish with
your work, but I'm certainly trying to

82
00:03:55,727 --> 00:03:57,457
follow a bit in the, in your footsteps.

83
00:03:57,817 --> 00:03:58,707
So I'm curious.

84
00:03:59,167 --> 00:04:02,917
How you've thought about building
Spotify back in the days and how

85
00:04:02,917 --> 00:04:06,987
you've arrived eventually on sort
of like local-first ish paths.

86
00:04:07,307 --> 00:04:08,507
That's a great question.

87
00:04:08,887 --> 00:04:12,027
And before answering that, I got to
say, I think what you've got so far with

88
00:04:12,087 --> 00:04:19,097
Overtone is like better, higher quality
than what Spotify is today, but anyhow,

89
00:04:19,157 --> 00:04:20,977
that's a slightly different conversation.

90
00:04:21,177 --> 00:04:24,777
I don't think you should sort of like
undersell what you've created yourself.

91
00:04:25,027 --> 00:04:25,827
I appreciate it.

92
00:04:26,407 --> 00:04:32,157
Spotify came about in a time when
the technological constraints pretty

93
00:04:32,157 --> 00:04:35,967
much forced us to a decentralized
sort of local-first model.

94
00:04:36,327 --> 00:04:39,227
And so Spotify started in 2006.

95
00:04:39,407 --> 00:04:40,777
This is when we started working on it.

96
00:04:41,187 --> 00:04:42,377
The web platform.

97
00:04:42,377 --> 00:04:46,427
And I think that what is, what has been
in historically and still is today amazing

98
00:04:46,437 --> 00:04:48,117
about the web platform is distribution.

99
00:04:48,517 --> 00:04:52,937
And so, you know, that wasn't lost on
us at that point either, but it was just

100
00:04:52,937 --> 00:04:56,337
like, none of the technology was really
there to support something like Spotify.

101
00:04:56,622 --> 00:04:59,612
And so, you know, we built a,
it's like a fully native thing.

102
00:04:59,612 --> 00:05:04,952
You know, we built a native Windows app,
a native like Mac app, Android apps.

103
00:05:04,952 --> 00:05:07,402
There's a long list of
native apps that we built.

104
00:05:07,512 --> 00:05:13,452
You know, we had a NAT hole
punching traversal stuff, things

105
00:05:13,452 --> 00:05:17,062
way above my head of, you know,
like getting through firewalls to

106
00:05:17,062 --> 00:05:18,652
implement our peer to peer system.

107
00:05:18,652 --> 00:05:22,052
And there was like, you know, this
parity stream model where you can get

108
00:05:22,257 --> 00:05:26,087
Like different pieces of data to fill
your cache was very, very complicated.

109
00:05:26,237 --> 00:05:26,587
Right.

110
00:05:27,027 --> 00:05:32,357
I would say that 90 percent of the
complexity of, of the Spotify client and

111
00:05:32,357 --> 00:05:38,077
even the server side was due to the fact
that it was local-first and that evolved

112
00:05:38,077 --> 00:05:41,767
over a long time and there's, there
were many revisions, like kind of major

113
00:05:41,767 --> 00:05:46,747
revisions to the way, uh, they implement
and solve these problems at Spotify.

114
00:05:47,047 --> 00:05:47,787
That's awesome.

115
00:05:47,807 --> 00:05:48,077
Yeah.

116
00:05:48,077 --> 00:05:49,247
And I think there.

117
00:05:49,517 --> 00:05:53,297
Since then it's slowly but surely
degraded a little bit from its

118
00:05:53,507 --> 00:05:58,537
local-first origins and slowly, but
surely also being visible in the app,

119
00:05:58,537 --> 00:06:00,487
becoming a bit slower, et cetera.

120
00:06:00,777 --> 00:06:06,497
But I guess that's the price you have
to pay as the company grows larger.

121
00:06:06,631 --> 00:06:11,251
But so after Spotify, you worked
at Facebook and also at Figma.

122
00:06:11,641 --> 00:06:16,141
And I think there you've worked on some
aspects of the products that where you've

123
00:06:16,151 --> 00:06:21,421
also arrived on some similar data models
and data paths if you look at it from

124
00:06:21,421 --> 00:06:23,961
a certain angle, look like local-first.

125
00:06:24,191 --> 00:06:26,071
So can you share a little
bit more about that?

126
00:06:26,436 --> 00:06:27,176
Yeah, sure.

127
00:06:27,296 --> 00:06:30,276
When I was at Facebook, I led this
like OS project that they had.

128
00:06:30,276 --> 00:06:33,416
And we never shipped it, but you
know, that's kind of in line with

129
00:06:33,956 --> 00:06:36,296
right now I'm working on an OS,
so that's kind of interesting.

130
00:06:36,656 --> 00:06:40,486
And that, you know, after a year
of that, it kind of ended up not

131
00:06:40,496 --> 00:06:41,986
leading to where we wanted it to be.

132
00:06:42,186 --> 00:06:45,836
And I worked on Facebook
messenger, which  it was in a

133
00:06:45,836 --> 00:06:48,781
company that had been acquired,
not long before I worked on this.

134
00:06:48,781 --> 00:06:52,141
And this is like, I think early
2012, something like that.

135
00:06:52,221 --> 00:06:56,801
And the team that they came with sort of
the acquisition of the product that, you

136
00:06:56,801 --> 00:07:00,584
know, later on underpin Facebook chat,
but these were like two things technically

137
00:07:00,604 --> 00:07:02,674
for a while was kind of local-first.

138
00:07:02,694 --> 00:07:05,804
And I think it had to be for
similar reasons that an email

139
00:07:05,804 --> 00:07:07,144
client has to be local-first.

140
00:07:07,164 --> 00:07:10,474
And so it was iOS technically
very limited platform at the time.

141
00:07:10,604 --> 00:07:12,044
That was kind of interesting to see.

142
00:07:12,144 --> 00:07:13,044
Did I have to work?

143
00:07:13,294 --> 00:07:17,874
Upwork and GraphQL together with, uh,
Lee Byron, Nick Schrock, Dan Schaefer.

144
00:07:18,274 --> 00:07:19,554
And that was really interesting.

145
00:07:20,044 --> 00:07:24,094
So, you know, I started out like a year
of, as a designer at Facebook, and then

146
00:07:24,404 --> 00:07:26,574
about a year as a software engineer.

147
00:07:26,869 --> 00:07:29,489
And after that, I worked at Dropbox
actually for a while and worked on their

148
00:07:29,489 --> 00:07:32,739
like data store thing, which is kind of
local-first thing with like automatic

149
00:07:32,799 --> 00:07:37,129
merge and, and, and diffing and stuff
and some other projects as, as well.

150
00:07:37,309 --> 00:07:37,569
Yeah.

151
00:07:37,569 --> 00:07:41,869
And, and Figma of course, like
fun foundationally is almost

152
00:07:41,869 --> 00:07:44,019
a CRDT kind of data model.

153
00:07:44,259 --> 00:07:48,859
Um, although it is a hybrid centralized,
decentralized type of product.

154
00:07:49,099 --> 00:07:53,379
So all of those products, uh,
I think all super well known.

155
00:07:53,509 --> 00:07:56,119
Most of those products, I would
not describe them as like, Oh,

156
00:07:56,119 --> 00:07:57,479
they're of course, local-first.

157
00:07:57,499 --> 00:08:02,089
I think now that you highlight it, I can
certainly see certain aspects of them

158
00:08:02,189 --> 00:08:06,839
following some of those  principles of
local-first, but I'm curious in your

159
00:08:06,839 --> 00:08:11,129
perspective, what makes each of them
local-first also from today's perspective.

160
00:08:11,129 --> 00:08:11,259
It's.

161
00:08:11,629 --> 00:08:13,789
Oh, that's an interesting question.

162
00:08:13,849 --> 00:08:17,999
Obviously, like if you disconnect from
the internet, they keep working, right?

163
00:08:18,069 --> 00:08:20,859
That's the basic litmus
test of local-first, right?

164
00:08:20,949 --> 00:08:23,649
If I can send with Facebook
messenger, for example, which is still

165
00:08:23,649 --> 00:08:24,879
around, which is still local-first.

166
00:08:25,309 --> 00:08:29,729
If you open up that app and you send some
messages and you know, you do some stuff

167
00:08:29,919 --> 00:08:31,989
like make changes and you're offline.

168
00:08:32,419 --> 00:08:33,289
That works.

169
00:08:33,419 --> 00:08:37,519
And when later you come online, those
are reconciled with any changes that

170
00:08:37,519 --> 00:08:39,019
might've happened by other people.

171
00:08:39,719 --> 00:08:41,969
You don't like lose the
stuff that you've done.

172
00:08:42,009 --> 00:08:44,799
And I think that kind of sums up
how I would think about local-first.

173
00:08:44,819 --> 00:08:47,109
There are always limitations
to these things, right?

174
00:08:47,109 --> 00:08:49,159
Like there's some, like,
where do you draw the line?

175
00:08:49,339 --> 00:08:51,649
I think you have to think about
it from a human perspective.

176
00:08:51,859 --> 00:08:56,389
When doing this litmus test and not from
a computer technological perspective,

177
00:08:56,829 --> 00:09:00,789
meaning that there is just some
data that is just impossible to get.

178
00:09:00,949 --> 00:09:01,239
Right.

179
00:09:01,249 --> 00:09:04,239
For example, if you have in a chat
application, if you have a idea of

180
00:09:04,239 --> 00:09:07,899
presence, right, if someone is online or
not, like that's not, that's naturally not

181
00:09:07,909 --> 00:09:09,529
data that you can get when you're offline.

182
00:09:09,569 --> 00:09:09,849
Right.

183
00:09:10,199 --> 00:09:12,929
And if you did, like, it wouldn't
really be useful if you showed like

184
00:09:12,929 --> 00:09:14,949
cash data, like, Oh, Johannes is online.

185
00:09:15,129 --> 00:09:17,849
Like two months ago,
like that that's useless.

186
00:09:17,849 --> 00:09:18,159
Right.

187
00:09:18,374 --> 00:09:20,644
So I think you have to think
about it from a human perspective.

188
00:09:20,744 --> 00:09:25,004
Like if I sent Johannes a message and
I hit the send button, you close the

189
00:09:25,014 --> 00:09:27,474
app or close my phone or whatever I do.

190
00:09:27,504 --> 00:09:29,854
I know Johannes is going to
get the message eventually.

191
00:09:30,324 --> 00:09:31,464
That makes a lot of sense.

192
00:09:31,534 --> 00:09:35,514
So switching gears a little bit, uh,
and thinking about this more from like

193
00:09:35,514 --> 00:09:39,724
a developer perspective, how you built
those systems, what were, are there

194
00:09:39,724 --> 00:09:44,874
any sort of similarities that Emerged
from building those systems, maybe in

195
00:09:44,874 --> 00:09:48,464
terms of like how the data is stored
and how the data layer looks like.

196
00:09:48,674 --> 00:09:50,264
Yeah, it's interesting.

197
00:09:50,384 --> 00:09:52,934
So you and I have been, you know,
we've, we kind of friends, so, you

198
00:09:52,934 --> 00:09:54,374
know, we met a couple of times.

199
00:09:54,374 --> 00:09:56,234
So we've been talking about
these things in the past.

200
00:09:56,244 --> 00:10:01,079
So I think, uh, you know, where this is
going, uh, there, there certainly is.

201
00:10:01,509 --> 00:10:06,139
A very interesting, I think, uh,
observation that I've made with these

202
00:10:06,139 --> 00:10:09,089
like projects and with these projects,
I mean, like we mentioned these

203
00:10:09,099 --> 00:10:14,279
three so far, like Figma, Spotify,
Facebook Messenger, there are more.

204
00:10:14,569 --> 00:10:17,629
I've worked on a couple of more ones,
but I think these ones Perhaps some of

205
00:10:17,689 --> 00:10:20,269
the listeners have heard about there.

206
00:10:20,379 --> 00:10:24,199
It's almost like all of them end up
like sort of, if you think about a

207
00:10:24,209 --> 00:10:28,369
signal oscillating and then slowly
stabilizing into a line that is an

208
00:10:28,369 --> 00:10:32,659
equilibrium, it's almost like all
of them have stabilized around, like

209
00:10:32,699 --> 00:10:33,899
pretty much the same data model.

210
00:10:34,014 --> 00:10:37,594
Which is this kind of ordered map of,
of data, very practically speaking.

211
00:10:37,754 --> 00:10:39,024
And I think that's really interesting.

212
00:10:39,024 --> 00:10:42,964
Like if, if you have these individual
separate, like engineer organizations,

213
00:10:42,964 --> 00:10:47,714
even in different points in time,
ending up like with similar, but pretty

214
00:10:47,714 --> 00:10:51,934
different, like practical, like product
problems, and you end up with like a

215
00:10:51,934 --> 00:10:57,124
very, very similar data model, like could
there be so that that data model that they

216
00:10:57,124 --> 00:10:58,674
have is like actually a pretty good one.

217
00:10:58,764 --> 00:10:59,244
I don't know.

218
00:10:59,314 --> 00:11:00,654
So Facebook messenger.

219
00:11:00,864 --> 00:11:04,674
Is probably the outplay here in this
little, maybe a little bit different,

220
00:11:04,714 --> 00:11:09,014
but anyhow, , how I would describe this
like data model that I'm talking about

221
00:11:09,154 --> 00:11:12,464
is think about a list of things, right?

222
00:11:12,564 --> 00:11:14,494
So think about this thing as an array.

223
00:11:14,939 --> 00:11:19,449
Meaning that like an item in this list has
like a, has an explicit position, right?

224
00:11:19,449 --> 00:11:21,669
Position one or five or 2000.

225
00:11:21,789 --> 00:11:26,519
And now each like entry in
this list is a key and a value.

226
00:11:26,589 --> 00:11:28,479
And really it doesn't have
to be key in the value.

227
00:11:28,499 --> 00:11:31,869
The point here is that
you can say, give me.

228
00:11:32,154 --> 00:11:35,224
The fifth item in the list, but
you can also say, give me the

229
00:11:35,224 --> 00:11:36,464
item with this key in the list.

230
00:11:36,804 --> 00:11:41,204
And then the value, it's just
like a couple of bytes, you know,

231
00:11:41,204 --> 00:11:43,634
the value is not some like JSON
document or anything like that,

232
00:11:43,874 --> 00:11:48,274
the value could be an identifier of
another list deals like this, right?

233
00:11:48,274 --> 00:11:50,444
So now like you have a graph, right?

234
00:11:50,534 --> 00:11:53,864
So let's say you want it to build on this
so we can take Spotify as an example.

235
00:11:53,894 --> 00:11:57,864
So Spotify has playlists on the sidebar
and the desktop app or sort of in

236
00:11:57,864 --> 00:11:59,874
the mobile app, if you go to the home
screen, you have all of these things.

237
00:11:59,874 --> 00:12:02,634
They have a list of playlists
and you can make folders and

238
00:12:02,634 --> 00:12:03,804
put playlists and playlists.

239
00:12:04,134 --> 00:12:04,444
Right.

240
00:12:04,454 --> 00:12:07,704
And you have playlists from, you
have your playlists and then there

241
00:12:07,704 --> 00:12:09,804
are sort of a, you can browse
for other people's playlists.

242
00:12:10,224 --> 00:12:10,504
Right.

243
00:12:10,584 --> 00:12:13,954
And all of these things, at
least for a very long time, were

244
00:12:13,984 --> 00:12:15,094
all the same data structure.

245
00:12:15,104 --> 00:12:16,904
They were all like this type of list.

246
00:12:16,964 --> 00:12:17,274
It's right.

247
00:12:17,314 --> 00:12:18,664
A playlist, think about it.

248
00:12:18,704 --> 00:12:21,104
It is pretty much like what
I'm talking about, right?

249
00:12:21,214 --> 00:12:22,134
You have a list of songs.

250
00:12:22,184 --> 00:12:23,334
They have a specific order, right?

251
00:12:23,334 --> 00:12:25,674
Since you might want to play
this song before that song.

252
00:12:25,674 --> 00:12:26,474
So that's important.

253
00:12:26,634 --> 00:12:28,614
And a song itself.

254
00:12:28,914 --> 00:12:30,694
Can be represented also as a list.

255
00:12:31,359 --> 00:12:35,129
But here you use the keys, so
a key could be artist, right?

256
00:12:35,539 --> 00:12:38,189
And sure, there can be many
artists, but let's simplify it.

257
00:12:38,209 --> 00:12:41,669
So a key can be artist and another
key can be, you know, song title.

258
00:12:41,699 --> 00:12:43,489
And another one is run length and so on.

259
00:12:43,679 --> 00:12:46,259
And now your playlist is
essentially the identifier.

260
00:12:47,209 --> 00:12:50,209
Each entry in your playlist is
an identifier of a list that

261
00:12:50,209 --> 00:12:51,829
represents a song, a track.

262
00:12:51,899 --> 00:12:56,049
I think it's perhaps obvious at this
point, you can now have a, uh, a folder.

263
00:12:56,089 --> 00:12:58,319
That's essentially a playlist
with links to playlists.

264
00:12:58,889 --> 00:12:59,129
Right.

265
00:12:59,399 --> 00:13:02,849
And now you have a graph and you can
build this graph up and this list

266
00:13:02,849 --> 00:13:07,969
of things that is the guarantee,
the ice date is the isolation, like

267
00:13:07,989 --> 00:13:10,279
primitive in something like Spotify.

268
00:13:10,569 --> 00:13:14,159
So like, if I say like, make these,
like move these songs in this playlist

269
00:13:14,159 --> 00:13:18,339
and move these songs in that playlist,
then these are two transactions.

270
00:13:18,339 --> 00:13:19,639
If you want to think about it that way.

271
00:13:19,964 --> 00:13:24,164
You cannot like, you cannot say
either, like move these things in

272
00:13:24,174 --> 00:13:27,714
these two playlists or don't move
anything in these two playlists.

273
00:13:27,774 --> 00:13:32,094
You can also only say, like, in within
this list, make these changes and

274
00:13:32,094 --> 00:13:35,794
have those, like, give me some sort of
guarantee that they will be reconciled

275
00:13:35,794 --> 00:13:40,654
in a predictive manner in all instances
that have access to this playlist.

276
00:13:41,024 --> 00:13:45,044
So the diffing and emerging
happens on that kind of list level.

277
00:13:45,394 --> 00:13:47,904
And interestingly, this is
kind of how Figma works too.

278
00:13:47,904 --> 00:13:50,964
And there's like some articles,
this is not any trade secrets here.

279
00:13:51,334 --> 00:13:54,674
Some articles published about this
on the Figma blogs and Figma pretty

280
00:13:54,674 --> 00:13:56,854
much have the same principle, right?

281
00:13:56,854 --> 00:14:01,044
There's a graph that's built up
by these sort of like entries.

282
00:14:01,054 --> 00:14:03,384
So you can think about them as a
log or you can think about them as

283
00:14:03,414 --> 00:14:05,434
like a serialization of a graph.

284
00:14:05,834 --> 00:14:09,434
It goes both directions and that's
the level where you different merge.

285
00:14:09,734 --> 00:14:12,194
And one of those lists
is one document on Figma.

286
00:14:12,464 --> 00:14:14,104
And so one document is that like.

287
00:14:14,174 --> 00:14:18,054
You know, it's a unit about isolation,
like either of these things change, you

288
00:14:18,054 --> 00:14:22,064
know, or they don't like one document
that's kind of in one known States and

289
00:14:22,074 --> 00:14:26,294
Facebook messenger in a similar way,
you have like messages and a message,

290
00:14:26,304 --> 00:14:29,924
you know, similarly, it's like part
of a list in a conversation and so on.

291
00:14:30,189 --> 00:14:31,679
That's super fascinating.

292
00:14:31,719 --> 00:14:35,629
I think most listeners on this
podcast, when they think about data

293
00:14:35,629 --> 00:14:39,729
models and data systems, there's
typically one of two reference points.

294
00:14:40,009 --> 00:14:44,199
The most common one would probably be like
a traditional database, whether it's on

295
00:14:44,199 --> 00:14:49,389
the server side where you have something
like Postgres or MySQL, et cetera, or if

296
00:14:49,389 --> 00:14:53,989
you're a mobile developer, you are used
to using SQLite in your client directly,

297
00:14:54,159 --> 00:14:55,969
or that's now also possible on the web.

298
00:14:55,989 --> 00:14:58,999
So I think that's the most
traditional approach is like.

299
00:14:59,279 --> 00:15:02,119
Rely on a data system as a database.

300
00:15:02,249 --> 00:15:06,099
So I'd be curious how your
suggestion kind of compares to that.

301
00:15:06,169 --> 00:15:10,519
I would assume maybe what you've described
can be a foundation of a database, but

302
00:15:10,529 --> 00:15:14,709
what would be the downsides of using
a database directly to build your app?

303
00:15:15,179 --> 00:15:17,824
Contrasting with your
approach and also now with.

304
00:15:17,824 --> 00:15:22,794
A local-first CRDTs is a very common
approach to have data structures that

305
00:15:22,794 --> 00:15:24,794
are also allow for collaboration.

306
00:15:24,794 --> 00:15:28,574
So maybe you can contrast your
approach that you've described to

307
00:15:28,584 --> 00:15:31,224
using a database or CRDTs directly.

308
00:15:31,484 --> 00:15:31,884
Yeah.

309
00:15:31,884 --> 00:15:35,574
I think this is an interesting
conversation, which is like, what

310
00:15:35,574 --> 00:15:37,174
tools do you use at one point in time?

311
00:15:37,174 --> 00:15:39,434
And like, what is a good
fit for your problem?

312
00:15:39,494 --> 00:15:40,594
And there's almost like.

313
00:15:40,799 --> 00:15:44,759
If you imagine some sort of graph
between perfect fit and time

314
00:15:44,769 --> 00:15:47,709
required and stuff, there are these
two lines and they meet somewhere.

315
00:15:47,709 --> 00:15:50,629
And it's very specific to each project
and you want to kind of hit that spot.

316
00:15:50,749 --> 00:15:51,039
Okay.

317
00:15:51,059 --> 00:15:54,089
Let's, let's think about like a
bunch of different projects, right?

318
00:15:54,109 --> 00:15:57,429
Everything from something like Spotify,
there's like a, you know, a big

319
00:15:57,429 --> 00:16:00,489
undertaking, like a company where, you
know, we're going to be, okay, we're going

320
00:16:00,489 --> 00:16:02,569
to spend a year or two of like 10 people.

321
00:16:02,569 --> 00:16:06,199
And we just kind of like, you know,
pour like tens of thousands of, of hours

322
00:16:06,229 --> 00:16:07,819
into making this one thing go well.

323
00:16:07,959 --> 00:16:11,689
And on the other side of the spectrum,
think about like a, you know, sort

324
00:16:11,689 --> 00:16:15,789
of a Robin Sloan home cooked meal
type of like, I'm gonna like make an

325
00:16:15,799 --> 00:16:17,619
app in an afternoon sort of thing.

326
00:16:17,689 --> 00:16:20,069
I think these two, you gotta
take very different approaches

327
00:16:20,079 --> 00:16:21,039
for these two things, right?

328
00:16:21,279 --> 00:16:25,169
If you build this company-size thing
by just like just throwing some generic

329
00:16:25,169 --> 00:16:26,989
thing on it where it really matters.

330
00:16:26,999 --> 00:16:29,559
And I got to say, you know,
there, there are going to be.

331
00:16:29,709 --> 00:16:33,609
A hundred different problems you need
to solve and 95 of those problems,

332
00:16:33,609 --> 00:16:36,699
you should solve a generic technology
and it's really hard to know upfront.

333
00:16:36,699 --> 00:16:40,519
There's 5 problems that really will set
your product aside from the competition.

334
00:16:40,789 --> 00:16:43,179
And those are the 5 problems where
you want to think really hard and

335
00:16:43,179 --> 00:16:44,879
solve for really, really well.

336
00:16:45,379 --> 00:16:47,739
So say that you've
identified those 5 problems.

337
00:16:47,899 --> 00:16:49,889
You don't want to throw
something generic on there.

338
00:16:50,109 --> 00:16:53,269
Because that's going to like
ruin your opportunity to really

339
00:16:53,299 --> 00:16:54,739
differentiate with Spotify.

340
00:16:54,769 --> 00:16:58,209
For example, we knew that like to
skip in a song that should never

341
00:16:58,209 --> 00:17:00,109
be slower than 200 milliseconds.

342
00:17:00,109 --> 00:17:02,899
And so a lot of engineering went into
just making sure that that was true.

343
00:17:02,979 --> 00:17:03,239
Right.

344
00:17:03,239 --> 00:17:05,459
And that's kind of how you find
some of those like five things

345
00:17:06,119 --> 00:17:08,619
with the home cooked meal type of
like, I'm going to spend a week

346
00:17:08,619 --> 00:17:10,019
and making an app kind of thing.

347
00:17:10,149 --> 00:17:12,269
You don't, you just don't
have the luxury of that.

348
00:17:12,269 --> 00:17:12,439
Right.

349
00:17:12,449 --> 00:17:15,189
Even if you do identify, these
are like one or two things that

350
00:17:15,909 --> 00:17:17,519
Like make my thing like different.

351
00:17:17,519 --> 00:17:19,109
Maybe my friends will like it more.

352
00:17:19,179 --> 00:17:20,209
You got to be creative.

353
00:17:20,239 --> 00:17:24,219
And I think in that scenario and find
either really hacking solutions or

354
00:17:24,249 --> 00:17:28,869
like just be super lucky and find
some existing stuff that does that.

355
00:17:28,894 --> 00:17:32,444
And I realized we're on a bit of a
tangent here, but I think like it's

356
00:17:32,444 --> 00:17:35,434
important to have that, like setting
that like picture frame, so to speak.

357
00:17:35,434 --> 00:17:35,704
Right.

358
00:17:35,814 --> 00:17:40,274
So with something like Spotify and
something like Figma, which both end up

359
00:17:40,284 --> 00:17:44,194
with like pretty much the same or very,
very similar data model, those data

360
00:17:44,194 --> 00:17:45,864
models are specific for their problems.

361
00:17:45,934 --> 00:17:47,484
They're both in both sides.

362
00:17:47,834 --> 00:17:50,604
They are one of these like five
things that makes them stick out.

363
00:17:50,764 --> 00:17:50,944
Right.

364
00:17:50,944 --> 00:17:56,874
Like if Figma had not came up with
it's a sort of CRDTs smelling semi

365
00:17:56,874 --> 00:18:01,654
centralized sort of, uh, document graph
format, whatever, it probably wouldn't

366
00:18:01,654 --> 00:18:05,364
have been as fast and, you know,
probably wouldn't be able to scale and

367
00:18:05,404 --> 00:18:08,454
it probably wouldn't feel that very
good if it wasn't that fast, right.

368
00:18:08,454 --> 00:18:10,864
And maybe it would never have gotten
traction in the market and wouldn't

369
00:18:10,864 --> 00:18:12,364
have been successful as a company.

370
00:18:12,704 --> 00:18:16,014
And similar for Spotify, like if
collaborating on playlists and

371
00:18:16,024 --> 00:18:19,674
stuff  will be really slow or you
would just like sometimes lose data.

372
00:18:19,674 --> 00:18:21,904
You would probably also
have lost users early on.

373
00:18:22,064 --> 00:18:23,514
And these solutions were very specific.

374
00:18:23,554 --> 00:18:25,424
So I think that that tension exists.

375
00:18:25,434 --> 00:18:28,244
And when building something
ourselves, maybe we're not on

376
00:18:28,244 --> 00:18:31,584
the extreme of like, I only have,
you know, 10 hours to make this.

377
00:18:31,614 --> 00:18:33,884
Maybe it's more like, you
know, I've got maybe 200 hours

378
00:18:33,894 --> 00:18:34,884
over the course of two months.

379
00:18:35,194 --> 00:18:36,944
I think it's very, it's very like.

380
00:18:37,204 --> 00:18:38,114
Attractive.

381
00:18:38,389 --> 00:18:41,949
To reach for an existing solution,
but I think in many cases it ends up

382
00:18:41,949 --> 00:18:46,679
costing us as much to use third party
code as it does to write it ourselves.

383
00:18:46,849 --> 00:18:47,609
So think about it.

384
00:18:47,679 --> 00:18:49,799
Let's say you use like a
library someone else read.

385
00:18:49,949 --> 00:18:50,969
So you put that in there.

386
00:18:50,999 --> 00:18:53,719
It does mostly what you want,
but at some point it will not.

387
00:18:53,874 --> 00:18:54,034
Right.

388
00:18:54,074 --> 00:18:56,634
Like every single piece
of code has bugs, right?

389
00:18:56,634 --> 00:18:58,644
Like I've never worked on
something that doesn't have bugs.

390
00:18:58,684 --> 00:18:59,614
Everything is bugs, right?

391
00:18:59,614 --> 00:19:01,474
So you just assume that
that's the thing has bugs too.

392
00:19:01,554 --> 00:19:04,254
And at one point there's gotta be,
uh, there's gotta be an issue, right?

393
00:19:04,274 --> 00:19:06,324
Or like, it doesn't do the
thing you want it to do.

394
00:19:06,424 --> 00:19:09,604
Maybe there's a bug and it does do
the thing that you want it to do.

395
00:19:09,634 --> 00:19:09,894
Right?

396
00:19:10,164 --> 00:19:12,574
So basically now you have
to fix that code, right?

397
00:19:12,594 --> 00:19:13,194
Or change it.

398
00:19:13,264 --> 00:19:15,564
And that means that you have to
read the code and understand it.

399
00:19:15,634 --> 00:19:19,744
And I argue that probably
takes a very similar amounts of

400
00:19:19,834 --> 00:19:23,294
effort in the common case as it
would, if you wrote it yourself.

401
00:19:23,464 --> 00:19:26,244
You probably, to understand it,
you're going to have to go beyond

402
00:19:26,244 --> 00:19:29,254
the code and understand the, you
know, the logical aspects of it.

403
00:19:29,254 --> 00:19:32,764
Maybe you have to read some like
technical papers or some books or

404
00:19:32,764 --> 00:19:36,144
speak with some people to understand
how things are solved in a way,

405
00:19:36,224 --> 00:19:37,954
not just like what the code does.

406
00:19:38,164 --> 00:19:41,514
So I'm not saying like people should
always go and write their own thing.

407
00:19:41,654 --> 00:19:44,404
Obviously there's gotta be a couple
of things , that don't fit this,

408
00:19:44,434 --> 00:19:45,914
they're outliers to what I'm saying.

409
00:19:46,024 --> 00:19:49,524
So if you, if you say, I kind of
need like a relational database

410
00:19:49,594 --> 00:19:52,544
and you're like, okay, I'm going
to build my own Postgres or SQLite.

411
00:19:52,644 --> 00:19:57,214
That's, I think, obviously a bad idea
since like there are existing solutions,

412
00:19:57,234 --> 00:19:59,884
really well tested, really high quality.

413
00:19:59,984 --> 00:20:03,004
If they don't do what you want it
to do, it's extremely flexible.

414
00:20:03,004 --> 00:20:04,924
You can probably bend it to
do what you want it to do.

415
00:20:05,144 --> 00:20:07,544
If you were ever run
into performance issues.

416
00:20:07,739 --> 00:20:09,369
You can solve the problem then, right?

417
00:20:09,439 --> 00:20:13,069
Assuming that like the solution
fits the problem that you have.

418
00:20:13,369 --> 00:20:18,279
I really like this mental model of like,
you choose for like 95 percent of stuff.

419
00:20:18,319 --> 00:20:23,549
You use like the default things, but like
on 5 percent you spend your innovation

420
00:20:23,569 --> 00:20:26,319
tokens and that's super interesting.

421
00:20:26,319 --> 00:20:31,449
I, and I definitely agree that choosing
the right foundation for your data model.

422
00:20:31,679 --> 00:20:36,679
It's a super high leverage bet that you
can place your innovation tokens on.

423
00:20:36,819 --> 00:20:40,649
One more thing to consider is
the, almost like the, how well the

424
00:20:40,649 --> 00:20:44,949
glove fits or like the Swiss army
knife problem, if we call it that.

425
00:20:45,089 --> 00:20:47,859
So let's say you've got to,
you're going to cook some food

426
00:20:47,959 --> 00:20:49,179
and you need some tools to cook.

427
00:20:49,179 --> 00:20:51,309
You need some pots and pans
and some knives, right?

428
00:20:51,309 --> 00:20:52,189
As a cutting boards.

429
00:20:52,189 --> 00:20:55,269
I think one approach to doing
this is you have one pot.

430
00:20:55,499 --> 00:20:58,389
Or maybe you need two pots because
you're doing two things concurrently.

431
00:20:58,419 --> 00:21:00,619
But like you have this
kind of minimalist mindset.

432
00:21:00,659 --> 00:21:03,749
You have one knife, you used
up all your, all your chopping.

433
00:21:03,769 --> 00:21:07,409
You got like, you know, one or two
pots and you cook everything in it.

434
00:21:07,459 --> 00:21:10,579
And then you got on the other side,
you got the maximalist mindset.

435
00:21:10,579 --> 00:21:12,909
You have like 20 different
knives of different sizes.

436
00:21:13,289 --> 00:21:13,749
You're right.

437
00:21:13,749 --> 00:21:17,099
And you have like 14 different pots and
you have rice cooker for that kind of rice

438
00:21:17,119 --> 00:21:18,439
and a rice cooker for this kind of rice.

439
00:21:18,439 --> 00:21:20,619
And you know, there's
this like specialization.

440
00:21:20,759 --> 00:21:23,389
I think that this thing
happens with technology too.

441
00:21:23,489 --> 00:21:24,709
And especially early on.

442
00:21:25,019 --> 00:21:28,389
I think that there's a, an appeal to
using something that's very flexible

443
00:21:28,389 --> 00:21:33,179
early on to have those 20 knives
available just in case I need like a tiny

444
00:21:33,179 --> 00:21:34,909
paring knife or a big butcher's knife.

445
00:21:34,909 --> 00:21:35,209
Right.

446
00:21:35,349 --> 00:21:35,989
Just in case.

447
00:21:36,059 --> 00:21:36,309
Right.

448
00:21:36,539 --> 00:21:39,409
And so I think a lot of people reach
for something like SQL late early

449
00:21:39,409 --> 00:21:43,339
on, just because they think, oh,
I might need like some inner outer

450
00:21:43,349 --> 00:21:46,759
join search thing hidden, you know.

451
00:21:46,999 --> 00:21:49,949
Functions in a database kind of thing,
maybe down the road, I need that,

452
00:21:49,969 --> 00:21:53,439
you know, maybe I need to do like
some something, you know, I need to

453
00:21:53,439 --> 00:21:55,969
set up constraints and to protect
myself because like, maybe I'll

454
00:21:55,969 --> 00:21:57,419
forget what I did and stuff like that.

455
00:21:57,449 --> 00:22:01,109
And, you know, that, like, like
everything, there might be some,

456
00:22:01,149 --> 00:22:04,599
there might be some truth to
that being like useful, but I

457
00:22:04,609 --> 00:22:05,899
think in most cases it's not.

458
00:22:06,259 --> 00:22:10,209
And I think in most cases, we start
out with too much flexibility.

459
00:22:10,239 --> 00:22:14,849
And the problem is that anything that's
simple will grow to become complex.

460
00:22:15,674 --> 00:22:19,344
Or another way of thinking about it
and complexity always grows, right?

461
00:22:19,754 --> 00:22:24,144
Anything you have, it's like kind of the
law of entropy, essentially, like whatever

462
00:22:24,144 --> 00:22:29,194
you have your computer system, whatever
your app over time will only grow complex.

463
00:22:29,234 --> 00:22:32,614
And you have to work really, really,
really hard to do the opposite, to

464
00:22:32,614 --> 00:22:36,404
make something complex, grow the
other direction to the towards simple.

465
00:22:36,784 --> 00:22:38,804
And so, you know, if you agree with that.

466
00:22:39,514 --> 00:22:43,024
It's, I think it's pretty reasonable
to say if you start out with something

467
00:22:43,024 --> 00:22:47,534
that is pretty flexible, it's probably
pretty complex and it will become

468
00:22:47,664 --> 00:22:49,824
very, very complex in the future.

469
00:22:49,884 --> 00:22:52,074
And so I think in most cases,
what people need, it's just

470
00:22:52,074 --> 00:22:53,744
like a key value store early on.

471
00:22:53,774 --> 00:22:56,014
And I mean, I mean, that's what
SQLite uses under the hood, right?

472
00:22:56,014 --> 00:22:57,224
SQLite is like, you know.

473
00:22:57,434 --> 00:23:00,484
A set of like functions is
essentially on top of a key

474
00:23:00,484 --> 00:23:02,064
value store to make that easier.

475
00:23:02,074 --> 00:23:05,314
And I think in most cases, if Facebook
messenger is a key value store, for

476
00:23:05,314 --> 00:23:09,594
example, at least when I worked on
it's a level DB before rocks DB thing.

477
00:23:09,724 --> 00:23:12,514
So yeah, anyhow, I just want to say that
and wrapping that up, what I was trying

478
00:23:12,564 --> 00:23:15,664
to communicate here is that when starting
out with something new and thinking

479
00:23:15,704 --> 00:23:18,964
about databases can be, you're smiling
because I know like with Overtone, you've

480
00:23:18,964 --> 00:23:22,024
been thinking a lot about this and I
think coming to the similar conclusions.

481
00:23:22,524 --> 00:23:25,994
Start out with something that's like a
glove that really fits your hand instead

482
00:23:25,994 --> 00:23:29,474
of like a whole wardrobe full of like
potential winter clothes you might need.

483
00:23:29,564 --> 00:23:31,734
Yeah, I love that analogy.

484
00:23:31,784 --> 00:23:36,324
And I've seen this story now so many
times that either you start out with a

485
00:23:36,324 --> 00:23:41,424
database and then step by step you like
remove layers from the database because

486
00:23:41,424 --> 00:23:45,474
you need to go more low level and you
need to have that performance or power.

487
00:23:45,859 --> 00:23:49,839
Or you go the other way around and
you start it up from scratch and then

488
00:23:49,839 --> 00:23:51,609
your app kind of becomes a database.

489
00:23:51,649 --> 00:23:53,289
I don't think there is a right or wrong.

490
00:23:53,299 --> 00:23:57,739
I think there's a good fit for the
right use case, but I agree that

491
00:23:57,759 --> 00:23:59,679
this is like a super common scenario.

492
00:23:59,779 --> 00:24:03,949
And it's very interesting to see
that all of those different companies

493
00:24:03,959 --> 00:24:07,709
that you've worked at, that this
emerged in a very similar way.

494
00:24:07,869 --> 00:24:11,699
Moving on a little bit from
the data nitty gritty details.

495
00:24:12,089 --> 00:24:14,069
On to a more broader topic.

496
00:24:14,119 --> 00:24:14,879
The most.

497
00:24:15,304 --> 00:24:19,834
popular platform right now, the web,
you've been building things on many

498
00:24:19,834 --> 00:24:24,214
different platforms, but I think that the
web has always been like a common factor

499
00:24:24,214 --> 00:24:25,914
in all of the systems that you've built.

500
00:24:26,214 --> 00:24:29,004
I'm curious, what is your
perspective today on the web?

501
00:24:29,324 --> 00:24:33,454
The web is what got me into programming
computers in the first place.

502
00:24:33,854 --> 00:24:35,014
Well, that's not strictly true.

503
00:24:35,064 --> 00:24:37,714
I started with like in a
friend's basement on basic.

504
00:24:38,044 --> 00:24:42,084
But the thing that really pulled me
in was like the web in the nineties.

505
00:24:42,204 --> 00:24:46,424
And I thought it was like absolutely
magical that I can go on a webpage and

506
00:24:46,424 --> 00:24:51,414
it usually said CGI bin in the location
bar and I can go to a webpage and I

507
00:24:51,414 --> 00:24:54,674
can like make a change and then I can
go to a friend's place who also had

508
00:24:54,674 --> 00:24:57,864
a modem and we can look at the page
and I can see the change that I made.

509
00:24:57,864 --> 00:24:59,014
And that to me was like.

510
00:24:59,354 --> 00:25:00,604
That that's magic.

511
00:25:00,704 --> 00:25:02,134
That's like, that's amazing.

512
00:25:02,144 --> 00:25:03,184
Forget everything else.

513
00:25:03,504 --> 00:25:05,234
I don't want to be an astronaut anymore.

514
00:25:05,244 --> 00:25:06,384
Like I want to make that thing.

515
00:25:06,494 --> 00:25:11,014
So like, I've got, you know, I've got a
lot of love for the web and yes, I worked

516
00:25:11,014 --> 00:25:13,384
on a lot of web stuff through the years.

517
00:25:13,444 --> 00:25:17,034
And I even worked on like a,
together with a friend of mine in

518
00:25:17,034 --> 00:25:21,044
2010 or so, we had like a, a fully
local-first, like website, and then

519
00:25:21,144 --> 00:25:23,764
even, even the like image processing.

520
00:25:23,979 --> 00:25:26,409
Like decentralized on clients,
computers and stuff like that.

521
00:25:26,419 --> 00:25:29,389
No Bitcoin mining, but you know, it
kind of smells like that a little bit.

522
00:25:29,479 --> 00:25:33,239
So I think the, in the last 10 years
though, it's like gone in a direction

523
00:25:33,299 --> 00:25:34,819
that I'm not super happy about.

524
00:25:34,919 --> 00:25:39,499
So first I want to say that like what
is really, really powerful and valuable

525
00:25:39,499 --> 00:25:42,079
with the web is not HTML and CSS.

526
00:25:42,079 --> 00:25:44,339
I think that's mostly like
a historical accident.

527
00:25:44,814 --> 00:25:49,274
What's what is so, so powerful is
the distribution, the fact that I

528
00:25:49,274 --> 00:25:52,794
can give you just like a URL, which
is a piece of text, which is like

529
00:25:52,794 --> 00:25:54,064
the most ubiquitous data format.

530
00:25:54,254 --> 00:25:56,164
And, you know, exactly what to do.

531
00:25:56,184 --> 00:25:59,554
I don't have to ask you to like,
Oh, by the way, with this piece of

532
00:25:59,554 --> 00:26:02,504
text, you have to go to that app
and do this thing, you know, right?

533
00:26:02,504 --> 00:26:04,444
I can send it to, you
know, exactly what it is.

534
00:26:04,654 --> 00:26:07,424
So it's ubiquitous, the human
understanding of what a URL is.

535
00:26:07,434 --> 00:26:07,994
You see that.

536
00:26:08,299 --> 00:26:11,549
My mom sees the URL, she
doesn't understand HTTP like,

537
00:26:11,719 --> 00:26:12,899
and she doesn't have to, right?

538
00:26:12,949 --> 00:26:16,699
But she sees it, she knows the URL, she
punches it into a web browser and she

539
00:26:16,699 --> 00:26:20,809
will see something that's like pretty
similar to what I see, you know, it's

540
00:26:20,809 --> 00:26:23,959
like, you know, it's similar enough
that it feels like it's the same thing.

541
00:26:24,019 --> 00:26:26,789
And that I think is, is so valuable.

542
00:26:27,304 --> 00:26:31,274
That all the downsides of the web
and all the valuable things of

543
00:26:31,284 --> 00:26:35,064
other platforms are just like,
just not tipping the scale, right?

544
00:26:35,164 --> 00:26:39,554
Like this is way so heavy on sort of,
uh, you know, an imaginary scale that

545
00:26:39,554 --> 00:26:40,924
the web platform I think has won.

546
00:26:40,984 --> 00:26:46,004
You look at like a tech workers, like
laptop today, it's probably a MacBook,

547
00:26:46,344 --> 00:26:48,354
but do they run any native apps on it?

548
00:26:48,354 --> 00:26:50,674
Like probably not, which is
kind of like bonkers, right?

549
00:26:50,829 --> 00:26:52,559
You're going to, you're going
to look at it and use Slack.

550
00:26:52,589 --> 00:26:54,279
It's a web view, right?

551
00:26:54,359 --> 00:26:55,029
And they use Figma.

552
00:26:55,059 --> 00:26:55,789
It's a web view.

553
00:26:55,929 --> 00:26:57,789
And they use like, uh, Discord.

554
00:26:57,789 --> 00:26:58,439
It's a web view.

555
00:26:58,439 --> 00:26:59,499
And they use Spotify.

556
00:26:59,499 --> 00:27:01,389
It's these days, it's a web view, right?

557
00:27:01,779 --> 00:27:04,219
And then they probably have a web
browser with like a hundred tabs.

558
00:27:04,219 --> 00:27:06,139
And, and that's obviously a web thing.

559
00:27:06,529 --> 00:27:10,179
And what's left, I don't know,
files on their local, like those,

560
00:27:10,199 --> 00:27:11,549
those are not like web things.

561
00:27:11,549 --> 00:27:11,789
Right.

562
00:27:11,789 --> 00:27:14,799
And so I think it's like really
hard to argue that the web platform

563
00:27:14,809 --> 00:27:16,669
hasn't like won in terms of.

564
00:27:16,894 --> 00:27:20,824
Becoming the dominant platform and
platform, including like Microsoft

565
00:27:20,834 --> 00:27:26,284
windows and iOS and Mac OS as platforms
here alongside web, um, because the

566
00:27:26,284 --> 00:27:30,284
web really does feel like a sort of
an operating system or a platform.

567
00:27:30,304 --> 00:27:32,264
It's like a target for
software development, right?

568
00:27:32,264 --> 00:27:32,964
And distribution.

569
00:27:33,304 --> 00:27:36,834
So where web has now has
definitely won is the.

570
00:27:37,084 --> 00:27:39,594
best distribution mechanism
that we have today.

571
00:27:39,814 --> 00:27:43,724
I think we've also sacrificed a lot
when I think there's like the sort of

572
00:27:43,724 --> 00:27:46,114
fuzzy word of like, is the app native?

573
00:27:46,394 --> 00:27:50,374
I think there's like no clear line
of an app being native or not.

574
00:27:50,404 --> 00:27:53,894
I think it's rather like, does
it feel native , corresponding

575
00:27:53,904 --> 00:27:55,294
to a certain platform?

576
00:27:55,594 --> 00:27:57,424
So where would you hope that.

577
00:27:57,804 --> 00:27:59,344
The web would go further.

578
00:27:59,354 --> 00:28:01,974
Where do we leave money on the
table in regards to the web?

579
00:28:02,174 --> 00:28:03,244
That's a good question.

580
00:28:03,324 --> 00:28:05,914
And I realized now that we're a
little bit off topic of the sort

581
00:28:05,914 --> 00:28:09,144
of general, you know, theme of this
podcast, but I think that's okay.

582
00:28:09,144 --> 00:28:10,594
I think this kind of relates somehow.

583
00:28:10,764 --> 00:28:14,884
And I think what you were saying
Johannes is I think really like stirs

584
00:28:14,914 --> 00:28:19,824
my mind in a really good way, which is,
you know, What is native and perhaps

585
00:28:19,834 --> 00:28:22,134
it's something that like feels native.

586
00:28:22,274 --> 00:28:22,504
Right.

587
00:28:22,504 --> 00:28:23,364
And what does that mean?

588
00:28:23,714 --> 00:28:28,594
I think what, what it means to me
is if I run JavaScript or if it's

589
00:28:28,594 --> 00:28:33,994
objective C or Swift or Android Java
or go, it's all the same, right?

590
00:28:34,354 --> 00:28:37,364
Like all of these things just,
you know, Are translated different

591
00:28:37,364 --> 00:28:41,594
ways to the same instructions on
the CPU and use the same memory.

592
00:28:41,604 --> 00:28:45,234
There's really no technical
difference below a certain level

593
00:28:45,244 --> 00:28:46,474
of any of these technologies.

594
00:28:46,474 --> 00:28:46,754
Right.

595
00:28:47,124 --> 00:28:50,824
So it would be incorrect to say
that like web is a different, it's

596
00:28:50,824 --> 00:28:54,354
like a user, a different CPU, like
the JavaScript CPU, that like.

597
00:28:54,504 --> 00:28:55,354
That's not a real thing.

598
00:28:55,354 --> 00:28:55,544
Right.

599
00:28:55,744 --> 00:28:59,314
So these are all the same thing at like
a pretty low level on the computer.

600
00:28:59,454 --> 00:29:02,364
And so what leaves us then is like,
not really like, does it run a

601
00:29:02,364 --> 00:29:05,634
different CPU because it doesn't,
it's more about that feeling.

602
00:29:05,724 --> 00:29:08,694
I think that feeling comes from
and why it, why it matters.

603
00:29:08,694 --> 00:29:09,474
We can talk about too.

604
00:29:09,674 --> 00:29:12,204
But I think that feeling comes
from just like things looking

605
00:29:12,204 --> 00:29:13,464
the same and behaving the same.

606
00:29:13,674 --> 00:29:16,434
Looking the same, I think is
less important behaving the same.

607
00:29:16,434 --> 00:29:20,404
I think it's a big deal and looking
the same where it's important is to

608
00:29:20,404 --> 00:29:22,754
recognize that something looks similar.

609
00:29:22,929 --> 00:29:24,609
So let's say we're walking outside.

610
00:29:24,669 --> 00:29:25,979
We walk in a park, right?

611
00:29:25,979 --> 00:29:26,999
There's like trees and stuff.

612
00:29:27,049 --> 00:29:28,939
We can identify a tree as a tree.

613
00:29:29,359 --> 00:29:32,929
Although we don't know if it's like
an oak tree or a pine tree, right?

614
00:29:33,029 --> 00:29:35,419
Or like some specific, like, type of oak.

615
00:29:35,429 --> 00:29:37,509
Maybe we do know that, oh,
that's probably an oak tree.

616
00:29:37,509 --> 00:29:38,529
That's probably a pine tree.

617
00:29:38,879 --> 00:29:42,549
But we don't know the subspecies, but it
doesn't matter the fact that, like, we can

618
00:29:42,549 --> 00:29:44,599
tell that that's a tree and that's a rock.

619
00:29:44,599 --> 00:29:46,509
This is the sky and this is the ground.

620
00:29:46,849 --> 00:29:48,199
Like those things are really important.

621
00:29:48,659 --> 00:29:52,709
Then if the grass is green or yellow
or brown, that's less important for

622
00:29:52,709 --> 00:29:56,519
our, like, you know, ability to,
like, navigate, right, the space.

623
00:29:56,749 --> 00:30:00,799
And I think the same is true in a, in a
user interface, that if I see something

624
00:30:00,799 --> 00:30:05,724
that looks like a pop up button and, or
something that looks like a button, Right.

625
00:30:05,744 --> 00:30:07,734
The most fundamental of UI elements.

626
00:30:08,174 --> 00:30:11,704
If it doesn't behave like a button,
like my mind will break, but it doesn't,

627
00:30:11,714 --> 00:30:14,964
it doesn't have to like, look exactly
like the button that I'm used to.

628
00:30:15,054 --> 00:30:15,264
Right.

629
00:30:15,264 --> 00:30:19,404
If I'm using macOS and the button, this
button we're talking about now looks

630
00:30:19,404 --> 00:30:23,724
totally different like aesthetically,
but I still identify as a button.

631
00:30:23,884 --> 00:30:26,044
The fact that it looks
different is not important.

632
00:30:26,154 --> 00:30:26,404
Right.

633
00:30:26,614 --> 00:30:27,814
As long as it behaves the same.

634
00:30:27,954 --> 00:30:31,774
So I would say that behavior is,
is really the most important part.

635
00:30:32,144 --> 00:30:36,084
It's like recognizing that it is about
the yes, that behavior, big deal.

636
00:30:36,424 --> 00:30:40,434
And I think this is where the web
platform has a huge problem because

637
00:30:40,544 --> 00:30:41,904
it comes to not an analogy, right?

638
00:30:43,024 --> 00:30:46,854
So imagine that we have like a planetary
system with different planets, you know,

639
00:30:46,864 --> 00:30:51,044
Mac OS or iOS, let's take that as an
example, iOS, that's one planet, right?

640
00:30:51,044 --> 00:30:55,114
You got a set of like rules there, you
know, grass grows in a certain way.

641
00:30:55,114 --> 00:30:56,464
There's a certain amount of gravity.

642
00:30:56,614 --> 00:30:57,974
The sun rises in a certain time.

643
00:30:58,314 --> 00:31:01,494
There's like a bunch of rules and there's
a world and everything sort of is.

644
00:31:02,074 --> 00:31:05,474
In harmony with these like laws of
physics there, and then you go to

645
00:31:05,474 --> 00:31:08,344
Microsoft windows and there's a different
world and some things are similar, but

646
00:31:08,344 --> 00:31:09,444
like, a lot of things are different.

647
00:31:09,444 --> 00:31:09,734
Right?

648
00:31:09,844 --> 00:31:13,044
And then you go to the,
to the, to the web, right?

649
00:31:13,144 --> 00:31:14,294
But the web is not a planet.

650
00:31:14,294 --> 00:31:16,014
The web is another planetary system.

651
00:31:16,284 --> 00:31:19,284
There's like, not one website works
the same as the other website.

652
00:31:19,344 --> 00:31:22,214
This is actually a problem
from a business perspective.

653
00:31:22,614 --> 00:31:25,484
And it's like a lot of big things,
you know, run by businesses

654
00:31:25,484 --> 00:31:26,344
and they care about money.

655
00:31:26,434 --> 00:31:28,234
And so I think they're
leaving money on the table.

656
00:31:28,634 --> 00:31:31,404
By making things like
behave differently, right?

657
00:31:31,444 --> 00:31:35,834
I go to, I don't know, uh, a
website for, uh, for getting

658
00:31:35,834 --> 00:31:36,994
groceries delivered, right?

659
00:31:37,434 --> 00:31:40,634
And now this website has like some
pop up menu that's like some homemade

660
00:31:40,634 --> 00:31:44,634
thing and it doesn't work the way I
expect it to and now like that, that

661
00:31:44,634 --> 00:31:48,934
becomes like a cognitive, like work
that becomes like a, a road bump

662
00:31:48,984 --> 00:31:50,794
that becomes like, like a detour.

663
00:31:51,054 --> 00:31:54,864
Right for myself, that's something that
I have to spend my, my limited energy on.

664
00:31:54,934 --> 00:31:56,264
Maybe I go to this website.

665
00:31:56,544 --> 00:31:57,684
And again, order groceries.

666
00:31:57,744 --> 00:31:58,584
I haven't done it before.

667
00:31:58,584 --> 00:32:01,454
I'm like, is this going to,
is this, is this a good idea?

668
00:32:01,504 --> 00:32:03,334
Should I do this instead of
going to the grocery store?

669
00:32:03,354 --> 00:32:03,984
Blah, blah, blah.

670
00:32:04,054 --> 00:32:07,634
Then let's say that this website
would be like, there's a big hand

671
00:32:07,644 --> 00:32:10,094
coming up in the middle of the
website that says like, fuck you, man.

672
00:32:10,464 --> 00:32:11,334
It's like, you suck.

673
00:32:11,334 --> 00:32:14,839
And like, I would pretty quickly as
close the website to go somewhere

674
00:32:14,839 --> 00:32:17,769
else, probably if it started, like,
assaulting me sort of verbally.

675
00:32:17,869 --> 00:32:19,689
So that's like a very
extreme version of it.

676
00:32:19,729 --> 00:32:22,059
And I think these small things
are these, like, tiny things

677
00:32:22,059 --> 00:32:23,239
to build up to the same thing.

678
00:32:23,349 --> 00:32:23,729
Right?

679
00:32:23,869 --> 00:32:27,289
Eventually, when it's like, I filled
something out in the form, and then

680
00:32:27,319 --> 00:32:31,524
I switched tabs and I came back and
like, They had some server side session

681
00:32:31,534 --> 00:32:33,544
or some like insane idea like that.

682
00:32:33,834 --> 00:32:36,844
And it like wasted all of the stuff I
read them because I hadn't submitted

683
00:32:36,844 --> 00:32:38,554
it because my, my session expired.

684
00:32:38,594 --> 00:32:38,914
Right.

685
00:32:39,364 --> 00:32:41,744
I'm going to be furious
and things like that.

686
00:32:41,974 --> 00:32:46,114
Those kind of, they almost account
toward like a rising thermometer.

687
00:32:46,184 --> 00:32:48,514
And when it gets too warm, I'm
like, Ooh, I'm starting to sweat.

688
00:32:48,534 --> 00:32:49,054
I'm out of here.

689
00:32:49,104 --> 00:32:52,124
I know I'm like saying a lot of words
and it's a little fluffy, but I think

690
00:32:52,124 --> 00:32:56,394
that there is some, some real value left
on the table here in terms of like,.

691
00:32:56,754 --> 00:33:01,709
Removing that friction and instead
having that like limited cognitive

692
00:33:01,709 --> 00:33:05,939
supply of a user of a visitor of
whatever thing you have focused on

693
00:33:05,939 --> 00:33:07,049
what makes your thing different.

694
00:33:07,049 --> 00:33:07,329
Right?

695
00:33:07,469 --> 00:33:11,339
If I go to Overtone and I use
Overtone, like how, like I scroll,

696
00:33:11,359 --> 00:33:14,099
that shouldn't be like the thing
that I spend time on, right?

697
00:33:14,139 --> 00:33:18,229
How I select what happens if I double
click like these things, if I have

698
00:33:18,229 --> 00:33:19,919
to spend my brain energy on that.

699
00:33:20,064 --> 00:33:22,484
I'm not going to have much brain
energy left on like what actually

700
00:33:22,484 --> 00:33:23,674
makes Overtone interesting.

701
00:33:23,774 --> 00:33:26,994
So I think then, you know, where,
where is this not true that I'm saying?

702
00:33:27,004 --> 00:33:28,684
I think it's like with
entertainment and art.

703
00:33:29,189 --> 00:33:29,439
Right.

704
00:33:29,449 --> 00:33:32,409
If I visit like a website that is
supposed to give me an experience,

705
00:33:32,809 --> 00:33:34,409
what I'm saying does not apply, right?

706
00:33:34,419 --> 00:33:37,719
If I like play a video game and part
of the video game, it's just like,

707
00:33:37,729 --> 00:33:39,899
there's just some, some ideas about you.

708
00:33:39,899 --> 00:33:43,459
You kind of want the person to think
about like how you interact with something

709
00:33:43,459 --> 00:33:48,619
instead of a button on top of like the
screen, maybe you like, there's a 3d

710
00:33:48,619 --> 00:33:50,469
world and you interact with some liver.

711
00:33:50,529 --> 00:33:54,839
So, so it doesn't apply everything, but
I think in vast majority of web apps,

712
00:33:55,234 --> 00:33:57,264
What I'm talking about is like an issue.

713
00:33:57,384 --> 00:33:57,734
Right.

714
00:33:57,784 --> 00:34:03,134
Uh, I always look about like the web
as a spectrum from going for like what

715
00:34:03,134 --> 00:34:08,544
the web was originally created for
websites to now what we are also using

716
00:34:08,544 --> 00:34:12,244
the big web hammer for is like for
web apps, and I think there is this

717
00:34:12,394 --> 00:34:16,104
spectrum and my theory is that we're.

718
00:34:16,714 --> 00:34:21,784
the web apps, this is where it really
matters that the apps feel more native

719
00:34:21,824 --> 00:34:26,184
and that all the paper cuts are really
like worked out, but they are not.

720
00:34:26,364 --> 00:34:29,864
And I think this is where we are
using the wrong, the wrong hammer

721
00:34:30,024 --> 00:34:32,194
for building those, those web apps.

722
00:34:32,564 --> 00:34:38,624
And so I think one way to think about
addressing that is I think to build

723
00:34:38,624 --> 00:34:43,544
those apps in a, in a more local-first
way as a way out of that misery.

724
00:34:43,814 --> 00:34:44,834
Would you agree with that?

725
00:34:44,874 --> 00:34:49,154
Or do you have other ideas how we
make the web better in those cases?

726
00:34:49,434 --> 00:34:52,404
I think the local-first
approach is one of them.

727
00:34:52,474 --> 00:34:53,234
I think that it's.

728
00:34:53,644 --> 00:34:57,894
It's interesting how making a web app
local-first is kind of like playing

729
00:34:57,894 --> 00:35:01,904
on hard mode, I think, since the web
is fundamentally centralized, if you

730
00:35:01,914 --> 00:35:03,354
think what, what defines the web?

731
00:35:03,354 --> 00:35:06,594
Well, I think hypertext, like, you
know, originally defined the web.

732
00:35:06,604 --> 00:35:09,584
And I think today it's more like web
browsers define the web and hypertext is

733
00:35:09,594 --> 00:35:13,994
like 1 medium, you know, you could open a
PDF, you know, in SafarI can open a PDF.

734
00:35:14,814 --> 00:35:16,764
I can do that in Chrome too, but it sucks.

735
00:35:16,834 --> 00:35:20,784
And it's fundamentally like built
on this idea that like, I have a

736
00:35:20,784 --> 00:35:23,594
portal that connects to a service
somewhere else over the internet.

737
00:35:23,884 --> 00:35:28,214
And, you know, now we have
like things in the web browser

738
00:35:28,214 --> 00:35:29,344
that kind of fuses the border.

739
00:35:29,344 --> 00:35:34,054
But, um, if you think about like a
local email client instead, right.

740
00:35:34,254 --> 00:35:37,744
Or an email client running on iOS or
something like that, then you're not

741
00:35:37,754 --> 00:35:40,234
starting out in an environment that is.

742
00:35:40,864 --> 00:35:43,914
Already set up against you, so
to speak, if you're not trying to

743
00:35:43,914 --> 00:35:45,264
build something local-first, right?

744
00:35:45,454 --> 00:35:47,054
It's kind of neutral ground, right?

745
00:35:47,054 --> 00:35:50,254
You can build an email client that
works like a web browser, right?

746
00:35:50,254 --> 00:35:53,664
That like the first thing that does
when it starts up is to connect to

747
00:35:53,734 --> 00:35:57,524
a server somewhere and ask it what
emails does Johannes have, right?

748
00:35:58,144 --> 00:36:01,284
Another way of doing it, you can, but
you have to write that code, right?

749
00:36:01,314 --> 00:36:05,444
And now they're like conscious,
like choice that you can make is.

750
00:36:06,154 --> 00:36:07,414
Let's read from a database.

751
00:36:07,414 --> 00:36:09,844
What emails I already know Johannes have.

752
00:36:10,199 --> 00:36:12,419
And now I'm going to go and ask
a server if there are any new

753
00:36:12,419 --> 00:36:13,779
emails to put in that database.

754
00:36:14,109 --> 00:36:17,539
Whereas on the web, like you have
that first choice made for you.

755
00:36:17,769 --> 00:36:20,249
And to some extent, like you
can't even undo that choice.

756
00:36:20,359 --> 00:36:21,879
You have to kind of work around it.

757
00:36:21,929 --> 00:36:24,899
So I think like your question
was really about like, does

758
00:36:24,899 --> 00:36:26,509
local-first make the web better?

759
00:36:26,539 --> 00:36:28,359
Like, what can we do to like fix it?

760
00:36:28,359 --> 00:36:29,509
And what's the issue?

761
00:36:29,789 --> 00:36:34,309
I think the, the solve here is,
is more about the user experience.

762
00:36:34,309 --> 00:36:34,829
I think.

763
00:36:35,224 --> 00:36:38,674
You said the web was kind of made
for web pages and, and I would go a

764
00:36:38,674 --> 00:36:41,574
little further to say the web was kind
of made for like documents, right?

765
00:36:41,574 --> 00:36:42,344
Like text document.

766
00:36:42,924 --> 00:36:46,824
I think your average marketing
website when information about some

767
00:36:46,824 --> 00:36:50,714
service or product or whatever, or
like, uh, you know, an essay or an

768
00:36:50,724 --> 00:36:55,814
article about to learn about something
that HTML and CSS is great for, I

769
00:36:55,814 --> 00:36:57,034
mean, this is what it's made for.

770
00:36:57,074 --> 00:36:57,854
It's fantastic.

771
00:36:57,864 --> 00:37:01,684
It's like a layout tool for like, you
know, text and images and video and stuff.

772
00:37:01,684 --> 00:37:01,944
Right.

773
00:37:02,204 --> 00:37:03,674
And of course we've gone way beyond that.

774
00:37:03,674 --> 00:37:07,694
We can now have interactive elements to
learn about how like a, I don't know, some

775
00:37:07,694 --> 00:37:09,774
sort of water lock on a boat works right.

776
00:37:09,774 --> 00:37:10,704
By like playing around with it.

777
00:37:10,704 --> 00:37:11,564
And that's super cool.

778
00:37:11,604 --> 00:37:14,154
And I think that's where it
like really shines the medium.

779
00:37:14,224 --> 00:37:16,824
But then you think about something
like Figma where we, where we

780
00:37:16,824 --> 00:37:20,104
spent over 1000 engineering
hours on just the context menus.

781
00:37:20,509 --> 00:37:23,179
Which is insane and they still
kind of suck, you know, and

782
00:37:23,229 --> 00:37:24,749
that that is like, not okay.

783
00:37:24,749 --> 00:37:27,839
I think it's a good, like, think
to think about, like, do I want

784
00:37:27,839 --> 00:37:29,859
to spend if I care about quality?

785
00:37:29,929 --> 00:37:33,119
And I think a lot of people listening
to this do care about quality.

786
00:37:33,119 --> 00:37:36,929
And it's maybe 1 of the reasons they
even started thinking about local-first.

787
00:37:36,929 --> 00:37:41,049
If If I care about the quality of the
thing that I'm building and the people

788
00:37:41,049 --> 00:37:43,919
have a good experience with it, there's
a couple of trade offs I have to do.

789
00:37:43,999 --> 00:37:44,279
Right?

790
00:37:44,279 --> 00:37:45,079
Like, first off.

791
00:37:45,079 --> 00:37:45,239
Yeah.

792
00:37:45,399 --> 00:37:46,939
You can't just get quality for free.

793
00:37:46,959 --> 00:37:48,079
Quality has a cost.

794
00:37:48,249 --> 00:37:51,449
So usually that means I will have
less features or fewer features.

795
00:37:51,629 --> 00:37:55,489
And it probably also means that I will
have to spend more time in a couple of

796
00:37:55,499 --> 00:37:57,939
areas that are like hard to identify.

797
00:37:58,059 --> 00:38:01,159
And in turn, that means I have to spend
time identifying those areas, right?

798
00:38:01,259 --> 00:38:02,769
Something like context menus at Figma.

799
00:38:03,334 --> 00:38:06,574
Time, like trying to understand, like,
what, what is a good context menu?

800
00:38:06,584 --> 00:38:07,844
Like, what do people expect?

801
00:38:08,004 --> 00:38:11,634
This is still a lot of, still a
lot of product or engineer work or

802
00:38:11,634 --> 00:38:14,234
whatever you want to call it, design
work, but it's not work where you

803
00:38:14,234 --> 00:38:16,134
like write code or like draw things.

804
00:38:16,144 --> 00:38:18,654
This is like, you speak with
people and you thinking whiteboard

805
00:38:18,654 --> 00:38:19,524
and all that kind of stuff.

806
00:38:19,524 --> 00:38:19,734
Right.

807
00:38:19,764 --> 00:38:21,544
But that's still like an important part.

808
00:38:21,699 --> 00:38:24,829
Uh, on the road to getting to something
that has like decent quality, because

809
00:38:24,839 --> 00:38:27,979
then the next step is going to be, now
that we understand like what people

810
00:38:27,979 --> 00:38:32,099
expect and, and I think quality and
expectations are very much intertwined.

811
00:38:32,289 --> 00:38:33,889
Now we know what, what to build.

812
00:38:34,119 --> 00:38:37,089
And then you have like something like
the web platform with this input event

813
00:38:37,109 --> 00:38:40,059
model and it's focusing system and all
this kind of stuff you have to sort

814
00:38:40,059 --> 00:38:43,589
of like, you know, that's another like
place where you got to invest time.

815
00:38:43,589 --> 00:38:43,859
Right.

816
00:38:43,999 --> 00:38:48,689
So I think like what a possible better
future might look like is if you imagine

817
00:38:48,689 --> 00:38:53,689
in a web browser, Having a different
content type that's like, I don't know,

818
00:38:53,809 --> 00:38:56,369
um, application slash application.

819
00:38:56,379 --> 00:38:57,109
I don't know, whatever.

820
00:38:57,119 --> 00:38:57,649
It doesn't matter.

821
00:38:58,299 --> 00:39:03,209
So like a server, like sends back
like a blob of data that is this

822
00:39:03,219 --> 00:39:07,389
different format, uh, instead of
HTML for something that's an app.

823
00:39:07,719 --> 00:39:07,999
Right.

824
00:39:08,219 --> 00:39:09,909
I think that's a stopgap solution.

825
00:39:09,959 --> 00:39:12,309
And I wouldn't be surprised if
someone like Arc or something is

826
00:39:12,309 --> 00:39:13,509
like working on this right now.

827
00:39:13,649 --> 00:39:17,489
But that's going to require developers
to like write apps in a different way.

828
00:39:17,529 --> 00:39:18,149
And I think that's a.

829
00:39:18,469 --> 00:39:19,769
Big deal.

830
00:39:19,829 --> 00:39:22,639
And you're still going to be in
the scenario for web browser.

831
00:39:22,679 --> 00:39:24,219
That's fundamentally centralized, right?

832
00:39:24,239 --> 00:39:28,019
The whole model is like you're
in inside this like little box

833
00:39:28,349 --> 00:39:30,189
on your very powerful computer.

834
00:39:30,519 --> 00:39:33,429
You put this little box inside your
like amazing powerful computer.

835
00:39:33,629 --> 00:39:37,039
That's like literally like visually
a little box inside and this

836
00:39:37,039 --> 00:39:40,009
little box inside now can only
use some of your resources, right?

837
00:39:40,369 --> 00:39:41,879
It's single threaded mostly.

838
00:39:42,159 --> 00:39:44,949
And it can use maybe two gigabytes
or four gigabytes of your

839
00:39:44,949 --> 00:39:47,129
like 90 gigabyte, like memory.

840
00:39:47,139 --> 00:39:50,139
And, you know, you got all of these
like kind of weird things and that

841
00:39:50,139 --> 00:39:53,139
is not going to go away, but, and,
and the more long term solution might

842
00:39:53,139 --> 00:39:56,279
be something, something a little
different or like maybe bringing back

843
00:39:56,279 --> 00:39:57,369
native apps, whatever that means.

844
00:39:57,459 --> 00:39:59,749
I don't know what that means, but
anyhow, the user experience here, I

845
00:39:59,749 --> 00:40:04,709
think like moving away from HTML and
CSS, it's, it's a, it's a, I don't

846
00:40:04,709 --> 00:40:06,369
even, I can't really see the path.

847
00:40:06,629 --> 00:40:09,669
Toward that, but I think that
would be like a true improvement to

848
00:40:09,669 --> 00:40:12,739
quality where I can say, I want a
context menu with these things in it.

849
00:40:13,089 --> 00:40:16,029
And I know that it's going
to work and work everywhere.

850
00:40:16,039 --> 00:40:17,299
And people know what to expect.

851
00:40:17,329 --> 00:40:21,019
And I can spend like maybe one
day on putting that context menu

852
00:40:21,019 --> 00:40:23,709
together and testing and stuff
instead of like, you know, a year.

853
00:40:23,809 --> 00:40:24,739
What do you think?

854
00:40:24,739 --> 00:40:26,499
Like, you've been asking
me a lot of questions.

855
00:40:26,499 --> 00:40:30,089
I'm also really curious what you think
about these things because you actually

856
00:40:30,139 --> 00:40:32,049
think about this like day to day, right?

857
00:40:32,189 --> 00:40:33,369
When it comes to like the web.

858
00:40:33,809 --> 00:40:37,179
Would you agree or do you disagree when
it comes to like the, you know, the

859
00:40:37,179 --> 00:40:41,639
quality and the fit of HTML and CSS
here toward like a model that's better?

860
00:40:41,949 --> 00:40:42,999
I completely agree.

861
00:40:43,049 --> 00:40:47,489
I haven't reached the context menu stage
yet in the app development journey,

862
00:40:47,789 --> 00:40:52,959
but I've so far spent a lot of time on
tables and just making the app fast.

863
00:40:52,959 --> 00:40:56,729
We haven't talked, we've like somehow
touched on performance, but another

864
00:40:56,729 --> 00:41:01,799
aspect besides just raw capabilities of
the web is also just making the app fast.

865
00:41:01,829 --> 00:41:06,219
Building a fast web app is something
that's like you said, like it's, it's

866
00:41:06,219 --> 00:41:10,399
an hard mode, not just hard mode in
terms of capabilities, but also hard

867
00:41:10,399 --> 00:41:14,889
mode in terms of performance, since
if you want to build things in a

868
00:41:14,959 --> 00:41:20,636
like rich, interactive experiences
with that HTML, CSS document model.

869
00:41:20,666 --> 00:41:22,236
That's not what it was built for.

870
00:41:22,336 --> 00:41:27,256
And so this is where I find myself
reaching for other approaches now.

871
00:41:27,286 --> 00:41:31,876
So I'm specifically for like the table
component I've mentioned, I'm using a

872
00:41:31,876 --> 00:41:37,456
great tool or a great software project
called Glide Data Grid, which, um, is

873
00:41:37,456 --> 00:41:42,456
like a React table implementation, but
which is rendered entirely on a canvas.

874
00:41:43,346 --> 00:41:49,706
Um, and so that allows you to get
like 120 FPS smooth experience and

875
00:41:49,716 --> 00:41:54,816
way outperforms any other react
table implementation out there, but

876
00:41:54,826 --> 00:41:57,256
you gotta switch your mindset a bit.

877
00:41:57,266 --> 00:42:01,916
So you're no longer tweaking
CSS values and wrapping things

878
00:42:01,916 --> 00:42:04,220
in 5 deeply nested divs.

879
00:42:04,301 --> 00:42:09,311
But if you want something more custom,
you got to reach for like the canvas

880
00:42:09,341 --> 00:42:14,001
API and go back to drawing rectangles
and so on, which I personally enjoy.

881
00:42:14,001 --> 00:42:17,791
And I think a lot of other
people have also come to like

882
00:42:17,811 --> 00:42:19,111
rediscover this approach.

883
00:42:19,141 --> 00:42:20,291
That is actually quite nice.

884
00:42:20,911 --> 00:42:25,356
But I think, Looking at this more broadly,
I think there could be almost like a

885
00:42:25,466 --> 00:42:31,056
app kit kind of abstraction, what you
got on, on iOS, on Mac, but maybe for

886
00:42:31,056 --> 00:42:36,316
the web, maybe like a whole new, whether
it's, uh, the MIME type like application

887
00:42:36,316 --> 00:42:41,126
slash application or something else, but
that I think we have now really powerful

888
00:42:41,136 --> 00:42:46,426
primitives, whether it's web GPU and
WASM, et cetera, where we can have like

889
00:42:46,426 --> 00:42:50,966
entirely different model, we leverage
the distribution mechanism of the web.

890
00:42:51,746 --> 00:42:54,686
But we're going for like a flash 2.

891
00:42:54,726 --> 00:42:59,616
0, but I think there's some really
interesting developments there.

892
00:42:59,656 --> 00:43:03,886
And, uh, this glide data grid canvas
table that I'm using, I think that's just

893
00:43:03,886 --> 00:43:06,366
like the beginning of, of new approaches.

894
00:43:06,606 --> 00:43:11,226
So another, uh, notable project that
comes to mind is, uh, it's called eGPU.

895
00:43:11,246 --> 00:43:13,026
I think, uh, no, sorry, eGUI.

896
00:43:13,256 --> 00:43:16,426
Oh, by Emil at, uh, uh, Rerun.

897
00:43:16,751 --> 00:43:17,431
Exactly.

898
00:43:17,571 --> 00:43:17,971
Yeah.

899
00:43:18,201 --> 00:43:20,941
So that, that's a really
compelling project.

900
00:43:20,951 --> 00:43:26,631
I think it's still, um, I think it's
both come along really, really far, but

901
00:43:26,641 --> 00:43:31,621
it's still early compared to like all the
primitives that you're getting from like

902
00:43:31,651 --> 00:43:38,521
HTML and CSS, and it's kind of a miracle
how capable browsers still are and how.

903
00:43:38,726 --> 00:43:43,376
Relatively speaking, how performant
all of those things are compared to

904
00:43:43,376 --> 00:43:46,416
the complexity that they can afford.

905
00:43:46,456 --> 00:43:48,616
So I'm of the same opinions like that.

906
00:43:48,616 --> 00:43:51,276
I have a love hate
relationship with the web.

907
00:43:51,586 --> 00:43:51,846
Yeah.

908
00:43:51,856 --> 00:43:54,066
I just want to like reflect
on what you were saying.

909
00:43:54,436 --> 00:43:56,516
It's, it is interesting though, right?

910
00:43:56,516 --> 00:43:59,996
How you're talking about the table
component, how you're basically

911
00:44:00,006 --> 00:44:01,456
just like exiting out from.

912
00:44:01,996 --> 00:44:04,096
All of the HTML and CSS, right?

913
00:44:04,376 --> 00:44:05,326
It's kind of what the canvas is.

914
00:44:05,326 --> 00:44:08,346
You punch a hole through all
of that stuff and you say, I'm

915
00:44:08,346 --> 00:44:11,486
just going to go like start from
scratch, basically, and draw pixels.

916
00:44:11,666 --> 00:44:14,116
And now you're going to, you're
going to make some trade offs, right?

917
00:44:14,116 --> 00:44:16,116
Like you're going to have
to implement your own like

918
00:44:16,136 --> 00:44:18,066
shadow DOM for accessibility.

919
00:44:18,066 --> 00:44:21,686
And you're going to have to like, you
know, re implement things like scrolling.

920
00:44:21,726 --> 00:44:23,996
And you're going to, there's
like, now there's like an

921
00:44:24,006 --> 00:44:25,496
ocean of stuff you have to do.

922
00:44:25,546 --> 00:44:29,216
And perhaps that's why you use the
third party code that maybe has

923
00:44:29,286 --> 00:44:30,796
already climbed this mountain for you.

924
00:44:31,096 --> 00:44:34,756
But it is interesting how, like
the solution, so to speak, for your

925
00:44:34,756 --> 00:44:38,736
problems there was just like, not
use the web platform essentially.

926
00:44:38,766 --> 00:44:38,966
Right.

927
00:44:38,976 --> 00:44:40,416
Like not use HTML and CSS.

928
00:44:40,696 --> 00:44:43,926
I think that's why, like there's
eGUI, there's like, you know, there's,

929
00:44:44,026 --> 00:44:50,056
uh, Deere image GUI, there is make
pad, there's like Zed and warp.

930
00:44:50,056 --> 00:44:52,496
And there's like, there's so many
projects that develop their own.

931
00:44:52,631 --> 00:44:57,191
UI frameworks, some of them target
just like some unknown platform.

932
00:44:57,191 --> 00:44:58,311
That's kind of all of them.

933
00:44:58,471 --> 00:45:01,491
Some of them specifically target the web,
but I think what they all have in common

934
00:45:01,491 --> 00:45:02,881
is that like, they don't use the web.

935
00:45:02,991 --> 00:45:03,231
Right.

936
00:45:03,281 --> 00:45:06,861
And I think the web is like
the dominant HTML and what

937
00:45:06,861 --> 00:45:08,051
makes a computer fast, right?

938
00:45:08,051 --> 00:45:10,491
Like, or what makes
software on a computer fast?

939
00:45:10,691 --> 00:45:13,941
So the hardware we already talked earlier
about the hardware that we have today.

940
00:45:13,951 --> 00:45:14,421
It's like.

941
00:45:14,841 --> 00:45:17,281
So ridiculously fast.

942
00:45:17,661 --> 00:45:20,561
It's hard to comprehend how
like fast computers are today.

943
00:45:20,881 --> 00:45:24,411
Even computers from five years ago
are like mind blowingly fast, but

944
00:45:24,951 --> 00:45:27,291
software keeps getting more complex.

945
00:45:27,661 --> 00:45:28,011
Right?

946
00:45:28,111 --> 00:45:31,741
So there's always that, like, there's
the balance of hardware, hardware

947
00:45:31,741 --> 00:45:35,661
engineers makes things go faster and
software engineers make things go slower.

948
00:45:35,831 --> 00:45:36,131
Right.

949
00:45:36,201 --> 00:45:38,261
There's that, that it's like a pump.

950
00:45:38,471 --> 00:45:39,521
It goes like that forever.

951
00:45:39,581 --> 00:45:43,361
And so, yeah, you take something
like, like one of these, like, uh,

952
00:45:43,371 --> 00:45:47,651
new GUIs that are implemented on just
like, uh, Canvas or like Figma, right.

953
00:45:47,731 --> 00:45:51,741
They are fast because like,
they just do less like shit.

954
00:45:52,061 --> 00:45:53,611
Like it's as simple as that, right?

955
00:45:53,611 --> 00:45:56,421
They just like cut out some
stuff that they don't need.

956
00:45:56,511 --> 00:46:00,091
What makes software go fast on a
technical level at 15, 20 years ago, it

957
00:46:00,091 --> 00:46:02,481
was, it was like, uh, processing speed.

958
00:46:02,541 --> 00:46:05,561
People will do a lot of smart things
with caching to make things go faster.

959
00:46:05,561 --> 00:46:06,711
Today it's memory, right?

960
00:46:06,751 --> 00:46:10,931
If you, and memory and context switching,
and you know, you can go further up in the

961
00:46:10,931 --> 00:46:15,281
abstraction stack, but like fundamentally
you have a CPU, right, or like a core of

962
00:46:15,281 --> 00:46:18,911
a CPU and you have a conveyor belt and on
the conveyor belt are instructions, right?

963
00:46:19,071 --> 00:46:21,601
And there are things like
load something from memory.

964
00:46:22,106 --> 00:46:25,016
Uh, and load something else from
memory, add those two things together

965
00:46:25,266 --> 00:46:29,226
and then put the result, like
upload that to memory here, right?

966
00:46:29,226 --> 00:46:30,126
That's all it does.

967
00:46:30,126 --> 00:46:31,366
That's all the computer does, right?

968
00:46:31,416 --> 00:46:33,176
It just goes like this forever.

969
00:46:33,506 --> 00:46:36,106
The speed of this conveyor
belt, and that's the CPU.

970
00:46:36,466 --> 00:46:39,736
It is so fast that it's basically today.

971
00:46:39,736 --> 00:46:42,176
It's like almost fully limited.

972
00:46:42,371 --> 00:46:44,451
By its ability to communicate with memory.

973
00:46:44,461 --> 00:46:45,771
So memory is really the limit.

974
00:46:45,831 --> 00:46:47,881
It, of course there it's
more complex than this.

975
00:46:47,881 --> 00:46:49,971
And there's like many levels
of memory and stuff like that.

976
00:46:50,251 --> 00:46:54,721
But I think what happens is we use these
like high level things like JavaScript

977
00:46:54,861 --> 00:46:59,321
running in a, in like virtualized in
some container on top of something else.

978
00:46:59,331 --> 00:47:03,581
So now like you got basically none of
the benefits of really fast memory.

979
00:47:03,651 --> 00:47:07,491
That is the CPU has like a
memory built in called registers.

980
00:47:07,541 --> 00:47:08,531
And then it has like a.

981
00:47:09,106 --> 00:47:11,216
A very small piece of
memory that's nearby it.

982
00:47:11,216 --> 00:47:14,196
That's like the first level of
like a cache, like a line cache

983
00:47:14,196 --> 00:47:17,546
and and further and further away
and fetching something from memory.

984
00:47:17,816 --> 00:47:19,716
It's kind of like, imagine
you're sitting by your desk

985
00:47:19,716 --> 00:47:21,156
and you need a pen to write on.

986
00:47:21,296 --> 00:47:25,456
If you have opinions next to you, that's
kind of if it's in, in, in the line

987
00:47:25,456 --> 00:47:26,976
cache in the CPU, you just pick it up.

988
00:47:26,986 --> 00:47:28,210
Be right with it.

989
00:47:28,391 --> 00:47:32,451
And now like getting the pen from memory,
it's like walking to your neighbor's

990
00:47:32,451 --> 00:47:36,231
apartment to borrow a pen, going back
and writing one thing and then going back

991
00:47:36,231 --> 00:47:37,721
to the neighbor again to leave the pen.

992
00:47:37,741 --> 00:47:39,921
Like that's the order of
magnitude of difference.

993
00:47:39,921 --> 00:47:40,191
Right.

994
00:47:40,401 --> 00:47:43,851
And now you use something like, like a
higher level thing, like JavaScript, the

995
00:47:43,851 --> 00:47:45,511
Python, or there's like many, many things.

996
00:47:45,511 --> 00:47:49,111
I'm not saying one thing is like bad
or good, but just the concept of it.

997
00:47:49,576 --> 00:47:52,306
Urea is always going to have to go to
the neighbor for that patent, right?

998
00:47:52,306 --> 00:47:54,346
You can very rarely like use the same.

999
00:47:54,416 --> 00:47:57,386
If you have things adjacent in memory
and you access them, like you're

1000
00:47:57,386 --> 00:48:01,136
looping over like a, an array of
things that are all in this contiguous

1001
00:48:01,136 --> 00:48:02,646
array of things, like in memory.

1002
00:48:02,776 --> 00:48:04,666
That's like, that's like basically free.

1003
00:48:04,716 --> 00:48:08,736
If you have an array that points,
like that are pointers to things.

1004
00:48:09,051 --> 00:48:11,961
That's just like a hundred times
slower, at least it's, it's, it's

1005
00:48:11,971 --> 00:48:13,271
not even like a little bit slower.

1006
00:48:13,281 --> 00:48:15,881
It's just like incomprehensibly
slower than the first thing.

1007
00:48:15,991 --> 00:48:18,941
And so what a lot of like performance
stuff does today and some of these

1008
00:48:18,981 --> 00:48:21,981
UEs, like they recognize this fact,
like memory is the limitation.

1009
00:48:22,371 --> 00:48:23,891
We're just going to put things in a race.

1010
00:48:23,891 --> 00:48:25,461
We're going to use like memory allocation.

1011
00:48:25,461 --> 00:48:27,801
We're going to be conscious about
memory and the web platform.

1012
00:48:27,811 --> 00:48:29,231
Like that's the second thing, right?

1013
00:48:29,241 --> 00:48:30,901
There's like, there's a blob of things.

1014
00:48:30,911 --> 00:48:34,211
There's a bag of stuff and you have
pointers and you have a huge graph.

1015
00:48:34,391 --> 00:48:37,901
And so I think this is like, why a lot
of those things are fast because they

1016
00:48:37,901 --> 00:48:39,641
have the mechanical sympathy, right?

1017
00:48:39,641 --> 00:48:42,981
They, they kind of realize that this
is kind of how computer works and here

1018
00:48:42,981 --> 00:48:47,491
are the constraints and weaknesses
and powers of how the actual computer

1019
00:48:47,501 --> 00:48:51,221
hardware works and, you know, things
like scheduling and virtual memory.

1020
00:48:51,586 --> 00:48:53,276
And we're going to use
that to our benefit, right?

1021
00:48:53,356 --> 00:48:56,146
And on the web platform, even if
you do have mechanical sympathy

1022
00:48:56,146 --> 00:48:58,606
and you do understand this, there's
nothing you can do about it.

1023
00:48:59,306 --> 00:49:01,876
Even in WebAssembly, you
don't, there's no stack, right?

1024
00:49:02,266 --> 00:49:04,246
I guess it's like this
implicit kind of stack machine.

1025
00:49:04,246 --> 00:49:09,206
And even at that level, you have some, you
have some very limited abilities to manage

1026
00:49:09,206 --> 00:49:13,086
that, you know, that very sort of low
level to squeeze the last performance out.

1027
00:49:13,096 --> 00:49:15,936
I think video games is like a,
an interesting like place to

1028
00:49:15,936 --> 00:49:18,941
look because they, They have a
very, very tight frame budget.

1029
00:49:18,981 --> 00:49:20,341
And that is like a holy thing.

1030
00:49:20,341 --> 00:49:21,271
You don't break that.

1031
00:49:21,731 --> 00:49:23,591
you might drop an entire frame.

1032
00:49:23,601 --> 00:49:24,591
You might drop objects.

1033
00:49:24,621 --> 00:49:26,991
So you might like just what
the modern games do today.

1034
00:49:26,991 --> 00:49:29,101
Instead of dropping frames,
they, they drop objects.

1035
00:49:29,131 --> 00:49:30,191
So they drop quality.

1036
00:49:30,271 --> 00:49:32,731
Maybe the textures like gets
a little fussier for a little

1037
00:49:32,731 --> 00:49:34,331
while just to make that happen.

1038
00:49:34,351 --> 00:49:37,641
And we're talking about, we're measuring
things in microseconds at this point.

1039
00:49:37,871 --> 00:49:40,511
And I think a lot of people who work
with web software, like even if they

1040
00:49:40,511 --> 00:49:44,241
wanted to, It would be kind of like,
uh, you know, an uphill battle.

1041
00:49:44,431 --> 00:49:46,481
So you measure things in milliseconds.

1042
00:49:46,481 --> 00:49:48,781
They're like, Oh, this is
takes only eight milliseconds.

1043
00:49:49,131 --> 00:49:50,401
And that's like eight milliseconds.

1044
00:49:50,451 --> 00:49:53,671
That's like an ocean of time for
someone working on a video game.

1045
00:49:53,681 --> 00:49:56,251
That's like, that's like
basically the entire game.

1046
00:49:56,611 --> 00:49:57,221
Like running.

1047
00:49:57,221 --> 00:49:59,001
It's, it's entire like thing.

1048
00:49:59,011 --> 00:49:59,931
It's like eight milliseconds.

1049
00:50:00,011 --> 00:50:00,221
Right?

1050
00:50:00,451 --> 00:50:00,811
Yeah.

1051
00:50:00,861 --> 00:50:02,261
in the web, we don't even have.

1052
00:50:02,461 --> 00:50:06,211
Uh, mechanisms to get more
fine-grained resolution than

1053
00:50:06,211 --> 00:50:10,561
milliseconds in, in most browsers,
like, I think for security reasons.

1054
00:50:10,561 --> 00:50:13,921
I think there, there was once,
but I think it's mostly been

1055
00:50:13,926 --> 00:50:15,541
removed in, in many browsers.

1056
00:50:16,141 --> 00:50:19,411
But it's a, it's a very interesting
parallel, what we've been talking

1057
00:50:19,416 --> 00:50:23,131
about in regards to getting the
best performance in the web.

1058
00:50:23,431 --> 00:50:27,651
You gotta abandon a little bit of the
primitives that the web gives you.

1059
00:50:28,176 --> 00:50:30,296
Punch through and go more lower level.

1060
00:50:30,576 --> 00:50:34,526
And it's a very interesting parallel
to what we've talked about earlier in

1061
00:50:34,526 --> 00:50:38,736
regards to the data models, whether you
use like a really powerful database and

1062
00:50:38,736 --> 00:50:40,436
then you start peeling off the layers.

1063
00:50:40,756 --> 00:50:45,446
It's basically the same story just for
a different, um, for, for a different

1064
00:50:45,456 --> 00:50:50,566
use case here, whether one is like
fast UIs and the other is fast data.

1065
00:50:50,796 --> 00:50:55,806
So you as someone who's so prolific
in building apps, building tools,

1066
00:50:56,176 --> 00:51:00,096
I'm curious whether there is any
apps or tools that you particularly

1067
00:51:00,126 --> 00:51:01,986
admire and love using today.

1068
00:51:02,506 --> 00:51:05,506
I think that there's quite a few,
but not as many as I would like.

1069
00:51:05,566 --> 00:51:09,346
One that comes to mind that I
started using recently, maybe three

1070
00:51:09,346 --> 00:51:11,206
years ago, it's called MimeStream.

1071
00:51:11,356 --> 00:51:12,896
It's by this indie developer.

1072
00:51:13,316 --> 00:51:14,176
It's a Mac app.

1073
00:51:14,376 --> 00:51:15,376
It's a native Mac app.

1074
00:51:15,376 --> 00:51:16,336
It's an email client.

1075
00:51:16,486 --> 00:51:18,516
And it's the first time
in a very long time.

1076
00:51:18,516 --> 00:51:20,656
I used an email client
that like I liked using.

1077
00:51:20,666 --> 00:51:25,090
I think mailbox on iOS was the last time
I used an email client that I liked.

1078
00:51:25,471 --> 00:51:28,741
Everything since then has been like
a bit of a disappointment for me.

1079
00:51:28,811 --> 00:51:30,111
So that's just like a piece of software.

1080
00:51:30,111 --> 00:51:34,781
I think in recent years I've been
sort of pleasantly surprised by.

1081
00:51:34,951 --> 00:51:36,861
Sublime text is like that.

1082
00:51:36,911 --> 00:51:39,471
That's usually the editor
that I use for, for writing.

1083
00:51:39,571 --> 00:51:41,831
And I'm kind of a person, I
have used a few tools and I

1084
00:51:41,831 --> 00:51:43,321
use them for, for everything.

1085
00:51:43,341 --> 00:51:47,201
So I have very few like programs that
I use and I tend to use each program.

1086
00:51:47,666 --> 00:51:51,706
For a lot of tasks, the sublime
text for me, it's like fantastic.

1087
00:51:51,726 --> 00:51:54,736
It, and iTerm is another one,
but it's very, very niche thing.

1088
00:51:54,736 --> 00:52:00,376
But, uh, sublime text kind of, uh,
text works the same on pretty much the

1089
00:52:00,376 --> 00:52:07,306
same on like Ubuntu, Linux, Windows,
Mac OS, but it like respects like the

1090
00:52:07,306 --> 00:52:10,206
lay of the land of these different
platforms, like shortcuts, like window

1091
00:52:10,206 --> 00:52:13,786
behavior, scrolling It's very, very fast.

1092
00:52:13,796 --> 00:52:17,056
Most operations, like you just
finished when you ask for them.

1093
00:52:17,701 --> 00:52:20,071
You know, there's no
sort of measurable delay.

1094
00:52:20,371 --> 00:52:23,871
One thing that I think is really neat
about sublime and this, this goes for

1095
00:52:23,871 --> 00:52:27,061
a few other apps, like, uh, I termed
that I mentioned or something really,

1096
00:52:27,061 --> 00:52:30,971
really cool as well in this vein is
like, uh, they, they care about state

1097
00:52:31,071 --> 00:52:32,811
sublime text care about state, right?

1098
00:52:32,811 --> 00:52:34,261
And I think there's a lot of apps today.

1099
00:52:34,261 --> 00:52:36,261
Even iOS apps, like don't do this anymore.

1100
00:52:36,601 --> 00:52:39,841
Meaning that if it is come on
cute, just quit sublime, right?

1101
00:52:39,841 --> 00:52:41,801
Let's say I got a bunch of windows open.

1102
00:52:41,831 --> 00:52:45,681
Each window has a bunch of tabs, different
text files, some of them not saved.

1103
00:52:46,176 --> 00:52:49,936
Some text selection scroll, we might
be talking about 100 files open, right?

1104
00:52:49,946 --> 00:52:53,256
Think about your web browser and tabs
and like scroll position text selection.

1105
00:52:53,566 --> 00:52:57,156
And I quit it and first off
quitting it takes like a 2nd, right?

1106
00:52:57,166 --> 00:52:59,956
It doesn't, I don't have to, like, if I
quit Chrome, I have to sit there and wait.

1107
00:53:00,066 --> 00:53:02,876
And then if that was a mistake and I
started again, what happens is that,

1108
00:53:02,876 --> 00:53:04,400
like, all the windows come back up.

1109
00:53:04,411 --> 00:53:08,091
Um, exactly the way the word, the
same Texas elected skull possession.

1110
00:53:08,861 --> 00:53:11,951
And this might seem like, Oh, that,
that doesn't seem so valuable.

1111
00:53:11,991 --> 00:53:17,261
But what it does is it makes
me not afraid of software.

1112
00:53:17,301 --> 00:53:19,011
It makes me not hoarding tabs.

1113
00:53:19,041 --> 00:53:21,141
It makes me like not think twice.

1114
00:53:21,171 --> 00:53:24,111
If I, when I'm going to reach for
sublime, because I know that the

1115
00:53:24,111 --> 00:53:25,921
cost is like basically zero, right?

1116
00:53:26,271 --> 00:53:27,871
If I like, Oh, I should write something.

1117
00:53:27,871 --> 00:53:28,831
I'm going to start sublime.

1118
00:53:28,871 --> 00:53:30,721
And I, and then I
realized, Oh, I shouldn't.

1119
00:53:30,791 --> 00:53:31,491
And I can just quit it.

1120
00:53:32,266 --> 00:53:33,886
Well, it was a lot of other software.

1121
00:53:33,886 --> 00:53:36,176
There's just like, we touched
on video games a couple of

1122
00:53:36,176 --> 00:53:37,306
times in this conversation too.

1123
00:53:37,306 --> 00:53:41,886
I think video games is this problem
too today where I have to like commit

1124
00:53:42,026 --> 00:53:43,886
to this big time chunk of investment.

1125
00:53:43,936 --> 00:53:46,756
If I want to use something, if I want
to switch tools, if I want to play

1126
00:53:46,756 --> 00:53:50,146
a game on the PlayStation, I need an
hour to like apply updates before I can

1127
00:53:50,146 --> 00:53:51,746
play it and then get through the menus.

1128
00:53:51,746 --> 00:53:52,736
It takes 10 minutes, right?

1129
00:53:52,736 --> 00:53:53,666
And then load the game.

1130
00:53:54,371 --> 00:53:57,691
And now play for, for 10
minutes and now, Oh, time is up.

1131
00:53:57,731 --> 00:53:58,081
Right.

1132
00:53:58,511 --> 00:54:01,271
Or like I opened some web app
and I have to wait like five

1133
00:54:01,311 --> 00:54:02,861
seconds for it to be functional.

1134
00:54:02,861 --> 00:54:04,451
And you know, there's this old cost.

1135
00:54:04,451 --> 00:54:06,271
And if I quit the tab now, right.

1136
00:54:06,281 --> 00:54:08,791
Baxin or whatever, I've
lost most of my state.

1137
00:54:08,881 --> 00:54:12,821
So I think that there's some good
software, but it's, uh, they used to

1138
00:54:12,831 --> 00:54:14,861
be more good software in my opinion.

1139
00:54:15,081 --> 00:54:17,371
I'm also like an old dude,
so you know what they say.

1140
00:54:17,371 --> 00:54:19,481
Everything invented after
you're 30 is just wrong.

1141
00:54:20,591 --> 00:54:24,051
So there's, there's some bias here, but
I think that there's, um, there used to

1142
00:54:24,051 --> 00:54:27,981
be a lot of software that would qualify
him in my book as being pretty good.

1143
00:54:28,031 --> 00:54:30,191
And there's not that much anymore.

1144
00:54:30,421 --> 00:54:30,971
How about you?

1145
00:54:31,021 --> 00:54:34,581
Do you have a, do you have an app
or, or service or something you

1146
00:54:34,581 --> 00:54:37,731
think it's, it's doing particularly
well on these, these accounts?

1147
00:54:37,851 --> 00:54:42,631
Well, so I definitely share your
perspectives and observations.

1148
00:54:42,661 --> 00:54:46,571
And I wanted to also ask, like, whether
it's just my feeling or whether that is

1149
00:54:46,571 --> 00:54:48,871
de facto, the case that they used to be.

1150
00:54:49,096 --> 00:54:53,846
More higher quality software in the past,
and that has sort of degraded over, over

1151
00:54:53,846 --> 00:54:59,446
time for in terms of like apps that I,
that are really like, uh, I can plus one

1152
00:54:59,446 --> 00:55:04,816
of the ones you've mentioned, I think,
uh, telegram as an app on, uh, macro

1153
00:55:04,816 --> 00:55:10,096
as an, an iOS is, is one that I, that I
like that just feels like very snappy.

1154
00:55:10,266 --> 00:55:14,976
But, uh, I agree like your observations
in terms of, uh, like preserving

1155
00:55:15,006 --> 00:55:18,696
state kind of like respecting
the, where a user left off.

1156
00:55:18,696 --> 00:55:21,446
And then when you come back,
that is still all there.

1157
00:55:21,446 --> 00:55:25,186
That gives me confidence and just
makes me less afraid of using it.

1158
00:55:25,216 --> 00:55:26,096
I definitely agree.

1159
00:55:26,526 --> 00:55:29,976
And then also, even if it does
remember everything, just making

1160
00:55:30,066 --> 00:55:34,226
things fast or keeping things fast,
that is another, another aspect

1161
00:55:34,236 --> 00:55:36,426
of just like respecting my time.

1162
00:55:36,436 --> 00:55:37,326
It's another.

1163
00:55:37,646 --> 00:55:41,516
Paper cuts when I'm using software
and it takes forever to load.

1164
00:55:41,876 --> 00:55:45,366
It just makes me, it's not like
that the software is broken, but

1165
00:55:45,386 --> 00:55:48,816
in a way, it like sucks out a
little bit of joy out of my day.

1166
00:55:49,326 --> 00:55:54,595
And this is also something where I'm
spending out of like the 95 to 5%.

1167
00:55:54,596 --> 00:55:59,296
This is where I'm spending probably
one of the five, uh, on, on Overtone.

1168
00:55:59,396 --> 00:56:03,921
And given that Overtone is targeting
the web, that is like you say, Very

1169
00:56:03,921 --> 00:56:08,231
much on hard mode and you got to poke
through a lot of layers on the web.

1170
00:56:08,311 --> 00:56:12,091
And I take more inspiration from
native development and app development

1171
00:56:12,421 --> 00:56:16,241
to try to get there, but it's really
hard, but I do think it's possible.

1172
00:56:16,241 --> 00:56:21,081
I think it is possible to get the best of
both worlds, at least like directionally

1173
00:56:21,091 --> 00:56:26,531
where you get the distribution of the web
and directionally closer to the to the

1174
00:56:26,541 --> 00:56:29,491
performance of like a, a native platform.

1175
00:56:29,591 --> 00:56:35,031
I'm curious why you think that is that,
uh, software in the past was maybe felt

1176
00:56:35,091 --> 00:56:37,261
higher quality, was higher quality.

1177
00:56:37,301 --> 00:56:38,581
Do you have a theory on that?

1178
00:56:38,901 --> 00:56:39,561
I do.

1179
00:56:39,671 --> 00:56:42,691
I think it's like as simple
as technological constraints.

1180
00:56:42,741 --> 00:56:46,226
Earlier in this book, In this episode,
we were talking about, or I was talking

1181
00:56:46,226 --> 00:56:51,166
about Spotify and sort of how they came
about in a time where a web browser,

1182
00:56:51,176 --> 00:56:53,446
like the web platform just wasn't a fit.

1183
00:56:53,746 --> 00:56:54,946
It just didn't have the features.

1184
00:56:54,976 --> 00:56:58,546
You couldn't just play audio randomly
or there were no web sockets and stuff.

1185
00:56:58,596 --> 00:56:59,616
I think a lot of like.

1186
00:56:59,896 --> 00:57:02,516
Software that we're talking about
that we say like, Oh, that was kind

1187
00:57:02,516 --> 00:57:07,216
of good, like an old version of
Outlook from Microsoft, or I know

1188
00:57:07,226 --> 00:57:09,026
like, uh, Microsoft Word these days.

1189
00:57:09,026 --> 00:57:10,886
It takes like 10 minutes
to start on my computers.

1190
00:57:10,916 --> 00:57:11,346
I don't know.

1191
00:57:11,556 --> 00:57:13,016
Not 10 minutes, but it takes a long time.

1192
00:57:13,106 --> 00:57:15,286
I mentioned to you in the past.

1193
00:57:15,286 --> 00:57:19,786
I have this, uh, Mac book,
a power book from 2002 and

1194
00:57:19,786 --> 00:57:21,626
it's a bit of a time capsule.

1195
00:57:21,786 --> 00:57:23,606
Uh, it still boots up just fine.

1196
00:57:23,636 --> 00:57:24,626
And it's like pretty fast.

1197
00:57:24,626 --> 00:57:26,676
And if I start certain
apps, they start right away.

1198
00:57:26,676 --> 00:57:31,056
And I'm like, This got a mechanical
hard drive that's like, I don't

1199
00:57:31,056 --> 00:57:33,926
know, 20, 20 something years old.

1200
00:57:33,996 --> 00:57:35,276
This shouldn't be this fast.

1201
00:57:35,276 --> 00:57:35,566
Right.

1202
00:57:36,026 --> 00:57:39,536
And I think it's that fast
because there's a human, almost

1203
00:57:39,576 --> 00:57:43,036
constant, like set of thresholds.

1204
00:57:43,106 --> 00:57:46,106
If we forget about computer for
a second, there's like, what is a

1205
00:57:46,156 --> 00:57:49,516
reasonable amount of time to wait for
something to be ready for me to use?

1206
00:57:50,316 --> 00:57:54,346
I think the answer is it
will be in relation to how

1207
00:57:54,346 --> 00:57:55,586
important it is to use that.

1208
00:57:55,656 --> 00:57:59,926
If I'm going to travel across the world
somewhere, I am okay with spending

1209
00:57:59,926 --> 00:58:04,766
four hours in like taxis and airport
security and stuff and getting on an

1210
00:58:04,776 --> 00:58:08,936
airplane before I get to the, into
the air, on the air, in an airplane.

1211
00:58:09,286 --> 00:58:12,796
Whereas if I'm just like going
to the grocery store, I would not

1212
00:58:12,796 --> 00:58:14,146
be okay with waiting four hours.

1213
00:58:14,501 --> 00:58:16,651
To like get on the bus to
get to the grocery store.

1214
00:58:16,751 --> 00:58:21,261
It's in proportion to like the threshold
or like the, where the amount of,

1215
00:58:21,281 --> 00:58:23,761
and the threshold is like, if I'm
going to say, yes, okay, I'm going

1216
00:58:23,761 --> 00:58:24,861
to do it, I'm going to wait for it.

1217
00:58:24,881 --> 00:58:27,091
Or like, no, I'm going to
find a different solution.

1218
00:58:27,101 --> 00:58:28,121
That's kind of the threshold.

1219
00:58:28,251 --> 00:58:29,931
It's in relationship
to how important it is.

1220
00:58:30,171 --> 00:58:32,881
And I think this is a human thing
and not something that's like,

1221
00:58:33,261 --> 00:58:35,621
Oh, that was the case in the
nineties, but now it's different.

1222
00:58:35,631 --> 00:58:37,911
Or like, Oh, that's has
to do with computers.

1223
00:58:38,081 --> 00:58:41,901
And so now let's say, yes, for the
sake of conversation, uh, opening an

1224
00:58:41,911 --> 00:58:43,981
app, my threshold is like two seconds.

1225
00:58:44,091 --> 00:58:47,511
If the app hasn't started in two
seconds, some app, whatever, Microsoft

1226
00:58:47,521 --> 00:58:51,541
Word, then I will probably just
go and find a different solution.

1227
00:58:51,551 --> 00:58:55,041
Maybe I'll use notepad and windows to text
that into macOS and I'm just going to be

1228
00:58:55,041 --> 00:58:56,521
fine with some features not being there.

1229
00:58:56,751 --> 00:59:00,551
I think that developers like have been
very conscious about this or found this

1230
00:59:00,551 --> 00:59:04,891
out through research or somehow like
know that like what this thing is, right?

1231
00:59:05,201 --> 00:59:05,551
Okay.

1232
00:59:05,581 --> 00:59:06,111
We need this.

1233
00:59:06,131 --> 00:59:08,251
We need Microsoft Word to
start within two seconds.

1234
00:59:08,351 --> 00:59:09,461
Let's make that happen, right?

1235
00:59:09,501 --> 00:59:11,441
Otherwise we're, we're not
going to get customers.

1236
00:59:11,681 --> 00:59:15,141
And then 20 years ago, you had to
go to some pretty great lengths

1237
00:59:15,281 --> 00:59:18,261
to make something start within
two seconds because you know, like

1238
00:59:18,261 --> 00:59:20,121
computers were a lot slower, right?

1239
00:59:20,131 --> 00:59:21,731
Hard drives are a lot slower and so on.

1240
00:59:21,851 --> 00:59:25,451
And today I think we have the same,
we have exactly the same like human.

1241
00:59:25,696 --> 00:59:30,296
Properties, but now we can boot up
like an OS, like I'm working on an OS.

1242
00:59:30,326 --> 00:59:33,486
We can boot our OS up in 250
milliseconds from scratch.

1243
00:59:33,831 --> 00:59:35,701
Like the kernel and
everything and drivers, right?

1244
00:59:35,761 --> 00:59:40,891
We can boot up like our OS 10
times over before like Word

1245
00:59:40,901 --> 00:59:43,121
even, even has started on my Mac.

1246
00:59:43,281 --> 00:59:47,341
And that, like the fact that
like our thing boots fast,

1247
00:59:47,371 --> 00:59:48,571
like that's kind of irrelevant.

1248
00:59:48,571 --> 00:59:52,681
It's more like a comparison that like you
can make something quite complex, like an

1249
00:59:52,681 --> 00:59:55,171
operating system, like do a lot of stuff.

1250
00:59:55,241 --> 00:59:55,561
Right.

1251
00:59:55,681 --> 00:59:57,711
And so what does Word
do when you start it up?

1252
00:59:57,741 --> 01:00:00,971
And it takes like, you know,
5, 10 seconds for it to start.

1253
01:00:01,551 --> 01:00:04,051
I don't know, but it must
be doing a lot of stuff.

1254
01:00:04,681 --> 01:00:06,941
And so I think that's what
keeps happening over time.

1255
01:00:07,121 --> 01:00:09,931
We just keep doing more and
more and more and we're doing

1256
01:00:09,931 --> 01:00:11,911
less and less like clever stuff.

1257
01:00:11,941 --> 01:00:14,191
And I think now wrapping all of this up.

1258
01:00:15,216 --> 01:00:20,136
I think there is a strong correlation
between what we do here and like,

1259
01:00:20,166 --> 01:00:23,736
the local-first, the purchase, the
local-first approach in a nutshell.

1260
01:00:23,736 --> 01:00:23,906
Right?

1261
01:00:23,926 --> 01:00:27,816
Again, it's kind of like, you make sure
that things like work when you're offline.

1262
01:00:27,966 --> 01:00:28,266
Right?

1263
01:00:28,786 --> 01:00:32,836
And you make sure that, like, if you, if
you lose that connection forever online,

1264
01:00:32,856 --> 01:00:34,526
you can still use something, right?

1265
01:00:34,526 --> 01:00:35,526
You're not totally lost.

1266
01:00:35,826 --> 01:00:39,496
To an extent, I think that goes hand in
hand with like making things like fast

1267
01:00:39,546 --> 01:00:41,906
within a certain realm of things, right?

1268
01:00:41,966 --> 01:00:46,566
Like if the first thing you have to do is
to like re index like all, and this could

1269
01:00:46,576 --> 01:00:50,246
be a problem for local-first as well, but
have to re index everything that exists.

1270
01:00:50,486 --> 01:00:51,746
That's just going to take a long time.

1271
01:00:51,876 --> 01:00:55,246
Every time Dropbox starts, it's gotta,
it doesn't know which like files

1272
01:00:55,286 --> 01:00:56,416
have changed on the computer, right?

1273
01:00:56,746 --> 01:00:59,371
So, if you have a 200.000
files, this guy has to go and

1274
01:00:59,371 --> 01:01:01,641
look at 200, 000 files, right?

1275
01:01:02,211 --> 01:01:05,711
And that's a challenge you might have
as a local-first thing and not as like a

1276
01:01:05,711 --> 01:01:08,981
centralized thing, but as a centralized
thing, you always have this problem.

1277
01:01:09,011 --> 01:01:10,791
You cannot get away from it.

1278
01:01:10,921 --> 01:01:11,181
Yeah.

1279
01:01:11,181 --> 01:01:16,781
I think you're, you're always paying sort
of like for the worst case by having,

1280
01:01:16,791 --> 01:01:21,061
by like threading everything through
typically through the network, et cetera.

1281
01:01:21,061 --> 01:01:22,881
You can't quite like.

1282
01:01:23,141 --> 01:01:27,171
Go off the happy path where everything
is like as close as, as possible.

1283
01:01:27,181 --> 01:01:31,731
It's basically an extension of what you've
described earlier with the memory, where

1284
01:01:31,731 --> 01:01:35,131
it's like, it's not, not, not just to
the neighbor's house, but it's literally

1285
01:01:35,131 --> 01:01:37,931
across the ocean to get that pencil often.

1286
01:01:38,411 --> 01:01:40,771
So I think there's a lot of similarities.

1287
01:01:41,231 --> 01:01:45,781
So we've been exploring a lot now, like
here, the data systems you've been working

1288
01:01:45,781 --> 01:01:50,131
on, uh, on, on previous companies, not
just data systems, but that's what we

1289
01:01:50,131 --> 01:01:56,371
focused on and talking more broadly about
the web, the benefits and challenges.

1290
01:01:56,841 --> 01:02:01,071
But you've mentioned a few times now that
you're working on an even more ambitious

1291
01:02:01,111 --> 01:02:03,311
thing, your own operating system.

1292
01:02:03,591 --> 01:02:06,251
So before digging more into that.

1293
01:02:06,251 --> 01:02:06,306
Yeah.

1294
01:02:06,496 --> 01:02:10,966
I'm very curious what led you to
going on this audacious journey of

1295
01:02:10,966 --> 01:02:12,736
building your own operating system.

1296
01:02:12,746 --> 01:02:17,536
I think some of it actually comes from
a lot of what we touched on today of

1297
01:02:17,536 --> 01:02:23,196
quality and software and the joy that
I can find that many of my friends can

1298
01:02:23,286 --> 01:02:24,986
can find or have been able to find.

1299
01:02:25,396 --> 01:02:30,606
In making software, I think it can be a
very like fulfilling and fun thing to do.

1300
01:02:30,836 --> 01:02:34,676
And the, I got to say the web platform,
I think over the, over the past 15

1301
01:02:34,676 --> 01:02:38,886
years, there's been such a relentless
focus on scale because it's been such

1302
01:02:38,886 --> 01:02:42,866
a focus for a huge economy that we have
made very conscious trade offs in terms

1303
01:02:42,866 --> 01:02:45,981
of like joy and ease and simplicity.

1304
01:02:46,141 --> 01:02:50,901
In favor of scale, like economic
scale, technical scale, you know,

1305
01:02:51,121 --> 01:02:54,711
the ability to have like a million
concurrent users on like a thing.

1306
01:02:54,831 --> 01:02:57,281
So today, if you want to like
make a fun, if you want to

1307
01:02:57,281 --> 01:02:58,511
make a home cooked meal, right.

1308
01:02:58,521 --> 01:03:02,041
If you want to build like a fun thing
for your friends or just for yourself.

1309
01:03:02,401 --> 01:03:05,191
I even tried making a homepage
with a guest book today.

1310
01:03:05,771 --> 01:03:09,431
And if you have, if you have like maybe
a weekend, you're going to spend that

1311
01:03:09,431 --> 01:03:12,291
entire weekend just like trying to
figure out which of the 200 different

1312
01:03:12,301 --> 01:03:15,661
AWS services do you need and like,
which databases, how do you set it up?

1313
01:03:15,731 --> 01:03:18,831
And like there are keys and there's
so many layers of virtualization that

1314
01:03:18,831 --> 01:03:21,861
is compatibility and there's this
and that and different dev tools.

1315
01:03:21,861 --> 01:03:25,741
And, and all of this, I'm not saying
this stuff exists because like.

1316
01:03:25,806 --> 01:03:27,226
People are dumb or anything like that.

1317
01:03:27,236 --> 01:03:29,706
This stuff exists for very good reasons.

1318
01:03:29,706 --> 01:03:29,946
Right.

1319
01:03:29,976 --> 01:03:33,046
And these are reasons for like, you
know, scale, like big companies,

1320
01:03:33,046 --> 01:03:34,876
basically like big things.

1321
01:03:34,956 --> 01:03:38,746
And I felt like, you know, the time
when you can just like either just

1322
01:03:38,746 --> 01:03:41,906
make a native Mac app, for example,
in Cocoa, or like make a kind of a

1323
01:03:41,906 --> 01:03:45,526
guest book with a CGI bin script,
like a Pearl script on an FTP server,

1324
01:03:45,786 --> 01:03:47,336
like there was some joy to that.

1325
01:03:47,466 --> 01:03:47,746
Sure.

1326
01:03:47,766 --> 01:03:51,166
It wasn't a secure and safe and sure
it wouldn't scale as well, but it

1327
01:03:51,166 --> 01:03:54,236
was for a different, like recent
and different audience and so.

1328
01:03:54,646 --> 01:03:58,716
Three, three and a half years ago,
I started really thinking hard about

1329
01:03:58,716 --> 01:04:01,716
these things, or four years ago, I
started, started really thinking deeply

1330
01:04:01,716 --> 01:04:04,756
about these things and feeling that
it's something I care a lot about.

1331
01:04:04,856 --> 01:04:09,196
And around the time I learned that
Apple were thinking about getting rid of

1332
01:04:09,196 --> 01:04:13,316
Mac OS, at least Mac OS as we know it,
which I think has been a very important

1333
01:04:13,416 --> 01:04:16,206
player in the having fun making apps.

1334
01:04:16,336 --> 01:04:18,716
I don't know if you ever
wrote a Cocoa app, sort of its

1335
01:04:18,806 --> 01:04:21,986
heydays, like 2010, 2009 or so.

1336
01:04:22,396 --> 01:04:25,816
But it was just like a, a, a really
like joyful way of doing things.

1337
01:04:25,826 --> 01:04:28,496
You earlier, you mentioned
you need a table view, like

1338
01:04:28,496 --> 01:04:29,866
in Cocoa, there was a table.

1339
01:04:29,976 --> 01:04:32,396
There was not three different
ways of making a table.

1340
01:04:32,396 --> 01:04:33,726
You, there was exactly one way.

1341
01:04:34,016 --> 01:04:37,286
And that was really
performant, very flexible.

1342
01:04:37,546 --> 01:04:39,046
It did usually what you wanted to do.

1343
01:04:39,056 --> 01:04:40,026
Everyone used that.

1344
01:04:40,666 --> 01:04:44,396
There were a lot of really quality
cocoa apps, like their companies,

1345
01:04:44,396 --> 01:04:47,736
like panic that still exists today
and still make great software.

1346
01:04:47,866 --> 01:04:49,886
But there used to be a lot
more like companies like that

1347
01:04:49,926 --> 01:04:51,806
that did really cool software.

1348
01:04:51,856 --> 01:04:52,096
Yeah.

1349
01:04:52,096 --> 01:04:57,186
Like sofa, like the, some of the people at
sofa now, you know, are working on framer.

1350
01:04:57,456 --> 01:04:59,136
Who made some incredible backups.

1351
01:04:59,136 --> 01:05:00,756
There were Cocoa apps
and they all felt good.

1352
01:05:00,866 --> 01:05:03,796
And so at the time I was like, I
thought, I thought a lot about this.

1353
01:05:03,796 --> 01:05:08,046
And then I decided to leave Figma where
I worked at the time and go and, and try

1354
01:05:08,046 --> 01:05:11,876
to do a little bit of research, trying
to figure out like, what, what, what's

1355
01:05:11,876 --> 01:05:13,636
going to happen five, 10 years from now?

1356
01:05:13,636 --> 01:05:14,886
Like, are things better?

1357
01:05:14,916 --> 01:05:15,786
Where are things moving?

1358
01:05:15,796 --> 01:05:16,646
Where are things going?

1359
01:05:16,796 --> 01:05:20,476
And, uh, and that's, I think when
I saw sort of like a couple of

1360
01:05:20,476 --> 01:05:23,896
possible futures, uh, and one of
them I got kind of excited about.

1361
01:05:24,131 --> 01:05:28,551
Yeah, and I think that shows
already in the name for, for your

1362
01:05:28,561 --> 01:05:30,671
project and undertaking playbet.

1363
01:05:30,861 --> 01:05:36,971
I think there's a, there's a, um, a
person on Twitter called Anselm, who I

1364
01:05:36,981 --> 01:05:43,626
think in his bio has like, uh, Something
along the lines of like, uh, work

1365
01:05:43,806 --> 01:05:48,206
doesn't work play works, or I think
something along those lines, but that

1366
01:05:48,206 --> 01:05:53,016
really resonates with me where, like, if
something feels like work, I don't like

1367
01:05:53,016 --> 01:05:55,886
it, but if something feels like playing.

1368
01:05:56,256 --> 01:06:01,956
Then this is where it can be most
productive and I can do my, my hardest,

1369
01:06:01,976 --> 01:06:05,306
what other people would describe as
work for me, it's not work for me.

1370
01:06:05,316 --> 01:06:07,086
It's just joy and playing.

1371
01:06:07,446 --> 01:06:12,836
So your focus with the name already,
Playbit, really resonates with me.

1372
01:06:13,136 --> 01:06:17,046
And also just how you framed is
like software that feels good.

1373
01:06:17,456 --> 01:06:20,336
I think that's something
that I'm really striving for.

1374
01:06:20,681 --> 01:06:23,661
And that's rather the
exception than the rule today.

1375
01:06:24,031 --> 01:06:28,571
And I think building a foundation
where that is just the default software

1376
01:06:28,571 --> 01:06:30,541
that feels good, feels amazing.

1377
01:06:30,621 --> 01:06:34,061
So I would love to learn
more about Playbit.

1378
01:06:34,091 --> 01:06:36,261
What is Playbit and what
is your vision for it?

1379
01:06:36,591 --> 01:06:40,061
So Playbit, imagine that you
have that kind of app kit you

1380
01:06:40,061 --> 01:06:41,161
were talking about before.

1381
01:06:41,446 --> 01:06:41,686
Right?

1382
01:06:41,846 --> 01:06:47,766
So you write a program and that
developer experience is pretty

1383
01:06:47,906 --> 01:06:51,676
similar to what you have today, but
you know, it's, it's vastly simpler.

1384
01:06:51,736 --> 01:06:56,326
And every time you hit build and run,
imagine if you use Xcoder or Visual

1385
01:06:56,326 --> 01:07:00,026
Studio or something like that, you kind
of have, you can change a line of code.

1386
01:07:00,026 --> 01:07:02,156
You can hit command R
or something like that.

1387
01:07:02,156 --> 01:07:05,626
And you try your app out and you,
that's kind of how you iterate.

1388
01:07:05,756 --> 01:07:09,176
Every time you do that, you also
have a web version of that app.

1389
01:07:10,066 --> 01:07:10,716
It's kind of a Figma.

1390
01:07:11,386 --> 01:07:12,036
Grade.

1391
01:07:12,521 --> 01:07:13,951
Type of web app, right?

1392
01:07:13,951 --> 01:07:16,201
So, and so Playbit is an operating system.

1393
01:07:16,401 --> 01:07:20,551
And I think, uh, two big challenges
with trying to build something like an

1394
01:07:20,551 --> 01:07:26,201
operating system or platform is one,
you're asking people to go to some like

1395
01:07:26,201 --> 01:07:29,641
foreign planet and asking people to
go to a foreign planet is always going

1396
01:07:29,641 --> 01:07:33,351
to be, uh, you're going to have a huge
drop off rate where like, it's just

1397
01:07:33,351 --> 01:07:34,701
like a very fundamental human thing.

1398
01:07:34,711 --> 01:07:36,771
The things that we're, they're familiar.

1399
01:07:36,801 --> 01:07:37,241
We're.

1400
01:07:37,266 --> 01:07:40,186
Much more prone to
approaching things unfamiliar.

1401
01:07:40,186 --> 01:07:41,826
We're kind of naturally afraid of them.

1402
01:07:42,196 --> 01:07:45,416
Uh, so we survived the
bears and tigers and stuff.

1403
01:07:45,426 --> 01:07:45,696
Right.

1404
01:07:45,726 --> 01:07:47,236
So that's what, that's
one problem you have.

1405
01:07:47,236 --> 01:07:49,726
And now the problem is like a
chicken or the egg or kind of

1406
01:07:49,726 --> 01:07:51,346
a bootstrapping problem, right?

1407
01:07:51,346 --> 01:07:52,966
If you're to say, well.

1408
01:07:53,301 --> 01:07:56,751
Let's get some people like on this
platform who like build programs for it.

1409
01:07:57,181 --> 01:07:59,801
Who are they building those
programs for themselves?

1410
01:07:59,801 --> 01:08:00,081
Right?

1411
01:08:00,241 --> 01:08:01,241
How fun is that?

1412
01:08:01,521 --> 01:08:04,551
In some scenarios, the answer
has got to be, Oh, that's fine.

1413
01:08:04,571 --> 01:08:07,891
Because like, maybe I'm building up
some tools for myself or for my friends

1414
01:08:07,891 --> 01:08:11,091
who are also on this platform, but
I think this is also a huge hurdle.

1415
01:08:11,271 --> 01:08:12,181
And so the first one.

1416
01:08:13,011 --> 01:08:15,871
I think it's really, it's really hard
to do something about if you make it too

1417
01:08:15,871 --> 01:08:18,791
familiar, then why even bother making it?

1418
01:08:18,911 --> 01:08:19,221
Right.

1419
01:08:19,261 --> 01:08:21,971
If it's just like something that
exists, like why even put the effort in?

1420
01:08:22,471 --> 01:08:26,381
If it's too strange, like, I don't know
if anyone listening here used Google

1421
01:08:26,381 --> 01:08:28,981
wave back in 2009 or whatever it was.

1422
01:08:29,491 --> 01:08:31,251
I think that was like, it was too novel.

1423
01:08:31,321 --> 01:08:33,571
It was a great idea, but it
was just like too strange.

1424
01:08:34,051 --> 01:08:37,061
You know, you got to hit the sweet
spot there of being like novel enough.

1425
01:08:37,061 --> 01:08:40,701
So that it matters that it exists,
but still have some familiarity.

1426
01:08:40,701 --> 01:08:42,631
So it's not totally like scary to try.

1427
01:08:43,536 --> 01:08:47,646
The other part I think is
kind of important and fixable.

1428
01:08:47,716 --> 01:08:50,996
So again, kind of what I was talking
about with Playbit, you make this app

1429
01:08:51,046 --> 01:08:54,996
and we just kind of cross compile it
like, you know, the compilers is capable

1430
01:08:55,026 --> 01:08:58,006
of compiling to native code, right?

1431
01:08:58,006 --> 01:09:01,456
x86 or x64 and just like
in an ELF executable.

1432
01:09:01,456 --> 01:09:02,676
I think you're kind of macOS.

1433
01:09:02,726 --> 01:09:03,536
app thing.

1434
01:09:03,536 --> 01:09:06,456
You just run it and you just zip it up and
send it to a friend or whatever you want.

1435
01:09:07,086 --> 01:09:10,646
And then the other thing you get is
a, is a folder with like an index

1436
01:09:10,646 --> 01:09:14,086
that HTML file that just contains
like a web assembly version of this.

1437
01:09:14,366 --> 01:09:19,356
So our GPU API or like our
graphics API is web GPU.

1438
01:09:19,696 --> 01:09:23,326
So you can do full compute, you can build
some AI and train ML models and stuff on

1439
01:09:23,326 --> 01:09:26,946
this, you know, it's like you can really
use the GPU through this, which is not

1440
01:09:26,946 --> 01:09:30,646
possible through WebGL, but there's no
other levels, like, although we're using

1441
01:09:30,646 --> 01:09:34,956
the Linux kernel, it's kind of private
as much Linux as Android is Linux.

1442
01:09:35,161 --> 01:09:38,681
So not a lot of it is Linux,
but we do use the Linux kernel.

1443
01:09:39,201 --> 01:09:44,881
And so you could say, well, I can just use
something like Vulkan to instruct my GPU.

1444
01:09:45,291 --> 01:09:49,951
And that's a possibility, but like in
the ethos of some of what you and I have

1445
01:09:49,951 --> 01:09:54,591
been talking about before in Playbay, we
want to like reduce the number of choices

1446
01:09:54,591 --> 01:09:56,611
that you have to make, and we want to be.

1447
01:09:56,741 --> 01:10:00,531
We want to be very careful about
like what we sort of introduce

1448
01:10:00,961 --> 01:10:03,381
as like a choice or like a path.

1449
01:10:03,501 --> 01:10:05,901
And so we're starting with the
only way you can draw things to

1450
01:10:05,901 --> 01:10:08,251
the screen is through web GPU.

1451
01:10:08,431 --> 01:10:08,871
That's it.

1452
01:10:08,971 --> 01:10:12,111
And so of course you got a full file
system access and all that kind of stuff.

1453
01:10:12,111 --> 01:10:15,411
And when you're running something on
the web, like we have a translation

1454
01:10:15,421 --> 01:10:18,491
layer, essentially something that, you
know, it doesn't emulate a Linux kernel.

1455
01:10:18,491 --> 01:10:21,341
You don't have the full feature of,
uh, of like a Linux kernel on the

1456
01:10:21,341 --> 01:10:22,731
web, because that would be too slow.

1457
01:10:23,041 --> 01:10:25,351
Instead we have sort
of like a system layer.

1458
01:10:25,866 --> 01:10:30,056
System call, like layer that emulates that
and translate that to the web platform.

1459
01:10:30,506 --> 01:10:33,106
And certain things are just
not possible on the web, right?

1460
01:10:33,116 --> 01:10:35,416
So there's gotta be some
sort of like limitations.

1461
01:10:35,466 --> 01:10:41,386
So is my understanding correct that
you've drawn the, uh, analogy to Figma

1462
01:10:41,386 --> 01:10:47,556
where me and many others, um, I'm
sure like first tried out Figma in the

1463
01:10:47,556 --> 01:10:52,146
browser were blown away from it, but,
uh, by, by, but they would have never,

1464
01:10:52,461 --> 01:10:56,281
really bothered to install it in the
first place, unless there was a really

1465
01:10:56,281 --> 01:11:01,931
good reason, but the web brought down
the barrier to entry by so much that

1466
01:11:01,931 --> 01:11:03,441
this is where you fall in love with it.

1467
01:11:03,901 --> 01:11:08,201
And then when you use it more
regularly, you install it actually

1468
01:11:08,241 --> 01:11:09,941
on your, on your real machine.

1469
01:11:10,221 --> 01:11:11,631
So is there like a similar.

1470
01:11:11,911 --> 01:11:16,101
two step process there to Playbit
that maybe the first time you interact

1471
01:11:16,101 --> 01:11:20,851
with some Playbit apps is in the
browser, but then the next big step of

1472
01:11:20,851 --> 01:11:26,241
commitment is not just downloading a
desktop app, but, uh, actually like,

1473
01:11:26,481 --> 01:11:28,561
uh, flashing it on to your computer.

1474
01:11:28,591 --> 01:11:30,691
Is that sort of like the two steps?

1475
01:11:31,001 --> 01:11:31,871
Not quite.

1476
01:11:31,971 --> 01:11:35,061
I think we're a little bit more
pragmatic or I believe we are at least.

1477
01:11:35,656 --> 01:11:39,766
So Playbit does, you know, I can boot
it on hardware, but that's not our goal.

1478
01:11:39,766 --> 01:11:44,276
In five years, yes, you can just like
put it on hardware, boot it on hardware.

1479
01:11:44,496 --> 01:11:49,856
We're maybe a month or so away from
starting to, um, starting to open up for

1480
01:11:49,856 --> 01:11:51,766
like an early preview access to Playbit.

1481
01:11:51,826 --> 01:11:54,816
And the way that works is we
have a Mac app and a Windows app.

1482
01:11:55,636 --> 01:11:58,516
Um, then you just like download
and run like a video game and

1483
01:11:58,516 --> 01:11:59,666
the user runs full screen.

1484
01:11:59,936 --> 01:12:02,516
And it contains like a
virtualization environment.

1485
01:12:03,051 --> 01:12:06,211
And so you basically a startup and it's
just play a bit and you can use it as

1486
01:12:06,211 --> 01:12:09,711
like, you know, on your current computer,
we're not asking you to like, get a second

1487
01:12:09,721 --> 01:12:11,521
hard drive and do installations and stuff.

1488
01:12:11,521 --> 01:12:13,271
None of that who wants to do that.

1489
01:12:13,341 --> 01:12:15,351
And so one way of
thinking about it is like.

1490
01:12:16,676 --> 01:12:20,196
Another one, another way of thinking
about it is like, uh, uh, a developer

1491
01:12:20,196 --> 01:12:24,426
tool or like an authoring environment,
or even something like a fantasy console,

1492
01:12:24,426 --> 01:12:25,706
like peak weight or something like that.

1493
01:12:25,716 --> 01:12:31,126
Although Playbit is more, you know, as,
as, as very different like aims and the.

1494
01:12:31,446 --> 01:12:34,606
Yeah, and the applications that you
build, let's say you make like, I

1495
01:12:34,606 --> 01:12:35,906
don't know, a guest book, right?

1496
01:12:36,076 --> 01:12:36,836
Or something like that.

1497
01:12:37,226 --> 01:12:38,406
Like how, how does that work?

1498
01:12:38,416 --> 01:12:38,796
Sure.

1499
01:12:38,796 --> 01:12:41,646
We can make a GUI kit and that's fine.

1500
01:12:41,716 --> 01:12:44,566
It's a lot of work, but that's
just one piece of the puzzle.

1501
01:12:44,656 --> 01:12:46,366
Like where are your
messages stored, right?

1502
01:12:46,366 --> 01:12:47,586
How do you authenticate people?

1503
01:12:47,596 --> 01:12:48,666
Like all this kind of stuff.

1504
01:12:48,686 --> 01:12:49,806
And that's also part of playbits.

1505
01:12:49,956 --> 01:12:54,366
And so the whole operating system is
like local-first from the foundation.

1506
01:12:54,596 --> 01:12:59,046
Early on, we explored, could we do
like the thin terminal play, right?

1507
01:12:59,046 --> 01:13:00,566
Of like, we have a server somewhere.

1508
01:13:01,016 --> 01:13:04,206
That server actually runs the
computer, we send a video signal

1509
01:13:04,206 --> 01:13:06,306
over, it turns out that doesn't work.

1510
01:13:06,306 --> 01:13:08,556
I mean, there's like two aspects of it.

1511
01:13:08,576 --> 01:13:11,856
We can talk more about it if you're
curious, but the speed of light

1512
01:13:11,876 --> 01:13:13,686
is like pretty slow actually.

1513
01:13:13,846 --> 01:13:19,496
And the human cognitive center has like
a limited, has some interesting features.

1514
01:13:19,931 --> 01:13:23,031
If you do this with like a, a video
game pad, and if you use something like

1515
01:13:23,031 --> 01:13:26,731
PlayStation, the latency is actually quite
high, even if the PlayStation is right in

1516
01:13:26,731 --> 01:13:29,141
front of you, like 100, 200 milliseconds.

1517
01:13:29,141 --> 01:13:32,371
And that's fine because like, we have
this, you know, we have this kind

1518
01:13:32,371 --> 01:13:36,111
of coalescing, like Nagel algorithm,
like thing in our brains that can,

1519
01:13:36,121 --> 01:13:39,141
you know, synchronize audio visual
input and other sensory stuff.

1520
01:13:39,296 --> 01:13:39,536
Right.

1521
01:13:39,896 --> 01:13:41,826
To make that feel like it
happened at the same time.

1522
01:13:41,826 --> 01:13:43,946
Although it didn't like
someone clapping their hands.

1523
01:13:43,996 --> 01:13:47,666
Like we, we see the clap at the same
time we hear it, but obviously we'll

1524
01:13:48,126 --> 01:13:49,496
technically we see it beforehand.

1525
01:13:49,556 --> 01:13:52,926
And so that ends up just like not
working out the thin terminal thing.

1526
01:13:52,996 --> 01:13:55,756
And so, yeah, so Playbit
works when you're offline.

1527
01:13:56,156 --> 01:14:00,216
And one of like the things that we
really believe in is the software

1528
01:14:00,216 --> 01:14:01,826
should live for, for a long time.

1529
01:14:02,356 --> 01:14:04,726
So it's kind of an
archivist mindset in a way.

1530
01:14:05,026 --> 01:14:06,426
And this is like a secondary thing.

1531
01:14:06,436 --> 01:14:08,966
And, and some features
won't like work this way.

1532
01:14:08,966 --> 01:14:09,036
Yeah.

1533
01:14:09,396 --> 01:14:13,196
But we say you should be 50 years from
now, Playbit might not exist anymore.

1534
01:14:13,526 --> 01:14:14,756
Maybe it's not developed anymore.

1535
01:14:14,756 --> 01:14:15,926
There are no servers online.

1536
01:14:16,076 --> 01:14:19,526
You should still be able to
like boot up Playbit and do

1537
01:14:19,526 --> 01:14:20,676
something and get to your stuff.

1538
01:14:20,706 --> 01:14:23,666
If it's to like migrate it out
of there, or if it's because you

1539
01:14:23,666 --> 01:14:26,431
want to continue using it, you
That should always be possible.

1540
01:14:26,621 --> 01:14:29,931
So those are 2 of the 2 of the main
drivers of why it's local-first.

1541
01:14:30,121 --> 01:14:33,561
And then the other part, when it comes to
data is that it's also fully multiplayer.

1542
01:14:33,601 --> 01:14:36,911
So play with computer is this sort
of like, it's essentially a virtual

1543
01:14:36,911 --> 01:14:39,051
machine that transcends your hardware.

1544
01:14:39,231 --> 01:14:41,661
And so it's because it's
local-first we can synchronize it

1545
01:14:41,661 --> 01:14:42,861
across all the hardware, right?

1546
01:14:42,891 --> 01:14:45,521
And we can back it up on a
central computer somewhere.

1547
01:14:45,766 --> 01:14:49,096
This is one of the things that wouldn't be
available in, you know, a thousand years.

1548
01:14:49,176 --> 01:14:52,516
And that means like, if you know,
if you lose your laptop, maybe

1549
01:14:52,516 --> 01:14:55,006
you drop it in the sea or someone
steals it or something like that.

1550
01:14:55,006 --> 01:14:57,346
And you go and buy a new laptop
and you sign into Playbit.

1551
01:14:57,626 --> 01:14:58,576
Everything is back there.

1552
01:14:58,776 --> 01:15:01,676
Like the window position, text
selection that we talked about, like

1553
01:15:01,686 --> 01:15:03,326
Sublime I was speaking about before.

1554
01:15:03,386 --> 01:15:06,266
And that also means that you can,
you can have many of these computers.

1555
01:15:06,306 --> 01:15:08,096
And so we have this concept of workspaces.

1556
01:15:08,156 --> 01:15:09,586
They're basically virtual machines.

1557
01:15:09,986 --> 01:15:13,246
And one of these computers you can share
with your friends or with other people.

1558
01:15:13,246 --> 01:15:13,306
Yeah.

1559
01:15:13,486 --> 01:15:16,726
And then you have essentially like
imagine Figma multiplayer, but like on

1560
01:15:16,726 --> 01:15:20,056
the operating system level and these
facilities like this data syncing

1561
01:15:20,056 --> 01:15:25,336
facilities and stuff is available
to, you know, as a first party API,

1562
01:15:25,406 --> 01:15:27,516
like for like application developers.

1563
01:15:27,696 --> 01:15:30,216
So you write your guest book,
as I was talking about before.

1564
01:15:30,376 --> 01:15:34,826
Then you just put messages in there
and authentication will be, you

1565
01:15:34,826 --> 01:15:38,256
know, maybe that's a problem that you
have to solve, but everything else,

1566
01:15:38,256 --> 01:15:42,066
data storage is you just get that
for free and it's just local-first.

1567
01:15:42,666 --> 01:15:46,176
And if Playbit is gone or the servers
don't work, like your guestbook

1568
01:15:46,196 --> 01:15:47,306
will still work on your app.

1569
01:15:47,366 --> 01:15:49,936
Like, so it's not sort of
bound to Playbit itself.

1570
01:15:50,166 --> 01:15:51,246
That is incredible.

1571
01:15:51,266 --> 01:15:57,766
I mean, I can't imagine a more audacious
path forward and a foundation to build,

1572
01:15:57,836 --> 01:16:02,206
but, uh, the way how you've described
it, uh, makes, uh, makes perfect sense.

1573
01:16:02,206 --> 01:16:08,156
you still get the benefits of the,
the web in terms of distribution, but

1574
01:16:08,156 --> 01:16:12,536
you're leveraging the most powerful
way of building web apps right now.

1575
01:16:12,926 --> 01:16:18,206
By leveraging web GPU, et cetera, taking
care of all the data in a local-first

1576
01:16:18,226 --> 01:16:23,376
way and unlocking even more power by
letting you use the, like the virtual

1577
01:16:23,376 --> 01:16:28,406
operating system there as a full blown
native app on your given operating

1578
01:16:28,406 --> 01:16:32,206
system, hosting operating system at
some point, like real operating system.

1579
01:16:32,206 --> 01:16:36,056
I love that progression and
it already unlocks from, from

1580
01:16:36,056 --> 01:16:37,646
day one, a lot of utility.

1581
01:16:38,126 --> 01:16:42,886
So I can't wait to see what a
Playbit app will, will feel like.

1582
01:16:43,386 --> 01:16:46,996
I'm also curious what it will
both in terms of feel like

1583
01:16:46,996 --> 01:16:49,236
to use, but also to write.

1584
01:16:49,456 --> 01:16:54,236
Can you share a little bit more about,
uh, the local-first aspects of what it

1585
01:16:54,236 --> 01:16:57,266
means to build a local-first Playbit app?

1586
01:16:57,376 --> 01:17:01,546
Yeah, we have, we have these
like three types of data.

1587
01:17:01,626 --> 01:17:05,651
This is kind of in the conversation about
like what, What information is there?

1588
01:17:05,681 --> 01:17:07,641
How do you like categorize information?

1589
01:17:07,771 --> 01:17:10,591
What guarantees and sort of
like attributes does this

1590
01:17:10,621 --> 01:17:11,601
different information have?

1591
01:17:11,601 --> 01:17:11,851
Right.

1592
01:17:11,911 --> 01:17:13,531
So you have something
like an email client.

1593
01:17:13,691 --> 01:17:16,781
Let's say we have like what
email is currently being viewed.

1594
01:17:16,871 --> 01:17:18,061
What text is selected?

1595
01:17:18,201 --> 01:17:19,571
That's one type of information.

1596
01:17:19,681 --> 01:17:21,191
Another type of information is like.

1597
01:17:21,486 --> 01:17:23,846
What is in the email, what is
written in the email, right?

1598
01:17:23,846 --> 01:17:26,216
Who sent it, which time was it sent?

1599
01:17:26,356 --> 01:17:30,186
And, uh, there's, there's other kinds
of data too, but sort of like thinking

1600
01:17:30,226 --> 01:17:33,346
in this way, right now we can add
a third type of data, sort of like

1601
01:17:33,346 --> 01:17:36,366
a very ephemeral, like imagine that
there's a friend in there, so there's

1602
01:17:36,376 --> 01:17:39,876
a second cursor on the screen, like
where the cursor is, who that is, like

1603
01:17:39,876 --> 01:17:41,136
that, that's another piece of data.

1604
01:17:41,646 --> 01:17:44,946
I think these like have different,
you have different expectations about.

1605
01:17:45,231 --> 01:17:49,011
Where it is the synchronized hot,
like what reliability of this is, what

1606
01:17:49,011 --> 01:17:53,961
the latency of this data is roughly
speaking, like what's in the email,

1607
01:17:54,081 --> 01:17:58,001
what'd you expect there to be correct,
but it can take a while to load.

1608
01:17:58,291 --> 01:18:01,261
I'm exaggerating here now, obviously
everything should be correct

1609
01:18:01,261 --> 01:18:06,041
and be fast, but you gotta make
trade offs the cursor, right?

1610
01:18:06,311 --> 01:18:10,381
It's sometimes you can drop a frame, so
to speak, and it's not that important.

1611
01:18:10,381 --> 01:18:10,711
Right?

1612
01:18:10,711 --> 01:18:12,071
Like you can lose this information.

1613
01:18:12,081 --> 01:18:13,071
You don't have to cache it.

1614
01:18:13,421 --> 01:18:16,881
The information about like what's
selected and like scroll positions

1615
01:18:16,881 --> 01:18:21,371
and stuff like that is, is things that
can have lower integrity than sort

1616
01:18:21,371 --> 01:18:22,991
of like what's in the email, right?

1617
01:18:23,251 --> 01:18:26,061
And that information might, you
might not want to share with others.

1618
01:18:26,356 --> 01:18:26,606
Right.

1619
01:18:26,606 --> 01:18:28,576
Like what's, what texts
do I have selected?

1620
01:18:28,846 --> 01:18:30,566
Maybe that's something that
shared in a different way.

1621
01:18:30,616 --> 01:18:30,916
Right.

1622
01:18:31,166 --> 01:18:33,186
Let's say you have two people
looking at the same email.

1623
01:18:33,256 --> 01:18:36,656
Then if you shared the tick selection,
like what does that even mean?

1624
01:18:36,706 --> 01:18:36,916
Right.

1625
01:18:36,936 --> 01:18:39,436
If I want to select something, I
would change your tech selection.

1626
01:18:39,436 --> 01:18:40,346
That's kind of like weird.

1627
01:18:40,346 --> 01:18:41,676
So you've got to treat that differently.

1628
01:18:41,736 --> 01:18:43,606
So there are, there are
different categories of data.

1629
01:18:43,626 --> 01:18:44,236
One thing.

1630
01:18:44,346 --> 01:18:47,746
So more concretely to your question,
it's like when you write a Playbit app,

1631
01:18:47,876 --> 01:18:51,216
there is some of this information that's
just handles for you automatically.

1632
01:18:51,476 --> 01:18:55,146
So things like the sort of scroll
position and stuff like that.

1633
01:18:56,111 --> 01:18:59,761
All handles for you automatically,
you can override any of that.

1634
01:18:59,761 --> 01:19:03,481
And if you wanted to manage your own
scope position, of course you could, then

1635
01:19:03,481 --> 01:19:07,341
there's an API and we call this like game
state because you know, often we talk

1636
01:19:07,351 --> 01:19:10,551
about, and we look at video games, because
I think there's a lot more to learn there

1637
01:19:10,861 --> 01:19:13,581
than, uh, comparatively to utility apps.

1638
01:19:13,901 --> 01:19:16,891
So game state is essentially like
the state that the program has

1639
01:19:17,011 --> 01:19:18,181
that's unique to the program.

1640
01:19:18,886 --> 01:19:22,496
And earlier in this episode, we talked
a little bit about like, uh, like almost

1641
01:19:22,526 --> 01:19:27,376
impotence mismatch or a match between sort
of like the, the fifth of your problem

1642
01:19:27,376 --> 01:19:28,826
and the database and stuff like that.

1643
01:19:28,896 --> 01:19:31,776
And so you have a similar problem
here that, like, we, we could just

1644
01:19:31,786 --> 01:19:35,086
give you, like, I just like put
things in a SQLite database and

1645
01:19:35,086 --> 01:19:36,296
they will automatically just like.

1646
01:19:36,441 --> 01:19:37,601
Be synchronized, right?

1647
01:19:37,671 --> 01:19:39,461
The problem is like, that's not possible.

1648
01:19:39,491 --> 01:19:42,431
That is not, not possible because
like it's hard technologically.

1649
01:19:42,461 --> 01:19:45,751
That's just impossible because
like a real life human level.

1650
01:19:45,751 --> 01:19:46,741
It's not possible, right?

1651
01:19:46,741 --> 01:19:47,931
We cannot possibly know.

1652
01:19:47,981 --> 01:19:49,901
And the same thing is true
for like a file system.

1653
01:19:49,951 --> 01:19:53,501
We cannot possibly know what these like
chunks of bytes mean without trying to

1654
01:19:53,501 --> 01:19:56,696
interpret them, in which case you're
not on a file system level anymore.

1655
01:19:56,876 --> 01:20:00,786
But on a document level, and
so to like, solve this problem,

1656
01:20:00,796 --> 01:20:02,406
we choose to not solve it.

1657
01:20:02,436 --> 01:20:04,766
And this that give you the
tools to solve it yourself.

1658
01:20:05,196 --> 01:20:08,146
And so imagine that we, we make
a game like a tic tac toe game

1659
01:20:08,216 --> 01:20:09,426
and we can play that together.

1660
01:20:09,776 --> 01:20:12,566
It has like, it has a, it's
a turn based game, right?

1661
01:20:12,566 --> 01:20:14,696
So 1 and it's a 2 player game.

1662
01:20:14,826 --> 01:20:16,506
1 player is across the other 1.

1663
01:20:16,526 --> 01:20:17,426
It's like a circle.

1664
01:20:17,806 --> 01:20:18,236
And.

1665
01:20:18,536 --> 01:20:22,676
Let's say you start out and you do, you
click somewhere, you can choose, right?

1666
01:20:22,696 --> 01:20:24,076
And then it's my turn.

1667
01:20:24,406 --> 01:20:28,326
And so now game state in this
example is whose turn is it?

1668
01:20:28,436 --> 01:20:31,926
What sort of like what on, on
this kind of like three by three

1669
01:20:31,926 --> 01:20:34,946
or nine by nine or whatever you
end up doing on this game board.

1670
01:20:35,086 --> 01:20:36,456
Like, what is the state of that?

1671
01:20:36,466 --> 01:20:37,706
Which cells are empty?

1672
01:20:37,846 --> 01:20:39,226
Which are currently like filled?

1673
01:20:39,396 --> 01:20:40,586
What are they filled with?

1674
01:20:40,676 --> 01:20:40,996
Right.

1675
01:20:40,996 --> 01:20:43,916
And then you have conditions and
this is not part of game state.

1676
01:20:43,966 --> 01:20:44,386
It's like.

1677
01:20:44,721 --> 01:20:45,601
Did someone win?

1678
01:20:45,791 --> 01:20:46,991
Like, Oh, who is leading?

1679
01:20:47,011 --> 01:20:49,711
Like, this is stuff you
derive from the game state.

1680
01:20:50,101 --> 01:20:53,441
And the game state itself is
essentially a key value store.

1681
01:20:53,761 --> 01:20:58,071
And on the key value store level, we
give you the, we give you transactions.

1682
01:20:58,851 --> 01:21:04,741
And so if you say like, uh, change this to
the, to that and change this to that, and

1683
01:21:04,751 --> 01:21:09,996
you can make up your own keys and values,
we guarantee you that Those things are

1684
01:21:10,006 --> 01:21:14,916
merged with all the other clients with the
same result within that one transaction.

1685
01:21:15,046 --> 01:21:18,446
So we give you this kind of like
primitive, that is a key value

1686
01:21:18,476 --> 01:21:20,816
store with like CRDT transactions.

1687
01:21:20,836 --> 01:21:24,186
I don't know what to call them, but this
is kind of like a notion of transaction.

1688
01:21:24,336 --> 01:21:27,981
And on that level and beyond that
level, below that level, We as like,

1689
01:21:28,021 --> 01:21:31,791
we had all of the diffing and merging
and syncing for you automatically.

1690
01:21:31,911 --> 01:21:35,301
Then of course we finally, we
give you like a, the lowest level.

1691
01:21:35,311 --> 01:21:38,651
So the highest level is like, you
don't use any of these things and

1692
01:21:38,651 --> 01:21:42,211
you get some limited multiplayer
functionality and the scene graph of

1693
01:21:42,211 --> 01:21:45,331
the whole, like the whole desktop,
if you will, is synchronized always.

1694
01:21:45,511 --> 01:21:46,691
And so that's the highest level.

1695
01:21:46,691 --> 01:21:47,431
That's the simplest thing.

1696
01:21:47,431 --> 01:21:50,851
You can write like a 20 line
program that has some limited

1697
01:21:50,891 --> 01:21:51,911
multiplayer functionality.

1698
01:21:51,911 --> 01:21:52,381
And it's fine.

1699
01:21:52,451 --> 01:21:56,571
All the defaults in Playbit, like
in our APIs, if you don't opt in for

1700
01:21:56,571 --> 01:22:00,111
something, you will get something that
we think is a good default, right?

1701
01:22:00,111 --> 01:22:04,131
If you don't pass, if a function
call has like a flags attribute

1702
01:22:04,141 --> 01:22:08,131
or argument, if you just pass zero
for that, we will like, instead of

1703
01:22:08,131 --> 01:22:11,501
giving you a window, for example,
sorry, this is a tangent in macOS.

1704
01:22:11,551 --> 01:22:12,331
If you say.

1705
01:22:12,536 --> 01:22:13,936
And this window, create a new window.

1706
01:22:13,936 --> 01:22:15,846
It's the API for creating a new window.

1707
01:22:16,246 --> 01:22:21,096
If you set flags to zero, like no special
flags, you get a window that's useless.

1708
01:22:21,146 --> 01:22:21,926
You can't close it.

1709
01:22:21,926 --> 01:22:22,796
You can't resize it.

1710
01:22:22,806 --> 01:22:24,856
You can't like do much with it at all.

1711
01:22:24,866 --> 01:22:25,606
You can't even move it.

1712
01:22:26,116 --> 01:22:29,476
And so you have to like set certain
flags to get the default window.

1713
01:22:29,751 --> 01:22:31,751
And, and it's kind of like folk knowledge.

1714
01:22:31,781 --> 01:22:35,921
You just know which flags to set and
which flags not to set and the caveats.

1715
01:22:36,021 --> 01:22:39,211
In Playbit, we're trying to like have
an ethos that is like, when you don't

1716
01:22:39,231 --> 01:22:42,321
opt in for something, you will get the
thing that is that you probably want.

1717
01:22:42,321 --> 01:22:44,231
And yeah, so this goes
for the data layer too.

1718
01:22:44,691 --> 01:22:45,241
And yeah, we'll see.

1719
01:22:46,086 --> 01:22:49,086
So you got these three kind of
like, I want to start easy mode.

1720
01:22:49,146 --> 01:22:50,176
You just give me a thing.

1721
01:22:50,396 --> 01:22:51,366
It will be multiplayer.

1722
01:22:51,406 --> 01:22:52,366
It'll be pretty fine.

1723
01:22:52,456 --> 01:22:55,526
And then you say, actually, I want
to like have my, the state of my app,

1724
01:22:55,536 --> 01:22:59,326
my game to be multiplayer so that two
people can play tic tac toe together.

1725
01:22:59,406 --> 01:23:02,776
Then you use this like fairly
straightforward, but still you

1726
01:23:02,776 --> 01:23:03,906
got to model your data now.

1727
01:23:04,416 --> 01:23:09,526
Um, like this database and then at the
very lowest level, you get something

1728
01:23:09,526 --> 01:23:13,776
that is kind of like a socket, but we,
we handle like encryption and you know,

1729
01:23:13,816 --> 01:23:15,686
the actual connectivity of it for you.

1730
01:23:15,836 --> 01:23:19,876
So you can say, give me a connection
to the other instances of this app.

1731
01:23:19,946 --> 01:23:22,866
And now your app can, you'll send
like arbitrary data if you want

1732
01:23:22,866 --> 01:23:24,596
to do something really like wild.

1733
01:23:24,656 --> 01:23:24,956
Right.

1734
01:23:25,066 --> 01:23:26,526
But now there's no different emerging.

1735
01:23:26,526 --> 01:23:31,076
It's, we just give you an ability to
say, send bytes between, um, between

1736
01:23:31,076 --> 01:23:32,726
different like instances of your app now.

1737
01:23:33,056 --> 01:23:33,376
Got it.

1738
01:23:33,416 --> 01:23:35,716
So that's how, how data flows.

1739
01:23:35,796 --> 01:23:39,906
Um, I'm curious, what is the authoring
experience for me as a developer?

1740
01:23:40,286 --> 01:23:43,836
Um, do I have to use like a certain
programming language for that?

1741
01:23:43,846 --> 01:23:46,196
Can I choose between different
programming languages?

1742
01:23:46,656 --> 01:23:50,856
Is there, can I bring some outside
technologies, for example, something

1743
01:23:50,866 --> 01:23:54,946
like react, or is there sort of
a bespoke way to do all of that?

1744
01:23:55,226 --> 01:23:57,936
You have to use our own flavor of Fortran.

1745
01:23:58,106 --> 01:23:59,126
That is backside.

1746
01:23:59,136 --> 01:24:01,676
You know, no, it's a, so.

1747
01:24:01,676 --> 01:24:03,381
Um, This is obviously an important thing.

1748
01:24:03,421 --> 01:24:05,411
I think that there are
two paths that you can go.

1749
01:24:05,411 --> 01:24:08,841
You can either say, here's a blessed
programming language, and this is what

1750
01:24:08,841 --> 01:24:15,491
you use, or you can say like, bring your
own language, here's like a minimal API.

1751
01:24:15,501 --> 01:24:21,611
And I think the two like common examples
of this is like on, uh, on iOS, you

1752
01:24:21,611 --> 01:24:23,301
got, I guess a little complicated.

1753
01:24:23,301 --> 01:24:26,871
Now you get Swift and Cocoa, but for
a long time, you had just Objective C.

1754
01:24:27,291 --> 01:24:30,111
And if you want to write an
app, you write an Objective C

1755
01:24:30,241 --> 01:24:31,301
and you use these libraries.

1756
01:24:32,156 --> 01:24:34,386
And there's some flexibility if
you want to do something else,

1757
01:24:34,386 --> 01:24:35,786
but it's like pretty much zero.

1758
01:24:35,966 --> 01:24:39,496
And then you have something like BSD or
Linux where you say there's a syscall.

1759
01:24:39,666 --> 01:24:43,246
It's essentially like a single function,
uh, that's called syscall, which is

1760
01:24:43,246 --> 01:24:47,206
really just like a CPU instruction, but
it's a syscall and you give it a number

1761
01:24:47,266 --> 01:24:50,706
and the first number represents like the
thing you want to do, like open a file,

1762
01:24:50,916 --> 01:24:52,676
close a file, read some bytes, right?

1763
01:24:52,786 --> 01:24:55,306
And then you give it some number and
it's a fixed number of things you

1764
01:24:55,306 --> 01:24:56,566
can give it arguments essentially.

1765
01:24:56,566 --> 01:24:58,976
And that's the entire API surface.

1766
01:24:58,976 --> 01:25:01,476
This is one function to
your entire computer.

1767
01:25:01,606 --> 01:25:05,146
So these are two extremes and with
Playbit, we're closer to the second,

1768
01:25:05,246 --> 01:25:08,786
because that gives you the flexibility
of if you want to use Python or Node.

1769
01:25:08,806 --> 01:25:11,246
js or BUN, you could do that.

1770
01:25:11,626 --> 01:25:12,506
And I think that's important.

1771
01:25:12,796 --> 01:25:14,066
Some people have opinions about this.

1772
01:25:14,066 --> 01:25:20,076
So Playbit has a C A B I and B as
in, as in Bob, as a binary interface,

1773
01:25:20,256 --> 01:25:24,276
basically any programming language
today can interface with a C A B I.

1774
01:25:25,146 --> 01:25:27,676
It doesn't mean you have to
write it and see the developer

1775
01:25:27,676 --> 01:25:28,776
experience currently in Playbit.

1776
01:25:28,776 --> 01:25:32,326
And so, you know, Playbit does exist
and we use it day to day and we

1777
01:25:32,456 --> 01:25:34,196
develop Playbit inside of Playbit.

1778
01:25:34,196 --> 01:25:37,576
It's kind of weird sometimes is we
got something that's a little bit like

1779
01:25:37,586 --> 01:25:41,226
Xcode, something that's a little bit like
developer tools, like on the OS level.

1780
01:25:41,571 --> 01:25:47,061
And so in our version of the finder
or windows file explorer, there's

1781
01:25:47,061 --> 01:25:50,421
a button called new app and you can
click this and like a new app is just

1782
01:25:50,421 --> 01:25:54,181
made for you and it's called like, you
know, new app that app and inside it,

1783
01:25:54,231 --> 01:25:57,831
like, you know, there's a main dot C
because we got a C compiler and system.

1784
01:25:57,831 --> 01:26:00,411
So it's main dot C and
it's already ready for you.

1785
01:26:00,616 --> 01:26:03,266
And when you, when you create a
new app, there's another toolbar

1786
01:26:03,266 --> 01:26:06,926
button, like in the file browser,
this says build and run it, click

1787
01:26:06,926 --> 01:26:08,946
build and run and your app starts up.

1788
01:26:09,596 --> 01:26:12,446
And there's, you don't need to use
terminals or anything like that.

1789
01:26:12,766 --> 01:26:14,476
You got standard out and standard error.

1790
01:26:14,476 --> 01:26:18,736
You can get those kinds of things like in,
in a more friendly sort of developer log.

1791
01:26:18,796 --> 01:26:21,286
We have an inkling to this now,
but there's also a couple of

1792
01:26:21,286 --> 01:26:22,906
ways to like, look at the dom.

1793
01:26:23,156 --> 01:26:25,736
So we have the scene graph
that your app has, right?

1794
01:26:25,736 --> 01:26:26,446
You can inspect that.

1795
01:26:26,446 --> 01:26:30,766
You can inspect actually the scene graph
of the entire desktop if you wanted to.

1796
01:26:30,906 --> 01:26:33,256
So that, you know, this opens
up some very interesting things

1797
01:26:33,256 --> 01:26:34,806
for accessibility, for example.

1798
01:26:34,936 --> 01:26:38,346
But anyhow, so the developer experience
is very much like, it's very like

1799
01:26:38,346 --> 01:26:41,246
straightforward, very lightweight,
very opinionated right now.

1800
01:26:41,456 --> 01:26:43,996
So again, you click, you click a
button to just create a new app.

1801
01:26:44,286 --> 01:26:46,376
And you can just rename it
by changing the folder name.

1802
01:26:46,526 --> 01:26:50,116
And if you don't want to even open
a text editor, you just click the

1803
01:26:50,126 --> 01:26:54,576
building ride button, which is the same
place your app is built and is run.

1804
01:26:54,626 --> 01:26:56,436
And it takes like a
couple of milliseconds.

1805
01:26:56,726 --> 01:27:00,266
And now you can just like, and it's
just going to say, hello world.

1806
01:27:00,346 --> 01:27:01,936
It's just a window that opens hello world.

1807
01:27:02,056 --> 01:27:04,876
And it has closed buttons,
you know, it's very basic.

1808
01:27:05,016 --> 01:27:07,246
And what you can do now is that
you can open the source file.

1809
01:27:07,836 --> 01:27:10,176
In the text editor, it's only
in graphical environments.

1810
01:27:10,306 --> 01:27:13,656
And now you can, you
can change them, right?

1811
01:27:13,656 --> 01:27:15,926
You can change, for example,
like where it says hello world to

1812
01:27:15,926 --> 01:27:17,466
say, you know, hello, Johannes.

1813
01:27:18,236 --> 01:27:19,646
And then you hit build and run again.

1814
01:27:19,646 --> 01:27:21,896
And now like it restarts
and says, hello, Johannes.

1815
01:27:22,296 --> 01:27:26,236
And then, you know, there's some
generated documentation for the API.

1816
01:27:26,276 --> 01:27:28,396
There's functions, of course,
for, you know, we've got.

1817
01:27:28,921 --> 01:27:31,681
Grid functions, all of the kind of
really gooey things you might expect,

1818
01:27:31,721 --> 01:27:35,701
you know, pop up menus and scroll bars
and radio buttons and all of that stuff.

1819
01:27:35,701 --> 01:27:38,311
And if you want to bring in
libraries and stuff, you can do that.

1820
01:27:38,311 --> 01:27:41,291
And if you wanted to use Python
instead, then you will call these

1821
01:27:41,291 --> 01:27:44,191
functions through the C ABI and
FFI functions in Python, right?

1822
01:27:44,761 --> 01:27:48,561
So that's kind of like the, currently
the developer story in PlayBit.

1823
01:27:48,661 --> 01:27:49,321
That makes sense.

1824
01:27:49,331 --> 01:27:54,161
So you've like laid out the absolute
foundation and that allows for a lot

1825
01:27:54,161 --> 01:27:59,321
of layers, optional layers to be built
on top where you want to follow like

1826
01:27:59,321 --> 01:28:01,351
a certain flavor of app development.

1827
01:28:01,651 --> 01:28:06,051
And I think that also allows an
ecosystem to be built around PlayBit.

1828
01:28:07,081 --> 01:28:12,191
But I think the new level of primitives
and the, this new, um, More like

1829
01:28:12,221 --> 01:28:17,391
2024 foundation that you're laying
where you get things that are, that

1830
01:28:17,391 --> 01:28:20,581
was probably shareable by default,
that's collaborative by default.

1831
01:28:20,591 --> 01:28:25,101
So, uh, a lot of the local-first
aspects, what makes local-first software

1832
01:28:25,101 --> 01:28:29,881
great, having that be baked into the
foundations of an operating system.

1833
01:28:30,321 --> 01:28:33,951
Uh, that is not something I
would have expected in 2024 to

1834
01:28:33,951 --> 01:28:36,701
already exist, maybe rather 2040.

1835
01:28:37,871 --> 01:28:40,551
So you make me feel like
living in the future.

1836
01:28:41,261 --> 01:28:44,731
But I got to say, I think that there,
it's almost a logical conclusion

1837
01:28:44,731 --> 01:28:45,731
when I'm going to come to here.

1838
01:28:45,761 --> 01:28:47,861
But I think, first off, I want
to say, I think, I think of

1839
01:28:47,911 --> 01:28:50,451
Playbit as being a platform.

1840
01:28:50,481 --> 01:28:53,101
I think it's very interesting to
talk about, like, what is an OS?

1841
01:28:53,241 --> 01:28:54,521
Like, what is a platform?

1842
01:28:54,681 --> 01:28:57,701
We've been talking about the web a
lot today for really good reasons.

1843
01:28:57,741 --> 01:29:00,881
And the web to me kind of smells
like an operating system, you know,

1844
01:29:00,911 --> 01:29:02,701
in a way, and it is a platform.

1845
01:29:03,051 --> 01:29:05,691
And I think Playbit similarly,
although it is like, technically

1846
01:29:05,721 --> 01:29:08,541
speaking, a real operating system,
you know, it's like manages memory

1847
01:29:08,541 --> 01:29:10,011
and hardware and all of that stuff.

1848
01:29:10,161 --> 01:29:13,231
I think, or I hope at least it
also can become the platform.

1849
01:29:13,926 --> 01:29:18,996
That has a primary environment,
which is, you know, its own OS and a

1850
01:29:18,996 --> 01:29:23,536
secondary environment, which is like
other systems, like the web, right?

1851
01:29:23,586 --> 01:29:24,326
Other platforms.

1852
01:29:24,506 --> 01:29:27,926
And the logical confusion I was
mentioning, thinking about what,

1853
01:29:27,926 --> 01:29:30,146
what does a platform OS do?

1854
01:29:30,156 --> 01:29:31,276
Why, why does it exist?

1855
01:29:31,276 --> 01:29:31,926
Why do we have them?

1856
01:29:32,076 --> 01:29:36,176
Historically and an operating system
does really is two things, right?

1857
01:29:36,176 --> 01:29:37,976
One, it abstracts the hardware.

1858
01:29:38,046 --> 01:29:39,056
It used to be so.

1859
01:29:39,326 --> 01:29:42,696
That if you want it to write the disc,
you would have to like write the disc.

1860
01:29:43,316 --> 01:29:46,046
You have to have different code
depending on the specific hardware

1861
01:29:46,046 --> 01:29:47,376
you're writing, which is kind of insane.

1862
01:29:47,376 --> 01:29:48,366
But that's how it was.

1863
01:29:48,556 --> 01:29:51,586
And then someone was like, Hey, what,
what if we have like a layer in between?

1864
01:29:51,586 --> 01:29:57,406
So like you say, right to hard
disk a or hard disk B and you use

1865
01:29:57,406 --> 01:30:01,726
the same like function calls, even
if this is like a, you know, a

1866
01:30:01,726 --> 01:30:04,926
hard disk from this manufacturer,
if it's like a floppy disk drive.

1867
01:30:04,986 --> 01:30:05,316
Right.

1868
01:30:05,676 --> 01:30:08,651
And that is like, Those are
like drivers or whatever.

1869
01:30:08,681 --> 01:30:11,041
That is like one important
role that OS serves.

1870
01:30:11,337 --> 01:30:13,217
the other category, it's very interesting.

1871
01:30:13,227 --> 01:30:16,977
It's like the OS then needs to
provide services for like the

1872
01:30:16,977 --> 01:30:18,417
tools that run on top of it.

1873
01:30:18,477 --> 01:30:22,737
And this is where I think we as like,
we as kind of like set back in our

1874
01:30:22,737 --> 01:30:25,867
chairs, you know, in, in like the late
nineties and said, Oh, we're done.

1875
01:30:26,407 --> 01:30:30,667
You know, I mean, iOS is like built on
macOS, which is built on next, which is

1876
01:30:30,677 --> 01:30:34,827
built in the eighties and we have windows,
which like still has like some parts in

1877
01:30:34,827 --> 01:30:38,517
it that are from, you know, the nineties
or maybe even further back than that.

1878
01:30:38,597 --> 01:30:41,857
And so a lot of these OS's that we use
today, and even like the windowing,

1879
01:30:41,907 --> 01:30:45,567
like the compositing windowing system
is sort of like an ancient idea, right.

1880
01:30:45,567 --> 01:30:49,857
Of like, that comes from like X11 and
stuff like that, or, you know, even

1881
01:30:49,857 --> 01:30:53,937
earlier stuff, of course, X11 was not the
first, but, you know, you have a window.

1882
01:30:54,227 --> 01:30:57,167
And you have a window and
these are two like bitmaps or

1883
01:30:57,197 --> 01:30:58,887
textures, if in GPX or either.

1884
01:30:59,297 --> 01:31:02,197
And each window is like a process
or whatever you want to call it.

1885
01:31:02,437 --> 01:31:05,967
And they like use the same library code to
draw the same button into their bitmaps.

1886
01:31:06,707 --> 01:31:09,487
And then on the desktop, you
put these bitmaps together and

1887
01:31:09,487 --> 01:31:10,427
that's how you have windows.

1888
01:31:10,477 --> 01:31:13,527
I was like, gee, the huge problem
with this is that how do you like

1889
01:31:13,547 --> 01:31:14,947
introspect what's on the desktop?

1890
01:31:14,947 --> 01:31:16,597
How do you do things like accessibility?

1891
01:31:16,877 --> 01:31:19,817
How do you, how do you like, uh,
debug something that goes wrong?

1892
01:31:19,887 --> 01:31:21,587
That crosses the boundary of two windows.

1893
01:31:22,267 --> 01:31:26,197
Like you, it becomes really hard and
you end up with this like really weird

1894
01:31:26,257 --> 01:31:28,417
patched on things at the, at the end.

1895
01:31:28,577 --> 01:31:31,657
And so I think that the
services argument, right?

1896
01:31:31,657 --> 01:31:36,167
Like then we think about, so why is it
so that today you look at someone who

1897
01:31:36,167 --> 01:31:38,432
used a Mac book And what apps do you use?

1898
01:31:38,562 --> 01:31:39,902
These are web apps that they use.

1899
01:31:40,132 --> 01:31:43,072
They are not native apps, but they
have this like Mac OS running there.

1900
01:31:43,082 --> 01:31:44,342
Why aren't there Mac OS apps?

1901
01:31:44,412 --> 01:31:46,862
I think it's because Mac OS
doesn't provide the things

1902
01:31:46,862 --> 01:31:48,082
that people want, right?

1903
01:31:48,092 --> 01:31:48,992
Developers want.

1904
01:31:49,102 --> 01:31:51,852
I want to be able to just like fetch
the thing from the network, right?

1905
01:31:51,892 --> 01:31:55,382
I can do that one line of code in
JavaScript or like a fucking million

1906
01:31:55,382 --> 01:32:00,422
lines, excuse my French, of codes
in, in like a Mac OS native, right?

1907
01:32:00,892 --> 01:32:04,362
There's just like a, there's a mismatch
between the services that an OS provides.

1908
01:32:04,872 --> 01:32:07,552
Another thing is like, like
payments or like subscriptions

1909
01:32:07,562 --> 01:32:08,472
or whatever, like revenue.

1910
01:32:08,692 --> 01:32:10,142
Let's say that I read a little thing.

1911
01:32:10,537 --> 01:32:11,467
And it's a hobby thing.

1912
01:32:11,497 --> 01:32:15,027
I can't spend too much like time
slash money on it, but I still spend

1913
01:32:15,027 --> 01:32:16,947
a lot of like my time and money on it.

1914
01:32:16,947 --> 01:32:17,087
Right.

1915
01:32:17,097 --> 01:32:20,697
Even if it's like, you know, five
hours a week and now I'm going

1916
01:32:20,697 --> 01:32:22,237
to ask people who really like it.

1917
01:32:22,237 --> 01:32:23,367
It's kind of the shareware model.

1918
01:32:23,537 --> 01:32:26,137
So like, give me a dollar,
like a month, if they like this

1919
01:32:26,137 --> 01:32:27,407
thing or just like one time.

1920
01:32:27,917 --> 01:32:32,247
And obviously I'm not like pitching
anything novel here, like the, you know,

1921
01:32:32,267 --> 01:32:35,717
Apple app stores are very successful
and everything else that comes after it.

1922
01:32:36,207 --> 01:32:39,407
But the problem with that is that
it is sort of like a monolith.

1923
01:32:39,607 --> 01:32:41,897
It's this sort of like
it's in the planet Apple.

1924
01:32:41,977 --> 01:32:44,647
First off, if you want this to
work on other platforms, like

1925
01:32:44,657 --> 01:32:46,327
you can't, it's iOS or nothing.

1926
01:32:46,367 --> 01:32:49,387
And if you want to market this somewhere
else where you really can't, it's in

1927
01:32:49,397 --> 01:32:53,057
the app store or nowhere else, and you
have to build it specifically for them.

1928
01:32:53,057 --> 01:32:55,887
And there's all of this, this
whole list of cabinets is basically

1929
01:32:55,887 --> 01:32:57,947
like there's a little bubble,
you can put it in the bubble.

1930
01:32:58,167 --> 01:33:00,197
If you don't want it to be in
the bubble, you're on your own.

1931
01:33:00,247 --> 01:33:03,872
You got to Do a Stripe integration
or something that's going to take

1932
01:33:03,872 --> 01:33:05,942
you a lot more time than you have.

1933
01:33:05,952 --> 01:33:09,472
And so I think that there's a lot of
hobby developers out there who make

1934
01:33:09,472 --> 01:33:13,232
something truly valuable who will
just like, just pass on it, right?

1935
01:33:13,232 --> 01:33:15,802
They will just pass on the revenue
they could get because it's

1936
01:33:15,802 --> 01:33:17,202
just like not worth building it.

1937
01:33:17,212 --> 01:33:18,792
So that's just one example.

1938
01:33:19,142 --> 01:33:22,692
Uh, multipliers we were talking about
is another example, like data syncing,

1939
01:33:22,782 --> 01:33:26,132
all of these things that like the OSS
that we use today, they just don't

1940
01:33:26,132 --> 01:33:28,007
provide But the web platform does.

1941
01:33:28,037 --> 01:33:29,477
So we moved to the web platform instead.

1942
01:33:29,767 --> 01:33:30,217
Yeah.

1943
01:33:30,307 --> 01:33:31,837
I love that, that vision.

1944
01:33:31,917 --> 01:33:36,857
Uh, and, and so I've mentioned before
that I am trying to build the best

1945
01:33:36,857 --> 01:33:40,697
of both worlds for like embracing the
web, still making the app feel native

1946
01:33:40,727 --> 01:33:45,417
and, uh, the app also following the
local-first ideals as much as possible.

1947
01:33:45,777 --> 01:33:49,157
This is really, uh, building an
app on the hard mode compared

1948
01:33:49,157 --> 01:33:50,707
to how you build other apps.

1949
01:33:50,707 --> 01:33:51,157
So.

1950
01:33:51,272 --> 01:33:55,032
Um, chasing that quality,
et cetera, but it's so hard.

1951
01:33:55,522 --> 01:34:01,162
Um, and this is where in the future,
where I can just build Overtone on top

1952
01:34:01,162 --> 01:34:06,722
of Playbit, this is where I can put all
of my effort on making the, like spending

1953
01:34:06,732 --> 01:34:11,872
the quality on like even, even more higher
leverage things, and you've been taking

1954
01:34:12,242 --> 01:34:17,672
care of like the tough foundation that the
app is collaborative by default, that it

1955
01:34:17,672 --> 01:34:19,762
feels more, gives me better primitives.

1956
01:34:19,862 --> 01:34:23,522
The app feels native where, depending
on where it's running, whether it's

1957
01:34:23,522 --> 01:34:26,892
running in the browser or whether
it's running on, on someone's

1958
01:34:27,212 --> 01:34:28,792
more, more native environment.

1959
01:34:29,112 --> 01:34:31,722
So I'm really looking
forward to that future.

1960
01:34:31,962 --> 01:34:33,752
I have one tangent question.

1961
01:34:33,812 --> 01:34:39,682
Uh, you've been mentioning that you're
developing Playbit inside of Playbit.

1962
01:34:39,682 --> 01:34:43,372
Looking at this from a similar lens,
I'm very curious whether you can already

1963
01:34:43,552 --> 01:34:48,762
have a browser running inside of Playbit
and then open a Playbit environment

1964
01:34:48,932 --> 01:34:51,302
within the browser running Playbit.

1965
01:34:53,132 --> 01:34:57,012
Oh, we don't have a web browser yet.

1966
01:34:57,052 --> 01:35:00,032
If there's anyone out there who wants
to join us, I mean, play, but it's

1967
01:35:00,032 --> 01:35:03,782
like a venture backed company, like,
you know, we can pay you a salary.

1968
01:35:03,782 --> 01:35:04,692
It's like a real job.

1969
01:35:05,062 --> 01:35:08,922
If you want to come work with us
and, you know, put Chrome or Firefox

1970
01:35:08,942 --> 01:35:10,692
in play, but yeah, hit me up.

1971
01:35:11,512 --> 01:35:15,492
Or if you want to work on like
GPU stuff or the Linux kernel, we

1972
01:35:16,212 --> 01:35:17,362
are looking to hire a few people.

1973
01:35:17,462 --> 01:35:19,082
So yeah, there's no web browser yet.

1974
01:35:19,192 --> 01:35:20,532
It will, it will be a mind band.

1975
01:35:20,532 --> 01:35:20,942
Yeah.

1976
01:35:21,022 --> 01:35:23,722
To like run it inside a web browser,
because then you can keep going.

1977
01:35:23,892 --> 01:35:27,302
It's like you take a video camera
connected to a TV and you point

1978
01:35:27,302 --> 01:35:31,102
it at the TV, you know, you got
this like, Infinity mirror effect.

1979
01:35:31,252 --> 01:35:31,472
Yeah.

1980
01:35:31,472 --> 01:35:32,072
That's kind of fun.

1981
01:35:32,442 --> 01:35:33,132
Uh, exactly.

1982
01:35:33,132 --> 01:35:37,002
That's what I had in mind, or I think you
get the same when you like use like Google

1983
01:35:37,032 --> 01:35:41,942
meet or something or whatever it's called
these days, but yeah, I would like take

1984
01:35:41,952 --> 01:35:47,582
up that, that job offer opportunity in
a, in an instant, if I had the background

1985
01:35:47,592 --> 01:35:52,482
that fits it and If I wasn't already knee
deep in all sorts of other things, but

1986
01:35:52,482 --> 01:35:56,302
I'm sure there, there will be someone
out there who is the perfect fit and

1987
01:35:56,302 --> 01:35:58,772
I'm sure that's an amazing opportunity.

1988
01:35:59,287 --> 01:36:03,797
So before wrapping up, you're
all, you're not just building such

1989
01:36:03,797 --> 01:36:07,607
an ambitious startup, but you're
also about to become a father.

1990
01:36:07,797 --> 01:36:11,207
So I'm very curious, uh, from
a personal perspective, like

1991
01:36:11,377 --> 01:36:13,007
how are you navigating that?

1992
01:36:13,017 --> 01:36:18,167
How do you balance going after such
an, such an ambitious project, uh,

1993
01:36:18,207 --> 01:36:22,257
and also navigating that becoming a
father, raising a family and so on.

1994
01:36:22,437 --> 01:36:26,457
I think I've just got a bit of perspective
of what I think it's like important.

1995
01:36:26,777 --> 01:36:29,807
And less important, the more
important and worth spending time on.

1996
01:36:29,857 --> 01:36:33,937
Like earlier in my life, there was
one point where I found myself like

1997
01:36:33,937 --> 01:36:39,067
in a heart intensive care, minutes
away from like dying because I wasn't

1998
01:36:39,067 --> 01:36:40,987
sleeping and I was working all the time.

1999
01:36:41,077 --> 01:36:43,647
And it was like an
absolutely insane lifestyle.

2000
01:36:43,697 --> 01:36:47,117
You know, I would be partying and I
would sleep like basically three hours

2001
01:36:47,117 --> 01:36:49,327
a night and have two jobs and party.

2002
01:36:49,697 --> 01:36:53,077
And you know, one day my body
almost like give up and it was died.

2003
01:36:53,507 --> 01:36:55,307
And that was like a
pretty good wake up call.

2004
01:36:55,602 --> 01:36:56,532
But that didn't fix it.

2005
01:36:56,532 --> 01:36:57,892
I was still like insane.

2006
01:36:57,982 --> 01:37:01,412
And so this was before I joined
Spotify and it's Spotify.

2007
01:37:01,432 --> 01:37:06,062
I, you know, I was, I ran the whole
design department for four years alone.

2008
01:37:06,782 --> 01:37:10,322
So, you know, I would do marketing
stuff and all of the UI and everything.

2009
01:37:10,362 --> 01:37:11,502
You just one person, right?

2010
01:37:11,912 --> 01:37:13,002
There's no other designers.

2011
01:37:13,042 --> 01:37:14,172
It was absolutely insane.

2012
01:37:14,692 --> 01:37:15,792
And I didn't know better.

2013
01:37:15,842 --> 01:37:17,382
And I worked all the time.

2014
01:37:17,502 --> 01:37:20,462
And I mean, like basically 24, 7, 4.

2015
01:37:20,782 --> 01:37:25,952
The first, like, year or 2 and, you
know, I paid like a pretty heavy price

2016
01:37:25,982 --> 01:37:29,832
from both of these experiences and
it's, you know, just like a waves on a

2017
01:37:29,832 --> 01:37:34,432
body of water, you know, the cost and
effect, there's a quite a bit of delay.

2018
01:37:34,602 --> 01:37:36,642
And so I started to realize that.

2019
01:37:36,962 --> 01:37:41,722
You know, what the costs have been and
losing, you know, friends and, and losing

2020
01:37:41,762 --> 01:37:46,662
out on like social events and, you know,
losing my girlfriend and like, yeah, it's

2021
01:37:46,672 --> 01:37:50,212
losing a lot of things, losing health
and, you know, all of this kind of stuff.

2022
01:37:50,292 --> 01:37:54,062
And anyhow, so that, that was a long time
ago, you know, that was like mid 2000s.

2023
01:37:54,402 --> 01:37:58,622
And now I think that work is
like, yes, it's a part of life.

2024
01:37:58,742 --> 01:37:59,832
And if you're lucky.

2025
01:38:00,267 --> 01:38:04,417
You'll find something to work on that
creates a passion in you know, when

2026
01:38:04,437 --> 01:38:07,967
in the morning you wake up and you
think about it in like a good way.

2027
01:38:07,977 --> 01:38:13,077
If in like, I gotta get make a cup of
coffee and like get jump into this layer.

2028
01:38:13,357 --> 01:38:15,547
That thing I think that is like.

2029
01:38:15,752 --> 01:38:18,842
All one can wish for when it comes
to like work that is like the,

2030
01:38:19,172 --> 01:38:22,012
if you, if you get to the level,
you're like, you've made it right.

2031
01:38:22,192 --> 01:38:25,522
If sure, if you, if you still
need to make money, that's another

2032
01:38:25,522 --> 01:38:28,872
problem, but like beyond, beyond that
and then everything else in life.

2033
01:38:28,882 --> 01:38:33,562
So I think as I just have this philosophy
that like work is important and it's about

2034
01:38:33,562 --> 01:38:38,432
passion, you know, if you can make it so,
and with play a bit specifically, and I

2035
01:38:38,432 --> 01:38:42,662
made it very clear to everyone involved
in play a bit from like day one that.

2036
01:38:43,207 --> 01:38:46,887
This is something that will be done
on, uh, like, uh, on a balance.

2037
01:38:47,327 --> 01:38:50,097
This is not a, I'm going to
give up like five years of my

2038
01:38:50,097 --> 01:38:51,437
life just to make this happen.

2039
01:38:51,527 --> 01:38:54,937
This is not like a, I'm going
to like get rid of my friends

2040
01:38:55,117 --> 01:38:56,257
because it's more important.

2041
01:38:56,537 --> 01:39:00,707
And so, you know, starting a family and
like moving and having hobbies outside

2042
01:39:00,707 --> 01:39:02,817
of work is like an explicit goal.

2043
01:39:03,007 --> 01:39:06,797
And it's the same with true for
like our employees that there

2044
01:39:06,857 --> 01:39:08,647
are no expectations to work.

2045
01:39:08,862 --> 01:39:12,752
Outside of working hours and compensation
does not happen on a time basis.

2046
01:39:12,762 --> 01:39:15,932
Not like if you work four hours, you
make more than if you work two hours.

2047
01:39:16,252 --> 01:39:19,482
I think that model is just fundamentally
incompatible with this mindset.

2048
01:39:19,632 --> 01:39:22,022
And that also goes to like, you
know, we don't really have sort

2049
01:39:22,022 --> 01:39:26,782
of like milestones or, or, uh,
measurements of like how we're doing.

2050
01:39:26,782 --> 01:39:29,982
It's more like we have a roadmap
and we build things toward it.

2051
01:39:30,052 --> 01:39:32,642
And we have different
areas of responsibility.

2052
01:39:33,392 --> 01:39:36,802
How well we are doing is measured
in like the actual product.

2053
01:39:36,822 --> 01:39:38,432
Like, can it do the thing, right?

2054
01:39:38,512 --> 01:39:40,592
Have we done the thing that
we said we were going to do?

2055
01:39:40,782 --> 01:39:44,262
Like, if, if not, we're not doing well
and we got to figure something out.

2056
01:39:44,302 --> 01:39:46,362
If it does, we're doing well
and let's keep doing it.

2057
01:39:46,722 --> 01:39:47,252
Exactly.

2058
01:39:47,252 --> 01:39:50,482
And if you have that passion, like
getting up in the morning, being super

2059
01:39:50,482 --> 01:39:54,782
pumped about doing that, that is the,
that's the best fuel to get there.

2060
01:39:54,952 --> 01:39:58,072
Probably even more efficiently
than if you'd have like the best

2061
01:39:58,322 --> 01:40:02,072
product managers who figure out
every, every step along the way.

2062
01:40:02,302 --> 01:40:03,062
I think that's right.

2063
01:40:03,092 --> 01:40:07,452
And I think it's like, it's, it's such
a nice kernel of an idea, but to build

2064
01:40:07,472 --> 01:40:11,122
things around, like you think about, okay,
now, how do you, how do you create that?

2065
01:40:11,152 --> 01:40:11,972
Or how do you maintain it?

2066
01:40:11,972 --> 01:40:14,012
If you have created it, I
think that's really hard.

2067
01:40:14,022 --> 01:40:15,882
And it's a lot of work
to make that happen.

2068
01:40:15,882 --> 01:40:16,102
Right.

2069
01:40:16,492 --> 01:40:19,882
For once, if you, let's say you
like to eat pizza, if you eat pizza

2070
01:40:19,882 --> 01:40:22,782
every day, pretty soon, you're
not going to like pizza anymore.

2071
01:40:22,852 --> 01:40:23,142
Right.

2072
01:40:23,382 --> 01:40:25,462
And so like, if you work on the
thing that you're really passionate

2073
01:40:25,462 --> 01:40:29,417
about, like, Unhinged like totally
all the time, very quickly.

2074
01:40:29,417 --> 01:40:31,277
Will you like burn out or
whatever you want to call it?

2075
01:40:31,307 --> 01:40:32,517
It's not going to be fun anymore.

2076
01:40:32,547 --> 01:40:33,217
So you lose it.

2077
01:40:33,897 --> 01:40:37,957
If you don't get to exercise what you're
excited about, it will like wane away.

2078
01:40:38,887 --> 01:40:39,227
Right.

2079
01:40:39,307 --> 01:40:40,857
So there's like more dimensions to it.

2080
01:40:41,057 --> 01:40:44,017
Managing that I think suddenly
becomes done an effort.

2081
01:40:44,017 --> 01:40:45,377
It's not like we're working less.

2082
01:40:45,417 --> 01:40:47,037
We're just working hard
on different things.

2083
01:40:47,067 --> 01:40:47,367
Right.

2084
01:40:48,537 --> 01:40:52,677
And so like, you know, the way we work
now, sometimes maybe someone like feels

2085
01:40:52,677 --> 01:40:56,177
like tired a day or like feels like
they have a cold or something like that.

2086
01:40:56,187 --> 01:40:56,207
Yeah.

2087
01:40:56,737 --> 01:41:00,067
You just don't work that day, just
take the day off or, or it feels like,

2088
01:41:00,067 --> 01:41:03,287
Oh God, I've been like, we're, we
have this like memory corruption bug.

2089
01:41:03,637 --> 01:41:04,707
Uh, we weren't sure.

2090
01:41:04,707 --> 01:41:05,737
Is it in the kernel?

2091
01:41:05,797 --> 01:41:07,267
Is it in the compiler?

2092
01:41:07,287 --> 01:41:09,897
Is it, there was this thing that
was lasting for two weeks and we

2093
01:41:09,897 --> 01:41:11,017
were like, okay, we just got it.

2094
01:41:11,027 --> 01:41:15,677
We need to take like two days off and
just like, I don't know, read a book, look

2095
01:41:15,677 --> 01:41:17,937
at a tree, play a video game, whatever.

2096
01:41:18,237 --> 01:41:21,297
And came back to it and, you
know, we, we, we found it.

2097
01:41:21,577 --> 01:41:26,207
And so I think like, you know, part of
this is also taking like a break when

2098
01:41:26,207 --> 01:41:29,767
you're like, you know, uh, climbing
a mountain and it's like really hard.

2099
01:41:29,767 --> 01:41:30,627
You need to take a break.

2100
01:41:30,697 --> 01:41:32,917
Otherwise you're just going to
overextend yourself and fall down.

2101
01:41:33,507 --> 01:41:33,887
Yeah.

2102
01:41:33,957 --> 01:41:36,797
And, but I think it's
like similar to food.

2103
01:41:36,797 --> 01:41:41,227
It's not just like that besides pizza,
everything tastes bad, but there's

2104
01:41:41,257 --> 01:41:46,057
plenty of other good things that taste
really well and you can, you can just

2105
01:41:46,217 --> 01:41:48,607
Choose and like cycle between them.

2106
01:41:48,647 --> 01:41:53,117
And I think this also shows in your
portfolio work, you've not just tackled

2107
01:41:53,117 --> 01:41:58,657
super hard data problems or, uh, or
performance problems, but you also took

2108
01:41:58,657 --> 01:42:03,377
like more scenic routes, creating one of
the most popular fonts out there, enter.

2109
01:42:03,787 --> 01:42:08,627
And, uh, for, for me, I can, can
totally see how just switching a

2110
01:42:08,627 --> 01:42:11,977
little bit of, between those different
things can be really re energizing.

2111
01:42:12,457 --> 01:42:17,127
And I love that mindset and that,
that balance that you're striking for.

2112
01:42:17,127 --> 01:42:21,967
And I think that is, is very
on brand for, for Playbit that

2113
01:42:22,027 --> 01:42:24,657
it should be fun and playful.

2114
01:42:24,807 --> 01:42:25,217
Yeah.

2115
01:42:25,287 --> 01:42:26,207
Life is really short.

2116
01:42:26,217 --> 01:42:27,537
It's much shorter than we think.

2117
01:42:27,557 --> 01:42:31,127
And we usually don't realize how
short it is until we lose something.

2118
01:42:31,347 --> 01:42:34,787
You know, like a family member
or health or whatever it is.

2119
01:42:35,157 --> 01:42:38,747
So I think it's never a bad idea to
reiterate that like life really is short.

2120
01:42:38,967 --> 01:42:42,397
And the one thing we all have the
same amount of is time, right?

2121
01:42:42,417 --> 01:42:45,067
That's, I think that's like
your body and your time are your

2122
01:42:45,087 --> 01:42:48,047
two most valuable resources and
everything else is just secondary.

2123
01:42:48,067 --> 01:42:48,367
Right?

2124
01:42:48,907 --> 01:42:53,167
Well, thank you so much for making the
limited time that we have more joyful.

2125
01:42:53,312 --> 01:42:58,592
by great software and, uh, thank you
so much for taking this huge amount of

2126
01:42:58,602 --> 01:43:02,472
time today out of your day, uh, to share
all of those stories on the podcast.

2127
01:43:02,602 --> 01:43:03,262
Thank you so much.

2128
01:43:03,796 --> 01:43:05,086
Thank you so much, Johannes.

2129
01:43:05,146 --> 01:43:06,166
This was super fun.

2130
01:43:06,216 --> 01:43:08,166
I love just talking about
these things with you.

2131
01:43:08,286 --> 01:43:10,896
If it's on a podcast or over a
cup of coffee, and I hope we can

2132
01:43:10,896 --> 01:43:12,066
do more of this in the future.

2133
01:43:12,416 --> 01:43:12,916
Awesome.

2134
01:43:12,956 --> 01:43:13,986
I couldn't agree more.

2135
01:43:14,096 --> 01:43:14,866
Take care.

2136
01:43:15,046 --> 01:43:15,416
Thank you.

2137
01:43:15,946 --> 01:43:16,566
Bye.

2138
01:43:17,068 --> 01:43:19,608
Thank you for listening to
the localfirst.fm podcast.

2139
01:43:19,848 --> 01:43:23,578
If you've enjoyed this episode and haven't
done so already, please subscribe and

2140
01:43:23,578 --> 01:43:25,338
leave a review wherever you're listening.

2141
01:43:25,708 --> 01:43:27,138
Please also tell your friends about it.

2142
01:43:27,148 --> 01:43:30,718
If you think they could be interested
in local-first, if you have feedback,

2143
01:43:30,758 --> 01:43:34,498
questions or ideas for the podcast,
please get in touch via hello at

2144
01:43:34,498 --> 01:43:40,278
localfirst.fm or use the feedback form on
our website, special thanks to Expo and

2145
01:43:40,278 --> 01:43:42,328
Crab Nebula for supporting this podcast.

2146
01:43:42,728 --> 01:43:43,488
See you next time.