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

---
title: This Month in Ladybird | daily.dev
description: December&#x27;s development recap for the Ladybird browser covers 197 merged PRs from 37 contributors. Highlights include new sponsors (FUTO renewing at $250,000,...
canonical: https://daily.dev/posts/this-month-in-ladybird-golvfvcm4
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: December&#x27;s development recap for the Ladybird browser covers 197 merged PRs from 37 contributors. Highlights include new sponsors (FUTO renewing at $250,000,...
og:url: https://daily.dev/posts/this-month-in-ladybird-golvfvcm4
og:image: https://api.daily.dev/og/posts/gOlvFVCm4.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

December's development recap for the Ladybird browser covers 197 merged PRs from 37 contributors. Highlights include new sponsors (FUTO renewing at $250,000, plus smaller sponsorships), progress on Web Platform Tests, CSS features like ::part() pseudo-element and the random() function, media playback improvements for streaming and mixed sample rates, several JavaScript engine performance optimizations, HTTP disk caching enabled by default with stale-while-revalidate support, garbage collector leak fixes that reduced leaked Window objects from ~240 to ~25, and early work on post-quantum cryptography (ML-DSA, ML-KEM) plus SHA-3 and Argon2 in the Web Cryptography API.

## Full article

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

## Questions this post answers

### Does Ladybird support the CSS ::part() pseudo-element for styling shadow DOM parts of custom elements?

Yes, Ladybird added basic support for the ::part() pseudo-element, which lets custom elements expose parts of their shadow DOM for external styling, such as widget::part(quantity) targeting elements with part="quantity" inside widget's shadow DOM. The exportparts attribute is not yet implemented, but the feature already improves rendering on sites like MDN.

_Track browser engine feature rollouts like this one as you plan CSS support on daily.dev._

### Does Ladybird enable HTTP disk caching by default and support stale-while-revalidate?

Yes, Ladybird enabled the HTTP disk cache by default, cutting redundant network traffic on repeat visits, and implemented the stale-while-revalidate Cache-Control directive, which serves a stale cached response immediately while revalidating with the origin server in the background.

_Developers tuning cache-control headers can follow browser caching behavior changes on daily.dev._

### What caused garbage collector leaks in the Ladybird browser engine and how were they fixed?

Leaks stemmed mainly from improper use of GC::Root, which stored strong references that kept objects alive forever in places like 2D canvas fill/stroke styles, the rejected promises list, the custom elements reaction stack, BroadcastChannel, and IndexedDB. Switching most of these to GC::Weak references, plus introducing a new GC::HeapVector container, reduced leaked Window objects in a full test-web run from about 240 to about 25.

_Engineers debugging GC leaks in browser or runtime internals can follow fixes like this on daily.dev._

---

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

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

```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-golvfvcm4","mainEntityOfPage":{"@type":"WebPage","@id":"https://daily.dev/posts/this-month-in-ladybird-golvfvcm4"},"datePublished":"2026-08-31T05:54:44.000Z","dateModified":"2026-08-31T05:56:28.317Z","description":"December's development recap for the Ladybird browser covers 197 merged PRs from 37 contributors. Highlights include new sponsors (FUTO renewing at $250,000,...","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-golvfvcm4","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-golvfvcm4#faq","mainEntity":[{"@type":"Question","name":"Does Ladybird support the CSS ::part() pseudo-element for styling shadow DOM parts of custom elements?","acceptedAnswer":{"@type":"Answer","text":"Yes, Ladybird added basic support for the ::part() pseudo-element, which lets custom elements expose parts of their shadow DOM for external styling, such as widget::part(quantity) targeting elements with part=\"quantity\" inside widget's shadow DOM. The exportparts attribute is not yet implemented, but the feature already improves rendering on sites like MDN. Track browser engine feature rollouts like this one as you plan CSS support on daily.dev."}},{"@type":"Question","name":"Does Ladybird enable HTTP disk caching by default and support stale-while-revalidate?","acceptedAnswer":{"@type":"Answer","text":"Yes, Ladybird enabled the HTTP disk cache by default, cutting redundant network traffic on repeat visits, and implemented the stale-while-revalidate Cache-Control directive, which serves a stale cached response immediately while revalidating with the origin server in the background. Developers tuning cache-control headers can follow browser caching behavior changes on daily.dev."}},{"@type":"Question","name":"What caused garbage collector leaks in the Ladybird browser engine and how were they fixed?","acceptedAnswer":{"@type":"Answer","text":"Leaks stemmed mainly from improper use of GC::Root, which stored strong references that kept objects alive forever in places like 2D canvas fill/stroke styles, the rejected promises list, the custom elements reaction stack, BroadcastChannel, and IndexedDB. Switching most of these to GC::Weak references, plus introducing a new GC::HeapVector container, reduced leaked Window objects in a full test-web run from about 240 to about 25. Engineers debugging GC leaks in browser or runtime internals can follow fixes like this on daily.dev."}}]}
```

