1
00:00:00,080 --> 00:00:02,000
I'm coming to them and saying, learn this

2
00:00:02,000 --> 00:00:04,160
entirely new way to write TypeScript.

3
00:00:04,160 --> 00:00:06,400
Trust me, bro, it'll be worth it.

4
00:00:06,400 --> 00:00:08,560
And it helps to like have some examples I

5
00:00:08,560 --> 00:00:11,360
can point to. And I think I recall one

6
00:00:11,360 --> 00:00:13,120
team member of the one actually with

7
00:00:13,120 --> 00:00:14,960
prior TypeScript experience.

8
00:00:14,960 --> 00:00:16,880
He he trusted me enough to give it a try.

9
00:00:16,880 --> 00:00:19,680
And he said it really clicked for him

10
00:00:19,680 --> 00:00:21,760
when he was writing tests, actually,

11
00:00:21,760 --> 00:00:24,720
because he mocked some layer or

12
00:00:24,720 --> 00:00:27,120
wrote a test layer for for some service.

13
00:00:27,120 --> 00:00:29,440
And he's like, oh, this is what I can do

14
00:00:29,440 --> 00:00:31,760
with this and like isolate just certain

15
00:00:31,760 --> 00:00:32,880
services and tests

16
00:00:32,880 --> 00:00:34,400
just the core business logic.

17
00:00:34,400 --> 00:00:36,240
And it's super helpful there. But

18
00:00:36,240 --> 00:00:37,520
that was the moment that clicked for him.

19
00:00:37,520 --> 00:00:39,200
I think we've all had sort

20
00:00:39,200 --> 00:00:41,547
of that that moment, you know, that that

21
00:00:41,547 --> 00:00:42,320
is just like, oh, this is

22
00:00:42,320 --> 00:00:43,760
what this is capable of.

23
00:00:43,760 --> 00:00:44,880
This needs to be sort of

24
00:00:44,880 --> 00:00:46,160
everywhere on a code base.

25
00:00:49,600 --> 00:00:52,000
Welcome to Cause & Effect, a podcast

26
00:00:52,000 --> 00:00:53,840
about the TypeScript library and

27
00:00:53,840 --> 00:00:56,160
ecosystem called Effect, helping

28
00:00:56,160 --> 00:00:57,120
engineers to build

29
00:00:57,120 --> 00:00:58,800
production-ready software.

30
00:00:58,800 --> 00:01:00,560
I'm your host, Johannes Schickling, and

31
00:01:00,560 --> 00:01:01,440
I've been building with

32
00:01:01,440 --> 00:01:03,120
Effect for over four years.

33
00:01:03,120 --> 00:01:05,360
With this podcast, I want to help others

34
00:01:05,360 --> 00:01:06,640
understand the powers and

35
00:01:06,640 --> 00:01:08,720
benefits of using Effect.

36
00:01:08,720 --> 00:01:10,640
In this episode, I'm talking to Adam

37
00:01:10,640 --> 00:01:14,400
Rankin, CTO of Warp, a YC-backed payroll,

38
00:01:14,400 --> 00:01:17,520
payments, and HR platform for startups.

39
00:01:17,520 --> 00:01:19,600
In this conversation, Adam shares his

40
00:01:19,600 --> 00:01:21,840
path from Rails to TypeScript and how

41
00:01:21,840 --> 00:01:24,480
Warp incrementally adopted Effect across

42
00:01:24,480 --> 00:01:26,880
a single fast-moving monolith.

43
00:01:26,880 --> 00:01:28,880
Let's get into it.

44
00:01:28,880 --> 00:01:30,320
Hey Adam, it's so nice

45
00:01:30,320 --> 00:01:31,520
to have you on the show.

46
00:01:31,520 --> 00:01:32,320
How are you doing?

47
00:01:32,320 --> 00:01:33,760
Doing well, thanks for having me.

48
00:01:33,760 --> 00:01:34,960
Excited to be here.

49
00:01:34,960 --> 00:01:36,800
Yeah, I'm really excited to

50
00:01:36,800 --> 00:01:38,640
learn more about Warp today.

51
00:01:38,640 --> 00:01:40,480
But before we talk about Warp, do you

52
00:01:40,480 --> 00:01:43,040
mind sharing more about who you are and a

53
00:01:43,040 --> 00:01:45,200
little bit of your background?

54
00:01:45,200 --> 00:01:48,800
Sure, so I'm Adam. I'm the CTO of Warp.

55
00:01:48,800 --> 00:01:51,280
I came to Warp maybe three years ago,

56
00:01:51,280 --> 00:01:53,280
started it with the CEO who

57
00:01:53,280 --> 00:01:55,200
I actually met on Twitter.

58
00:01:55,200 --> 00:01:56,400
Before that, I've only

59
00:01:56,400 --> 00:01:58,080
ever worked at startups.

60
00:01:58,080 --> 00:02:00,960
I have experience building web apps of

61
00:02:00,960 --> 00:02:03,680
all sizes using mostly Ruby on Rails.

62
00:02:03,680 --> 00:02:06,560
And I trained as an engineer in school.

63
00:02:06,560 --> 00:02:07,520
That is awesome.

64
00:02:07,520 --> 00:02:09,600
So you mentioned like most of your

65
00:02:09,600 --> 00:02:12,080
background being in Ruby on Rails.

66
00:02:12,080 --> 00:02:14,080
Can you already foreshadow a little bit

67
00:02:14,080 --> 00:02:15,520
of like how you went from

68
00:02:15,520 --> 00:02:17,920
Ruby on Rails to TypeScript?

69
00:02:17,920 --> 00:02:19,680
Did that happen at Warp?

70
00:02:19,680 --> 00:02:20,880
Did that already happen

71
00:02:20,880 --> 00:02:22,560
as sort of a prior role?

72
00:02:22,560 --> 00:02:24,640
Sure, so I actually started

73
00:02:24,640 --> 00:02:26,560
my career in Ruby on Rails.

74
00:02:26,560 --> 00:02:28,400
I worked at a startup while I was in

75
00:02:28,400 --> 00:02:29,120
school who was

76
00:02:29,120 --> 00:02:31,920
building a web app on Rails.

77
00:02:31,920 --> 00:02:33,520
And I actually didn't know any

78
00:02:33,520 --> 00:02:34,880
other way to build a web app.

79
00:02:34,880 --> 00:02:36,640
It's a great experience, Rails.

80
00:02:36,640 --> 00:02:38,720
It's very opinionated.

81
00:02:38,720 --> 00:02:40,560
Ruby is a very sort of

82
00:02:40,560 --> 00:02:41,760
easy language to write.

83
00:02:41,760 --> 00:02:44,080
I like to say if you know English, you

84
00:02:44,080 --> 00:02:45,680
know Ruby because you're just kind of

85
00:02:45,680 --> 00:02:47,360
like guessing the

86
00:02:47,360 --> 00:02:49,360
method names and they exist.

87
00:02:49,360 --> 00:02:51,280
And then I actually sort of took a long

88
00:02:51,280 --> 00:02:53,440
break from it while I was writing some

89
00:02:53,440 --> 00:02:57,360
Python and various backend services for a

90
00:02:57,360 --> 00:02:59,200
bigger company, a banking company.

91
00:02:59,200 --> 00:03:01,440
And then when it came time to start Warp,

92
00:03:01,440 --> 00:03:02,320
we kind of were

93
00:03:02,320 --> 00:03:03,840
choosing our initial stack.

94
00:03:03,840 --> 00:03:05,440
And we were choosing something that could

95
00:03:05,440 --> 00:03:08,160
make us move as fast as possible and ship

96
00:03:08,160 --> 00:03:09,680
early features to customers.

97
00:03:09,680 --> 00:03:11,840
And at the end of the day, I basically

98
00:03:11,840 --> 00:03:13,520
googled, you know, what do

99
00:03:13,520 --> 00:03:15,920
people use in web apps nowadays?

100
00:03:15,920 --> 00:03:17,440
And it's like, okay,

101
00:03:17,440 --> 00:03:19,520
Next.js has some cool logos.

102
00:03:19,520 --> 00:03:20,640
Let's try this.

103
00:03:20,640 --> 00:03:22,160
And that's sort of how we

104
00:03:22,160 --> 00:03:23,440
started with TypeScript.

105
00:03:24,240 --> 00:03:25,920
I actually want to linger a little bit

106
00:03:25,920 --> 00:03:29,120
more on that because I feel like that

107
00:03:29,120 --> 00:03:31,520
there is still some aspects about like

108
00:03:31,520 --> 00:03:33,920
Ruby on Rails is not bad it is like I'm

109
00:03:33,920 --> 00:03:35,840
not sure numbers wise, I wouldn't be

110
00:03:35,840 --> 00:03:38,800
surprised if it has more usage than ever

111
00:03:38,800 --> 00:03:41,920
before, just because like the well, many,

112
00:03:41,920 --> 00:03:43,840
many people are building software in

113
00:03:43,840 --> 00:03:45,520
many, many different ways.

114
00:03:45,520 --> 00:03:48,720
I think like one of the like North stars of

115
00:03:48,720 --> 00:03:50,880
like what developer experience can be

116
00:03:50,880 --> 00:03:53,520
like that I think in many regards, the

117
00:03:53,520 --> 00:03:56,000
TypeScript ecosystem has not been able to

118
00:03:56,000 --> 00:03:58,880
replicate partially due to just the

119
00:03:58,880 --> 00:04:01,040
constraints of the language, but also

120
00:04:01,040 --> 00:04:03,760
like there's some like vibes and some

121
00:04:03,760 --> 00:04:06,000
like maturity and some like elegance of

122
00:04:06,000 --> 00:04:07,840
the ecosystem that I also

123
00:04:07,840 --> 00:04:10,560
think like kind of culturally is

124
00:04:10,560 --> 00:04:12,320
quite different in the JavaScript and

125
00:04:12,320 --> 00:04:14,960
TypeScript ecosystem and I

126
00:04:14,960 --> 00:04:17,040
don't agree with like all the

127
00:04:17,040 --> 00:04:18,760
perspectives that the Ruby

128
00:04:18,760 --> 00:04:21,920
on Rails creator DHH has.

129
00:04:21,920 --> 00:04:23,280
I still think that there's

130
00:04:23,280 --> 00:04:25,040
like very interesting ideas.

131
00:04:25,040 --> 00:04:27,360
So I'm curious whether you're still kind

132
00:04:27,360 --> 00:04:29,600
of like keeping up with the developments

133
00:04:29,600 --> 00:04:31,600
where it's like Ruby on Rails is going

134
00:04:31,600 --> 00:04:33,440
whether you're still can derive like some

135
00:04:33,440 --> 00:04:35,280
inspiration from that ecosystem.

136
00:04:35,280 --> 00:04:37,040
I haven't kept up with the development

137
00:04:37,040 --> 00:04:39,760
lately. It's funny you say that because

138
00:04:39,760 --> 00:04:41,520
Rails is definitely lingering. It's

139
00:04:41,520 --> 00:04:42,800
definitely still strong.

140
00:04:42,800 --> 00:04:45,520
You know, every I feel like once a month,

141
00:04:45,520 --> 00:04:48,240
you find out like a new website or some

142
00:04:48,240 --> 00:04:51,200
new product that has billions of users or

143
00:04:51,200 --> 00:04:53,360
sorry, millions of users and it's like,

144
00:04:53,360 --> 00:04:55,440
wait, they're on Rails. No way.

145
00:04:55,440 --> 00:04:57,200
So many like of these huge products

146
00:04:57,200 --> 00:04:59,120
started on Rails and I think it's because

147
00:04:59,120 --> 00:05:02,240
it has so much out of the box that you

148
00:05:02,240 --> 00:05:04,960
you need to run like like jobs for

149
00:05:04,960 --> 00:05:07,360
example, you know, you pick up a

150
00:05:07,360 --> 00:05:09,440
TypeScript project and you're like, how

151
00:05:09,440 --> 00:05:11,680
do I queue up some background job and

152
00:05:11,680 --> 00:05:15,040
like respond to my users API request and

153
00:05:15,040 --> 00:05:16,240
in Rails, that's kind

154
00:05:16,240 --> 00:05:18,400
of trivial in TypeScript.

155
00:05:18,400 --> 00:05:21,280
There's no opinionated way to do that.

156
00:05:21,280 --> 00:05:22,560
People are doing all kinds of different

157
00:05:22,560 --> 00:05:24,160
things. You have to kind of build your

158
00:05:24,160 --> 00:05:25,920
stack more and think about it.

159
00:05:25,920 --> 00:05:28,400
I think good DX tends to always win. That's

160
00:05:28,400 --> 00:05:31,040
why we see Next JS on Vercel winning.

161
00:05:31,040 --> 00:05:33,360
Rails is super easy and it kind of

162
00:05:33,360 --> 00:05:35,520
abstracts away the complications of doing

163
00:05:35,520 --> 00:05:38,160
a lot of infrastructure heavy activity.

164
00:05:38,160 --> 00:05:39,680
And I think that's something that the

165
00:05:39,680 --> 00:05:41,200
TypeScript ecosystem in

166
00:05:41,200 --> 00:05:43,200
general is, you know, behind on.

167
00:05:43,200 --> 00:05:45,520
Yeah, I definitely agree. I think what

168
00:05:45,520 --> 00:05:47,280
you've mentioned about like the queuing

169
00:05:47,280 --> 00:05:49,760
system or like any kind of common

170
00:05:49,760 --> 00:05:52,880
canonical thing. Yes, it is possible with

171
00:05:52,880 --> 00:05:55,840
TypeScript, but you like open 10

172
00:05:55,840 --> 00:05:58,000
different blog posts that show you how is

173
00:05:58,000 --> 00:06:00,000
like any find 10 different ways.

174
00:06:00,000 --> 00:06:02,400
Whereas like in the Ruby and Rails world,

175
00:06:02,400 --> 00:06:04,240
like you have 10 blog posts and they all

176
00:06:04,240 --> 00:06:06,400
show the same like there's just like in

177
00:06:06,400 --> 00:06:08,480
one world you're kind of like at ease

178
00:06:08,480 --> 00:06:11,122
where you feel like okay like all roads

179
00:06:11,122 --> 00:06:11,200
where you feel like okay like all roads
where you feel like okay like all roads

180
00:06:11,200 --> 00:06:13,360
lead to Rome and like in the TypeScript

181
00:06:13,360 --> 00:06:15,120
world is like wait what like no this is

182
00:06:15,120 --> 00:06:16,640
like entirely different

183
00:06:16,640 --> 00:06:18,800
stack like should I use that?

184
00:06:18,800 --> 00:06:20,720
Oh no, people like in Reddit say like

185
00:06:20,720 --> 00:06:22,480
it's dead. Should I use that? And it's

186
00:06:22,480 --> 00:06:25,120
just like it's a very different world.

187
00:06:25,120 --> 00:06:27,920
And I think there's like a lot positive

188
00:06:27,920 --> 00:06:30,240
to be said about about that where like I

189
00:06:30,240 --> 00:06:32,880
think it's a it's a richer place for

190
00:06:32,880 --> 00:06:35,600
different ideas to like be

191
00:06:35,600 --> 00:06:38,160
be explored at the same time.

192
00:06:38,160 --> 00:06:40,480
But there's also the kind of like

193
00:06:40,480 --> 00:06:43,040
confusion that and sometimes even like

194
00:06:43,040 --> 00:06:45,040
like paralysis of choice that

195
00:06:45,040 --> 00:06:47,360
comes alongside. And

196
00:06:47,360 --> 00:06:49,200
you see a similar thing also in

197
00:06:49,200 --> 00:06:52,000
other language ecosystems, Java obviously

198
00:06:52,000 --> 00:06:54,240
being a big one, but I think in Java, you

199
00:06:54,240 --> 00:06:56,400
have something like Spring etc that has

200
00:06:56,400 --> 00:06:58,880
more of like that that rails kind of

201
00:06:58,880 --> 00:07:02,000
coercion in in one direction.

202
00:07:02,000 --> 00:07:05,200
And I think this is also for if we're not

203
00:07:05,200 --> 00:07:07,120
bringing things back to to Effect, what

204
00:07:07,120 --> 00:07:08,560
we want to talk today about.

