<!-- mobian-agent-page publisher="dailydev" canonical="https://daily.dev/posts/this-month-in-ladybird-jevgsot1j" -->

---
title: This Month in Ladybird | daily.dev
description: Ladybird&#x27;s February update reveals the browser project removed all Swift code and replaced its LibJS frontend (lexer, parser, AST, scope collector, bytecode...
canonical: https://daily.dev/posts/this-month-in-ladybird-jevgsot1j
twitter:card: summary_large_image
twitter:site: @dailydotdev
og:type: website
og:site_name: daily.dev
og:title: This Month in Ladybird | daily.dev
og:description: Ladybird&#x27;s February update reveals the browser project removed all Swift code and replaced its LibJS frontend (lexer, parser, AST, scope collector, bytecode...
og:url: https://daily.dev/posts/this-month-in-ladybird-jevgsot1j
og:image: https://api.daily.dev/og/posts/jevGsOT1j.png
og:image:alt: This Month in Ladybird
og:image:width: 1200
og:image:height: 630
og:locale: en
---

> ## Documentation Index
> Fetch the complete documentation index at: https://daily.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# This Month in Ladybird

**[Ladybird Browser](https://daily.dev/sources/ladybird)** · 8 min read · 0 upvotes · 0 comments

## Summary

Ladybird's February update reveals the browser project removed all Swift code and replaced its LibJS frontend (lexer, parser, AST, scope collector, bytecode generator) with a complete Rust reimplementation, built using AI coding agents like Claude Code and Codex under human direction. The new pipeline produces byte-for-byte identical bytecode to the C++ version, verified across over 65,000 tests, and is enabled by default. Beyond the language shift, 347 PRs from 34 contributors landed major text editing and selection improvements, site-specific performance work on Reddit, YouTube, Discord, and X.com, new CSS features (@counter-style, font-optical-sizing, ScrollTimeline, word-break, grid dense packing), partial SVG relayout, redesigned media controls using shadow DOM, and cookie versioning to cut redundant IPC calls for document.cookie access.

## Full article

daily.dev links to this article rather than hosting it. Read it at the original source: <https://ladybird.org/newsletter/2026-02-28>

## Questions this post answers

### Why did Ladybird remove Swift and rewrite LibJS in Rust?

Ladybird abandoned Swift as a second language alongside C++ after adopting it in 2024 because it did not work out for the project, and replaced the LibJS frontend pipeline (lexer, parser, AST, scope collector, and bytecode generator) with a complete Rust reimplementation instead. The rewrite was done using AI coding agents, Claude Code and Codex, under human direction rather than autonomously.

_Track how major browser engines rethink their core language stacks by following rewrites like this on daily.dev._

### How was the Rust rewrite of Ladybird's LibJS verified against the old C++ implementation?

The Rust pipeline was verified to produce byte-for-byte identical bytecode output to the previous C++ implementation, checked across 52,898 test262 tests and 12,461 Ladybird-specific tests with zero regressions. It is enabled by default on all platforms, though developers can switch back to the C++ pipeline with LIBJS_CPP=1 or run both in lockstep with LIBJS_COMPARE_PIPELINES=1.

_Developers weighing large-scale rewrites can compare verification strategies like this via daily.dev._

### How does Ladybird's cookie versioning reduce blocking on document.cookie access?

Ladybird caches the cookie string in the WebContent process and tracks a shared version counter, so reading document.cookie returns the cached value immediately without inter-process communication when the version hasn't changed. This targets the common case identified by a Chrome team study showing 87% of cookie reads return the same string as before, eliminating hundreds of blocking calls per page load.

_Engineers optimizing browser performance internals can find deep dives like this through daily.dev._

---

Tags: [#css](https://daily.dev/tags/css), [#rust](https://daily.dev/tags/rust), [#webassembly](https://daily.dev/tags/webassembly)

[View this post on daily.dev](https://daily.dev/posts/this-month-in-ladybird-jevgsot1j)

```json
{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://daily.dev/#organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180},"sameAs":["https://twitter.com/dailydotdev","https://github.com/dailydotdev","https://www.linkedin.com/company/daily-dev-ltd"]},{"@type":"WebSite","@id":"https://daily.dev/#website","url":"https://daily.dev","name":"daily.dev","publisher":{"@id":"https://daily.dev/#organization"},"potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://daily.dev/search?q={search_term_string}"},"query-input":"required name=search_term_string"}}]}
{"@context":"https://schema.org","@type":"TechArticle","headline":"This Month in Ladybird","url":"https://daily.dev/posts/this-month-in-ladybird-jevgsot1j","mainEntityOfPage":{"@type":"WebPage","@id":"https://daily.dev/posts/this-month-in-ladybird-jevgsot1j"},"datePublished":"2026-08-31T05:54:47.837Z","dateModified":"2026-08-31T05:56:33.981Z","description":"Ladybird's February update reveals the browser project removed all Swift code and replaced its LibJS frontend (lexer, parser, AST, scope collector, bytecode...","image":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/f0d04d597be9efdaf11883698ad30378?_a=AQAEuop","thumbnailUrl":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/f0d04d597be9efdaf11883698ad30378?_a=AQAEuop","isAccessibleForFree":true,"articleSection":"Ladybird Browser","inLanguage":"en","publisher":{"@type":"Organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180}},"author":{"@type":"Organization","name":"Ladybird Browser","logo":"https://media.daily.dev/image/upload/s--gBOjamNh--/f_auto,q_auto/v1788155675/logos/ladybird?_a=BAMAMicg0","url":"https://daily.dev/sources/ladybird"},"commentCount":0,"discussionUrl":"https://daily.dev/posts/this-month-in-ladybird-jevgsot1j","interactionStatistic":[{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":0},{"@type":"InteractionCounter","interactionType":{"@type":"CommentAction"},"userInteractionCount":0}],"keywords":"css,rust,webassembly","timeRequired":"PT8M"}
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://daily.dev"},{"@type":"ListItem","position":2,"name":"Ladybird Browser","item":"https://daily.dev/sources/ladybird"},{"@type":"ListItem","position":3,"name":"This Month in Ladybird"}]}
{"@context":"https://schema.org","@type":"FAQPage","@id":"https://daily.dev/posts/this-month-in-ladybird-jevgsot1j#faq","mainEntity":[{"@type":"Question","name":"Why did Ladybird remove Swift and rewrite LibJS in Rust?","acceptedAnswer":{"@type":"Answer","text":"Ladybird abandoned Swift as a second language alongside C++ after adopting it in 2024 because it did not work out for the project, and replaced the LibJS frontend pipeline (lexer, parser, AST, scope collector, and bytecode generator) with a complete Rust reimplementation instead. The rewrite was done using AI coding agents, Claude Code and Codex, under human direction rather than autonomously. Track how major browser engines rethink their core language stacks by following rewrites like this on daily.dev."}},{"@type":"Question","name":"How was the Rust rewrite of Ladybird's LibJS verified against the old C++ implementation?","acceptedAnswer":{"@type":"Answer","text":"The Rust pipeline was verified to produce byte-for-byte identical bytecode output to the previous C++ implementation, checked across 52,898 test262 tests and 12,461 Ladybird-specific tests with zero regressions. It is enabled by default on all platforms, though developers can switch back to the C++ pipeline with LIBJS_CPP=1 or run both in lockstep with LIBJS_COMPARE_PIPELINES=1. Developers weighing large-scale rewrites can compare verification strategies like this via daily.dev."}},{"@type":"Question","name":"How does Ladybird's cookie versioning reduce blocking on document.cookie access?","acceptedAnswer":{"@type":"Answer","text":"Ladybird caches the cookie string in the WebContent process and tracks a shared version counter, so reading document.cookie returns the cached value immediately without inter-process communication when the version hasn't changed. This targets the common case identified by a Chrome team study showing 87% of cookie reads return the same string as before, eliminating hundreds of blocking calls per page load. Engineers optimizing browser performance internals can find deep dives like this through daily.dev."}}]}
```

