Jak naprawdę działa algorytm X (Twitter): analiza 7667 plików kodu źródłowego
Andrzej Suchecki · founder Growto
17 maja 2026 · 12 min czytania
W skrócie
Kod rekomendacji X jest publiczny, ale wagi modelu w repozytorium mają wartość zero: realne mnożniki ładowane są dopiero w runtime. Najsilniejszy znany sygnał zasięgu to odpowiedź autora wpisu na Twój komentarz, mnożnik szacowany na około 75x. Dlatego komentowanie cudzych wpisów buduje zasięg taniej niż publikowanie własnych.
W 2023 Twitter (dziś X) opublikował kod źródłowy swojego algorytmu rekomendacji. Sklonowaliśmy repo i przeczytaliśmy najważniejsze pliki Scali i Pythona. Wypisaliśmy to, co rzeczywiście liczy się dla Twojego zasięgu w 2026. Bez clickbaitów, z nazwami plików i mnożnikami.
Skrót: 6 rzeczy dla osoby, która nie chce czytać 22 min
- Repo pokazuje architekturę, bez produkcyjnego konfigu. 4880 plików Scala, ale wszystkie wagi modelu rankingu mają w kodzie
default = 0.0. Realne wartości X ładuje w runtime z osobnego systemu feature switches, nie są publiczne. Wagi typu „like = 0.5, retweet = 1.0, reply = 13.5” pochodzą z wycieków i komentarzy inżynierów; w repo ich nie ma. - Reply engaged by author, mnożnik ~75x. Najsilniejszy pozytywny sygnał. To moment, kiedy autor tweeta odpowiada na Twój komentarz. Algorytm interpretuje to jako „ktoś o autorytecie uznał Twój komentarz za wartościowy”, i wystrzeliwuje Twoją widoczność. Najtańsza droga do zasięgu: komentuj cudze zamiast publikować wyłącznie swoje.
- Out-of-network handicap 0.75x. Hard-coded w pliku
OONTweetScalingScorer.scala. Każdy tweet pokazany komuś, kto Cię nie obserwuje, dostaje mnożnik 0.75, musi być ~33% lepszy niż średnia, żeby pokonać ten handicap. To dlatego ślepe „follow for follow” nie działa, a budowa sieci to gra długoterminowa. - Negatywny feedback to 140 dni karencji. Klasa
FeedbackFatigueScorer.scalanakłada mnożnik 0.2x, który liniowo wraca do 1.0x w 4 krokach po 35 dni. Mute / block / raport są jeszcze gorsze. Jeśli publikujesz coś kontrowersyjnego odbiorcom, którzy przyszli po co innego, płacisz cenę przez 4 miesiące. - SimClusters: ~145 000 społeczności. X mapuje wszystkich userów na ~145k klastrów odkrytych algorytmem Metropolis-Hastings na grafie podobieństwa producent-producent. Twoja widoczność zależy od overlapów Twoich klastrów z klastrami odbiorcy, w mniejszym stopniu od „follow grafu” jako całości.
- Wideo < 10s nie liczy się dla rankingu wideo. Klasy
PredictedVideoQualityViewScoreFeatureiPredictedVideoQualityWatchScoreFeaturemają hard-coded gating: tylko wideo dłuższe niż 10 sekund uruchamia te head’y modelu. Krótsze klipy są oceniane wyłącznie na engagement tekstowy.
Kontekst: repo, pliki, narzędzia
W marcu 2023 Twitter pod presją Elona Muska otworzył kod źródłowy algorytmu For You Timeline. Repo github.com/twitter/the-algorithm zawiera 7667 plików: 4880 Scali, 1043 Javy, 180 Pythona, 30 Rusta, 114 plików Thrift (definicje serwisów RPC). Razem 57 MB skompresowane. Jak na coś, co podejmuje miliardy decyzji rankingowych dziennie, zaskakująco mało.
Sklonowaliśmy to lokalnie, przeczytaliśmy README, RETREIVAL_SIGNALS.md i pliki decydujące o rankingu w katalogach home-mixer/ (główny serwis rankingu), src/scala/com/twitter/simclusters_v2/ (community detection) i trust_and_safety_models/. Niżej synteza tego, co faktycznie jest w kodzie; każdą tezę da się wskazać w konkretnym pliku.
Zastrzeżenie: kod jest ze stanu na ~2023, z lekkim rebrandingiem 2024 („Twitter” na „X”, „Tweet” na „Post” w komentarzach i README). Architektura nie zmieniła się drastycznie, X zatrudnia tych samych inżynierów. Wagi modelu pewnie tak. Konkretne wartości wag traktujemy więc jako orientacyjne (wycieki z 2023); pewne są struktura i mnożniki wpisane na sztywno w kod.
Architektura: z miliarda kandydatów do 50 tweetów
Każde otwarcie zakładki „For You” uruchamia wieloetapową kaskadę. To kanoniczny pattern systemów rekomendacyjnych: Netflix, YouTube i TikTok robią praktycznie to samo, różnią się tylko liczbą heurystyk i doborem sygnałów. Etapy:
Request (otwarcie For You)
│
▼
[1] CANDIDATE GENERATION (~1B tweetów → ~1500 kandydatów)
├── search-index (Earlybird) ......... ~50% in-network
├── tweet-mixer ...................... out-of-network coordinator
├── UTEG (User-Tweet-Entity-Graph) ... GraphJet, in-memory graph traversal
└── FRS (Follow Recommendation Svc) .. tweety od nowych autorów
│
▼
[2] FEATURE HYDRATION (~6000 features per kandydat)
│ Mix sygnałów: SimClusters embeddings, TwHIN, real-graph,
│ tweepcred PageRank, demograficzne, historia engagementu, czas.
│
▼
[3] HEAVY RANKER (neural network multi-task, ~15 head'ów)
│ Przewiduje prawdopodobieństwa każdego typu engagementu:
│ fav, retweet, reply, dwell, video quality view, share,
│ bookmark, profile click, negative feedback, ...
│
▼
[4] HEURISTIC RESCORING (14+ rescorerów po pointwise score)
├── OON × 0.75 (handicap dla out-of-network)
├── FeedbackFatigue × 0.2-1.0 (140-day decay)
├── DiversityDiscount (autor diversity, media cluster diversity)
├── GrokSlopRescorer (penalizacja AI slop)
├── ImpressedAuthor decay (już Ci to pokazaliśmy → mniej)
├── MultimodalEmbedding rerankery
└── ControlAi rescorers
│
▼
[5] FILTERS (visibility, dedup, language, NSFW, blocked, muted)
│ OutOfNetworkCompetitorURLFilter, wycina out-of-network tweety
│ z linkami do konkurencyjnych platform.
│
▼
[6] MIXING (z Ads, Who-to-Follow, prompts)
│
▼
Serving (~50 tweetów do widoku)
Dwie rzeczy rzucają się w oczy. Po pierwsze: 50% kandydatów w For You to in-network (od osób, które obserwujesz), drugie 50% to out-of-network. To projektowy parytet, niezmienny od lat. Po drugie: kaskada 14+ rescorerów po pointwise scoringu to bardzo agresywne podejście, nawet jeśli heavy ranker NN da Twojemu tweetowi wysoki score, każdy z 14 listwise rerankerów ma szansę go obniżyć. Konkretnie: FeedbackFatigue (0.2x) razy OON (0.75x) razy DiversityDiscount (np. 0.5x, bo autor już pojawił się w Twoim feedzie tego dnia) daje finalny mnożnik 0.075x, mimo wysokiego predicted score.
Heavy Ranker, 15 head’ów modelu: co dokładnie X chce, żebyś zrobił
Heavy Ranker to neural network multi-task. Dla każdego kandydata przewiduje prawdopodobieństwo 15 różnych typów engagementu. Każdy z nich ma osobną wagę (parametr home_mixer_model_weight_*). Finalny score = suma waga × predykcja dla wszystkich head’ów. Pełna lista z pliku PredictedScoreFeature.scala:
| Head | Co przewiduje | Charakter | Waga (wyciek 2023) |
|---|---|---|---|
| fav | User polubił | + | 0.5 |
| retweet | User retweetnął | + | 1.0 |
| reply | User odpowiedział | ++ | 13.5 |
| reply_engaged_by_author | Autor odpisał na reply | +++ | ~75 |
| good_click_v2 | Klik + dwell > 2 sek na detail | + | 11.0 |
| good_profile_click | Klik profilu autora + engagement | + | 12.0 |
| bookmark | User zapisał do zakładek | + | ~13 |
| share | User udostępnił (link) | + | ~10 |
| dwell | User patrzył > X sek (threshold) | + | ~0.1 |
| vqv | Video quality view (≥10s wideo) | + | ~0.005 |
| negative_feedback_v2 | Mute / block / „See Fewer” | - - - | -74 |
| report | User zgłosił tweet | - - - | -369 |
Wagi z wycieków X 2023 (źródło: github.com/twitter/the-algorithm + komentarze inżynierów na HackerNews). W open-source repo wszystkie wagi mają default = 0.0, to oznacza, że X świadomie usunął realne wartości. Po 3 latach mogły się zmienić, ale rząd wielkości pozostaje.
Najważniejszy wniosek: reply_engaged_by_author ma wagę ~75 i jest jednym z dwóch zdarzeń, które wystrzeliwują zasięg dosłownie poza Twoją sieć follow. Jeśli ktoś z dużym kontem odpisze na Twój komentarz pod jego postem, ten cały wątek (włącznie z Twoim komentarzem) zostanie pokazany dziesiątkom tysięcy ludzi, którzy Cię nie obserwują.
To zmienia strategię budowy zasięgu od zera. Tradycyjnie: publikuj dużo, czekaj, buduj followersów. Nowocześnie: znajdź 20-30 dużych kont w Twojej niszy, codziennie zostawiaj przemyślane komentarze w pierwszych 15 minutach od publikacji ich postów. Jeden reply od autora potrafi dać 100 nowych obserwujących.
Heurystyki: cztery reguły, których X nie ukrył
Wagi modelu rankingu są w configu (więc X może je zmieniać bez deploy). Ale niektóre rzeczy są wpisane na sztywno w kodzie. To one są najpewniejszą wiedzą o działaniu algorytmu, bo nie podlegają bieżącym eksperymentom A/B.
1. Out-of-network handicap = 0.75x
Plik home-mixer/.../OONTweetScalingScorer.scala:
private val ScaleFactor = 0.75
private def selector(candidate): Boolean = {
!candidate.features.getOrElse(InNetworkFeature, false) &&
!candidate.features.getOrElse(IsRetweetFeature, false)
}
// Jeśli selector(candidate) zwraca true, score *= ScaleFactor
Każdy tweet od osoby, której odbiorca nie obserwuje, dostaje mnożnik 0.75 finalnego score. To znaczy: żeby Twój tweet trafił do feedu kogoś, kto Cię nie obserwuje, musi mieć predicted engagement ~33% wyższy niż średni tweet w-sieci. Dlatego organiczny zasięg na X jest tak trudny: nawet idealnie napisany tweet musi przebić handicap.
2. 140 dni kary za „See Fewer”
Plik home-mixer/.../FeedbackFatigueScorer.scala definiuje:
val DurationForDiscounting = 140.days
private val ScoreMultiplierLowerBound = 0.2
private val ScoreMultiplierUpperBound = 1.0
private val ScoreMultiplierIncrementsCount = 4
// 4 kroki × 35 dni = 140 dni
// startuje od 0.2, kończy na 1.0
Jeśli odbiorca kliknął kiedyś na Twoim tweecie „See Fewer” (lub na tweecie autora, którego retweetnąłeś, albo na osobie, która polubiła Twój tweet, pełna kaskada), algorytm dyskontuje Twoje przyszłe tweety dla tego odbiorcy: na początku 0.2x, potem liniowo do 1.0x przez 140 dni. To jest persistent memory: pomyłka w komunikacji w styczniu kosztuje Cię zasięg do czerwca. Pozytywny feedback (like, retweet) tak długiej pamięci nie ma.
3. Linkujesz do konkurenta? Tweet wycięty z OON
Plik home-mixer/.../OutOfNetworkCompetitorURLFilter.scala:
def hasOutOfNetworkUrlFromCompetitor(
candidate, competitorUrls
): Boolean = {
!candidate.features.getOrElse(InNetworkFeature, true) &&
!candidate.features.getOrElse(IsRetweetFeature, false) &&
candidate.features
.getOrElse(TweetUrlsFeature, Seq.empty).toSet
.intersect(competitorUrls).nonEmpty
}
Lista konkurencyjnych domen (competitorUrls) nie jest publiczna, wczytywana z external config. Powszechnie obserwowane: instagram.com, tiktok.com, youtube.com, threads.net, bsky.app, mastodon.social. Mechanizm jest prosty: jeśli tweet zawiera URL z listy i jest out-of-network (chcesz dotrzeć do osób spoza Twojej sieci) i nie jest retweetem, zostaje całkowicie odfiltrowany z feedu OON. In-network nadal go zobaczą.
4. Krótkie wideo nie wchodzą w ranking wideo
Klasy PredictedVideoQualityViewScoreFeature i PredictedVideoQualityWatchScoreFeature mają warunek:
override def isEligible(features, query): Boolean = {
features.getOrElse(HasVideoFeature, false) &&
(features.getOrElse(VideoDurationMsFeature, None)
.getOrElse(0) / 1000.0) >= 10
}
Tylko wideo dłuższe niż 10 sekund uruchamia head’y „video quality view” i „video quality watch” modelu rankingu. Krótsze klipy są oceniane wyłącznie na bazie engagementu tekstowego (fav, retweet, reply). Konsekwencja: jeśli zależy Ci na rankingu wideo, planuj klipy 12-30 sekund. Poniżej 10s schodź tylko wtedy, gdy klip chwyta w pierwszej sekundzie i prowokuje reply.
SimClusters: 145 000 społeczności, do których jesteś przypisany
SimClusters to algorytm wykrywania społeczności (community detection) opublikowany przez Twittera w KDD 2020 jako paper akademicki. To jeden z najinteligentniejszych komponentów całego systemu i zarazem ten, który najmocniej decyduje o tym, do kogo trafiają Twoje tweety.
Działa tak:
- Graf follow jest traktowany jako bipartite: po jednej stronie konsumenci (osoby obserwujące), po drugiej producenci (osoby obserwowane).
- Algorytm liczy macierz podobieństwa producent-producent jako cosine similarity wektorów ich obserwatorów. Dwóch producentów jest podobnych, jeśli mają tych samych followersów.
- Na tej macierzy uruchamiane jest sampling Metropolis-Hastings (Bayesian inference, jakby ktoś pytał) i wykrywa się ~145 000 spójnych społeczności.
- Każdy producent jest „Known For” jedną społecznością (sparse). Każdy konsument ma wektor InterestedIn, w które społeczności klika i polubia.
- Każdy tweet zaczyna z pustym wektorem embedding. Każde polubienie dolicza wektor InterestedIn likera do tweet embeddingu. Po godzinie tweet ma „cień” społeczności, w których jest popularny.
- Kiedy ktoś otwiera For You, system znajduje top-K tweetów najbliższych jego wektorowi InterestedIn (Approximate Nearest Neighbor w SimClusters ANN).
Co to znaczy w praktyce? Twoja widoczność zależy mniej od „follow grafu” jako całości, bardziej od tego, czy społeczności Twoich obserwujących nakładają się ze społecznościami osób, do których chcesz dotrzeć.
Konkretny przykład. Załóżmy, że obserwuje Cię 500 osób. Jeśli to są deweloperzy Astro, marketerzy B2B i copywriterzy, należysz do społeczności „indie hackers / solo studio”. Tweet o algorytmie X trafi dobrze. Tweet o gotowaniu, nie, bo Twoi obserwujący nie kliknęli wystarczająco dużo tweetów o gotowaniu, żeby Cię „przypisać” do tej społeczności.
Konsekwencja strategiczna: spójność niszy to dosłowny sygnał dla algorytmu, w której z 145k społeczności jesteś. Skakanie między tematami rozmywa embedding i obniża widoczność w każdej z nich. Dla profilu B2B (np. założyciel agencji): 80% contentu w jednej niszy, 20% w maks. 2 powiązanych. To wniosek wprost z architektury systemu.
Praktyka: 7 zasad wynikających bezpośrednio z kodu
1. Komentuj duże konta zamiast publikować wyłącznie swoje
Reply_engaged_by_author ma wagę ~75. Każdy reply autora pod Twoim komentarzem wyrzuca cały wątek (z Twoim komentarzem) do ludzi spoza Twojej sieci. Wybierz 20-30 dużych kont w niszy, włącz powiadomienia, komentuj w pierwszych 15 minutach od publikacji ich tweeta. To droga do zasięgu od zera, której nie blokuje OON handicap.
2. Pisz reply do własnego tweeta po 30-90 min
Algorytm sprawdza reply_engaged_by_author również dla autora odpowiadającego pod własnym wątkiem. Jeśli Twój tweet zaczyna zbierać komentarze, odpisz na 1-2 najlepsze. To uruchamia head 75x dla tych konkretnych respondentów. Ich wątek (z Twoim podpięciem) trafia szerzej.
3. Pisz tak, żeby ktoś chciał odpowiedzieć
Waga reply (13.5) jest 27× wyższa niż waga like (0.5). Tweet, który zbiera 200 polubień i 5 odpowiedzi, zostanie pokonany przez tweet z 50 polubieniami i 30 odpowiedziami. Pisz tezę („myślę, że X jest błędne, bo Y”) zamiast wniosku („3 powody, dla których X się opłaca”). Pytania kierunkowe na końcu („A Ty co o tym sądzisz? Może się mylę”) działają. „Like-bait” („zostaw like, jeśli się zgadzasz”) działa odwrotnie.
4. Nigdy nie linkuj do innych mediów społecznościowych
Tweet z linkiem do Instagram / TikTok / YouTube zostanie wycięty z out-of-network feedu (Twoi obserwujący zobaczą, reszta nie). Jeśli musisz wskazać inną platformę, zrób to w bio albo screenshotem bez linku. Lepiej: zhostuj content na X (wideo, thread) zamiast linkować.
5. Trzymaj 80% contentu w jednej społeczności SimClusters
Skakanie między tematami rozmywa embedding profilu w 145k społeczności. Wybierz jedną z nich (praktycznie: jedną wąską niszę, np. „indie SaaS founders”, „polski no-code”, „retail tech CEE”) i siedź w niej 80% czasu. 20% może być personalne / off-topic.
6. Wideo zawsze 12-30 sekund (minimum 10)
Wideo poniżej 10s nie uruchamia head’ów video quality view / video quality watch. Wideo dłuższe niż 30s traci widzów. Sweet spot: 12-30 sek. Pierwsza sekunda musi „chwytać” (text overlay z hookiem, akcja, kontrowersja).
7. Nie testuj kontrowersji na niedopasowanych odbiorcach
FeedbackFatigue trzyma „See Fewer” przez 140 dni. Jeśli wrzucisz polityczny albo ostro kontrowersyjny tweet odbiorcom, którzy znają Cię z B2B, masz 4 miesiące dyskonta zasięgu od osób, które klikną „See Fewer”. Kontrowersja ma cenę rozłożoną na miesiące. Albo trzymaj się niszy, albo bądź gotowy zapłacić.
Czy X w 2026 to kanał, w który inwestować? Perspektywa SMB w Polsce
Brutalna odpowiedź: zależy od tego, kim jesteś. X w Polsce w 2026 to nie jest masowy kanał sprzedażowy. To kanał personal brandu założyciela, kanał B2B thought leadership, kanał dotarcia do dziennikarzy / inwestorów / decydentów technologicznych. Nie jest to TikTok ani Facebook Marketplace.
Dla typowej firmy SMB w Polsce (gabinet stomatologiczny w Krakowie, biuro księgowe w Łodzi, restauracja w Gdańsku) X jest marnowaniem czasu. Klient Cię tam nie szuka. Lepsze kanały:
- SEO lokalne, „dentysta Mokotów” to wyszukiwanie z intencją zakupową. Strona + Google Business Profile + content lokalny daje leady co miesiąc, evergreen, bez codziennego postowania.
- Google Ads, pod konkretne usługi premium (implant, pełna księgowość, wesele). Pełny tracking od kliknięcia do umówionej wizyty.
- Lokalny content, Instagram Reels z lokalizacją, lokalne FB grupy, lokalne katalogi. To kanały z lokalnym ruchem.
Dla kogo X w 2026 ma sens:
- B2B SaaS, buduje personal brand founderów, generuje warm leady od inwestorów, mediów, partnerów. Każdy polski founder SaaS (Brand24, RightHello, Survicate) ma na X aktywny profil.
- Agencje kreatywne / dev shops, case studies, behind-the-scenes, opinia branżowa. Sprzedaż przez DM od kogoś, kto czytał Twoje wątki przez 6 mc.
- AI / ML / fintech / web3, większość tej niszy mieszka na X; LinkedIn odgrywa tu rolę drugoplanową. To natywny ekosystem.
- Solo founders i indie hackers, buduj w transparentny sposób, MRR-y w bio, „what I learned” wątki. Kanał generujący followersów, którzy konwertują na klientów.
- Konsultanci / freelancerzy z technicznej niszy, opinia branżowa, „hot takes”, odpowiedzi na duże konta. Pierwsze leady przychodzą od czytelników, którzy Cię obserwowali 3-6 mc bez interakcji.
Jeśli mieścisz się w którymś z tych segmentów, wchodź. 30-60 min dziennie przez 6 miesięcy = 100-500 obserwujących z Twojej niszy, 2-5 warm leadów / mc, jeden artykuł / wątek może wygenerować 20 DM. Jeśli nie mieścisz się, zostaw X dla osobistego użytku i zainwestuj w SEO, Ads, content lokalny.
Robimy to z Tobą: content engine pod algorytm
Growto to butikowe studio web dev + marketing. Robimy między innymi content engine pod X i LinkedIn dla B2B SaaS, agencji i konsultantów. Wdrożenie obejmuje:
- Audyt profilu pod 7 zasad z tego artykułu (1-2 godziny, raport z konkretnymi rekomendacjami)
- Strategy doc, z którymi 20-30 dużych kont w Twojej niszy wejść w interakcje, w jakich porach, z jaką częstotliwością
- Content engine, 3-5 tweetów dziennie albo wątek tygodniowo, pisane razem z nami lub przez nas
- Comment engine, 10-20 przemyślanych komentarzy dziennie pod dużymi kontami (najtańsza droga do zasięgu)
- Monthly review, które tweety zadziałały, dlaczego, co iterować
Pakiet od 800 PLN/mc, a zakres i cena zależą od tego, ile bierzemy na siebie: od audytu, strategii i wsparcia w tygodniu po cały content engine prowadzony przez nas. Bez zobowiązań długoterminowych. Pierwsze rezultaty widać po 6-8 tygodniach, a jeśli po 12 nie ma efektu, wracamy z pełną analizą i bez kolejnej faktury. Umów rozmowę albo zobacz pakiety marketingowe.