205
00:07:08,560 --> 00:07:10,880
I think this is also one of the big

206
00:07:10,880 --> 00:07:13,680
pieces of potential of effect. Yes, it

207
00:07:13,680 --> 00:07:16,080
gives you individual building blocks, but

208
00:07:16,080 --> 00:07:19,120
they all fit together in one holistic

209
00:07:19,120 --> 00:07:22,400
cohesive way of building software that I

210
00:07:22,400 --> 00:07:24,480
think can actually bring a lot of the

211
00:07:25,040 --> 00:07:28,000
nice coherent aspects of something like

212
00:07:28,000 --> 00:07:29,760
Ruby and Rails or something of

213
00:07:29,760 --> 00:07:32,400
like Spring Boot to the the TypeScript

214
00:07:32,400 --> 00:07:34,880
world. And so yeah, and I think we're

215
00:07:34,880 --> 00:07:36,880
going to hear quite a lot about that

216
00:07:36,880 --> 00:07:38,560
today is like in the way how you're

217
00:07:38,560 --> 00:07:40,480
building Warp. So thanks a lot for for

218
00:07:40,480 --> 00:07:42,720
sharing your background and like

219
00:07:42,720 --> 00:07:44,400
which twisted paths you've

220
00:07:44,400 --> 00:07:46,400
taken through the world

221
00:07:46,400 --> 00:07:48,160
of software development.

222
00:07:48,160 --> 00:07:50,560
Maybe before we dive into all things

223
00:07:50,560 --> 00:07:52,240
technical, can you share a little bit

224
00:07:52,240 --> 00:07:54,240
more about Warp? So you mentioned you

225
00:07:54,240 --> 00:07:56,560
started it together with a friend who you

226
00:07:56,560 --> 00:07:57,680
met over over the

227
00:07:57,680 --> 00:07:59,520
internet three years ago.

228
00:07:59,520 --> 00:08:02,080
Like how quickly did things develop? Like

229
00:08:02,080 --> 00:08:03,840
I think today it's no longer just the two

230
00:08:03,840 --> 00:08:06,480
of you, but you I believe like you you

231
00:08:06,480 --> 00:08:08,800
raised a fairly big round recently.

232
00:08:08,800 --> 00:08:11,440
Can you share more about the company and

233
00:08:11,440 --> 00:08:13,680
maybe starting with what is Warp? What is

234
00:08:13,680 --> 00:08:16,240
the product and the goal of Warp?

235
00:08:16,240 --> 00:08:18,800
Yeah, definitely. So we have sort of a

236
00:08:18,800 --> 00:08:21,200
funny origin story. I met the

237
00:08:21,200 --> 00:08:24,400
founder on Twitter in sort of this

238
00:08:24,400 --> 00:08:26,960
pseudonymous era where where people were

239
00:08:26,960 --> 00:08:29,760
using like fake Twitters to sort of meet

240
00:08:29,760 --> 00:08:32,320
each other and he had announced a project

241
00:08:32,320 --> 00:08:33,320
that he was working on

242
00:08:33,320 --> 00:08:34,640
and he raised money for

243
00:08:34,640 --> 00:08:36,240
I thought it was cool. It was actually a

244
00:08:36,240 --> 00:08:39,120
consumer social app. So I had joined it

245
00:08:39,120 --> 00:08:41,440
and and we kind of connected on there

246
00:08:41,440 --> 00:08:43,520
And he had posted on there that he was

247
00:08:43,520 --> 00:08:45,360
looking for engineers and I was sort of

248
00:08:45,360 --> 00:08:48,240
looking for my next thing at the time.

249
00:08:48,240 --> 00:08:51,440
So we actually met each other and agreed

250
00:08:51,440 --> 00:08:53,040
to work together before we knew each

251
00:08:53,040 --> 00:08:55,120
other's names. I always like to tell that

252
00:08:55,120 --> 00:08:56,960
story because it's super funny. I was

253
00:08:57,840 --> 00:09:00,160
visiting my parents at the time

254
00:09:00,160 --> 00:09:03,040
And I was like, oh, I have sort of a job

255
00:09:03,040 --> 00:09:05,280
interview and they were like, you know,

256
00:09:05,280 --> 00:09:08,080
with who? And I was I was like, I don't

257
00:09:08,080 --> 00:09:09,200
know his name, so I

258
00:09:09,200 --> 00:09:10,240
can't really tell you that.

259
00:09:11,840 --> 00:09:13,760
And there was a peak of covid as well,

260
00:09:13,760 --> 00:09:16,800
right? Yes, yes, this is like 2021.

261
00:09:16,800 --> 00:09:18,160
at the time for some

262
00:09:18,160 --> 00:09:20,800
personal context, I was like kind of

263
00:09:20,800 --> 00:09:22,320
playing with the idea of starting my own

264
00:09:22,320 --> 00:09:24,960
thing. I had left my previous role. I was

265
00:09:24,960 --> 00:09:27,200
actually living a nomadic life. I was

266
00:09:27,200 --> 00:09:29,360
living in a different city every month.

267
00:09:29,360 --> 00:09:32,640
So I found this social app. I met the

268
00:09:32,640 --> 00:09:35,360
founder of it. We agreed to work together

269
00:09:35,360 --> 00:09:36,800
on this social app. It

270
00:09:36,800 --> 00:09:41,200
was Swift UI, AWS, Firebase.

271
00:09:41,200 --> 00:09:44,720
And when you build a consumer social app,

272
00:09:44,720 --> 00:09:45,840
you need to monetize it

273
00:09:45,840 --> 00:09:47,760
eventually. And there are only two ways

274
00:09:47,760 --> 00:09:49,600
to do that. And it's to get people to pay

275
00:09:49,600 --> 00:09:52,640
or to get people to see ads.

276
00:09:52,640 --> 00:09:55,200
And if you're not growing with some

277
00:09:55,200 --> 00:09:57,840
insane K factor, then you're not going to

278
00:09:57,840 --> 00:10:00,080
make any money on ads. So we ended up sun

279
00:10:00,080 --> 00:10:01,920
setting the project and sort of going

280
00:10:01,920 --> 00:10:04,080
back to the drawing board and saying, you

281
00:10:04,080 --> 00:10:05,600
know, what can we build?

282
00:10:05,600 --> 00:10:08,080
And again, this was mid covid. We were

283
00:10:08,080 --> 00:10:11,440
using a competitor, payroll product at the

284
00:10:11,440 --> 00:10:14,720
time. And our sort of insight was that,

285
00:10:14,720 --> 00:10:15,920
you know, remote work is not going

286
00:10:15,920 --> 00:10:19,120
anywhere. There's a lot of compliance

287
00:10:19,120 --> 00:10:21,520
work in paying remote teams and paying

288
00:10:21,520 --> 00:10:22,480
people across the globe

289
00:10:22,480 --> 00:10:24,160
and across the country.

290
00:10:24,160 --> 00:10:26,880
There are thousands of tax jurisdictions

291
00:10:26,880 --> 00:10:29,120
like what if we could just take all of

292
00:10:29,120 --> 00:10:32,800
this off the plate of founders and build

293
00:10:32,800 --> 00:10:36,960
a payroll payments HR products tailor

294
00:10:36,960 --> 00:10:38,640
made for startups and founders.

295
00:10:38,640 --> 00:10:41,520
So that sort of was our initial insight.

296
00:10:41,520 --> 00:10:45,760
We joined YC and started talking to

297
00:10:45,760 --> 00:10:48,960
startups and other small customers. It's

298
00:10:48,960 --> 00:10:51,040
like, what do you need? Let us handle it.

299
00:10:51,040 --> 00:10:52,480
And that's sort of how we got started.

300
00:10:52,480 --> 00:10:54,640
And our roadmap has sort of been built

301
00:10:54,640 --> 00:10:57,040
from there. We've like built a lot of the

302
00:10:57,040 --> 00:10:58,880
table stakes features you need. And now

303
00:10:58,880 --> 00:11:01,440
it's very product driven by like

304
00:11:01,440 --> 00:11:02,960
what people are requesting.

305
00:11:02,960 --> 00:11:05,200
And then sort of in conjunction with

306
00:11:05,200 --> 00:11:07,440
the whole covid thing, the LLM

307
00:11:07,440 --> 00:11:09,440
revolution has sort of come along. So

308
00:11:09,440 --> 00:11:12,320
we're now exploring ways to be more AI

309
00:11:12,320 --> 00:11:15,120
native and use these things for

310
00:11:15,120 --> 00:11:16,960
automating different processes that that

311
00:11:16,960 --> 00:11:17,600
we don't want to do.

312
00:11:17,600 --> 00:11:19,440
And our customers don't want to do so.

313
00:11:19,440 --> 00:11:20,960
Hopefully that's that's a good background

314
00:11:20,960 --> 00:11:23,280
on kind of how we started and what we do.

315
00:11:23,280 --> 00:11:25,200
Oh, most certainly. And I want to make

316
00:11:25,200 --> 00:11:28,000
sure that we come back to the AI native

317
00:11:28,000 --> 00:11:30,400
automation part as well as that's another

318
00:11:30,400 --> 00:11:31,120
key interest of

319
00:11:31,120 --> 00:11:32,560
mine currently as well.

320
00:11:32,560 --> 00:11:35,280
But I want to linger a little bit more on

321
00:11:35,280 --> 00:11:37,920
sort of like your personal relationship

322
00:11:37,920 --> 00:11:41,200
to Warp as you went from building a

323
00:11:41,200 --> 00:11:44,640
consumer app to now building a software

324
00:11:44,640 --> 00:11:46,400
for other startups, etc.

325
00:11:46,400 --> 00:11:49,760
I guess much more B2B. And I think there

326
00:11:49,760 --> 00:11:52,560
is kind of two perspectives on like how a

327
00:11:52,560 --> 00:11:55,360
startup founder can end up building

328
00:11:55,360 --> 00:11:57,360
something either kind of out

329
00:11:57,360 --> 00:11:59,520
of love or out of frustration.

330
00:11:59,520 --> 00:12:01,680
What I mean with this, you love something

331
00:12:01,680 --> 00:12:03,840
so much. So you want to build something

332
00:12:03,840 --> 00:12:06,080
that's just like fundamentally good and

333
00:12:06,080 --> 00:12:07,360
like makes it even better.

334
00:12:07,360 --> 00:12:09,440
Or you're so frustrated with an

335
00:12:09,440 --> 00:12:11,520
experience that you say, like, OK, this

336
00:12:11,520 --> 00:12:13,520
needs to be solved. And I think you're

337
00:12:13,520 --> 00:12:15,120
falling into the ladder.

338
00:12:15,120 --> 00:12:17,440
But I think what is tricky about that as

339
00:12:17,440 --> 00:12:20,640
a founder myself, like I had plenty of

340
00:12:20,640 --> 00:12:22,400
like very frustrating experiences

341
00:12:22,400 --> 00:12:25,120
throughout my life where I felt, OK,

342
00:12:25,120 --> 00:12:26,480
there can be something better.

343
00:12:26,480 --> 00:12:29,760
But I also then pictured myself in a life

344
00:12:29,760 --> 00:12:31,920
where I'm not like solving this problem

345
00:12:31,920 --> 00:12:35,280
for 10 years and I would not derive a lot

346
00:12:35,280 --> 00:12:37,920
of joy of like getting and becoming an

347
00:12:37,920 --> 00:12:41,680
expert at tax codes in France.

348
00:12:41,680 --> 00:12:43,520
I'm like frustrated enough with like

349
00:12:43,520 --> 00:12:44,880
barely trying to stay

350
00:12:44,880 --> 00:12:46,320
afloat with the German ones.

351
00:12:46,320 --> 00:12:48,400
So I'm just curious like how your own

352
00:12:48,400 --> 00:12:49,680
perspective is sort of

353
00:12:49,680 --> 00:12:51,600
like has evolved on that.

354
00:12:51,600 --> 00:12:54,160
I'm very glad you're all in solving this.

355
00:12:54,160 --> 00:12:55,520
So I have a better

356
00:12:55,520 --> 00:12:57,920
experience not being exposed to that.

357
00:12:57,920 --> 00:13:00,160
But how you're finding your own balance

358
00:13:00,160 --> 00:13:02,960
of like that frustration that you wanted

359
00:13:02,960 --> 00:13:05,600
to address, like you're flying even

360
00:13:05,600 --> 00:13:07,280
closer to that sun of

361
00:13:07,280 --> 00:13:09,760
frustration to like figure it out.

362
00:13:09,760 --> 00:13:10,560
Maybe you can just

363
00:13:10,560 --> 00:13:12,240
reflect a little bit on that.

364
00:13:12,240 --> 00:13:15,680
Yeah, yeah, it's a funny question because

365
00:13:15,680 --> 00:13:18,000
payroll tax codes, it's like the

366
00:13:18,000 --> 00:13:19,680
unsexiest thing you

367
00:13:19,680 --> 00:13:20,640
could probably imagine.

368
00:13:20,640 --> 00:13:22,720
It's like B2B SaaS payroll.

369
00:13:22,720 --> 00:13:24,960
I have like a few answers to that.

370
00:13:24,960 --> 00:13:28,000
I think one is like the fact that not

371
00:13:28,000 --> 00:13:29,520
many people could imagine themselves

372
00:13:29,520 --> 00:13:32,960
doing it is sort of good for us because

373
00:13:32,960 --> 00:13:35,040
we're happy to kind of go in and like get

374
00:13:35,040 --> 00:13:36,320
our hands dirty and let's

375
00:13:36,320 --> 00:13:37,520
figure out what needs to be done.

376
00:13:37,520 --> 00:13:40,400
And I think the actual joy of building a

377
00:13:40,400 --> 00:13:43,600
product comes from seeing a customer use

378
00:13:43,600 --> 00:13:46,320
it the right way, seeing a customer be

379
00:13:46,320 --> 00:13:49,360
satisfied and not have to worry.

380
00:13:49,360 --> 00:13:51,840
One joke we like to make is that we pride

381
00:13:51,840 --> 00:13:55,360
ourselves on least required user minutes.

382
00:13:55,360 --> 00:13:58,320
So we have some founders that have like

383
00:13:58,320 --> 00:14:00,240
not logged into our product in months and

384
00:14:00,240 --> 00:14:01,600
it's just sort of running in the

385
00:14:01,600 --> 00:14:02,560
background for them.

386
00:14:02,560 --> 00:14:05,520
So we like take a lot of joy in people

387
00:14:05,520 --> 00:14:07,440
not actually having to use our product

388
00:14:07,440 --> 00:14:08,560
because we've become

389
00:14:08,560 --> 00:14:10,960
experts in payroll and tax.

390
00:14:10,960 --> 00:14:14,960
And yeah, I definitely know more about

391
00:14:14,960 --> 00:14:16,880
payroll than I ever thought I would.

392
00:14:16,880 --> 00:14:20,960
But I think that building a intuitive UX

393
00:14:20,960 --> 00:14:23,200
for something that's so boring, I think

394
00:14:23,200 --> 00:14:25,200
with sort of these unsexy industries,

395
00:14:25,200 --> 00:14:29,680
people come to expect unsexy and clunky

396
00:14:29,680 --> 00:14:32,240
products and we're trying to change that

397
00:14:32,240 --> 00:14:34,080
and that's really fun to me.

398
00:14:34,080 --> 00:14:36,000
All right. Yeah, that definitely

399
00:14:36,000 --> 00:14:37,920
resonates. And so like if you think about

400
00:14:37,920 --> 00:14:40,960
this as like this delta between like very

401
00:14:40,960 --> 00:14:43,760
frustrating experience without work to

402
00:14:43,760 --> 00:14:46,720
like joy and delight and like blissful

403
00:14:46,720 --> 00:14:48,720
ignorance of like all the stuff that

404
00:14:48,720 --> 00:14:50,640
needs to happen behind the scenes.

405
00:14:50,640 --> 00:14:53,120
Like if you can get it, delta is probably

406
00:14:53,120 --> 00:14:56,480
pretty wide. So thank you for doing that

407
00:14:56,480 --> 00:14:59,280
work that no one else has to do it.

408
00:14:59,280 --> 00:15:01,040
So yeah, I don't want to get much

409
00:15:01,040 --> 00:15:03,520
closer to tax codes, but I want to get a

