# 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`](https://github.com/xai-org/x-algorithm/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](https://tweetfactory.sh/score/). The weights themselves are on [How to grow on X](x-algorithm-engagement-weights.md).

## Related

- [How the X (Twitter) algorithm works](how-the-x-algorithm-works.md)
- [How to grow on X](x-algorithm-engagement-weights.md)
- [X algorithm changes in 2026](x-algorithm-changes-2026.md)

## 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.
