Mapa de GitHub
(github.com/anvaka)- Map of GitHub es un mapa que coloca más de 690 mil proyectos de GitHub como puntos, y los proyectos con muchos stargazers en común quedan más cerca entre sí
- Para crear el mapa se usó el dataset público de eventos de actividad de GitHub en Google BigQuery, y se utilizaron aproximadamente 500 millones de datos de stars de eventos entre febrero de 2011 y mayo de 2025
- Para calcular la relación entre repositorios se utilizó la Jaccard Similarity exacta; una computadora doméstica con 24GB de RAM no fue suficiente, así que el procesamiento se hizo durante varias horas en una instancia de AWS EC2 con 512GB de RAM
- Para el clustering se probaron varios algoritmos y finalmente se eligió Leiden clustering; como resultado, unos 690 mil proyectos quedaron divididos en más de 1,500 clústeres
- El renderizado se implementó combinando una herramienta propia de layout con maplibre, GeoJSON y tippecanoe, y una parte importante de las etiquetas de nombres de países fue generada con ayuda de ChatGPT
Resumen del proyecto
- Map of GitHub es un mapa que visualiza más de 690 mil proyectos de GitHub
- Cada punto representa un proyecto
- Los proyectos con más usuarios que les dieron star en común se colocan más cerca en el mapa
Versión pública
- Current release, May 10, 2025: 690 mil proyectos, 1,500 clústeres
- Initial release, May 8, 2023: 400 mil proyectos, 1,000 clústeres
Recolección de datos y cálculo de similitud
- En la primera etapa se obtiene qué usuario le dio star a qué repositorio
- Se usa el dataset público de eventos de actividad de GitHub en Google BigQuery
- El período cubierto va de febrero de 2011 a mayo de 2025
- En este proceso se obtuvieron aproximadamente 500 millones de stars
- En la segunda etapa se calcula la Jaccard Similarity exacta entre cada repositorio
- La carga de cálculo era demasiado grande para una computadora doméstica con 24GB de RAM
- En una instancia de AWS EC2 con 512GB de RAM se procesó en unas pocas horas
- Se probaron otros métodos de similitud, pero Jaccard dio los resultados más confiables
Clustering y layout del mapa
- En la tercera etapa se probaron varios algoritmos de clustering para agrupar los repositorios
- Finalmente se prefirió Leiden clustering, y alrededor de 690 mil proyectos quedaron divididos en más de 1,500 clústeres
- En la cuarta etapa se usa ngraph.forcelayout propio para posicionar los nodos dentro de cada clúster
- Para la disposición global de los clústeres se usan configuraciones separadas
Método de renderizado
- La quinta etapa es el proceso de renderizar el mapa
- A diferencia de proyectos anteriores, se usa maplibre para no reinventar la rueda
- Los datos se convierten al formato GeoJSON
- Para generar los tiles se usa tippecanoe
- Después se construye la experiencia de exploración del mapa
Generación de etiquetas de nombres de países
- Muchas de las etiquetas de países que aparecen en el mapa se generan con ayuda de ChatGPT
- Si encuentras una etiqueta incorrecta, puedes corregirla con clic derecho y enviar un pull request
- El prompt del sistema para generar etiquetas trata cada grupo de repositorios de GitHub como un “país” de una comunidad de programación específica y pide crear nombres únicos y fáciles de recordar
- El nombre debe ser breve, de 1 a 3 palabras
- Debe capturar el tema común, la tecnología o el propósito de ese grupo de repositorios
- Debe evitar expresiones genéricas como “JSWorld”, “UI”, “Web”, “Forge”, “Archipelago”, “Hub”, “Republic” o “Nexus”
- No debe limitarse a combinar nombres de repositorios parecidos
- Debe distinguirse de otros nombres de países lo suficiente como para identificarse de inmediato en el mapa
- La entrada del usuario incluye
repoListyrepoNamesOnly, y se solicita analizar los temas y tecnologías concretos de esos repositorios para crear un nombre - Si el LLM devuelve un nombre demasiado parecido a uno anterior, se le hace reintentar y se aumenta la temperature para inducir resultados más creativos
Búsqueda y diseño
- La caja de búsqueda se implementa indexando un volcado simple de todos los repositorios por primera letra o por autor
- Si escribes
aen la caja de búsqueda, encuentra los repositorios que empiezan conay los muestra en el cliente con un fuzzy matcher - Al autor le gusta la representación actual de los datos, pero todavía está buscando el estilo adecuado para el diseño visual del mapa
- Si tienes experiencia en diseño de mapas o ideas visuales, pide que las compartan
Licencia
- El repositorio se publica bajo la licencia MIT
- Si usas los datos en otro trabajo, se pide considerar atribución a este proyecto
1 comentarios
Comentarios en Hacker News
Por alguna razón, torvalds/linux está en Fronterra junto a proyectos de JS, listas awesome-X y checklists de frontend
O los hackers del kernel de repente se enamoraron del frontend, o, más probablemente, parece que no hay mucho solapamiento entre la gente que escribe código y la gente que pone estrellas a proyectos en GitHub
No salen como similares porque tengan relación semántica, sino simplemente porque ambos son populares
Pasaba el mismo problema en el mapa de reddit: https://anvaka.github.io/map-of-reddit/ — todos los subreddits populares terminaban siendo “similares” entre sí
Aun así, sigue funcionando bien para proyectos pequeños y menos conocidos :D
Aunque, pensando en los recursos necesarios para descargar cada archivo y calcular embeddings, probablemente no era viable en la práctica
https://xkcd.com/1138/
El enlace real es: https://anvaka.github.io/map-of-github/
Me dio risa ver que una zona de Among Us se llama Sussex
Me sorprendió lo pequeña que es Rustland. Apenas será como un estado dentro de Clouderra
También es interesante que tanto Bevy como Veloren estén en Rustland. Supongo que sus estrellas vienen más de la comunidad de Rust que de la comunidad de desarrollo de juegos
Tiene sentido en el sentido de que el ecosistema de Rust sigue siendo relativamente pequeño y parece haber mucha gente de “X, pero en Rust”
Parece que todos sobreestimamos el tamaño de nuestra propia burbuja
Entonces “X but in Rust” podría terminar yéndose hacia “X” en vez de hacia “RustLand”
Me parece muy divertido poder encontrar aquí mi proyecto mapbox-gl-utils
https://anvaka.github.io/map-of-github/#12/24.78947/18.85186
Sin función de búsqueda, encontrar un proyecto específico usando solo el mapa se vuelve un minijuego divertido :-)
Como fan de Julia, me sorprende que julialang/julia tenga tan pocas conexiones
Es un lenguaje de nicho, pero tampoco me parece que verse tan aislado en este mapa esté tan desconectado de la experiencia de usuarios o desarrolladores
julialang/julia en sí está cerca de tensorflow y opencv, mientras que los paquetes reales de Julia están agrupados en otro lugar, lo que parece mostrar la diferencia entre “usuarios potenciales” y “usuarios reales”
Mucha gente que puso estrella al proyecto Julia en sí eran usuarios de Python para cómputo numérico que andaban buscando un nuevo Python, pero la mayoría se quedó en Python, así que sus otras estrellas también están del lado de Python numérico
En cambio, la gente que puso estrellas a los paquetes de JuliaLand sí son usuarios reales de Julia, así que, de forma bastante lógica, están agrupados cerca de Moleculandia, AstroSpace y Quantumia
Es un enfoque muy limpio y creativo, pero sinceramente tengo sentimientos encontrados sobre si la metáfora de país/mapa es la mejor
En muchos casos, solo con los nombres no queda claro, así que tienes que hacer zoom para entender qué representa cada cosa
Quizá habría sido más interesante hacer clustering jerárquico, poner etiquetas generadas por LLM más descriptivas y fieles, y luego mostrar con líneas la conectividad promedio entre clústeres de nivel superior
Como alguien que hizo ese tipo de diagramas en los 90 y aprendió sus límites casi de inmediato, esto me gusta porque no exagera lo que afirma. No es un paper, solo es una vista
Me gustan los diagramas donde los ejes significan algo. Líneas, formas, cajas/grupos, distancia, X contra Y, color, grosor, textura, fondo, primer plano, cosas así
Lo simple también está bien. Demasiado seguido la gente dibuja líneas solo para verse cool sin que signifiquen nada, y esto es simplemente una imagen con algunos grupos y personalidad. ¿No está bien eso?
Claro que las líneas me siguen gustando, pero no siempre hacen falta en todo lugar
A menudo hay varias formas válidas de agrupar los datos, así que cualquier clustering final que elijas va a ser imperfecto
Mmm… quizá hacer algo como clustering cuántico podría ser un proyecto divertido
Recuerdo haber intentado con el algoritmo hdbscan, o sea, clustering jerárquico, aunque ya lo tengo algo borroso. Con un grafo del tamaño de GitHub no cabía en memoria
Al final usé algo parecido al clustering jerárquico, mezclado con louvain/leiden/un enfoque propio, y eso es lo que se ve en el mapa final
Quitlessia y NeoQuitlessia… los nombres son malvados
Doom Emacs está en NeoQuitlessia y no en Emacsia, y sorprendentemente tiene sentido :)
No vamos a salir
Me pregunto cómo se determinan las conexiones entre repositorios
Revisé algunos de mis repos y en algunas conexiones no se ve ninguna referencia en ninguna dirección
Básicamente, como adivinaron otros, las líneas representan las puntuaciones de similitud más altas según la gente que les dio estrella, y todo el mapa también se forma con base en eso
Puede confundir, pero las líneas solo aparecen cuando haces clic en un país en particular
Supongo que debe haber algún umbral codificado a mano para decidir si se crea una arista o no. Por ejemplo, si la similitud de Jaccard entre A y B es mayor que 0.2, entonces se crea una arista