درباره این اپیزود
What does it take to build a web browser when everyone says it's impossible? In this episode, we sit down with Andreas Kling, the engineer behind Ladybird—the only major browser project that doesn't take money from Google.
Andreas breaks down a uncomfortable truth: Google funds every major browser through search deals. Chrome, Firefox, Safari—they're all dependent on Google's advertising revenue. Ladybird is building the first truly independent alternative since the early Firefox days.
We dive deep into the technical challenges of implementing web standards from scratch, why their 700,000 lines of code can compete with Chrome's 100+ million, and how they're making browser code that actually mirrors the specifications. Andreas reveals why they switched from UTF-8 to UTF-16, why they didn't choose Rust, and how they handle the constant evolution of living web standards.
From the "draw the owl" problem of CSS specifications to building a sustainable nonprofit model with sponsors like Shopify, Andreas shares the engineering and business decisions behind their ambitious timeline: alpha in 2026, beta in 2027, and v1.0 by 2028.
Our Fantastic Guest
Andreas Kling
President of the Ladybird Browser Initiative.
X
Links and Resources
Ladybird Browser Website
Web Platform Tests
Fil-C (memory-safe C++ compiler)
Thank you very much for listening!
We are also pretty much on all social media platforms, so make sure to like and subscribe!
Homepage - https://www.weeklybrew.dev/
BlueSky - https://bsky.app/profile/weeklybrew.dev
Instagram - https://www.instagram.com/weeklydevsbrew/
TikTok - https://www.tiktok.com/@weeklybrew.dev
YouTube - https://www.youtube.com/@theweeklydevsbrew
LinkedIn - https://linkedin.com/company/the-weekly-dev-s-brew
یادداشت ها را نشان دهید 🔗
رونوشت 🔗
01:00:00.250 --> 01:00:06.000
Hello everyone, welcome to another episode of the Weekly Dev's Brew. Today I'm here with Andreas Kling.
01:00:06.708 --> 01:00:09.125
It's a very German name, so I tend to pronounce it very German.
01:00:09.916 --> 01:00:10.958
It sounds great in German.
01:00:11.625 --> 01:00:17.625
Okay, I don't think I could really do justice introducing you, so do you mind introducing yourself?
01:00:18.083 --> 01:00:23.375
Sure, so I'm Andreas Kling. I am a lifelong browser nerd.
01:00:23.375 --> 01:00:28.166
I've worked on browsers my entire adult life, it feels like.
01:00:29.500 --> 01:00:35.416
Worked on the less famous Conqueror browser back in KDE like 20 years ago.
01:00:36.458 --> 01:00:44.208
After that, worked at Nokia on some of their phone browsers and the cute WebKit port that they had there.
01:00:45.250 --> 01:00:48.166
From then, went to Apple, worked on Safari for many years.
01:00:48.166 --> 01:00:55.333
And then in 2017, I thought, I'm going to do something else with my life instead of being just a browser developer.
01:00:55.541 --> 01:01:02.000
So I left and I was able to go like a little under two years, I think, before I was working on browsers again.
01:01:02.791 --> 01:01:09.166
So what happened was I left and then I started working on an operating system just for fun.
01:01:10.333 --> 01:01:10.916
As you do.
01:01:11.333 --> 01:01:16.666
As one does, to entertain myself and stay healthy, you know, focused on something useful.
01:01:16.666 --> 01:01:22.125
And eventually, a new operating system is going to need a new browser.
01:01:22.833 --> 01:01:24.708
And, you know, I know how to make those.
01:01:24.875 --> 01:01:29.250
So I just started doodling and one thing led to another.
01:01:30.375 --> 01:01:33.916
And now, you know, this is like seven years ago now.
01:01:35.125 --> 01:01:39.291
So now we have stood up a new browser called Ladybird.
01:01:40.166 --> 01:01:42.666
And it's currently in pre-alpha state.
01:01:42.666 --> 01:01:50.291
We started a nonprofit to run development and to get sponsors on board and hire engineers and stuff.
01:01:50.291 --> 01:01:53.291
So we are now seven people working full time on it.
01:01:53.291 --> 01:01:57.625
And we have a community of volunteer contributors as well.
01:01:57.916 --> 01:01:59.541
And the project has really taken off.
01:01:59.875 --> 01:02:02.666
And it's really exciting, really fun.
01:02:02.666 --> 01:02:07.416
And it seems no matter what I do, I just can't escape browser development.
01:02:07.875 --> 01:02:08.708
But that's okay.
01:02:09.541 --> 01:02:11.333
I'm pretty happy with it, I think.
01:02:11.791 --> 01:02:23.583
But the important thing to know about Ladybird is that nowadays when people say a new browser, everybody just assumes it's a new Chromium with some, like, little tweak.
01:02:23.583 --> 01:02:29.166
You know, it has, like, a Chromium with ad blocker or Chromium with crypto, Chromium with an AI sidebar.
01:02:29.833 --> 01:02:30.833
No, no, no, none of that.
01:02:30.916 --> 01:02:32.000
It's not that.
01:02:32.000 --> 01:02:33.875
It's actually a new browser.
01:02:33.875 --> 01:02:37.500
It's a new engine built on web standards alone.
01:02:38.083 --> 01:02:43.500
So we just try to implement the standards or specifications as they exist.
01:02:43.500 --> 01:02:48.250
And it's a lot of work.
01:02:48.791 --> 01:02:53.041
But people have been screaming in my face for years that this is not possible.
01:02:54.458 --> 01:02:59.000
And I've just been saying, sure, I'm going to do it anyway.
01:02:59.750 --> 01:03:02.166
And amazingly, we're doing it anyway.
01:03:03.041 --> 01:03:05.000
So it's pretty cool.
01:03:05.583 --> 01:03:09.041
This actually goes over into my question.
01:03:09.041 --> 01:03:13.458
So what is it that apparently keeps you hooked with browsers?
01:03:13.458 --> 01:03:17.708
Because it's not a very common field for developers to spend their effort in.
01:03:18.375 --> 01:03:22.625
And you seem very much to now have this attitude of, like, watch me.
01:03:22.625 --> 01:03:24.000
I just want to prove the world wrong.
01:03:25.125 --> 01:03:25.333
Right.
01:03:26.583 --> 01:03:28.250
I don't know what it is about browsers.
01:03:28.500 --> 01:03:35.000
I have loved the web since I first got online in, like, 96 or something like that, whenever it was.
01:03:35.208 --> 01:03:36.916
I thought, this is sick.
01:03:36.916 --> 01:03:38.166
This is the best thing ever.
01:03:38.166 --> 01:03:39.958
I love it.
01:03:39.958 --> 01:03:46.875
I wanted to be online all the time, which my parents hated because, you know, you used to pay by the minute back in those days.
01:03:48.583 --> 01:03:50.375
But I just loved it.
01:03:50.500 --> 01:03:52.666
And I think I never stopped loving it.
01:03:53.000 --> 01:04:01.666
And, you know, at some point in, like, 2003, 2004, I realized that browsers are this thing that you can work on.
01:04:02.458 --> 01:04:04.541
Like, they're just a big pile of code.
01:04:04.541 --> 01:04:07.625
And you can edit it and recompile and see what happens.
01:04:07.625 --> 01:04:10.333
And the first time I did that, I got super hooked.
01:04:11.583 --> 01:04:15.250
So one of the first things I worked on was ad blocking in Conqueror.
01:04:15.750 --> 01:04:17.708
So somebody added ad blocking to it.
01:04:17.958 --> 01:04:22.333
But you had to reload the page before new filters would take effect.
01:04:22.333 --> 01:04:25.083
So, like, you would go to a page, see that it loaded some crap.
01:04:25.083 --> 01:04:31.375
And then you would, like, add a filter saying, like, oh, I don't want to load, you know, ad.newspaper.com or whatever.
01:04:32.000 --> 01:04:33.666
And then you had to reload for that to take effect.
01:04:33.666 --> 01:04:36.416
So I made some changes to make it take effect instantly.
01:04:37.625 --> 01:04:39.625
And from that point, I was, like, hooked.
01:04:39.875 --> 01:04:40.583
It's amazing.
01:04:40.875 --> 01:04:47.791
And I think I've just never stopped thinking about browser development since that day, even though I tried hard at some points.
01:04:47.791 --> 01:04:54.583
What is it that you're trying to accomplish with Lady Bird?
01:04:55.416 --> 01:04:59.625
And I mean this in the most honest way because I appreciate the work you're doing.
01:04:59.916 --> 01:05:02.541
And I think it's great for innovation in this space, in a sense.
01:05:02.791 --> 01:05:07.166
But, like, usually, like, it's a very, it's a massive idea.
01:05:07.416 --> 01:05:09.000
It's a massive amount of effort.
01:05:09.000 --> 01:05:14.875
And usually those kind of ideas need the potential to yield a high return of investment.
01:05:16.125 --> 01:05:16.333
Right.
01:05:16.916 --> 01:05:21.250
And competing with Google, Microsoft, and you name it, is not necessarily the easiest thing.
01:05:21.500 --> 01:05:23.791
So tell me.
01:05:24.166 --> 01:05:24.416
Indeed.
01:05:25.083 --> 01:05:29.875
Competing in a product where nobody charges for it is even better.
01:05:31.458 --> 01:05:32.041
Right.
01:05:32.250 --> 01:05:37.291
So we're not really joining this game to compete in the traditional sense.
01:05:37.791 --> 01:05:38.125
Yeah.
01:05:38.583 --> 01:05:40.333
We're not here to beat anybody.
01:05:41.208 --> 01:05:44.875
And we're an open source project with lots and lots of people working on it.
01:05:44.875 --> 01:05:47.333
So there's a lot of different motivations that people have.
01:05:47.333 --> 01:05:53.500
Of course, I can talk about my own motivations and sort of the motivations behind our nonprofit that has sponsors.
01:05:54.333 --> 01:05:59.166
So what I and what we want to do is we want to build a truly independent browser.
01:05:59.708 --> 01:06:05.750
We recognize that all the major browsers have basically all their funding from one source.
01:06:06.458 --> 01:06:09.791
For anybody who's not familiar with the space, Google is that source.
01:06:10.666 --> 01:06:12.041
Google Ads pays for everything.
01:06:12.041 --> 01:06:13.875
They pay for their own browser.
01:06:14.958 --> 01:06:23.041
They pay for their browser engine, which is then picked up by other browser vendors like Microsoft Edge or Brave or Opera or whoever.
01:06:23.541 --> 01:06:26.166
All of these are Chromium with some modifications.
01:06:27.166 --> 01:06:27.875
Paid for by Google.
01:06:27.875 --> 01:06:31.958
Google pays Firefox every year.
01:06:32.500 --> 01:06:35.125
And Google pays Apple for Safari as well.
01:06:36.166 --> 01:06:44.833
And I think there isn't really an alternative browser outside of this paradigm where Google is funding the whole thing.
01:06:44.833 --> 01:06:48.708
And this is not healthy.
01:06:49.000 --> 01:07:01.875
And it's not really an open web in the sense that I understand the word open because there is a single dependency like deeply entrenched in the whole system.
01:07:01.875 --> 01:07:11.833
And so we're coming at this with a fresh take on the web, which is, hey, what if we don't take money from Google?
01:07:12.166 --> 01:07:15.416
And what if we just make a new browser based on the specs?
01:07:15.625 --> 01:07:23.208
We don't we don't try to compete with the others, but we try to just build a browser and see if it can be done.
01:07:23.208 --> 01:07:27.958
Conventional wisdom in the tech industry has been for years that it can't be done.
01:07:27.958 --> 01:07:35.750
There's like blog posts and, you know, pundits and talking heads saying that the web specifications are out of control.
01:07:36.416 --> 01:07:37.166
They're too complex.
01:07:37.416 --> 01:07:38.500
You can't implement them.
01:07:39.000 --> 01:07:41.083
It's not without a kernel of truth.
01:07:41.083 --> 01:07:42.541
You know, like they are very large.
01:07:43.000 --> 01:07:44.500
There's a large number of specs.
01:07:44.500 --> 01:07:53.750
We were just talking yesterday on our in our chat about how there seems to always be like one more CSS specification that you haven't seen before.
01:07:55.041 --> 01:07:59.500
And everybody agreed like, yeah, I found a new one like just yesterday.
01:08:00.250 --> 01:08:04.166
And sometimes I wonder, like, will we ever find all the specs?
01:08:04.458 --> 01:08:10.583
But but even so, I think it's still it's still very implementable.
01:08:10.791 --> 01:08:13.375
And we're finding that that is true.
01:08:13.375 --> 01:08:19.707
Like we are able to to render complex web applications now like we can run discord.
01:08:20.250 --> 01:08:25.250
We can run VS code in the browser, GitHub, apps like that.
01:08:25.750 --> 01:08:25.832
Cool.
01:08:26.250 --> 01:08:32.000
And, you know, these are, you know, things that were supposed to be completely impossible, according to too many people.
01:08:32.000 --> 01:08:36.541
And we're able to do them and not as well as Chrome or Safari or whatever.
01:08:36.957 --> 01:08:38.500
You know, they're a lot faster than us.
01:08:38.500 --> 01:08:41.500
They have what do you call it?
01:08:41.500 --> 01:08:49.166
Like, I guess, like cumulative centuries of engineering time put into them and put into performance and everything.
01:08:49.166 --> 01:08:51.250
So probably slightly more resources.
01:08:51.541 --> 01:08:53.000
Just a little bit more resources.
01:08:53.166 --> 01:08:53.375
Yeah.
01:08:53.582 --> 01:08:58.916
So our competitors operate with like billions of dollars in budget.
01:08:58.916 --> 01:09:01.166
We do not have that.
01:09:01.416 --> 01:09:02.082
We never will.
01:09:03.750 --> 01:09:05.750
But yeah, so that is one aspect of it.
01:09:05.750 --> 01:09:10.082
So we recognize that Google has kind of been funding the whole web space.
01:09:10.082 --> 01:09:18.666
And we're living in this paradigm of like open web, but it's kind of fake because there's a single source of funding behind all of it.
01:09:19.166 --> 01:09:21.625
And we want to get away from that.
01:09:22.207 --> 01:09:27.332
Or not even that we want to push people away from it, but we want to give people an alternative to this.
01:09:27.625 --> 01:09:29.207
Just so we can say like, here's something else.
01:09:29.207 --> 01:09:33.125
If you don't want to be in this world, here's an alternative.
01:09:33.125 --> 01:09:36.457
I mean, as a developer, obviously, I love everything you're saying.
01:09:36.457 --> 01:09:39.791
Like, it's an open source at its core, right?
01:09:40.250 --> 01:09:40.457
Yeah.
01:09:41.250 --> 01:09:47.291
But open source, other than like from a novelty perspective, usually doesn't attract that much funding.
01:09:48.041 --> 01:09:49.791
And there are obviously exceptions.
01:09:50.125 --> 01:09:51.250
I don't want to.
01:09:51.832 --> 01:09:58.500
But what is it that companies are convinced, okay, I should put some money down for that?
01:09:58.500 --> 01:10:04.500
Because I watched a keynote or like a talk you did beginning of the year where you mentioned Shopify and GitHub, I think.
01:10:05.082 --> 01:10:07.000
So Shopify was one of our earliest sponsors.
01:10:07.832 --> 01:10:08.000
Yeah.
01:10:08.416 --> 01:10:11.541
They have like sponsored more since then.
01:10:12.582 --> 01:10:18.250
And the co-founder of GitHub was a co-founder of our nonprofit as well.
01:10:18.250 --> 01:10:21.541
So Chris Wonstrath provided some early funding for us as well.
01:10:22.125 --> 01:10:23.541
So what is the interest that...
01:10:24.416 --> 01:10:35.041
Because at the end of the day, those people, even though they share similar values to like the open source system, there's still a financial incentive to some extent.
01:10:35.041 --> 01:10:35.541
So what's...
01:10:35.541 --> 01:10:35.750
Right.
01:10:36.707 --> 01:10:41.625
So everybody has different reasons for sponsoring us.
01:10:41.750 --> 01:10:42.416
Probably, yeah.
01:10:43.166 --> 01:10:50.125
And I can't really speak to like why ultimately somebody chooses to do that.
01:10:50.125 --> 01:10:56.291
But I can tell you some reasonings I've heard from our sponsors without specifying who said it.
01:10:56.541 --> 01:10:57.041
Yeah, absolutely.
01:10:57.041 --> 01:11:09.500
So a common theme is that many businesses feel that Google has like a disproportionate amount of control over what the web is.
01:11:10.041 --> 01:11:24.250
And companies that operate on the web, they don't like it, that they're sort of at the mercy of a single entity that can unilaterally sort of change the direction of the platform that they're all building all their business on.
01:11:24.250 --> 01:11:28.332
So I think that's the thing that people are unhappy about.
01:11:28.916 --> 01:11:34.707
And some look at us as a sort of moonshot that, hey, this might go nowhere.
01:11:35.375 --> 01:11:38.832
But what if there's a 5% chance that this becomes a big thing?
01:11:40.332 --> 01:11:44.041
Is it worth it for us to like throw a little bit of money at that?
01:11:44.707 --> 01:11:45.500
Evidently it is.
01:11:45.500 --> 01:11:46.416
Yeah.
01:11:47.207 --> 01:11:49.332
And so that's the thing for sure.
01:11:50.000 --> 01:12:00.916
There are other companies or sponsors who just like what we're doing for technical reasons or they're just like fans of the idea that for one reason or another.
01:12:01.291 --> 01:12:08.375
But the closest thing to a business-minded reason is like, hey, we're essentially like building on top of somebody's monopoly.
01:12:09.125 --> 01:12:09.291
Yeah.
01:12:09.291 --> 01:12:10.832
Yeah, that makes sense.
01:12:11.582 --> 01:12:11.707
Yeah.
01:12:12.000 --> 01:12:17.207
Let's invest in any moonshot that tries to steer away from that.
01:12:17.416 --> 01:12:20.625
And there aren't a lot of projects like ours.
01:12:21.416 --> 01:12:26.500
Like everybody kind of just accepts the status quo as like, ah, this is just how it is.
01:12:26.500 --> 01:12:27.082
This is the web.
01:12:27.750 --> 01:12:28.916
Google is a great steward.
01:12:28.916 --> 01:12:33.082
You know, they're putting – I mean, and I'm not shitting on Google here.
01:12:33.082 --> 01:12:35.625
Like I think Google does a great job moving the web forward.
01:12:35.625 --> 01:12:37.207
They make great products.
01:12:37.666 --> 01:12:40.082
Chromium is a fantastic piece of engineering.
01:12:40.707 --> 01:12:45.125
I have nothing bad to say about Chromium as like a piece of software.
01:12:45.957 --> 01:12:52.750
But the greater ecosystem, I think, is flawed in some important ways.
01:12:53.250 --> 01:12:53.500
Yeah.
01:12:53.500 --> 01:12:54.625
That totally makes sense.
01:12:54.625 --> 01:13:01.000
You brought up this thing before that you said you very much develop Ladybird based on the specification.
01:13:01.291 --> 01:13:02.541
How does that look?
01:13:02.541 --> 01:13:04.082
Because I've seen some of them.
01:13:04.082 --> 01:13:09.791
I looked at the nesting specification and details once I was working on that a little bit more.
01:13:09.791 --> 01:13:15.750
And it's like 100 pages long for like something that is fairly intuitive for like a developer.
01:13:16.500 --> 01:13:22.957
So talk me through this a little bit, how this looks for you from like basically like on the very other side.
01:13:23.500 --> 01:13:23.750
Sure.
01:13:23.750 --> 01:13:24.666
Yeah.
01:13:25.000 --> 01:13:29.582
Yeah. So a reference point I like to talk about is video game emulation.
01:13:29.916 --> 01:13:30.916
Have you ever worked on emulators?
01:13:32.375 --> 01:13:33.500
I've used emulators.
01:13:33.666 --> 01:13:34.416
You've used emulators.
01:13:34.541 --> 01:13:34.791
Okay.
01:13:35.125 --> 01:13:37.875
So at least you're intimately familiar with the concept.
01:13:38.500 --> 01:13:38.791
Yes.
01:13:38.791 --> 01:13:44.582
And so I like to imagine the web as like the Super Nintendo or something like that.
01:13:45.166 --> 01:13:45.375
Okay.
01:13:45.375 --> 01:13:47.250
And every web page is like a ROM.
01:13:48.041 --> 01:13:52.041
And a browser is the emulator that's supposed to run all these ROMs.
01:13:52.041 --> 01:14:03.000
And so as it turns out, you don't need like the full functionality in every edge case of the Super Nintendo to be able to play a game to your satisfaction.
01:14:03.625 --> 01:14:03.832
Yeah.
01:14:04.082 --> 01:14:13.582
Like you can play Super Mario Kart even if there's like a glitch in the sprites or like the whatever, you know, like something doesn't animate correctly or the sound isn't quite right.
01:14:14.207 --> 01:14:29.500
And we're finding the same thing with the web because the web is built on this principle of graceful degradation, which means that even if you can't handle all the features being requested in the CSS or in the JavaScript, there is sort of a graceful fallback in most cases.
01:14:29.500 --> 01:14:35.000
So like let's say that you haven't implemented CSS borders.
01:14:35.291 --> 01:14:36.750
You're just going to get the page without borders.
01:14:37.416 --> 01:14:41.207
You know, like that's just like a goofy example, but you understand what I mean?
01:14:41.207 --> 01:14:43.791
Like if you don't support images, you still get the page, but you don't see images.
01:14:44.416 --> 01:14:54.832
And so we're finding that with all these specifications, something like nesting, for example, even though it's 100 pages long, maybe there's really 20 pages of meat in there.
01:14:54.832 --> 01:14:58.041
That's what matters for 99% of the content online.
01:14:58.041 --> 01:15:10.832
And then there's that remaining little bit of stuff that's hidden in all the rest of the stuff, which is, you know, we're going to have to deal with it eventually if we want to completely support the web.
01:15:11.125 --> 01:15:16.332
But it's not essential for pretty broad compatibility, if that makes sense.
01:15:16.832 --> 01:15:17.375
Yeah, totally.
01:15:17.375 --> 01:15:42.000
And so that's what I mean, you're basically approaching it from like an 80-20 perspective where you're like, just imagine like there's a new spec coming out somewhere and one of the team members says, oh, I'm going to work on CSS nesting for the next week, month, whatever it takes to get like the 80% done that realistically, probably like more like 95% of all websites already handle more than reasonable.
01:15:42.000 --> 01:15:45.375
Yeah, that's roughly what happens.
01:15:45.375 --> 01:15:56.125
So to ground it even more, in reality, what we really do is like we have some website, some big website that starts using nesting suddenly, like Vercel.com or something like that.
01:15:56.416 --> 01:15:59.957
They just start using nesting and then it looks totally wrong in our browser.
01:15:59.957 --> 01:16:02.916
Somebody notices and says, hey, they started using nesting.
01:16:04.166 --> 01:16:09.500
I guess we'll implement the stuff that they use and then we'll see if we find some other pages that use nesting.
01:16:09.875 --> 01:16:18.582
We'll implement what they use and we do like a couple of those and we end up with pretty good coverage of the main parts of the feature.
01:16:18.582 --> 01:16:34.500
So that's sort of, we try to ground our work that way so that we're always working towards better compatibility with real content because the totally wrong approach would be to take a new spec and like start at chapter one.
01:16:35.041 --> 01:16:38.166
Here's what you're supposed to do like, well, blah, blah, blah, blah, blah, blah.
01:16:38.666 --> 01:16:46.125
Because in practice, most of the features and most of the specs are not being used that much.
01:16:46.750 --> 01:16:46.957
No.
01:16:48.291 --> 01:16:57.291
And so if we took the, let's just do all the specs in alphabetical order, we wouldn't have anything useful right now.
01:16:57.291 --> 01:16:58.041
Yeah, yeah.
01:16:58.375 --> 01:17:00.791
So that's kind of how we've been doing it.
01:17:00.791 --> 01:17:06.707
At the same time, so this is like one force pushing us forward, like the desire to be compatible with websites.
01:17:06.707 --> 01:17:15.332
We do have another thing coming from the other direction, which is, so there's a joint project between all browser vendors called the web platform tests.
01:17:16.291 --> 01:17:22.125
And it's essentially a test suite that has millions of tests for different web platform features.
01:17:22.332 --> 01:17:29.082
And the idea is if you fix a bug in a browser, you can contribute a test for that bug fix to the web platform tests.
01:17:29.082 --> 01:17:35.875
If you write a new specification or edit a specification, you can add tests for your edits to the web platform tests.
01:17:35.875 --> 01:17:46.125
And the idea is that it's supposed to keep growing over time and just become like a comprehensive test suite that if you pass this test suite, there's a real chance that you can render the web.
01:17:46.625 --> 01:17:50.082
Now, this thing is, hasn't always been there.
01:17:50.082 --> 01:17:57.125
So it's like organically grown over the last, I don't know when it started, maybe 10 years ago or something like that.
01:17:57.125 --> 01:17:58.082
I don't know the history.
01:17:59.166 --> 01:18:05.166
It used to be that every browser had independent test suites, and they still do, but now they also collaborate on this thing called WPT.
01:18:05.916 --> 01:18:28.250
And so that's sort of our other weapon to drive progress as well is that we try to make websites work, but we also use the web platform tests to make sure that we can pass all kinds of tests and edge cases and things that stuff from specifications that we might not see so much on the web, but it's still important for somebody somewhere.
01:18:29.416 --> 01:18:40.332
We recognize that we have to take both approaches because it's obviously not sufficient to just say like, oh, well, facebook.com uses these parts of the spec, so that's all that matters.
01:18:41.416 --> 01:18:44.207
Until, like today, we don't even have users.
01:18:44.541 --> 01:18:46.000
Like we are our own users.
01:18:46.666 --> 01:18:51.000
So whatever websites we visit, the developers, those are the ones where we notice things.
01:18:51.375 --> 01:18:56.957
So we kind of rely on the test suite to provide us more information about what we need to be doing as well.
01:18:57.582 --> 01:18:59.832
How do code reviews look like then?
01:18:59.832 --> 01:19:08.791
Because I mean, if the spec at the end of the day is still like the ultimate source of truth, how a feature has to work, those, I mean, we talked about this.
01:19:08.791 --> 01:19:10.041
The specs are very elaborate.
01:19:10.457 --> 01:19:16.332
So if now, I imagine, okay, you file a pull request for CSS nesting support.
01:19:17.250 --> 01:19:20.750
Like how does someone else look at that and make sense out of this?
01:19:21.000 --> 01:19:22.041
You see what I'm saying?
01:19:22.666 --> 01:19:23.000
Sure.
01:19:23.582 --> 01:19:23.750
Yeah.
01:19:24.041 --> 01:19:28.625
So this project has grown organically from literally nothing.
01:19:28.916 --> 01:19:34.041
Like it was an empty text file at some point in 2019 on my computer.
01:19:34.041 --> 01:19:37.457
So we've built this thing.
01:19:37.707 --> 01:19:44.416
So we can usually find somebody else who understands the code well enough at least to review what you've been doing.
01:19:45.332 --> 01:19:52.000
And I think probably you might also have an idea about the complexity of browsers that's based on the existing browsers.
01:19:52.416 --> 01:19:53.750
We are dramatically smaller.
01:19:53.750 --> 01:20:06.916
So I think I forget the numbers, but I think that Safari is like in the tens of millions of lines and Chromium might be in hundreds of millions of lines.
01:20:07.707 --> 01:20:11.625
And we are like six, seven hundred thousand lines maybe.
01:20:12.207 --> 01:20:12.457
Okay.
01:20:12.457 --> 01:20:17.416
So, and obviously we don't support nearly the same amount of stuff that they do.
01:20:17.416 --> 01:20:20.500
And we don't have all these cool tricks to go fast and stuff.
01:20:21.082 --> 01:20:23.832
But it's also dramatically more hackable.
01:20:24.750 --> 01:20:26.500
So that helps a lot.
01:20:26.500 --> 01:20:27.541
Like we're a lot less complicated.
01:20:27.541 --> 01:20:36.875
But the big trick that we're doing to make things reviewable and make things understandable is that we are modeling our code on the specs.
01:20:37.832 --> 01:20:42.916
So if something is called a foobar in the spec, we make sure to call it a foobar in our code.
01:20:42.916 --> 01:20:45.875
Like we don't invent our own names and ways of doing things.
01:20:45.875 --> 01:20:49.500
Like we just take what's in the spec and we try to do it literally what it says.
01:20:49.832 --> 01:20:50.082
Okay.
01:20:50.082 --> 01:20:57.500
And then we even go a step further and we take the text in the spec, we put it as a comment in the code so that you can like cross reference.
01:20:57.916 --> 01:21:05.125
And, you know, there was a lot of pushback against this when we first started doing it because people felt like, well, this is a lot of work, a lot of extra work.
01:21:05.457 --> 01:21:08.125
And it made the code look real bloated, people felt in the beginning.
01:21:08.375 --> 01:21:15.166
But it's proven to be super valuable because now it's really easy to orient yourself.
01:21:15.166 --> 01:21:21.500
Like if you have the spec and the code side by side, you can find exactly what's going on very easily because they look the same.
01:21:21.916 --> 01:21:31.000
And somebody who's never worked on our code base, but they can read a spec, they can pretty quickly figure out what needs to change to fix something.
01:21:32.332 --> 01:21:36.416
How does this behave for specs in different versions?
01:21:36.416 --> 01:21:40.582
Because usually you don't make changes to an existing spec, you release an update.
01:21:40.582 --> 01:21:47.000
So like you don't, I don't have a concrete version, but you might not have CSS nesting version two.
01:21:47.250 --> 01:21:48.875
Now you have version 2.1.
01:21:49.666 --> 01:21:49.875
Yeah.
01:21:50.125 --> 01:21:59.082
So this is something that's a little bit annoying or perhaps one of the most annoying meta things about the web is that it's all like living specifications.
01:22:00.666 --> 01:22:02.125
Oh, okay.
01:22:02.125 --> 01:22:02.332
Okay.
01:22:04.000 --> 01:22:14.332
This is really counterintuitive, but if you want to build a browser, what you should be doing is looking at just the latest editor's draft of any spec.
01:22:14.707 --> 01:22:15.457
That's what I thought.
01:22:16.000 --> 01:22:16.166
Yeah.
01:22:16.707 --> 01:22:20.041
Because those are actually the closest to what browsers do.
01:22:20.750 --> 01:22:20.916
Okay.
01:22:20.916 --> 01:22:26.041
You might think that, hey, I should look at the latest published version of the spec, but no, that's not what you want to do.
01:22:27.582 --> 01:22:28.375
It's strange.
01:22:28.375 --> 01:22:31.332
I thought this differentiation was always so arbitrary.
01:22:31.332 --> 01:22:31.707
Okay.
01:22:31.707 --> 01:22:32.666
Now I see what you're saying.
01:22:32.666 --> 01:22:32.875
Yes.
01:22:34.207 --> 01:22:34.416
Yes.
01:22:34.791 --> 01:22:35.041
Yeah.
01:22:35.041 --> 01:22:36.916
So you have to go by the drafts.
01:22:37.666 --> 01:22:41.000
And because of the drafts, they're drafts, right?
01:22:41.000 --> 01:22:42.166
Then they're living documents.
01:22:43.207 --> 01:22:46.750
They might change from day to day.
01:22:46.750 --> 01:22:47.625
And they do.
01:22:47.791 --> 01:22:49.750
And we try to keep up with the changes.
01:22:50.125 --> 01:22:55.332
Sometimes they make sweeping large changes to like refactor giant parts of the code base.
01:22:56.166 --> 01:23:09.041
We've had a couple of those since we started where some, you know, ultimately benevolent spec editor thought, hey, wouldn't it be great if this worked in this other way in the spec?
01:23:09.791 --> 01:23:15.416
And sort of on the bottom of their list of concerns was how are the ladybird people going to feel about this?
01:23:15.416 --> 01:23:19.457
Which is fair, you know.
01:23:19.916 --> 01:23:29.332
But it has meant on occasion that we had to do like excruciating work to reorganize our code base to fit new concepts.
01:23:29.332 --> 01:23:31.582
But I think we're better off for it.
01:23:32.457 --> 01:23:39.000
And we've actually received a lot of kind words from spec people who say that it's really nice.
01:23:39.666 --> 01:23:45.666
Sometimes they can just go look at our code base if they're wondering like, hey, how would this thing look in practice?
01:23:46.707 --> 01:23:49.707
They can go and look at our code base like, ah, this is how it looks in practice.
01:23:49.707 --> 01:23:52.707
Because we've implemented stuff that they're doing.
01:23:52.707 --> 01:23:59.250
And oftentimes recently we end up being the first to implement new stuff in the spec.
01:24:00.541 --> 01:24:04.332
Sometimes that has been a bit of a bad thing because we end up being guinea pigs.
01:24:05.707 --> 01:24:07.625
Because the specs are written in English.
01:24:08.166 --> 01:24:13.625
And, you know, if you have a typed programming language, it tends to be a little stricter than just English.
01:24:13.625 --> 01:24:18.332
Like, hey, you said that this thing can never be null.
01:24:18.332 --> 01:24:21.625
But when I write it out in code, I'm putting null in it.
01:24:23.875 --> 01:24:24.250
Yep.
01:24:24.500 --> 01:24:25.082
What do I do?
01:24:25.500 --> 01:24:30.416
So we end up finding a lot of issues like that because there's no type checker in English.
01:24:32.207 --> 01:24:36.000
And sometimes we feel like we are the type checker of the spec.
01:24:36.332 --> 01:24:38.832
But it's been healthy so far.
01:24:38.832 --> 01:24:45.916
And we're also learning like we don't have to be so eager to try to catch up on like every spec change.
01:24:45.916 --> 01:24:48.957
We can like let them bake for a little while.
01:24:50.166 --> 01:24:53.041
Let other people discover some of the basic issues.
01:24:54.000 --> 01:24:56.707
In particular, that kind of bit us with...
01:24:57.000 --> 01:24:58.916
So JavaScript added this thing called Temporal.
01:24:59.541 --> 01:25:00.000
Uh-huh.
01:25:00.207 --> 01:25:02.832
All this like time and date manipulation stuff.
01:25:02.832 --> 01:25:05.166
Temporal, which, you know, was long overdue.
01:25:05.750 --> 01:25:06.000
Yes.
01:25:06.000 --> 01:25:10.082
Because JavaScript never had a good way to work with timestamps.
01:25:10.082 --> 01:25:12.457
I'm sure you're aware as a user of the language.
01:25:12.457 --> 01:25:14.041
I've run it once or twice.
01:25:14.250 --> 01:25:14.625
Max.
01:25:14.625 --> 01:25:14.832
Right.
01:25:15.125 --> 01:25:15.332
Max.
01:25:16.000 --> 01:25:16.207
Sure.
01:25:19.125 --> 01:25:21.375
And Temporal like has been around for a while.
01:25:21.375 --> 01:25:28.500
And we eagerly implemented an earlier version of it, which was like a ton of code.
01:25:28.916 --> 01:25:34.582
Like I think at one point Temporal was the same amount of code as the entire rest of our JavaScript engine.
01:25:35.625 --> 01:25:42.082
And then we were like the first people to implement that version of the early version of the spec.
01:25:42.500 --> 01:25:46.082
And then we were like super happy with it because we had Temporal support.
01:25:46.082 --> 01:25:56.500
And then right after somebody else tried implementing it, I think maybe it was Mozilla, they were like, we don't really like this spec for ABC reasons, right?
01:25:56.500 --> 01:25:57.916
Like let's make changes to the spec.
01:26:00.916 --> 01:26:02.791
And then we just had to rewrite our whole thing.
01:26:03.457 --> 01:26:09.750
So we probably shouldn't have been so eager to just implement this early stage specification.
01:26:11.541 --> 01:26:12.166
Lessons to learn.
01:26:12.957 --> 01:26:13.500
Yeah, I bet.
01:26:13.500 --> 01:26:26.000
But the thing that is maybe not entirely transparent to some people, and I just also just know this because I talked to Daniel Ehrenberg from the TC39, which Temporal, as far as I know, is a TC39 proposal.
01:26:26.375 --> 01:26:26.541
Right.
01:26:28.041 --> 01:26:31.416
Not all those specs are coming from the same folks.
01:26:32.916 --> 01:26:33.250
Sure.
01:26:33.250 --> 01:26:35.916
Like the TC39 has influence on JavaScript.
01:26:36.250 --> 01:26:41.375
The WICG, whatever this stands for, has influence on the JavaScript.
01:26:41.375 --> 01:26:43.541
CSS is a completely different specification.
01:26:45.082 --> 01:26:47.832
How do you keep up with all that?
01:26:48.375 --> 01:26:49.041
It's a good question.
01:26:49.666 --> 01:26:49.875
Yeah.
01:26:50.500 --> 01:26:54.750
We just kind of, I don't know, I'm so used to it because I've lived in this world for so long that I just take it for granted.
01:26:54.957 --> 01:26:56.916
Like, oh, the specs, they just come.
01:26:57.957 --> 01:26:58.500
They just come out.
01:26:59.416 --> 01:26:59.791
Okay.
01:26:59.791 --> 01:27:04.291
No, more seriously, like, we monitor the different specs.
01:27:04.500 --> 01:27:16.707
So we have, we try to have our engineers be sort of floating and become experts at multiple parts of the browser because we don't have the money to hire an expert at every line of code.
01:27:17.207 --> 01:27:17.250
Yeah.
01:27:17.250 --> 01:27:24.791
Like some, like some of our competitors, but we have, we have people whose like main interest is JavaScript.
01:27:25.041 --> 01:27:26.457
So they follow the JavaScript specification.
01:27:26.750 --> 01:27:29.000
We have people whose main interest is CSS and so on.
01:27:29.750 --> 01:27:32.000
And I, but, but it's very true what you say.
01:27:32.000 --> 01:27:34.707
It's totally different people with totally different ways of working.
01:27:34.707 --> 01:27:41.957
And of course the specs end up looking and feeling very different as a result of just being from totally different people.
01:27:42.625 --> 01:27:53.000
The JavaScript or ECMAScript specification is wonderful and extremely implementable with one major exception, which is date parsing.
01:27:53.500 --> 01:27:58.332
But I don't have to complain about that in every podcast I go on.
01:27:58.332 --> 01:28:08.916
But, but, but you should know that the specification only says you have to support ISO 8601 dates and then the rest is up to your implementation.
01:28:09.250 --> 01:28:14.582
And then of course, every implementation supports a truckload of other date formats.
01:28:15.332 --> 01:28:15.500
Yes.
01:28:15.500 --> 01:28:21.125
And then the web relies on those, which is fun for us because nobody says what you're supposed to do with these.
01:28:21.250 --> 01:28:33.416
Anyway, outside of date parsing, JavaScript is a beautiful specification and like with just the right level of detail that you can implement very easily, very straightforward to implement.
01:28:34.000 --> 01:28:47.625
And then HTML and the DOM and these specifications, slightly fuzzier, but still, you know, like they're written in sort of an imperative style, like an imperative programming language where like first you do this, then you do that.
01:28:48.832 --> 01:28:49.707
Very implementable.
01:28:49.707 --> 01:28:53.125
So, but CSS is not like this.
01:28:54.500 --> 01:28:58.291
Maybe you've seen, there's this picture where it's like how to draw an owl.
01:28:59.041 --> 01:28:59.457
And then.
01:28:59.457 --> 01:28:59.707
Yes.
01:29:00.000 --> 01:29:03.582
In the first, first slide, there's like three circles.
01:29:04.250 --> 01:29:11.041
And then in the second slide, there's like an owl and it's like you're just supposed to go from first to the second there.
01:29:11.041 --> 01:29:11.416
Yes.
01:29:11.625 --> 01:29:14.500
I'm not doing it justice by trying to explain it, but you know what I mean.
01:29:15.041 --> 01:29:15.250
Yes.
01:29:15.416 --> 01:29:16.500
Just draw the freaking owl.
01:29:17.416 --> 01:29:19.250
CSS feels very much like that.
01:29:19.625 --> 01:29:26.332
That is, that is so, again, I read the nesting specification and it's such an accurate description.
01:29:26.332 --> 01:29:28.041
I never thought about it in this way.
01:29:28.041 --> 01:29:32.666
But, but if you read one specification, you're like, yes, 100%.
01:29:33.082 --> 01:29:34.082
That's hilarious.
01:29:34.082 --> 01:29:35.250
Yeah.
01:29:35.500 --> 01:29:47.000
So you end up feeling like that a lot of the time that you're just like staring at, you're looking at another browser with a perfectly rendered owl and you're just looking at your own browser with the circles in the wrong place.
01:29:47.000 --> 01:29:48.500
And you're like, what the hell?
01:29:49.332 --> 01:29:51.291
How am I supposed to go from this to that?
01:29:51.291 --> 01:29:51.500
Yeah.
01:29:52.791 --> 01:29:53.791
Yeah.
01:29:53.791 --> 01:29:58.791
So I guess the nice way of saying it is the CSS is very declarative in its style.
01:29:59.375 --> 01:29:59.666
Yes.
01:30:00.291 --> 01:30:07.750
So the specs describe what should happen, and they leave it to you to figure out how it happens.
01:30:08.791 --> 01:30:20.207
And I think I've spoken to a bunch of spec people, and my understanding is that it's just like sort of a function or a consequence of the people who work on those types of spec.
01:30:20.207 --> 01:30:31.666
They're more like designer people, people with more visual ways of thinking, and so they're not these programmer types that just do everything in algorithmic steps, and it makes sense.
01:30:32.250 --> 01:30:33.750
But, yeah, it's always interesting.
01:30:34.000 --> 01:30:52.207
So I mentioned that we try to follow the specifications and making our code look like the specifications, and CSS is where we break that rule the most, I think, just because there isn't always like a step-by-step instruction for how to do something.
01:30:52.207 --> 01:30:52.416
Okay.
01:30:54.500 --> 01:30:58.207
Genuine question, and I can speak from my experience.
01:30:58.541 --> 01:31:01.750
I never really invested time learning CSS.
01:31:02.000 --> 01:31:12.666
It's something that you pick up to a somewhat okayish level that you can build applications somewhat on the go, and those are the same kind of people that are bitching about CSS.
01:31:13.000 --> 01:31:18.207
It doesn't make sense, and you do hacks like debugging with like a red border or something like that.
01:31:19.375 --> 01:31:30.207
Do you think your work on a browser made you better with CSS, or is it more like that you now see all the nifty details and you're like kind of getting into analysis paralysis?
01:31:31.166 --> 01:31:32.375
Probably the latter.
01:31:33.041 --> 01:31:33.250
Yeah.
01:31:33.957 --> 01:31:41.541
Like it's always interesting to me that when people think that just because I work on browsers, I know how to make web content.
01:31:41.541 --> 01:31:45.207
I think this is a reasonable assumption.
01:31:46.707 --> 01:31:47.332
Yeah.
01:31:47.332 --> 01:32:00.082
And, you know, I like to say that I have written, you know, millions of lines of JavaScript and HTML and CSS over the years, but it was all spread out over like these little 10-line files.
01:32:00.082 --> 01:32:08.000
So, yeah, that's kind of very common, I think, among browser people.
01:32:08.375 --> 01:32:13.082
Not many of us actually have much experience building like real big web things.
01:32:14.582 --> 01:32:24.332
I don't think this is just unique to browser people because I've heard the same feedback from framework developers that they're not actually using their frameworks because they're building the framework.
01:32:24.957 --> 01:32:27.082
So they're relying on feedback from the community.
01:32:27.082 --> 01:32:30.541
We at JetBrains to some extent have the same, like in WebStorm.
01:32:31.250 --> 01:32:33.000
WebStorm is written in Kotlin, not in JavaScript.
01:32:33.000 --> 01:32:35.625
So we're kind of relying on feedback from our users.
01:32:35.625 --> 01:32:36.291
Makes sense.
01:32:36.291 --> 01:32:38.416
But, like, it's not the most intuitive thing.
01:32:39.250 --> 01:32:39.541
No.
01:32:40.332 --> 01:32:50.291
But I guess, you know, to defend CSS a little bit, I think I see why it confuses people because it is very complex.
01:32:51.000 --> 01:32:51.332
Yes.
01:32:51.332 --> 01:33:07.041
And it has a large number of systems that interact and people keep adding new systems to it and they keep adding new low-level primitives that bypass some of the systems that have been layered on top of each other, which challenges you to update your mental model every year.
01:33:07.875 --> 01:33:24.832
But once you've implemented it or implemented, like, parts of it, you start to sort of see the matrix where, like, oh, well, this is what a block formatting context is and that's why the float works the way that it does because it always, like, plops over to the edge of the containing block and blah, blah, blah.
01:33:24.832 --> 01:33:26.000
Like, you start to see all these things.
01:33:26.916 --> 01:33:37.082
If you're just a web developer and you're just, like, trying to make the thing go where you want it to go and you're just, like, hammering different hacks into your CSS and putting red borders on things, it's frustrating.
01:33:37.082 --> 01:33:37.666
I get it.
01:33:38.832 --> 01:33:49.707
CSS is probably, like, on my top ten list of things I should spend more time on because it's, like, the most frustrating thing and probably one of the things that I spent the most time with just because I'm not good with it.
01:33:50.291 --> 01:33:56.625
So, like, if I'm, to be honest with myself, I should really just sit down and open my textbook, basically.
01:33:57.250 --> 01:33:57.707
Sure.
01:33:58.082 --> 01:34:20.375
But I also think, like, CSS has evolved dramatically and somebody who gets started with CSS today should learn, you know, like, how to use the grid layout system because it's incredibly powerful and it just gives you all these tools that you didn't have in the earlier ones, but we still have to support the earlier ones because there's a billion web pages that use them.
01:34:21.457 --> 01:34:24.832
But, yeah, it's tricky with stuff like this.
01:34:24.832 --> 01:34:27.750
It's a lot like going back to emulators again.
01:34:28.041 --> 01:34:39.250
Like, it's like you have to support all these things that the machine is supposed to be able to do because somebody is going to come along and want to play Donkey Kong even though, you know, we have Breath of the Wild or whatever.
01:34:39.916 --> 01:34:41.791
Donkey Kong has to keep working.
01:34:41.791 --> 01:34:57.125
So, yeah, that's the glory of building a browser is that no matter what you do, you're stuck with these, like, 40-year-old APIs that you have to keep supporting and you try to do it in the least painful way possible.
01:34:58.375 --> 01:35:20.125
But I think there is, just to say something that's kind of nice for us compared to other browsers, is that other browsers were there when, you know, 40, 30 years ago, let's say, when all of these, like, early display techniques were added to the web and, like, HTML is in its infancy.
01:35:20.791 --> 01:35:22.291
CSS was invented.
01:35:23.250 --> 01:35:28.957
And they have, like, a lot of ways of thinking from back then sort of encoded in their code bases.
01:35:28.957 --> 01:35:37.041
That's not necessarily the best way to model a lot of this stuff, but they're kind of, they still have it.
01:35:37.625 --> 01:35:48.041
And in particular, at least, so I worked on Safari for many years and I know intimately that there's a lot of optimizations in Safari for old-style stuff that nobody does anymore.
01:35:49.041 --> 01:35:53.500
But Safari wanted to be fast at it 20 years ago, so we did tricks.
01:35:54.082 --> 01:36:00.207
And it's really easy to just accumulate so many of those tricks over the years and get really thick and bloated because of it.
01:36:00.666 --> 01:36:03.416
So it is nice for us that we're, like, starting fresh.
01:36:04.416 --> 01:36:07.500
And then, you know, it's not like we're perfect.
01:36:07.500 --> 01:36:08.707
We're also adding tricks.
01:36:09.166 --> 01:36:15.125
So hopefully we'll be able to realize when some trick becomes outdated.
01:36:15.957 --> 01:36:16.375
We'll see.
01:36:17.041 --> 01:36:27.166
I still have a million of questions, but one thing that I'm probably the most curious about is how often did you have to justify not writing it in Rust?
01:36:27.166 --> 01:36:27.375
Rust?
01:36:27.625 --> 01:36:27.832
Oh.
01:36:30.041 --> 01:36:31.500
It comes up every now and then.
01:36:33.832 --> 01:36:44.625
I know Rust has a lot of really excited fans, but I will say, like, in the last year, I feel like that community has calmed down a lot.
01:36:44.625 --> 01:36:45.416
I don't know what happened.
01:36:45.750 --> 01:36:47.332
Maybe a new language came out or something.
01:36:47.541 --> 01:36:48.832
Well, I still get this question.
01:36:49.041 --> 01:36:52.625
Probably, like, still a good amount.
01:36:53.082 --> 01:36:54.000
You're probably right.
01:36:54.000 --> 01:36:58.500
I did calm down a little bit, but once a month, I probably still get that question somewhere.
01:36:58.750 --> 01:36:59.166
Yeah, yeah.
01:36:59.166 --> 01:36:59.957
Once a month for sure.
01:36:59.957 --> 01:37:01.707
But it used to be, like, every two days.
01:37:02.125 --> 01:37:02.750
Yeah, fair.
01:37:03.082 --> 01:37:05.416
I feel like at least two, three years ago.
01:37:06.166 --> 01:37:10.041
Maybe they just grew older because I think a lot of them were pretty young.
01:37:10.750 --> 01:37:15.332
The thing that bothers me with that is that the people that ask for it don't even use the language.
01:37:15.666 --> 01:37:29.957
So it's like, they just watch the arbitrary benefit that, yes, you use Rust, so automatically everything is faster, that there's, like, a whole cascade of implications with that seems to be, like, completely out of the conversation.
01:37:29.957 --> 01:37:30.957
Yes, Rust is fast.
01:37:31.500 --> 01:37:32.082
Give you that.
01:37:32.791 --> 01:37:33.832
Cool, good for you.
01:37:34.125 --> 01:37:39.666
But the five developers out there that really write production-grade Rust applications, they're kind of hard to get.
01:37:40.041 --> 01:37:40.250
Yeah.
01:37:40.625 --> 01:37:42.582
I mean, there's a lot of benefits to that.
01:37:43.166 --> 01:38:08.541
We do want to have more safety in our code, but it's sort of a, there's a big practical problem to it, which is we have a large code base that grew organically, and unfortunately, none of the safe compiled languages offer a particularly attractive sort of on-ramp for incremental adoption in existing large projects.
01:38:08.875 --> 01:38:16.375
It's been my impression, to be honest, that the Rust community kind of just, like, blows their nose at other languages a little bit.
01:38:17.250 --> 01:38:19.416
Yeah, I can see that.
01:38:20.457 --> 01:38:23.832
And they just say, like, well, you should have done it in Rust from the beginning.
01:38:23.875 --> 01:38:25.791
Like, okay, very constructive.
01:38:29.000 --> 01:38:41.957
But, you know, I expect that to change, because if you want real projects to adopt new technologies, you have to give them an incremental path to adoption.
01:38:43.041 --> 01:38:46.250
If we were starting today, we would use a different language.
01:38:46.375 --> 01:38:48.207
Because we're using C++ at the moment.
01:38:48.582 --> 01:38:50.750
This would not be the first choice today.
01:38:50.750 --> 01:38:53.457
But we started seven years ago, so it is what it is.
01:38:54.457 --> 01:39:06.416
The production language that offers the most reasonable sounding, at least, on-ramp, or incremental on-ramp for adoption is Swift.
01:39:06.416 --> 01:39:12.625
So we're trying to make ourselves compatible with Swift.
01:39:13.541 --> 01:39:14.166
Okay.
01:39:14.250 --> 01:39:17.875
But we have yet not been super successful.
01:39:18.375 --> 01:39:23.875
We've been working with the Swift team, getting them to fix stuff to make it smoother for us.
01:39:24.916 --> 01:39:26.416
But Swift is not perfect for us either.
01:39:26.416 --> 01:39:33.916
Like, there is no perfect language for us, really, because we would, in my opinion, what we would really like to have is a garbage collector.
01:39:33.916 --> 01:39:34.791
Yeah.
01:39:35.375 --> 01:39:39.916
And then maybe, since you were affiliated with JetBrains, you will say, hey, have you heard of Kotlin?
01:39:40.832 --> 01:39:44.125
It was on the tip of my tongue, but I was like, ah.
01:39:45.207 --> 01:39:45.582
Yeah.
01:39:45.582 --> 01:39:49.375
I think it looks attractive, for sure.
01:39:49.375 --> 01:39:53.707
But I don't know that it's incrementally adoptable for a C++ project.
01:39:54.416 --> 01:39:56.207
I couldn't tell you.
01:39:56.207 --> 01:40:00.957
I know we have a lot of, like, Java next to Kotlin in the IntelliJ code base.
01:40:01.875 --> 01:40:02.125
Yeah.
01:40:02.125 --> 01:40:05.666
So from, like, that starting point, it is very incrementally adoptable.
01:40:05.916 --> 01:40:06.291
For sure.
01:40:07.250 --> 01:40:10.916
I don't know about the details coming from C++.
01:40:11.207 --> 01:40:11.457
Yeah.
01:40:12.082 --> 01:40:12.416
Yeah.
01:40:12.416 --> 01:40:19.000
But, like, you know, if we were starting today, for sure, I would probably have liked to use something more like Kotlin.
01:40:19.750 --> 01:40:19.957
Yeah.
01:40:19.957 --> 01:40:25.750
just because doing garbage collection yourself is just no fun.
01:40:26.457 --> 01:40:27.250
Yeah, it doesn't sound fun.
01:40:27.707 --> 01:40:29.416
It's real nice when somebody else does it for you.
01:40:29.416 --> 01:40:30.416
You don't have to think about it.
01:40:30.957 --> 01:40:31.166
Yeah.
01:40:31.416 --> 01:40:35.250
But I guess your question was, like, how often do you have to justify not using Rust?
01:40:35.500 --> 01:40:38.541
It used to be several times a week.
01:40:39.207 --> 01:40:41.332
Now, we rarely hear from them.
01:40:42.000 --> 01:40:42.500
Well, that's good.
01:40:43.500 --> 01:40:43.707
Yeah.
01:40:44.000 --> 01:40:47.916
I think they grew up a little bit, and they realized that not everybody wants to hear that question all the time.
01:40:50.291 --> 01:40:53.250
Lady Bird is a truly open source project.
01:40:53.250 --> 01:41:04.541
Do you feel that you have to justify some of those decisions, like, particular architecture decisions often, or is it so low level that a lot of people don't care about that level of details?
01:41:05.500 --> 01:41:11.000
I think we frequently feel that we have to justify it to ourselves.
01:41:12.250 --> 01:41:12.750
Interesting.
01:41:13.000 --> 01:41:13.207
Okay.
01:41:13.750 --> 01:41:17.875
Because ultimately, we're the ones who have to work with this thing all day, every day.
01:41:18.625 --> 01:41:18.957
And so...
01:41:19.416 --> 01:41:21.000
That sounds rather healthy, though, to me.
01:41:21.541 --> 01:41:22.041
Yeah.
01:41:22.582 --> 01:41:27.332
And we're not entirely happy with some of the architectural decisions that we have.
01:41:28.166 --> 01:41:30.000
But even though we're more than...
01:41:30.375 --> 01:41:37.000
You know, we're less than 10 times the size of something like Safari, we're still a big, heavy code base.
01:41:37.582 --> 01:41:39.166
So it takes time to affect change.
01:41:40.125 --> 01:41:42.791
One major change that we're doing right now is that...
01:41:43.332 --> 01:41:53.457
This is going to sound so unsexy, but we're transitioning to UTF-16 as our main string format, which...
01:41:53.666 --> 01:41:56.250
Which is like...
01:41:56.250 --> 01:41:57.166
I'm so hooked right now.
01:41:57.166 --> 01:41:57.916
I'm so hooked.
01:41:58.332 --> 01:41:58.541
Yeah.
01:41:59.416 --> 01:42:02.250
Which is, you know, not usually what people do in 2025.
01:42:03.916 --> 01:42:12.541
People are pretty hyped on this UTF-8 thing, but the sad fact is that the web is spec'd in UTF-16.
01:42:13.541 --> 01:42:16.041
JavaScript is a UTF-16 native language.
01:42:16.291 --> 01:42:17.875
The web platform is UTF-16.
01:42:18.582 --> 01:42:22.582
And we've been using UTF-8 as our string format the whole time.
01:42:23.000 --> 01:42:25.916
And we always thought, like, hey, this is awesome.
01:42:25.916 --> 01:42:27.000
We're a UTF-8 native.
01:42:27.582 --> 01:42:28.791
Like, UTF-8 is so cool.
01:42:28.791 --> 01:42:29.207
It's the future.
01:42:30.041 --> 01:42:50.125
But in practice, what it really means is that we're just, like, converting back and forth between UTF-8 and UTF-16 in a million places and, like, regularly forgetting to account for, like, hey, this is an offset to a byte number in a UTF-8 sequence, but the API expects a UTF-16 offset.
01:42:50.916 --> 01:42:52.291
And it screws everything up.
01:42:52.707 --> 01:42:54.666
And just, like, a lot of that shit.
01:42:54.666 --> 01:43:02.541
And it's, like, it's so uninteresting, but it's an architectural change that we're feeling pretty good about.
01:43:03.166 --> 01:43:03.625
Yeah.
01:43:05.332 --> 01:43:06.457
And, I don't know.
01:43:06.791 --> 01:43:10.000
There are a lot of these things that we're trying to get right.
01:43:10.791 --> 01:43:22.166
And I feel like choice of language or, yeah, like, really, programming language is another thing that we would like to change over time.
01:43:23.250 --> 01:43:25.957
But it's just such a big change to make, you know.
01:43:26.541 --> 01:43:29.291
We're looking for that incremental path.
01:43:30.125 --> 01:43:32.541
I don't know if it's going to pan out, you know.
01:43:33.125 --> 01:43:33.500
Yeah.
01:43:33.791 --> 01:43:49.416
I think if you look at the industry, if you look at the world, there's, like, how many billions of lines of production C++ is it out there at all these companies that have so much money and so much incentive to make it better?
01:43:50.207 --> 01:43:55.666
Like, it feels like some kind of efficient market would figure out a solution to this.
01:43:56.957 --> 01:43:58.207
I don't know why it's taking so long.
01:43:58.875 --> 01:44:04.707
So, I guess, yeah, we're just, I'm hoping also that some kind of great solution will come along.
01:44:04.707 --> 01:44:08.041
there is an interesting solution happening.
01:44:09.125 --> 01:44:25.207
So, an old coworker of mine from Apple is developing a thing called Fill C, which is sort of a new compiler for C and C++ that compiles to memory-safe executables.
01:44:26.457 --> 01:44:29.832
And it's not a dialect of the language.
01:44:30.082 --> 01:44:34.666
It's like, it's just a new compiler that's built or based on LLVM.
01:44:35.166 --> 01:44:43.291
So, based on like the production compiler that everybody uses, but it adds all these mechanisms to make it entirely memory-safe.
01:44:44.125 --> 01:44:48.832
And it is, in fact, safer than Rust because there is no unsafe.
01:44:49.832 --> 01:44:56.500
But it has a performance penalty that my friend Phil is trying to make as small as possible.
01:44:58.082 --> 01:45:01.582
But maybe that becomes the solution to all this stuff.
01:45:01.582 --> 01:45:02.000
I don't know.
01:45:02.582 --> 01:45:07.291
Languages are a huge topic and hard to know where to go with it.
01:45:07.707 --> 01:45:15.291
What is a thing that you as browser developer would like people to understand better about browsers?
01:45:16.166 --> 01:45:28.666
Because I look at it from a very much 10,000 feet view, like, oh, I want to use WebRTC, which I don't even recognize the tail of implications that might have from video encoding and those things.
01:45:28.666 --> 01:45:33.000
So I'm very curious on your perspective on those things.
01:45:34.916 --> 01:45:44.832
The number one thing I would want people to understand about browsers is that browsers are just code that you can open up on your machine and hack on and change.
01:45:45.125 --> 01:45:46.750
You can figure out how it works.
01:45:47.457 --> 01:45:50.207
You can put print statements in it and see what comes out.
01:45:51.375 --> 01:45:56.291
You can debug it, trace your way through CSS layout or JavaScript execution.
01:45:57.250 --> 01:46:00.332
They're just programs that your computer runs.
01:46:00.541 --> 01:46:09.707
I think browsers have become a little bit mythologized as these insanely complicated things and then people don't even look under the hood anymore.
01:46:09.957 --> 01:46:11.250
Yeah, I can see that.
01:46:12.125 --> 01:46:19.457
And I think more people should and I think our project in particular is a very easy space to do that.
01:46:19.457 --> 01:46:27.000
If anybody's curious about how browsers work internally, we have a very small one that is very hackable.
01:46:27.875 --> 01:46:29.375
Just close to a million lines of code.
01:46:30.166 --> 01:46:30.500
Yes.
01:46:32.707 --> 01:46:34.666
Which is a lot less than it could be.
01:46:35.166 --> 01:46:38.916
A nice good night story just before bedtime.
01:46:39.207 --> 01:46:39.457
Yes.
01:46:41.541 --> 01:46:51.041
No, but I really think that if you work with the web, then poking into a browser is interesting.
01:46:52.916 --> 01:47:06.750
And seeing that if all of this stuff that you interact with in your code in JavaScript is just other code that does kind of obvious looking things once you look at it for a bit.
01:47:07.582 --> 01:47:07.750
Yeah.
01:47:09.832 --> 01:47:16.666
And I guess I would also say that browsers are just made by people who you can talk to.
01:47:18.750 --> 01:47:22.207
It's very easy to talk to us because we're very casual.
01:47:22.207 --> 01:47:22.416
people.
01:47:22.957 --> 01:47:23.916
We're not very corporate.
01:47:24.207 --> 01:47:25.416
We don't have a huge corporate structure.
01:47:26.791 --> 01:47:29.332
But you can also go and talk to Google people.
01:47:29.666 --> 01:47:33.082
You can go talk to Mozilla people, Apple people working on their browsers.
01:47:33.916 --> 01:47:40.957
If something seems weird in a browser or you have an idea for how something could be better in the platform, you can go and talk to the people who make the spec.
01:47:41.707 --> 01:47:51.541
I think a lot of people just accept the browser and the web platform as something that just exists and you just have to deal with it as it sits there.
01:47:52.332 --> 01:47:53.957
But you can totally go and affect it.
01:47:53.957 --> 01:48:05.625
You can influence how it changes and how it develops because at the core of it is just a bunch of humans trying to make a cool platform.
01:48:06.832 --> 01:48:09.000
Yeah, I guess that's what I would love people to know.
01:48:09.750 --> 01:48:10.250
I love that.
01:48:11.082 --> 01:48:15.207
I do have to ask because there's now more and more this trend.
01:48:15.500 --> 01:48:19.332
I mean, you mentioned before with AI sidebar in the Chrome.
01:48:19.750 --> 01:48:22.791
Perplexity added their AI browser.
01:48:23.750 --> 01:48:30.457
And there are also theories going around that browsers will eventually fade for the sake of LLMs.
01:48:32.541 --> 01:48:35.207
What is your stance on those things?
01:48:37.207 --> 01:48:38.500
I don't know.
01:48:39.666 --> 01:48:41.957
I think no one does.
01:48:42.416 --> 01:48:43.666
Yeah, that's fair.
01:48:43.666 --> 01:48:44.582
Nobody knows.
01:48:44.582 --> 01:48:51.166
But I guess I want to lead with that, though, because I don't want to sit here and sound like, oh, I know exactly what's going to happen.
01:48:52.625 --> 01:49:03.875
I think, to me personally, it's the idea that AI will go and browse the web for me is completely unexciting because I love the web.
01:49:03.875 --> 01:49:11.707
I love browsing and clicking around and seeing all the different things that people do with the technology.
01:49:11.750 --> 01:49:12.625
I think it's fun.
01:49:12.625 --> 01:49:18.207
AI is awesome.
01:49:18.457 --> 01:49:31.166
I love using these deep research functionality of ChatGPT or Grok and these different ones where they go and they fetch stuff and summarize for you.
01:49:31.166 --> 01:49:32.000
I think that's awesome.
01:49:32.291 --> 01:49:33.457
But I still want to browse the web.
01:49:33.457 --> 01:49:39.832
I imagine that there are people who are still like that as well.
01:49:40.041 --> 01:49:41.541
Other people still want to browse the web.
01:49:41.582 --> 01:49:46.166
If you want to buy a new car, you want to look at cars.
01:49:46.416 --> 01:49:50.500
You don't want to have a summary of all the features and price points and stuff.
01:49:50.541 --> 01:49:52.957
You want to look at the beautiful brochure material.
01:49:54.916 --> 01:50:09.916
To put that in a different context, if we're talking about a 10-15 years time horizon, do you think it's kind of like people still buy vinyl for the experience more?
01:50:10.166 --> 01:50:12.000
Or do you think it's really like...
01:50:12.750 --> 01:50:13.791
Do you see what I'm saying?
01:50:14.416 --> 01:50:14.875
Yeah, okay.
01:50:14.875 --> 01:50:15.332
I get it.
01:50:15.500 --> 01:50:26.582
So I think the interaction model will change because the keyboard mouse interface today is possibly the most efficient in my opinion.
01:50:26.791 --> 01:50:29.166
Other people would say that well, touchscreen is more efficient.
01:50:30.166 --> 01:50:31.916
Something more efficient will probably come along.
01:50:31.916 --> 01:50:34.457
within the next 15 years.
01:50:34.791 --> 01:50:45.457
And we will also see increasingly powerful functionality with AI allowing you to search the web more efficiently, interact with pages in new ways, and blah, blah, blah.
01:50:45.457 --> 01:50:50.166
I don't know what's coming.
01:50:50.500 --> 01:51:03.625
I know stuff is coming for sure, but we, at least as Ladybird, we're just here to implement the standards and build sort of the bare bones functionality that people need to browse the web with it.
01:51:04.375 --> 01:51:12.832
I think it seems very likely to me that some kind of AI related stuff is going to start creeping into web standards eventually.
01:51:13.957 --> 01:51:20.000
I think isn't, what is it, Edge already having like an AI API?
01:51:21.625 --> 01:51:25.541
Yeah, I think they have like window.ai or something like that is like a thing.
01:51:26.791 --> 01:51:28.500
But I don't think it's standardized yet.
01:51:29.291 --> 01:51:30.500
Not that I know of.
01:51:30.500 --> 01:51:31.916
And you would probably know better anyway.
01:51:32.832 --> 01:51:36.582
Yeah, but as I said, there are all these specifications I have never even seen yet.
01:51:38.375 --> 01:51:41.457
Some kind of conspiracy where people just keep making them without telling anyone.
01:51:43.291 --> 01:51:44.916
He has like a 300-page document.
01:51:44.916 --> 01:51:45.625
Go have fun with it.
01:51:45.625 --> 01:51:47.750
Yeah, it was there the whole time.
01:51:47.750 --> 01:51:48.207
You're crazy.
01:51:50.207 --> 01:51:51.916
Give slight gaslight vibes.
01:51:52.416 --> 01:51:52.625
Right.
01:51:54.832 --> 01:51:55.041
Slight.
01:51:57.750 --> 01:52:00.000
But yeah, I do feel like that sometimes a little bit.
01:52:00.207 --> 01:52:01.082
I bet.
01:52:01.082 --> 01:52:01.707
I bet.
01:52:04.082 --> 01:52:05.791
No, but I think it's hard to predict.
01:52:06.166 --> 01:52:07.000
What do you think?
01:52:07.041 --> 01:52:11.666
I was just saying, I think the interaction model is 100% going to change.
01:52:12.000 --> 01:52:27.957
I think it's going to be, again, purely theoretical, but I think a lot of mouse-keyboard interaction is going away for probably more voice and also less directed, where it's more like conversational instead of like, I want X.
01:52:28.916 --> 01:52:30.707
It's more like, well, what do you think?
01:52:31.125 --> 01:52:31.625
Like, right?
01:52:32.000 --> 01:52:32.125
Yeah.
01:52:33.625 --> 01:52:38.375
How this completely impacts the web, I have no idea.
01:52:38.375 --> 01:52:47.416
I can see, I can't see a future where websites go away for MCP, LLM interactions, something like that.
01:52:47.416 --> 01:52:59.332
if I think about PayPal, for instance, I don't see the need to open an app or something if I have an MCP that could be like, hey, transfer X amount of money to Andreas.
01:53:00.250 --> 01:53:14.166
Whereas, on the other hand, though, sometimes you want this experience, so I think it's also going to be like a business to business decision.
01:53:14.166 --> 01:53:17.250
I completely agree with you.
01:53:17.250 --> 01:53:18.291
It's very hard to predict.
01:53:18.291 --> 01:53:21.041
I see a couple things where it's like, I could see it swing this way.
01:53:21.500 --> 01:53:27.875
I mean, if we look at HoloLens, for instance, like, mixed reality never really become a big thing.
01:53:29.000 --> 01:53:39.041
So it might also just be like, MCP is a big hype right now, and it turns out to be great for 5% of the use cases, and that's what they're going to be used for.
01:53:39.041 --> 01:53:43.000
So I think things are about to change.
01:53:43.000 --> 01:53:45.250
I think we can all agree on that.
01:53:45.707 --> 01:53:50.416
How it actually changed, and what the concrete impact is, I think.
01:53:51.957 --> 01:54:00.416
I do call massive bullshit on when people say, particularly Big Corp, where they're like, oh, 60% of the code in our company is written by AI.
01:54:01.041 --> 01:54:03.207
I call massive bullshit on that.
01:54:06.125 --> 01:54:11.500
Yeah, or what was it, Klarna, or some company like that, said they've frozen all hiring?
01:54:13.166 --> 01:54:15.041
It's going to be all AI from now on?
01:54:15.457 --> 01:54:24.875
I think one company had their complete support replaced by AI, and then within a month or two hired them back.
01:54:24.875 --> 01:54:26.791
I'm like, no one saw that coming.
01:54:27.250 --> 01:54:27.750
No one.
01:54:28.791 --> 01:54:29.041
Right.
01:54:30.207 --> 01:54:36.416
I like it as a tool to make my workflow more efficient.
01:54:36.666 --> 01:54:39.125
That's, I think, huge, huge.
01:54:39.125 --> 01:54:51.875
And for that sake, I do think if you had a project that you maybe needed to staff two developers on, there might be a way to do this with one developer in the future.
01:54:52.791 --> 01:54:58.750
I don't see a future, at least with the way things are right now, where it's like a complete one-to-one replacement.
01:54:58.750 --> 01:55:04.957
I just, it's too off, it's too arbitrary sometimes.
01:55:04.957 --> 01:55:13.416
I literally had an interaction with Claude where I shared a blog post and was like, hey, can you give me more information on that?
01:55:13.416 --> 01:55:17.666
It was like a note package in like a certain version.
01:55:17.666 --> 01:55:20.916
And Claude was like, there are no information about this package on the web.
01:55:20.916 --> 01:55:23.750
And I'm like, I literally sent you the blog post.
01:55:23.750 --> 01:55:24.707
It's attached here.
01:55:25.082 --> 01:55:25.916
What are you saying?
01:55:26.832 --> 01:55:33.416
So it's like interactions like that where I'm getting very humble and be like, okay, we still have a job for a foreseeable future.
01:55:34.125 --> 01:55:34.832
Yeah.
01:55:36.000 --> 01:55:41.250
I remember Steve Jobs used to say that the PC was like a bicycle for the mind.
01:55:42.041 --> 01:55:45.207
And I feel like it's a bit like that again.
01:55:46.832 --> 01:55:47.041
Yeah.
01:55:48.041 --> 01:55:51.541
It just allows you to extend yourself in new directions.
01:55:53.125 --> 01:56:01.666
And with programming, at least I found that it makes tasks approachable that previously I would have said like, oh, that's too much like busy work.
01:56:02.125 --> 01:56:06.041
Too much like, repetitive typing that's not really automatable.
01:56:07.000 --> 01:56:10.041
And AI can make that trivial, which I love.
01:56:10.457 --> 01:56:10.707
Yeah.
01:56:10.707 --> 01:56:12.332
But it's a tricky space.
01:56:12.332 --> 01:56:15.082
You know, like you see what happened with cryptocurrency.
01:56:16.125 --> 01:56:20.582
You know, like now that the dust has settled and we can sort of see what the lasting use cases are.
01:56:22.166 --> 01:56:27.000
Now, that's not to say that, oh, I think that those are comparable technologies.
01:56:27.000 --> 01:56:33.541
But like, I think we're in similar levels of hype right now that we once saw the currency.
01:56:33.916 --> 01:56:38.082
I had an episode on AI on this podcast and I draw the same conclusion.
01:56:38.291 --> 01:56:45.000
I think AI has much more application scenarios than crypto and Web3 has.
01:56:45.500 --> 01:56:47.625
But the hype is very comparable right now.
01:56:48.166 --> 01:56:54.375
Like the evaluations that are coming in right now for AI startups are just insane.
01:56:55.207 --> 01:56:55.582
Oh, yeah.
01:56:56.166 --> 01:57:00.166
And for sure, like 10% of them might survive for a couple of years.
01:57:00.541 --> 01:57:02.707
I think 10% is already very generous.
01:57:03.207 --> 01:57:04.000
Yeah, probably.
01:57:04.582 --> 01:57:09.375
Particularly if I look at the cost associated with AI, I'm like, cool.
01:57:10.707 --> 01:57:10.957
Yep.
01:57:11.666 --> 01:57:15.500
We have a complete new ban of salary popping up out of nowhere.
01:57:16.416 --> 01:57:18.166
That is unheard of before.
01:57:18.707 --> 01:57:20.707
So I, yeah.
01:57:22.375 --> 01:57:23.291
Interesting times.
01:57:24.082 --> 01:57:25.291
What is that thing they say?
01:57:25.291 --> 01:57:26.666
May you live in interesting times?
01:57:26.957 --> 01:57:29.082
I feel like we are doing that.
01:57:30.250 --> 01:57:30.541
For sure.
01:57:31.625 --> 01:57:32.666
I, yeah.
01:57:34.125 --> 01:57:38.500
Before we wrap things up slowly, I want to circle back a little bit towards Lady Bird.
01:57:38.500 --> 01:57:49.916
And I think the, you shared, I mean, it's an open source project, so you're, I don't think you could be any more transparent, but you also shared your roadmap, what your timeline is.
01:57:49.916 --> 01:57:55.207
Because the last thing, well, the moment I heard about Lady Bird, I was like, oh, I should install this thing.
01:57:55.207 --> 01:57:59.541
And then it was like, I saw the GitHub page and was like, well, here's how you compile it from scratch.
01:57:59.541 --> 01:58:01.500
And I was like, yeah, I'm not going to do this.
01:58:02.957 --> 01:58:03.332
Yeah.
01:58:04.291 --> 01:58:11.625
I think if I saw that correctly, your goal for 2026 is to have an installable version for Mac and Linux.
01:58:12.791 --> 01:58:13.000
Yeah.
01:58:13.207 --> 01:58:16.207
So in 26, we want to do an alpha version for Mac and Linux.
01:58:17.832 --> 01:58:22.332
That's what our full-time engineering staff is currently working towards.
01:58:22.332 --> 01:58:24.750
And that will be an alpha version.
01:58:25.291 --> 01:58:37.082
So it's like going to have stability issues, but it will be something that you can install and then complain that your local pizza place is not rendering correctly, which is exactly what we want to happen.
01:58:37.082 --> 01:58:40.000
We want to find out all the sites that don't work.
01:58:40.666 --> 01:58:54.082
And then in 2027, we're going to do a beta version, which essentially is like more of the same, but aiming for a higher degree of stability and a broader user base, perhaps with slightly lower tolerance for bullshit on our part.
01:58:55.082 --> 01:58:59.416
And then in 28, we want to do a first 1.0 release.
01:59:00.416 --> 01:59:06.666
And, you know, depending on who you ask, this is either an insanely slow or an insanely fast timeline.
01:59:06.957 --> 01:59:09.957
People who have worked on browsers, they tend to say, what are you doing?
01:59:09.957 --> 01:59:11.291
Like you need at least five more years.
01:59:11.666 --> 01:59:16.416
But I think we have to set some kind of timeline.
01:59:16.416 --> 01:59:18.500
And I think this is doable.
01:59:19.375 --> 01:59:26.666
And we are finding that at least so far, we've been able to make great progress, good velocity.
01:59:27.791 --> 01:59:45.375
And we'll just see what kind of shape we are in next year when we put out the alpha and we start getting like way more sort of reports of problems and see what that stream of incoming bugs looks like and adapt from there.
01:59:45.375 --> 01:59:47.207
but I don't know.
01:59:47.375 --> 01:59:50.207
This hasn't really been done before.
01:59:50.666 --> 01:59:53.041
So we're just going to have to see how it works.
01:59:53.707 --> 02:00:02.957
I think this is one of the things where if you don't set a timeline, you very easily tend to die in beauty where it's like there will always be something to do.
02:00:03.166 --> 02:00:06.666
There will always be something not working or always something that could work better.
02:00:07.541 --> 02:00:07.625
Yeah.
02:00:07.832 --> 02:00:16.707
So I think setting a timeline that might be realistic, maybe a little bit on the edge of optimistic, I think is healthy for a project like this.
02:00:17.457 --> 02:00:17.666
Yeah.
02:00:18.000 --> 02:00:26.916
That was my feeling about this whole thing that we have to set a timeline that's aggressive but possible or in the realm of possible.
02:00:28.707 --> 02:00:33.207
But so you mentioned that like if you go to our GitHub, it says right now, here's how to compile it.
02:00:34.041 --> 02:00:36.166
It's like a little bit abrasive on purpose.
02:00:36.166 --> 02:00:54.000
so that because right now we're not equipped to handle the like barrage of bug reports that would come if we had an installable binary because, you know, most of the web will break in some way.
02:00:55.082 --> 02:01:04.291
But we're hoping that, you know, by this time next year or at some point next year, 2026 is a very wide window for alpha.
02:01:04.291 --> 02:01:16.041
But at some point next year, we'll put out something installable that will work reasonably well with the major popular websites.
02:01:16.666 --> 02:01:23.750
And then the long tail of smaller websites is going to be a big challenge that we then take on.
02:01:24.082 --> 02:01:27.707
Do you have like a checklist more or less?
02:01:27.707 --> 02:01:34.332
Like those are the things that are left to do before we can do an alpha release or how does that road to alpha look like?
02:01:35.457 --> 02:01:42.582
So we have a big document that we're working on with all the full-time people.
02:01:42.832 --> 02:01:47.707
Like here's like the giant list of tasks that I'm responsible for for the alpha.
02:01:48.707 --> 02:01:53.832
But we want to formalize that a little bit and make it more of a public document that we're working towards.
02:01:54.582 --> 02:01:56.375
It just needs to be cleaned up and edited.
02:01:56.375 --> 02:02:09.791
And I guess it's like it's a little bit scary to overcommit to features because we don't always anticipate correctly how much work something will take.
02:02:10.000 --> 02:02:10.375
I bet.
02:02:10.707 --> 02:02:11.625
As every developer.
02:02:12.666 --> 02:02:13.791
Yeah, as every developer.
02:02:13.791 --> 02:02:15.000
It's not a unique problem.
02:02:16.207 --> 02:02:21.957
No, we've just been a little bit apprehensive about making this process more public.
02:02:21.957 --> 02:02:23.500
But really we should just make it more public.
02:02:23.500 --> 02:02:25.166
There's no reason not to.
02:02:25.166 --> 02:02:27.041
It's more like just a little bit spooky.
02:02:27.457 --> 02:02:27.707
Yeah.
02:02:28.791 --> 02:02:31.707
It's a nice comfy safety blanket.
02:02:33.000 --> 02:02:33.541
Yeah, exactly.
02:02:34.791 --> 02:02:41.791
No, but so what we really have is like a list of features that we want to work in the browser and a list of websites that we want to work.
02:02:42.166 --> 02:02:42.416
Okay.
02:02:43.250 --> 02:02:45.457
And like assignees for all of these.
02:02:45.457 --> 02:02:58.000
But ultimately what we really want to do is target like the major websites that people use, the boring ones you know like Facebook, Twitter, Instagram, whatever.
02:02:59.166 --> 02:03:00.582
YouTube is a big scary one.
02:03:00.957 --> 02:03:01.416
Oh, I bet.
02:03:01.416 --> 02:03:08.166
Because we would love to do YouTube but at the same time I don't know if it's realistic that we can have it performing well.
02:03:08.957 --> 02:03:10.707
That depends on a lot of factors.
02:03:12.041 --> 02:03:20.332
And then there are also some really popular but things with other complications like Netflix because they would require some kind of DRM in order to play.
02:03:20.332 --> 02:03:27.791
which is like a whole Pandora's box in itself that we haven't confronted yet.
02:03:29.000 --> 02:03:29.666
But all in due time.
02:03:30.666 --> 02:03:33.500
Just have to go one step every day.
02:03:34.375 --> 02:03:36.791
I have one more question actually.
02:03:37.082 --> 02:03:42.666
Is there like do you have like a target group defined for Ladybird?
02:03:43.707 --> 02:03:58.832
Because like it does influence the sites that you might pick as like a startup or for a start and for an alpha I personally would assume that the most likely people that are attracted to something like Ladybird are other developers.
02:03:59.750 --> 02:03:59.875
Yeah.
02:04:01.416 --> 02:04:01.750
For sure.
02:04:02.291 --> 02:04:02.416
Yeah.
02:04:02.666 --> 02:04:10.000
So like the you know the gold star sites in the beginning or whatever you call them would be like GitHub, GitLab.
02:04:10.250 --> 02:04:10.457
Okay.
02:04:10.875 --> 02:04:14.500
Like those kind of things because those are the people who are going to be testing it.
02:04:14.791 --> 02:04:15.041
Yeah.
02:04:15.041 --> 02:04:15.416
Okay.
02:04:15.416 --> 02:04:20.832
And then you know the target audience gets progressively less nerdy as 1.0 approaches.
02:04:22.166 --> 02:04:26.582
But I don't know if you remember when Firefox came out back in the day.
02:04:27.207 --> 02:04:28.041
Way before my time.
02:04:28.250 --> 02:04:29.041
Way before your time.
02:04:29.041 --> 02:04:29.250
I'm not that old.
02:04:30.125 --> 02:04:30.750
Got it.
02:04:31.957 --> 02:04:32.582
Yeah.
02:04:32.582 --> 02:04:32.791
Okay.
02:04:34.125 --> 02:04:55.791
Well I'm that old and I remember when it came out and it was like this spontaneous movement that formed that like you were a nerd and you were excited about Firefox so you try to get the less nerdy people in your life to try it out because it was just something you got excited about.
02:04:56.207 --> 02:04:56.416
Yeah.
02:04:56.582 --> 02:04:56.791
Yeah.
02:04:57.416 --> 02:04:57.500
Okay.
02:04:57.750 --> 02:05:05.832
And I imagine that that kind of thing can happen again if you just give nerds something to be excited about.
02:05:06.332 --> 02:05:06.500
Yeah.
02:05:07.125 --> 02:05:09.750
You need to find the right hit the right spot.
02:05:10.125 --> 02:05:10.416
Yeah.
02:05:10.416 --> 02:05:10.791
I don't know.
02:05:11.832 --> 02:05:14.125
It was a nice little cultural moment.
02:05:14.125 --> 02:05:15.707
Maybe the cultural moment is totally gone.
02:05:16.041 --> 02:05:18.875
Nobody's going to care about a browser in that same way again.
02:05:19.707 --> 02:05:20.750
Or maybe they will.
02:05:20.750 --> 02:05:21.332
I don't know.
02:05:21.750 --> 02:05:22.457
But yeah.
02:05:22.457 --> 02:05:24.666
I would love to see that kind of thing happen again.
02:05:26.791 --> 02:05:35.041
I think you know like right now it does feel that there's a spontaneous surge of excitement around Linux happening recently.
02:05:36.541 --> 02:05:36.707
Fair.
02:05:36.707 --> 02:05:42.041
which almost feels like it came out of nowhere.
02:05:42.041 --> 02:05:57.666
But like people are just hyped on Linux and you see what's his name DHH and PewDiePie and these people with a large audience making like being really excited about Linux.
02:05:58.457 --> 02:06:04.250
And it's fun to see that and makes you wonder what else people might get excited about.
02:06:04.250 --> 02:06:19.625
Well I truly wish you nothing but success with this whatever success means to you because I think that with like a non-profit involved success looks very different than a startup with defined success.
02:06:20.541 --> 02:06:29.207
I think what you're doing is wonderful as a developer this is everybody's dream in a way like it's truly open source.
02:06:29.457 --> 02:06:31.916
It's an embodiment of that idea.
02:06:32.582 --> 02:06:33.957
So thank you.
02:06:34.207 --> 02:06:35.166
Thank you very much for doing this.
02:06:36.166 --> 02:06:36.416
Sure.
02:06:36.832 --> 02:06:48.625
Yeah and I will say success for us really comes down to we make a browser and some people love it and they use it and we get to keep making it and everybody's happy.
02:06:49.416 --> 02:06:53.082
That sounds awesome to be so far.
02:06:53.082 --> 02:06:53.291
fun.
02:06:53.457 --> 02:06:57.707
Thank you so much for coming on this.
02:06:57.707 --> 02:06:58.625
I really appreciate you.
02:06:58.832 --> 02:06:59.082
Thank you.
02:06:59.500 --> 02:07:00.166
Yeah sure.
02:07:00.166 --> 02:07:00.791
Thank you for having me.
02:07:01.291 --> 02:07:01.625
Anytime.
02:07:03.082 --> 02:07:06.082
When you have the alpha out or something we got to talk again about this.
02:07:06.375 --> 02:07:10.291
I could talk about all the details for hours.
02:07:11.250 --> 02:07:14.457
Absolutely and we'll see which ones of your favorite websites don't work.
02:07:15.625 --> 02:07:16.791
What we can do about it.
02:07:19.000 --> 02:07:19.166
Awesome.
02:07:19.416 --> 02:07:19.666
Thank you.
02:07:20.500 --> 02:07:21.125
See you next time.
02:07:21.125 --> 02:07:21.750
Bye.
02:07:23.416 --> 02:07:23.541
Later.