Why we are building a new browser from scratch
A few years ago, I grew deeply frustrated with the state of the current IT and technology landscape. Monopolies are everywhere, with massive companies shaping the internet for their shareholders rather than for users. Since I'm not the type of person to organize protest marches or rally a crowd, my options for doing something about it felt very limited.
But I'm a programmer... I can do programming stuff.
So I decided to write a browser from scratch, in Rust, without having any experience in writing browsers nor experience in Rust. And against all odds, two years later, Gosub is still here.
The goals we set are pretty high. We want to build a browser that is written from scratch and without using an existing engine. We want a browser that is not being controlled by big corporations or greed. We aim for a browser free from legacy complexity, and we want it to be modular and easily reusable for others to implement their own ideas based on top of ours.
This means we are not cloning Chromium and slapping on our own skin. We are literally building the whole browser from the ground up. We need a HTML5 parser, a CSS3 parser, a layout and render engine, an engine to tie everything together, and a JavaScript engine. We are using v8 for now, but external work is underway for a custom JS engine. And there are a ton of other components needed for a fully-functional browser we need to write. It's a huge project where a small army of developers is needed.
I totally agree that this is very ambitious. Our goal is not to release a browser that can immediately compete with the giants, but we first want a browser that can be used for simple sites and pages. That might seem like a very small step, but it should prove that we can pull it off.
Now for some practical details. How big is our team? Currently, it's just two people. That's not enough. In the early days we had more curious contributors helping out, but life, jobs, interests, and ideas drift. That’s normal. And we have many people lurking around in our Zulip chat, which is always nice.
Over the last few years, our understanding of how a browser truly works has grown enormously. We’re no longer just learning: we’re experimenting, prototyping, and exploring new ideas that feel right to us, even if they haven’t been battle-tested yet. We’re not interested in recreating an existing browser line-by-line. Instead, we’re trying to discover better approaches, cleaner designs, and more modular systems that make sense for a browser built today.
This comes with a deliberate choice: we leave out anything that doesn’t matter right now. We don’t worry about HTML4 quirks or non-UTF-8 encodings. Not because we’ll never support them, but because our focus is on building a foundation that’s easy to extend later. Modularity is at the heart of everything: every major subsystem should be replaceable, upgradable, and swappable without rewriting the entire engine. That vision drives every design decision we make.
At this stage, we’re assembling a lot of smaller pieces that will ultimately form a much larger whole. We don’t pretend to have the complete picture yet, but each piece we finish fits into the puzzle in a way that makes the final image clearer. And honestly, it’s extremely rewarding to see this grow: watching a document tree evolve into a full DOM model, or parsing real-world CSS from top websites, or watching our engine glue components together in ways we didn’t think were possible a year ago.
We have made some big accomplishments over the last 2 years: an HTML5 parser that successfully passes the full libhtml5 test suite, giving us a solid foundation for handling modern markup. We’ve also built a CSS3 parser that can already turn real-world CSS syntax into structured stylesheets; it still needs plenty of work, but it proves the architecture and gives us room to grow. For the styling layer, we’re even considering integrating systems like Stylo as an additional CSS System, simply because the rest of the engine is modular enough to support it. But currently we are a bit short on resources.
We have a global engine system that lets all major components fit together cleanly and predictably, and we’ve already run several encouraging GTK-based browser experiments. Our new API that will form the communication between the engine and any user-agents / frontends feels like one of our strongest designs yet: simple, flexible, and powerful enough to expose engine internals safely to host applications. We can export the API to Python and other languages to even write the browsers in those languages, while still having the engine run at full-speed (and safely) compiled Rust. The render and layout pipeline is shaping up as well, capable of driving multiple backends — Vello, GTK, Skia and others - thanks to the same modular design that guides the rest of the project.
Along the way, we’ve also built various supporting systems such as config stores, cookie management, and other infrastructure pieces. These aren’t the main priority at this stage, but building them taught us a lot and helps round out the experience of assembling an engine from scratch.
Individually, these pieces may look like experiments. Together, they form the early shape of a real browser engine. We’re not browsing Hacker News end-to-end quite yet—but we’re surprisingly close. And with a few more pieces connected, we’ll reach a milestone that’s exciting not just for us, but for anyone who wants to see a new, independent browser engine come to life.
So, what is our future? We want to rekindle the fire of Gosub a little bit. Things go at a slow pace at the moment, and sometimes we feel the excitement slip away. We are inviting developers who would like to help us with this project. You don't need to be an Rust expert or know every ins and outs of browsers, but it would be nice to have a larger team working on multiple components at the same time. And before you ask, yes, we could take our time and invest it into other systems like Servo or Ladybird, but the desire to create a true alternative is one of the main reasons we are working on this in the first place.
Diversity is the key to survival.
So come join us on our Zulip chat and say hi (https://chat.developer.gosub.io) or take a look at our repo (https://github.com/gosub-io/). We're happy to answer your questions!
About jaytaph
Codemuser extraordinaire
Loves building crazy and insane stuff. Happiest when left alone. All I wanted was a Pepsi, just a Pepsi.
| Joined: | March 24, 2023 |
| Following: | 3 |
| Followers: | 3 |
| Posts: | 59 |
| Comments: | 3 |
| Upvotes: | 5 |
Previous musings
- (1) January 2026
- (1) December 2025
- (1) April 2025
- (1) March 2025
- (1) February 2025
- (2) January 2025
- (2) December 2024
- (1) November 2024
- (1) October 2024
- (1) September 2024
- (1) July 2024
- (2) February 2024
- (3) January 2024
- (3) December 2023
- (4) November 2023
- (5) October 2023
- (10) September 2023
- (8) August 2023
- (1) June 2023
- (1) May 2023
- (4) April 2023
- (5) March 2023