ladybird

Application

LadybirdBrowser/ladybird

An independent web browser with a novel engine built on web standards.

Overview

Ladybird is a truly independent web browser using a novel engine based on web standards. It features a multi-process architecture with sandboxed renderer processes, out-of-process image decoding and networking, and components inherited from SerenityOS such as LibWeb and LibJS. Currently pre-alpha, it runs on Linux, macOS, Windows via WSL2, and other Unix-likes.

README Preview

# Ladybird\n\n[Ladybird](https://ladybird.org) is a truly independent web browser, using a novel engine based on web standards.\n\n> [!IMPORTANT]\n> Ladybird is in a pre-alpha state, and only suitable for use by developers\n>\n\n## Features\n\nWe aim to build a complete, usable browser for the modern web.\n\nLadybird uses a multi-process architecture with a main UI process, several WebContent renderer processes,\nan ImageDecoder process, and a RequestServer process.\n\nImage decoding and network connections are done out of process to be more robust against malicious content.\nEach tab has its own renderer process, which is sandboxed from the rest of the system.\n\nAt the moment, many core library support components are inherited from SerenityOS:\n\n- LibWeb: Web rendering engine\n- LibJS: JavaScript engine\n- LibWasm: WebAssembly implementation\n- LibCrypto/LibTLS: Cryptography primitives and Transport Layer Security\n- LibHTTP: HTTP/1.1 client\n- LibGfx: 2D Graphics Library, Image Decoding and Rendering\n- LibUnicode: Unicode and locale support\n- LibMedia: Audio and video playback\n- LibCore: Event loop, OS abstraction layer\n- LibIPC: Inter-process communication\n\n## How do I build and run this?\n\nSee [build instructions](Documentation/BuildInstructionsLadybird.md) for information on how to build Ladybird.\n\nLadybird runs on Linux, macOS, Windows (with WSL2), and many other \*Nixes.\n\n## How do I read the documentation?\n\nCode-related documentation can be found in the [documentation](Documentation/) folder.\n\n## Get in touch and participate!\n\nJoin [our Discord server](https://discord.gg/nvfjVJ4Svh) to participate in issue and development discussions.\n\nPlease read [Getting involved with Ladybird](Documentation/GettingStartedContributing.md) if you're new to Ladybird and want to help.\n\nBefore opening an issue, please see the [issue policy](CONTRIBUTING.md#issue-policy) and the [detailed issue-reporting guidelines](ISSUES.md).\n\nThe project participatio

FAQ (5)

Troubleshooting
How to fix Ladybird RequestServer crashing on startup with “database disk image is malformed”?

The HTTP disk cache database is corrupted. Close Ladybird, then delete the cache directory and restart:

rm -rf ~/.cache/Ladybird

If you set a custom cache location, delete $XDG_CACHE_HOME/Ladybird instead. Ladybird will rebuild the cache automatically. Removing ~/.config/Ladybird is not necessary because that stores configuration, not the disk cache.

A code fix in newer builds propagates CacheIndex initialization errors instead of crashing RequestServer, but clearing the corrupted cache remains the immediate workaround.

GitHub Issue #12057
Troubleshooting
Why does Ladybird show "Unable to resolve host" after the first page load when using Pi-hole or a custom DNS server?

This is caused by expired DNS address records remaining in Ladybird's cache. With very short TTLs, the A/AAAA record can expire while the parent CNAME record is still cached, so a later lookup follows the CNAME but finds no usable IP address. The fix is the LibDNS/RequestServer change titled "Forget about fully expired RRs" (fixes issue #12215). Update Ladybird to a build containing that fix and rebuild, for example with git pull && ./Meta/ladybird.py run. As a temporary workaround, go to about:settings → Network, switch from Custom DNS to the system/default resolver, and restart Ladybird.

GitHub Issue #12215
Troubleshooting
How to fix Ladybird SIGILL at ICU.h:104 when Intl.NumberFormat.formatRangeToParts receives an empty array?

This crash is triggered by Intl.NumberFormat().formatRangeToParts(0, []). Ladybird passes the empty array to ICU decimal conversion, ICU returns U_DECIMAL_NUMBER_SYNTAX_ERROR, and verify_icu_success() in ICU.h:104 aborts with SIGILL instead of producing a JavaScript-level completion.

Fix: update/rebuild Ladybird to a version containing the PR "LibUnicode+LibJS: Throw instead of aborting on Intl input ICU refuses." The patch prevents invalid ICU input from crashing the native runtime.

Workaround on affected builds: convert both endpoints to JavaScript numbers before calling the API, since Number([]) is 0:

const nf = new Intl.NumberFormat();
nf.formatRangeToParts(Number(0), Number([]));

Or in a wrapper:

function safeFormatRangeToParts(nf, start, end) {
    return nf.formatRangeToParts(Number(start), Number(end));
}

Do not pass arrays or other non-primitive endpoints directly to affected Ladybird versions.

GitHub Issue #12308
Troubleshooting
How to fix Ladybird crashing when DevTools disconnects with `VERIFY(m_devtools_client_count > 0)`?

This crash occurs because DevTools client state can get out of sync with the tab's current page, especially when attaching DevTools to a page such as mail.google.com. It is fixed by the LibWebView/LibWeb change that keeps DevTools state synchronized with the tab's page. Upgrade Ladybird to a release or build containing that fix. As a workaround on Ladybird 1.0, avoid attaching or repeatedly disconnecting DevTools from the affected tab and restart Ladybird after the crash.

GitHub Issue #12521
Troubleshooting
Why is the "Read more" button missing for long YouTube comments in Ladybird?

This is caused by Ladybird's old -webkit-line-clamp implementation: clamped content was not included in scrollable overflow, so scrollHeight incorrectly returned the same value as clientHeight. YouTube uses these values to detect truncated comments, so it assumed there was nothing to expand and hid the "Read more" button. The Battery Status API errors in the console are unrelated. The fix is the LibWeb change "Keep clamped -webkit-line-clamp content in scrollable overflow," which lays out and measures the hidden clamped content like Firefox does. Update Ladybird to a build containing that PR and rebuild. As a temporary workaround, open the video/comment in Firefox or another browser.

GitHub Issue #12199