410
00:15:03,520 --> 00:15:06,720
slight more intuition and context on like

411
00:15:06,720 --> 00:15:09,120
the people of building Warp.

412
00:15:09,120 --> 00:15:11,280
So I've mentioned that you all raised, I

413
00:15:11,280 --> 00:15:13,680
think, a Series A recently and that

414
00:15:13,680 --> 00:15:15,520
allows you to continue to grow.

415
00:15:15,520 --> 00:15:17,680
So how many people are currently in the

416
00:15:17,680 --> 00:15:18,560
company and how many

417
00:15:18,560 --> 00:15:20,640
of those are engineers?

418
00:15:20,640 --> 00:15:23,520
We have 16 people currently in the

419
00:15:23,520 --> 00:15:24,640
company and our

420
00:15:24,640 --> 00:15:27,280
engineering team right now is four.

421
00:15:27,280 --> 00:15:29,760
So we've we've kind of tried to remain

422
00:15:29,760 --> 00:15:31,760
small, even though we just raised a big

423
00:15:31,760 --> 00:15:32,880
round where we're hiring

424
00:15:32,880 --> 00:15:34,880
for all engineering roles.

425
00:15:34,880 --> 00:15:36,480
So if you're listening to this

426
00:15:36,480 --> 00:15:38,480
joinwarp.com/careers

427
00:15:38,480 --> 00:15:41,120
We like to move very fast and remain sort

428
00:15:41,120 --> 00:15:44,320
of nimble and kind of cut out processes.

429
00:15:44,320 --> 00:15:46,560
Yeah, so we've tried to remain small.

430
00:15:46,560 --> 00:15:47,840
We're very conscious of

431
00:15:47,840 --> 00:15:50,640
growing too fast, but also hiring.

432
00:15:50,640 --> 00:15:52,240
That is awesome. And that definitely

433
00:15:52,240 --> 00:15:54,720
resonates. And like for I think a

434
00:15:54,720 --> 00:15:57,840
contemporary example of like who has done

435
00:15:57,840 --> 00:15:59,760
that really well for a long time is

436
00:15:59,760 --> 00:16:02,960
Linear, where like their tax code

437
00:16:02,960 --> 00:16:04,560
equivalent is task management.

438
00:16:04,560 --> 00:16:08,000
And they've built an absolutely amazing,

439
00:16:08,000 --> 00:16:09,520
delightful experience

440
00:16:09,520 --> 00:16:11,040
for project management.

441
00:16:11,040 --> 00:16:13,200
And I think maybe you're thinking of

442
00:16:13,200 --> 00:16:15,680
yourself like being part of the same

443
00:16:15,680 --> 00:16:17,120
category of like next

444
00:16:17,120 --> 00:16:18,720
generational software.

445
00:16:18,720 --> 00:16:20,880
And the parallel I definitely want to

446
00:16:20,880 --> 00:16:23,440
draw here is they've remained super,

447
00:16:23,440 --> 00:16:26,000
super small for a very long time in

448
00:16:26,000 --> 00:16:27,760
regards to engineering team.

449
00:16:27,760 --> 00:16:29,760
And you mentioning that you're still just

450
00:16:29,760 --> 00:16:31,360
four people like I

451
00:16:31,360 --> 00:16:32,800
definitely applaud you for that.

452
00:16:32,800 --> 00:16:36,160
I think this allows you to just have like

453
00:16:36,160 --> 00:16:39,680
a velocity and agility that is hard to

454
00:16:39,680 --> 00:16:42,080
match when when you're growing and

455
00:16:42,080 --> 00:16:44,640
growing in terms of the engineering team.

456
00:16:44,640 --> 00:16:47,120
I think at some point that is inevitable,

457
00:16:47,120 --> 00:16:50,160
but like remaining small and like keeping

458
00:16:50,160 --> 00:16:52,880
the bar high for engineering talent, I

459
00:16:52,880 --> 00:16:55,440
think is definitely the way to go.

460
00:16:55,440 --> 00:16:58,160
So maybe you can share a little bit more

461
00:16:58,160 --> 00:17:00,480
on like the background of the other

462
00:17:00,480 --> 00:17:03,280
engineers, like when we are now drawing a

463
00:17:03,280 --> 00:17:06,560
bridge to Effect, which has not

464
00:17:06,560 --> 00:17:08,560
too many similarities with

465
00:17:08,560 --> 00:17:11,200
Ruby and Rails in that regard.

466
00:17:11,200 --> 00:17:13,360
That is like more coming from like the

467
00:17:13,360 --> 00:17:15,520
functional programming world, even though

468
00:17:15,520 --> 00:17:16,800
that is not like the core

469
00:17:16,800 --> 00:17:18,560
essence of Effect these days.

470
00:17:18,560 --> 00:17:21,440
This is where it had its origin story and

471
00:17:21,440 --> 00:17:24,080
still draws a lot of people to Effect.

472
00:17:24,080 --> 00:17:26,480
And it requires a little bit of like a

473
00:17:26,480 --> 00:17:30,160
entry ticket to learn a few new things.

474
00:17:30,160 --> 00:17:31,920
So I'm curious, like what was sort of

475
00:17:31,920 --> 00:17:34,080
like the catalyst event for

476
00:17:34,080 --> 00:17:36,320
Warp getting on board with Effect?

477
00:17:36,320 --> 00:17:39,760
Yeah, I guess to say a bit about our

478
00:17:39,760 --> 00:17:41,760
early team, I mentioned Rails.

479
00:17:41,760 --> 00:17:43,680
One of our other core engineers came from

480
00:17:43,680 --> 00:17:44,480
a huge product

481
00:17:44,480 --> 00:17:46,880
running on Rails and React.

482
00:17:46,880 --> 00:17:49,760
And our other team members have come from

483
00:17:49,760 --> 00:17:53,600
a big Python world, especially the guy

484
00:17:53,600 --> 00:17:55,760
who's good at AIs,

485
00:17:55,760 --> 00:17:57,120
written a lot of Python.

486
00:17:57,120 --> 00:17:58,640
And then the last member, I guess I can

487
00:17:58,640 --> 00:17:59,920
just enumerate the whole list

488
00:17:59,920 --> 00:18:02,000
since it's since it's small.

489
00:18:02,000 --> 00:18:03,920
He was a new grad, so he was actually

490
00:18:03,920 --> 00:18:06,560
very interested in Rust and systems

491
00:18:06,560 --> 00:18:07,600
programming languages.

492
00:18:07,600 --> 00:18:09,120
So not actually much

493
00:18:09,120 --> 00:18:12,640
TypeScript before we started Warp.

494
00:18:12,640 --> 00:18:14,720
I think that the way, if I could tell the

495
00:18:14,720 --> 00:18:17,920
story of how I first came across Effect

496
00:18:17,920 --> 00:18:20,880
was that I'm in sort of these online

497
00:18:20,880 --> 00:18:24,640
circles that expose me to things way out

498
00:18:24,640 --> 00:18:26,560
of anything I need to

499
00:18:26,560 --> 00:18:29,120
write B2B SaaS payroll software.

500
00:18:29,120 --> 00:18:31,440
And I'm sure you know a lot of these

501
00:18:31,440 --> 00:18:33,120
communities that they're like heavy

502
00:18:33,120 --> 00:18:34,960
systems programmers.

503
00:18:34,960 --> 00:18:38,000
You'll find some very like eccentric

504
00:18:38,000 --> 00:18:39,520
people writing like

505
00:18:39,520 --> 00:18:41,280
the craziest software.

506
00:18:41,280 --> 00:18:42,480
I'm very interested in

507
00:18:42,480 --> 00:18:44,640
like type systems in general.

508
00:18:44,640 --> 00:18:47,680
And I was writing a lot of random side

509
00:18:47,680 --> 00:18:48,560
projects in Haskell.

510
00:18:48,560 --> 00:18:51,280
Yeah, and I always love that experience.

511
00:18:51,280 --> 00:18:54,080
But I just couldn't justify for the

512
00:18:54,080 --> 00:18:55,280
business like starting to

513
00:18:55,280 --> 00:18:57,040
write something in Haskell.

514
00:18:57,040 --> 00:18:59,360
It would be like such a big

515
00:18:59,360 --> 00:19:00,720
learning curve for people.

516
00:19:00,720 --> 00:19:01,680
It would be like, how

517
00:19:01,680 --> 00:19:03,280
do we deploy this thing?

518
00:19:03,280 --> 00:19:05,520
How are we going to build our entire

519
00:19:05,520 --> 00:19:06,800
pipeline around this?

520
00:19:06,800 --> 00:19:08,480
I can't justify that when you're trying

521
00:19:08,480 --> 00:19:10,240
to just ship features.

522
00:19:10,240 --> 00:19:13,040
But anyway, back to how I found Effect.

523
00:19:13,040 --> 00:19:15,840
I think it was in these circles like some

524
00:19:15,840 --> 00:19:18,880
of these guys obsessed with type systems

525
00:19:18,880 --> 00:19:19,840
are like, why would

526
00:19:19,840 --> 00:19:21,280
anyone ever use TypeScript?

527
00:19:21,280 --> 00:19:22,160
It sucks.

528
00:19:22,160 --> 00:19:24,240
Like only Effect is like

529
00:19:24,240 --> 00:19:26,320
doing something decent with it.

530
00:19:26,320 --> 00:19:28,720
And I'm like, okay, like take that with a

531
00:19:28,720 --> 00:19:30,480
grain of salt, but

532
00:19:30,480 --> 00:19:32,000
file it away for later.

533
00:19:32,000 --> 00:19:34,640
Kind of go to the Effect docs eventually.

534
00:19:34,640 --> 00:19:37,040
A bit daunting like, all right, what is

535
00:19:37,040 --> 00:19:39,600
this thing on TypeScript?

536
00:19:39,600 --> 00:19:42,080
And eventually sort of through osmosis

537
00:19:42,080 --> 00:19:44,080
and seeing like code snippets of people,

538
00:19:44,080 --> 00:19:44,960
especially like the

539
00:19:44,960 --> 00:19:46,400
Vercel team posts a lot.

540
00:19:46,400 --> 00:19:49,040
Like, okay, this could be nice.

541
00:19:49,040 --> 00:19:51,600
And then looking for sort of some project

542
00:19:51,600 --> 00:19:53,840
to start it with some like

543
00:19:53,840 --> 00:19:56,800
some excuse to write with effects.

544
00:19:56,800 --> 00:19:59,360
And finally, we had some little proof of

545
00:19:59,360 --> 00:20:01,520
concept very isolated from our product

546
00:20:01,520 --> 00:20:03,760
that we were going to build.

547
00:20:03,760 --> 00:20:06,640
It was actually an AI browser agent.

548
00:20:06,640 --> 00:20:10,320
So it was automating browser actions and

549
00:20:10,320 --> 00:20:12,000
computer use with AI.

550
00:20:12,000 --> 00:20:13,440
And I was like, you know what, screw it,

551
00:20:13,440 --> 00:20:15,200
I'm going to use Effect for this.

552
00:20:15,200 --> 00:20:17,520
And that's sort of my first experience.

553
00:20:17,520 --> 00:20:18,640
It was very slow going.

554
00:20:18,640 --> 00:20:20,320
There is definitely a learning curve.

555
00:20:20,320 --> 00:20:22,880
And that's sort of the impetus.

556
00:20:22,880 --> 00:20:25,760
And I guess I can mention sort of to why

557
00:20:25,760 --> 00:20:27,920
I was even ready for

558
00:20:27,920 --> 00:20:29,680
something like Effect.

559
00:20:30,320 --> 00:20:34,320
We like started early on TypeScript, as I

560
00:20:34,320 --> 00:20:36,240
mentioned, because it was just like the

561
00:20:36,240 --> 00:20:37,360
easiest way to get started.

562
00:20:37,360 --> 00:20:39,040
You can move very fast.

563
00:20:39,040 --> 00:20:41,600
And it's very optimized

564
00:20:41,600 --> 00:20:44,400
for like happy path coding.

565
00:20:44,400 --> 00:20:47,440
It's like, you know, those old TVs with

566
00:20:47,440 --> 00:20:49,920
the antennas on top, you like hit it a

567
00:20:49,920 --> 00:20:50,640
bunch of times and

568
00:20:50,640 --> 00:20:52,000
eventually it like starts working.

569
00:20:52,000 --> 00:20:53,760
It's like static and you just hit it.

570
00:20:53,760 --> 00:20:56,080
That's how it feels like coding in

571
00:20:56,080 --> 00:20:59,040
TypeScript or in JavaScript without like

572
00:20:59,040 --> 00:21:01,440
proper result types

573
00:21:01,440 --> 00:21:02,960
and dependency injection.

574
00:21:02,960 --> 00:21:05,040
It's just like, okay, this error happens.

575
00:21:05,040 --> 00:21:06,800
Let me like add some

576
00:21:06,800 --> 00:21:08,240
conditional for that.

577
00:21:08,240 --> 00:21:10,960
And then like eventually like a thousand

578
00:21:10,960 --> 00:21:12,720
times later, you have like something that

579
00:21:12,720 --> 00:21:13,680
works and you're way too

580
00:21:13,680 --> 00:21:15,120
scared to touch it again.

581
00:21:15,120 --> 00:21:16,960
That's how it feels like coding in

582
00:21:16,960 --> 00:21:19,120
vanilla sort of TypeScript, JavaScript.

583
00:21:19,120 --> 00:21:20,240
So I'm like, all right, this

584
00:21:20,240 --> 00:21:21,840
is like just not sustainable.

585
00:21:21,840 --> 00:21:23,760
We have a product where, you know,

586
00:21:23,760 --> 00:21:26,400
everything has five or six different

587
00:21:26,400 --> 00:21:28,960
states it could be in, statuses.

588
00:21:28,960 --> 00:21:32,240
And then every and then there's like, say

589
00:21:32,240 --> 00:21:34,320
20 objects with 20 different statuses.

590
00:21:34,320 --> 00:21:37,040
Like it's just an exponential amount of

591
00:21:37,040 --> 00:21:39,440
different statuses things can be in.

592
00:21:39,440 --> 00:21:40,640
So a lot of antennas

593
00:21:40,640 --> 00:21:42,000
that you need to slap.

594
00:21:43,040 --> 00:21:43,680
Exactly.

595
00:21:43,680 --> 00:21:44,800
That's what I'm saying.

596
00:21:44,800 --> 00:21:46,320
So I'm like, I need

597
00:21:46,320 --> 00:21:47,760
something that can do this better.

598
00:21:47,760 --> 00:21:49,520
And so that's why I was like very

599
00:21:49,520 --> 00:21:51,600
receptive initially to Effect.

600
00:21:51,600 --> 00:21:55,440
So this is one analogy I make quite a bit

601
00:21:55,440 --> 00:21:57,600
of sort of like the sugar high versus

602
00:21:57,600 --> 00:21:59,600
eating vegetables, like

603
00:21:59,600 --> 00:22:01,440
getting building something quickly.

604
00:22:01,440 --> 00:22:02,240
This is like, I mean,

605
00:22:02,240 --> 00:22:04,640
JavaScript is like perfect at that.

606
00:22:04,640 --> 00:22:06,720
But then like when you like run into

607
00:22:06,720 --> 00:22:09,200
those problems where in production you

608
00:22:09,200 --> 00:22:11,440
see undefined is not a function and you

609
00:22:11,440 --> 00:22:12,800
have no clue where

610
00:22:12,800 --> 00:22:13,840
this might even happen.

611
00:22:13,840 --> 00:22:16,560
Maybe the the strike phrase is like, it's

612
00:22:16,560 --> 00:22:19,440
somewhere like some esoteric place and

613
00:22:19,440 --> 00:22:21,760
you're just like completely lost and easy

614
00:22:21,760 --> 00:22:22,880
kind of like dawns on you.

615
00:22:22,880 --> 00:22:24,640
Yes, I should have eaten more vegetables.

616
00:22:24,640 --> 00:22:25,280
I should have built

617
00:22:25,280 --> 00:22:26,560
this in the right way.

618
00:22:26,560 --> 00:22:29,440
But now to kind of like get from place

619
00:22:29,440 --> 00:22:32,000
A to place B where like

