Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/ladybirdBrowser/ladybird/llms.txt

Use this file to discover all available pages before exploring further.

Ladybird is designed with portability in mind, but porting it to a new operating system or user-interface framework is a significant engineering undertaking. This document explains the two kinds of ports — UI ports and platform ports — describes what is currently supported and community-maintained, and outlines the concrete steps required to create each type.
Porting is a substantial undertaking. Before starting, familiarise yourself with the AK and LibCore libraries, the WebView layer, and any platform-specific considerations described below. Coordinate early on Discord to avoid duplicating work.

Types of Ports

There are two independent dimensions of porting:
Port typeWhat it covers
UI portThe browser frontend: window chrome, tabs, address bar, and all user-visible UI
Platform portOS-level abstractions: file I/O, networking, process management, and IPC plumbing
A new UI port can be built on top of an existing platform port, and vice versa. They do not have to be done together.

Current Support Status

There are currently two supported UI ports:
  • Qt6 — The generic, cross-platform UI port built on Qt 6.
  • AppKit/Cocoa — The macOS-native port, built on Apple’s AppKit framework.
Both are officially supported and tested in CI.

Porting Steps

UI ports concern themselves with the main Ladybird browser process and everything the user sees. The core interface is the WebView layer in LibWebView.

1. Implement WebView::ViewImplementation

ViewImplementation is the primary bridge between the UI process and the WebContent processes. Each browser tab is expected to have its own WebContent process; the WebView layer manages this multiplexing. Your new UI port must provide a subclass of WebView::ViewImplementation that handles all communication between the UI layer and the WebContent processes.

2. Subclass WebView::Application

Each UI port must also subclass WebView::Application to register any UI-specific command-line flags and perform any UI-level initialisation.

Summary

The minimum surface area for a new UI port is:
  • A WebView::ViewImplementation subclass (one instance per tab)
  • A WebView::Application subclass (one instance per browser process)

Getting Help

If you are working on a port, the best place to coordinate with the maintainers and community is the Ladybird Discord server. Check whether someone else is already working on the same target platform before starting, and share progress early to gather feedback on your approach.

Build docs developers (and LLMs) love