Behind the Scenes of Verso Browser Development

Wu Yu Wei published on
7 min, 1269 words

In the past few months, we are trying to evaluate Servo web engine and see if we could build a proper web browser application. In this post, I’d like to share some insights into the challenges we’re tackling, and where we are in the journey to transform Servo from a web engine into a fully functional, user-friendly browser.


Why Build Verso? From Servo Minibrowser to a Stable Application

Servo itself is a powerful and modern web engine, but it has traditionally not been treated as a fully functioning browser. Instead, the Servo project provides a minimum working example called servoshell, often described as a mini-browser, mainly serving as a testing ground for the engine’s capabilities.

Our vision with Verso is to take this starting point and gradually expand it into a formal, stable, and feature-rich browser — something that ordinary users would comfortably use as their daily web browser. The goal is to build an application on top of Servo that delivers a native, complete browsing experience.

By attempting to implement a fully functional browser with Verso, we also identify gaps and missing features in Servo itself. This creates a win-win situation: as we build out needed capabilities in Verso, we contribute improved implementations and bug fixes back upstream to Servo, strengthening the engine for the entire community.

This long-term ambition is why you’re seeing the broad scope of features we’ve implemented recently—from window management and menus to prompt dialogs and notifications.


The Big Picture: Engine Versus Browser Responsibilities

One key motivation behind building Verso as its own separate repository is to cleanly separate concerns:

  • Servo should stay focused primarily on what it does best—the web engine itself. This includes implementing web standards, improving style, layout, and web APIs.

  • Everything else that builds a full browser experience — windowing, UI, user interactions, menus, file dialogs, bookmarks, history, notifications, and more — should left for embedders to decide.

This approach not only prevents Servo from being bogged down with application-level chores but also helps distribute resources and responsibilities clearly across projects and teams.


Recent Development Highlights from Our Perspective

Working on Verso, I’ve had the opportunity to collaborate closely with Jason, TeKai, and others. Here are some key features and improvements we’ve tackled recently, reflecting our progress toward a full-fledged browser.


Borderless Window Dragging

A simple but critical UX feature was missing from the minibrowser — the ability to drag and maximize a borderless window smoothly across platforms.

The tricky part is that borderless windows lose native dragging features on Linux and Windows, and on macOS, the draggable area was limited and inconsistent.

We had to reimplement dragging from scratch, carefully ensuring the drag functionality wouldn’t interfere with dynamic UI elements like panels. On macOS, we tracked down subtle bugs to provide a reliable, uniform dragging experience (issue #192).


Context Menus

Context menus are a cornerstone of desktop usability. But context menu support across OSes is fragmented:

  • Windows/macOS offer native context menu, for which we leveraged the muda crate — originally developed for Tauri — adapting and improving it to fit Verso’s context menu needs (PR #226).

  • On Linux, especially with Wayland, native context menus are not available. We opted to draw menus inside Servo itself using an embedded webview (PR #237).

This hybrid approach took around three weeks of work and allows us to provide native-like context menus on all platforms.

In the meantime, Working closely with the Servo upstream, we also marked the first pointer event API implementation inside Servo itself.

This was a multi-month effort involving the team, laying a foundation for many UI features, including the later improved context menu (Servo PRs #34437, #35364).


Prompt Dialog Support

From simple confirm dialogue to authentications prompt dialogue is used everywhere, which makes it a fundamental API that users expect to work flawlessly.

Jason took the lead on implementing these dialogs across platforms (PR #250).


Tabs for Multi-Page Browsing

Tabs are a defining feature of any modern browser. Jason dived straight into adding tabs for Verso, building both the core logic and the panel UI (PR #260, panel PR #10).

With this we have tabs work smoothly on all desktop platforms, including creation via keyboard shortcuts.


IME Input Events

Input Method Editor (IME) support is crucial for many users worldwide. Languages like Japanese and Chinese relied heavily on IME support.

We contributed multiple PRs to Servo and Verso that handle pre-edit text, caret positioning, and related operations, ensuring IME input flows correctly and synchronizes with the UI (Servo PRs #35535, #35623 and Verso PR #282.


File Input Dialog Support

File inputs require integration with native file pickers.

We enhanced Servo’s FileSelection embedder message to properly display file counts and names, sorted out related testing issues, then integrated native file dialogs in Verso (Servo PR #35789, Verso PR #286).


Notifications with WebAPI Support

Notifications are an important part of modern web applications.

We added basic Notification and NotificationEvent WebAPI support to Servo, including image caching for notification icons (Servo PRs #34842, #35878, #36055). On Verso, we integrated a third-party library to render platform-native notifications across Linux, Windows, and macOS (Merge Request #308).


Caret and Text Selection display in Text Input

We contributed to Servo’s text input and textarea elements to ensure caret and selection display matches the layout, (Servo PR #35830).


Browsing History and Bookmarks in Profile Config

We started to build out essential browser infrastructure:

  • Adding a history menu accessible by long-pressing navigation buttons, rendered on top of Servo webviews for cross-platform consistency (Panel PR #11, Verso MR #322).

  • Implementing bookmark management through panel UI and backend interaction, allowing users quick access to favorite sites (Panel PR #13, Verso MR #327).


What's next?

Our work on Verso seeks for modularity of Servo and hope to improve its ecosystem. One of the major milestones we wish to achieve is to make more Servo components modular and able to be used in other projects. This is also why we have some good news from Tauri community on Verso integration.

Sine we've added multiple application features mentioned above, we are confident it's possible to evolve Verso into a mature application one day. But before that, I think it's also a good time to look back into windowing and rendering management again as we encountered some blockage from time to time.

What's worrying me is Servo's webrender is still using OpenGL, while many other projects have moved to wgpu. I hope we could also get a solid wgpu backend one day, so Servo can collaborate with more projects. In the next few month, I'll share more info on my progress and see what we could do.