Todos os projetos open-source/ · código revisado por fora

Open source: código revisado por quem não me conhece

Período
agosto de 2026 · em andamento
Papel
contribuidor externo
Projetos
undici, lexical, axios, svelte, pino, isomorphic-git, next.js, storybook e outros
Medido em

O que entrou e o que está na fila

Em agosto de 2026 eu comecei a mandar correção para projeto que não é meu. Não como exercício: escolhendo defeito de verdade, escrevendo o teste que falha sem a correção, e mandando pelo processo que cada projeto pede, o que em alguns casos quer dizer abrir issue primeiro e esperar resposta antes de escrever uma linha.

As duas tabelas abaixo são o estado de tudo, lido da API do GitHub e regravado por um script deste site. Mesclado é mesclado. Em revisão pode virar qualquer coisa, inclusive nada. Mesclado e em revisão nunca aparecem somados, porque essa soma seria a primeira mentira fácil desta página.

Um deles fecha um laço. O BetonQuest é um plugin de missões para servidor de Minecraft, e a primeira coisa que eu tentei programar, aos dez anos, foi um mod de Minecraft que não deu em nada. Dessa vez o código entrou.

215pull requests abertos
150+já mesclados
44projetos que aceitaram
68projetos alcançados

Onde o código entrou

Os mais fortes entre os 44 projetos que já mesclaram correção minha. O critério não é só a contagem: o pnpm com um pull request diz mais a quem lê do que um projeto de dois que ninguém reconhece. A lista dos 68, com recusados e substituídos, abre no fim da seção.

ProjetoO que éMescladosEm revisão
warrenpainel de controle para agentes de código que rodam isolados290
isomorphic-gitgit escrito em JavaScript, rodando no navegador160
orvalgera cliente tipado a partir de OpenAPI130
lexicalo framework de editor de texto do Meta100
kaneogestão de projeto open source50
postalagente de código de terminal, escrito em Python40
zigbee2mqttponte entre dispositivo Zigbee e MQTT, sem bridge proprietária40
urwidbiblioteca de interface de terminal em Python40
redocly-clivalida, junta e publica descrição OpenAPI21
pnpmgerenciador de pacote que não duplica dependência em disco20
pinoo logger que roda debaixo do Fastify11
MathCATconverte matemática em fala e braile para leitor de tela10
luigiframework de micro frontend, mantido pela SAP10
Abrir a lista inteira: 68 projetos, um por um

Projetos que aceitaram

ProjetoO que éMescladosEm revisãoRecusadosSubstituídos
warrenpainel de controle para agentes de código que rodam isolados29000
isomorphic-gitgit escrito em JavaScript, rodando no navegador16000
RustPythoninterpretador de Python escrito em Rust, que também roda em WebAssembly15000
orvalgera cliente tipado a partir de OpenAPI13000
lexicalo framework de editor de texto do Meta10000
coreutilso ls, o cp e o resto dos utilitários do GNU reescritos em Rust6000
compiler-explorerroda compilador no navegador e mostra o assembly que sai5300
mongoosea camada de modelagem que quase todo Node com MongoDB usa5000
kaneogestão de projeto open source5000
skillfilebusca e instala skills de agente, e registra qual versão está onde4100
postalagente de código de terminal, escrito em Python4000
zigbee2mqttponte entre dispositivo Zigbee e MQTT, sem bridge proprietária4000
urwidbiblioteca de interface de terminal em Python4000
CodeceptJSframework de teste ponta a ponta3000
hls.jstoca streaming HLS no navegador, sem plugin3000
undicio cliente HTTP dentro do fetch do Node2305
redocly-clivalida, junta e publica descrição OpenAPI2100
brushshell compatível com bash e POSIX, escrito em Rust2100
gitlab-ci-localroda o pipeline do GitLab CI na própria máquina2000
loopxkernel de estado para times de agentes de IA que rodam por muito tempo2000
markedconverte Markdown em HTML, e é o conversor que muita ferramenta embute2000
pokerogueRPG de navegador com batalha de Pokémon e mapa que muda a cada partida2000
pnpmgerenciador de pacote que não duplica dependência em disco2000
react-jsonschema-formmonta formulário React a partir de um JSON Schema2000
syftlê a imagem de contêiner e lista tudo que tem dentro dela1100
grafanao painel de observabilidade que quase toda empresa tem aberto1100
playwright-skillautomação de navegador com Playwright, empacotada como skill de agente1100
openeverestprovisionamento e gestão de banco de dados, automatizados1100
pinoo logger que roda debaixo do Fastify1100
BetonQuestplugin de missões para servidor de Minecraft, com diálogo e condição1000
MathCATconverte matemática em fala e braile para leitor de tela1000
sigma-rule-deploymentleva regra de detecção Sigma para o alerta do Grafana1000
ciso-assistantgestão de risco e conformidade, com os controles de ISO 27001 e NIST1000
sunsynklê inversor solar Deye e Sunsynk dentro do Home Assistant1000
zigbee-herdsman-convertersas definições de dispositivo que o zigbee2mqtt usa para entender cada aparelho1000
likec4arquitetura de sistema escrita como código e desenhada a partir dele1000
luigiframework de micro frontend, mantido pela SAP1000
herbferramentaria para HTML com ERB, o template do Rails1010
pyrighto verificador de tipo de Python que roda dentro do VS Code1000
mlodaacesso a dado para IA e ML, por plugin e com rastro de origem1000
plurmemória compartilhada entre agentes de IA1000
blacko formatador de código de Python que não aceita configuração1000
semanticainfraestrutura de grafo para contexto de agente1000
webdriverioautomação de navegador e celular para teste1000

