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

---
title: This Month in Ladybird | daily.dev
description: The November 2025 progress report for the Ladybird browser covers 215 merged PRs from 34 contributors, new sponsors (37signals, Coursiv, Andrew Mead), and...
canonical: https://daily.dev/posts/this-month-in-ladybird-tj23lpjzy
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 November 2025 progress report for the Ladybird browser covers 215 merged PRs from 34 contributors, new sponsors (37signals, Coursiv, Andrew Mead), and...
og:url: https://daily.dev/posts/this-month-in-ladybird-tj23lpjzy
og:image: https://api.daily.dev/og/posts/tJ23LpJzY.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)** · 7 min read · 0 upvotes · 0 comments

## Summary

The November 2025 progress report for the Ladybird browser covers 215 merged PRs from 34 contributors, new sponsors (37signals, Coursiv, Andrew Mead), and 7,497 new WPT test passes bringing the total to 1,972,556. Highlights include variable font rendering, CSS perspective/perspective-origin support, removal of buffered Fetch mode (enabling incremental streaming like ChatGPT responses), fixed WebGL premultiplied alpha handling, new SVG filter support, a Base64 conversion speedup (3.8x-38.4x faster), CSS @import now blocking first render to avoid FOUC, GPU-accelerated SVG images in img tags, more consistent setInterval timing (enabling Diablo to run at full framerate), native JS-written functions for better async support, early DNS-over-HTTPS work, WebM/Matroska demuxer fixes, and Windows support improvements including DirectWrite font rendering.

## Full article

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

## Questions this post answers

### Did Ladybird remove buffered fetch responses?

Yes, Ladybird removed the buffered mode from its Fetch implementation so all fetch callers now receive partial response data as it streams in from the network, rather than waiting for the full body to accumulate in memory. Callers that still need full buffering can implement it themselves on top of the streaming data. One visible effect is that ChatGPT responses now stream incrementally in the browser instead of appearing all at once.

_Track browser engine internals like fetch streaming as they evolve by following Ladybird updates on daily.dev._

### How much faster is Base64 encoding and decoding in Ladybird after its recent optimization work?

Ladybird improved Base64 conversion performance by 3.8x for fromBase64() and 38.4x for toBase64(), measured against the benchmark from a simdutf blog post on browser Base64 performance. The optimizations targeted the runtime, moving Base64 handling from terrible to decent performance, with malloc() now cited as the next bottleneck to address.

_Developers benchmarking browser performance work can follow engine-level optimizations like this on daily.dev._

### Why would setInterval timers drift in a browser and how was it fixed in Ladybird?

setInterval timers drifted because Ladybird rescheduled them after the callback finished running, so any callback taking noticeable time pushed subsequent executions later and later. The fix reschedules the timer before the callback runs, which combined with other optimizations allowed a web-based Diablo port to run at a full 20 fps.

_Anyone debugging JavaScript timer drift can compare notes on browser internals fixes like this via daily.dev._

---

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

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

```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-tj23lpjzy","mainEntityOfPage":{"@type":"WebPage","@id":"https://daily.dev/posts/this-month-in-ladybird-tj23lpjzy"},"datePublished":"2026-08-31T05:54:47.809Z","dateModified":"2026-08-31T05:56:51.130Z","description":"The November 2025 progress report for the Ladybird browser covers 215 merged PRs from 34 contributors, new sponsors (37signals, Coursiv, Andrew Mead), and...","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-tj23lpjzy","interactionStatistic":[{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":0},{"@type":"InteractionCounter","interactionType":{"@type":"CommentAction"},"userInteractionCount":0}],"keywords":"webdev,css","timeRequired":"PT7M"}
{"@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-tj23lpjzy#faq","mainEntity":[{"@type":"Question","name":"Did Ladybird remove buffered fetch responses?","acceptedAnswer":{"@type":"Answer","text":"Yes, Ladybird removed the buffered mode from its Fetch implementation so all fetch callers now receive partial response data as it streams in from the network, rather than waiting for the full body to accumulate in memory. Callers that still need full buffering can implement it themselves on top of the streaming data. One visible effect is that ChatGPT responses now stream incrementally in the browser instead of appearing all at once. Track browser engine internals like fetch streaming as they evolve by following Ladybird updates on daily.dev."}},{"@type":"Question","name":"How much faster is Base64 encoding and decoding in Ladybird after its recent optimization work?","acceptedAnswer":{"@type":"Answer","text":"Ladybird improved Base64 conversion performance by 3.8x for fromBase64() and 38.4x for toBase64(), measured against the benchmark from a simdutf blog post on browser Base64 performance. The optimizations targeted the runtime, moving Base64 handling from terrible to decent performance, with malloc() now cited as the next bottleneck to address. Developers benchmarking browser performance work can follow engine-level optimizations like this on daily.dev."}},{"@type":"Question","name":"Why would setInterval timers drift in a browser and how was it fixed in Ladybird?","acceptedAnswer":{"@type":"Answer","text":"setInterval timers drifted because Ladybird rescheduled them after the callback finished running, so any callback taking noticeable time pushed subsequent executions later and later. The fix reschedules the timer before the callback runs, which combined with other optimizations allowed a web-based Diablo port to run at a full 20 fps. Anyone debugging JavaScript timer drift can compare notes on browser internals fixes like this via daily.dev."}}]}
```

