localfirst.fm
All episodes
October 1, 2024

#15 – Tuomas Artman: Linear, sync engines, rethought startup MVP

#15 – Tuomas Artman: Linear, sync engines, rethought startup MVP
Sponsored byPowerSyncRocicorp
Show notes

Transcript

0:00:00 Intro
0:00:00 And like from the get go, we knew that we just like, the way for us
0:00:03 to win was to build Something that was excellent, like build a product
0:00:08 that would just feel so good that you wouldn't want to use anything else.
0:00:13 You have to build something much better in order to to be able to gain market share.
0:00:18 And convince users to switch over.
0:00:20 And because our mission is to help companies be better at building software,
0:00:25 like, We should make a product that is an inspiration to them as well.
0:00:29 So we should make sure that, know, when they use the product, they're like,
0:00:31 oh, man, like, ooh, this feels good.
0:00:34 Like, I want to make my product as good as this freaking project management solution.
0:00:41 Because if you can make an issue tracker that is, that is aspired to, then like,
0:00:45 then you can make any, any application as, as, as nicely, like an issue tracker
0:00:50 is hard to pull off as being a very nice and cool looking and, intuitive app.
0:00:56 Welcome to the Local First FM podcast.
0:00:59 I'm your host, Johannes Schickling, and I'm a web developer, a
0:01:02 startup founder, and love the craft of software engineering.
0:01:05 For the past few years, I've been on a journey to build a modern, high quality
0:01:09 music app using web technologies.
0:01:11 And in doing so, I've been following down the rabbit hole of local first software.
0:01:15 This podcast is your invitation to join me on that journey.
0:01:19 In this episode, I'm speaking to Tuomas Artman, co founder and CTO of Linear.
0:01:25 Prior to Linear, Tuomas had already built Sync engines for over a decade at
0:01:29 companies, including Groupon and Uber.
0:01:32 In this conversation, we explore how local first and the focus on
0:01:36 software quality was crucial for Linear's success and how the concept
0:01:40 of a startup MVP should be rethought.
0:01:43 Before getting started, also a big thank you to Rosicorp and PowerSync
0:01:48 for supporting this podcast.
0:01:50 And now my interview with
0:01:51 Tuomas.
0:01:52 Welcome Tuomas.
0:01:54 So nice to have you on the show.
0:01:56 It was such a pleasure to also have you in Berlin for the Local-First Conference
0:01:59 a couple of months ago, and super excited now to dig in even deeper into
0:02:04 so many things local-first with you.
0:02:06 Would you mind introducing yourself?
0:02:09 Yeah, of course.
0:02:09 Um, and thanks for having me and having me at the local first conference, which was I
0:02:14 guess the first conference that, you know, was about local first, which was awesome.
0:02:18 I thoroughly enjoyed it.
0:02:20 I'm Tuomas.
0:02:21 I've been engineering my whole life.
0:02:23 Like I started way back in, in 96, doing CD ROM multimedia presentations.
0:02:28 if you can imagine, when the internet was sort of not there yet,
0:02:32 if you ever had a Nokia phone that usually came with the CD ROM, with
0:02:35 instructions on how to use that phone.
0:02:37 Chances are that, that was made by the company that it
0:02:39 was working for, or even by me.
0:02:41 I did a few of those as well.
0:02:42 but you know, ever since then, obviously the intern came around
0:02:45 much, much more interesting.
0:02:46 I, started the consultancy for nine years until I realized that,
0:02:50 that's not what I want to do.
0:02:52 Did startups a few in Finland, went to China for a year, doing a startup there.
0:02:56 until I got the opportunity to move to, Silicon Valley,
0:02:59 joint Groupon, and later Uber.
0:03:02 and, finally, I found myself as the co founder of Linear,
0:03:05 you know, six years ago.
0:03:07 and, I've been, working on essentially the harder technical problems.
0:03:10 I do enjoy working on products, More, but, somebody needs to
0:03:14 take care of all the tech stuff.
0:03:16 so I found myself, like, working on the sync engine in the early beginnings,
0:03:20 and, that's what I'm still, working on.
0:03:22 So I've, done anything from CD ROMs back in the day to sort of, you know, early web
0:03:27 HTML applications, then going into mobile.
0:03:30 and now I'm doing sort of, sync engine and infrastructure.
0:03:33 So I'm, I'm literally have gone, full round and I'll end up with, probably
0:03:37 doing CD ROMs in the future as well.
0:03:39 Sync Engines
0:03:39 That is super impressive and very inspiring.
0:03:42 When you've been building software got shipped on CD ROMs,
0:03:46 I was four years old in 96.
0:03:48 But.
0:03:49 It seems like a theme throughout at least the later years of your engineering
0:03:54 career and path has been sort of like gravitating towards syncing engines.
0:04:00 So when was the first time you thought about the concept of
0:04:05 syncing engines and used the term?
0:04:07 Um, that was in the consultancy back in, Finland, like we had a consultancy
0:04:11 doing all kinds of, you know, campaign stuff and internet things.
0:04:14 Um, Flash was pop then, um, and, you know, we did a lot of Flash campaigns and Metro
0:04:19 Media had this, plugin called Shockwave.
0:04:21 I don't know if you remember.
0:04:22 and it had a 3D component, so you were able to do, 3D accelerated games on it.
0:04:27 and we did one of these games, and it was a sort of multiplayer shoot
0:04:30 'em up game, which was amazing back then, and I loved it, and it
0:04:33 looked, you know, super awesome.
0:04:35 and it, it was multiplayer.
0:04:37 It was like four people against four people.
0:04:39 so it, it needed What I would call a sync engine, like you needed to sort
0:04:44 of, you know, send over the coordinates of, you know, all of these ships.
0:04:47 it was, you know, fully real time, 3D rendered, stuff, so it
0:04:50 needed to be really, really fast.
0:04:51 And that was, you know, the first time I wrote, could be described as sync
0:04:55 engine, where you would annotate some properties saying, like, these need to
0:04:58 be transferred to all the players in that room, and it would automatically pick up
0:05:01 on those and then send them over whenever they changed, which happened, like,
0:05:04 effectively, locally, then, the Client code would just change those properties.
0:05:10 So that still looks very similar to what we have today, where, like, you
0:05:14 annotate your properties, and then they automatically get picked up and sent
0:05:18 over to the server to do something.
0:05:21 So that was the first time I built a very simple sync
0:05:24 engine, a bit more complicated.
0:05:27 One, I built one in China for this, you know, I was working at a gaming
0:05:30 company or a gaming startup that had a lot of smaller teams building games
0:05:35 for, one of their portals that they had.
0:05:37 And I was, one of the CTOs there, like we had two CTOs, weirdly,
0:05:41 like a Chinese CTO and then me.
0:05:43 And I was responsible for sort of the, trying to build out a common
0:05:47 stack for, their real time games.
0:05:49 So I built another sync engine, and this time with Yeah, I don't remember
0:05:53 what the first one was built on, even, but the second, like, my second
0:05:56 sync engine was built with Node.
0:05:58 And it had a Flash client and a Unity 3D client.
0:06:02 And it would essentially do the same thing as, know, the first one that I built.
0:06:07 Like, it would pick up properties and send them across the room.
0:06:09 It was a bit more intelligent.
0:06:11 Like, it did more stuff.
0:06:12 And it became, better.
0:06:14 And then my third sync engine was built for Groupon when I joined, um,
0:06:18 in San Francisco in 2000, probably 12.
0:06:23 and I was working on a point of sale application, for high end restaurants.
0:06:26 Like you would have an iPad in the, or multiple iPads in the menu.
0:06:30 and you could take orders, you could swipe credit cards, you could
0:06:32 sort of, print out tokens to the kitchen for them to prepare the food.
0:06:36 and all of these iPads need to be in sync.
0:06:38 Cause.
0:06:39 Otherwise, you could take sort of the order twice, or you
0:06:41 could charge the customer twice.
0:06:43 So, I was like, hell, I know how this stuff works.
0:06:47 They had a very complicated thing built that just didn't work very
0:06:51 well, and they wanted to pull it out.
0:06:52 And I was like, I can try something.
0:06:54 I can sort of, you I tried to reinvent how this should look like, so I built
0:06:59 in a sync engine, this time with Objective C, and a Node backend, because,
0:07:04 I was pretty good at that already.
0:07:07 And, yeah, it shipped into production, it would synchronize all the iPads
0:07:11 at the menu, and just make sure that everything was nice and tidy.
0:07:16 And it had offline support, even.
0:07:18 Even back in the day, because, um, we realized that, many of the
0:07:21 customers had, pretty, flaky Wi Fi.
0:07:23 And so you would, constantly lose, your connectivity to the backend.
0:07:26 and we want to do something about it.
0:07:27 So it would, you know, buffer all these requests on the iPad.
0:07:31 And I think it tried to even talk to the other iPads to synchronize
0:07:34 between them before sending it out.
0:07:36 to the internet, and that sort of worked, but, you know, obviously
0:07:40 immediately somebody, somebody took it, to the next level.
0:07:43 And, we never said that there was offline support.
0:07:45 We've just said, like, you can turn your, you know, Wi Fi off for a second.
0:07:49 And we had built in these precautions of like, what happens if you
0:07:52 don't have connectivity and you, you take a credit card charge?
0:07:56 we would store, that credit card securely.
0:07:59 On device, like encrypted, and make sure that, you couldn't get at it, you know,
0:08:02 otherwise, and then when you got back, you would replay those, those orders and,
0:08:07 hopefully they would go through, obviously it wasn't no guarantee because we couldn't
0:08:10 check with the payment provider, whether that been true, that went through, so
0:08:15 we never anticipated for anybody to sort of be offline for a long time.
0:08:20 And then there was this company that operated the train across the Rocky
0:08:24 Mountains, and they had a restaurant car.
0:08:27 And what they immediately did, they bought the software, which was called Breckrum,
0:08:31 and they started just charging everybody.
0:08:34 in that restaurant car for two days.
0:08:36 Like, two days they didn't have any Wi Fi connectivity and took all
0:08:40 these charges and then, regained connectivity once the trip was over
0:08:43 and, luckily it all worked out.
0:08:45 yeah, it could have gone really wrong and would have been very, very expensive.
0:08:49 but, I don't know what happened to that.
0:08:51 We probably told them to never do that again.
0:08:53 and, it wasn't really meant for, meant for that, but.
0:08:55 Yeah, so that was the third sync engine that I, that I wrote.
0:08:58 and the fourth one was for Uber.
0:09:00 I mean, I joined like literally every single company I've done in,
0:09:03 in, in the past, five companies.
0:09:05 I've built a sync engine, engine for them.
0:09:07 Um, At Uber, I joined at a time when hyper growth was just going on.
0:09:12 I think we were 300 engineers when I joined.
0:09:15 Later we will be like 4, 000.
0:09:17 And I tried to build a sync, or I actually did build a sync engine with a Go
0:09:22 backend together with a former colleague of mine who was a Groupon as well.
0:09:27 And we shipped a sort of, small beta product out on it.
0:09:31 Like, I think if I remember correctly, it was sort of a courier service in New
0:09:35 York where you could Just order a car and the car would come and pick up your
0:09:40 stuff and then you could sort of, see him deliver those things in your city and we
0:09:45 built that thing in effectively a week.
0:09:46 Like the sync engine obviously took quite a bit of time to put together.
0:09:50 But after that, building the application was a week and with that in mind, I, went
0:09:55 to, my managers and, tried to explain to them how, how freaking awesome it is that
0:10:00 you can build an application that does, sort of, all of this out of the box in
0:10:04 a week and we should sort of just, put the whole Uber application onto this.
0:10:09 And I sort of got the green light to try to do it but I just wasn't able to,
0:10:16 like, the company was moving so quickly and everything was just, on fire all
0:10:20 the time around me that nobody really cared about, like, my nice initiative
0:10:24 to sort of put a sync engine in.
0:10:26 And it sort of bothered me very much because, like, even a year later,
0:10:33 like, the way that Uber client did sync was what we call ping.
0:10:39 It would, every three seconds, call the server and receive everything, everything
0:10:45 that it knew in this one huge packet, every three seconds it would go in and
0:10:49 fetch the entire state of the world.
0:10:52 And then like including, user accounts and credit card, credit card that you had in
0:10:56 the application, all the cars around you.
0:10:58 you know, Literally, literally everything.
0:11:00 And it was like, pretty big packet.
0:11:02 So it, it, it felt so inefficient.
0:11:04 And, then we started optimizing it a bit and effectively build.
0:11:08 some small, you know, sync like functionality into it,
0:11:11 but it was never the same.
0:11:12 Like, I think that Uber would have been so much better off if they
0:11:14 had, just gone with a sync engine, put it in and build it effectively
0:11:19 like a local-first application out.
0:11:21 It would have saved so many, so many engineering, engineering
0:11:24 hours, and the product would just be much better because of that.
0:11:27 Yeah, it didn't happen.
0:11:28 So, that actually was open sourced.
0:11:30 It's called JetStream.
0:11:31 Like, I think it's somewhere still on GitHub, if you want to check it out.
0:11:34 We had a Swift client and a JavaScript client, and even an
0:11:39 Android client and a Go backend.
0:11:44 Linear origin story
0:11:44 And then came Linear.
0:11:45 And um, yeah.
0:11:47 What do you start, that product with, like, you just come out of Uber and
0:11:51 you're sort of super excited about local-first and think that, that's the
0:11:54 model of the future of how you should be building any kind of application
0:11:57 that has a limited set of data.
0:12:00 And I, I was excited just, trying out things and, getting back to
0:12:04 web, like I hadn't worked on, on, on web technologies in, in ages.
0:12:09 It probably was like six years that I had spent on mobile, mobile engineering.
0:12:13 So when I got back, like I was like, holy crap, like what is all this React stuff?
0:12:16 Like this, this looks awesome.
0:12:17 And the technology has just, progressed so much that I you know, had to learn a
0:12:21 lot of stuff, which was super exciting.
0:12:23 And the first thing that I, that I did, like, , Jory and I got together
0:12:27 on hacking on, on just some issue tracking, because, we were excited about
0:12:31 or we weren't excited about this space, but we thought that somebody should,
0:12:35 do something about it should figure out like, to do a project management
0:12:38 system that actually worked nicely.
0:12:40 Because we had heard all these stories at our respective companies of like,
0:12:45 how, how people just disliked whatever they were using back in the day.
0:12:49 And we were like, oh, it sounds like an interesting challenge.
0:12:52 And so we started, effectively just.
0:12:54 hacking on it.
0:12:56 And through just making a few prototypes with a local-first architecture, we were
0:13:00 like, holy shit, this is pretty good.
0:13:03 You can, rather really quickly build something that is
0:13:06 immensely fast and is real time.
0:13:08 And it just feels like a modern application that, isn't really a
0:13:11 web app anymore, but just a desktop app that just runs in your browser.
0:13:16 That is fascinating.
0:13:17 So through those technical prototype explorations, you build for
0:13:21 yourself the conviction, Oh, we can build something much better.
0:13:25 And that has then led to the building, the conviction to start out Linear.
0:13:29 Do I summarize the starting point there correctly?
0:13:33 I think so.
0:13:34 Like, so we were struggling with the, with starting the company or not struggling.
0:13:38 Like we, we didn't want to spend 10 years of our time doing project
0:13:42 management because it felt such a boring space to be initially.
0:13:46 Like when you think about like, we were always like, very often we we're just
0:13:49 having a drink first with only Jory.
0:13:52 And then we tried to, recruit Kari as well.
0:13:54 But he was even less interested in, in this space, like project management,
0:13:58 what the hell and We always had the, the weird, idea of like, it seems such
0:14:03 a simple thing to do, like, it seems like such an opportunity to build, start
0:14:08 with an issue tracker, because like, you don't need much more than that in
0:14:11 order to sort of cater to startups.
0:14:13 And it felt like such a market opportunity to build something
0:14:16 really good in that space.
0:14:18 And it really shouldn't take too much time.
0:14:20 Like, it was a relatively simple application and we immediately knew that.
0:14:23 We would be able to build it.
0:14:25 But we always came back to the idea, like, why hasn't anybody else done this before?
0:14:29 And thinking about that problem so many times, we were like, the only the
0:14:32 only reason we could come up with was that nobody who sort of was able to
0:14:37 create beautiful applications wanted to spend their time on project management.
0:14:42 And thus, nobody had done it before.
0:14:43 And we were sort of struggling with the same thing as well.
0:14:46 Like, We didn't want to spend our time with project management.
0:14:49 Like, it felt like an industry that was kind of boring until later.
0:14:53 And, my co founders might have a very different, view on, on how this happens.
0:14:56 This is how I felt.
0:14:57 Like at some point at least I understood like that it's, it's not about
0:15:02 building a project management solution.
0:15:04 Like it's, it's about helping companies be better at building software.
0:15:07 And that sort of became our mission statement in, in the
0:15:10 early days, like helping companies be better at building software.
0:15:13 And that was sort of a selfish mission as well.
0:15:15 Like I enjoy using software, like I, I love using, great applications and, when
0:15:20 the iPhone came around like that, that mechanism of using, your mobile phone
0:15:24 in a, in a very different manner in a much more intuitive manner was, awesome.
0:15:27 And I wanted to enable people.
0:15:30 To just build better software so that I can use it myself.
0:15:33 And I think we did these sort of, technical trials at the same time as well.
0:15:37 Like we did some prototyping and I was, I was just hacking with Couchbase or some
0:15:41 other tech to sort of, put together a few, few demos just to, catch up with.
0:15:46 With the rest of the web stack that I hadn't used in ages.
0:15:51 but yeah, that's, that's sort of how we, how we got started.
0:15:53 And like from the get go, we knew that we just like, the way for us
0:15:57 to win was to build Something that was excellent, like build a product
0:16:02 that would just feel so good that you wouldn't want to use anything else.
0:16:07 Because, like, again, the incumbent solutions have been around for,
0:16:10 for ages and they're so ingrained in all the software companies.
0:16:14 You have to build something much better in order to to be able to gain market share.
0:16:18 And convince users to switch over.
0:16:21 And because our mission is to help companies be better at building software,
0:16:25 like, We should make a product that is an inspiration to them as well.
0:16:29 So we should make sure that, know, when they use the product, they're like,
0:16:32 oh, man, like, ooh, this feels good.
0:16:34 Like, I want to make my product as good as this freaking project management solution.
0:16:41 Because if you can make an issue tracker that is, that is aspired to, then like,
0:16:46 then you can make any, any application as, as, as nicely, like an issue tracker
0:16:50 is hard to pull off as being a very nice and cool looking and, intuitive app.
0:16:57 Totally.
0:16:58 I'm friends with some of the folks who built Wunderlist back in the days.
0:17:01 And I mean, I think that there's a lot of similarities there
0:17:05 where I don't think there's like anything sexy about a to do list.
0:17:10 But yeah, Wunderlist was so well built and felt so great to use.
0:17:15 I think there's a lot of similarities there.
0:17:18 And yeah, if you think about it, like a issue tracker is sort of
0:17:21 like a more evolved to do list.
0:17:25 And this was like over a decade ago, and I think you've now just set the new bar
0:17:30 of what a high quality app looks like.
0:17:33 Where did you put your focus on when you said, okay, we want to,
0:17:37 to build an app that feels great.
0:17:40 And so the early technical explorations were also like an ingredient was snappy
0:17:45 data with that sync engine, but which other parts did you feel like this
0:17:51 is what we have to really get right that otherwise it won't feel good?
0:17:55 Initial focus: Command menu, native feel, real-time
0:17:55 Yeah.
0:17:55 So we have three points three things that we want to achieve, like
0:17:59 Superhuman was around back then.
0:18:01 So Superhuman was an inspiration to us.
0:18:03 Like their command menu was, an inspiration.
0:18:06 So the, the first, like we started using Linear, the, the
0:18:09 week we started building it.
0:18:11 So we have all the old tickets in, in there, you know, still.
0:18:13 And the first ticket that is in Linear LIN1 is about
0:18:17 implementing the command menu.
0:18:19 The first thing that you start with when building a product is
0:18:22 implement a command menu like that.
0:18:23 That tells you something about sort of the.
0:18:25 Yeah, the interest that we had, like, we wanted to play around with, with
0:18:29 sort of new ways of building UI and new ways of, keeping or making our
0:18:34 users sort of, be super users without having anything else in the app yet.
0:18:39 So that was the first thing that Jori started implementing.
0:18:43 And I, I started implementing the sync engine cause like we like, yeah.
0:18:47 So the first thing was like, we need keyboard shortcuts and command menu.
0:18:51 Like we need to enable the application to be super fast for, for super users.
0:18:56 So if you're a, you know, high end engineer that just wants to get,
0:18:59 things done very quickly in their issue tracking software, we should enable
0:19:02 you to just, use keyboard shortcuts and the command menu to get things done.
0:19:07 The second one was that, the application should feel like an
0:19:10 application, like a native application.
0:19:12 We, like, we knew that we couldn't build a native app because then we would have
0:19:16 to do a Windows version and Linux version and it would just, and a web version as
0:19:20 well, because, like, often you, you, don't have your computer with you or you have
0:19:24 your iPad and you just need to sort of go onto the internet and see your tickets.
0:19:29 So we were like, well, we need to cut corners there, but let's try to make
0:19:32 an application with web technologies that feels like a native application.
0:19:37 So that was the second thing.
0:19:38 And then the third thing was sort of the real time aspect of it.
0:19:41 Like, we wanted it to feel real time.
0:19:43 Again, coming from these other solutions that we had used ourselves like, it
0:19:49 was a thing back in the day when, you had to refresh the page in order to
0:19:52 see if anybody else has updated it.
0:19:56 It's kind of strange that that was the case.
0:19:58 There was no background push, for most of these, these tools
0:20:02 and everything was a page load.
0:20:03 And you know, maybe a fourth one was the speed as well.
0:20:06 You could couple that with the sort of native application.
0:20:09 Like, speed of the app, like, I mean, native application is fast.
0:20:13 So, our web application needed to be fast as well.
0:20:16 And one concerning thing that, happened, or not concerning, but a
0:20:20 weird thing, was which relates to sort of not trusting everybody's feedback.
0:20:25 I, when we had an early prototype of the application with the command menu
0:20:29 and keyboard shortcuts, and it was super fast and all that I showed it to
0:20:33 a friend of mine in Finland when I was here, here on vacation and you know,
0:20:38 showed him all the, all the cool things that I thought were super exciting.
0:20:40 Like the, the, the quickness of it and the real time aspect of it.
0:20:43 I had two windows open and then I changed here.
0:20:45 It changed here.
0:20:47 and, he was like, well, I don't really get it.
0:20:49 Like I, my current thing is, is fast enough.
0:20:53 Like I really don't need the speed.
0:20:54 I don't really use keyboard shortcuts.
0:20:56 Who needs that real time stuff?
0:20:58 And I was devastated by that feedback.
0:21:00 I was like, what the hell?
0:21:02 Am I wrong or is my friend just wrong?
0:21:05 It turns out my friend was wrong.
0:21:07 And those three things are the things that we're known for today.
0:21:11 And that people appreciated the product.
0:21:13 The quickness of it.
0:21:14 The ability of using keyboard shortcuts to do many, like, all operations effectively.
0:21:19 Maybe not so the real time aspect, like, nobody calls out the real time
0:21:22 aspect of it, but I think that comes as a given, like, in a modern time,
0:21:26 you'd expect your application to be up to date without you having to refresh.
0:21:30 The page, it would have all kinds of problems if it didn't do that.
0:21:35 So, so yeah that's why, why I started with the sync engine.
0:21:37 Like, I'm thinking about a regular sort of, startup story or a journey
0:21:43 of a startup, like those are the last things that you should do.
0:21:46 Like, the common knowledge is always, build a, quick and
0:21:50 early MVP to try out your ideas.
0:21:52 Get in front of users.
0:21:54 And we spent like half a year building out, the sync stack and the command
0:21:58 menu and all this, all this stuff.
0:22:01 And I think that was, that was a great success.
0:22:03 Like, it could have had a very different outcome if you had just built an issue
0:22:08 tracker before and then in the end, try to sort of hinge in a sync engine or
0:22:13 replace whatever we had built, as a REST API, and put it into a Sync Engine stack.
0:22:19 So I think we we totally did the right thing, at least in hindsight
0:22:23 of, focusing on, on sort of the tech first and obviously the design as well.
0:22:27 Like Kari jumped in and started doing, designs and it took us some time to,
0:22:32 get it right and, and make it work.
0:22:34 But the first version that we launched was already looking very
0:22:37 much, of, of what we have today.
0:22:39 I see so many parallels to also how I intuitively tried to build Overtone
0:22:45 the, the music app where I think it was probably after I implemented
0:22:50 like initial list of tracks and some playlists where you could switch
0:22:55 between those lists of tracks.
0:22:57 I remembered, okay, I'm not going to just click on those playlists.
0:23:01 I have to use a command menu for that.
0:23:03 So, I think also at some point where I just needed a break from, like, many of
0:23:08 the more low level harder SQLite things.
0:23:11 I treated myself to implementing that command menu and I haven't now
0:23:16 attached it for two years and it just works and makes the app feel so nice.
0:23:20 And that's always like, it's one of those features where someone sits
0:23:24 next to you and he sees you using that and it's like, Oh, what is that?
0:23:28 And I think by now it's just shout's power tool.
0:23:32 And also the other aspects that you've mentioned that qualify that
0:23:37 high quality goal that you set for software is like that native feel.
0:23:42 Since I was also on a, on a similar fork in the road, like how should I build this?
0:23:47 And I think one very interesting path could have been to say like, I'm,
0:23:51 I'm a Mac OS user, I'm a iPhone user.
0:23:54 So.
0:23:55 Like being also led by building things for myself, I could have
0:23:59 selfishly just said, okay, I'm just going to build this in Swift for
0:24:03 Mac OS and for iOS and that's it.
0:24:07 But then also with my web background, I knew that was going to be extra
0:24:12 hard to do it for the web, but the distribution of the web is so powerful
0:24:18 that it's probably going to worth that effort, but that has like, what drew
0:24:23 me to, Native macOS, native iOS, is that like that notion of it's native
0:24:30 and people ask like, Oh, is it native?
0:24:32 And when you ask them, well, what, what does it mean for you?
0:24:34 It's kind of gets fuzzy very quickly, but I think it's even more
0:24:38 important that it should feel native.
0:24:41 And building a web app that feels native was always like a intuitive
0:24:47 north star for me that I had to.
0:24:49 Like pin down more and more.
0:24:50 What does that actually mean for Overtone?
0:24:53 For example, for Overtone, I have decided that the cursor is actually not
0:24:58 becoming a pointer on when you click on a button, but it stays like a default one.
0:25:03 I think this is one where I think the internet is deeply divided
0:25:07 whether they know it or not.
0:25:09 But that, but I, I've like, I was led a lot by Mac OS Finder as an
0:25:14 inspiration for how an app should feel.
0:25:17 And so this is where I spend a lot of time just thinking about that
0:25:21 and tweaking the little details.
0:25:23 So this, this is a story about the, the only time that we've, you
0:25:27 know faltered, in our judgment.
0:25:30 We had, The pointer cursor in there for every button that you had, like,
0:25:35 your pointer would turn into a finger and then we removed it because we're
0:25:39 like, no native application uses that.
0:25:41 It's the right thing to do.
0:25:43 Our application, should feel native as well, so it remains a pointer.
0:25:46 We just highlight things underneath.
0:25:48 And we shipped it, and, we had, we didn't have too many users back then.
0:25:52 So every feedback was important to us.
0:25:55 And I remember this one user mailing us in, like, literally, Maybe an hour
0:26:00 later, after we shipped it, and his thing was like, Linear has went from the best
0:26:05 application in the world to the worst.
0:26:07 Like, he was so unhappy with us removing the finger pointer
0:26:13 from there that we got scared.
0:26:14 We were like, oh shit, like, did we really do something that is
0:26:18 ingrained in people's minds?.
0:26:20 And there were a few other feedbacks that we got from that as well.
0:26:23 So we put in a preference where, they could turn it, turn it on again.
0:26:27 And it's still there.
0:26:27 Like, if you search for your personal preference, you can turn on the finger.
0:26:31 And after that, you haven't heard anybody do anything.
0:26:34 It's just when you change things that then people notice, but otherwise you
0:26:37 come in and you don't really realize that, something's off because it, it, from the
0:26:41 get go feels like a like an application.
0:26:43 And that's, that's totally the way to go.
0:26:45 I love that.
0:26:47 That, that is such a meta thing to like pull out the, oh, let's
0:26:51 make it a preference last resort.
0:26:55 yeah, we should not have done that.
0:26:57 we should have just stuck with it and be like, no preference.
0:27:00 It is what it is.
0:27:02 Rethinking the Startup MVP
0:27:02 So you've been talking before about sort of like that the typical startup MVP and
0:27:10 best example by the project management where there's many project management
0:27:14 tools is no longer really cutting it.
0:27:17 And you've written a great blog post about that, which will be put in the
0:27:21 show notes called Rethinking the Startup MVP, Building a Competitive Product.
0:27:26 So in this article, you.
0:27:29 outline that, yeah, the traditional way of thinking about an MVP, where you just
0:27:35 build something quickly, ship it quickly is maybe no longer cutting it today.
0:27:41 Can you dig in a little bit more?
0:27:44 Yeah, sure.
0:27:45 Cause it, it sort of was Was what we did with Linear effectively like, yeah, so
0:27:51 Eric Ries invented the MVP you know, ages ago um, in a world where the internet
0:27:56 has just came around and people were, you know, didn't know really what would
0:28:00 work and what didn't like, I, it's hard to imagine that Airbnb was controversial
0:28:07 back in the day, like when they went to YC you know, they, they barely got in
0:28:11 because, people were like, who, who wants to invite strangers to your home and who
0:28:16 would want to sleep at a stranger's home?
0:28:18 Like, that's, that's a crazy idea.
0:28:20 And in those cases, obviously, like if you're, building out something that
0:28:23 is, that is, completely new, where you even don't know if the idea works, an
0:28:28 MVP is a great, thing to test it out.
0:28:30 But unfortunately, we don't find ourselves in that situation anymore very often.
0:28:35 Now, maybe with AI we might have a bit more leeway in there, like there might
0:28:40 be new things that come up that we need to try out because we just don't
0:28:44 know if people are comfortable with.
0:28:46 Doing some of the, things that will, will happen.
0:28:49 But other than that, like it, most of the time you find yourself in a
0:28:52 space where you're already competing with, with other people, like you're
0:28:56 entering a space has already, you know, incumbent applications or services
0:29:02 and, and you need to somehow be better.
0:29:04 Like, why would anybody use your product?
0:29:07 if you enter that, then.
0:29:08 Build something that is not as good, which is effectively what an MVP is.
0:29:13 It's a, it's a quick and dirty hack to try things out.
0:29:15 Like why would anybody jump over to you?
0:29:17 if it's not better in any fashion.
0:29:19 So there is an aspect of quality that you need to have in order to be
0:29:24 better at, at, doing an application or service than the incumbent solutions.
0:29:29 So you need to rethink, you know, what, what it means to, to build out in that
0:29:33 way and to build something, that can compete with the rest of the world.
0:29:37 And that is like how, I think MVPs have changed.
0:29:41 So if you think about a final product after it has maybe seen
0:29:46 10 years of investment, I think there's sort of two axis, at least.
0:29:50 One is the breadth of the functionality, whether you have that many features, if
0:29:57 you're thinking about like a product like Linear, for example you've like added
0:30:02 more and more features over the time.
0:30:04 And another one is the depth and the quality aspect to each of those.
0:30:11 And so what you're inviting people to think about and do is certainly increase
0:30:17 more the effort on the qualitative side.
0:30:21 But that also begs the question, like, do you Just go for 10 years
0:30:26 right away and like build up all the features and then launch.
0:30:29 Or if you can't do that to be competitive with alternative existing
0:30:33 products, then you kind of need to cut down the scope significantly on the
0:30:39 features that you and the functionality that you initially launch with.
0:30:43 So, and I think that's a really interesting and challenging
0:30:47 exercise so how did you wrestle with like which features you pick?
0:30:52 So ultimately you need to do both.
0:30:55 Like you need to have the depth and the breadth of features if you want
0:30:58 to compete like at the large scale.
0:31:01 But you know, then you run into the problem, like you can't build it.
0:31:03 You don't have 10 years to build out a thing before you try it out.
0:31:08 Well, Figma was a good example that you have some leeway there.
0:31:11 Like you can work on the technology for four years and then ship it.
0:31:15 And then actually, very quickly find product market fit.
0:31:17 So it is possible.
0:31:18 to do it.
0:31:19 And even like, they were probably quite niche as well.
0:31:22 Like it's just a design tool, right?
0:31:26 How hard can it be?
0:31:27 Like there's not many features that you, that you need.
0:31:30 But, but for us, it was like obvious that we can't go after sort
0:31:33 of, larger customers immediately.
0:31:34 Like we needed to scope down our set of functionalities
0:31:38 and still find a consumer..
0:31:40 Or a target customer that would be happy with that.
0:31:43 And for us, it was easy.
0:31:45 And then, there might be cases where it's harder.
0:31:47 Like if you're trying to run, you know, create a banking application,
0:31:51 like, yeah, you need to build up quite a bit of stuff in order.
0:31:55 To be able to service even your first customer, like you need a bank, and
0:31:58 that is a pretty hefty undertaking.
0:32:01 But for us, like, we found this target customer, which
0:32:03 is very, very small startups.
0:32:05 Startups that have just been incubated, that are maybe, 2, 3, 4 people
0:32:10 large that go through YC maybe.
0:32:12 What do they need?
0:32:13 Like, they don't need any project management.
0:32:15 They, they don't need a lot of functionality around labels.
0:32:19 Like, they will have not too many tickets.
0:32:21 Like, literally what they need is an issue tracker, a way of just tracking a few
0:32:25 things and then marking them as complete.
0:32:27 And that is the first thing that we built.
0:32:29 We built an issue tracker, and even on our website said that, the issue tracker
0:32:32 that you'll enjoy, you'll enjoy using.
0:32:34 And I always hated that website.
0:32:37 Like, I, whenever I went there, I was like, no, this is not what we're building.
0:32:40 We just have to lie to everybody that we're doing it now, because you
0:32:44 want to focus on the target segment.
0:32:45 And the, the idea always was to sort of, go and do project management.
0:32:50 And even, even beyond project management, because, we wanted
0:32:53 to help companies be better at building software, which encompasses
0:32:55 literally everything in that space.
0:32:58 But we had to start with sort of the small customers.
0:33:00 So that's what we focused on for the, for the first few years.
0:33:03 Just make an issue tracker that works nicely.
0:33:05 Start with small companies that were super excited to give you feedback.
0:33:09 Like startups are great because like they, they know how it is,
0:33:12 how hard it is to build a product.
0:33:14 So they'll be happy to help, help you build your product as
0:33:17 well while they're using you.
0:33:19 And so we had a lot of customers that, gave us a lot of feedback,
0:33:22 which we could always invite for a Zoom call and just learn stuff from.
0:33:27 then like the idea was to gradually grow with them.
0:33:29 Like we knew that, once we got those customers, like it would probably
0:33:33 stick around if we were able to, to, to grow our feature set as they grew.
0:33:37 And we knew they were growing, they would raise seed round then, eventually
0:33:40 a series A, like 50 people series B.
0:33:44 So we, we said like, I think we can build out the functionality
0:33:47 of features that, that our initial customers need as they grow.
0:33:51 . And it's sort of a wrap.
0:33:52 Like, we were able to have a few customers that started very early with us that now
0:33:55 are sort of pretty huge companies and they've been sticking around with us for,
0:33:59 for, for the entire duration and we've been just building more stuff for them.
0:34:02 And that enabled us to just grow into larger customers.
0:34:06 Starting to go into sort of, series A companies and growth companies
0:34:10 and now sort of eyeing not, not yet the enterprise, I'll take, take
0:34:15 some time more, but, established companies and IPO companies.
0:34:18 And that was sort of our strategy to, build something of the highest
0:34:22 quality but just reduce the scope in the beginning so much because we
0:34:26 were able to identify those target customers that didn't need much.
0:34:30 I think that's fantastic advice and a great strategy how to go about picking
0:34:36 the right narrow initial scope is not to primarily think about like, Oh, which
0:34:41 features should we build first, but really starting out from like, okay.
0:34:46 We are set on that we want to have that rethought MVP.
0:34:50 We want to aim really high in terms of the quality.
0:34:53 Otherwise, like, why do we even get started in the competitive landscape?
0:34:58 So that is, that is a fixed assumption.
0:35:00 But then instead of thinking about which feature do we start first, is like, who
0:35:06 as a customer segment do we start with?
0:35:09 And that then implies the, the kind of features that are most
0:35:13 important to start out with.
0:35:15 And I think that also aligns Hopefully nicely with the way how
0:35:19 you can also charge for the product and build not just like a product
0:35:24 that people use, but also pay for.
0:35:27 And I'm not sure whether you got lucky there, but it seems like
0:35:30 things certainly lined up very nicely for, for yourself there.
0:35:35 And I think One aspect as well to maybe highlight there is that you've been
0:35:41 seen as the company that other companies also aspire to as sort of a role model.
0:35:52 Hiring and Company Culture
0:35:52 Yeah, I, know, obviously it's, it's been mostly luck as with any startup.
0:35:57 Like, we sort of stumbled into this way of working cause we enjoyed ourselves.
0:36:02 Like we want to build nice things.
0:36:04 And we had the, the, the lack of sort of, wanting to inspire people
0:36:09 with, with our own products.
0:36:11 That meant that we had to build the company in a certain way.
0:36:13 That meant that we had to.
0:36:16 Sort of hire people that we could trust to, not have to sort of look after them.
0:36:21 Because again, we were a remote company from the get go.
0:36:24 And we wanted to make sure that, anybody we hired was just so good that, we knew
0:36:29 that they could do whatever without literally, even talking to us if we
0:36:33 went that way and just, you know, ship something, something awesome which
0:36:37 again meant that, we hired effectively senior people not only that reason,
0:36:42 but, the second reason was, was that we didn't know how to mentor junior
0:36:46 people in a remote environment.
0:36:48 Like we were afraid that we would be doing them a disservice.
0:36:52 Like, hiring somebody who needs to learn and hire them into a remote setting.
0:36:58 We wouldn't know how to mentor them or how to grow them, so therefore we didn't.
0:37:03 And later on we sort of find out that, it's actually pretty nice to having a
0:37:07 very senior team around you that you just trust with building out the vision
0:37:13 or even them having the same vision as you do, being able to drive the product
0:37:17 forward because they're good engineers.
0:37:18 They know what they want from a, a, initially issue tracker and
0:37:21 then project management tool.
0:37:23 And that also meant that, you know, we were, it was hard for us to, to grow.
0:37:27 Like, we wanted these, Overly qualified people which were super hard to find.
0:37:33 So we grew slowly and in the end, like, we became profitable very quickly.
0:37:37 I think two years in, we were profitable not because we wanted to
0:37:41 or because we needed to or because that was the grandmaster plan.
0:37:44 No, it was just, effectively luck.
0:37:47 Because we did these things, we grew so slowly and then the sort of
0:37:50 revenue just overtook our expenses.
0:37:53 And then like the downturn came and now everybody was sort of wanting to be the
0:37:57 Linear, like wanting to do the same thing.
0:37:59 Everybody's looking at like, where can we get profitable?
0:38:02 We don't want to raise another round or ineffectively do a
0:38:05 down round in that scenario.
0:38:06 So.
0:38:07 Everybody started looking at building things in a similar fashion.
0:38:10 So I think there's there's a lot of luck involved but also sort of, our passion
0:38:16 and our backgrounds sort of directed us to build out this company this way.
0:38:21 And we're still on that route.
0:38:22 Like we, we still go down the same way, like we don't want to go through
0:38:26 hyper growth and we will never, yeah, we will never hyper grow.
0:38:31 Like I've seen that at, at, at Uber, Kari saw that in Airbnb Jori in
0:38:35 Coinbase, I don't think anybody of us, really, Enjoyed that experience.
0:38:39 It was nice to see once but, we don't want to go through that again.
0:38:43 Like, we want a product team that is excited to building something
0:38:46 great and not just sort of a, cog in the big wheel of, working on some,
0:38:51 remote infrastructure piece that maybe gets open sourced one day.
0:38:56 We want to make sure that, know, people who build Linear are sort of, they're,
0:38:59 they're craftsmen that, enjoy building something beautiful and, want to see
0:39:05 their work out there, and hopefully, are and can be proud of what they ship.
0:39:10 So even though that's very humble of you saying most of it has
0:39:14 been luck there is this this nice quote, which I think goes along the
0:39:18 lines of luck favors the prepared.
0:39:21 and I think there's a lot of intentionality also that
0:39:24 went into building Linear.
0:39:26 I think it's always like this dance between open ended experimentations,
0:39:30 like seeing, Oh, this is actually great.
0:39:33 And then that becoming like a strong intention of like, Oh,
0:39:36 this is, this is who we are.
0:39:38 So, and I think you've probably maybe got lucky and like, like found a few
0:39:43 things that you think, Oh, this is actually, we should really do that.
0:39:46 But then you also embrace that and some companies call those
0:39:49 like values or principles.
0:39:51 I think quality is certainly like a strong aspect there, but have you
0:39:56 ever like formalized this in some way?
0:39:59 Or if you bring on someone new to the company who hasn't been around
0:40:03 over the years, how do you tell them like, Hey, this is who we are, how
0:40:12 Values and Vision
0:40:12 Yeah.
0:40:12 Um, We, like, we just had our offsite in, in Mexico where we, flew the whole team
0:40:17 in, and Kari was preparing some slides and, we've been talking about having,
0:40:23 some sort of, value statement or values of the company and a vision statement.
0:40:26 And we never did it because we always felt that like all the values
0:40:29 of companies are somewhat fake.
0:40:31 Like they.
0:40:33 just tell what they want the company to be, but not really
0:40:35 what the company is, right?
0:40:36 Which never felt good to us as Finns.
0:40:38 Like we don't want to lie about things like.
0:40:40 We're honest people.
0:40:42 So, again, we didn't go down the vision or, the values route and we said
0:40:46 like, ah, let's not have any values.
0:40:48 So Kari started working on slides to sort of, show everybody how we got here
0:40:52 and what we've done, over the past five years in order to, get to this place.
0:40:57 And he had like, five things that he pointed out that, that, that
0:41:01 we had done and showed that slide deck to, to, to somebody on the
0:41:04 team and that team member was like, huh, these look like values to me.
0:41:09 um, so we were like, yeah, I'm, I, I guess they are values now.
0:41:13 And our values are literally based on, on, What we've done in the past
0:41:16 and what we want to continue doing.
0:41:18 And yeah, there's a small, small set.
0:41:20 Like the first one is trust.
0:41:22 Like we, we've always trusted our engineers.
0:41:25 We've made sure that we hire people that, can work on their own,
0:41:28 that can sort of bring something, something into, into the company.
0:41:32 And we want to be open in, in, in our doings and we are open in our doings.
0:41:36 And secondly, we've always built sort of with the customer in mind with
0:41:39 hiring or, building our functionality by asking customers what they need.
0:41:43 So customer focus is one of the things that we've been doing, which is now
0:41:48 a value of ours, not building things in isolation and making sure that
0:41:52 we built something for our customers and that we built something that,
0:41:55 people, people value and people need.
0:41:58 Um, And it gets more, important as, as, you grow higher and you start working
0:42:02 for functionality that, you wouldn't necessarily use yourself like for PMs
0:42:06 or CEOs and CTOs at larger companies.
0:42:10 The third thing that sort of came out of how we, built the tool, like, we were sort
0:42:15 of opinionated about, what we want to do.
0:42:18 We didn't want to have that, like, we, it wasn't really a great
0:42:21 value to have to be opinionated.
0:42:23 That sort of sounds a bit negative.
0:42:25 But what we, what we've turned it into is like, we built purpose built tools.
0:42:28 tools, like we built for a specific purpose, for a specific
0:42:32 target customer in mind.
0:42:34 We want to, build software for software companies.
0:42:37 And if you stick with that, then we can build an excellent user
0:42:40 experience and excellent functionality.
0:42:42 If you start diverging and building everything for everybody, then, you sort
0:42:45 of diluting, the aspects of the core of your application and it usually becomes.
0:42:50 Less usable or less great.
0:42:52 And then, the fourth one being quality.
0:42:54 We've always, wanted to build a high quality product and, put so much effort
0:42:59 into making sure that, everything is It's great and working and works fast and
0:43:05 all the small details are taken care of.
0:43:06 And if you do all of these things well, then you inspire people.
0:43:10 And that's sort of the last thing that we wanted to do.
0:43:12 Like, we wanted to, be a company that helps companies
0:43:15 be better at building software.
0:43:17 And we think that inspiration is part of it.
0:43:19 Like, inspire people with the quality product that you've built
0:43:22 for them and make them want to build an equally great experience.
0:43:27 From what I can tell from the outside that all rings true and sounds very
0:43:33 authentic that's more of an assessment of how I perceive Linear then.
0:43:38 So I, I think you've met your, you've reached your bar
0:43:41 of like that not being fake.
0:43:43 But very authentic.
0:43:45 And I love how that is like also in terms of the yeah, that the craft
0:43:50 of everything you're doing, how that's also rooted in the quality.
0:43:54 And I think becomes like a core pillar of how the next generational
0:43:59 Advice
0:43:59 So maybe taking one quick step back to the blog post you've written
0:44:04 about the rethinking the startup MVP.
0:44:07 Do you have a take on what is the rethought startup MVP?
0:44:12 Is there like a new three letter acronym that people should use in the future?
0:44:16 No, I, I, you know, I, I don't think there should be a three
0:44:20 letter word for any of this.
0:44:22 Like it'll really depend on what you're building.
0:44:24 But you know, it is about competing in an existing market.
0:44:28 Like, and being better at something.
0:44:31 What that something is, it might be literally anything.
0:44:34 But yeah, you need to be better at something.
0:44:36 Like, you can't just throw things at the ball and see what sticks
0:44:39 because, the ball is already covered with, with all kinds of things.
0:44:43 And people will just not, notice you or do anything about it.
0:44:47 So what sort of advice would you have for builders and founders,
0:44:52 people who want to build those next generational high quality products?
0:44:56 What of the traditional wisdom, startup wisdom still applies?
0:45:02 So you mentioning sort of the, the hyperscaling maybe is no longer an
0:45:07 attractive ingredient to, to get there.
0:45:11 what would you recommend as like, what to focus on and what to be careful with?
0:45:17 in, in order at least to get started, like, I think the most important thing
0:45:21 to do is to, scope down and find, find a target segment that you can
0:45:27 deliver something competitive for.
0:45:29 Again, like we've talked about not being able to build everything for everybody.
0:45:32 So it's important if you can find a way to sculpt a new product and
0:45:38 then, put something that people need.
0:45:39 If you find something that, is a pain point for those users you
0:45:43 immediately have a following.
0:45:44 You can You know, sort of, build out a nice waitlist.
0:45:47 And then with that waitlist, you can, you can iterate on
0:45:50 your product and make it better.
0:45:51 Like you're, you have a waitlist and you have five users selected
0:45:55 probably for that waitlist or maybe from your friends and you're
0:45:57 iterating with them to make it better.
0:45:59 And then you're happy when they have no feedback anymore.
0:46:02 Then you go to your waitlist, you invite a few others to see if, they
0:46:06 have new ideas of what you could build and how you could do things.
0:46:09 So building things with, your customers is , it has been done
0:46:12 obviously already, with startups.
0:46:14 Like that has been the wisdom so far and that hasn't changed.
0:46:17 Like use your customers and use your, waitlist users to, iterate on the
0:46:21 product to make it better until you're sort of ready to sort of go public
0:46:24 and have everybody have a go at it.
0:46:29 Hyperscaling, like, obviously comes to mind when you're competing against
0:46:32 somebody, like, Uber, it was, like obvious that, and the story of Uber is sort of
0:46:38 sad as well, like, how it all went down, but obviously, like, in the end, it turned
0:46:43 out good, but, being, being in Uber during that hyperscale time was pretty harsh.
0:46:49 Like you have, you, you started off with building out a, prototype.
0:46:54 Like there was an iOS application that was a shitty backend that,
0:46:57 I don't even know what it was written in, but it wasn't great.
0:47:00 And then it started taking off a few users in San Francisco started using
0:47:04 it, more black cars came available.
0:47:06 And the, the thing where, when Uber took off was like when effectively
0:47:10 sort of Lyft invented the model of, okay, let's have normal.
0:47:14 People drive their own cars and be the driver.
0:47:18 And suddenly you realize that's the way to go.
0:47:20 And now immediately they're in a competition.
0:47:22 So now they have to get some money in and start scaling and
0:47:26 start conquering some areas.
0:47:28 And your infrastructure is still horrible.
0:47:30 You haven't built out any of the stuff.
0:47:31 You were just trying things out and your application looks horrible.
0:47:34 And now you're suddenly having to run.
0:47:37 And it takes off.
0:47:39 And suddenly you've got tons of users coming in and you have
0:47:42 to scale your infrastructure.
0:47:43 So you have to hire people as quickly as you can in order to just keep the
0:47:46 flames, not reach the outer walls.
0:47:48 And, two years later, when, when you've grown rapidly you, you end up with sort
0:47:53 of having an infrastructure that is just.
0:47:55 Coals and ash.
0:47:57 Your team is burned out because they had to fight fires the entire time.
0:48:01 And then you have to sort of replace that whole thing while you're
0:48:05 still serving all the customers.
0:48:07 And, the weird thing was, and I, When I left Uber, they had started already
0:48:13 sort of redoing much of that, that core infrastructure, and they were still at
0:48:17 it like four years later, like we're still replacing the core bits of it.
0:48:21 So it's, it's, it's horribly time consuming to scale something up
0:48:26 quickly if you're not prepared to it.
0:48:28 if you cannot do that, then I think you're in a much better, better place.
0:48:32 So that's what we've done, and that, is what I would suggest people, if they're,
0:48:36 able, like, obviously, you need some money, and you need to have a bit of
0:48:41 luck as well in order to, sort of, get initial customer interest and maybe a
0:48:46 VC invest in you so that you can sort of build it out a bit more slowly.
0:48:50 But our take on infrastructure and the backend always has been to sort
0:48:54 of preemptively build everything so that, we're prepared for the growth.
0:48:58 We know where the next bottlenecks are.
0:49:00 We might know that, a year from now, like, this thing won't scale anymore.
0:49:03 So we started working on it early on so that we can sort of put implementations
0:49:07 in place that, Just work and it will sort of, , work nicely and are architected well
0:49:13 so that no surprises come, come along.
0:49:16 The Importance of a Sync Engine
0:49:16 I think that's a nice segue.
0:49:17 And we've been mostly covering sort of like the, the more cultural aspects
0:49:21 of Linear so far, given this is the local-first podcast where we haven't
0:49:27 yet talked too much except for the beginning about syncing, et cetera.
0:49:31 And I don't think we need to spend another hour and hour going all
0:49:35 the way there, but maybe just briefly connecting the dots there.
0:49:38 I think the reason.
0:49:40 that what gives you this competitive advantage allows you to build that high
0:49:44 quality product is that you have laid that foundation with the, the sync engine that
0:49:51 takes out of like the, the picture, the entire complexity nightmare that, moving
0:49:57 data from A to B and back to A can be.
0:50:00 And so you've solved that and like on your shoulders of Giant, now
0:50:05 the, the the, the product can be built by people who don't have all
0:50:09 of that knowledge of data syncing.
0:50:12 And I think that is like a superpower that enables new products like Linear.
0:50:17 Yeah.
0:50:17 I mean, I do have a talk on, your conference on that.
0:50:20 It's, it's probably available on YouTube as well.
0:50:23 If you want to, if you want to check it out and put it into the, I don't know,
0:50:26 notes for this, this, this podcast.
0:50:28 But yeah, in short, like, The initial idea of the sync engine was
0:50:32 not to make it developer friendly.
0:50:34 That sort of happened as an afterthought.
0:50:36 And that was, in my mind, maybe the more more important aspect in the end.
0:50:41 Like, we wanted it to be fast and support offline mode and enable, the application
0:50:45 to be quick and that is important, but what we found out what, what we like even
0:50:49 more was that engineers would be able to just ship features much, much faster
0:50:55 without having to think about a vast, area of, of A functionality that usually
0:51:00 takes quite a bit of time, which is sort of error handling or networking, waiting
0:51:03 for things to come back, supporting two different code paths for like when
0:51:07 you make your local changes versus when somebody else makes those edits for you.
0:51:12 It's all abstracted away so that you don't need to think about these things.
0:51:16 And it works for certain kinds of applications.
0:51:19 Definitely not all like if you're building, something that has, a lot of
0:51:23 information or building a search engine and obviously not, like, you need to be
0:51:26 able to have that data locally or pretty close to your, to your clients and be able
0:51:31 to sort of fetch the pieces that you see on screens and then keep them up to date.
0:51:35 But for anything that resembles an application.
0:51:37 That has sort of a limited set of data, and that data piece can, like, the
0:51:41 amount of data that you have in the whole application can be large, but it
0:51:44 still needs to be limited to, what you can browse at a , given point in time.
0:51:48 And then this model just works absolutely beautifully.
0:51:51 And.
0:51:52 I sort of had this inkling at Uber already, like, I don't want to
0:51:55 build anything in the traditional sort of networking model anymore.
0:51:59 Like, I think sort of sync is such a better user or developer experience.
0:52:04 And, and the Linear, like, it's, it's clear that, I, I, I, well, I won't ever
0:52:09 have a job after Linear, but, if I did, I, I, I would not work in any other way
0:52:14 than just doing a sync engine again.
0:52:16 I'm working in this environment because it just makes the, yeah, the
0:52:20 developer experience so much faster and you can just ship functionality.
0:52:22 Like, the easiest way to think about it is to literally say that, you're
0:52:27 effectively just building the front end.
0:52:29 You have, data in memory, you've got data objects, which you render on screen.
0:52:33 Then you modify those and that's it.
0:52:36 Your feature is done.
0:52:37 Everything else is handled, the synchronization, other
0:52:40 users making the same edits.
0:52:42 There's nothing else you need to do in order to build a feature.
0:52:45 You just build the frontend and you're done with your entire feature.
0:52:49 And that's pretty powerful.
0:52:51 And I think that also like empowers the already capable front end developers
0:52:57 even further, since I think so far in this more traditional three tier
0:53:04 web app where you have your, your front end that you're building.
0:53:07 And then somehow like you're doing your, your fetches or RPC calls, et cetera.
0:53:13 But then you also need to worry about like, okay, sorry, I need to serialize a
0:53:16 bit of data over there, send it over here.
0:53:19 Now I need to do something there.
0:53:21 And like, Oh, what if.
0:53:22 This now changes and I need to send this back.
0:53:25 If we can take that entire part out of the picture and front end developers are
0:53:30 only dealing with like the, the client side state management, and that's it.
0:53:34 And then either you have, you're relying on like a external sync engine
0:53:40 that already works super well for you and you just need to integrate it, or
0:53:44 you have the luxury of having someone like yourself in a team who builds
0:53:49 your own, runs it, et cetera, which I think will be not always required.
0:53:55 I think the better the off the shelf sync engines will get the more products
0:54:00 can already be built with that.
0:54:02 And I think someone like yourself will rather be needed when a
0:54:06 product really diverges from that, from that standard path.
0:54:10 And so I would probably say that maybe in a couple of years from now,
0:54:15 you could probably build something like Linear in terms of like the
0:54:19 data syncing capabilities with like something like automerge, et cetera.
0:54:24 Some of those.
0:54:25 Upcoming sync engines, and then it's probably rather a matter of can
0:54:30 it also handle all of the scaling patterns and the extra user experience
0:54:35 patterns that you want to really nail.
0:54:38 I want to give an example of, like, how hard RPC actually is.
0:54:42 Because I don't think people understand, like, before they've tried
0:54:46 it out and then run into these edge cases, which always are edge cases.
0:54:49 But once you run into them, you're like, oh, shit, what do I do now?
0:54:53 You need to rethink your entire architecture in order
0:54:55 to make that, make that work.
0:54:56 So A simple example, you've got, some sort of model object and it
0:55:01 has two properties, and the user makes a change to those properties
0:55:05 and sends it out as an RPC call.
0:55:08 And you're also connected with a WebSocket to receive changes that other people do.
0:55:12 Now, you send out the RPC call and wait for sort of acknowledgement
0:55:16 for the server um, that, you know, everything was applied fine.
0:55:20 While that's going on, you receive a packet that, another user updated a
0:55:24 certain property on that model object.
0:55:27 What do you do?
0:55:28 Like, and that becomes a really, really hard problem because suddenly, like,
0:55:33 you, you really don't know what to do.
0:55:35 Like, you can't rely just on that RPC call coming back.
0:55:38 Because, again, your backend has multiple servers on it, so you can't
0:55:42 rely on the timing of these things.
0:55:44 It's not just, one single server running things, you know, serially.
0:55:48 It's multiple servers writing to the database, and then somebody is
0:55:51 able to sort of send you a message, and the RPC call might go through.
0:55:56 have already been sent but hasn't reached you yet because the network is slow.
0:56:00 So when you receive that RPC code, you don't know if all the
0:56:04 values in there are up to date.
0:56:06 And now you need to figure out what to do with the updates for that model object.
0:56:11 And when you realize that, you're like, Yeah, I effectively need
0:56:14 to implement another sync engine in order to make that happen.
0:56:17 There needs to be a queue of sorts.
0:56:19 And it becomes very, very complex.
0:56:22 It's funny.
0:56:22 So like, it's a sort of a boiling frog situation where you start out with like
0:56:28 your, your blissfully ignorant happy path of just like doing a fetch call
0:56:34 to your backend and like, you get your data back and you test this on localhost
0:56:39 with like your one client over there and your locally running server over there.
0:56:43 And like, everything just works and like you ship the feature, like you mark the
0:56:49 issue as done on, on Linear, but then as it goes on production and like multiple
0:56:55 users hit it, you get some really cryptic error messages that you, you even have a
0:57:00 super hard time replicating that locally and you, you've spent hours on it.
0:57:04 Hours and hours and days and days, like reading through log messages.
0:57:07 Oh, we realized I actually, we don't have the right log messages for that in place.
0:57:11 So you'll need to spend another two weeks shipping that until you've like,
0:57:16 finally have all of like the signal that you pull out of the giant bag of noise.
0:57:21 To finally, like, have at least some confirmation of
0:57:25 that something is going wrong.
0:57:27 And once you have that hypothesis to even replicate it locally that's
0:57:31 already takes heaps and heaps of time.
0:57:34 And then, like, The way how you pull yourself out of that is by step by step,
0:57:41 applying changes that will ultimately lead you to a sync engine, but that's such a
0:57:46 painful and inefficient way to get there.
0:57:50 I think it's, primarily probably a problem to get, get us from.
0:57:54 A to B, like A being the status quo of the world right now, where like
0:58:00 everything is built with the sort of RPC ish way to B where most products where
0:58:05 it's a good fit are built with sync engines is probably just that instilled
0:58:10 tribe knowledge that by now like all the technologies are sort of like.
0:58:15 Fostering that, that status quo where like all the libraries are built around RPC
0:58:23 and we're, we're kind of blind to, yeah, it's kind of the spoiling frog situation
0:58:28 where it's already cooking like crazy, but we don't realize it yet how much
0:58:32 complexity we've built for ourselves.
0:58:34 And how simple things could be.
0:58:36 For sure.
0:58:37 So it becomes simpler to not you know, implement that WebSocket and
0:58:40 just have the user hit refresh to get the latest version of that page
0:58:44 and be ignorant about or bliss.
0:58:46 Yeah,
0:58:47 exactly.
0:58:48 Which just dials up the temperature,
0:58:52 but this is where I'm so excited about Linear and the success of Linear since
0:58:58 people can't ignore products like Linear.
0:59:02 There's like, Oh my gosh, what makes it so great?
0:59:05 And then people want to.
0:59:06 understand how did you like explain the success and sure a lot of it will be
0:59:11 attributed to like oh they have such those great people and they have such
0:59:16 great design and they have that amount of like border radius but then a lot
0:59:22 of it will also come down to the to the implementation this is what I where
0:59:26 I hope that this will drive a lot of like Similar to how Nike focuses not as
0:59:32 much on the products, but on the great athletes, you're the great athlete.
0:59:35 And I'm very much looking forward that people want to be like you.
0:59:40 I really, enjoy working in a local-first environment, and I hope that
0:59:44 everybody else picks that up as well.
0:59:47 And there's starting to be tooling around it, around the, local-first as
0:59:51 well, that you can use out of the box.
0:59:53 That will probably work for most of the cases.
0:59:56 It will still be hard to scale that up.
0:59:58 But at least you can get started and maybe then figure out whether you need
1:00:04 Outro
1:00:04 Perfect.
1:00:05 I think we can leave it at that.
1:00:07 Thank you so much for this amazing conversation.
1:00:09 I was really looking forward to it.
1:00:12 And Linear continues to be a huge inspiration for me.
1:00:15 And it's been so, also like so interesting and fun to hear.
1:00:19 That a lot of like what has inspired you and led you and like explorations you've
1:00:24 done where you had sort of like what you do attribute to luck, but I think
1:00:28 is also just great taste, et cetera.
1:00:30 That I see a bunch of parallels there to how I'm approaching Overtone
1:00:34 that gives me a lot of energy and motivation to continue on my path.
1:00:38 So thank you so much.
1:00:40 Thank you so much.
1:00:40 And waiting for that invite to Overtone.
1:00:43 That's all, but when you're ready, like when you feel that you can, you can
1:00:47 move on to the next customer group.
1:00:50 Sounds good.
1:00:51 I'll send you the magic link.
1:00:53 Perfect.
1:00:54 Thanks so much.
1:00:55 Thank you for listening to the Local First FM podcast.
1:00:58 If you've enjoyed this episode and haven't done so already, please
1:01:01 subscribe and leave a review.
1:01:03 Please also share this episode with your friends and colleagues.
1:01:06 Spreading the word about this podcast is a great way to support
1:01:09 it and help me keep it going.
1:01:11 A special thanks again to Rosicorp and PowerSync for supporting this podcast.