1
00:00:00,000 --> 00:00:03,708
I think another way to frame that
is with the idea of resiliency.

2
00:00:03,738 --> 00:00:06,288
When Kinopio  first launched,
it was like front page of

3
00:00:06,288 --> 00:00:07,648
Hacker News for a little while.

4
00:00:07,871 --> 00:00:11,721
A hundred thousand people visited it like
pretty fast, but because the server didn't

5
00:00:11,721 --> 00:00:15,151
even know about them, cause they were
mostly  checking it out in their browser.

6
00:00:15,235 --> 00:00:16,465
Like nothing went wrong.

7
00:00:16,645 --> 00:00:19,945
I barely noticed, because  I didn't
have to worry about like, Hey,

8
00:00:19,945 --> 00:00:21,345
now there's 100, 000 accounts.

9
00:00:21,345 --> 00:00:25,085
And now my database is like inflated
or, now my server's on fire.

10
00:00:25,586 --> 00:00:27,566
Welcome to the Local-First FM podcast.

11
00:00:28,056 --> 00:00:32,036
I'm your host, Johan Schickling, and I'm
a web developer, a startup founder, and

12
00:00:32,036 --> 00:00:33,926
love the craft of software engineering.

13
00:00:34,526 --> 00:00:38,126
For the past few years, I've been on a
journey to build a modern, high quality

14
00:00:38,126 --> 00:00:39,916
music app using web technologies.

15
00:00:40,316 --> 00:00:44,336
And in doing so, I've been falling down
the rabbit hole of Local-First software.

16
00:00:44,896 --> 00:00:48,006
This podcast is your invitation
to join me on that journey.

17
00:00:48,258 --> 00:00:52,968
In this episode, I'm speaking to Pirijan
Ketheswaran, the creator of Kinopio, a

18
00:00:52,968 --> 00:00:55,098
playful canvas-based tool for thought.

19
00:00:55,498 --> 00:00:58,448
He's also the co creator
of the online IDE Glitch.

20
00:00:58,928 --> 00:01:03,138
In this conversation, we talk about
his journey as a creative, including

21
00:01:03,138 --> 00:01:07,358
his time at Fog Creek and later
building Kinopio as a solo developer.

22
00:01:07,958 --> 00:01:11,128
Before getting started, also a
big thank you to Expo and Crab

23
00:01:11,128 --> 00:01:12,918
Nebula for supporting this podcast.

24
00:01:13,378 --> 00:01:15,348
And now my interview with Pirijan.

25
00:01:17,304 --> 00:01:19,094
Hey Pirijan, nice to meet you.

26
00:01:19,144 --> 00:01:20,904
Thank you so much for coming on the show.

27
00:01:20,904 --> 00:01:21,664
How are you doing?

28
00:01:21,874 --> 00:01:22,754
Hey, thanks for having me.

29
00:01:22,754 --> 00:01:23,984
I'm doing quite well.

30
00:01:24,764 --> 00:01:28,494
So for those of us who don't know you,
could you give a quick background?

31
00:01:29,184 --> 00:01:29,524
Sure.

32
00:01:29,524 --> 00:01:29,834
Yeah.

33
00:01:29,834 --> 00:01:31,074
So my name's Pirijan.

34
00:01:31,094 --> 00:01:37,424
Uh, I'm the creator and mostly sole
developer and designer of Kinopio.

35
00:01:37,444 --> 00:01:40,494
club, uh, a mind mapping
and creative thinking tool.

36
00:01:40,684 --> 00:01:44,354
Uh, but before that I worked
at Fog Creek, um, and.

37
00:01:44,554 --> 00:01:48,814
Uh, specifically, uh, at a time
where the Trello office was there

38
00:01:48,814 --> 00:01:50,634
and Stack Overflow had just spun out.

39
00:01:50,704 --> 00:01:53,624
And I eventually went
on to co create Glitch.

40
00:01:53,774 --> 00:01:56,964
com, the, uh, web editing
development environment.

41
00:01:57,074 --> 00:01:59,344
Uh, that's just a cool
community of building apps.

42
00:01:59,474 --> 00:02:00,834
That sounds fascinating.

43
00:02:00,894 --> 00:02:05,559
So, Maybe some of us have heard
of Trello and Stack Overflow, or

44
00:02:05,559 --> 00:02:09,309
certainly have heard of those, but
maybe not quite about Fog Creek.

45
00:02:09,539 --> 00:02:12,789
So I think that's quite a long
journey, but could you give a bit more

46
00:02:12,809 --> 00:02:17,559
background on Fog Creek and the really
monumental projects that came out of it?

47
00:02:18,004 --> 00:02:23,164
Yeah, so Fog Creek, as I understand
it, was founded by Joel Sposky and

48
00:02:23,224 --> 00:02:26,384
Michael Pryor, way back when, a
long time ago, in New York City.

49
00:02:26,434 --> 00:02:29,864
Their premise was, let's make the best
place for programmers to work, which was

50
00:02:29,864 --> 00:02:32,414
a wild and crazy concept at the time.

51
00:02:32,474 --> 00:02:36,419
And from there, um, Fog Creek
kind of acted as an incubator.

52
00:02:36,429 --> 00:02:41,729
So they developed Stack Overflow and
they, let's see, I'm trying to remember

53
00:02:41,729 --> 00:02:45,389
the timeline here, but, um, eventually
Stack Overflow got really big and they

54
00:02:45,389 --> 00:02:49,389
moved to a slightly different building
in the New York financial district.

55
00:02:49,669 --> 00:02:54,709
And Trello grew the same way and for
a long time shared the office with Fog

56
00:02:54,709 --> 00:02:58,729
Creek and Fog Creek would develop its
own bug tracker which kind of they used

57
00:02:58,729 --> 00:03:03,639
to fund the development of new projects
and the third project that was being

58
00:03:03,639 --> 00:03:05,719
developed after Trello was Glitch.

59
00:03:05,884 --> 00:03:10,864
So how did you find your way to Fog
Creek and what led you to work on Glitch?

60
00:03:11,044 --> 00:03:11,494
Oh, wow.

61
00:03:11,494 --> 00:03:11,994
Okay.

62
00:03:12,054 --> 00:03:16,574
So it actually kind of came from a couple
of jobs I've been working at previously.

63
00:03:16,604 --> 00:03:19,394
So I went to school actually
for biology and urban planning.

64
00:03:19,424 --> 00:03:25,324
And while as an urban planner, I kind
of got into a love for map making

65
00:03:25,344 --> 00:03:27,294
and visualizations and illustration.

66
00:03:27,344 --> 00:03:30,804
And that kind of led me to a job
in tech where I started as an

67
00:03:30,804 --> 00:03:34,304
illustrator, then became a designer
and then became a developer.

68
00:03:34,474 --> 00:03:37,454
To build things that I designed,
it's kind of a trial by fire.

69
00:03:37,454 --> 00:03:41,634
But in all those jobs, the other thing
that was new to me was using a bug tracker

70
00:03:41,644 --> 00:03:46,214
and a lot of the companies that I worked
for, uh, used Fog Bugs, the Fog Creek

71
00:03:46,214 --> 00:03:51,064
bug tracker, and it wasn't the greatest
product and it kind of inspired me.

72
00:03:51,349 --> 00:03:55,589
To like want to make a better version,
like as a designer first, I kind of

73
00:03:55,589 --> 00:03:58,349
came up with concepts and new ideas.

74
00:03:58,359 --> 00:04:02,509
Like how could Fog Bugs work if it was
designed around more of a human workflow

75
00:04:02,509 --> 00:04:04,169
as opposed to more of a managerial one.

76
00:04:04,199 --> 00:04:07,989
And so I put a lot of those mock ups up
on Dribbble when Dribbble was a thing.

77
00:04:08,079 --> 00:04:11,919
And the leadership from Fog Creek saw
it, uh, flew me over to New York and

78
00:04:11,919 --> 00:04:15,239
asked me if I wanted to work there
and eventually that's what I did.

79
00:04:15,564 --> 00:04:16,634
That sounds amazing.

80
00:04:16,704 --> 00:04:19,834
So yeah, tell me a bit more
about like how Glitch then came

81
00:04:19,834 --> 00:04:21,524
to be and how it took shape.

82
00:04:21,614 --> 00:04:26,614
And I think you also shared some of the
design principles that you arrived at

83
00:04:26,614 --> 00:04:30,704
for, for Glitch on a great blog post
that we'll also link in the show notes.

84
00:04:31,104 --> 00:04:33,054
So I'm curious to learn more about that.

85
00:04:33,314 --> 00:04:33,714
Sure.

86
00:04:33,754 --> 00:04:34,074
Yeah.

87
00:04:34,074 --> 00:04:38,094
So, so at the time they had
Trello and Stack Overflow, and

88
00:04:38,094 --> 00:04:40,064
both were really big successes.

89
00:04:40,154 --> 00:04:44,014
Now Trello was still independent,
so it wasn't bought by Atlassian

90
00:04:44,014 --> 00:04:47,054
at the time and was also on its
way to be a really big success.

91
00:04:47,104 --> 00:04:50,924
And the company leadership
wanted to figure out what

92
00:04:50,924 --> 00:04:51,824
they were going to do next.

93
00:04:51,824 --> 00:04:53,634
What would be their third big thing?

94
00:04:53,664 --> 00:04:57,784
So what they did was they held what they
called a Creek Week, which was a couple

95
00:04:57,784 --> 00:05:01,154
of people who were interested, could
independently arrange teams and come up

96
00:05:01,154 --> 00:05:03,364
with like ideas of what we should work on.

97
00:05:03,544 --> 00:05:04,674
And there were some pretty good ideas.

98
00:05:05,134 --> 00:05:08,424
But the one that eventually
went out was the one by me and

99
00:05:08,424 --> 00:05:10,744
Daniel X that became Glitch.

100
00:05:10,764 --> 00:05:14,614
It was a web development interface
where you didn't have to download

101
00:05:14,614 --> 00:05:16,654
an ID or set up a server.

102
00:05:16,969 --> 00:05:19,699
Or, you know, figure out how
Git works or anything like that.

103
00:05:19,699 --> 00:05:21,889
You just start typing
and you have a real Node.

104
00:05:21,889 --> 00:05:24,459
js app at your fingertips immediately.

105
00:05:24,559 --> 00:05:29,989
And so, yeah, like over time, we sort
of, every week we build it a little

106
00:05:29,989 --> 00:05:33,409
bit more and demo it to leadership
and every week it would crash.

107
00:05:33,559 --> 00:05:36,279
And then one day they were just
like, Hey, what if we added.

108
00:05:36,634 --> 00:05:40,814
real time collaboration to this and so
that's what we did and that's what it

109
00:05:40,824 --> 00:05:45,304
has and you know like it started as like
this project where we were working really

110
00:05:45,304 --> 00:05:50,144
closely with Joel and then eventually
the rest of the company as the team

111
00:05:50,144 --> 00:05:56,364
opened up and yeah it eventually grew to
subsume so unfortunately, um, Fog Creek

112
00:05:56,364 --> 00:05:58,494
is like pretty much dead as a company.

113
00:05:58,544 --> 00:06:02,334
Glitch, it kind of got renamed to
Glitch and then Glitch was bought.

114
00:06:03,274 --> 00:06:07,274
Well, as they say, all good
things come to an end, but it's,

115
00:06:07,284 --> 00:06:09,164
it's been a phenomenal product.

116
00:06:09,224 --> 00:06:14,924
And I think it had just such a distinct
vibe and visual aesthetic and feel

117
00:06:14,924 --> 00:06:19,254
to it, particularly at a time when I
remember like a lot of products just

118
00:06:19,254 --> 00:06:23,924
kind of felt the same, like spoke the
same, imitated the same design language.

119
00:06:24,324 --> 00:06:27,984
And Glitch really like, not just the
name stood out, but the visuals, like

120
00:06:28,014 --> 00:06:29,964
the feel of it, all of it stood out.

121
00:06:30,394 --> 00:06:33,394
So I'm curious, like, what was
the inspiration for that and

122
00:06:33,394 --> 00:06:34,394
what was the goal for that?

123
00:06:34,494 --> 00:06:34,814
Yeah.

124
00:06:34,814 --> 00:06:36,834
Glitch was actually a
really interesting project.

125
00:06:36,864 --> 00:06:40,254
I mean, I guess in a lot of ways it was
a dream project because you get to make

126
00:06:40,254 --> 00:06:45,094
a product from the beginning, kind of
help define the team and you're doing

127
00:06:45,094 --> 00:06:48,744
so like without having to worry about
money, which is like pretty amazing.

128
00:06:48,774 --> 00:06:50,024
The big bet on Glitch was that.

129
00:06:50,439 --> 00:06:52,289
There's a middle market of developers.

