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

---
title: This Month in Ladybird | daily.dev
description: The July 2025 progress report for the Ladybird browser covers 319 merged pull requests from 47 contributors. Highlights include a postMessage fix that makes...
canonical: https://daily.dev/posts/this-month-in-ladybird-naaa5x31s
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: The July 2025 progress report for the Ladybird browser covers 319 merged pull requests from 47 contributors. Highlights include a postMessage fix that makes...
og:url: https://daily.dev/posts/this-month-in-ladybird-naaa5x31s
og:image: https://api.daily.dev/og/posts/NaaA5x31S.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)** · 5 min read · 0 upvotes · 0 comments

## Summary

The July 2025 progress report for the Ladybird browser covers 319 merged pull requests from 47 contributors. Highlights include a postMessage fix that makes Google reCAPTCHA pass (on google.com only), refresh-rate-aware rendering up to 120Hz, HTTP/3 support via curl 8.14.0's OpenSSL/ngtcp2 backend (with a curl bug they found fixed in 8.15.0), initial Trusted Types support for XSS protection, major SVG foreignObject rendering improvements, new CSS features (content: url() in pseudo-elements, :state() and :unchecked pseudo-classes, compile-time logical-to-physical property mapping, rewritten var()/attr() as arbitrary substitution functions, <syntax> parsing, and @property/CSS.registerProperty() progress), and the start of a transition to a native UTF-16 string type in LibJS/LibWeb. New sponsors Scraping Fish and Blacksmith were also welcomed.

## Full article

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

## Questions this post answers

### Why does Google reCAPTCHA now work in the Ladybird browser?

A long-standing bug in Ladybird's postMessage implementation was fixed: previously, if a serialized type had not been used before in the destination realm, the realm failed to reconstruct it and rejected the message, breaking reCAPTCHA. This is now fixed, though it currently only works on https://www.google.com/ due to a separate unresolved same-origin policy issue.

_Track browser engine fixes like this one on daily.dev if you build sites that depend on reCAPTCHA compatibility._

### How did Ladybird add HTTP/3 support to its browser engine?

HTTP/3 support became possible after curl 8.14.0 added it for users of OpenSSL and ngtcp2. Since Ladybird uses the OpenSSL backend with libcurl, this let the browser negotiate HTTP/3 for servers advertising it via the Alt-Svc header. A related curl bug parsing 'Alt-Svc: clear' incorrectly was found and fixed in curl 8.15.0.

_Follow how browsers adopt HTTP/3 on daily.dev when evaluating protocol support for your own infrastructure._

### What is the current UTF-16 string handling situation in Ladybird's JavaScript engine LibJS?

LibJS previously used UTF-8 internally and transcoded to UTF-16 on the fly, even though JavaScript and web strings are defined as UTF-16 encoded. A native UTF-16 string type has now been introduced, and LibJS and LibWeb are transitioning to use it internally to simplify implementation and avoid Unicode-related encoding bugs.

_daily.dev helps engine-level developers keep up with internal string encoding changes like this across browsers._

---

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

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

```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-naaa5x31s","mainEntityOfPage":{"@type":"WebPage","@id":"https://daily.dev/posts/this-month-in-ladybird-naaa5x31s"},"datePublished":"2026-08-31T05:54:41.313Z","dateModified":"2026-08-31T05:56:20.797Z","description":"The July 2025 progress report for the Ladybird browser covers 319 merged pull requests from 47 contributors. Highlights include a postMessage fix that makes...","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-naaa5x31s","interactionStatistic":[{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":0},{"@type":"InteractionCounter","interactionType":{"@type":"CommentAction"},"userInteractionCount":0}],"keywords":"css","timeRequired":"PT5M"}
{"@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-naaa5x31s#faq","mainEntity":[{"@type":"Question","name":"Why does Google reCAPTCHA now work in the Ladybird browser?","acceptedAnswer":{"@type":"Answer","text":"A long-standing bug in Ladybird's postMessage implementation was fixed: previously, if a serialized type had not been used before in the destination realm, the realm failed to reconstruct it and rejected the message, breaking reCAPTCHA. This is now fixed, though it currently only works on https://www.google.com/ due to a separate unresolved same-origin policy issue. Track browser engine fixes like this one on daily.dev if you build sites that depend on reCAPTCHA compatibility."}},{"@type":"Question","name":"How did Ladybird add HTTP/3 support to its browser engine?","acceptedAnswer":{"@type":"Answer","text":"HTTP/3 support became possible after curl 8.14.0 added it for users of OpenSSL and ngtcp2. Since Ladybird uses the OpenSSL backend with libcurl, this let the browser negotiate HTTP/3 for servers advertising it via the Alt-Svc header. A related curl bug parsing 'Alt-Svc: clear' incorrectly was found and fixed in curl 8.15.0. Follow how browsers adopt HTTP/3 on daily.dev when evaluating protocol support for your own infrastructure."}},{"@type":"Question","name":"What is the current UTF-16 string handling situation in Ladybird's JavaScript engine LibJS?","acceptedAnswer":{"@type":"Answer","text":"LibJS previously used UTF-8 internally and transcoded to UTF-16 on the fly, even though JavaScript and web strings are defined as UTF-16 encoded. A native UTF-16 string type has now been introduced, and LibJS and LibWeb are transitioning to use it internally to simplify implementation and avoid Unicode-related encoding bugs. daily.dev helps engine-level developers keep up with internal string encoding changes like this across browsers."}}]}
```

