The situation and the goal
Mellow Hub sends one post to up to ten networks: Instagram, TikTok, YouTube, X, LinkedIn, Threads, Bluesky, Pinterest, Facebook and Telegram. A cross-post does not fail all at once. It fails one network at a time, and late: the media uploads, the provider accepts the post, and seconds later YouTube says it wanted a title. By then the other networks have published, and there is nothing to take back.
On 8 October 2026 we saw it at scale. Our founder added Pinterest to one of our own profiles, which held 260 posts. Pinterest took 45 upcoming posts. Of the rest, 188 were refused because their captions were over 500 characters, 9 because they were carousels, 2 because they had no picture or video, and 1 because it was minutes from going out. His answer became the brief for everything below: Hub should convert everything as needed, the text and the size; that is its job, not telling people a post does not fit.

What breaks: the rules we hit
Each network has its own limit and its own way of counting. These are the rules Hub checks, from the networks’ own help and developer pages, read in October 2026, among them X’s counting rules, Bluesky’s post length, Threads’ API page, Pinterest’s Pin specs and Telegram’s Bot API:
| Network | Text Hub checks | Counted as | Media in one post | Must have |
|---|---|---|---|---|
| X | 280 | Weighted: a link 23, an emoji 2 | Up to 4 images or 1 video | — |
| Bluesky | 300 | Graphemes: an emoji is 1 | Up to 4 | Text |
| Threads | 500 | An emoji is its UTF-8 bytes | Up to 20 | — |
| 500 (Pinterest’s page says 800) | Characters | Exactly 1; a video needs a cover | Media | |
| 2,200, at most 5 hashtags | Characters | 1 to 10 | Media | |
| TikTok | 2,200 | Characters | 1 to 35 | Media |
| 3,000 | Characters | Up to 20 | Text | |
| YouTube | Title 100, description 5,000 | Characters | Exactly 1 video | Title, video |
| Telegram | 4,096; 1,024 under a picture or video | Text after formatting | Up to 10 | — |
| 63,206 (Meta publishes no figure) | Characters | Up to 10 | — |
Where two sources disagree, Hub uses the smaller number. A caption refused by Hub is something an agent can fix; a caption refused by Instagram after the media has uploaded is a failure nobody can. Instagram is a live example: its Help Center caps a post at 5 hashtags, announced on 18 December 2025, while its API reference still said 30 when we read it on 7 October 2026.

What we did, step by step
- One registry for every surface. One file holds every network’s rules, and three things read it: the validator that checks a post before anything is sent, the composer that decides which fields to show, and the instructions an AI agent reads. When a limit changes, it changes once.
- Check everything first, report everything at once. Before a post goes, every rule is checked against the real accounts it is aimed at, and every problem comes back together, each naming the account, the field and what to do instead. An agent fixes its post in one attempt instead of learning the rules by publishing badly five times. The same checks answer the REST validate call, the MCP
validate_posttool and our free post checker. - 8 October: fit instead of refuse. For each account, as that account’s own version, Hub now cuts a caption over the limit at the last paragraph, line or sentence that fits, counted the network’s way; keeps a closing block of hashtags when it takes no more than a third of the room; drops Instagram’s hashtags past five; takes YouTube’s required title from the caption’s first line; leaves out media a network refuses, so a carousel becomes its first slide on Pinterest; and gives a Pinterest video without a cover a still of its first frame. The same post is fitted the same way every time.
- What still stops a post. Anything that would need invented content: no media where a network needs some, no text where one needs text, a picture sent to YouTube, a reel of two clips.
- 13 October: rephrase to fit, free. Cutting loses the end of what somebody wrote. So for each network a caption is too long for, the composer shows the count the network’s way, such as “432 of 300 · 132 over”, and a Rephrase button. A model writes the shorter version; Hub counts it with the validator’s own count, asks again when it misses, up to three times, and cuts at a sentence only if it still does not fit. It costs no AI credits.
- 13 October: send again what fails for reasons not ours. Hub retries refusals that are not about the post, an agent can call
retry_postover MCP, and warnings about a network’s rate limit, a sign-in about to end, or a video’s length and weight read from the file’s header arrive as notes before the post goes, never as refusals.
Results
- On 8 October, between 08:50 and 09:00 UTC, the same profile handed 140 pins to Pinterest, none twice. Only 2 posts, with no picture or video, could not go.
- On 13 October seven real captions over a limit went through Rephrase on production. All seven fitted, none had to be cut, and each kept its language, its link and its call to action.
| Caption | Before | After | Limit | Model asked |
|---|---|---|---|---|
| Russian | 609 | 459 | Threads, 500 | once |
| English, with a link | 460 | 278 | X, 280 | once |
| English | 293 | 238 | X, 280 | twice |
| English, with emoji | 546 | 432 | Threads, 500 | once |
| English | 1,382 | 278 | X, 280 | once |
| Spanish | 730 | 383 | Pinterest, 500 | three times |
| Russian | 609 | 285 | Bluesky, 300 | twice |
- In the fortnight to 13 October, about 200 deliveries to networks went out from our own profiles and 12 failed. None of the 12 was about the post: LinkedIn’s 429 rate limit, a sign-in that had ended, a busy network, a “failed to process”, and some with no reason at all. The first refused post that Hub sent again by itself went out on 13 October at 08:27 UTC.
What did not work
- Refusing for length was the wrong default. 188 Pinterest refusals on one profile in one morning said so.
- The first Rephrase deploy missed. At 16:11 UTC on 13 October a Russian caption came back over the limit twice and was offered as Hub’s cut, without its link and call to action: each request had started from the original and named only a total. Ten minutes later the model shortened its own over-limit version, was told how many characters to remove, and could be asked three times.
- Guessing limits. Two notes built on inferred network limits shipped and were removed the same morning. Notes now state only facts read from the account’s own history.
- Lost reasons. Nine Instagram accounts on 10 October failed with only a generic provider code, because we had dropped the provider’s own sentence. We keep it now.
- Not done yet: converting files and codecs, and reading a picture’s shape. Instagram’s 4:5 limit through its API is still learned from Instagram.
How to do it yourself
- Keep one table of limits per network, taken from each network’s own pages with the date you read them, and use the smaller number when two sources disagree.
- Count each network’s way: X weighs links and emoji, Threads counts emoji in bytes, Bluesky counts graphemes.
- Validate every target before uploading anything, and report all problems at once.
- Check required fields: a YouTube title and exactly one video; text for LinkedIn and Bluesky; media for Instagram, TikTok, Pinterest and YouTube.
- Fit what can be fitted, the same way every time, as each network’s own version, and keep the original.
- If a model shortens text, measure its answer yourself: asked for at most 500, a model has answered with 620, and ChatGPT did the same with 1,500.
- Retry failures that are not about the post, and keep the network’s own error message.
Our free character counter counts a post against every network at once with these rules, and the limits page lists every source.