130
00:06:52,299 --> 00:06:56,229
So everybody knows there's the pro
developer who's like, I am on Vim all day.

131
00:06:56,459 --> 00:06:58,679
I can SSH into whatever,
and I'm super great.

132
00:06:58,939 --> 00:07:02,979
And then there's the beginner side, which
is like, Hey, I'm learning MIT scratch.

133
00:07:02,979 --> 00:07:08,629
I'm, I'm doing like, like tutorials
on how to make like, you know, like

134
00:07:08,629 --> 00:07:11,479
a really simple to do list, but then
we thought there's this big kind of

135
00:07:11,519 --> 00:07:17,089
in the middle of these two developer
markets where people want to code with

136
00:07:17,099 --> 00:07:21,929
real code, not like, you know, building
blocks and abstractions, but they also

137
00:07:21,939 --> 00:07:25,849
kind of are kind of turned off by a lot
of the configuration like they could

138
00:07:25,859 --> 00:07:28,049
do it, but it's kind of like a pain.

139
00:07:28,059 --> 00:07:30,359
And if they want to make, like,
a small project or try stuff

140
00:07:30,389 --> 00:07:31,619
out, it's kind of beneath them.

141
00:07:31,749 --> 00:07:32,579
And so that was our bet.

142
00:07:32,599 --> 00:07:35,599
And so, like, we thought, okay, this
is going to be like a different.

143
00:07:35,794 --> 00:07:38,894
market of developers, they're going
to have a different vibe, let's say.

144
00:07:38,924 --> 00:07:43,394
So we tried to get away from the, every
developer tool has to look like serious

145
00:07:43,404 --> 00:07:47,064
fortune 500 enterprise grade, you know,
software and more like, Hey, what's

146
00:07:47,064 --> 00:07:49,734
something, what's the, like a beautiful
thing you would actually want to use?

147
00:07:49,734 --> 00:07:53,044
And we kind of took inspiration
from vintage computers.

148
00:07:53,314 --> 00:07:56,664
Uh, you know, there's a lot of Macintosh,
classic Macintosh inspiration in there,

149
00:07:56,864 --> 00:08:00,764
but we also took inspiration from, I took
inspiration from a little bit of like

150
00:08:00,774 --> 00:08:06,404
pop fashion and also just like, yeah,
burgeoning trends in, in, uh, programming.

151
00:08:06,754 --> 00:08:10,824
That were just happening by people
kind of outside of like the then

152
00:08:10,824 --> 00:08:12,944
classic definition of a programmer.

153
00:08:13,074 --> 00:08:17,684
Yeah, I mean, I, I think you, you greatly
succeeded at the very least of like just

154
00:08:17,784 --> 00:08:23,184
setting Glitch apart in terms of the, the
feel and, and, and using it was so cool.

155
00:08:23,234 --> 00:08:25,383
I remember like I, I
used it for a few years.

156
00:08:25,383 --> 00:08:26,403
Few smaller apps.

157
00:08:26,423 --> 00:08:30,633
And I think we also looked at it back
then at Prisma actually for, for using

158
00:08:30,633 --> 00:08:34,613
it for, for example, apps, but while
like, I think you'd try to really make it

159
00:08:34,613 --> 00:08:39,813
very easily accessible for beginners and
sort of that mid segment of the market.

160
00:08:39,843 --> 00:08:43,103
I'm sure there were many, many
interesting challenges to actually

161
00:08:43,123 --> 00:08:44,873
make the product work under the hood.

162
00:08:45,023 --> 00:08:48,823
Are there any sort of anecdotes
that still come to mind when

163
00:08:48,823 --> 00:08:49,943
you think back of that time?

164
00:08:50,093 --> 00:08:52,473
Yeah, this might be a problem that
doesn't exist anymore, but I think

165
00:08:52,473 --> 00:08:56,133
it's kind of an interesting one to, to
think about even in today's context.

166
00:08:56,133 --> 00:08:59,813
So, you know, nowadays we
have really great browser data

167
00:08:59,813 --> 00:09:01,613
binding frameworks like Vue.

168
00:09:01,613 --> 00:09:02,713
js and, and React.

169
00:09:02,903 --> 00:09:06,953
But back then those projects were either
didn't exist or were very much in their

170
00:09:06,953 --> 00:09:10,763
infancy and definitely not production
grade, even in the relatively small

171
00:09:10,763 --> 00:09:12,833
production grade of Glitch at the time.

172
00:09:13,103 --> 00:09:15,473
So Daniel X, the other co creator.

173
00:09:15,733 --> 00:09:18,943
Of, uh, of glitch, he had
his own pet framework called

174
00:09:18,953 --> 00:09:20,863
Jade and it had data binding.

175
00:09:20,873 --> 00:09:22,163
It kind of did what we wanted to do.

176
00:09:22,163 --> 00:09:26,153
And also obviously we had support by
the person who created like Jade is like

177
00:09:26,153 --> 00:09:30,823
a HTML transpiler, which is renamed to
Pug, but there was another technology.

178
00:09:30,833 --> 00:09:35,823
It was like Jade lit or something Jade
related added data binding functionality

179
00:09:35,953 --> 00:09:38,533
and like a like component state to Jade.

180
00:09:38,873 --> 00:09:40,103
And so we use that.

181
00:09:40,288 --> 00:09:44,708
And it worked really great, but obviously
it came with the problems, um, same

182
00:09:44,708 --> 00:09:47,618
with, we also use CoffeeScript by the
way, but it also all that our tech

183
00:09:47,618 --> 00:09:49,988
stack kind of came into, had issues.

184
00:09:50,048 --> 00:09:55,488
When new people joined, there was a lot to
figure out, a lot of new, crazy wild code.

185
00:09:55,588 --> 00:09:58,128
But yeah, it was like a, it was
like a really interesting place

186
00:09:58,148 --> 00:10:01,888
because we had to build the framework
and the tool, not just the tool.

187
00:10:01,928 --> 00:10:05,378
And I think we made some good choices and
we made some bad choices in that front.

188
00:10:05,583 --> 00:10:09,473
But actually like Daniel X is still
out there creating Civet, which is kind

189
00:10:09,473 --> 00:10:11,093
of like a successor to CoffeeScript.

190
00:10:11,433 --> 00:10:14,163
Uh, he wouldn't let the dream
die, which I think is really cool.

191
00:10:14,213 --> 00:10:19,733
And yeah, I think, um, just being
really early on a technology.

192
00:10:19,773 --> 00:10:23,333
I mean, the web's not really like new or
anything and it wasn't new at the time,

193
00:10:23,333 --> 00:10:27,733
but this idea of web sites as web apps,
single page apps, that was all kind of

194
00:10:27,733 --> 00:10:29,863
like, burgeoning technology at the time.

195
00:10:29,873 --> 00:10:33,213
One of the reasons why Glitch was so
kind of appreciated when it launched, one

196
00:10:33,213 --> 00:10:35,553
was like, you know, the visual design,
which is kind of a little bit of love

197
00:10:35,553 --> 00:10:39,983
hate it, but very memorable, but also
like everything reacted very immediately.

198
00:10:40,043 --> 00:10:42,903
You know, you could rename something
in one panel and see it change

199
00:10:42,903 --> 00:10:46,483
in another panel, which at the
time was like pretty magical.

200
00:10:46,483 --> 00:10:47,733
It's the magic of data binding.

201
00:10:47,733 --> 00:10:50,593
I thought of it as like a
totally new tool for a designer.

202
00:10:50,653 --> 00:10:55,173
Yeah, that certainly rings true of like
those sort of new superpowers that you

203
00:10:55,173 --> 00:10:59,653
slowly but surely like convince yourself
that's possible in the web, but then

204
00:10:59,663 --> 00:11:01,813
also trying to actually make that work.

205
00:11:01,963 --> 00:11:05,693
Particularly so early in the web,
that's kind of going in hard mode.

206
00:11:05,943 --> 00:11:08,843
That seems to be a bit of a
recurring theme across different

207
00:11:08,853 --> 00:11:10,443
episodes that we've done so far.

208
00:11:11,153 --> 00:11:17,213
So I think by now we've like elevated
a little bit to a new plateau of new

209
00:11:17,213 --> 00:11:22,103
challenges, and now we're trying to figure
out like the next generation of problems

210
00:11:22,113 --> 00:11:26,843
where we get new APIs, but there's also
new challenges and new unsolved problems.

211
00:11:27,253 --> 00:11:29,503
So I I'm, but I'm excited about it.

212
00:11:29,553 --> 00:11:30,593
There's lots of.

213
00:11:30,733 --> 00:11:32,403
Good stuff to, to dig into.

214
00:11:32,553 --> 00:11:38,103
So after Fog Creek and working on Glitch,
you've been moving on at some point.

215
00:11:38,183 --> 00:11:42,883
And I'm curious what were like the
questions that were top of mind for you?

216
00:11:42,893 --> 00:11:45,673
Were there any things that you
wanted to explore in particular?

217
00:11:45,913 --> 00:11:46,233
Yeah.

218
00:11:46,233 --> 00:11:50,123
So I kind of took some time off after
working Glitch, either to figure out what

219
00:11:50,123 --> 00:11:54,303
I wanted to make next or what I wanted,
like what I wanted to do essentially.

220
00:11:54,303 --> 00:11:57,523
Like a lot of us after Glitch were a
little burned out on coding and design.

221
00:11:57,533 --> 00:11:57,973
So.

222
00:11:58,168 --> 00:12:01,478
One of the things I kept coming
back to was bug tracking.

223
00:12:01,488 --> 00:12:03,988
So, like, that was how I
got my job at Fog Creek.

224
00:12:04,008 --> 00:12:07,778
But also, like, something I
feel like still wasn't solved.

225
00:12:07,778 --> 00:12:10,528
And actually, to be honest, I
feel like it kind of isn't either.

226
00:12:10,528 --> 00:12:12,568
But I have strong opinions
on bug tracking, actually.

227
00:12:12,568 --> 00:12:16,408
But anyways, what I started
doing was building or designing

228
00:12:16,468 --> 00:12:17,958
a different take on bug tracking.

229
00:12:18,028 --> 00:12:20,048
And it was okay for a time.

230
00:12:20,418 --> 00:12:23,508
Like it was kind of making forward
progress, but when I showed it to

231
00:12:23,518 --> 00:12:27,108
people, even just regular people,
like, and, or developers, neither

232
00:12:27,108 --> 00:12:30,248
groups were very impressed like
they're like, Oh, it's like maybe 1.

233
00:12:30,248 --> 00:12:35,518
2 X better or maybe 2 X better at
most, but it's not 10 X better.

234
00:12:35,518 --> 00:12:38,828
It's not something that would cause
me to like change my habits or,

235
00:12:38,848 --> 00:12:40,228
you know, adopt a different tool.

236
00:12:40,518 --> 00:12:45,238
But it also, it doesn't seem like building
a bug tracker is taking advantage of, of

237
00:12:45,238 --> 00:12:49,428
what you kind of uniquely do, which is,
you know, Design plus development to make

238
00:12:49,428 --> 00:12:51,558
something kind of a little more unique.

239
00:12:51,638 --> 00:12:55,168
And so, you know, I thought about that
feedback for a little while and yeah,

240
00:12:55,168 --> 00:12:57,388
it kind of hit me like a Eureka moment.

241
00:12:57,428 --> 00:12:59,268
All this time I'd been designing things.

242
00:12:59,388 --> 00:13:02,058
I'd been using sketch, which
is, you know, like Mac OS Sigma,

243
00:13:02,328 --> 00:13:03,778
and I'd be using the text tool.

244
00:13:03,808 --> 00:13:07,328
So like I'd have my mock up and then with
the text tool, I'd write like, here's

245
00:13:07,328 --> 00:13:10,198
why I did this thing, or here's what's
missing, or here's what I need to do

246
00:13:10,208 --> 00:13:13,918
using the freeform text tool to just click
anywhere on the canvas and type things.

247
00:13:13,918 --> 00:13:17,098
And I thought, this is
like a really great.

248
00:13:17,438 --> 00:13:21,608
way to like organize my thoughts
and figure out what I'm doing next.

249
00:13:21,688 --> 00:13:24,788
And fundamentally the issue with
bug tracking isn't tracking bugs.

250
00:13:24,788 --> 00:13:27,898
It's communicating between
people about what we need to do.

251
00:13:27,898 --> 00:13:30,248
And I thought, what if
this was the answer?

252
00:13:30,248 --> 00:13:33,088
Like, what if the ability to write
anything anywhere and connect

253
00:13:33,088 --> 00:13:35,028
information to anything anywhere.

254
00:13:35,148 --> 00:13:39,078
And the idea of not having a
structure up front was the product.

255
00:13:39,078 --> 00:13:42,798
Like, what if I could bring this
superpower to like, People who didn't