Em revisão, recusados e substituídos

Recusado e substituído não são a mesma coisa. Recusado quer dizer que o mantenedor fechou o pull request. Substituído quer dizer que fui eu, porque o mesmo conserto virou outro pull request no mesmo projeto. Somar os dois diria que o projeto me disse não onde ele pediu outra coisa.

ProjetoO que éEm revisãoRecusadosSubstituídos
payloadCMS headless em Next.js501
luxondatas e fusos em JavaScript, sucessor do Moment200
axioso cliente HTTP mais usado do JavaScript100
freebuffagente de código de linha de comando110
discord.jsa biblioteca sobre a qual a maior parte dos bots de Discord é escrita100
DSpacerepositório digital que universidade usa para publicar acervo e pesquisa100
open-designalternativa aberta e local ao Claude Design100
nodeo runtime de JavaScript fora do navegador100
nxsistema de build para monorepo, que só recompila o que mudou100
pygmentscolore código em centenas de linguagens, e é o que o Sphinx e o Jekyll usam100
mypyo verificador de tipo estático do Python, mantido junto do projeto da linguagem100
rollupo bundler de módulos ES100
storybookmonta, documenta e testa componente de interface isolado100
strapiCMS headless em JavaScript100
supabasePostgres gerenciado com API, auth e storage100
svelteo compilador de interface100
next.jso framework React da Vercel100
zwave-jsfala o protocolo Z-Wave a partir do Node, para automação residencial100
angularo framework de aplicação web do Google010
apollo-cliento cliente GraphQL do Apollo010
celerya fila de tarefa em segundo plano do mundo Python001
three.jsa biblioteca de 3D no navegador010
nestframework de back-end em Node, com a arquitetura em módulo que o Angular popularizou010
opensrekit para montar agente que investiga incidente de produção010

A mesma chave quebrada em 10 projetos

__proto__ não é um nome de propriedade como os outros. Num objeto literal, o['__proto__'] = x não guarda nada: troca o protótipo do objeto. E ler o['__proto__'] devolve o protótipo herdado, não um valor que alguém pôs ali. Todo lugar que monta um dicionário a partir de string que veio de fora tem esse buraco, e o buraco é sempre o mesmo.

Achei o primeiro num logger e fui atrás dos outros: 15 pull requests em 10 projetos: axios, svelte, apollo-client, angular, storybook, next.js, undici (6 só nele), pino, orval e lexical. No axios e no undici a string é um cabeçalho HTTP, ou seja, vem de quem estiver do outro lado da conexão. Não é curiosidade de laboratório.

redaction.js ver inteiro ↗
    o[ns].push(nextPath)
    return o
    // The keys here are the first segment of each redact path, so they are the
    // user's strings. On a plain object a path like 'constructor.secret' reads
    // the inherited function, and `o[ns] = o[ns] || []` keeps it.
  }, Object.create(null))

  // the redactor assigned to the format symbol key
  // provides top level redaction for instances where
  // an object is interpolated into the msg string
  // Same reason as the shape above: the keys come from the redact paths, and
  // this object is later indexed with them by `asJson`.
  const result = Object.assign(Object.create(null), {
    [redactFmtSym]: Redact({ paths, censor, serialize, strict, remove })
  })

