Every network has its own ceiling for a caption: 280 characters on X, 300 on Bluesky, 500 on Threads, 2,200 on Instagram. Mellow Hub sends one post to many of them, so a caption that suits one is often too long for another. The obvious fix is to ask a language model to “shorten it to 280 characters”. We relied on that twice, in two different places, and it failed both times. This is what happened, with the numbers, and the loop that replaced it.
The situation: a limit the reader has to hit
On 10 October 2026 we were preparing a reel whose viewers could ask, by direct message, for a ready-made permanent instruction for ChatGPT. The field that instruction goes into on ChatGPT’s free plan took at most 1,500 characters, so whatever we sent had to work there on the first paste. A viewer who pastes our text and gets an error does not come back.
Three days later, on 13 October, our founder asked for the same thing inside Hub’s composer: whenever a caption is over a network’s limit, Hub should show it and offer, at one press of a button, to rephrase it so that it fits that limit exactly. Of the price he said: let’s make it free.
What we measured in ChatGPT
We ran the request in ChatGPT’s free plan, where the app named its models GPT-6 and GPT-6 mini that day:
- “Write one permanent instruction, under 1,500 characters.” ChatGPT returned 1,981 characters and said the text was under 1,500.
- “Shorten it.” 1,690 characters.
- “Shorten it” again. 1,530 characters, still over.
- “At most 180 words.” 221 words.
- “One opening line, then 10 rules, each one line of 12 words at most.” 833 characters in English and 818 in Russian, well inside 1,500.
The usual explanation is that a language model reads and writes in tokens, pieces of words, rather than letters, so a character total is something it estimates, not something it sees. Whatever the cause, the pattern in our test was plain: the model followed a shape (ten lines, twelve words each) far better than a number. Since then every prompt we hand out that has to fit a limit is written as a shape, and run once end to end in a real chat before it ships.
What we built into Hub: the model writes, the code counts
A shape is enough for a prompt. A caption has to fit an exact count, and each network counts differently: X weighs a link as 23 characters and an emoji as two, Threads counts an emoji as its size in UTF-8 bytes, and Bluesky counts graphemes, so an emoji is one. The counting therefore stays in code, in the same function Hub’s validator uses before anything is published.

The first version of Rephrase went live on 13 October at 16:11 UTC. A Russian caption of 609 characters, for Threads’ 500, came back over the limit twice, and the composer offered Hub’s own cut instead, which lost the call to action and the link. Looking at why: each request had started again from the original caption and named only a total.
Ten minutes later, at 16:21 UTC, the second version changed three things:
- The model shortens its own previous attempt, not the original again.
- It is told how many characters to take off, as a number and as a share.
- It may be asked up to three times. If nothing fits after that, Hub cuts the model’s shortest text at the end of a sentence, and the sheet says it did.
The new text becomes that network’s own caption; the main caption is not touched. The task is free: no plan and no AI credits, with hourly and daily ceilings so it cannot be run without end.
Results, 13 October 2026
On production we asked for seven captions written for this test, in three languages:
| Caption | Network and limit | Before → after | Requests |
|---|---|---|---|
| Russian | Threads, 500 | 609 → 459 | 1 |
| English with a link | X, 280 | 460 → 278 | 1 |
| English | X, 280 | 293 → 238 | 2 |
| English with emoji | Threads, 500 | 546 → 432 | 1 |
| English, long | X, 280 | 1,382 → 278 | 1 |
| Spanish | Pinterest, 500 | 730 → 383 | 3 |
| Russian | Bluesky, 300 | 609 → 285 | 2 |
All seven were rephrased within the limit and none had to be cut; each kept its language, its link and its call to action. An eighth caption, already within its limit, was answered “already fits” without asking the model at all.
The same idea runs through Hub’s MCP server. On 2 October 2026, in our test of ChatGPT as a client, ChatGPT tried to post a 365-character text to Bluesky; Hub’s validate_post counted it, refused it before anything was sent, and ChatGPT offered a shorter version or two posts. The count came from Hub, not from ChatGPT.
What did not work, and what is still unproven
- Asking for a total failed both times we relied on it: in ChatGPT on 10 October, and in Hub’s first version on 13 October.
- “Shorten it” moved the text in the right direction but never far enough on its own.
- Starting each retry from the original threw away the model’s progress; that is why the second version hands it its own last attempt.
- We did not open the finished block in a browser on production with a real account: that needs a connected account and a long caption typed into somebody’s own composer. We read the deployed script and checked the block on a test stand, at phone and desktop sizes, in both themes and in Russian, English and Arabic.
How to do it yourself
- Never trust a model’s own count. Count the result in code, the way the network counts it.
- For a prompt that people will paste, give a shape instead of a number: a count of lines or items, and a maximum of words per line.
- When a text is over the limit, hand the model its own last version and say how much to remove, for example “remove 130 characters, about a quarter”.
- Allow two or three rounds, then cut at a sentence end as the last resort, and tell the person you did.
- Keep the main caption and give the shorter text to that one network only.
- In Mellow Hub the composer’s Network captions block does steps 3 to 5 with Rephrase; an agent gets the measured length and the limit from
validate_postand can send its own shorter caption for that channel. Without Hub, our character counter counts the way each network does, and the post checker runs the checksvalidate_postruns.
Numbers at a glance
| Test | Asked for | Got |
|---|---|---|
| ChatGPT, 10 October 2026 | Under 1,500 characters | 1,981, reported as under |
| Two “shorten it” | Under 1,500 | 1,690, then 1,530 |
| Word limit | At most 180 words | 221 words |
| Shape | 1 line + 10 rules of ≤12 words | 833 (English), 818 (Russian) |
| Hub, 13 October 2026 | 7 captions over their limit | 7 within it, 0 cut |