256
00:13:42,808 --> 00:13:47,018
have design software didn't want to
bother to her have to learn how to use it.

257
00:13:47,048 --> 00:13:49,608
And also design software is
not made for this sort of task.

258
00:13:49,798 --> 00:13:51,858
It doesn't use structured
data for any of this stuff.

259
00:13:52,138 --> 00:13:54,458
So that's kind of where the
original idea for glitch kind

260
00:13:54,458 --> 00:13:55,938
of came from this idea of just.

261
00:13:56,598 --> 00:14:01,118
Clicking anywhere and typing a node
and, you know, free form manipulation

262
00:14:01,118 --> 00:14:04,328
of that, which was a bit more of a
novel concept than it is these days,

263
00:14:04,358 --> 00:14:07,958
but basically from that, I kind of
started and ended up with a mock up

264
00:14:08,058 --> 00:14:12,018
like a design that five years later
still seems like it was pretty accurate.

265
00:14:12,038 --> 00:14:16,158
Like I ended up just building and building
from that and also being kind of moved

266
00:14:16,158 --> 00:14:18,058
in new directions by people's feedback.

267
00:14:18,068 --> 00:14:22,458
And yeah, the, the thing that exists
now is actually eerily similar

268
00:14:22,458 --> 00:14:26,518
to the thing that was kind of
envisioned five, five years ago,

269
00:14:26,518 --> 00:14:27,948
which means it was pretty good idea.

270
00:14:28,208 --> 00:14:31,938
So the, the project that you're
describing is Kinopio, right?

271
00:14:32,038 --> 00:14:32,578
Yes.

272
00:14:32,953 --> 00:14:38,343
So that seems to have originated
from still that urge to figure out

273
00:14:38,343 --> 00:14:42,853
a better way to build a bug tracker,
but I think has evolved since then

274
00:14:42,883 --> 00:14:45,683
in terms of its vision and goals.

275
00:14:45,983 --> 00:14:49,993
So how would you frame today what
the goals and vision for Kinopio is?

276
00:14:50,303 --> 00:14:51,233
Yeah, that's interesting.

277
00:14:51,233 --> 00:14:56,123
I think the goals for Kinopio is to kind
of enable people to think through problems

278
00:14:56,123 --> 00:15:00,173
by themselves or collaboratively without
needing to kind of define a structure

279
00:15:00,173 --> 00:15:04,973
up front, but also being able to, like
add a structure as needed as they go.

280
00:15:04,973 --> 00:15:09,713
And so people can use it for
retrospectives for, for meeting notes

281
00:15:09,713 --> 00:15:13,453
or personal notes, research notes,
but also for like, like traditional

282
00:15:13,453 --> 00:15:16,573
mind mapping and excels at, um, but
I've also seen people use it for

283
00:15:16,573 --> 00:15:18,763
mood boards and personal websites.

284
00:15:18,813 --> 00:15:22,433
It's kind of like a, yeah, it's a,
it's a canvas, but it's a very like

285
00:15:22,433 --> 00:15:26,313
expressive one, but also one that
kind of has like productivity roots.

286
00:15:26,548 --> 00:15:31,518
Yeah, so I definitely encourage
every listener afterwards to go check

287
00:15:31,528 --> 00:15:35,618
out the show notes and open some
of those beautiful Kinopio boards.

288
00:15:35,688 --> 00:15:39,568
They really feel like nothing
you've ever seen on the web.

289
00:15:39,588 --> 00:15:43,178
They feel like very tactile
and playful, et cetera.

290
00:15:43,198 --> 00:15:45,818
So, uh, it just seems very fun.

291
00:15:46,258 --> 00:15:51,828
So I'm curious, what are some of the
design principles that you had in mind

292
00:15:51,848 --> 00:15:53,758
when you designed and built this product?

293
00:15:53,928 --> 00:16:00,308
Um, so I guess I had five main principles,
so I can, I can talk about them.

294
00:16:00,468 --> 00:16:02,268
First to embrace smallness.

295
00:16:02,403 --> 00:16:06,673
To build for fidgetability, to
embrace plain text, to have a simple

296
00:16:06,673 --> 00:16:10,313
interface for mobile and desktop, and
the fifth is to refine by pruning.

297
00:16:10,633 --> 00:16:14,723
But I think overall, at a high, high
level, I kind of wanted to recreate the

298
00:16:14,723 --> 00:16:18,043
feel of interacting tangibly with paper.

299
00:16:18,213 --> 00:16:22,103
And not necessarily do that by imitating
paper, so a lot of apps fall into the the

300
00:16:22,103 --> 00:16:26,013
trap of like, hey, we want to like make
something that feels like a scrapbook.

301
00:16:26,013 --> 00:16:30,193
So let's have like frayed edges
around everything and like a papery

302
00:16:30,193 --> 00:16:34,433
texture and make little like, like
pen noises when you type and stuff.

303
00:16:34,463 --> 00:16:38,983
And actually, I think what makes
tangible or like physical interfaces,

304
00:16:38,983 --> 00:16:42,033
for lack of a better word, feel
good is the immediate feel of that

305
00:16:42,033 --> 00:16:43,513
reaction and the quickness of it.

306
00:16:43,603 --> 00:16:45,873
And I try to carry that
forward in Kinopio.

307
00:16:45,983 --> 00:16:48,953
So you'll notice like you just hover
over a card and it kind of sticks

308
00:16:48,963 --> 00:16:52,043
to your mouth just a little bit to
give you like a like a feeling of

309
00:16:52,043 --> 00:16:56,633
you're just kind of moving your hand
and fidgeting over a piece of paper.

310
00:16:56,783 --> 00:17:00,533
When you go to add information, you're
not presented with like, hey, do

311
00:17:00,533 --> 00:17:02,073
you want to like add a sticky note?

312
00:17:02,073 --> 00:17:04,943
Or do you want to add like
a video clip or an image?

313
00:17:05,103 --> 00:17:06,263
Like you don't have to make a choice.

314
00:17:06,293 --> 00:17:11,423
You just kind of click to add the card
and then you can type whatever you want.

315
00:17:11,453 --> 00:17:14,663
And if you want to add an image, you
can add an image to that card either

316
00:17:14,673 --> 00:17:20,038
by dragging an image or just by pasting
in any web URL, uh, same for websites.

317
00:17:20,088 --> 00:17:25,978
Yeah, it's a sort of like idea of like,
we have text fields, we have regex, with

318
00:17:25,978 --> 00:17:30,798
the combination of those two things, we
know whether something inside that field

319
00:17:30,968 --> 00:17:34,668
is like a link or a file or an image.

320
00:17:35,038 --> 00:17:36,078
We can do the right thing.

321
00:17:36,078 --> 00:17:39,438
We don't have to, like, have a toolbar on
the side of the screen where people have

322
00:17:39,438 --> 00:17:43,568
to, like, before they add any information,
decide what kind of information is it?

323
00:17:43,838 --> 00:17:48,298
I just want to get rid of all that
barriers and just have things as

324
00:17:48,368 --> 00:17:50,508
immediate and fast and fluid as possible.

325
00:17:50,508 --> 00:17:53,298
And I think in that way, you
recreate the feeling of working

326
00:17:53,298 --> 00:17:54,598
with like a physical tool.

327
00:17:54,648 --> 00:17:55,418
I love that.

328
00:17:55,478 --> 00:18:00,638
You draw such a stark contrast compared
to so many other web tools that you're

329
00:18:00,638 --> 00:18:06,618
used to, where I think most tools feel
much more like material UI, et cetera,

330
00:18:06,618 --> 00:18:12,328
like very forum oriented, like very,
like all the inputs feel very similar.

331
00:18:12,348 --> 00:18:17,718
And I think the software that you've
built with Kinopio feel very tactile

332
00:18:17,738 --> 00:18:19,728
and very tangible and very playful.

333
00:18:20,158 --> 00:18:24,798
So I'm curious which sort of patterns
you figured out there that you would also

334
00:18:24,808 --> 00:18:29,028
encourage other builders to embrace more
where you'd say like, Oh, we're kind of

335
00:18:29,088 --> 00:18:31,508
over complicating much of our software.

336
00:18:31,508 --> 00:18:35,488
We could just let the user go with their
intuition and let's just make that work.

337
00:18:35,488 --> 00:18:38,688
So are there any patterns that
you figured out that you thought

338
00:18:38,718 --> 00:18:42,238
like, okay, they might be hard to
implement, but they're really worth it.

339
00:18:42,538 --> 00:18:43,668
Curious to hear more on that.

340
00:18:44,158 --> 00:18:47,618
Yeah, I think the reason a lot of
our tools are the way they are, they

341
00:18:47,618 --> 00:18:51,208
reflect kind of the way the teams
that build those tools are organized.

342
00:18:51,238 --> 00:18:54,268
So you have your engineering team
and you have your design team.

343
00:18:54,578 --> 00:18:58,258
And they both don't fully understand
what's possible, because maybe

344
00:18:58,258 --> 00:19:00,698
they're not speaking to each
other as well as they should be.

345
00:19:00,778 --> 00:19:04,418
But because of that disconnect, the
design team might not understand that,

346
00:19:04,778 --> 00:19:08,793
you know, like anything can be, Intuitive
essentially like you can figure out if

347
00:19:08,793 --> 00:19:13,683
something is some kind of data model, you
know, just based on what it is And they

348
00:19:13,683 --> 00:19:17,993
may just be told here's like the database
model at best and be like we need to fit

349
00:19:18,013 --> 00:19:22,743
things into this essentially Excel chart
make make an interface for this and you

350
00:19:22,743 --> 00:19:26,293
end up with a lot more steps than you you
may not necessarily have and conversely

351
00:19:26,293 --> 00:19:31,223
developers Might see an interface,
propose to them and not really push back

352
00:19:31,223 --> 00:19:35,473
or not want to not necessarily want to
rock the boat too much by explaining,

353
00:19:35,473 --> 00:19:37,203
Hey, maybe we don't need this step.

354
00:19:37,203 --> 00:19:41,663
It kind of requires the programmer
to also kind of take on a little

355
00:19:41,663 --> 00:19:45,603
bit of characteristics of a
designer, like by looking for, Hey,

356
00:19:45,613 --> 00:19:46,813
where are the points of friction?

357
00:19:46,853 --> 00:19:50,113
Can they be reduced maybe in ways
that people don't anticipate?

358
00:19:50,333 --> 00:19:54,153
I guess nowadays, like the hot thing is
AI and maybe there are like legitimately

359
00:19:54,153 --> 00:20:00,058
useful points in an interface where AI
could, could make a difference that people

360
00:20:00,088 --> 00:20:04,328
don't recognize, because again, what one
group knows and what another group knows

361
00:20:04,358 --> 00:20:06,698
may not necessarily be the whole picture.

362
00:20:06,978 --> 00:20:10,468
So you mentioned text, drag
eggs, images, et cetera.

363
00:20:10,498 --> 00:20:14,018
Are there any particular
implementation patterns that you feel

364
00:20:14,018 --> 00:20:15,898
like, okay, this is like a trick.

365
00:20:15,948 --> 00:20:19,418
I'm going to use this across different
projects in the future, no matter what.

366
00:20:19,803 --> 00:20:22,803
Oh, yeah, I think this is becoming more
and more normalized, but I think the

367
00:20:22,803 --> 00:20:27,153
big thing that I still see on a day to
day basis that a lot of apps get wrong

368
00:20:27,193 --> 00:20:30,983
is this idea of like, I'm submitting
some information in a field, whatever

369
00:20:30,983 --> 00:20:35,793
form that field may take, and I've got
to wait for the server to like get that

370
00:20:35,793 --> 00:20:39,303
information and come back to me saying,
hey, it's a 200 before the interface

371
00:20:39,303 --> 00:20:40,913
will let me go on to the next step.

372
00:20:41,173 --> 00:20:42,683
And like 99.

373
00:20:42,723 --> 00:20:45,363
99 percent of the time,
that's going to be a 200.

374
00:20:45,483 --> 00:20:48,688
So I think The interface can
just assume it's good, it's a

375
00:20:48,728 --> 00:20:52,598
200, and just assume success is
what I like to call that pattern.

376
00:20:52,838 --> 00:20:55,348
Uh, if you assume success, then
the user puts an input in and

377
00:20:55,348 --> 00:20:58,098
immediately is able to keep
working on whatever else they want.

378
00:20:58,308 --> 00:21:02,798
If they do multiple things at once,
those atomic inputs just happen and are

379
00:21:02,798 --> 00:21:06,258
assumed to be successful unless they
fail, which is, you know, unlikely.

380
00:21:06,528 --> 00:21:10,453
But, It lets you create like, you
know, really fast, really responsive

381
00:21:10,603 --> 00:21:12,523
to inputs web applications.

