
Automatische Erkennung und Verfolgung von Fake-Engagement auf GitHub — tägliche CI, keine Infrastruktur
Automatische Erkennung und Verfolgung von Fake-Engagement auf GitHub
Ein JS Labs-Projekt —
Teil der AI Slop Intelligence-Initiative.
Läuft täglich. Bewertet jedes verdächtige Konto. Erkennt koordinierte Bot-Kampagnen.
Öffnet direkt Issues in kompromittierten Repos, damit Maintainer handeln können.
Unterstütze dieses Projekt
BTC 3QjWqhQbHdHgWeYHTpmorP8Pe1wgDjJy54
ETH 0x5851e6145F4773d1585b8686095FB16E368a4dA1
ZEC t1KSR5YkNPbjqRSCoLKo5AddFWdm9Kzxh1B
GitHub-Sterne sind ein Vertrauenssignal. Sie bestimmen, was Entwickler bewerten, worauf sie sich verlassen und was sie weiterempfehlen. Dieses Signal wird systematisch korrumpiert.
Während des KI-Booms 2024-2026 entstand eine Branche von Bot-Farmen, die Glaubwürdigkeit für qualitativ minderwertige, oft bösartige Repositories herstellten. Ein Projekt mit 800 Sternen in 48 Stunden wirkt für Entwickler, die Suchergebnisse überfliegen, legitim. Genau das ist der Punkt. Das Ziel von Fake-Engagement sind nicht die Sterne selbst, sondern der soziale Beweis, den diese Sterne erzeugen, und die nachgelagerten Entscheidungen, die dieser soziale Beweis beeinflusst.
Das Muster ist erkennbar. Konten, die in derselben Woche erstellt wurden, keine Bio, keine Follower, keine eigenen Repositories, die innerhalb eines 2-Stunden-Fensters dieselben 15 Repos mit Sternen versehen. Nicht eine Kampagne, sondern dutzende laufen gleichzeitig, jeden Tag, über tausende Konten hinweg. Die Daten zeigen Repos, bei denen 185 von 185 Interagierenden Bots sind. Ein 100%-Fake-Anteil. Komplette Trending-Platzierungen, die auf nichts aufbauen.
phantomstars wurde entwickelt, weil dieses Problem lösbar ist. Das Signal-Rausch-Verhältnis in der öffentlichen GitHub-API ist derzeit noch hoch genug, dass koordinierte Kampagnen deutliche Fingerabdrücke hinterlassen. Dieses Projekt liest diese Fingerabdrücke, veröffentlicht die Rohdaten und benachrichtigt betroffene Repository-Maintainer direkt.
Dies ist Teil der umfassenderen Arbeit zu AI Slop Intelligence bei JS Labs, laufende Forschung zu den Mechanismen und messbaren Auswirkungen von minderwertigen KI-generierten Inhalten, die Entwickler-Ökosysteme überfluten. Fake-Engagement ist kein Randproblem. Es ist der Verteilungsmechanismus, der Slop vor echte Nutzer bringt.
phantomstars führt einen täglichen GitHub-Actions-Job aus, der:
r/osinttools und r/coolgithubprojects hinzufügt, indem GitHub-Repo-Links aus den letzten 2 Tagen extrahiert werdenKeine Server. Keine Datenbanken. Keine Infrastrukturkosten.
Ja. Wenn der Fake-Anteil eines Repos 40% übersteigt oder eine koordinierte Kampagne erkannt wird, öffnet phantomstars direkt ein Issue in diesem Repository. Das Issue enthält die vollständige Verdächtigen-Tabelle, Kampagnenmitgliedschaft, zusammengesetzte Bewertungen und Erstellungsdaten der Konten: alles, was ein Maintainer zur Untersuchung und Meldung an GitHub benötigt.
Wenn Issues in einem Ziel-Repo deaktiviert sind, wird die Benachrichtigung still übersprungen und im Scan-Log protokolliert.
Ja.
owner/repo ein und führe einen gezielten Scan aus.Warum die Trennung:
Ja. Wenn dein Konto in data/suspects.jsonl erscheint und du glaubst, dass die Klassifizierung falsch ist, öffne ein False-Positive-Issue mit der bereitgestellten Vorlage. Meldungen werden manuell geprüft, bevor ein Allowlist-Eintrag hinzugefügt wird. Die Allowlist wird in data/allowlist.txt gespeichert; dort aufgeführte Konten werden von allen zukünftigen Scans und vom Verdächtigen-Ledger ausgeschlossen.
Eine Kampagnen-ID (z. B. c-a3f9b2e1) ist ein deterministischer 8-stelliger Hex-Fingerabdruck, der aus dem SHA-256-Hash der sortierten Menge der Mitglieder-Logins in dieser Kampagne abgeleitet wird. Dieselbe Gruppe von Konten erzeugt über unabhängige Scan-Läufe hinweg dieselbe Kampagnen-ID, was eine Längsschnittverfolgung ermöglicht. Es ist kein Repo-Name, kein Benutzername und keine externe Kennung.
Stabilität: Die ID ist stabil, solange sich die Mitgliedermenge der Kampagne nicht ändert. Wenn zwischen Scans Bots hinzugefügt oder gesperrt werden, ändert sich die ID, weil sich die Mitgliedschaft geändert hat. Das ist erwartet und spiegelt die reale Drift in der Zusammensetzung von Bot-Farmen wider.
Ja. Das Erstellungsdatum jedes Kontos wird über die GitHub-GraphQL-API abgerufen (createdAt-Feld) und in jedem Verdächtigendatensatz als account_created_at gespeichert. Es ist auch die primäre Eingabe für den Kontoalter-Score, das stärkste einzelne Signal für Fake-Konten. Konten, die innerhalb von 2 Tagen nach ihrer Erstellung interagieren, erhalten allein aufgrund des Alters einen Score von 1.0.
Einzelne Scores haben durchaus relevante False-Positive-Raten. Ein neuer Entwickler mit spärlichem Profil erreicht legitimerweise 0.75+. Das Tool berücksichtigt dies, indem es kampagnenbezogene Beweise verlangt, bevor Issues erstellt werden; ein einzelnes verdächtiges Konto reicht nicht aus. Ein koordiniertes Cluster aus 40+ Konten, die alle in derselben Woche erstellt wurden, alle 0.75+ erzielen, alle innerhalb von 90 Minuten interagieren, ist eine andere Sache. Hier wird Vertrauen handlungsrelevant.
Die Daten sind immer probabilistisch. Die Issue-Texte sagen das ausdrücklich. Das Ziel ist, Maintainern das Signal und die rohen Beweise zu liefern, um ihr eigenes Urteil zu fällen.
Jedes Konto erhält einen zusammengesetzten Verdachts-Score (0.0 = sauber, 1.0 = vermutlich fake) aus vier Signalen:
Klassifizierungsschwellen:
| Score | Klassifizierung |
|---|---|
| ≥ 0.75 | likely_fake |
| ≥ 0.45 | suspicious |
| < 0.45 | clean (nicht gespeichert) |
Eine Kampagne ist eine Gruppe von ≥ 4 verdächtigen Konten, die alle innerhalb eines 3-Stunden-Fensters mit demselben Repo interagiert haben. Der Algorithmus verwendet Union-Find, um verbundene Komponenten zu bilden; Konten, die innerhalb des Fensters gemeinsam interagiert haben, werden zusammengeführt, und jede Komponente über der Mindestgröße wird als koordinierte Kampagne markiert.
Kampagnen-IDs sind stabile SHA-256-Fingerabdrücke der sortierten Mitgliedermenge. Dieselbe Kampagne, die an aufeinanderfolgenden Tagen erkannt wird, hat dieselbe ID, solange sich die Mitgliedschaft nicht ändert.
Warum Kampagnen das eigentliche Signal sind: Einzelne Scores haben relevante False-Positive-Raten. Ein neuer Entwickler mit spärlichem Profil kann allein 0.80 erreichen. Vierzig Konten, die alle 0.75+ erzielen, in derselben Woche erstellt wurden und alle innerhalb von 90 Minuten dasselbe Repo mit Sternen versehen, sind kein Zufall. Das Kampagnensignal ist der Punkt, an dem die Daten handlungsrelevant werden: der Unterschied zwischen einem verdächtigen Datenpunkt und dem Beweis einer koordinierten Operation.
Alle Ergebnisse werden in data/suspects.jsonl und data/repos.jsonl eingecheckt, ein JSON-Datensatz pro Zeile, append-only. Die GitHub-Actions-Job-Zusammenfassung (nach jedem Lauf in der Actions-Oberfläche sichtbar) liefert einen formatierten Bericht pro Scan.
suspects.jsonl — ein Datensatz pro gekennzeichnetem Konto pro Scan:```json { "login": "user98432", "account_age_score": 0.9, "profile_score": 0.8, "repo_pattern_score": 0.8, "activity_score": 0.85, "composite": 0.842, "classification": "likely_fake", "campaign_id": "c-a3f9b2e1", "scan_date": "2026-05-17", "account_created_at": "2026-05-15", "target_repos": ["owner/repo-a", "owner/repo-b"] }
**repos.jsonl** — ein Datensatz pro Ziel-Repository pro Scan:```json
{
"full_name": "owner/suspicious-repo",
"total_scanned": 87,
"likely_fake": 62,
"suspicious": 18,
"known_likely_fake": 27,
"known_likely_fake_ratio": 0.310,
"repeat_offenders": 11,
"allowlisted_excluded": 3,
"fakeness_ratio": 0.713,
"classification": "likely_fake",
"campaign_count": 3,
"discovery_sources": ["github_search_recent", "reddit_osinttools"],
"event_sample_complete": false,
"scan_date": "2026-05-17"
}
Abfragebeispiele:```bash
jq 'select(.scan_date == "2026-05-17" and .classification == "likely_fake") | .login' data/suspects.jsonl
jq 'select(.account_created_at >= "2026-05-14") | [.login, .account_created_at, .classification] | @tsv' -r data/suspects.jsonl
jq 'select(.scan_date == "2026-05-17") | [.full_name, .fakeness_ratio, .likely_fake] | @tsv' -r data/repos.jsonl | sort -t$'''\t''' -k2 -rn
jq 'select(.scan_date == "2026-05-17") | [.full_name, .known_likely_fake_ratio, .repeat_offenders] | @tsv' -r data/repos.jsonl | sort -t$'''\t''' -k2 -rn
jq 'select(.campaign_id == "c-a3f9b2e1") | [.login, .account_created_at, .composite] | @tsv' -r data/suspects.jsonl
jq 'select(.login == "user98432") | .target_repos[]' data/suspects.jsonl
jq 'select(.fakeness_ratio >= 0.6) | [.full_name, .fakeness_ratio, .campaign_count] | @tsv' -r data/repos.jsonl | sort -t$'\t' -k2 -rn
---
## Einrichtung
### 1. Forke dieses Repository
Dein Fork besitzt die Daten. Nach jedem täglichen Lauf werden die Ergebnisse in `data/suspects.jsonl` und `data/repos.jsonl` in deinem Fork committet.
### 2. Füge ein GitHub-PAT-Secret hinzu
Erstelle einen **klassischen** Personal Access Token mit den folgenden Bereichen:
- `public_repo`: öffentliche Repo-Events und Stargazer lesen, Issues in öffentlichen Repos erstellen
- `read:user`: Benutzerprofile über GraphQL abrufen
**Einstellungen → Geheimnisse und Variablen → Actions → Neues Repository-Geheimnis** → nenne es `GH_TOKEN`.
> Das Standard-`GITHUB_TOKEN` hat eingeschränkte Ratenlimits und kann den GraphQL-Endpunkt für Benutzer nicht mit voller Kapazität aufrufen. Ein PAT ist erforderlich.
### 3. Aktiviere Actions
**Actions → GitHub Actions aktivieren** auf deinem Fork. Der Workflow läuft täglich um **07:00 Uhr britischer Zeit** unter Verwendung der `Europe/London`-Uhr:
- **06:00 UTC** während der britischen Sommerzeit
- **07:00 UTC** während der Greenwich Mean Time
Es ist keine zusätzliche Umgebungsvariable für die Zeitplanung erforderlich. Der GitHub-Actions-Cron ist ausschließlich UTC-basiert, sodass der Workflow zu beiden UTC-Stunden ausgelöst wird und nur fortfährt, wenn die lokale Londoner Zeit 07:00 Uhr ist. Manueller Trigger über **Actions → Daily Phantom Stars Scan → Workflow ausführen** verfügbar.
Nach jedem Lauf ist der formatierte Scan-Bericht unter **Actions → [run] → Zusammenfassung** sichtbar.
### 4. Lokal ausführen```bash
git clone https://github.com/YOUR_USERNAME/phantomstars.git
cd phantomstars
python -m venv venv && source venv/bin/activate
pip install -e .
GH_TOKEN=ghp_your_token python -m phantomstars.main
Für einen Ad-hoc-Lokallauf nach der Einrichtung:```bash GH_TOKEN=ghp_your_token python -m phantomstars.main
Um ein einzelnes Repository anstelle des normalen Discovery-Sets zu scannen:```bash
PHANTOMSTARS_TARGET_REPO=owner/repo GH_TOKEN=ghp_your_token python -m phantomstars.main
Benutzer können eine einmalige Repo-Überprüfung auf zwei Arten anfordern:
Repo Check Request und geben Sie das Ziel-Repo sowie die gewünschte Tiefe an.target_repo: owner/reporequest_depth: recent oder lifetime-requestAktuelles Verhalten:
recent: führt den gezielten Scan der jüngsten Interaktionen sofort aus.lifetime-request: führt einen gezielten Lifetime-Scan über historische Stars und Forks nur für dieses Repo aus.Schutzvorkehrungen für den Lifetime-Modus:
phantomstars/ ├── .github/ │ ├── workflows/daily-scan.yml # Runs daily at 07:00 Europe/London │ └── ISSUE_TEMPLATE/false_positive.yml ├── src/phantomstars/ │ ├── config.py # All constants, no argparse, no env parsing │ ├── models.py # Frozen dataclasses │ ├── github_client.py # REST + GraphQL, tenacity retries, rate-limit aware │ ├── heuristics.py # Per-user composite scoring engine │ ├── campaigns.py # Timestamp clustering + union-find │ ├── storage.py # JSONL append + query helpers │ ├── reporter.py # README dashboard injector │ ├── notifier.py # GitHub Issues notifier (files on targeted repos) │ └── main.py # Orchestration entry point ├── tests/ │ ├── conftest.py │ ├── test_heuristics.py │ └── test_campaigns.py ├── data/ │ ├── suspects.jsonl # Append-only account findings ledger │ ├── repos.jsonl # Append-only per-repo intelligence │ └── allowlist.txt # Accounts excluded from future scans └── pyproject.toml
---
## Einschränkungen und bekannte Fehlermodi
- **Events-API-Obergrenze:** maximal 300 letzte Events pro Repo. Repos mit Tausenden von Sternen pro Tag sind nur teilweise abgedeckt.
- **Coverage-Flag:** Repos, die die 300-Event-Grenze erreichen, werden in Berichten und Dashboards als `capped` markiert; die Verhältnisse für diese Repos sind konservative Stichproben und keine Ganztageszählungen.
- **Suchindex-Verzögerung:** Der Suchindex von GitHub ist letztendlich konsistent. Repos, die Sekunden vor der Scan-Grenze erstellt wurden, können übersehen werden.
- **Heuristik-Drift:** Bot-Betreiber passen sich an. Die Score-Gewichte müssen möglicherweise regelmäßig angepasst werden; passe die Konstanten in `config.py` an.
- **Einzelne Fehlpositive:** Ein neuer Entwickler mit einem spärlichen Profil erreicht isoliert einen Score von 0,75+. Die Mitgliedschaft in einer Kampagne ist das Signal mit hoher Konfidenz.
- **Kampagnen-ID-Drift:** Wenn sich die Mitgliedschaft einer Bot-Farm zwischen Scans ändert (Bots gesperrt, neue Bots hinzugefügt), ändert sich die Kampagnen-ID. Dies spiegelt die tatsächliche Kampagnenentwicklung wider und ist kein Fehler.
- **Rate-Limits:** 5.000 API-Anfragen pro Stunde mit einem authentifizierten PAT. Deutlich innerhalb der Limits für Standard-Trending-Seitengrößen.
- **Issues deaktiviert:** Einige untersuchte Repos deaktivieren Issues. Benachrichtigungen für diese Repos werden stillschweigend übersprungen.
---
## Prozess für Fehlpositive
Wenn dein Konto in `data/suspects.jsonl` erscheint und du glaubst, dass es falsch klassifiziert wurde:
1. Finde deinen Eintrag: `jq 'select(.login == "YOUR_LOGIN")' data/suspects.jsonl`
2. [Erstelle ein Fehlpositiv-Issue](../../issues/new?template=false_positive.yml) mit deinem Login, der Klassifikation, dem Scan-Datum und einer Erklärung
3. Berichte werden manuell geprüft. Verifizierte Fehlpositive werden zu `data/allowlist.txt` hinzugefügt und von allen zukünftigen Scans, Repo-Verhältnissen und Issue-Benachrichtigungen ausgeschlossen.
Hinweis: Das Erstellen eines Issues verändert oder entfernt keine vorhandenen Daten. Das Suspects-Ledger ist append-only. Die Allowlist wirkt sich nur auf zukünftige Scans aus.
---
## Mitwirken```bash
pip install -e ".[dev]"
python -m black .
python -m ruff check .
python -m mypy src
python -m pytest
Alle vier müssen bestanden sein, bevor ein PR erstellt wird.
Dieses Tool führt eine schreibgeschützte Analyse öffentlicher GitHub-Daten mithilfe der offiziellen GitHub-API durch. Wo Issues in gezielten Repositorys erstellt werden, enthalten sie probabilistische Ergebnisse und sind klar als automatisiert gekennzeichnet. Die Ergebnisse sind Indikatoren, keine Anschuldigungen. Fehlalarme existieren und sind zu erwarten.
Entwickelt mit KI als Codierungspartner, als Reaktion auf ein Ökosystemproblem, das teilweise durch KI verursacht wurde.
Apache 2.0. Siehe LICENSE
Erstellt von tg12 · GitHub
Ein JS Labs Projekt · AI Slop Intelligence Dashboards
| Datum | Gescannt | Vermutlich Fake | Verdächtig | Kampagnen | Neue Fakes (24h) |
|---|
| 2026-06-16 | 1846 | 221 | 1625 | 56 | 190 |
| 2026-06-15 | 2274 | 418 | 1856 | 61 | 397 |
| 2026-06-14 | 1953 | 355 | 1598 | 44 | 310 |
| 2026-06-13 | 2012 | 301 | 1711 | 47 | 251 |
| 2026-06-12 | 2298 | 336 | 1962 | 57 | 300 |
| 2026-06-11 | 1957 | 385 | 1572 | 42 | 356 |
| 2026-06-10 | 2043 | 687 | 1356 | 50 | 665 |
| 2026-06-09 | 2199 | 690 | 1509 | 44 | 632 |
| 2026-06-08 | 1913 | 450 | 1463 | 50 | 424 |
| 2026-06-07 | 1797 | 658 | 1139 | 30 | 618 |
| 2026-06-06 | 2625 | 712 | 1913 | 40 | 620 |
| 2026-06-05 | 2403 | 673 | 1730 | 53 | 617 |
| 2026-06-04 | 2237 | 441 | 1796 | 41 | 367 |
| 2026-06-03 | 2331 | 488 | 1843 | 53 | 431 |
| 2026-06-02 | 2795 | 773 | 2022 | 37 | 616 |
| 2026-06-01 | 2490 | 533 | 1957 | 39 | 355 |
| 2026-05-31 | 2302 | 458 | 1844 | 32 | 280 |
| 2026-05-30 | 2576 | 530 | 2046 | 20 | 356 |
| 2026-05-29 | 2838 | 733 | 2105 | 42 | 369 |
| 2026-05-28 | 2748 | 694 | 2054 | 39 | 396 |
| 2026-05-27 | 2193 | 560 | 1633 | 32 | 491 |
| 2026-05-26 | 1930 | 236 | 1694 | 43 | 190 |
| 2026-05-25 | 1526 | 214 | 1312 | 32 | 158 |
| 2026-05-24 | 2170 | 358 | 1812 | 39 | 265 |
| 2026-05-23 | 2548 | 426 | 2122 | 43 | 317 |
| 2026-05-22 | 2318 | 340 | 1978 | 47 | 247 |
| 2026-05-21 | 1981 | 348 | 1633 | 25 | 277 |
| 2026-05-20 | 1613 | 268 | 1345 | 23 | 163 |
| 2026-05-19 | 5463 | 630 | 4121 | 67 | 442 |
| 2026-05-18 | 8838 | 670 | 7950 | 128 | 340 |
| Repo | Interagierende | Vermutlich Fake | Bekannter Fake % | Fake-Anteil % | Kampagnen | Abdeckung | Quellen |
|---|
| freeCodeCamp/freeCodeCamp | 264 | 26 | 0.0% | 9.8% | 1 | vollständig | github_trending |
| Lolner95/use-kimi-on-cursor | 116 | 17 | 26.7% | 14.7% | 1 | vollständig | github_search_recent |
| zmustafa/AzureSupportAgent | 33 | 16 | 36.4% | 48.5% | 1 | vollständig | github_search_recent |
| Free-TV/IPTV | 291 | 14 | 0.3% | 4.8% | 1 | vollständig | github_trending |
| Panniantong/Agent-Reach | 292 | 14 | 0.3% | 4.8% | 1 | begrenzt | github_trending |
| jwasham/coding-interview-university | 288 | 12 | 0.3% | 4.2% | 1 | begrenzt | github_trending |
| Alex-Shayo/bakkes-mod-install | 37 | 10 | 0.0% | 27.0% | 1 | vollständig | github_search_recent |
| Timgt86/yt-downloader-savetube | 37 | 10 | 0.0% | 27.0% | 1 | vollständig | github_search_recent |
| devassisthub/Zelda-TP-PC-Port | 35 | 9 | 0.0% | 25.7% | 1 | vollständig | github_search_recent |
| imohammedyasin/steam-tools | 35 | 9 | 0.0% | 25.7% | 1 | vollständig | github_search_recent |
| lol-toolkit/ltk-manager-lol | 35 | 9 | 0.0% | 25.7% | 1 | vollständig | github_search_recent |
| tor-browser-download/tor-browser | 36 | 9 | 0.0% | 25.0% | 1 | vollständig | github_search_recent |
| claude-code-ai-anthropic/free-claude-code-ai-desktop-app | 38 | 9 | 0.0% | 23.7% | 1 | vollständig | github_search_recent |
| vitaliikapliuk/modelharness | 60 | 9 | 31.7% | 15.0% | 1 | vollständig | github_search_recent |
| shiyu-coder/Kronos | 282 | 9 | 1.1% | 3.2% | 1 | vollständig | github_trending |
| snanas/Forza-Horizon-Spotify-Radio | 34 | 8 | 0.0% | 23.5% | 1 | vollständig | github_search_recent |
| bingook/bingo | 45 | 8 | 2.2% | 17.8% | 2 | vollständig | github_search_recent |
| darricke/claude-fable-5-desktop-free | 49 | 8 | 0.0% | 16.3% | 1 | vollständig | github_search_recent |
| Ponzuu84/MaaNTE | 32 | 7 | 0.0% | 21.9% | 1 | vollständig | github_search_recent |
| iDesignStudioz/yellowkey-bitlocker | 33 | 7 | 0.0% | 21.2% | 1 | vollständig | github_search_recent |
| chatwoot/chatwoot | 230 | 7 | 0.0% | 3.0% | 1 | vollständig | github_trending |
| Open-Builders/pumpfun-bundler-pump.fun-bundler-solana-token-bundler-bot | 18 | 6 | 33.3% | 33.3% | 1 | vollständig | github_search_recent |
| taisly/agent | 23 | 6 | 17.4% | 26.1% | 2 | vollständig | github_search_recent |
| iptv-org/iptv | 193 | 6 | 0.0% | 3.1% | 1 | vollständig | github_trending |
| itsfatduck/optimizerDuck | 293 | 6 | 0.3% | 2.0% | 1 | vollständig | github_trending |
| Signal | Gewicht | Messung |
|---|
| Kontoalter | 35% | < 2 days → 1.00 · < 7 days → 0.90 · < 30 days → 0.55 · < 90 days → 0.20 · älter → 0.00 |
| Profilvollständigkeit | 30% | Punkte für: keine Bio (+0.25), kein Standort (+0.15), kein Unternehmen (+0.10), null Follower (+0.30), null Following (+0.10), Bot-Muster-Benutzername (+0.20) |
| Repository-Muster | 25% | Keine Repos → 0.90 · alle Repos sind Forks → 0.80 · >85% Fork-Quote → 0.55 |
| Aktivitätsverlauf | 10% | Konten, die älter als 14 Tage sind und null Repos + kein Social Graph haben → 0.80 (Geisterkonten). Nur null Repos → 0.60. Alle Forks + kein Social Graph → 0.50 |