Mapa do GitHub
(github.com/anvaka)- Map of GitHub é um mapa que posiciona mais de 690 mil projetos do GitHub como pontos, e projetos com muitos stargazers em comum ficam mais próximos entre si
- Para criar o mapa, foi usado o dataset público de eventos de atividade do GitHub no Google BigQuery, com cerca de 500 milhões de dados de star de eventos entre fevereiro de 2011 e maio de 2025
- Para calcular as relações entre repositórios, foi usada a Jaccard Similarity exata; como um computador doméstico com 24GB de RAM não era suficiente, o processamento levou algumas horas em uma instância AWS EC2 com 512GB de RAM
- Para o clustering, vários algoritmos foram testados antes da escolha de Leiden clustering, e no resultado cerca de 690 mil projetos foram divididos em mais de 1.500 clusters
- A renderização foi implementada combinando uma ferramenta própria de layout com maplibre, GeoJSON e tippecanoe, e boa parte dos rótulos de nomes de países foi gerada com ajuda do ChatGPT
Visão geral do projeto
- Map of GitHub é um mapa que visualiza mais de 690 mil projetos do GitHub
- Cada ponto representa um projeto
- Projetos com muitos usuários que deram star em comum são posicionados mais próximos no mapa
Versões públicas
- Current release, May 10, 2025: 690 mil projetos, 1.500 clusters
- Initial release, May 8, 2023: 400 mil projetos, 1.000 clusters
Coleta de dados e cálculo de similaridade
- Na primeira etapa, foram obtidos os dados de quais usuários deram star em quais repositórios
- Foi usado o dataset público de eventos de atividade do GitHub no Google BigQuery
- O período analisado vai de fevereiro de 2011 a maio de 2025
- Nesse processo, foram obtidos cerca de 500 milhões de dados de star
- Na segunda etapa, foi calculada a Jaccard Similarity exata entre cada repositório
- O volume de cálculo era grande demais para um computador doméstico com 24GB de RAM
- Em uma instância AWS EC2 com 512GB de RAM, o processamento foi concluído em algumas horas
- Outros métodos de similaridade também foram testados, mas o Jaccard produziu os resultados mais confiáveis
Clustering e layout do mapa
- Na terceira etapa, vários algoritmos de clustering foram testados para agrupar os repositórios
- No fim, a preferência foi pelo Leiden clustering, e cerca de 690 mil projetos foram divididos em mais de 1.500 clusters
- Na quarta etapa, foi usado o ngraph.forcelayout próprio para posicionar os nós dentro de cada cluster
- Para o posicionamento global dos clusters, foi usada uma configuração separada
Método de renderização
- A quinta etapa é o processo de renderizar o mapa
- Diferente de projetos anteriores, foi usado o maplibre para evitar reinventar a roda
- Os dados são convertidos para o formato GeoJSON
- A geração de tiles usa tippecanoe
- Depois disso, foi construída a experiência de navegação do mapa
Geração de rótulos de nomes de países
- Muitos dos rótulos de países exibidos no mapa foram gerados com ajuda do ChatGPT
- Se você encontrar um rótulo incorreto, pode corrigi-lo com clique direito e enviar um pull request
- O prompt de sistema para gerar os rótulos trata cada conjunto de repositórios do GitHub como um “país” de uma comunidade de programação específica e pede a criação de nomes únicos e fáceis de lembrar
- Os nomes devem ser curtos, com 1 a 3 palavras
- Devem capturar o tema, a tecnologia e o propósito em comum daquele conjunto de repositórios
- Expressões genéricas como “JSWorld”, “UI”, “Web”, “Forge”, “Archipelago”, “Hub”, “Republic” e “Nexus” devem ser evitadas
- Não se deve apenas combinar nomes de repositórios parecidos
- Devem ser distintos o suficiente para serem identificados imediatamente no mapa e diferenciados de outros nomes de países
- A entrada do usuário inclui
repoListerepoNamesOnly, e o pedido é para analisar os temas e tecnologias concretas desses repositórios para criar um nome - Se o LLM retornar um nome muito parecido com nomes anteriores, ele tenta novamente e aumenta a temperature para induzir resultados mais criativos
Busca e design
- A caixa de busca foi implementada indexando um dump simples de todos os repositórios pela primeira letra ou pelo autor
- Ao digitar
ana busca, são encontrados repositórios que começam coma, e eles são exibidos no cliente com um fuzzy matcher - A representação atual dos dados agrada, mas ainda estão buscando o estilo certo para o design visual do mapa
- Se você tiver experiência com design de mapas ou ideias visuais, pedem que compartilhe
Licença
- O repositório é disponibilizado sob a licença MIT
- Se os dados forem usados em outros trabalhos, pedem considerar atribuição a este projeto
1 comentários
Comentários no Hacker News
Por algum motivo, torvalds/linux está em Fronterra, ao lado de projetos JS, listas awesome-X e checklists de front-end
Ou os hackers de kernel de repente passaram a amar front-end, ou, mais provavelmente, as pessoas que escrevem código e as pessoas que dão estrela em projetos no GitHub não se sobrepõem muito
Eles parecem parecidos não porque tenham relação semântica, mas simplesmente porque ambos são populares
O mapa do reddit sofreu do mesmo problema: https://anvaka.github.io/map-of-reddit/ — subreddits populares acabam todos “parecidos” entre si
Ainda assim, funciona bem para projetos menores e menos famosos :D
Mas, considerando os recursos necessários para baixar cada arquivo e calcular os embeddings, provavelmente não seria viável na prática
https://xkcd.com/1138/
Link real: https://anvaka.github.io/map-of-github/
Ri quando vi que a região de Among Us se chama Sussex
Fiquei surpreso com o tamanho pequeno de Rustland. É praticamente só uma província dentro de Clouderra
Também é interessante que Bevy e Veloren estejam ambos em Rustland. Provavelmente as estrelas vieram mais da comunidade Rust do que da comunidade de desenvolvimento de jogos
Faz sentido, considerando que o ecossistema Rust ainda é relativamente pequeno e parece haver muita gente fazendo “X em Rust”
Acho que todo mundo superestima o tamanho da própria bolha
Então “X, mas em Rust” pode acabar em “X”, não em “RustLand”
Muito divertido encontrar meu projeto mapbox-gl-utils aqui
https://anvaka.github.io/map-of-github/#12/24.78947/18.85186
Sem uma função de busca, tentar achar um projeto específico só pelo mapa vira um minigame divertido :-)
Como fã de Julia, fiquei surpreso com tão poucas conexões para julialang/julia
É uma linguagem de nicho, mas a forma como ela parece isolada neste mapa talvez não esteja tão distante da experiência de usuários ou desenvolvedores
O fato de julialang/julia em si estar perto de tensorflow e opencv, enquanto os pacotes Julia reais estão agrupados em outro lugar, parece mostrar a diferença entre “usuários aspiracionais” e “usuários reais”
Muitas pessoas que deram estrela no projeto Julia em si eram usuários de Python para computação numérica em busca de um novo Python, mas a maioria ficou no Python, então suas outras estrelas também estão do lado de Python para computação numérica
Já as pessoas que deram estrela nos pacotes de JuliaLand são usuários reais de Julia e, de forma plausível, acabaram agrupadas perto de Moleculandia, AstroSpace e Quantumia
É uma abordagem muito limpa e criativa, mas, honestamente, fico dividido sobre se a metáfora de países/mapa é a melhor
Em muitos casos, só pelo nome não fica claro; é preciso dar zoom para entender o que está sendo representado
Talvez tivesse sido mais interessante fazer uma clusterização hierárquica, atribuir rótulos gerados por LLM mais descritivos e fiéis, e mostrar com linhas a conectividade média entre os clusters principais
Como alguém que fez esses gráficos pela primeira vez nos anos 90 e aprendeu quase imediatamente suas limitações, gosto deste porque ele não faz afirmações exageradas. Não é um artigo, é só uma visualização
Gosto de gráficos em que os eixos têm significado. Linhas, formas, caixas/grupos, distância, X versus Y, cores, espessura, textura, fundo, primeiro plano, esse tipo de coisa
Coisas simples também são boas. Com muita frequência, traçam linhas sem nenhum significado só para enfeitar; este é apenas um desenho com alguns grupos e personalidade. Não é legal?
Claro que ainda gosto de linhas, mas elas não são necessárias sempre e em todo lugar
Muitas vezes há várias formas de agrupar os dados e todas fazem sentido, então qualquer clusterização final escolhida é imperfeita
Hmm… talvez algo como clusterização quântica pudesse ser um projeto interessante
Minha memória está meio nebulosa agora, mas lembro de ter tentado o algoritmo hdbscan, ou seja, clusterização hierárquica. Em um grafo na escala do GitHub, não cabia na memória
No fim, usei algo parecido com clusterização hierárquica, uma mistura de louvain/leiden/uma abordagem própria, e o que aparece no mapa final é o resultado disso
Quitlessia e NeoQuitlessia… esses nomes são perversos
Doom Emacs está em NeoQuitlessia, não em Emacsia, e surpreendentemente isso faz sentido :)
Nós não vamos sair
Fico curioso sobre como são determinadas as conexões entre repositórios
Verifiquei alguns dos meus repositórios, e algumas conexões não parecem ter referência em nenhuma direção
Basicamente, como outros tinham suposto, as linhas representam as maiores pontuações de similaridade com base nas “pessoas que deram estrela”, e o mapa inteiro também é formado com base nisso
Pode ser confuso, mas as linhas só aparecem quando você clica em um país específico
Imagino que haja um limiar hardcoded para decidir se uma aresta é criada ou não. Por exemplo, criar uma aresta se a similaridade de Jaccard entre A e B for maior que 0,2