Ladybird deste mês – abril de 2026
(ladybird.org)- Em abril, o Ladybird mesclou 333 PRs de 35 contribuidores e recebeu novos apoios de US$ 50.000 da Human Rights Foundation e US$ 1.000 de Jakub Stęplowski
- Foram adicionados um visualizador de PDF embutido, autocompletar na barra de endereço com base no histórico de navegação, frontend Linux com GTK4/libadwaita e a UI de gerenciamento
about:bookmarks, ampliando os recursos de navegação e a interface desktop - O parser HTML agora faz parsing progressivo do corpo da resposta, e o speculative parser busca recursos antecipadamente; a compilação de nível superior do JavaScript foi movida para uma thread em segundo plano, reduzindo em cerca de 200 ms o tempo da thread principal no carregamento do YouTube
- O mecanismo JavaScript melhorou o desempenho no Speedometer e no carregamento de sites reais com cache de for-in, alocador de registradores O(1), compartilhamento de identificadores sem cópia,
JS::Substringlazy e melhorias no cache de views de typed array - Foram incluídos
Cache/CacheStorage,image-set(), CSS anchor positioning, DNS assíncrono, pintura de GPU baseada em dmabuf, mimalloc como padrão e Rust obrigatório, e a pontuação no WPT subiu de 2.003.537 para 2.067.263
Escala de desenvolvimento e patrocínio
- Em abril, o Ladybird mesclou 333 PRs de 35 contribuidores, dos quais 7 fizeram seu primeiro commit no Ladybird
- Como novos patrocinadores, a Human Rights Foundation contribuiu com US$ 50.000 por meio do programa “AI for Individual Rights”, e Jakub Stęplowski doou US$ 1.000
- O Ladybird é mantido integralmente por patrocínios de empresas e indivíduos que apoiam a web aberta
Recursos de navegação e frontend
-
Visualizador de PDF embutido
- PDFs são renderizados embutidos por meio do visualizador pdf.js incluído no pacote (#9132)
- O pdf.js é um visualizador de PDF escrito apenas em JavaScript, HTML e CSS, oferecendo navegação entre páginas, seleção de texto, zoom e busca dentro do documento
- Ao carregar o Intel ISA Manual com o pdf.js, ficaram evidentes pontos de melhoria no cache de views de typed array e na invalidação de
:has()
-
Histórico de navegação e autocompletar na barra de endereço
- Ao digitar na barra de endereço, são exibidas sugestões avançadas com base no histórico, incluindo favicon e título de páginas visitadas anteriormente, atalhos de mecanismo de busca e conclusão geral de URLs (#8933)
- O
HistoryStore, baseado em SQLite, armazena o título, favicon, contagem de visitas e horário da última visita de toda navegação - A página de configurações de privacidade agora liga à opção “Clear browsing history”, e tanto a UI em Qt quanto a em AppKit renderizam as novas linhas avançadas
-
Frontend GTK4 / libadwaita
- Um novo frontend Linux baseado em GTK4 e libadwaita foi adicionado ao Ladybird, oferecido lado a lado com o frontend Qt existente (#8691)
- Ele foi inspirado no GNOME Web (Epiphany) e, seguindo as diretrizes de design do GNOME, usa menu hambúrguer e abas
AdwTabViewsem barra de menus - Oferece autocompletar e ícone de segurança na barra de URL, localizar na página, tela cheia, menu de contexto, caixas de diálogo de alert/confirm/prompt/color/file, área de transferência, múltiplas janelas, tema claro/escuro e escalonamento por DPR
- Ainda está em estágio inicial, então ainda não atingiu paridade funcional com os frontends Qt e AppKit
-
Favoritos
- Aos favoritos adicionados no mês passado foi somada uma UI de gerenciamento
- A página
about:bookmarkspermite gerenciar favoritos e pastas (#8825) - A nova página oferece suporte à importação e exportação de favoritos (#8938)
- Foi adicionado um menu de contexto para editar favoritos e pastas (#8715)
- Um timestamp
date_addedfoi adicionado a todos os favoritos e pastas (#8867) - A barra de favoritos agora suporta abrir em nova aba, copiar URL, clique do meio e Ctrl/Cmd+clique para abrir em nova aba (#8758)
- A API HTML5 de arrastar e soltar foi conectada,
about:bookmarksa usa para reordenação, e ela também funciona em páginas web comuns (#8783)
Parsing de HTML, execução de scripts, pipeline de renderização
-
Parsing de HTML especulativo e progressivo
- O parser de HTML foi alterado para consumir o corpo da resposta progressivamente(#9151)
- Os bytes passam por um decodificador de texto em streaming e entram no tokenizador em chunks; quando falta entrada, o tokenizador pausa e retoma quando mais dados chegam
- Isso substitui o modelo anterior, que esperava o recebimento do corpo completo para então iniciar o parsing
- Um parser de HTML especulativo também foi implementado(#9114)
- Quando o parser principal é bloqueado por um script externo síncrono, um tokenizador separado faz uma varredura adiantada da entrada ainda não parseada e emite buscas especulativas de recursos
<script src>,<link rel=stylesheet|preload>e<img src> - Ele acompanha
<base href>e pula corretamente o interior de templates e foreign content - O parser especulativo é conectado ao preload map do documento, de modo que recursos descobertos especulativamente sejam deduplicados com buscas posteriores do parser normal(#9164)
-
Compilação de JavaScript fora da thread principal
- A geração de bytecode do código de nível superior de scripts carregados é executada em um pool de threads em segundo plano(#9118)
- As threads de trabalho criam o bytecode e os dados necessários para gerar
Executable, enquanto o trabalho que toca a VM ou o heap do GC permanece na thread principal - Lida com classic script, module e IIFE de nível superior, e só o carregamento do YouTube já move cerca de 200ms de tempo da thread principal para threads em segundo plano
-
Rasterização por Navigable
- Cada Navigable é rasterizado de forma independente em sua própria thread(#8793)
- Antes, iframes eram pintados de forma síncrona como display lists aninhadas dentro da display list pai, então apenas a thread de renderização do traversable de nível superior ficava ativa
- A display list pai agora referencia a saída rasterizada de cada iframe por meio de
ExternalContentSource, então a invalidação de iframe não exige regravar o pai - Além do paralelismo, isso também é trabalho preparatório para mover iframes para processos sandbox separados
-
Pintura por GPU baseada em dmabuf no Linux
- Em builds Linux com Vulkan, o WebContent pintava em uma surface Skia acelerada por GPU, mas o buffer compartilhado com o processo de UI era um bitmap de CPU, então havia readback de GPU para CPU a cada flush
SharedImageagora pode armazenar handles Linux dmabuf, permitindo que os buffers front/back permaneçam na GPU até o processo de UI(#8917, #8920)
Desempenho e compatibilidade do mecanismo JavaScript
-
Otimização de chamadas JS-para-JS
- Vários PRs foram aplicados para que as instruções
Call,ReturneEndpermaneçam dentro do interpretador em assembly AsmInt nos casos comuns (#8891, #8909, #8912) - O salvamento/restauração de registradores usa instruções ARM64 paired load/store (
ldp/stp) ajustadas manualmente - Chamadas de native function também são despachadas diretamente pelo AsmInt por meio de uma nova variante
RawNativeFunction, que armazena ponteiros de função comuns em vez deAK::Function(#8922)
- Vários PRs foram aplicados para que as instruções
-
Alocador de registradores de bytecode O(1)
Generator::allocate_registertinha uma estrutura que vasculhava o pool disponível para encontrar o registrador de menor número, e só essa função consumia cerca de 800ms durante o carregamento do x.com- Após o fim do período de equivalência do pipeline C++/Rust, o alocador foi trocado por uma pilha LIFO simples (#9007)
-
Iteração for-in com cache
- A posição de
for (key in obj)armazena em cache um snapshot achatado de chaves enumeráveis e o reutiliza enquanto forem mantidos o shape do receiver, o armazenamento indexado e a cadeia de protótipos (#8856) - O Speedometer 2 subiu de 67.7 → 73.6, e o Speedometer 3 de 4.11 → 4.22
- A posição de
-
Outras melhorias no mecanismo
- O parser agora compartilha nomes de identificadores por zero-copy entre lexer, parser e scope collector, acelerando o parsing em 1,14x em um corpus de JS de sites e reduzindo o RSS em 282MB (#8801)
- A concatenação de strings curtas pula a representação rope quando o resultado de qualquer forma será observado como uma flat string, ficando 2,13x mais rápida em loops densos de
a + b(#9184) - Arrow functions com lexical
thisnão alocam um function environment a cada chamada, resultando em melhoria de 2,13x em microbenchmarks (#9192) - Arrays esparsos não pagam custo imediato pelos holes, e
Array(20_000_000)permanece majoritariamente como metadados em vez de realizar trabalho proporcional a 20 milhões de elementos virtuais (#8847) - O novo tipo lazy
JS::Substringdá suporte a capturas de regexp e a built-ins de string comoslice,splite acesso indexado, trazendo melhora de 1,066x no benchmark regexp do Octane (#8863) - As source positions agora são preservadas de ponta a ponta no source map do bytecode, economizando cerca de 250ms no x.com (#9027)
TransferArrayBuffercom zero-copy economiza cerca de 130ms no carregamento do YouTube (#9088)- A cached typed-array view mudou de
WeakHashSetpara uma intrusive list, economizando cerca de 250ms ao carregar o PDF Intel ISA no pdf.js (#9180) - A estrutura em que todo
Promisealocava 2 célulasPromiseResolvingFunctioncom closuresAK::Functionsem captura foi substituída por funções estáticas despachadas por um enumKind, eliminando alocações por resolver (#9188) - Ao pular a marcação da property-table de shapes non-dictionary, o tempo de GC durante o carregamento de maptiler.com caiu 1,3 segundo (#9044)
- Foi adicionado um fast path para
Array.prototype.indexOfem packed arrays (#9123) Array.prototype.sortagora reutiliza UTF-16 em cache em vez de retranscodificar a cada comparação (#9036)- Foi adicionado suporte à importação de módulos WASM, JSON e CSS (#6029)
- O suporte à proposta
ShadowRealmfoi removido porque sua padronização ficou estagnada (#8753)
API da plataforma web e CSS
-
Cache e CacheStorage
CacheeCacheStorageforam implementados de ponta a ponta (#8745)- 9 métodos, incluindo
open,has,delete,keys,match,matchAll,add,addAlleput, funcionam com base em um armazenamento temporário em memória
-
Recursos de CSS e correções de renderização
- Foi adicionado suporte básico às formas padrão e com prefixo
-webkit-deimage-set(); no momento da pintura, é selecionada a resolução candidata que melhor corresponde ao device pixel ratio, e tipos MIME não suportados são ignorados (#9090) - Com o suporte a
image-set(), a imagem de cabeçalho de gocomics.com agora é exibida - Foi adicionado suporte inicial a
position-anchore ao CSS anchor positioning, corrigindo a posição da mão e da arma em cssdoom.wtf (#8686) - A interpolação de cores foi reescrita para se alinhar ao css-color-4, interpolando em float em vez de
u8e tratando de forma consistente componentes ausentes/sem efeito, sRGB fora da gama e multiplicador de alpha (#8934) - Atributos HTML legados de apresentação como
alignebgcolornão escrevem mais diretamente em cascaded properties; eles agora passam pela cascade como declarações normais do autor, fazendo com que a substituição devar()e o fallback de invalid-at-computed-value-time funcionem corretamente (#9176) - A mudança na cascade de presentational hints corrigiu um crash em html.spec.whatwg.org
<thead>,<tbody>,<tfoot>e<tr>agora refletem o atributo de apresentaçãoalign, corrigindo o posicionamento dos botões em bricklink.com (#9177)- A interpolação de
stroke-dasharrayfaz com que os traços SVG sejam animados suavemente (#9133) - Elementos com o atributo
autofocusagora realmente recebem foco quando a página é carregada (#9016) - O marcador de lista em texto RTL é posicionado à direita, corrigindo a renderização de listas na Wikipedia em árabe (#9099)
- A baseline de containers inline flex/grid agora é derivada da primeira line box do filho, e não da última linha quebrada, corrigindo o alinhamento entre texto de links e ícones em nos.nl (#9183)
- Foi adicionado suporte básico às formas padrão e com prefixo
Rede e invalidação de estilo
-
Rede
getaddrinfonão bloqueia mais o event loop- O LibDNS agora executa lookup no thread pool, emite queries
AeAAAAem paralelo e consolida lookups simultâneos para o mesmo nome(#9109) - O caminho de preconnect do RequestServer foi corrigido para não contornar o resolver, fazendo com que o threaded resolver do libcurl, que causava
pthread_joinna main thread, passe a ser roteado pelo mesmo caminho do pool de DNS(#9109) - Quando o WebContent era mais lento que a rede, o escoamento dos dados de resposta enfileirados no RequestServer era O(n²), e ao abrir um vídeo do YouTube eram gastos cerca de 30 segundos em
memcpye 3 segundos emVector::remove AllocatingMemoryStreamfoi alterado para uma lista encadeada simples de chunks, fazendo o consumo cair para O(1)(#9028)- O header
Acceptdas requisições de imagem agora anuncia AVIF e WebP para se alinhar a outros engines, e alguns CDNs usam esse header para decidir se entregam formatos mais modernos ou fallback em JPEG(#9046)
-
Invalidação de estilo
- A invalidation de selectors existente era simples sob a premissa de que selectors só olham para baixo, mas com
:hoste:has()uma mudança em descendant pode alterar o resultado de:has()em ancestor, tornando necessário um walk ascendente - Evitou-se reconstruir todos os caches de style scope quando uma mutação de stylesheet alterava apenas um único scope, reduzindo o rebuild do rule cache do Reddit de 13,2 s → 3,2 s(#9138)
- A invalidation estrutural entre siblings deixou de se propagar para descendants que não observam posição, reduzindo em 11% os recomputes desnecessários no infinite scroll do Reddit(#9155)
- A mutation invalidation de
:has()agora pula anchors não afetados, e foi medida uma grande redução em azure.com(#9168) - No PDF da Intel ISA, as visitas à child-list de
:has()caíram de 71 mil → 1,6 mil, economizando cerca de 650 ms no carregamento do pdf.js(#9179) - Um novo conjunto de testes de structural-invalidation revelou várias falhas de invalidation ausente, que foram corrigidas(#9095)
- Também houve pequenas melhorias em torno de hover, scope de mutação de stylesheet, mapa de custom-property e diffing de computed style(#9077, #9049, #9079, #9080, #9141)
- A invalidation de selectors existente era simples sob a premissa de que selectors só olham para baixo, mas com
Alocação de memória e sistema de build
-
mimalloc como alocador padrão
- O código C++ e Rust agora compartilha uma única instância de allocator do mimalloc v2, sem passar separadamente pelo system allocator(#8752)
- Como
malloc()não é sobrescrito para todo o sistema, bibliotecas de terceiros mantêm seus próprios contratos de allocator - O benchmark de JS melhorou de forma geral
-
Rust obrigatório e limpeza do sistema de build
-
Mudanças relacionadas a GC e memória
- A compilação agora usa
-ftrivial-auto-var-init=zeropara zerar GC pointers antigos na entrada da função, reduzindo sua detecção pelo conservative stack scanner(#9171) - A property
UsedValues, usada raramente, foi movida para trás de um lazy pointer, reduzindo a struct de 424 bytes → 176 bytes e diminuindoLayoutState::populate_node_from()de 139 ms → 65 ms durante o carregamento de sainsburys.co.uk(#9104) - Os chunks do body de fetch, que antes passavam pelo caminho de pull-promise alocando 7 objetos de GC por chunk, agora entram diretamente no byte stream controller(#9169)
- A compilação agora usa
Comportamento aprimorado em sites
-
Reddit
- O carrossel da galeria de imagens do Reddit agora funciona, e foram corrigidos dois bugs de layout não relacionados em torno de correspondência com
::slotted()e de descendentes com posicionamento absoluto em inline fragmentado (#9148) - Graças ao
TextDecoderStream, a SPA não engole cliques em links, então agora é possível abrir comentários - O infinite scroll também foi impactado pelo trabalho de invalidation estrutural
- O carrossel da galeria de imagens do Reddit agora funciona, e foram corrigidos dois bugs de layout não relacionados em torno de correspondência com
-
YouTube
- O YouTube se beneficiou de compilação de JS de nível superior off-thread, descompressão WOFF2 off-thread, redução do fanout de fetch de
@font-face, correção de memory churn no RequestServer eTransferArrayBufferzero-copy - A descompressão WOFF2 off-thread também economiza cerca de 170 ms no Gmail (#8976)
- No carregamento inicial, o fanout de fetch de
@font-facecaiu de 177 para cerca de 9 (#9032)
- O YouTube se beneficiou de compilação de JS de nível superior off-thread, descompressão WOFF2 off-thread, redução do fanout de fetch de
-
Outros sites
- Em gocomics.com, a imagem de cabeçalho agora aparece graças a
image-set() - Em yandex.com/maps, a renderização WebGL de vector tiles agora funciona com correções de WebGL, incluindo a extensão
WEBGL_debug_renderer_info(#9043) - Em strava.com, o login agora funciona porque
Navigator.getBatterypassou a lançar o tipo de erro exigido pela spec, em vez de um erro próprio (#8770) - O GitHub Insights agora carrega cerca de 100 ms mais rápido graças ao cache de seletores de
Element.matches()e.closest()(#8987) - A página de comparação de notebooks do tweakers.net ficou cerca de 31% mais rápida com lookup indexado de nomes de propriedade de
HTMLFormElement(#9009) - O neon.com não trava mais (#8812)
- Em channel4.com, um ajuste na resolução de auto-margin em flex corrigiu o problema de alinhamento vertical do texto de categoria (#9050)
- O Cloudflare Turnstile ainda não é superado, mas agora falha muito mais rápido graças ao tratamento de auth-scheme, à otimização de
Array.prototype.shift()e ao hardening dos manipuladores de eventos da UA para elementos<input>range e number (#9063)
- Em gocomics.com, a imagem de cabeçalho agora aparece graças a
WPT e outras mudanças de plataforma
-
Web Platform Tests
- A pontuação no WPT subiu de 2.003.537 para 2.067.263, registrando um aumento de 63.726 subtests neste mês
- No entanto, o WPT passou a incorporar upstream da suíte oficial de conformidade ECMAScript, o test262, adicionando 53.207 subtests de JavaScript
- O Ladybird já executa o test262 separadamente há anos e, como a conformidade do LibJS está em bom estado, passou em 52.045 deles, ou 97,8%
- Dos 63,7 mil de aumento, cerca de 52 mil vieram da importação do test262, e os cerca de 11,7 mil restantes representam avanço real novo na plataforma do navegador
- Com a importação do test262, o WPT agora mede a conformidade de JavaScript junto com o restante da plataforma
-
Texto, layout, processos e UI
- A seleção e o hit testing de texto com ligatures deixaram de assumir uma code unit por glyph e passaram a iterar por grapheme clusters, distribuindo o avanço do glyph entre esses graphemes (#8829)
- Definir
innerHTMLem um shadow root não invalida mais toda a árvore de layout do documento, reduzindo o tempo de layout-and-paint em 21% em pomax.github.io/bezierinfo (#9191) - Navegar uma popup tab para outro site não encerra mais o processo WebContent do pai (#8730)
- Na UI em Qt, agora é possível alternar entre abas abertas com
Ctrl+TabeCtrl+Shift+Tab(#8704) - Agora é possível rolar arrastando com o botão do meio do mouse pressionado ou entrar no modo de autoscroll com um clique parado no lugar (#8881, #8928)
- Quando o que foi digitado na barra de endereço não pode ser sanitizado como URL ou consulta de busca, agora é exibida uma página de erro apropriada em vez de descartar a entrada silenciosamente (#9072)
- Foi implementado o
TextDecoderStream, a contraparte de streaming doTextDecoder, retendo UTF-8 parcial nas fronteiras entre chunks e permitindo editar comentários no Reddit (#9143) - Mensagens cross-process de
BroadcastChannelagora são roteadas por IPC entre os processos WebContent e WebWorker, funcionando como em outros navegadores independentemente de em qual processo o listener esteja (#8865)
1 comentários
Comentários do Hacker News
O Dioxus, um framework de GUI em Rust, está sendo desenvolvido como parte de um renderizador nativo e segue uma direção parecida com a do Flutter ao tentar criar sua própria alternativa ao Skia, mas, em vez de usar só canvas na web como o Flutter web, ele funciona na web com os padrões HTML/CSS
Ele não depende de bases de código existentes de navegadores como Chromium, Gecko ou WebKit, e está mais próximo de uma implementação feita quase do zero, aproveitando crates Rust como stylo e taffy, usados pelo Servo: https://github.com/DioxusLabs/blitz (
/apps/browser)Muitos sites bloqueiam à força o carregamento em certos navegadores e só permitem Chromium; essa é a realidade que a Ladybird vai enfrentar e um grande fator que impede a concorrência de novos navegadores
O DRM Widevine também é muito difícil de conseguir para navegadores novos, e até o Zen Browser, com 10 milhões de usuários, não conseguiu obtê-lo
Usei Firefox nos últimos 20 anos e nunca vi um site exigir que eu mudasse para Chromium por compatibilidade
O Widevine de fato é uma barreira real, mas, na prática, ele só tende a impedir reprodução em 4K em alguns sites de streaming, como Netflix e Disney
Considerando que o Zen reuniu 10 milhões de usuários sem Widevine, também é difícil dizer que isso seja algo absolutamente central
Se você controla o próprio navegador, fora as questões ligadas a DRM, quase nada é impossível
Esse tipo de post me lembra a diversão de ler atualizações de emuladores de jogos
Algo como “corrigimos o bug X para que Y funcionasse direito, e como resultado o jogo Z agora roda”; uma das correções desta vez foi CSS Doom, então até existe certa sobreposição com o mundo dos games
Já ouvi o Andreas dizer várias vezes que fazer um navegador é como fazer um emulador
Cada site usa recursos diferentes de formas diferentes, e ele compara os sites a ROMs
Sou usuário antigo do Firefox, mas, quando a Ladybird entrar numa alfa bem inicial e começarem a sair builds pré-compiladas, com certeza vou testar logo no começo
GTK4 / libadwaita frontendsoa muito bemPrefiro UI/UX em GTK a Qt, então estou animado para ver o progresso desse lado
strava.com : Login works now that Navigator.getBattery throws the spec-mandated error type instead of one of our own (#8770).Por que o Strava quer saber o nível da minha bateria?
Pode existir uma versão web voltada a países em desenvolvimento, ou talvez queiram reduzir a frequência de consulta de localização quando a bateria estiver baixa para economizar energia
É tudo especulação, mas não é totalmente absurdo que um site como o Strava peça informações de bateria, embora no geral pareça um pouco suspeito
Assumindo que também possa ser usado pelo site, é bem provável que queiram ajustar a frequência de consulta de localização para equilibrar precisão e consumo de energia
Só que a captura de tela dos marcadores de lista em texto RTL parece igual
Nos dois casos, o marcador da lista está à esquerda
Já na imagem “before” https://ladybird.org/assets/img/newsletter-apr-2026-rtl-befo..., o marcador não só está à esquerda do texto como também está tão à esquerda que quase sai para fora do painel
Tenho muito respeito por quem usou Evangelion do r/unixporn no teste de Reddit da Ladybird
Não assisti tanto Evangelion assim, mas vi documentários explicativos inúmeras vezes e gostei tanto a ponto de usar de papel de parede por um tempo
O ponto principal é que o Reddit funcionar na Ladybird é algo impressionante
Não sei se o YouTube funciona, mas espero que funcione também, porque isso dá mesmo a sensação de que a Ladybird está se tornando utilizável no dia a dia
Também agradeço ao https://jakubsteplow.ski/ por apoiar a Ladybird
Gostaria que houvesse mais divulgação ativa para quem doa a projetos open source, de um jeito melhor do que anúncios do Google, e desejo tudo de bom ao Jakub, além de esperar que outras pessoas também façam doações independentes a projetos como a Ladybird
Também agradeço à Human Rights Foundation https://hrf.org/program/ai-for-individual-rights/
É impressionante e realmente inspirador que uma pessoa tenha chegado tão longe num cenário em que os navegadores estavam quase num monopólio/oligopólio
Há basicamente dois lados: um é uma ficção científica de mechas/alienígenas/monstros com uma estética incrível, e o outro é um drama pessoal focado em autodesprezo e solidão
Para a maioria das pessoas, o primeiro lado será mais atraente, mas é o segundo que continua marcante até hoje
Se for assistir, vale prestar atenção à ordem
Existe a linha do tempo da série original de TV seguida pelo filme “End of Evangelion”, e existe também a série de filmes “Rebuild of Eva”, que começou como um reboot completo, mas de algum jeito acabou virando o reboot/remake/sequência final da obra original
Como resposta à pergunta “quantas pessoas estão trabalhando em navegadores hoje?”, está escrito que a Ladybird atualmente tem 8 engenheiros em tempo integral pagos e também uma grande comunidade de contribuidores voluntários
A maior parte também funciona, mas, além da velocidade, o maior problema é que muitas verificações de ‘confirmar que você é humano’ não funcionam direito na Ladybird