localfirst.fm
All episodes
March 26, 2024

#6 – Rasmus Andersson: Playbit, Software Quality, Data Models Tradeoffs

#6 – Rasmus Andersson: Playbit, Software Quality, Data Models Tradeoffs
Sponsored byExpoCrabNebula
Show notes

Transcript

0:00:00 Intro
0:00:00 And so it's because it's local-first, we can synchronize
0:00:02 it across all the hardware, right?
0:00:03 And we can back it up on a central computer somewhere.
0:00:06 And that means if you lose your laptop you go and buy a new
0:00:08 laptop and you sign into Playbit.
0:00:10 Everything is back there.
0:00:12 Like the window position, text selection.
0:00:14 And that also means that you can have many of these computers.
0:00:16 And so we have this concept of workspaces, they're basically virtual machines.
0:00:20 And one of these computers you can share with your friends or with other people.
0:00:23 Yeah.
0:00:24 And then you have essentially Figma multiplayer, but like on the
0:00:26 operating system level and these facilities like this data syncing is
0:00:30 available , as a first party API, like for application developers.
0:00:34 Welcome to the local-first FM podcast.
0:00:37 I'm your host, Johannes Schickling, and I'm a web developer, a
0:00:39 startup founder, and love the craft of software engineering.
0:00:43 For the past few years, I've been on a journey to build a modern, high quality
0:00:47 music app using web technologies.
0:00:49 And in doing so, I've been falling down the rabbit hole of local-first software.
0:00:53 This podcast is your invitation to join me in the journey.
0:00:57 In this episode, I'm speaking to Rasmus Andersen, who helped to build
0:01:00 many monumental products, such as Spotify, Dropbox, and Figma, and is
0:01:05 now working on Playbit, a local-first operating system built from scratch.
0:01:10 In this extended conversation, we go deep on software quality, the trade offs of
0:01:14 different data models, and the importance of the web for modern applications.
0:01:18 Before getting started, also a big thank you to Expo and Crab
0:01:22 Nebula for supporting this podcast.
0:01:24 And now my interview with Rasmus.
0:01:27 Hey Rasmus, so nice to have you on the show.
0:01:29 How are you doing?
0:01:31 Hey Johannes, good to be here.
0:01:32 I'm doing well.
0:01:33 How are you doing yourself?
0:01:35 I'm doing great.
0:01:36 I couldn't be more excited to have you on the show.
0:01:38 I'm like a huge fan of so many products that you've worked on in the past.
0:01:43 So really delighted to have you on the show.
0:01:46 But for folks who don't know you, uh, could you give a quick
0:01:49 background on what led you to today?
0:01:53 Sure.
0:01:54 Oh, God.
0:01:54 What led me to today?
0:01:55 It's almost like we should go backwards.
0:01:57 I think I've found myself through various ways working on local-first
0:02:01 software for quite a while.
0:02:03 And we didn't really have vocabulary for it until pretty recently.
0:02:07 And so in the last couple of years, as you know, yourself,
0:02:11 and Ink & Switch, you know, uh.
0:02:13 Adam and Muse and so on.
0:02:15 There's, there's like a whole group of people who have sort of like
0:02:18 started questioning, you know, like, is this way we're building things?
0:02:21 Is this, this is sound, this is like healthy?
0:02:23 And sort of the idea of local-first kind of grow out is to become
0:02:27 more of a vocabulary as well as sort of like the sort of handmade
0:02:30 movement and stuff like that.
0:02:32 I've started realizing that these were values that I've had for a
0:02:35 long time, but I wasn't aware of.
0:02:37 I started programming when I was a kid and I had my first job as a designer at
0:02:43 an automotive company when I was like 15.
0:02:45 I think it was something like that.
0:02:47 I started my own company when I was 17, maybe something,
0:02:52 perhaps something like that.
0:02:53 So, you know, very early in my life, I started working and I,
0:02:56 you know, I skipped video games and I got gotten into those later.
0:03:00 Don't worry.
0:03:00 Um, but yeah.
0:03:01 But yeah, so, uh, here I am, you know, a couple, a couple of years later.
0:03:07 That's awesome.
0:03:08 Well, you're, you're very, uh, humbly skipping a whole bunch
0:03:11 of really monumental chapters where you've like helped to start
0:03:15 Spotify as a first designer there.
0:03:18 And like, built a lot of the foundation there and later also worked at
0:03:21 the Figma and Facebook, et cetera.
0:03:24 So I'm really curious to learn more about those chapters.
0:03:27 As you've already mentioned, I think you've already been on a path
0:03:30 to build local-first software way before the local-first essay was
0:03:35 out there, but you still arrived at many, uh, Um, similar conclusions.
0:03:39 So maybe starting with Spotify, as there is also this really interesting
0:03:43 parallel to me working on Overtone, not trying to suggest I'm anywhere
0:03:49 close to your level of polish with your work, but I'm certainly trying to
0:03:55 follow a bit in the, in your footsteps.
0:03:57 So I'm curious.
0:03:59 How you've thought about building Spotify back in the days and how
0:04:02 you've arrived eventually on sort of like local-first ish paths.
0:04:07 Spotify
0:04:07 That's a great question.
0:04:08 And before answering that, I got to say, I think what you've got so far with
0:04:12 Overtone is like better, higher quality than what Spotify is today, but anyhow,
0:04:19 that's a slightly different conversation.
0:04:21 I don't think you should sort of like undersell what you've created yourself.
0:04:25 I appreciate it.
0:04:26 Spotify came about in a time when the technological constraints pretty
0:04:32 much forced us to a decentralized sort of local-first model.
0:04:36 And so Spotify started in 2006.
0:04:39 This is when we started working on it.
0:04:41 The web platform.
0:04:42 And I think that what is, what has been in historically and still is today amazing
0:04:46 about the web platform is distribution.
0:04:48 And so, you know, that wasn't lost on us at that point either, but it was just
0:04:52 like, none of the technology was really there to support something like Spotify.
0:04:56 And so, you know, we built a, it's like a fully native thing.
0:04:59 You know, we built a native Windows app, a native like Mac app, Android apps.
0:05:04 There's a long list of native apps that we built.
0:05:07 You know, we had a NAT hole punching traversal stuff, things
0:05:13 way above my head of, you know, like getting through firewalls to
0:05:17 implement our peer to peer system.
0:05:18 And there was like, you know, this parity stream model where you can get
0:05:22 Like different pieces of data to fill your cache was very, very complicated.
0:05:26 Right.
0:05:27 I would say that 90 percent of the complexity of, of the Spotify client and
0:05:32 even the server side was due to the fact that it was local-first and that evolved
0:05:38 over a long time and there's, there were many revisions, like kind of major
0:05:41 revisions to the way, uh, they implement and solve these problems at Spotify.
0:05:47 That's awesome.
0:05:47 Yeah.
0:05:48 And I think there.
0:05:49 Since then it's slowly but surely degraded a little bit from its
0:05:53 local-first origins and slowly, but surely also being visible in the app,
0:05:58 becoming a bit slower, et cetera.
0:06:00 But I guess that's the price you have to pay as the company grows larger.
0:06:06 But so after Spotify, you worked at Facebook and also at Figma.
0:06:11 And I think there you've worked on some aspects of the products that where you've
0:06:16 also arrived on some similar data models and data paths if you look at it from
0:06:21 a certain angle, look like local-first.
0:06:26 Facebook, Dropbox & Figma
0:06:26 Yeah, sure.
0:06:27 When I was at Facebook, I led this like OS project that they had.
0:06:30 And we never shipped it, but you know, that's kind of in line with
0:06:33 right now I'm working on an OS, so that's kind of interesting.
0:06:36 And that, you know, after a year of that, it kind of ended up not
0:06:40 leading to where we wanted it to be.
0:06:42 And I worked on Facebook messenger, which it was in a
0:06:45 company that had been acquired, not long before I worked on this.
0:06:48 And this is like, I think early 2012, something like that.
0:06:52 And the team that they came with sort of the acquisition of the product that, you
0:06:56 know, later on underpin Facebook chat, but these were like two things technically
0:07:00 for a while was kind of local-first.
0:07:02 And I think it had to be for similar reasons that an email
0:07:05 client has to be local-first.
0:07:07 And so it was iOS technically very limited platform at the time.
0:07:10 That was kind of interesting to see.
0:07:12 Did I have to work?
0:07:13 Upwork and GraphQL together with, uh, Lee Byron, Nick Schrock, Dan Schaefer.
0:07:18 And that was really interesting.
0:07:20 So, you know, I started out like a year of, as a designer at Facebook, and then
0:07:24 about a year as a software engineer.
0:07:26 And after that, I worked at Dropbox actually for a while and worked on their
0:07:29 like data store thing, which is kind of local-first thing with like automatic
0:07:32 merge and, and, and diffing and stuff and some other projects as, as well.
0:07:37 Yeah.
0:07:37 And, and Figma of course, like fun foundationally is almost
0:07:41 a CRDT kind of data model.
0:07:44 Um, although it is a hybrid centralized, decentralized type of product.
0:07:49 So all of those products, uh, I think all super well known.
0:07:53 Most of those products, I would not describe them as like, Oh,
0:07:56 they're of course, local-first.
0:07:57 I think now that you highlight it, I can certainly see certain aspects of them
0:08:02 following some of those principles of local-first, but I'm curious in your
0:08:11 Why all those projects where local-first?
0:08:11 It's.
0:08:11 Oh, that's an interesting question.
0:08:13 Obviously, like if you disconnect from the internet, they keep working, right?
0:08:18 That's the basic litmus test of local-first, right?
0:08:20 If I can send with Facebook messenger, for example, which is still
0:08:23 around, which is still local-first.
0:08:25 If you open up that app and you send some messages and you know, you do some stuff
0:08:29 like make changes and you're offline.
0:08:32 That works.
0:08:33 And when later you come online, those are reconciled with any changes that
0:08:37 might've happened by other people.
0:08:39 You don't like lose the stuff that you've done.
0:08:42 And I think that kind of sums up how I would think about local-first.
0:08:44 There are always limitations to these things, right?
0:08:47 Like there's some, like, where do you draw the line?
0:08:49 I think you have to think about it from a human perspective.
0:08:51 When doing this litmus test and not from a computer technological perspective,
0:08:56 meaning that there is just some data that is just impossible to get.
0:09:00 Right.
0:09:01 For example, if you have in a chat application, if you have a idea of
0:09:04 presence, right, if someone is online or not, like that's not, that's naturally not
0:09:07 data that you can get when you're offline.
0:09:09 Right.
0:09:10 And if you did, like, it wouldn't really be useful if you showed like
0:09:12 cash data, like, Oh, Johannes is online.
0:09:15 Like two months ago, like that that's useless.
0:09:17 Right.
0:09:18 So I think you have to think about it from a human perspective.
0:09:20 Like if I sent Johannes a message and I hit the send button, you close the
0:09:25 app or close my phone or whatever I do.
0:09:27 I know Johannes is going to get the message eventually.
0:09:30 Data Models
0:09:30 That makes a lot of sense.
0:09:31 So switching gears a little bit, uh, and thinking about this more from like
0:09:35 a developer perspective, how you built those systems, what were, are there
0:09:39 any sort of similarities that Emerged from building those systems, maybe in
0:09:44 terms of like how the data is stored and how the data layer looks like.
0:09:48 Yeah, it's interesting.
0:09:50 So you and I have been, you know, we've, we kind of friends, so, you
0:09:52 know, we met a couple of times.
0:09:54 So we've been talking about these things in the past.
0:09:56 So I think, uh, you know, where this is going, uh, there, there certainly is.
0:10:01 A very interesting, I think, uh, observation that I've made with these
0:10:06 like projects and with these projects, I mean, like we mentioned these
0:10:09 three so far, like Figma, Spotify, Facebook Messenger, there are more.
0:10:14 I've worked on a couple of more ones, but I think these ones Perhaps some of
0:10:17 the listeners have heard about there.
0:10:20 It's almost like all of them end up like sort of, if you think about a
0:10:24 signal oscillating and then slowly stabilizing into a line that is an
0:10:28 equilibrium, it's almost like all of them have stabilized around, like
0:10:32 pretty much the same data model.
0:10:34 Which is this kind of ordered map of, of data, very practically speaking.
0:10:37 And I think that's really interesting.
0:10:39 Like if, if you have these individual separate, like engineer organizations,
0:10:42 even in different points in time, ending up like with similar, but pretty
0:10:47 different, like practical, like product problems, and you end up with like a
0:10:51 very, very similar data model, like could there be so that that data model that they
0:10:57 have is like actually a pretty good one.
0:10:58 I don't know.
0:10:59 So Facebook messenger.
0:11:00 Is probably the outplay here in this little, maybe a little bit different,
0:11:04 but anyhow, , how I would describe this like data model that I'm talking about
0:11:09 is think about a list of things, right?
0:11:12 So think about this thing as an array.
0:11:14 Meaning that like an item in this list has like a, has an explicit position, right?
0:11:19 Position one or five or 2000.
0:11:21 And now each like entry in this list is a key and a value.
0:11:26 And really it doesn't have to be key in the value.
0:11:28 The point here is that you can say, give me.
0:11:32 The fifth item in the list, but you can also say, give me the
0:11:35 item with this key in the list.
0:11:36 And then the value, it's just like a couple of bytes, you know,
0:11:41 the value is not some like JSON document or anything like that,
0:11:43 the value could be an identifier of another list deals like this, right?
0:11:48 So now like you have a graph, right?
0:11:50 So let's say you want it to build on this so we can take Spotify as an example.
0:11:53 So Spotify has playlists on the sidebar and the desktop app or sort of in
0:11:57 the mobile app, if you go to the home screen, you have all of these things.
0:11:59 They have a list of playlists and you can make folders and
0:12:02 put playlists and playlists.
0:12:04 Right.
0:12:04 And you have playlists from, you have your playlists and then there
0:12:07 are sort of a, you can browse for other people's playlists.
0:12:10 Right.
0:12:10 And all of these things, at least for a very long time, were
0:12:13 all the same data structure.
0:12:15 They were all like this type of list.
0:12:16 It's right.
0:12:17 A playlist, think about it.
0:12:18 It is pretty much like what I'm talking about, right?
0:12:21 You have a list of songs.
0:12:22 They have a specific order, right?
0:12:23 Since you might want to play this song before that song.
0:12:25 So that's important.
0:12:26 And a song itself.
0:12:28 Can be represented also as a list.
0:12:31 But here you use the keys, so a key could be artist, right?
0:12:35 And sure, there can be many artists, but let's simplify it.
0:12:38 So a key can be artist and another key can be, you know, song title.
0:12:41 And another one is run length and so on.
0:12:43 And now your playlist is essentially the identifier.
0:12:47 Each entry in your playlist is an identifier of a list that
0:12:50 represents a song, a track.
0:12:51 I think it's perhaps obvious at this point, you can now have a, uh, a folder.
0:12:56 That's essentially a playlist with links to playlists.
0:12:58 Right.
0:12:59 And now you have a graph and you can build this graph up and this list
0:13:02 of things that is the guarantee, the ice date is the isolation, like
0:13:07 primitive in something like Spotify.
0:13:10 So like, if I say like, make these, like move these songs in this playlist
0:13:14 and move these songs in that playlist, then these are two transactions.
0:13:18 If you want to think about it that way.
0:13:19 You cannot like, you cannot say either, like move these things in
0:13:24 these two playlists or don't move anything in these two playlists.
0:13:27 You can also only say, like, in within this list, make these changes and
0:13:32 have those, like, give me some sort of guarantee that they will be reconciled
0:13:35 in a predictive manner in all instances that have access to this playlist.
0:13:41 So the diffing and emerging happens on that kind of list level.
0:13:45 And interestingly, this is kind of how Figma works too.
0:13:47 And there's like some articles, this is not any trade secrets here.
0:13:51 Some articles published about this on the Figma blogs and Figma pretty
0:13:54 much have the same principle, right?
0:13:56 There's a graph that's built up by these sort of like entries.
0:14:01 So you can think about them as a log or you can think about them as
0:14:03 like a serialization of a graph.
0:14:05 It goes both directions and that's the level where you different merge.
0:14:09 And one of those lists is one document on Figma.
0:14:12 And so one document is that like.
0:14:14 You know, it's a unit about isolation, like either of these things change, you
0:14:18 know, or they don't like one document that's kind of in one known States and
0:14:22 Facebook messenger in a similar way, you have like messages and a message,
0:14:26 you know, similarly, it's like part of a list in a conversation and so on.
0:14:30 That's super fascinating.
0:14:31 I think most listeners on this podcast, when they think about data
0:14:35 models and data systems, there's typically one of two reference points.
0:14:40 The most common one would probably be like a traditional database, whether it's on
0:14:44 the server side where you have something like Postgres or MySQL, et cetera, or if
0:14:49 you're a mobile developer, you are used to using SQLite in your client directly,
0:14:54 or that's now also possible on the web.
0:14:55 So I think that's the most traditional approach is like.
0:14:59 Rely on a data system as a database.
0:15:02 So I'd be curious how your suggestion kind of compares to that.
0:15:06 I would assume maybe what you've described can be a foundation of a database, but
0:15:10 what would be the downsides of using a database directly to build your app?
0:15:15 Contrasting with your approach and also now with.
0:15:17 A local-first CRDTs is a very common approach to have data structures that
0:15:22 are also allow for collaboration.
0:15:24 So maybe you can contrast your approach that you've described to
0:15:28 using a database or CRDTs directly.
0:15:31 Yeah.
0:15:31 I think this is an interesting conversation, which is like, what
0:15:35 tools do you use at one point in time?
0:15:37 And like, what is a good fit for your problem?
0:15:39 And there's almost like.
0:15:40 If you imagine some sort of graph between perfect fit and time
0:15:44 required and stuff, there are these two lines and they meet somewhere.
0:15:47 And it's very specific to each project and you want to kind of hit that spot.
0:15:50 Okay.
0:15:51 Let's, let's think about like a bunch of different projects, right?
0:15:54 Everything from something like Spotify, there's like a, you know, a big
0:15:57 undertaking, like a company where, you know, we're going to be, okay, we're going
0:16:00 to spend a year or two of like 10 people.
0:16:02 And we just kind of like, you know, pour like tens of thousands of, of hours
0:16:06 into making this one thing go well.
0:16:07 And on the other side of the spectrum, think about like a, you know, sort
0:16:11 of a Robin Sloan home cooked meal type of like, I'm gonna like make an
0:16:15 app in an afternoon sort of thing.
0:16:17 I think these two, you gotta take very different approaches
0:16:20 for these two things, right?
0:16:21 If you build this company-size thing by just like just throwing some generic
0:16:25 thing on it where it really matters.
0:16:26 And I got to say, you know, there, there are going to be.
0:16:29 A hundred different problems you need to solve and 95 of those problems,
0:16:33 you should solve a generic technology and it's really hard to know upfront.
0:16:36 There's 5 problems that really will set your product aside from the competition.
0:16:40 And those are the 5 problems where you want to think really hard and
0:16:43 solve for really, really well.
0:16:45 So say that you've identified those 5 problems.
0:16:47 You don't want to throw something generic on there.
0:16:50 Because that's going to like ruin your opportunity to really
0:16:53 differentiate with Spotify.
0:16:54 For example, we knew that like to skip in a song that should never
0:16:58 be slower than 200 milliseconds.
0:17:00 And so a lot of engineering went into just making sure that that was true.
0:17:02 Right.
0:17:03 And that's kind of how you find some of those like five things
0:17:06 with the home cooked meal type of like, I'm going to spend a week
0:17:08 and making an app kind of thing.
0:17:10 You don't, you just don't have the luxury of that.
0:17:12 Right.
0:17:12 Even if you do identify, these are like one or two things that
0:17:15 Like make my thing like different.
0:17:17 Maybe my friends will like it more.
0:17:19 You got to be creative.
0:17:20 And I think in that scenario and find either really hacking solutions or
0:17:24 like just be super lucky and find some existing stuff that does that.
0:17:28 And I realized we're on a bit of a tangent here, but I think like it's
0:17:32 important to have that, like setting that like picture frame, so to speak.
0:17:35 Right.
0:17:35 So with something like Spotify and something like Figma, which both end up
0:17:40 with like pretty much the same or very, very similar data model, those data
0:17:44 models are specific for their problems.
0:17:45 They're both in both sides.
0:17:47 They are one of these like five things that makes them stick out.
0:17:50 Right.
0:17:50 Like if Figma had not came up with it's a sort of CRDTs smelling semi
0:17:56 centralized sort of, uh, document graph format, whatever, it probably wouldn't
0:18:01 have been as fast and, you know, probably wouldn't be able to scale and
0:18:05 it probably wouldn't feel that very good if it wasn't that fast, right.
0:18:08 And maybe it would never have gotten traction in the market and wouldn't
0:18:10 have been successful as a company.
0:18:12 And similar for Spotify, like if collaborating on playlists and
0:18:16 stuff will be really slow or you would just like sometimes lose data.
0:18:19 You would probably also have lost users early on.
0:18:22 And these solutions were very specific.
0:18:23 So I think that that tension exists.
0:18:25 And when building something ourselves, maybe we're not on
0:18:28 the extreme of like, I only have, you know, 10 hours to make this.
0:18:31 Maybe it's more like, you know, I've got maybe 200 hours
0:18:33 over the course of two months.
0:18:35 I think it's very, it's very like.
0:18:37 Attractive.
0:18:38 To reach for an existing solution, but I think in many cases it ends up
0:18:41 costing us as much to use third party code as it does to write it ourselves.
0:18:46 So think about it.
0:18:47 Let's say you use like a library someone else read.
0:18:49 So you put that in there.
0:18:50 It does mostly what you want, but at some point it will not.
0:18:53 Right.
0:18:54 Like every single piece of code has bugs, right?
0:18:56 Like I've never worked on something that doesn't have bugs.
0:18:58 Everything is bugs, right?
0:18:59 So you just assume that that's the thing has bugs too.
0:19:01 And at one point there's gotta be, uh, there's gotta be an issue, right?
0:19:04 Or like, it doesn't do the thing you want it to do.
0:19:06 Maybe there's a bug and it does do the thing that you want it to do.
0:19:09 Right?
0:19:10 So basically now you have to fix that code, right?
0:19:12 Or change it.
0:19:13 And that means that you have to read the code and understand it.
0:19:15 And I argue that probably takes a very similar amounts of
0:19:19 effort in the common case as it would, if you wrote it yourself.
0:19:23 You probably, to understand it, you're going to have to go beyond
0:19:26 the code and understand the, you know, the logical aspects of it.
0:19:29 Maybe you have to read some like technical papers or some books or
0:19:32 speak with some people to understand how things are solved in a way,
0:19:36 not just like what the code does.
0:19:38 So I'm not saying like people should always go and write their own thing.
0:19:41 Obviously there's gotta be a couple of things , that don't fit this,
0:19:44 they're outliers to what I'm saying.
0:19:46 So if you, if you say, I kind of need like a relational database
0:19:49 and you're like, okay, I'm going to build my own Postgres or SQLite.
0:19:52 That's, I think, obviously a bad idea since like there are existing solutions,
0:19:57 really well tested, really high quality.
0:19:59 If they don't do what you want it to do, it's extremely flexible.
0:20:03 You can probably bend it to do what you want it to do.
0:20:05 If you were ever run into performance issues.
0:20:07 You can solve the problem then, right?
0:20:09 Assuming that like the solution fits the problem that you have.
0:20:13 I really like this mental model of like, you choose for like 95 percent of stuff.
0:20:18 You use like the default things, but like on 5 percent you spend your innovation
0:20:23 tokens and that's super interesting.
0:20:26 I, and I definitely agree that choosing the right foundation for your data model.
0:20:36 The Swiss Army Knife Problem
0:20:36 One more thing to consider is the, almost like the, how well the
0:20:40 glove fits or like the Swiss army knife problem, if we call it that.
0:20:45 So let's say you've got to, you're going to cook some food
0:20:47 and you need some tools to cook.
0:20:49 You need some pots and pans and some knives, right?
0:20:51 As a cutting boards.
0:20:52 I think one approach to doing this is you have one pot.
0:20:55 Or maybe you need two pots because you're doing two things concurrently.
0:20:58 But like you have this kind of minimalist mindset.
0:21:00 You have one knife, you used up all your, all your chopping.
0:21:03 You got like, you know, one or two pots and you cook everything in it.
0:21:07 And then you got on the other side, you got the maximalist mindset.
0:21:10 You have like 20 different knives of different sizes.
0:21:13 You're right.
0:21:13 And you have like 14 different pots and you have rice cooker for that kind of rice
0:21:17 and a rice cooker for this kind of rice.
0:21:18 And you know, there's this like specialization.
0:21:20 I think that this thing happens with technology too.
0:21:23 And especially early on.
0:21:25 I think that there's a, an appeal to using something that's very flexible
0:21:28 early on to have those 20 knives available just in case I need like a tiny
0:21:33 paring knife or a big butcher's knife.
0:21:34 Right.
0:21:35 Just in case.
0:21:36 Right.
0:21:36 And so I think a lot of people reach for something like SQL late early
0:21:39 on, just because they think, oh, I might need like some inner outer
0:21:43 join search thing hidden, you know.
0:21:46 Functions in a database kind of thing, maybe down the road, I need that,
0:21:49 you know, maybe I need to do like some something, you know, I need to
0:21:53 set up constraints and to protect myself because like, maybe I'll
0:21:55 forget what I did and stuff like that.
0:21:57 And, you know, that, like, like everything, there might be some,
0:22:01 there might be some truth to that being like useful, but I
0:22:04 think in most cases it's not.
0:22:06 And I think in most cases, we start out with too much flexibility.
0:22:10 And the problem is that anything that's simple will grow to become complex.
0:22:15 Or another way of thinking about it and complexity always grows, right?
0:22:19 Anything you have, it's like kind of the law of entropy, essentially, like whatever
0:22:24 you have your computer system, whatever your app over time will only grow complex.
0:22:29 And you have to work really, really, really hard to do the opposite, to
0:22:32 make something complex, grow the other direction to the towards simple.
0:22:36 And so, you know, if you agree with that.
0:22:39 It's, I think it's pretty reasonable to say if you start out with something
0:22:43 that is pretty flexible, it's probably pretty complex and it will become
0:22:47 very, very complex in the future.
0:22:49 And so I think in most cases, what people need, it's just
0:22:52 like a key value store early on.
0:22:53 And I mean, I mean, that's what SQLite uses under the hood, right?
0:22:56 SQLite is like, you know.
0:22:57 A set of like functions is essentially on top of a key
0:23:00 value store to make that easier.
0:23:02 And I think in most cases, if Facebook messenger is a key value store, for
0:23:05 example, at least when I worked on it's a level DB before rocks DB thing.
0:23:09 So yeah, anyhow, I just want to say that and wrapping that up, what I was trying
0:23:12 to communicate here is that when starting out with something new and thinking
0:23:15 about databases can be, you're smiling because I know like with Overtone, you've
0:23:18 been thinking a lot about this and I think coming to the similar conclusions.
0:23:22 Start out with something that's like a glove that really fits your hand instead
0:23:25 of like a whole wardrobe full of like potential winter clothes you might need.
0:23:29 Yeah, I love that analogy.
0:23:31 And I've seen this story now so many times that either you start out with a
0:23:36 database and then step by step you like remove layers from the database because
0:23:41 you need to go more low level and you need to have that performance or power.
0:23:45 Or you go the other way around and you start it up from scratch and then
0:23:49 your app kind of becomes a database.
0:23:51 I don't think there is a right or wrong.
0:23:53 I think there's a good fit for the right use case, but I agree that
0:23:57 this is like a super common scenario.
0:23:59 And it's very interesting to see that all of those different companies
0:24:03 that you've worked at, that this emerged in a very similar way.
0:24:07 Moving on a little bit from the data nitty gritty details.
0:24:12 On to a more broader topic.
0:24:14 The most.
0:24:15 popular platform right now, the web, you've been building things on many
0:24:19 different platforms, but I think that the web has always been like a common factor
0:24:24 in all of the systems that you've built.
0:24:29 The Web: A Love/Hate Relationship
0:24:29 The web is what got me into programming computers in the first place.
0:24:33 Well, that's not strictly true.
0:24:35 I started with like in a friend's basement on basic.
0:24:38 But the thing that really pulled me in was like the web in the nineties.
0:24:42 And I thought it was like absolutely magical that I can go on a webpage and
0:24:46 it usually said CGI bin in the location bar and I can go to a webpage and I
0:24:51 can like make a change and then I can go to a friend's place who also had
0:24:54 a modem and we can look at the page and I can see the change that I made.
0:24:57 And that to me was like.
0:24:59 That that's magic.
0:25:00 That's like, that's amazing.
0:25:02 Forget everything else.
0:25:03 I don't want to be an astronaut anymore.
0:25:05 Like I want to make that thing.
0:25:06 So like, I've got, you know, I've got a lot of love for the web and yes, I worked
0:25:11 on a lot of web stuff through the years.
0:25:13 And I even worked on like a, together with a friend of mine in
0:25:17 2010 or so, we had like a, a fully local-first, like website, and then
0:25:21 even, even the like image processing.
0:25:23 Like decentralized on clients, computers and stuff like that.
0:25:26 No Bitcoin mining, but you know, it kind of smells like that a little bit.
0:25:29 So I think the, in the last 10 years though, it's like gone in a direction
0:25:33 that I'm not super happy about.
0:25:34 So first I want to say that like what is really, really powerful and valuable
0:25:39 with the web is not HTML and CSS.
0:25:42 I think that's mostly like a historical accident.
0:25:44 What's what is so, so powerful is the distribution, the fact that I
0:25:49 can give you just like a URL, which is a piece of text, which is like
0:25:52 the most ubiquitous data format.
0:25:54 And, you know, exactly what to do.
0:25:56 I don't have to ask you to like, Oh, by the way, with this piece of
0:25:59 text, you have to go to that app and do this thing, you know, right?
0:26:02 I can send it to, you know, exactly what it is.
0:26:04 So it's ubiquitous, the human understanding of what a URL is.
0:26:07 You see that.
0:26:08 My mom sees the URL, she doesn't understand HTTP like,
0:26:11 and she doesn't have to, right?
0:26:12 But she sees it, she knows the URL, she punches it into a web browser and she
0:26:16 will see something that's like pretty similar to what I see, you know, it's
0:26:20 like, you know, it's similar enough that it feels like it's the same thing.
0:26:24 And that I think is, is so valuable.
0:26:27 That all the downsides of the web and all the valuable things of
0:26:31 other platforms are just like, just not tipping the scale, right?
0:26:35 Like this is way so heavy on sort of, uh, you know, an imaginary scale that
0:26:39 the web platform I think has won.
0:26:40 You look at like a tech workers, like laptop today, it's probably a MacBook,
0:26:46 but do they run any native apps on it?
0:26:48 Like probably not, which is kind of like bonkers, right?
0:26:50 You're going to, you're going to look at it and use Slack.
0:26:52 It's a web view, right?
0:26:54 And they use Figma.
0:26:55 It's a web view.
0:26:55 And they use like, uh, Discord.
0:26:57 It's a web view.
0:26:58 And they use Spotify.
0:26:59 It's these days, it's a web view, right?
0:27:01 And then they probably have a web browser with like a hundred tabs.
0:27:04 And, and that's obviously a web thing.
0:27:06 And what's left, I don't know, files on their local, like those,
0:27:10 those are not like web things.
0:27:11 Right.
0:27:11 And so I think it's like really hard to argue that the web platform
0:27:14 hasn't like won in terms of.
0:27:16 Becoming the dominant platform and platform, including like Microsoft
0:27:20 windows and iOS and Mac OS as platforms here alongside web, um, because the
0:27:26 web really does feel like a sort of an operating system or a platform.
0:27:30 It's like a target for software development, right?
0:27:32 And distribution.
0:27:33 So where web has now has definitely won is the.
0:27:37 best distribution mechanism that we have today.
0:27:39 I think we've also sacrificed a lot when I think there's like the sort of
0:27:43 fuzzy word of like, is the app native?
0:27:46 I think there's like no clear line of an app being native or not.
0:27:50 I think it's rather like, does it feel native , corresponding
0:27:53 to a certain platform?
0:27:55 So where would you hope that.
0:27:57 The web would go further.
0:27:59 Where do we leave money on the table in regards to the web?
0:28:02 What is Native?
0:28:02 That's a good question.
0:28:03 And I realized now that we're a little bit off topic of the sort
0:28:05 of general, you know, theme of this podcast, but I think that's okay.
0:28:09 I think this kind of relates somehow.
0:28:10 And I think what you were saying Johannes is I think really like stirs
0:28:14 my mind in a really good way, which is, you know, What is native and perhaps
0:28:19 it's something that like feels native.
0:28:22 Right.
0:28:22 And what does that mean?
0:28:23 I think what, what it means to me is if I run JavaScript or if it's
0:28:28 objective C or Swift or Android Java or go, it's all the same, right?
0:28:34 Like all of these things just, you know, Are translated different
0:28:37 ways to the same instructions on the CPU and use the same memory.
0:28:41 There's really no technical difference below a certain level
0:28:45 of any of these technologies.
0:28:46 Right.
0:28:47 So it would be incorrect to say that like web is a different, it's
0:28:50 like a user, a different CPU, like the JavaScript CPU, that like.
0:28:54 That's not a real thing.
0:28:55 Right.
0:28:55 So these are all the same thing at like a pretty low level on the computer.
0:28:59 And so what leaves us then is like, not really like, does it run a
0:29:02 different CPU because it doesn't, it's more about that feeling.
0:29:05 I think that feeling comes from and why it, why it matters.
0:29:08 We can talk about too.
0:29:09 But I think that feeling comes from just like things looking
0:29:12 the same and behaving the same.
0:29:13 Looking the same, I think is less important behaving the same.
0:29:16 I think it's a big deal and looking the same where it's important is to
0:29:20 recognize that something looks similar.
0:29:22 So let's say we're walking outside.
0:29:24 We walk in a park, right?
0:29:25 There's like trees and stuff.
0:29:27 We can identify a tree as a tree.
0:29:29 Although we don't know if it's like an oak tree or a pine tree, right?
0:29:33 Or like some specific, like, type of oak.
0:29:35 Maybe we do know that, oh, that's probably an oak tree.
0:29:37 That's probably a pine tree.
0:29:38 But we don't know the subspecies, but it doesn't matter the fact that, like, we can
0:29:42 tell that that's a tree and that's a rock.
0:29:44 This is the sky and this is the ground.
0:29:46 Like those things are really important.
0:29:48 Then if the grass is green or yellow or brown, that's less important for
0:29:52 our, like, you know, ability to, like, navigate, right, the space.
0:29:56 And I think the same is true in a, in a user interface, that if I see something
0:30:00 that looks like a pop up button and, or something that looks like a button, Right.
0:30:05 The most fundamental of UI elements.
0:30:08 If it doesn't behave like a button, like my mind will break, but it doesn't,
0:30:11 it doesn't have to like, look exactly like the button that I'm used to.
0:30:15 Right.
0:30:15 If I'm using macOS and the button, this button we're talking about now looks
0:30:19 totally different like aesthetically, but I still identify as a button.
0:30:23 The fact that it looks different is not important.
0:30:26 Right.
0:30:26 As long as it behaves the same.
0:30:27 So I would say that behavior is, is really the most important part.
0:30:32 It's like recognizing that it is about the yes, that behavior, big deal.
0:30:36 And I think this is where the web platform has a huge problem because
0:30:40 it comes to not an analogy, right?
0:30:43 So imagine that we have like a planetary system with different planets, you know,
0:30:46 Mac OS or iOS, let's take that as an example, iOS, that's one planet, right?
0:30:51 You got a set of like rules there, you know, grass grows in a certain way.
0:30:55 There's a certain amount of gravity.
0:30:56 The sun rises in a certain time.
0:30:58 There's like a bunch of rules and there's a world and everything sort of is.
0:31:02 In harmony with these like laws of physics there, and then you go to
0:31:05 Microsoft windows and there's a different world and some things are similar, but
0:31:08 like, a lot of things are different.
0:31:09 Right?
0:31:09 And then you go to the, to the, to the web, right?
0:31:13 But the web is not a planet.
0:31:14 The web is another planetary system.
0:31:16 There's like, not one website works the same as the other website.
0:31:19 This is actually a problem from a business perspective.
0:31:22 And it's like a lot of big things, you know, run by businesses
0:31:25 and they care about money.
0:31:26 And so I think they're leaving money on the table.
0:31:28 By making things like behave differently, right?
0:31:31 I go to, I don't know, uh, a website for, uh, for getting
0:31:35 groceries delivered, right?
0:31:37 And now this website has like some pop up menu that's like some homemade
0:31:40 thing and it doesn't work the way I expect it to and now like that, that
0:31:44 becomes like a cognitive, like work that becomes like a, a road bump
0:31:48 that becomes like, like a detour.
0:31:51 Right for myself, that's something that I have to spend my, my limited energy on.
0:31:54 Maybe I go to this website.
0:31:56 And again, order groceries.
0:31:57 I haven't done it before.
0:31:58 I'm like, is this going to, is this, is this a good idea?
0:32:01 Should I do this instead of going to the grocery store?
0:32:03 Blah, blah, blah.
0:32:04 Then let's say that this website would be like, there's a big hand
0:32:07 coming up in the middle of the website that says like, fuck you, man.
0:32:10 It's like, you suck.
0:32:11 And like, I would pretty quickly as close the website to go somewhere
0:32:14 else, probably if it started, like, assaulting me sort of verbally.
0:32:17 So that's like a very extreme version of it.
0:32:19 And I think these small things are these, like, tiny things
0:32:22 to build up to the same thing.
0:32:23 Right?
0:32:23 Eventually, when it's like, I filled something out in the form, and then
0:32:27 I switched tabs and I came back and like, They had some server side session
0:32:31 or some like insane idea like that.
0:32:33 And it like wasted all of the stuff I read them because I hadn't submitted
0:32:36 it because my, my session expired.
0:32:38 Right.
0:32:39 I'm going to be furious and things like that.
0:32:41 Those kind of, they almost account toward like a rising thermometer.
0:32:46 And when it gets too warm, I'm like, Ooh, I'm starting to sweat.
0:32:48 I'm out of here.
0:32:49 I know I'm like saying a lot of words and it's a little fluffy, but I think
0:32:52 that there is some, some real value left on the table here in terms of like,.
0:32:56 Removing that friction and instead having that like limited cognitive
0:33:01 supply of a user of a visitor of whatever thing you have focused on
0:33:05 what makes your thing different.
0:33:07 Right?
0:33:07 If I go to Overtone and I use Overtone, like how, like I scroll,
0:33:11 that shouldn't be like the thing that I spend time on, right?
0:33:14 How I select what happens if I double click like these things, if I have
0:33:18 to spend my brain energy on that.
0:33:20 I'm not going to have much brain energy left on like what actually
0:33:22 makes Overtone interesting.
0:33:23 So I think then, you know, where, where is this not true that I'm saying?
0:33:27 I think it's like with entertainment and art.
0:33:29 Right.
0:33:29 If I visit like a website that is supposed to give me an experience,
0:33:32 what I'm saying does not apply, right?
0:33:34 If I like play a video game and part of the video game, it's just like,
0:33:37 there's just some, some ideas about you.
0:33:39 You kind of want the person to think about like how you interact with something
0:33:43 instead of a button on top of like the screen, maybe you like, there's a 3d
0:33:48 world and you interact with some liver.
0:33:50 So, so it doesn't apply everything, but I think in vast majority of web apps,
0:33:55 What I'm talking about is like an issue.
0:33:57 Right.
0:33:57 Uh, I always look about like the web as a spectrum from going for like what
0:34:03 the web was originally created for websites to now what we are also using
0:34:08 the big web hammer for is like for web apps, and I think there is this
0:34:12 spectrum and my theory is that we're.
0:34:16 the web apps, this is where it really matters that the apps feel more native
0:34:21 and that all the paper cuts are really like worked out, but they are not.
0:34:26 And I think this is where we are using the wrong, the wrong hammer
0:34:30 for building those, those web apps.
0:34:32 And so I think one way to think about addressing that is I think to build
0:34:38 those apps in a, in a more local-first way as a way out of that misery.
0:34:43 Would you agree with that?
0:34:44 Or do you have other ideas how we make the web better in those cases?
0:34:49 I think the local-first approach is one of them.
0:34:52 I think that it's.
0:34:53 It's interesting how making a web app local-first is kind of like playing
0:34:57 on hard mode, I think, since the web is fundamentally centralized, if you
0:35:01 think what, what defines the web?
0:35:03 Well, I think hypertext, like, you know, originally defined the web.
0:35:06 And I think today it's more like web browsers define the web and hypertext is
0:35:09 like 1 medium, you know, you could open a PDF, you know, in SafarI can open a PDF.
0:35:14 I can do that in Chrome too, but it sucks.
0:35:16 And it's fundamentally like built on this idea that like, I have a
0:35:20 portal that connects to a service somewhere else over the internet.
0:35:23 And, you know, now we have like things in the web browser
0:35:28 that kind of fuses the border.
0:35:29 But, um, if you think about like a local email client instead, right.
0:35:34 Or an email client running on iOS or something like that, then you're not
0:35:37 starting out in an environment that is.
0:35:40 Already set up against you, so to speak, if you're not trying to
0:35:43 build something local-first, right?
0:35:45 It's kind of neutral ground, right?
0:35:47 You can build an email client that works like a web browser, right?
0:35:50 That like the first thing that does when it starts up is to connect to
0:35:53 a server somewhere and ask it what emails does Johannes have, right?
0:35:58 Another way of doing it, you can, but you have to write that code, right?
0:36:01 And now they're like conscious, like choice that you can make is.
0:36:06 Let's read from a database.
0:36:07 What emails I already know Johannes have.
0:36:10 And now I'm going to go and ask a server if there are any new
0:36:12 emails to put in that database.
0:36:14 Whereas on the web, like you have that first choice made for you.
0:36:17 And to some extent, like you can't even undo that choice.
0:36:20 You have to kind of work around it.
0:36:21 So I think like your question was really about like, does
0:36:24 local-first make the web better?
0:36:26 Like, what can we do to like fix it?
0:36:28 And what's the issue?
0:36:29 I think the, the solve here is, is more about the user experience.
0:36:34 I think.
0:36:35 You said the web was kind of made for web pages and, and I would go a
0:36:38 little further to say the web was kind of made for like documents, right?
0:36:41 Like text document.
0:36:42 I think your average marketing website when information about some
0:36:46 service or product or whatever, or like, uh, you know, an essay or an
0:36:50 article about to learn about something that HTML and CSS is great for, I
0:36:55 mean, this is what it's made for.
0:36:57 It's fantastic.
0:36:57 It's like a layout tool for like, you know, text and images and video and stuff.
0:37:01 Right.
0:37:02 And of course we've gone way beyond that.
0:37:03 We can now have interactive elements to learn about how like a, I don't know, some
0:37:07 sort of water lock on a boat works right.
0:37:09 By like playing around with it.
0:37:10 And that's super cool.
0:37:11 And I think that's where it like really shines the medium.
0:37:14 But then you think about something like Figma where we, where we
0:37:16 spent over 1000 engineering hours on just the context menus.
0:37:20 Which is insane and they still kind of suck, you know, and
0:37:23 that that is like, not okay.
0:37:24 I think it's a good, like, think to think about, like, do I want
0:37:27 to spend if I care about quality?
0:37:29 And I think a lot of people listening to this do care about quality.
0:37:33 And it's maybe 1 of the reasons they even started thinking about local-first.
0:37:36 If If I care about the quality of the thing that I'm building and the people
0:37:41 have a good experience with it, there's a couple of trade offs I have to do.
0:37:43 Right?
0:37:44 Like, first off.
0:37:45 Yeah.
0:37:45 You can't just get quality for free.
0:37:46 Quality has a cost.
0:37:48 So usually that means I will have less features or fewer features.
0:37:51 And it probably also means that I will have to spend more time in a couple of
0:37:55 areas that are like hard to identify.
0:37:58 And in turn, that means I have to spend time identifying those areas, right?
0:38:01 Something like context menus at Figma.
0:38:03 Time, like trying to understand, like, what, what is a good context menu?
0:38:06 Like, what do people expect?
0:38:08 This is still a lot of, still a lot of product or engineer work or
0:38:11 whatever you want to call it, design work, but it's not work where you
0:38:14 like write code or like draw things.
0:38:16 This is like, you speak with people and you thinking whiteboard
0:38:18 and all that kind of stuff.
0:38:19 Right.
0:38:19 But that's still like an important part.
0:38:21 Uh, on the road to getting to something that has like decent quality, because
0:38:24 then the next step is going to be, now that we understand like what people
0:38:27 expect and, and I think quality and expectations are very much intertwined.
0:38:32 Now we know what, what to build.
0:38:34 And then you have like something like the web platform with this input event
0:38:37 model and it's focusing system and all this kind of stuff you have to sort
0:38:40 of like, you know, that's another like place where you got to invest time.
0:38:43 Right.
0:38:43 So I think like what a possible better future might look like is if you imagine
0:38:48 in a web browser, Having a different content type that's like, I don't know,
0:38:53 um, application slash application.
0:38:56 I don't know, whatever.
0:38:57 It doesn't matter.
0:38:58 So like a server, like sends back like a blob of data that is this
0:39:03 different format, uh, instead of HTML for something that's an app.
0:39:07 Right.
0:39:08 I think that's a stopgap solution.
0:39:09 And I wouldn't be surprised if someone like Arc or something is
0:39:12 like working on this right now.
0:39:13 But that's going to require developers to like write apps in a different way.
0:39:17 And I think that's a.
0:39:18 Big deal.
0:39:19 And you're still going to be in the scenario for web browser.
0:39:22 That's fundamentally centralized, right?
0:39:24 The whole model is like you're in inside this like little box
0:39:28 on your very powerful computer.
0:39:30 You put this little box inside your like amazing powerful computer.
0:39:33 That's like literally like visually a little box inside and this
0:39:37 little box inside now can only use some of your resources, right?
0:39:40 It's single threaded mostly.
0:39:42 And it can use maybe two gigabytes or four gigabytes of your
0:39:44 like 90 gigabyte, like memory.
0:39:47 And, you know, you got all of these like kind of weird things and that
0:39:50 is not going to go away, but, and, and the more long term solution might
0:39:53 be something, something a little different or like maybe bringing back
0:39:56 native apps, whatever that means.
0:39:57 I don't know what that means, but anyhow, the user experience here, I
0:39:59 think like moving away from HTML and CSS, it's, it's a, it's a, I don't
0:40:04 even, I can't really see the path.
0:40:06 Toward that, but I think that would be like a true improvement to
0:40:09 quality where I can say, I want a context menu with these things in it.
0:40:13 And I know that it's going to work and work everywhere.
0:40:16 And people know what to expect.
0:40:17 And I can spend like maybe one day on putting that context menu
0:40:21 together and testing and stuff instead of like, you know, a year.
0:40:23 What do you think?
0:40:24 Like, you've been asking me a lot of questions.
0:40:26 I'm also really curious what you think about these things because you actually
0:40:30 think about this like day to day, right?
0:40:32 When it comes to like the web.
0:40:33 Would you agree or do you disagree when it comes to like the, you know, the
0:40:41 Performance
0:40:41 I completely agree.
0:40:43 I haven't reached the context menu stage yet in the app development journey,
0:40:47 but I've so far spent a lot of time on tables and just making the app fast.
0:40:52 We haven't talked, we've like somehow touched on performance, but another
0:40:56 aspect besides just raw capabilities of the web is also just making the app fast.
0:41:01 Building a fast web app is something that's like you said, like it's, it's
0:41:06 an hard mode, not just hard mode in terms of capabilities, but also hard
0:41:10 mode in terms of performance, since if you want to build things in a
0:41:14 like rich, interactive experiences with that HTML, CSS document model.
0:41:20 That's not what it was built for.
0:41:22 And so this is where I find myself reaching for other approaches now.
0:41:27 So I'm specifically for like the table component I've mentioned, I'm using a
0:41:31 great tool or a great software project called Glide Data Grid, which, um, is
0:41:37 like a React table implementation, but which is rendered entirely on a canvas.
0:41:43 Um, and so that allows you to get like 120 FPS smooth experience and
0:41:49 way outperforms any other react table implementation out there, but
0:41:54 you gotta switch your mindset a bit.
0:41:57 So you're no longer tweaking CSS values and wrapping things
0:42:01 in 5 deeply nested divs.
0:42:04 But if you want something more custom, you got to reach for like the canvas
0:42:09 API and go back to drawing rectangles and so on, which I personally enjoy.
0:42:14 And I think a lot of other people have also come to like
0:42:17 rediscover this approach.
0:42:19 That is actually quite nice.
0:42:20 But I think, Looking at this more broadly, I think there could be almost like a
0:42:25 app kit kind of abstraction, what you got on, on iOS, on Mac, but maybe for
0:42:31 the web, maybe like a whole new, whether it's, uh, the MIME type like application
0:42:36 slash application or something else, but that I think we have now really powerful
0:42:41 primitives, whether it's web GPU and WASM, et cetera, where we can have like
0:42:46 entirely different model, we leverage the distribution mechanism of the web.
0:42:51 But we're going for like a flash 2.
0:42:54 0, but I think there's some really interesting developments there.
0:42:59 And, uh, this glide data grid canvas table that I'm using, I think that's just
0:43:03 like the beginning of, of new approaches.
0:43:06 So another, uh, notable project that comes to mind is, uh, it's called eGPU.
0:43:11 I think, uh, no, sorry, eGUI.
0:43:13 Oh, by Emil at, uh, uh, Rerun.
0:43:16 Exactly.
0:43:17 Yeah.
0:43:18 So that, that's a really compelling project.
0:43:20 I think it's still, um, I think it's both come along really, really far, but
0:43:26 it's still early compared to like all the primitives that you're getting from like
0:43:31 HTML and CSS, and it's kind of a miracle how capable browsers still are and how.
0:43:38 Relatively speaking, how performant all of those things are compared to
0:43:43 the complexity that they can afford.
0:43:46 So I'm of the same opinions like that.
0:43:48 I have a love hate relationship with the web.
0:43:51 Yeah.
0:43:51 I just want to like reflect on what you were saying.
0:43:54 It's, it is interesting though, right?
0:43:56 How you're talking about the table component, how you're basically
0:44:00 just like exiting out from.
0:44:01 All of the HTML and CSS, right?
0:44:04 It's kind of what the canvas is.
0:44:05 You punch a hole through all of that stuff and you say, I'm
0:44:08 just going to go like start from scratch, basically, and draw pixels.
0:44:11 And now you're going to, you're going to make some trade offs, right?
0:44:14 Like you're going to have to implement your own like
0:44:16 shadow DOM for accessibility.
0:44:18 And you're going to have to like, you know, re implement things like scrolling.
0:44:21 And you're going to, there's like, now there's like an
0:44:24 ocean of stuff you have to do.
0:44:25 And perhaps that's why you use the third party code that maybe has
0:44:29 already climbed this mountain for you.
0:44:31 But it is interesting how, like the solution, so to speak, for your
0:44:34 problems there was just like, not use the web platform essentially.
0:44:38 Right.
0:44:38 Like not use HTML and CSS.
0:44:40 I think that's why, like there's eGUI, there's like, you know, there's,
0:44:44 uh, Deere image GUI, there is make pad, there's like Zed and warp.
0:44:50 And there's like, there's so many projects that develop their own.
0:44:52 UI frameworks, some of them target just like some unknown platform.
0:44:57 That's kind of all of them.
0:44:58 Some of them specifically target the web, but I think what they all have in common
0:45:01 is that like, they don't use the web.
0:45:02 Right.
0:45:03 And I think the web is like the dominant HTML and what
0:45:06 makes a computer fast, right?
0:45:08 Like, or what makes software on a computer fast?
0:45:10 So the hardware we already talked earlier about the hardware that we have today.
0:45:13 It's like.
0:45:14 So ridiculously fast.
0:45:17 It's hard to comprehend how like fast computers are today.
0:45:20 Even computers from five years ago are like mind blowingly fast, but
0:45:24 software keeps getting more complex.
0:45:27 Right?
0:45:28 So there's always that, like, there's the balance of hardware, hardware
0:45:31 engineers makes things go faster and software engineers make things go slower.
0:45:35 Right.
0:45:36 There's that, that it's like a pump.
0:45:38 It goes like that forever.
0:45:39 And so, yeah, you take something like, like one of these, like, uh,
0:45:43 new GUIs that are implemented on just like, uh, Canvas or like Figma, right.
0:45:47 They are fast because like, they just do less like shit.
0:45:52 Like it's as simple as that, right?
0:45:53 They just like cut out some stuff that they don't need.
0:45:56 What makes software go fast on a technical level at 15, 20 years ago, it
0:46:00 was, it was like, uh, processing speed.
0:46:02 People will do a lot of smart things with caching to make things go faster.
0:46:05 Today it's memory, right?
0:46:06 If you, and memory and context switching, and you know, you can go further up in the
0:46:10 abstraction stack, but like fundamentally you have a CPU, right, or like a core of
0:46:15 a CPU and you have a conveyor belt and on the conveyor belt are instructions, right?
0:46:19 And there are things like load something from memory.
0:46:22 Uh, and load something else from memory, add those two things together
0:46:25 and then put the result, like upload that to memory here, right?
0:46:29 That's all it does.
0:46:30 That's all the computer does, right?
0:46:31 It just goes like this forever.
0:46:33 The speed of this conveyor belt, and that's the CPU.
0:46:36 It is so fast that it's basically today.
0:46:39 It's like almost fully limited.
0:46:42 By its ability to communicate with memory.
0:46:44 So memory is really the limit.
0:46:45 It, of course there it's more complex than this.
0:46:47 And there's like many levels of memory and stuff like that.
0:46:50 But I think what happens is we use these like high level things like JavaScript
0:46:54 running in a, in like virtualized in some container on top of something else.
0:46:59 So now like you got basically none of the benefits of really fast memory.
0:47:03 That is the CPU has like a memory built in called registers.
0:47:07 And then it has like a.
0:47:09 A very small piece of memory that's nearby it.
0:47:11 That's like the first level of like a cache, like a line cache
0:47:14 and and further and further away and fetching something from memory.
0:47:17 It's kind of like, imagine you're sitting by your desk
0:47:19 and you need a pen to write on.
0:47:21 If you have opinions next to you, that's kind of if it's in, in, in the line
0:47:25 cache in the CPU, you just pick it up.
0:47:26 Be right with it.
0:47:28 And now like getting the pen from memory, it's like walking to your neighbor's
0:47:32 apartment to borrow a pen, going back and writing one thing and then going back
0:47:36 to the neighbor again to leave the pen.
0:47:37 Like that's the order of magnitude of difference.
0:47:39 Right.
0:47:40 And now you use something like, like a higher level thing, like JavaScript, the
0:47:43 Python, or there's like many, many things.
0:47:45 I'm not saying one thing is like bad or good, but just the concept of it.
0:47:49 Urea is always going to have to go to the neighbor for that patent, right?
0:47:52 You can very rarely like use the same.
0:47:54 If you have things adjacent in memory and you access them, like you're
0:47:57 looping over like a, an array of things that are all in this contiguous
0:48:01 array of things, like in memory.
0:48:02 That's like, that's like basically free.
0:48:04 If you have an array that points, like that are pointers to things.
0:48:09 That's just like a hundred times slower, at least it's, it's, it's
0:48:11 not even like a little bit slower.
0:48:13 It's just like incomprehensibly slower than the first thing.
0:48:15 And so what a lot of like performance stuff does today and some of these
0:48:18 UEs, like they recognize this fact, like memory is the limitation.
0:48:22 We're just going to put things in a race.
0:48:23 We're going to use like memory allocation.
0:48:25 We're going to be conscious about memory and the web platform.
0:48:27 Like that's the second thing, right?
0:48:29 There's like, there's a blob of things.
0:48:30 There's a bag of stuff and you have pointers and you have a huge graph.
0:48:34 And so I think this is like, why a lot of those things are fast because they
0:48:37 have the mechanical sympathy, right?
0:48:39 They, they kind of realize that this is kind of how computer works and here
0:48:42 are the constraints and weaknesses and powers of how the actual computer
0:48:47 hardware works and, you know, things like scheduling and virtual memory.
0:48:51 And we're going to use that to our benefit, right?
0:48:53 And on the web platform, even if you do have mechanical sympathy
0:48:56 and you do understand this, there's nothing you can do about it.
0:48:59 Even in WebAssembly, you don't, there's no stack, right?
0:49:02 I guess it's like this implicit kind of stack machine.
0:49:04 And even at that level, you have some, you have some very limited abilities to manage
0:49:09 that, you know, that very sort of low level to squeeze the last performance out.
0:49:13 I think video games is like a, an interesting like place to
0:49:15 look because they, They have a very, very tight frame budget.
0:49:18 And that is like a holy thing.
0:49:20 You don't break that.
0:49:21 you might drop an entire frame.
0:49:23 You might drop objects.
0:49:24 So you might like just what the modern games do today.
0:49:26 Instead of dropping frames, they, they drop objects.
0:49:29 So they drop quality.
0:49:30 Maybe the textures like gets a little fussier for a little
0:49:32 while just to make that happen.
0:49:34 And we're talking about, we're measuring things in microseconds at this point.
0:49:37 And I think a lot of people who work with web software, like even if they
0:49:40 wanted to, It would be kind of like, uh, you know, an uphill battle.
0:49:44 So you measure things in milliseconds.
0:49:46 They're like, Oh, this is takes only eight milliseconds.
0:49:49 And that's like eight milliseconds.
0:49:50 That's like an ocean of time for someone working on a video game.
0:49:53 That's like, that's like basically the entire game.
0:49:56 Like running.
0:49:57 It's, it's entire like thing.
0:49:59 It's like eight milliseconds.
0:50:00 Right?
0:50:00 Yeah.
0:50:00 in the web, we don't even have.
0:50:02 Uh, mechanisms to get more fine-grained resolution than
0:50:06 milliseconds in, in most browsers, like, I think for security reasons.
0:50:10 I think there, there was once, but I think it's mostly been
0:50:13 removed in, in many browsers.
0:50:16 But it's a, it's a very interesting parallel, what we've been talking
0:50:19 about in regards to getting the best performance in the web.
0:50:23 You gotta abandon a little bit of the primitives that the web gives you.
0:50:28 Punch through and go more lower level.
0:50:30 And it's a very interesting parallel to what we've talked about earlier in
0:50:34 regards to the data models, whether you use like a really powerful database and
0:50:38 then you start peeling off the layers.
0:50:40 It's basically the same story just for a different, um, for, for a different
0:50:45 use case here, whether one is like fast UIs and the other is fast data.
0:50:50 So you as someone who's so prolific in building apps, building tools,
0:50:56 I'm curious whether there is any apps or tools that you particularly
0:51:00 admire and love using today.
0:51:02 Favorite Apps
0:51:02 I think that there's quite a few, but not as many as I would like.
0:51:05 One that comes to mind that I started using recently, maybe three
0:51:09 years ago, it's called MimeStream.
0:51:11 It's by this indie developer.
0:51:13 It's a Mac app.
0:51:14 It's a native Mac app.
0:51:15 It's an email client.
0:51:16 And it's the first time in a very long time.
0:51:18 I used an email client that like I liked using.
0:51:20 I think mailbox on iOS was the last time I used an email client that I liked.
0:51:25 Everything since then has been like a bit of a disappointment for me.
0:51:28 So that's just like a piece of software.
0:51:30 I think in recent years I've been sort of pleasantly surprised by.
0:51:34 Sublime text is like that.
0:51:36 That's usually the editor that I use for, for writing.
0:51:39 And I'm kind of a person, I have used a few tools and I
0:51:41 use them for, for everything.
0:51:43 So I have very few like programs that I use and I tend to use each program.
0:51:47 For a lot of tasks, the sublime text for me, it's like fantastic.
0:51:51 It, and iTerm is another one, but it's very, very niche thing.
0:51:54 But, uh, sublime text kind of, uh, text works the same on pretty much the
0:52:00 same on like Ubuntu, Linux, Windows, Mac OS, but it like respects like the
0:52:07 lay of the land of these different platforms, like shortcuts, like window
0:52:10 behavior, scrolling It's very, very fast.
0:52:13 Most operations, like you just finished when you ask for them.
0:52:17 You know, there's no sort of measurable delay.
0:52:20 One thing that I think is really neat about sublime and this, this goes for
0:52:23 a few other apps, like, uh, I termed that I mentioned or something really,
0:52:27 really cool as well in this vein is like, uh, they, they care about state
0:52:31 sublime text care about state, right?
0:52:32 And I think there's a lot of apps today.
0:52:34 Even iOS apps, like don't do this anymore.
0:52:36 Meaning that if it is come on cute, just quit sublime, right?
0:52:39 Let's say I got a bunch of windows open.
0:52:41 Each window has a bunch of tabs, different text files, some of them not saved.
0:52:46 Some text selection scroll, we might be talking about 100 files open, right?
0:52:49 Think about your web browser and tabs and like scroll position text selection.
0:52:53 And I quit it and first off quitting it takes like a 2nd, right?
0:52:57 It doesn't, I don't have to, like, if I quit Chrome, I have to sit there and wait.
0:53:00 And then if that was a mistake and I started again, what happens is that,
0:53:02 like, all the windows come back up.
0:53:04 Um, exactly the way the word, the same Texas elected skull possession.
0:53:08 And this might seem like, Oh, that, that doesn't seem so valuable.
0:53:11 But what it does is it makes me not afraid of software.
0:53:17 It makes me not hoarding tabs.
0:53:19 It makes me like not think twice.
0:53:21 If I, when I'm going to reach for sublime, because I know that the
0:53:24 cost is like basically zero, right?
0:53:26 If I like, Oh, I should write something.
0:53:27 I'm going to start sublime.
0:53:28 And I, and then I realized, Oh, I shouldn't.
0:53:30 And I can just quit it.
0:53:32 Well, it was a lot of other software.
0:53:33 There's just like, we touched on video games a couple of
0:53:36 times in this conversation too.
0:53:37 I think video games is this problem too today where I have to like commit
0:53:42 to this big time chunk of investment.
0:53:43 If I want to use something, if I want to switch tools, if I want to play
0:53:46 a game on the PlayStation, I need an hour to like apply updates before I can
0:53:50 play it and then get through the menus.
0:53:51 It takes 10 minutes, right?
0:53:52 And then load the game.
0:53:54 And now play for, for 10 minutes and now, Oh, time is up.
0:53:57 Right.
0:53:58 Or like I opened some web app and I have to wait like five
0:54:01 seconds for it to be functional.
0:54:02 And you know, there's this old cost.
0:54:04 And if I quit the tab now, right.
0:54:06 Baxin or whatever, I've lost most of my state.
0:54:08 So I think that there's some good software, but it's, uh, they used to
0:54:12 be more good software in my opinion.
0:54:15 I'm also like an old dude, so you know what they say.
0:54:17 Everything invented after you're 30 is just wrong.
0:54:20 So there's, there's some bias here, but I think that there's, um, there used to
0:54:24 be a lot of software that would qualify him in my book as being pretty good.
0:54:28 And there's not that much anymore.
0:54:30 How about you?
0:54:31 Do you have a, do you have an app or, or service or something you
0:54:34 think it's, it's doing particularly well on these, these accounts?
0:54:37 Well, so I definitely share your perspectives and observations.
0:54:42 And I wanted to also ask, like, whether it's just my feeling or whether that is
0:54:46 de facto, the case that they used to be.
0:54:49 More higher quality software in the past, and that has sort of degraded over, over
0:54:53 time for in terms of like apps that I, that are really like, uh, I can plus one
0:54:59 of the ones you've mentioned, I think, uh, telegram as an app on, uh, macro
0:55:04 as an, an iOS is, is one that I, that I like that just feels like very snappy.
0:55:10 But, uh, I agree like your observations in terms of, uh, like preserving
0:55:15 state kind of like respecting the, where a user left off.
0:55:18 And then when you come back, that is still all there.
0:55:21 That gives me confidence and just makes me less afraid of using it.
0:55:25 I definitely agree.
0:55:26 And then also, even if it does remember everything, just making
0:55:30 things fast or keeping things fast, that is another, another aspect
0:55:34 of just like respecting my time.
0:55:36 It's another.
0:55:37 Paper cuts when I'm using software and it takes forever to load.
0:55:41 It just makes me, it's not like that the software is broken, but
0:55:45 in a way, it like sucks out a little bit of joy out of my day.
0:55:49 And this is also something where I'm spending out of like the 95 to 5%.
0:55:54 This is where I'm spending probably one of the five, uh, on, on Overtone.
0:55:59 And given that Overtone is targeting the web, that is like you say, Very
0:56:03 much on hard mode and you got to poke through a lot of layers on the web.
0:56:08 And I take more inspiration from native development and app development
0:56:12 to try to get there, but it's really hard, but I do think it's possible.
0:56:16 I think it is possible to get the best of both worlds, at least like directionally
0:56:21 where you get the distribution of the web and directionally closer to the to the
0:56:26 performance of like a, a native platform.
0:56:29 I'm curious why you think that is that, uh, software in the past was maybe felt
0:56:35 higher quality, was higher quality.
0:56:38 Theory on Degrading App Quality over Time
0:56:38 I do.
0:56:39 I think it's like as simple as technological constraints.
0:56:42 Earlier in this book, In this episode, we were talking about, or I was talking
0:56:46 about Spotify and sort of how they came about in a time where a web browser,
0:56:51 like the web platform just wasn't a fit.
0:56:53 It just didn't have the features.
0:56:54 You couldn't just play audio randomly or there were no web sockets and stuff.
0:56:58 I think a lot of like.
0:56:59 Software that we're talking about that we say like, Oh, that was kind
0:57:02 of good, like an old version of Outlook from Microsoft, or I know
0:57:07 like, uh, Microsoft Word these days.
0:57:09 It takes like 10 minutes to start on my computers.
0:57:10 I don't know.
0:57:11 Not 10 minutes, but it takes a long time.
0:57:13 I mentioned to you in the past.
0:57:15 I have this, uh, Mac book, a power book from 2002 and
0:57:19 it's a bit of a time capsule.
0:57:21 Uh, it still boots up just fine.
0:57:23 And it's like pretty fast.
0:57:24 And if I start certain apps, they start right away.
0:57:26 And I'm like, This got a mechanical hard drive that's like, I don't
0:57:31 know, 20, 20 something years old.
0:57:33 This shouldn't be this fast.
0:57:35 Right.
0:57:36 And I think it's that fast because there's a human, almost
0:57:39 constant, like set of thresholds.
0:57:43 If we forget about computer for a second, there's like, what is a
0:57:46 reasonable amount of time to wait for something to be ready for me to use?
0:57:50 I think the answer is it will be in relation to how
0:57:54 important it is to use that.
0:57:55 If I'm going to travel across the world somewhere, I am okay with spending
0:57:59 four hours in like taxis and airport security and stuff and getting on an
0:58:04 airplane before I get to the, into the air, on the air, in an airplane.
0:58:09 Whereas if I'm just like going to the grocery store, I would not
0:58:12 be okay with waiting four hours.
0:58:14 To like get on the bus to get to the grocery store.
0:58:16 It's in proportion to like the threshold or like the, where the amount of,
0:58:21 and the threshold is like, if I'm going to say, yes, okay, I'm going
0:58:23 to do it, I'm going to wait for it.
0:58:24 Or like, no, I'm going to find a different solution.
0:58:27 That's kind of the threshold.
0:58:28 It's in relationship to how important it is.
0:58:30 And I think this is a human thing and not something that's like,
0:58:33 Oh, that was the case in the nineties, but now it's different.
0:58:35 Or like, Oh, that's has to do with computers.
0:58:38 And so now let's say, yes, for the sake of conversation, uh, opening an
0:58:41 app, my threshold is like two seconds.
0:58:44 If the app hasn't started in two seconds, some app, whatever, Microsoft
0:58:47 Word, then I will probably just go and find a different solution.
0:58:51 Maybe I'll use notepad and windows to text that into macOS and I'm just going to be
0:58:55 fine with some features not being there.
0:58:56 I think that developers like have been very conscious about this or found this
0:59:00 out through research or somehow like know that like what this thing is, right?
0:59:05 Okay.
0:59:05 We need this.
0:59:06 We need Microsoft Word to start within two seconds.
0:59:08 Let's make that happen, right?
0:59:09 Otherwise we're, we're not going to get customers.
0:59:11 And then 20 years ago, you had to go to some pretty great lengths
0:59:15 to make something start within two seconds because you know, like
0:59:18 computers were a lot slower, right?
0:59:20 Hard drives are a lot slower and so on.
0:59:21 And today I think we have the same, we have exactly the same like human.
0:59:25 Properties, but now we can boot up like an OS, like I'm working on an OS.
0:59:30 We can boot our OS up in 250 milliseconds from scratch.
0:59:33 Like the kernel and everything and drivers, right?
0:59:35 We can boot up like our OS 10 times over before like Word
0:59:40 even, even has started on my Mac.
0:59:43 And that, like the fact that like our thing boots fast,
0:59:47 like that's kind of irrelevant.
0:59:48 It's more like a comparison that like you can make something quite complex, like an
0:59:52 operating system, like do a lot of stuff.
0:59:55 Right.
0:59:55 And so what does Word do when you start it up?
0:59:57 And it takes like, you know, 5, 10 seconds for it to start.
1:00:01 I don't know, but it must be doing a lot of stuff.
1:00:04 And so I think that's what keeps happening over time.
1:00:07 We just keep doing more and more and more and we're doing
1:00:09 less and less like clever stuff.
1:00:11 And I think now wrapping all of this up.
1:00:15 I think there is a strong correlation between what we do here and like,
1:00:20 the local-first, the purchase, the local-first approach in a nutshell.
1:00:23 Right?
1:00:23 Again, it's kind of like, you make sure that things like work when you're offline.
1:00:27 Right?
1:00:28 And you make sure that, like, if you, if you lose that connection forever online,
1:00:32 you can still use something, right?
1:00:34 You're not totally lost.
1:00:35 To an extent, I think that goes hand in hand with like making things like fast
1:00:39 within a certain realm of things, right?
1:00:41 Like if the first thing you have to do is to like re index like all, and this could
1:00:46 be a problem for local-first as well, but have to re index everything that exists.
1:00:50 That's just going to take a long time.
1:00:51 Every time Dropbox starts, it's gotta, it doesn't know which like files
1:00:55 have changed on the computer, right?
1:00:56 So, if you have a 200.000 files, this guy has to go and
1:00:59 look at 200, 000 files, right?
1:01:02 And that's a challenge you might have as a local-first thing and not as like a
1:01:05 centralized thing, but as a centralized thing, you always have this problem.
1:01:09 You cannot get away from it.
1:01:10 Yeah.
1:01:11 I think you're, you're always paying sort of like for the worst case by having,
1:01:16 by like threading everything through typically through the network, et cetera.
1:01:21 You can't quite like.
1:01:23 Go off the happy path where everything is like as close as, as possible.
1:01:27 It's basically an extension of what you've described earlier with the memory, where
1:01:31 it's like, it's not, not, not just to the neighbor's house, but it's literally
1:01:35 across the ocean to get that pencil often.
1:01:38 So I think there's a lot of similarities.
1:01:41 So we've been exploring a lot now, like here, the data systems you've been working
1:01:45 on, uh, on, on previous companies, not just data systems, but that's what we
1:01:50 focused on and talking more broadly about the web, the benefits and challenges.
1:01:56 But you've mentioned a few times now that you're working on an even more ambitious
1:02:01 thing, your own operating system.
1:02:03 So before digging more into that.
1:02:06 Yeah.
1:02:06 I'm very curious what led you to going on this audacious journey of
1:02:12 Playbit: A Local-First OS
1:02:12 I think some of it actually comes from a lot of what we touched on today of
1:02:17 quality and software and the joy that I can find that many of my friends can
1:02:23 can find or have been able to find.
1:02:25 In making software, I think it can be a very like fulfilling and fun thing to do.
1:02:30 And the, I got to say the web platform, I think over the, over the past 15
1:02:34 years, there's been such a relentless focus on scale because it's been such
1:02:38 a focus for a huge economy that we have made very conscious trade offs in terms
1:02:42 of like joy and ease and simplicity.
1:02:46 In favor of scale, like economic scale, technical scale, you know,
1:02:51 the ability to have like a million concurrent users on like a thing.
1:02:54 So today, if you want to like make a fun, if you want to
1:02:57 make a home cooked meal, right.
1:02:58 If you want to build like a fun thing for your friends or just for yourself.
1:03:02 I even tried making a homepage with a guest book today.
1:03:05 And if you have, if you have like maybe a weekend, you're going to spend that
1:03:09 entire weekend just like trying to figure out which of the 200 different
1:03:12 AWS services do you need and like, which databases, how do you set it up?
1:03:15 And like there are keys and there's so many layers of virtualization that
1:03:18 is compatibility and there's this and that and different dev tools.
1:03:21 And, and all of this, I'm not saying this stuff exists because like.
1:03:25 People are dumb or anything like that.
1:03:27 This stuff exists for very good reasons.
1:03:29 Right.
1:03:29 And these are reasons for like, you know, scale, like big companies,
1:03:33 basically like big things.
1:03:34 And I felt like, you know, the time when you can just like either just
1:03:38 make a native Mac app, for example, in Cocoa, or like make a kind of a
1:03:41 guest book with a CGI bin script, like a Pearl script on an FTP server,
1:03:45 like there was some joy to that.
1:03:47 Sure.
1:03:47 It wasn't a secure and safe and sure it wouldn't scale as well, but it
1:03:51 was for a different, like recent and different audience and so.
1:03:54 Three, three and a half years ago, I started really thinking hard about
1:03:58 these things, or four years ago, I started, started really thinking deeply
1:04:01 about these things and feeling that it's something I care a lot about.
1:04:04 And around the time I learned that Apple were thinking about getting rid of
1:04:09 Mac OS, at least Mac OS as we know it, which I think has been a very important
1:04:13 player in the having fun making apps.
1:04:16 I don't know if you ever wrote a Cocoa app, sort of its
1:04:18 heydays, like 2010, 2009 or so.
1:04:22 But it was just like a, a, a really like joyful way of doing things.
1:04:25 You earlier, you mentioned you need a table view, like
1:04:28 in Cocoa, there was a table.
1:04:29 There was not three different ways of making a table.
1:04:32 You, there was exactly one way.
1:04:34 And that was really performant, very flexible.
1:04:37 It did usually what you wanted to do.
1:04:39 Everyone used that.
1:04:40 There were a lot of really quality cocoa apps, like their companies,
1:04:44 like panic that still exists today and still make great software.
1:04:47 But there used to be a lot more like companies like that
1:04:49 that did really cool software.
1:04:51 Yeah.
1:04:52 Like sofa, like the, some of the people at sofa now, you know, are working on framer.
1:04:57 Who made some incredible backups.
1:04:59 There were Cocoa apps and they all felt good.
1:05:00 And so at the time I was like, I thought, I thought a lot about this.
1:05:03 And then I decided to leave Figma where I worked at the time and go and, and try
1:05:08 to do a little bit of research, trying to figure out like, what, what, what's
1:05:11 going to happen five, 10 years from now?
1:05:13 Like, are things better?
1:05:14 Where are things moving?
1:05:15 Where are things going?
1:05:16 And, uh, and that's, I think when I saw sort of like a couple of
1:05:20 possible futures, uh, and one of them I got kind of excited about.
1:05:24 Yeah, and I think that shows already in the name for, for your
1:05:28 project and undertaking playbet.
1:05:30 I think there's a, there's a, um, a person on Twitter called Anselm, who I
1:05:36 think in his bio has like, uh, Something along the lines of like, uh, work
1:05:43 doesn't work play works, or I think something along those lines, but that
1:05:48 really resonates with me where, like, if something feels like work, I don't like
1:05:53 it, but if something feels like playing.
1:05:56 Then this is where it can be most productive and I can do my, my hardest,
1:06:01 what other people would describe as work for me, it's not work for me.
1:06:05 It's just joy and playing.
1:06:07 So your focus with the name already, Playbit, really resonates with me.
1:06:13 And also just how you framed is like software that feels good.
1:06:17 I think that's something that I'm really striving for.
1:06:20 And that's rather the exception than the rule today.
1:06:24 And I think building a foundation where that is just the default software
1:06:28 that feels good, feels amazing.
1:06:30 So I would love to learn more about Playbit.
1:06:34 What is Playbit and what is your vision for it?
1:06:36 So Playbit, imagine that you have that kind of app kit you
1:06:40 were talking about before.
1:06:41 Right?
1:06:41 So you write a program and that developer experience is pretty
1:06:47 similar to what you have today, but you know, it's, it's vastly simpler.
1:06:51 And every time you hit build and run, imagine if you use Xcoder or Visual
1:06:56 Studio or something like that, you kind of have, you can change a line of code.
1:07:00 You can hit command R or something like that.
1:07:02 And you try your app out and you, that's kind of how you iterate.
1:07:05 Every time you do that, you also have a web version of that app.
1:07:10 It's kind of a Figma.
1:07:11 Grade.
1:07:12 Type of web app, right?
1:07:13 So, and so Playbit is an operating system.
1:07:16 And I think, uh, two big challenges with trying to build something like an
1:07:20 operating system or platform is one, you're asking people to go to some like
1:07:26 foreign planet and asking people to go to a foreign planet is always going
1:07:29 to be, uh, you're going to have a huge drop off rate where like, it's just
1:07:33 like a very fundamental human thing.
1:07:34 The things that we're, they're familiar.
1:07:36 We're.
1:07:37 Much more prone to approaching things unfamiliar.
1:07:40 We're kind of naturally afraid of them.
1:07:42 Uh, so we survived the bears and tigers and stuff.
1:07:45 Right.
1:07:45 So that's what, that's one problem you have.
1:07:47 And now the problem is like a chicken or the egg or kind of
1:07:49 a bootstrapping problem, right?
1:07:51 If you're to say, well.
1:07:53 Let's get some people like on this platform who like build programs for it.
1:07:57 Who are they building those programs for themselves?
1:07:59 Right?
1:08:00 How fun is that?
1:08:01 In some scenarios, the answer has got to be, Oh, that's fine.
1:08:04 Because like, maybe I'm building up some tools for myself or for my friends
1:08:07 who are also on this platform, but I think this is also a huge hurdle.
1:08:11 And so the first one.
1:08:13 I think it's really, it's really hard to do something about if you make it too
1:08:15 familiar, then why even bother making it?
1:08:18 Right.
1:08:19 If it's just like something that exists, like why even put the effort in?
1:08:22 If it's too strange, like, I don't know if anyone listening here used Google
1:08:26 wave back in 2009 or whatever it was.
1:08:29 I think that was like, it was too novel.
1:08:31 It was a great idea, but it was just like too strange.
1:08:34 You know, you got to hit the sweet spot there of being like novel enough.
1:08:37 So that it matters that it exists, but still have some familiarity.
1:08:40 So it's not totally like scary to try.
1:08:43 The other part I think is kind of important and fixable.
1:08:47 So again, kind of what I was talking about with Playbit, you make this app
1:08:51 and we just kind of cross compile it like, you know, the compilers is capable
1:08:55 of compiling to native code, right?
1:08:58 x86 or x64 and just like in an ELF executable.
1:09:01 I think you're kind of macOS.
1:09:02 app thing.
1:09:03 You just run it and you just zip it up and send it to a friend or whatever you want.
1:09:07 And then the other thing you get is a, is a folder with like an index
1:09:10 that HTML file that just contains like a web assembly version of this.
1:09:14 So our GPU API or like our graphics API is web GPU.
1:09:19 So you can do full compute, you can build some AI and train ML models and stuff on
1:09:23 this, you know, it's like you can really use the GPU through this, which is not
1:09:26 possible through WebGL, but there's no other levels, like, although we're using
1:09:30 the Linux kernel, it's kind of private as much Linux as Android is Linux.
1:09:35 So not a lot of it is Linux, but we do use the Linux kernel.
1:09:39 And so you could say, well, I can just use something like Vulkan to instruct my GPU.
1:09:45 And that's a possibility, but like in the ethos of some of what you and I have
1:09:49 been talking about before in Playbay, we want to like reduce the number of choices
1:09:54 that you have to make, and we want to be.
1:09:56 We want to be very careful about like what we sort of introduce
1:10:00 as like a choice or like a path.
1:10:03 And so we're starting with the only way you can draw things to
1:10:05 the screen is through web GPU.
1:10:08 That's it.
1:10:08 And so of course you got a full file system access and all that kind of stuff.
1:10:12 And when you're running something on the web, like we have a translation
1:10:15 layer, essentially something that, you know, it doesn't emulate a Linux kernel.
1:10:18 You don't have the full feature of, uh, of like a Linux kernel on the
1:10:21 web, because that would be too slow.
1:10:23 Instead we have sort of like a system layer.
1:10:25 System call, like layer that emulates that and translate that to the web platform.
1:10:30 And certain things are just not possible on the web, right?
1:10:33 So there's gotta be some sort of like limitations.
1:10:35 So is my understanding correct that you've drawn the, uh, analogy to Figma
1:10:41 where me and many others, um, I'm sure like first tried out Figma in the
1:10:47 browser were blown away from it, but, uh, by, by, but they would have never,
1:10:52 really bothered to install it in the first place, unless there was a really
1:10:56 good reason, but the web brought down the barrier to entry by so much that
1:11:01 this is where you fall in love with it.
1:11:03 And then when you use it more regularly, you install it actually
1:11:08 on your, on your real machine.
1:11:10 So is there like a similar.
1:11:11 two step process there to Playbit that maybe the first time you interact
1:11:16 with some Playbit apps is in the browser, but then the next big step of
1:11:20 commitment is not just downloading a desktop app, but, uh, actually like,
1:11:26 uh, flashing it on to your computer.
1:11:28 Is that sort of like the two steps?
1:11:31 Not quite.
1:11:31 I think we're a little bit more pragmatic or I believe we are at least.
1:11:35 So Playbit does, you know, I can boot it on hardware, but that's not our goal.
1:11:39 In five years, yes, you can just like put it on hardware, boot it on hardware.
1:11:44 We're maybe a month or so away from starting to, um, starting to open up for
1:11:49 like an early preview access to Playbit.
1:11:51 And the way that works is we have a Mac app and a Windows app.
1:11:55 Um, then you just like download and run like a video game and
1:11:58 the user runs full screen.
1:11:59 And it contains like a virtualization environment.
1:12:03 And so you basically a startup and it's just play a bit and you can use it as
1:12:06 like, you know, on your current computer, we're not asking you to like, get a second
1:12:09 hard drive and do installations and stuff.
1:12:11 None of that who wants to do that.
1:12:13 And so one way of thinking about it is like.
1:12:16 Another one, another way of thinking about it is like, uh, uh, a developer
1:12:20 tool or like an authoring environment, or even something like a fantasy console,
1:12:24 like peak weight or something like that.
1:12:25 Although Playbit is more, you know, as, as, as very different like aims and the.
1:12:31 Yeah, and the applications that you build, let's say you make like, I
1:12:34 don't know, a guest book, right?
1:12:36 Or something like that.
1:12:37 Like how, how does that work?
1:12:38 Sure.
1:12:38 We can make a GUI kit and that's fine.
1:12:41 It's a lot of work, but that's just one piece of the puzzle.
1:12:44 Like where are your messages stored, right?
1:12:46 How do you authenticate people?
1:12:47 Like all this kind of stuff.
1:12:48 And that's also part of playbits.
1:12:49 And so the whole operating system is like local-first from the foundation.
1:12:54 Early on, we explored, could we do like the thin terminal play, right?
1:12:59 Of like, we have a server somewhere.
1:13:01 That server actually runs the computer, we send a video signal
1:13:04 over, it turns out that doesn't work.
1:13:06 I mean, there's like two aspects of it.
1:13:08 We can talk more about it if you're curious, but the speed of light
1:13:11 is like pretty slow actually.
1:13:13 And the human cognitive center has like a limited, has some interesting features.
1:13:19 If you do this with like a, a video game pad, and if you use something like
1:13:23 PlayStation, the latency is actually quite high, even if the PlayStation is right in
1:13:26 front of you, like 100, 200 milliseconds.
1:13:29 And that's fine because like, we have this, you know, we have this kind
1:13:32 of coalescing, like Nagel algorithm, like thing in our brains that can,
1:13:36 you know, synchronize audio visual input and other sensory stuff.
1:13:39 Right.
1:13:39 To make that feel like it happened at the same time.
1:13:41 Although it didn't like someone clapping their hands.
1:13:43 Like we, we see the clap at the same time we hear it, but obviously we'll
1:13:48 technically we see it beforehand.
1:13:49 And so that ends up just like not working out the thin terminal thing.
1:13:52 And so, yeah, so Playbit works when you're offline.
1:13:56 And one of like the things that we really believe in is the software
1:14:00 should live for, for a long time.
1:14:02 So it's kind of an archivist mindset in a way.
1:14:05 And this is like a secondary thing.
1:14:06 And, and some features won't like work this way.
1:14:08 Yeah.
1:14:09 But we say you should be 50 years from now, Playbit might not exist anymore.
1:14:13 Maybe it's not developed anymore.
1:14:14 There are no servers online.
1:14:16 You should still be able to like boot up Playbit and do
1:14:19 something and get to your stuff.
1:14:20 If it's to like migrate it out of there, or if it's because you
1:14:23 want to continue using it, you That should always be possible.
1:14:26 So those are 2 of the 2 of the main drivers of why it's local-first.
1:14:30 And then the other part, when it comes to data is that it's also fully multiplayer.
1:14:33 So play with computer is this sort of like, it's essentially a virtual
1:14:36 machine that transcends your hardware.
1:14:39 And so it's because it's local-first we can synchronize it
1:14:41 across all the hardware, right?
1:14:42 And we can back it up on a central computer somewhere.
1:14:45 This is one of the things that wouldn't be available in, you know, a thousand years.
1:14:49 And that means like, if you know, if you lose your laptop, maybe
1:14:52 you drop it in the sea or someone steals it or something like that.
1:14:55 And you go and buy a new laptop and you sign into Playbit.
1:14:57 Everything is back there.
1:14:58 Like the window position, text selection that we talked about, like
1:15:01 Sublime I was speaking about before.
1:15:03 And that also means that you can, you can have many of these computers.
1:15:06 And so we have this concept of workspaces.
1:15:08 They're basically virtual machines.
1:15:09 And one of these computers you can share with your friends or with other people.
1:15:13 Yeah.
1:15:13 And then you have essentially like imagine Figma multiplayer, but like on
1:15:16 the operating system level and these facilities like this data syncing
1:15:20 facilities and stuff is available to, you know, as a first party API,
1:15:25 like for like application developers.
1:15:27 So you write your guest book, as I was talking about before.
1:15:30 Then you just put messages in there and authentication will be, you
1:15:34 know, maybe that's a problem that you have to solve, but everything else,
1:15:38 data storage is you just get that for free and it's just local-first.
1:15:42 And if Playbit is gone or the servers don't work, like your guestbook
1:15:46 will still work on your app.
1:15:47 Like, so it's not sort of bound to Playbit itself.
1:15:50 That is incredible.
1:15:51 I mean, I can't imagine a more audacious path forward and a foundation to build,
1:15:57 but, uh, the way how you've described it, uh, makes, uh, makes perfect sense.
1:16:02 you still get the benefits of the, the web in terms of distribution, but
1:16:08 you're leveraging the most powerful way of building web apps right now.
1:16:12 By leveraging web GPU, et cetera, taking care of all the data in a local-first
1:16:18 way and unlocking even more power by letting you use the, like the virtual
1:16:23 operating system there as a full blown native app on your given operating
1:16:28 system, hosting operating system at some point, like real operating system.
1:16:32 I love that progression and it already unlocks from, from
1:16:36 day one, a lot of utility.
1:16:38 So I can't wait to see what a Playbit app will, will feel like.
1:16:43 I'm also curious what it will both in terms of feel like
1:16:46 to use, but also to write.
1:16:49 Can you share a little bit more about, uh, the local-first aspects of what it
1:16:57 Local-First Data in Playbit
1:16:57 Yeah, we have, we have these like three types of data.
1:17:01 This is kind of in the conversation about like what, What information is there?
1:17:05 How do you like categorize information?
1:17:07 What guarantees and sort of like attributes does this
1:17:10 different information have?
1:17:11 Right.
1:17:11 So you have something like an email client.
1:17:13 Let's say we have like what email is currently being viewed.
1:17:16 What text is selected?
1:17:18 That's one type of information.
1:17:19 Another type of information is like.
1:17:21 What is in the email, what is written in the email, right?
1:17:23 Who sent it, which time was it sent?
1:17:26 And, uh, there's, there's other kinds of data too, but sort of like thinking
1:17:30 in this way, right now we can add a third type of data, sort of like
1:17:33 a very ephemeral, like imagine that there's a friend in there, so there's
1:17:36 a second cursor on the screen, like where the cursor is, who that is, like
1:17:39 that, that's another piece of data.
1:17:41 I think these like have different, you have different expectations about.
1:17:45 Where it is the synchronized hot, like what reliability of this is, what
1:17:49 the latency of this data is roughly speaking, like what's in the email,
1:17:54 what'd you expect there to be correct, but it can take a while to load.
1:17:58 I'm exaggerating here now, obviously everything should be correct
1:18:01 and be fast, but you gotta make trade offs the cursor, right?
1:18:06 It's sometimes you can drop a frame, so to speak, and it's not that important.
1:18:10 Right?
1:18:10 Like you can lose this information.
1:18:12 You don't have to cache it.
1:18:13 The information about like what's selected and like scroll positions
1:18:16 and stuff like that is, is things that can have lower integrity than sort
1:18:21 of like what's in the email, right?
1:18:23 And that information might, you might not want to share with others.
1:18:26 Right.
1:18:26 Like what's, what texts do I have selected?
1:18:28 Maybe that's something that shared in a different way.
1:18:30 Right.
1:18:31 Let's say you have two people looking at the same email.
1:18:33 Then if you shared the tick selection, like what does that even mean?
1:18:36 Right.
1:18:36 If I want to select something, I would change your tech selection.
1:18:39 That's kind of like weird.
1:18:40 So you've got to treat that differently.
1:18:41 So there are, there are different categories of data.
1:18:43 One thing.
1:18:44 So more concretely to your question, it's like when you write a Playbit app,
1:18:47 there is some of this information that's just handles for you automatically.
1:18:51 So things like the sort of scroll position and stuff like that.
1:18:56 All handles for you automatically, you can override any of that.
1:18:59 And if you wanted to manage your own scope position, of course you could, then
1:19:03 there's an API and we call this like game state because you know, often we talk
1:19:07 about, and we look at video games, because I think there's a lot more to learn there
1:19:10 than, uh, comparatively to utility apps.
1:19:13 So game state is essentially like the state that the program has
1:19:17 that's unique to the program.
1:19:18 And earlier in this episode, we talked a little bit about like, uh, like almost
1:19:22 impotence mismatch or a match between sort of like the, the fifth of your problem
1:19:27 and the database and stuff like that.
1:19:28 And so you have a similar problem here that, like, we, we could just
1:19:31 give you, like, I just like put things in a SQLite database and
1:19:35 they will automatically just like.
1:19:36 Be synchronized, right?
1:19:37 The problem is like, that's not possible.
1:19:39 That is not, not possible because like it's hard technologically.
1:19:42 That's just impossible because like a real life human level.
1:19:45 It's not possible, right?
1:19:46 We cannot possibly know.
1:19:47 And the same thing is true for like a file system.
1:19:49 We cannot possibly know what these like chunks of bytes mean without trying to
1:19:53 interpret them, in which case you're not on a file system level anymore.
1:19:56 But on a document level, and so to like, solve this problem,
1:20:00 we choose to not solve it.
1:20:02 And this that give you the tools to solve it yourself.
1:20:05 And so imagine that we, we make a game like a tic tac toe game
1:20:08 and we can play that together.
1:20:09 It has like, it has a, it's a turn based game, right?
1:20:12 So 1 and it's a 2 player game.
1:20:14 1 player is across the other 1.
1:20:16 It's like a circle.
1:20:17 And.
1:20:18 Let's say you start out and you do, you click somewhere, you can choose, right?
1:20:22 And then it's my turn.
1:20:24 And so now game state in this example is whose turn is it?
1:20:28 What sort of like what on, on this kind of like three by three
1:20:31 or nine by nine or whatever you end up doing on this game board.
1:20:35 Like, what is the state of that?
1:20:36 Which cells are empty?
1:20:37 Which are currently like filled?
1:20:39 What are they filled with?
1:20:40 Right.
1:20:40 And then you have conditions and this is not part of game state.
1:20:43 It's like.
1:20:44 Did someone win?
1:20:45 Like, Oh, who is leading?
1:20:47 Like, this is stuff you derive from the game state.
1:20:50 And the game state itself is essentially a key value store.
1:20:53 And on the key value store level, we give you the, we give you transactions.
1:20:58 And so if you say like, uh, change this to the, to that and change this to that, and
1:21:04 you can make up your own keys and values, we guarantee you that Those things are
1:21:10 merged with all the other clients with the same result within that one transaction.
1:21:15 So we give you this kind of like primitive, that is a key value
1:21:18 store with like CRDT transactions.
1:21:20 I don't know what to call them, but this is kind of like a notion of transaction.
1:21:24 And on that level and beyond that level, below that level, We as like,
1:21:28 we had all of the diffing and merging and syncing for you automatically.
1:21:31 Then of course we finally, we give you like a, the lowest level.
1:21:35 So the highest level is like, you don't use any of these things and
1:21:38 you get some limited multiplayer functionality and the scene graph of
1:21:42 the whole, like the whole desktop, if you will, is synchronized always.
1:21:45 And so that's the highest level.
1:21:46 That's the simplest thing.
1:21:47 You can write like a 20 line program that has some limited
1:21:50 multiplayer functionality.
1:21:51 And it's fine.
1:21:52 All the defaults in Playbit, like in our APIs, if you don't opt in for
1:21:56 something, you will get something that we think is a good default, right?
1:22:00 If you don't pass, if a function call has like a flags attribute
1:22:04 or argument, if you just pass zero for that, we will like, instead of
1:22:08 giving you a window, for example, sorry, this is a tangent in macOS.
1:22:11 If you say.
1:22:12 And this window, create a new window.
1:22:13 It's the API for creating a new window.
1:22:16 If you set flags to zero, like no special flags, you get a window that's useless.
1:22:21 You can't close it.
1:22:21 You can't resize it.
1:22:22 You can't like do much with it at all.
1:22:24 You can't even move it.
1:22:26 And so you have to like set certain flags to get the default window.
1:22:29 And, and it's kind of like folk knowledge.
1:22:31 You just know which flags to set and which flags not to set and the caveats.
1:22:36 In Playbit, we're trying to like have an ethos that is like, when you don't
1:22:39 opt in for something, you will get the thing that is that you probably want.
1:22:42 And yeah, so this goes for the data layer too.
1:22:44 And yeah, we'll see.
1:22:46 So you got these three kind of like, I want to start easy mode.
1:22:49 You just give me a thing.
1:22:50 It will be multiplayer.
1:22:51 It'll be pretty fine.
1:22:52 And then you say, actually, I want to like have my, the state of my app,
1:22:55 my game to be multiplayer so that two people can play tic tac toe together.
1:22:59 Then you use this like fairly straightforward, but still you
1:23:02 got to model your data now.
1:23:04 Um, like this database and then at the very lowest level, you get something
1:23:09 that is kind of like a socket, but we, we handle like encryption and you know,
1:23:13 the actual connectivity of it for you.
1:23:15 So you can say, give me a connection to the other instances of this app.
1:23:19 And now your app can, you'll send like arbitrary data if you want
1:23:22 to do something really like wild.
1:23:24 Right.
1:23:25 But now there's no different emerging.
1:23:26 It's, we just give you an ability to say, send bytes between, um, between
1:23:31 different like instances of your app now.
1:23:33 Got it.
1:23:33 So that's how, how data flows.
1:23:35 Um, I'm curious, what is the authoring experience for me as a developer?
1:23:40 Um, do I have to use like a certain programming language for that?
1:23:43 Can I choose between different programming languages?
1:23:46 Is there, can I bring some outside technologies, for example, something
1:23:50 like react, or is there sort of a bespoke way to do all of that?
1:23:55 You have to use our own flavor of Fortran.
1:23:58 That is backside.
1:23:59 You know, no, it's a, so.
1:24:01 Um, This is obviously an important thing.
1:24:03 I think that there are two paths that you can go.
1:24:05 You can either say, here's a blessed programming language, and this is what
1:24:08 you use, or you can say like, bring your own language, here's like a minimal API.
1:24:15 And I think the two like common examples of this is like on, uh, on iOS, you
1:24:21 got, I guess a little complicated.
1:24:23 Now you get Swift and Cocoa, but for a long time, you had just Objective C.
1:24:27 And if you want to write an app, you write an Objective C
1:24:30 and you use these libraries.
1:24:32 And there's some flexibility if you want to do something else,
1:24:34 but it's like pretty much zero.
1:24:35 And then you have something like BSD or Linux where you say there's a syscall.
1:24:39 It's essentially like a single function, uh, that's called syscall, which is
1:24:43 really just like a CPU instruction, but it's a syscall and you give it a number
1:24:47 and the first number represents like the thing you want to do, like open a file,
1:24:50 close a file, read some bytes, right?
1:24:52 And then you give it some number and it's a fixed number of things you
1:24:55 can give it arguments essentially.
1:24:56 And that's the entire API surface.
1:24:58 This is one function to your entire computer.
1:25:01 So these are two extremes and with Playbit, we're closer to the second,
1:25:05 because that gives you the flexibility of if you want to use Python or Node.
1:25:08 js or BUN, you could do that.
1:25:11 And I think that's important.
1:25:12 Some people have opinions about this.
1:25:14 So Playbit has a C A B I and B as in, as in Bob, as a binary interface,
1:25:20 basically any programming language today can interface with a C A B I.
1:25:25 It doesn't mean you have to write it and see the developer
1:25:27 experience currently in Playbit.
1:25:28 And so, you know, Playbit does exist and we use it day to day and we
1:25:32 develop Playbit inside of Playbit.
1:25:34 It's kind of weird sometimes is we got something that's a little bit like
1:25:37 Xcode, something that's a little bit like developer tools, like on the OS level.
1:25:41 And so in our version of the finder or windows file explorer, there's
1:25:47 a button called new app and you can click this and like a new app is just
1:25:50 made for you and it's called like, you know, new app that app and inside it,
1:25:54 like, you know, there's a main dot C because we got a C compiler and system.
1:25:57 So it's main dot C and it's already ready for you.
1:26:00 And when you, when you create a new app, there's another toolbar
1:26:03 button, like in the file browser, this says build and run it, click
1:26:06 build and run and your app starts up.
1:26:09 And there's, you don't need to use terminals or anything like that.
1:26:12 You got standard out and standard error.
1:26:14 You can get those kinds of things like in, in a more friendly sort of developer log.
1:26:18 We have an inkling to this now, but there's also a couple of
1:26:21 ways to like, look at the dom.
1:26:23 So we have the scene graph that your app has, right?
1:26:25 You can inspect that.
1:26:26 You can inspect actually the scene graph of the entire desktop if you wanted to.
1:26:30 So that, you know, this opens up some very interesting things
1:26:33 for accessibility, for example.
1:26:34 But anyhow, so the developer experience is very much like, it's very like
1:26:38 straightforward, very lightweight, very opinionated right now.
1:26:41 So again, you click, you click a button to just create a new app.
1:26:44 And you can just rename it by changing the folder name.
1:26:46 And if you don't want to even open a text editor, you just click the
1:26:50 building ride button, which is the same place your app is built and is run.
1:26:54 And it takes like a couple of milliseconds.
1:26:56 And now you can just like, and it's just going to say, hello world.
1:27:00 It's just a window that opens hello world.
1:27:02 And it has closed buttons, you know, it's very basic.
1:27:05 And what you can do now is that you can open the source file.
1:27:07 In the text editor, it's only in graphical environments.
1:27:10 And now you can, you can change them, right?
1:27:13 You can change, for example, like where it says hello world to
1:27:15 say, you know, hello, Johannes.
1:27:18 And then you hit build and run again.
1:27:19 And now like it restarts and says, hello, Johannes.
1:27:22 And then, you know, there's some generated documentation for the API.
1:27:26 There's functions, of course, for, you know, we've got.
1:27:28 Grid functions, all of the kind of really gooey things you might expect,
1:27:31 you know, pop up menus and scroll bars and radio buttons and all of that stuff.
1:27:35 And if you want to bring in libraries and stuff, you can do that.
1:27:38 And if you wanted to use Python instead, then you will call these
1:27:41 functions through the C ABI and FFI functions in Python, right?
1:27:44 So that's kind of like the, currently the developer story in PlayBit.
1:27:48 That makes sense.
1:27:49 So you've like laid out the absolute foundation and that allows for a lot
1:27:54 of layers, optional layers to be built on top where you want to follow like
1:27:59 a certain flavor of app development.
1:28:01 And I think that also allows an ecosystem to be built around PlayBit.
1:28:07 But I think the new level of primitives and the, this new, um, More like
1:28:12 2024 foundation that you're laying where you get things that are, that
1:28:17 was probably shareable by default, that's collaborative by default.
1:28:20 So, uh, a lot of the local-first aspects, what makes local-first software
1:28:25 great, having that be baked into the foundations of an operating system.
1:28:30 Uh, that is not something I would have expected in 2024 to
1:28:33 already exist, maybe rather 2040.
1:28:37 So you make me feel like living in the future.
1:28:41 But I got to say, I think that there, it's almost a logical conclusion
1:28:44 when I'm going to come to here.
1:28:45 But I think, first off, I want to say, I think, I think of
1:28:47 Playbit as being a platform.
1:28:50 I think it's very interesting to talk about, like, what is an OS?
1:28:53 Like, what is a platform?
1:28:54 We've been talking about the web a lot today for really good reasons.
1:28:57 And the web to me kind of smells like an operating system, you know,
1:29:00 in a way, and it is a platform.
1:29:03 And I think Playbit similarly, although it is like, technically
1:29:05 speaking, a real operating system, you know, it's like manages memory
1:29:08 and hardware and all of that stuff.
1:29:10 I think, or I hope at least it also can become the platform.
1:29:13 That has a primary environment, which is, you know, its own OS and a
1:29:18 secondary environment, which is like other systems, like the web, right?
1:29:23 Other platforms.
1:29:24 And the logical confusion I was mentioning, thinking about what,
1:29:27 what does a platform OS do?
1:29:30 Why, why does it exist?
1:29:31 Why do we have them?
1:29:32 Historically and an operating system does really is two things, right?
1:29:36 One, it abstracts the hardware.
1:29:38 It used to be so.
1:29:39 That if you want it to write the disc, you would have to like write the disc.
1:29:43 You have to have different code depending on the specific hardware
1:29:46 you're writing, which is kind of insane.
1:29:47 But that's how it was.
1:29:48 And then someone was like, Hey, what, what if we have like a layer in between?
1:29:51 So like you say, right to hard disk a or hard disk B and you use
1:29:57 the same like function calls, even if this is like a, you know, a
1:30:01 hard disk from this manufacturer, if it's like a floppy disk drive.
1:30:04 Right.
1:30:05 And that is like, Those are like drivers or whatever.
1:30:08 That is like one important role that OS serves.
1:30:11 the other category, it's very interesting.
1:30:13 It's like the OS then needs to provide services for like the
1:30:16 tools that run on top of it.
1:30:18 And this is where I think we as like, we as kind of like set back in our
1:30:22 chairs, you know, in, in like the late nineties and said, Oh, we're done.
1:30:26 You know, I mean, iOS is like built on macOS, which is built on next, which is
1:30:30 built in the eighties and we have windows, which like still has like some parts in
1:30:34 it that are from, you know, the nineties or maybe even further back than that.
1:30:38 And so a lot of these OS's that we use today, and even like the windowing,
1:30:41 like the compositing windowing system is sort of like an ancient idea, right.
1:30:45 Of like, that comes from like X11 and stuff like that, or, you know, even
1:30:49 earlier stuff, of course, X11 was not the first, but, you know, you have a window.
1:30:54 And you have a window and these are two like bitmaps or
1:30:57 textures, if in GPX or either.
1:30:59 And each window is like a process or whatever you want to call it.
1:31:02 And they like use the same library code to draw the same button into their bitmaps.
1:31:06 And then on the desktop, you put these bitmaps together and
1:31:09 that's how you have windows.
1:31:10 I was like, gee, the huge problem with this is that how do you like
1:31:13 introspect what's on the desktop?
1:31:14 How do you do things like accessibility?
1:31:16 How do you, how do you like, uh, debug something that goes wrong?
1:31:19 That crosses the boundary of two windows.
1:31:22 Like you, it becomes really hard and you end up with this like really weird
1:31:26 patched on things at the, at the end.
1:31:28 And so I think that the services argument, right?
1:31:31 Like then we think about, so why is it so that today you look at someone who
1:31:36 used a Mac book And what apps do you use?
1:31:38 These are web apps that they use.
1:31:40 They are not native apps, but they have this like Mac OS running there.
1:31:43 Why aren't there Mac OS apps?
1:31:44 I think it's because Mac OS doesn't provide the things
1:31:46 that people want, right?
1:31:48 Developers want.
1:31:49 I want to be able to just like fetch the thing from the network, right?
1:31:51 I can do that one line of code in JavaScript or like a fucking million
1:31:55 lines, excuse my French, of codes in, in like a Mac OS native, right?
1:32:00 There's just like a, there's a mismatch between the services that an OS provides.
1:32:04 Another thing is like, like payments or like subscriptions
1:32:07 or whatever, like revenue.
1:32:08 Let's say that I read a little thing.
1:32:10 And it's a hobby thing.
1:32:11 I can't spend too much like time slash money on it, but I still spend
1:32:15 a lot of like my time and money on it.
1:32:16 Right.
1:32:17 Even if it's like, you know, five hours a week and now I'm going
1:32:20 to ask people who really like it.
1:32:22 It's kind of the shareware model.
1:32:23 So like, give me a dollar, like a month, if they like this
1:32:26 thing or just like one time.
1:32:27 And obviously I'm not like pitching anything novel here, like the, you know,
1:32:32 Apple app stores are very successful and everything else that comes after it.
1:32:36 But the problem with that is that it is sort of like a monolith.
1:32:39 It's this sort of like it's in the planet Apple.
1:32:41 First off, if you want this to work on other platforms, like
1:32:44 you can't, it's iOS or nothing.
1:32:46 And if you want to market this somewhere else where you really can't, it's in
1:32:49 the app store or nowhere else, and you have to build it specifically for them.
1:32:53 And there's all of this, this whole list of cabinets is basically
1:32:55 like there's a little bubble, you can put it in the bubble.
1:32:58 If you don't want it to be in the bubble, you're on your own.
1:33:00 You got to Do a Stripe integration or something that's going to take
1:33:03 you a lot more time than you have.
1:33:05 And so I think that there's a lot of hobby developers out there who make
1:33:09 something truly valuable who will just like, just pass on it, right?
1:33:13 They will just pass on the revenue they could get because it's
1:33:15 just like not worth building it.
1:33:17 So that's just one example.
1:33:19 Uh, multipliers we were talking about is another example, like data syncing,
1:33:22 all of these things that like the OSS that we use today, they just don't
1:33:26 provide But the web platform does.
1:33:28 So we moved to the web platform instead.
1:33:29 Yeah.
1:33:30 I love that, that vision.
1:33:31 Uh, and, and so I've mentioned before that I am trying to build the best
1:33:36 of both worlds for like embracing the web, still making the app feel native
1:33:40 and, uh, the app also following the local-first ideals as much as possible.
1:33:45 This is really, uh, building an app on the hard mode compared
1:33:49 to how you build other apps.
1:33:50 So.
1:33:51 Um, chasing that quality, et cetera, but it's so hard.
1:33:55 Um, and this is where in the future, where I can just build Overtone on top
1:34:01 of Playbit, this is where I can put all of my effort on making the, like spending
1:34:06 the quality on like even, even more higher leverage things, and you've been taking
1:34:12 care of like the tough foundation that the app is collaborative by default, that it
1:34:17 feels more, gives me better primitives.
1:34:19 The app feels native where, depending on where it's running, whether it's
1:34:23 running in the browser or whether it's running on, on someone's
1:34:27 more, more native environment.
1:34:29 So I'm really looking forward to that future.
1:34:31 I have one tangent question.
1:34:33 Uh, you've been mentioning that you're developing Playbit inside of Playbit.
1:34:39 Looking at this from a similar lens, I'm very curious whether you can already
1:34:43 have a browser running inside of Playbit and then open a Playbit environment
1:34:48 within the browser running Playbit.
1:34:53 Oh, we don't have a web browser yet.
1:34:57 If there's anyone out there who wants to join us, I mean, play, but it's
1:35:00 like a venture backed company, like, you know, we can pay you a salary.
1:35:03 It's like a real job.
1:35:05 If you want to come work with us and, you know, put Chrome or Firefox
1:35:08 in play, but yeah, hit me up.
1:35:11 Or if you want to work on like GPU stuff or the Linux kernel, we
1:35:16 are looking to hire a few people.
1:35:17 So yeah, there's no web browser yet.
1:35:19 It will, it will be a mind band.
1:35:20 Yeah.
1:35:21 To like run it inside a web browser, because then you can keep going.
1:35:23 It's like you take a video camera connected to a TV and you point
1:35:27 it at the TV, you know, you got this like, Infinity mirror effect.
1:35:31 Yeah.
1:35:31 That's kind of fun.
1:35:32 Uh, exactly.
1:35:33 That's what I had in mind, or I think you get the same when you like use like Google
1:35:37 meet or something or whatever it's called these days, but yeah, I would like take
1:35:41 up that, that job offer opportunity in a, in an instant, if I had the background
1:35:47 that fits it and If I wasn't already knee deep in all sorts of other things, but
1:35:52 I'm sure there, there will be someone out there who is the perfect fit and
1:35:56 I'm sure that's an amazing opportunity.
1:35:59 So before wrapping up, you're all, you're not just building such
1:36:03 an ambitious startup, but you're also about to become a father.
1:36:07 So I'm very curious, uh, from a personal perspective, like
1:36:11 how are you navigating that?
1:36:13 How do you balance going after such an, such an ambitious project, uh,
1:36:22 Passion and Finding Balance
1:36:22 I think I've just got a bit of perspective of what I think it's like important.
1:36:26 And less important, the more important and worth spending time on.
1:36:29 Like earlier in my life, there was one point where I found myself like
1:36:33 in a heart intensive care, minutes away from like dying because I wasn't
1:36:39 sleeping and I was working all the time.
1:36:41 And it was like an absolutely insane lifestyle.
1:36:43 You know, I would be partying and I would sleep like basically three hours
1:36:47 a night and have two jobs and party.
1:36:49 And you know, one day my body almost like give up and it was died.
1:36:53 And that was like a pretty good wake up call.
1:36:55 But that didn't fix it.
1:36:56 I was still like insane.
1:36:57 And so this was before I joined Spotify and it's Spotify.
1:37:01 I, you know, I was, I ran the whole design department for four years alone.
1:37:06 So, you know, I would do marketing stuff and all of the UI and everything.
1:37:10 You just one person, right?
1:37:11 There's no other designers.
1:37:13 It was absolutely insane.
1:37:14 And I didn't know better.
1:37:15 And I worked all the time.
1:37:17 And I mean, like basically 24, 7, 4.
1:37:20 The first, like, year or 2 and, you know, I paid like a pretty heavy price
1:37:25 from both of these experiences and it's, you know, just like a waves on a
1:37:29 body of water, you know, the cost and effect, there's a quite a bit of delay.
1:37:34 And so I started to realize that.
1:37:36 You know, what the costs have been and losing, you know, friends and, and losing
1:37:41 out on like social events and, you know, losing my girlfriend and like, yeah, it's
1:37:46 losing a lot of things, losing health and, you know, all of this kind of stuff.
1:37:50 And anyhow, so that, that was a long time ago, you know, that was like mid 2000s.
1:37:54 And now I think that work is like, yes, it's a part of life.
1:37:58 And if you're lucky.
1:38:00 You'll find something to work on that creates a passion in you know, when
1:38:04 in the morning you wake up and you think about it in like a good way.
1:38:07 If in like, I gotta get make a cup of coffee and like get jump into this layer.
1:38:13 That thing I think that is like.
1:38:15 All one can wish for when it comes to like work that is like the,
1:38:19 if you, if you get to the level, you're like, you've made it right.
1:38:22 If sure, if you, if you still need to make money, that's another
1:38:25 problem, but like beyond, beyond that and then everything else in life.
1:38:28 So I think as I just have this philosophy that like work is important and it's about
1:38:33 passion, you know, if you can make it so, and with play a bit specifically, and I
1:38:38 made it very clear to everyone involved in play a bit from like day one that.
1:38:43 This is something that will be done on, uh, like, uh, on a balance.
1:38:47 This is not a, I'm going to give up like five years of my
1:38:50 life just to make this happen.
1:38:51 This is not like a, I'm going to like get rid of my friends
1:38:55 because it's more important.
1:38:56 And so, you know, starting a family and like moving and having hobbies outside
1:39:00 of work is like an explicit goal.
1:39:03 And it's the same with true for like our employees that there
1:39:06 are no expectations to work.
1:39:08 Outside of working hours and compensation does not happen on a time basis.
1:39:12 Not like if you work four hours, you make more than if you work two hours.
1:39:16 I think that model is just fundamentally incompatible with this mindset.
1:39:19 And that also goes to like, you know, we don't really have sort
1:39:22 of like milestones or, or, uh, measurements of like how we're doing.
1:39:26 It's more like we have a roadmap and we build things toward it.
1:39:30 And we have different areas of responsibility.
1:39:33 How well we are doing is measured in like the actual product.
1:39:36 Like, can it do the thing, right?
1:39:38 Have we done the thing that we said we were going to do?
1:39:40 Like, if, if not, we're not doing well and we got to figure something out.
1:39:44 If it does, we're doing well and let's keep doing it.
1:39:46 Exactly.
1:39:47 And if you have that passion, like getting up in the morning, being super
1:39:50 pumped about doing that, that is the, that's the best fuel to get there.
1:39:54 Probably even more efficiently than if you'd have like the best
1:39:58 product managers who figure out every, every step along the way.
1:40:02 I think that's right.
1:40:03 And I think it's like, it's, it's such a nice kernel of an idea, but to build
1:40:07 things around, like you think about, okay, now, how do you, how do you create that?
1:40:11 Or how do you maintain it?
1:40:11 If you have created it, I think that's really hard.
1:40:14 And it's a lot of work to make that happen.
1:40:15 Right.
1:40:16 For once, if you, let's say you like to eat pizza, if you eat pizza
1:40:19 every day, pretty soon, you're not going to like pizza anymore.
1:40:22 Right.
1:40:23 And so like, if you work on the thing that you're really passionate
1:40:25 about, like, Unhinged like totally all the time, very quickly.
1:40:29 Will you like burn out or whatever you want to call it?
1:40:31 It's not going to be fun anymore.
1:40:32 So you lose it.
1:40:33 If you don't get to exercise what you're excited about, it will like wane away.
1:40:38 Right.
1:40:39 So there's like more dimensions to it.
1:40:41 Managing that I think suddenly becomes done an effort.
1:40:44 It's not like we're working less.
1:40:45 We're just working hard on different things.
1:40:47 Right.
1:40:48 And so like, you know, the way we work now, sometimes maybe someone like feels
1:40:52 like tired a day or like feels like they have a cold or something like that.
1:40:56 Yeah.
1:40:56 You just don't work that day, just take the day off or, or it feels like,
1:41:00 Oh God, I've been like, we're, we have this like memory corruption bug.
1:41:03 Uh, we weren't sure.
1:41:04 Is it in the kernel?
1:41:05 Is it in the compiler?
1:41:07 Is it, there was this thing that was lasting for two weeks and we
1:41:09 were like, okay, we just got it.
1:41:11 We need to take like two days off and just like, I don't know, read a book, look
1:41:15 at a tree, play a video game, whatever.
1:41:18 And came back to it and, you know, we, we, we found it.
1:41:21 And so I think like, you know, part of this is also taking like a break when
1:41:26 you're like, you know, uh, climbing a mountain and it's like really hard.
1:41:29 You need to take a break.
1:41:30 Otherwise you're just going to overextend yourself and fall down.
1:41:33 Yeah.
1:41:33 And, but I think it's like similar to food.
1:41:36 It's not just like that besides pizza, everything tastes bad, but there's
1:41:41 plenty of other good things that taste really well and you can, you can just
1:41:46 Choose and like cycle between them.
1:41:48 And I think this also shows in your portfolio work, you've not just tackled
1:41:53 super hard data problems or, uh, or performance problems, but you also took
1:41:58 like more scenic routes, creating one of the most popular fonts out there, enter.
1:42:03 And, uh, for, for me, I can, can totally see how just switching a
1:42:08 little bit of, between those different things can be really re energizing.
1:42:12 And I love that mindset and that, that balance that you're striking for.
1:42:17 And I think that is, is very on brand for, for Playbit that
1:42:22 it should be fun and playful.
1:42:24 Yeah.
1:42:25 Life is really short.
1:42:26 It's much shorter than we think.
1:42:27 And we usually don't realize how short it is until we lose something.
1:42:31 You know, like a family member or health or whatever it is.
1:42:35 So I think it's never a bad idea to reiterate that like life really is short.
1:42:38 And the one thing we all have the same amount of is time, right?
1:42:42 That's, I think that's like your body and your time are your
1:42:48 Outro
1:42:48 Right?
1:42:48 Well, thank you so much for making the limited time that we have more joyful.
1:42:53 by great software and, uh, thank you so much for taking this huge amount of
1:42:58 time today out of your day, uh, to share all of those stories on the podcast.
1:43:02 Thank you so much.
1:43:03 Thank you so much, Johannes.
1:43:05 This was super fun.
1:43:06 I love just talking about these things with you.
1:43:08 If it's on a podcast or over a cup of coffee, and I hope we can
1:43:10 do more of this in the future.
1:43:12 Awesome.
1:43:12 I couldn't agree more.
1:43:14 Take care.
1:43:15 Thank you.
1:43:15 Bye.
1:43:17 Thank you for listening to the localfirst.fm podcast.
1:43:19 If you've enjoyed this episode and haven't done so already, please subscribe and
1:43:23 leave a review wherever you're listening.
1:43:25 Please also tell your friends about it.
1:43:27 If you think they could be interested in local-first, if you have feedback,
1:43:30 questions or ideas for the podcast, please get in touch via hello at
1:43:34 localfirst.fm or use the feedback form on our website, special thanks to Expo and
1:43:40 Crab Nebula for supporting this podcast.