382
00:21:12,643 --> 00:21:16,033
So I think another term that's
commonly used to describe this

383
00:21:16,033 --> 00:21:20,563
pattern is optimistic updates, which
I think if you want to take it some

384
00:21:20,563 --> 00:21:22,153
steps further, this is where that.

385
00:21:22,603 --> 00:21:25,563
And certainly points you in
the direction of Local-First.

386
00:21:25,963 --> 00:21:30,813
So based on our prior conversations,
it sounded like you did not build

387
00:21:30,813 --> 00:21:35,583
out Kinopio from the start with like
Local-First as sort of like the technical

388
00:21:35,583 --> 00:21:41,843
goal post in mind, but you've rather
worked on it over time and ended up in a

389
00:21:41,843 --> 00:21:46,723
direction that has many similarities with
Local-First, such as that the app works

390
00:21:46,753 --> 00:21:49,393
offline, it is collaborative, et cetera.

391
00:21:49,503 --> 00:21:51,343
So I'm curious to hear more about.

392
00:21:51,773 --> 00:21:54,773
The similarities that you see
with Local-First and also learn

393
00:21:54,773 --> 00:21:56,153
more about the tech architecture.

394
00:21:56,193 --> 00:21:59,953
Yeah, I guess another way that I'd put it
is like, I only learned about Local-First

395
00:22:00,223 --> 00:22:01,903
after I'd built a Local-First app.

396
00:22:01,923 --> 00:22:04,563
So I didn't know that there was
this community of people like

397
00:22:04,563 --> 00:22:07,543
really pushing for, for that
particular style of building.

398
00:22:07,543 --> 00:22:10,913
But for me, it was kind of a
more natural or organic path.

399
00:22:10,913 --> 00:22:11,403
So, yeah.

400
00:22:11,918 --> 00:22:14,638
Kinopio is the web client
but it's also the server.

401
00:22:14,638 --> 00:22:17,678
The server is a source of truth for
data, especially when you collaborate

402
00:22:17,708 --> 00:22:20,888
or if you switch devices, you need
that information accessible anywhere.

403
00:22:21,028 --> 00:22:23,188
But I didn't start with a
server, I started with just the

404
00:22:23,188 --> 00:22:26,658
client and I, I released pretty
early to get people's feedback.

405
00:22:26,658 --> 00:22:31,053
So, I basically, taking a pattern
from what we did with Glitch, I save

406
00:22:31,073 --> 00:22:35,623
information, your local state essentially,
to local storage in the browser.

407
00:22:35,893 --> 00:22:41,133
So I stringify a JSON object and
throw it in there and deserialize

408
00:22:41,143 --> 00:22:42,933
it as needed to read from it.

409
00:22:42,983 --> 00:22:45,893
Which sounds onerous, but it's
actually really fast, and I still

410
00:22:45,893 --> 00:22:47,203
haven't had a reason to replace it.

411
00:22:47,203 --> 00:22:51,708
But anyways, like, By having that as
sort of like the fundamental source

412
00:22:51,708 --> 00:22:55,968
of information initially, especially,
it's let me, um, do a couple things

413
00:22:55,978 --> 00:22:59,958
that apps don't do is one, it helps
with those optimistic updates.

414
00:23:00,048 --> 00:23:02,488
It lets me load information faster.

415
00:23:02,528 --> 00:23:07,568
So if you refresh Knopio, you don't have
to reload your space or board information.

416
00:23:07,568 --> 00:23:08,408
It's already there.

417
00:23:08,628 --> 00:23:11,918
And then it kind of gets updated
when the source of truth arrives.

418
00:23:12,108 --> 00:23:15,428
If there's any discrepancies, the
other thing it lets me do, uh,

419
00:23:15,448 --> 00:23:16,878
which I think is even more unique.

420
00:23:17,003 --> 00:23:19,443
is you can use Kinopio
without having to sign up.

421
00:23:19,743 --> 00:23:23,393
So you go there and the first
thing you see is this like sample

422
00:23:23,403 --> 00:23:26,323
space, which is kind of shows you
how to use it, but that's a real

423
00:23:26,323 --> 00:23:27,493
space, that's real information.

424
00:23:27,503 --> 00:23:30,833
You can click it, you can edit it, you
can create new spaces and that stuff

425
00:23:30,833 --> 00:23:32,543
will be saved if you choose to sign up.

426
00:23:33,008 --> 00:23:34,458
But it's the complete app.

427
00:23:34,528 --> 00:23:37,138
There's no, nothing in front of
you, which I think is pretty cool.

428
00:23:37,238 --> 00:23:37,538
Yeah.

429
00:23:37,568 --> 00:23:38,568
I love that pattern.

430
00:23:38,618 --> 00:23:43,078
I would love to see that pretty much in
all software, but I think it's really

431
00:23:43,078 --> 00:23:49,458
like a symptom of that most apps are just
like, so server heavy and account heavy

432
00:23:49,728 --> 00:23:55,223
that you basically On a technological
level, like you can't even have an easy

433
00:23:55,223 --> 00:24:00,043
way to make the software work without a
user account with all of that baggage.

434
00:24:00,303 --> 00:24:05,633
But if you build software more in a
Local-First oriented way, then the

435
00:24:05,633 --> 00:24:08,013
software should work no matter what.

436
00:24:08,103 --> 00:24:13,273
And that makes it trivial to have a
fully working version of the app running

437
00:24:13,273 --> 00:24:17,973
locally right in your browser, you can
seed it with like some demo data and

438
00:24:17,973 --> 00:24:23,973
then optionally upgraded into a server
account, et cetera, for collaboration.

439
00:24:24,033 --> 00:24:28,103
But I think this is what this new
generation of Local-First inspired

440
00:24:28,153 --> 00:24:32,663
apps all have in common with the
thinking of something like.TLDraw,

441
00:24:32,708 --> 00:24:36,568
which is a, is a great canvas-based
diagramming tool, which you can

442
00:24:36,568 --> 00:24:39,628
also use right away in your browser.

443
00:24:40,008 --> 00:24:42,458
And it's also has local persistence.

444
00:24:42,468 --> 00:24:43,848
It has collaboration.

445
00:24:44,208 --> 00:24:49,048
So I think this is switching this
around for making software useful out

446
00:24:49,048 --> 00:24:53,858
of the box without you having to sign
up and like pick another password.

447
00:24:54,178 --> 00:24:58,308
I think there's such a obvious
thing in hindsight that just makes

448
00:24:58,308 --> 00:25:01,518
it also much more likely to fall
in love with, with some software.

449
00:25:02,238 --> 00:25:07,008
I think for for new companies especially
or new new startups, it's such a big

450
00:25:07,068 --> 00:25:10,648
advantage if you haven't started that
way and you started with the root

451
00:25:10,648 --> 00:25:14,568
assumption that your app needs accounts
to function, it's really hard to go

452
00:25:14,568 --> 00:25:19,148
back on that, like, it's basically
impossible, but if you've started building

453
00:25:19,148 --> 00:25:24,248
Local-First, this gives you a feature
that that larger giants just can't match.

454
00:25:24,988 --> 00:25:29,038
A common pattern that I've seen is
like that you basically give away

455
00:25:29,038 --> 00:25:33,668
like free anonymous accounts that
you can claim later, but then you

456
00:25:33,668 --> 00:25:37,828
really need to subsidize that and
it's not something you can just do for

457
00:25:37,828 --> 00:25:43,243
free, but if you build Uh, software
Local-First, then there is no thing you

458
00:25:43,243 --> 00:25:47,313
need to subsidize since the software
just like runs in someone's browser.

459
00:25:47,343 --> 00:25:49,433
You don't need to pay anything for that.

460
00:25:49,813 --> 00:25:54,543
So I think, like you say, that gives new
startups huge advantage and I hopefully

461
00:25:54,573 --> 00:25:56,363
becomes table stakes for new products.

462
00:25:57,153 --> 00:25:58,508
I think another way to frame that.

463
00:25:58,698 --> 00:26:01,008
is with the idea of resiliency.

464
00:26:01,038 --> 00:26:04,698
So, you know, when Kinopio kind of
first launched, it was like front page

465
00:26:04,698 --> 00:26:06,168
of Hacker News for a little while.

466
00:26:06,398 --> 00:26:09,978
And you know, a hundred thousand people
visited it like pretty fast, but because

467
00:26:10,028 --> 00:26:13,628
the server didn't even know about them,
cause you know, they were mostly making,

468
00:26:13,638 --> 00:26:14,948
like checking it out in their browser.

469
00:26:14,948 --> 00:26:17,748
And some of them would upgrade, but
are to like sign up for an account.

470
00:26:17,778 --> 00:26:20,468
But a lot of them would just, you know,
kick the tires and maybe come back later.

471
00:26:20,578 --> 00:26:21,808
Like nothing went wrong.

472
00:26:22,038 --> 00:26:22,928
Like nothing mattered.

473
00:26:22,928 --> 00:26:26,338
I barely noticed, because Yeah, I
didn't have to worry about like,

474
00:26:26,338 --> 00:26:27,938
Hey, now there's 100, 000 accounts.

475
00:26:27,938 --> 00:26:31,938
And now my database is like inflated
or, you know, now my server's on fire.

476
00:26:32,433 --> 00:26:36,183
Yeah, and I think this is, you're,
you're touching at a point here that

477
00:26:36,183 --> 00:26:40,723
I'm super bullish about Local-First
software is like, you're, you seem to

478
00:26:40,723 --> 00:26:42,983
be working on Kinopio just by yourself.

479
00:26:43,353 --> 00:26:45,503
And you've been working on
this for, for quite a while.

480
00:26:45,533 --> 00:26:50,123
And you probably reached by now,
like more and more users without

481
00:26:50,183 --> 00:26:55,783
you as a necessity, having to raise
VC money and scale a team, etc.

482
00:26:55,803 --> 00:26:58,763
So given that you can put your focus.

483
00:26:59,113 --> 00:27:03,123
On like making the product better and
not having to babysit a Kubernetes

484
00:27:03,143 --> 00:27:04,623
cluster to handle the load.

485
00:27:04,963 --> 00:27:07,883
I think that's another
benefit of this architecture.

486
00:27:07,983 --> 00:27:11,953
Not having to, to learn what Kubernetes
is also sounds like a big benefit.

487
00:27:11,963 --> 00:27:13,603
It's uh, it seems like a lot.

488
00:27:13,623 --> 00:27:15,113
I'm on like the broke boy.

489
00:27:15,463 --> 00:27:17,463
Heroku plan, and it's still fine.

490
00:27:17,763 --> 00:27:18,583
That's amazing.

491
00:27:18,673 --> 00:27:23,233
So you've shared a little bit of like how
the technical architecture works in terms

492
00:27:23,233 --> 00:27:28,123
of local state management and how you're
persisting data and reading data from and

493
00:27:28,123 --> 00:27:34,573
to local storage, but you can also share
Kinopio boards between users and even

494
00:27:34,573 --> 00:27:36,813
collaborate on them, probably real time.

495
00:27:37,123 --> 00:27:41,473
So curious to hear more how that is
working, how you've implemented that and

496
00:27:41,473 --> 00:27:43,323
which sort of challenges you've run into.

497
00:27:43,678 --> 00:27:48,178
Sure, yeah, to enable that stuff is,
is precisely why I did end up adding

498
00:27:48,178 --> 00:27:50,148
a server early on in Kinopio's life.

499
00:27:50,208 --> 00:27:52,408
So the way it works is
it's pretty conventional.

500
00:27:52,408 --> 00:27:56,148
Um, all the things that change
your local, your local storage

501
00:27:56,148 --> 00:27:58,478
state also shoot up an update.

502
00:27:58,738 --> 00:27:59,698
To the server.

503
00:27:59,758 --> 00:28:02,398
Um, so there's a source of truth
database for all that stuff.

504
00:28:02,688 --> 00:28:05,198
And, you know, all that's
connected to your own user account.

505
00:28:05,198 --> 00:28:08,718
So when you sign on on another device,
like your phone, you have the same

506
00:28:08,718 --> 00:28:13,168
information in terms of the real time
collaboration stuff, I'm essentially

507
00:28:13,168 --> 00:28:16,868
sending a small version of those
transformations over a web socket to the

508
00:28:16,868 --> 00:28:20,968
server, which sees who are the clients
connected to this particular space of

509
00:28:20,968 --> 00:28:23,278
the time beams, those updates to them.

510
00:28:23,608 --> 00:28:26,898
And those people have their own
local storage or local state.

511
00:28:27,018 --> 00:28:29,118
And local storage
updated at the same time.

512
00:28:29,118 --> 00:28:33,768
So it's actually, I'm using like the
same, like atomic update system, but I'm

513
00:28:33,768 --> 00:28:38,508
using it in three very different contexts,
local storage over API requests where