Os comentários desse trecho são meus e estão em inglês, porque o repositório é de outra pessoa. É a mesma regra que vale aqui ao contrário: os comentários deste site estão em português porque quem mantém sou eu.

As 4 que entraram foram junto com o teste que falha sem elas. Nenhum mantenedor pediu. É o que faz o revisor conseguir dizer sim sem precisar confiar em mim.

No undici o mantenedor pediu para juntar os call sites num pull request só, em vez de um por lugar. Fechei os 4 e abri o #5688, com a guarda num util em vez de quatro cópias da mesma função. Eles estão na tabela como substituídos, e não como recusados, porque não foram recusados: "o mantenedor não quis" e "o mantenedor quis de outro jeito" não são a mesma coisa.

16 pull requests mesclados dentro do git de outra pessoa

O isomorphic-git é git de verdade, escrito em JavaScript puro, rodando dentro do navegador. 16 correções minhas entraram nele e outras 0 estão na fila. As que mexem em comportamento estão na lista abaixo. A que falta nela é um ajuste na integração contínua deles, que entrou junto:

  • core.autocrlf não era respeitado quando o status calculava o hash da cópia de trabalho: no Windows, arquivo em que ninguém tocou aparecia como modificado.
  • splitLines partia um CRLF que caísse bem na fronteira entre dois pedaços do fluxo, e uma linha virava duas.
  • o .gitignore era aplicado também a arquivo já rastreado, que é justamente o caso em que o git manda ignorar o ignore.
  • expandir uma ref varria junto os arquivos de sistema do git.
  • uma tag anotada cujo alvo o filtro de prefixo tinha removido derrubava a leitura inteira.
  • credencial escrita dentro da URL passou a ser lida pelo parser WHATWG, em vez de por expressão regular.
  • a sintaxe no estilo scp com usuário diferente de git não era reconhecida.
  • checkout com filepaths e sem ref restaurava do HEAD em vez do índice, e jogava fora o que estava no stage.
  • com core.symlinks desligado o git materializa o link simbólico como arquivo comum, e o mapa de links das fixtures do navegador saía vazio.

Tem uma piada na segunda dessa lista. Este site já documentava um primo dela antes de qualquer um desses pull requests existir: a checagem que confere o hash da política de segurança normaliza CRLF para LF antes de calcular, porque o que vai ao ar é LF, e quem já apanhou de fronteira de CRLF reconhece a marca.

O que ainda está em revisão

A maior parte dos pull requests continua aberta, 37 deles, e a página diz isso em vez de arredondar. Em alguns projetos a fila é longa por bom motivo: o undici roda dentro do fetch do Node, e errar ali custa caro para muita gente.

Eu tenho número para essa espera porque medi. O merge-odds amostra os últimos cem pull requests fechados de um projeto e calcula que fração veio de autor de fora: nos que ele mediu, a taxa vai de um terço a nove décimos. Pull request aberto não é pull request aceito, e taxa alta descreve cem pessoas que não são você.

7 foram recusados, e estão na tabela pelo mesmo motivo dos outros. No apollo-client eu abri a issue antes, como a política deles pede, marquei o pull request com o emoji de robô que eles exigem de contribuição assistida por IA, e discuti a solução com o mantenedor, inclusive para dizer que um dos meus três testes estava errado, e por quê. Ele fechou como “solution in search of a problem”: queria ver o defeito machucando alguém em produção, não só em teoria. É uma régua justa, e ela vale para o resto desta página também.

As outras foram mais curtas. No angular o mantenedor respondeu que já havia um pull request esperando revisão para o mesmo defeito, que é o melhor motivo que existe para fechar o meu. No opensre fecharam sem comentar nada, e eu não sei por quê.

E o que é meu

Esta página é o que eu mando para projeto que não é meu. O outro lado, o que eu publico e outra pessoa instala, saiu daqui e ganhou página própria: o que eu publico. São duas bibliotecas no npm e dois plugins de Claude Code, e um deles é o merge-odds citado ali em cima.