[

[

x algorithm series

]

]

Dwell time is the new like: the 4 dwell heads ranking your posts

·

·

13 min read

By Prateek Singh, founder of VoiceMoat

By Prateek Singh, founder of VoiceMoat

Summarize with AIClaudeChatGPTPerplexityShareShare

In the 2023 X ranker, dwell appeared as a single weighted term, set so low (0.0001 per millisecond in the leaked weights) that most algorithm coverage treated it as a rounding error. In the 2026 ranker, dwell appears four times. Discrete dwell at index 11 (phoenix/run_pipeline.py). Continuous dwell time as a regression head. Click-dwell time as a separate post-click signal. And an implicit not_dwelled_score in home-mixer/scorers/vm_ranker.rs's PhoenixScores proto for the impressions where dwell never happened. Together they form a four-head dwell economy that contributes more to the weighted score for most posts than the visible-engagement heads do. This article walks each of the four, explains the writing patterns that fire them, and lands on why dwell is the head class general-purpose LLMs systematically underperform on. Companion to A2: how Phoenix ranks every post, which walks all 19 heads at a higher level, and A5: the negative-signal economy, which expands the not-dwelled side of the ledger.

The four dwell heads, side by side

The four dwell-related signals in the 2026 ranker

Head

Type

Constant or field

What it captures

Discrete dwell (documented)

binary head, index 11

DWELL_WEIGHT

viewer paused on the post above a discretisation threshold

Continuous dwell time (inferred)

regression head, paired index

CONT_DWELL_TIME_WEIGHT

actual milliseconds the viewer's eye held the post

Click dwell time (inferred)

post-click dwell regression

field in PhoenixScores proto

milliseconds the viewer spent after clicking through

Not dwelled (inferred)

implicit negative signal

not_dwelled_score field

impressions where the viewer scrolled past without pausing

Source: phoenix/run_pipeline.py + home-mixer/scorers/{weighted_scorer,vm_ranker}.rs

A few words on the relationship between these four. Discrete and continuous dwell on the same impression are correlated but not the same signal. The discrete head fires once when the viewer crosses a pause threshold; the continuous head accumulates value as long as the pause extends. A post that earns a fast skim-pause fires the discrete head but contributes little on the continuous head. A post that holds a viewer for ten seconds fires both, with the continuous head contributing far more total score per impression. Click-dwell operates on a separate stage of viewer attention: the impression that earned a click already passed the in-feed scoring, and the click-dwell signal runs over the time the viewer spent on the destination after clicking. Not-dwelled fires on every impression that does not cross the discrete threshold; it is the population to which the other three signals do not apply.

The split into four signals is the architectural choice that gives dwell its weight in 2026 even though no individual head has a large WEIGHT constant. The aggregate contribution per impression, summed across the relevant subset of the four, is structurally large.

Recap-dwell vs realtime-dwell: the client distinction

phoenix/run_pipeline.py labels the verified dwell index as CLIENT_TWEET_RECAP_DWELLED. The "recap" qualifier is worth unpacking. X's mobile client implements dwell measurement in two layers: realtime dwell observed as the post is on screen, and recap dwell computed once the viewer scrolls past and the post is no longer visible. The recap-dwell signal is what the client reports back to the ranker as the canonical engagement event. Realtime dwell informs client-side decisions (autoplay, expansion) but does not necessarily reach the ranker as a separate signal.

The practical implication for creators: the dwell that matters for ranking is the one the viewer accumulated over the full time they were exposed to your post in the feed, not the dwell while they were actively interacting with it. Posts that produce a long passive exposure (the viewer reading in place without tapping) score similarly to posts that produce a short active exposure (the viewer tapping through quickly). The signal is time-on-post, not interaction count within that time.

The continuous-dwell-time head (CONT_DWELL_TIME_WEIGHT) is the regression target over the recap-dwell duration. A twelve-second recap-dwell, at the 2023 reference weight of 0.0001 per millisecond, contributes 1.2 on a single head. Compare that to the 2023 favorite weight of 0.5 per like. One viewer holding your post for twelve seconds contributes more than two viewers liking it. The math is what makes dwell the silent kingmaker that A2 called out.

