Why one caption has twelve lengths
A character limit sounds like one number, but every network decides for itself what a character is, and the differences are large enough to turn a caption that fits into one that is refused. JavaScript's length, which most online counters use, counts UTF-16 code units: a plain letter is one, an accented letter is one, but a flag is four and a family emoji is eleven. Almost no network counts that way.
Bluesky counts graphemes, the characters a reader sees, so that family is one of its 300. The same post measured with length can come out at 380 and be refused by a counter when Bluesky itself would take it. Bluesky adds a second ceiling few people meet: 3,000 bytes of UTF-8, which only a long run of emoji reaches. Threads goes the other way for emoji: it counts each one as its UTF-8 bytes, so a smiley costs four of its 500 and a flag eight. YouTube limits the description in bytes outright — 5,000 of them — which is why a Czech or Polish description of 3,000 characters can still be too long: every accented letter is two bytes.
Links are the other trap. Mastodon charges 23 characters for any link whatever its length, and counts a remote mention like @name@instance.social as only @name. X does the same 23-per-link weighting and counts CJK text double, which is why it is not in this list: X is text-only in Preflight and its rules are a page of their own. Instagram, Facebook, LinkedIn and Threads count every character of an address.
Limits that depend on what is attached
Telegram takes 4,096 characters in a plain message but only 1,024 as the caption on a photo or video; the table shows the message figure until a file is part of the post. TikTok allows 2,200 characters on a video and 4,000 on a photo post, and shows the first line of a photo post as its title, cut at 90. Pinterest makes the first line the pin title, cut at 100, and the rest the description, limited to 800. YouTube keeps the title (100 characters) apart from the description, and adds #Shorts to the description of a Short, which counts.
Beyond characters
Instagram refuses a caption with more than 30 hashtags or 20 @mentions outright. Threads refuses more than five links in a post. YouTube takes hashtags, but past 60 it ignores every hashtag on the video rather than the extra ones. The last column counts these where the network does, and the verdict comes from the same validator Preflight runs on every scheduled post — if it says a network would refuse the caption, that is what the network's API answers. The full list of rules per network is on the network limits page.