1 00:00:00,046 --> 00:00:02,336 And so it's because it's local-first, we can synchronize 2 00:00:02,356 --> 00:00:03,676 it across all the hardware, right? 3 00:00:03,706 --> 00:00:06,336 And we can back it up on a central computer somewhere. 4 00:00:06,531 --> 00:00:08,931 And that means if you lose your laptop you go and buy a new 5 00:00:08,931 --> 00:00:10,591 laptop and you sign into Playbit. 6 00:00:10,871 --> 00:00:11,821 Everything is back there. 7 00:00:12,021 --> 00:00:14,091 Like the window position, text selection. 8 00:00:14,241 --> 00:00:16,781 And that also means that you can have many of these computers. 9 00:00:16,821 --> 00:00:20,101 And so we have this concept of workspaces, they're basically virtual machines. 10 00:00:20,501 --> 00:00:23,761 And one of these computers you can share with your friends or with other people. 11 00:00:23,761 --> 00:00:23,821 Yeah. 12 00:00:24,001 --> 00:00:26,611 And then you have essentially Figma multiplayer, but like on the 13 00:00:26,611 --> 00:00:30,111 operating system level and these facilities like this data syncing is 14 00:00:30,111 --> 00:00:34,251 available , as a first party API, like for application developers. 15 00:00:34,658 --> 00:00:36,808 Welcome to the local-first FM podcast. 16 00:00:37,098 --> 00:00:39,958 I'm your host, Johannes Schickling, and I'm a web developer, a 17 00:00:39,958 --> 00:00:43,018 startup founder, and love the craft of software engineering. 18 00:00:43,508 --> 00:00:47,108 For the past few years, I've been on a journey to build a modern, high quality 19 00:00:47,108 --> 00:00:48,778 music app using web technologies. 20 00:00:49,213 --> 00:00:53,123 And in doing so, I've been falling down the rabbit hole of local-first software. 21 00:00:53,563 --> 00:00:56,583 This podcast is your invitation to join me in the journey. 22 00:00:57,073 --> 00:01:00,823 In this episode, I'm speaking to Rasmus Andersen, who helped to build 23 00:01:00,883 --> 00:01:05,103 many monumental products, such as Spotify, Dropbox, and Figma, and is 24 00:01:05,113 --> 00:01:09,423 now working on Playbit, a local-first operating system built from scratch. 25 00:01:10,013 --> 00:01:14,333 In this extended conversation, we go deep on software quality, the trade offs of 26 00:01:14,333 --> 00:01:17,953 different data models, and the importance of the web for modern applications. 27 00:01:18,973 --> 00:01:22,083 Before getting started, also a big thank you to Expo and Crab 28 00:01:22,083 --> 00:01:23,913 Nebula for supporting this podcast. 29 00:01:24,463 --> 00:01:26,403 And now my interview with Rasmus. 30 00:01:27,322 --> 00:01:29,772 Hey Rasmus, so nice to have you on the show. 31 00:01:29,792 --> 00:01:30,422 How are you doing? 32 00:01:31,182 --> 00:01:32,732 Hey Johannes, good to be here. 33 00:01:32,732 --> 00:01:33,582 I'm doing well. 34 00:01:33,732 --> 00:01:34,772 How are you doing yourself? 35 00:01:35,202 --> 00:01:36,012 I'm doing great. 36 00:01:36,072 --> 00:01:38,012 I couldn't be more excited to have you on the show. 37 00:01:38,312 --> 00:01:43,282 I'm like a huge fan of so many products that you've worked on in the past. 38 00:01:43,602 --> 00:01:45,782 So really delighted to have you on the show. 39 00:01:46,052 --> 00:01:49,602 But for folks who don't know you, uh, could you give a quick 40 00:01:49,632 --> 00:01:52,132 background on what led you to today? 41 00:01:53,407 --> 00:01:54,057 Sure. 42 00:01:54,137 --> 00:01:54,567 Oh, God. 43 00:01:54,577 --> 00:01:55,647 What led me to today? 44 00:01:55,647 --> 00:01:57,427 It's almost like we should go backwards. 45 00:01:57,557 --> 00:02:01,497 I think I've found myself through various ways working on local-first 46 00:02:01,517 --> 00:02:03,147 software for quite a while. 47 00:02:03,557 --> 00:02:07,257 And we didn't really have vocabulary for it until pretty recently. 48 00:02:07,857 --> 00:02:11,197 And so in the last couple of years, as you know, yourself, 49 00:02:11,227 --> 00:02:13,697 and Ink & Switch, you know, uh. 50 00:02:13,797 --> 00:02:15,477 Adam and Muse and so on. 51 00:02:15,487 --> 00:02:18,217 There's, there's like a whole group of people who have sort of like 52 00:02:18,227 --> 00:02:21,287 started questioning, you know, like, is this way we're building things? 53 00:02:21,287 --> 00:02:23,507 Is this, this is sound, this is like healthy? 54 00:02:23,567 --> 00:02:27,057 And sort of the idea of local-first kind of grow out is to become 55 00:02:27,057 --> 00:02:30,637 more of a vocabulary as well as sort of like the sort of handmade 56 00:02:30,647 --> 00:02:31,887 movement and stuff like that. 57 00:02:32,057 --> 00:02:35,107 I've started realizing that these were values that I've had for a 58 00:02:35,107 --> 00:02:36,947 long time, but I wasn't aware of. 59 00:02:37,247 --> 00:02:43,007 I started programming when I was a kid and I had my first job as a designer at 60 00:02:43,007 --> 00:02:45,747 an automotive company when I was like 15. 61 00:02:45,747 --> 00:02:47,097 I think it was something like that. 62 00:02:47,387 --> 00:02:52,127 I started my own company when I was 17, maybe something, 63 00:02:52,157 --> 00:02:53,087 perhaps something like that. 64 00:02:53,347 --> 00:02:56,137 So, you know, very early in my life, I started working and I, 65 00:02:56,137 --> 00:03:00,027 you know, I skipped video games and I got gotten into those later. 66 00:03:00,027 --> 00:03:00,457 Don't worry. 67 00:03:00,817 --> 00:03:01,462 Um, but yeah. 68 00:03:01,932 --> 00:03:06,602 But yeah, so, uh, here I am, you know, a couple, a couple of years later. 69 00:03:07,252 --> 00:03:08,012 That's awesome. 70 00:03:08,022 --> 00:03:11,362 Well, you're, you're very, uh, humbly skipping a whole bunch 71 00:03:11,362 --> 00:03:15,522 of really monumental chapters where you've like helped to start 72 00:03:15,522 --> 00:03:18,142 Spotify as a first designer there. 73 00:03:18,142 --> 00:03:21,662 And like, built a lot of the foundation there and later also worked at 74 00:03:21,682 --> 00:03:23,792 the Figma and Facebook, et cetera. 75 00:03:24,072 --> 00:03:27,202 So I'm really curious to learn more about those chapters. 76 00:03:27,542 --> 00:03:30,562 As you've already mentioned, I think you've already been on a path 77 00:03:30,612 --> 00:03:35,192 to build local-first software way before the local-first essay was 78 00:03:35,202 --> 00:03:39,407 out there, but you still arrived at many, uh, Um, similar conclusions. 79 00:03:39,637 --> 00:03:43,917 So maybe starting with Spotify, as there is also this really interesting 80 00:03:43,917 --> 00:03:49,077 parallel to me working on Overtone, not trying to suggest I'm anywhere 81 00:03:49,327 --> 00:03:55,517 close to your level of polish with your work, but I'm certainly trying to 82 00:03:55,727 --> 00:03:57,457 follow a bit in the, in your footsteps. 83 00:03:57,817 --> 00:03:58,707 So I'm curious. 84 00:03:59,167 --> 00:04:02,917 How you've thought about building Spotify back in the days and how 85 00:04:02,917 --> 00:04:06,987 you've arrived eventually on sort of like local-first ish paths. 86 00:04:07,307 --> 00:04:08,507 That's a great question. 87 00:04:08,887 --> 00:04:12,027 And before answering that, I got to say, I think what you've got so far with 88 00:04:12,087 --> 00:04:19,097 Overtone is like better, higher quality than what Spotify is today, but anyhow, 89 00:04:19,157 --> 00:04:20,977 that's a slightly different conversation. 90 00:04:21,177 --> 00:04:24,777 I don't think you should sort of like undersell what you've created yourself. 91 00:04:25,027 --> 00:04:25,827 I appreciate it. 92 00:04:26,407 --> 00:04:32,157 Spotify came about in a time when the technological constraints pretty 93 00:04:32,157 --> 00:04:35,967 much forced us to a decentralized sort of local-first model. 94 00:04:36,327 --> 00:04:39,227 And so Spotify started in 2006. 95 00:04:39,407 --> 00:04:40,777 This is when we started working on it. 96 00:04:41,187 --> 00:04:42,377 The web platform. 97 00:04:42,377 --> 00:04:46,427 And I think that what is, what has been in historically and still is today amazing 98 00:04:46,437 --> 00:04:48,117 about the web platform is distribution. 99 00:04:48,517 --> 00:04:52,937 And so, you know, that wasn't lost on us at that point either, but it was just 100 00:04:52,937 --> 00:04:56,337 like, none of the technology was really there to support something like Spotify. 101 00:04:56,622 --> 00:04:59,612 And so, you know, we built a, it's like a fully native thing. 102 00:04:59,612 --> 00:05:04,952 You know, we built a native Windows app, a native like Mac app, Android apps. 103 00:05:04,952 --> 00:05:07,402 There's a long list of native apps that we built. 104 00:05:07,512 --> 00:05:13,452 You know, we had a NAT hole punching traversal stuff, things 105 00:05:13,452 --> 00:05:17,062 way above my head of, you know, like getting through firewalls to 106 00:05:17,062 --> 00:05:18,652 implement our peer to peer system. 107 00:05:18,652 --> 00:05:22,052 And there was like, you know, this parity stream model where you can get 108 00:05:22,257 --> 00:05:26,087 Like different pieces of data to fill your cache was very, very complicated. 109 00:05:26,237 --> 00:05:26,587 Right. 110 00:05:27,027 --> 00:05:32,357 I would say that 90 percent of the complexity of, of the Spotify client and 111 00:05:32,357 --> 00:05:38,077 even the server side was due to the fact that it was local-first and that evolved 112 00:05:38,077 --> 00:05:41,767 over a long time and there's, there were many revisions, like kind of major 113 00:05:41,767 --> 00:05:46,747 revisions to the way, uh, they implement and solve these problems at Spotify. 114 00:05:47,047 --> 00:05:47,787 That's awesome. 115 00:05:47,807 --> 00:05:48,077 Yeah. 116 00:05:48,077 --> 00:05:49,247 And I think there. 117 00:05:49,517 --> 00:05:53,297 Since then it's slowly but surely degraded a little bit from its 118 00:05:53,507 --> 00:05:58,537 local-first origins and slowly, but surely also being visible in the app, 119 00:05:58,537 --> 00:06:00,487 becoming a bit slower, et cetera. 120 00:06:00,777 --> 00:06:06,497 But I guess that's the price you have to pay as the company grows larger. 121 00:06:06,631 --> 00:06:11,251 But so after Spotify, you worked at Facebook and also at Figma. 122 00:06:11,641 --> 00:06:16,141 And I think there you've worked on some aspects of the products that where you've 123 00:06:16,151 --> 00:06:21,421 also arrived on some similar data models and data paths if you look at it from 124 00:06:21,421 --> 00:06:23,961 a certain angle, look like local-first. 125 00:06:24,191 --> 00:06:26,071 So can you share a little bit more about that? 126 00:06:26,436 --> 00:06:27,176 Yeah, sure. 127 00:06:27,296 --> 00:06:30,276 When I was at Facebook, I led this like OS project that they had. 128 00:06:30,276 --> 00:06:33,416 And we never shipped it, but you know, that's kind of in line with 129 00:06:33,956 --> 00:06:36,296 right now I'm working on an OS, so that's kind of interesting. 130 00:06:36,656 --> 00:06:40,486 And that, you know, after a year of that, it kind of ended up not 131 00:06:40,496 --> 00:06:41,986 leading to where we wanted it to be. 132 00:06:42,186 --> 00:06:45,836 And I worked on Facebook messenger, which it was in a 133 00:06:45,836 --> 00:06:48,781 company that had been acquired, not long before I worked on this. 134 00:06:48,781 --> 00:06:52,141 And this is like, I think early 2012, something like that. 135 00:06:52,221 --> 00:06:56,801 And the team that they came with sort of the acquisition of the product that, you 136 00:06:56,801 --> 00:07:00,584 know, later on underpin Facebook chat, but these were like two things technically 137 00:07:00,604 --> 00:07:02,674 for a while was kind of local-first. 138 00:07:02,694 --> 00:07:05,804 And I think it had to be for similar reasons that an email 139 00:07:05,804 --> 00:07:07,144 client has to be local-first. 140 00:07:07,164 --> 00:07:10,474 And so it was iOS technically very limited platform at the time. 141 00:07:10,604 --> 00:07:12,044 That was kind of interesting to see. 142 00:07:12,144 --> 00:07:13,044 Did I have to work? 143 00:07:13,294 --> 00:07:17,874 Upwork and GraphQL together with, uh, Lee Byron, Nick Schrock, Dan Schaefer. 144 00:07:18,274 --> 00:07:19,554 And that was really interesting. 145 00:07:20,044 --> 00:07:24,094 So, you know, I started out like a year of, as a designer at Facebook, and then 146 00:07:24,404 --> 00:07:26,574 about a year as a software engineer. 147 00:07:26,869 --> 00:07:29,489 And after that, I worked at Dropbox actually for a while and worked on their 148 00:07:29,489 --> 00:07:32,739 like data store thing, which is kind of local-first thing with like automatic 149 00:07:32,799 --> 00:07:37,129 merge and, and, and diffing and stuff and some other projects as, as well. 150 00:07:37,309 --> 00:07:37,569 Yeah. 151 00:07:37,569 --> 00:07:41,869 And, and Figma of course, like fun foundationally is almost 152 00:07:41,869 --> 00:07:44,019 a CRDT kind of data model. 153 00:07:44,259 --> 00:07:48,859 Um, although it is a hybrid centralized, decentralized type of product. 154 00:07:49,099 --> 00:07:53,379 So all of those products, uh, I think all super well known. 155 00:07:53,509 --> 00:07:56,119 Most of those products, I would not describe them as like, Oh, 156 00:07:56,119 --> 00:07:57,479 they're of course, local-first. 157 00:07:57,499 --> 00:08:02,089 I think now that you highlight it, I can certainly see certain aspects of them 158 00:08:02,189 --> 00:08:06,839 following some of those principles of local-first, but I'm curious in your 159 00:08:06,839 --> 00:08:11,129 perspective, what makes each of them local-first also from today's perspective. 160 00:08:11,129 --> 00:08:11,259 It's. 161 00:08:11,629 --> 00:08:13,789 Oh, that's an interesting question. 162 00:08:13,849 --> 00:08:17,999 Obviously, like if you disconnect from the internet, they keep working, right? 163 00:08:18,069 --> 00:08:20,859 That's the basic litmus test of local-first, right? 164 00:08:20,949 --> 00:08:23,649 If I can send with Facebook messenger, for example, which is still 165 00:08:23,649 --> 00:08:24,879 around, which is still local-first. 166 00:08:25,309 --> 00:08:29,729 If you open up that app and you send some messages and you know, you do some stuff 167 00:08:29,919 --> 00:08:31,989 like make changes and you're offline. 168 00:08:32,419 --> 00:08:33,289 That works. 169 00:08:33,419 --> 00:08:37,519 And when later you come online, those are reconciled with any changes that 170 00:08:37,519 --> 00:08:39,019 might've happened by other people. 171 00:08:39,719 --> 00:08:41,969 You don't like lose the stuff that you've done. 172 00:08:42,009 --> 00:08:44,799 And I think that kind of sums up how I would think about local-first. 173 00:08:44,819 --> 00:08:47,109 There are always limitations to these things, right? 174 00:08:47,109 --> 00:08:49,159 Like there's some, like, where do you draw the line? 175 00:08:49,339 --> 00:08:51,649 I think you have to think about it from a human perspective. 176 00:08:51,859 --> 00:08:56,389 When doing this litmus test and not from a computer technological perspective, 177 00:08:56,829 --> 00:09:00,789 meaning that there is just some data that is just impossible to get. 178 00:09:00,949 --> 00:09:01,239 Right. 179 00:09:01,249 --> 00:09:04,239 For example, if you have in a chat application, if you have a idea of 180 00:09:04,239 --> 00:09:07,899 presence, right, if someone is online or not, like that's not, that's naturally not 181 00:09:07,909 --> 00:09:09,529 data that you can get when you're offline. 182 00:09:09,569 --> 00:09:09,849 Right. 183 00:09:10,199 --> 00:09:12,929 And if you did, like, it wouldn't really be useful if you showed like 184 00:09:12,929 --> 00:09:14,949 cash data, like, Oh, Johannes is online. 185 00:09:15,129 --> 00:09:17,849 Like two months ago, like that that's useless. 186 00:09:17,849 --> 00:09:18,159 Right. 187 00:09:18,374 --> 00:09:20,644 So I think you have to think about it from a human perspective. 188 00:09:20,744 --> 00:09:25,004 Like if I sent Johannes a message and I hit the send button, you close the 189 00:09:25,014 --> 00:09:27,474 app or close my phone or whatever I do. 190 00:09:27,504 --> 00:09:29,854 I know Johannes is going to get the message eventually. 191 00:09:30,324 --> 00:09:31,464 That makes a lot of sense. 192 00:09:31,534 --> 00:09:35,514 So switching gears a little bit, uh, and thinking about this more from like 193 00:09:35,514 --> 00:09:39,724 a developer perspective, how you built those systems, what were, are there 194 00:09:39,724 --> 00:09:44,874 any sort of similarities that Emerged from building those systems, maybe in 195 00:09:44,874 --> 00:09:48,464 terms of like how the data is stored and how the data layer looks like. 196 00:09:48,674 --> 00:09:50,264 Yeah, it's interesting. 197 00:09:50,384 --> 00:09:52,934 So you and I have been, you know, we've, we kind of friends, so, you 198 00:09:52,934 --> 00:09:54,374 know, we met a couple of times. 199 00:09:54,374 --> 00:09:56,234 So we've been talking about these things in the past. 200 00:09:56,244 --> 00:10:01,079 So I think, uh, you know, where this is going, uh, there, there certainly is. 201 00:10:01,509 --> 00:10:06,139 A very interesting, I think, uh, observation that I've made with these 202 00:10:06,139 --> 00:10:09,089 like projects and with these projects, I mean, like we mentioned these 203 00:10:09,099 --> 00:10:14,279 three so far, like Figma, Spotify, Facebook Messenger, there are more. 204 00:10:14,569 --> 00:10:17,629 I've worked on a couple of more ones, but I think these ones Perhaps some of 205 00:10:17,689 --> 00:10:20,269 the listeners have heard about there. 206 00:10:20,379 --> 00:10:24,199 It's almost like all of them end up like sort of, if you think about a 207 00:10:24,209 --> 00:10:28,369 signal oscillating and then slowly stabilizing into a line that is an 208 00:10:28,369 --> 00:10:32,659 equilibrium, it's almost like all of them have stabilized around, like 209 00:10:32,699 --> 00:10:33,899 pretty much the same data model. 210 00:10:34,014 --> 00:10:37,594 Which is this kind of ordered map of, of data, very practically speaking. 211 00:10:37,754 --> 00:10:39,024 And I think that's really interesting. 212 00:10:39,024 --> 00:10:42,964 Like if, if you have these individual separate, like engineer organizations, 213 00:10:42,964 --> 00:10:47,714 even in different points in time, ending up like with similar, but pretty 214 00:10:47,714 --> 00:10:51,934 different, like practical, like product problems, and you end up with like a 215 00:10:51,934 --> 00:10:57,124 very, very similar data model, like could there be so that that data model that they 216 00:10:57,124 --> 00:10:58,674 have is like actually a pretty good one. 217 00:10:58,764 --> 00:10:59,244 I don't know. 218 00:10:59,314 --> 00:11:00,654 So Facebook messenger. 219 00:11:00,864 --> 00:11:04,674 Is probably the outplay here in this little, maybe a little bit different, 220 00:11:04,714 --> 00:11:09,014 but anyhow, , how I would describe this like data model that I'm talking about 221 00:11:09,154 --> 00:11:12,464 is think about a list of things, right? 222 00:11:12,564 --> 00:11:14,494 So think about this thing as an array. 223 00:11:14,939 --> 00:11:19,449 Meaning that like an item in this list has like a, has an explicit position, right? 224 00:11:19,449 --> 00:11:21,669 Position one or five or 2000. 225 00:11:21,789 --> 00:11:26,519 And now each like entry in this list is a key and a value. 226 00:11:26,589 --> 00:11:28,479 And really it doesn't have to be key in the value. 227 00:11:28,499 --> 00:11:31,869 The point here is that you can say, give me. 228 00:11:32,154 --> 00:11:35,224 The fifth item in the list, but you can also say, give me the 229 00:11:35,224 --> 00:11:36,464 item with this key in the list. 230 00:11:36,804 --> 00:11:41,204 And then the value, it's just like a couple of bytes, you know, 231 00:11:41,204 --> 00:11:43,634 the value is not some like JSON document or anything like that, 232 00:11:43,874 --> 00:11:48,274 the value could be an identifier of another list deals like this, right? 233 00:11:48,274 --> 00:11:50,444 So now like you have a graph, right? 234 00:11:50,534 --> 00:11:53,864 So let's say you want it to build on this so we can take Spotify as an example. 235 00:11:53,894 --> 00:11:57,864 So Spotify has playlists on the sidebar and the desktop app or sort of in 236 00:11:57,864 --> 00:11:59,874 the mobile app, if you go to the home screen, you have all of these things. 237 00:11:59,874 --> 00:12:02,634 They have a list of playlists and you can make folders and 238 00:12:02,634 --> 00:12:03,804 put playlists and playlists. 239 00:12:04,134 --> 00:12:04,444 Right. 240 00:12:04,454 --> 00:12:07,704 And you have playlists from, you have your playlists and then there 241 00:12:07,704 --> 00:12:09,804 are sort of a, you can browse for other people's playlists. 242 00:12:10,224 --> 00:12:10,504 Right. 243 00:12:10,584 --> 00:12:13,954 And all of these things, at least for a very long time, were 244 00:12:13,984 --> 00:12:15,094 all the same data structure. 245 00:12:15,104 --> 00:12:16,904 They were all like this type of list. 246 00:12:16,964 --> 00:12:17,274 It's right. 247 00:12:17,314 --> 00:12:18,664 A playlist, think about it. 248 00:12:18,704 --> 00:12:21,104 It is pretty much like what I'm talking about, right? 249 00:12:21,214 --> 00:12:22,134 You have a list of songs. 250 00:12:22,184 --> 00:12:23,334 They have a specific order, right? 251 00:12:23,334 --> 00:12:25,674 Since you might want to play this song before that song. 252 00:12:25,674 --> 00:12:26,474 So that's important. 253 00:12:26,634 --> 00:12:28,614 And a song itself. 254 00:12:28,914 --> 00:12:30,694 Can be represented also as a list. 255 00:12:31,359 --> 00:12:35,129 But here you use the keys, so a key could be artist, right? 256 00:12:35,539 --> 00:12:38,189 And sure, there can be many artists, but let's simplify it. 257 00:12:38,209 --> 00:12:41,669 So a key can be artist and another key can be, you know, song title. 258 00:12:41,699 --> 00:12:43,489 And another one is run length and so on. 259 00:12:43,679 --> 00:12:46,259 And now your playlist is essentially the identifier. 260 00:12:47,209 --> 00:12:50,209 Each entry in your playlist is an identifier of a list that 261 00:12:50,209 --> 00:12:51,829 represents a song, a track. 262 00:12:51,899 --> 00:12:56,049 I think it's perhaps obvious at this point, you can now have a, uh, a folder. 263 00:12:56,089 --> 00:12:58,319 That's essentially a playlist with links to playlists. 264 00:12:58,889 --> 00:12:59,129 Right. 265 00:12:59,399 --> 00:13:02,849 And now you have a graph and you can build this graph up and this list 266 00:13:02,849 --> 00:13:07,969 of things that is the guarantee, the ice date is the isolation, like 267 00:13:07,989 --> 00:13:10,279 primitive in something like Spotify. 268 00:13:10,569 --> 00:13:14,159 So like, if I say like, make these, like move these songs in this playlist 269 00:13:14,159 --> 00:13:18,339 and move these songs in that playlist, then these are two transactions. 270 00:13:18,339 --> 00:13:19,639 If you want to think about it that way. 271 00:13:19,964 --> 00:13:24,164 You cannot like, you cannot say either, like move these things in 272 00:13:24,174 --> 00:13:27,714 these two playlists or don't move anything in these two playlists. 273 00:13:27,774 --> 00:13:32,094 You can also only say, like, in within this list, make these changes and 274 00:13:32,094 --> 00:13:35,794 have those, like, give me some sort of guarantee that they will be reconciled 275 00:13:35,794 --> 00:13:40,654 in a predictive manner in all instances that have access to this playlist. 276 00:13:41,024 --> 00:13:45,044 So the diffing and emerging happens on that kind of list level. 277 00:13:45,394 --> 00:13:47,904 And interestingly, this is kind of how Figma works too. 278 00:13:47,904 --> 00:13:50,964 And there's like some articles, this is not any trade secrets here. 279 00:13:51,334 --> 00:13:54,674 Some articles published about this on the Figma blogs and Figma pretty 280 00:13:54,674 --> 00:13:56,854 much have the same principle, right? 281 00:13:56,854 --> 00:14:01,044 There's a graph that's built up by these sort of like entries. 282 00:14:01,054 --> 00:14:03,384 So you can think about them as a log or you can think about them as 283 00:14:03,414 --> 00:14:05,434 like a serialization of a graph. 284 00:14:05,834 --> 00:14:09,434 It goes both directions and that's the level where you different merge. 285 00:14:09,734 --> 00:14:12,194 And one of those lists is one document on Figma. 286 00:14:12,464 --> 00:14:14,104 And so one document is that like. 287 00:14:14,174 --> 00:14:18,054 You know, it's a unit about isolation, like either of these things change, you 288 00:14:18,054 --> 00:14:22,064 know, or they don't like one document that's kind of in one known States and 289 00:14:22,074 --> 00:14:26,294 Facebook messenger in a similar way, you have like messages and a message, 290 00:14:26,304 --> 00:14:29,924 you know, similarly, it's like part of a list in a conversation and so on. 291 00:14:30,189 --> 00:14:31,679 That's super fascinating. 292 00:14:31,719 --> 00:14:35,629 I think most listeners on this podcast, when they think about data 293 00:14:35,629 --> 00:14:39,729 models and data systems, there's typically one of two reference points. 294 00:14:40,009 --> 00:14:44,199 The most common one would probably be like a traditional database, whether it's on 295 00:14:44,199 --> 00:14:49,389 the server side where you have something like Postgres or MySQL, et cetera, or if 296 00:14:49,389 --> 00:14:53,989 you're a mobile developer, you are used to using SQLite in your client directly, 297 00:14:54,159 --> 00:14:55,969 or that's now also possible on the web. 298 00:14:55,989 --> 00:14:58,999 So I think that's the most traditional approach is like. 299 00:14:59,279 --> 00:15:02,119 Rely on a data system as a database. 300 00:15:02,249 --> 00:15:06,099 So I'd be curious how your suggestion kind of compares to that. 301 00:15:06,169 --> 00:15:10,519 I would assume maybe what you've described can be a foundation of a database, but 302 00:15:10,529 --> 00:15:14,709 what would be the downsides of using a database directly to build your app? 303 00:15:15,179 --> 00:15:17,824 Contrasting with your approach and also now with. 304 00:15:17,824 --> 00:15:22,794 A local-first CRDTs is a very common approach to have data structures that 305 00:15:22,794 --> 00:15:24,794 are also allow for collaboration. 306 00:15:24,794 --> 00:15:28,574 So maybe you can contrast your approach that you've described to 307 00:15:28,584 --> 00:15:31,224 using a database or CRDTs directly. 308 00:15:31,484 --> 00:15:31,884 Yeah. 309 00:15:31,884 --> 00:15:35,574 I think this is an interesting conversation, which is like, what 310 00:15:35,574 --> 00:15:37,174 tools do you use at one point in time? 311 00:15:37,174 --> 00:15:39,434 And like, what is a good fit for your problem? 312 00:15:39,494 --> 00:15:40,594 And there's almost like. 313 00:15:40,799 --> 00:15:44,759 If you imagine some sort of graph between perfect fit and time 314 00:15:44,769 --> 00:15:47,709 required and stuff, there are these two lines and they meet somewhere. 315 00:15:47,709 --> 00:15:50,629 And it's very specific to each project and you want to kind of hit that spot. 316 00:15:50,749 --> 00:15:51,039 Okay. 317 00:15:51,059 --> 00:15:54,089 Let's, let's think about like a bunch of different projects, right? 318 00:15:54,109 --> 00:15:57,429 Everything from something like Spotify, there's like a, you know, a big 319 00:15:57,429 --> 00:16:00,489 undertaking, like a company where, you know, we're going to be, okay, we're going 320 00:16:00,489 --> 00:16:02,569 to spend a year or two of like 10 people. 321 00:16:02,569 --> 00:16:06,199 And we just kind of like, you know, pour like tens of thousands of, of hours 322 00:16:06,229 --> 00:16:07,819 into making this one thing go well. 323 00:16:07,959 --> 00:16:11,689 And on the other side of the spectrum, think about like a, you know, sort 324 00:16:11,689 --> 00:16:15,789 of a Robin Sloan home cooked meal type of like, I'm gonna like make an 325 00:16:15,799 --> 00:16:17,619 app in an afternoon sort of thing. 326 00:16:17,689 --> 00:16:20,069 I think these two, you gotta take very different approaches 327 00:16:20,079 --> 00:16:21,039 for these two things, right? 328 00:16:21,279 --> 00:16:25,169 If you build this company-size thing by just like just throwing some generic 329 00:16:25,169 --> 00:16:26,989 thing on it where it really matters. 330 00:16:26,999 --> 00:16:29,559 And I got to say, you know, there, there are going to be. 331 00:16:29,709 --> 00:16:33,609 A hundred different problems you need to solve and 95 of those problems, 332 00:16:33,609 --> 00:16:36,699 you should solve a generic technology and it's really hard to know upfront. 333 00:16:36,699 --> 00:16:40,519 There's 5 problems that really will set your product aside from the competition. 334 00:16:40,789 --> 00:16:43,179 And those are the 5 problems where you want to think really hard and 335 00:16:43,179 --> 00:16:44,879 solve for really, really well. 336 00:16:45,379 --> 00:16:47,739 So say that you've identified those 5 problems. 337 00:16:47,899 --> 00:16:49,889 You don't want to throw something generic on there. 338 00:16:50,109 --> 00:16:53,269 Because that's going to like ruin your opportunity to really 339 00:16:53,299 --> 00:16:54,739 differentiate with Spotify. 340 00:16:54,769 --> 00:16:58,209 For example, we knew that like to skip in a song that should never 341 00:16:58,209 --> 00:17:00,109 be slower than 200 milliseconds. 342 00:17:00,109 --> 00:17:02,899 And so a lot of engineering went into just making sure that that was true. 343 00:17:02,979 --> 00:17:03,239 Right. 344 00:17:03,239 --> 00:17:05,459 And that's kind of how you find some of those like five things 345 00:17:06,119 --> 00:17:08,619 with the home cooked meal type of like, I'm going to spend a week 346 00:17:08,619 --> 00:17:10,019 and making an app kind of thing. 347 00:17:10,149 --> 00:17:12,269 You don't, you just don't have the luxury of that. 348 00:17:12,269 --> 00:17:12,439 Right. 349 00:17:12,449 --> 00:17:15,189 Even if you do identify, these are like one or two things that 350 00:17:15,909 --> 00:17:17,519 Like make my thing like different. 351 00:17:17,519 --> 00:17:19,109 Maybe my friends will like it more. 352 00:17:19,179 --> 00:17:20,209 You got to be creative. 353 00:17:20,239 --> 00:17:24,219 And I think in that scenario and find either really hacking solutions or 354 00:17:24,249 --> 00:17:28,869 like just be super lucky and find some existing stuff that does that. 355 00:17:28,894 --> 00:17:32,444 And I realized we're on a bit of a tangent here, but I think like it's 356 00:17:32,444 --> 00:17:35,434 important to have that, like setting that like picture frame, so to speak. 357 00:17:35,434 --> 00:17:35,704 Right. 358 00:17:35,814 --> 00:17:40,274 So with something like Spotify and something like Figma, which both end up 359 00:17:40,284 --> 00:17:44,194 with like pretty much the same or very, very similar data model, those data 360 00:17:44,194 --> 00:17:45,864 models are specific for their problems. 361 00:17:45,934 --> 00:17:47,484 They're both in both sides. 362 00:17:47,834 --> 00:17:50,604 They are one of these like five things that makes them stick out. 363 00:17:50,764 --> 00:17:50,944 Right. 364 00:17:50,944 --> 00:17:56,874 Like if Figma had not came up with it's a sort of CRDTs smelling semi 365 00:17:56,874 --> 00:18:01,654 centralized sort of, uh, document graph format, whatever, it probably wouldn't 366 00:18:01,654 --> 00:18:05,364 have been as fast and, you know, probably wouldn't be able to scale and 367 00:18:05,404 --> 00:18:08,454 it probably wouldn't feel that very good if it wasn't that fast, right. 368 00:18:08,454 --> 00:18:10,864 And maybe it would never have gotten traction in the market and wouldn't 369 00:18:10,864 --> 00:18:12,364 have been successful as a company. 370 00:18:12,704 --> 00:18:16,014 And similar for Spotify, like if collaborating on playlists and 371 00:18:16,024 --> 00:18:19,674 stuff will be really slow or you would just like sometimes lose data. 372 00:18:19,674 --> 00:18:21,904 You would probably also have lost users early on. 373 00:18:22,064 --> 00:18:23,514 And these solutions were very specific. 374 00:18:23,554 --> 00:18:25,424 So I think that that tension exists. 375 00:18:25,434 --> 00:18:28,244 And when building something ourselves, maybe we're not on 376 00:18:28,244 --> 00:18:31,584 the extreme of like, I only have, you know, 10 hours to make this. 377 00:18:31,614 --> 00:18:33,884 Maybe it's more like, you know, I've got maybe 200 hours 378 00:18:33,894 --> 00:18:34,884 over the course of two months. 379 00:18:35,194 --> 00:18:36,944 I think it's very, it's very like. 380 00:18:37,204 --> 00:18:38,114 Attractive. 381 00:18:38,389 --> 00:18:41,949 To reach for an existing solution, but I think in many cases it ends up 382 00:18:41,949 --> 00:18:46,679 costing us as much to use third party code as it does to write it ourselves. 383 00:18:46,849 --> 00:18:47,609 So think about it. 384 00:18:47,679 --> 00:18:49,799 Let's say you use like a library someone else read. 385 00:18:49,949 --> 00:18:50,969 So you put that in there. 386 00:18:50,999 --> 00:18:53,719 It does mostly what you want, but at some point it will not. 387 00:18:53,874 --> 00:18:54,034 Right. 388 00:18:54,074 --> 00:18:56,634 Like every single piece of code has bugs, right? 389 00:18:56,634 --> 00:18:58,644 Like I've never worked on something that doesn't have bugs. 390 00:18:58,684 --> 00:18:59,614 Everything is bugs, right? 391 00:18:59,614 --> 00:19:01,474 So you just assume that that's the thing has bugs too. 392 00:19:01,554 --> 00:19:04,254 And at one point there's gotta be, uh, there's gotta be an issue, right? 393 00:19:04,274 --> 00:19:06,324 Or like, it doesn't do the thing you want it to do. 394 00:19:06,424 --> 00:19:09,604 Maybe there's a bug and it does do the thing that you want it to do. 395 00:19:09,634 --> 00:19:09,894 Right? 396 00:19:10,164 --> 00:19:12,574 So basically now you have to fix that code, right? 397 00:19:12,594 --> 00:19:13,194 Or change it. 398 00:19:13,264 --> 00:19:15,564 And that means that you have to read the code and understand it. 399 00:19:15,634 --> 00:19:19,744 And I argue that probably takes a very similar amounts of 400 00:19:19,834 --> 00:19:23,294 effort in the common case as it would, if you wrote it yourself. 401 00:19:23,464 --> 00:19:26,244 You probably, to understand it, you're going to have to go beyond 402 00:19:26,244 --> 00:19:29,254 the code and understand the, you know, the logical aspects of it. 403 00:19:29,254 --> 00:19:32,764 Maybe you have to read some like technical papers or some books or 404 00:19:32,764 --> 00:19:36,144 speak with some people to understand how things are solved in a way, 405 00:19:36,224 --> 00:19:37,954 not just like what the code does. 406 00:19:38,164 --> 00:19:41,514 So I'm not saying like people should always go and write their own thing. 407 00:19:41,654 --> 00:19:44,404 Obviously there's gotta be a couple of things , that don't fit this, 408 00:19:44,434 --> 00:19:45,914 they're outliers to what I'm saying. 409 00:19:46,024 --> 00:19:49,524 So if you, if you say, I kind of need like a relational database 410 00:19:49,594 --> 00:19:52,544 and you're like, okay, I'm going to build my own Postgres or SQLite. 411 00:19:52,644 --> 00:19:57,214 That's, I think, obviously a bad idea since like there are existing solutions, 412 00:19:57,234 --> 00:19:59,884 really well tested, really high quality. 413 00:19:59,984 --> 00:20:03,004 If they don't do what you want it to do, it's extremely flexible. 414 00:20:03,004 --> 00:20:04,924 You can probably bend it to do what you want it to do. 415 00:20:05,144 --> 00:20:07,544 If you were ever run into performance issues. 416 00:20:07,739 --> 00:20:09,369 You can solve the problem then, right? 417 00:20:09,439 --> 00:20:13,069 Assuming that like the solution fits the problem that you have. 418 00:20:13,369 --> 00:20:18,279 I really like this mental model of like, you choose for like 95 percent of stuff. 419 00:20:18,319 --> 00:20:23,549 You use like the default things, but like on 5 percent you spend your innovation 420 00:20:23,569 --> 00:20:26,319 tokens and that's super interesting. 421 00:20:26,319 --> 00:20:31,449 I, and I definitely agree that choosing the right foundation for your data model. 422 00:20:31,679 --> 00:20:36,679 It's a super high leverage bet that you can place your innovation tokens on. 423 00:20:36,819 --> 00:20:40,649 One more thing to consider is the, almost like the, how well the 424 00:20:40,649 --> 00:20:44,949 glove fits or like the Swiss army knife problem, if we call it that. 425 00:20:45,089 --> 00:20:47,859 So let's say you've got to, you're going to cook some food 426 00:20:47,959 --> 00:20:49,179 and you need some tools to cook. 427 00:20:49,179 --> 00:20:51,309 You need some pots and pans and some knives, right? 428 00:20:51,309 --> 00:20:52,189 As a cutting boards. 429 00:20:52,189 --> 00:20:55,269 I think one approach to doing this is you have one pot. 430 00:20:55,499 --> 00:20:58,389 Or maybe you need two pots because you're doing two things concurrently. 431 00:20:58,419 --> 00:21:00,619 But like you have this kind of minimalist mindset. 432 00:21:00,659 --> 00:21:03,749 You have one knife, you used up all your, all your chopping. 433 00:21:03,769 --> 00:21:07,409 You got like, you know, one or two pots and you cook everything in it. 434 00:21:07,459 --> 00:21:10,579 And then you got on the other side, you got the maximalist mindset. 435 00:21:10,579 --> 00:21:12,909 You have like 20 different knives of different sizes. 436 00:21:13,289 --> 00:21:13,749 You're right. 437 00:21:13,749 --> 00:21:17,099 And you have like 14 different pots and you have rice cooker for that kind of rice 438 00:21:17,119 --> 00:21:18,439 and a rice cooker for this kind of rice. 439 00:21:18,439 --> 00:21:20,619 And you know, there's this like specialization. 440 00:21:20,759 --> 00:21:23,389 I think that this thing happens with technology too. 441 00:21:23,489 --> 00:21:24,709 And especially early on. 442 00:21:25,019 --> 00:21:28,389 I think that there's a, an appeal to using something that's very flexible 443 00:21:28,389 --> 00:21:33,179 early on to have those 20 knives available just in case I need like a tiny 444 00:21:33,179 --> 00:21:34,909 paring knife or a big butcher's knife. 445 00:21:34,909 --> 00:21:35,209 Right. 446 00:21:35,349 --> 00:21:35,989 Just in case. 447 00:21:36,059 --> 00:21:36,309 Right. 448 00:21:36,539 --> 00:21:39,409 And so I think a lot of people reach for something like SQL late early 449 00:21:39,409 --> 00:21:43,339 on, just because they think, oh, I might need like some inner outer 450 00:21:43,349 --> 00:21:46,759 join search thing hidden, you know. 451 00:21:46,999 --> 00:21:49,949 Functions in a database kind of thing, maybe down the road, I need that, 452 00:21:49,969 --> 00:21:53,439 you know, maybe I need to do like some something, you know, I need to 453 00:21:53,439 --> 00:21:55,969 set up constraints and to protect myself because like, maybe I'll 454 00:21:55,969 --> 00:21:57,419 forget what I did and stuff like that. 455 00:21:57,449 --> 00:22:01,109 And, you know, that, like, like everything, there might be some, 456 00:22:01,149 --> 00:22:04,599 there might be some truth to that being like useful, but I 457 00:22:04,609 --> 00:22:05,899 think in most cases it's not. 458 00:22:06,259 --> 00:22:10,209 And I think in most cases, we start out with too much flexibility. 459 00:22:10,239 --> 00:22:14,849 And the problem is that anything that's simple will grow to become complex. 460 00:22:15,674 --> 00:22:19,344 Or another way of thinking about it and complexity always grows, right? 461 00:22:19,754 --> 00:22:24,144 Anything you have, it's like kind of the law of entropy, essentially, like whatever 462 00:22:24,144 --> 00:22:29,194 you have your computer system, whatever your app over time will only grow complex. 463 00:22:29,234 --> 00:22:32,614 And you have to work really, really, really hard to do the opposite, to 464 00:22:32,614 --> 00:22:36,404 make something complex, grow the other direction to the towards simple. 465 00:22:36,784 --> 00:22:38,804 And so, you know, if you agree with that. 466 00:22:39,514 --> 00:22:43,024 It's, I think it's pretty reasonable to say if you start out with something 467 00:22:43,024 --> 00:22:47,534 that is pretty flexible, it's probably pretty complex and it will become 468 00:22:47,664 --> 00:22:49,824 very, very complex in the future. 469 00:22:49,884 --> 00:22:52,074 And so I think in most cases, what people need, it's just 470 00:22:52,074 --> 00:22:53,744 like a key value store early on. 471 00:22:53,774 --> 00:22:56,014 And I mean, I mean, that's what SQLite uses under the hood, right? 472 00:22:56,014 --> 00:22:57,224 SQLite is like, you know. 473 00:22:57,434 --> 00:23:00,484 A set of like functions is essentially on top of a key 474 00:23:00,484 --> 00:23:02,064 value store to make that easier. 475 00:23:02,074 --> 00:23:05,314 And I think in most cases, if Facebook messenger is a key value store, for 476 00:23:05,314 --> 00:23:09,594 example, at least when I worked on it's a level DB before rocks DB thing. 477 00:23:09,724 --> 00:23:12,514 So yeah, anyhow, I just want to say that and wrapping that up, what I was trying 478 00:23:12,564 --> 00:23:15,664 to communicate here is that when starting out with something new and thinking 479 00:23:15,704 --> 00:23:18,964 about databases can be, you're smiling because I know like with Overtone, you've 480 00:23:18,964 --> 00:23:22,024 been thinking a lot about this and I think coming to the similar conclusions. 481 00:23:22,524 --> 00:23:25,994 Start out with something that's like a glove that really fits your hand instead 482 00:23:25,994 --> 00:23:29,474 of like a whole wardrobe full of like potential winter clothes you might need. 483 00:23:29,564 --> 00:23:31,734 Yeah, I love that analogy. 484 00:23:31,784 --> 00:23:36,324 And I've seen this story now so many times that either you start out with a 485 00:23:36,324 --> 00:23:41,424 database and then step by step you like remove layers from the database because 486 00:23:41,424 --> 00:23:45,474 you need to go more low level and you need to have that performance or power. 487 00:23:45,859 --> 00:23:49,839 Or you go the other way around and you start it up from scratch and then 488 00:23:49,839 --> 00:23:51,609 your app kind of becomes a database. 489 00:23:51,649 --> 00:23:53,289 I don't think there is a right or wrong. 490 00:23:53,299 --> 00:23:57,739 I think there's a good fit for the right use case, but I agree that 491 00:23:57,759 --> 00:23:59,679 this is like a super common scenario. 492 00:23:59,779 --> 00:24:03,949 And it's very interesting to see that all of those different companies 493 00:24:03,959 --> 00:24:07,709 that you've worked at, that this emerged in a very similar way. 494 00:24:07,869 --> 00:24:11,699 Moving on a little bit from the data nitty gritty details. 495 00:24:12,089 --> 00:24:14,069 On to a more broader topic. 496 00:24:14,119 --> 00:24:14,879 The most. 497 00:24:15,304 --> 00:24:19,834 popular platform right now, the web, you've been building things on many 498 00:24:19,834 --> 00:24:24,214 different platforms, but I think that the web has always been like a common factor 499 00:24:24,214 --> 00:24:25,914 in all of the systems that you've built. 500 00:24:26,214 --> 00:24:29,004 I'm curious, what is your perspective today on the web? 501 00:24:29,324 --> 00:24:33,454 The web is what got me into programming computers in the first place. 502 00:24:33,854 --> 00:24:35,014 Well, that's not strictly true. 503 00:24:35,064 --> 00:24:37,714 I started with like in a friend's basement on basic. 504 00:24:38,044 --> 00:24:42,084 But the thing that really pulled me in was like the web in the nineties. 505 00:24:42,204 --> 00:24:46,424 And I thought it was like absolutely magical that I can go on a webpage and 506 00:24:46,424 --> 00:24:51,414 it usually said CGI bin in the location bar and I can go to a webpage and I 507 00:24:51,414 --> 00:24:54,674 can like make a change and then I can go to a friend's place who also had 508 00:24:54,674 --> 00:24:57,864 a modem and we can look at the page and I can see the change that I made. 509 00:24:57,864 --> 00:24:59,014 And that to me was like. 510 00:24:59,354 --> 00:25:00,604 That that's magic. 511 00:25:00,704 --> 00:25:02,134 That's like, that's amazing. 512 00:25:02,144 --> 00:25:03,184 Forget everything else. 513 00:25:03,504 --> 00:25:05,234 I don't want to be an astronaut anymore. 514 00:25:05,244 --> 00:25:06,384 Like I want to make that thing. 515 00:25:06,494 --> 00:25:11,014 So like, I've got, you know, I've got a lot of love for the web and yes, I worked 516 00:25:11,014 --> 00:25:13,384 on a lot of web stuff through the years. 517 00:25:13,444 --> 00:25:17,034 And I even worked on like a, together with a friend of mine in 518 00:25:17,034 --> 00:25:21,044 2010 or so, we had like a, a fully local-first, like website, and then 519 00:25:21,144 --> 00:25:23,764 even, even the like image processing. 520 00:25:23,979 --> 00:25:26,409 Like decentralized on clients, computers and stuff like that. 521 00:25:26,419 --> 00:25:29,389 No Bitcoin mining, but you know, it kind of smells like that a little bit. 522 00:25:29,479 --> 00:25:33,239 So I think the, in the last 10 years though, it's like gone in a direction 523 00:25:33,299 --> 00:25:34,819 that I'm not super happy about. 524 00:25:34,919 --> 00:25:39,499 So first I want to say that like what is really, really powerful and valuable 525 00:25:39,499 --> 00:25:42,079 with the web is not HTML and CSS. 526 00:25:42,079 --> 00:25:44,339 I think that's mostly like a historical accident. 527 00:25:44,814 --> 00:25:49,274 What's what is so, so powerful is the distribution, the fact that I 528 00:25:49,274 --> 00:25:52,794 can give you just like a URL, which is a piece of text, which is like 529 00:25:52,794 --> 00:25:54,064 the most ubiquitous data format. 530 00:25:54,254 --> 00:25:56,164 And, you know, exactly what to do. 531 00:25:56,184 --> 00:25:59,554 I don't have to ask you to like, Oh, by the way, with this piece of 532 00:25:59,554 --> 00:26:02,504 text, you have to go to that app and do this thing, you know, right? 533 00:26:02,504 --> 00:26:04,444 I can send it to, you know, exactly what it is. 534 00:26:04,654 --> 00:26:07,424 So it's ubiquitous, the human understanding of what a URL is. 535 00:26:07,434 --> 00:26:07,994 You see that. 536 00:26:08,299 --> 00:26:11,549 My mom sees the URL, she doesn't understand HTTP like, 537 00:26:11,719 --> 00:26:12,899 and she doesn't have to, right? 538 00:26:12,949 --> 00:26:16,699 But she sees it, she knows the URL, she punches it into a web browser and she 539 00:26:16,699 --> 00:26:20,809 will see something that's like pretty similar to what I see, you know, it's 540 00:26:20,809 --> 00:26:23,959 like, you know, it's similar enough that it feels like it's the same thing. 541 00:26:24,019 --> 00:26:26,789 And that I think is, is so valuable. 542 00:26:27,304 --> 00:26:31,274 That all the downsides of the web and all the valuable things of 543 00:26:31,284 --> 00:26:35,064 other platforms are just like, just not tipping the scale, right? 544 00:26:35,164 --> 00:26:39,554 Like this is way so heavy on sort of, uh, you know, an imaginary scale that 545 00:26:39,554 --> 00:26:40,924 the web platform I think has won. 546 00:26:40,984 --> 00:26:46,004 You look at like a tech workers, like laptop today, it's probably a MacBook, 547 00:26:46,344 --> 00:26:48,354 but do they run any native apps on it? 548 00:26:48,354 --> 00:26:50,674 Like probably not, which is kind of like bonkers, right? 549 00:26:50,829 --> 00:26:52,559 You're going to, you're going to look at it and use Slack. 550 00:26:52,589 --> 00:26:54,279 It's a web view, right? 551 00:26:54,359 --> 00:26:55,029 And they use Figma. 552 00:26:55,059 --> 00:26:55,789 It's a web view. 553 00:26:55,929 --> 00:26:57,789 And they use like, uh, Discord. 554 00:26:57,789 --> 00:26:58,439 It's a web view. 555 00:26:58,439 --> 00:26:59,499 And they use Spotify. 556 00:26:59,499 --> 00:27:01,389 It's these days, it's a web view, right? 557 00:27:01,779 --> 00:27:04,219 And then they probably have a web browser with like a hundred tabs. 558 00:27:04,219 --> 00:27:06,139 And, and that's obviously a web thing. 559 00:27:06,529 --> 00:27:10,179 And what's left, I don't know, files on their local, like those, 560 00:27:10,199 --> 00:27:11,549 those are not like web things. 561 00:27:11,549 --> 00:27:11,789 Right. 562 00:27:11,789 --> 00:27:14,799 And so I think it's like really hard to argue that the web platform 563 00:27:14,809 --> 00:27:16,669 hasn't like won in terms of. 564 00:27:16,894 --> 00:27:20,824 Becoming the dominant platform and platform, including like Microsoft 565 00:27:20,834 --> 00:27:26,284 windows and iOS and Mac OS as platforms here alongside web, um, because the 566 00:27:26,284 --> 00:27:30,284 web really does feel like a sort of an operating system or a platform. 567 00:27:30,304 --> 00:27:32,264 It's like a target for software development, right? 568 00:27:32,264 --> 00:27:32,964 And distribution. 569 00:27:33,304 --> 00:27:36,834 So where web has now has definitely won is the. 570 00:27:37,084 --> 00:27:39,594 best distribution mechanism that we have today. 571 00:27:39,814 --> 00:27:43,724 I think we've also sacrificed a lot when I think there's like the sort of 572 00:27:43,724 --> 00:27:46,114 fuzzy word of like, is the app native? 573 00:27:46,394 --> 00:27:50,374 I think there's like no clear line of an app being native or not. 574 00:27:50,404 --> 00:27:53,894 I think it's rather like, does it feel native , corresponding 575 00:27:53,904 --> 00:27:55,294 to a certain platform? 576 00:27:55,594 --> 00:27:57,424 So where would you hope that. 577 00:27:57,804 --> 00:27:59,344 The web would go further. 578 00:27:59,354 --> 00:28:01,974 Where do we leave money on the table in regards to the web? 579 00:28:02,174 --> 00:28:03,244 That's a good question. 580 00:28:03,324 --> 00:28:05,914 And I realized now that we're a little bit off topic of the sort 581 00:28:05,914 --> 00:28:09,144 of general, you know, theme of this podcast, but I think that's okay. 582 00:28:09,144 --> 00:28:10,594 I think this kind of relates somehow. 583 00:28:10,764 --> 00:28:14,884 And I think what you were saying Johannes is I think really like stirs 584 00:28:14,914 --> 00:28:19,824 my mind in a really good way, which is, you know, What is native and perhaps 585 00:28:19,834 --> 00:28:22,134 it's something that like feels native. 586 00:28:22,274 --> 00:28:22,504 Right. 587 00:28:22,504 --> 00:28:23,364 And what does that mean? 588 00:28:23,714 --> 00:28:28,594 I think what, what it means to me is if I run JavaScript or if it's 589 00:28:28,594 --> 00:28:33,994 objective C or Swift or Android Java or go, it's all the same, right? 590 00:28:34,354 --> 00:28:37,364 Like all of these things just, you know, Are translated different 591 00:28:37,364 --> 00:28:41,594 ways to the same instructions on the CPU and use the same memory. 592 00:28:41,604 --> 00:28:45,234 There's really no technical difference below a certain level 593 00:28:45,244 --> 00:28:46,474 of any of these technologies. 594 00:28:46,474 --> 00:28:46,754 Right. 595 00:28:47,124 --> 00:28:50,824 So it would be incorrect to say that like web is a different, it's 596 00:28:50,824 --> 00:28:54,354 like a user, a different CPU, like the JavaScript CPU, that like. 597 00:28:54,504 --> 00:28:55,354 That's not a real thing. 598 00:28:55,354 --> 00:28:55,544 Right. 599 00:28:55,744 --> 00:28:59,314 So these are all the same thing at like a pretty low level on the computer. 600 00:28:59,454 --> 00:29:02,364 And so what leaves us then is like, not really like, does it run a 601 00:29:02,364 --> 00:29:05,634 different CPU because it doesn't, it's more about that feeling. 602 00:29:05,724 --> 00:29:08,694 I think that feeling comes from and why it, why it matters. 603 00:29:08,694 --> 00:29:09,474 We can talk about too. 604 00:29:09,674 --> 00:29:12,204 But I think that feeling comes from just like things looking 605 00:29:12,204 --> 00:29:13,464 the same and behaving the same. 606 00:29:13,674 --> 00:29:16,434 Looking the same, I think is less important behaving the same. 607 00:29:16,434 --> 00:29:20,404 I think it's a big deal and looking the same where it's important is to 608 00:29:20,404 --> 00:29:22,754 recognize that something looks similar. 609 00:29:22,929 --> 00:29:24,609 So let's say we're walking outside. 610 00:29:24,669 --> 00:29:25,979 We walk in a park, right? 611 00:29:25,979 --> 00:29:26,999 There's like trees and stuff. 612 00:29:27,049 --> 00:29:28,939 We can identify a tree as a tree. 613 00:29:29,359 --> 00:29:32,929 Although we don't know if it's like an oak tree or a pine tree, right? 614 00:29:33,029 --> 00:29:35,419 Or like some specific, like, type of oak. 615 00:29:35,429 --> 00:29:37,509 Maybe we do know that, oh, that's probably an oak tree. 616 00:29:37,509 --> 00:29:38,529 That's probably a pine tree. 617 00:29:38,879 --> 00:29:42,549 But we don't know the subspecies, but it doesn't matter the fact that, like, we can 618 00:29:42,549 --> 00:29:44,599 tell that that's a tree and that's a rock. 619 00:29:44,599 --> 00:29:46,509 This is the sky and this is the ground. 620 00:29:46,849 --> 00:29:48,199 Like those things are really important. 621 00:29:48,659 --> 00:29:52,709 Then if the grass is green or yellow or brown, that's less important for 622 00:29:52,709 --> 00:29:56,519 our, like, you know, ability to, like, navigate, right, the space. 623 00:29:56,749 --> 00:30:00,799 And I think the same is true in a, in a user interface, that if I see something 624 00:30:00,799 --> 00:30:05,724 that looks like a pop up button and, or something that looks like a button, Right. 625 00:30:05,744 --> 00:30:07,734 The most fundamental of UI elements. 626 00:30:08,174 --> 00:30:11,704 If it doesn't behave like a button, like my mind will break, but it doesn't, 627 00:30:11,714 --> 00:30:14,964 it doesn't have to like, look exactly like the button that I'm used to. 628 00:30:15,054 --> 00:30:15,264 Right. 629 00:30:15,264 --> 00:30:19,404 If I'm using macOS and the button, this button we're talking about now looks 630 00:30:19,404 --> 00:30:23,724 totally different like aesthetically, but I still identify as a button. 631 00:30:23,884 --> 00:30:26,044 The fact that it looks different is not important. 632 00:30:26,154 --> 00:30:26,404 Right. 633 00:30:26,614 --> 00:30:27,814 As long as it behaves the same. 634 00:30:27,954 --> 00:30:31,774 So I would say that behavior is, is really the most important part. 635 00:30:32,144 --> 00:30:36,084 It's like recognizing that it is about the yes, that behavior, big deal. 636 00:30:36,424 --> 00:30:40,434 And I think this is where the web platform has a huge problem because 637 00:30:40,544 --> 00:30:41,904 it comes to not an analogy, right? 638 00:30:43,024 --> 00:30:46,854 So imagine that we have like a planetary system with different planets, you know, 639 00:30:46,864 --> 00:30:51,044 Mac OS or iOS, let's take that as an example, iOS, that's one planet, right? 640 00:30:51,044 --> 00:30:55,114 You got a set of like rules there, you know, grass grows in a certain way. 641 00:30:55,114 --> 00:30:56,464 There's a certain amount of gravity. 642 00:30:56,614 --> 00:30:57,974 The sun rises in a certain time. 643 00:30:58,314 --> 00:31:01,494 There's like a bunch of rules and there's a world and everything sort of is. 644 00:31:02,074 --> 00:31:05,474 In harmony with these like laws of physics there, and then you go to 645 00:31:05,474 --> 00:31:08,344 Microsoft windows and there's a different world and some things are similar, but 646 00:31:08,344 --> 00:31:09,444 like, a lot of things are different. 647 00:31:09,444 --> 00:31:09,734 Right? 648 00:31:09,844 --> 00:31:13,044 And then you go to the, to the, to the web, right? 649 00:31:13,144 --> 00:31:14,294 But the web is not a planet. 650 00:31:14,294 --> 00:31:16,014 The web is another planetary system. 651 00:31:16,284 --> 00:31:19,284 There's like, not one website works the same as the other website. 652 00:31:19,344 --> 00:31:22,214 This is actually a problem from a business perspective. 653 00:31:22,614 --> 00:31:25,484 And it's like a lot of big things, you know, run by businesses 654 00:31:25,484 --> 00:31:26,344 and they care about money. 655 00:31:26,434 --> 00:31:28,234 And so I think they're leaving money on the table. 656 00:31:28,634 --> 00:31:31,404 By making things like behave differently, right? 657 00:31:31,444 --> 00:31:35,834 I go to, I don't know, uh, a website for, uh, for getting 658 00:31:35,834 --> 00:31:36,994 groceries delivered, right? 659 00:31:37,434 --> 00:31:40,634 And now this website has like some pop up menu that's like some homemade 660 00:31:40,634 --> 00:31:44,634 thing and it doesn't work the way I expect it to and now like that, that 661 00:31:44,634 --> 00:31:48,934 becomes like a cognitive, like work that becomes like a, a road bump 662 00:31:48,984 --> 00:31:50,794 that becomes like, like a detour. 663 00:31:51,054 --> 00:31:54,864 Right for myself, that's something that I have to spend my, my limited energy on. 664 00:31:54,934 --> 00:31:56,264 Maybe I go to this website. 665 00:31:56,544 --> 00:31:57,684 And again, order groceries. 666 00:31:57,744 --> 00:31:58,584 I haven't done it before. 667 00:31:58,584 --> 00:32:01,454 I'm like, is this going to, is this, is this a good idea? 668 00:32:01,504 --> 00:32:03,334 Should I do this instead of going to the grocery store? 669 00:32:03,354 --> 00:32:03,984 Blah, blah, blah. 670 00:32:04,054 --> 00:32:07,634 Then let's say that this website would be like, there's a big hand 671 00:32:07,644 --> 00:32:10,094 coming up in the middle of the website that says like, fuck you, man. 672 00:32:10,464 --> 00:32:11,334 It's like, you suck. 673 00:32:11,334 --> 00:32:14,839 And like, I would pretty quickly as close the website to go somewhere 674 00:32:14,839 --> 00:32:17,769 else, probably if it started, like, assaulting me sort of verbally. 675 00:32:17,869 --> 00:32:19,689 So that's like a very extreme version of it. 676 00:32:19,729 --> 00:32:22,059 And I think these small things are these, like, tiny things 677 00:32:22,059 --> 00:32:23,239 to build up to the same thing. 678 00:32:23,349 --> 00:32:23,729 Right? 679 00:32:23,869 --> 00:32:27,289 Eventually, when it's like, I filled something out in the form, and then 680 00:32:27,319 --> 00:32:31,524 I switched tabs and I came back and like, They had some server side session 681 00:32:31,534 --> 00:32:33,544 or some like insane idea like that. 682 00:32:33,834 --> 00:32:36,844 And it like wasted all of the stuff I read them because I hadn't submitted 683 00:32:36,844 --> 00:32:38,554 it because my, my session expired. 684 00:32:38,594 --> 00:32:38,914 Right. 685 00:32:39,364 --> 00:32:41,744 I'm going to be furious and things like that. 686 00:32:41,974 --> 00:32:46,114 Those kind of, they almost account toward like a rising thermometer. 687 00:32:46,184 --> 00:32:48,514 And when it gets too warm, I'm like, Ooh, I'm starting to sweat. 688 00:32:48,534 --> 00:32:49,054 I'm out of here. 689 00:32:49,104 --> 00:32:52,124 I know I'm like saying a lot of words and it's a little fluffy, but I think 690 00:32:52,124 --> 00:32:56,394 that there is some, some real value left on the table here in terms of like,. 691 00:32:56,754 --> 00:33:01,709 Removing that friction and instead having that like limited cognitive 692 00:33:01,709 --> 00:33:05,939 supply of a user of a visitor of whatever thing you have focused on 693 00:33:05,939 --> 00:33:07,049 what makes your thing different. 694 00:33:07,049 --> 00:33:07,329 Right? 695 00:33:07,469 --> 00:33:11,339 If I go to Overtone and I use Overtone, like how, like I scroll, 696 00:33:11,359 --> 00:33:14,099 that shouldn't be like the thing that I spend time on, right? 697 00:33:14,139 --> 00:33:18,229 How I select what happens if I double click like these things, if I have 698 00:33:18,229 --> 00:33:19,919 to spend my brain energy on that. 699 00:33:20,064 --> 00:33:22,484 I'm not going to have much brain energy left on like what actually 700 00:33:22,484 --> 00:33:23,674 makes Overtone interesting. 701 00:33:23,774 --> 00:33:26,994 So I think then, you know, where, where is this not true that I'm saying? 702 00:33:27,004 --> 00:33:28,684 I think it's like with entertainment and art. 703 00:33:29,189 --> 00:33:29,439 Right. 704 00:33:29,449 --> 00:33:32,409 If I visit like a website that is supposed to give me an experience, 705 00:33:32,809 --> 00:33:34,409 what I'm saying does not apply, right? 706 00:33:34,419 --> 00:33:37,719 If I like play a video game and part of the video game, it's just like, 707 00:33:37,729 --> 00:33:39,899 there's just some, some ideas about you. 708 00:33:39,899 --> 00:33:43,459 You kind of want the person to think about like how you interact with something 709 00:33:43,459 --> 00:33:48,619 instead of a button on top of like the screen, maybe you like, there's a 3d 710 00:33:48,619 --> 00:33:50,469 world and you interact with some liver. 711 00:33:50,529 --> 00:33:54,839 So, so it doesn't apply everything, but I think in vast majority of web apps, 712 00:33:55,234 --> 00:33:57,264 What I'm talking about is like an issue. 713 00:33:57,384 --> 00:33:57,734 Right. 714 00:33:57,784 --> 00:34:03,134 Uh, I always look about like the web as a spectrum from going for like what 715 00:34:03,134 --> 00:34:08,544 the web was originally created for websites to now what we are also using 716 00:34:08,544 --> 00:34:12,244 the big web hammer for is like for web apps, and I think there is this 717 00:34:12,394 --> 00:34:16,104 spectrum and my theory is that we're. 718 00:34:16,714 --> 00:34:21,784 the web apps, this is where it really matters that the apps feel more native 719 00:34:21,824 --> 00:34:26,184 and that all the paper cuts are really like worked out, but they are not. 720 00:34:26,364 --> 00:34:29,864 And I think this is where we are using the wrong, the wrong hammer 721 00:34:30,024 --> 00:34:32,194 for building those, those web apps. 722 00:34:32,564 --> 00:34:38,624 And so I think one way to think about addressing that is I think to build 723 00:34:38,624 --> 00:34:43,544 those apps in a, in a more local-first way as a way out of that misery. 724 00:34:43,814 --> 00:34:44,834 Would you agree with that? 725 00:34:44,874 --> 00:34:49,154 Or do you have other ideas how we make the web better in those cases? 726 00:34:49,434 --> 00:34:52,404 I think the local-first approach is one of them. 727 00:34:52,474 --> 00:34:53,234 I think that it's. 728 00:34:53,644 --> 00:34:57,894 It's interesting how making a web app local-first is kind of like playing 729 00:34:57,894 --> 00:35:01,904 on hard mode, I think, since the web is fundamentally centralized, if you 730 00:35:01,914 --> 00:35:03,354 think what, what defines the web? 731 00:35:03,354 --> 00:35:06,594 Well, I think hypertext, like, you know, originally defined the web. 732 00:35:06,604 --> 00:35:09,584 And I think today it's more like web browsers define the web and hypertext is 733 00:35:09,594 --> 00:35:13,994 like 1 medium, you know, you could open a PDF, you know, in SafarI can open a PDF. 734 00:35:14,814 --> 00:35:16,764 I can do that in Chrome too, but it sucks. 735 00:35:16,834 --> 00:35:20,784 And it's fundamentally like built on this idea that like, I have a 736 00:35:20,784 --> 00:35:23,594 portal that connects to a service somewhere else over the internet. 737 00:35:23,884 --> 00:35:28,214 And, you know, now we have like things in the web browser 738 00:35:28,214 --> 00:35:29,344 that kind of fuses the border. 739 00:35:29,344 --> 00:35:34,054 But, um, if you think about like a local email client instead, right. 740 00:35:34,254 --> 00:35:37,744 Or an email client running on iOS or something like that, then you're not 741 00:35:37,754 --> 00:35:40,234 starting out in an environment that is. 742 00:35:40,864 --> 00:35:43,914 Already set up against you, so to speak, if you're not trying to 743 00:35:43,914 --> 00:35:45,264 build something local-first, right? 744 00:35:45,454 --> 00:35:47,054 It's kind of neutral ground, right? 745 00:35:47,054 --> 00:35:50,254 You can build an email client that works like a web browser, right? 746 00:35:50,254 --> 00:35:53,664 That like the first thing that does when it starts up is to connect to 747 00:35:53,734 --> 00:35:57,524 a server somewhere and ask it what emails does Johannes have, right? 748 00:35:58,144 --> 00:36:01,284 Another way of doing it, you can, but you have to write that code, right? 749 00:36:01,314 --> 00:36:05,444 And now they're like conscious, like choice that you can make is. 750 00:36:06,154 --> 00:36:07,414 Let's read from a database. 751 00:36:07,414 --> 00:36:09,844 What emails I already know Johannes have. 752 00:36:10,199 --> 00:36:12,419 And now I'm going to go and ask a server if there are any new 753 00:36:12,419 --> 00:36:13,779 emails to put in that database. 754 00:36:14,109 --> 00:36:17,539 Whereas on the web, like you have that first choice made for you. 755 00:36:17,769 --> 00:36:20,249 And to some extent, like you can't even undo that choice. 756 00:36:20,359 --> 00:36:21,879 You have to kind of work around it. 757 00:36:21,929 --> 00:36:24,899 So I think like your question was really about like, does 758 00:36:24,899 --> 00:36:26,509 local-first make the web better? 759 00:36:26,539 --> 00:36:28,359 Like, what can we do to like fix it? 760 00:36:28,359 --> 00:36:29,509 And what's the issue? 761 00:36:29,789 --> 00:36:34,309 I think the, the solve here is, is more about the user experience. 762 00:36:34,309 --> 00:36:34,829 I think. 763 00:36:35,224 --> 00:36:38,674 You said the web was kind of made for web pages and, and I would go a 764 00:36:38,674 --> 00:36:41,574 little further to say the web was kind of made for like documents, right? 765 00:36:41,574 --> 00:36:42,344 Like text document. 766 00:36:42,924 --> 00:36:46,824 I think your average marketing website when information about some 767 00:36:46,824 --> 00:36:50,714 service or product or whatever, or like, uh, you know, an essay or an 768 00:36:50,724 --> 00:36:55,814 article about to learn about something that HTML and CSS is great for, I 769 00:36:55,814 --> 00:36:57,034 mean, this is what it's made for. 770 00:36:57,074 --> 00:36:57,854 It's fantastic. 771 00:36:57,864 --> 00:37:01,684 It's like a layout tool for like, you know, text and images and video and stuff. 772 00:37:01,684 --> 00:37:01,944 Right. 773 00:37:02,204 --> 00:37:03,674 And of course we've gone way beyond that. 774 00:37:03,674 --> 00:37:07,694 We can now have interactive elements to learn about how like a, I don't know, some 775 00:37:07,694 --> 00:37:09,774 sort of water lock on a boat works right. 776 00:37:09,774 --> 00:37:10,704 By like playing around with it. 777 00:37:10,704 --> 00:37:11,564 And that's super cool. 778 00:37:11,604 --> 00:37:14,154 And I think that's where it like really shines the medium. 779 00:37:14,224 --> 00:37:16,824 But then you think about something like Figma where we, where we 780 00:37:16,824 --> 00:37:20,104 spent over 1000 engineering hours on just the context menus. 781 00:37:20,509 --> 00:37:23,179 Which is insane and they still kind of suck, you know, and 782 00:37:23,229 --> 00:37:24,749 that that is like, not okay. 783 00:37:24,749 --> 00:37:27,839 I think it's a good, like, think to think about, like, do I want 784 00:37:27,839 --> 00:37:29,859 to spend if I care about quality? 785 00:37:29,929 --> 00:37:33,119 And I think a lot of people listening to this do care about quality. 786 00:37:33,119 --> 00:37:36,929 And it's maybe 1 of the reasons they even started thinking about local-first. 787 00:37:36,929 --> 00:37:41,049 If If I care about the quality of the thing that I'm building and the people 788 00:37:41,049 --> 00:37:43,919 have a good experience with it, there's a couple of trade offs I have to do. 789 00:37:43,999 --> 00:37:44,279 Right? 790 00:37:44,279 --> 00:37:45,079 Like, first off. 791 00:37:45,079 --> 00:37:45,239 Yeah. 792 00:37:45,399 --> 00:37:46,939 You can't just get quality for free. 793 00:37:46,959 --> 00:37:48,079 Quality has a cost. 794 00:37:48,249 --> 00:37:51,449 So usually that means I will have less features or fewer features. 795 00:37:51,629 --> 00:37:55,489 And it probably also means that I will have to spend more time in a couple of 796 00:37:55,499 --> 00:37:57,939 areas that are like hard to identify. 797 00:37:58,059 --> 00:38:01,159 And in turn, that means I have to spend time identifying those areas, right? 798 00:38:01,259 --> 00:38:02,769 Something like context menus at Figma. 799 00:38:03,334 --> 00:38:06,574 Time, like trying to understand, like, what, what is a good context menu? 800 00:38:06,584 --> 00:38:07,844 Like, what do people expect? 801 00:38:08,004 --> 00:38:11,634 This is still a lot of, still a lot of product or engineer work or 802 00:38:11,634 --> 00:38:14,234 whatever you want to call it, design work, but it's not work where you 803 00:38:14,234 --> 00:38:16,134 like write code or like draw things. 804 00:38:16,144 --> 00:38:18,654 This is like, you speak with people and you thinking whiteboard 805 00:38:18,654 --> 00:38:19,524 and all that kind of stuff. 806 00:38:19,524 --> 00:38:19,734 Right. 807 00:38:19,764 --> 00:38:21,544 But that's still like an important part. 808 00:38:21,699 --> 00:38:24,829 Uh, on the road to getting to something that has like decent quality, because 809 00:38:24,839 --> 00:38:27,979 then the next step is going to be, now that we understand like what people 810 00:38:27,979 --> 00:38:32,099 expect and, and I think quality and expectations are very much intertwined. 811 00:38:32,289 --> 00:38:33,889 Now we know what, what to build. 812 00:38:34,119 --> 00:38:37,089 And then you have like something like the web platform with this input event 813 00:38:37,109 --> 00:38:40,059 model and it's focusing system and all this kind of stuff you have to sort 814 00:38:40,059 --> 00:38:43,589 of like, you know, that's another like place where you got to invest time. 815 00:38:43,589 --> 00:38:43,859 Right. 816 00:38:43,999 --> 00:38:48,689 So I think like what a possible better future might look like is if you imagine 817 00:38:48,689 --> 00:38:53,689 in a web browser, Having a different content type that's like, I don't know, 818 00:38:53,809 --> 00:38:56,369 um, application slash application. 819 00:38:56,379 --> 00:38:57,109 I don't know, whatever. 820 00:38:57,119 --> 00:38:57,649 It doesn't matter. 821 00:38:58,299 --> 00:39:03,209 So like a server, like sends back like a blob of data that is this 822 00:39:03,219 --> 00:39:07,389 different format, uh, instead of HTML for something that's an app. 823 00:39:07,719 --> 00:39:07,999 Right. 824 00:39:08,219 --> 00:39:09,909 I think that's a stopgap solution. 825 00:39:09,959 --> 00:39:12,309 And I wouldn't be surprised if someone like Arc or something is 826 00:39:12,309 --> 00:39:13,509 like working on this right now. 827 00:39:13,649 --> 00:39:17,489 But that's going to require developers to like write apps in a different way. 828 00:39:17,529 --> 00:39:18,149 And I think that's a. 829 00:39:18,469 --> 00:39:19,769 Big deal. 830 00:39:19,829 --> 00:39:22,639 And you're still going to be in the scenario for web browser. 831 00:39:22,679 --> 00:39:24,219 That's fundamentally centralized, right? 832 00:39:24,239 --> 00:39:28,019 The whole model is like you're in inside this like little box 833 00:39:28,349 --> 00:39:30,189 on your very powerful computer. 834 00:39:30,519 --> 00:39:33,429 You put this little box inside your like amazing powerful computer. 835 00:39:33,629 --> 00:39:37,039 That's like literally like visually a little box inside and this 836 00:39:37,039 --> 00:39:40,009 little box inside now can only use some of your resources, right? 837 00:39:40,369 --> 00:39:41,879 It's single threaded mostly. 838 00:39:42,159 --> 00:39:44,949 And it can use maybe two gigabytes or four gigabytes of your 839 00:39:44,949 --> 00:39:47,129 like 90 gigabyte, like memory. 840 00:39:47,139 --> 00:39:50,139 And, you know, you got all of these like kind of weird things and that 841 00:39:50,139 --> 00:39:53,139 is not going to go away, but, and, and the more long term solution might 842 00:39:53,139 --> 00:39:56,279 be something, something a little different or like maybe bringing back 843 00:39:56,279 --> 00:39:57,369 native apps, whatever that means. 844 00:39:57,459 --> 00:39:59,749 I don't know what that means, but anyhow, the user experience here, I 845 00:39:59,749 --> 00:40:04,709 think like moving away from HTML and CSS, it's, it's a, it's a, I don't 846 00:40:04,709 --> 00:40:06,369 even, I can't really see the path. 847 00:40:06,629 --> 00:40:09,669 Toward that, but I think that would be like a true improvement to 848 00:40:09,669 --> 00:40:12,739 quality where I can say, I want a context menu with these things in it. 849 00:40:13,089 --> 00:40:16,029 And I know that it's going to work and work everywhere. 850 00:40:16,039 --> 00:40:17,299 And people know what to expect. 851 00:40:17,329 --> 00:40:21,019 And I can spend like maybe one day on putting that context menu 852 00:40:21,019 --> 00:40:23,709 together and testing and stuff instead of like, you know, a year. 853 00:40:23,809 --> 00:40:24,739 What do you think? 854 00:40:24,739 --> 00:40:26,499 Like, you've been asking me a lot of questions. 855 00:40:26,499 --> 00:40:30,089 I'm also really curious what you think about these things because you actually 856 00:40:30,139 --> 00:40:32,049 think about this like day to day, right? 857 00:40:32,189 --> 00:40:33,369 When it comes to like the web. 858 00:40:33,809 --> 00:40:37,179 Would you agree or do you disagree when it comes to like the, you know, the 859 00:40:37,179 --> 00:40:41,639 quality and the fit of HTML and CSS here toward like a model that's better? 860 00:40:41,949 --> 00:40:42,999 I completely agree. 861 00:40:43,049 --> 00:40:47,489 I haven't reached the context menu stage yet in the app development journey, 862 00:40:47,789 --> 00:40:52,959 but I've so far spent a lot of time on tables and just making the app fast. 863 00:40:52,959 --> 00:40:56,729 We haven't talked, we've like somehow touched on performance, but another 864 00:40:56,729 --> 00:41:01,799 aspect besides just raw capabilities of the web is also just making the app fast. 865 00:41:01,829 --> 00:41:06,219 Building a fast web app is something that's like you said, like it's, it's 866 00:41:06,219 --> 00:41:10,399 an hard mode, not just hard mode in terms of capabilities, but also hard 867 00:41:10,399 --> 00:41:14,889 mode in terms of performance, since if you want to build things in a 868 00:41:14,959 --> 00:41:20,636 like rich, interactive experiences with that HTML, CSS document model. 869 00:41:20,666 --> 00:41:22,236 That's not what it was built for. 870 00:41:22,336 --> 00:41:27,256 And so this is where I find myself reaching for other approaches now. 871 00:41:27,286 --> 00:41:31,876 So I'm specifically for like the table component I've mentioned, I'm using a 872 00:41:31,876 --> 00:41:37,456 great tool or a great software project called Glide Data Grid, which, um, is 873 00:41:37,456 --> 00:41:42,456 like a React table implementation, but which is rendered entirely on a canvas. 874 00:41:43,346 --> 00:41:49,706 Um, and so that allows you to get like 120 FPS smooth experience and 875 00:41:49,716 --> 00:41:54,816 way outperforms any other react table implementation out there, but 876 00:41:54,826 --> 00:41:57,256 you gotta switch your mindset a bit. 877 00:41:57,266 --> 00:42:01,916 So you're no longer tweaking CSS values and wrapping things 878 00:42:01,916 --> 00:42:04,220 in 5 deeply nested divs. 879 00:42:04,301 --> 00:42:09,311 But if you want something more custom, you got to reach for like the canvas 880 00:42:09,341 --> 00:42:14,001 API and go back to drawing rectangles and so on, which I personally enjoy. 881 00:42:14,001 --> 00:42:17,791 And I think a lot of other people have also come to like 882 00:42:17,811 --> 00:42:19,111 rediscover this approach. 883 00:42:19,141 --> 00:42:20,291 That is actually quite nice. 884 00:42:20,911 --> 00:42:25,356 But I think, Looking at this more broadly, I think there could be almost like a 885 00:42:25,466 --> 00:42:31,056 app kit kind of abstraction, what you got on, on iOS, on Mac, but maybe for 886 00:42:31,056 --> 00:42:36,316 the web, maybe like a whole new, whether it's, uh, the MIME type like application 887 00:42:36,316 --> 00:42:41,126 slash application or something else, but that I think we have now really powerful 888 00:42:41,136 --> 00:42:46,426 primitives, whether it's web GPU and WASM, et cetera, where we can have like 889 00:42:46,426 --> 00:42:50,966 entirely different model, we leverage the distribution mechanism of the web. 890 00:42:51,746 --> 00:42:54,686 But we're going for like a flash 2. 891 00:42:54,726 --> 00:42:59,616 0, but I think there's some really interesting developments there. 892 00:42:59,656 --> 00:43:03,886 And, uh, this glide data grid canvas table that I'm using, I think that's just 893 00:43:03,886 --> 00:43:06,366 like the beginning of, of new approaches. 894 00:43:06,606 --> 00:43:11,226 So another, uh, notable project that comes to mind is, uh, it's called eGPU. 895 00:43:11,246 --> 00:43:13,026 I think, uh, no, sorry, eGUI. 896 00:43:13,256 --> 00:43:16,426 Oh, by Emil at, uh, uh, Rerun. 897 00:43:16,751 --> 00:43:17,431 Exactly. 898 00:43:17,571 --> 00:43:17,971 Yeah. 899 00:43:18,201 --> 00:43:20,941 So that, that's a really compelling project. 900 00:43:20,951 --> 00:43:26,631 I think it's still, um, I think it's both come along really, really far, but 901 00:43:26,641 --> 00:43:31,621 it's still early compared to like all the primitives that you're getting from like 902 00:43:31,651 --> 00:43:38,521 HTML and CSS, and it's kind of a miracle how capable browsers still are and how. 903 00:43:38,726 --> 00:43:43,376 Relatively speaking, how performant all of those things are compared to 904 00:43:43,376 --> 00:43:46,416 the complexity that they can afford. 905 00:43:46,456 --> 00:43:48,616 So I'm of the same opinions like that. 906 00:43:48,616 --> 00:43:51,276 I have a love hate relationship with the web. 907 00:43:51,586 --> 00:43:51,846 Yeah. 908 00:43:51,856 --> 00:43:54,066 I just want to like reflect on what you were saying. 909 00:43:54,436 --> 00:43:56,516 It's, it is interesting though, right? 910 00:43:56,516 --> 00:43:59,996 How you're talking about the table component, how you're basically 911 00:44:00,006 --> 00:44:01,456 just like exiting out from. 912 00:44:01,996 --> 00:44:04,096 All of the HTML and CSS, right? 913 00:44:04,376 --> 00:44:05,326 It's kind of what the canvas is. 914 00:44:05,326 --> 00:44:08,346 You punch a hole through all of that stuff and you say, I'm 915 00:44:08,346 --> 00:44:11,486 just going to go like start from scratch, basically, and draw pixels. 916 00:44:11,666 --> 00:44:14,116 And now you're going to, you're going to make some trade offs, right? 917 00:44:14,116 --> 00:44:16,116 Like you're going to have to implement your own like 918 00:44:16,136 --> 00:44:18,066 shadow DOM for accessibility. 919 00:44:18,066 --> 00:44:21,686 And you're going to have to like, you know, re implement things like scrolling. 920 00:44:21,726 --> 00:44:23,996 And you're going to, there's like, now there's like an 921 00:44:24,006 --> 00:44:25,496 ocean of stuff you have to do. 922 00:44:25,546 --> 00:44:29,216 And perhaps that's why you use the third party code that maybe has 923 00:44:29,286 --> 00:44:30,796 already climbed this mountain for you. 924 00:44:31,096 --> 00:44:34,756 But it is interesting how, like the solution, so to speak, for your 925 00:44:34,756 --> 00:44:38,736 problems there was just like, not use the web platform essentially. 926 00:44:38,766 --> 00:44:38,966 Right. 927 00:44:38,976 --> 00:44:40,416 Like not use HTML and CSS. 928 00:44:40,696 --> 00:44:43,926 I think that's why, like there's eGUI, there's like, you know, there's, 929 00:44:44,026 --> 00:44:50,056 uh, Deere image GUI, there is make pad, there's like Zed and warp. 930 00:44:50,056 --> 00:44:52,496 And there's like, there's so many projects that develop their own. 931 00:44:52,631 --> 00:44:57,191 UI frameworks, some of them target just like some unknown platform. 932 00:44:57,191 --> 00:44:58,311 That's kind of all of them. 933 00:44:58,471 --> 00:45:01,491 Some of them specifically target the web, but I think what they all have in common 934 00:45:01,491 --> 00:45:02,881 is that like, they don't use the web. 935 00:45:02,991 --> 00:45:03,231 Right. 936 00:45:03,281 --> 00:45:06,861 And I think the web is like the dominant HTML and what 937 00:45:06,861 --> 00:45:08,051 makes a computer fast, right? 938 00:45:08,051 --> 00:45:10,491 Like, or what makes software on a computer fast? 939 00:45:10,691 --> 00:45:13,941 So the hardware we already talked earlier about the hardware that we have today. 940 00:45:13,951 --> 00:45:14,421 It's like. 941 00:45:14,841 --> 00:45:17,281 So ridiculously fast. 942 00:45:17,661 --> 00:45:20,561 It's hard to comprehend how like fast computers are today. 943 00:45:20,881 --> 00:45:24,411 Even computers from five years ago are like mind blowingly fast, but 944 00:45:24,951 --> 00:45:27,291 software keeps getting more complex. 945 00:45:27,661 --> 00:45:28,011 Right? 946 00:45:28,111 --> 00:45:31,741 So there's always that, like, there's the balance of hardware, hardware 947 00:45:31,741 --> 00:45:35,661 engineers makes things go faster and software engineers make things go slower. 948 00:45:35,831 --> 00:45:36,131 Right. 949 00:45:36,201 --> 00:45:38,261 There's that, that it's like a pump. 950 00:45:38,471 --> 00:45:39,521 It goes like that forever. 951 00:45:39,581 --> 00:45:43,361 And so, yeah, you take something like, like one of these, like, uh, 952 00:45:43,371 --> 00:45:47,651 new GUIs that are implemented on just like, uh, Canvas or like Figma, right. 953 00:45:47,731 --> 00:45:51,741 They are fast because like, they just do less like shit. 954 00:45:52,061 --> 00:45:53,611 Like it's as simple as that, right? 955 00:45:53,611 --> 00:45:56,421 They just like cut out some stuff that they don't need. 956 00:45:56,511 --> 00:46:00,091 What makes software go fast on a technical level at 15, 20 years ago, it 957 00:46:00,091 --> 00:46:02,481 was, it was like, uh, processing speed. 958 00:46:02,541 --> 00:46:05,561 People will do a lot of smart things with caching to make things go faster. 959 00:46:05,561 --> 00:46:06,711 Today it's memory, right? 960 00:46:06,751 --> 00:46:10,931 If you, and memory and context switching, and you know, you can go further up in the 961 00:46:10,931 --> 00:46:15,281 abstraction stack, but like fundamentally you have a CPU, right, or like a core of 962 00:46:15,281 --> 00:46:18,911 a CPU and you have a conveyor belt and on the conveyor belt are instructions, right? 963 00:46:19,071 --> 00:46:21,601 And there are things like load something from memory. 964 00:46:22,106 --> 00:46:25,016 Uh, and load something else from memory, add those two things together 965 00:46:25,266 --> 00:46:29,226 and then put the result, like upload that to memory here, right? 966 00:46:29,226 --> 00:46:30,126 That's all it does. 967 00:46:30,126 --> 00:46:31,366 That's all the computer does, right? 968 00:46:31,416 --> 00:46:33,176 It just goes like this forever. 969 00:46:33,506 --> 00:46:36,106 The speed of this conveyor belt, and that's the CPU. 970 00:46:36,466 --> 00:46:39,736 It is so fast that it's basically today. 971 00:46:39,736 --> 00:46:42,176 It's like almost fully limited. 972 00:46:42,371 --> 00:46:44,451 By its ability to communicate with memory. 973 00:46:44,461 --> 00:46:45,771 So memory is really the limit. 974 00:46:45,831 --> 00:46:47,881 It, of course there it's more complex than this. 975 00:46:47,881 --> 00:46:49,971 And there's like many levels of memory and stuff like that. 976 00:46:50,251 --> 00:46:54,721 But I think what happens is we use these like high level things like JavaScript 977 00:46:54,861 --> 00:46:59,321 running in a, in like virtualized in some container on top of something else. 978 00:46:59,331 --> 00:47:03,581 So now like you got basically none of the benefits of really fast memory. 979 00:47:03,651 --> 00:47:07,491 That is the CPU has like a memory built in called registers. 980 00:47:07,541 --> 00:47:08,531 And then it has like a. 981 00:47:09,106 --> 00:47:11,216 A very small piece of memory that's nearby it. 982 00:47:11,216 --> 00:47:14,196 That's like the first level of like a cache, like a line cache 983 00:47:14,196 --> 00:47:17,546 and and further and further away and fetching something from memory. 984 00:47:17,816 --> 00:47:19,716 It's kind of like, imagine you're sitting by your desk 985 00:47:19,716 --> 00:47:21,156 and you need a pen to write on. 986 00:47:21,296 --> 00:47:25,456 If you have opinions next to you, that's kind of if it's in, in, in the line 987 00:47:25,456 --> 00:47:26,976 cache in the CPU, you just pick it up. 988 00:47:26,986 --> 00:47:28,210 Be right with it. 989 00:47:28,391 --> 00:47:32,451 And now like getting the pen from memory, it's like walking to your neighbor's 990 00:47:32,451 --> 00:47:36,231 apartment to borrow a pen, going back and writing one thing and then going back 991 00:47:36,231 --> 00:47:37,721 to the neighbor again to leave the pen. 992 00:47:37,741 --> 00:47:39,921 Like that's the order of magnitude of difference. 993 00:47:39,921 --> 00:47:40,191 Right. 994 00:47:40,401 --> 00:47:43,851 And now you use something like, like a higher level thing, like JavaScript, the 995 00:47:43,851 --> 00:47:45,511 Python, or there's like many, many things. 996 00:47:45,511 --> 00:47:49,111 I'm not saying one thing is like bad or good, but just the concept of it. 997 00:47:49,576 --> 00:47:52,306 Urea is always going to have to go to the neighbor for that patent, right? 998 00:47:52,306 --> 00:47:54,346 You can very rarely like use the same. 999 00:47:54,416 --> 00:47:57,386 If you have things adjacent in memory and you access them, like you're 1000 00:47:57,386 --> 00:48:01,136 looping over like a, an array of things that are all in this contiguous 1001 00:48:01,136 --> 00:48:02,646 array of things, like in memory. 1002 00:48:02,776 --> 00:48:04,666 That's like, that's like basically free. 1003 00:48:04,716 --> 00:48:08,736 If you have an array that points, like that are pointers to things. 1004 00:48:09,051 --> 00:48:11,961 That's just like a hundred times slower, at least it's, it's, it's 1005 00:48:11,971 --> 00:48:13,271 not even like a little bit slower. 1006 00:48:13,281 --> 00:48:15,881 It's just like incomprehensibly slower than the first thing. 1007 00:48:15,991 --> 00:48:18,941 And so what a lot of like performance stuff does today and some of these 1008 00:48:18,981 --> 00:48:21,981 UEs, like they recognize this fact, like memory is the limitation. 1009 00:48:22,371 --> 00:48:23,891 We're just going to put things in a race. 1010 00:48:23,891 --> 00:48:25,461 We're going to use like memory allocation. 1011 00:48:25,461 --> 00:48:27,801 We're going to be conscious about memory and the web platform. 1012 00:48:27,811 --> 00:48:29,231 Like that's the second thing, right? 1013 00:48:29,241 --> 00:48:30,901 There's like, there's a blob of things. 1014 00:48:30,911 --> 00:48:34,211 There's a bag of stuff and you have pointers and you have a huge graph. 1015 00:48:34,391 --> 00:48:37,901 And so I think this is like, why a lot of those things are fast because they 1016 00:48:37,901 --> 00:48:39,641 have the mechanical sympathy, right? 1017 00:48:39,641 --> 00:48:42,981 They, they kind of realize that this is kind of how computer works and here 1018 00:48:42,981 --> 00:48:47,491 are the constraints and weaknesses and powers of how the actual computer 1019 00:48:47,501 --> 00:48:51,221 hardware works and, you know, things like scheduling and virtual memory. 1020 00:48:51,586 --> 00:48:53,276 And we're going to use that to our benefit, right? 1021 00:48:53,356 --> 00:48:56,146 And on the web platform, even if you do have mechanical sympathy 1022 00:48:56,146 --> 00:48:58,606 and you do understand this, there's nothing you can do about it. 1023 00:48:59,306 --> 00:49:01,876 Even in WebAssembly, you don't, there's no stack, right? 1024 00:49:02,266 --> 00:49:04,246 I guess it's like this implicit kind of stack machine. 1025 00:49:04,246 --> 00:49:09,206 And even at that level, you have some, you have some very limited abilities to manage 1026 00:49:09,206 --> 00:49:13,086 that, you know, that very sort of low level to squeeze the last performance out. 1027 00:49:13,096 --> 00:49:15,936 I think video games is like a, an interesting like place to 1028 00:49:15,936 --> 00:49:18,941 look because they, They have a very, very tight frame budget. 1029 00:49:18,981 --> 00:49:20,341 And that is like a holy thing. 1030 00:49:20,341 --> 00:49:21,271 You don't break that. 1031 00:49:21,731 --> 00:49:23,591 you might drop an entire frame. 1032 00:49:23,601 --> 00:49:24,591 You might drop objects. 1033 00:49:24,621 --> 00:49:26,991 So you might like just what the modern games do today. 1034 00:49:26,991 --> 00:49:29,101 Instead of dropping frames, they, they drop objects. 1035 00:49:29,131 --> 00:49:30,191 So they drop quality. 1036 00:49:30,271 --> 00:49:32,731 Maybe the textures like gets a little fussier for a little 1037 00:49:32,731 --> 00:49:34,331 while just to make that happen. 1038 00:49:34,351 --> 00:49:37,641 And we're talking about, we're measuring things in microseconds at this point. 1039 00:49:37,871 --> 00:49:40,511 And I think a lot of people who work with web software, like even if they 1040 00:49:40,511 --> 00:49:44,241 wanted to, It would be kind of like, uh, you know, an uphill battle. 1041 00:49:44,431 --> 00:49:46,481 So you measure things in milliseconds. 1042 00:49:46,481 --> 00:49:48,781 They're like, Oh, this is takes only eight milliseconds. 1043 00:49:49,131 --> 00:49:50,401 And that's like eight milliseconds. 1044 00:49:50,451 --> 00:49:53,671 That's like an ocean of time for someone working on a video game. 1045 00:49:53,681 --> 00:49:56,251 That's like, that's like basically the entire game. 1046 00:49:56,611 --> 00:49:57,221 Like running. 1047 00:49:57,221 --> 00:49:59,001 It's, it's entire like thing. 1048 00:49:59,011 --> 00:49:59,931 It's like eight milliseconds. 1049 00:50:00,011 --> 00:50:00,221 Right? 1050 00:50:00,451 --> 00:50:00,811 Yeah. 1051 00:50:00,861 --> 00:50:02,261 in the web, we don't even have. 1052 00:50:02,461 --> 00:50:06,211 Uh, mechanisms to get more fine-grained resolution than 1053 00:50:06,211 --> 00:50:10,561 milliseconds in, in most browsers, like, I think for security reasons. 1054 00:50:10,561 --> 00:50:13,921 I think there, there was once, but I think it's mostly been 1055 00:50:13,926 --> 00:50:15,541 removed in, in many browsers. 1056 00:50:16,141 --> 00:50:19,411 But it's a, it's a very interesting parallel, what we've been talking 1057 00:50:19,416 --> 00:50:23,131 about in regards to getting the best performance in the web. 1058 00:50:23,431 --> 00:50:27,651 You gotta abandon a little bit of the primitives that the web gives you. 1059 00:50:28,176 --> 00:50:30,296 Punch through and go more lower level. 1060 00:50:30,576 --> 00:50:34,526 And it's a very interesting parallel to what we've talked about earlier in 1061 00:50:34,526 --> 00:50:38,736 regards to the data models, whether you use like a really powerful database and 1062 00:50:38,736 --> 00:50:40,436 then you start peeling off the layers. 1063 00:50:40,756 --> 00:50:45,446 It's basically the same story just for a different, um, for, for a different 1064 00:50:45,456 --> 00:50:50,566 use case here, whether one is like fast UIs and the other is fast data. 1065 00:50:50,796 --> 00:50:55,806 So you as someone who's so prolific in building apps, building tools, 1066 00:50:56,176 --> 00:51:00,096 I'm curious whether there is any apps or tools that you particularly 1067 00:51:00,126 --> 00:51:01,986 admire and love using today. 1068 00:51:02,506 --> 00:51:05,506 I think that there's quite a few, but not as many as I would like. 1069 00:51:05,566 --> 00:51:09,346 One that comes to mind that I started using recently, maybe three 1070 00:51:09,346 --> 00:51:11,206 years ago, it's called MimeStream. 1071 00:51:11,356 --> 00:51:12,896 It's by this indie developer. 1072 00:51:13,316 --> 00:51:14,176 It's a Mac app. 1073 00:51:14,376 --> 00:51:15,376 It's a native Mac app. 1074 00:51:15,376 --> 00:51:16,336 It's an email client. 1075 00:51:16,486 --> 00:51:18,516 And it's the first time in a very long time. 1076 00:51:18,516 --> 00:51:20,656 I used an email client that like I liked using. 1077 00:51:20,666 --> 00:51:25,090 I think mailbox on iOS was the last time I used an email client that I liked. 1078 00:51:25,471 --> 00:51:28,741 Everything since then has been like a bit of a disappointment for me. 1079 00:51:28,811 --> 00:51:30,111 So that's just like a piece of software. 1080 00:51:30,111 --> 00:51:34,781 I think in recent years I've been sort of pleasantly surprised by. 1081 00:51:34,951 --> 00:51:36,861 Sublime text is like that. 1082 00:51:36,911 --> 00:51:39,471 That's usually the editor that I use for, for writing. 1083 00:51:39,571 --> 00:51:41,831 And I'm kind of a person, I have used a few tools and I 1084 00:51:41,831 --> 00:51:43,321 use them for, for everything. 1085 00:51:43,341 --> 00:51:47,201 So I have very few like programs that I use and I tend to use each program. 1086 00:51:47,666 --> 00:51:51,706 For a lot of tasks, the sublime text for me, it's like fantastic. 1087 00:51:51,726 --> 00:51:54,736 It, and iTerm is another one, but it's very, very niche thing. 1088 00:51:54,736 --> 00:52:00,376 But, uh, sublime text kind of, uh, text works the same on pretty much the 1089 00:52:00,376 --> 00:52:07,306 same on like Ubuntu, Linux, Windows, Mac OS, but it like respects like the 1090 00:52:07,306 --> 00:52:10,206 lay of the land of these different platforms, like shortcuts, like window 1091 00:52:10,206 --> 00:52:13,786 behavior, scrolling It's very, very fast. 1092 00:52:13,796 --> 00:52:17,056 Most operations, like you just finished when you ask for them. 1093 00:52:17,701 --> 00:52:20,071 You know, there's no sort of measurable delay. 1094 00:52:20,371 --> 00:52:23,871 One thing that I think is really neat about sublime and this, this goes for 1095 00:52:23,871 --> 00:52:27,061 a few other apps, like, uh, I termed that I mentioned or something really, 1096 00:52:27,061 --> 00:52:30,971 really cool as well in this vein is like, uh, they, they care about state 1097 00:52:31,071 --> 00:52:32,811 sublime text care about state, right? 1098 00:52:32,811 --> 00:52:34,261 And I think there's a lot of apps today. 1099 00:52:34,261 --> 00:52:36,261 Even iOS apps, like don't do this anymore. 1100 00:52:36,601 --> 00:52:39,841 Meaning that if it is come on cute, just quit sublime, right? 1101 00:52:39,841 --> 00:52:41,801 Let's say I got a bunch of windows open. 1102 00:52:41,831 --> 00:52:45,681 Each window has a bunch of tabs, different text files, some of them not saved. 1103 00:52:46,176 --> 00:52:49,936 Some text selection scroll, we might be talking about 100 files open, right? 1104 00:52:49,946 --> 00:52:53,256 Think about your web browser and tabs and like scroll position text selection. 1105 00:52:53,566 --> 00:52:57,156 And I quit it and first off quitting it takes like a 2nd, right? 1106 00:52:57,166 --> 00:52:59,956 It doesn't, I don't have to, like, if I quit Chrome, I have to sit there and wait. 1107 00:53:00,066 --> 00:53:02,876 And then if that was a mistake and I started again, what happens is that, 1108 00:53:02,876 --> 00:53:04,400 like, all the windows come back up. 1109 00:53:04,411 --> 00:53:08,091 Um, exactly the way the word, the same Texas elected skull possession. 1110 00:53:08,861 --> 00:53:11,951 And this might seem like, Oh, that, that doesn't seem so valuable. 1111 00:53:11,991 --> 00:53:17,261 But what it does is it makes me not afraid of software. 1112 00:53:17,301 --> 00:53:19,011 It makes me not hoarding tabs. 1113 00:53:19,041 --> 00:53:21,141 It makes me like not think twice. 1114 00:53:21,171 --> 00:53:24,111 If I, when I'm going to reach for sublime, because I know that the 1115 00:53:24,111 --> 00:53:25,921 cost is like basically zero, right? 1116 00:53:26,271 --> 00:53:27,871 If I like, Oh, I should write something. 1117 00:53:27,871 --> 00:53:28,831 I'm going to start sublime. 1118 00:53:28,871 --> 00:53:30,721 And I, and then I realized, Oh, I shouldn't. 1119 00:53:30,791 --> 00:53:31,491 And I can just quit it. 1120 00:53:32,266 --> 00:53:33,886 Well, it was a lot of other software. 1121 00:53:33,886 --> 00:53:36,176 There's just like, we touched on video games a couple of 1122 00:53:36,176 --> 00:53:37,306 times in this conversation too. 1123 00:53:37,306 --> 00:53:41,886 I think video games is this problem too today where I have to like commit 1124 00:53:42,026 --> 00:53:43,886 to this big time chunk of investment. 1125 00:53:43,936 --> 00:53:46,756 If I want to use something, if I want to switch tools, if I want to play 1126 00:53:46,756 --> 00:53:50,146 a game on the PlayStation, I need an hour to like apply updates before I can 1127 00:53:50,146 --> 00:53:51,746 play it and then get through the menus. 1128 00:53:51,746 --> 00:53:52,736 It takes 10 minutes, right? 1129 00:53:52,736 --> 00:53:53,666 And then load the game. 1130 00:53:54,371 --> 00:53:57,691 And now play for, for 10 minutes and now, Oh, time is up. 1131 00:53:57,731 --> 00:53:58,081 Right. 1132 00:53:58,511 --> 00:54:01,271 Or like I opened some web app and I have to wait like five 1133 00:54:01,311 --> 00:54:02,861 seconds for it to be functional. 1134 00:54:02,861 --> 00:54:04,451 And you know, there's this old cost. 1135 00:54:04,451 --> 00:54:06,271 And if I quit the tab now, right. 1136 00:54:06,281 --> 00:54:08,791 Baxin or whatever, I've lost most of my state. 1137 00:54:08,881 --> 00:54:12,821 So I think that there's some good software, but it's, uh, they used to 1138 00:54:12,831 --> 00:54:14,861 be more good software in my opinion. 1139 00:54:15,081 --> 00:54:17,371 I'm also like an old dude, so you know what they say. 1140 00:54:17,371 --> 00:54:19,481 Everything invented after you're 30 is just wrong. 1141 00:54:20,591 --> 00:54:24,051 So there's, there's some bias here, but I think that there's, um, there used to 1142 00:54:24,051 --> 00:54:27,981 be a lot of software that would qualify him in my book as being pretty good. 1143 00:54:28,031 --> 00:54:30,191 And there's not that much anymore. 1144 00:54:30,421 --> 00:54:30,971 How about you? 1145 00:54:31,021 --> 00:54:34,581 Do you have a, do you have an app or, or service or something you 1146 00:54:34,581 --> 00:54:37,731 think it's, it's doing particularly well on these, these accounts? 1147 00:54:37,851 --> 00:54:42,631 Well, so I definitely share your perspectives and observations. 1148 00:54:42,661 --> 00:54:46,571 And I wanted to also ask, like, whether it's just my feeling or whether that is 1149 00:54:46,571 --> 00:54:48,871 de facto, the case that they used to be. 1150 00:54:49,096 --> 00:54:53,846 More higher quality software in the past, and that has sort of degraded over, over 1151 00:54:53,846 --> 00:54:59,446 time for in terms of like apps that I, that are really like, uh, I can plus one 1152 00:54:59,446 --> 00:55:04,816 of the ones you've mentioned, I think, uh, telegram as an app on, uh, macro 1153 00:55:04,816 --> 00:55:10,096 as an, an iOS is, is one that I, that I like that just feels like very snappy. 1154 00:55:10,266 --> 00:55:14,976 But, uh, I agree like your observations in terms of, uh, like preserving 1155 00:55:15,006 --> 00:55:18,696 state kind of like respecting the, where a user left off. 1156 00:55:18,696 --> 00:55:21,446 And then when you come back, that is still all there. 1157 00:55:21,446 --> 00:55:25,186 That gives me confidence and just makes me less afraid of using it. 1158 00:55:25,216 --> 00:55:26,096 I definitely agree. 1159 00:55:26,526 --> 00:55:29,976 And then also, even if it does remember everything, just making 1160 00:55:30,066 --> 00:55:34,226 things fast or keeping things fast, that is another, another aspect 1161 00:55:34,236 --> 00:55:36,426 of just like respecting my time. 1162 00:55:36,436 --> 00:55:37,326 It's another. 1163 00:55:37,646 --> 00:55:41,516 Paper cuts when I'm using software and it takes forever to load. 1164 00:55:41,876 --> 00:55:45,366 It just makes me, it's not like that the software is broken, but 1165 00:55:45,386 --> 00:55:48,816 in a way, it like sucks out a little bit of joy out of my day. 1166 00:55:49,326 --> 00:55:54,595 And this is also something where I'm spending out of like the 95 to 5%. 1167 00:55:54,596 --> 00:55:59,296 This is where I'm spending probably one of the five, uh, on, on Overtone. 1168 00:55:59,396 --> 00:56:03,921 And given that Overtone is targeting the web, that is like you say, Very 1169 00:56:03,921 --> 00:56:08,231 much on hard mode and you got to poke through a lot of layers on the web. 1170 00:56:08,311 --> 00:56:12,091 And I take more inspiration from native development and app development 1171 00:56:12,421 --> 00:56:16,241 to try to get there, but it's really hard, but I do think it's possible. 1172 00:56:16,241 --> 00:56:21,081 I think it is possible to get the best of both worlds, at least like directionally 1173 00:56:21,091 --> 00:56:26,531 where you get the distribution of the web and directionally closer to the to the 1174 00:56:26,541 --> 00:56:29,491 performance of like a, a native platform. 1175 00:56:29,591 --> 00:56:35,031 I'm curious why you think that is that, uh, software in the past was maybe felt 1176 00:56:35,091 --> 00:56:37,261 higher quality, was higher quality. 1177 00:56:37,301 --> 00:56:38,581 Do you have a theory on that? 1178 00:56:38,901 --> 00:56:39,561 I do. 1179 00:56:39,671 --> 00:56:42,691 I think it's like as simple as technological constraints. 1180 00:56:42,741 --> 00:56:46,226 Earlier in this book, In this episode, we were talking about, or I was talking 1181 00:56:46,226 --> 00:56:51,166 about Spotify and sort of how they came about in a time where a web browser, 1182 00:56:51,176 --> 00:56:53,446 like the web platform just wasn't a fit. 1183 00:56:53,746 --> 00:56:54,946 It just didn't have the features. 1184 00:56:54,976 --> 00:56:58,546 You couldn't just play audio randomly or there were no web sockets and stuff. 1185 00:56:58,596 --> 00:56:59,616 I think a lot of like. 1186 00:56:59,896 --> 00:57:02,516 Software that we're talking about that we say like, Oh, that was kind 1187 00:57:02,516 --> 00:57:07,216 of good, like an old version of Outlook from Microsoft, or I know 1188 00:57:07,226 --> 00:57:09,026 like, uh, Microsoft Word these days. 1189 00:57:09,026 --> 00:57:10,886 It takes like 10 minutes to start on my computers. 1190 00:57:10,916 --> 00:57:11,346 I don't know. 1191 00:57:11,556 --> 00:57:13,016 Not 10 minutes, but it takes a long time. 1192 00:57:13,106 --> 00:57:15,286 I mentioned to you in the past. 1193 00:57:15,286 --> 00:57:19,786 I have this, uh, Mac book, a power book from 2002 and 1194 00:57:19,786 --> 00:57:21,626 it's a bit of a time capsule. 1195 00:57:21,786 --> 00:57:23,606 Uh, it still boots up just fine. 1196 00:57:23,636 --> 00:57:24,626 And it's like pretty fast. 1197 00:57:24,626 --> 00:57:26,676 And if I start certain apps, they start right away. 1198 00:57:26,676 --> 00:57:31,056 And I'm like, This got a mechanical hard drive that's like, I don't 1199 00:57:31,056 --> 00:57:33,926 know, 20, 20 something years old. 1200 00:57:33,996 --> 00:57:35,276 This shouldn't be this fast. 1201 00:57:35,276 --> 00:57:35,566 Right. 1202 00:57:36,026 --> 00:57:39,536 And I think it's that fast because there's a human, almost 1203 00:57:39,576 --> 00:57:43,036 constant, like set of thresholds. 1204 00:57:43,106 --> 00:57:46,106 If we forget about computer for a second, there's like, what is a 1205 00:57:46,156 --> 00:57:49,516 reasonable amount of time to wait for something to be ready for me to use? 1206 00:57:50,316 --> 00:57:54,346 I think the answer is it will be in relation to how 1207 00:57:54,346 --> 00:57:55,586 important it is to use that. 1208 00:57:55,656 --> 00:57:59,926 If I'm going to travel across the world somewhere, I am okay with spending 1209 00:57:59,926 --> 00:58:04,766 four hours in like taxis and airport security and stuff and getting on an 1210 00:58:04,776 --> 00:58:08,936 airplane before I get to the, into the air, on the air, in an airplane. 1211 00:58:09,286 --> 00:58:12,796 Whereas if I'm just like going to the grocery store, I would not 1212 00:58:12,796 --> 00:58:14,146 be okay with waiting four hours. 1213 00:58:14,501 --> 00:58:16,651 To like get on the bus to get to the grocery store. 1214 00:58:16,751 --> 00:58:21,261 It's in proportion to like the threshold or like the, where the amount of, 1215 00:58:21,281 --> 00:58:23,761 and the threshold is like, if I'm going to say, yes, okay, I'm going 1216 00:58:23,761 --> 00:58:24,861 to do it, I'm going to wait for it. 1217 00:58:24,881 --> 00:58:27,091 Or like, no, I'm going to find a different solution. 1218 00:58:27,101 --> 00:58:28,121 That's kind of the threshold. 1219 00:58:28,251 --> 00:58:29,931 It's in relationship to how important it is. 1220 00:58:30,171 --> 00:58:32,881 And I think this is a human thing and not something that's like, 1221 00:58:33,261 --> 00:58:35,621 Oh, that was the case in the nineties, but now it's different. 1222 00:58:35,631 --> 00:58:37,911 Or like, Oh, that's has to do with computers. 1223 00:58:38,081 --> 00:58:41,901 And so now let's say, yes, for the sake of conversation, uh, opening an 1224 00:58:41,911 --> 00:58:43,981 app, my threshold is like two seconds. 1225 00:58:44,091 --> 00:58:47,511 If the app hasn't started in two seconds, some app, whatever, Microsoft 1226 00:58:47,521 --> 00:58:51,541 Word, then I will probably just go and find a different solution. 1227 00:58:51,551 --> 00:58:55,041 Maybe I'll use notepad and windows to text that into macOS and I'm just going to be 1228 00:58:55,041 --> 00:58:56,521 fine with some features not being there. 1229 00:58:56,751 --> 00:59:00,551 I think that developers like have been very conscious about this or found this 1230 00:59:00,551 --> 00:59:04,891 out through research or somehow like know that like what this thing is, right? 1231 00:59:05,201 --> 00:59:05,551 Okay. 1232 00:59:05,581 --> 00:59:06,111 We need this. 1233 00:59:06,131 --> 00:59:08,251 We need Microsoft Word to start within two seconds. 1234 00:59:08,351 --> 00:59:09,461 Let's make that happen, right? 1235 00:59:09,501 --> 00:59:11,441 Otherwise we're, we're not going to get customers. 1236 00:59:11,681 --> 00:59:15,141 And then 20 years ago, you had to go to some pretty great lengths 1237 00:59:15,281 --> 00:59:18,261 to make something start within two seconds because you know, like 1238 00:59:18,261 --> 00:59:20,121 computers were a lot slower, right? 1239 00:59:20,131 --> 00:59:21,731 Hard drives are a lot slower and so on. 1240 00:59:21,851 --> 00:59:25,451 And today I think we have the same, we have exactly the same like human. 1241 00:59:25,696 --> 00:59:30,296 Properties, but now we can boot up like an OS, like I'm working on an OS. 1242 00:59:30,326 --> 00:59:33,486 We can boot our OS up in 250 milliseconds from scratch. 1243 00:59:33,831 --> 00:59:35,701 Like the kernel and everything and drivers, right? 1244 00:59:35,761 --> 00:59:40,891 We can boot up like our OS 10 times over before like Word 1245 00:59:40,901 --> 00:59:43,121 even, even has started on my Mac. 1246 00:59:43,281 --> 00:59:47,341 And that, like the fact that like our thing boots fast, 1247 00:59:47,371 --> 00:59:48,571 like that's kind of irrelevant. 1248 00:59:48,571 --> 00:59:52,681 It's more like a comparison that like you can make something quite complex, like an 1249 00:59:52,681 --> 00:59:55,171 operating system, like do a lot of stuff. 1250 00:59:55,241 --> 00:59:55,561 Right. 1251 00:59:55,681 --> 00:59:57,711 And so what does Word do when you start it up? 1252 00:59:57,741 --> 01:00:00,971 And it takes like, you know, 5, 10 seconds for it to start. 1253 01:00:01,551 --> 01:00:04,051 I don't know, but it must be doing a lot of stuff. 1254 01:00:04,681 --> 01:00:06,941 And so I think that's what keeps happening over time. 1255 01:00:07,121 --> 01:00:09,931 We just keep doing more and more and more and we're doing 1256 01:00:09,931 --> 01:00:11,911 less and less like clever stuff. 1257 01:00:11,941 --> 01:00:14,191 And I think now wrapping all of this up. 1258 01:00:15,216 --> 01:00:20,136 I think there is a strong correlation between what we do here and like, 1259 01:00:20,166 --> 01:00:23,736 the local-first, the purchase, the local-first approach in a nutshell. 1260 01:00:23,736 --> 01:00:23,906 Right? 1261 01:00:23,926 --> 01:00:27,816 Again, it's kind of like, you make sure that things like work when you're offline. 1262 01:00:27,966 --> 01:00:28,266 Right? 1263 01:00:28,786 --> 01:00:32,836 And you make sure that, like, if you, if you lose that connection forever online, 1264 01:00:32,856 --> 01:00:34,526 you can still use something, right? 1265 01:00:34,526 --> 01:00:35,526 You're not totally lost. 1266 01:00:35,826 --> 01:00:39,496 To an extent, I think that goes hand in hand with like making things like fast 1267 01:00:39,546 --> 01:00:41,906 within a certain realm of things, right? 1268 01:00:41,966 --> 01:00:46,566 Like if the first thing you have to do is to like re index like all, and this could 1269 01:00:46,576 --> 01:00:50,246 be a problem for local-first as well, but have to re index everything that exists. 1270 01:00:50,486 --> 01:00:51,746 That's just going to take a long time. 1271 01:00:51,876 --> 01:00:55,246 Every time Dropbox starts, it's gotta, it doesn't know which like files 1272 01:00:55,286 --> 01:00:56,416 have changed on the computer, right? 1273 01:00:56,746 --> 01:00:59,371 So, if you have a 200.000 files, this guy has to go and 1274 01:00:59,371 --> 01:01:01,641 look at 200, 000 files, right? 1275 01:01:02,211 --> 01:01:05,711 And that's a challenge you might have as a local-first thing and not as like a 1276 01:01:05,711 --> 01:01:08,981 centralized thing, but as a centralized thing, you always have this problem. 1277 01:01:09,011 --> 01:01:10,791 You cannot get away from it. 1278 01:01:10,921 --> 01:01:11,181 Yeah. 1279 01:01:11,181 --> 01:01:16,781 I think you're, you're always paying sort of like for the worst case by having, 1280 01:01:16,791 --> 01:01:21,061 by like threading everything through typically through the network, et cetera. 1281 01:01:21,061 --> 01:01:22,881 You can't quite like. 1282 01:01:23,141 --> 01:01:27,171 Go off the happy path where everything is like as close as, as possible. 1283 01:01:27,181 --> 01:01:31,731 It's basically an extension of what you've described earlier with the memory, where 1284 01:01:31,731 --> 01:01:35,131 it's like, it's not, not, not just to the neighbor's house, but it's literally 1285 01:01:35,131 --> 01:01:37,931 across the ocean to get that pencil often. 1286 01:01:38,411 --> 01:01:40,771 So I think there's a lot of similarities. 1287 01:01:41,231 --> 01:01:45,781 So we've been exploring a lot now, like here, the data systems you've been working 1288 01:01:45,781 --> 01:01:50,131 on, uh, on, on previous companies, not just data systems, but that's what we 1289 01:01:50,131 --> 01:01:56,371 focused on and talking more broadly about the web, the benefits and challenges. 1290 01:01:56,841 --> 01:02:01,071 But you've mentioned a few times now that you're working on an even more ambitious 1291 01:02:01,111 --> 01:02:03,311 thing, your own operating system. 1292 01:02:03,591 --> 01:02:06,251 So before digging more into that. 1293 01:02:06,251 --> 01:02:06,306 Yeah. 1294 01:02:06,496 --> 01:02:10,966 I'm very curious what led you to going on this audacious journey of 1295 01:02:10,966 --> 01:02:12,736 building your own operating system. 1296 01:02:12,746 --> 01:02:17,536 I think some of it actually comes from a lot of what we touched on today of 1297 01:02:17,536 --> 01:02:23,196 quality and software and the joy that I can find that many of my friends can 1298 01:02:23,286 --> 01:02:24,986 can find or have been able to find. 1299 01:02:25,396 --> 01:02:30,606 In making software, I think it can be a very like fulfilling and fun thing to do. 1300 01:02:30,836 --> 01:02:34,676 And the, I got to say the web platform, I think over the, over the past 15 1301 01:02:34,676 --> 01:02:38,886 years, there's been such a relentless focus on scale because it's been such 1302 01:02:38,886 --> 01:02:42,866 a focus for a huge economy that we have made very conscious trade offs in terms 1303 01:02:42,866 --> 01:02:45,981 of like joy and ease and simplicity. 1304 01:02:46,141 --> 01:02:50,901 In favor of scale, like economic scale, technical scale, you know, 1305 01:02:51,121 --> 01:02:54,711 the ability to have like a million concurrent users on like a thing. 1306 01:02:54,831 --> 01:02:57,281 So today, if you want to like make a fun, if you want to 1307 01:02:57,281 --> 01:02:58,511 make a home cooked meal, right. 1308 01:02:58,521 --> 01:03:02,041 If you want to build like a fun thing for your friends or just for yourself. 1309 01:03:02,401 --> 01:03:05,191 I even tried making a homepage with a guest book today. 1310 01:03:05,771 --> 01:03:09,431 And if you have, if you have like maybe a weekend, you're going to spend that 1311 01:03:09,431 --> 01:03:12,291 entire weekend just like trying to figure out which of the 200 different 1312 01:03:12,301 --> 01:03:15,661 AWS services do you need and like, which databases, how do you set it up? 1313 01:03:15,731 --> 01:03:18,831 And like there are keys and there's so many layers of virtualization that 1314 01:03:18,831 --> 01:03:21,861 is compatibility and there's this and that and different dev tools. 1315 01:03:21,861 --> 01:03:25,741 And, and all of this, I'm not saying this stuff exists because like. 1316 01:03:25,806 --> 01:03:27,226 People are dumb or anything like that. 1317 01:03:27,236 --> 01:03:29,706 This stuff exists for very good reasons. 1318 01:03:29,706 --> 01:03:29,946 Right. 1319 01:03:29,976 --> 01:03:33,046 And these are reasons for like, you know, scale, like big companies, 1320 01:03:33,046 --> 01:03:34,876 basically like big things. 1321 01:03:34,956 --> 01:03:38,746 And I felt like, you know, the time when you can just like either just 1322 01:03:38,746 --> 01:03:41,906 make a native Mac app, for example, in Cocoa, or like make a kind of a 1323 01:03:41,906 --> 01:03:45,526 guest book with a CGI bin script, like a Pearl script on an FTP server, 1324 01:03:45,786 --> 01:03:47,336 like there was some joy to that. 1325 01:03:47,466 --> 01:03:47,746 Sure. 1326 01:03:47,766 --> 01:03:51,166 It wasn't a secure and safe and sure it wouldn't scale as well, but it 1327 01:03:51,166 --> 01:03:54,236 was for a different, like recent and different audience and so. 1328 01:03:54,646 --> 01:03:58,716 Three, three and a half years ago, I started really thinking hard about 1329 01:03:58,716 --> 01:04:01,716 these things, or four years ago, I started, started really thinking deeply 1330 01:04:01,716 --> 01:04:04,756 about these things and feeling that it's something I care a lot about. 1331 01:04:04,856 --> 01:04:09,196 And around the time I learned that Apple were thinking about getting rid of 1332 01:04:09,196 --> 01:04:13,316 Mac OS, at least Mac OS as we know it, which I think has been a very important 1333 01:04:13,416 --> 01:04:16,206 player in the having fun making apps. 1334 01:04:16,336 --> 01:04:18,716 I don't know if you ever wrote a Cocoa app, sort of its 1335 01:04:18,806 --> 01:04:21,986 heydays, like 2010, 2009 or so. 1336 01:04:22,396 --> 01:04:25,816 But it was just like a, a, a really like joyful way of doing things. 1337 01:04:25,826 --> 01:04:28,496 You earlier, you mentioned you need a table view, like 1338 01:04:28,496 --> 01:04:29,866 in Cocoa, there was a table. 1339 01:04:29,976 --> 01:04:32,396 There was not three different ways of making a table. 1340 01:04:32,396 --> 01:04:33,726 You, there was exactly one way. 1341 01:04:34,016 --> 01:04:37,286 And that was really performant, very flexible. 1342 01:04:37,546 --> 01:04:39,046 It did usually what you wanted to do. 1343 01:04:39,056 --> 01:04:40,026 Everyone used that. 1344 01:04:40,666 --> 01:04:44,396 There were a lot of really quality cocoa apps, like their companies, 1345 01:04:44,396 --> 01:04:47,736 like panic that still exists today and still make great software. 1346 01:04:47,866 --> 01:04:49,886 But there used to be a lot more like companies like that 1347 01:04:49,926 --> 01:04:51,806 that did really cool software. 1348 01:04:51,856 --> 01:04:52,096 Yeah. 1349 01:04:52,096 --> 01:04:57,186 Like sofa, like the, some of the people at sofa now, you know, are working on framer. 1350 01:04:57,456 --> 01:04:59,136 Who made some incredible backups. 1351 01:04:59,136 --> 01:05:00,756 There were Cocoa apps and they all felt good. 1352 01:05:00,866 --> 01:05:03,796 And so at the time I was like, I thought, I thought a lot about this. 1353 01:05:03,796 --> 01:05:08,046 And then I decided to leave Figma where I worked at the time and go and, and try 1354 01:05:08,046 --> 01:05:11,876 to do a little bit of research, trying to figure out like, what, what, what's 1355 01:05:11,876 --> 01:05:13,636 going to happen five, 10 years from now? 1356 01:05:13,636 --> 01:05:14,886 Like, are things better? 1357 01:05:14,916 --> 01:05:15,786 Where are things moving? 1358 01:05:15,796 --> 01:05:16,646 Where are things going? 1359 01:05:16,796 --> 01:05:20,476 And, uh, and that's, I think when I saw sort of like a couple of 1360 01:05:20,476 --> 01:05:23,896 possible futures, uh, and one of them I got kind of excited about. 1361 01:05:24,131 --> 01:05:28,551 Yeah, and I think that shows already in the name for, for your 1362 01:05:28,561 --> 01:05:30,671 project and undertaking playbet. 1363 01:05:30,861 --> 01:05:36,971 I think there's a, there's a, um, a person on Twitter called Anselm, who I 1364 01:05:36,981 --> 01:05:43,626 think in his bio has like, uh, Something along the lines of like, uh, work 1365 01:05:43,806 --> 01:05:48,206 doesn't work play works, or I think something along those lines, but that 1366 01:05:48,206 --> 01:05:53,016 really resonates with me where, like, if something feels like work, I don't like 1367 01:05:53,016 --> 01:05:55,886 it, but if something feels like playing. 1368 01:05:56,256 --> 01:06:01,956 Then this is where it can be most productive and I can do my, my hardest, 1369 01:06:01,976 --> 01:06:05,306 what other people would describe as work for me, it's not work for me. 1370 01:06:05,316 --> 01:06:07,086 It's just joy and playing. 1371 01:06:07,446 --> 01:06:12,836 So your focus with the name already, Playbit, really resonates with me. 1372 01:06:13,136 --> 01:06:17,046 And also just how you framed is like software that feels good. 1373 01:06:17,456 --> 01:06:20,336 I think that's something that I'm really striving for. 1374 01:06:20,681 --> 01:06:23,661 And that's rather the exception than the rule today. 1375 01:06:24,031 --> 01:06:28,571 And I think building a foundation where that is just the default software 1376 01:06:28,571 --> 01:06:30,541 that feels good, feels amazing. 1377 01:06:30,621 --> 01:06:34,061 So I would love to learn more about Playbit. 1378 01:06:34,091 --> 01:06:36,261 What is Playbit and what is your vision for it? 1379 01:06:36,591 --> 01:06:40,061 So Playbit, imagine that you have that kind of app kit you 1380 01:06:40,061 --> 01:06:41,161 were talking about before. 1381 01:06:41,446 --> 01:06:41,686 Right? 1382 01:06:41,846 --> 01:06:47,766 So you write a program and that developer experience is pretty 1383 01:06:47,906 --> 01:06:51,676 similar to what you have today, but you know, it's, it's vastly simpler. 1384 01:06:51,736 --> 01:06:56,326 And every time you hit build and run, imagine if you use Xcoder or Visual 1385 01:06:56,326 --> 01:07:00,026 Studio or something like that, you kind of have, you can change a line of code. 1386 01:07:00,026 --> 01:07:02,156 You can hit command R or something like that. 1387 01:07:02,156 --> 01:07:05,626 And you try your app out and you, that's kind of how you iterate. 1388 01:07:05,756 --> 01:07:09,176 Every time you do that, you also have a web version of that app. 1389 01:07:10,066 --> 01:07:10,716 It's kind of a Figma. 1390 01:07:11,386 --> 01:07:12,036 Grade. 1391 01:07:12,521 --> 01:07:13,951 Type of web app, right? 1392 01:07:13,951 --> 01:07:16,201 So, and so Playbit is an operating system. 1393 01:07:16,401 --> 01:07:20,551 And I think, uh, two big challenges with trying to build something like an 1394 01:07:20,551 --> 01:07:26,201 operating system or platform is one, you're asking people to go to some like 1395 01:07:26,201 --> 01:07:29,641 foreign planet and asking people to go to a foreign planet is always going 1396 01:07:29,641 --> 01:07:33,351 to be, uh, you're going to have a huge drop off rate where like, it's just 1397 01:07:33,351 --> 01:07:34,701 like a very fundamental human thing. 1398 01:07:34,711 --> 01:07:36,771 The things that we're, they're familiar. 1399 01:07:36,801 --> 01:07:37,241 We're. 1400 01:07:37,266 --> 01:07:40,186 Much more prone to approaching things unfamiliar. 1401 01:07:40,186 --> 01:07:41,826 We're kind of naturally afraid of them. 1402 01:07:42,196 --> 01:07:45,416 Uh, so we survived the bears and tigers and stuff. 1403 01:07:45,426 --> 01:07:45,696 Right. 1404 01:07:45,726 --> 01:07:47,236 So that's what, that's one problem you have. 1405 01:07:47,236 --> 01:07:49,726 And now the problem is like a chicken or the egg or kind of 1406 01:07:49,726 --> 01:07:51,346 a bootstrapping problem, right? 1407 01:07:51,346 --> 01:07:52,966 If you're to say, well. 1408 01:07:53,301 --> 01:07:56,751 Let's get some people like on this platform who like build programs for it. 1409 01:07:57,181 --> 01:07:59,801 Who are they building those programs for themselves? 1410 01:07:59,801 --> 01:08:00,081 Right? 1411 01:08:00,241 --> 01:08:01,241 How fun is that? 1412 01:08:01,521 --> 01:08:04,551 In some scenarios, the answer has got to be, Oh, that's fine. 1413 01:08:04,571 --> 01:08:07,891 Because like, maybe I'm building up some tools for myself or for my friends 1414 01:08:07,891 --> 01:08:11,091 who are also on this platform, but I think this is also a huge hurdle. 1415 01:08:11,271 --> 01:08:12,181 And so the first one. 1416 01:08:13,011 --> 01:08:15,871 I think it's really, it's really hard to do something about if you make it too 1417 01:08:15,871 --> 01:08:18,791 familiar, then why even bother making it? 1418 01:08:18,911 --> 01:08:19,221 Right. 1419 01:08:19,261 --> 01:08:21,971 If it's just like something that exists, like why even put the effort in? 1420 01:08:22,471 --> 01:08:26,381 If it's too strange, like, I don't know if anyone listening here used Google 1421 01:08:26,381 --> 01:08:28,981 wave back in 2009 or whatever it was. 1422 01:08:29,491 --> 01:08:31,251 I think that was like, it was too novel. 1423 01:08:31,321 --> 01:08:33,571 It was a great idea, but it was just like too strange. 1424 01:08:34,051 --> 01:08:37,061 You know, you got to hit the sweet spot there of being like novel enough. 1425 01:08:37,061 --> 01:08:40,701 So that it matters that it exists, but still have some familiarity. 1426 01:08:40,701 --> 01:08:42,631 So it's not totally like scary to try. 1427 01:08:43,536 --> 01:08:47,646 The other part I think is kind of important and fixable. 1428 01:08:47,716 --> 01:08:50,996 So again, kind of what I was talking about with Playbit, you make this app 1429 01:08:51,046 --> 01:08:54,996 and we just kind of cross compile it like, you know, the compilers is capable 1430 01:08:55,026 --> 01:08:58,006 of compiling to native code, right? 1431 01:08:58,006 --> 01:09:01,456 x86 or x64 and just like in an ELF executable. 1432 01:09:01,456 --> 01:09:02,676 I think you're kind of macOS. 1433 01:09:02,726 --> 01:09:03,536 app thing. 1434 01:09:03,536 --> 01:09:06,456 You just run it and you just zip it up and send it to a friend or whatever you want. 1435 01:09:07,086 --> 01:09:10,646 And then the other thing you get is a, is a folder with like an index 1436 01:09:10,646 --> 01:09:14,086 that HTML file that just contains like a web assembly version of this. 1437 01:09:14,366 --> 01:09:19,356 So our GPU API or like our graphics API is web GPU. 1438 01:09:19,696 --> 01:09:23,326 So you can do full compute, you can build some AI and train ML models and stuff on 1439 01:09:23,326 --> 01:09:26,946 this, you know, it's like you can really use the GPU through this, which is not 1440 01:09:26,946 --> 01:09:30,646 possible through WebGL, but there's no other levels, like, although we're using 1441 01:09:30,646 --> 01:09:34,956 the Linux kernel, it's kind of private as much Linux as Android is Linux. 1442 01:09:35,161 --> 01:09:38,681 So not a lot of it is Linux, but we do use the Linux kernel. 1443 01:09:39,201 --> 01:09:44,881 And so you could say, well, I can just use something like Vulkan to instruct my GPU. 1444 01:09:45,291 --> 01:09:49,951 And that's a possibility, but like in the ethos of some of what you and I have 1445 01:09:49,951 --> 01:09:54,591 been talking about before in Playbay, we want to like reduce the number of choices 1446 01:09:54,591 --> 01:09:56,611 that you have to make, and we want to be. 1447 01:09:56,741 --> 01:10:00,531 We want to be very careful about like what we sort of introduce 1448 01:10:00,961 --> 01:10:03,381 as like a choice or like a path. 1449 01:10:03,501 --> 01:10:05,901 And so we're starting with the only way you can draw things to 1450 01:10:05,901 --> 01:10:08,251 the screen is through web GPU. 1451 01:10:08,431 --> 01:10:08,871 That's it. 1452 01:10:08,971 --> 01:10:12,111 And so of course you got a full file system access and all that kind of stuff. 1453 01:10:12,111 --> 01:10:15,411 And when you're running something on the web, like we have a translation 1454 01:10:15,421 --> 01:10:18,491 layer, essentially something that, you know, it doesn't emulate a Linux kernel. 1455 01:10:18,491 --> 01:10:21,341 You don't have the full feature of, uh, of like a Linux kernel on the 1456 01:10:21,341 --> 01:10:22,731 web, because that would be too slow. 1457 01:10:23,041 --> 01:10:25,351 Instead we have sort of like a system layer. 1458 01:10:25,866 --> 01:10:30,056 System call, like layer that emulates that and translate that to the web platform. 1459 01:10:30,506 --> 01:10:33,106 And certain things are just not possible on the web, right? 1460 01:10:33,116 --> 01:10:35,416 So there's gotta be some sort of like limitations. 1461 01:10:35,466 --> 01:10:41,386 So is my understanding correct that you've drawn the, uh, analogy to Figma 1462 01:10:41,386 --> 01:10:47,556 where me and many others, um, I'm sure like first tried out Figma in the 1463 01:10:47,556 --> 01:10:52,146 browser were blown away from it, but, uh, by, by, but they would have never, 1464 01:10:52,461 --> 01:10:56,281 really bothered to install it in the first place, unless there was a really 1465 01:10:56,281 --> 01:11:01,931 good reason, but the web brought down the barrier to entry by so much that 1466 01:11:01,931 --> 01:11:03,441 this is where you fall in love with it. 1467 01:11:03,901 --> 01:11:08,201 And then when you use it more regularly, you install it actually 1468 01:11:08,241 --> 01:11:09,941 on your, on your real machine. 1469 01:11:10,221 --> 01:11:11,631 So is there like a similar. 1470 01:11:11,911 --> 01:11:16,101 two step process there to Playbit that maybe the first time you interact 1471 01:11:16,101 --> 01:11:20,851 with some Playbit apps is in the browser, but then the next big step of 1472 01:11:20,851 --> 01:11:26,241 commitment is not just downloading a desktop app, but, uh, actually like, 1473 01:11:26,481 --> 01:11:28,561 uh, flashing it on to your computer. 1474 01:11:28,591 --> 01:11:30,691 Is that sort of like the two steps? 1475 01:11:31,001 --> 01:11:31,871 Not quite. 1476 01:11:31,971 --> 01:11:35,061 I think we're a little bit more pragmatic or I believe we are at least. 1477 01:11:35,656 --> 01:11:39,766 So Playbit does, you know, I can boot it on hardware, but that's not our goal. 1478 01:11:39,766 --> 01:11:44,276 In five years, yes, you can just like put it on hardware, boot it on hardware. 1479 01:11:44,496 --> 01:11:49,856 We're maybe a month or so away from starting to, um, starting to open up for 1480 01:11:49,856 --> 01:11:51,766 like an early preview access to Playbit. 1481 01:11:51,826 --> 01:11:54,816 And the way that works is we have a Mac app and a Windows app. 1482 01:11:55,636 --> 01:11:58,516 Um, then you just like download and run like a video game and 1483 01:11:58,516 --> 01:11:59,666 the user runs full screen. 1484 01:11:59,936 --> 01:12:02,516 And it contains like a virtualization environment. 1485 01:12:03,051 --> 01:12:06,211 And so you basically a startup and it's just play a bit and you can use it as 1486 01:12:06,211 --> 01:12:09,711 like, you know, on your current computer, we're not asking you to like, get a second 1487 01:12:09,721 --> 01:12:11,521 hard drive and do installations and stuff. 1488 01:12:11,521 --> 01:12:13,271 None of that who wants to do that. 1489 01:12:13,341 --> 01:12:15,351 And so one way of thinking about it is like. 1490 01:12:16,676 --> 01:12:20,196 Another one, another way of thinking about it is like, uh, uh, a developer 1491 01:12:20,196 --> 01:12:24,426 tool or like an authoring environment, or even something like a fantasy console, 1492 01:12:24,426 --> 01:12:25,706 like peak weight or something like that. 1493 01:12:25,716 --> 01:12:31,126 Although Playbit is more, you know, as, as, as very different like aims and the. 1494 01:12:31,446 --> 01:12:34,606 Yeah, and the applications that you build, let's say you make like, I 1495 01:12:34,606 --> 01:12:35,906 don't know, a guest book, right? 1496 01:12:36,076 --> 01:12:36,836 Or something like that. 1497 01:12:37,226 --> 01:12:38,406 Like how, how does that work? 1498 01:12:38,416 --> 01:12:38,796 Sure. 1499 01:12:38,796 --> 01:12:41,646 We can make a GUI kit and that's fine. 1500 01:12:41,716 --> 01:12:44,566 It's a lot of work, but that's just one piece of the puzzle. 1501 01:12:44,656 --> 01:12:46,366 Like where are your messages stored, right? 1502 01:12:46,366 --> 01:12:47,586 How do you authenticate people? 1503 01:12:47,596 --> 01:12:48,666 Like all this kind of stuff. 1504 01:12:48,686 --> 01:12:49,806 And that's also part of playbits. 1505 01:12:49,956 --> 01:12:54,366 And so the whole operating system is like local-first from the foundation. 1506 01:12:54,596 --> 01:12:59,046 Early on, we explored, could we do like the thin terminal play, right? 1507 01:12:59,046 --> 01:13:00,566 Of like, we have a server somewhere. 1508 01:13:01,016 --> 01:13:04,206 That server actually runs the computer, we send a video signal 1509 01:13:04,206 --> 01:13:06,306 over, it turns out that doesn't work. 1510 01:13:06,306 --> 01:13:08,556 I mean, there's like two aspects of it. 1511 01:13:08,576 --> 01:13:11,856 We can talk more about it if you're curious, but the speed of light 1512 01:13:11,876 --> 01:13:13,686 is like pretty slow actually. 1513 01:13:13,846 --> 01:13:19,496 And the human cognitive center has like a limited, has some interesting features. 1514 01:13:19,931 --> 01:13:23,031 If you do this with like a, a video game pad, and if you use something like 1515 01:13:23,031 --> 01:13:26,731 PlayStation, the latency is actually quite high, even if the PlayStation is right in 1516 01:13:26,731 --> 01:13:29,141 front of you, like 100, 200 milliseconds. 1517 01:13:29,141 --> 01:13:32,371 And that's fine because like, we have this, you know, we have this kind 1518 01:13:32,371 --> 01:13:36,111 of coalescing, like Nagel algorithm, like thing in our brains that can, 1519 01:13:36,121 --> 01:13:39,141 you know, synchronize audio visual input and other sensory stuff. 1520 01:13:39,296 --> 01:13:39,536 Right. 1521 01:13:39,896 --> 01:13:41,826 To make that feel like it happened at the same time. 1522 01:13:41,826 --> 01:13:43,946 Although it didn't like someone clapping their hands. 1523 01:13:43,996 --> 01:13:47,666 Like we, we see the clap at the same time we hear it, but obviously we'll 1524 01:13:48,126 --> 01:13:49,496 technically we see it beforehand. 1525 01:13:49,556 --> 01:13:52,926 And so that ends up just like not working out the thin terminal thing. 1526 01:13:52,996 --> 01:13:55,756 And so, yeah, so Playbit works when you're offline. 1527 01:13:56,156 --> 01:14:00,216 And one of like the things that we really believe in is the software 1528 01:14:00,216 --> 01:14:01,826 should live for, for a long time. 1529 01:14:02,356 --> 01:14:04,726 So it's kind of an archivist mindset in a way. 1530 01:14:05,026 --> 01:14:06,426 And this is like a secondary thing. 1531 01:14:06,436 --> 01:14:08,966 And, and some features won't like work this way. 1532 01:14:08,966 --> 01:14:09,036 Yeah. 1533 01:14:09,396 --> 01:14:13,196 But we say you should be 50 years from now, Playbit might not exist anymore. 1534 01:14:13,526 --> 01:14:14,756 Maybe it's not developed anymore. 1535 01:14:14,756 --> 01:14:15,926 There are no servers online. 1536 01:14:16,076 --> 01:14:19,526 You should still be able to like boot up Playbit and do 1537 01:14:19,526 --> 01:14:20,676 something and get to your stuff. 1538 01:14:20,706 --> 01:14:23,666 If it's to like migrate it out of there, or if it's because you 1539 01:14:23,666 --> 01:14:26,431 want to continue using it, you That should always be possible. 1540 01:14:26,621 --> 01:14:29,931 So those are 2 of the 2 of the main drivers of why it's local-first. 1541 01:14:30,121 --> 01:14:33,561 And then the other part, when it comes to data is that it's also fully multiplayer. 1542 01:14:33,601 --> 01:14:36,911 So play with computer is this sort of like, it's essentially a virtual 1543 01:14:36,911 --> 01:14:39,051 machine that transcends your hardware. 1544 01:14:39,231 --> 01:14:41,661 And so it's because it's local-first we can synchronize it 1545 01:14:41,661 --> 01:14:42,861 across all the hardware, right? 1546 01:14:42,891 --> 01:14:45,521 And we can back it up on a central computer somewhere. 1547 01:14:45,766 --> 01:14:49,096 This is one of the things that wouldn't be available in, you know, a thousand years. 1548 01:14:49,176 --> 01:14:52,516 And that means like, if you know, if you lose your laptop, maybe 1549 01:14:52,516 --> 01:14:55,006 you drop it in the sea or someone steals it or something like that. 1550 01:14:55,006 --> 01:14:57,346 And you go and buy a new laptop and you sign into Playbit. 1551 01:14:57,626 --> 01:14:58,576 Everything is back there. 1552 01:14:58,776 --> 01:15:01,676 Like the window position, text selection that we talked about, like 1553 01:15:01,686 --> 01:15:03,326 Sublime I was speaking about before. 1554 01:15:03,386 --> 01:15:06,266 And that also means that you can, you can have many of these computers. 1555 01:15:06,306 --> 01:15:08,096 And so we have this concept of workspaces. 1556 01:15:08,156 --> 01:15:09,586 They're basically virtual machines. 1557 01:15:09,986 --> 01:15:13,246 And one of these computers you can share with your friends or with other people. 1558 01:15:13,246 --> 01:15:13,306 Yeah. 1559 01:15:13,486 --> 01:15:16,726 And then you have essentially like imagine Figma multiplayer, but like on 1560 01:15:16,726 --> 01:15:20,056 the operating system level and these facilities like this data syncing 1561 01:15:20,056 --> 01:15:25,336 facilities and stuff is available to, you know, as a first party API, 1562 01:15:25,406 --> 01:15:27,516 like for like application developers. 1563 01:15:27,696 --> 01:15:30,216 So you write your guest book, as I was talking about before. 1564 01:15:30,376 --> 01:15:34,826 Then you just put messages in there and authentication will be, you 1565 01:15:34,826 --> 01:15:38,256 know, maybe that's a problem that you have to solve, but everything else, 1566 01:15:38,256 --> 01:15:42,066 data storage is you just get that for free and it's just local-first. 1567 01:15:42,666 --> 01:15:46,176 And if Playbit is gone or the servers don't work, like your guestbook 1568 01:15:46,196 --> 01:15:47,306 will still work on your app. 1569 01:15:47,366 --> 01:15:49,936 Like, so it's not sort of bound to Playbit itself. 1570 01:15:50,166 --> 01:15:51,246 That is incredible. 1571 01:15:51,266 --> 01:15:57,766 I mean, I can't imagine a more audacious path forward and a foundation to build, 1572 01:15:57,836 --> 01:16:02,206 but, uh, the way how you've described it, uh, makes, uh, makes perfect sense. 1573 01:16:02,206 --> 01:16:08,156 you still get the benefits of the, the web in terms of distribution, but 1574 01:16:08,156 --> 01:16:12,536 you're leveraging the most powerful way of building web apps right now. 1575 01:16:12,926 --> 01:16:18,206 By leveraging web GPU, et cetera, taking care of all the data in a local-first 1576 01:16:18,226 --> 01:16:23,376 way and unlocking even more power by letting you use the, like the virtual 1577 01:16:23,376 --> 01:16:28,406 operating system there as a full blown native app on your given operating 1578 01:16:28,406 --> 01:16:32,206 system, hosting operating system at some point, like real operating system. 1579 01:16:32,206 --> 01:16:36,056 I love that progression and it already unlocks from, from 1580 01:16:36,056 --> 01:16:37,646 day one, a lot of utility. 1581 01:16:38,126 --> 01:16:42,886 So I can't wait to see what a Playbit app will, will feel like. 1582 01:16:43,386 --> 01:16:46,996 I'm also curious what it will both in terms of feel like 1583 01:16:46,996 --> 01:16:49,236 to use, but also to write. 1584 01:16:49,456 --> 01:16:54,236 Can you share a little bit more about, uh, the local-first aspects of what it 1585 01:16:54,236 --> 01:16:57,266 means to build a local-first Playbit app? 1586 01:16:57,376 --> 01:17:01,546 Yeah, we have, we have these like three types of data. 1587 01:17:01,626 --> 01:17:05,651 This is kind of in the conversation about like what, What information is there? 1588 01:17:05,681 --> 01:17:07,641 How do you like categorize information? 1589 01:17:07,771 --> 01:17:10,591 What guarantees and sort of like attributes does this 1590 01:17:10,621 --> 01:17:11,601 different information have? 1591 01:17:11,601 --> 01:17:11,851 Right. 1592 01:17:11,911 --> 01:17:13,531 So you have something like an email client. 1593 01:17:13,691 --> 01:17:16,781 Let's say we have like what email is currently being viewed. 1594 01:17:16,871 --> 01:17:18,061 What text is selected? 1595 01:17:18,201 --> 01:17:19,571 That's one type of information. 1596 01:17:19,681 --> 01:17:21,191 Another type of information is like. 1597 01:17:21,486 --> 01:17:23,846 What is in the email, what is written in the email, right? 1598 01:17:23,846 --> 01:17:26,216 Who sent it, which time was it sent? 1599 01:17:26,356 --> 01:17:30,186 And, uh, there's, there's other kinds of data too, but sort of like thinking 1600 01:17:30,226 --> 01:17:33,346 in this way, right now we can add a third type of data, sort of like 1601 01:17:33,346 --> 01:17:36,366 a very ephemeral, like imagine that there's a friend in there, so there's 1602 01:17:36,376 --> 01:17:39,876 a second cursor on the screen, like where the cursor is, who that is, like 1603 01:17:39,876 --> 01:17:41,136 that, that's another piece of data. 1604 01:17:41,646 --> 01:17:44,946 I think these like have different, you have different expectations about. 1605 01:17:45,231 --> 01:17:49,011 Where it is the synchronized hot, like what reliability of this is, what 1606 01:17:49,011 --> 01:17:53,961 the latency of this data is roughly speaking, like what's in the email, 1607 01:17:54,081 --> 01:17:58,001 what'd you expect there to be correct, but it can take a while to load. 1608 01:17:58,291 --> 01:18:01,261 I'm exaggerating here now, obviously everything should be correct 1609 01:18:01,261 --> 01:18:06,041 and be fast, but you gotta make trade offs the cursor, right? 1610 01:18:06,311 --> 01:18:10,381 It's sometimes you can drop a frame, so to speak, and it's not that important. 1611 01:18:10,381 --> 01:18:10,711 Right? 1612 01:18:10,711 --> 01:18:12,071 Like you can lose this information. 1613 01:18:12,081 --> 01:18:13,071 You don't have to cache it. 1614 01:18:13,421 --> 01:18:16,881 The information about like what's selected and like scroll positions 1615 01:18:16,881 --> 01:18:21,371 and stuff like that is, is things that can have lower integrity than sort 1616 01:18:21,371 --> 01:18:22,991 of like what's in the email, right? 1617 01:18:23,251 --> 01:18:26,061 And that information might, you might not want to share with others. 1618 01:18:26,356 --> 01:18:26,606 Right. 1619 01:18:26,606 --> 01:18:28,576 Like what's, what texts do I have selected? 1620 01:18:28,846 --> 01:18:30,566 Maybe that's something that shared in a different way. 1621 01:18:30,616 --> 01:18:30,916 Right. 1622 01:18:31,166 --> 01:18:33,186 Let's say you have two people looking at the same email. 1623 01:18:33,256 --> 01:18:36,656 Then if you shared the tick selection, like what does that even mean? 1624 01:18:36,706 --> 01:18:36,916 Right. 1625 01:18:36,936 --> 01:18:39,436 If I want to select something, I would change your tech selection. 1626 01:18:39,436 --> 01:18:40,346 That's kind of like weird. 1627 01:18:40,346 --> 01:18:41,676 So you've got to treat that differently. 1628 01:18:41,736 --> 01:18:43,606 So there are, there are different categories of data. 1629 01:18:43,626 --> 01:18:44,236 One thing. 1630 01:18:44,346 --> 01:18:47,746 So more concretely to your question, it's like when you write a Playbit app, 1631 01:18:47,876 --> 01:18:51,216 there is some of this information that's just handles for you automatically. 1632 01:18:51,476 --> 01:18:55,146 So things like the sort of scroll position and stuff like that. 1633 01:18:56,111 --> 01:18:59,761 All handles for you automatically, you can override any of that. 1634 01:18:59,761 --> 01:19:03,481 And if you wanted to manage your own scope position, of course you could, then 1635 01:19:03,481 --> 01:19:07,341 there's an API and we call this like game state because you know, often we talk 1636 01:19:07,351 --> 01:19:10,551 about, and we look at video games, because I think there's a lot more to learn there 1637 01:19:10,861 --> 01:19:13,581 than, uh, comparatively to utility apps. 1638 01:19:13,901 --> 01:19:16,891 So game state is essentially like the state that the program has 1639 01:19:17,011 --> 01:19:18,181 that's unique to the program. 1640 01:19:18,886 --> 01:19:22,496 And earlier in this episode, we talked a little bit about like, uh, like almost 1641 01:19:22,526 --> 01:19:27,376 impotence mismatch or a match between sort of like the, the fifth of your problem 1642 01:19:27,376 --> 01:19:28,826 and the database and stuff like that. 1643 01:19:28,896 --> 01:19:31,776 And so you have a similar problem here that, like, we, we could just 1644 01:19:31,786 --> 01:19:35,086 give you, like, I just like put things in a SQLite database and 1645 01:19:35,086 --> 01:19:36,296 they will automatically just like. 1646 01:19:36,441 --> 01:19:37,601 Be synchronized, right? 1647 01:19:37,671 --> 01:19:39,461 The problem is like, that's not possible. 1648 01:19:39,491 --> 01:19:42,431 That is not, not possible because like it's hard technologically. 1649 01:19:42,461 --> 01:19:45,751 That's just impossible because like a real life human level. 1650 01:19:45,751 --> 01:19:46,741 It's not possible, right? 1651 01:19:46,741 --> 01:19:47,931 We cannot possibly know. 1652 01:19:47,981 --> 01:19:49,901 And the same thing is true for like a file system. 1653 01:19:49,951 --> 01:19:53,501 We cannot possibly know what these like chunks of bytes mean without trying to 1654 01:19:53,501 --> 01:19:56,696 interpret them, in which case you're not on a file system level anymore. 1655 01:19:56,876 --> 01:20:00,786 But on a document level, and so to like, solve this problem, 1656 01:20:00,796 --> 01:20:02,406 we choose to not solve it. 1657 01:20:02,436 --> 01:20:04,766 And this that give you the tools to solve it yourself. 1658 01:20:05,196 --> 01:20:08,146 And so imagine that we, we make a game like a tic tac toe game 1659 01:20:08,216 --> 01:20:09,426 and we can play that together. 1660 01:20:09,776 --> 01:20:12,566 It has like, it has a, it's a turn based game, right? 1661 01:20:12,566 --> 01:20:14,696 So 1 and it's a 2 player game. 1662 01:20:14,826 --> 01:20:16,506 1 player is across the other 1. 1663 01:20:16,526 --> 01:20:17,426 It's like a circle. 1664 01:20:17,806 --> 01:20:18,236 And. 1665 01:20:18,536 --> 01:20:22,676 Let's say you start out and you do, you click somewhere, you can choose, right? 1666 01:20:22,696 --> 01:20:24,076 And then it's my turn. 1667 01:20:24,406 --> 01:20:28,326 And so now game state in this example is whose turn is it? 1668 01:20:28,436 --> 01:20:31,926 What sort of like what on, on this kind of like three by three 1669 01:20:31,926 --> 01:20:34,946 or nine by nine or whatever you end up doing on this game board. 1670 01:20:35,086 --> 01:20:36,456 Like, what is the state of that? 1671 01:20:36,466 --> 01:20:37,706 Which cells are empty? 1672 01:20:37,846 --> 01:20:39,226 Which are currently like filled? 1673 01:20:39,396 --> 01:20:40,586 What are they filled with? 1674 01:20:40,676 --> 01:20:40,996 Right. 1675 01:20:40,996 --> 01:20:43,916 And then you have conditions and this is not part of game state. 1676 01:20:43,966 --> 01:20:44,386 It's like. 1677 01:20:44,721 --> 01:20:45,601 Did someone win? 1678 01:20:45,791 --> 01:20:46,991 Like, Oh, who is leading? 1679 01:20:47,011 --> 01:20:49,711 Like, this is stuff you derive from the game state. 1680 01:20:50,101 --> 01:20:53,441 And the game state itself is essentially a key value store. 1681 01:20:53,761 --> 01:20:58,071 And on the key value store level, we give you the, we give you transactions. 1682 01:20:58,851 --> 01:21:04,741 And so if you say like, uh, change this to the, to that and change this to that, and 1683 01:21:04,751 --> 01:21:09,996 you can make up your own keys and values, we guarantee you that Those things are 1684 01:21:10,006 --> 01:21:14,916 merged with all the other clients with the same result within that one transaction. 1685 01:21:15,046 --> 01:21:18,446 So we give you this kind of like primitive, that is a key value 1686 01:21:18,476 --> 01:21:20,816 store with like CRDT transactions. 1687 01:21:20,836 --> 01:21:24,186 I don't know what to call them, but this is kind of like a notion of transaction. 1688 01:21:24,336 --> 01:21:27,981 And on that level and beyond that level, below that level, We as like, 1689 01:21:28,021 --> 01:21:31,791 we had all of the diffing and merging and syncing for you automatically. 1690 01:21:31,911 --> 01:21:35,301 Then of course we finally, we give you like a, the lowest level. 1691 01:21:35,311 --> 01:21:38,651 So the highest level is like, you don't use any of these things and 1692 01:21:38,651 --> 01:21:42,211 you get some limited multiplayer functionality and the scene graph of 1693 01:21:42,211 --> 01:21:45,331 the whole, like the whole desktop, if you will, is synchronized always. 1694 01:21:45,511 --> 01:21:46,691 And so that's the highest level. 1695 01:21:46,691 --> 01:21:47,431 That's the simplest thing. 1696 01:21:47,431 --> 01:21:50,851 You can write like a 20 line program that has some limited 1697 01:21:50,891 --> 01:21:51,911 multiplayer functionality. 1698 01:21:51,911 --> 01:21:52,381 And it's fine. 1699 01:21:52,451 --> 01:21:56,571 All the defaults in Playbit, like in our APIs, if you don't opt in for 1700 01:21:56,571 --> 01:22:00,111 something, you will get something that we think is a good default, right? 1701 01:22:00,111 --> 01:22:04,131 If you don't pass, if a function call has like a flags attribute 1702 01:22:04,141 --> 01:22:08,131 or argument, if you just pass zero for that, we will like, instead of 1703 01:22:08,131 --> 01:22:11,501 giving you a window, for example, sorry, this is a tangent in macOS. 1704 01:22:11,551 --> 01:22:12,331 If you say. 1705 01:22:12,536 --> 01:22:13,936 And this window, create a new window. 1706 01:22:13,936 --> 01:22:15,846 It's the API for creating a new window. 1707 01:22:16,246 --> 01:22:21,096 If you set flags to zero, like no special flags, you get a window that's useless. 1708 01:22:21,146 --> 01:22:21,926 You can't close it. 1709 01:22:21,926 --> 01:22:22,796 You can't resize it. 1710 01:22:22,806 --> 01:22:24,856 You can't like do much with it at all. 1711 01:22:24,866 --> 01:22:25,606 You can't even move it. 1712 01:22:26,116 --> 01:22:29,476 And so you have to like set certain flags to get the default window. 1713 01:22:29,751 --> 01:22:31,751 And, and it's kind of like folk knowledge. 1714 01:22:31,781 --> 01:22:35,921 You just know which flags to set and which flags not to set and the caveats. 1715 01:22:36,021 --> 01:22:39,211 In Playbit, we're trying to like have an ethos that is like, when you don't 1716 01:22:39,231 --> 01:22:42,321 opt in for something, you will get the thing that is that you probably want. 1717 01:22:42,321 --> 01:22:44,231 And yeah, so this goes for the data layer too. 1718 01:22:44,691 --> 01:22:45,241 And yeah, we'll see. 1719 01:22:46,086 --> 01:22:49,086 So you got these three kind of like, I want to start easy mode. 1720 01:22:49,146 --> 01:22:50,176 You just give me a thing. 1721 01:22:50,396 --> 01:22:51,366 It will be multiplayer. 1722 01:22:51,406 --> 01:22:52,366 It'll be pretty fine. 1723 01:22:52,456 --> 01:22:55,526 And then you say, actually, I want to like have my, the state of my app, 1724 01:22:55,536 --> 01:22:59,326 my game to be multiplayer so that two people can play tic tac toe together. 1725 01:22:59,406 --> 01:23:02,776 Then you use this like fairly straightforward, but still you 1726 01:23:02,776 --> 01:23:03,906 got to model your data now. 1727 01:23:04,416 --> 01:23:09,526 Um, like this database and then at the very lowest level, you get something 1728 01:23:09,526 --> 01:23:13,776 that is kind of like a socket, but we, we handle like encryption and you know, 1729 01:23:13,816 --> 01:23:15,686 the actual connectivity of it for you. 1730 01:23:15,836 --> 01:23:19,876 So you can say, give me a connection to the other instances of this app. 1731 01:23:19,946 --> 01:23:22,866 And now your app can, you'll send like arbitrary data if you want 1732 01:23:22,866 --> 01:23:24,596 to do something really like wild. 1733 01:23:24,656 --> 01:23:24,956 Right. 1734 01:23:25,066 --> 01:23:26,526 But now there's no different emerging. 1735 01:23:26,526 --> 01:23:31,076 It's, we just give you an ability to say, send bytes between, um, between 1736 01:23:31,076 --> 01:23:32,726 different like instances of your app now. 1737 01:23:33,056 --> 01:23:33,376 Got it. 1738 01:23:33,416 --> 01:23:35,716 So that's how, how data flows. 1739 01:23:35,796 --> 01:23:39,906 Um, I'm curious, what is the authoring experience for me as a developer? 1740 01:23:40,286 --> 01:23:43,836 Um, do I have to use like a certain programming language for that? 1741 01:23:43,846 --> 01:23:46,196 Can I choose between different programming languages? 1742 01:23:46,656 --> 01:23:50,856 Is there, can I bring some outside technologies, for example, something 1743 01:23:50,866 --> 01:23:54,946 like react, or is there sort of a bespoke way to do all of that? 1744 01:23:55,226 --> 01:23:57,936 You have to use our own flavor of Fortran. 1745 01:23:58,106 --> 01:23:59,126 That is backside. 1746 01:23:59,136 --> 01:24:01,676 You know, no, it's a, so. 1747 01:24:01,676 --> 01:24:03,381 Um, This is obviously an important thing. 1748 01:24:03,421 --> 01:24:05,411 I think that there are two paths that you can go. 1749 01:24:05,411 --> 01:24:08,841 You can either say, here's a blessed programming language, and this is what 1750 01:24:08,841 --> 01:24:15,491 you use, or you can say like, bring your own language, here's like a minimal API. 1751 01:24:15,501 --> 01:24:21,611 And I think the two like common examples of this is like on, uh, on iOS, you 1752 01:24:21,611 --> 01:24:23,301 got, I guess a little complicated. 1753 01:24:23,301 --> 01:24:26,871 Now you get Swift and Cocoa, but for a long time, you had just Objective C. 1754 01:24:27,291 --> 01:24:30,111 And if you want to write an app, you write an Objective C 1755 01:24:30,241 --> 01:24:31,301 and you use these libraries. 1756 01:24:32,156 --> 01:24:34,386 And there's some flexibility if you want to do something else, 1757 01:24:34,386 --> 01:24:35,786 but it's like pretty much zero. 1758 01:24:35,966 --> 01:24:39,496 And then you have something like BSD or Linux where you say there's a syscall. 1759 01:24:39,666 --> 01:24:43,246 It's essentially like a single function, uh, that's called syscall, which is 1760 01:24:43,246 --> 01:24:47,206 really just like a CPU instruction, but it's a syscall and you give it a number 1761 01:24:47,266 --> 01:24:50,706 and the first number represents like the thing you want to do, like open a file, 1762 01:24:50,916 --> 01:24:52,676 close a file, read some bytes, right? 1763 01:24:52,786 --> 01:24:55,306 And then you give it some number and it's a fixed number of things you 1764 01:24:55,306 --> 01:24:56,566 can give it arguments essentially. 1765 01:24:56,566 --> 01:24:58,976 And that's the entire API surface. 1766 01:24:58,976 --> 01:25:01,476 This is one function to your entire computer. 1767 01:25:01,606 --> 01:25:05,146 So these are two extremes and with Playbit, we're closer to the second, 1768 01:25:05,246 --> 01:25:08,786 because that gives you the flexibility of if you want to use Python or Node. 1769 01:25:08,806 --> 01:25:11,246 js or BUN, you could do that. 1770 01:25:11,626 --> 01:25:12,506 And I think that's important. 1771 01:25:12,796 --> 01:25:14,066 Some people have opinions about this. 1772 01:25:14,066 --> 01:25:20,076 So Playbit has a C A B I and B as in, as in Bob, as a binary interface, 1773 01:25:20,256 --> 01:25:24,276 basically any programming language today can interface with a C A B I. 1774 01:25:25,146 --> 01:25:27,676 It doesn't mean you have to write it and see the developer 1775 01:25:27,676 --> 01:25:28,776 experience currently in Playbit. 1776 01:25:28,776 --> 01:25:32,326 And so, you know, Playbit does exist and we use it day to day and we 1777 01:25:32,456 --> 01:25:34,196 develop Playbit inside of Playbit. 1778 01:25:34,196 --> 01:25:37,576 It's kind of weird sometimes is we got something that's a little bit like 1779 01:25:37,586 --> 01:25:41,226 Xcode, something that's a little bit like developer tools, like on the OS level. 1780 01:25:41,571 --> 01:25:47,061 And so in our version of the finder or windows file explorer, there's 1781 01:25:47,061 --> 01:25:50,421 a button called new app and you can click this and like a new app is just 1782 01:25:50,421 --> 01:25:54,181 made for you and it's called like, you know, new app that app and inside it, 1783 01:25:54,231 --> 01:25:57,831 like, you know, there's a main dot C because we got a C compiler and system. 1784 01:25:57,831 --> 01:26:00,411 So it's main dot C and it's already ready for you. 1785 01:26:00,616 --> 01:26:03,266 And when you, when you create a new app, there's another toolbar 1786 01:26:03,266 --> 01:26:06,926 button, like in the file browser, this says build and run it, click 1787 01:26:06,926 --> 01:26:08,946 build and run and your app starts up. 1788 01:26:09,596 --> 01:26:12,446 And there's, you don't need to use terminals or anything like that. 1789 01:26:12,766 --> 01:26:14,476 You got standard out and standard error. 1790 01:26:14,476 --> 01:26:18,736 You can get those kinds of things like in, in a more friendly sort of developer log. 1791 01:26:18,796 --> 01:26:21,286 We have an inkling to this now, but there's also a couple of 1792 01:26:21,286 --> 01:26:22,906 ways to like, look at the dom. 1793 01:26:23,156 --> 01:26:25,736 So we have the scene graph that your app has, right? 1794 01:26:25,736 --> 01:26:26,446 You can inspect that. 1795 01:26:26,446 --> 01:26:30,766 You can inspect actually the scene graph of the entire desktop if you wanted to. 1796 01:26:30,906 --> 01:26:33,256 So that, you know, this opens up some very interesting things 1797 01:26:33,256 --> 01:26:34,806 for accessibility, for example. 1798 01:26:34,936 --> 01:26:38,346 But anyhow, so the developer experience is very much like, it's very like 1799 01:26:38,346 --> 01:26:41,246 straightforward, very lightweight, very opinionated right now. 1800 01:26:41,456 --> 01:26:43,996 So again, you click, you click a button to just create a new app. 1801 01:26:44,286 --> 01:26:46,376 And you can just rename it by changing the folder name. 1802 01:26:46,526 --> 01:26:50,116 And if you don't want to even open a text editor, you just click the 1803 01:26:50,126 --> 01:26:54,576 building ride button, which is the same place your app is built and is run. 1804 01:26:54,626 --> 01:26:56,436 And it takes like a couple of milliseconds. 1805 01:26:56,726 --> 01:27:00,266 And now you can just like, and it's just going to say, hello world. 1806 01:27:00,346 --> 01:27:01,936 It's just a window that opens hello world. 1807 01:27:02,056 --> 01:27:04,876 And it has closed buttons, you know, it's very basic. 1808 01:27:05,016 --> 01:27:07,246 And what you can do now is that you can open the source file. 1809 01:27:07,836 --> 01:27:10,176 In the text editor, it's only in graphical environments. 1810 01:27:10,306 --> 01:27:13,656 And now you can, you can change them, right? 1811 01:27:13,656 --> 01:27:15,926 You can change, for example, like where it says hello world to 1812 01:27:15,926 --> 01:27:17,466 say, you know, hello, Johannes. 1813 01:27:18,236 --> 01:27:19,646 And then you hit build and run again. 1814 01:27:19,646 --> 01:27:21,896 And now like it restarts and says, hello, Johannes. 1815 01:27:22,296 --> 01:27:26,236 And then, you know, there's some generated documentation for the API. 1816 01:27:26,276 --> 01:27:28,396 There's functions, of course, for, you know, we've got. 1817 01:27:28,921 --> 01:27:31,681 Grid functions, all of the kind of really gooey things you might expect, 1818 01:27:31,721 --> 01:27:35,701 you know, pop up menus and scroll bars and radio buttons and all of that stuff. 1819 01:27:35,701 --> 01:27:38,311 And if you want to bring in libraries and stuff, you can do that. 1820 01:27:38,311 --> 01:27:41,291 And if you wanted to use Python instead, then you will call these 1821 01:27:41,291 --> 01:27:44,191 functions through the C ABI and FFI functions in Python, right? 1822 01:27:44,761 --> 01:27:48,561 So that's kind of like the, currently the developer story in PlayBit. 1823 01:27:48,661 --> 01:27:49,321 That makes sense. 1824 01:27:49,331 --> 01:27:54,161 So you've like laid out the absolute foundation and that allows for a lot 1825 01:27:54,161 --> 01:27:59,321 of layers, optional layers to be built on top where you want to follow like 1826 01:27:59,321 --> 01:28:01,351 a certain flavor of app development. 1827 01:28:01,651 --> 01:28:06,051 And I think that also allows an ecosystem to be built around PlayBit. 1828 01:28:07,081 --> 01:28:12,191 But I think the new level of primitives and the, this new, um, More like 1829 01:28:12,221 --> 01:28:17,391 2024 foundation that you're laying where you get things that are, that 1830 01:28:17,391 --> 01:28:20,581 was probably shareable by default, that's collaborative by default. 1831 01:28:20,591 --> 01:28:25,101 So, uh, a lot of the local-first aspects, what makes local-first software 1832 01:28:25,101 --> 01:28:29,881 great, having that be baked into the foundations of an operating system. 1833 01:28:30,321 --> 01:28:33,951 Uh, that is not something I would have expected in 2024 to 1834 01:28:33,951 --> 01:28:36,701 already exist, maybe rather 2040. 1835 01:28:37,871 --> 01:28:40,551 So you make me feel like living in the future. 1836 01:28:41,261 --> 01:28:44,731 But I got to say, I think that there, it's almost a logical conclusion 1837 01:28:44,731 --> 01:28:45,731 when I'm going to come to here. 1838 01:28:45,761 --> 01:28:47,861 But I think, first off, I want to say, I think, I think of 1839 01:28:47,911 --> 01:28:50,451 Playbit as being a platform. 1840 01:28:50,481 --> 01:28:53,101 I think it's very interesting to talk about, like, what is an OS? 1841 01:28:53,241 --> 01:28:54,521 Like, what is a platform? 1842 01:28:54,681 --> 01:28:57,701 We've been talking about the web a lot today for really good reasons. 1843 01:28:57,741 --> 01:29:00,881 And the web to me kind of smells like an operating system, you know, 1844 01:29:00,911 --> 01:29:02,701 in a way, and it is a platform. 1845 01:29:03,051 --> 01:29:05,691 And I think Playbit similarly, although it is like, technically 1846 01:29:05,721 --> 01:29:08,541 speaking, a real operating system, you know, it's like manages memory 1847 01:29:08,541 --> 01:29:10,011 and hardware and all of that stuff. 1848 01:29:10,161 --> 01:29:13,231 I think, or I hope at least it also can become the platform. 1849 01:29:13,926 --> 01:29:18,996 That has a primary environment, which is, you know, its own OS and a 1850 01:29:18,996 --> 01:29:23,536 secondary environment, which is like other systems, like the web, right? 1851 01:29:23,586 --> 01:29:24,326 Other platforms. 1852 01:29:24,506 --> 01:29:27,926 And the logical confusion I was mentioning, thinking about what, 1853 01:29:27,926 --> 01:29:30,146 what does a platform OS do? 1854 01:29:30,156 --> 01:29:31,276 Why, why does it exist? 1855 01:29:31,276 --> 01:29:31,926 Why do we have them? 1856 01:29:32,076 --> 01:29:36,176 Historically and an operating system does really is two things, right? 1857 01:29:36,176 --> 01:29:37,976 One, it abstracts the hardware. 1858 01:29:38,046 --> 01:29:39,056 It used to be so. 1859 01:29:39,326 --> 01:29:42,696 That if you want it to write the disc, you would have to like write the disc. 1860 01:29:43,316 --> 01:29:46,046 You have to have different code depending on the specific hardware 1861 01:29:46,046 --> 01:29:47,376 you're writing, which is kind of insane. 1862 01:29:47,376 --> 01:29:48,366 But that's how it was. 1863 01:29:48,556 --> 01:29:51,586 And then someone was like, Hey, what, what if we have like a layer in between? 1864 01:29:51,586 --> 01:29:57,406 So like you say, right to hard disk a or hard disk B and you use 1865 01:29:57,406 --> 01:30:01,726 the same like function calls, even if this is like a, you know, a 1866 01:30:01,726 --> 01:30:04,926 hard disk from this manufacturer, if it's like a floppy disk drive. 1867 01:30:04,986 --> 01:30:05,316 Right. 1868 01:30:05,676 --> 01:30:08,651 And that is like, Those are like drivers or whatever. 1869 01:30:08,681 --> 01:30:11,041 That is like one important role that OS serves. 1870 01:30:11,337 --> 01:30:13,217 the other category, it's very interesting. 1871 01:30:13,227 --> 01:30:16,977 It's like the OS then needs to provide services for like the 1872 01:30:16,977 --> 01:30:18,417 tools that run on top of it. 1873 01:30:18,477 --> 01:30:22,737 And this is where I think we as like, we as kind of like set back in our 1874 01:30:22,737 --> 01:30:25,867 chairs, you know, in, in like the late nineties and said, Oh, we're done. 1875 01:30:26,407 --> 01:30:30,667 You know, I mean, iOS is like built on macOS, which is built on next, which is 1876 01:30:30,677 --> 01:30:34,827 built in the eighties and we have windows, which like still has like some parts in 1877 01:30:34,827 --> 01:30:38,517 it that are from, you know, the nineties or maybe even further back than that. 1878 01:30:38,597 --> 01:30:41,857 And so a lot of these OS's that we use today, and even like the windowing, 1879 01:30:41,907 --> 01:30:45,567 like the compositing windowing system is sort of like an ancient idea, right. 1880 01:30:45,567 --> 01:30:49,857 Of like, that comes from like X11 and stuff like that, or, you know, even 1881 01:30:49,857 --> 01:30:53,937 earlier stuff, of course, X11 was not the first, but, you know, you have a window. 1882 01:30:54,227 --> 01:30:57,167 And you have a window and these are two like bitmaps or 1883 01:30:57,197 --> 01:30:58,887 textures, if in GPX or either. 1884 01:30:59,297 --> 01:31:02,197 And each window is like a process or whatever you want to call it. 1885 01:31:02,437 --> 01:31:05,967 And they like use the same library code to draw the same button into their bitmaps. 1886 01:31:06,707 --> 01:31:09,487 And then on the desktop, you put these bitmaps together and 1887 01:31:09,487 --> 01:31:10,427 that's how you have windows. 1888 01:31:10,477 --> 01:31:13,527 I was like, gee, the huge problem with this is that how do you like 1889 01:31:13,547 --> 01:31:14,947 introspect what's on the desktop? 1890 01:31:14,947 --> 01:31:16,597 How do you do things like accessibility? 1891 01:31:16,877 --> 01:31:19,817 How do you, how do you like, uh, debug something that goes wrong? 1892 01:31:19,887 --> 01:31:21,587 That crosses the boundary of two windows. 1893 01:31:22,267 --> 01:31:26,197 Like you, it becomes really hard and you end up with this like really weird 1894 01:31:26,257 --> 01:31:28,417 patched on things at the, at the end. 1895 01:31:28,577 --> 01:31:31,657 And so I think that the services argument, right? 1896 01:31:31,657 --> 01:31:36,167 Like then we think about, so why is it so that today you look at someone who 1897 01:31:36,167 --> 01:31:38,432 used a Mac book And what apps do you use? 1898 01:31:38,562 --> 01:31:39,902 These are web apps that they use. 1899 01:31:40,132 --> 01:31:43,072 They are not native apps, but they have this like Mac OS running there. 1900 01:31:43,082 --> 01:31:44,342 Why aren't there Mac OS apps? 1901 01:31:44,412 --> 01:31:46,862 I think it's because Mac OS doesn't provide the things 1902 01:31:46,862 --> 01:31:48,082 that people want, right? 1903 01:31:48,092 --> 01:31:48,992 Developers want. 1904 01:31:49,102 --> 01:31:51,852 I want to be able to just like fetch the thing from the network, right? 1905 01:31:51,892 --> 01:31:55,382 I can do that one line of code in JavaScript or like a fucking million 1906 01:31:55,382 --> 01:32:00,422 lines, excuse my French, of codes in, in like a Mac OS native, right? 1907 01:32:00,892 --> 01:32:04,362 There's just like a, there's a mismatch between the services that an OS provides. 1908 01:32:04,872 --> 01:32:07,552 Another thing is like, like payments or like subscriptions 1909 01:32:07,562 --> 01:32:08,472 or whatever, like revenue. 1910 01:32:08,692 --> 01:32:10,142 Let's say that I read a little thing. 1911 01:32:10,537 --> 01:32:11,467 And it's a hobby thing. 1912 01:32:11,497 --> 01:32:15,027 I can't spend too much like time slash money on it, but I still spend 1913 01:32:15,027 --> 01:32:16,947 a lot of like my time and money on it. 1914 01:32:16,947 --> 01:32:17,087 Right. 1915 01:32:17,097 --> 01:32:20,697 Even if it's like, you know, five hours a week and now I'm going 1916 01:32:20,697 --> 01:32:22,237 to ask people who really like it. 1917 01:32:22,237 --> 01:32:23,367 It's kind of the shareware model. 1918 01:32:23,537 --> 01:32:26,137 So like, give me a dollar, like a month, if they like this 1919 01:32:26,137 --> 01:32:27,407 thing or just like one time. 1920 01:32:27,917 --> 01:32:32,247 And obviously I'm not like pitching anything novel here, like the, you know, 1921 01:32:32,267 --> 01:32:35,717 Apple app stores are very successful and everything else that comes after it. 1922 01:32:36,207 --> 01:32:39,407 But the problem with that is that it is sort of like a monolith. 1923 01:32:39,607 --> 01:32:41,897 It's this sort of like it's in the planet Apple. 1924 01:32:41,977 --> 01:32:44,647 First off, if you want this to work on other platforms, like 1925 01:32:44,657 --> 01:32:46,327 you can't, it's iOS or nothing. 1926 01:32:46,367 --> 01:32:49,387 And if you want to market this somewhere else where you really can't, it's in 1927 01:32:49,397 --> 01:32:53,057 the app store or nowhere else, and you have to build it specifically for them. 1928 01:32:53,057 --> 01:32:55,887 And there's all of this, this whole list of cabinets is basically 1929 01:32:55,887 --> 01:32:57,947 like there's a little bubble, you can put it in the bubble. 1930 01:32:58,167 --> 01:33:00,197 If you don't want it to be in the bubble, you're on your own. 1931 01:33:00,247 --> 01:33:03,872 You got to Do a Stripe integration or something that's going to take 1932 01:33:03,872 --> 01:33:05,942 you a lot more time than you have. 1933 01:33:05,952 --> 01:33:09,472 And so I think that there's a lot of hobby developers out there who make 1934 01:33:09,472 --> 01:33:13,232 something truly valuable who will just like, just pass on it, right? 1935 01:33:13,232 --> 01:33:15,802 They will just pass on the revenue they could get because it's 1936 01:33:15,802 --> 01:33:17,202 just like not worth building it. 1937 01:33:17,212 --> 01:33:18,792 So that's just one example. 1938 01:33:19,142 --> 01:33:22,692 Uh, multipliers we were talking about is another example, like data syncing, 1939 01:33:22,782 --> 01:33:26,132 all of these things that like the OSS that we use today, they just don't 1940 01:33:26,132 --> 01:33:28,007 provide But the web platform does. 1941 01:33:28,037 --> 01:33:29,477 So we moved to the web platform instead. 1942 01:33:29,767 --> 01:33:30,217 Yeah. 1943 01:33:30,307 --> 01:33:31,837 I love that, that vision. 1944 01:33:31,917 --> 01:33:36,857 Uh, and, and so I've mentioned before that I am trying to build the best 1945 01:33:36,857 --> 01:33:40,697 of both worlds for like embracing the web, still making the app feel native 1946 01:33:40,727 --> 01:33:45,417 and, uh, the app also following the local-first ideals as much as possible. 1947 01:33:45,777 --> 01:33:49,157 This is really, uh, building an app on the hard mode compared 1948 01:33:49,157 --> 01:33:50,707 to how you build other apps. 1949 01:33:50,707 --> 01:33:51,157 So. 1950 01:33:51,272 --> 01:33:55,032 Um, chasing that quality, et cetera, but it's so hard. 1951 01:33:55,522 --> 01:34:01,162 Um, and this is where in the future, where I can just build Overtone on top 1952 01:34:01,162 --> 01:34:06,722 of Playbit, this is where I can put all of my effort on making the, like spending 1953 01:34:06,732 --> 01:34:11,872 the quality on like even, even more higher leverage things, and you've been taking 1954 01:34:12,242 --> 01:34:17,672 care of like the tough foundation that the app is collaborative by default, that it 1955 01:34:17,672 --> 01:34:19,762 feels more, gives me better primitives. 1956 01:34:19,862 --> 01:34:23,522 The app feels native where, depending on where it's running, whether it's 1957 01:34:23,522 --> 01:34:26,892 running in the browser or whether it's running on, on someone's 1958 01:34:27,212 --> 01:34:28,792 more, more native environment. 1959 01:34:29,112 --> 01:34:31,722 So I'm really looking forward to that future. 1960 01:34:31,962 --> 01:34:33,752 I have one tangent question. 1961 01:34:33,812 --> 01:34:39,682 Uh, you've been mentioning that you're developing Playbit inside of Playbit. 1962 01:34:39,682 --> 01:34:43,372 Looking at this from a similar lens, I'm very curious whether you can already 1963 01:34:43,552 --> 01:34:48,762 have a browser running inside of Playbit and then open a Playbit environment 1964 01:34:48,932 --> 01:34:51,302 within the browser running Playbit. 1965 01:34:53,132 --> 01:34:57,012 Oh, we don't have a web browser yet. 1966 01:34:57,052 --> 01:35:00,032 If there's anyone out there who wants to join us, I mean, play, but it's 1967 01:35:00,032 --> 01:35:03,782 like a venture backed company, like, you know, we can pay you a salary. 1968 01:35:03,782 --> 01:35:04,692 It's like a real job. 1969 01:35:05,062 --> 01:35:08,922 If you want to come work with us and, you know, put Chrome or Firefox 1970 01:35:08,942 --> 01:35:10,692 in play, but yeah, hit me up. 1971 01:35:11,512 --> 01:35:15,492 Or if you want to work on like GPU stuff or the Linux kernel, we 1972 01:35:16,212 --> 01:35:17,362 are looking to hire a few people. 1973 01:35:17,462 --> 01:35:19,082 So yeah, there's no web browser yet. 1974 01:35:19,192 --> 01:35:20,532 It will, it will be a mind band. 1975 01:35:20,532 --> 01:35:20,942 Yeah. 1976 01:35:21,022 --> 01:35:23,722 To like run it inside a web browser, because then you can keep going. 1977 01:35:23,892 --> 01:35:27,302 It's like you take a video camera connected to a TV and you point 1978 01:35:27,302 --> 01:35:31,102 it at the TV, you know, you got this like, Infinity mirror effect. 1979 01:35:31,252 --> 01:35:31,472 Yeah. 1980 01:35:31,472 --> 01:35:32,072 That's kind of fun. 1981 01:35:32,442 --> 01:35:33,132 Uh, exactly. 1982 01:35:33,132 --> 01:35:37,002 That's what I had in mind, or I think you get the same when you like use like Google 1983 01:35:37,032 --> 01:35:41,942 meet or something or whatever it's called these days, but yeah, I would like take 1984 01:35:41,952 --> 01:35:47,582 up that, that job offer opportunity in a, in an instant, if I had the background 1985 01:35:47,592 --> 01:35:52,482 that fits it and If I wasn't already knee deep in all sorts of other things, but 1986 01:35:52,482 --> 01:35:56,302 I'm sure there, there will be someone out there who is the perfect fit and 1987 01:35:56,302 --> 01:35:58,772 I'm sure that's an amazing opportunity. 1988 01:35:59,287 --> 01:36:03,797 So before wrapping up, you're all, you're not just building such 1989 01:36:03,797 --> 01:36:07,607 an ambitious startup, but you're also about to become a father. 1990 01:36:07,797 --> 01:36:11,207 So I'm very curious, uh, from a personal perspective, like 1991 01:36:11,377 --> 01:36:13,007 how are you navigating that? 1992 01:36:13,017 --> 01:36:18,167 How do you balance going after such an, such an ambitious project, uh, 1993 01:36:18,207 --> 01:36:22,257 and also navigating that becoming a father, raising a family and so on. 1994 01:36:22,437 --> 01:36:26,457 I think I've just got a bit of perspective of what I think it's like important. 1995 01:36:26,777 --> 01:36:29,807 And less important, the more important and worth spending time on. 1996 01:36:29,857 --> 01:36:33,937 Like earlier in my life, there was one point where I found myself like 1997 01:36:33,937 --> 01:36:39,067 in a heart intensive care, minutes away from like dying because I wasn't 1998 01:36:39,067 --> 01:36:40,987 sleeping and I was working all the time. 1999 01:36:41,077 --> 01:36:43,647 And it was like an absolutely insane lifestyle. 2000 01:36:43,697 --> 01:36:47,117 You know, I would be partying and I would sleep like basically three hours 2001 01:36:47,117 --> 01:36:49,327 a night and have two jobs and party. 2002 01:36:49,697 --> 01:36:53,077 And you know, one day my body almost like give up and it was died. 2003 01:36:53,507 --> 01:36:55,307 And that was like a pretty good wake up call. 2004 01:36:55,602 --> 01:36:56,532 But that didn't fix it. 2005 01:36:56,532 --> 01:36:57,892 I was still like insane. 2006 01:36:57,982 --> 01:37:01,412 And so this was before I joined Spotify and it's Spotify. 2007 01:37:01,432 --> 01:37:06,062 I, you know, I was, I ran the whole design department for four years alone. 2008 01:37:06,782 --> 01:37:10,322 So, you know, I would do marketing stuff and all of the UI and everything. 2009 01:37:10,362 --> 01:37:11,502 You just one person, right? 2010 01:37:11,912 --> 01:37:13,002 There's no other designers. 2011 01:37:13,042 --> 01:37:14,172 It was absolutely insane. 2012 01:37:14,692 --> 01:37:15,792 And I didn't know better. 2013 01:37:15,842 --> 01:37:17,382 And I worked all the time. 2014 01:37:17,502 --> 01:37:20,462 And I mean, like basically 24, 7, 4. 2015 01:37:20,782 --> 01:37:25,952 The first, like, year or 2 and, you know, I paid like a pretty heavy price 2016 01:37:25,982 --> 01:37:29,832 from both of these experiences and it's, you know, just like a waves on a 2017 01:37:29,832 --> 01:37:34,432 body of water, you know, the cost and effect, there's a quite a bit of delay. 2018 01:37:34,602 --> 01:37:36,642 And so I started to realize that. 2019 01:37:36,962 --> 01:37:41,722 You know, what the costs have been and losing, you know, friends and, and losing 2020 01:37:41,762 --> 01:37:46,662 out on like social events and, you know, losing my girlfriend and like, yeah, it's 2021 01:37:46,672 --> 01:37:50,212 losing a lot of things, losing health and, you know, all of this kind of stuff. 2022 01:37:50,292 --> 01:37:54,062 And anyhow, so that, that was a long time ago, you know, that was like mid 2000s. 2023 01:37:54,402 --> 01:37:58,622 And now I think that work is like, yes, it's a part of life. 2024 01:37:58,742 --> 01:37:59,832 And if you're lucky. 2025 01:38:00,267 --> 01:38:04,417 You'll find something to work on that creates a passion in you know, when 2026 01:38:04,437 --> 01:38:07,967 in the morning you wake up and you think about it in like a good way. 2027 01:38:07,977 --> 01:38:13,077 If in like, I gotta get make a cup of coffee and like get jump into this layer. 2028 01:38:13,357 --> 01:38:15,547 That thing I think that is like. 2029 01:38:15,752 --> 01:38:18,842 All one can wish for when it comes to like work that is like the, 2030 01:38:19,172 --> 01:38:22,012 if you, if you get to the level, you're like, you've made it right. 2031 01:38:22,192 --> 01:38:25,522 If sure, if you, if you still need to make money, that's another 2032 01:38:25,522 --> 01:38:28,872 problem, but like beyond, beyond that and then everything else in life. 2033 01:38:28,882 --> 01:38:33,562 So I think as I just have this philosophy that like work is important and it's about 2034 01:38:33,562 --> 01:38:38,432 passion, you know, if you can make it so, and with play a bit specifically, and I 2035 01:38:38,432 --> 01:38:42,662 made it very clear to everyone involved in play a bit from like day one that. 2036 01:38:43,207 --> 01:38:46,887 This is something that will be done on, uh, like, uh, on a balance. 2037 01:38:47,327 --> 01:38:50,097 This is not a, I'm going to give up like five years of my 2038 01:38:50,097 --> 01:38:51,437 life just to make this happen. 2039 01:38:51,527 --> 01:38:54,937 This is not like a, I'm going to like get rid of my friends 2040 01:38:55,117 --> 01:38:56,257 because it's more important. 2041 01:38:56,537 --> 01:39:00,707 And so, you know, starting a family and like moving and having hobbies outside 2042 01:39:00,707 --> 01:39:02,817 of work is like an explicit goal. 2043 01:39:03,007 --> 01:39:06,797 And it's the same with true for like our employees that there 2044 01:39:06,857 --> 01:39:08,647 are no expectations to work. 2045 01:39:08,862 --> 01:39:12,752 Outside of working hours and compensation does not happen on a time basis. 2046 01:39:12,762 --> 01:39:15,932 Not like if you work four hours, you make more than if you work two hours. 2047 01:39:16,252 --> 01:39:19,482 I think that model is just fundamentally incompatible with this mindset. 2048 01:39:19,632 --> 01:39:22,022 And that also goes to like, you know, we don't really have sort 2049 01:39:22,022 --> 01:39:26,782 of like milestones or, or, uh, measurements of like how we're doing. 2050 01:39:26,782 --> 01:39:29,982 It's more like we have a roadmap and we build things toward it. 2051 01:39:30,052 --> 01:39:32,642 And we have different areas of responsibility. 2052 01:39:33,392 --> 01:39:36,802 How well we are doing is measured in like the actual product. 2053 01:39:36,822 --> 01:39:38,432 Like, can it do the thing, right? 2054 01:39:38,512 --> 01:39:40,592 Have we done the thing that we said we were going to do? 2055 01:39:40,782 --> 01:39:44,262 Like, if, if not, we're not doing well and we got to figure something out. 2056 01:39:44,302 --> 01:39:46,362 If it does, we're doing well and let's keep doing it. 2057 01:39:46,722 --> 01:39:47,252 Exactly. 2058 01:39:47,252 --> 01:39:50,482 And if you have that passion, like getting up in the morning, being super 2059 01:39:50,482 --> 01:39:54,782 pumped about doing that, that is the, that's the best fuel to get there. 2060 01:39:54,952 --> 01:39:58,072 Probably even more efficiently than if you'd have like the best 2061 01:39:58,322 --> 01:40:02,072 product managers who figure out every, every step along the way. 2062 01:40:02,302 --> 01:40:03,062 I think that's right. 2063 01:40:03,092 --> 01:40:07,452 And I think it's like, it's, it's such a nice kernel of an idea, but to build 2064 01:40:07,472 --> 01:40:11,122 things around, like you think about, okay, now, how do you, how do you create that? 2065 01:40:11,152 --> 01:40:11,972 Or how do you maintain it? 2066 01:40:11,972 --> 01:40:14,012 If you have created it, I think that's really hard. 2067 01:40:14,022 --> 01:40:15,882 And it's a lot of work to make that happen. 2068 01:40:15,882 --> 01:40:16,102 Right. 2069 01:40:16,492 --> 01:40:19,882 For once, if you, let's say you like to eat pizza, if you eat pizza 2070 01:40:19,882 --> 01:40:22,782 every day, pretty soon, you're not going to like pizza anymore. 2071 01:40:22,852 --> 01:40:23,142 Right. 2072 01:40:23,382 --> 01:40:25,462 And so like, if you work on the thing that you're really passionate 2073 01:40:25,462 --> 01:40:29,417 about, like, Unhinged like totally all the time, very quickly. 2074 01:40:29,417 --> 01:40:31,277 Will you like burn out or whatever you want to call it? 2075 01:40:31,307 --> 01:40:32,517 It's not going to be fun anymore. 2076 01:40:32,547 --> 01:40:33,217 So you lose it. 2077 01:40:33,897 --> 01:40:37,957 If you don't get to exercise what you're excited about, it will like wane away. 2078 01:40:38,887 --> 01:40:39,227 Right. 2079 01:40:39,307 --> 01:40:40,857 So there's like more dimensions to it. 2080 01:40:41,057 --> 01:40:44,017 Managing that I think suddenly becomes done an effort. 2081 01:40:44,017 --> 01:40:45,377 It's not like we're working less. 2082 01:40:45,417 --> 01:40:47,037 We're just working hard on different things. 2083 01:40:47,067 --> 01:40:47,367 Right. 2084 01:40:48,537 --> 01:40:52,677 And so like, you know, the way we work now, sometimes maybe someone like feels 2085 01:40:52,677 --> 01:40:56,177 like tired a day or like feels like they have a cold or something like that. 2086 01:40:56,187 --> 01:40:56,207 Yeah. 2087 01:40:56,737 --> 01:41:00,067 You just don't work that day, just take the day off or, or it feels like, 2088 01:41:00,067 --> 01:41:03,287 Oh God, I've been like, we're, we have this like memory corruption bug. 2089 01:41:03,637 --> 01:41:04,707 Uh, we weren't sure. 2090 01:41:04,707 --> 01:41:05,737 Is it in the kernel? 2091 01:41:05,797 --> 01:41:07,267 Is it in the compiler? 2092 01:41:07,287 --> 01:41:09,897 Is it, there was this thing that was lasting for two weeks and we 2093 01:41:09,897 --> 01:41:11,017 were like, okay, we just got it. 2094 01:41:11,027 --> 01:41:15,677 We need to take like two days off and just like, I don't know, read a book, look 2095 01:41:15,677 --> 01:41:17,937 at a tree, play a video game, whatever. 2096 01:41:18,237 --> 01:41:21,297 And came back to it and, you know, we, we, we found it. 2097 01:41:21,577 --> 01:41:26,207 And so I think like, you know, part of this is also taking like a break when 2098 01:41:26,207 --> 01:41:29,767 you're like, you know, uh, climbing a mountain and it's like really hard. 2099 01:41:29,767 --> 01:41:30,627 You need to take a break. 2100 01:41:30,697 --> 01:41:32,917 Otherwise you're just going to overextend yourself and fall down. 2101 01:41:33,507 --> 01:41:33,887 Yeah. 2102 01:41:33,957 --> 01:41:36,797 And, but I think it's like similar to food. 2103 01:41:36,797 --> 01:41:41,227 It's not just like that besides pizza, everything tastes bad, but there's 2104 01:41:41,257 --> 01:41:46,057 plenty of other good things that taste really well and you can, you can just 2105 01:41:46,217 --> 01:41:48,607 Choose and like cycle between them. 2106 01:41:48,647 --> 01:41:53,117 And I think this also shows in your portfolio work, you've not just tackled 2107 01:41:53,117 --> 01:41:58,657 super hard data problems or, uh, or performance problems, but you also took 2108 01:41:58,657 --> 01:42:03,377 like more scenic routes, creating one of the most popular fonts out there, enter. 2109 01:42:03,787 --> 01:42:08,627 And, uh, for, for me, I can, can totally see how just switching a 2110 01:42:08,627 --> 01:42:11,977 little bit of, between those different things can be really re energizing. 2111 01:42:12,457 --> 01:42:17,127 And I love that mindset and that, that balance that you're striking for. 2112 01:42:17,127 --> 01:42:21,967 And I think that is, is very on brand for, for Playbit that 2113 01:42:22,027 --> 01:42:24,657 it should be fun and playful. 2114 01:42:24,807 --> 01:42:25,217 Yeah. 2115 01:42:25,287 --> 01:42:26,207 Life is really short. 2116 01:42:26,217 --> 01:42:27,537 It's much shorter than we think. 2117 01:42:27,557 --> 01:42:31,127 And we usually don't realize how short it is until we lose something. 2118 01:42:31,347 --> 01:42:34,787 You know, like a family member or health or whatever it is. 2119 01:42:35,157 --> 01:42:38,747 So I think it's never a bad idea to reiterate that like life really is short. 2120 01:42:38,967 --> 01:42:42,397 And the one thing we all have the same amount of is time, right? 2121 01:42:42,417 --> 01:42:45,067 That's, I think that's like your body and your time are your 2122 01:42:45,087 --> 01:42:48,047 two most valuable resources and everything else is just secondary. 2123 01:42:48,067 --> 01:42:48,367 Right? 2124 01:42:48,907 --> 01:42:53,167 Well, thank you so much for making the limited time that we have more joyful. 2125 01:42:53,312 --> 01:42:58,592 by great software and, uh, thank you so much for taking this huge amount of 2126 01:42:58,602 --> 01:43:02,472 time today out of your day, uh, to share all of those stories on the podcast. 2127 01:43:02,602 --> 01:43:03,262 Thank you so much. 2128 01:43:03,796 --> 01:43:05,086 Thank you so much, Johannes. 2129 01:43:05,146 --> 01:43:06,166 This was super fun. 2130 01:43:06,216 --> 01:43:08,166 I love just talking about these things with you. 2131 01:43:08,286 --> 01:43:10,896 If it's on a podcast or over a cup of coffee, and I hope we can 2132 01:43:10,896 --> 01:43:12,066 do more of this in the future. 2133 01:43:12,416 --> 01:43:12,916 Awesome. 2134 01:43:12,956 --> 01:43:13,986 I couldn't agree more. 2135 01:43:14,096 --> 01:43:14,866 Take care. 2136 01:43:15,046 --> 01:43:15,416 Thank you. 2137 01:43:15,946 --> 01:43:16,566 Bye. 2138 01:43:17,068 --> 01:43:19,608 Thank you for listening to the localfirst.fm podcast. 2139 01:43:19,848 --> 01:43:23,578 If you've enjoyed this episode and haven't done so already, please subscribe and 2140 01:43:23,578 --> 01:43:25,338 leave a review wherever you're listening. 2141 01:43:25,708 --> 01:43:27,138 Please also tell your friends about it. 2142 01:43:27,148 --> 01:43:30,718 If you think they could be interested in local-first, if you have feedback, 2143 01:43:30,758 --> 01:43:34,498 questions or ideas for the podcast, please get in touch via hello at 2144 01:43:34,498 --> 01:43:40,278 localfirst.fm or use the feedback form on our website, special thanks to Expo and 2145 01:43:40,278 --> 01:43:42,328 Crab Nebula for supporting this podcast. 2146 01:43:42,728 --> 01:43:43,488 See you next time.