514
00:28:38,508 --> 00:28:42,458
things are authenticated and through
WebSockets where they're very fast.

515
00:28:42,538 --> 00:28:45,668
And the things that you're sending
over the WebSockets, is this

516
00:28:45,668 --> 00:28:49,848
the entire board state that you
send over or is updates events?

517
00:28:49,858 --> 00:28:51,518
Can you describe a bit
more how that works?

518
00:28:52,128 --> 00:28:53,018
Purely updates.

519
00:28:53,028 --> 00:28:57,408
So when you load up, like somebody
invites you to a space, so you click the

520
00:28:57,408 --> 00:29:00,588
invite link, Kinopio, the web client,
will open, see, hey, you're trying to

521
00:29:00,588 --> 00:29:04,468
load up this particular URL with an
ID that doesn't, that isn't already

522
00:29:04,468 --> 00:29:06,318
existing in your own local storage.

523
00:29:06,318 --> 00:29:09,018
So I'm going to ask the server,
hey, pull this down for me.

524
00:29:09,278 --> 00:29:15,188
And so that'll all come in one big, you
know, space, blob or clump of, of JSON.

525
00:29:15,228 --> 00:29:19,108
And as you make updates, iterative
updates while you collaborate, like

526
00:29:19,108 --> 00:29:22,818
move a card around, type in some
text, those will all just be like

527
00:29:22,818 --> 00:29:26,328
little update card operations that are
sent to all the clients in the API.

528
00:29:26,958 --> 00:29:27,368
Got it.

529
00:29:27,468 --> 00:29:33,148
So given that Kinopio is not just like a
more traditional web app where you have

530
00:29:33,168 --> 00:29:39,648
tons of forms and like pages and routes,
et cetera, but it's a spatial canvas.

531
00:29:39,718 --> 00:29:44,248
This seems to be a more common
way now, how software is laid out.

532
00:29:44,398 --> 00:29:48,238
I've never built a canvas-based
app myself, but I'm very interested

533
00:29:48,248 --> 00:29:49,478
in learning more about it.

534
00:29:49,868 --> 00:29:53,788
So I'm curious whether you can
share some of your learnings.

535
00:29:53,963 --> 00:29:56,013
about building a canvas-based tool?

536
00:29:56,173 --> 00:29:59,343
Fundamentally, there are two
main different approaches

537
00:29:59,363 --> 00:30:00,423
when you build a canvas.

538
00:30:00,753 --> 00:30:05,053
So the first approach is you can
build it sort of like a website where

539
00:30:05,063 --> 00:30:09,043
each card is a dom node and you know,
absolutely positioned and you just

540
00:30:09,043 --> 00:30:10,793
kind of move it around with transforms.

541
00:30:11,163 --> 00:30:15,893
Um, the upside of that is it's really fast
and you know, like it'll work everywhere.

542
00:30:15,953 --> 00:30:19,823
The downside is there's a lot of like
interactions you do on a canvas, like

543
00:30:20,123 --> 00:30:21,743
pinch zooming and things like that.

544
00:30:22,703 --> 00:30:27,023
are not really handled well by all
browsers out of the gate, especially

545
00:30:27,063 --> 00:30:30,543
iOS Safari and, and Android Chrome,
for that matter, does a really

546
00:30:30,573 --> 00:30:31,883
poor job in some of these things.

547
00:30:32,163 --> 00:30:37,163
So for example, like I have a UI on my, on
my page and I, but I also have my canvas.

548
00:30:37,183 --> 00:30:41,343
If I pinch zoom the phone, I'm zooming in
the whole thing, including the UI, which

549
00:30:41,383 --> 00:30:43,583
makes the buttons look wild and crazy.

550
00:30:43,673 --> 00:30:44,583
And I don't want to do that.

551
00:30:44,613 --> 00:30:49,123
I can also like add like special touch
handlers to only zoom in that part of

552
00:30:49,123 --> 00:30:53,073
the canvas, but it's really hard to do
it in a way Where it doesn't just crash

553
00:30:53,073 --> 00:30:57,033
the browser because the transformed
texture of the page gets gets too big.

554
00:30:57,213 --> 00:31:01,573
So a Kinopio document can be like tens of
thousands of pixels wide or deep, right?

555
00:31:01,623 --> 00:31:03,203
So it's really hard to design around that.

556
00:31:03,453 --> 00:31:08,743
The second approach, which is by far the
more popular approach, is to recreate

557
00:31:08,753 --> 00:31:14,373
the whole canvas in the HTML canvas
element or some some similar type of

558
00:31:14,858 --> 00:31:18,248
rendering that you control and you
have really fine grained thing over.

559
00:31:18,448 --> 00:31:22,578
And so the upside of that is you have
full control over pinching and zooming.

560
00:31:22,588 --> 00:31:25,418
You can tell things to, to leave space.

561
00:31:25,478 --> 00:31:30,588
The viewport like intersection observer
equivalent, um, is a lot more reliable.

562
00:31:31,378 --> 00:31:34,528
So browsers don't always report their
positions, especially on mobile,

563
00:31:34,628 --> 00:31:37,498
accurately to web apps, as I've found.

564
00:31:37,768 --> 00:31:40,538
And so, being able to control
every part of the rendering

565
00:31:40,538 --> 00:31:42,508
process means you control it.

566
00:31:42,568 --> 00:31:45,768
You can make things appear
precisely how you want to.

567
00:31:46,248 --> 00:31:50,738
The downside is you have to, you lose all
the things you get for free on the web.

568
00:31:50,778 --> 00:31:53,078
You lose accessibility, you lose speed.

569
00:31:53,158 --> 00:31:56,463
You lose like, you know, like special
touch handling and other things like that.

570
00:31:56,463 --> 00:31:59,893
And you have to build it in yourself,
or more likely you don't really.

571
00:32:00,243 --> 00:32:03,943
And you kind of have a canvas
that works great on like desktop

572
00:32:03,943 --> 00:32:05,603
computers, but not so much elsewhere.

573
00:32:05,783 --> 00:32:10,053
And so because of that, Kinopio uses
the first approach, which is fast, but.

574
00:32:10,353 --> 00:32:15,523
It requires a lot of work to not be janky
and I, I do my best, I'll say that much.

575
00:32:15,673 --> 00:32:19,263
Any particular patterns that
you figured out for that first

576
00:32:19,303 --> 00:32:20,493
approach that you laid out?

577
00:32:20,643 --> 00:32:24,073
Yeah, so there's a thing that
I do called counterscaling.

578
00:32:24,333 --> 00:32:28,673
So essentially when you pinch the
screen on mobile, the whole page

579
00:32:28,673 --> 00:32:30,493
will zoom up, including the UI.

580
00:32:30,703 --> 00:32:34,323
But what I do with the UI is I
tell it to scale itself down.

581
00:32:34,323 --> 00:32:37,713
So if let's say you pinched in and
the page is now 2x, I tell the UI.

582
00:32:38,223 --> 00:32:39,913
Hey, it looks like the page is 2x.

583
00:32:40,133 --> 00:32:42,613
Maybe zoom yourself down,
scale yourself down to 0.

584
00:32:42,613 --> 00:32:43,473
5x.

585
00:32:43,713 --> 00:32:47,703
And so it kind of like net makes
the UI look the correct size.

586
00:32:47,803 --> 00:32:51,283
So I'm basically like making the UI
smaller so that it appears regular

587
00:32:51,283 --> 00:32:52,753
size while you're doing this.

588
00:32:52,813 --> 00:32:56,223
What I found though is that
browsers, mobile browsers don't send

589
00:32:56,343 --> 00:32:59,473
resized data and pinch zoom data
as quickly as you interact with it.

590
00:32:59,483 --> 00:33:02,583
A lot of events happen in the
browser that just aren't reported.

591
00:33:02,598 --> 00:33:05,088
To the browser, because they
don't want to like, you know, blow

592
00:33:05,088 --> 00:33:06,398
up the JavaScript or whatever.

593
00:33:06,458 --> 00:33:09,928
There's like little tricks that
you do to kind of work around that.

594
00:33:09,928 --> 00:33:13,858
So like, I will fade in the UI during
like touch events so that you don't

595
00:33:13,858 --> 00:33:16,978
see things like jitter around as
they're, they're struggling to resize.

596
00:33:17,208 --> 00:33:20,348
So yeah, I've learned a lot
about how mobile browsers operate

597
00:33:20,358 --> 00:33:21,668
differently than desktop ones.

598
00:33:21,668 --> 00:33:23,348
And, uh, it's, it's a lot.

599
00:33:23,368 --> 00:33:26,988
Would you still choose approach
number one, as opposed to

600
00:33:27,018 --> 00:33:28,258
the canvas-based approach?

601
00:33:28,518 --> 00:33:30,398
I think I would, because I've tried like.

602
00:33:30,593 --> 00:33:34,543
a couple times to, to redo
Kanopio with different approaches.

603
00:33:34,613 --> 00:33:37,513
The other big downside of the
canvas-based approach is it

604
00:33:37,513 --> 00:33:39,933
also makes iteration way harder.

605
00:33:40,253 --> 00:33:44,203
Like adding new features when you have to
also render them or like, you know, like,

606
00:33:44,223 --> 00:33:48,683
like at a lower level and figure out how
to just work around that sort of stuff.

607
00:33:48,803 --> 00:33:52,223
And you don't have like, you
know, the normal flex box type

608
00:33:52,233 --> 00:33:53,833
positioning flow and things like that.

609
00:33:53,853 --> 00:33:55,503
It's a, it's a lot more tricky.

610
00:33:55,683 --> 00:33:58,423
And so I think it's kind of
like I've chosen the net best

611
00:33:58,423 --> 00:33:59,903
approach, at least for Kinopio.

612
00:34:00,043 --> 00:34:03,413
And the one that I've kind of embraced
because one of the other advantages

613
00:34:03,503 --> 00:34:07,883
of doing a full canvas rendering
is you can scroll in 360 degrees.

614
00:34:08,123 --> 00:34:11,763
And with Kinopio, you can only scroll
down and to the right as much as you want.

615
00:34:11,963 --> 00:34:14,528
But because of that constraint,
You always know where the

616
00:34:14,528 --> 00:34:16,508
beginning of the document is.

617
00:34:16,518 --> 00:34:20,618
It's always in the top left for the
most part, as opposed to other canvas

618
00:34:20,618 --> 00:34:23,788
tools where it can be like in the
center of the page, which might not

619
00:34:23,788 --> 00:34:26,488
be visible depending on the size of
your device and you've got to kind of

620
00:34:26,498 --> 00:34:27,958
scroll around to figure things out.

621
00:34:28,208 --> 00:34:29,208
That's super cool.

622
00:34:29,373 --> 00:34:35,083
In regards to the real time collaboration,
so you can share boards with other people

623
00:34:35,093 --> 00:34:36,923
and like work on them at the same time.

624
00:34:37,003 --> 00:34:41,833
Are you going even further to have like
a sense of presence across collaborators?

625
00:34:42,013 --> 00:34:46,393
You can do see other people's
cursors or how did you think about

626
00:34:46,403 --> 00:34:47,733
designing those interactions?

627
00:34:47,973 --> 00:34:51,683
So, Kinopio has this kind of unique
feature called Paint Select or Magic

628
00:34:51,683 --> 00:34:55,753
Paint and basically it lets you select
multiple cards to do bulk actions, like

629
00:34:55,753 --> 00:34:59,373
move them all together, but it lets
you paint over them to select them.

630
00:34:59,393 --> 00:35:04,313
So instead of drawing a box, you can
kind of like make more kind of unique

631
00:35:04,383 --> 00:35:07,953
selections by painting over and it was
kind of also a way to like bridge this

632
00:35:07,953 --> 00:35:10,873
gap between the right side of your
brain and the left side of your brain.

633
00:35:11,103 --> 00:35:14,213
And so the paint stroke kind of disappears
as you're paint selecting, there's like

634
00:35:14,213 --> 00:35:16,903
a exponential decay function there.

635
00:35:17,173 --> 00:35:21,613
And so I also I show those same paint
strokes for other people looking at

636
00:35:21,613 --> 00:35:23,023
your space or interacting with it.

637
00:35:23,243 --> 00:35:26,573
So as you're moving around, you see
their paint strokes kind of moving

638
00:35:26,573 --> 00:35:28,323
around and fading in the background.

639
00:35:28,323 --> 00:35:30,613
You also see their user icons
kind of floating around.

640
00:35:30,613 --> 00:35:34,463
So it kind of creates more than
just like the cursor plus user icon.

641
00:35:34,463 --> 00:35:38,073
It kind of creates more of like a feeling
of like, Oh, like these people are

642
00:35:38,073 --> 00:35:40,663
like, or someone's really interacting
with the space or maybe somebody is