Click-dwell time: the strongest trust signal in the inventory

When a viewer clicks a link inside your post, the platform measures the time they spend on the destination before returning. That measurement becomes the click-dwell signal. The mechanism by which platforms gather this is not detailed in the public source, but the PhoenixScores proto referenced in home-mixer/scorers/vm_ranker.rs exposes a click-dwell field that the ranker consumes.

Three properties make click-dwell uniquely powerful as a signal. First, it is post-click, so it cannot be gamed by impression-only optimisation; the viewer has already made an active decision to leave the feed. Second, the dwell range is wider than in-feed dwell because viewers read full articles, watch videos, scroll through threads, all of which can last minutes. The signal can be three orders of magnitude larger than typical recap-dwell. Third, click-dwell is asymmetric: a click followed by a fast bounce produces a small (or possibly negative) contribution, while a click followed by a long read contributes substantially.

The asymmetry is the reason "clickbait" is structurally penalised. A viewer who clicks a clickbait headline and bounces in two seconds fires the click head positively but the click-dwell head essentially zero. The combined contribution is much smaller than for a post whose click earned a long read. Phoenix's training signal learns this distinction implicitly: posts whose clicks were followed by short bounces get lower predicted click-dwell on similar future candidates from the same author.

The video VQV head and the duration threshold

VQV_WEIGHT (video quality view, index 13) is gated on video_duration_ms exceeding MIN_VIDEO_DURATION_MS (phoenix/run_pipeline.py). The threshold value itself is not in the public source. The mechanism, however, is clear: below the threshold, the video earns zero on this head no matter how many times it plays, and above the threshold, every qualifying play contributes.

The threshold is the architectural detail most video-on-X advice ignores. A four-second loop and a fifteen-second cut of the same content produce categorically different scoring contributions; the difference is not a gradient but a step function at the duration boundary. Creators producing short-form video on X benefit from understanding where the boundary sits, but the value is not in the public source. Empirical backward inference from served-vs-unserved video content suggests the boundary is roughly in the eight-to-ten-second range, which would match the canonical "engagement above the eight-second mark" rule of thumb that several creator-economy reports treat as observed-not-stated. We do not endorse a specific value; we flag the structural property.

For non-video creators the VQV head is irrelevant. For video creators it is the head that determines whether the video is scoring at all. Sub-threshold videos compete only on like, retweet, and the other non-dwell heads, which is a much smaller score pool.

Not-dwelled: the negative signal nobody opted into

home-mixer/scorers/vm_ranker.rs's PhoenixScores proto contains a not_dwelled_score field that does not appear in the simpler home-mixer/scorers/weighted_scorer.rs. A5 walked the broader negative-signal economy; the not-dwelled signal is the dwell-side member of that family. It fires on every impression where the viewer scrolled past without pausing.

This is the highest-volume negative signal a creator faces. Mutes, reports, blocks all require explicit menu interactions. Not-dwelled requires nothing; it is the default outcome of impression-without-pause. For most posts the population of not-dwelled impressions is far larger than the population of dwelled ones. The model learns to predict the ratio per creator, per viewer, and uses it to weight future candidates.

The practical implication: a creator's recent posts that systematically fail to earn dwell from their audience accumulate predicted-not-dwelled prior across viewer histories. Future posts get scored against a prior that expects them to be scrolled past. The remedy is not "post more often" (which compounds the prior across more impressions), but "post in a way that earns the dwell." The next section walks the specific patterns.

Dwell and likes are not the same signal

A common assumption: posts that earn lots of likes also earn long dwell, and posts that earn long dwell also accumulate likes over time. The 2026 ranker's behaviour suggests the two are correlated but loosely so. The visible-engagement heads (like, retweet) respond to social-proof dynamics; the dwell heads respond to reading behaviour. The same post can fire one without the other.

