24:32Yeah, I love that analogy.
24:34I think this was really like what blew my
mind about React in the, like, when I saw
24:39it the first, the first time, not just
that it made my life simpler by not having
24:44to take care of like all of the dumb
children, like appending, creating, etc.
24:50So it made everything simpler, but
also having all of that just work
24:55automatically without me having to even
like tell it like, Hey, now update.
24:59That reactivity for the views, but also
for like the local state, but applying
25:04that now for global data, uh, I think
that is really a killer feature of
25:09local-first that I think is not well
understood by, by a lot of app developers.
25:14It's just so funny because like it's the
water we live in, you know, it's like, Oh
25:17yeah, when you're building stuff, you're
just, you spend a lot of time moving data
25:20around and checking it and updating it.
25:23And it's just like
endless little problems.
25:25Uh, I remember like Gatsby cloud, we
would like, it was such a common problem
25:30where it would like ship an update,
which like, you know, use a slightly
25:34less efficient query or up the number of
calls Internal API calls, and then all
25:41of a sudden, like the post, our Postgres
database with like red line, like, and
25:44we like, ah, no, like, or whatever.
25:47And like, it was just like a constant
headache because like, when everyone's
25:51constantly like asking for stuff,
there's just enormous inefficiencies.
25:55Cause like, I remember that was a big
thing where people are like early on
25:58with React, people are like, oh, like.
26:00My jQuery calls are so efficient,
you know, and like react is doing
26:03all this extra work and whatever.
26:04But what pretty soon everyone kind of
realized it's like, well, yes, like react
26:09does do extra work to accomplish the
same goal, but it's only actually more
26:14work if every single jQuery operation
was optimal, like you'd actually thought
26:21through the algorithm, you know, in detail
for every single one, because in practice.
26:27Everyone was just doing
lazy, weird shortcuts.
26:30You're like, you're like, I
just got to ship this feature.
26:32So I'm just going to blow it away and
rewrite the whole thing or whatever.
26:34He said, we were doing all sorts of
like weird, crappy things to, to, to
26:38kind of like update the Dom, which,
yeah, it was just like very janky,
26:43very slow all the time and whatever.
26:46So, so, so react was like,
yeah, it's like, it was an
26:48overhead to doing automatically.
26:50But it was sort of like a consistent
overhead and everything was consistently
26:56a little bit slower than optimal
instead of like sometimes optimal,
27:00sometimes widely not optimal.
27:03And so the same thing with
like moving data around.
27:05It's like, you know, people are like,
Oh, yeah, like, My data fetching is so
27:10clean and so good But you know, you have
one engineer who just accidentally grabs
27:16five megabytes of data from their API and
like, whoops, and then all of a sudden,
27:20like the whole thing falls to pieces
where, again, with like sort of more of
27:24an higher level of abstraction, it's like,
you just, it just can't happen because
27:29you can even put in checks, you're like,
You can only ask for max of 300 kilobytes
27:34in a batch or something like that.
27:35Whatever.
27:36I mean, there's all sorts of like.
27:38Smarter things that the
system can do for you.
27:41All kinds of new abstractions of
kind of like both face these same
27:45challenges of, of, or complaints.
27:47It's like, Hey, like I do it really
well and you're doing it poorly
27:50in all these cases and whatever.
27:52But if the abstraction is like
good enough, it eventually
27:55pretty quickly becomes.
27:56Better in most cases and
often better in all cases.
28:00And even if it's not better in all cases,
like taken as a whole, it just eliminates
28:04a lot of really suboptimal problems.
28:07It's like memory management, you know,
that's sort of another great example.
28:10Like people are like, I manage memory
so well, like these GCs, there's
28:13lots of overhead, blah, blah, blah.
28:15And then like.
28:1630 years of, uh, CVEs of,
you know, security issues.
28:20It is very, very hard to build
fast, efficient data loading and
28:24keeping it up to date and whatever.
28:26After like, you know, spending all
this time building local-first stuff,
28:29even like very good apps built with
like great teams, like, you know,
28:33name a name, like Vercel's dashboard.
28:34I mean, they're pushing like react
server components and all that stuff,
28:36but like you click around their dashboard
and there's like endless little, like.
28:41Loading, you know, like if they had a sync
engine, they would know that the next few
28:48has all the data and it's up to date and
they wouldn't have to like go back to the
28:51server, like, Hey, did anything change?
28:52Did anything change?
28:53Cause I'm sure they have a
local cache, but like what
28:55they're doing is always like.
28:56Asking again on every click, they're
like, Hey, has anything changed since
29:00the last time this person was here?
29:02And that, like that request, like, or sort
of that, that fundamental uncertainty with
29:07an imperative approach, like, just because
you just can't, you can't, you can't
29:12know if, if, if the data is up to date,
um, there's no way of knowing for sure.
29:16Cause there's no system that's like
reliably telling you that like, yes, the
29:20data is up to date for this next view.
29:22You have to check.
29:25And that check.
29:26Take some amount of time, which
adds glitchiness into your UI.
29:29And there's just no way of, no
way of getting away for that
29:31without, without a sync engine that
can like provide the guarantee.
29:34I think it's really interesting.
29:36You've used the term, uh, thinking about
your app data first, maybe as opposed
29:41to view first or, or react first.
29:45Yeah.
29:46I think that's kind of a big mental shift
that I've also observed in my own app
29:52development evolution of my perspectives.
29:56And I think this has been a really
powerful step because it intuitively
30:01makes sense that if you don't have the
data, then if you want to render it.
30:06And you don't have it, then
you also can't render it.
30:09And so thus you render a loader
or a skeleton, et cetera.
30:14Whereas if you think about your app.
30:17Navigation routing user experience
overall more in a data first way to
30:22think about, okay, I'm currently here.
30:24This is all the data that I need, but also
think a step ahead of like, Oh, what if
30:29I would go to, to this other route here?
30:32Maybe I should already have the
bare essentials in terms of the
30:36data for that, that if I'm going
there, it's immediately available.
30:40And then you think about your data
more, maybe you think about it as a
30:44graph or like a collection of documents,
however, you want to think about the
30:47data, how it fits your app's use case.
30:49But once you start thinking about
your app data first, I think it's
30:54so much easier to build a really.
30:56high quality, fast user experience
then, um, and it's also so much
31:01easier to make that available offline.
31:03I'm not sure whether you need Vercel's
dashboard, which is gorgeous, but has
31:08a bunch of loaders, loading spinners.
31:09I don't think you need that
necessarily to work offline.
31:12But another way to, if it works
on offline, then it's crazy fast.
31:17And I think it would be
great if it was a lot faster.
31:21So I would, I would completely agree
with kind of thinking about your, about
31:25your app development workflows as data
first, as opposed to React or Vue first.
31:32So we've been talking a lot about the,
all the good things now that you've
31:36experienced with local-first, but
I'm sure you've also experienced like
31:40some pain points, some challenges,
um, in regards to that new approach
31:45of building software or in regards to
the technologies you've been using.
31:49Tell me a bit about that,
which sort of challenges have