643
00:35:40,663 --> 00:35:41,883
just noodling around in the space.

644
00:35:41,883 --> 00:35:44,843
I can just see their paint strokes and
they're trying to spell out words or

645
00:35:44,843 --> 00:35:47,033
draw things before the paint fades away.

646
00:35:47,163 --> 00:35:48,193
That is super cool.

647
00:35:48,243 --> 00:35:48,643
Yeah.

648
00:35:48,673 --> 00:35:53,113
This is, I think goes back to the design
principles that did you laid out initially

649
00:35:53,513 --> 00:35:58,383
and how you're not directly imitating
paper, but you figure out like what is

650
00:35:58,663 --> 00:36:02,153
the best mechanism here for, for this
medium and the goals you're going for.

651
00:36:02,548 --> 00:36:08,778
So going back to the canvas, I recently
read that I think Obsidian has launched

652
00:36:08,808 --> 00:36:11,128
an initiative called JSON Canvas.

653
00:36:11,788 --> 00:36:15,708
Um, if I remember correctly, and I
think there, do you have some plans

654
00:36:15,758 --> 00:36:18,028
to, to also like integrate with that?

655
00:36:18,168 --> 00:36:22,538
Funny you should mention, I literally,
um, just yesterday launched, uh, Kinopio

656
00:36:22,568 --> 00:36:27,648
support for full import and export, uh,
you know, um, exporting with that, with

657
00:36:27,648 --> 00:36:29,538
that file format, the canvas file format.

658
00:36:30,163 --> 00:36:31,183
So they launched it yesterday.

659
00:36:31,223 --> 00:36:33,073
I really quickly added it yesterday.

660
00:36:33,393 --> 00:36:37,893
So can you share a little bit more about
why that would be useful for, for people?

661
00:36:37,953 --> 00:36:38,233
Sure.

662
00:36:38,233 --> 00:36:38,483
Yeah.

663
00:36:38,483 --> 00:36:43,343
So for the longest time there hasn't been
like a great interop document format.

664
00:36:43,423 --> 00:36:48,653
So of course, each different app has
its own JSON representation of nodes

665
00:36:48,653 --> 00:36:51,143
or cards and edges or connection lines.

666
00:36:51,293 --> 00:36:53,193
But they're not, they're all app specific.

667
00:36:53,263 --> 00:36:55,633
So, you know, it's kind of tough
if you're trying to, you know,

668
00:36:55,943 --> 00:36:59,213
Migrate from one tool or another
or test out one tool or another.

669
00:36:59,273 --> 00:37:01,973
And so the closest equivalent we
had before, just for a little bit of

670
00:37:01,973 --> 00:37:06,603
historical context was OPML, which is also
like kind of a, an off requested feature,

671
00:37:06,703 --> 00:37:09,093
an OPML was kind of made for outliners.

672
00:37:09,103 --> 00:37:14,093
So like collapsible nested tree and you
know, structures I can indent now dent.

673
00:37:14,423 --> 00:37:19,203
The problem with OPML is it doesn't handle
what happens if you have multiple trees

674
00:37:19,213 --> 00:37:22,013
that aren't connected to each other,
or you have multiple trees that might

675
00:37:22,013 --> 00:37:23,993
have child node that they both share.

676
00:37:24,213 --> 00:37:26,623
You know, like you can, you can
create structures that are way

677
00:37:26,623 --> 00:37:29,263
more complex than OPML can capture.

678
00:37:29,523 --> 00:37:32,333
And so I just couldn't figure
out how to do it with OPML.

679
00:37:32,393 --> 00:37:36,933
So I followed the spec for a while and,
and when Capano and Obsidian launched

680
00:37:36,933 --> 00:37:41,033
it, I, I was already kind of in a rework
of the importing and exporting system.

681
00:37:41,053 --> 00:37:42,683
So it's a very simple spec.

682
00:37:42,683 --> 00:37:45,923
It doesn't cover every feature
that either app has, I'm sure.

683
00:37:46,183 --> 00:37:48,553
But the advantage of that is
it's also very easy to implement.

684
00:37:48,563 --> 00:37:49,463
So, you know, it's different.

685
00:37:49,823 --> 00:37:52,983
Transforming from one JSON
object to another, essentially.

686
00:37:53,183 --> 00:37:53,533
Got it.

687
00:37:53,593 --> 00:37:58,333
And I suppose that while the spec
is like very open ended in some

688
00:37:58,333 --> 00:38:03,023
way, maybe that converges to,
towards some more details over time.

689
00:38:03,373 --> 00:38:07,593
And the idea would be that I can
bring some data from one tool,

690
00:38:07,593 --> 00:38:12,923
for example, Obsidian into Kinopio
or the other way around or future

691
00:38:12,923 --> 00:38:14,293
tools that might, might exist.

692
00:38:14,573 --> 00:38:15,073
Yeah.

693
00:38:15,103 --> 00:38:17,333
It's, but there are wrinkles because.

694
00:38:17,743 --> 00:38:19,963
Of how different these tools
are, or at least how different

695
00:38:19,963 --> 00:38:21,263
Kinopio is from all of them.

696
00:38:21,283 --> 00:38:24,883
So there are assumptions and I've,
I've left like feedback about these

697
00:38:24,893 --> 00:38:28,833
things in, in GitHub issues for the
spec, but there are like assumptions

698
00:38:28,833 --> 00:38:32,763
that they make like, um, the node
has to define like how wide it is

699
00:38:32,763 --> 00:38:35,533
explicitly, or what type of node is it?

700
00:38:35,533 --> 00:38:36,833
Is it a file node?

701
00:38:36,833 --> 00:38:39,733
Is there a, you know, like
a website node or whatever.

702
00:38:39,783 --> 00:38:45,428
So problems with both of these is that
like the width, Of one app's node for the

703
00:38:45,428 --> 00:38:49,328
same amount of text might be different for
another app because they're all rendering

704
00:38:49,328 --> 00:38:51,218
it differently in Kinopio's case.

705
00:38:51,218 --> 00:38:52,018
There's also this.

706
00:38:52,208 --> 00:38:53,528
It's also mobile compatible.

707
00:38:53,548 --> 00:38:57,838
So there's a bit extra of padding
and sizing for touch friendliness.

708
00:38:57,848 --> 00:39:00,268
So those numbers don't really translate.

709
00:39:00,318 --> 00:39:02,348
And so it's kind of weird that
they're required in the spec

710
00:39:02,348 --> 00:39:03,498
as opposed to being optional.

711
00:39:03,528 --> 00:39:04,968
Second issue was the node type.

712
00:39:05,208 --> 00:39:06,978
So I can mention a long time ago.

713
00:39:07,228 --> 00:39:10,358
Or earlier in this chat, you know, a
lot of apps make you choose, like, Hey,

714
00:39:10,358 --> 00:39:11,428
are you going to insert a web page?

715
00:39:11,428 --> 00:39:12,358
Are you going to sort of whatever?

716
00:39:12,578 --> 00:39:14,158
On Kinopio, they're all the same type.

717
00:39:14,168 --> 00:39:17,598
They're all just, there's only one
type of card, a text card, and whatever

718
00:39:17,638 --> 00:39:20,748
type of content you put in that,
whether it's a link or a website or

719
00:39:20,748 --> 00:39:24,598
whatever, is what that card transforms
into using the power of regexes.

720
00:39:24,978 --> 00:39:28,608
And so that part of the whole
spec is basically, like, not

721
00:39:28,608 --> 00:39:30,058
necessarily relevant to Kinopio.

722
00:39:30,098 --> 00:39:33,228
Didn't really connect because
It's making the assumption

723
00:39:33,228 --> 00:39:34,728
that that isn't really shared.

724
00:39:34,798 --> 00:39:38,818
So in some ways I think it's too
specific in some ways it's, and I'm sure

725
00:39:38,818 --> 00:39:42,338
a lot and a lot of people's complaint
is that it's not specific enough.

726
00:39:42,338 --> 00:39:45,278
So it's weird because like
it's really hard to make a

727
00:39:45,278 --> 00:39:47,038
spec for wildly different apps.

728
00:39:47,068 --> 00:39:50,568
But I think currently I'm actually
pretty happy with the spec because it

729
00:39:50,568 --> 00:39:55,558
captures like the most important part,
which is the representation of cards

730
00:39:55,578 --> 00:40:00,608
and nodes in a way that doesn't require
them to have this strict tree structure.

731
00:40:00,618 --> 00:40:00,638
Yeah.

732
00:40:00,778 --> 00:40:01,858
That makes a lot of sense.

733
00:40:01,898 --> 00:40:06,188
And yeah, I mean, the devil's always in
the detail and you built Kinopio really

734
00:40:06,188 --> 00:40:11,608
to enable the sort of interactions and
details that you uniquely thought about.

735
00:40:11,638 --> 00:40:17,138
And you might not have that entropy
available in Obsidian and vice versa.

736
00:40:17,458 --> 00:40:20,278
And then it's also, how do
you preserve that intent and

737
00:40:20,408 --> 00:40:22,068
that information across apps?

738
00:40:22,118 --> 00:40:27,053
That's, that's a very tricky problem,
but I, I applaud the initiative to take

739
00:40:27,053 --> 00:40:32,043
some first steps there to at least bring
some data across one app to another.

740
00:40:32,043 --> 00:40:37,663
So that sort of cross app collaboration,
I think that is certainly a goal that I'm

741
00:40:37,663 --> 00:40:42,623
rooting for, but that we still have like
many chapters still ahead of us there.

742
00:40:42,848 --> 00:40:48,608
So the way I've built Kenopio, it's super
impressive, both in terms of like how

743
00:40:48,608 --> 00:40:54,778
the product feels and works and looks,
but also like, given that you've been

744
00:40:54,788 --> 00:40:59,568
on this journey for, for such a long
time, uh, by, by yourself, I'm curious

745
00:40:59,668 --> 00:41:04,278
which corners you might've already cut
along the way that you regret looking

746
00:41:04,288 --> 00:41:10,103
back where you wish you would have like
spent up front or vice versa where you

747
00:41:10,103 --> 00:41:13,513
thought something might be a problem
and it never actually became a problem.

748
00:41:13,893 --> 00:41:14,353
Oh, wow.

749
00:41:14,353 --> 00:41:14,643
Yeah.

750
00:41:14,643 --> 00:41:16,883
There's, there's
definitely a lot of those.

751
00:41:16,893 --> 00:41:21,553
So like, there's like a lot of code kind
of like with the syncing engine, uh, and

752
00:41:21,553 --> 00:41:25,813
the way I merge, um, different changes
to make smaller change sets that get

753
00:41:25,813 --> 00:41:27,793
sent to the server, but I feel like.

754
00:41:27,993 --> 00:41:32,223
are a little hard to work around now
in just in terms of like just how gross

755
00:41:32,233 --> 00:41:36,483
that code is or how like abstractive
and I wish I did a better job writing

756
00:41:36,483 --> 00:41:39,603
it like it's not it's not something
that's painted me into too harsh a

757
00:41:39,603 --> 00:41:42,733
corner it's just something I'm like
oh I'm scared to touch this part of

758
00:41:42,733 --> 00:41:47,233
the app but one day I'll just you know
buckle down and and really get to it.

759
00:41:47,313 --> 00:41:52,033
So I actually think the app is in a
pretty good place just because um I

760
00:41:52,043 --> 00:41:57,043
guess the other thing is like I prefer
to like write code that's like, not

761
00:41:57,043 --> 00:42:00,393
necessarily for me to understand now,
but for me to understand in like two

762
00:42:00,393 --> 00:42:05,143
months or three months or five years from
now, where I forget what the S variable

763
00:42:05,533 --> 00:42:07,953
or the A variable is referring to.

764
00:42:07,983 --> 00:42:12,903
So I, I, I was like kind of influenced
by, by some short time, like,

765
00:42:13,168 --> 00:42:16,518
Coding for Apple platforms where
they're very verbose with variables.

766
00:42:16,518 --> 00:42:20,758
I kind of took some of that
Coco convention into my own

767
00:42:20,788 --> 00:42:21,958
kind of code writing style.

768
00:42:22,078 --> 00:42:23,928
Yeah, I think that's very wise.

769
00:42:23,988 --> 00:42:28,798
Uh, I've made the same observation
about myself since in reality, even

770
00:42:28,808 --> 00:42:32,268
if you just work by yourself, you
still collaborate with yourself.

771
00:42:32,948 --> 00:42:34,730
Over time more instances of you over
time the future you, the past you.

772
00:42:34,730 --> 00:42:34,748
who do not the same
context right in your brain

773
00:42:42,548 --> 00:42:48,208
So just like leaving notes for yourself
of like, why did you do a certain

774
00:42:48,208 --> 00:42:53,618
thing has, I, I've had to learn that
lesson painfully and I'm treating my