Dwell contribution vs likes contribution across post archetypes: Quick joke: Dwell-head contribution 22, Favorite-head contribution 78 relative head contribution; Hot take: Dwell-head contribution 58, Favorite-head contribution 65 relative head contribution; Operational thread: Dwell-head contribution 88, Favorite-head contribution 38 relative head contribution; Long-form essay post: Dwell-head contribution 92, Favorite-head contribution 28 relative head contribution; Generic AI-shaped post: Dwell-head contribution 18, Favorite-head contribution 32 relative head contribution

Dwell contribution vs likes contribution across post archetypes

The chart sketches the qualitative pattern. Quick jokes lean favorite-heavy because the value is delivered in the first line and the viewer responds with a like rather than a long pause. Operational threads and long-form essay posts invert the ratio: viewers pause to read, contributing heavily on the dwell heads, but they do not always return to like a long post they have already moved past. Generic AI-shaped output performs poorly on both heads simultaneously; the posts are neither fast-payoff enough to earn the favorite nor substantive enough to earn the dwell.

The chart is a creator-strategy chart, not a model-tuning one. A creator who wants to optimise score, not visible counts, should accept that some of their highest-scoring posts will have moderate or even low like counts. The score is the dwell column plus the visible column plus the seven other positive heads, and the dwell column is the one most posts under-invest in.

Writing patterns that earn dwell

Dwell is the head class most-influenced by editorial choice and least-influenced by reach or social proof. Likes and retweets respond to visible-engagement dynamics (who else liked, how many likes already); dwell responds to whether the viewer actually reads. A post can earn a large dwell even with zero existing engagement if the writing carries the eye.

Three patterns consistently produce dwell across creator categories.

The second-line payoff. A first line that opens a loop the second line closes. "I shipped three products last year. The one that worked did exactly the opposite of what advice said." The viewer cannot extract the value from the first line alone; they have to read the second to find out what the opposite was. Most posts deliver the value in the first line and lose the dwell as a result.

Specific over abstract. Posts that name specific people, numbers, dates, places, products force the viewer to slow down to parse them. "In March 2024, the partnership with three Fortune-500 customers generated 60% of revenue" earns more dwell per impression than "we had some big customers." Specificity is dwell density per word.

Sequence with reveal. Posts that list 3 to 5 items, where the third item subverts the pattern set by the first two, hold attention through the surprise. The structure is older than the platform; it works on the platform because it leverages the same attention mechanic the ranker is scoring.

What none of these three are: hooks, clickbait, or engagement bait. The dwell head responds to actual reading. Hooks that promise payoff the post never delivers train the model to predict bounce on similar future posts. Click-dwell, the strongest dwell signal, specifically punishes hook-without-payoff because the bounce-after-click is visible to the ranker through the dwell duration.

The graph below sketches the qualitative relationship between post length and predicted dwell. The curve is illustrative; specific values depend on the creator's audience composition.

Predicted dwell as a function of post length, by writing density: 60 char (short): High-density writing (specific, second-line payoff) 32, Low-density writing (generic, headline-only) 18 relative dwell contribution; 140 char (mid): High-density writing (specific, second-line payoff) 64, Low-density writing (generic, headline-only) 22 relative dwell contribution; 240 char (long): High-density writing (specific, second-line payoff) 88, Low-density writing (generic, headline-only) 19 relative dwell contribution; Thread (multi-post): High-density writing (specific, second-line payoff) 92, Low-density writing (generic, headline-only) 15 relative dwell contribution

Predicted dwell as a function of post length, by writing density

Two readings of this graph. First, length alone does not produce dwell; the high-density curve rises with length but the low-density curve does not. Second, the gap between the two curves widens with length: the penalty for low-density writing in a long-form post is structurally larger than the penalty for low-density writing in a short post. Threads compound the effect because each post in the thread carries its own dwell prediction.

Why generic LLM output underperforms on dwell

A general-purpose writing model trained on the broad internet produces output sitting in a specific cluster of the embedding space: helpful-assistant register, structured-explanation patterns, encyclopedic specificity. That cluster has known properties relative to the dwell head.

