Markdown · llms.txt

Best time to post on X

Last updated 2026-10-11. “Best time to post on X,” and the older “best time to post on Twitter,” are usually answered with a clock. Commit cb45b55 does not contain that clock. The ranker has recency. It does not have a time-of-day weight.

What is actually in the code

AgeFilter drops a post older than MAX_POST_AGE = 48 hours (home-mixer/params/config.rs, wired in phoenix_candidate_pipeline.rs). SimClusters uses the same horizon: SimclustersMaxCandidateAgeHours is 48. After 48 hours a post is not a For You candidate through these sources, whatever hour it was published.

Cold start can lift a post toward slots 15–16 when three conditions hold (home-mixer/scorers/author_cold_start.rs): under 200 impressions, younger than ColdStartMaxPostAgeSecs (7200, two hours), and the author has under 50,000 followers. Thompson sampling is on. The playbook’s reading is a position lift for unscored inventory, not a velocity multiplier on likes, and not “the first 30 minutes compound into out-of-network.”

Out-of-network retrieval is embedding similarity, plus favorite counts on the Phoenix index as of the 2026-10-08 commit 35650fb (phoenix-rankall/src/hydrate/fav_counts.rs). That hydration is about what gets indexed. It is not an hour-of-day feature.

Thunder’s post_retention_seconds is a process argument (thunder/args.rs). The figure 2 * 24 * 60 * 60 appears in PostStore tests, not as the production For You cut. The cut that is a constant is the 48-hour AgeFilter.

What is not in the code

The playbook’s correction table is explicit: there is no Tuesday-to-Thursday constant, and no 9–10am constant. “When your followers are awake is a property of your account, not of this code.” This page repeats that sentence because it is the evidence-based guidance the repository supports. It does not add a recommended hour, a timezone table, or a claim that posting at a popular time multiplies impressions. Those numbers are not in param.rs.

Author diversity is also not a clock. The second post from you already in one viewer’s candidate pool is ×0.625 (decay 0.5, floor 0.25 in vm-ranker/params.rs). That is per request, not “four posts a day is banned.” Spacing posts matters inside one viewer’s pool. It does not name a best hour.

A practical reading that stays inside the file

Post something that can still be a candidate: younger than 48 hours, and, if you are under the follower cap and still under 200 impressions, still inside the two-hour cold-start window if you care about that position lift. Do not treat a blog’s “best time” grid as a ranker coefficient. If you want a draft scored against the published weights rather than against a clock, paste it at tweetfactory.sh/score. The weights themselves are on How to grow on X.

FAQ

What is the best time to post on X?

The open-source ranker does not say. It has no day-of-week term and no hour-of-day term. It does drop posts older than 48 hours, and it can lift a post in its first two hours when impressions are under 200 and the author has under 50,000 followers.

Does the Twitter algorithm reward posting in the morning?

Not with a published coefficient. The old “Tuesday to Thursday, 9–10am” line is in the playbook’s correction table as something this tree does not contain.

Does posting more often beat the clock?

Author diversity discounts later posts from you inside one viewer’s pool (second post ×0.625). That is a same-request penalty, not a daily cap, and not a substitute for a best-hour chart.