775
00:42:53,618 --> 00:42:59,278
future self better or I'm trying to,
so, uh, it looks like you've learned

776
00:42:59,438 --> 00:43:01,178
quite a couple of similar lessons, but

777
00:43:01,513 --> 00:43:04,883
Yeah, I think we all kind of learn that,
but we all have to, like, burn ourselves

778
00:43:04,883 --> 00:43:06,393
a little bit before we truly learn it.

779
00:43:06,393 --> 00:43:09,173
Because it's not, like, an
intuitive thing to know.

780
00:43:09,393 --> 00:43:12,383
And it is, like, in an industry that's
always trying to, like, move fast and

781
00:43:12,383 --> 00:43:16,613
ship fast and whatever, it's a little,
it's mildly antithetical to that.

782
00:43:16,633 --> 00:43:20,063
But it is one of those things where,
take a little extra time to write

783
00:43:20,063 --> 00:43:23,123
that good comment, it'll save you
so much more time down the road.

784
00:43:23,288 --> 00:43:27,558
So you've been on this journey by
yourself now for quite a while after

785
00:43:27,898 --> 00:43:33,118
being in a more conventional team
context at Fog Creek working on Glitch.

786
00:43:33,178 --> 00:43:35,508
I'm curious whether you can
reflect a little bit on that

787
00:43:35,508 --> 00:43:37,608
journey now working on Kinopio.

788
00:43:37,788 --> 00:43:38,798
What are the good things?

789
00:43:38,798 --> 00:43:40,148
What are the challenging things?

790
00:43:40,148 --> 00:43:42,568
What are the things you wish
you would have known before

791
00:43:42,598 --> 00:43:43,898
embarking on this journey?

792
00:43:44,018 --> 00:43:47,208
Yeah, there's definitely pros and
cons to, to working by yourself

793
00:43:47,208 --> 00:43:49,348
or for yourself versus in a team.

794
00:43:49,348 --> 00:43:51,688
The obvious things are like, yo,
camaraderie when you're having a bad

795
00:43:51,688 --> 00:43:55,668
day, you know,, you're in it with
other people and, and, you know,

796
00:43:55,668 --> 00:43:58,988
like the pain can be absorbed by many
people kind of thing or the struggle.

797
00:43:59,118 --> 00:44:02,308
But actually in reality, like, I
don't, I kind of work alone, but I

798
00:44:02,308 --> 00:44:05,118
also kind of don't in the sense of
like, there are other creators building

799
00:44:05,128 --> 00:44:07,398
great projects out there like MM doc.

800
00:44:07,418 --> 00:44:09,308
page or TL draw, et cetera.

801
00:44:09,598 --> 00:44:13,018
Uh, and so it's kind of like, Even though
some of them are sort of competitors in

802
00:44:13,018 --> 00:44:16,988
the way, but sort of not like Muse as
well, because we're all kind of on that

803
00:44:16,988 --> 00:44:20,448
same hill, we're all kind of struggling
and we're all kind of in a similar place.

804
00:44:20,578 --> 00:44:23,358
It kind of acts as like a de facto
team, even though you're not necessarily

805
00:44:23,358 --> 00:44:24,998
like in contact with them every day.

806
00:44:25,308 --> 00:44:27,828
Uh, they're also the companies
that I've contracted for, like

807
00:44:27,838 --> 00:44:31,538
Futureland, which is also kind of
like a early stage startupy company.

808
00:44:31,818 --> 00:44:35,148
I can see that they have similar
challenges that I have in terms of, you

809
00:44:35,148 --> 00:44:38,008
know, getting the word out and stuff
like that, or just refining the product.

810
00:44:38,008 --> 00:44:38,468
And so.

811
00:44:38,963 --> 00:44:42,573
In that sense, it's like, I think,
I think you mitigate like a lot of

812
00:44:42,573 --> 00:44:46,563
the sort of downsides of, of not
being in a, in a large organization.

813
00:44:46,783 --> 00:44:50,113
But I also kind of like, like in
addition to sometimes working as a

814
00:44:50,113 --> 00:44:54,583
contractor, I also employ contractors
or I'm starting to, and so I've

815
00:44:54,583 --> 00:44:58,683
gotten some really great database
performance optimizations, um, from a

816
00:44:58,683 --> 00:45:00,863
friend named Lucas who I met in Bali.

817
00:45:00,923 --> 00:45:01,133
Yeah.

818
00:45:01,133 --> 00:45:04,323
These are things like, Oh, I like wrote
the indexes wrong and I didn't know how

819
00:45:04,323 --> 00:45:06,373
to check them or like, Hey, I could.

820
00:45:06,583 --> 00:45:10,713
Make merge these database calls
into one simpler one to make like

821
00:45:10,713 --> 00:45:12,323
really dramatic beat improvements.

822
00:45:12,543 --> 00:45:16,493
And so, like, it is great, you
know, finally having just a

823
00:45:16,493 --> 00:45:19,373
little bit of the resources to
be able to do that sort of thing.

824
00:45:19,373 --> 00:45:22,733
And I kind of want to continue to
new more and down the path until

825
00:45:22,733 --> 00:45:24,063
it sort of stops making sense.

826
00:45:24,323 --> 00:45:27,553
Yeah, like, it's kind of one of
those things where you see, I feel

827
00:45:27,553 --> 00:45:30,643
like I've learned what works and
what doesn't from my time working

828
00:45:30,733 --> 00:45:31,923
at other people's companies.

829
00:45:31,923 --> 00:45:36,293
And I'm kind of, you know, Testing all
those hypotheses now, uh, as I build

830
00:45:36,293 --> 00:45:40,253
Knopio and, and, you know, ideally
sharing in my blog and on Twitter and

831
00:45:40,253 --> 00:45:43,823
whatnot, how that's working out and
what I was wrong about or right about.

832
00:45:43,923 --> 00:45:44,253
Yeah.

833
00:45:44,583 --> 00:45:47,893
Thank you so much for taking the
effort of, of sharing your, your

834
00:45:47,893 --> 00:45:50,193
learnings and experiences there.

835
00:45:50,413 --> 00:45:54,243
Highly recommend for, for every
listener to check out your blog that

836
00:45:54,283 --> 00:45:58,351
has its own very unique style, in
the same way as Kinopio has its own

837
00:45:58,351 --> 00:46:02,521
style, your blog has like a very
organic style, which I really like.

838
00:46:02,531 --> 00:46:06,791
It's very inviting to, to read about your,
your different blog posts, et cetera.

839
00:46:06,901 --> 00:46:10,501
I guess, speaking of organic and that
blog, like one of the funny things about

840
00:46:10,501 --> 00:46:14,511
it is it's actually like extremely organic
in the sense of like, I designed the first

841
00:46:14,511 --> 00:46:19,966
version of that blog in 2014 or before
that on a trip to when I was interviewing

842
00:46:19,966 --> 00:46:24,176
at Flickr, newly bought by Yahoo in
San Francisco, back when they used to

843
00:46:24,176 --> 00:46:26,376
fly you out for tech job interviews.

844
00:46:26,506 --> 00:46:30,376
And so I'd, I'd built lots of like
blogs in the past, like personal

845
00:46:30,376 --> 00:46:32,666
blogs, but I kind of wanted like
something new back in the day.

846
00:46:32,666 --> 00:46:36,086
That was a de regard thing to
like start a blog and then get

847
00:46:36,086 --> 00:46:37,466
bored of it and start a new one.

848
00:46:37,686 --> 00:46:41,576
And so this is the one that stuck, but
essentially like, Over the years, I've

849
00:46:41,576 --> 00:46:46,126
been like slowly tweaking design and
slowly adding features like blog post

850
00:46:46,136 --> 00:46:48,176
tags and actually a couple months ago.

851
00:46:48,176 --> 00:46:50,736
I just added commenting and
before that, like a little bit

852
00:46:50,736 --> 00:46:52,036
of newsletter functionality.

853
00:46:52,076 --> 00:46:54,566
So it is very much like this thing.

854
00:46:54,566 --> 00:46:56,506
That's kind of collected pieces of it.

855
00:46:56,791 --> 00:46:57,911
As it's rolled down a hill.

856
00:46:57,991 --> 00:46:58,401
Yeah.

857
00:46:58,451 --> 00:47:04,011
I think there's also this term of digital
gardening, which I am also very drawn to.

858
00:47:04,061 --> 00:47:10,121
I have not evolved yet myself to, to
reach that level of like organic feel.

859
00:47:10,151 --> 00:47:14,441
I think my blog right now is like
much more neutral and traditional.

860
00:47:14,731 --> 00:47:15,091
So.

861
00:47:15,556 --> 00:47:20,426
You've mentioned initially that
you didn't always happen to be an

862
00:47:20,436 --> 00:47:24,256
engineer and a designer, but you
found your way towards design and

863
00:47:24,256 --> 00:47:28,916
engineering by actually starting out
studying biology and urban planning.

864
00:47:29,216 --> 00:47:32,796
So, I'm curious to learn more about
that journey and that transition

865
00:47:33,166 --> 00:47:36,876
and which sort of maybe unique
perspectives this has given you.

866
00:47:37,016 --> 00:47:39,426
Yeah, I went to school for biology
and then I did my grad studies in

867
00:47:39,436 --> 00:47:42,596
urban planning, basically because I
like SimCity and initially because

868
00:47:42,626 --> 00:47:45,496
for biology, because I didn't have
anything else to do in university.

869
00:47:45,646 --> 00:47:48,996
Uh, but from there, like from, especially
from the urban planning side, I'd

870
00:47:48,996 --> 00:47:52,571
always been doing, like, using Adobe
Illustrator for like illustrations and

871
00:47:52,571 --> 00:47:54,131
stuff just for friends and for fun.

872
00:47:54,351 --> 00:47:58,651
But in grad school, I also had to do like
mapping and more formal presentations.

873
00:47:58,651 --> 00:48:01,791
And one of the things I sort of
realized in that environment was like,

874
00:48:01,811 --> 00:48:05,271
we'd have to present this like huge
paper and we'd have these like little

875
00:48:05,271 --> 00:48:08,471
dioramas to go with it with like,
you know, figures and maps and stuff.

876
00:48:08,741 --> 00:48:11,691
And all the people grading it
didn't read the papers because

877
00:48:11,691 --> 00:48:12,531
they were boring as fuck.

878
00:48:12,531 --> 00:48:13,821
They're just like policy and stuff.

879
00:48:14,171 --> 00:48:17,021
But they would be like,
wow, this is so cool.

880
00:48:17,031 --> 00:48:17,561
Wow.

881
00:48:18,041 --> 00:48:22,401
the use of fonts and whatever and great
colors and stuff and so yeah it kind of

882
00:48:22,451 --> 00:48:27,341
like taught me that like oh okay like even
like the most like unapproachable or high

883
00:48:27,341 --> 00:48:31,341
minded academia types they're all kind of
drawn to like what's beautiful or what's

884
00:48:31,341 --> 00:48:35,926
shiny we're all just animals at the end
of the day so It kind of made me, like,

885
00:48:36,086 --> 00:48:39,736
leave the urban planning world and go
more into, like, the illustration world.

886
00:48:39,976 --> 00:48:43,486
And that's where I kind of got my first
job in tech as a staff illustrator for

887
00:48:43,486 --> 00:48:44,796
a company that did, like, banner ads.

888
00:48:44,796 --> 00:48:46,796
Definitely the dregs back in the day.

889
00:48:47,076 --> 00:48:50,866
Um, but from there I did design
work for them, like app design

890
00:48:50,866 --> 00:48:53,616
work, and then from there got
pushed into doing more development

891
00:48:53,626 --> 00:48:55,456
to build things that I designed.

892
00:48:55,706 --> 00:48:58,286
Uh, it was a real kind of
trial by fire situation.

893
00:48:58,336 --> 00:49:02,056
Um, But that's how, that's how
this kind of thing started.

894
00:49:02,156 --> 00:49:04,926
It all started with illustration,
then design, then building

895
00:49:04,926 --> 00:49:05,856
the things that I designed.

896
00:49:06,326 --> 00:49:10,276
Are there some learnings that you
take away from biology or urban

897
00:49:10,276 --> 00:49:14,486
planning that you now apply to
designing or to software engineering?

898
00:49:14,826 --> 00:49:18,386
I guess kind of at a high level way, like
biology and urban planning are both sort

899
00:49:18,386 --> 00:49:23,981
of the The study of systems, like the
systems in your body, or the systems of

900
00:49:23,981 --> 00:49:29,471
how traffic flows on the street, or how,
you know, like cities develop, um, from

901
00:49:29,471 --> 00:49:34,861
like medieval towns into regimented grid,
like, uh, structures and and streets.