620
00:22:32,000 --> 00:22:32,800
you're currently in

621
00:22:32,800 --> 00:22:34,800
undefined is not a function place.

622
00:22:34,800 --> 00:22:36,560
And you're in that place where everything

623
00:22:36,560 --> 00:22:38,080
is nicely modeled like

624
00:22:38,080 --> 00:22:39,840
that can be quite daunting.

625
00:22:39,840 --> 00:22:42,880
So you've taken the plunge with the A.I.

626
00:22:42,880 --> 00:22:45,600
browser automation project.

627
00:22:45,600 --> 00:22:47,280
Can you share a little bit more of like

628
00:22:47,280 --> 00:22:48,560
what that looked like?

629
00:22:48,560 --> 00:22:50,240
What were you trying to did

630
00:22:50,240 --> 00:22:51,360
you build that from scratch?

631
00:22:51,360 --> 00:22:53,760
Did you have like an existing version

632
00:22:53,760 --> 00:22:56,000
that's like has worked in happy path

633
00:22:56,000 --> 00:22:58,720
land, but you now want to make production

634
00:22:58,720 --> 00:23:00,960
ready or like take me through like the

635
00:23:00,960 --> 00:23:02,880
adoption journey of Effect

636
00:23:02,880 --> 00:23:04,160
for that particular project.

637
00:23:04,160 --> 00:23:05,200
And how did you involve

638
00:23:05,200 --> 00:23:06,960
your other team members?

639
00:23:06,960 --> 00:23:08,080
So this project

640
00:23:08,080 --> 00:23:09,680
was very, very isolated.

641
00:23:09,680 --> 00:23:11,440
It was a from scratch product.

642
00:23:11,440 --> 00:23:12,240
We haven't done

643
00:23:12,240 --> 00:23:13,440
anything like that before.

644
00:23:13,440 --> 00:23:16,480
It was it was sort of R and D just kind

645
00:23:16,480 --> 00:23:17,600
of going out seeing

646
00:23:17,600 --> 00:23:18,880
if this would work.

647
00:23:18,880 --> 00:23:21,280
And and actually in hindsight, like that

648
00:23:21,280 --> 00:23:24,560
was probably not the right place to start

649
00:23:24,560 --> 00:23:26,480
with Effect because we were just trying

650
00:23:26,480 --> 00:23:28,400
to build a proof of concept.

651
00:23:28,400 --> 00:23:31,120
But I was like so dead set on on

652
00:23:31,120 --> 00:23:33,280
improving our workflows that I was trying

653
00:23:33,280 --> 00:23:36,320
to use this thing I wanted to use.

654
00:23:36,320 --> 00:23:37,760
You know, startups are great

655
00:23:37,760 --> 00:23:39,680
because you can just kind of choose your

656
00:23:39,680 --> 00:23:40,640
tech stack as you go

657
00:23:40,640 --> 00:23:42,080
along and try things out.

658
00:23:42,080 --> 00:23:44,400
You're not like constrained to other

659
00:23:44,400 --> 00:23:46,160
internal libraries or anything.

660
00:23:46,160 --> 00:23:48,560
So super excited to try it there, even

661
00:23:48,560 --> 00:23:50,560
though it wasn't the best fit.

662
00:23:50,560 --> 00:23:53,600
I was using this library called Stagehand

663
00:23:53,600 --> 00:23:55,360
from Browserbase that kind of

664
00:23:55,360 --> 00:23:57,680
integrates with different providers and

665
00:23:57,680 --> 00:24:00,640
and read sort of the DOM to extract

666
00:24:00,640 --> 00:24:02,320
actionable things in on any

667
00:24:02,320 --> 00:24:04,400
web page and then act upon them.

668
00:24:04,400 --> 00:24:06,560
So I was just kind of like wrapping

669
00:24:06,560 --> 00:24:08,080
functions with Effect and

670
00:24:08,080 --> 00:24:09,440
like seeing how it worked.

671
00:24:09,440 --> 00:24:10,160
Like how does this

672
00:24:10,160 --> 00:24:12,080
dependency injection thing work?

673
00:24:12,080 --> 00:24:13,440
So that's sort of how it got started.

674
00:24:13,440 --> 00:24:15,200
I was actually working on that

675
00:24:15,200 --> 00:24:17,280
project pretty much alone.

676
00:24:17,280 --> 00:24:19,520
And then we built out the proof of

677
00:24:19,520 --> 00:24:21,360
concept where like this can work, we're

678
00:24:21,360 --> 00:24:22,960
going to productize it later.

679
00:24:22,960 --> 00:24:24,080
But I need to go back

680
00:24:24,080 --> 00:24:25,840
to like building product.

681
00:24:25,840 --> 00:24:29,280
So it was sort of a decent amount of time

682
00:24:29,280 --> 00:24:32,800
between that experience and all right, we

683
00:24:32,800 --> 00:24:34,400
need to get this into our product.

684
00:24:34,400 --> 00:24:35,600
And I think the

685
00:24:35,600 --> 00:24:36,960
sort of thing that pushed me

686
00:24:36,960 --> 00:24:39,440
was actually hiring new people.

687
00:24:39,440 --> 00:24:42,720
We have this like mess of of old happy

688
00:24:42,720 --> 00:24:45,440
path code in some places that that needs

689
00:24:45,440 --> 00:24:47,600
to be like more productionized and and

690
00:24:47,600 --> 00:24:49,840
part of it is like an ego thing like, oh,

691
00:24:49,840 --> 00:24:51,840
I have to show this code to someone else.

692
00:24:51,840 --> 00:24:52,960
I have to like someone

693
00:24:52,960 --> 00:24:54,160
else has to work on this.

694
00:24:54,160 --> 00:24:56,080
We need to turn up before

695
00:24:56,080 --> 00:24:57,680
before your friends arrive.

696
00:24:57,680 --> 00:24:59,360
Exactly, exactly.

697
00:24:59,360 --> 00:25:01,760
I'm like, how can I expect like a new

698
00:25:01,760 --> 00:25:05,040
team member or like five members?

699
00:25:05,040 --> 00:25:06,760
I know the feeling this is like you want

700
00:25:06,760 --> 00:25:09,920
someone like it works the right way, but

701
00:25:09,920 --> 00:25:12,080
like you gotta you gotta clean it up now.

702
00:25:12,080 --> 00:25:13,440
Yes. Yeah.

703
00:25:13,440 --> 00:25:16,160
So that that's when we were sort of like,

704
00:25:16,160 --> 00:25:17,440
all right, we need a

705
00:25:17,440 --> 00:25:19,520
better developer experience.

706
00:25:19,520 --> 00:25:22,160
We need everything to be more testable,

707
00:25:22,160 --> 00:25:24,400
everything, all the errors enumerated.

708
00:25:24,400 --> 00:25:27,360
Let's like sit down and sort of if we

709
00:25:27,360 --> 00:25:28,560
were in an ideal world,

710
00:25:28,560 --> 00:25:30,080
what would our stack be?

711
00:25:30,080 --> 00:25:32,640
That still allowed us to move very fast

712
00:25:32,640 --> 00:25:35,520
and allowed people to onboard quickly and

713
00:25:35,520 --> 00:25:36,480
write both front end

714
00:25:36,480 --> 00:25:37,920
and back end very quickly.

715
00:25:37,920 --> 00:25:39,760
And we sort of came up with that answer

716
00:25:39,760 --> 00:25:40,800
and we were like, all

717
00:25:40,800 --> 00:25:42,800
right, let's just go for it.

718
00:25:42,800 --> 00:25:46,640
And just to share sort of like one

719
00:25:46,640 --> 00:25:48,800
anecdote I've heard from a couple of

720
00:25:48,800 --> 00:25:51,040
other companies who are using Effect.

721
00:25:51,040 --> 00:25:53,920
That is it's actually interesting that

722
00:25:53,920 --> 00:25:57,120
they also hired people with no prior

723
00:25:57,120 --> 00:25:58,640
TypeScript experience.

724
00:25:58,640 --> 00:26:00,560
And this was sort of like the first time

725
00:26:00,560 --> 00:26:02,640
really where someone went super deep on

726
00:26:02,640 --> 00:26:04,840
TypeScript and went right into Effect.

727
00:26:04,840 --> 00:26:07,680
I was like me as a Effect team member,

728
00:26:07,680 --> 00:26:09,360
this felt initially kind of

729
00:26:09,360 --> 00:26:12,640
counterintuitive because I came to Effect

730
00:26:12,640 --> 00:26:15,440
because I've done TypeScript for like a

731
00:26:15,440 --> 00:26:17,920
decade, suffering through the

732
00:26:17,920 --> 00:26:19,440
limitations of TypeScript.

733
00:26:19,440 --> 00:26:21,280
And then I saw Effect

734
00:26:21,280 --> 00:26:23,760
as the answer to that.

735
00:26:23,760 --> 00:26:25,680
But I've already learned sort of like all

736
00:26:25,680 --> 00:26:28,880
of like those mishabits of like holding

737
00:26:28,880 --> 00:26:32,080
it in this particular way that like tribe

738
00:26:32,080 --> 00:26:32,960
knowledge has just

739
00:26:32,960 --> 00:26:34,960
been passed down to you.

740
00:26:34,960 --> 00:26:37,120
But people outside of the TypeScript

741
00:26:37,120 --> 00:26:39,440
ecosystem, they've never been burdened

742
00:26:39,440 --> 00:26:43,840
with all of those like crafty experience

743
00:26:43,840 --> 00:26:45,840
like you're using this way not

744
00:26:45,840 --> 00:26:47,920
because it's particularly nice, but just

745
00:26:47,920 --> 00:26:49,840
because you have to do it this way.

746
00:26:49,840 --> 00:26:52,000
But if you're new to TypeScript and new

747
00:26:52,000 --> 00:26:53,680
to Effect, then like you're learning it

748
00:26:53,680 --> 00:26:55,200
the right way right away.

749
00:26:55,200 --> 00:26:57,920
And it's weirdly enough, it's actually

750
00:26:57,920 --> 00:27:00,800
easier to learn Effect if you don't have

751
00:27:00,800 --> 00:27:03,120
that year's worth of like using

752
00:27:03,120 --> 00:27:04,560
TypeScript already in

753
00:27:04,560 --> 00:27:06,400
this particular way.

754
00:27:06,400 --> 00:27:08,800
And so that really resonates now.

755
00:27:08,800 --> 00:27:11,760
Well, it is almost like writing or

756
00:27:11,760 --> 00:27:12,960
reading a new language.

757
00:27:12,960 --> 00:27:16,960
Like you never really use generators in

758
00:27:16,960 --> 00:27:19,680
like your day-to-day TypeScript.

759
00:27:19,680 --> 00:27:20,560
Like you'll never see

760
00:27:20,560 --> 00:27:22,560
that in a React app.

761
00:27:22,560 --> 00:27:24,800
And then the type signatures are just

762
00:27:24,800 --> 00:27:25,840
completely different from

763
00:27:25,840 --> 00:27:28,000
something you write yourself.

764
00:27:28,000 --> 00:27:30,000
Yeah. And I think that's the most useful

765
00:27:30,000 --> 00:27:32,400
mental model that you can give like a

766
00:27:32,400 --> 00:27:33,680
newcomer, being

767
00:27:33,680 --> 00:27:36,400
unburdened from like things before.

768
00:27:36,400 --> 00:27:38,720
Yes, the type signatures, etc.

769
00:27:38,720 --> 00:27:40,320
I think that's helpful to have an

770
00:27:40,320 --> 00:27:41,360
understanding of that.

771
00:27:41,360 --> 00:27:43,360
But I think this is actually one of the

772
00:27:43,360 --> 00:27:46,000
most elegant parts about TypeScript, how

773
00:27:46,000 --> 00:27:47,680
nice the inference works.

774
00:27:47,680 --> 00:27:50,560
But then sort of like to absorb the

775
00:27:51,200 --> 00:27:53,760
mental models of the concepts, etc.

776
00:27:53,760 --> 00:27:55,840
Like if your brain is not constantly

777
00:27:55,840 --> 00:27:57,840
racing of like trying to bind it to a

778
00:27:57,840 --> 00:27:59,680
prior TypeScript thing you've been using,

779
00:27:59,680 --> 00:28:01,360
but just like absorbing

780
00:28:01,360 --> 00:28:04,720
that in a more like free world.

781
00:28:04,720 --> 00:28:06,160
I think that's actually

782
00:28:06,160 --> 00:28:07,440
kind of works super well.

783
00:28:07,440 --> 00:28:09,760
And I think this seems to work super well

784
00:28:09,760 --> 00:28:12,320
for people with prior Rails experience.

785
00:28:12,320 --> 00:28:14,480
And also for that new grad you've

786
00:28:14,480 --> 00:28:16,400
mentioned coming more from a Rust

787
00:28:16,400 --> 00:28:18,640
background, since I think Effect is

788
00:28:18,640 --> 00:28:19,840
actually the closest thing

789
00:28:19,840 --> 00:28:22,160
to Rust we have in TypeScript

790
00:28:22,160 --> 00:28:24,400
in terms of like applying systems

791
00:28:24,400 --> 00:28:26,080
programming mindset

792
00:28:26,080 --> 00:28:28,080
and rigor to TypeScript.

793
00:28:28,080 --> 00:28:29,440
Yeah, I definitely agree.

794
00:28:30,080 --> 00:28:32,640
Going back a bit to writing Haskell,

795
00:28:32,640 --> 00:28:36,560
there's this meme in Haskell where if you

796
00:28:36,560 --> 00:28:37,680
pass the type check,

797
00:28:37,680 --> 00:28:39,040
then your code works.

798
00:28:39,040 --> 00:28:41,120
In vanilla, like JavaScript and

799
00:28:41,120 --> 00:28:43,280
TypeScript, I heard someone joke one time

800
00:28:43,280 --> 00:28:46,640
that TypeScript is a VS Code extension.

801
00:28:46,640 --> 00:28:48,880
And that's really funny to me because

802
00:28:48,880 --> 00:28:50,720
types are just suggestions there.

803
00:28:50,720 --> 00:28:52,800
They're not actually real guarantees.

804
00:28:52,800 --> 00:28:54,480
And Effect is sort of the layer that

805
00:28:54,480 --> 00:28:55,840
makes it feel like my

806
00:28:55,840 --> 00:28:56,800
type is a real thing.

807
00:28:56,800 --> 00:28:58,720
I can actually trust that this thing here

808
00:28:58,720 --> 00:29:00,600
is this thing it says it is.

809
00:29:00,600 --> 00:29:02,880
I go so far in writing

810
00:29:02,880 --> 00:29:04,400
production ready code.

811
00:29:04,400 --> 00:29:07,840
Yeah, so as you then like introduced

812
00:29:07,840 --> 00:29:10,720
Effect into like that first R&D project

813
00:29:10,720 --> 00:29:11,920
and then you brought it

814
00:29:11,920 --> 00:29:13,760
to the rest of the system,

815
00:29:13,760 --> 00:29:16,320
walk me through how you've like, how you

816
00:29:16,320 --> 00:29:18,800
cleaned up before new people joined and

817
00:29:18,800 --> 00:29:21,040
how did Effect step by step.

818
00:29:21,040 --> 00:29:22,160
How did you migrate

819
00:29:22,160 --> 00:29:23,760
your project step by step?

820
00:29:23,760 --> 00:29:26,720
I guess we started with sort of

821
00:29:26,720 --> 00:29:29,440
asking the question, you know, how can we

822
00:29:29,440 --> 00:29:30,960
do this incrementally?

823
00:29:30,960 --> 00:29:33,200
And the first place we sort of used it

824
00:29:33,200 --> 00:29:34,800
was we're using these

825
00:29:35,360 --> 00:29:38,560
NoSQL stores in some places.

826
00:29:38,560 --> 00:29:40,480
And we were like, all right, let's try to

827
00:29:40,480 --> 00:29:43,760
use Schema and just the general Effect

828
00:29:43,760 --> 00:29:46,000
dependency injection to try to more

829
00:29:46,000 --> 00:29:48,000
strongly type some of these NoSQL stores

830
00:29:48,000 --> 00:29:49,120
we're using and see if we

831
00:29:49,120 --> 00:29:50,960
can like parse out our data.