The output is fluent, which keeps the discrete-dwell head firing (the viewer pauses long enough to register that the post is readable). The output is generic, which keeps the continuous-dwell head from accumulating (the viewer recognises the helpful-assistant pattern and moves on). The output rarely contains second-line payoffs, surprise sequences, or creator-specific specificity, because those properties are exactly the ones general models train against (their training objective rewards "comprehensible and broadly applicable" output, which is the opposite of "specific and surprising").

The mechanical consequence: posts generated by general LLMs score on the visible-engagement heads (like, occasional retweet) but systematically underperform on the dwell heads. The aggregate weighted score is therefore lower than the visible counts suggest. Creators running their content through general LLMs see what feels like normal likes performance but reach loss they cannot explain. The dwell-head gap is the unexplained portion.

On the audenAI roadmap

audenAI, the writing-pattern model inside VoiceMoat, trains on the creator's full profile across 10 signals (A8 walks the embedding-level mechanism). Posts that fire the creator's historical dwell patterns sit inside the cluster the creator's audience reliably engages with. VoiceMoat is rolling out a per-draft dwell-affordance check that flags drafts whose structure matches headline-only patterns: first-line-only payoff, generic CTAs, hook-without-substance. The check is not "is this draft good?" (a question for editorial judgment); it is "does this draft give the dwell head something to fire on?"

What to take away

Three operational moves drop out of the four dwell heads.

Write the second line first. If the post's value is fully present in the opening line, the dwell head cannot fire. Audit drafts by asking whether the second line earns the read. If not, restructure.

Watch click-dwell, not click count. X exposes click counts to authors; click-dwell is harder to read but is the signal that actually moves the score. The proxy is comparing impressions-per-click against likes-per-impression: a post with high impressions-per-click and low dwell-per-click is a hooked-but-bounced post, which trains the model unfavourably against your future posts.

For video, cross the duration threshold or do not bother. Video under the VQV threshold scores on a smaller head pool. If your video content is below threshold by design (short loops, fast cuts), accept the lower score. If it can plausibly cross the threshold, the duration-vs-VQV trade is worth the extra few seconds.

The dwell economy is the easiest part of the 2026 X ranker to align with through writing alone. Voice consistency (A8: your voice is an embedding) sets the cluster geometry; dwell-aware writing inside that cluster maximises the per-impression score. The combination is the operational form of the "voice as a moat" thesis the cornerstone of this series (A1: the May 2026 X algorithm) opened with.

Frequently asked questions

Frequently asked questions

How many dwell signals does the 2026 X algorithm use?

Four. dwell_score is the discrete recap-dwell head at index 11, dwell_time is its continuous-regression sibling, click_dwell_time measures dwell after a click, and not_dwelled_score is the implicit penalty for scroll-past. The 2023 ranker had only one dwell-related term.

Why is dwell time harder to game than likes on X?

Dwell is conditioned on the viewer's history, not on social proof. You can farm likes with engagement bait, but you cannot make someone actually stop and read. Generic AI output tends to fire the discrete dwell head because it is fluent enough to register, while underperforming the continuous dwell head because generic patterns trigger fast scroll-past.

What is a video quality view (VQV) on X?

VQV is head index 13, gated on video_duration_ms exceeding MIN_VIDEO_DURATION_MS. Below that threshold the head earns zero regardless of plays. The exact threshold is not in the public source.

What writing patterns increase dwell time on X?

Three reliably hold the scroll: a second-line payoff where the first line hooks and the second delivers, specificity over abstraction, and a sequence-with-reveal structure. Each buys enough attention to cross the dwell threshold.

AI disclosure

AI disclosure

This article was drafted with AI assistance and human-edited by Prateek Singh. All technical claims are sourced to the xai-org/x-algorithm repository; file paths are cited inline.

More in the series

X Algorithm

The May 2026 X algorithm: why voice wins when the ranker becomes a transformer