902
00:49:34,991 --> 00:49:36,301
And so I guess, um.

903
00:49:36,541 --> 00:49:40,111
One example is like when you see like
how people organize themselves and

904
00:49:40,111 --> 00:49:43,771
their teams or how they, you know,
like identify their projects, there

905
00:49:43,771 --> 00:49:45,281
are kind of a lot of similarities.

906
00:49:45,281 --> 00:49:48,701
It's almost like a pale imitation
of biology and city planning

907
00:49:49,131 --> 00:49:51,451
or in terms of the complexity.

908
00:49:51,481 --> 00:49:55,991
But so I'm really inspired by, like,
the biological process mitosis for one,

909
00:49:56,021 --> 00:50:00,591
where an individual cell gets really
big over time and at a certain point,

910
00:50:00,861 --> 00:50:05,431
moving information from the edge of the
cell to the middle, like the nucleus,

911
00:50:05,431 --> 00:50:07,776
where all the processing is done.

912
00:50:07,896 --> 00:50:11,096
Um, the high level thinking is
done gets it takes too long.

913
00:50:11,146 --> 00:50:15,646
And so what a cell does is instead
of, like, adding scaffolding or trying

914
00:50:15,646 --> 00:50:20,456
to, you know like make that, that
cell more complex than it should be.

915
00:50:20,656 --> 00:50:25,196
It just splits itself into two pieces,
obtaining like the core parts from

916
00:50:25,196 --> 00:50:28,826
both so that each little, little new
piece can be much more efficient.

917
00:50:28,826 --> 00:50:32,256
And I think, you know, that's something
that like, that we do when we try and

918
00:50:32,256 --> 00:50:37,146
like cut down scope, break a big problem
into small problems, or just, you know,

919
00:50:37,156 --> 00:50:39,726
break a big document into little ones.

920
00:50:39,806 --> 00:50:43,406
And that's also why I like, That's
also kind of the heart of the thinking

921
00:50:43,446 --> 00:50:48,116
of cards as an atomic unit of thought
with a character limit, kind of

922
00:50:48,116 --> 00:50:49,776
like a tweet level character limit.

923
00:50:49,986 --> 00:50:53,776
It's because it, that constraint
does force you to think

924
00:50:53,786 --> 00:50:54,966
more, I guess you could say.

925
00:50:55,216 --> 00:50:56,826
Yeah, this is fascinating.

926
00:50:56,846 --> 00:51:01,781
I think there's so many, Ideals in
software engineering that I'm drawn

927
00:51:01,781 --> 00:51:08,031
to such as like composability and like
principle of like locality and now that

928
00:51:08,041 --> 00:51:12,351
you say it, uh, those are like nature
got that figured out like long time

929
00:51:12,351 --> 00:51:17,721
ago where like all of our organs and
like on a much smaller scale, this all

930
00:51:17,721 --> 00:51:22,921
composes and there's things emerging,
us emerging, civilizations emerging.

931
00:51:23,261 --> 00:51:29,076
So yeah, I think there's the great
Case study to study nature and be

932
00:51:29,076 --> 00:51:31,026
inspired for building better products.

933
00:51:31,446 --> 00:51:32,156
Yeah, absolutely.

934
00:51:32,166 --> 00:51:34,676
It's one of those things where you
see it and then you can't unsee it.

935
00:51:35,026 --> 00:51:35,496
Yeah.

936
00:51:35,526 --> 00:51:37,766
Thank you so much for, for
sharing that perspective.

937
00:51:38,256 --> 00:51:43,836
So you're not just a great engineer, but
also a great designer that shows in like

938
00:51:43,846 --> 00:51:45,466
all the products that you're building.

939
00:51:45,706 --> 00:51:50,106
And I think that sort of intersection
of being an engineer and a designer,

940
00:51:50,356 --> 00:51:54,626
I think that's a, Rare trade
that I feel myself very drawn to.

941
00:51:54,626 --> 00:51:56,076
And I want to learn more about that.

942
00:51:56,176 --> 00:52:01,116
Are there any sort of hints or
words of advice that you would

943
00:52:01,116 --> 00:52:05,276
give people how they can, as an
engineer, become a better designer?

944
00:52:05,356 --> 00:52:07,406
Yeah, that's a great question.

945
00:52:07,406 --> 00:52:11,796
I think a lot of the, the applications we
have now, like one example, uh, that we

946
00:52:11,796 --> 00:52:14,871
talked about with, you know, you submit a
form and then you've got to wait For the

947
00:52:14,871 --> 00:52:19,601
form response to come back from the server
before the app lets you do other things.

948
00:52:19,601 --> 00:52:23,681
And a lot of that is caused by a
disassociation or a separation between

949
00:52:23,701 --> 00:52:25,131
what a designer thinks is possible.

950
00:52:25,131 --> 00:52:29,571
And when an engineer is like, like
their level of interest in the design.

951
00:52:29,831 --> 00:52:33,411
And so I think if to answer the question
of like a programmer wanting to do

952
00:52:33,411 --> 00:52:37,861
more design, I think a trap people
fall into is like, there's two traps.

953
00:52:38,121 --> 00:52:41,171
One is, Hey, I need to figure out
how to make things look better.

954
00:52:41,301 --> 00:52:44,841
Pretty before I start and like, you know,
how do they like what is attractive?

955
00:52:44,841 --> 00:52:45,601
What is aesthetic?

956
00:52:45,611 --> 00:52:49,561
So thinking of design as as like,
you know the lipstick on a pig it's

957
00:52:49,561 --> 00:52:53,341
definitely a trap I feel people fall
into but I think the other side to it

958
00:52:53,341 --> 00:52:57,436
is like not understanding that design
is kind of like Being a chameleon

959
00:52:57,436 --> 00:52:58,626
for whatever you're designing for.

960
00:52:58,626 --> 00:53:04,196
So let's say you're designing an app for
nurses to do some sort of nursing task.

961
00:53:04,246 --> 00:53:07,436
The designer's role in that case
isn't necessarily to be like, Hey,

962
00:53:07,436 --> 00:53:08,776
how do I make this button look great?

963
00:53:09,006 --> 00:53:11,096
But to be like, what does the nurse need?

964
00:53:11,386 --> 00:53:12,686
Like, when do they need it?

965
00:53:12,706 --> 00:53:13,706
How do they need it?

966
00:53:13,826 --> 00:53:16,256
And that's things that an
engineer should also know.

967
00:53:16,356 --> 00:53:21,586
And In situations like that, where
both, both sides of the product building

968
00:53:21,596 --> 00:53:25,086
experience, whether that's your own head,
both sides of your own head, or a separate

969
00:53:25,086 --> 00:53:28,006
engineer and developer, they both kind
of come into it with the idea of like,

970
00:53:28,196 --> 00:53:30,566
hey, what's the best thing for a nurse?

971
00:53:30,676 --> 00:53:31,896
Uh, when do they need it?

972
00:53:31,906 --> 00:53:32,776
What do they need?

973
00:53:32,986 --> 00:53:35,046
Like, that's how really
great design happens.

974
00:53:35,176 --> 00:53:38,686
And yeah, an engineer also
has this advantage of knowing,

975
00:53:39,126 --> 00:53:42,536
having access to like, technical
information that a designer doesn't.

976
00:53:42,826 --> 00:53:46,336
So one example in Kinopio is, you know,
as we mentioned, like, you can just

977
00:53:46,366 --> 00:53:50,576
click to type a card, and you can type
freeform text, and that'll be a text

978
00:53:50,576 --> 00:53:54,896
card, or you can drag an image in, or
paste in an image URL from wherever,

979
00:53:54,896 --> 00:53:57,196
and that'll also become a thing.

980
00:53:57,396 --> 00:54:01,366
That's because, as the engineer side
of my brain knows, hey, we can just

981
00:54:01,366 --> 00:54:04,646
use regex and determine what is what.

982
00:54:05,096 --> 00:54:08,476
There may be new opportunities
for that with AI, but the

983
00:54:08,476 --> 00:54:09,876
fundamental idea of, like, just.

984
00:54:10,196 --> 00:54:13,646
Like, knowing that you know something
that someone else doesn't know.

985
00:54:13,786 --> 00:54:18,216
It's like, like, like thinking past what
you can see and kind of knowing the full

986
00:54:18,596 --> 00:54:22,396
possibilities of what you can do is kind
of the most important part of design.

987
00:54:22,556 --> 00:54:24,146
Yeah, that, that's great advice.

988
00:54:24,196 --> 00:54:29,641
Uh, I think about like most things
that you use to build stuff with as

989
00:54:29,641 --> 00:54:34,651
materials that's in the real world, but
also digital materials, whether that's

990
00:54:34,651 --> 00:54:36,731
code or whether that's other things.

991
00:54:37,191 --> 00:54:42,351
And so I think it's actually more
folks should try to assume a bit of

992
00:54:42,361 --> 00:54:44,401
like different disciplines as well.

993
00:54:44,431 --> 00:54:48,201
Like look at the same material from
different angles, from the engineering

994
00:54:48,211 --> 00:54:50,281
angle, but also from the design angle.

995
00:54:50,601 --> 00:54:53,531
I think this is where you can
build much better products.

996
00:54:53,561 --> 00:54:57,521
And also quoting a previous
episode we've done with Rasmus

997
00:54:57,551 --> 00:55:01,201
Andersson, who's referenced this
concept of mechanical empathy.

998
00:55:01,641 --> 00:55:04,851
This is very much from like
a engineering perspective.

999
00:55:04,861 --> 00:55:07,101
What does the material allow me to do?

1000
00:55:07,331 --> 00:55:11,251
What does like the, the hardware
this is running on allow me to do?

1001
00:55:11,261 --> 00:55:15,111
Or what does the web
ecosystem allow me to do?

1002
00:55:15,141 --> 00:55:16,161
Do I use the DOM?

1003
00:55:16,161 --> 00:55:17,051
Do I use the canvas?

1004
00:55:17,701 --> 00:55:20,311
And, uh, those materials
that I have available.

1005
00:55:20,601 --> 00:55:23,061
What does that allow me to,
to build the best product?

1006
00:55:23,291 --> 00:55:26,741
So thank you so much for, for
sharing all of this with us.

1007
00:55:26,871 --> 00:55:31,011
Is there anything that you want to tell
the audience or share with the audience?

1008
00:55:31,371 --> 00:55:34,011
I guess if I want to share one thing,
it's something we've already mentioned.

1009
00:55:34,041 --> 00:55:39,491
Um, my blog, which I have been writing
on and off for, I guess, since 2014.

1010
00:55:39,521 --> 00:55:40,551
Don't read the old articles.

1011
00:55:40,551 --> 00:55:43,131
They suck, but the new
ones are pretty good.

1012
00:55:43,131 --> 00:55:44,711
They're, I kind of try and write about.

1013
00:55:45,131 --> 00:55:48,751
technical or design topics in a
way that's more approachable to

1014
00:55:48,771 --> 00:55:51,281
even non technically minded people.

1015
00:55:51,331 --> 00:55:54,651
They give like, you know, a lot of high
level overviews of how Canopia was made,

1016
00:55:54,651 --> 00:55:56,371
how Glitch is designed, things like that.

1017
00:55:56,451 --> 00:56:00,621
And yeah, check it out if you feel like
reading some good blog posts, I think.

1018
00:56:00,811 --> 00:56:01,431
Perfect.

1019
00:56:01,501 --> 00:56:02,901
I definitely recommend that.

1020
00:56:02,981 --> 00:56:06,711
I've enjoyed the few blog
posts I've read quite a lot.

1021
00:56:06,891 --> 00:56:07,951
So yeah.

1022
00:56:08,121 --> 00:56:12,011
Thank you so much for coming on the
podcast and sharing all of your wisdom.

1023
00:56:12,131 --> 00:56:12,501
Thank you.

1024
00:56:13,091 --> 00:56:14,111
Thanks so much for having me.

1025
00:56:14,882 --> 00:56:17,422
Thank you for listening to
the localfirst.fm podcast.

1026
00:56:17,662 --> 00:56:21,392
If you've enjoyed this episode and haven't
done so already, please subscribe and

1027
00:56:21,392 --> 00:56:23,152
leave a review wherever you're listening.

1028
00:56:23,522 --> 00:56:24,952
Please also tell your friends about it.

1029
00:56:24,962 --> 00:56:28,532
If you think they could be interested
in local-first, if you have feedback,

1030
00:56:28,572 --> 00:56:32,312
questions or ideas for the podcast,
please get in touch via hello at

1031
00:56:32,312 --> 00:56:38,092
localfirst.fm or use the feedback form on
our website, special thanks to Expo and

1032
00:56:38,092 --> 00:56:40,142
Crab Nebula for supporting this podcast.

1033
00:56:40,542 --> 00:56:41,302
See you next time.