No one cares about your Twitter Launch posts

· 9 min read

By Kyle Jeong

In the AI era, building things got cheap. Distribution didn’t. More slop ships every day; the same people still only have 24h. The bottleneck is who sees you.

I work at a startup where X is one of our best acquisition channels in terms of turning attention into people trying the product. While I haven't yet mastered the internet, I do treat posting content like an engineering problem: test formats, read the feed like a lab notebook, and ship everything deliberately instead of hoping for a lottery ticket.

The attention bottleneck

Models collapsed the cost of making/creating things: code, copy, video, memes, landing pages, whatever. The supply of “content” and “launches” went vertical. The demand side didn’t.

Human attention is still roughly the same (attention spans may have gotten worse), and every extra unit of generated noise competes for the same eyeballs. You're really optimizing throughput to a brain that is already at capacity. Your job is to be the place people stop to check out.

Going viral is emotional engineering against a transformer. The algorithm doesn’t “understand” your product roadmap. It scores how people behave when they see you in the first few seconds, and in the first few minutes after the post is live. If you can’t get past that, nothing else in your post matters.

What the feed is actually doing

The old Twitter system was a classic hand-built recommender: candidate generation, hand-engineered features, a bundle of specialized sub-models stitched together (graph walks, simclusters, etc) topped by a MaskNet heavy ranker with hand-set per-signal weights.

The newer X / xAI path replaced that with Phoenix, a Grok-derived transformer that predicts one probability per engagement head (favorite, reply, repost, quote, bookmark, profile click, photo expand, video-quality view, dwell, follow-author, plus negative heads) and a Weighted Scorer that collapses them into a single relevance number.

A single transformer on sequences can learn end-to-end from raw logs, which means the feed is not deterministic for you as a writer. You can't "solve" a closed-form rule and post the same way forever. You do get to max out the signal the model is trained to reward: emotion density per token, delivered before someone blinks. Information still matters, but the first pass is almost always feeling first, facts second.

Hooks are a compression function. You have to squeeze the max “stop scrolling and feel something” into the smallest window. I write 20 first lines, then ship the best one. If line one doesn’t invoke a strong emotion like a OMG, LOL, or WTF, the rest of the post might as well not exist.

A cheap contrast for intuition: “Our API now supports serverless Functions” is information. “We just built AWS Lambda with a browser built-in.” is a hook. Same product story; one of them is built to interrupt a thumb.

Emotion beats information on the first pass. I bucket hooks into a few levers, then pattern-match to what the post needs:

  • Curious: information gap, numbers, "here's what this got in 90 days and the exact framing." Tell them the outcome exists, withhold the recipe until the body.
  • Superiority: insider takes, data, a breakdown people can repost to look smart. Make the reader feel like they know something others don't.
  • Belonging: who this is for, "two types of [X]," a clean us vs. them. Tribes share. Ambiguity helps nobody in the first line.
  • Challenged: cognitive dissonance. Your behavior doesn't match the story you tell about yourself, and the post says it out loud. Spiky, not cruel; the goal is a productive "wait, is that me?"
  • Provoke: tempered rage-bait. Mad enough to reply or quote, not mad enough to block or report. The ceiling is real (blocks and reports are the two heaviest negative heads in the ranker), so this is a knob, not a setting.
  • Validate: "You're not stuck because of [tactic], you're stuck because of [uncomfortable truth]." Vindication or a gut punch, both work. People share when a line names something they already felt.

Pick a format, not ten

A contrarian take under 280 characters is high variance: fun, fast, and (without existing distribution) mostly a vote of confidence in your existing audience. If you’re not already a known quantity, one-liners rarely build new surface area. They can still be worth shipping as reps and as tone practice.

Long single posts that hit Show more are a trap on purpose, the fold is a filter. If someone opens the fold, they care. Put your best additional line right below it. A reader who paid to expand should get rewarded immediately (instant dopamine).

Threads are still good for “save and come back” teaching, step-by-step sequences, and long stories. I use them less than I used to unless there’s a really good series of videos attached, because a thread competes on density with Articles and the algorithm’s current weighting. When I do a thread, I want each numbered post to be screenshot-able on its own.

