GitHub-Karte
(github.com/anvaka)- Map of GitHub ist eine Karte, auf der mehr als 690.000 GitHub-Projekte als Punkte angeordnet sind; je mehr gemeinsame Stargazer Projekte haben, desto näher liegen sie beieinander
- Für die Erstellung der Karte wurde der öffentliche Datensatz der GitHub-Aktivitätsereignisse aus Google BigQuery verwendet; dabei kamen aus Ereignissen von Februar 2011 bis Mai 2025 rund 500 Millionen Star-Datenpunkte zum Einsatz
- Für die Berechnung der Beziehungen zwischen Repositories wurde die exakte Jaccard Similarity verwendet; ein Heimcomputer mit 24 GB RAM reichte dafür nicht aus, daher lief die Verarbeitung mehrere Stunden lang auf einer AWS EC2-Instanz mit 512 GB RAM
- Für das Clustering wurden mehrere Algorithmen getestet, bevor man sich für Leiden clustering entschied; im Ergebnis wurden rund 690.000 Projekte in mehr als 1.500 Cluster aufgeteilt
- Das Rendering wurde mit einem eigenen Layout-Tool in Kombination mit maplibre, GeoJSON und tippecanoe umgesetzt; viele der Ländernamen-Labels wurden mit Hilfe von ChatGPT erzeugt
Projektüberblick
- Map of GitHub ist eine Visualisierung von mehr als 690.000 GitHub-Projekten
- Jeder Punkt steht für ein einzelnes Projekt
- Projekte, die von vielen gemeinsamen Nutzern mit einem Star versehen wurden, werden auf der Karte näher beieinander platziert
Öffentliche Versionen
- Current release, May 10, 2025: 690.000 Projekte, 1.500 Cluster
- Initial release, May 8, 2023: 400.000 Projekte, 1.000 Cluster
Datenerfassung und Ähnlichkeitsberechnung
- Im ersten Schritt wurde erfasst, welcher Nutzer welchem Repository einen Star gegeben hat
- Verwendet wurde der öffentliche Datensatz der GitHub-Aktivitätsereignisse aus Google BigQuery
- Der betrachtete Zeitraum reicht von Februar 2011 bis Mai 2025
- Dabei wurden rund 500 Millionen Star-Datensätze gewonnen
- Im zweiten Schritt wurde die exakte Jaccard Similarity zwischen den einzelnen Repositories berechnet
- Für einen Heimcomputer mit 24 GB RAM war die Rechenlast zu hoch
- Auf einer AWS EC2-Instanz mit 512 GB RAM war die Verarbeitung innerhalb weniger Stunden möglich
- Es wurden auch andere Ähnlichkeitsverfahren getestet, aber Jaccard lieferte die verlässlichsten Ergebnisse
Clustering und Kartenlayout
- Im dritten Schritt wurden mehrere Clustering-Algorithmen ausprobiert, um Repositories zu gruppieren
- Letztlich wurde Leiden clustering bevorzugt; dabei wurden knapp 690.000 Projekte in mehr als 1.500 Cluster aufgeteilt
- Im vierten Schritt wurde für die Anordnung der Knoten innerhalb der Cluster das eigene ngraph.forcelayout verwendet
- Für die globale Anordnung der Cluster insgesamt wurden separate Einstellungen genutzt
Rendering-Verfahren
- Der fünfte Schritt ist der Rendering-Prozess der Karte
- Anders als bei früheren Projekten wurde maplibre verwendet, um das Rad nicht neu zu erfinden
- Die Daten werden in das GeoJSON-Format umgewandelt
- Für die Erzeugung der Tiles kommt tippecanoe zum Einsatz
- Anschließend wurde das Erlebnis der Kartennavigation gestaltet
Erzeugung der Ländernamen-Labels
- Viele der auf der Karte angezeigten Länder-Labels wurden mit Hilfe von ChatGPT erzeugt
- Wenn du ein falsches Label entdeckst, kannst du es per Rechtsklick korrigieren und einen Pull Request senden
- Der System-Prompt für die Label-Erzeugung behandelt Bündel von GitHub-Repositories als „Länder“ bestimmter Programmier-Communitys und verlangt die Erstellung einzigartiger, einprägsamer Namen
- Die Namen sollen kurz sein und aus 1 bis 3 Wörtern bestehen
- Sie sollen das gemeinsame Thema, die Technologie oder den Zweck des jeweiligen Repository-Bündels erfassen
- Allgemeine Ausdrücke wie „JSWorld“, „UI“, „Web“, „Forge“, „Archipelago“, „Hub“, „Republic“ oder „Nexus“ sollen vermieden werden
- Ähnliche Repository-Namen sollen nicht einfach nur zusammengefügt werden
- Sie sollen sich ausreichend von anderen Ländernamen unterscheiden, damit sie auf der Karte sofort erkennbar sind
- Die Nutzereingabe enthält
repoListundrepoNamesOnly; daraus soll ein Name erzeugt werden, nachdem die konkreten Themen und Technologien dieser Repositories analysiert wurden - Wenn das LLM einen Namen zurückgibt, der früheren Namen zu ähnlich ist, wird ein neuer Versuch ausgelöst und die Temperature erhöht, um kreativere Ergebnisse zu fördern
Suche und Design
- Das Suchfeld wurde umgesetzt, indem ein einfacher Dump aller Repositories nach Anfangsbuchstaben oder Autor indexiert wurde
- Wenn im Suchfeld
aeingegeben wird, werden Repositories gefunden, die mitabeginnen, und clientseitig mit einem fuzzy matcher angezeigt - Mit der aktuellen Datendarstellung ist man zufrieden, beim visuellen Design der Karte sucht man jedoch noch nach dem richtigen Stil
- Wer Erfahrung mit Kartendesign oder visuelle Ideen hat, ist eingeladen, sie zu teilen
Lizenz
- Das Repository wird unter der MIT-Lizenz veröffentlicht
- Wenn die Daten in anderen Arbeiten verwendet werden, wird darum gebeten, eine attribution für dieses Projekt in Betracht zu ziehen
1 Kommentare
Meinungen auf Hacker News
Aus irgendeinem Grund liegt torvalds/linux in Fronterra, neben JS-Projekten, awesome-X-Listen und Frontend-Checklisten.
Entweder haben Kernel-Hacker plötzlich ihre Liebe zum Frontend entdeckt, oder – wahrscheinlicher – die Leute, die Code schreiben, und die Leute, die GitHub-Projekten Sterne geben, überschneiden sich nicht besonders stark.
Sie erscheinen nicht ähnlich, weil sie semantisch zusammenhängen, sondern einfach, weil beide populär sind.
Dasselbe Problem gab es auch bei der Reddit-Karte: https://anvaka.github.io/map-of-reddit/ — beliebte Subreddits werden alle miteinander „ähnlich“.
Für kleine und weniger bekannte Projekte funktioniert es aber weiterhin gut :D
Angesichts der Ressourcen, die nötig wären, um jede Datei herunterzuladen und Embeddings zu berechnen, ist das aber vermutlich nicht praktikabel.
https://xkcd.com/1138/
Der eigentliche Link: https://anvaka.github.io/map-of-github/
Ich musste lachen, als ich sah, dass die Among-Us-Region Sussex heißt.
Ich war überrascht, dass Rustland so klein ist. Es ist nur ungefähr ein Bundesstaat innerhalb von Clouderra.
Interessant ist auch, dass Bevy und Veloren beide in Rustland liegen. Vermutlich kamen die Sterne eher aus der Rust-Community als aus der Game-Dev-Community.
Das ist nachvollziehbar, wenn man bedenkt, dass das Rust-Ökosystem noch relativ klein ist und es anscheinend viele „X mit Rust“-Leute gibt.
Offenbar überschätzen alle die Größe ihrer eigenen Bubble.
Dann kann „X, aber in Rust“ auch eher bei „X“ landen als in „RustLand“.
Es macht wirklich Spaß, mein Projekt mapbox-gl-utils hier finden zu können.
https://anvaka.github.io/map-of-github/#12/24.78947/18.85186
Ohne Suchfunktion wird es zu einem lustigen Minigame, nur anhand der Karte ein bestimmtes Projekt zu finden :-)
Als Julia-Fan überrascht es mich, dass julialang/julia so wenige Verbindungen hat.
Es ist zwar eine Nischensprache, aber dass sie auf dieser Karte so isoliert wirkt, scheint auch gar nicht so weit von der Nutzer- oder Entwicklererfahrung entfernt zu sein.
Dass julialang/julia selbst in der Nähe von tensorflow und opencv liegt, während die eigentlichen Julia-Pakete woanders gruppiert sind, zeigt wohl den Unterschied zwischen „erhofften Nutzern“ und „tatsächlichen Nutzern“.
Viele Leute, die dem Julia-Projekt selbst einen Stern gegeben haben, waren Numerical-Computing-Python-Nutzer auf der Suche nach einem neuen Python, blieben aber größtenteils bei Python, weshalb ihre anderen Sterne ebenfalls im Numerical-Computing-Python-Bereich liegen.
Die Leute, die JuliaLand-Paketen Sterne gegeben haben, sind dagegen tatsächliche Julia-Nutzer und gruppieren sich plausiblerweise in der Nähe von Moleculandia, AstroSpace und Quantumia.
Ein sehr sauberer und kreativer Ansatz, aber ich bin ehrlich gesagt hin- und hergerissen, ob die Land-/Kartenmetapher die beste ist.
In vielen Fällen ist allein anhand des Namens nicht klar, was dargestellt wird; man muss hineinzoomen, um es zu verstehen.
Vielleicht wäre hierarchisches Clustering interessanter gewesen, mit erklärenderen und treffenderen, per LLM generierten Labels, und Linien, die die durchschnittliche Konnektivität zwischen den Top-Level-Clustern zeigen.
Als jemand, der solche Bilder in den 90ern zuerst gebaut und fast sofort ihre Grenzen kennengelernt hat, gefällt mir, dass dies keine überzogenen Ansprüche erhebt. Es ist kein Paper, sondern einfach eine Ansicht.
Ich mag Diagramme, bei denen die Achsen Bedeutung haben. Ebenso Linien, Formen, Boxen/Gruppen, Abstände, X gegen Y, Farben, Stärke, Textur, Hintergrund, Vordergrund und so weiter.
Einfachheit ist auch gut. Viel zu oft werden ohne jede Bedeutung Linien gezogen, nur um schick auszusehen; hier ist es einfach ein Bild mit ein paar Gruppierungen und Charakter. Ist doch gut, oder?
Klar mag ich Linien weiterhin, aber sie sind nicht immer und überall nötig.
Es gibt oft mehrere sinnvolle Möglichkeiten, Daten zu gruppieren, daher ist jede letztlich gewählte Clusterung unvollkommen.
Hm … vielleicht wäre so etwas wie Quanten-Clustering ein interessantes Projekt.
Es ist etwas verschwommen, aber ich erinnere mich, hdbscan, also hierarchisches Clustering, ausprobiert zu haben. Für einen Graphen in GitHub-Größe passte das nicht in den Speicher.
Am Ende habe ich etwas Ähnliches wie hierarchisches Clustering verwendet, eine Mischung aus louvain/leiden/einem selbstgebauten Ansatz, und was auf der finalen Karte zu sehen ist, ist das Ergebnis.
Quitlessia und NeoQuitlessia … diese Namen sind böse.
Doom Emacs liegt nicht in Emacsia, sondern in NeoQuitlessia, und erstaunlicherweise ergibt das Sinn :)
Wir werden nicht beenden.
Ich frage mich, wie die Verbindungen zwischen Repositories bestimmt werden.
Ich habe ein paar meiner Repositories überprüft, und bei einigen Verbindungen sehe ich in keiner Richtung eine Referenz.
Im Grunde stellen die Linien, wie andere schon vermutet haben, die höchsten Ähnlichkeitswerte auf Basis der „Leute, die Sterne gegeben haben“ dar, und die gesamte Karte entsteht ebenfalls auf dieser Grundlage.
Etwas verwirrend: Die Linien erscheinen nur, wenn man ein bestimmtes Land anklickt.
Vermutlich gibt es einen hart codierten Schwellenwert dafür, ob eine Kante erzeugt wird oder nicht. Zum Beispiel: Wenn die Jaccard-Ähnlichkeit zwischen A und B größer als 0,2 ist, wird eine Kante erzeugt.