In May 2026, X.AI open-sourced the next-generation recommendation algorithm under the xai-org/x-algorithm repository. It is not a re-host of the 2023 Twitter release. It is a complete rewrite. The 2023 stack of hand-engineered features, MaskNet heavy-ranker, SimClusters embeddings, TwHIN graph signals, and RealGraph follow-affinity scoring has been retired. In its place: a single Grok-derived transformer named Phoenix that predicts 19 separate engagement actions per candidate, conditioned on the viewer's history sequence, with a candidate-isolation attention mask. The implications for creators are structural, not tactical. Voice consistency now compounds at the ranker level because every candidate from a creator is independently scored against the viewer's per-creator history pattern. Voice drift collapses scoring across the entire follower base, not just the post that drifted. This cornerstone walks the architectural change, the new scoring math, and what it means for anyone choosing how to write on X in 2026.

13 min read

·

·

X Algorithm

How Phoenix ranks every post: a creator's guide to the 19 engagement heads

X.AI's open-sourced Phoenix model does not score posts on a single "engagement" number. It predicts 19 separate user actions in parallel, each paired with a WEIGHT constant in home-mixer/scorers/weighted_scorer.rs (FAVORITE_WEIGHT, REPLY_WEIGHT, and 17 more): favorites, replies, quotes, reposts, photo expands, clicks, profile clicks, video quality views, three share variants, two dwell variants, follow-author, plus four negative actions and an implicit not-dwelled signal. A final weighted sum decides feed position. This article walks each head from the phoenix/run_pipeline.py source: which UI gesture trains it, which weight it pairs with, and what content patterns light it up. By the end, a creator understands why a post that gets 500 likes can rank below one with 80 likes and a 12-second dwell. We close with a quick framework for designing posts that fire multiple heads, not one.

16 min read

·

·

X Algorithm

The negative-signal economy: how one mute outweighs 50 likes on X

NEGATIVE_SCORES_OFFSET and NOT_INTERESTED_WEIGHT are why the 2026 X ranker's math is subtractive, not additive. Net-negative posts get pushed through a separate score-offset branch in weighted_scorer.rs where the combined score is rescaled as (combined + NEGATIVE_WEIGHTS_SUM) / WEIGHTS_SUM × NEGATIVE_SCORES_OFFSET, so one predicted mute or not-interested overwhelms dozens of predicted likes. This article traces every negative signal: the four explicit weight terms, the implicit not_dwelled_score, the four hard-kill filters that run upstream of any scoring, and the off-voice-drift to mute pipeline. We close with a creator-specific section: what content patterns trigger followers to mute, why voice drift is the single biggest negative-signal driver, and how to detect drift before publish.

13 min read

·

·

X Algorithm

Your voice is an embedding: how Phoenix encodes creator identity

Phoenix does not "see" your account as a username. It sees you as a hashed author ID combined with a post embedding, projected into a learned space. Every viewer who has interacted with you has a history sequence that contains those projections, paired with the action they took. When Phoenix scores any new candidate from you, the candidate-isolation mask lets that candidate attend to the viewer's full history but not to the other candidates in the batch. Net effect: your voice is encoded in two places: the author embedding itself, learned at training time, and the distribution of your posts in viewers' history sequences. Drift either of those and the model's prediction of you collapses. This article makes the math intuitive for a non-ML creator, and explains exactly what "voice fidelity" means in Phoenix-native terms: tight distribution in the post-embedding space, anchored by a stable author embedding.

17 min read

·

·

The whole series

The X algorithm in May 2026: all ten articles

Read ›

Read ›

[

ready to start?

]

Create more.
Stay unmistakably you.
Grow from there.

3-day trial from $1 · Cancel anytime · Your writing stays private

[

ready to start?

]

Create more.
Stay unmistakably you.
Grow from there.

3-day trial from $1 · Cancel anytime · Your writing stays private

[

ready to start?

]

Create more.
Stay unmistakably you.
Grow from there.

3-day trial from $1 · Cancel anytime · Your writing stays private