832
00:29:50,960 --> 00:29:54,480
We were using like a lot of places just,

833
00:29:54,480 --> 00:29:56,400
you know, let's get this basically

834
00:29:56,400 --> 00:29:59,520
document object and like just write as

835
00:29:59,520 --> 00:30:01,040
thing at the end of it.

836
00:30:01,040 --> 00:30:03,360
And then it's like that thing and we run

837
00:30:03,360 --> 00:30:05,200
into tons of issues doing that with

838
00:30:05,200 --> 00:30:07,440
that's that happy path coding, you know,

839
00:30:07,440 --> 00:30:09,600
so let's schema parse all of these.

840
00:30:09,600 --> 00:30:10,880
Let's like, be sure we have

841
00:30:10,880 --> 00:30:12,240
the things we say we have.

842
00:30:12,240 --> 00:30:14,720
And that sort of led us to starting to

843
00:30:14,720 --> 00:30:17,840
wrap our like database drivers and our

844
00:30:19,040 --> 00:30:20,400
various domain objects

845
00:30:20,400 --> 00:30:23,280
in schemas and context.

846
00:30:23,280 --> 00:30:25,440
And we're like, you know what, let's just

847
00:30:25,440 --> 00:30:27,440
like, forget that, like forget trying to

848
00:30:27,440 --> 00:30:29,200
like rewrite old stuff.

849
00:30:29,200 --> 00:30:30,720
Let's just come up with our

850
00:30:30,720 --> 00:30:32,720
new stack and and write it.

851
00:30:32,720 --> 00:30:33,680
And so we actually

852
00:30:33,680 --> 00:30:35,360
completely wrote a new server.

853
00:30:35,360 --> 00:30:36,320
It's funny the way it

854
00:30:36,320 --> 00:30:38,800
worked because the other sort of DX

855
00:30:38,800 --> 00:30:41,680
improvement we were looking to get was we

856
00:30:41,680 --> 00:30:43,120
wanted to write less

857
00:30:43,120 --> 00:30:44,240
hooks on the front end.

858
00:30:44,240 --> 00:30:47,760
We wanted Open API specs so that we could just

859
00:30:47,760 --> 00:30:49,520
generate all of our front end code.

860
00:30:49,520 --> 00:30:50,880
So we're looking at different ways to do

861
00:30:50,880 --> 00:30:52,880
that. We eventually found, you know, the

862
00:30:52,880 --> 00:30:54,480
Effect Platform thing.

863
00:30:54,480 --> 00:30:55,840
We're like, all right, let's take our

864
00:30:55,840 --> 00:31:00,400
existing API and write the HTTP

865
00:31:00,400 --> 00:31:02,160
group endpoints that

866
00:31:02,160 --> 00:31:04,240
match like what our API is.

867
00:31:04,240 --> 00:31:06,320
And then we can generate our hooks from

868
00:31:06,320 --> 00:31:08,080
that. And then we go deeper and we

869
00:31:08,080 --> 00:31:09,520
realize, oh, we don't need

870
00:31:09,520 --> 00:31:11,520
to generate anything.

871
00:31:11,520 --> 00:31:14,080
Effect can just like infer the entire

872
00:31:14,080 --> 00:31:16,640
HTTP client. So we'll do that.

873
00:31:16,640 --> 00:31:19,280
And then we're like, you know what, let's

874
00:31:19,280 --> 00:31:21,120
why would we rewrite the old things when

875
00:31:21,120 --> 00:31:23,280
we already have the hooks for them?

876
00:31:23,280 --> 00:31:25,360
Like, let's just actually implement our

877
00:31:25,360 --> 00:31:27,200
new API endpoints

878
00:31:27,200 --> 00:31:29,120
through the effect platform.

879
00:31:29,120 --> 00:31:31,360
And then so we kind of incrementally

880
00:31:31,360 --> 00:31:33,520
after implementing one thing in each

881
00:31:33,520 --> 00:31:35,360
place, we were like, you know what, like,

882
00:31:35,360 --> 00:31:37,280
let's just write the whole thing end to

883
00:31:37,280 --> 00:31:39,920
end in Effect and like start pulling in

884
00:31:39,920 --> 00:31:42,800
like entire flows from the legacy code

885
00:31:42,800 --> 00:31:44,880
into our like sort of new stack.

886
00:31:44,880 --> 00:31:46,800
And that's sort of how we've been going

887
00:31:46,800 --> 00:31:50,480
about it. We use RPC to sort of interface

888
00:31:50,480 --> 00:31:52,000
from our old backend

889
00:31:52,000 --> 00:31:54,160
to our Effect backend.

890
00:31:54,160 --> 00:31:55,680
And that's sort of the bridge where we

891
00:31:55,680 --> 00:31:57,920
need to like make a call for a new

892
00:31:57,920 --> 00:31:59,520
service or a new context.

893
00:31:59,520 --> 00:32:02,080
It is like somewhat of a friction point

894
00:32:02,080 --> 00:32:08,000
to add random effects in non Effect code,

895
00:32:08,000 --> 00:32:10,080
because you do like the run sync, you

896
00:32:10,080 --> 00:32:12,240
have to add the all the dependencies

897
00:32:12,240 --> 00:32:13,280
basically right there.

898
00:32:13,280 --> 00:32:14,880
And then you have to handle all the

899
00:32:14,880 --> 00:32:16,880
errors before you're back in like the

900
00:32:16,880 --> 00:32:18,640
world where you don't know anything.

901
00:32:18,640 --> 00:32:20,720
It's a bit more verbose, but I actually

902
00:32:20,720 --> 00:32:22,480
somewhat prefer it because,

903
00:32:22,480 --> 00:32:25,520
as we sort of adopt more and more that

904
00:32:25,520 --> 00:32:27,920
the sort of scope of that initial run

905
00:32:27,920 --> 00:32:29,040
sync just grows and grows.

906
00:32:29,040 --> 00:32:30,640
And then it's like, okay, now we just

907
00:32:30,640 --> 00:32:32,640
have everything Effect. So that's sort

908
00:32:32,640 --> 00:32:33,440
of how it's been going.

909
00:32:33,440 --> 00:32:35,600
I know that was kind of convoluted, but

910
00:32:35,600 --> 00:32:36,880
hopefully answers the

911
00:32:36,880 --> 00:32:38,880
sort of adoption path for us.

912
00:32:38,880 --> 00:32:41,200
No, it definitely resonates. And I think

913
00:32:41,200 --> 00:32:42,880
it shows sort of, I mean, there, I don't

914
00:32:42,880 --> 00:32:45,280
think there is like the canonical

915
00:32:45,280 --> 00:32:47,440
adoption experience for Effect.

916
00:32:47,440 --> 00:32:50,400
I think it always kind of depends on your

917
00:32:50,400 --> 00:32:52,560
particular pain points. That's typically

918
00:32:52,560 --> 00:32:54,240
what I would recommend to people when

919
00:32:54,240 --> 00:32:55,760
they look into Effect.

920
00:32:55,760 --> 00:32:57,920
I wouldn't recommend them doing one big

921
00:32:57,920 --> 00:33:01,280
bang migration where they don't ship any

922
00:33:01,280 --> 00:33:03,280
new features and just migrate everything.

923
00:33:03,280 --> 00:33:06,240
And that drags on for a very long time. I

924
00:33:06,240 --> 00:33:08,720
would rather recommend doing it

925
00:33:08,720 --> 00:33:11,360
incrementally where you can start it

926
00:33:11,360 --> 00:33:13,440
one day and like in the same day you ship

927
00:33:13,440 --> 00:33:15,600
the first version of Effect.

928
00:33:15,600 --> 00:33:17,840
And that touches just a small part of the

929
00:33:17,840 --> 00:33:19,840
code base, but then like you've gained

930
00:33:19,840 --> 00:33:22,880
sort of that incremental confidence that

931
00:33:22,880 --> 00:33:25,920
you can do that without maybe your

932
00:33:25,920 --> 00:33:27,520
colleagues even knowing.

933
00:33:27,520 --> 00:33:29,760
And step by step for the code that you

934
00:33:29,760 --> 00:33:32,000
own, you can clean it up

935
00:33:32,000 --> 00:33:34,720
and make it more like a home.

936
00:33:34,720 --> 00:33:37,600
And then over time you will realize that

937
00:33:37,600 --> 00:33:39,360
it can absorb a lot of

938
00:33:39,360 --> 00:33:42,160
the manual code you've written before.

939
00:33:42,160 --> 00:33:45,120
And by embracing more parts of Effect,

940
00:33:45,120 --> 00:33:47,200
you can delete a lot of the code.

941
00:33:47,200 --> 00:33:50,480
And then also there is some gluey stuff

942
00:33:50,480 --> 00:33:53,760
that you have while you're still sort of

943
00:33:53,760 --> 00:33:55,920
in the adoption process.

944
00:33:55,920 --> 00:33:58,400
And that's fine. Like that you don't need

945
00:33:58,400 --> 00:34:00,880
to ever move beyond that.

946
00:34:00,880 --> 00:34:03,280
But if you then start adopting even more

947
00:34:03,280 --> 00:34:06,320
Effect, then every like even those parts

948
00:34:06,320 --> 00:34:08,160
become just like seamless, like sort of

949
00:34:08,160 --> 00:34:10,080
the seam becomes seamless.

950
00:34:10,080 --> 00:34:12,000
Where you interact with Effect and then you

951
00:34:12,000 --> 00:34:13,680
have like a single entry point.

952
00:34:13,680 --> 00:34:15,360
And I think this is really like where

953
00:34:15,360 --> 00:34:17,600
when I went first through that, it's

954
00:34:17,600 --> 00:34:20,240
like, oh my gosh, this just felt so good.

955
00:34:20,240 --> 00:34:22,640
Like how everything feels so coherent.

956
00:34:22,640 --> 00:34:24,880
And the last time I had that experience,

957
00:34:24,880 --> 00:34:26,880
I think was like migrating a

958
00:34:26,880 --> 00:34:29,840
giant jQuery code base to react.

959
00:34:29,840 --> 00:34:32,320
And once that was completed and I could

960
00:34:32,320 --> 00:34:35,520
just like delete the jQuery dependency,

961
00:34:35,520 --> 00:34:38,880
that felt sort of like a similar step.

962
00:34:38,880 --> 00:34:39,840
Think back to the

963
00:34:39,840 --> 00:34:43,920
time when you onboarded more of your

964
00:34:43,920 --> 00:34:45,680
engineering colleagues and like you

965
00:34:45,680 --> 00:34:46,960
exposed them to Effect.

966
00:34:46,960 --> 00:34:48,400
how did you take them by the hand

967
00:34:48,400 --> 00:34:50,400
and sort of like showed them around and

968
00:34:50,400 --> 00:34:52,480
help them build an intuition?

969
00:34:52,480 --> 00:34:55,120
I probably sounded a bit like a

970
00:34:55,120 --> 00:34:56,880
crazy person at the time.

971
00:34:56,880 --> 00:34:59,920
If they hadn't heard of effect, I hired

972
00:34:59,920 --> 00:35:03,040
them one with prior TypeScript

973
00:35:03,040 --> 00:35:07,440
experience, one the new grad with none.

974
00:35:07,440 --> 00:35:09,520
And then basically he got a bunch of

975
00:35:09,520 --> 00:35:11,120
TypeScript experience.

976
00:35:11,120 --> 00:35:13,760
And then I sort of come to them and I'm

977
00:35:13,760 --> 00:35:14,880
like, this is amazing.

978
00:35:14,880 --> 00:35:16,720
Like we need to rewrite everything,

979
00:35:16,720 --> 00:35:18,880
basically like everything, you know,

980
00:35:18,880 --> 00:35:19,920
effect works best when

981
00:35:19,920 --> 00:35:21,440
it's like end to end.

982
00:35:21,440 --> 00:35:23,120
It has a way of just like

983
00:35:23,120 --> 00:35:24,640
sucking up more and more.

984
00:35:24,640 --> 00:35:28,000
We joke now that like, oh, another day

985
00:35:28,000 --> 00:35:29,520
like I was like reading through

986
00:35:29,520 --> 00:35:31,840
source code or like deep in the discord.

987
00:35:31,840 --> 00:35:34,240
And I found another primitive that that's

988
00:35:34,240 --> 00:35:35,440
in this library that just

989
00:35:35,440 --> 00:35:36,640
like works perfect for us.

990
00:35:36,640 --> 00:35:39,920
So side note, there's a lot of work to be

991
00:35:39,920 --> 00:35:43,280
done to like get a lot of these effect

992
00:35:43,280 --> 00:35:45,680
primitives and sub packages

993
00:35:45,680 --> 00:35:47,760
to have more documentation and get more

994
00:35:47,760 --> 00:35:48,400
people to know about.

995
00:35:48,400 --> 00:35:50,880
I think this this definitely resonates

996
00:35:50,880 --> 00:35:52,960
because Effect is such a vast

997
00:35:52,960 --> 00:35:56,080
ecosystem and sort of like the along

998
00:35:56,080 --> 00:35:58,000
the lines of the saying like that gift

999
00:35:58,000 --> 00:35:59,120
that keeps on giving.

1000
00:35:59,120 --> 00:36:00,800
But I think it's all about having the

1001
00:36:00,800 --> 00:36:03,120
right mindset since like you could with

1002
00:36:03,120 --> 00:36:04,960
one perspective look at it as like, oh,

1003
00:36:04,960 --> 00:36:06,240
such a vast ecosystem,

1004
00:36:06,240 --> 00:36:07,680
so many things to learn.

1005
00:36:07,680 --> 00:36:09,760
And you could be paralyzed by saying

1006
00:36:09,760 --> 00:36:12,240
like, oh, this is this is too much. I

1007
00:36:12,240 --> 00:36:13,600
won't even get started.

1008
00:36:13,600 --> 00:36:17,040
What I think is much more helpful is like

1009
00:36:17,040 --> 00:36:19,920
picking a few abstractions of Effect, not

1010
00:36:19,920 --> 00:36:22,080
even bothering about the existence of the

1011
00:36:22,080 --> 00:36:24,480
others and like starting to adopt it.

1012
00:36:24,480 --> 00:36:27,120
And like you'll be surprised how great

1013
00:36:27,120 --> 00:36:28,720
this will already feel.

1014
00:36:28,720 --> 00:36:31,280
And then step by step, once you have an

1015
00:36:31,280 --> 00:36:33,120
understanding and an intuition for how

1016
00:36:33,120 --> 00:36:34,480
these pieces work, then

1017
00:36:34,480 --> 00:36:35,840
you're in the right spot to.

1018
00:36:35,840 --> 00:36:38,800
Appreciate the next abstraction and have

1019
00:36:38,800 --> 00:36:42,240
that sort of like improve everything in

1020
00:36:42,240 --> 00:36:44,960
the same way as if we see how other

1021
00:36:44,960 --> 00:36:47,120
ecosystems and languages have have

1022
00:36:47,120 --> 00:36:48,720
evolved over the years,

1023
00:36:48,720 --> 00:36:51,120
something like React hooks.

1024
00:36:51,120 --> 00:36:52,880
They solve particular pain

1025
00:36:52,880 --> 00:36:55,520
points that existed before.

1026
00:36:55,520 --> 00:36:58,240
But if they would have been introduced

1027
00:36:58,240 --> 00:37:00,800
like that in the beginning, maybe that

1028
00:37:00,800 --> 00:37:02,960
would have been too overwhelming. So

1029
00:37:02,960 --> 00:37:04,960
If you fully adopted Effect throughout

1030
00:37:04,960 --> 00:37:07,120
your system, then there's still another

1031
00:37:07,120 --> 00:37:09,840
incremental adoption dimension where you

1032
00:37:09,840 --> 00:37:12,400
can start refactoring things with more

1033
00:37:12,400 --> 00:37:15,600
Effect primitives that you realize, oh,

1034
00:37:15,600 --> 00:37:17,200
this is actually a great fit.

1035
00:37:17,200 --> 00:37:19,360
And I think with that, you can solve

1036
00:37:19,360 --> 00:37:21,280
about modeling your system.

1037
00:37:21,280 --> 00:37:23,200
Right. And once you start sort of

