00:00Imagine if you could mock up an
app just based on React use state
00:05or like equivalent things, and
you build your UI around that.
00:08but then magically your app actually works
and like all of the status persistent
00:14and you can share it with other users
and, you have permissions on there and
00:18you still only wrote front end code.
00:21That's kind of the Jazz story
00:24Welcome to the localfirst.fm podcast.
00:26I'm your host, Johannes Schickling,
and I'm a web developer, a
00:29startup founder, and love the
craft of software engineering.
00:32For the past few years, I've been on a
journey to build a modern, high quality
00:36music app using web technologies.
00:38And in doing so, I've been falling down
the rabbit hole of local-first software.
00:43This podcast is your invitation
to join me on that journey.
00:47In this episode, I'm
speaking to Anselm Eickhoff.
00:49Creator of Jazz and founder
of Garden Computing.
00:53In this conversation, we dive deep into
Jazz to learn how it works and which use
00:58cases it's a good fit for by exploring
various apps already built on top of Jazz.
01:03Before getting started, also a big
thank you to Rosicorp and PowerSync
01:07for supporting this podcast.
01:09And now my interview with Anselm.
01:13Hey Anselm, so nice to
have you on the show.
01:15How are you doing?
01:16Hey Johannes, doing good.
01:17How are you?
01:18I'm doing great.
01:19I was looking forward to today
talking to you about Jazz.
01:23I know a little bit about Jazz and
as I'm generally trying to scan the
01:28local-first ecosystem, but super excited
to have you on the show and dive deeper,
01:33learn a lot more about Jazz, but before
we dig in, do you mind giving a quick
01:37background and introduce yourself?
01:40Oh yeah, of course.
01:41I guess I've always been
like interested in the web.
01:43I think it technically, I started with
like Flash for people who remember
01:48that, but I very quickly got into
making websites, just static ones
01:51first, kind of doing web design
for local shops in my hometown and
01:56that became more and more serious.
01:57I learned about Rails and like building
whole web apps and what that even meant.
02:01And I guess most of my career
kind of spent being like a full
02:06stack consultant, building apps
for lots of different industries.
02:11And typically I would be just like one
man army doing like product design and
02:16building the backend and the front end and
just building kind of the first version
02:21of that app that was ready for production.
02:24And then doing the next one
and the next one and so on.
02:27And that was lots of fun.
02:28And I learned a lot, but over time,
especially when you build lots of apps
02:32that are very different in nature,
like who they serve, how they work.
02:37You still notice that there's so many
things that you have to do again and
02:41again and again, and they don't even
really have to do with each app.
02:44And you're, you're.
02:45You're using these tools that are
supposed to be like high level
02:48frameworks for building web apps,
but you still need to do so much
02:51yourself, redundantly each time.
02:52Like people who build web apps will
know stuff like, why do you have
02:57to do user auth and permissions
every time or like file uploads,
03:00this is like super simple stuff.
03:03and that always like nagged me.
03:05and particularly like, it seemed like.
03:07What you're really trying to
do is just share state between
03:11different users of the app.
03:12And why, why do I have to build a whole
stack and why is it so weird to do it?
03:17But I never really had a
good, good solution for it.
03:20Right.
03:20And that's kind of what, what brought
me where I am today with Jazz.
03:24And yeah, happy to tell
you more about that.
03:27Yeah, that journey definitely
resonates and, sort of in a similar
03:31counter reaction, in, in 2016, just
led me back then to starting GraphQL,
03:36which later turned into Prisma.
03:38So I feel like that's a common, somewhat
common story to like, from like the
03:43previous trauma of like doing something
over and over again in a way that
03:48doesn't quite satisfy you, where you feel
like, Oh man, we can do so much better.
03:53so that story definitely resonates.
03:55I'd be actually intrigued to hear
a little bit more about some of the
03:58specific aspects, but I'm sure you'll,
you'll cover that in comparison to Jazz.
04:04So, and Jazz is actually not
quite the only thing you're doing
04:08since you're doing this under
the umbrella of Garden Computing.
04:12So before diving into Jazz, do you
mind giving a quick idea of like,
04:17what is that umbrella and what.
04:19led you to that?
04:20Yeah, sure.
04:21So it actually started with an app
called Garden, which was kind of like
04:26my take on what should a Notion clone
look like, what kind of other ideas do I
04:32have, I was really fascinated by Notion
when it came out and by Figma just like
04:37setting this new standard of like, it not
just being like a higher fidelity app.
04:43But one where like multiplayer and like
rich multi user interaction is like baked
04:49kind of into the very fabric of the app
and then the app itself is just like kind
04:54of like features on top of that, right?
04:56And I was like, this is cool, but I think
It still doesn't feel fundamental enough.
05:01Like the multiplayer ness of it
and like also the aspects that we
05:05now call local-first that I didn't
really have a name for back then.
05:09and I was like, okay, I want to do
something like that, but I want to do
05:11that part even better and then build
like even cooler features on top.
05:15And that, that was Garden.
05:17And yeah, I did a bunch of
experiments there and that's.
05:20That's pretty much what, what led
me to what, what Jazz became as for
05:25like Garden Computing as an idea
for a company or bigger umbrella.
05:31I can get more into that later,
but basically the idea is that.
05:34I'm really fascinated by abstractions,
by like powerful abstractions, by
05:38abstractions that are tall and like
span many levels of, of understanding.
05:43And very often they come from
like academia and research, right?
05:47That's where people find like
really new, better ways of
05:50describing and building things.
05:52But they're obviously very abstract,
very hard to approach for most people.
05:57and from my experience as a.
06:00Full stack web dev, I'm, I'm like very
in touch with what people are using day
06:06to day and what, what the mainstream
developer is like and cares about.
06:10and I just love the idea of taking
these new ideas and kind of like
06:15finding ways to package them in a way
that makes sense for the mainstream.
06:20And that actually makes.
06:21What we use in the mainstream,
a little more enlightened.
06:24So I think in the broadest sense,
that's, that's what Garden Computing
06:28for me is about and like Jazz
and local-first is kind of like
06:33the first step in that journey.
06:35And I love the vibe overall
of like Garden Computing.
06:39A garden is something that I think
that's just, I'd say if you'd ask anyone,
06:45they'd probably associate it with like
a nice, comfortable, homey feeling.
06:50If you think about a garden, does this
maybe even, you have a very personal
06:54relationship of like, maybe you put
together the garden, maybe you care
06:58after it, or maybe not, maybe it looks a
little bit wilder, but there's something
07:02very unique and something very personal
to our garden compared to like a very
07:08Industrial, like hyperscale, like that
doesn't sound like a garden to me.
07:14and also like the use case that
you've mentioned sort of like a
07:18Notion esque thing, I think Notion
is also like there, there's this
07:22term of like a digital garden.
07:24so all of that is like a vibe
that very much resonates.
07:27And it also resonates that you're saying
you didn't actually start right away.
07:32with designing Jazz as a local-first
tool, but that you're rather stumbling
07:38into it through working on an actual app.
07:41Since there's also the analogy for
me, the parallel that while working
07:45on Overtone, I also realized, okay,
this is a data foundation that I'm
07:49working on that doesn't just work well
for Overtone, but also for other apps.
07:53So I think this is one of the
most authentic ways to Really
07:57think of a new data abstraction.
08:00So now with that background, can
you give me an introduction to Jazz?
08:05Yeah.
08:05So like, to audiences like
this, I introduced Jazz just as
08:09like, a framework for building
web apps in a local-first way.
08:14That's probably the
simplest way to put it.
08:16That of course requires you to
already know what local-first means.
08:21So I think maybe a nice way to explain it
is to go a bit more in depth on like how
08:27through trying to build Garden, I kind of
discovered what I thought it needed to be.
08:32Because in many ways I didn't
like sit down and be like,
08:35Oh, I want to build this app.
08:36I want to build it in local-first ways.
08:39and then I'll make a local-first
framework to build the app because.
08:42When I started building the app, I
didn't even know about local-first.
08:45I didn't know about that as a term.
08:47I saw apps like, like Notion and Figma.
08:51and I guess systems like Git, where
it feels different from a traditional
08:58SaaS app with a centralized server
and it has these really nice
09:02properties and it actually feels
like it's suddenly very easy to do
09:05multiplayer, to have offline support.
09:08And to like be really serious and honest
about the fact that what you're building
09:13with your app is a distributed system
and not like some thin client around
09:17like the app basically just running on
another computer, on one other computer.
09:22so I was like, okay, I want
my app to be like that.
09:25And I started building the app and
I had all of these crazy ideas in
09:28terms of like features for Garden.
09:30Part of it was even like, it
should be like a visual programming
09:33language in there and like.
09:35I actually didn't get too far on that
because very soon I was like, okay,
09:38what's, what's the infrastructure I need.
09:41That's like fabric that, that just
has in the data layer, multiplayer
09:46and users and permissions and sharing
and working on your device, but still
09:50being able to sync to the cloud.
09:52So I started building that
just as part of Garden, right.
09:55and very soon just through like.
09:58abstracting and encapsulating the code.
10:00I had this like separate
layer that did all of that.
10:03and a big part of what made that
layer possible was learning about,
10:08Ink and Switch and their blog posts
and publications, seeing auto merge
10:12as the first CRDT that I encountered
and being like, Oh, even just the idea
10:17of having like, synced state between
two text editors is super interesting.
10:22Like, let's.
10:24Build the layer around that.
10:26And then once I had that layer, I looked
at it and I was like, damn, this is like
10:30really interesting, not just for Garden.
10:33but I kind of want to build
every app ever like this now.
10:37thinking of all the apps I had built
in the past, all the other apps I
10:40still wanted to build or the apps I
didn't even know I could build yet.
10:44And I'm like, if I feel like that,
probably other people will too.
10:47They just don't know yet that it's
even possible to have this abstraction.
10:51So therefore I should probably try.
10:53And make this a framework.
10:54And that's, that's the
origin story of Jazz, right?
10:58That makes a lot of sense.
10:59And, it also, there's, this
interesting dance of, being irritated
11:06and confused by some problems, this
desire of like, could we do better?
11:10You kind of hope we could do better.
11:12You don't quite know yet how to do better.
11:15You see some proof for other apps.
11:19Being able to build something in an
experience that you wouldn't quite
11:22know how you would replicate that.
11:25You go on like looking around for
ideas and luckily they're, very smart
11:31people, like the folks associated
with Ink and Switch who are also like
11:35write about that and inspire others.
11:38And that leads you to
maybe also like be very.
11:42compelled by those ideas, but maybe
you have some slightly different takes.
11:46And so this is where, where it evolves.
11:49that makes a lot of sense.
11:50And I see a lot of like parallels
there for like past endeavors and
11:55current endeavors that I'm on.
11:57So this is what led to Jazz.
12:00And I think there's like a lot of
similarities for how other data
12:05technologies, like in the local-first
space came to be and, throughout the
12:09further conversation, I'm sure we'll
learn about what makes the specific flavor
12:15of Jazz, how that compares to others,
but maybe we can best approach that
12:21by talking a little bit more about the
applications that, Jazz wants to empower.
12:27So can you, give me an idea of like,
what is like a typical app that, Is
12:33just naturally now built with Jazz.
12:35And what are some apps that
you've like intended Jazz for?
12:39Right.
12:40I guess one thing I will add in terms
of like, what's special about Jazz
12:44and we'll go more in depth about that
later, but like while building it
12:48as part of Garden, I realized that
the responsibility of this layer.
12:52It's actually not just a data layer, it
also needs to, or like, I wanted it to
12:58also handle user identity and permissions
because that's other, other, because
13:04like, that's what allows you to go from
having a local-first app that kind of
13:08syncs between your devices as a single
player user to just extending that
13:13model very naturally to multiplayer.
13:16and it just always felt like these two
things, user identity and permissions
13:20also need to be part of that abstraction.
13:21And that's kind of, that's the most
special thing about Jazz, I would say.
13:26and that has enabled it to support
quite a, like, wide range of different
13:31apps that, that even surprised me.
13:33and you kind of, you have apps that are
like obviously local-first and are like
13:37a very good fit, and they are some of
the ones that, that already felt the
13:42strongest benefit from adopting Jazz.
13:44for example, like I, I think
Garden is a good example.
13:47We're actually almost at a point now
where we can start building Garden
13:50again, based on top of what Jazz is now.
13:53That's, it's like Notion.
13:55It's very clearly a local-first app.
13:57One of my favorite early adopters,
they're an app called Invoice Radar,
14:02which is basically, it lets freelancers
collect invoices automatically from
14:08like cloud providers and other things
they use that send them invoices,
14:13manage them, and then submit them
to tax authorities, for example.
14:17And that's an area where like, yeah,
having it local-first is really important.
14:23And the people who were building the
app already, I think also without
14:27knowing the term at the beginning, knew
that they wanted to build it that way.
14:31And then they found Jazz and they're
like, Oh, there's like a framework that
14:34Just lets you build apps like that.
14:36And once they started building it with
that, they were just able to get to
14:40like an MVP of their apps so quickly.
14:43So that's kind of like, almost
like an obvious success story.
14:46Right.
14:46But then there's other ones that are
really surprising that start to push
14:50the boundaries of what a local-first
app is, or does the framework even
14:55only need to be for local-first app?
14:57one I'm building myself with, my
girlfriend that I presented in Berlin
15:02at our local-first conference is
an app called Succulent, which is
15:06basically a Hootsuite alternative,
like a social media scheduling tool.
15:12And it's like 90 percent a local-first
app where you can like plan drafts
15:17for Instagram posts, for example,
on your device and you prepare
15:20them with the pictures and the
descriptions and the hashtags.
15:24But then it has this component that's like
not local-first at all, because like in
15:27order to meaningfully schedule posts to be
posted, you need to have a server worker.
15:33and, typically this would mean that,
well, you just need to build it as
15:36a centralized, like, SaaS app where
all this logic runs on a server.
15:40But, What I realized with Jazz is
like, you can actually take this
15:43local-first concept further and the
server worker can just become yet another
15:47local-first client to the shared state.
15:50And then you get this really funky
arrangement of like, you have
15:54this local-first app for authoring
all this stuff and then just this
15:57little worker that whenever you're
online and your stuff gets synced.
16:00It will know about what you're
trying to do and then you can go
16:04offline again and it will post your
posts for you by like interacting
16:07with the meta API, for example.
16:09So that was already a bit of
a stretch of what Jazz can do.
16:13But honestly, the most ambitious and
most out there things in terms of
16:17what you can build with Jazz have
been from like other early adopters.
16:21So one of the crazier ones is This
guy Nikita is building an app called
16:27LearnAnything, and you can check it out.
16:29It's already public.
16:30You can go to, I think, Learn Anything.
16:33xyz.
16:34It's, it's like a cross
between Quora and Reddit.
16:37It's like a learning community where you
can be like, I want to learn how to play
16:42the guitar, or I want to learn TypeScript.
16:44and for each topic that you might
want to learn, you find this like
16:48community curated list of like
really good links to other resources,
16:52like videos, blog posts, whatever.
16:55and that's just the social network, right?
16:57And the crazy thing is, he's already
getting a bunch of impressions just from
17:02SEO, so you have like lots of, First
time visitors and all of the state that
17:07needs to be loaded for each of these
potentially huge topics, which have like
17:11thousands of links or something like that.
17:13And he decided to completely pivot his
stack to just use Jazz for everything.
17:19And I think one of his motivations
is that, For each individual user, he
17:24actually wants the experience to be
local-first in the sense that you can
17:27also have your own kind of like notion,
like notes about the topic and your
17:31learning progress in there and manage
your own collection of links and so on.
17:37But then through sharing it with
others, again, it needs to have the
17:40scaling properties of a social network.
17:42And that really, really stretched Jazz,
but he was able to kind of like, Self
17:47publicly launched already and a version
of his app completely built on Jazz.
17:51And so far it seems to be working.
17:53So, so that's kind of an interesting one.
17:56another one, which is very early and
we'll have to see if it works, but
17:59it's basically like a local-first
spreadsheet app, which is just like
18:03really intense in terms of like how
much data there's in it and how like
18:07finally granular the interaction will be.
18:10And then the last use case I'll
mention also really surprised me
18:14because it actually uses Jazz to do
much less than a whole app where,
18:19it's at this huge enterprise and
they have like CI pipelines for like
18:24their build processes or whatever.
18:26but it's really hard to look at them
and see what's going on, which builds
18:29are passing, which ones are failing.
18:31And it's all in this like super old
system with a really clunky API.
18:35And this person just wanted to
build like a dashboard for that.
18:37Right.
18:38And that's really annoying.
18:39They decided to use Jazz basically
just as a layer that makes that
18:43clunky old API real time and
really easy to build UIs around.
18:50So they again have like a server worker
that makes requests to that API and
18:55then maintains like a version of the
state of all of the stuff in Jazz.
19:01And then they built a really thin
client with Jazz and the two, like
19:07the status shared between the two.
19:08And then they were able to super
quickly build a really nice dashboard,
19:12where you see a real time updates
of what's actually going on.
19:15and I, I think you can start to see
like how these are actually all.
19:18Really weirdly different.
19:20And yet everyone was able to use
Jazz as this like small tool that
19:26does a lot very successfully.
19:28and I have to say as a caveat as
well, these are very brave people.
19:31Like Jazz is early in many ways.
19:33Some of its APIs are clunky as well.
19:35The documentation really isn't there
yet, but all the important like magic
19:40is already there and I think that's what
allowed all these people to move quite
19:44quickly and confidently and the parts
that still have friction are problematic.
19:49They were kind of able to work around it.
19:50I think that's kind of a good
representation of where we're at as well.
19:54That sounds incredible.
19:55That's such a wide range of different
apps and different use cases.
19:59you mentioning InvoiceRadar, for
example, I'm actually one of the
20:03early users of InvoiceRadar, I've
been using it for multiple months
20:07now, and I can confidently say that,
I would have probably not started to
20:12adopt it if it wasn't local-first.
20:14Not because of like, that I say like,
okay, now I have this bar Everything has
20:19to be local-first, like I still adopt
other tools, but in this particular thing
20:23is, one of the, main ways, how this tool
works is by getting access, like actually
20:31log in access to the various places
that you where I pay for an invoice.
20:36So this tool needs access to my Notion,
to my Slack, to my Hetzner columns,
20:42to all those like very critical places
I wouldn't give anyone access who I
20:46wouldn't really, really, really trust.
20:49And that level of trust, I can't
just give that to like an arbitrary
20:53SaaS startup, that wasn't around
like a couple of years ago.
20:57Even if it was around, I
would still have trust issues.
21:01And that trust issues thing.
21:03They very elegantly address by,
saying like, Hey, the entire
21:08thing runs all on your computer.
21:10Like.
21:11All of like the login credentials, et
ceterall of that, like not running in the
21:15cloud, like all remains on your computer.
21:18and so this is how that afforded me
the trust and I've been using it.
21:24And, it works amazing.
21:26And I think it's built by folks,
who are like very confident in
21:32sort of like front end development.
21:34And I think Jazz empowers them
to like leverage their strength.
21:38And a lot of like the data moving
around, that is taken care of.
21:42So that is like a use case that
I can already as a user speak to.
21:46And then I want to also hear more
about the Learn Anything use case,
21:50since that's, to me, seems like
it's actually stretching, quite on
21:55the boundaries of where local-first
is even considered a good fit.
21:59I think, if you hear about local-first,
like where App use case works well,
22:04that's more around like data that's all
like centered around a small entity,
22:09whether it's one user, whether it's one
document, one workspace, one small team,
22:14but the more I think it's actually used
sort of like as the counterexample,
22:18the more something is seen as a social
network, the more local-first also
22:24actually becomes increasingly tricky
to model around, to scale, et cetera.
22:28So I'd love to hear a little bit more how,
Learn Anything and how Jazz helps with
22:34this sort of like end boss of use cases.
22:37Yeah, I'll, I'll go into that.
22:39There's two more things I want to say
about Invoice Radar, because, I think
22:43that ties in quite nicely with what
makes Jazz special, particularly for
22:47like your particular sensibilities as
a user where like, yeah, you need to
22:51put your login credentials in there.
22:53Why can you trust it?
22:54And part of the answer is, well, it,
because it only runs on your device,
22:58but then even then you might want to,
and I think they're working on like a
23:03mobile companion app to Invoice Radar.
23:05So you can also just like scan and
paper invoices with your phone.
23:10So obviously it's like 2024, you want
sync between your devices, right?
23:16Maybe you're no longer just like a solo
freelancer, but you have like a small
23:20company and you want other people in
your team to submit invoices as well.
23:23And how do you do that while maintaining
the trust that you have with the
23:28credentials and your invoices?
23:30And Jazz's answer there is exactly
what I mentioned earlier that.
23:33User identity and permission is
also part of the abstraction that
23:37it offers you, and it solves those
in a local-first way as well.
23:42And we, again, we'll go into that
later, but basically it uses public key
23:46cryptography to do permissions and auth.
23:49And what that means is that, Their
app can actually use my infrastructure
23:54to sync data between your devices
or between members of your team.
23:58But my infrastructure only ever sees
encrypted data and that way you can
24:03still trust that app despite having
these modern properties of like
24:07sync, cloud persistence, and so on.
24:10for them, what it meant was that they
envisioned their app initially as
24:15only like a single player experience.
24:16And it already makes a lot of sense there.
24:18And they were like, okay.
24:19Later on, maybe in a year or a
bit more, we'll add like team and
24:23organization features, and that'll
probably be like a huge topic, right?
24:27But because they build it with Jazz, the
idea of users and permissions is just
24:32like baked in and literally all they
had to do to make it multiplayer was to
24:38build the UI for a little invite button.
24:40and their, their app was like
multiplayer team ready from day one
24:45while preserving all of these like
privacy and data protection guarantees.
24:50Anyways, just like a
short addition to that.
24:53I'm also really excited about Learn
Anything for exactly the reasons that
24:57you mentioned, because I didn't think
that quote unquote local-first could
25:01stretch that far and that's maybe where
I'll go into a bit of a spicy take
25:05and ask the question of like, Just
how useful as a term is local-first
25:11really, because it's really good at
describing local-first apps, right?
25:16But the abstractions that we build to make
local-first possible, or at least in my
25:21case, what I'm trying to build with Jazz,
it actually feels like something slightly
25:25more general than that, where like one
thing I like to call it is like it's
25:30distributed state, and you already see
that a little bit with apps like Succulent
25:34that has a server component, I don't know.
25:36We have a couple examples with server
components that already stretches it,
25:39but it's still just Jazz and it's, it's
distributed state, not just across end
25:44user clients, but across server workers.
25:46But again, the trust
relationships are now explicit.
25:49It's not just frontend and backend,
but all these individual things.
25:52The way it works in Jazz, by the
way, is that the server workers
25:55also have an account like a user
and you need to invite them.
25:58Two specific pieces of data for them to
be able to see it and do stuff with it.
26:03so I really liked this
idea of distributed state.
26:06And then, I also had this like coming
to Jesus moment with Jazz where
26:11I'm like, what I'm building here
is actually a distributed database.
26:17And I have to be honest with
myself that it's a database.
26:19And, I don't know how many people
that are listening or watching
26:23this are familiar with Redis.
26:25But one way I always like looking at
Redis is that it's like, it's, it's
26:29kind of like an exploded database.
26:31It doesn't give you the nice high
level relational API that, that usual
26:35databases have, but it gives you
all the little tools that you need
26:38to kind of build your own database.
26:40So you can have like your raw key
value store and then different ways
26:44to build indices or like spatial
lookup structures and stuff like that.
26:48And that's really powerful.
26:49And Jazz is kind of similar in a way.
26:51It's like, I would say it's like
an exploded distributed database
26:55with permissions built in.
26:56And once you start thinking
about it like that.
27:00There's suddenly way more use cases
where it can be a useful tool, including
27:04stuff like the, being this like real
time layer in a purely backend setting,
27:09or you could imagine using Jazz as like
a, distributing configuration for apps.
27:15So like anything that's a distributed
system where you might have network
27:19failures, nodes going offline, but you
want to have meaningfully shared state
27:25with like History and auditability.
27:27You can actually use Jazz for that.
27:28And I think even though I'm trying really
hard to envision all these different use
27:33cases and build for it, there's probably
a ton more that people will come up
27:37with, just by having something that's
so flexible without like a narrow minded
27:41use case of like, this is for local-first
apps or like, this is a database.
27:45Does that make sense?
27:47Totally.
27:47yeah.
27:48And I would love to dig in a little bit
more into the social network aspect.
27:53I think the exploded database analogy
is, is very useful and maybe that also
27:59addresses a little bit how, Jazz is
able to stretch beyond that, but can you
28:04make the, a little bit more specific?
28:06when you.
28:07Remember other people, me included,
saying that, for local-first, anything
28:11that's looks and smells like a social
network or like a global, like basically
28:17if you have a lot of strongly connected,
a vast set of strongly connected data
28:21points, this is where local-first has
a harder time to sync all of that.
28:27And it seems like that would mean you
need to sync literally everything.
28:31So you need to.
28:33Chop off certain points in the
everything is connected graph to not
28:38let the user wait forever until all
the graph data is there, but to only
28:43show the user what they actually need.
28:46So how do you work around
28:47that?
28:48Or do you need to sync everything?
28:50That's kind of like, other
than the like user identity and
28:53permissions making Jazz special.
28:55That's I think the only other
big point that makes Jazz special
28:58is that from the beginning I
kind of knew that it had to be.
29:02Super granular when it comes to
which chunks of data are you loading?
29:07And it's, it's much more, it's
basically on demand by default.
29:11And the underlying data model is
like an infinitely big graph of
29:16data that can reference each other.
29:17And you like.
29:18Load sub graphs of that as needed.
29:21And for like a very local-first or
classical app, that means, well, you
29:27kind of end up everything that one user
needs or like a small team of people
29:31needs and there it's very obvious how
that works well, I think the surprising
29:36insight is maybe that even in something
crazy like a social network, even where
29:40you have single nodes, like people who
might have a lot of followers, it's
29:44actually still quite like manageable
graphs that are quite independent.
29:50And what doesn't work is in my design
sense, you can't ask the app developer
29:57to have to come up with the boundary
of like, what is a chunk of data that
30:00makes sense to be loaded at once.
30:02I think maybe you could get away with
it for an app like Notion where like
30:06the document is an obvious boundary
to do that for, but even there it's
30:10kind of annoying and gets in the way,
particularly with sharing and so on.
30:14So I think you just have to adapt that
like a hundred percent granular mindset.
30:18And then it turns out, Even the very
highly connected graphs, they're actually
30:22manageable in size, and it is feasible
to load them to display, for example, one
30:27learning topic and Learn Anything, even
if it has thousands of links and thousands
30:32of people interacting with that topic.
30:34That's actually, in the grand scheme
of things, not that much data to sync.
30:39And on my infrastructure, which
is kind of inherently distributed.
30:42It's like, obviously geographically
distributed because that's like a nice
30:47metric to kind of chunk data up against.
30:50you can also start doing something very
similar to sharding where you basically
30:55co locate data that is often accessed
together, again, on a very granular level.
31:00And then suddenly even this like
really hot data with lots of
31:04people interacting easily fits.
31:06into a single node, even a
single core, and it's feasible to
31:09sync it to clients who all want
roughly the same stuff anyways.
31:13and if you're being honest, like databases
face exactly that problem and that the
31:18way it's solved usually is just by scaling
it,, like making your database node huge
31:24so it can fit all of the data for all
of the users and then distributing and
31:28scaling databases is a hugely complicated
topic and I think in many ways local-first
31:33is actually an answer to that in the
sense that in the most extreme case
31:37you're like well we only need to worry
about the data of one user and we'll
31:41have a system that manages the data
for one user, which is their machine.
31:47but then the abstractions you build
to make that possible, if you include
31:52the granularity, actually also let
you do everything in between where,
31:57yeah, you, you can have a couple
of nodes collaborating to sync and
32:04persist and serve like, Subgraphs
of that, like infinitely big data.
32:09Does that make sense?
32:10That makes total sense.
32:11And before we're going even deeper
here, and I think we're stretching a
32:14little bit into some like implementation
details here, et cetera, which are super
32:18interesting, but maybe we take a little
step back as a application developer
32:23who wants to build something with Jazz.
32:25Maybe you can walk us through,
what does that look like?
32:28So just to give a little bit of like
a spectrum of options, we had Matt
32:33Wonlaw on the show where we, for
example, talked about CR SQLite,
32:37where the idea was that, you replicate
a SQLite database across devices.
32:43So this is where you have already
Something that developers are
32:46very familiar with, which is a
relational database that you can
32:50just embed in the app and then query.
32:52So that's one approach.
32:53we heard from the folks working on
AutoMerge, which is a CRDT based
32:59system, so where you rather think less
about a database that's replicated.
33:04But more about individual documents,
that are being replicated and state
33:10based as you change the CRDT document,
those state changes are being propagated.
33:16and there could be also other options, for
LiveStore, for example, I'm following more
33:20of like a, what I consider a combination
of both approaches where you distribute
33:26a event log and you recompute a, in
this case, a SQLite database from it.
33:32So there's various flavors, various
trade offs, which path have you've been
33:37going down with Jazz and maybe also why.
33:41Yeah.
33:42So the meta comment there is that like,
after you think about it for a really
33:46long time, a lot of these approaches
end up actually being the same, but it
33:50really matters, I think, in terms of
contrasting different frameworks and
33:54solutions and introducing people to
the idea in the first place, from which
33:59angle you approach it and like the.
34:01It's like a replicated local database
that's relational is a very obvious one.
34:06And there's a lot of people
doing that really well now.
34:08the document one is an obvious one.
34:11I think you'll be able to
predict what, what my issue with
34:14it is that it like makes you.
34:16Put the boundaries, but
I'm basically doing that.
34:18I'm doing what AutoMerge is doing.
34:20It looks like state, and I'll say
that a bit more precisely in a second,
34:24but again, it's a bit more granular.
34:26And the way I describe it typically,
like the audience that I have in mind
34:31is actually not full stack developers
or backend developers who are very
34:35familiar with relational databases,
but in my case, frontend developers who
34:41are familiar with Local UI state on the
one hand and kind of making requests
34:45to APIs as like the only external
system they ever need to worry about.
34:49So the story I tell this Imagine
Frontend developer is that imagine
34:55if you could kind of mock up an app
just based on local, like React use
35:01state or like equivalent things,
and you build your UI around that.
35:06but then magically your app actually works
and like all of the status persistent
35:12and you can share it with other users
and, you have permissions on there and
35:18you still only wrote front end code.
35:21That's kind of the Jazz story and that's
what the API looks and feels like.
35:25So if, if you build an app with Jazz,
typically the first thing you do is.
35:30You actually do something kind of database
y, which is that you define a schema
35:33just to describe kind of what is the
shape of data, which kinds of objects
35:38are the main abstractions in my app.
35:40interestingly, you don't have to model
users at all because that's just baked in.
35:44So it's very nicely like, what
are just the concepts that are
35:48specific to your domain that
you're, addressing with your app.
35:52And once you have the schema, you can
just start having state of objects in
35:58that schema and build UI around it.
36:00And you can create objects of different
types out of your schema locally, and you
36:04can create like, groups, which is kind
of like the permission structure in Jazz
36:08and put objects in groups and then like
give users access rights to groups, all
36:15like you can do these things literally
in an on click handler of a button.
36:19And it feels kind of illegal because
of how simple it is, but that's it.
36:23That's how you build apps with Jazz and
you can get very far with just that.
36:28As apps get more
complicated, you can kind of.
36:31abstract things all kind of similarly
to how there are solutions for not
36:35letting UI state get too complex.
36:38and the other thing you might need to
start, if you want to talk to external
36:41systems like third party APIs, you
can build the server workers that I
36:46talked about a couple of times now.
36:48But the nice thing is you can build.
36:49If you also write them in
TypeScript, for example, you just
36:51share the same data schema that
you're using for the front end.
36:55And it really just feels like
one, one small addition to your
36:59otherwise purely front end code.
37:01That's, that's kind of the
Jazz experience, right?
37:04That makes a lot of sense.
37:05And I've just in parallel.
37:07going through the Jazz landing
page here, where you have, this
37:11really cool chat app and 174 lines
of code embedded here as well.
37:16We can just see exactly that,
like a little schema definition
37:20of this case for this chat app.
37:21There's just like a message.
37:23Class, a message concept
and a chat concept.
37:27and that's it.
37:27You can use it right away in your React
code, in your other code, and fire away.
37:33and you've also have here the user
concept where you see like, okay,
37:38something is owned by me and then the
chat, for example, is owned by a group.
37:44what if I want to go a little bit
more specific here and enforce
37:48certain Permission rules, that
are more specific to my app.
37:54what is the story in progression there?
37:57So the way that that works is that it
doesn't get more complicated than groups
38:03and objects belonging to the group.
38:04So like whenever you create an
object in Jazz and like, I should say
38:08the name for them, we call them co
values, like collaborative values.
38:12You have like co maps
that are kind of like.
38:14JavaScript objects, co lists that are
like collaborative arrays, basically.
38:19and just like you can represent a lot of
different kinds of data with JSON, you
38:24can represent a lot of different kinds of
collaborative data with co values, right?
38:29And each co value has
to belong to a group.
38:32The group is like the scope for
permissions, and it simply has user
38:36accounts in it with a certain role.
38:39The three roles that exist
are Reader, Writer, or Admin.
38:43They do exactly what it says on the tin.
38:45and they then influence what
people can do on co values.
38:49We can talk in detail later how
that works under the hood, because
38:52I think that's interesting as well.
38:53But for now, that's all you need to know.
38:55And that maps quite naturally on onto a
lot of stuff that you want to do in apps.
39:00But then the question is what
about more complicated situations?
39:03And the answer there
again is the granularity.
39:06Because if you wanted to every, each
co value, like imagine like a kind
39:12of tree of co values representing the
state of a more complicated document
39:17or even like a folder of documents.
39:19The way that looks like in Jazz
is that they're actually each
39:22individual CRDTs that just have
plain data as values in their fields.
39:28Or they can have references
to other co values.
39:30And that's how you build this, like,
potentially infinitely big graph,
39:33and you, like, load whatever you
need to, like, display right now,
39:36or what you want to have offline.
39:37But the nice thing is that the
groups that these co values belong
39:41to, and the permission structures,
therefore, are kind of orthogonal
39:44to the, like, data references.
39:46So you can reference a co value, That
belongs to a different group that
39:50has different members or where the
same members have different roles.
39:53And that way you can build permission
structures that are just as granular.
39:57And you can even have like something like
a notion document where like a small block
40:03might only be editable by some people.
40:05does that make sense?
40:07totally.
40:07you, you've been mentioning the reference
concept that is giving you the kind of
40:13like a relation for a key kind of concept
between different kinds of documents,
40:19and I think this is also describing the.
40:22the boundary between one thing that
needs to be synced and then another
40:27thing that needs to be synced.
40:29And if you model a thing like
a network with that, how does,
40:34Jazz, how does it know where to,
uh, how much it needs to sync?
40:39Where does it need to stop?
40:41Is there, so one analogy, for example, in
GraphQL . maybe not everyone is familiar
40:46with that, but it's like a query language
that is language agnostic and can be
40:51implemented with any sort of backend.
40:53And this is where you can also define
a schema kind of similar to this here.
40:58and aside from the schema, describes
the potential graph of queries, or
41:04set of queries in a specific query.
41:08you need to very explicitly say, those
are the things that I want to query.
41:12So let's say we model a file system from
this, where we have folders and files
41:18and folders can have folders and folders
can have folders in a GraphQL query.
41:23You need to say, actually, I want
to, you need to explicitly lay out.
41:27I want to go like all the
way to like level three.
41:30So you need to say, I want to grab
the folders and in that folders, I'm
41:34going to grab again, the folders.
41:36And I want to, there again, grab
the folders, but you can't self
41:39recursively, infinitely, traverse.
41:43Is there a similar kind of explicit
depth to how jazz should sync something.
41:50Is that determined at runtime by
a React component, for example, is
41:56there some sort of middle ground?
41:58How does that work?
41:59So there are kind of, and it's a really
good question because like, that's kind
42:03of, you need a system that solves that.
42:06If you don't have the explicit
boundary of like, this is, we can
42:10either sync all of that or nothing.
42:11Right.
42:12And the file system is a
good example because it's.
42:14It's kind of potentially infinitely deep,
but you're probably only ever looking
42:17at a subset, so how do you do that?
42:19And the way, the quick and dirty way
you do it in Jazz, which is actually
42:24really fun to just, again, super quickly
build your eyes that work, is that,
42:29Jazz tries really hard to make covalues
look like just plain JSON objects.
42:35And if you have co values with references
to each other, they look like JSON trees.
42:40So what do you do then if
like at some point you might
42:43not have a co value loaded?
42:44Well, then it just says that it's
in a TypeScript sense that field is
42:48either the reference thing or null.
42:51And,, if you try and render a
specific tree in a React component,
42:55you can basically just use optional
chaining to like render like this far.
43:00And if it's not loaded, show like
a little spinner or something.
43:03But the funny thing then is that Jazz
notices what you are trying to access.
43:09And it's like, Oh, you're trying
to render like three levels deep.
43:12And you try to access this thing that
we don't have yet in the background
43:16triggers a sync of the needed co value.
43:19And once that's available locally,
it re renders your component.
43:22And now that's not null anymore,
but you actually have the JSON state
43:26for that co value and you render it.
43:28So very naturally by like building
your UI and just deciding to render.
43:34What do you want to render it will
lazily load exactly what's needed.
43:38And you can even manually do
pagination like that by just having
43:41a little stateful, like, oh, I want
to render 10 items and then you only
43:45drill down into the first 10 items.
43:47And then like you hit a button or you
reach the end of a scroll list or like.
43:51Elements become visible on the
screen and you just ask Jazz to
43:54access more of them, even if they're
right now, not, not available.
43:58And in the background, it will load more.
44:00That's the quick and dirty way.
44:01Super nice for prototyping stuff.
44:03It's a bit weird in terms of user
experience, because you end up with a lot
44:08of spinners and they like, they resolve
really quickly because Jazz is fast,
44:12but it still looks unfamiliar to people.
44:15So if you want to give people a more
polished experience of maybe one Loading
44:21thing until a bunch of status available.
44:24That makes sense as a unit.
44:26There is a way of specifically
specifying a loading depth and that's.
44:32That kind of looks like GraphQL lite,
but because you only need to specify
44:38fields that are references, you don't
need to say which plain data fields
44:41you need because they're always loaded.
44:43yeah, you, you, it's, it's
actually very similar to Prisma.
44:46You just say which references you
want resolved and then the Jazz hooks.
44:51Won't give you anything until
all of that is loaded and then
44:54they give it to you as a chunk.
44:56That makes a lot of sense.
44:57So you're basically just specifying
sort of the graph of the references,
45:02not the individual fields of a document,
since you typically want a document
45:06as a whole, that makes a lot of sense.
45:08And that's also, as I'm thinking through
how I would model something for Overtone.
45:13when I have a music app and I want
to listen to music, if I'm currently
45:17ermbarking on a train journey or
on a like traveling somewhere where
45:22I don't have perfect connectivity.
45:25I want to like that lazy loading just
in time as I like click on a playlist.
45:32if I don't have connectivity, then
at that point, it kind of breaks a
45:36bit of like that local-first promise.
45:38but I also understand like,
let's say, Spotify is thinking
45:42about building it in that way.
45:44Spotify can't just sync the entire catalog
of like all of Spotify on a single device.
45:50So there needs to be
like some cutoff point.
45:53And I think while prototyping doing the
just in time lazy loading, that's great.
45:58But then as an app developer, in
this case, for example, me building
46:02Overtone, as I better know, okay.
46:04I want you to find some rules of
like, that stuff should always
46:08be there, like prepared for me
going on a, on a train journey.
46:12And that would probably in this case be.
46:14For all of my playlists, make sure
like all of like the tracks for the
46:18individual playlists are at least
the metadata is there and possibly
46:22then have like also some rules
for pre downloading some tracks.
46:25If I have the rights to do so.
46:28that makes a lot of sense.
46:29And that seems like Jazz provides a really
nice trade off of making, providing a
46:35easy way right away to prototype and
then, dial it in to match the user
46:41experience that you want to provide.
46:43And I guess I met the comment here
with like, because you actually just
46:46now asked a very precise, interesting
question, which is like, well, what
46:50if you ask it to load a chunk of data
and not give it to you until all of
46:54it is there, but then your connection
drops, what should actually happen?
46:59And like nothing being
loaded, then it's actually a.
47:02Like you said, an outcome that
violates local-first a bit.
47:04So there, then we need to be more
refined and be like, well, maybe show
47:09a spinner for everything for like two
seconds and then give up and just show
47:13me everything that was actually loaded.
47:15and what we're getting to there is
that I think like, look, I think
47:19it's starting to become clear how
local-first in general is this cool
47:25new way of building app and how Jazz in
particular things really deeply, how to
47:29make that easy for you as a developer.
47:31But most of the challenges with
local-first and with multiplayer, by the
47:35way, I think are UX challenges where we're
like, well, what, what should happen?
47:40And that's something that we
figure out as we try to build
47:43and dog food, our own apps.
47:45As we see what, our first adopters
build with it and what makes sense
47:51to their particular developers and
how you want to expose all of these
47:54different, like, is it loading?
47:55Is it locally available?
47:57Is it locally available?
47:58But it's like, not quite up to date with
what we know the syncing server has, but
48:03we didn't have a chance to get that yet.
48:05And there's like so much
complexity in there.
48:07And in different situations, you need
to expose like more or less of that.
48:11So I think beyond just like.
48:14Making the sync and making the data
persistence and making the permissions
48:18work, which like we're pretty good
with now, there'll be a lot of like
48:22API design and also like educating
developers and just figuring out UX
48:27together, like as a field, I think.
48:30I definitely agree.
48:31And like just the scenarios that
we've now went through over the
48:34last couple of minutes, I think
already go surprisingly deep.
48:38For example, like the partial, like if you
want to load everything and then you say,
48:42okay, I don't have everything, in some
cases, it's fine to show a partial set.
48:47In some other cases, it might be like
really nerve wracking for a user where if
48:53you don't signal like, Hey, we've just,
we, we can't say this is everything.
48:57We've just fetched so much since
otherwise a user might assume, Oh my gosh.
49:00Like this app has like
lost some of my data.
49:03and so this might, in some cases
might be better to not show anything
49:07and like explicitly let the user
know, like, Hey, we're sorry.
49:12when you come online again, we'll do
our best to get everything in here.
49:15sometimes you also like from the data
you fetch, maybe you want to like,
49:19let's say you, you shouldn't build a
bank account this way, but let's say
49:22you build a bank account and you've
just fetched a bit of like your,
49:26your like transactional history.
49:28And it misses your latest, like,
big check that you cashed in.
49:35Basically you added money to your
bank account and it's not in there.
49:38And you think, Oh my gosh, like my bank
account is like lost all of that money.
49:42Obviously you won't build an app like
that, but I think the analogy kind of
49:47like translates where you derive data
from other data and where it could be
49:52like really bad, you missed something.
49:53So this is really interesting to dig
into the user experience aspects.
49:58And that might also make for a really
interesting future conversation,
50:02but I want to, Dig a little bit more
into, into another related topic,
50:07which is the localfirst.fm podcast.
50:10And what brings all of us together
is that we think we can do better
50:14how we build apps, at least in many
app use cases, and Jazz shows for
50:18how many app use cases that applies.
50:21And so that means We, as a whole,
as an ecosystem, we need to convince
50:26the people who are not yet in
that small but growing ecosystem.
50:30We need to convince them that we
have a very interesting way how to
50:34build apps better, that are simpler
to build, better for end users, etc.
50:39And I think each technology has their
own specific, benefits, how that's, is
50:45a, is a good fit for, for certain app
use cases and particular developer types.
50:50Like you want to target more
like the front end developers.
50:53what is your approach to
talking to developers?
50:57How do you want to market Jazz to
reach the right people and sort of the,
51:01I think you have a very interesting
take on sort of developer psychology.
51:06Yeah, yeah, totally.
51:08Because I think like, look, we're
all facing the same challenge.
51:11Like you said of like, we understand how
this is better and how it can benefit
51:16a lot of different kinds of apps.
51:19but counterintuitively it's, I don't think
it's really about selling the benefits.
51:23I think the one big benefit
that really does make sense.
51:26And it's valuable to people as just
saying, look, like you've got like
51:30a 10 X better developer experience.
51:33It's way faster to build apps.
51:34It's way easier to reason about.
51:36There's way fewer moving parts.
51:38I think that's kind of universal
across all the different solutions.
51:42different solutions differ in
terms of like what traditional
51:45parts of the stack they replace.
51:47I've put myself in the shoe of like
replacing a lot of the pieces because I
51:53do auth and permissions, and by the way,
you can also store binary data in Jazz.
51:58So suddenly you don't need blob storage
anymore and binary data just becomes
52:02part of the data you have locally and can
be referenced just like JSON like data.
52:07and it's so easy to just think about
what are the obvious advantages of that
52:11if you are totally bought into this
and ready to build your app like that.
52:15That's kind of the easy
part, right, to make.
52:17to explain that.
52:19But the biggest question is
like, why should you even bother?
52:23And why should you give up this really
proven, familiar way of building apps?
52:28that means the biggest challenge is that
it's so new and alien and different.
52:34So I think the trick has to be
How can we make it look familiar
52:39and how can we make it look like
something that already exists?
52:43And that's, I think where exactly the
different audiences or, ways of telling
52:47that story for different products come in
because, saying that you're replicating
52:53a relational database into the client.
52:56That's taking something very familiar
to like backend developers and then
53:00doing one little step away from that.
53:02And then like, Oh, and then
it has all these benefits.
53:04Right.
53:05I feel like, yeah, I've made it hard
for myself because I'm basically
53:08trying to replace the whole stack.
53:11And that's a story that actually,
again, it works really well for
53:15frontend developers because the
whole stack was never part of like
53:19where they had agency to begin with.
53:22So they're happy.
53:23Full stack developers and especially
backend developers aren't so
53:26happy because you're like.
53:28You don't have to do all
of that stuff anymore.
53:30It's replaced by this giant pile of magic.
53:33I think like, I mean, what we
identify as developers is being
53:38clever and building stuff ourselves.
53:40Right.
53:41And I think a big part of what keeps
really complicated stacks and ways
53:46of doing things in life is honestly
just the IKEA effect of like.
53:50Well, but I built this myself and I like,
I picked things that are individually
53:54good at what they're doing, but I put
them together in this really clever
53:58way and local-first is like, it's just,
it's so powerful that it takes away
54:04so much of that doing stuff yourself.
54:07That it's a real danger in
terms of adoption and like not
54:09bruising people's egos secretly.
54:12so one attempt I had was like, well,
can I kind of not make Jazz one giant
54:18package, but more smaller ones so
people can glue stuff together again.
54:22And I think that's kind of counter to like
what makes Jazz powerful, which is exactly
54:27that it is a vertically integrated thing
where even the different parts of like.
54:32CRDT, stage sharing, and user
identity and permissions.
54:36They are actually very
tightly knit together.
54:38And that's why, yeah, that's
what makes Jazz special, I think.
54:41But, the other way out of that, I think,
and this is something I just have to
54:45do way more, is to have really good,
like, under the hood documentation.
54:50And the cool thing is, like, I think
CRDTs kind of get thrown around
54:54as this like mysterious new thing
that magically solves everything,
54:58but like, it's really complicated.
55:00Don't worry about it.
55:00Like, you can read about it in some
research papers if you really wanted
55:04to, but I think the way I've implemented
CRDTs in Jazz is actually very.
55:09Very straightforward, in the sense that it
really follows a particular viewpoint of
55:14CRDTs, which I think is best represented
by a blog post called, like, Data Laced
55:20with History, I think it's called.
55:22And it's basically just this, the simple
idea of like, look, you just keep all
55:26of the edit history on an object around
and that's what the object actually is.
55:30And then the current state is
just a view over that history.
55:33And if everyone has all of the edit
operations and the full histories
55:36of different people collaborating
on a document, then you eventually
55:40get the same state and that's it.
55:41and like, just as simply in like
five or 10 more minutes, I could
55:45describe to you how then Jazz
adds cryptography to do the like.
55:49Read and write access control,
but it's actually not that hard.
55:52And I think having really neat diagrams
and kind of like a medium level
55:57explanation that people can read through
in like 15 minutes and feel like, okay,
56:01these are the parts that are inside Jazz.
56:04And now I know like, if I wanted to glue
stuff myself together, what I could glue
56:09together or which systems I would need.
56:11But I won't bother.
56:13It's enough for me to know.
56:14What's going on and that in itself
already makes me feel kind of clever.
56:18And then just going like extra deep
on all the details for the people
56:22who want to be really, really clever.
56:23I think that's going to be important.
56:25and probably each framework has
their own equivalent of doing that.
56:29And like, it's not necessary
to use it at all, right?
56:32That the APIs that you use, if you
build Jazz are much higher level
56:35and are much more in terms of like
abstractions that an app needs, but.
56:39Yeah, I, I think DevTools, the
biggest challenge is that you are
56:44selling to developers, so you need
to speak to developers egos, right?
56:48Right.
56:48And I love the way how you framed that
in the Ikea effect and how you, yeah,
56:54it's, it's like this delicate balance you
want to, like, I think we can all get on
56:58the same page that we want to collapse
as much complexity as much as possible,
57:05But developers still like love the
abstractions, love putting things together
57:10and, like figuring out the delicate
balance of having something that's already
57:15somewhat put together and does what they
need, but then you can decompose it and
57:19like compose it again in a different way.
57:22I think that's sort of like where
the, where you need to apply like
57:26a little bit of like special sauce.
57:28and I think this is what you've already,
laid out very, very nicely with Jazz, with
57:32like the APIs look amazing and the apps
that are being built on top of it already.
57:38I think a really, really
good proof for that.
57:41So slightly switching gears.
57:43Jazz is no longer just a technology,
but behind Garden Computing, you've
57:48also, I think you've thought about that
for a longer time and recently took the
57:53step to actually, Turn Garden Computing
into an actual company and build out a
57:59commercial offering around Jazz as well.
58:02and I think you've recently, took
on a initial round of pre seed
58:07funding, so congrats on that.
58:09but I'd love to hear a little bit more
about what that means for Jazz as a
58:13technology, what your thoughts are on
possibly offering a commercial product,
58:18sustaining the company otherwise around
that, and how you're thinking of like
58:23Going beyond just working on this
yourself, but possibly, scaling out the
58:28company or like hiring other people.
58:30So very curious to hear
your thinking on that.
58:33Yeah.
58:33So I think again, going into it
from like, how did it come to be?
58:37I think it's important to say that, like,
I'm not someone who's like trying to do a
58:42startup for the sake of doing a startup.
58:45I was very much like thinking of it
as like an open source framework and
58:48was building that as like a good tool.
58:51And in a similar way where like the fact
that it is a framework kind of became
58:54apparent to me while I was building it.
58:57it became apparent to me that like,
okay, even if you have all of these
59:00abstractions for distributed state
and local-first, and that's all
59:05like, it feels very peer to peer.
59:06And I think in our legacy, we have
a lot of peer to peer thinking.
59:10and that obviously influenced me,
but I had this moment where I'm
59:13like, okay, if I really think about
what I as a user want from the app,
59:16for example, very pragmatically.
59:19I want sync between devices
that works even if the devices
59:23aren't online at the same time.
59:25So I need some kind of centralized
syncing infrastructure that
59:28also does persistence for me.
59:31Right.
59:31so that very obviously became a part of
Jazz and then I'm like, it's actually
59:36kind of hard to run that at scale and
to run it well and have it have low
59:39latency and so on, and that's something
that a company could do as a service.
59:46Right?, and it being open source, of
course, you can also self host your
59:50own version of that either on a single
node for like a small app, or you can
59:53be brave and try and scale it yourself.
59:56That's totally doable, but
there's just obvious value in
59:59someone doing that for you.
1:00:01And the interesting extra
component there is that.
1:00:04Because of the encryption, you
actually don't have to trust that
1:00:07infrastructure with your data.
1:00:09You can just use it for syncing and
persistence, but know that it will
1:00:12never see your data, your user's
data, whatever you care about.
1:00:16so there's this kind of like
really useful service or product.
1:00:21presented itself to me and I'm like, okay,
this doesn't just feel like it wants to
1:00:26be a framework for people to really have
that local-first development experience
1:00:31where you only want to have to worry
about the parts that actually make your
1:00:34app, your app, and now you don't have
to solve state syncing and permissions
1:00:40yourself anymore, but you would still
have to build syncing infrastructure.
1:00:44That seems kind of weird.
1:00:45Like.
1:00:45I think what you want as an
application developer is to use a
1:00:48service for that, because then you're
actually only left with your app.
1:00:51That's what I would want anyways.
1:00:53So like, okay, this is starting to feel
like a company and I think I'm in a
1:00:57good position to build that company.
1:01:00and then it became a question of
like, okay, I, for a long time,
1:01:04my plan was to bootstrap it.
1:01:06and I did try to go into YC and raise VC
funding, but I think we, as if Field are
1:01:13so early that it's, it's really hard for
outsiders to see the potential in that.
1:01:19and what it took for me to have
any success with that was to get
1:01:23Jazz to a state where it became
obviously useful to developers.
1:01:27And they could start telling these
like first success stories of like,
1:01:31wow, we actually built the SAP way
quicker than we would have otherwise.
1:01:36And then to do that in like a public
setting, like the local-first conference
1:01:40in Berlin, where then investors
can see that and be like, Oh, this
1:01:44actually really speaks to developers.
1:01:46And that's like, That's like an
early signal they understand, right?
1:01:49So that's, that's what allowed
me to raise that round.
1:01:53And now I'm in the, in the very
fortunate position to have investors
1:01:57who understand how early we are and
how much work it's going to take to
1:02:01really bring this into the mainstream.
1:02:03And starting to have the person power
through like hiring my first couple
1:02:07of employees who I'm really happy with
and who, who really get it as well.
1:02:11And they're building their
own apps with it as well.
1:02:13where I'm like, okay, we can actually
speed run, the features that we
1:02:18need to reach parity with what
traditional stacks can offer you,
1:02:22in the way that I think we need.
1:02:23That's, that's kind of the switch
that happened there for me.
1:02:27And before I had all of these ideas
in my head of what I kind of knew
1:02:31Jazz needed to do, and believe
me, I thought about everything.
1:02:35It's all somewhere on the roadmap,
but I didn't really know what
1:02:38was most important, right?
1:02:39But the nice thing about having early
adopters is that just becomes super
1:02:43obvious because they'll be like, They'll
be blocked because Jazz doesn't have
1:02:47like this and we just built that next.
1:02:49And that's kind of the journey that,
that I've been on actually, since before
1:02:52the investment for about a year now.
1:02:54and now I have the luxury of being able to
like tackle a couple of these at a time.
1:03:00that's kind of where I'm at with it.
1:03:02And the goal is to really.
1:03:04To build a service that makes sense
both for individual developers, for
1:03:08whom it will be the first point of
contact with local-first or distributed
1:03:12state, for small companies to build,
successful apps super quickly and
1:03:17kind of like being able to reach a
much wider economy of small companies
1:03:22and individual developers who can now
meaningfully build real things that
1:03:26are useful to people and maybe because.
1:03:29It's so much easier to build things.
1:03:30You can now build products
that target smaller niches.
1:03:34And that's really interesting.
1:03:35And also to just give a tool for like
bigger companies or even enterprises to
1:03:40be like, Oh, it's actually really hard
for us to build high fidelity apps.
1:03:46Figma like notion.
1:03:47We want these because we have lots of
people and lots of teams that interact,
1:03:50but we don't have the know how to
build something like a sync engine.
1:03:54That's just way too complex
for a company to do itself.
1:03:57But if that's now an off the shelf
abstraction and there's kind of like an
1:04:01obvious either third party service or
something that you can deploy on premises.
1:04:06That's really powerful and interesting
and I think enables a lot more
1:04:09bigger companies to build their
own software as well and have it
1:04:12immediately be as good as the best,
like, SaaS apps we have right now.
1:04:17That's, that's kind of the potential
I see in it and what I'm trying to
1:04:20address in the, in the medium term.
1:04:22I like that a lot.
1:04:23And that also makes me think about, like
the, this concept called small giants.
1:04:29I think it was also, I think I first
learned about it on the Metamuse podcast
1:04:33by, that Adam Wiggins did in the past.
1:04:36Hopefully it comes back at some point.
1:04:38but this is where they did one episode
about the idea of small giants.
1:04:42And this is basically that a very small
team, possibly could be like just,
1:04:48an individual small team, et cetera
and they can build products, reach a
1:04:53really wide audience without having
to build up all of that load and to.
1:04:59Like, for example, WhatsApp was
when I think it was acquired before
1:05:04billions of dollars by, by Facebook,
was still a very, very small company.
1:05:09I think, they've been, I don't get
the numbers exactly right, right
1:05:13now, but like, I think within 10
to 50 people where they've already.
1:05:18Reach like billions of users.
1:05:21I think similar for Telegram, well,
Telegram is a little bit in the
1:05:24news right now, but, I have a lot of
admiration at least for like how they
1:05:28built the product in terms of the craft,
et cetera and it's also similar there.
1:05:33There's a very small team that can
still reach a very wide audience.
1:05:38And I think this is what local-first can
really empower, where you can empower
1:05:44a lot more small giants to serve a
much more richer, diverse set of use
1:05:50cases, where a bunch of current existing
products could be replaced by local-first
1:05:56products, but not just by one local-first
product, but a hundred different kinds
1:06:02of people who have specific use cases.
1:06:04There are a hundred different small giant.
1:06:07Build products specifically for
their use case, for their niches.
1:06:10so instead of like having, 10 very,
very large monopolies, like, dominating
1:06:16a particular segment, let's rather
have like a thousand individual
1:06:20builders reach smaller slivers and have
products that fit particular use cases.
1:06:28And I think this is where
you can empower them.
1:06:30They can focus.
1:06:31Similar to Invoice Radar,
focus on specific use case and
1:06:36then, use a syncing service.
1:06:38So that makes a lot of sense.
1:06:39And I'm looking forward to that future.
1:06:42before we close out, I'm interested in
hearing your perspective on the more,
1:06:48the bigger web ecosystem as a whole,
as you've been building apps within the
1:06:52web space for a long time, now you're
contributing a, better development suite
1:06:57to that, but I'm curious whether you
have any sort of strong opinions on the
1:07:02web development world that we live in.
1:07:04I think my strong opinion on it is that
I kind of don't have one, or like there's
1:07:09a lot of critical voices that complain
about all kinds of things about the web
1:07:15and its state that are completely fair.
1:07:17Right.
1:07:18But I think what kind of gets lost within
that is that the web is actually fine.
1:07:23And it's not only fine.
1:07:24It's, it's like, it's amazing.
1:07:26It's like, I think first
and foremost, it's this like
1:07:29crazy distribution mechanism.
1:07:32and, I think, you talked about this in a
previous episode, that like, you can just
1:07:37send your grandma a link and she'll know.
1:07:40What to do with it.
1:07:40Right.
1:07:41and it will, she'll
see what, what you see.
1:07:44and that's crazy.
1:07:45That's something that is just
so at the core of the web.
1:07:48And, sure.
1:07:48It's kind of weird that like
JavaScript got tacked onto like a
1:07:52document representation and so on,
but it is a really powerful VM.
1:07:59That is super dynamic, would make
anyone who likes Lisp or Smalltalk
1:08:05proud if you really think about it.
1:08:07But it's like, everyone has it.
1:08:09The best minds of our generation
optimized it to the death.
1:08:15And you just get all like, CSS is
crazy, but you can do a lot with it.
1:08:21and you just get all of that.
1:08:22And.
1:08:23It's kind of not doing what
it was originally meant to do.
1:08:26It's kind of like an app distribution
system now, but because it's so
1:08:32flexible and so malleable, I think
my big point is actually that we can
1:08:36just make it do whatever we want.
1:08:38for example, when I think about Jazz and
what Jazz does, the way Jazz works is, is
1:08:43it's actually like a high level framework
and then like a protocol underneath it.
1:08:48And it's a very minimal, simple core
that does like, the implementation of
1:08:53the CRDTs and like how to sync them, how
to persist them and the cryptography,
1:08:57like how do the permissions work?
1:08:59That's all like defined.
1:09:00And then like you get higher
level features on top.
1:09:03And if you look at that, it's kind
of like a new networking protocol.
1:09:06And in many ways, it's like what I think
the web should have been like just taking
1:09:11seriously that we're building like this.
1:09:13Network of distributed nodes that have
partial state and being able to represent
1:09:18user identity and permissions across that.
1:09:20so like one kind of pessimistic take
would be that like, Oh yeah, that's
1:09:24obviously better, but we'll never get
there because we're stuck with the web and
1:09:28this like centralized client server model.
1:09:31And that's like at odds, but
like, it's not at odds at all.
1:09:34We've got web sockets
and we can just build.
1:09:37The protocol on top of client side
JavaScript and server side JavaScript
1:09:42and hopefully soon other server
side programming languages and
1:09:45native apps and, communicate over
the web socket or maybe soon web
1:09:49transport or like HTTP 3 or whatever.
1:09:52It's like you can actually do a lot
of crazy stuff with the web and, we
1:09:57can just like, yeah, just embrace the
fact that In the history of computing,
1:10:02we almost never replace things.
1:10:04We just add archeological layers of
like, we're building the thing that we
1:10:08really want, but we have to build it in
terms of what's already there and like
1:10:11widely available and it's actually fine.
1:10:15And that's, that's.
1:10:16How like you kind of have the
psychological aspect that we talked
1:10:20about earlier, where like this crazy
new thing has to look and sound
1:10:24familiar, but also very pragmatically
it has to be implemented based on
1:10:29things that already exist where you
don't have to really replace anything.
1:10:33That's, that's kind of my
take on the web, right?
1:10:35Right.
1:10:36I love that.
1:10:36I did this year, I did a three
week journey through some of the
1:10:42national parks of the United States.
1:10:45And we also, spent a couple of days at
the Grand Canyon where we just See like
1:10:50those like massive, massive, like layers
of layers on top of layers that just reach
1:10:56back, I think like millions of years.
1:10:58I don't recall the exact facts anymore,
but I think it's a very good observation
1:11:03that, we rarely replace something
categorically, but we just build on top.
1:11:08Maybe we phase one thing out, but
that takes like, decades often.
1:11:13And, it's kind of a miracle how capable
the web has gotten, given how weird
1:11:21it is and how many words it has.
1:11:23So I think I like that observation a lot.
1:11:26And, yeah, given the, given often the web
for me is like a love hate relationship,
1:11:31I think the love still dominates there.
1:11:33So, uh, Anselm, this has been
a really great conversation.
1:11:37I've learned a lot about Jazz.
1:11:38I've been very inspired by the way, how
you think about the entire space overall.
1:11:44So maybe you want to have a, you
have a last chance to plug anything,
1:11:48give any shout outs, but other than
that, I'll thank you for your time.
1:11:53Yeah, I mean, thank you.
1:11:54I really enjoyed this
conversation as well.
1:11:56Definitely shout outs to Ink and Switch
because they are my biggest inspiration
1:12:01and what kind of, what gave me a
lot of the ideas in the first place.
1:12:04In terms of plugging stuff, again, coming
back to psychology, like I can tell
1:12:09developers about all the advantages of
Jazz and so on, but like, So far, what
1:12:14has worked best in getting them to adopt
it for even like a small experiment or
1:12:18even getting them to start doing the
guide and the official docs is just
1:12:22being like, look, I've got these like
shiny holographic stickers for Jazz.
1:12:27And like, I've got
boring stickers as well.
1:12:30And like, everyone can
get them at meetups.
1:12:32I put them on tables and stuff, but like,
if you want one of the special shiny ones,
1:12:36you have to build something with Jazz.
1:12:37And like, if you just do the official
guide that counts as doing something with
1:12:41Jazz Just show me like wherever you are
in the world, either we meet in person
1:12:45somewhere or I'll mail it to you, but
you, you get the special shiny sticker.
1:12:49Okay.
1:12:49That's the deal.
1:12:51All right.
1:12:51There's, there's a first on the podcast.
1:12:53There weren't any
holographic stickers yet.
1:12:56So I might just as well
give this a try afterwards.
1:13:00And the next time we see each
other, I might steal one of those.
1:13:04But thank you so much.
1:13:06Thank you so much.
1:13:07I really enjoy myself.
1:13:08Thanks for having me, Johannes.
1:13:10Thank you for listening to
the Local First FM podcast.
1:13:13If you've enjoyed this episode and
haven't done so already, please
1:13:16subscribe and leave a review.
1:13:18Please also share this episode
with your friends and colleagues.
1:13:21Spreading the word about this
podcast is a great way to support
1:13:24it and help me keep it going.
1:13:26A special thanks again to Rosicorp and
PowerSync for supporting this podcast.
1:13:31I'll see you next time