
localfirst.fm
·E26
#26 – Adam Fish: Ditto, Realm
Episode Transcript
1
00:00:00,119 --> 00:00:04,253
The customers of Ditto are businesses
that have workers predominantly
2
00:00:04,253 --> 00:00:06,713
that are not at desks like us.
3
00:00:06,803 --> 00:00:08,813
They're out doing jobs in the real world.
4
00:00:09,188 --> 00:00:11,584
the internet is by no means guaranteed.
5
00:00:11,854 --> 00:00:17,824
And so being able to use smart
software that leverages the network
6
00:00:18,034 --> 00:00:22,579
capabilities of the devices that workers
are already holding is compelling.
7
00:00:22,609 --> 00:00:27,039
cause it kind of adds like another
layer of, durability, to ensure their,
8
00:00:27,083 --> 00:00:28,984
application, their data, keeps working.
9
00:00:29,387 --> 00:00:31,577
Welcome to the Localfirst.fm Podcast.
10
00:00:31,847 --> 00:00:34,787
I'm your host, Johannes Schickling,
and I'm a web developer, a
11
00:00:34,787 --> 00:00:37,937
startup founder, and love the
craft of software engineering.
12
00:00:38,477 --> 00:00:42,107
For the past few years, I've been on a
journey to build a modern high quality
13
00:00:42,107 --> 00:00:46,157
music app using web technologies, and
in doing so, I've been falling down the
14
00:00:46,157 --> 00:00:47,957
rabbit hole of local-first software.
15
00:00:48,587 --> 00:00:51,377
This podcast is your invitation
to join me on that journey.
16
00:00:52,337 --> 00:00:56,987
In this episode, I'm speaking to Adam
Fish, co-founder, and CEO of Ditto.
17
00:00:57,347 --> 00:01:01,217
An end-to-end syncing platform with
a focus on resilient connectivity.
18
00:01:01,877 --> 00:01:05,987
In this conversation, Adam shares
the origin story of Ditto, his prior
19
00:01:05,987 --> 00:01:10,337
related work on Realm and the hard
networking problems Ditto is solving.
20
00:01:11,057 --> 00:01:16,127
Before getting started also a big thank
you to Jazz for sponsoring this podcast.
21
00:01:16,277 --> 00:01:18,077
And now my interview with Adam.
22
00:01:18,687 --> 00:01:19,797
Hey, welcome Adam.
23
00:01:19,797 --> 00:01:20,457
How are you doing?
24
00:01:21,147 --> 00:01:21,627
Very good.
25
00:01:21,627 --> 00:01:22,527
Excited to be here.
26
00:01:22,617 --> 00:01:22,917
Thank you.
27
00:01:23,487 --> 00:01:25,497
I'm very excited to have you on the show.
28
00:01:25,762 --> 00:01:29,572
you and I have had a little chat
before the show and just recollecting
29
00:01:29,572 --> 00:01:33,202
our members since the two of us
had the pleasure to meet way back.
30
00:01:33,472 --> 00:01:36,712
I think this was at this point,
like probably more than 10 years
31
00:01:36,742 --> 00:01:39,082
ago when you've been still at Realm.
32
00:01:39,082 --> 00:01:42,562
And we're gonna hear more about
that, but it's so cool, like how,
33
00:01:42,622 --> 00:01:46,792
like in life our paths like overlap
when we're in the same space.
34
00:01:46,972 --> 00:01:49,072
So would you mind introducing yourself?
35
00:01:49,552 --> 00:01:49,972
Yeah.
36
00:01:50,002 --> 00:01:51,502
Well, I'm excited to be here.
37
00:01:51,502 --> 00:01:52,642
Thank you for having me.
38
00:01:52,672 --> 00:01:53,752
my name's Adam Fish.
39
00:01:53,752 --> 00:01:56,152
I'm the CEO co-founder of Ditto.
40
00:01:56,542 --> 00:02:00,472
And as you've mentioned, our paths
crossed, I, it had to have been about a
41
00:02:00,472 --> 00:02:05,296
decade ago in San Francisco, where I was
at Realm, previous to starting Ditto.
42
00:02:05,596 --> 00:02:09,320
And, at the time, were you
possibly starting Prisma or it
43
00:02:09,320 --> 00:02:10,131
was like, yeah, it was around,
44
00:02:10,355 --> 00:02:12,920
that was the predecessor
to Prisma at that point.
45
00:02:12,920 --> 00:02:13,130
Yeah.
46
00:02:14,135 --> 00:02:18,312
Yeah, so, Ditto itself is, you know,
a member in sort of the local-first
47
00:02:18,312 --> 00:02:21,119
effort, but maybe not as as well known.
48
00:02:21,526 --> 00:02:26,629
and so excited to share more about
my story and, about Ditto itself.
49
00:02:26,686 --> 00:02:32,296
In short, it's an edge sync platform,
and so we connect devices peer-to-peer
50
00:02:32,356 --> 00:02:36,939
and synchronize data, through a
database, in addition up to the cloud.
51
00:02:36,939 --> 00:02:41,609
And so this is, something that, I
think is very applicable to everyone
52
00:02:41,609 --> 00:02:43,409
who's really interested in local-first.
53
00:02:43,409 --> 00:02:47,069
And, you know, I have a long history
in this, like you'd mentioned at Realm
54
00:02:47,069 --> 00:02:51,239
before it, and so excited to kind of
share the story of how I got here.
55
00:02:51,686 --> 00:02:53,366
Yeah, let's actually start with that.
56
00:02:53,366 --> 00:02:57,926
And I think there was already a
stage before you joined Realm where
57
00:02:57,926 --> 00:03:00,146
you started poking at the space.
58
00:03:00,146 --> 00:03:05,052
So maybe we wanna start with that anecdote
that part of your professional journey.
59
00:03:05,542 --> 00:03:10,942
Yeah, so it's, I at this point, about a
15 year journey where I got my start as a
60
00:03:10,942 --> 00:03:15,382
developer coming out to San Francisco and
actually working on a different startup.
61
00:03:15,443 --> 00:03:17,709
kind of went through a
couple iterations of ideas.
62
00:03:17,772 --> 00:03:22,058
we were part of AngelPad, which was sort
of like a Y Combinator, initiative Back
63
00:03:22,058 --> 00:03:23,804
in the day, it's not around, anymore.
64
00:03:24,104 --> 00:03:28,984
And, through that iteration, we ended up
exiting the accelerator program focused on
65
00:03:28,984 --> 00:03:31,264
trying to build a mobile CRM application.
66
00:03:31,564 --> 00:03:36,964
And so this was 2010, 2011, 12
timeframe where mobile was still very
67
00:03:36,964 --> 00:03:40,108
nascent, even with consumer use cases.
68
00:03:40,113 --> 00:03:44,784
But on the enterprise side, it was still,
you know, no one had figured it out.
69
00:03:44,784 --> 00:03:47,184
And so we thought that was
a big opportunity with that.
70
00:03:47,491 --> 00:03:51,271
and looking at the CRM markets, we
thought, hey, that's a big market.
71
00:03:51,271 --> 00:03:52,411
We could go disrupt it.
72
00:03:52,921 --> 00:03:57,158
And so, we started building this
application and the first thing
73
00:03:57,158 --> 00:04:00,938
we really wanted to do was build
an incredible mobile experience.
74
00:04:01,178 --> 00:04:02,648
And so that naturally.
75
00:04:03,209 --> 00:04:06,119
forced us into thinking how
can we have local-first data?
76
00:04:06,449 --> 00:04:09,179
and so at first this was really
about like user experience,
77
00:04:09,179 --> 00:04:11,069
just like instantaneous clicks.
78
00:04:11,399 --> 00:04:15,329
But then we were like, okay, working
offline would make sense as well.
79
00:04:15,574 --> 00:04:18,893
and so we ended up building
a very naive sync engine.
80
00:04:19,006 --> 00:04:22,876
and this was fairly abstracted
because we were trying to plug
81
00:04:22,876 --> 00:04:25,006
into existing CRM systems.
82
00:04:25,006 --> 00:04:30,676
And so we would pull in your data from
Salesforce and then in a sort of like a
83
00:04:30,676 --> 00:04:36,166
server driven UI pattern, sync that down
to the device, and then it would render
84
00:04:36,526 --> 00:04:42,736
the UI based off of the specific data,
fields that you had in your CRM account.
85
00:04:43,186 --> 00:04:48,526
And so it was at the time, I would say
fairly innovative for what was a, you
86
00:04:48,526 --> 00:04:51,229
know, relatively narrow application.
87
00:04:51,709 --> 00:04:55,789
And so, that was sort of the
innovative technology behind the app.
88
00:04:55,789 --> 00:04:59,299
And when we launched it, it was
started getting meager success
89
00:04:59,299 --> 00:05:00,619
from a business standpoint.
90
00:05:00,949 --> 00:05:04,349
And, myself and my co-founder at
the time looked at each other and
91
00:05:04,349 --> 00:05:08,489
we were like, you know, how did
we end up building CRM software?
92
00:05:08,489 --> 00:05:12,659
Like, this is not something that I'm
like particularly passionate about.
93
00:05:12,796 --> 00:05:17,489
and yeah, it was just like we had sort
of like a, a moment, where we wanted to
94
00:05:17,489 --> 00:05:21,173
just like, take a look at ourselves in
our lives and say, is this really what we
95
00:05:21,173 --> 00:05:23,273
wanna spend our professional careers on?
96
00:05:23,693 --> 00:05:28,733
And so, for me in that moment of
reflection, I was like, I'm really not
97
00:05:28,733 --> 00:05:34,373
interested in CRM, but this infrastructure
that we built, that to me seems really
98
00:05:34,373 --> 00:05:39,218
interesting 'cause it solved the problem
I was experiencing as a mobile developer
99
00:05:39,278 --> 00:05:44,498
wanting data locally and being able
to create like great user experiences.
100
00:05:44,918 --> 00:05:49,968
And so ultimately I have like actually
a pitch deck that's like hilariously
101
00:05:49,968 --> 00:05:54,434
similar to stuff with Ditto from,
2013 timeframe where I was like,
102
00:05:54,434 --> 00:05:58,874
okay, I wanna pivot the company and
basically, at the time sort of build
103
00:05:58,874 --> 00:06:01,348
something similar to Pars, and Firebase.
104
00:06:01,394 --> 00:06:04,574
and, you know, let's just become
an infrastructure company,
105
00:06:04,636 --> 00:06:06,034
for good about the app itself.
106
00:06:06,298 --> 00:06:11,794
And so this basically was the start of
the journey I've been on ever since.
107
00:06:11,849 --> 00:06:17,291
and so I actually shared that pitch
with the team at Realm because
108
00:06:17,291 --> 00:06:20,308
they had, you know, right around
recently had launched the mobile.
109
00:06:20,556 --> 00:06:26,226
database and we were wanting to sort of
rebuild a new version of the sync engine.
110
00:06:26,316 --> 00:06:30,996
And so they looked at that and said,
Hey, that's very much what we wanna do,
111
00:06:31,386 --> 00:06:35,126
with our database, so why don't you come
and, you know, help us, build it out.
112
00:06:35,516 --> 00:06:37,883
And so that at the time
made a lot of sense.
113
00:06:37,913 --> 00:06:42,683
'cause I was still not an expert
in databases and sync systems.
114
00:06:42,683 --> 00:06:45,383
This was all just, you know,
we were learning on the job.
115
00:06:45,413 --> 00:06:48,803
And so it felt like being part of a
bigger team that had an incredible
116
00:06:48,803 --> 00:06:52,963
set of experts was a better path to
success than trying to do it on our own.
117
00:06:53,319 --> 00:06:56,329
so I ended up joining Realm
and, was there through, through
118
00:06:56,329 --> 00:06:58,279
the acquisition with MongoDB.
119
00:06:58,279 --> 00:07:00,019
And ultimately this led to Ditto.
120
00:07:00,019 --> 00:07:05,123
So it, truly has been just a, line
all the way back from, you know, 2012
121
00:07:05,123 --> 00:07:09,393
timeframe where I had that moment of,
reflection of not wanting to spend
122
00:07:09,393 --> 00:07:11,323
my career, selling CRM software.
123
00:07:11,864 --> 00:07:12,704
That is awesome.
124
00:07:12,704 --> 00:07:16,574
And I see so many parallels for
so many people in the local-first
125
00:07:16,574 --> 00:07:20,984
space, like whoever you're looking
at who's building innovative things.
126
00:07:20,984 --> 00:07:25,514
For example, like Aaron who is working
on Xero, like, what they all have in
127
00:07:25,514 --> 00:07:29,711
common is that they wanted to build
a me included, like, wanting to build
128
00:07:29,711 --> 00:07:34,241
a great app and then realizing, okay,
what is holding us back to build this
129
00:07:34,241 --> 00:07:39,791
great app as we have it in our mind
is having great, fast local data.
130
00:07:40,751 --> 00:07:45,494
And, and then you take like in your
mind maybe short detour of like, okay,
131
00:07:45,494 --> 00:07:48,554
we're gonna build this data thing first
and then we can build the great app.
132
00:07:49,084 --> 00:07:51,564
I'm still currently in a similar path.
133
00:07:51,654 --> 00:07:54,774
This is also, like in a
similar, like back and forth.
134
00:07:54,774 --> 00:07:57,654
This is what led me to
build Prisma back then.
135
00:07:57,684 --> 00:08:02,237
Not yet with the intention of like having
everything local, but to at least have
136
00:08:02,237 --> 00:08:04,217
a better experience working with data.
137
00:08:04,637 --> 00:08:08,447
But this is very much the path
that I'm currently on where
138
00:08:08,447 --> 00:08:10,007
I'm trying to build Overtone.
139
00:08:10,217 --> 00:08:13,187
But for that, I also had to
build, roll my own data layer.
140
00:08:13,487 --> 00:08:19,037
And a similar path is what, like Aaron
has been on, and this has led to Zero.
141
00:08:19,037 --> 00:08:20,597
And the insight is always the same.
142
00:08:20,597 --> 00:08:23,627
Like to build great app
experiences, we need to have.
143
00:08:23,769 --> 00:08:27,009
great data experience, a great
developer experience around data.
144
00:08:27,429 --> 00:08:30,969
And yeah, it's funny how
like you're tackling the same
145
00:08:30,969 --> 00:08:32,559
problem over and over again.
146
00:08:32,709 --> 00:08:36,819
And every time you just like level
up significantly and you're still
147
00:08:36,819 --> 00:08:40,779
saying true towards like the same
insights and the same mission.
148
00:08:41,079 --> 00:08:45,902
So you've had now, basically three
attempts and every time you're just
149
00:08:45,902 --> 00:08:47,492
like reaching higher and higher.
150
00:08:47,732 --> 00:08:52,159
So maybe before we go into Ditto,
maybe you can share a little bit
151
00:08:52,159 --> 00:08:54,679
more about when you joined Realm.
152
00:08:54,859 --> 00:09:00,016
Like what were your responsibilities and
how did the technology that you've built
153
00:09:00,016 --> 00:09:06,619
in the first CRM app, how did that kind of
translate or differ to what became Realm?
154
00:09:06,949 --> 00:09:07,789
And yeah.
155
00:09:07,789 --> 00:09:10,639
Maybe we can focus a bit
more on the chapter on Realm.
156
00:09:11,127 --> 00:09:11,457
Yeah.
157
00:09:11,457 --> 00:09:16,021
So, I was joking that I'm either crazy,
you know, it's like that saying, if
158
00:09:16,021 --> 00:09:19,381
like you, if, you know, if you just
keep doing something over and over, you
159
00:09:19,381 --> 00:09:22,621
know, either, either maybe you're gonna
hit it right, or, or you're just crazy.
160
00:09:22,621 --> 00:09:25,471
And so I think the
jury's still out on that.
161
00:09:25,604 --> 00:09:30,191
and I do find, like everyone in sort
of the local-first, community, all the
162
00:09:30,191 --> 00:09:34,271
different approaches with it, we sort of
share that same sort of obsession of like,
163
00:09:34,271 --> 00:09:38,651
how could we just build this incredible
infrastructure so that the ultimate
164
00:09:38,651 --> 00:09:40,667
apps that come out of it, are great.
165
00:09:40,757 --> 00:09:45,857
and so the, the transition from, the
naive approach I would say that we
166
00:09:45,857 --> 00:09:49,514
had implemented, with the, that early
startup, which was called Rubik.
167
00:09:49,695 --> 00:09:54,045
it didn't really have anything innovative
in terms of managing versions, is
168
00:09:54,045 --> 00:09:55,245
kind of the simple way to put it.
169
00:09:55,245 --> 00:10:00,688
Like we didn't really understand kind
of anything about, like more novel
170
00:10:00,688 --> 00:10:03,028
approaches to managing consistency.
171
00:10:03,118 --> 00:10:05,115
And so, in addition to that, like.
172
00:10:05,655 --> 00:10:07,425
We were not database experts either.
173
00:10:07,485 --> 00:10:11,661
And so, coming to Realm was
incredible because I was immediately
174
00:10:11,661 --> 00:10:16,005
surrounded by this fantastic
technical team, including the founders
175
00:10:16,335 --> 00:10:20,008
that, had a deep understanding
of how to build a great database.
176
00:10:20,008 --> 00:10:21,688
And that's what drew me to it.
177
00:10:21,688 --> 00:10:24,508
Like Realm to me is a
developer was incredible.
178
00:10:24,568 --> 00:10:26,758
I love like the object interface.
179
00:10:26,998 --> 00:10:28,408
It was highly performant.
180
00:10:28,468 --> 00:10:33,475
It was easier to use, you know, in terms
of query, engine, compared to SQLite.
181
00:10:33,595 --> 00:10:37,765
And, I wanted to be part of the
team that was building that.
182
00:10:38,305 --> 00:10:41,811
And so, the approach that they
ultimately settled on, which I kind
183
00:10:41,811 --> 00:10:46,085
of joined, right when they were in the
early, early moments of designing the
184
00:10:46,085 --> 00:10:51,245
architecture around the sync engine was
to adopt operational transformation,
185
00:10:51,365 --> 00:10:53,425
as like the algorithm, to sync.
186
00:10:53,425 --> 00:10:56,845
And so that was, at the time,
you know, not something at all.
187
00:10:56,845 --> 00:10:57,115
I would.
188
00:10:57,955 --> 00:11:00,915
Feel comfortable trying
to implement, on my own.
189
00:11:00,975 --> 00:11:05,455
And so, the Realm team had the smarts,
across the board to implement it.
190
00:11:05,845 --> 00:11:10,351
And so, we ultimately, that
was kind of 2015 through 2018,
191
00:11:10,541 --> 00:11:11,651
you know, built that out.
192
00:11:11,711 --> 00:11:16,121
And the tough part about that, kind
of in hindsight though, was that.
193
00:11:16,586 --> 00:11:21,353
I don't think, everyone understood
the harsh edges around OT.
194
00:11:21,473 --> 00:11:27,473
And so it was very hard to implement in
test and to really, you know, prove that
195
00:11:27,473 --> 00:11:30,300
it would be consistent in all manners.
196
00:11:30,520 --> 00:11:34,650
And so that just took several
years and ultimately that had a
197
00:11:34,650 --> 00:11:36,870
big effect on the overall business.
198
00:11:37,051 --> 00:11:40,313
and, you know, there were like a
lot of lessons learned around that.
199
00:11:40,343 --> 00:11:45,010
And so, happy to kind of like dive in,
on the technical side of what I may
200
00:11:45,040 --> 00:11:48,650
mean by that, but also, you know, the
implications on the business, which
201
00:11:48,710 --> 00:11:52,630
ultimately meant like the company
was sold, and MongoDB acquired it.
202
00:11:52,630 --> 00:11:57,010
And so those lessons both on tech
and business is really what stuck
203
00:11:57,010 --> 00:11:58,850
in my mind, when starting Ditto.
204
00:11:59,285 --> 00:12:03,185
Yeah, I'd be curious to hear on
either both the technical as well
205
00:12:03,185 --> 00:12:06,664
as on the business side since
Realm really, I remember it just
206
00:12:06,698 --> 00:12:08,768
being way ahead of its time.
207
00:12:08,768 --> 00:12:13,701
Really like And I think it's all started
with this inside of like, hey, the mobile
208
00:12:13,701 --> 00:12:17,841
was just like, was fairly new back then
and everything was about mobile, like
209
00:12:17,841 --> 00:12:19,821
the entire pars back in the service.
210
00:12:20,031 --> 00:12:25,721
That became a thing driven through
the momentum of mobile and then like
211
00:12:25,751 --> 00:12:30,481
to go to such a great extent to have
like a local database that it syncs,
212
00:12:30,481 --> 00:12:34,951
et cetera, and then also going beyond
mobile to go to multiple platforms
213
00:12:34,951 --> 00:12:36,571
that was really ahead of its time.
214
00:12:36,803 --> 00:12:40,775
but as the saying goes, like it takes
10 years to build a database, not
215
00:12:40,775 --> 00:12:45,395
just to build a database here from
scratch, but also to make it sync.
216
00:12:45,715 --> 00:12:48,505
I'd be curious to, to hear
some of those anecdotes.
217
00:12:48,981 --> 00:12:49,311
Yeah.
218
00:12:49,311 --> 00:12:50,691
Well, there's a couple things.
219
00:12:50,691 --> 00:12:55,581
I mean, the part that Realm was incredible
about was its interface as a database.
220
00:12:55,641 --> 00:13:00,203
And that was no small feat really
benefited personally as a developer
221
00:13:00,263 --> 00:13:02,543
with the software being open
source, like really being able to
222
00:13:02,543 --> 00:13:04,553
understand kind of how that was built.
223
00:13:04,553 --> 00:13:08,183
But they ultimately built their
own storage engine and then
224
00:13:08,183 --> 00:13:10,793
had this really incredible API.
225
00:13:11,153 --> 00:13:15,696
But the, result of that from a,
like a resourcing perspective
226
00:13:15,696 --> 00:13:20,473
meant it took a lot of effort, to
maintain all of the different SDKs.
227
00:13:20,743 --> 00:13:27,148
And so the Swift or objective CSDK
had an API that, you know, wanted
228
00:13:27,148 --> 00:13:30,465
to look really good to those, you
know, Apple Platform developers.
229
00:13:30,825 --> 00:13:35,245
And then likewise, there was a
concerted effort to do the same .net
230
00:13:35,265 --> 00:13:37,205
or Java, you know, on, on Android.
231
00:13:37,565 --> 00:13:41,975
And so it meant that the outer
layer of the database to create
232
00:13:41,975 --> 00:13:45,515
this sort of magical API, just
took a significant investment.
233
00:13:45,815 --> 00:13:50,765
And so that was, to your point, like a
hard problem in and of itself and being
234
00:13:50,765 --> 00:13:53,971
super popular, as an open source database.
235
00:13:54,271 --> 00:13:59,041
It did, kind of command a lot of
the team's attention and so to then
236
00:13:59,041 --> 00:14:03,961
add on and say, Hey, let's take OT,
try to implement it in a generalized
237
00:14:03,961 --> 00:14:08,971
fashion to add this sync engine and
produce a cloud service with it.
238
00:14:09,856 --> 00:14:12,286
That was a lot for a startup to pull off.
239
00:14:12,346 --> 00:14:16,960
And so ultimately that, meant
really sort of never having
240
00:14:16,960 --> 00:14:18,430
the right amount of resources.
241
00:14:18,481 --> 00:14:22,216
and so to me that was one of the
concerns is that you have to figure
242
00:14:22,216 --> 00:14:24,076
out the right balance of trade-offs.
243
00:14:24,430 --> 00:14:29,890
because if you end up trying to perfect
everything at once, and you know, and
244
00:14:29,890 --> 00:14:34,870
you're doing this as a business, like
you might sort of just run out of time,
245
00:14:34,906 --> 00:14:36,406
in terms of building the business.
246
00:14:36,466 --> 00:14:39,768
And that was definitely part of
Realms journey, which was difficult,
247
00:14:39,868 --> 00:14:42,478
you know, it's a venture-backed
business, they've investors and so
248
00:14:42,714 --> 00:14:48,268
there's a clock, and managing how
to use the engineering resources to
249
00:14:48,268 --> 00:14:49,888
solve the right problems that matter.
250
00:14:50,743 --> 00:14:53,443
Both for the product and
customers, but for the business.
251
00:14:53,683 --> 00:14:56,595
you know, there were kind of
allocations, in hindsight that I
252
00:14:56,595 --> 00:14:57,852
think could have been done better.
253
00:14:58,292 --> 00:15:04,238
and a contributor to that is that just
OT was so hard, to reason with, you
254
00:15:04,238 --> 00:15:08,762
know, I'm forgetting the, individual who,
who wrote the implementation at Google,
255
00:15:08,762 --> 00:15:11,552
but I, you know, was sort of famous in
saying, if I had to write it a second
256
00:15:11,552 --> 00:15:13,532
time, it wasn't gonna be any easier.
257
00:15:13,862 --> 00:15:18,612
And so it was just a highly complex
thing to reason about and, needed
258
00:15:18,612 --> 00:15:22,692
like property based randomized
testing to get any confidence around.
259
00:15:22,752 --> 00:15:28,392
And so that just took a while and that
was doubly complex because Realm had
260
00:15:28,392 --> 00:15:32,611
this complex data model, especially
being an object database that had
261
00:15:32,611 --> 00:15:37,222
direct relationships as a first class
citizen you had to deal with, how
262
00:15:37,222 --> 00:15:39,502
do deletes work in that scenario?
263
00:15:39,625 --> 00:15:42,499
and that no one had
really done that before.
264
00:15:42,499 --> 00:15:46,339
Like the implementation with, with
Google Docs isn't needed for that.
265
00:15:46,849 --> 00:15:49,949
And that really speaks to the
magnitude of the challenge here.
266
00:15:49,949 --> 00:15:54,149
Like I remember like experiencing
Google Docs the first time and like
267
00:15:54,149 --> 00:15:59,225
how magical it felt, but like you
say, that took like an absolutely
268
00:15:59,585 --> 00:16:02,369
brilliant team to, pull this off.
269
00:16:02,429 --> 00:16:07,229
And this was like for a very specific
dedicated use case where you can
270
00:16:07,229 --> 00:16:08,999
make very specific trade-offs.
271
00:16:09,359 --> 00:16:14,549
And now with Realm, you wanna build like
a general purpose abstraction that allows
272
00:16:14,549 --> 00:16:16,649
for all kinds of different data models.
273
00:16:16,919 --> 00:16:20,729
So yeah, that, that's basically taking
the same challenge and making it
274
00:16:20,879 --> 00:16:24,959
orders of magnitudes harder because
you need to make sure it works
275
00:16:24,959 --> 00:16:26,579
for all those different scenarios.
276
00:16:26,904 --> 00:16:27,834
Yeah, absolutely.
277
00:16:27,834 --> 00:16:32,060
And that, was harder than anyone
realized in hindsight, in my opinion.
278
00:16:32,357 --> 00:16:36,894
and the other side of it too was
it just had technical challenges.
279
00:16:36,967 --> 00:16:41,557
the actual algorithm itself, given
that if you have a long history with
280
00:16:41,557 --> 00:16:45,607
devices that have been offline for
a while, you're gonna have quadratic
281
00:16:45,757 --> 00:16:50,467
complexity to being able to transform
the operations for the other devices.
282
00:16:50,737 --> 00:16:55,387
And so that would manifest itself
and it's always the worst times where
283
00:16:55,417 --> 00:16:59,167
you've got heavy load on the server
or you've got this, this one errant
284
00:16:59,167 --> 00:17:04,470
device that shows back up with a long
history and then suddenly, the server
285
00:17:04,530 --> 00:17:09,064
would itself run outta memory or, you
know, um, basically, die in the process.
286
00:17:09,064 --> 00:17:14,400
And so, that was something that at the
time we hadn't really fully solved.
287
00:17:14,430 --> 00:17:17,910
'cause you have to then figure out
how to prune histories to kind of
288
00:17:17,910 --> 00:17:19,800
prevent that scenario from happening.
289
00:17:20,190 --> 00:17:24,150
But that's like a balance of,
what does the application expect.
290
00:17:24,447 --> 00:17:29,850
and so I ultimately think those technical
problems could have been solved, like
291
00:17:29,850 --> 00:17:35,910
there were solutions to it, but it was
hard to do that under all the other
292
00:17:35,940 --> 00:17:41,580
constraints from managing the open source,
success of the mobile database itself,
293
00:17:41,910 --> 00:17:43,980
plus just the general business concerns.
294
00:17:44,010 --> 00:17:49,170
And so that's ultimately, you know,
what led to having to sell the company,
295
00:17:49,228 --> 00:17:51,660
and, you know, MongoDB acquiring it.
296
00:17:51,960 --> 00:17:56,190
And so, but all of those lessons
were sort of in the back of my mind,
297
00:17:56,324 --> 00:18:00,524
in terms of starting Ditto, because
I felt really unfulfilled is the,
298
00:18:00,794 --> 00:18:02,504
you know, honest way to describe it.
299
00:18:02,762 --> 00:18:03,812
Loved Realm.
300
00:18:03,812 --> 00:18:08,052
The product felt like it really
had the potential, but it got
301
00:18:08,052 --> 00:18:10,015
sort of cut short, in its life.
302
00:18:10,075 --> 00:18:16,345
And so the choice of joining Mongo and
trying to, you know, fix and in, you know,
303
00:18:16,345 --> 00:18:19,615
continue to improve those things in a
larger company seems somewhat difficult.
304
00:18:19,883 --> 00:18:23,295
and that was part of the reason to just
go start, Ditto was like, okay, like I've,
305
00:18:23,382 --> 00:18:27,852
done this once in a naive way, then start
to really figure out how to do it in an
306
00:18:27,852 --> 00:18:32,082
advanced way, but didn't really get to
pull it off, so could I go do that now?
307
00:18:32,235 --> 00:18:36,082
and so that was sort of the personal
motivator, in starting Ditto was it felt
308
00:18:36,082 --> 00:18:38,302
like I had to just go do it on my own.
309
00:18:38,302 --> 00:18:42,412
Is the only way to really have
the unconstrained ability to
310
00:18:42,412 --> 00:18:44,422
explore like new approaches.
311
00:18:44,600 --> 00:18:45,410
That is awesome.
312
00:18:45,410 --> 00:18:48,889
And now you have like two rounds of
practice rounds already under your
313
00:18:48,889 --> 00:18:51,929
belt, two notes just on the Realm side.
314
00:18:52,255 --> 00:18:57,385
it was sort of unfortunate news fairly
recently that Mongo decided to sunset
315
00:18:57,385 --> 00:19:01,135
Realm, which I think led to another
interesting business opportunity for
316
00:19:01,135 --> 00:19:03,665
Ditto, which we, maybe touched on later.
317
00:19:03,935 --> 00:19:07,925
but another shout out is that we, at
last year's Local-First Conf, we had
318
00:19:07,952 --> 00:19:12,942
actually one of the founders of, Realm
give a talk Alexander, about like
319
00:19:12,942 --> 00:19:17,352
what made Realm so special, which what
you've already, mentioned, which is
320
00:19:17,352 --> 00:19:21,372
like the surface area, that it feels
native to whatever platform you're
321
00:19:21,372 --> 00:19:24,162
building for, whether you're building
an iOS app, whether you're building
322
00:19:24,162 --> 00:19:26,022
a Mac app, an Android app, et cetera.
323
00:19:26,262 --> 00:19:32,225
This is where Realm really had such a big
edge and an advantage that felt native
324
00:19:32,225 --> 00:19:34,865
to whatever platform you're targeting.
325
00:19:35,345 --> 00:19:38,255
And I think that remains
true to this day very much.
326
00:19:38,645 --> 00:19:41,122
And I think there's a
lot to learn from there.
327
00:19:41,528 --> 00:19:41,798
Absolutely.
328
00:19:41,798 --> 00:19:45,488
I mean, I'm sort of like coming
from Realm, like Ditto did
329
00:19:45,518 --> 00:19:46,838
to that trade off question.
330
00:19:46,868 --> 00:19:51,692
Like our interface mirrors much more
of a traditional database, interface.
331
00:19:51,795 --> 00:19:56,955
it's a document model and we have our
own query engine called DQL, but it's,
332
00:19:56,985 --> 00:20:02,325
you know, more like a SQL interface and
a sort of cringe a little bit because
333
00:20:02,325 --> 00:20:07,755
like it really isn't as elegant, as
Realm, like Realms API was incredible.
334
00:20:07,815 --> 00:20:11,265
I mean that's, as a developer why I
wanted to join the company is it's just
335
00:20:11,265 --> 00:20:16,025
like, wow, this is the product I want to
use when building a mobile application.
336
00:20:16,375 --> 00:20:21,985
But the, but to that is, it was not
without significant resources and
337
00:20:21,985 --> 00:20:24,139
effort, to make that, interface.
338
00:20:24,439 --> 00:20:29,479
And in hindsight, that's where I sort
of wonder from a business perspective,
339
00:20:29,479 --> 00:20:34,219
did that interface really give it, you
know, drive the success of the business?
340
00:20:34,425 --> 00:20:38,042
at the time, it wasn't, it was very
popular from an open source, but it
341
00:20:38,042 --> 00:20:39,302
wasn't really helping the business.
342
00:20:39,302 --> 00:20:43,227
And so that was, The part that, I'm
hoping eventually, you know, as Ditto
343
00:20:43,227 --> 00:20:48,147
continues to grow, we'd sort of be able
to improve their API and stuff pull
344
00:20:48,147 --> 00:20:52,174
that, but we've had to sort of make the
trade off that maybe that's not a day
345
00:20:52,174 --> 00:20:54,447
one problem, given the Realm experience.
346
00:20:54,927 --> 00:20:58,377
And I think this is really like
what led to all of the success.
347
00:20:58,427 --> 00:21:02,717
you're having so far already with Ditto
where you're thinking correct about the
348
00:21:02,717 --> 00:21:07,037
trade-offs and like when you do things
on day one and how you sequence those
349
00:21:07,037 --> 00:21:11,717
and you still have those ambitions to,
do things eventually that you want to do.
350
00:21:12,047 --> 00:21:16,900
But I think, when looking at Realm,
there's so many hard things like
351
00:21:16,900 --> 00:21:18,700
building the technology by itself.
352
00:21:18,700 --> 00:21:23,020
Like, let's even imagine we have
more time, we have more resources.
353
00:21:23,170 --> 00:21:27,100
Still super hard, but then to do it in
this constrained environment where you
354
00:21:27,100 --> 00:21:32,633
need to build a business in the meanwhile,
while you're, just like losing sleep over
355
00:21:32,753 --> 00:21:37,193
super hard, unsolved technical problems,
that's just like really, really hard.
356
00:21:37,193 --> 00:21:41,993
And I think having had the experience
of seeing this journey once or twice,
357
00:21:42,290 --> 00:21:46,400
now really gave you a super unfair
and to your credit, like a positive,
358
00:21:46,400 --> 00:21:52,430
unfair advantage to start Ditto as
a business and to like solve as many
359
00:21:52,430 --> 00:21:56,817
technical problems as is currently,
applicable and healthy to your business.
360
00:21:56,817 --> 00:22:00,807
So with that, I wanna learn
more about Ditto, like, so you
361
00:22:00,807 --> 00:22:03,387
mentioned you started it in 2018.
362
00:22:03,657 --> 00:22:04,557
What was it?
363
00:22:04,837 --> 00:22:09,347
Product wise, at that point, what was
sort of like the first major milestones
364
00:22:09,367 --> 00:22:14,497
that, that you've reached and now since
2018, many years have passed and I think
365
00:22:14,497 --> 00:22:19,057
it's fair to say that you're probably
one of the most advanced, biggest players
366
00:22:19,117 --> 00:22:21,037
in the local-first in the sync space.
367
00:22:21,307 --> 00:22:22,657
So there's plenty to learn.
368
00:22:23,345 --> 00:22:27,942
Yeah, well, it's been a very interesting
journey in the sense that a lot of early
369
00:22:27,942 --> 00:22:30,815
assumptions, actually were proven wrong.
370
00:22:30,815 --> 00:22:33,865
And so, excited to kinda
share, those insights.
371
00:22:33,865 --> 00:22:38,155
And the first thing that sort of
started the company was after that
372
00:22:38,155 --> 00:22:42,422
experience working with OT and just
seeing all the challenges with it, I
373
00:22:42,422 --> 00:22:47,212
was immediately drawn to sort of the
flexibility you could say with CRDTs,
374
00:22:47,475 --> 00:22:50,745
and kind of couple axes I guess for that.
375
00:22:50,745 --> 00:22:57,805
one was it felt like just much simpler
to build the actual merge semantics,
376
00:22:57,955 --> 00:23:00,025
like, you know, reading papers and stuff.
377
00:23:00,025 --> 00:23:02,998
It's like this is just not a lot
of lines of code to get the same
378
00:23:02,998 --> 00:23:04,558
sort of predictable outcomes.
379
00:23:04,918 --> 00:23:09,628
And it was also just efficient, like these
are simple operations to actually reason
380
00:23:09,628 --> 00:23:15,117
about how to merge data together with the
trade off being that you have to increased
381
00:23:15,117 --> 00:23:17,216
the metadata of the system itself.
382
00:23:17,516 --> 00:23:22,345
'cause it's like we are going to use
more metadata to reason about, the
383
00:23:22,345 --> 00:23:27,025
different versions instead of using
OT to me was always an algorithmic
384
00:23:27,025 --> 00:23:31,915
approach and that can be more efficient
because you can send less data, but
385
00:23:32,005 --> 00:23:33,625
then the algorithm has to figure it out.
386
00:23:34,045 --> 00:23:38,162
But having seen all the challenges of
having to scale, OT algorithmically,
387
00:23:38,492 --> 00:23:43,322
it felt like using more metadata
was the right trade off, especially
388
00:23:43,322 --> 00:23:48,512
because there are other ways to sort
of compress and manage that metadata.
389
00:23:48,512 --> 00:23:53,162
So it, it felt like that problem
probably is more logarithmic versus,
390
00:23:53,187 --> 00:23:57,340
quadratic or exponential where you
had, with an algorithmic approach.
391
00:23:57,730 --> 00:24:02,316
And so that, that to me was just
interesting coming from Realm.
392
00:24:02,916 --> 00:24:09,235
The other side of it though was like, Hey,
this is a decentralized approach as well.
393
00:24:09,279 --> 00:24:10,715
this can work peer to peer.
394
00:24:10,985 --> 00:24:16,748
And that, in and of itself opened
up new possibilities, that also
395
00:24:16,748 --> 00:24:18,972
built upon, experiences at Realm.
396
00:24:19,049 --> 00:24:23,098
and so one of which is actually
the part that Ditto is less known
397
00:24:23,098 --> 00:24:27,658
for, which is how to scale just
the server side of a sync engine.
398
00:24:27,959 --> 00:24:30,542
because sync itself is stateful.
399
00:24:30,842 --> 00:24:36,495
You, can get into a scenario where
client devices have trouble migrating
400
00:24:36,795 --> 00:24:39,192
to different, nodes in the backend.
401
00:24:39,492 --> 00:24:42,938
And that was something we faced at
Realm was that it was very sticky, in
402
00:24:42,938 --> 00:24:45,158
sort of letting a device sort of reset.
403
00:24:45,653 --> 00:24:49,463
It's a state between the
client and the backend.
404
00:24:49,857 --> 00:24:51,117
wasn't very straightforward.
405
00:24:51,444 --> 00:24:55,847
but that's a lot easier to do with
CRDTs because they're inherently,
406
00:24:55,913 --> 00:24:58,193
don't require like a central system.
407
00:24:58,703 --> 00:25:02,183
And so that was actually the
main reason I was first drawn to
408
00:25:02,183 --> 00:25:04,523
it, was that stickiness problem.
409
00:25:05,033 --> 00:25:09,113
But the other side of it was like,
well wait, if you can migrate
410
00:25:09,113 --> 00:25:14,123
around to different nodes in a
server itself, why can't the nodes
411
00:25:14,123 --> 00:25:15,783
at the edge talk to each other?
412
00:25:16,143 --> 00:25:20,538
And that is, that aspect is really
what Ditto is known for now.
413
00:25:20,668 --> 00:25:24,717
but it, oddly enough came from
looking at it from more of a server
414
00:25:24,717 --> 00:25:28,253
scaling issue, coming, coming
from the experience at Realm.
415
00:25:28,597 --> 00:25:32,347
but the idea that you could
connect devices directly.
416
00:25:32,947 --> 00:25:34,297
No one had done that before.
417
00:25:34,297 --> 00:25:39,007
And so that felt like, hey, if we could
build that, that would really take
418
00:25:39,007 --> 00:25:43,173
this to the next level, and really be
something I never attempted, you know,
419
00:25:43,173 --> 00:25:44,913
in the original startup or at Realm.
420
00:25:45,303 --> 00:25:49,233
And so that, that was the part of
where trying to do that at a larger
421
00:25:49,323 --> 00:25:51,987
company, felt really not pragmatic.
422
00:25:52,087 --> 00:25:55,867
probably the last thing someone who just
buys a company wants to do is like, let,
423
00:25:55,987 --> 00:25:58,147
let some folks go and rebuild the system.
424
00:25:58,507 --> 00:26:02,317
So that was the genesis of like, this
probably has to be its own independent
425
00:26:02,317 --> 00:26:04,447
company to kind of go and pull this off.
426
00:26:04,817 --> 00:26:09,690
And so in the first six months of
the business, it was all around sort
427
00:26:09,690 --> 00:26:11,970
of proving is this even possible?
428
00:26:12,180 --> 00:26:17,187
Because in my opinion, Ditto as
a company or technology, it had a
429
00:26:17,187 --> 00:26:23,067
requirement on the edge, peer-to-peer
aspect of whether or not the hardware
430
00:26:23,510 --> 00:26:26,180
had reached maturity to pull it off.
431
00:26:26,474 --> 00:26:31,124
like enabling devices to talk
peer to peer is not a novel idea.
432
00:26:31,174 --> 00:26:32,104
That's, yeah.
433
00:26:32,104 --> 00:26:34,424
The internet was created because of that.
434
00:26:34,934 --> 00:26:39,794
But enabling devices to do that
wirelessly is very much a function
435
00:26:39,794 --> 00:26:43,904
of whether the hardware, was ready
for that because like the original
436
00:26:43,904 --> 00:26:49,544
iPhone or early mobile devices were
one underpowered, like batteries
437
00:26:49,544 --> 00:26:54,410
have gotten more dense in the years
since, CPUs and memory have increased.
438
00:26:54,520 --> 00:26:57,400
and then the wireless protocols
themselves, like Bluetooth
439
00:26:57,460 --> 00:26:58,810
is not the same protocol.
440
00:26:58,810 --> 00:27:00,610
It was even 10 years ago.
441
00:27:00,970 --> 00:27:06,460
And so the early sort of six months
of, prototyping with Ditto was very
442
00:27:06,460 --> 00:27:11,427
much a question of if this edge,
peer-to-peer is gonna be like the key
443
00:27:11,427 --> 00:27:13,017
innovation that no one has pulled off.
444
00:27:13,317 --> 00:27:16,197
There was a part that we didn't
really have control of, or which was.
445
00:27:16,472 --> 00:27:19,604
starting Ditto in 2018, like
the right time, had the hardware
446
00:27:19,604 --> 00:27:22,590
actually, progressed to a
point where this is, feasible.
447
00:27:22,957 --> 00:27:26,557
and that's the, I would say perhaps
serendipity aspect of it was
448
00:27:26,557 --> 00:27:30,697
that that was true like 10 years
sort of from the original iPhone.
449
00:27:30,697 --> 00:27:33,127
Like, you know, 2018 was the iPhone 10.
450
00:27:33,690 --> 00:27:35,370
That was a supercomputer.
451
00:27:35,534 --> 00:27:41,060
and that was a trend line that we wanted
to bet on was that those devices, even
452
00:27:41,060 --> 00:27:45,430
other form factors were gonna continue
to become, really, really powerful
453
00:27:45,730 --> 00:27:51,020
and connecting them directly, would
open up new forms of applications.
454
00:27:51,080 --> 00:27:52,250
And so if we.
455
00:27:52,955 --> 00:27:56,225
Pulled that off, like that felt
like a really big opportunity.
456
00:27:56,565 --> 00:28:01,469
So I just wanna linger on this point
for a little bit since we're thinking
457
00:28:01,469 --> 00:28:06,929
about syncing your mind typically goes
to getting data from A to B, and then
458
00:28:06,929 --> 00:28:11,459
you think about like, okay, that the
data is correct, that it converges, how
459
00:28:11,459 --> 00:28:13,559
about like transactionality, et cetera.
460
00:28:13,859 --> 00:28:18,959
But we typically always kinda assume like
getting the data from A to B of course.
461
00:28:18,959 --> 00:28:22,169
Like we have like a stable TCP
connection and like it's all good.
462
00:28:22,199 --> 00:28:23,639
Maybe we're in fiber internet.
463
00:28:24,029 --> 00:28:25,982
but what you're realizing.
464
00:28:26,202 --> 00:28:26,622
Okay.
465
00:28:26,622 --> 00:28:31,032
It is possible, like the data
part seems to be like realistic,
466
00:28:31,314 --> 00:28:33,709
and, and feasible with CRDTs.
467
00:28:33,739 --> 00:28:37,729
This is where you still had sort of like
your, more harsh experience with OT.
468
00:28:37,729 --> 00:28:42,649
CRDTs seemed very promising, and
now you realize, okay, now from a
469
00:28:42,739 --> 00:28:47,809
network topology perspective, this
is feasible that those things could
470
00:28:47,809 --> 00:28:50,059
exchange the data like directly.
471
00:28:50,479 --> 00:28:55,189
But I think what you've then
realized is like, well, two devices
472
00:28:55,189 --> 00:28:57,259
don't just talk to each other.
473
00:28:57,499 --> 00:29:01,849
That is, it's sort of like a miracle
that the internet works at scale,
474
00:29:01,849 --> 00:29:06,619
the way how it does with like routers
and network tables, et cetera.
475
00:29:06,889 --> 00:29:11,479
But now you want to kinda like jump
beyond that and make the things talk to
476
00:29:11,479 --> 00:29:17,065
each other directly, which at the same
time is, mind blowing that that's not
477
00:29:17,065 --> 00:29:22,749
the way, the default way how most things
are that when I have here my iPhone.
478
00:29:22,979 --> 00:29:27,839
And an iPad, like most realistically,
when I wanna send something
479
00:29:27,839 --> 00:29:31,263
between those two devices, it's
probably gonna leave my country.
480
00:29:31,853 --> 00:29:35,806
and this is basically the other
hard problem you've kind of stumbled
481
00:29:35,806 --> 00:29:37,846
into, which is the networking.
482
00:29:37,846 --> 00:29:43,110
So if I'm thinking about like choose
your hero for your new business, I was
483
00:29:43,110 --> 00:29:49,423
like, before you had like all the bars
on like on data and algorithmic and now
484
00:29:49,423 --> 00:29:54,853
a new bar has popped up, which is like
max out for network, for networking.
485
00:29:55,183 --> 00:29:59,113
And that is, I think when I think
about Ditto, this is, I think my
486
00:29:59,143 --> 00:30:03,553
mind immediately goes to, oh, this
is the company who's like, has gone
487
00:30:03,613 --> 00:30:09,483
to all the extremes on networking and
whatever networking way there might be.
488
00:30:09,886 --> 00:30:13,096
you probably have like an A
plus implementation for that.
489
00:30:13,536 --> 00:30:18,510
Yeah, so that is ironic because,
yeah, as I've mentioned, like coming
490
00:30:18,510 --> 00:30:20,880
from Realm, CRDTs were top of mind.
491
00:30:21,210 --> 00:30:23,580
And so this was summer of 2018.
492
00:30:23,580 --> 00:30:25,110
It was myself, my co-founder Max.
493
00:30:25,386 --> 00:30:26,776
we were just working on our own.
494
00:30:26,776 --> 00:30:28,956
We hadn't raised money,
didn't hire anyone.
495
00:30:28,986 --> 00:30:31,116
That came later at the beginning of 2019.
496
00:30:31,536 --> 00:30:36,960
And so we started working, with
some, you know, third party, CRDT
497
00:30:36,960 --> 00:30:41,940
libraries starting to kind of build a
prototype of a data store around it.
498
00:30:42,060 --> 00:30:45,600
And we were like, okay, you know, this
is a hard problem in and of itself.
499
00:30:46,003 --> 00:30:51,013
but when, like we started to embark
on getting the network layer to work.
500
00:30:51,823 --> 00:30:52,273
Wow.
501
00:30:52,273 --> 00:30:54,350
That was a very humbling experience.
502
00:30:54,350 --> 00:30:59,747
so like Max sent was very focused on the
data store in the APIs and I was like,
503
00:30:59,747 --> 00:31:02,417
oh, I'll get this Bluetooth thing working.
504
00:31:02,520 --> 00:31:03,600
no, no problem.
505
00:31:04,042 --> 00:31:09,858
And I just felt like, my whole job
was just like clicking buttons.
506
00:31:10,062 --> 00:31:15,372
because you can't really simulate
mesh networking, and that's, in
507
00:31:15,372 --> 00:31:19,242
hindsight, it was, I dunno, I guess
maybe more obvious like networking
508
00:31:19,272 --> 00:31:22,472
is, you know, not predictable.
509
00:31:22,548 --> 00:31:25,527
and mesh networking itself
is an optimization problem.
510
00:31:26,007 --> 00:31:28,767
So there is no like way
to solve mesh networking.
511
00:31:29,140 --> 00:31:32,690
and whereas solving data storage.
512
00:31:33,270 --> 00:31:38,410
There is an end state, it's like right,
it predictably onto the storage device.
513
00:31:38,462 --> 00:31:39,450
don't corrupt the data.
514
00:31:39,480 --> 00:31:44,504
Like there is a solution at the end,
but on the networking side it's all
515
00:31:44,504 --> 00:31:50,794
about balancing trade-offs and managing
like the reactions to the environment
516
00:31:50,984 --> 00:31:52,874
that you don't have full control over.
517
00:31:53,264 --> 00:31:59,214
And so that was way, way
harder than we anticipated.
518
00:31:59,387 --> 00:32:02,987
and our early version in
2018, you know, barely worked.
519
00:32:03,100 --> 00:32:07,330
but it was enough that there were
some customers that jumped out,
520
00:32:07,417 --> 00:32:12,247
specifically in the airline industry
that had similarly internally
521
00:32:12,247 --> 00:32:14,287
tried to build something like this.
522
00:32:14,317 --> 00:32:16,417
'cause they were trying to
build apps that work in the
523
00:32:16,417 --> 00:32:17,917
plane where there's no internet.
524
00:32:18,502 --> 00:32:20,272
And they couldn't pull it off.
525
00:32:20,272 --> 00:32:24,822
And so even though our, initial
prototype barely worked, the fact that
526
00:32:24,822 --> 00:32:29,379
it barely worked, was still enough
to say, Hey, that this is a big deal.
527
00:32:29,462 --> 00:32:32,345
you know, we would buy this
product at, significant scale if
528
00:32:32,345 --> 00:32:33,545
you could actually make it work.
529
00:32:33,605 --> 00:32:38,015
And so that's what ultimately led to
forming the company and hiring folks.
530
00:32:38,375 --> 00:32:43,625
But I mean, we had a prototype in
like August and September of 2018.
531
00:32:44,075 --> 00:32:48,459
We didn't really have a solid
functioning version until a year later.
532
00:32:48,742 --> 00:32:50,332
and that was really only on iOS.
533
00:32:50,332 --> 00:32:54,772
The Android one didn't come later, so
I mean, it was practically two years.
534
00:32:54,862 --> 00:33:00,895
And like 80% of that was all the
replication protocol itself, the CRDT, the
535
00:33:00,895 --> 00:33:03,175
data store aspect of it became a backseat.
536
00:33:03,475 --> 00:33:05,815
We sort of said, okay,
like, what are some kind of.
537
00:33:06,269 --> 00:33:09,269
basic semantics that people
would want, like last right wins.
538
00:33:09,539 --> 00:33:12,989
And how, how do we implement that
in a causally consistent manner?
539
00:33:13,289 --> 00:33:17,429
How do we provide an API where
you can query and, you know, do,
540
00:33:17,529 --> 00:33:19,749
simple crud operations on this?
541
00:33:20,139 --> 00:33:21,909
But then it was like.
542
00:33:22,314 --> 00:33:26,670
Put all of our energy into how do
we make this work in these, wireless
543
00:33:26,670 --> 00:33:31,474
scenarios, specifically around Bluetooth
and peer-to-peer wifi in mobile devices.
544
00:33:31,834 --> 00:33:37,264
So staying maybe at this timeframe
for a little bit, if you consider the
545
00:33:37,264 --> 00:33:41,794
technology that you've had built out
back then and today, like today, you
546
00:33:41,794 --> 00:33:47,584
probably have like orders of magnitude
of more like capabilities and coverage
547
00:33:47,584 --> 00:33:53,028
for, for different like network protocols
and topologies, et cetera, scalability.
548
00:33:53,531 --> 00:33:59,528
and you probably already, to some extent
at least kind of foresee those back then.
549
00:33:59,528 --> 00:34:04,094
You, probably, like in your head,
you start to like sum up two plus
550
00:34:04,094 --> 00:34:07,364
two and you realize, oh, that means
we should also do that and do that.
551
00:34:07,574 --> 00:34:11,428
But then it becomes like a scoping
exercise and say like, Hey,
552
00:34:11,445 --> 00:34:13,271
with, how little can we get away?
553
00:34:13,371 --> 00:34:16,191
Building this out that
is already valuable.
554
00:34:16,621 --> 00:34:19,351
so that's one thing that I'm curious
like how you went about that.
555
00:34:19,351 --> 00:34:24,301
And the other thing is going from
something that like barely works
556
00:34:24,361 --> 00:34:28,681
and in most cases breaks to a year
later, something where you feel pretty
557
00:34:29,011 --> 00:34:33,608
confident about, how did you go about
building that confidence and how good,
558
00:34:33,878 --> 00:34:35,768
like, did you know it's gonna work?
559
00:34:36,008 --> 00:34:37,598
Or have you basically Yeah.
560
00:34:37,598 --> 00:34:39,218
How did you build that confidence?
561
00:34:39,998 --> 00:34:43,868
Well, uh, no, there was still like
moments in those first couple years
562
00:34:43,868 --> 00:34:47,768
where I still wondered like, maybe this
actually really isn't going to be possible
563
00:34:47,768 --> 00:34:49,268
to the point on the hardware side.
564
00:34:49,664 --> 00:34:53,491
like this, well this is sort
of changing now, but, to date
565
00:34:53,491 --> 00:34:57,511
still the only cross-platform
way that devices can communicate,
566
00:34:57,621 --> 00:35:02,031
peer-to-peer would be Bluetooth or
if they're on the same wifi network.
567
00:35:02,348 --> 00:35:05,138
same wifi networks a little bit
easier 'cause you know, you've got
568
00:35:05,138 --> 00:35:09,711
a, higher bandwidth stable network
to a degree that's actually very much
569
00:35:09,711 --> 00:35:14,228
not true in practice, but, compared
to Bluetooth, way more stable.
570
00:35:14,738 --> 00:35:18,248
But Bluetooth was the sort of
the magical thing about Ditto.
571
00:35:18,248 --> 00:35:22,508
Like whenever we showed people the
early demos, there'd be two phones
572
00:35:22,625 --> 00:35:27,695
on airplane mode and you'd click and
instantaneously changes would happen.
573
00:35:28,225 --> 00:35:31,855
even non-technical people look
at this and say like, what?
574
00:35:32,125 --> 00:35:34,495
Like, I didn't, I didn't
know this was possible.
575
00:35:34,495 --> 00:35:35,875
Like, this feels like magic.
576
00:35:35,875 --> 00:35:37,435
Have you done something to the phone?
577
00:35:37,885 --> 00:35:42,685
And so we ultimately put a ton of
effort into trying to figure out
578
00:35:42,685 --> 00:35:44,875
how to make that work reliably.
579
00:35:45,145 --> 00:35:49,915
And so that to your point on like
early design decisions, that choice
580
00:35:49,915 --> 00:35:54,385
to really figure out how to make
Bluetooth a functioning protocol
581
00:35:54,565 --> 00:35:58,285
that you could sort of build
enterprise type applications around.
582
00:35:58,548 --> 00:36:00,745
which is what, was the customer demand.
583
00:36:01,195 --> 00:36:07,165
was a pretty tough constraint to work
under because it is very unreliable.
584
00:36:07,285 --> 00:36:12,805
Every platform has bugs and errors
in practice that are undocumented.
585
00:36:13,135 --> 00:36:16,235
Like, 'cause there are just
like improper implementations of
586
00:36:16,305 --> 00:36:18,175
Bluetooth at the firmware level.
587
00:36:18,498 --> 00:36:23,328
and, you know, scouring Stack
overflow or Apple forms or whatever.
588
00:36:23,516 --> 00:36:25,916
you'd literally find stuff
that's never mentioned on the
589
00:36:25,916 --> 00:36:27,523
internet, in encountering it.
590
00:36:27,583 --> 00:36:31,843
And the only way to encounter
that was to use physical devices.
591
00:36:32,083 --> 00:36:34,693
You cannot run the
simulator and find all this.
592
00:36:34,993 --> 00:36:41,623
So that really was why it was so hard,
like designing a protocol around it that
593
00:36:41,623 --> 00:36:43,933
was optimized for the low bandwidth.
594
00:36:44,263 --> 00:36:47,726
That was challenging 'cause we
needed to be hyper efficient,
595
00:36:48,056 --> 00:36:50,666
but at least that's something you
can kind of like whiteboard out.
596
00:36:51,206 --> 00:36:55,676
Then going and proving to yourself, wow,
this actually works in the real world.
597
00:36:55,676 --> 00:37:00,646
Meant just a lot of tedious manual effort
to the point that, I really just felt
598
00:37:00,646 --> 00:37:05,026
like a monkey clicking devices and sort
of joked I should buy a, like a robot
599
00:37:05,116 --> 00:37:09,550
that would just click phones for me,
as a way to test the software because
600
00:37:09,550 --> 00:37:11,320
there was no automated way to do it.
601
00:37:11,710 --> 00:37:15,790
And so that's the reason it took
so long was to gain that confidence
602
00:37:16,030 --> 00:37:20,906
that the choices that we had made,
would work in a reliable manner.
603
00:37:21,246 --> 00:37:25,976
And it was just sort of, I don't
know, sort of like hacking your way
604
00:37:25,976 --> 00:37:27,773
through a forest, with a machete.
605
00:37:27,773 --> 00:37:29,333
Like you didn't really
know where you were going.
606
00:37:29,333 --> 00:37:31,883
You just had to just keep
pushing, pushing onward with it.
607
00:37:32,363 --> 00:37:34,823
it was way harder than than expected.
608
00:37:35,133 --> 00:37:36,273
That is incredible.
609
00:37:36,293 --> 00:37:39,953
And like as a web developer, we
kind of like, we don't know how
610
00:37:39,953 --> 00:37:44,063
good we have it with like tools like
Playwright, which gives you like browser
611
00:37:44,063 --> 00:37:48,563
testing with like top-notch APIs, et
cetera, works for multiple browsers.
612
00:37:48,803 --> 00:37:52,733
We don't ever need to leave like
the comfort of our chair and like we
613
00:37:52,733 --> 00:37:56,393
can just like use our primary device
and then run things even headless.
614
00:37:56,413 --> 00:38:00,223
And you develop some pretty good
confidence that stuff is gonna work.
615
00:38:00,523 --> 00:38:04,663
When you're building native mobile
apps, then you're rather like you're
616
00:38:04,663 --> 00:38:06,133
flashing things on your phone.
617
00:38:06,253 --> 00:38:10,063
And then maybe you also have, like, if
you're primarily using iOS, you might
618
00:38:10,063 --> 00:38:14,353
have an Android phone and maybe you
have multiple Android phones because
619
00:38:14,353 --> 00:38:16,273
it's much more heterogeneous there.
620
00:38:16,573 --> 00:38:19,813
And then you are already getting
into that mode of like having a few
621
00:38:19,813 --> 00:38:24,823
test devices, but you're going way
further than that because you need
622
00:38:24,823 --> 00:38:26,803
to like look for all the edge cases.
623
00:38:26,803 --> 00:38:29,383
So that brings me to a
kinda funny question.
624
00:38:29,593 --> 00:38:33,590
I'm curious whether you have like
a chart of like the number of
625
00:38:33,590 --> 00:38:37,000
physical test devices that you've
kind of allotted over the years?
626
00:38:38,110 --> 00:38:42,706
Yeah, I mean we have so many devices,
that we've built up over the years.
627
00:38:42,706 --> 00:38:45,936
I mean, to the point that, I guess
almost two years back now, we, we
628
00:38:45,936 --> 00:38:48,216
invested in actually building out.
629
00:38:48,666 --> 00:38:53,470
A, what you would call a semi anechoic
chamber, to try to put a bunch of
630
00:38:53,470 --> 00:38:59,316
phones in a room, and run through
simulations of them connecting up at this.
631
00:38:59,376 --> 00:39:00,876
It was up to a hundred devices.
632
00:39:00,876 --> 00:39:06,700
And so, Like there are, physical device
testing companies that will run your app
633
00:39:06,700 --> 00:39:10,870
on a device, but they don't specialize
in actually getting the devices in their,
634
00:39:11,040 --> 00:39:12,930
in their labs to talk to each other.
635
00:39:13,230 --> 00:39:16,196
And so we basically
set out to, build that.
636
00:39:16,405 --> 00:39:20,878
we had an intern actually who, was
a mechanical engineer who actually
637
00:39:20,878 --> 00:39:22,358
designed the room and stuff.
638
00:39:22,668 --> 00:39:25,948
And so that's been sort of the fun part
about this is like, I wouldn't have
639
00:39:25,948 --> 00:39:31,318
expected 15, you know, years later after
being a software developer that this
640
00:39:31,708 --> 00:39:37,101
local-first obsession, would pull me
into such a physical manifestation of it.
641
00:39:37,360 --> 00:39:42,361
but it was all from the, desire to,
work with these peer-to-peer, like
642
00:39:42,391 --> 00:39:45,181
true peer-to-peer, wireless protocols.
643
00:39:45,521 --> 00:39:48,291
and just the plethora,
of different devices.
644
00:39:48,591 --> 00:39:51,561
And to be clear, like
this is still true in iOS.
645
00:39:51,681 --> 00:39:55,461
Like you would think that Apple
devices, their whole pitch is.
646
00:39:55,786 --> 00:39:59,566
We designed the hardware and the
software, and so you would think across
647
00:39:59,566 --> 00:40:05,536
versions that a Bluetooth firmware would
be the same and you wouldn't encounter
648
00:40:05,536 --> 00:40:07,726
weird behavior, but that's not true.
649
00:40:07,796 --> 00:40:09,376
It still exists.
650
00:40:09,616 --> 00:40:13,520
It's definitely way worse when you get
into, you know, Android, windows, Linux,
651
00:40:13,520 --> 00:40:15,623
like the, broader plethora of devices.
652
00:40:15,953 --> 00:40:21,286
But, even in the platform, you'd sort
of expect commonality across hardware.
653
00:40:21,623 --> 00:40:24,190
you'd still encounter
these, weird scenarios.
654
00:40:24,603 --> 00:40:29,163
and so we have like logic in Ditto
that at this point sort of built out
655
00:40:29,163 --> 00:40:33,933
through that trial and error that
it's not really novel like concepts,
656
00:40:34,203 --> 00:40:39,213
but it's just knowing when to smartly
sort of reset the state of the system.
657
00:40:39,416 --> 00:40:43,129
which might even mean turning the
actual network interface off and
658
00:40:43,129 --> 00:40:45,526
on at, specific, points in time.
659
00:40:45,870 --> 00:40:49,712
and so people ask like, what's
like the secret sauce of Ditto?
660
00:40:49,712 --> 00:40:52,082
And I, it's like, there's
not one thing actually.
661
00:40:52,082 --> 00:40:57,138
It's, a bunch of like good ideas, but
sort of layered on top of each other
662
00:40:57,138 --> 00:40:59,928
where each one like benefits the other.
663
00:41:00,018 --> 00:41:05,328
And so like the choice of CRDTs was
important because that opened the door
664
00:41:05,328 --> 00:41:11,019
to peer-to-peer, serverless, approach to
datas sync, which then, you know, meant
665
00:41:11,019 --> 00:41:16,065
we had to do other things to optimize,
the data transfer because we were working
666
00:41:16,065 --> 00:41:21,936
with Bluetooth and so we adopted, CRDTs,
where you can send just the differences.
667
00:41:22,230 --> 00:41:25,380
so versus like an
operations based approach.
668
00:41:25,633 --> 00:41:28,543
and so it's like that was a
decision that affected then
669
00:41:28,603 --> 00:41:30,343
subsequent aspects of the system.
670
00:41:30,898 --> 00:41:35,495
And so it's just a bunch of those smart
trade-offs, which is sort of the reason
671
00:41:35,495 --> 00:41:41,621
why I call out the experience of Realm
in seeing how then, these trade-offs, are
672
00:41:41,621 --> 00:41:48,831
really important both to implement this
solution, a system in the right technical
673
00:41:48,851 --> 00:41:53,674
way, but also to manage the constraints
as well with, business and, investors.
674
00:41:54,274 --> 00:41:54,574
Right.
675
00:41:54,574 --> 00:41:58,251
And just like you said that you
wouldn't have, believed 15 years ago,
676
00:41:58,431 --> 00:42:02,726
what this would lead you to today
were, you're like, being exposed to
677
00:42:02,816 --> 00:42:07,526
so many different devices, so many
different, like use case applications.
678
00:42:07,526 --> 00:42:09,566
You've mentioned the airline industry.
679
00:42:09,746 --> 00:42:14,576
You probably now see the world differently
where it's like, aha, I know there's
680
00:42:14,576 --> 00:42:18,416
a device and nobody knows about this
device, but this is critical and
681
00:42:18,416 --> 00:42:20,216
needs to talk to those other things.
682
00:42:20,579 --> 00:42:25,439
I'm curious, like when you build
all of this, like typically
683
00:42:25,439 --> 00:42:26,939
you don't get it right.
684
00:42:27,036 --> 00:42:29,426
like, it goes wrong, and
then you need to debug it.
685
00:42:29,696 --> 00:42:33,866
When you build a web app, when you
build a mobile app, you can at least
686
00:42:33,896 --> 00:42:38,266
like the road is like pretty well
paved, so you get like log messages.
687
00:42:38,266 --> 00:42:42,646
You might get things like distributed
traces, et cetera, metrics.
688
00:42:42,916 --> 00:42:46,606
But when you're talking to, like, when
you're talking about like literal physical
689
00:42:46,606 --> 00:42:52,666
devices where the network is part of the
problem, so you can't just like SSH into
690
00:42:52,666 --> 00:42:57,740
it, how do you even get debugging data
and visibility into what's going on?
691
00:42:58,325 --> 00:43:02,405
Yeah, it's a great question 'cause
I would say it's a topical problem
692
00:43:02,405 --> 00:43:06,360
that we're still, working through is
as we deploy Ditto into bigger use
693
00:43:06,360 --> 00:43:11,684
cases, it's become sort of the second
day problem of great that works, but
694
00:43:11,684 --> 00:43:13,254
how do you, know it really works?
695
00:43:13,254 --> 00:43:20,154
And the key value proposition of Edge
being able to do things at the edge is
696
00:43:20,154 --> 00:43:22,344
you can build more resilient software.
697
00:43:22,344 --> 00:43:26,990
And so the customers of Ditto are
businesses that have workers predominantly
698
00:43:26,990 --> 00:43:29,450
that are not at desks like us.
699
00:43:29,540 --> 00:43:31,550
They're out doing jobs in the real world.
700
00:43:31,880 --> 00:43:35,937
And so in the real world, the
internet is, by no means guaranteed.
701
00:43:36,207 --> 00:43:38,487
Cellular systems are unreliable.
702
00:43:38,541 --> 00:43:42,400
wifi systems are actually very
difficult to manage at scale.
703
00:43:42,850 --> 00:43:48,820
And so being able to use smart
software that leverages the network
704
00:43:49,030 --> 00:43:53,575
capabilities of the devices that workers
are already holding is compelling.
705
00:43:53,605 --> 00:43:57,795
'cause it kind of adds like another
layer of, durability, to ensure
706
00:43:57,795 --> 00:44:00,312
their, you know, their application,
their data, keeps working.
707
00:44:00,826 --> 00:44:06,136
But that means if the whole value
prop is to make the system more
708
00:44:06,136 --> 00:44:10,576
resilient, then Ditto itself
has to work really, really well.
709
00:44:10,606 --> 00:44:12,790
And so how do you, ensure that?
710
00:44:13,060 --> 00:44:15,760
And so we've, we've had
to build more of that out.
711
00:44:15,883 --> 00:44:17,503
and so it's sort of funny.
712
00:44:17,503 --> 00:44:20,085
There's, a, a feature we
call the Presence Viewer.
713
00:44:20,475 --> 00:44:26,671
It's simple js application, that just
shows all the nodes that are connected.
714
00:44:26,865 --> 00:44:31,165
because every time Ditto, you start it
up, there's a database interface, but
715
00:44:31,165 --> 00:44:36,025
behind the scenes it starts to take
over Bluetooth, wifi, peer-to-peer
716
00:44:36,025 --> 00:44:37,855
wifi interfaces on the device.
717
00:44:38,185 --> 00:44:40,930
And it creates what you would
say is an overlay network.
718
00:44:41,200 --> 00:44:45,160
And so the device itself will create
the links it can to other nearby
719
00:44:45,160 --> 00:44:50,350
devices, but the system itself learns
of the whole mesh because every
720
00:44:50,350 --> 00:44:55,996
device, shares, information actually
through CRDTs about it's presence.
721
00:44:55,996 --> 00:44:57,513
So like who it's connected to.
722
00:44:57,783 --> 00:44:59,673
And this eventually propagates around.
723
00:45:00,033 --> 00:45:03,783
And so we show this visually in
this super simple application.
724
00:45:03,813 --> 00:45:08,013
It's just, you know, a bunch of
nodes with colored lines showing
725
00:45:08,013 --> 00:45:09,033
the different connections.
726
00:45:09,476 --> 00:45:12,966
my co-founder built that, probably
2020, like it was just like a
727
00:45:12,966 --> 00:45:14,976
weekend project to throw together.
728
00:45:14,976 --> 00:45:18,816
But it ends up being like one of
the most crucial tools customers
729
00:45:18,816 --> 00:45:22,446
use because they're like, well,
how can I see what's going on?
730
00:45:22,776 --> 00:45:25,836
Because if data, like if they're
clicking their device and data
731
00:45:25,836 --> 00:45:29,803
isn't moving, I. The first thought
is like, am I even connected?
732
00:45:30,103 --> 00:45:35,140
And so, that was sort of the first
start in our realization that as
733
00:45:35,140 --> 00:45:39,610
great as the database itself needs to
be to handle application level data,
734
00:45:40,120 --> 00:45:44,350
to make this really worthwhile as a
developer platform, we have to provide
735
00:45:44,470 --> 00:45:46,838
observability capabilities as well.
736
00:45:46,977 --> 00:45:50,418
so that you can fix
issues when they arise.
737
00:45:50,828 --> 00:45:57,124
And so that includes now, almost like
the sort of morphing into like a mobile
738
00:45:57,124 --> 00:46:02,538
device management platform where when
you use our cloud service, you can
739
00:46:02,538 --> 00:46:06,738
observe, you know, the data in the
database, but you can also request
740
00:46:06,888 --> 00:46:13,518
from the web portal logs from specific
devices and they will transmit it up.
741
00:46:13,578 --> 00:46:15,888
And then you can, you
know, go through them.
742
00:46:16,128 --> 00:46:21,228
You can also see what are the settings and
the configuration of the SDK remotely and
743
00:46:21,228 --> 00:46:26,658
even, like issue commands down to change
stuff so that an administrator could
744
00:46:26,658 --> 00:46:28,418
say, Hey, I don't know what's going on.
745
00:46:28,418 --> 00:46:30,758
Let me turn Bluetooth off on a device.
746
00:46:30,938 --> 00:46:32,138
You can do that remotely.
747
00:46:32,438 --> 00:46:37,268
And so those were definitely not our
initial features that we were thinking
748
00:46:37,268 --> 00:46:42,354
about, but have come out of, ourselves
having to debug this alongside our
749
00:46:42,354 --> 00:46:47,094
customers of like, yeah, this is a totally
different way of building applications
750
00:46:47,754 --> 00:46:49,614
that doesn't rely on a server.
751
00:46:49,884 --> 00:46:53,568
And so you gotta have some way to
actually go and get the, information
752
00:46:53,568 --> 00:46:56,492
on these devices to figure out
what's going wrong there's a bug.
753
00:46:57,077 --> 00:46:57,917
That makes sense.
754
00:46:58,037 --> 00:47:01,427
So in terms of platforms that you're
targeting, we've been talking a lot
755
00:47:01,427 --> 00:47:03,287
about mobile devices at this point.
756
00:47:03,497 --> 00:47:07,427
Is this sort of the majority
of deployed applications or are
757
00:47:07,427 --> 00:47:09,143
there other notable platforms?
758
00:47:09,600 --> 00:47:13,933
Yeah, so all the core of Ditto, I mean,
of all the different bets we made, one
759
00:47:13,933 --> 00:47:16,213
of the technical bet was betting on Rust.
760
00:47:16,316 --> 00:47:20,043
the 2018 was I guess, sort of
a bet at that point in time.
761
00:47:20,523 --> 00:47:25,970
Now doesn't seem as as crazy, but,
we picked that, for a couple reasons.
762
00:47:25,970 --> 00:47:28,550
One is, you know, we wanted
to build something that could
763
00:47:28,550 --> 00:47:32,970
work across different hardware
platforms and so Realm was in C++.
764
00:47:33,420 --> 00:47:37,490
So in a lot of ways, you know,
all of the Rust benefits as a
765
00:47:37,490 --> 00:47:40,153
language felt like a, better choice.
766
00:47:40,483 --> 00:47:42,223
But the other piece of it was.
767
00:47:42,496 --> 00:47:47,350
an annoyance that Realm at the time,
which may maybe now would be more
768
00:47:47,350 --> 00:47:52,100
possible with WebAssembly, but, at
the time they never could implement
769
00:47:52,270 --> 00:47:54,370
the mobile database in the browser.
770
00:47:54,730 --> 00:47:57,820
And so we were like,
ah, let's not do that.
771
00:47:57,820 --> 00:48:02,290
Let's build this in one common code
base and compile it to WebAssembly.
772
00:48:02,590 --> 00:48:07,873
And at the time, you know, Rust really
was the language that given its history,
773
00:48:07,921 --> 00:48:09,500
was closely tied with WebAssembly.
774
00:48:09,500 --> 00:48:12,633
And so, you know, Ditto itself is
a Rust shop, and so all the core
775
00:48:12,633 --> 00:48:16,836
of the code base is in Rust and we
compile it for different platforms.
776
00:48:16,836 --> 00:48:22,013
And then similar to Realm provide,
a language specific wrapper around,
777
00:48:22,372 --> 00:48:24,186
the Rust Code through the FFI.
778
00:48:24,516 --> 00:48:28,066
And so, our customers though
right now predominantly use
779
00:48:28,066 --> 00:48:29,596
just the mobile versions.
780
00:48:29,626 --> 00:48:34,556
So, swift, Kotlin, flutter, which,
you know, we've recently added,
781
00:48:34,670 --> 00:48:39,610
in and React native, but you can
also run in embedded scenarios.
782
00:48:39,823 --> 00:48:43,923
so like C# and the JS version of Ditto.
783
00:48:44,096 --> 00:48:48,116
You can also run on a Raspberry Pi or
you know, more IoT kind of scenarios.
784
00:48:48,386 --> 00:48:52,003
It just hasn't been as much of a
focus, from a business standpoint.
785
00:48:52,003 --> 00:48:56,155
So those are more nascently used,
compared to the, mobile versions.
786
00:48:56,455 --> 00:49:00,145
So going very hand in hand with
the deployed platforms, you've been
787
00:49:00,145 --> 00:49:02,785
mentioning the airline use case before.
788
00:49:03,055 --> 00:49:07,675
Is this your most dominant use case or
which kind of use cases do you see most
789
00:49:07,675 --> 00:49:10,015
application for Ditto at this point.
790
00:49:10,960 --> 00:49:12,820
It's where we got
started was the airlines.
791
00:49:12,820 --> 00:49:17,200
So, you know, I mentioned kind of
that sort of regret feeling, when
792
00:49:17,200 --> 00:49:21,670
Ditto was started of not feeling
like Realm really, was as successful
793
00:49:21,670 --> 00:49:22,930
as, I believed it could be.
794
00:49:23,290 --> 00:49:28,760
And so that, that led to, my background
both engineering, both product.
795
00:49:28,760 --> 00:49:33,667
And so in the early days when it
was myself and Max in 2018, I told
796
00:49:33,667 --> 00:49:37,477
him, I was like, Hey, if we can't
get someone to wanna buy this, like,
797
00:49:37,867 --> 00:49:42,337
I don't want to waste more of my
like, prime professional career, like
798
00:49:42,337 --> 00:49:44,287
hoping this thing will be successful.
799
00:49:44,317 --> 00:49:46,957
'cause I don't want it to end
up where it sort of fizzles out.
800
00:49:47,197 --> 00:49:50,870
And that honestly is my, like, number
one advice I would say in like the
801
00:49:50,870 --> 00:49:54,553
local-first effort the part that
makes me most proud is something
802
00:49:54,553 --> 00:49:56,863
that like, could be long lasting.
803
00:49:57,083 --> 00:49:59,503
just like, how can I leave
my mark on the world and.
804
00:50:00,178 --> 00:50:01,378
My talent is in software.
805
00:50:01,378 --> 00:50:05,158
So like, how could I build something
that could have a really long impact?
806
00:50:05,698 --> 00:50:09,268
And so to do that as a business means
you gotta actually like, make money.
807
00:50:09,268 --> 00:50:13,396
And so in the early years,
I was like, let's start
808
00:50:13,426 --> 00:50:15,046
prototyping, building this out.
809
00:50:15,161 --> 00:50:19,781
let's just reach out to anyone who
might have any interest in sort of
810
00:50:19,811 --> 00:50:21,851
any aspect of the benefits of this.
811
00:50:22,121 --> 00:50:26,771
And so we were looking at like all
different to like, use cases of
812
00:50:26,831 --> 00:50:28,841
where this, platform could apply.
813
00:50:28,901 --> 00:50:32,471
And coincidentally, I had
like a family connection to
814
00:50:32,471 --> 00:50:34,091
one of the major US airlines.
815
00:50:34,158 --> 00:50:39,138
so sent this email to, it was a
fairly high up individual and he was
816
00:50:39,288 --> 00:50:40,708
like, well, I don't know who this is.
817
00:50:41,168 --> 00:50:45,524
so he basically pushed it down
to, an intern, and was like, Hey,
818
00:50:45,524 --> 00:50:46,904
take a call with these two guys.
819
00:50:46,904 --> 00:50:48,194
Like maybe there's something here.
820
00:50:48,659 --> 00:50:50,489
It's a fantastic story.
821
00:50:50,519 --> 00:50:54,389
'cause we, we put this pitch deck together
and we were like, we're building Ditto.
822
00:50:54,389 --> 00:50:58,169
And it's the CRDT database and it's
got all these amazing capabilities.
823
00:50:58,169 --> 00:51:02,249
And she was totally bored by
like 80% of the presentation.
824
00:51:02,639 --> 00:51:05,639
And then at the end, because we
had mentioned peer to peer, she
825
00:51:05,639 --> 00:51:09,139
was like, well, could it connect
like just two devices together?
826
00:51:09,409 --> 00:51:11,599
And we're like, yeah, yeah,
they can totally do that.
827
00:51:11,629 --> 00:51:12,739
Which was not true.
828
00:51:12,739 --> 00:51:14,749
Like, and actually do that at the time.
829
00:51:15,139 --> 00:51:15,889
Theoretically.
830
00:51:15,889 --> 00:51:16,279
Yes.
831
00:51:16,279 --> 00:51:16,966
It, could.
832
00:51:17,313 --> 00:51:18,723
and she was like, well that's amazing.
833
00:51:18,723 --> 00:51:19,863
Like, we need that.
834
00:51:19,863 --> 00:51:23,673
Like, that will be amazing for our
flight attendants when they're in planes.
835
00:51:23,733 --> 00:51:27,663
They could share information without
having to rely on the wifi of the plane.
836
00:51:28,053 --> 00:51:29,916
And so they're like, come
to our headquarters, like,
837
00:51:29,916 --> 00:51:31,456
we wanna see a demo of this.
838
00:51:31,816 --> 00:51:32,756
And so we.
839
00:51:33,676 --> 00:51:38,496
We're like, oh, well our schedule's
looking really busy the next several
840
00:51:38,496 --> 00:51:41,616
weeks, so like, we're, we're gonna need
to like plan this like a month later.
841
00:51:41,959 --> 00:51:46,783
and ultimately then we feverishly went
and, you know, got the peer-to-peer aspect
842
00:51:46,843 --> 00:51:52,426
working, as I mentioned with like the
Bluetooth and stuff, but it barely worked.
843
00:51:52,539 --> 00:51:56,439
but what was really cool about that is
like, we were at their headquarters and
844
00:51:56,439 --> 00:52:02,256
we were put in this like, nondescript
room and, the woman came in, the intern,
845
00:52:02,349 --> 00:52:04,659
and a couple other folks and they
were like, wow, this is really cool.
846
00:52:04,839 --> 00:52:07,149
Like, sit here, we're
gonna go get some people.
847
00:52:07,539 --> 00:52:08,739
And they just left.
848
00:52:08,769 --> 00:52:11,169
And we were just sitting there
for like 30 minutes thinking
849
00:52:11,169 --> 00:52:13,149
like, what is going on here?
850
00:52:13,209 --> 00:52:14,799
And then lo and behold, like.
851
00:52:15,159 --> 00:52:19,059
The more senior executives of the company
come marching into this conference room
852
00:52:19,449 --> 00:52:22,299
and they were like, let me see this.
853
00:52:22,579 --> 00:52:25,599
And everyone started poking
all the phones that we had.
854
00:52:25,599 --> 00:52:29,866
We had this very simple app that you
could, change the inventory values and
855
00:52:29,866 --> 00:52:33,826
it wasn't even working, like phones
were crashing and there was this one
856
00:52:33,826 --> 00:52:35,566
woman being like, that one crashed.
857
00:52:35,566 --> 00:52:36,376
That one crashed.
858
00:52:37,066 --> 00:52:39,766
But the whole time everyone
was like, this is amazing.
859
00:52:40,073 --> 00:52:42,503
like, I didn't think this was possible.
860
00:52:42,803 --> 00:52:47,663
And so that was sort of the
genesis of knowing that there was
861
00:52:47,663 --> 00:52:49,839
real customer demand for this.
862
00:52:50,409 --> 00:52:51,879
we obviously had to get it to work.
863
00:52:52,293 --> 00:52:56,313
but that's where we ended up
saying, okay, let's build a company.
864
00:52:56,409 --> 00:52:57,549
let's go raise some money.
865
00:52:57,713 --> 00:53:01,463
was after that and ultimately
led to selling to the airlines
866
00:53:01,553 --> 00:53:03,649
as, as original customers.
867
00:53:03,649 --> 00:53:09,473
And so Delta, Alaska Airlines,
Lufthansa, Japan Airlines, ANA, like
868
00:53:09,473 --> 00:53:13,523
major airlines around the world have
adopted Ditto in that same use case
869
00:53:13,733 --> 00:53:18,203
where they have installed it as part
of the mobile app that their flight
870
00:53:18,203 --> 00:53:20,553
attendants predominantly, are using.
871
00:53:20,673 --> 00:53:23,973
And so in a lot of ways, it's
actually kind of like a CRM app.
872
00:53:24,166 --> 00:53:28,186
this is an app that, you know, they have
to log into to start their job, which
873
00:53:28,186 --> 00:53:32,386
is, you know, like their hours worked
start when they, when the, you know, the
874
00:53:32,386 --> 00:53:37,989
plane is, is getting ready and it's how
they, it's like their slack, for them.
875
00:53:38,079 --> 00:53:42,099
It's where everything they need to do,
it's all the passenger information, it's
876
00:53:42,099 --> 00:53:44,259
meals that are loaded onto the plane.
877
00:53:44,589 --> 00:53:47,389
It might have safety issues and things.
878
00:53:47,429 --> 00:53:50,139
And so it's just their
lifeline to their job.
879
00:53:51,204 --> 00:53:56,634
But previous to Ditto, those apps
were effectively single player games.
880
00:53:56,904 --> 00:54:01,554
Like they would download the initial data
locally and then they would go into the
881
00:54:01,554 --> 00:54:05,064
plane and they could not actually share.
882
00:54:05,394 --> 00:54:09,504
And so they would make notes for
themselves, but it was all private.
883
00:54:09,804 --> 00:54:14,694
And so with Ditto, suddenly now, like
they have what we take for granted
884
00:54:14,724 --> 00:54:18,594
with a lot of the software we use at
desk base, which it's collaborative.
885
00:54:18,904 --> 00:54:21,841
And so, you know, they could message
each other and you know, do other
886
00:54:21,841 --> 00:54:26,361
things that ultimately mean that they
could do their jobs, more efficiently.
887
00:54:26,701 --> 00:54:30,758
And so this, is still a major use
case for us, but you know, since then
888
00:54:30,818 --> 00:54:32,378
we've expanded into other things.
889
00:54:32,378 --> 00:54:34,538
But yeah, it was sort of a weird.
890
00:54:35,184 --> 00:54:37,104
vertical to start with.
891
00:54:37,134 --> 00:54:40,374
Given that like a year and a half
into starting the company, we had
892
00:54:40,374 --> 00:54:44,588
the pandemic and the airline industry
was, heavily affected by that.
893
00:54:44,811 --> 00:54:47,418
but, yeah, it's, it, we were
able to weather through that.
894
00:54:47,418 --> 00:54:48,028
Thankfully.
895
00:54:48,523 --> 00:54:50,383
That is an incredible story.
896
00:54:50,383 --> 00:54:54,733
And just like, as a little random side
note here, if you're looking at your
897
00:54:54,763 --> 00:55:00,223
LinkedIn history, it also mentions, I,
suppose, in between some of your work
898
00:55:00,223 --> 00:55:05,323
chapters, you've been also helping out
the TV show, Silicon Valley, and the story
899
00:55:05,323 --> 00:55:09,253
you've just presented about you, like
walking into the airline and presenting
900
00:55:09,253 --> 00:55:14,003
those in front of the senior executives,
that, like my mind immediately went to
901
00:55:14,003 --> 00:55:16,913
sort of like a scene from Silicon Valley.
902
00:55:16,913 --> 00:55:20,179
So this is, like coming
full circle in so many ways.
903
00:55:20,179 --> 00:55:21,169
That is incredible.
904
00:55:21,829 --> 00:55:26,359
Well, there is some similarities to
the storyline that the individual who
905
00:55:26,359 --> 00:55:30,889
hired me at Realm was, ended up, him and
another friend of his were involved in
906
00:55:30,889 --> 00:55:33,376
kind of more directly in, the writing.
907
00:55:33,406 --> 00:55:34,216
And so he.
908
00:55:34,571 --> 00:55:37,841
He asked me in like the third or fourth
season, I forget at this point, which
909
00:55:37,841 --> 00:55:41,544
one it was, to be a technical advisor,
which meant just making sure like
910
00:55:41,591 --> 00:55:45,641
the software code on the whiteboards
and screens was semi accurate.
911
00:55:45,961 --> 00:55:50,148
so it was, fun, but it was, is it
ironic because I look at that show
912
00:55:50,148 --> 00:55:52,818
and there are definitely aspects
of, especially the new internet
913
00:55:53,178 --> 00:55:56,538
that like, is definitely not like.
914
00:55:57,093 --> 00:55:59,253
Like totally disconnected from Realm.
915
00:55:59,253 --> 00:56:02,166
Like there were times where we
said that internally at Realm, and
916
00:56:02,166 --> 00:56:05,526
even to this day, like Ditto is
sort of a manifestation of that.
917
00:56:05,526 --> 00:56:07,356
So that's, it's not by accident.
918
00:56:08,616 --> 00:56:09,157
There was, there was some connect.
919
00:56:09,157 --> 00:56:12,456
Well, if you ever have to rebrand to
Piper, we know where it's coming from.
920
00:56:12,786 --> 00:56:13,356
Exactly.
921
00:56:13,356 --> 00:56:13,416
Yeah.
922
00:56:14,826 --> 00:56:19,116
So, well, I have so many more
questions about Ditto, but I think
923
00:56:19,129 --> 00:56:23,029
we need to like split this up into
a future episode at some point.
924
00:56:23,299 --> 00:56:27,166
And, also you will be giving a
talk at Local-First Conf where
925
00:56:27,166 --> 00:56:28,726
I think we'll hear a lot more.
926
00:56:29,106 --> 00:56:34,506
I wanna just put the focus for a few more
minutes on Ditto as a platform that I
927
00:56:34,506 --> 00:56:39,276
just get a better feeling for like what it
would mean to build something with Ditto
928
00:56:39,276 --> 00:56:41,286
since when I'm looking at the website.
929
00:56:41,286 --> 00:56:42,636
Beautiful website by the way.
930
00:56:42,973 --> 00:56:47,323
When I'm looking at the website,
there's kind of two sync approaches.
931
00:56:47,323 --> 00:56:49,963
One is device sync and
one is peer-to-peer sync.
932
00:56:50,236 --> 00:56:53,676
can you delineate those a
little bit more and maybe anchor
933
00:56:53,676 --> 00:56:55,776
them in canonical use cases?
934
00:56:56,403 --> 00:57:01,113
Yeah, so in a lot of ways, like Ditto
is no different than Firebase or Realm.
935
00:57:01,173 --> 00:57:06,920
Um, like any sort of, embedded database
synchronization, like we have SDKs,
936
00:57:07,013 --> 00:57:10,223
that are an embedded document database.
937
00:57:10,527 --> 00:57:13,917
unlike Realm, like one of the
trade-offs we did was we leveraged
938
00:57:13,917 --> 00:57:15,237
an existing storage engine.
939
00:57:15,237 --> 00:57:19,157
So at at the end of the day, we're just
storing data in a SQLite database on disk.
940
00:57:19,157 --> 00:57:24,827
But we designed the API to be a document
database so that you don't have to, at the
941
00:57:24,827 --> 00:57:29,717
database level manage schemas, which in
our experience with Realm, which was very
942
00:57:29,717 --> 00:57:34,140
strict with schemas became challenging
working across, teams that have like.
943
00:57:34,515 --> 00:57:38,085
Different iOS and Android teams,
like sometimes big companies, they
944
00:57:38,085 --> 00:57:39,375
don't really coordinate as well.
945
00:57:39,645 --> 00:57:43,845
And so like Realm ended up being
this like odd thing that forced
946
00:57:43,845 --> 00:57:46,145
coordination, amongst teams.
947
00:57:46,205 --> 00:57:50,285
And so we thought, hey, schemaless
document API would, be easier.
948
00:57:50,645 --> 00:57:54,725
And so if you try it out as a developer,
you would see, hey, this looks a lot
949
00:57:54,785 --> 00:57:56,825
like in a lot of ways like Firebase.
950
00:57:56,929 --> 00:58:00,049
and so you read and write data
locally, and then behind the
951
00:58:00,049 --> 00:58:01,999
scenes we replicate that data.
952
00:58:02,419 --> 00:58:05,299
'cause at the end of the day,
data stored as CRDTs and we
953
00:58:05,299 --> 00:58:06,589
replicate it to other nodes.
954
00:58:07,069 --> 00:58:13,279
And so the device sync system is
basically the exact parallel to any
955
00:58:13,279 --> 00:58:15,379
server based synchronization system.
956
00:58:15,649 --> 00:58:20,425
There is another version of Ditto, the
server which we run as a cloud service
957
00:58:20,695 --> 00:58:22,435
that syncs data through the server.
958
00:58:22,525 --> 00:58:22,855
And so.
959
00:58:23,635 --> 00:58:25,975
That's not particularly super novel.
960
00:58:25,993 --> 00:58:29,435
I guess some of the CRDTs and things
that we do with it, you know, has,
961
00:58:29,476 --> 00:58:33,849
benefits in terms of scale, but,
the aspect that is Ditto is known
962
00:58:33,849 --> 00:58:36,729
for is that data can also move.
963
00:58:36,819 --> 00:58:37,239
You could say like.
964
00:58:37,914 --> 00:58:40,644
Vertically is to the cloud horizontally.
965
00:58:40,794 --> 00:58:44,794
And so that's where devices, when
you're using it in the peer-to-peer
966
00:58:44,794 --> 00:58:49,564
mode will connect through other
transports to nearby devices.
967
00:58:49,804 --> 00:58:53,020
So in a mobile device that's, you
know, Bluetooth like I was talking
968
00:58:53,020 --> 00:58:58,210
about, or peer-to-peer wifi, or the
wifi infrastructure itself, it actually
969
00:58:58,210 --> 00:59:02,710
can use other radio networks as well
if you're in device, if you are in a
970
00:59:02,710 --> 00:59:05,620
device that has some other custom radio.
971
00:59:05,903 --> 00:59:09,713
and so we encounter that with some
use cases where like a, a radio is
972
00:59:09,713 --> 00:59:14,920
plugged into the USB port of a mobile
device, or in like an embedded scenario.
973
00:59:15,580 --> 00:59:18,250
And that's where all the smarts are.
974
00:59:18,306 --> 00:59:23,316
to your point on the networking side
where we build this overlay network and
975
00:59:23,316 --> 00:59:26,516
devices can sync data, peer-to-peer.
976
00:59:26,936 --> 00:59:30,266
And so all of that, again,
is, driven by the fact that.
977
00:59:30,566 --> 00:59:35,033
There's these, diff based CRDTs
that are being transmitted around
978
00:59:35,123 --> 00:59:37,343
in a causally consistent manner.
979
00:59:37,753 --> 00:59:42,733
and similarly to Firebase or,
you know, other sync engine
980
00:59:42,733 --> 00:59:45,073
approaches, it's all query based.
981
00:59:45,253 --> 00:59:49,633
So what data you want is still
defined by queries on the database.
982
00:59:49,843 --> 00:59:54,826
And so if you're, you know, building
an application, you know, for like, the
983
00:59:54,826 --> 00:59:59,046
airline, you might have a query that
say, I need data for flight 1, 2, 3.
984
00:59:59,736 --> 01:00:03,126
You subscribe to that query, which will.
985
01:00:03,616 --> 01:00:07,206
Give you a callback to let you
know whenever data changes the
986
01:00:07,206 --> 01:00:08,916
database that matches that.
987
01:00:09,276 --> 01:00:15,336
But that query is then transmitted to the
other nodes, both to the cloud and peer
988
01:00:15,336 --> 01:00:21,486
to peer, and all the other nodes will
continue to evaluate that query, with data
989
01:00:21,486 --> 01:00:23,766
that they have locally and push it to you.
990
01:00:24,156 --> 01:00:27,603
And so, that will happen again,
you know, over Bluetooth.
991
01:00:27,943 --> 01:00:32,400
if a nearby device generates data, like
a flight attendant adding a message,
992
01:00:32,630 --> 01:00:37,090
for, for a given flight, it'll get out
to all the other devices, regardless
993
01:00:37,150 --> 01:00:38,710
of connectivity with the cloud.
994
01:00:39,270 --> 01:00:44,370
and so that's where we've tried to
make Ditto feel familiar in the way
995
01:00:44,370 --> 01:00:50,030
that people have experienced sync,
systems before, from client devices to
996
01:00:50,030 --> 01:00:55,940
the server or cloud, and basically try
to make that just map identically to
997
01:00:55,970 --> 01:00:57,950
that working in a peer-to-peer manner.
998
01:00:58,526 --> 01:00:59,816
That makes a lot of sense.
999
01:00:59,876 --> 01:01:05,980
And, just as a funny side note, I'm,
I must imagine that when thinking
1000
01:01:05,980 --> 01:01:11,283
so much about the, airspace use case
with flight attendants, et cetera, and
1001
01:01:11,523 --> 01:01:15,693
devices talking to each other and like
that you don't have connectivity to
1002
01:01:15,693 --> 01:01:17,803
the cloud yet you are in the clouds.
1003
01:01:17,833 --> 01:01:21,373
It's probably a funny situation.
1004
01:01:21,783 --> 01:01:26,673
So, Adam, there's so many more questions
that I would love to ask and I will
1005
01:01:26,673 --> 01:01:28,413
ask them at some point, but I think.
1006
01:01:28,688 --> 01:01:32,085
That for that we'll have to bring
you back to a second episode.
1007
01:01:32,411 --> 01:01:35,771
I wanna say thank you for
sharing all of this with us.
1008
01:01:36,031 --> 01:01:40,621
this has been incredibly insightful,
super entertaining, all of like those
1009
01:01:40,621 --> 01:01:46,621
anecdotes that you've like experienced and
gathered over like 15 years at this point.
1010
01:01:46,681 --> 01:01:47,851
Really impressive.
1011
01:01:47,851 --> 01:01:48,721
Really impressive.
1012
01:01:48,721 --> 01:01:54,308
Like how far you've brought Ditto from
the early beginnings, you and Max to now.
1013
01:01:54,308 --> 01:01:59,288
Like, there's probably most like
airlines are probably on a way to using
1014
01:01:59,288 --> 01:02:04,988
Ditto at this point and probably many
daily experiences that I, that I have.
1015
01:02:05,198 --> 01:02:07,808
You mentioned point of sales
in a previous conversation.
1016
01:02:08,368 --> 01:02:09,548
Super impressive.
1017
01:02:09,548 --> 01:02:11,528
Thank you for sharing all of this with us.
1018
01:02:12,198 --> 01:02:12,678
Thank you.
1019
01:02:12,738 --> 01:02:15,315
Yeah, I'm really looking
forward to the conference, and
1020
01:02:15,315 --> 01:02:17,315
sharing more about the journey.
1021
01:02:17,315 --> 01:02:21,384
'cause yeah, like I said, this is
something I 'm very passionate about
1022
01:02:21,408 --> 01:02:25,785
and like, excited to be, you know, with
others in the community and to the degree
1023
01:02:25,785 --> 01:02:29,095
that Ditto can inspire others, you know,
that, that makes me really excited.
1024
01:02:29,125 --> 01:02:32,901
'cause like I said, this is, this
is all driven by that early desire
1025
01:02:32,901 --> 01:02:35,001
of wanting this tool as a developer.
1026
01:02:35,061 --> 01:02:39,408
And so, I'm hopeful that we can
continue to push like the application
1027
01:02:39,408 --> 01:02:41,178
development kind of standards forward.
1028
01:02:41,208 --> 01:02:45,615
So that local-first is, more just
the default scenario to building,
1029
01:02:45,666 --> 01:02:49,938
client applications versus
this, you know, historical RPC,
1030
01:02:50,040 --> 01:02:51,205
you know, client server model.
1031
01:02:51,205 --> 01:02:55,108
So anyway, I appreciate having me and
I'm, you know, happy to, find feature
1032
01:02:55,108 --> 01:02:56,488
time to continue to tell the story.
1033
01:02:56,908 --> 01:02:57,358
Awesome.
1034
01:02:57,358 --> 01:02:58,168
Thank you so much.
1035
01:02:58,828 --> 01:02:59,038
Thank you.
1036
01:02:59,551 --> 01:03:02,131
Thank you for listening to
the localfirst.fm podcast.
1037
01:03:02,311 --> 01:03:05,401
If you've enjoyed this episode and
haven't done so already, please
1038
01:03:05,401 --> 01:03:06,691
subscribe and leave a review.
1039
01:03:07,081 --> 01:03:09,601
Please also share this episode
with your friends and colleagues.
1040
01:03:09,991 --> 01:03:12,991
Spreading the word about the
podcast is a great way to support
1041
01:03:12,991 --> 01:03:14,701
it and to help me keep it going.
1042
01:03:15,361 --> 01:03:18,781
A special thanks again to Jazz
for supporting this podcast.
1043
01:03:19,081 --> 01:03:20,041
I'll see you next time.