1038
00:37:23,200 --> 00:37:25,840
thinking in Effect, you start having

1039
00:37:25,840 --> 00:37:28,800
these ideas like, oh, what if I wrapped

1040
00:37:28,800 --> 00:37:31,680
this service this way or like abstracted

1041
00:37:31,680 --> 00:37:32,880
this thing this way.

1042
00:37:32,880 --> 00:37:34,880
And you come to realize that the

1043
00:37:34,880 --> 00:37:37,440
ecosystem has already done that.

1044
00:37:38,160 --> 00:37:39,600
And here's the thing that does it. And

1045
00:37:39,600 --> 00:37:41,120
you're like, oh, this is this is actually

1046
00:37:41,120 --> 00:37:43,440
perfect. I don't need to like even write

1047
00:37:43,440 --> 00:37:45,280
anything. I can just use this.

1048
00:37:45,280 --> 00:37:46,800
one example recently was

1049
00:37:46,800 --> 00:37:48,800
just simply caching any

1050
00:37:48,800 --> 00:37:50,720
network call like on Redis.

1051
00:37:50,720 --> 00:37:52,720
And we were like about to write a wrapper

1052
00:37:52,720 --> 00:37:56,080
for just calling an Effect that calls

1053
00:37:56,080 --> 00:37:58,240
some other service and first

1054
00:37:58,240 --> 00:38:00,080
checking the cache in Redis.

1055
00:38:00,080 --> 00:38:02,640
And then we found the tagged requests and

1056
00:38:02,640 --> 00:38:04,240
it's just like, oh, just add a cache key

1057
00:38:04,240 --> 00:38:05,760
and like to provide the

1058
00:38:05,760 --> 00:38:08,240
provide the Redis layer or whatever.

1059
00:38:08,240 --> 00:38:11,200
And it's like, oh, these things already

1060
00:38:11,200 --> 00:38:12,800
exist. It's back to the

1061
00:38:12,800 --> 00:38:15,440
way Rails is sort of very opinionated.

1062
00:38:15,440 --> 00:38:17,360
It's the way that Effect

1063
00:38:17,360 --> 00:38:19,200
has this giant ecosystem.

1064
00:38:19,200 --> 00:38:21,360
It's moving more towards these are the

1065
00:38:21,360 --> 00:38:23,040
ways we should do things and it's almost

1066
00:38:23,040 --> 00:38:25,680
even better because you can implement a

1067
00:38:25,680 --> 00:38:27,840
layer any way you want.

1068
00:38:27,840 --> 00:38:30,880
So it's not as opinionated. It's just you

1069
00:38:30,880 --> 00:38:32,320
have the building blocks for what you

1070
00:38:32,320 --> 00:38:34,000
need. It's like it's like building with

1071
00:38:34,000 --> 00:38:35,200
Legos, but it's almost

1072
00:38:35,200 --> 00:38:37,360
even better than that because

1073
00:38:37,360 --> 00:38:39,600
when you build with Legos, you can't like

1074
00:38:39,600 --> 00:38:42,160
enter in the center and rip out a piece

1075
00:38:42,160 --> 00:38:43,840
and like replace it.

1076
00:38:43,840 --> 00:38:45,440
But with Effect, you can you can rip out

1077
00:38:45,440 --> 00:38:47,600
any layer and replace it with anything

1078
00:38:47,600 --> 00:38:49,440
else at any time as long as it like

1079
00:38:49,440 --> 00:38:50,960
matches the service.

1080
00:38:50,960 --> 00:38:52,640
Exactly. And I think this is sort of

1081
00:38:52,640 --> 00:38:54,640
hinting at the amazing

1082
00:38:54,640 --> 00:38:56,640
concept of composability.

1083
00:38:56,640 --> 00:38:58,800
And like when we say we're talking about

1084
00:38:58,800 --> 00:39:00,160
Legos is like that we

1085
00:39:00,160 --> 00:39:02,080
can click them together.

1086
00:39:02,080 --> 00:39:03,520
We can compose them.

1087
00:39:03,520 --> 00:39:05,120
and there is sort of like the like the

1088
00:39:05,120 --> 00:39:08,560
atomic or subatomic level of like you

1089
00:39:08,560 --> 00:39:10,160
can't get smaller than that.

1090
00:39:10,160 --> 00:39:12,080
But everything else is kind of composed

1091
00:39:12,080 --> 00:39:13,840
out of those. But then you have like

1092
00:39:13,840 --> 00:39:16,720
those like more macro structures that are

1093
00:39:16,720 --> 00:39:18,960
already useful and you can use them.

1094
00:39:18,960 --> 00:39:20,960
But you can also at any time like kind of

1095
00:39:20,960 --> 00:39:23,040
take take those apart and like have the

1096
00:39:23,040 --> 00:39:25,120
little Legos that make the big Lego.

1097
00:39:25,120 --> 00:39:27,120
And I think this is what you rarely have

1098
00:39:27,120 --> 00:39:28,560
in those larger

1099
00:39:28,560 --> 00:39:30,320
ecosystems like Ruby and Rails.

1100
00:39:30,320 --> 00:39:31,920
This is where basically you get the big

1101
00:39:31,920 --> 00:39:33,920
thing. And if it doesn't do what you

1102
00:39:33,920 --> 00:39:35,280
want, well, bad luck.

1103
00:39:35,280 --> 00:39:37,280
You got to roll your own from scratch.

1104
00:39:37,280 --> 00:39:38,800
Whereas with Effect, you can very

1105
00:39:38,800 --> 00:39:41,520
elegantly kind of take those things apart

1106
00:39:41,520 --> 00:39:44,160
and tweak them to your liking.

1107
00:39:44,720 --> 00:39:46,080
I guess back to your

1108
00:39:46,080 --> 00:39:48,080
earlier question about introducing it

1109
00:39:48,080 --> 00:39:50,160
sort of to the to the team and whether

1110
00:39:50,160 --> 00:39:51,840
they were apprehensive.

1111
00:39:51,840 --> 00:39:53,040
They definitely were.

1112
00:39:53,040 --> 00:39:54,880
there's a learning curve and we're always

1113
00:39:54,880 --> 00:39:57,360
just trying to ship as fast as possible.

1114
00:39:57,360 --> 00:40:00,320
We have pressure from customers and

1115
00:40:00,320 --> 00:40:02,560
product guys just to

1116
00:40:02,560 --> 00:40:03,760
ship as fast as possible.

1117
00:40:03,760 --> 00:40:06,080
Like, let's have this out tomorrow. So

1118
00:40:06,080 --> 00:40:08,480
I'm coming to them and saying, learn this

1119
00:40:08,480 --> 00:40:10,720
entirely new way to write TypeScript.

1120
00:40:10,720 --> 00:40:12,880
Trust me, bro, it'll be worth it.

1121
00:40:12,880 --> 00:40:15,040
And it helps to like have some examples I

1122
00:40:15,040 --> 00:40:18,560
can point to. And I think I recall one

1123
00:40:18,560 --> 00:40:20,320
team member of the one actually with

1124
00:40:20,320 --> 00:40:22,240
prior TypeScript experience.

1125
00:40:22,240 --> 00:40:24,640
He he trusted me enough to give it a try.

1126
00:40:24,640 --> 00:40:27,520
And he said it really clicked for him

1127
00:40:27,520 --> 00:40:29,600
when he was writing tests, actually,

1128
00:40:29,600 --> 00:40:32,960
because he like mocked some layer or

1129
00:40:32,960 --> 00:40:35,360
wrote a test layer for for some service.

1130
00:40:35,360 --> 00:40:38,480
And he's like, oh, this is what I can do

1131
00:40:38,480 --> 00:40:41,120
with this and like isolate just certain

1132
00:40:41,120 --> 00:40:42,640
services and tests like

1133
00:40:42,640 --> 00:40:44,160
just the core business logic.

1134
00:40:44,160 --> 00:40:47,200
And it's super, super helpful there. But

1135
00:40:47,200 --> 00:40:48,480
that was the moment that clicked for him.

1136
00:40:48,480 --> 00:40:50,480
I think we've all had sort

1137
00:40:50,480 --> 00:40:52,800
of that that moment, you know, that that

1138
00:40:52,800 --> 00:40:53,600
is just like, oh, this is

1139
00:40:53,600 --> 00:40:55,040
what this is capable of.

1140
00:40:55,040 --> 00:40:56,160
This needs to be sort of

1141
00:40:56,160 --> 00:40:57,680
everywhere on a code base.

1142
00:40:57,680 --> 00:41:00,240
Exactly and I am considering those sort of like

1143
00:41:00,240 --> 00:41:03,360
the superpowers of Effect. And

1144
00:41:03,360 --> 00:41:04,800
you can also turn around those

1145
00:41:04,800 --> 00:41:08,240
superpowers into like super tricky

1146
00:41:08,240 --> 00:41:11,200
problems when you like those being error

1147
00:41:11,200 --> 00:41:13,520
handling those being observability

1148
00:41:13,520 --> 00:41:15,840
testing concurrency, etc.

1149
00:41:15,840 --> 00:41:18,400
Like if your app doesn't need those yet,

1150
00:41:18,400 --> 00:41:20,320
great. And like if you're in that

1151
00:41:20,320 --> 00:41:21,920
position, like Effect

1152
00:41:21,920 --> 00:41:23,600
might make less sense for you.

1153
00:41:23,600 --> 00:41:26,240
But the moment you need those and even

1154
00:41:26,240 --> 00:41:28,800
more if you combine those, then you're in

1155
00:41:28,800 --> 00:41:30,720
a really tricky spot.

1156
00:41:30,720 --> 00:41:32,880
Like, let's say you want to test your

1157
00:41:32,880 --> 00:41:35,360
app. OK, that's hard. But now you want to

1158
00:41:35,360 --> 00:41:38,800
test your app for particularly tricky

1159
00:41:38,800 --> 00:41:41,200
error scenarios that you don't know how

1160
00:41:41,200 --> 00:41:44,400
to kind of like induce into your system.

1161
00:41:44,400 --> 00:41:46,480
like trying to do that without Effect,

1162
00:41:46,480 --> 00:41:47,680
then you basically just spend

1163
00:41:47,680 --> 00:41:49,680
like so much time building your app and

1164
00:41:49,680 --> 00:41:51,680
you spend so much time just building this

1165
00:41:51,680 --> 00:41:54,400
crazy mocking system that like tries to

1166
00:41:54,400 --> 00:41:55,440
simulate everything.

1167
00:41:55,440 --> 00:41:57,680
And you probably feel like, do we really

1168
00:41:57,680 --> 00:42:00,240
need that test? And just this

1169
00:42:00,240 --> 00:42:02,480
incentivizes good software engineering.

1170
00:42:02,480 --> 00:42:03,280
And I think this is

1171
00:42:03,280 --> 00:42:05,040
what Effect really flips.

1172
00:42:05,040 --> 00:42:06,960
There's always a breaking point for

1173
00:42:06,960 --> 00:42:07,520
someone's error

1174
00:42:07,520 --> 00:42:09,520
handling for someone's testing.

1175
00:42:09,520 --> 00:42:11,600
And I think you just need to like

1176
00:42:11,600 --> 00:42:15,040
walk someone to that problem. And then I

1177
00:42:15,040 --> 00:42:17,040
think it like it starts to click.

1178
00:42:17,040 --> 00:42:18,160
Yeah, exactly. This

1179
00:42:18,160 --> 00:42:19,840
composability, interestingly, has

1180
00:42:19,840 --> 00:42:20,800
actually been great

1181
00:42:20,800 --> 00:42:23,440
specifically for payments.

1182
00:42:23,440 --> 00:42:25,040
You have like all these different payment

1183
00:42:25,040 --> 00:42:27,280
rails and and all these different like

1184
00:42:27,280 --> 00:42:29,680
providers and you can just write one

1185
00:42:29,680 --> 00:42:32,160
common interface and the usage

1186
00:42:32,160 --> 00:42:34,240
code doesn't care about what

1187
00:42:34,240 --> 00:42:35,680
rails the payments going on.

1188
00:42:35,680 --> 00:42:37,600
You can change the rails. You can

1189
00:42:37,600 --> 00:42:39,600
dynamically route the payment rails just

1190
00:42:39,600 --> 00:42:42,160
by like providing a different service,

1191
00:42:42,160 --> 00:42:43,280
providing different layers.

1192
00:42:43,280 --> 00:42:45,920
So it's been super interesting to see

1193
00:42:45,920 --> 00:42:46,960
that the patterns we

1194
00:42:46,960 --> 00:42:48,480
can develop this way.

1195
00:42:48,480 --> 00:42:50,640
Can we shift gears a little bit and talk

1196
00:42:50,640 --> 00:42:53,280
a bit more about like the architecture of

1197
00:42:53,280 --> 00:42:57,120
your system? So like if I'm going to

1198
00:42:57,120 --> 00:43:00,800
joinwarp.com, like there's a website and

1199
00:43:00,800 --> 00:43:02,800
probably next to the website, there's

1200
00:43:02,800 --> 00:43:04,800
also some sort of like dashboards that

1201
00:43:04,800 --> 00:43:06,400
your customers are using.

1202
00:43:06,400 --> 00:43:09,280
So that dashboard, I suppose you're using

1203
00:43:09,280 --> 00:43:11,840
something like Next.js for that. So that

1204
00:43:11,840 --> 00:43:14,400
run, there's a front end at minimum.

1205
00:43:14,400 --> 00:43:17,120
But that front end is then talking to

1206
00:43:17,120 --> 00:43:20,560
some sort of like API tier. So we have

1207
00:43:20,560 --> 00:43:23,680
that as well. But I'm curious, what else

1208
00:43:23,680 --> 00:43:26,640
is there? Is there like you have an API

1209
00:43:26,640 --> 00:43:28,080
level, but then you

1210
00:43:28,080 --> 00:43:29,760
probably also have places.

1211
00:43:29,760 --> 00:43:31,680
Maybe you have cron jobs. Maybe you have

1212
00:43:31,680 --> 00:43:33,200
like other things you've mentioned like

1213
00:43:33,200 --> 00:43:37,840
that AI agent browser setup, etc. So I'm

1214
00:43:37,840 --> 00:43:39,120
not sure whether you're thinking about

1215
00:43:39,120 --> 00:43:39,760
this as like

1216
00:43:39,760 --> 00:43:43,120
microservices or majestic monolith.

1217
00:43:43,120 --> 00:43:45,200
But like maybe you can explain a little

1218
00:43:45,200 --> 00:43:48,480
bit of like how that imagine we're at a

1219
00:43:48,480 --> 00:43:50,240
whiteboard and you're drawing the system

1220
00:43:50,240 --> 00:43:51,600
architecture. Like maybe

1221
00:43:51,600 --> 00:43:53,120
you can do that in words.

1222
00:43:53,120 --> 00:43:56,080
We definitely prefer to keep things

1223
00:43:56,080 --> 00:43:58,480
as simple as possible. We're a team of

1224
00:43:58,480 --> 00:44:01,200
four and we don't have high requirements

1225
00:44:01,200 --> 00:44:04,640
for like latency on requests.

1226
00:44:04,640 --> 00:44:08,000
We have requirements for reliability

1227
00:44:08,000 --> 00:44:09,440
being being payment software.

1228
00:44:09,440 --> 00:44:11,760
another thing is we don't have a high

1229
00:44:11,760 --> 00:44:15,920
total number of like daily active users.

1230
00:44:15,920 --> 00:44:18,800
So our compute requirements are actually

1231
00:44:18,800 --> 00:44:21,200
interestingly somewhat low. That being

1232
00:44:21,200 --> 00:44:24,080
said, the way we started was on Next.js

1233
00:44:24,080 --> 00:44:26,240
and almost everything was

1234
00:44:26,240 --> 00:44:28,400
just in a Next.js API route.

1235
00:44:28,400 --> 00:44:30,480
That grew honestly way past its

1236
00:44:30,480 --> 00:44:32,720
usefulness, but that's the way things go

1237
00:44:32,720 --> 00:44:35,120
at startups. You just pick a stack that's

1238
00:44:35,120 --> 00:44:36,800
been the theme of this whole interview.

1239
00:44:36,800 --> 00:44:39,040
You pick a stack, you go too far with it.