X Articles are a distribution cheat code right now in a lot of experiments: they over-index for reach in certain buckets, and they should be written so people bookmark for later. If the title alone doesn’t compel a save, you wasted your time. The best way to think about these are coming up with a title and backfilling the article after you nail the title.

Video and image I treat as launch assets: a ship, a demo, a crisp visual proof. Low-effort B-roll reads as low-effort brand. I’d rather post less and keep the quality bar at “would I put this in a pitch deck” than post noise for cadence’s sake.

The engagement stack

Likes are cheap. What I’m actually trying to design for is: replies, quote posts, bookmarks, profile visits, and show more expands. The single strongest pattern I’ve seen in practice is when someone comments and the author actually replies. But it has to be a real back-and-forth, not just an emoji. It signals depth of interest, and the algo loves it.

Here's the full set of heads the open-source ranking_scorer.rs sums. Numeric weights were stripped from the public repo in 2026 ("excluded for security reasons"), so the column is the variable / weight name, not a number:

Signal Field Weight source Role
Favorite scores.favorite_score weights.favorite Positive (baseline)
Reply scores.reply_score weights.reply Positive (high)
Retweet scores.retweet_score weights.retweet Positive
Quote scores.quote_score weights.quote Positive
Bookmark scores.bookmark_score weights.bookmark Positive (separate Phoenix head)
Photo expand scores.photo_expand_score weights.photo_expand Positive (image dwell proxy)
URL click scores.click_score weights.click Positive (low, X deprioritizes off-platform)
Profile click scores.profile_click_score weights.profile_click Positive (high)
Video Quality View scores.vqv_score vqv_weight(query, candidate, …) Positive if video_duration_ms > MIN_VIDEO_DURATION_MS
Quoted click scores.quoted_click_score weights.quoted_click Positive
Quoted VQV scores.quoted_vqv_score quoted_vqv_weight(candidate, …) Positive if eligible quoted video
Share scores.share_score weights.share Positive
Share via DM scores.share_via_dm_score weights.share_via_dm Positive
Share via copy link scores.share_via_copy_link_score weights.share_via_copy_link Positive
Dwell (binary) scores.dwell_score weights.dwell Positive
Dwell time (continuous) scores.dwell_time weights.cont_dwell_time Positive (dominant for long-read posts)
Click dwell time scores.click_dwell_time weights.cont_click_dwell_time Positive
Follow after view scores.follow_author_score weights.follow_author Positive
Not interested scores.not_interested_score weights.not_interested Negative
Block author scores.block_author_score weights.block_author Negative
Mute author scores.mute_author_score weights.mute_author Negative
Report scores.report_score weights.report Heavy negative (~-369x like in 2023 leak)
Not dwelled (fast skip) scores.not_dwelled_score weights.not_dwelled Negative
Author diversity per-author multiplier (1 - floor) * decay^position + floor 0–1, decays repeat posts from same author
Out-of-network factor OON post final score effective_oon_weight(query) <1 for OON, >1 for some new users, Premium gets a boost
Offset for negatives combined_score offset_score(combined_score, weights) Downscales posts that net negative

Early engagement matters. First ~30 minutes I try to be in the thread like it’s a standup: reply, clarify, but not spam.

Superstitions that still ship

Some of this is culture that survived multiple stack changes. I still do it; worst case, it costs one reply.

  • Put the link in the first reply to the main post, not in the root. Newer ranking ideas might not penalize on-site links the same way. But if it ain’t broke, don’t fix it.
  • If you want distribution on a post, don’t only like it. Bookmark and leave a real comment; same for other people’s work you want more of. You’re nudging the graph (and training yourself) to reward the behavior you want in your timeline.
  • Quote your own banger the next day with a new frame. Quote impressions can roll up; you get a second pass at distribution without writing from zero. It’s especially good for Articles and long posts that under-timed the first time.

Hook > format > engagement loop. Nailing one without the other is a doomed from the start.

This will get harsher before it gets easier. More people will ship, more slop will flood the feed, and the bar for "why should I look at your posts instead of a thousand other posts" will keep rising. The upside is that the core skill isn’t platform-specific.

Compression, clarity, and a point of view transfer anywhere there’s a ranker. The downside is the same: if you can’t get someone to feel something in the first two seconds, you won't hit the algo.

→ Kyle