1240
00:44:39,040 --> 00:44:40,960
It doesn't meet your needs.

1241
00:44:40,960 --> 00:44:43,760
And also just as a side note, it's almost

1242
00:44:43,760 --> 00:44:46,800
diametrically opposed to what you've been

1243
00:44:46,800 --> 00:44:49,280
building before with the social network

1244
00:44:49,280 --> 00:44:52,160
where like it's like the latency really

1245
00:44:52,160 --> 00:44:55,040
matters, etc. And like it now you've like

1246
00:44:55,040 --> 00:44:56,640
completely flipped all of

1247
00:44:56,640 --> 00:44:58,800
your like tech trade offs.

1248
00:44:58,800 --> 00:45:00,400
Yeah, that one was fun to build because

1249
00:45:00,400 --> 00:45:02,960
it was tons of caching, streaming, like

1250
00:45:02,960 --> 00:45:05,920
all the stuff that needed to scale very

1251
00:45:05,920 --> 00:45:09,360
quickly when there was a usage upburst

1252
00:45:09,360 --> 00:45:10,800
for whatever reason.

1253
00:45:10,800 --> 00:45:13,520
And now our usage patterns are a lot more

1254
00:45:13,520 --> 00:45:15,680
predictable if you think about it. People

1255
00:45:15,680 --> 00:45:17,600
log in to see their paycheck twice a

1256
00:45:17,600 --> 00:45:19,840
month. We just need to like get that part

1257
00:45:19,840 --> 00:45:21,280
right and then make sure

1258
00:45:21,280 --> 00:45:22,480
all the payments are right.

1259
00:45:22,480 --> 00:45:24,560
So I guess to say more about the

1260
00:45:24,560 --> 00:45:26,480
infrastructure, we're running containers.

1261
00:45:26,480 --> 00:45:28,320
We have one monolith pretty much that

1262
00:45:28,320 --> 00:45:33,920
handles all of our API routes, jobs, even

1263
00:45:33,920 --> 00:45:36,640
like yeah asynchronous jobs, cron jobs

1264
00:45:36,640 --> 00:45:39,200
and that's our effect platform API.

1265
00:45:39,200 --> 00:45:40,640
And then we do have like separate

1266
00:45:40,640 --> 00:45:43,680
services, for example, for the browser

1267
00:45:43,680 --> 00:45:46,320
agent thing, we have a slack bot that's

1268
00:45:46,320 --> 00:45:47,760
separate. That's like sufficiently

1269
00:45:47,760 --> 00:45:50,960
different to necessitate another service.

1270
00:45:50,960 --> 00:45:53,200
But all that to say pretty simple, we

1271
00:45:53,200 --> 00:45:55,200
like to work in a monolith.

1272
00:45:55,200 --> 00:45:57,440
And is that monolith currently deployed

1273
00:45:57,440 --> 00:46:00,240
in a single place or are you already

1274
00:46:00,240 --> 00:46:02,320
running that in a distributed setting

1275
00:46:02,320 --> 00:46:04,080
that maybe you have one running in the

1276
00:46:04,080 --> 00:46:05,520
East Coast, one running on the West

1277
00:46:05,520 --> 00:46:08,640
Coast, wherever your customers are?

1278
00:46:08,640 --> 00:46:10,400
Yeah, we just have one running on the

1279
00:46:10,400 --> 00:46:12,960
East Coast that's next to our database.

1280
00:46:12,960 --> 00:46:15,680
Got it. So maybe at some point, there

1281
00:46:15,680 --> 00:46:18,960
might be the day on the horizon where you

1282
00:46:18,960 --> 00:46:21,440
need to like go multi data center, which

1283
00:46:21,440 --> 00:46:25,040
I'm sure will upend a whole bunch of like

1284
00:46:25,040 --> 00:46:26,640
so far trade offs you

1285
00:46:26,640 --> 00:46:27,920
didn't have to make yet.

1286
00:46:27,920 --> 00:46:30,640
But this is another thing where maybe

1287
00:46:30,640 --> 00:46:34,000
I'll invite you back to the podcast to

1288
00:46:34,000 --> 00:46:36,800
see whether Effect Workflows could help

1289
00:46:36,800 --> 00:46:37,920
with that. Since this is

1290
00:46:37,920 --> 00:46:39,440
exactly what this is about.

1291
00:46:39,440 --> 00:46:41,840
Kind of like to like going with a

1292
00:46:41,840 --> 00:46:44,560
monolith and just deploying that monolith

1293
00:46:44,560 --> 00:46:47,520
to a single place is the simplest you can

1294
00:46:47,520 --> 00:46:49,920
go with. And I love simplicity.

1295
00:46:49,920 --> 00:46:52,080
But at some point, you might need to go

1296
00:46:52,080 --> 00:46:54,720
beyond that and then to still go for

1297
00:46:54,720 --> 00:46:57,280
maximum simplicity. I think this is where

1298
00:46:57,280 --> 00:47:00,240
Effect will be another gift will be

1299
00:47:00,240 --> 00:47:02,480
receiving from Effects is like Effect

1300
00:47:02,480 --> 00:47:04,560
workflows that try to help

1301
00:47:04,560 --> 00:47:05,920
exactly with the sort of thing.

1302
00:47:05,920 --> 00:47:07,520
But we'll talk more about that in the

1303
00:47:07,520 --> 00:47:09,120
future. Yeah, I hope to make

1304
00:47:09,120 --> 00:47:11,440
it there. I hope to have these problems.

1305
00:47:11,440 --> 00:47:13,120
but maybe going back to that, so

1306
00:47:13,120 --> 00:47:14,960
you mentioned like you're running this

1307
00:47:14,960 --> 00:47:16,880
right now in a container. You mentioned

1308
00:47:16,880 --> 00:47:19,280
that you run some sort of like jobs,

1309
00:47:19,280 --> 00:47:21,200
background processes, etc.

1310
00:47:21,200 --> 00:47:23,600
How do you orchestrate that right now? Is

1311
00:47:23,600 --> 00:47:25,760
that still mostly driven through what are

1312
00:47:25,760 --> 00:47:28,160
the entry points are those entry points

1313
00:47:28,160 --> 00:47:29,920
are requests. Those entry

1314
00:47:29,920 --> 00:47:32,640
points might be cron jobs.

1315
00:47:32,640 --> 00:47:34,960
Anything else that sort of serves as an

1316
00:47:34,960 --> 00:47:37,680
entry point to kick off code that runs?

1317
00:47:37,680 --> 00:47:41,200
Yeah, so we have the HTTP like sort of

1318
00:47:41,200 --> 00:47:43,480
restful API that that kicks off code

1319
00:47:43,480 --> 00:47:43,920
where we actually wrapped.

1320
00:47:43,920 --> 00:47:46,720
We actually wrapped BullMQ with

1321
00:47:46,720 --> 00:47:48,720
some Effect helpers so that's the

1322
00:47:48,720 --> 00:47:51,200
way we're kind of queuing up jobs and

1323
00:47:51,200 --> 00:47:53,120
processing them. We're still running that

1324
00:47:53,120 --> 00:47:54,480
just on one server, all the

1325
00:47:54,480 --> 00:47:56,000
handlers. We could distribute that

1326
00:47:56,000 --> 00:47:56,880
somewhat simply.

1327
00:47:56,880 --> 00:47:59,200
And then yeah, there's also RPC endpoints

1328
00:47:59,200 --> 00:48:01,440
just for calling more service type

1329
00:48:01,440 --> 00:48:04,000
functions from from our legacy back end.

1330
00:48:04,000 --> 00:48:05,280
that's pretty much it.

1331
00:48:05,280 --> 00:48:08,480
I guess to mention cron we can

1332
00:48:08,480 --> 00:48:12,320
queue like cron type jobs in in our

1333
00:48:12,320 --> 00:48:14,640
BullMQ so we're not officially using like

1334
00:48:14,640 --> 00:48:16,480
cron jobs, but it's it's

1335
00:48:16,480 --> 00:48:18,560
you know daily scheduled jobs.

1336
00:48:18,560 --> 00:48:20,880
Got it. Can you share a bit more about

1337
00:48:20,880 --> 00:48:23,920
sort of like the DevOps lifecycle things

1338
00:48:23,920 --> 00:48:27,040
that that you're dealing with and how

1339
00:48:27,040 --> 00:48:29,040
you're using Effect for that

1340
00:48:29,040 --> 00:48:30,480
part of the picture as well?

1341
00:48:30,480 --> 00:48:31,440
One thing I didn't mention

1342
00:48:31,440 --> 00:48:34,560
is that we're using bun in in our

1343
00:48:34,560 --> 00:48:36,160
container runtime. So that's

1344
00:48:36,160 --> 00:48:38,080
been fun effect pretty much instructs

1345
00:48:38,080 --> 00:48:40,880
that away. So it's it's no different than

1346
00:48:40,880 --> 00:48:43,120
using it in node other than we get to say

1347
00:48:43,120 --> 00:48:44,560
we're running on bun and and

1348
00:48:44,560 --> 00:48:46,720
it's it's fun a bit faster.

1349
00:48:46,720 --> 00:48:47,440
There are some bun

1350
00:48:47,440 --> 00:48:48,880
features that that we like.

1351
00:48:48,880 --> 00:48:50,960
Yeah, I guess we're we're fully automated

1352
00:48:50,960 --> 00:48:53,280
like deployments. We just you know, build

1353
00:48:53,280 --> 00:48:55,920
the container in a GitHub action with bun

1354
00:48:55,920 --> 00:48:58,800
and PNPM and then push it to our

1355
00:48:58,800 --> 00:49:01,840
like ECS cluster on running on AWS.

1356
00:49:01,840 --> 00:49:03,520
Got it. Speaking of sort of like the

1357
00:49:03,520 --> 00:49:06,160
monolith and bun approach a friend of

1358
00:49:06,160 --> 00:49:10,160
mine has been working at Midjourney and

1359
00:49:10,160 --> 00:49:12,160
I think Midjourney actually has also

1360
00:49:12,160 --> 00:49:14,720
embraced the sort of architecture and

1361
00:49:14,720 --> 00:49:17,200
deployment architecture where they have

1362
00:49:17,200 --> 00:49:20,240
like one big machine where they're

1363
00:49:20,240 --> 00:49:22,560
running their monolith through bun and I

1364
00:49:22,560 --> 00:49:24,560
think they call it the mother bun.

1365
00:49:24,560 --> 00:49:27,520
So just a little fun fun side note here.

1366
00:49:27,520 --> 00:49:30,160
But speaking of Midjourney and therefore

1367
00:49:30,160 --> 00:49:32,880
AI, you mentioned initially that one

1368
00:49:32,880 --> 00:49:35,120
theme that you're currently also spending

1369
00:49:35,120 --> 00:49:37,840
quite a lot of time on is automating

1370
00:49:37,840 --> 00:49:41,600
things further with AI. So maybe we can

1371
00:49:41,600 --> 00:49:43,440
pivot the conversation a bit in that

1372
00:49:43,440 --> 00:49:45,280
direction. Do you want to give an

1373
00:49:45,280 --> 00:49:47,360
overview of like what that means and then

1374
00:49:47,360 --> 00:49:49,040
diving closer into that?

1375
00:49:49,040 --> 00:49:52,160
Definitely. The way I think 
about AI and our product

1376
00:49:52,160 --> 00:49:54,160
is sort of two

1377
00:49:54,160 --> 00:49:56,080
separate kind of verticals.

1378
00:49:56,080 --> 00:49:59,280
We are a payments product we, you know,

1379
00:49:59,280 --> 00:50:01,760
remit taxes, we have to know all the

1380
00:50:01,760 --> 00:50:04,080
taxes and we have to get those right. So

1381
00:50:04,080 --> 00:50:06,240
you think that plus AI is probably a

1382
00:50:06,240 --> 00:50:07,680
recipe for disaster.

1383
00:50:07,680 --> 00:50:08,880
But I think there are there are sort of

1384
00:50:08,880 --> 00:50:11,360
two ways we we think about it. One is the

1385
00:50:11,360 --> 00:50:13,760
customer facing way, which is, you know,

1386
00:50:13,760 --> 00:50:14,960
we've built this wonderful

1387
00:50:14,960 --> 00:50:17,440
platform for people to use.

1388
00:50:17,440 --> 00:50:21,120
How can we make AI to one make that

1389
00:50:21,120 --> 00:50:24,560
easier to use and two, I think one common

1390
00:50:24,560 --> 00:50:26,480
theme that's going on right now is just

1391
00:50:26,480 --> 00:50:28,640
meeting customers where they are, which,

1392
00:50:28,640 --> 00:50:30,800
for many means building slack bot.

1393
00:50:30,800 --> 00:50:34,080
Chat interfaces, etc. So how can AI

1394
00:50:34,080 --> 00:50:36,000
actually be the bridge between our end

1395
00:50:36,000 --> 00:50:38,560
users and our products in a way that's

1396
00:50:38,560 --> 00:50:41,120
like very safe and human in the loop and

1397
00:50:41,120 --> 00:50:43,280
you know we're not triggering payments

1398
00:50:43,280 --> 00:50:45,120
for people that are that are approved,

1399
00:50:45,120 --> 00:50:46,480
but we can actually use our

1400
00:50:46,480 --> 00:50:48,400
product with natural language.

1401
00:50:48,400 --> 00:50:50,160
And I guess when I say AI here, I'm

1402
00:50:50,160 --> 00:50:52,240
talking about LLMs specifically.

1403
00:50:52,240 --> 00:50:54,160
And then sort of the other way we're

1404
00:50:54,160 --> 00:50:56,800
thinking about it is automating process

1405
00:50:56,800 --> 00:50:59,920
heavy workflows sort of on the back end,

1406
00:50:59,920 --> 00:51:01,680
which is, you know, what if an

1407
00:51:01,680 --> 00:51:05,680
AI can file taxes, what if an AI can like

1408
00:51:05,680 --> 00:51:09,520
read your tax reports and, you know,

1409
00:51:09,520 --> 00:51:12,880
generate insights and and go and and sort

1410
00:51:12,880 --> 00:51:14,640
of do the things that need to be done.

1411
00:51:14,640 --> 00:51:16,640
And these are things that, in

1412
00:51:16,640 --> 00:51:20,240
the pre 2023 era, you might have needed

1413
00:51:20,240 --> 00:51:22,960
an army of employees or contractors to

1414
00:51:22,960 --> 00:51:25,520
like, go through these, you know,

1415
00:51:25,520 --> 00:51:27,440
convoluted .gov websites and

1416
00:51:27,440 --> 00:51:28,960
click through these things.

1417
00:51:28,960 --> 00:51:30,480
But we're sort of asking the question,

1418
00:51:30,480 --> 00:51:31,920
you know, what if, what if a person

1419
00:51:31,920 --> 00:51:33,440
doesn't actually have to do that.

1420
00:51:33,440 --> 00:51:34,960
So those are sort of the different

1421
00:51:34,960 --> 00:51:36,560
ways we're sort of thinking about it.

1422
00:51:36,560 --> 00:51:39,440
Got it. That that is super helpful. So in

1423
00:51:39,440 --> 00:51:41,120
regards to the the latter,

1424
00:51:41,120 --> 00:51:42,240
automating those

1425
00:51:42,240 --> 00:51:44,080
various like manual processes.

1426
00:51:44,080 --> 00:51:46,560
When you mentioned that currently work is

1427
00:51:46,560 --> 00:51:49,440
16 people, 4 of them being engineers, I

1428
00:51:49,440 --> 00:51:52,080
suppose, like a big chunk of the other

1429
00:51:52,080 --> 00:51:55,600
employees are still doing that sort of

1430
00:51:55,600 --> 00:51:57,600
like making the entire

1431
00:51:57,600 --> 00:52:00,240
thing happen behind the scenes.

1432
00:52:00,240 --> 00:52:02,880
But there is, as you scale up your

1433
00:52:02,880 --> 00:52:05,200
customers, you would need to scale up the

1434
00:52:05,200 --> 00:52:08,560
employees. So you want to like automate

1435
00:52:08,560 --> 00:52:10,240
as much as possible.

1436
00:52:10,240 --> 00:52:12,880
And this is where AI like is helpful.

1437
00:52:12,880 --> 00:52:16,000
Yeah, exactly. The economics of it, I

1438
00:52:16,000 --> 00:52:18,640
mean, is that, you know, we have to scale

1439
00:52:18,640 --> 00:52:20,960
our team somewhat linearly with the

1440
00:52:20,960 --> 00:52:22,320
number of customers we have.

1441
00:52:22,320 --> 00:52:25,120
But with AI, you can presumably pay

1442
00:52:25,120 --> 00:52:27,840
pennies for things that you'd have to

1443
00:52:27,840 --> 00:52:29,200
hire a bunch of people for.

1444
00:52:29,200 --> 00:52:30,480
So we're exploring

1445
00:52:30,480 --> 00:52:32,560
different different ways to do that.

1446
00:52:32,560 --> 00:52:34,080
Got it. And now it's like a great

1447
00:52:34,080 --> 00:52:36,640
opportunities for your existing employees

1448
00:52:36,640 --> 00:52:38,800
who've been doing that so far, like help

1449
00:52:38,800 --> 00:52:40,160
in that automation process

1450
00:52:40,160 --> 00:52:42,240
as they're the domain experts.

1451
00:52:42,240 --> 00:52:44,800
And yeah, that sounds fascinating. It

1452
00:52:44,800 --> 00:52:46,960
gets us full circle back to the initial

1453
00:52:46,960 --> 00:52:48,880
point of like we can be thankful to

1454
00:52:48,880 --> 00:52:50,400
you like doing that.

1455
00:52:50,400 --> 00:52:53,600
And now it's actually super fun for the

1456
00:52:53,600 --> 00:52:55,440
people who were the domain experts that

1457
00:52:55,440 --> 00:52:57,440
they can now start being

1458
00:52:57,440 --> 00:52:59,760
included in the automation process.

1459
00:52:59,760 --> 00:53:02,080
So that makes a lot of sense. And I think

1460
00:53:02,080 --> 00:53:05,280
that's a whole different topic of what it

1461
00:53:05,280 --> 00:53:08,080
means to do that automation.

1462
00:53:08,080 --> 00:53:10,080
And there's like a lot of like just from

1463
00:53:10,080 --> 00:53:13,800
my own experiments and like work on AI

1464
00:53:13,800 --> 00:53:16,160
driven things. There's like so many

1465
00:53:16,160 --> 00:53:17,600
things that can just go wrong.

1466
00:53:17,600 --> 00:53:19,520
I mean, if you're just like as a human

1467
00:53:19,520 --> 00:53:22,800
navigating websites, like things just

1468
00:53:22,800 --> 00:53:24,800
rarely are going

1469
00:53:24,800 --> 00:53:26,160
as they as they should.

1470
00:53:26,160 --> 00:53:28,240
There's like a downtime. There's like

1471
00:53:28,240 --> 00:53:30,880
whatever like a page just

1472
00:53:30,880 --> 00:53:33,600
reloads without you triggering it.

1473
00:53:33,600 --> 00:53:36,320
There's just so many unpredictable things

1474
00:53:36,320 --> 00:53:40,400
or sometimes they don't use HTML selects

1475
00:53:40,400 --> 00:53:42,960
and you know, reading the DOM, you have

1476
00:53:42,960 --> 00:53:44,400
no idea what to like there are

1477
00:53:44,400 --> 00:53:45,920
accessibility issues that

1478
00:53:45,920 --> 00:53:47,680
that an AI can run into.

1479
00:53:47,680 --> 00:53:50,320
There are so so many things. Yeah. So

1480
00:53:50,320 --> 00:53:51,760
this is it's whole

1481
00:53:51,760 --> 00:53:53,120
different kind of words.

1482
00:53:53,120 --> 00:53:55,200
And like honestly, it becomes like a

1483
00:53:55,200 --> 00:53:58,160
whole different profession of like how to

1484
00:53:58,160 --> 00:54:01,440
how to build systems that like can

1485
00:54:01,440 --> 00:54:02,720
automate these things

1486
00:54:02,720 --> 00:54:04,080
that we have in mind.

1487
00:54:04,080 --> 00:54:06,720
But maybe we focus a little bit more on

1488
00:54:06,720 --> 00:54:09,360
the first part you've mentioned where

1489
00:54:09,360 --> 00:54:11,520
you're like where you meet people where

1490
00:54:11,520 --> 00:54:13,840
they are and like expose sort of like

1491
00:54:13,840 --> 00:54:16,560
those more AI native interfaces to them.

1492
00:54:16,560 --> 00:54:18,800
Are you also building those systems with

1493
00:54:18,800 --> 00:54:20,960
Effect and maybe you can also share a

1494
00:54:20,960 --> 00:54:22,960
bit more of like how those are built

1495
00:54:22,960 --> 00:54:24,320
which of the Effect's

1496
00:54:24,320 --> 00:54:26,000
primitives they're using.

1497
00:54:26,000 --> 00:54:28,960
Yeah, we are using Effect for it.

1498
00:54:28,960 --> 00:54:30,160
We haven't actually

1499
00:54:30,160 --> 00:54:32,640
used the Effect AI thing.

1500
00:54:32,640 --> 00:54:35,760
I have wanted to use that but I guess our

1501
00:54:35,760 --> 00:54:37,680
team member who's doing it is it like I

1502
00:54:37,680 --> 00:54:39,760
said came from the Python world and it's

1503
00:54:39,760 --> 00:54:42,560
very like fast iteration cycles.

1504
00:54:42,560 --> 00:54:45,600
He was kind of fighting the learning

1505
00:54:45,600 --> 00:54:46,400
curve of learning

1506
00:54:46,400 --> 00:54:48,400
effect versus trying to get features out.

1507
00:54:48,400 --> 00:54:51,120
So we haven't explored that specific

1508
00:54:51,120 --> 00:54:53,920
primitive too much. We are using Effect

1509
00:54:53,920 --> 00:54:55,760
sort of in the same way we've used

1510
00:54:55,760 --> 00:54:58,160
we've just wrapped like the providers.

1511
00:54:58,160 --> 00:55:00,880
we're only using one LLM right now

1512
00:55:00,880 --> 00:55:02,560
which which I'll refrain from

1513
00:55:02,560 --> 00:55:04,480
naming. But you could guess.

1514
00:55:04,480 --> 00:55:06,800
Yeah, sort of the same way just just end

1515
00:55:06,800 --> 00:55:10,480
to end like wrapping workflows. There's

1516
00:55:10,480 --> 00:55:12,320
very much human in the loop sort of

1517
00:55:12,320 --> 00:55:14,560
things and we have to ask on a lot of

1518
00:55:14,560 --> 00:55:16,080
workflows like for

1519
00:55:16,080 --> 00:55:17,280
confirmation from the user.

1520
00:55:17,280 --> 00:55:19,280
So there's these like very stateful

1521
00:55:19,280 --> 00:55:22,880
flows. So we're actually using sort of

1522
00:55:22,880 --> 00:55:25,520
Effect and TypeScript more generally to

1523
00:55:25,520 --> 00:55:26,960
kind of pick up these workflows where

1524
00:55:26,960 --> 00:55:28,720
they left off and write

1525
00:55:28,720 --> 00:55:30,560
like these stateful flows.

1526
00:55:30,560 --> 00:55:32,640
Got it. That makes a lot of sense. And I

1527
00:55:32,640 --> 00:55:34,880
think it's always like a good judgment

1528
00:55:34,880 --> 00:55:38,480
call to see like hey is this is using

1529
00:55:38,480 --> 00:55:41,200
Effect here like today. Is that solving

1530
00:55:41,200 --> 00:55:44,240
a problem we have or would it potentially

1531
00:55:44,240 --> 00:55:48,400
if I pay that learning cost is worthwhile

1532
00:55:48,400 --> 00:55:50,400
paying that today or should

1533
00:55:50,400 --> 00:55:53,440
I pay it in two months from now when I

1534
00:55:53,440 --> 00:55:55,040
have more acute problems.

1535
00:55:55,040 --> 00:55:56,480
that's always a good

1536
00:55:56,480 --> 00:55:59,120
question to ask and I think that starts

1537
00:55:59,120 --> 00:56:02,720
adding up but rest assured that Effect AI

1538
00:56:02,720 --> 00:56:06,720
has become a lot more polished and I use

1539
00:56:06,720 --> 00:56:08,560
it relentlessly in many

1540
00:56:08,560 --> 00:56:11,520
projects and it's an absolute joy.

1541
00:56:11,520 --> 00:56:14,720
Oh, I'll have to explore it deeper. Yeah,

1542
00:56:14,720 --> 00:56:16,560
like you mentioned, it's hard to justify

1543
00:56:16,560 --> 00:56:19,760
when one the person doesn't know it and

1544
00:56:19,760 --> 00:56:22,800
two when you don't know what your data is

1545
00:56:22,800 --> 00:56:24,720
going to end up looking like and you

1546
00:56:24,720 --> 00:56:25,520
don't know if the

1547
00:56:25,520 --> 00:56:27,600
project will even survive.

1548
00:56:27,600 --> 00:56:29,360
So there is there is this. You know back

1549
00:56:29,360 --> 00:56:31,120
and forth between like is the

1550
00:56:31,120 --> 00:56:32,080
learning curve worth it

1551
00:56:32,080 --> 00:56:34,800
versus I need to ship features.

1552
00:56:34,800 --> 00:56:37,040
Yeah, so maybe looking a little bit more

1553
00:56:37,040 --> 00:56:41,440
into the future. What are your hopes for

1554
00:56:41,440 --> 00:56:44,720
Effect as an ecosystem and what are your

1555
00:56:44,720 --> 00:56:46,320
plans for Warp from

1556
00:56:46,320 --> 00:56:47,760
engineering perspective.

1557
00:56:47,760 --> 00:56:50,160
Good question. I think I'm I've been

1558
00:56:50,160 --> 00:56:52,080
super happy with the stuff we're

1559
00:56:52,080 --> 00:56:53,600
building. It's been like such a

1560
00:56:53,600 --> 00:56:56,160
refreshing experience building the new

1561
00:56:56,160 --> 00:56:58,640
way that whenever I'm like digging deep

1562
00:56:58,640 --> 00:57:02,880
into legacy code. I'm just like upset in general.

1563
00:57:02,880 --> 00:57:05,040
I'm like ashamed of what I've what I've

1564
00:57:05,040 --> 00:57:08,240
written in the past in some ways. So I'm

1565
00:57:08,240 --> 00:57:10,880
super excited. I'm very excited for a lot

1566
00:57:10,880 --> 00:57:12,240
of the things that are marked

1567
00:57:12,240 --> 00:57:14,240
experimental to just be like

1568
00:57:14,240 --> 00:57:16,160
production ready, so to speak.

1569
00:57:16,160 --> 00:57:18,240
Super excited for more things like the AI

1570
00:57:18,240 --> 00:57:20,800
package and and also like I mentioned. I

1571
00:57:20,800 --> 00:57:23,360
think there's so many opportunities to

1572
00:57:23,360 --> 00:57:26,720
get a lot of the ecosystem in better like

1573
00:57:26,720 --> 00:57:28,960
documentation states. There are so many

1574
00:57:28,960 --> 00:57:32,080
like discord threads with gems that you

1575
00:57:32,080 --> 00:57:34,240
know the the person coming to Effect for

1576
00:57:34,240 --> 00:57:36,160
the first time will never see for the

1577
00:57:36,160 --> 00:57:37,200
thing that they need

1578
00:57:37,200 --> 00:57:40,400
I think I'm excited for it to be in more

1579
00:57:40,400 --> 00:57:44,320
of the LLM training data. I've seen a lot of.

1580
00:57:44,320 --> 00:57:45,760
They spin their wheels because

1581
00:57:45,760 --> 00:57:47,520
they don't know the syntax or

1582
00:57:47,520 --> 00:57:49,040
whatever. They don't know a specific

1583
00:57:49,040 --> 00:57:51,600
diagnostic error. The LSP extension helps

1584
00:57:51,600 --> 00:57:54,000
a lot with that. So really, I'm just

1585
00:57:54,000 --> 00:57:55,920
excited for it to hit the mainstream more

1586
00:57:55,920 --> 00:57:58,480
and and I'd like to you know do anything

1587
00:57:58,480 --> 00:57:59,680
I can to support that.

1588
00:57:59,680 --> 00:58:00,240
There's a lot of

1589
00:58:00,240 --> 00:58:02,240
opportunities for educational content. I

1590
00:58:02,240 --> 00:58:04,560
see a lot of your team to their credit.

1591
00:58:04,560 --> 00:58:07,040
posting like animations and

1592
00:58:07,040 --> 00:58:09,040
different things. So I'm super excited

1593
00:58:09,040 --> 00:58:11,520
for the direction it's going and I think

1594
00:58:11,520 --> 00:58:14,240
the the Effect team has been great and a

1595
00:58:14,240 --> 00:58:16,320
lot of the projects I see written in it

1596
00:58:16,320 --> 00:58:17,780
are really cool. I think a lot of a lot

1597
00:58:17,780 --> 00:58:19,760
of people I respect are writing it.

1598
00:58:19,760 --> 00:58:21,120
And that's sort of

1599
00:58:21,120 --> 00:58:23,520
reason enough to try it.

1600
00:58:23,520 --> 00:58:25,840
I couldn't agree more. Thank you so much

1601
00:58:25,840 --> 00:58:28,240
for sharing your own experience with

1602
00:58:28,240 --> 00:58:30,800
Effect today and sharing your

1603
00:58:30,800 --> 00:58:32,560
super interesting story of like how

1604
00:58:32,560 --> 00:58:35,520
you've come to to co-found Warp. I

1605
00:58:35,520 --> 00:58:37,200
think it's very inspiring for the

1606
00:58:37,200 --> 00:58:39,840
audience to to show like how with how a

1607
00:58:39,840 --> 00:58:41,360
few engineers you

1608
00:58:41,360 --> 00:58:44,400
can build like a global system that that

1609
00:58:44,400 --> 00:58:47,136
solves like really material problems that

1610
00:58:47,136 --> 00:58:48,800
that's that's exactly what Effect is

1611
00:58:48,800 --> 00:58:52,107
built for and it's very cool to see that

1612
00:58:52,107 --> 00:58:53,280
is working well for you.

1613
00:58:53,280 --> 00:58:55,280
Yeah, we're we're super happy with

1614
00:58:55,280 --> 00:58:56,400
how it's turning out.

1615
00:58:56,400 --> 00:58:59,200
And if if anyone listening wants the

1616
00:58:59,200 --> 00:59:01,920
write Effect, come come join Warp.

1617
00:59:01,920 --> 00:59:03,920
Please do. Yeah, we're going to put the

1618
00:59:03,920 --> 00:59:06,560
link in the in the show notes and yeah,

1619
00:59:06,560 --> 00:59:08,880
Adam, thank you so much for taking the

1620
00:59:08,880 --> 00:59:10,560
time today and sharing your story.

1621
00:59:10,560 --> 00:59:12,240
Yeah, it was great to join. Thank you so

1622
00:59:12,240 --> 00:59:13,200
much for having me. Hopefully

1623
00:59:13,200 --> 00:59:14,640
we can do it again sometime.

1624
00:59:14,640 --> 00:59:16,640
That sounds great. All right.

1625
00:59:16,640 --> 00:59:17,920
Thank you for listening to the

1626
00:59:17,920 --> 00:59:19,520
Cause & Effect Podcast.

1627
00:59:19,520 --> 00:59:21,520
If you've enjoyed this episode, please

1628
00:59:21,520 --> 00:59:22,960
subscribe, leave a review

1629
00:59:22,960 --> 00:59:24,960
and share it with your friends.

1630
00:59:24,960 --> 00:59:26,800
If you haven't done so already, you can

1631
00:59:26,800 --> 00:59:28,400
join our Discord community.

1632
00:59:28,400 --> 00:59:30,320
And if you have any questions, feedback

1633
00:59:30,320 --> 00:59:32,800
or suggestions about this episode or

1634
00:59:32,800 --> 00:59:34,320
about Effect in general,

1635
00:59:34,320 --> 00:59:36,480
don't hesitate to get in touch.

1636
00:59:36,480 --> 00:59:50,480
See you in the next episode.